am b09a66d2: am 93de4115: Vault example documents provider.
* commit 'b09a66d28e21fc019ea0a88fa57ce5f3c54e710a':
Vault example documents provider.
diff --git a/apps/Fallback/res/values-en-rIN/strings.xml b/apps/Fallback/res/values-en-rIN/strings.xml
deleted file mode 100644
index a7c82cb..0000000
--- a/apps/Fallback/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"Fallback"</string>
- <string name="title" msgid="8156274565006125136">"Unsupported action"</string>
- <string name="error" msgid="6539615832923362301">"That action is not currently supported."</string>
-</resources>
diff --git a/apps/Fallback/res/values-et-rEE/strings.xml b/apps/Fallback/res/values-et-rEE/strings.xml
deleted file mode 100644
index 181b324..0000000
--- a/apps/Fallback/res/values-et-rEE/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"Taandepilt"</string>
- <string name="title" msgid="8156274565006125136">"Toetuseta toiming"</string>
- <string name="error" msgid="6539615832923362301">"Seda toimingut praegu ei toetata."</string>
-</resources>
diff --git a/apps/Fallback/res/values-fr-rCA/strings.xml b/apps/Fallback/res/values-fr-rCA/strings.xml
deleted file mode 100644
index a751b97..0000000
--- a/apps/Fallback/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"Application de secours"</string>
- <string name="title" msgid="8156274565006125136">"Action non prise en charge"</string>
- <string name="error" msgid="6539615832923362301">"Cette action n\'est actuellement pas prise en charge."</string>
-</resources>
diff --git a/apps/Fallback/res/values-hy-rAM/strings.xml b/apps/Fallback/res/values-hy-rAM/strings.xml
deleted file mode 100644
index 1547741..0000000
--- a/apps/Fallback/res/values-hy-rAM/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"Fallback"</string>
- <string name="title" msgid="8156274565006125136">"Չաջակցվող գործողություն"</string>
- <string name="error" msgid="6539615832923362301">"Այդ գործողությունն այժմ չի աջակցվում:"</string>
-</resources>
diff --git a/apps/Fallback/res/values-ka-rGE/strings.xml b/apps/Fallback/res/values-ka-rGE/strings.xml
deleted file mode 100644
index 469a135..0000000
--- a/apps/Fallback/res/values-ka-rGE/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"შემოვლით რეჟიმში გადასვლა"</string>
- <string name="title" msgid="8156274565006125136">"მოქმედება მხარდაჭერილი არ არის"</string>
- <string name="error" msgid="6539615832923362301">"ეს მოქმედება ამჟამად მხარდაუჭერელია."</string>
-</resources>
diff --git a/apps/Fallback/res/values-km-rKH/strings.xml b/apps/Fallback/res/values-km-rKH/strings.xml
deleted file mode 100644
index a442335..0000000
--- a/apps/Fallback/res/values-km-rKH/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"Fallback"</string>
- <string name="title" msgid="8156274565006125136">"សកម្មភាពមិនបានគាំទ្រ"</string>
- <string name="error" msgid="6539615832923362301">"បច្ចុប្បន្នសកម្មភាពនោះមិនត្រូវបានគាំទ្រទេ។"</string>
-</resources>
diff --git a/apps/Fallback/res/values-lo-rLA/strings.xml b/apps/Fallback/res/values-lo-rLA/strings.xml
deleted file mode 100644
index 948b60f..0000000
--- a/apps/Fallback/res/values-lo-rLA/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"Fallback"</string>
- <string name="title" msgid="8156274565006125136">"ການເຮັດວຽກທີ່ບໍ່ຮອງຮັບ"</string>
- <string name="error" msgid="6539615832923362301">"ການເຮັດວຽກນັ້ນຍັງບໍ່ຮອງຮັບເທື່ອ"</string>
-</resources>
diff --git a/apps/Fallback/res/values-mn-rMN/strings.xml b/apps/Fallback/res/values-mn-rMN/strings.xml
deleted file mode 100644
index 8cb3870..0000000
--- a/apps/Fallback/res/values-mn-rMN/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"Fallback"</string>
- <string name="title" msgid="8156274565006125136">"Дэмжигдээгүй үйлдэл"</string>
- <string name="error" msgid="6539615832923362301">"Энэ үйлдэл одоогоор дэмжигдээгүй."</string>
-</resources>
diff --git a/apps/Fallback/res/values-ms-rMY/strings.xml b/apps/Fallback/res/values-ms-rMY/strings.xml
deleted file mode 100644
index 930fe79..0000000
--- a/apps/Fallback/res/values-ms-rMY/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"Jatuh balik"</string>
- <string name="title" msgid="8156274565006125136">"Tindakan tidak disokong"</string>
- <string name="error" msgid="6539615832923362301">"Tindakan tidak disokong pada masa ini."</string>
-</resources>
diff --git a/apps/Fallback/res/values-zh-rHK/strings.xml b/apps/Fallback/res/values-zh-rHK/strings.xml
deleted file mode 100644
index ce01c92..0000000
--- a/apps/Fallback/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appTitle" msgid="161410001913116606">"後備"</string>
- <string name="title" msgid="8156274565006125136">"不支援的操作"</string>
- <string name="error" msgid="6539615832923362301">"目前不支援該操作。"</string>
-</resources>
diff --git a/build/tools/mk_sdk_repo_xml.sh b/build/tools/mk_sdk_repo_xml.sh
index c807a56..0bb0e51 100755
--- a/build/tools/mk_sdk_repo_xml.sh
+++ b/build/tools/mk_sdk_repo_xml.sh
@@ -139,6 +139,10 @@
# Starting with XSD repo-7 and addon-5, some revision elements are no longer just
# integers. Instead they are in major.minor.micro.preview format. This defines
# which elements. This depends on the XSD root element and the XSD version.
+#
+# Note: addon extra revision can't take a preview number. We don't enforce
+# this in this script. Instead schema validation will fail if the extra
+# source.property declares an RC and it gets inserted in the addon.xml here.
if [[ "$ROOT" == "sdk-repository" && "$XSD_VERSION" -ge 7 ]] ||
[[ "$ROOT" == "sdk-addon" && "$XSD_VERSION" -ge 5 ]]; then
@@ -146,6 +150,7 @@
tool revision
build-tool revision
platform-tool revision
+ extra revision
@ min-tools-rev
@ min-platform-tools-rev
)
@@ -177,7 +182,7 @@
}
# Parses and print a full revision in the form "1.2.3 rc4".
-# Note that the format requires to have a # space before the
+# Note that the format requires to have 1 space before the
# optional "rc" (e.g. '1 rc4', not '1rc4') and no space after
# the rc (so not '1 rc 4' either)
function write_full_revision() {
diff --git a/ndk/platforms/android-12/arch-arm/symbols/libc.so.functions.txt b/ndk/platforms/android-12/arch-arm/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..acfb94c
--- /dev/null
+++ b/ndk/platforms/android-12/arch-arm/symbols/libc.so.functions.txt
@@ -0,0 +1,1084 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+_Unwind_Backtrace
+_Unwind_Complete
+_Unwind_DeleteException
+_Unwind_ForcedUnwind
+_Unwind_GetCFA
+_Unwind_GetDataRelBase
+_Unwind_GetLanguageSpecificData
+_Unwind_GetRegionStart
+_Unwind_GetTextRelBase
+_Unwind_RaiseException
+_Unwind_Resume
+_Unwind_Resume_or_Rethrow
+_Unwind_VRS_Get
+_Unwind_VRS_Pop
+_Unwind_VRS_Set
+___Unwind_Backtrace
+___Unwind_ForcedUnwind
+___Unwind_RaiseException
+___Unwind_Resume
+___Unwind_Resume_or_Rethrow
+__adddf3
+__addsf3
+__aeabi_atexit
+__aeabi_cdcmpeq
+__aeabi_cdcmple
+__aeabi_cdrcmple
+__aeabi_d2f
+__aeabi_d2iz
+__aeabi_dadd
+__aeabi_dcmpeq
+__aeabi_dcmpge
+__aeabi_dcmpgt
+__aeabi_dcmple
+__aeabi_dcmplt
+__aeabi_dcmpun
+__aeabi_ddiv
+__aeabi_dmul
+__aeabi_drsub
+__aeabi_dsub
+__aeabi_f2d
+__aeabi_f2iz
+__aeabi_fadd
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2d
+__aeabi_i2f
+__aeabi_idiv
+__aeabi_idiv0
+__aeabi_idivmod
+__aeabi_l2d
+__aeabi_l2f
+__aeabi_ldiv0
+__aeabi_ldivmod
+__aeabi_lmul
+__aeabi_memclr
+__aeabi_memclr4
+__aeabi_memclr8
+__aeabi_memcpy
+__aeabi_memcpy4
+__aeabi_memcpy8
+__aeabi_memmove
+__aeabi_memmove4
+__aeabi_memmove8
+__aeabi_memset
+__aeabi_memset4
+__aeabi_memset8
+__aeabi_ui2d
+__aeabi_ui2f
+__aeabi_uidiv
+__aeabi_uidivmod
+__aeabi_ul2d
+__aeabi_ul2f
+__aeabi_uldivmod
+__aeabi_unwind_cpp_pr0
+__aeabi_unwind_cpp_pr1
+__aeabi_unwind_cpp_pr2
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__atomic_cmpxchg
+__atomic_dec
+__atomic_inc
+__atomic_swap
+__b64_ntop
+__b64_pton
+__bionic_clone
+__bionic_clone_entry
+__bionic_libgcc_compat_hooks
+__brk
+__cmpdf2
+__cxa_atexit
+__cxa_finalize
+__div0
+__divdf3
+__divdi3
+__divsf3
+__divsi3
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__eqdf2
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__extendsfdf2
+__fcntl
+__fcntl64
+__findenv
+__fixdfsi
+__fixsfsi
+__floatdidf
+__floatdisf
+__floatsidf
+__floatsisf
+__floatundidf
+__floatundisf
+__floatunsidf
+__floatunsisf
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__gedf2
+__get_h_errno
+__get_pc
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__getcwd
+__getpriority
+__gnu_Unwind_Backtrace
+__gnu_Unwind_Find_exidx
+__gnu_Unwind_ForcedUnwind
+__gnu_Unwind_RaiseException
+__gnu_Unwind_Restore_VFP
+__gnu_Unwind_Restore_VFP_D
+__gnu_Unwind_Restore_VFP_D_16_to_31
+__gnu_Unwind_Restore_WMMXC
+__gnu_Unwind_Restore_WMMXD
+__gnu_Unwind_Resume
+__gnu_Unwind_Resume_or_Rethrow
+__gnu_Unwind_Save_VFP
+__gnu_Unwind_Save_VFP_D
+__gnu_Unwind_Save_VFP_D_16_to_31
+__gnu_Unwind_Save_WMMXC
+__gnu_Unwind_Save_WMMXD
+__gnu_ldivmod_helper
+__gnu_uldivmod_helper
+__gnu_unwind_execute
+__gnu_unwind_frame
+__gtdf2
+__hostalias
+__init_tls
+__ioctl
+__ledf2
+__libc_android_abort
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__ltdf2
+__memcmp16
+__mmap2
+__muldf3
+__muldi3
+__mulsf3
+__nedf2
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__restore_core_regs
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__subdf3
+__subsf3
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__truncdfsf2
+__udivdi3
+__udivsi3
+__unorddf2
+__unordsf2
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atexit
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+cacheflush
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+ffs
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+restore_core_regs
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimensat
+utimes
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-12/arch-arm/symbols/libc.so.variables.txt b/ndk/platforms/android-12/arch-arm/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-12/arch-arm/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-12/arch-mips/symbols/libc.so.functions.txt b/ndk/platforms/android-12/arch-mips/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..efbc282
--- /dev/null
+++ b/ndk/platforms/android-12/arch-mips/symbols/libc.so.functions.txt
@@ -0,0 +1,950 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__atomic_cmpxchg
+__atomic_dec
+__atomic_inc
+__atomic_swap
+__b64_ntop
+__b64_pton
+__brk
+__clone_thread_start
+__cxa_atexit
+__cxa_finalize
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__fcntl
+__fcntl64
+__findenv
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__get_h_errno
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__get_tls
+__getcwd
+__getpriority
+__hostalias
+__init_tls
+__ioctl
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__memcmp16
+__mmap2
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_thread_area
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_flush_cache
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+_waitpid
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atexit
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+cacheflush
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+ffs
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimes
+utimensat
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-12/arch-mips/symbols/libc.so.variables.txt b/ndk/platforms/android-12/arch-mips/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-12/arch-mips/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-12/arch-x86/symbols/libc.so.functions.txt b/ndk/platforms/android-12/arch-x86/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..8478e47
--- /dev/null
+++ b/ndk/platforms/android-12/arch-x86/symbols/libc.so.functions.txt
@@ -0,0 +1,944 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__b64_ntop
+__b64_pton
+__brk
+__cxa_atexit
+__cxa_finalize
+__divdi3
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__fcntl
+__fcntl64
+__findenv
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__get_h_errno
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__get_tls
+__getcwd
+__getpriority
+__hostalias
+__init_tls
+__ioctl
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__mmap2
+__moddi3
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_thread_area
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__udivdi3
+__umoddi3
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+_waitpid
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimensat
+utimes
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-12/arch-x86/symbols/libc.so.variables.txt b/ndk/platforms/android-12/arch-x86/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-12/arch-x86/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-12/include/sys/stat.h b/ndk/platforms/android-12/include/sys/stat.h
new file mode 100644
index 0000000..497f404
--- /dev/null
+++ b/ndk/platforms/android-12/include/sys/stat.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * 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.
+ *
+ * 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.
+ */
+#ifndef _SYS_STAT_H_
+#define _SYS_STAT_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <linux/stat.h>
+
+#include <endian.h>
+
+__BEGIN_DECLS
+
+/* really matches stat64 in the kernel, hence the padding
+ * Note: The kernel zero's the padded region because glibc might read them
+ * in the hope that the kernel has stretched to using larger sizes.
+ */
+struct stat {
+ unsigned long long st_dev;
+ unsigned char __pad0[4];
+
+ unsigned long __st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+
+ unsigned long st_uid;
+ unsigned long st_gid;
+
+ unsigned long long st_rdev;
+ unsigned char __pad3[4];
+
+ long long st_size;
+ unsigned long st_blksize;
+ unsigned long long st_blocks;
+
+ unsigned long st_atime;
+ unsigned long st_atime_nsec;
+
+ unsigned long st_mtime;
+ unsigned long st_mtime_nsec;
+
+ unsigned long st_ctime;
+ unsigned long st_ctime_nsec;
+
+ unsigned long long st_ino;
+};
+
+/* For compatibility with GLibc, we provide macro aliases
+ * for the non-Posix nano-seconds accessors.
+ */
+#define st_atimensec st_atime_nsec
+#define st_mtimensec st_mtime_nsec
+#define st_ctimensec st_ctime_nsec
+
+extern int chmod(const char *, mode_t);
+extern int fchmod(int, mode_t);
+extern int mkdir(const char *, mode_t);
+
+extern int stat(const char *, struct stat *);
+extern int fstat(int, struct stat *);
+extern int lstat(const char *, struct stat *);
+extern int mknod(const char *, mode_t, dev_t);
+extern mode_t umask(mode_t);
+
+#define stat64 stat
+#define fstat64 fstat
+#define lstat64 lstat
+
+static __inline__ int mkfifo(const char *__p, mode_t __m)
+{
+ return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
+}
+
+extern int fstatat(int dirfd, const char *path, struct stat *buf, int flags);
+extern int mkdirat(int dirfd, const char *pathname, mode_t mode);
+extern int fchownat(int dirfd, const char *path, uid_t owner, gid_t group, int flags);
+extern int fchmodat(int dirfd, const char *path, mode_t mode, int flags);
+extern int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
+
+# define UTIME_NOW ((1l << 30) - 1l)
+# define UTIME_OMIT ((1l << 30) - 2l)
+extern int utimensat(int fd, const char *path, const struct timespec times[2], int flags);
+
+__END_DECLS
+
+#endif /* _SYS_STAT_H_ */
diff --git a/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..4ace8c3
--- /dev/null
+++ b/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.functions.txt
@@ -0,0 +1,170 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.variables.txt b/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-13/arch-arm/symbols/libm.so.functions.txt b/ndk/platforms/android-13/arch-arm/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..df649fb
--- /dev/null
+++ b/ndk/platforms/android-13/arch-arm/symbols/libm.so.functions.txt
@@ -0,0 +1,233 @@
+__addsf3
+__aeabi_cfcmpeq
+__aeabi_cfcmple
+__aeabi_cfrcmple
+__aeabi_d2lz
+__aeabi_d2uiz
+__aeabi_d2ulz
+__aeabi_dcmpun
+__aeabi_f2iz
+__aeabi_f2lz
+__aeabi_f2ulz
+__aeabi_fadd
+__aeabi_fcmpeq
+__aeabi_fcmpge
+__aeabi_fcmpgt
+__aeabi_fcmple
+__aeabi_fcmplt
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2f
+__aeabi_l2f
+__aeabi_ui2f
+__aeabi_ul2f
+__cmpsf2
+__divsf3
+__eqsf2
+__exp__D
+__fixdfdi
+__fixsfdi
+__fixsfsi
+__fixunsdfdi
+__fixunsdfsi
+__fixunssfdi
+__floatdisf
+__floatsisf
+__floatundisf
+__floatunsisf
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__gesf2
+__gtsf2
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__lesf2
+__log__D
+__ltsf2
+__mulsf3
+__nesf2
+__signbit
+__signbitf
+__signbitl
+__subsf3
+__unorddf2
+__unordsf2
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+logb
+logbf
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttowardf
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-13/arch-arm/symbols/libm.so.variables.txt b/ndk/platforms/android-13/arch-arm/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-13/arch-arm/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..4ace8c3
--- /dev/null
+++ b/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.functions.txt
@@ -0,0 +1,170 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.variables.txt b/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-13/arch-mips/symbols/libm.so.functions.txt b/ndk/platforms/android-13/arch-mips/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..276e531
--- /dev/null
+++ b/ndk/platforms/android-13/arch-mips/symbols/libm.so.functions.txt
@@ -0,0 +1,185 @@
+__exp__D
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__log__D
+__signbit
+__signbitf
+__signbitl
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+logb
+logbf
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttowardf
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-13/arch-mips/symbols/libm.so.variables.txt b/ndk/platforms/android-13/arch-mips/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-13/arch-mips/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..4ace8c3
--- /dev/null
+++ b/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.functions.txt
@@ -0,0 +1,170 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.variables.txt b/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-13/arch-x86/symbols/libm.so.functions.txt b/ndk/platforms/android-13/arch-x86/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..5691e40
--- /dev/null
+++ b/ndk/platforms/android-13/arch-x86/symbols/libm.so.functions.txt
@@ -0,0 +1,196 @@
+__exp__D
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__log__D
+__signbit
+__signbitf
+__signbitl
+_scan_nan
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+feclearexcept
+fedisableexcept
+feenableexcept
+fegetenv
+fegetexcept
+fegetexceptflag
+fegetround
+feholdexcept
+feraiseexcept
+fesetenv
+fesetexceptflag
+fesetround
+fetestexcept
+feupdateenv
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+logb
+logbf
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttowardf
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-13/arch-x86/symbols/libm.so.variables.txt b/ndk/platforms/android-13/arch-x86/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..6e5cdee
--- /dev/null
+++ b/ndk/platforms/android-13/arch-x86/symbols/libm.so.variables.txt
@@ -0,0 +1,3 @@
+__fe_dfl_env
+__has_sse
+signgam
diff --git a/ndk/platforms/android-13/include/android/asset_manager.h b/ndk/platforms/android-13/include/android/asset_manager.h
new file mode 100644
index 0000000..f5df46b
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/asset_manager.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+
+#ifndef ANDROID_ASSET_MANAGER_H
+#define ANDROID_ASSET_MANAGER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AAssetManager;
+typedef struct AAssetManager AAssetManager;
+
+struct AAssetDir;
+typedef struct AAssetDir AAssetDir;
+
+struct AAsset;
+typedef struct AAsset AAsset;
+
+/* Available modes for opening assets */
+enum {
+ AASSET_MODE_UNKNOWN = 0,
+ AASSET_MODE_RANDOM = 1,
+ AASSET_MODE_STREAMING = 2,
+ AASSET_MODE_BUFFER = 3
+};
+
+
+/**
+ * Open the named directory within the asset hierarchy. The directory can then
+ * be inspected with the AAssetDir functions. To open the top-level directory,
+ * pass in "" as the dirName.
+ *
+ * The object returned here should be freed by calling AAssetDir_close().
+ */
+AAssetDir* AAssetManager_openDir(AAssetManager* mgr, const char* dirName);
+
+/**
+ * Open an asset.
+ *
+ * The object returned here should be freed by calling AAsset_close().
+ */
+AAsset* AAssetManager_open(AAssetManager* mgr, const char* filename, int mode);
+
+/**
+ * Iterate over the files in an asset directory. A NULL string is returned
+ * when all the file names have been returned.
+ *
+ * The returned file name is suitable for passing to AAssetManager_open().
+ *
+ * The string returned here is owned by the AssetDir implementation and is not
+ * guaranteed to remain valid if any other calls are made on this AAssetDir
+ * instance.
+ */
+const char* AAssetDir_getNextFileName(AAssetDir* assetDir);
+
+/**
+ * Reset the iteration state of AAssetDir_getNextFileName() to the beginning.
+ */
+void AAssetDir_rewind(AAssetDir* assetDir);
+
+/**
+ * Close an opened AAssetDir, freeing any related resources.
+ */
+void AAssetDir_close(AAssetDir* assetDir);
+
+/**
+ * Attempt to read 'count' bytes of data from the current offset.
+ *
+ * Returns the number of bytes read, zero on EOF, or < 0 on error.
+ */
+int AAsset_read(AAsset* asset, void* buf, size_t count);
+
+/**
+ * Seek to the specified offset within the asset data. 'whence' uses the
+ * same constants as lseek()/fseek().
+ *
+ * Returns the new position on success, or (off_t) -1 on error.
+ */
+off_t AAsset_seek(AAsset* asset, off_t offset, int whence);
+
+/**
+ * Seek to the specified offset within the asset data. 'whence' uses the
+ * same constants as lseek()/fseek().
+ *
+ * Uses 64-bit data type for large files as opposed to the 32-bit type used
+ * by AAsset_seek.
+ *
+ * Returns the new position on success, or (off64_t) -1 on error.
+ */
+off64_t AAsset_seek64(AAsset* asset, off64_t offset, int whence);
+
+/**
+ * Close the asset, freeing all associated resources.
+ */
+void AAsset_close(AAsset* asset);
+
+/**
+ * Get a pointer to a buffer holding the entire contents of the assset.
+ *
+ * Returns NULL on failure.
+ */
+const void* AAsset_getBuffer(AAsset* asset);
+
+/**
+ * Report the total size of the asset data.
+ */
+off_t AAsset_getLength(AAsset* asset);
+
+/**
+ * Report the total size of the asset data. Reports the size using a 64-bit
+ * number insted of 32-bit as AAsset_getLength.
+ */
+off64_t AAsset_getLength64(AAsset* asset);
+
+/**
+ * Report the total amount of asset data that can be read from the current position.
+ */
+off_t AAsset_getRemainingLength(AAsset* asset);
+
+/**
+ * Report the total amount of asset data that can be read from the current position.
+ *
+ * Uses a 64-bit number instead of a 32-bit number as AAsset_getRemainingLength does.
+ */
+off64_t AAsset_getRemainingLength64(AAsset* asset);
+
+/**
+ * Open a new file descriptor that can be used to read the asset data. If the
+ * start or length cannot be represented by a 32-bit number, it will be
+ * truncated. If the file is large, use AAsset_openFileDescriptor64 instead.
+ *
+ * Returns < 0 if direct fd access is not possible (for example, if the asset is
+ * compressed).
+ */
+int AAsset_openFileDescriptor(AAsset* asset, off_t* outStart, off_t* outLength);
+
+/**
+ * Open a new file descriptor that can be used to read the asset data.
+ *
+ * Uses a 64-bit number for the offset and length instead of 32-bit instead of
+ * as AAsset_openFileDescriptor does.
+ *
+ * Returns < 0 if direct fd access is not possible (for example, if the asset is
+ * compressed).
+ */
+int AAsset_openFileDescriptor64(AAsset* asset, off64_t* outStart, off64_t* outLength);
+
+/**
+ * Returns whether this asset's internal buffer is allocated in ordinary RAM (i.e. not
+ * mmapped).
+ */
+int AAsset_isAllocated(AAsset* asset);
+
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_ASSET_MANAGER_H
diff --git a/ndk/platforms/android-13/include/android/configuration.h b/ndk/platforms/android-13/include/android/configuration.h
new file mode 100644
index 0000000..2444c4b
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/configuration.h
@@ -0,0 +1,361 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef ANDROID_CONFIGURATION_H
+#define ANDROID_CONFIGURATION_H
+
+#include <android/asset_manager.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AConfiguration;
+typedef struct AConfiguration AConfiguration;
+
+enum {
+ ACONFIGURATION_ORIENTATION_ANY = 0x0000,
+ ACONFIGURATION_ORIENTATION_PORT = 0x0001,
+ ACONFIGURATION_ORIENTATION_LAND = 0x0002,
+ ACONFIGURATION_ORIENTATION_SQUARE = 0x0003,
+
+ ACONFIGURATION_TOUCHSCREEN_ANY = 0x0000,
+ ACONFIGURATION_TOUCHSCREEN_NOTOUCH = 0x0001,
+ ACONFIGURATION_TOUCHSCREEN_STYLUS = 0x0002,
+ ACONFIGURATION_TOUCHSCREEN_FINGER = 0x0003,
+
+ ACONFIGURATION_DENSITY_DEFAULT = 0,
+ ACONFIGURATION_DENSITY_LOW = 120,
+ ACONFIGURATION_DENSITY_MEDIUM = 160,
+ ACONFIGURATION_DENSITY_TV = 213,
+ ACONFIGURATION_DENSITY_HIGH = 240,
+ ACONFIGURATION_DENSITY_NONE = 0xffff,
+
+ ACONFIGURATION_KEYBOARD_ANY = 0x0000,
+ ACONFIGURATION_KEYBOARD_NOKEYS = 0x0001,
+ ACONFIGURATION_KEYBOARD_QWERTY = 0x0002,
+ ACONFIGURATION_KEYBOARD_12KEY = 0x0003,
+
+ ACONFIGURATION_NAVIGATION_ANY = 0x0000,
+ ACONFIGURATION_NAVIGATION_NONAV = 0x0001,
+ ACONFIGURATION_NAVIGATION_DPAD = 0x0002,
+ ACONFIGURATION_NAVIGATION_TRACKBALL = 0x0003,
+ ACONFIGURATION_NAVIGATION_WHEEL = 0x0004,
+
+ ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000,
+ ACONFIGURATION_KEYSHIDDEN_NO = 0x0001,
+ ACONFIGURATION_KEYSHIDDEN_YES = 0x0002,
+ ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003,
+
+ ACONFIGURATION_NAVHIDDEN_ANY = 0x0000,
+ ACONFIGURATION_NAVHIDDEN_NO = 0x0001,
+ ACONFIGURATION_NAVHIDDEN_YES = 0x0002,
+
+ ACONFIGURATION_SCREENSIZE_ANY = 0x00,
+ ACONFIGURATION_SCREENSIZE_SMALL = 0x01,
+ ACONFIGURATION_SCREENSIZE_NORMAL = 0x02,
+ ACONFIGURATION_SCREENSIZE_LARGE = 0x03,
+ ACONFIGURATION_SCREENSIZE_XLARGE = 0x04,
+
+ ACONFIGURATION_SCREENLONG_ANY = 0x00,
+ ACONFIGURATION_SCREENLONG_NO = 0x1,
+ ACONFIGURATION_SCREENLONG_YES = 0x2,
+
+ ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00,
+ ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
+ ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
+ ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+ ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
+
+ ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
+ ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
+ ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
+
+ ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+ ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+ ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+ ACONFIGURATION_MCC = 0x0001,
+ ACONFIGURATION_MNC = 0x0002,
+ ACONFIGURATION_LOCALE = 0x0004,
+ ACONFIGURATION_TOUCHSCREEN = 0x0008,
+ ACONFIGURATION_KEYBOARD = 0x0010,
+ ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020,
+ ACONFIGURATION_NAVIGATION = 0x0040,
+ ACONFIGURATION_ORIENTATION = 0x0080,
+ ACONFIGURATION_DENSITY = 0x0100,
+ ACONFIGURATION_SCREEN_SIZE = 0x0200,
+ ACONFIGURATION_VERSION = 0x0400,
+ ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
+ ACONFIGURATION_UI_MODE = 0x1000,
+ ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
+};
+
+/**
+ * Create a new AConfiguration, initialized with no values set.
+ */
+AConfiguration* AConfiguration_new();
+
+/**
+ * Free an AConfiguration that was previously created with
+ * AConfiguration_new().
+ */
+void AConfiguration_delete(AConfiguration* config);
+
+/**
+ * Create and return a new AConfiguration based on the current configuration in
+ * use in the given AssetManager.
+ */
+void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am);
+
+/**
+ * Copy the contents of 'src' to 'dest'.
+ */
+void AConfiguration_copy(AConfiguration* dest, AConfiguration* src);
+
+/**
+ * Return the current MCC set in the configuration. 0 if not set.
+ */
+int32_t AConfiguration_getMcc(AConfiguration* config);
+
+/**
+ * Set the current MCC in the configuration. 0 to clear.
+ */
+void AConfiguration_setMcc(AConfiguration* config, int32_t mcc);
+
+/**
+ * Return the current MNC set in the configuration. 0 if not set.
+ */
+int32_t AConfiguration_getMnc(AConfiguration* config);
+
+/**
+ * Set the current MNC in the configuration. 0 to clear.
+ */
+void AConfiguration_setMnc(AConfiguration* config, int32_t mnc);
+
+/**
+ * Return the current language code set in the configuration. The output will
+ * be filled with an array of two characters. They are not 0-terminated. If
+ * a language is not set, they will be 0.
+ */
+void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage);
+
+/**
+ * Set the current language code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setLanguage(AConfiguration* config, const char* language);
+
+/**
+ * Return the current country code set in the configuration. The output will
+ * be filled with an array of two characters. They are not 0-terminated. If
+ * a country is not set, they will be 0.
+ */
+void AConfiguration_getCountry(AConfiguration* config, char* outCountry);
+
+/**
+ * Set the current country code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setCountry(AConfiguration* config, const char* country);
+
+/**
+ * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
+ */
+int32_t AConfiguration_getOrientation(AConfiguration* config);
+
+/**
+ * Set the current orientation in the configuration.
+ */
+void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation);
+
+/**
+ * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
+ */
+int32_t AConfiguration_getTouchscreen(AConfiguration* config);
+
+/**
+ * Set the current touchscreen in the configuration.
+ */
+void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen);
+
+/**
+ * Return the current ACONFIGURATION_DENSITY_* set in the configuration.
+ */
+int32_t AConfiguration_getDensity(AConfiguration* config);
+
+/**
+ * Set the current density in the configuration.
+ */
+void AConfiguration_setDensity(AConfiguration* config, int32_t density);
+
+/**
+ * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
+ */
+int32_t AConfiguration_getKeyboard(AConfiguration* config);
+
+/**
+ * Set the current keyboard in the configuration.
+ */
+void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard);
+
+/**
+ * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
+ */
+int32_t AConfiguration_getNavigation(AConfiguration* config);
+
+/**
+ * Set the current navigation in the configuration.
+ */
+void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation);
+
+/**
+ * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getKeysHidden(AConfiguration* config);
+
+/**
+ * Set the current keys hidden in the configuration.
+ */
+void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden);
+
+/**
+ * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getNavHidden(AConfiguration* config);
+
+/**
+ * Set the current nav hidden in the configuration.
+ */
+void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden);
+
+/**
+ * Return the current SDK (API) version set in the configuration.
+ */
+int32_t AConfiguration_getSdkVersion(AConfiguration* config);
+
+/**
+ * Set the current SDK version in the configuration.
+ */
+void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion);
+
+/**
+ * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenSize(AConfiguration* config);
+
+/**
+ * Set the current screen size in the configuration.
+ */
+void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize);
+
+/**
+ * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenLong(AConfiguration* config);
+
+/**
+ * Set the current screen long in the configuration.
+ */
+void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeType(AConfiguration* config);
+
+/**
+ * Set the current UI mode type in the configuration.
+ */
+void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeNight(AConfiguration* config);
+
+/**
+ * Set the current UI mode night in the configuration.
+ */
+void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
+
+/**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Perform a diff between two configurations. Returns a bit mask of
+ * ACONFIGURATION_* constants, each bit set meaning that configuration element
+ * is different between them.
+ */
+int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2);
+
+/**
+ * Determine whether 'base' is a valid configuration for use within the
+ * environment 'requested'. Returns 0 if there are any values in 'base'
+ * that conflict with 'requested'. Returns 1 if it does not conflict.
+ */
+int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested);
+
+/**
+ * Determine whether the configuration in 'test' is better than the existing
+ * configuration in 'base'. If 'requested' is non-NULL, this decision is based
+ * on the overall configuration given there. If it is NULL, this decision is
+ * simply based on which configuration is more specific. Returns non-0 if
+ * 'test' is better than 'base'.
+ *
+ * This assumes you have already filtered the configurations with
+ * AConfiguration_match().
+ */
+int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
+ AConfiguration* requested);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_CONFIGURATION_H
diff --git a/ndk/platforms/android-13/include/android/input.h b/ndk/platforms/android-13/include/android/input.h
new file mode 100644
index 0000000..7717a50
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/input.h
@@ -0,0 +1,805 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_INPUT_H
+#define _ANDROID_INPUT_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process input events in
+ * native code.
+ *
+ * NOTE: These functions MUST be implemented by /system/lib/libui.so
+ */
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <android/keycodes.h>
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key states (may be returned by queries about the current state of a
+ * particular key code, scan code or switch).
+ */
+enum {
+ /* The key state is unknown or the requested key itself is not supported. */
+ AKEY_STATE_UNKNOWN = -1,
+
+ /* The key is up. */
+ AKEY_STATE_UP = 0,
+
+ /* The key is down. */
+ AKEY_STATE_DOWN = 1,
+
+ /* The key is down but is a virtual key press that is being emulated by the system. */
+ AKEY_STATE_VIRTUAL = 2
+};
+
+/*
+ * Meta key / modifer state.
+ */
+enum {
+ /* No meta keys are pressed. */
+ AMETA_NONE = 0,
+
+ /* This mask is used to check whether one of the ALT meta keys is pressed. */
+ AMETA_ALT_ON = 0x02,
+
+ /* This mask is used to check whether the left ALT meta key is pressed. */
+ AMETA_ALT_LEFT_ON = 0x10,
+
+ /* This mask is used to check whether the right ALT meta key is pressed. */
+ AMETA_ALT_RIGHT_ON = 0x20,
+
+ /* This mask is used to check whether one of the SHIFT meta keys is pressed. */
+ AMETA_SHIFT_ON = 0x01,
+
+ /* This mask is used to check whether the left SHIFT meta key is pressed. */
+ AMETA_SHIFT_LEFT_ON = 0x40,
+
+ /* This mask is used to check whether the right SHIFT meta key is pressed. */
+ AMETA_SHIFT_RIGHT_ON = 0x80,
+
+ /* This mask is used to check whether the SYM meta key is pressed. */
+ AMETA_SYM_ON = 0x04,
+
+ /* This mask is used to check whether the FUNCTION meta key is pressed. */
+ AMETA_FUNCTION_ON = 0x08,
+
+ /* This mask is used to check whether one of the CTRL meta keys is pressed. */
+ AMETA_CTRL_ON = 0x1000,
+
+ /* This mask is used to check whether the left CTRL meta key is pressed. */
+ AMETA_CTRL_LEFT_ON = 0x2000,
+
+ /* This mask is used to check whether the right CTRL meta key is pressed. */
+ AMETA_CTRL_RIGHT_ON = 0x4000,
+
+ /* This mask is used to check whether one of the META meta keys is pressed. */
+ AMETA_META_ON = 0x10000,
+
+ /* This mask is used to check whether the left META meta key is pressed. */
+ AMETA_META_LEFT_ON = 0x20000,
+
+ /* This mask is used to check whether the right META meta key is pressed. */
+ AMETA_META_RIGHT_ON = 0x40000,
+
+ /* This mask is used to check whether the CAPS LOCK meta key is on. */
+ AMETA_CAPS_LOCK_ON = 0x100000,
+
+ /* This mask is used to check whether the NUM LOCK meta key is on. */
+ AMETA_NUM_LOCK_ON = 0x200000,
+
+ /* This mask is used to check whether the SCROLL LOCK meta key is on. */
+ AMETA_SCROLL_LOCK_ON = 0x400000,
+};
+
+/*
+ * Input events.
+ *
+ * Input events are opaque structures. Use the provided accessors functions to
+ * read their properties.
+ */
+struct AInputEvent;
+typedef struct AInputEvent AInputEvent;
+
+/*
+ * Input event types.
+ */
+enum {
+ /* Indicates that the input event is a key event. */
+ AINPUT_EVENT_TYPE_KEY = 1,
+
+ /* Indicates that the input event is a motion event. */
+ AINPUT_EVENT_TYPE_MOTION = 2
+};
+
+/*
+ * Key event actions.
+ */
+enum {
+ /* The key has been pressed down. */
+ AKEY_EVENT_ACTION_DOWN = 0,
+
+ /* The key has been released. */
+ AKEY_EVENT_ACTION_UP = 1,
+
+ /* Multiple duplicate key events have occurred in a row, or a complex string is
+ * being delivered. The repeat_count property of the key event contains the number
+ * of times the given key code should be executed.
+ */
+ AKEY_EVENT_ACTION_MULTIPLE = 2
+};
+
+/*
+ * Key event flags.
+ */
+enum {
+ /* This mask is set if the device woke because of this key event. */
+ AKEY_EVENT_FLAG_WOKE_HERE = 0x1,
+
+ /* This mask is set if the key event was generated by a software keyboard. */
+ AKEY_EVENT_FLAG_SOFT_KEYBOARD = 0x2,
+
+ /* This mask is set if we don't want the key event to cause us to leave touch mode. */
+ AKEY_EVENT_FLAG_KEEP_TOUCH_MODE = 0x4,
+
+ /* This mask is set if an event was known to come from a trusted part
+ * of the system. That is, the event is known to come from the user,
+ * and could not have been spoofed by a third party component. */
+ AKEY_EVENT_FLAG_FROM_SYSTEM = 0x8,
+
+ /* This mask is used for compatibility, to identify enter keys that are
+ * coming from an IME whose enter key has been auto-labelled "next" or
+ * "done". This allows TextView to dispatch these as normal enter keys
+ * for old applications, but still do the appropriate action when
+ * receiving them. */
+ AKEY_EVENT_FLAG_EDITOR_ACTION = 0x10,
+
+ /* When associated with up key events, this indicates that the key press
+ * has been canceled. Typically this is used with virtual touch screen
+ * keys, where the user can slide from the virtual key area on to the
+ * display: in that case, the application will receive a canceled up
+ * event and should not perform the action normally associated with the
+ * key. Note that for this to work, the application can not perform an
+ * action for a key until it receives an up or the long press timeout has
+ * expired. */
+ AKEY_EVENT_FLAG_CANCELED = 0x20,
+
+ /* This key event was generated by a virtual (on-screen) hard key area.
+ * Typically this is an area of the touchscreen, outside of the regular
+ * display, dedicated to "hardware" buttons. */
+ AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY = 0x40,
+
+ /* This flag is set for the first key repeat that occurs after the
+ * long press timeout. */
+ AKEY_EVENT_FLAG_LONG_PRESS = 0x80,
+
+ /* Set when a key event has AKEY_EVENT_FLAG_CANCELED set because a long
+ * press action was executed while it was down. */
+ AKEY_EVENT_FLAG_CANCELED_LONG_PRESS = 0x100,
+
+ /* Set for AKEY_EVENT_ACTION_UP when this event's key code is still being
+ * tracked from its initial down. That is, somebody requested that tracking
+ * started on the key down and a long press has not caused
+ * the tracking to be canceled. */
+ AKEY_EVENT_FLAG_TRACKING = 0x200,
+
+ /* Set when a key event has been synthesized to implement default behavior
+ * for an event that the application did not handle.
+ * Fallback key events are generated by unhandled trackball motions
+ * (to emulate a directional keypad) and by certain unhandled key presses
+ * that are declared in the key map (such as special function numeric keypad
+ * keys when numlock is off). */
+ AKEY_EVENT_FLAG_FALLBACK = 0x400,
+};
+
+/*
+ * Motion event actions.
+ */
+
+/* Bit shift for the action bits holding the pointer index as
+ * defined by AMOTION_EVENT_ACTION_POINTER_INDEX_MASK.
+ */
+#define AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT 8
+
+enum {
+ /* Bit mask of the parts of the action code that are the action itself.
+ */
+ AMOTION_EVENT_ACTION_MASK = 0xff,
+
+ /* Bits in the action code that represent a pointer index, used with
+ * AMOTION_EVENT_ACTION_POINTER_DOWN and AMOTION_EVENT_ACTION_POINTER_UP. Shifting
+ * down by AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT provides the actual pointer
+ * index where the data for the pointer going up or down can be found.
+ */
+ AMOTION_EVENT_ACTION_POINTER_INDEX_MASK = 0xff00,
+
+ /* A pressed gesture has started, the motion contains the initial starting location.
+ */
+ AMOTION_EVENT_ACTION_DOWN = 0,
+
+ /* A pressed gesture has finished, the motion contains the final release location
+ * as well as any intermediate points since the last down or move event.
+ */
+ AMOTION_EVENT_ACTION_UP = 1,
+
+ /* A change has happened during a press gesture (between AMOTION_EVENT_ACTION_DOWN and
+ * AMOTION_EVENT_ACTION_UP). The motion contains the most recent point, as well as
+ * any intermediate points since the last down or move event.
+ */
+ AMOTION_EVENT_ACTION_MOVE = 2,
+
+ /* The current gesture has been aborted.
+ * You will not receive any more points in it. You should treat this as
+ * an up event, but not perform any action that you normally would.
+ */
+ AMOTION_EVENT_ACTION_CANCEL = 3,
+
+ /* A movement has happened outside of the normal bounds of the UI element.
+ * This does not provide a full gesture, but only the initial location of the movement/touch.
+ */
+ AMOTION_EVENT_ACTION_OUTSIDE = 4,
+
+ /* A non-primary pointer has gone down.
+ * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+ */
+ AMOTION_EVENT_ACTION_POINTER_DOWN = 5,
+
+ /* A non-primary pointer has gone up.
+ * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+ */
+ AMOTION_EVENT_ACTION_POINTER_UP = 6,
+
+ /* A change happened but the pointer is not down (unlike AMOTION_EVENT_ACTION_MOVE).
+ * The motion contains the most recent point, as well as any intermediate points since
+ * the last hover move event.
+ */
+ AMOTION_EVENT_ACTION_HOVER_MOVE = 7,
+
+ /* The motion event contains relative vertical and/or horizontal scroll offsets.
+ * Use getAxisValue to retrieve the information from AMOTION_EVENT_AXIS_VSCROLL
+ * and AMOTION_EVENT_AXIS_HSCROLL.
+ * The pointer may or may not be down when this event is dispatched.
+ * This action is always delivered to the winder under the pointer, which
+ * may not be the window currently touched.
+ */
+ AMOTION_EVENT_ACTION_SCROLL = 8,
+};
+
+/*
+ * Motion event flags.
+ */
+enum {
+ /* This flag indicates that the window that received this motion event is partly
+ * or wholly obscured by another visible window above it. This flag is set to true
+ * even if the event did not directly pass through the obscured area.
+ * A security sensitive application can check this flag to identify situations in which
+ * a malicious application may have covered up part of its content for the purpose
+ * of misleading the user or hijacking touches. An appropriate response might be
+ * to drop the suspect touches or to take additional precautions to confirm the user's
+ * actual intent.
+ */
+ AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED = 0x1,
+};
+
+/*
+ * Motion event edge touch flags.
+ */
+enum {
+ /* No edges intersected */
+ AMOTION_EVENT_EDGE_FLAG_NONE = 0,
+
+ /* Flag indicating the motion event intersected the top edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_TOP = 0x01,
+
+ /* Flag indicating the motion event intersected the bottom edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_BOTTOM = 0x02,
+
+ /* Flag indicating the motion event intersected the left edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_LEFT = 0x04,
+
+ /* Flag indicating the motion event intersected the right edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_RIGHT = 0x08
+};
+
+/*
+ * Constants that identify each individual axis of a motion event.
+ * Refer to the documentation on the MotionEvent class for descriptions of each axis.
+ */
+enum {
+ AMOTION_EVENT_AXIS_X = 0,
+ AMOTION_EVENT_AXIS_Y = 1,
+ AMOTION_EVENT_AXIS_PRESSURE = 2,
+ AMOTION_EVENT_AXIS_SIZE = 3,
+ AMOTION_EVENT_AXIS_TOUCH_MAJOR = 4,
+ AMOTION_EVENT_AXIS_TOUCH_MINOR = 5,
+ AMOTION_EVENT_AXIS_TOOL_MAJOR = 6,
+ AMOTION_EVENT_AXIS_TOOL_MINOR = 7,
+ AMOTION_EVENT_AXIS_ORIENTATION = 8,
+ AMOTION_EVENT_AXIS_VSCROLL = 9,
+ AMOTION_EVENT_AXIS_HSCROLL = 10,
+ AMOTION_EVENT_AXIS_Z = 11,
+ AMOTION_EVENT_AXIS_RX = 12,
+ AMOTION_EVENT_AXIS_RY = 13,
+ AMOTION_EVENT_AXIS_RZ = 14,
+ AMOTION_EVENT_AXIS_HAT_X = 15,
+ AMOTION_EVENT_AXIS_HAT_Y = 16,
+ AMOTION_EVENT_AXIS_LTRIGGER = 17,
+ AMOTION_EVENT_AXIS_RTRIGGER = 18,
+ AMOTION_EVENT_AXIS_THROTTLE = 19,
+ AMOTION_EVENT_AXIS_RUDDER = 20,
+ AMOTION_EVENT_AXIS_WHEEL = 21,
+ AMOTION_EVENT_AXIS_GAS = 22,
+ AMOTION_EVENT_AXIS_BRAKE = 23,
+ AMOTION_EVENT_AXIS_GENERIC_1 = 32,
+ AMOTION_EVENT_AXIS_GENERIC_2 = 33,
+ AMOTION_EVENT_AXIS_GENERIC_3 = 34,
+ AMOTION_EVENT_AXIS_GENERIC_4 = 35,
+ AMOTION_EVENT_AXIS_GENERIC_5 = 36,
+ AMOTION_EVENT_AXIS_GENERIC_6 = 37,
+ AMOTION_EVENT_AXIS_GENERIC_7 = 38,
+ AMOTION_EVENT_AXIS_GENERIC_8 = 39,
+ AMOTION_EVENT_AXIS_GENERIC_9 = 40,
+ AMOTION_EVENT_AXIS_GENERIC_10 = 41,
+ AMOTION_EVENT_AXIS_GENERIC_11 = 42,
+ AMOTION_EVENT_AXIS_GENERIC_12 = 43,
+ AMOTION_EVENT_AXIS_GENERIC_13 = 44,
+ AMOTION_EVENT_AXIS_GENERIC_14 = 45,
+ AMOTION_EVENT_AXIS_GENERIC_15 = 46,
+ AMOTION_EVENT_AXIS_GENERIC_16 = 47,
+
+ // NOTE: If you add a new axis here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.
+};
+
+/*
+ * Input sources.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ */
+enum {
+ AINPUT_SOURCE_CLASS_MASK = 0x000000ff,
+
+ AINPUT_SOURCE_CLASS_BUTTON = 0x00000001,
+ AINPUT_SOURCE_CLASS_POINTER = 0x00000002,
+ AINPUT_SOURCE_CLASS_NAVIGATION = 0x00000004,
+ AINPUT_SOURCE_CLASS_POSITION = 0x00000008,
+ AINPUT_SOURCE_CLASS_JOYSTICK = 0x00000010,
+};
+
+enum {
+ AINPUT_SOURCE_UNKNOWN = 0x00000000,
+
+ AINPUT_SOURCE_KEYBOARD = 0x00000100 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_DPAD = 0x00000200 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_GAMEPAD = 0x00000400 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_TOUCHSCREEN = 0x00001000 | AINPUT_SOURCE_CLASS_POINTER,
+ AINPUT_SOURCE_MOUSE = 0x00002000 | AINPUT_SOURCE_CLASS_POINTER,
+ AINPUT_SOURCE_TRACKBALL = 0x00010000 | AINPUT_SOURCE_CLASS_NAVIGATION,
+ AINPUT_SOURCE_TOUCHPAD = 0x00100000 | AINPUT_SOURCE_CLASS_POSITION,
+ AINPUT_SOURCE_JOYSTICK = 0x01000000 | AINPUT_SOURCE_CLASS_JOYSTICK,
+
+ AINPUT_SOURCE_ANY = 0xffffff00,
+};
+
+/*
+ * Keyboard types.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details.
+ */
+enum {
+ AINPUT_KEYBOARD_TYPE_NONE = 0,
+ AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC = 1,
+ AINPUT_KEYBOARD_TYPE_ALPHABETIC = 2,
+};
+
+/*
+ * Constants used to retrieve information about the range of motion for a particular
+ * coordinate of a motion event.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ *
+ * DEPRECATION NOTICE: These constants are deprecated. Use AMOTION_EVENT_AXIS_* constants instead.
+ */
+enum {
+ AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X,
+ AINPUT_MOTION_RANGE_Y = AMOTION_EVENT_AXIS_Y,
+ AINPUT_MOTION_RANGE_PRESSURE = AMOTION_EVENT_AXIS_PRESSURE,
+ AINPUT_MOTION_RANGE_SIZE = AMOTION_EVENT_AXIS_SIZE,
+ AINPUT_MOTION_RANGE_TOUCH_MAJOR = AMOTION_EVENT_AXIS_TOUCH_MAJOR,
+ AINPUT_MOTION_RANGE_TOUCH_MINOR = AMOTION_EVENT_AXIS_TOUCH_MINOR,
+ AINPUT_MOTION_RANGE_TOOL_MAJOR = AMOTION_EVENT_AXIS_TOOL_MAJOR,
+ AINPUT_MOTION_RANGE_TOOL_MINOR = AMOTION_EVENT_AXIS_TOOL_MINOR,
+ AINPUT_MOTION_RANGE_ORIENTATION = AMOTION_EVENT_AXIS_ORIENTATION,
+} __attribute__ ((deprecated));
+
+
+/*
+ * Input event accessors.
+ *
+ * Note that most functions can only be used on input events that are of a given type.
+ * Calling these functions on input events of other types will yield undefined behavior.
+ */
+
+/*** Accessors for all input events. ***/
+
+/* Get the input event type. */
+int32_t AInputEvent_getType(const AInputEvent* event);
+
+/* Get the id for the device that an input event came from.
+ *
+ * Input events can be generated by multiple different input devices.
+ * Use the input device id to obtain information about the input
+ * device that was responsible for generating a particular event.
+ *
+ * An input device id of 0 indicates that the event didn't come from a physical device;
+ * other numbers are arbitrary and you shouldn't depend on the values.
+ * Use the provided input device query API to obtain information about input devices.
+ */
+int32_t AInputEvent_getDeviceId(const AInputEvent* event);
+
+/* Get the input event source. */
+int32_t AInputEvent_getSource(const AInputEvent* event);
+
+/*** Accessors for key events only. ***/
+
+/* Get the key event action. */
+int32_t AKeyEvent_getAction(const AInputEvent* key_event);
+
+/* Get the key event flags. */
+int32_t AKeyEvent_getFlags(const AInputEvent* key_event);
+
+/* Get the key code of the key event.
+ * This is the physical key that was pressed, not the Unicode character. */
+int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event);
+
+/* Get the hardware key id of this key event.
+ * These values are not reliable and vary from device to device. */
+int32_t AKeyEvent_getScanCode(const AInputEvent* key_event);
+
+/* Get the meta key state. */
+int32_t AKeyEvent_getMetaState(const AInputEvent* key_event);
+
+/* Get the repeat count of the event.
+ * For both key up an key down events, this is the number of times the key has
+ * repeated with the first down starting at 0 and counting up from there. For
+ * multiple key events, this is the number of down/up pairs that have occurred. */
+int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event);
+
+/* Get the time of the most recent key down event, in the
+ * java.lang.System.nanoTime() time base. If this is a down event,
+ * this will be the same as eventTime.
+ * Note that when chording keys, this value is the down time of the most recently
+ * pressed key, which may not be the same physical key of this event. */
+int64_t AKeyEvent_getDownTime(const AInputEvent* key_event);
+
+/* Get the time this event occurred, in the
+ * java.lang.System.nanoTime() time base. */
+int64_t AKeyEvent_getEventTime(const AInputEvent* key_event);
+
+/*** Accessors for motion events only. ***/
+
+/* Get the combined motion event action code and pointer index. */
+int32_t AMotionEvent_getAction(const AInputEvent* motion_event);
+
+/* Get the motion event flags. */
+int32_t AMotionEvent_getFlags(const AInputEvent* motion_event);
+
+/* Get the state of any meta / modifier keys that were in effect when the
+ * event was generated. */
+int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event);
+
+/* Get a bitfield indicating which edges, if any, were touched by this motion event.
+ * For touch events, clients can use this to determine if the user's finger was
+ * touching the edge of the display. */
+int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event);
+
+/* Get the time when the user originally pressed down to start a stream of
+ * position events, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event);
+
+/* Get the time when this specific event was generated,
+ * in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event);
+
+/* Get the X coordinate offset.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getXOffset(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the Y coordinates being reported.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getYOffset(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the X coordinates being reported.
+ * You can multiply this number with an X coordinate sample to find the
+ * actual hardware value of the X coordinate. */
+float AMotionEvent_getXPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the Y coordinates being reported.
+ * You can multiply this number with a Y coordinate sample to find the
+ * actual hardware value of the Y coordinate. */
+float AMotionEvent_getYPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the number of pointers of data contained in this event.
+ * Always >= 1. */
+size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event);
+
+/* Get the pointer identifier associated with a particular pointer
+ * data index is this event. The identifier tells you the actual pointer
+ * number associated with the data, accounting for individual pointers
+ * going up and down since the start of the current gesture. */
+int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current X coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current Y coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current pressure of this event for the given pointer index.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current scaled value of the approximate size for the given pointer index.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1. The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation. A positive angle
+ * indicates that the major axis of contact is oriented to the right. A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the value of the request axis for the given pointer index. */
+float AMotionEvent_getAxisValue(const AInputEvent* motion_event,
+ int32_t axis, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the number of historical points in this event. These are movements that
+ * have occurred between this event and the previous event. This only applies
+ * to AMOTION_EVENT_ACTION_MOVE events -- all other actions will have a size of 0.
+ * Historical samples are indexed from oldest to newest. */
+size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event);
+
+/* Get the time that a historical movement occurred between this event and
+ * the previous event, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getHistoricalEventTime(const AInputEvent* motion_event,
+ size_t history_index);
+
+/* Get the historical raw X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical raw Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical pressure of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the current scaled value of the approximate size for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1. The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation. A positive angle
+ * indicates that the major axis of contact is oriented to the right. A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical value of the request axis for the given pointer index
+ * that occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
+ int32_t axis, size_t pointer_index, size_t history_index) __NDK_FPABI__;
+
+
+/*
+ * Input queue
+ *
+ * An input queue is the facility through which you retrieve input
+ * events.
+ */
+struct AInputQueue;
+typedef struct AInputQueue AInputQueue;
+
+/*
+ * Add this input queue to a looper for processing. See
+ * ALooper_addFd() for information on the ident, callback, and data params.
+ */
+void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
+ int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Remove the input queue from the looper it is currently attached to.
+ */
+void AInputQueue_detachLooper(AInputQueue* queue);
+
+/*
+ * Returns true if there are one or more events available in the
+ * input queue. Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int32_t AInputQueue_hasEvents(AInputQueue* queue);
+
+/*
+ * Returns the next available event from the queue. Returns a negative
+ * value if no events are available or an error has occurred.
+ */
+int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent);
+
+/*
+ * Sends the key for standard pre-dispatching -- that is, possibly deliver
+ * it to the current IME to be consumed before the app. Returns 0 if it
+ * was not pre-dispatched, meaning you can process it right now. If non-zero
+ * is returned, you must abandon the current event processing and allow the
+ * event to appear again in the event queue (if it does not get consumed during
+ * pre-dispatching).
+ */
+int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event);
+
+/*
+ * Report that dispatching has finished with the given event.
+ * This must be called after receiving an event with AInputQueue_get_event().
+ */
+void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_INPUT_H
diff --git a/ndk/platforms/android-13/include/android/keycodes.h b/ndk/platforms/android-13/include/android/keycodes.h
new file mode 100644
index 0000000..c4a7eff
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/keycodes.h
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+ AKEYCODE_UNKNOWN = 0,
+ AKEYCODE_SOFT_LEFT = 1,
+ AKEYCODE_SOFT_RIGHT = 2,
+ AKEYCODE_HOME = 3,
+ AKEYCODE_BACK = 4,
+ AKEYCODE_CALL = 5,
+ AKEYCODE_ENDCALL = 6,
+ AKEYCODE_0 = 7,
+ AKEYCODE_1 = 8,
+ AKEYCODE_2 = 9,
+ AKEYCODE_3 = 10,
+ AKEYCODE_4 = 11,
+ AKEYCODE_5 = 12,
+ AKEYCODE_6 = 13,
+ AKEYCODE_7 = 14,
+ AKEYCODE_8 = 15,
+ AKEYCODE_9 = 16,
+ AKEYCODE_STAR = 17,
+ AKEYCODE_POUND = 18,
+ AKEYCODE_DPAD_UP = 19,
+ AKEYCODE_DPAD_DOWN = 20,
+ AKEYCODE_DPAD_LEFT = 21,
+ AKEYCODE_DPAD_RIGHT = 22,
+ AKEYCODE_DPAD_CENTER = 23,
+ AKEYCODE_VOLUME_UP = 24,
+ AKEYCODE_VOLUME_DOWN = 25,
+ AKEYCODE_POWER = 26,
+ AKEYCODE_CAMERA = 27,
+ AKEYCODE_CLEAR = 28,
+ AKEYCODE_A = 29,
+ AKEYCODE_B = 30,
+ AKEYCODE_C = 31,
+ AKEYCODE_D = 32,
+ AKEYCODE_E = 33,
+ AKEYCODE_F = 34,
+ AKEYCODE_G = 35,
+ AKEYCODE_H = 36,
+ AKEYCODE_I = 37,
+ AKEYCODE_J = 38,
+ AKEYCODE_K = 39,
+ AKEYCODE_L = 40,
+ AKEYCODE_M = 41,
+ AKEYCODE_N = 42,
+ AKEYCODE_O = 43,
+ AKEYCODE_P = 44,
+ AKEYCODE_Q = 45,
+ AKEYCODE_R = 46,
+ AKEYCODE_S = 47,
+ AKEYCODE_T = 48,
+ AKEYCODE_U = 49,
+ AKEYCODE_V = 50,
+ AKEYCODE_W = 51,
+ AKEYCODE_X = 52,
+ AKEYCODE_Y = 53,
+ AKEYCODE_Z = 54,
+ AKEYCODE_COMMA = 55,
+ AKEYCODE_PERIOD = 56,
+ AKEYCODE_ALT_LEFT = 57,
+ AKEYCODE_ALT_RIGHT = 58,
+ AKEYCODE_SHIFT_LEFT = 59,
+ AKEYCODE_SHIFT_RIGHT = 60,
+ AKEYCODE_TAB = 61,
+ AKEYCODE_SPACE = 62,
+ AKEYCODE_SYM = 63,
+ AKEYCODE_EXPLORER = 64,
+ AKEYCODE_ENVELOPE = 65,
+ AKEYCODE_ENTER = 66,
+ AKEYCODE_DEL = 67,
+ AKEYCODE_GRAVE = 68,
+ AKEYCODE_MINUS = 69,
+ AKEYCODE_EQUALS = 70,
+ AKEYCODE_LEFT_BRACKET = 71,
+ AKEYCODE_RIGHT_BRACKET = 72,
+ AKEYCODE_BACKSLASH = 73,
+ AKEYCODE_SEMICOLON = 74,
+ AKEYCODE_APOSTROPHE = 75,
+ AKEYCODE_SLASH = 76,
+ AKEYCODE_AT = 77,
+ AKEYCODE_NUM = 78,
+ AKEYCODE_HEADSETHOOK = 79,
+ AKEYCODE_FOCUS = 80, // *Camera* focus
+ AKEYCODE_PLUS = 81,
+ AKEYCODE_MENU = 82,
+ AKEYCODE_NOTIFICATION = 83,
+ AKEYCODE_SEARCH = 84,
+ AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+ AKEYCODE_MEDIA_STOP = 86,
+ AKEYCODE_MEDIA_NEXT = 87,
+ AKEYCODE_MEDIA_PREVIOUS = 88,
+ AKEYCODE_MEDIA_REWIND = 89,
+ AKEYCODE_MEDIA_FAST_FORWARD = 90,
+ AKEYCODE_MUTE = 91,
+ AKEYCODE_PAGE_UP = 92,
+ AKEYCODE_PAGE_DOWN = 93,
+ AKEYCODE_PICTSYMBOLS = 94,
+ AKEYCODE_SWITCH_CHARSET = 95,
+ AKEYCODE_BUTTON_A = 96,
+ AKEYCODE_BUTTON_B = 97,
+ AKEYCODE_BUTTON_C = 98,
+ AKEYCODE_BUTTON_X = 99,
+ AKEYCODE_BUTTON_Y = 100,
+ AKEYCODE_BUTTON_Z = 101,
+ AKEYCODE_BUTTON_L1 = 102,
+ AKEYCODE_BUTTON_R1 = 103,
+ AKEYCODE_BUTTON_L2 = 104,
+ AKEYCODE_BUTTON_R2 = 105,
+ AKEYCODE_BUTTON_THUMBL = 106,
+ AKEYCODE_BUTTON_THUMBR = 107,
+ AKEYCODE_BUTTON_START = 108,
+ AKEYCODE_BUTTON_SELECT = 109,
+ AKEYCODE_BUTTON_MODE = 110,
+ AKEYCODE_ESCAPE = 111,
+ AKEYCODE_FORWARD_DEL = 112,
+ AKEYCODE_CTRL_LEFT = 113,
+ AKEYCODE_CTRL_RIGHT = 114,
+ AKEYCODE_CAPS_LOCK = 115,
+ AKEYCODE_SCROLL_LOCK = 116,
+ AKEYCODE_META_LEFT = 117,
+ AKEYCODE_META_RIGHT = 118,
+ AKEYCODE_FUNCTION = 119,
+ AKEYCODE_SYSRQ = 120,
+ AKEYCODE_BREAK = 121,
+ AKEYCODE_MOVE_HOME = 122,
+ AKEYCODE_MOVE_END = 123,
+ AKEYCODE_INSERT = 124,
+ AKEYCODE_FORWARD = 125,
+ AKEYCODE_MEDIA_PLAY = 126,
+ AKEYCODE_MEDIA_PAUSE = 127,
+ AKEYCODE_MEDIA_CLOSE = 128,
+ AKEYCODE_MEDIA_EJECT = 129,
+ AKEYCODE_MEDIA_RECORD = 130,
+ AKEYCODE_F1 = 131,
+ AKEYCODE_F2 = 132,
+ AKEYCODE_F3 = 133,
+ AKEYCODE_F4 = 134,
+ AKEYCODE_F5 = 135,
+ AKEYCODE_F6 = 136,
+ AKEYCODE_F7 = 137,
+ AKEYCODE_F8 = 138,
+ AKEYCODE_F9 = 139,
+ AKEYCODE_F10 = 140,
+ AKEYCODE_F11 = 141,
+ AKEYCODE_F12 = 142,
+ AKEYCODE_NUM_LOCK = 143,
+ AKEYCODE_NUMPAD_0 = 144,
+ AKEYCODE_NUMPAD_1 = 145,
+ AKEYCODE_NUMPAD_2 = 146,
+ AKEYCODE_NUMPAD_3 = 147,
+ AKEYCODE_NUMPAD_4 = 148,
+ AKEYCODE_NUMPAD_5 = 149,
+ AKEYCODE_NUMPAD_6 = 150,
+ AKEYCODE_NUMPAD_7 = 151,
+ AKEYCODE_NUMPAD_8 = 152,
+ AKEYCODE_NUMPAD_9 = 153,
+ AKEYCODE_NUMPAD_DIVIDE = 154,
+ AKEYCODE_NUMPAD_MULTIPLY = 155,
+ AKEYCODE_NUMPAD_SUBTRACT = 156,
+ AKEYCODE_NUMPAD_ADD = 157,
+ AKEYCODE_NUMPAD_DOT = 158,
+ AKEYCODE_NUMPAD_COMMA = 159,
+ AKEYCODE_NUMPAD_ENTER = 160,
+ AKEYCODE_NUMPAD_EQUALS = 161,
+ AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+ AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+ AKEYCODE_VOLUME_MUTE = 164,
+ AKEYCODE_INFO = 165,
+ AKEYCODE_CHANNEL_UP = 166,
+ AKEYCODE_CHANNEL_DOWN = 167,
+ AKEYCODE_ZOOM_IN = 168,
+ AKEYCODE_ZOOM_OUT = 169,
+ AKEYCODE_TV = 170,
+ AKEYCODE_WINDOW = 171,
+ AKEYCODE_GUIDE = 172,
+ AKEYCODE_DVR = 173,
+ AKEYCODE_BOOKMARK = 174,
+ AKEYCODE_CAPTIONS = 175,
+ AKEYCODE_SETTINGS = 176,
+ AKEYCODE_TV_POWER = 177,
+ AKEYCODE_TV_INPUT = 178,
+ AKEYCODE_STB_POWER = 179,
+ AKEYCODE_STB_INPUT = 180,
+ AKEYCODE_AVR_POWER = 181,
+ AKEYCODE_AVR_INPUT = 182,
+ AKEYCODE_PROG_RED = 183,
+ AKEYCODE_PROG_GREEN = 184,
+ AKEYCODE_PROG_YELLOW = 185,
+ AKEYCODE_PROG_BLUE = 186,
+ AKEYCODE_APP_SWITCH = 187,
+ AKEYCODE_BUTTON_1 = 188,
+ AKEYCODE_BUTTON_2 = 189,
+ AKEYCODE_BUTTON_3 = 190,
+ AKEYCODE_BUTTON_4 = 191,
+ AKEYCODE_BUTTON_5 = 192,
+ AKEYCODE_BUTTON_6 = 193,
+ AKEYCODE_BUTTON_7 = 194,
+ AKEYCODE_BUTTON_8 = 195,
+ AKEYCODE_BUTTON_9 = 196,
+ AKEYCODE_BUTTON_10 = 197,
+ AKEYCODE_BUTTON_11 = 198,
+ AKEYCODE_BUTTON_12 = 199,
+ AKEYCODE_BUTTON_13 = 200,
+ AKEYCODE_BUTTON_14 = 201,
+ AKEYCODE_BUTTON_15 = 202,
+ AKEYCODE_BUTTON_16 = 203,
+
+ // NOTE: If you add a new keycode here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-13/include/android/looper.h b/ndk/platforms/android-13/include/android/looper.h
new file mode 100644
index 0000000..24e3967
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/looper.h
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+
+#ifndef ANDROID_LOOPER_H
+#define ANDROID_LOOPER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * ALooper
+ *
+ * A looper is the state tracking an event loop for a thread.
+ * Loopers do not define event structures or other such things; rather
+ * they are a lower-level facility to attach one or more discrete objects
+ * listening for an event. An "event" here is simply data available on
+ * a file descriptor: each attached object has an associated file descriptor,
+ * and waiting for "events" means (internally) polling on all of these file
+ * descriptors until one or more of them have data available.
+ *
+ * A thread can have only one ALooper associated with it.
+ */
+struct ALooper;
+typedef struct ALooper ALooper;
+
+/**
+ * Returns the looper associated with the calling thread, or NULL if
+ * there is not one.
+ */
+ALooper* ALooper_forThread();
+
+enum {
+ /**
+ * Option for ALooper_prepare: this looper will accept calls to
+ * ALooper_addFd() that do not have a callback (that is provide NULL
+ * for the callback). In this case the caller of ALooper_pollOnce()
+ * or ALooper_pollAll() MUST check the return from these functions to
+ * discover when data is available on such fds and process it.
+ */
+ ALOOPER_PREPARE_ALLOW_NON_CALLBACKS = 1<<0
+};
+
+/**
+ * Prepares a looper associated with the calling thread, and returns it.
+ * If the thread already has a looper, it is returned. Otherwise, a new
+ * one is created, associated with the thread, and returned.
+ *
+ * The opts may be ALOOPER_PREPARE_ALLOW_NON_CALLBACKS or 0.
+ */
+ALooper* ALooper_prepare(int opts);
+
+enum {
+ /**
+ * Result from ALooper_pollOnce() and ALooper_pollAll():
+ * The poll was awoken using wake() before the timeout expired
+ * and no callbacks were executed and no other file descriptors were ready.
+ */
+ ALOOPER_POLL_WAKE = -1,
+
+ /**
+ * Result from ALooper_pollOnce() and ALooper_pollAll():
+ * One or more callbacks were executed.
+ */
+ ALOOPER_POLL_CALLBACK = -2,
+
+ /**
+ * Result from ALooper_pollOnce() and ALooper_pollAll():
+ * The timeout expired.
+ */
+ ALOOPER_POLL_TIMEOUT = -3,
+
+ /**
+ * Result from ALooper_pollOnce() and ALooper_pollAll():
+ * An error occurred.
+ */
+ ALOOPER_POLL_ERROR = -4,
+};
+
+/**
+ * Acquire a reference on the given ALooper object. This prevents the object
+ * from being deleted until the reference is removed. This is only needed
+ * to safely hand an ALooper from one thread to another.
+ */
+void ALooper_acquire(ALooper* looper);
+
+/**
+ * Remove a reference that was previously acquired with ALooper_acquire().
+ */
+void ALooper_release(ALooper* looper);
+
+/**
+ * Flags for file descriptor events that a looper can monitor.
+ *
+ * These flag bits can be combined to monitor multiple events at once.
+ */
+enum {
+ /**
+ * The file descriptor is available for read operations.
+ */
+ ALOOPER_EVENT_INPUT = 1 << 0,
+
+ /**
+ * The file descriptor is available for write operations.
+ */
+ ALOOPER_EVENT_OUTPUT = 1 << 1,
+
+ /**
+ * The file descriptor has encountered an error condition.
+ *
+ * The looper always sends notifications about errors; it is not necessary
+ * to specify this event flag in the requested event set.
+ */
+ ALOOPER_EVENT_ERROR = 1 << 2,
+
+ /**
+ * The file descriptor was hung up.
+ * For example, indicates that the remote end of a pipe or socket was closed.
+ *
+ * The looper always sends notifications about hangups; it is not necessary
+ * to specify this event flag in the requested event set.
+ */
+ ALOOPER_EVENT_HANGUP = 1 << 3,
+
+ /**
+ * The file descriptor is invalid.
+ * For example, the file descriptor was closed prematurely.
+ *
+ * The looper always sends notifications about invalid file descriptors; it is not necessary
+ * to specify this event flag in the requested event set.
+ */
+ ALOOPER_EVENT_INVALID = 1 << 4,
+};
+
+/**
+ * For callback-based event loops, this is the prototype of the function
+ * that is called when a file descriptor event occurs.
+ * It is given the file descriptor it is associated with,
+ * a bitmask of the poll events that were triggered (typically ALOOPER_EVENT_INPUT),
+ * and the data pointer that was originally supplied.
+ *
+ * Implementations should return 1 to continue receiving callbacks, or 0
+ * to have this file descriptor and callback unregistered from the looper.
+ */
+typedef int (*ALooper_callbackFunc)(int fd, int events, void* data);
+
+/**
+ * Waits for events to be available, with optional timeout in milliseconds.
+ * Invokes callbacks for all file descriptors on which an event occurred.
+ *
+ * If the timeout is zero, returns immediately without blocking.
+ * If the timeout is negative, waits indefinitely until an event appears.
+ *
+ * Returns ALOOPER_POLL_WAKE if the poll was awoken using wake() before
+ * the timeout expired and no callbacks were invoked and no other file
+ * descriptors were ready.
+ *
+ * Returns ALOOPER_POLL_CALLBACK if one or more callbacks were invoked.
+ *
+ * Returns ALOOPER_POLL_TIMEOUT if there was no data before the given
+ * timeout expired.
+ *
+ * Returns ALOOPER_POLL_ERROR if an error occurred.
+ *
+ * Returns a value >= 0 containing an identifier if its file descriptor has data
+ * and it has no callback function (requiring the caller here to handle it).
+ * In this (and only this) case outFd, outEvents and outData will contain the poll
+ * events and data associated with the fd, otherwise they will be set to NULL.
+ *
+ * This method does not return until it has finished invoking the appropriate callbacks
+ * for all file descriptors that were signalled.
+ */
+int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData);
+
+/**
+ * Like ALooper_pollOnce(), but performs all pending callbacks until all
+ * data has been consumed or a file descriptor is available with no callback.
+ * This function will never return ALOOPER_POLL_CALLBACK.
+ */
+int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData);
+
+/**
+ * Wakes the poll asynchronously.
+ *
+ * This method can be called on any thread.
+ * This method returns immediately.
+ */
+void ALooper_wake(ALooper* looper);
+
+/**
+ * Adds a new file descriptor to be polled by the looper.
+ * If the same file descriptor was previously added, it is replaced.
+ *
+ * "fd" is the file descriptor to be added.
+ * "ident" is an identifier for this event, which is returned from ALooper_pollOnce().
+ * The identifier must be >= 0, or ALOOPER_POLL_CALLBACK if providing a non-NULL callback.
+ * "events" are the poll events to wake up on. Typically this is ALOOPER_EVENT_INPUT.
+ * "callback" is the function to call when there is an event on the file descriptor.
+ * "data" is a private data pointer to supply to the callback.
+ *
+ * There are two main uses of this function:
+ *
+ * (1) If "callback" is non-NULL, then this function will be called when there is
+ * data on the file descriptor. It should execute any events it has pending,
+ * appropriately reading from the file descriptor. The 'ident' is ignored in this case.
+ *
+ * (2) If "callback" is NULL, the 'ident' will be returned by ALooper_pollOnce
+ * when its file descriptor has data available, requiring the caller to take
+ * care of processing it.
+ *
+ * Returns 1 if the file descriptor was added or -1 if an error occurred.
+ *
+ * This method can be called on any thread.
+ * This method may block briefly if it needs to wake the poll.
+ */
+int ALooper_addFd(ALooper* looper, int fd, int ident, int events,
+ ALooper_callbackFunc callback, void* data);
+
+/**
+ * Removes a previously added file descriptor from the looper.
+ *
+ * When this method returns, it is safe to close the file descriptor since the looper
+ * will no longer have a reference to it. However, it is possible for the callback to
+ * already be running or for it to run one last time if the file descriptor was already
+ * signalled. Calling code is responsible for ensuring that this case is safely handled.
+ * For example, if the callback takes care of removing itself during its own execution either
+ * by returning 0 or by calling this method, then it can be guaranteed to not be invoked
+ * again at any later time unless registered anew.
+ *
+ * Returns 1 if the file descriptor was removed, 0 if none was previously registered
+ * or -1 if an error occurred.
+ *
+ * This method can be called on any thread.
+ * This method may block briefly if it needs to wake the poll.
+ */
+int ALooper_removeFd(ALooper* looper, int fd);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_WINDOW_H
diff --git a/ndk/platforms/android-13/include/android/native_activity.h b/ndk/platforms/android-13/include/android/native_activity.h
new file mode 100644
index 0000000..bc70f88
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/native_activity.h
@@ -0,0 +1,310 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+
+#ifndef ANDROID_NATIVE_ACTIVITY_H
+#define ANDROID_NATIVE_ACTIVITY_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <jni.h>
+
+#include <android/asset_manager.h>
+#include <android/input.h>
+#include <android/native_window.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ANativeActivityCallbacks;
+
+/**
+ * This structure defines the native side of an android.app.NativeActivity.
+ * It is created by the framework, and handed to the application's native
+ * code as it is being launched.
+ */
+typedef struct ANativeActivity {
+ /**
+ * Pointer to the callback function table of the native application.
+ * You can set the functions here to your own callbacks. The callbacks
+ * pointer itself here should not be changed; it is allocated and managed
+ * for you by the framework.
+ */
+ struct ANativeActivityCallbacks* callbacks;
+
+ /**
+ * The global handle on the process's Java VM.
+ */
+ JavaVM* vm;
+
+ /**
+ * JNI context for the main thread of the app. Note that this field
+ * can ONLY be used from the main thread of the process; that is, the
+ * thread that calls into the ANativeActivityCallbacks.
+ */
+ JNIEnv* env;
+
+ /**
+ * The NativeActivity object handle.
+ *
+ * IMPORTANT NOTE: This member is mis-named. It should really be named
+ * 'activity' instead of 'clazz', since it's a reference to the
+ * NativeActivity instance created by the system for you.
+ *
+ * We unfortunately cannot change this without breaking NDK
+ * source-compatibility.
+ */
+ jobject clazz;
+
+ /**
+ * Path to this application's internal data directory.
+ */
+ const char* internalDataPath;
+
+ /**
+ * Path to this application's external (removable/mountable) data directory.
+ */
+ const char* externalDataPath;
+
+ /**
+ * The platform's SDK version code.
+ */
+ int32_t sdkVersion;
+
+ /**
+ * This is the native instance of the application. It is not used by
+ * the framework, but can be set by the application to its own instance
+ * state.
+ */
+ void* instance;
+
+ /**
+ * Pointer to the Asset Manager instance for the application. The application
+ * uses this to access binary assets bundled inside its own .apk file.
+ */
+ AAssetManager* assetManager;
+
+ /**
+ * Available starting with Honeycomb: path to the directory containing
+ * the application's OBB files (if any). If the app doesn't have any
+ * OBB files, this directory may not exist.
+ */
+ const char* obbPath;
+} ANativeActivity;
+
+/**
+ * These are the callbacks the framework makes into a native application.
+ * All of these callbacks happen on the main thread of the application.
+ * By default, all callbacks are NULL; set to a pointer to your own function
+ * to have it called.
+ */
+typedef struct ANativeActivityCallbacks {
+ /**
+ * NativeActivity has started. See Java documentation for Activity.onStart()
+ * for more information.
+ */
+ void (*onStart)(ANativeActivity* activity);
+
+ /**
+ * NativeActivity has resumed. See Java documentation for Activity.onResume()
+ * for more information.
+ */
+ void (*onResume)(ANativeActivity* activity);
+
+ /**
+ * Framework is asking NativeActivity to save its current instance state.
+ * See Java documentation for Activity.onSaveInstanceState() for more
+ * information. The returned pointer needs to be created with malloc();
+ * the framework will call free() on it for you. You also must fill in
+ * outSize with the number of bytes in the allocation. Note that the
+ * saved state will be persisted, so it can not contain any active
+ * entities (pointers to memory, file descriptors, etc).
+ */
+ void* (*onSaveInstanceState)(ANativeActivity* activity, size_t* outSize);
+
+ /**
+ * NativeActivity has paused. See Java documentation for Activity.onPause()
+ * for more information.
+ */
+ void (*onPause)(ANativeActivity* activity);
+
+ /**
+ * NativeActivity has stopped. See Java documentation for Activity.onStop()
+ * for more information.
+ */
+ void (*onStop)(ANativeActivity* activity);
+
+ /**
+ * NativeActivity is being destroyed. See Java documentation for Activity.onDestroy()
+ * for more information.
+ */
+ void (*onDestroy)(ANativeActivity* activity);
+
+ /**
+ * Focus has changed in this NativeActivity's window. This is often used,
+ * for example, to pause a game when it loses input focus.
+ */
+ void (*onWindowFocusChanged)(ANativeActivity* activity, int hasFocus);
+
+ /**
+ * The drawing window for this native activity has been created. You
+ * can use the given native window object to start drawing.
+ */
+ void (*onNativeWindowCreated)(ANativeActivity* activity, ANativeWindow* window);
+
+ /**
+ * The drawing window for this native activity has been resized. You should
+ * retrieve the new size from the window and ensure that your rendering in
+ * it now matches.
+ */
+ void (*onNativeWindowResized)(ANativeActivity* activity, ANativeWindow* window);
+
+ /**
+ * The drawing window for this native activity needs to be redrawn. To avoid
+ * transient artifacts during screen changes (such resizing after rotation),
+ * applications should not return from this function until they have finished
+ * drawing their window in its current state.
+ */
+ void (*onNativeWindowRedrawNeeded)(ANativeActivity* activity, ANativeWindow* window);
+
+ /**
+ * The drawing window for this native activity is going to be destroyed.
+ * You MUST ensure that you do not touch the window object after returning
+ * from this function: in the common case of drawing to the window from
+ * another thread, that means the implementation of this callback must
+ * properly synchronize with the other thread to stop its drawing before
+ * returning from here.
+ */
+ void (*onNativeWindowDestroyed)(ANativeActivity* activity, ANativeWindow* window);
+
+ /**
+ * The input queue for this native activity's window has been created.
+ * You can use the given input queue to start retrieving input events.
+ */
+ void (*onInputQueueCreated)(ANativeActivity* activity, AInputQueue* queue);
+
+ /**
+ * The input queue for this native activity's window is being destroyed.
+ * You should no longer try to reference this object upon returning from this
+ * function.
+ */
+ void (*onInputQueueDestroyed)(ANativeActivity* activity, AInputQueue* queue);
+
+ /**
+ * The rectangle in the window in which content should be placed has changed.
+ */
+ void (*onContentRectChanged)(ANativeActivity* activity, const ARect* rect);
+
+ /**
+ * The current device AConfiguration has changed. The new configuration can
+ * be retrieved from assetManager.
+ */
+ void (*onConfigurationChanged)(ANativeActivity* activity);
+
+ /**
+ * The system is running low on memory. Use this callback to release
+ * resources you do not need, to help the system avoid killing more
+ * important processes.
+ */
+ void (*onLowMemory)(ANativeActivity* activity);
+} ANativeActivityCallbacks;
+
+/**
+ * This is the function that must be in the native code to instantiate the
+ * application's native activity. It is called with the activity instance (see
+ * above); if the code is being instantiated from a previously saved instance,
+ * the savedState will be non-NULL and point to the saved data. You must make
+ * any copy of this data you need -- it will be released after you return from
+ * this function.
+ */
+typedef void ANativeActivity_createFunc(ANativeActivity* activity,
+ void* savedState, size_t savedStateSize);
+
+/**
+ * The name of the function that NativeInstance looks for when launching its
+ * native code. This is the default function that is used, you can specify
+ * "android.app.func_name" string meta-data in your manifest to use a different
+ * function.
+ */
+extern ANativeActivity_createFunc ANativeActivity_onCreate;
+
+/**
+ * Finish the given activity. Its finish() method will be called, causing it
+ * to be stopped and destroyed. Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.
+ */
+void ANativeActivity_finish(ANativeActivity* activity);
+
+/**
+ * Change the window format of the given activity. Calls getWindow().setFormat()
+ * of the given activity. Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.
+ */
+void ANativeActivity_setWindowFormat(ANativeActivity* activity, int32_t format);
+
+/**
+ * Change the window flags of the given activity. Calls getWindow().setFlags()
+ * of the given activity. Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place. See window.h for flag constants.
+ */
+void ANativeActivity_setWindowFlags(ANativeActivity* activity,
+ uint32_t addFlags, uint32_t removeFlags);
+
+/**
+ * Flags for ANativeActivity_showSoftInput; see the Java InputMethodManager
+ * API for documentation.
+ */
+enum {
+ ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT = 0x0001,
+ ANATIVEACTIVITY_SHOW_SOFT_INPUT_FORCED = 0x0002,
+};
+
+/**
+ * Show the IME while in the given activity. Calls InputMethodManager.showSoftInput()
+ * for the given activity. Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.
+ */
+void ANativeActivity_showSoftInput(ANativeActivity* activity, uint32_t flags);
+
+/**
+ * Flags for ANativeActivity_hideSoftInput; see the Java InputMethodManager
+ * API for documentation.
+ */
+enum {
+ ANATIVEACTIVITY_HIDE_SOFT_INPUT_IMPLICIT_ONLY = 0x0001,
+ ANATIVEACTIVITY_HIDE_SOFT_INPUT_NOT_ALWAYS = 0x0002,
+};
+
+/**
+ * Hide the IME while in the given activity. Calls InputMethodManager.hideSoftInput()
+ * for the given activity. Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.
+ */
+void ANativeActivity_hideSoftInput(ANativeActivity* activity, uint32_t flags);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_ACTIVITY_H
+
diff --git a/ndk/platforms/android-13/include/android/native_window_jni.h b/ndk/platforms/android-13/include/android/native_window_jni.h
new file mode 100644
index 0000000..408c263
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/native_window_jni.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef ANDROID_NATIVE_WINDOW_JNI_H
+#define ANDROID_NATIVE_WINDOW_JNI_H
+
+#include <android/native_window.h>
+
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Return the ANativeWindow associated with a Java Surface object,
+ * for interacting with it through native code. This acquires a reference
+ * on the ANativeWindow that is returned; be sure to use ANativeWindow_release()
+ * when done with it so that it doesn't leak.
+ */
+ANativeWindow* ANativeWindow_fromSurface(JNIEnv* env, jobject surface);
+
+/**
+ * Return the ANativeWindow associated with a Java SurfaceTexture object,
+ * for interacting with it through native code. This acquires a reference
+ * on the ANativeWindow that is returned; be sure to use ANativeWindow_release()
+ * when done with it so that it doesn't leak.
+ */
+ANativeWindow* ANativeWindow_fromSurfaceTexture(JNIEnv* env, jobject surfaceTexture);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_WINDOW_H
diff --git a/ndk/platforms/android-13/include/android/tts.h b/ndk/platforms/android-13/include/android/tts.h
new file mode 100644
index 0000000..fb15108
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/tts.h
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * 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.
+ */
+#ifndef ANDROID_TTS_H
+#define ANDROID_TTS_H
+
+// This header defines the interface used by the Android platform
+// to access Text-To-Speech functionality in shared libraries that implement
+// speech synthesis and the management of resources associated with the
+// synthesis.
+
+// The shared library must contain a function named "android_getTtsEngine"
+// that returns an 'android_tts_engine_t' instance.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ANDROID_TTS_ENGINE_PROPERTY_CONFIG "engineConfig"
+#define ANDROID_TTS_ENGINE_PROPERTY_PITCH "pitch"
+#define ANDROID_TTS_ENGINE_PROPERTY_RATE "rate"
+#define ANDROID_TTS_ENGINE_PROPERTY_VOLUME "volume"
+
+typedef enum {
+ ANDROID_TTS_SUCCESS = 0,
+ ANDROID_TTS_FAILURE = -1,
+ ANDROID_TTS_FEATURE_UNSUPPORTED = -2,
+ ANDROID_TTS_VALUE_INVALID = -3,
+ ANDROID_TTS_PROPERTY_UNSUPPORTED = -4,
+ ANDROID_TTS_PROPERTY_SIZE_TOO_SMALL = -5,
+ ANDROID_TTS_MISSING_RESOURCES = -6
+} android_tts_result_t;
+
+typedef enum {
+ ANDROID_TTS_LANG_COUNTRY_VAR_AVAILABLE = 2,
+ ANDROID_TTS_LANG_COUNTRY_AVAILABLE = 1,
+ ANDROID_TTS_LANG_AVAILABLE = 0,
+ ANDROID_TTS_LANG_MISSING_DATA = -1,
+ ANDROID_TTS_LANG_NOT_SUPPORTED = -2
+} android_tts_support_result_t;
+
+typedef enum {
+ ANDROID_TTS_SYNTH_DONE = 0,
+ ANDROID_TTS_SYNTH_PENDING = 1
+} android_tts_synth_status_t;
+
+typedef enum {
+ ANDROID_TTS_CALLBACK_HALT = 0,
+ ANDROID_TTS_CALLBACK_CONTINUE = 1
+} android_tts_callback_status_t;
+
+// Supported audio formats
+typedef enum {
+ ANDROID_TTS_AUDIO_FORMAT_INVALID = -1,
+ ANDROID_TTS_AUDIO_FORMAT_DEFAULT = 0,
+ ANDROID_TTS_AUDIO_FORMAT_PCM_16_BIT = 1,
+ ANDROID_TTS_AUDIO_FORMAT_PCM_8_BIT = 2,
+} android_tts_audio_format_t;
+
+
+/* An android_tts_engine_t object can be anything, but must have,
+ * as its first field, a pointer to a table of functions.
+ *
+ * See the full definition of struct android_tts_engine_t_funcs_t
+ * below for details.
+ */
+typedef struct android_tts_engine_funcs_t android_tts_engine_funcs_t;
+
+typedef struct {
+ android_tts_engine_funcs_t *funcs;
+} android_tts_engine_t;
+
+/* This function must be located in the TTS Engine shared library
+ * and must return the address of an android_tts_engine_t library.
+ */
+extern android_tts_engine_t *android_getTtsEngine();
+
+/* Including the old version for legacy support (Froyo compatibility).
+ * This should return the same thing as android_getTtsEngine.
+ */
+extern "C" android_tts_engine_t *getTtsEngine();
+
+// A callback type used to notify the framework of new synthetized
+// audio samples, status will be SYNTH_DONE for the last sample of
+// the last request, of SYNTH_PENDING otherwise.
+//
+// This is passed by the framework to the engine through the
+// 'engine_init' function (see below).
+//
+// The callback for synthesis completed takes:
+// @param [inout] void *& - The userdata pointer set in the original
+// synth call
+// @param [in] uint32_t - Track sampling rate in Hz
+// @param [in] uint32_t - The audio format
+// @param [in] int - The number of channels
+// @param [inout] int8_t *& - A buffer of audio data only valid during the
+// execution of the callback
+// @param [inout] size_t & - The size of the buffer
+// @param [in] tts_synth_status - indicate whether the synthesis is done, or
+// if more data is to be synthesized.
+// @return TTS_CALLBACK_HALT to indicate the synthesis must stop,
+// TTS_CALLBACK_CONTINUE to indicate the synthesis must continue if
+// there is more data to produce.
+typedef android_tts_callback_status_t (*android_tts_synth_cb_t)
+ (void **pUserData,
+ uint32_t trackSamplingHz,
+ android_tts_audio_format_t audioFormat,
+ int channelCount,
+ int8_t **pAudioBuffer,
+ size_t *pBufferSize,
+ android_tts_synth_status_t status);
+
+
+// The table of function pointers that the android_tts_engine_t must point to.
+// Note that each of these functions will take a handle to the engine itself
+// as their first parameter.
+//
+
+struct android_tts_engine_funcs_t {
+ // reserved fields, ignored by the framework
+ // they must be placed here to ensure binary compatibility
+ // of legacy binary plugins.
+ void *reserved[2];
+
+ // Initialize the TTS engine and returns whether initialization succeeded.
+ // @param synthDoneCBPtr synthesis callback function pointer
+ // @return TTS_SUCCESS, or TTS_FAILURE
+ android_tts_result_t (*init)
+ (void *engine,
+ android_tts_synth_cb_t synthDonePtr,
+ const char *engineConfig);
+
+ // Shut down the TTS engine and releases all associated resources.
+ // @return TTS_SUCCESS, or TTS_FAILURE
+ android_tts_result_t (*shutdown)
+ (void *engine);
+
+ // Interrupt synthesis and flushes any synthesized data that hasn't been
+ // output yet. This will block until callbacks underway are completed.
+ // @return TTS_SUCCESS, or TTS_FAILURE
+ android_tts_result_t (*stop)
+ (void *engine);
+
+ // Returns the level of support for the language, country and variant.
+ // @return TTS_LANG_COUNTRY_VAR_AVAILABLE if the language, country and variant are supported,
+ // and the corresponding resources are correctly installed
+ // TTS_LANG_COUNTRY_AVAILABLE if the language and country are supported and the
+ // corresponding resources are correctly installed, but there is no match for
+ // the specified variant
+ // TTS_LANG_AVAILABLE if the language is supported and the
+ // corresponding resources are correctly installed, but there is no match for
+ // the specified country and variant
+ // TTS_LANG_MISSING_DATA if the required resources to provide any level of support
+ // for the language are not correctly installed
+ // TTS_LANG_NOT_SUPPORTED if the language is not supported by the TTS engine.
+ android_tts_support_result_t (*isLanguageAvailable)
+ (void *engine,
+ const char *lang,
+ const char *country,
+ const char *variant);
+
+ // Load the resources associated with the specified language. The loaded
+ // language will only be used once a call to setLanguage() with the same
+ // language value is issued. Language and country values are coded according to the ISO three
+ // letter codes for languages and countries, as can be retrieved from a java.util.Locale
+ // instance. The variant value is encoded as the variant string retrieved from a
+ // java.util.Locale instance built with that variant data.
+ // @param lang pointer to the ISO three letter code for the language
+ // @param country pointer to the ISO three letter code for the country
+ // @param variant pointer to the variant code
+ // @return TTS_SUCCESS, or TTS_FAILURE
+ android_tts_result_t (*loadLanguage)
+ (void *engine,
+ const char *lang,
+ const char *country,
+ const char *variant);
+
+ // Load the resources associated with the specified language, country and Locale variant.
+ // The loaded language will only be used once a call to setLanguageFromLocale() with the same
+ // language value is issued. Language and country values are coded according to the ISO three
+ // letter codes for languages and countries, as can be retrieved from a java.util.Locale
+ // instance. The variant value is encoded as the variant string retrieved from a
+ // java.util.Locale instance built with that variant data.
+ // @param lang pointer to the ISO three letter code for the language
+ // @param country pointer to the ISO three letter code for the country
+ // @param variant pointer to the variant code
+ // @return TTS_SUCCESS, or TTS_FAILURE
+ android_tts_result_t (*setLanguage)
+ (void *engine,
+ const char *lang,
+ const char *country,
+ const char *variant);
+
+ // Retrieve the currently set language, country and variant, or empty strings if none of
+ // parameters have been set. Language and country are represented by their 3-letter ISO code
+ // @param[out] pointer to the retrieved 3-letter code language value
+ // @param[out] pointer to the retrieved 3-letter code country value
+ // @param[out] pointer to the retrieved variant value
+ // @return TTS_SUCCESS, or TTS_FAILURE
+ android_tts_result_t (*getLanguage)
+ (void *engine,
+ char *language,
+ char *country,
+ char *variant);
+
+ // Notifies the engine what audio parameters should be used for the synthesis.
+ // This is meant to be used as a hint, the engine implementation will set the output values
+ // to those of the synthesis format, based on a given hint.
+ // @param[inout] encoding in: the desired audio sample format
+ // out: the format used by the TTS engine
+ // @param[inout] rate in: the desired audio sample rate
+ // out: the sample rate used by the TTS engine
+ // @param[inout] channels in: the desired number of audio channels
+ // out: the number of channels used by the TTS engine
+ // @return TTS_SUCCESS, or TTS_FAILURE
+ android_tts_result_t (*setAudioFormat)
+ (void *engine,
+ android_tts_audio_format_t* pEncoding,
+ uint32_t* pRate,
+ int* pChannels);
+
+ // Set a property for the the TTS engine
+ // "size" is the maximum size of "value" for properties "property"
+ // @param property pointer to the property name
+ // @param value pointer to the property value
+ // @param size maximum size required to store this type of property
+ // @return TTS_PROPERTY_UNSUPPORTED, or TTS_SUCCESS, or TTS_FAILURE,
+ // or TTS_VALUE_INVALID
+ android_tts_result_t (*setProperty)
+ (void *engine,
+ const char *property,
+ const char *value,
+ const size_t size);
+
+ // Retrieve a property from the TTS engine
+ // @param property pointer to the property name
+ // @param[out] value pointer to the retrieved language value
+ // @param[inout] iosize in: stores the size available to store the
+ // property value.
+ // out: stores the size required to hold the language
+ // value if getLanguage() returned
+ // TTS_PROPERTY_SIZE_TOO_SMALL, unchanged otherwise
+ // @return TTS_PROPERTY_UNSUPPORTED, or TTS_SUCCESS,
+ // or TTS_PROPERTY_SIZE_TOO_SMALL
+ android_tts_result_t (*getProperty)
+ (void *engine,
+ const char *property,
+ char *value,
+ size_t *iosize);
+
+ // Synthesize the text.
+ // As the synthesis is performed, the engine invokes the callback to notify
+ // the TTS framework that it has filled the given buffer, and indicates how
+ // many bytes it wrote. The callback is called repeatedly until the engine
+ // has generated all the audio data corresponding to the text.
+ // Note about the format of the input: the text parameter may use the
+ // following elements
+ // and their respective attributes as defined in the SSML 1.0 specification:
+ // * lang
+ // * say-as:
+ // o interpret-as
+ // * phoneme
+ // * voice:
+ // o gender,
+ // o age,
+ // o variant,
+ // o name
+ // * emphasis
+ // * break:
+ // o strength,
+ // o time
+ // * prosody:
+ // o pitch,
+ // o contour,
+ // o range,
+ // o rate,
+ // o duration,
+ // o volume
+ // * mark
+ // Differences between this text format and SSML are:
+ // * full SSML documents are not supported
+ // * namespaces are not supported
+ // Text is coded in UTF-8.
+ // @param text the UTF-8 text to synthesize
+ // @param userdata pointer to be returned when the call is invoked
+ // @param buffer the location where the synthesized data must be written
+ // @param bufferSize the number of bytes that can be written in buffer
+ // @return TTS_SUCCESS or TTS_FAILURE
+ android_tts_result_t (*synthesizeText)
+ (void *engine,
+ const char *text,
+ int8_t *buffer,
+ size_t bufferSize,
+ void *userdata);
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ANDROID_TTS_H */
diff --git a/ndk/platforms/android-13/include/math.h b/ndk/platforms/android-13/include/math.h
new file mode 100644
index 0000000..e46cf46
--- /dev/null
+++ b/ndk/platforms/android-13/include/math.h
@@ -0,0 +1,498 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * from: @(#)fdlibm.h 5.1 93/09/24
+ * $FreeBSD: src/lib/msun/src/math.h,v 1.61 2005/04/16 21:12:47 das Exp $
+ */
+
+#ifndef _MATH_H_
+#define _MATH_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <limits.h>
+
+#define __pure2
+
+/*
+ * ANSI/POSIX
+ */
+extern const union __infinity_un {
+ unsigned char __uc[8];
+ double __ud;
+} __infinity;
+
+extern const union __nan_un {
+ unsigned char __uc[sizeof(float)];
+ float __uf;
+} __nan;
+
+/* #if __GNUC_PREREQ__(3, 3) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800) */
+#if 1
+#define __MATH_BUILTIN_CONSTANTS
+#endif
+
+/* #if __GNUC_PREREQ__(3, 0) && !defined(__INTEL_COMPILER) */
+#if 1
+#define __MATH_BUILTIN_RELOPS
+#endif
+
+/* #ifdef __MATH_BUILTIN_CONSTANTS */
+#if 1
+#define HUGE_VAL __builtin_huge_val()
+#else
+#define HUGE_VAL (__infinity.__ud)
+#endif
+
+/* #if __ISO_C_VISIBLE >= 1999 */
+#if 0
+#define FP_ILOGB0 (-__INT_MAX)
+#define FP_ILOGBNAN __INT_MAX
+#else
+#define FP_ILOGB0 (-INT_MAX)
+#define FP_ILOGBNAN INT_MAX
+#endif
+
+#ifdef __MATH_BUILTIN_CONSTANTS
+#define HUGE_VALF __builtin_huge_valf()
+#define HUGE_VALL __builtin_huge_vall()
+#define INFINITY __builtin_inf()
+#define NAN __builtin_nan("")
+#else
+#define HUGE_VALF (float)HUGE_VAL
+#define HUGE_VALL (long double)HUGE_VAL
+#define INFINITY HUGE_VALF
+#define NAN (__nan.__uf)
+#endif /* __MATH_BUILTIN_CONSTANTS */
+
+#define MATH_ERRNO 1
+#define MATH_ERREXCEPT 2
+#define math_errhandling MATH_ERREXCEPT
+
+/* XXX We need a <machine/math.h>. */
+#if defined(__ia64__) || defined(__sparc64__)
+#define FP_FAST_FMA
+#endif
+#ifdef __ia64__
+#define FP_FAST_FMAL
+#endif
+#define FP_FAST_FMAF
+
+/* Symbolic constants to classify floating point numbers. */
+#define FP_INFINITE 0x01
+#define FP_NAN 0x02
+#define FP_NORMAL 0x04
+#define FP_SUBNORMAL 0x08
+#define FP_ZERO 0x10
+#define fpclassify(x) \
+ ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
+ : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
+ : __fpclassifyl(x))
+
+#define isfinite(x) \
+ ((sizeof (x) == sizeof (float)) ? __isfinitef(x) \
+ : (sizeof (x) == sizeof (double)) ? __isfinite(x) \
+ : __isfinitel(x))
+#define isinf(x) \
+ ((sizeof (x) == sizeof (float)) ? __isinff(x) \
+ : (sizeof (x) == sizeof (double)) ? __isinf(x) \
+ : __isinfl(x))
+#define isnan(x) \
+ ((sizeof (x) == sizeof (float)) ? isnanf(x) \
+ : (sizeof (x) == sizeof (double)) ? isnan(x) \
+ : __isnanl(x))
+#define isnormal(x) \
+ ((sizeof (x) == sizeof (float)) ? __isnormalf(x) \
+ : (sizeof (x) == sizeof (double)) ? __isnormal(x) \
+ : __isnormall(x))
+
+#ifdef __MATH_BUILTIN_RELOPS
+#define isgreater(x, y) __builtin_isgreater((x), (y))
+#define isgreaterequal(x, y) __builtin_isgreaterequal((x), (y))
+#define isless(x, y) __builtin_isless((x), (y))
+#define islessequal(x, y) __builtin_islessequal((x), (y))
+#define islessgreater(x, y) __builtin_islessgreater((x), (y))
+#define isunordered(x, y) __builtin_isunordered((x), (y))
+#else
+#define isgreater(x, y) (!isunordered((x), (y)) && (x) > (y))
+#define isgreaterequal(x, y) (!isunordered((x), (y)) && (x) >= (y))
+#define isless(x, y) (!isunordered((x), (y)) && (x) < (y))
+#define islessequal(x, y) (!isunordered((x), (y)) && (x) <= (y))
+#define islessgreater(x, y) (!isunordered((x), (y)) && \
+ ((x) > (y) || (y) > (x)))
+#define isunordered(x, y) (isnan(x) || isnan(y))
+#endif /* __MATH_BUILTIN_RELOPS */
+
+#define signbit(x) \
+ ((sizeof (x) == sizeof (float)) ? __signbitf(x) \
+ : (sizeof (x) == sizeof (double)) ? __signbit(x) \
+ : __signbitl(x))
+
+#if 0
+typedef __double_t double_t;
+typedef __float_t float_t;
+#endif
+/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+
+/*
+ * XOPEN/SVID
+ */
+/* #if __BSD_VISIBLE || __XSI_VISIBLE */
+#define M_E 2.7182818284590452354 /* e */
+#define M_LOG2E 1.4426950408889634074 /* log 2e */
+#define M_LOG10E 0.43429448190325182765 /* log 10e */
+#define M_LN2 0.69314718055994530942 /* log e2 */
+#define M_LN10 2.30258509299404568402 /* log e10 */
+#define M_PI 3.14159265358979323846 /* pi */
+#define M_PI_2 1.57079632679489661923 /* pi/2 */
+#define M_PI_4 0.78539816339744830962 /* pi/4 */
+#define M_1_PI 0.31830988618379067154 /* 1/pi */
+#define M_2_PI 0.63661977236758134308 /* 2/pi */
+#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
+#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
+
+#define MAXFLOAT ((float)3.40282346638528860e+38)
+extern int signgam;
+/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
+
+#if __BSD_VISIBLE
+#if 0
+/* Old value from 4.4BSD-Lite math.h; this is probably better. */
+#define HUGE HUGE_VAL
+#else
+#define HUGE MAXFLOAT
+#endif
+#endif /* __BSD_VISIBLE */
+
+/*
+ * Most of these functions depend on the rounding mode and have the side
+ * effect of raising floating-point exceptions, so they are not declared
+ * as __pure2. In C99, FENV_ACCESS affects the purity of these functions.
+ */
+__BEGIN_DECLS
+/*
+ * ANSI/POSIX
+ */
+int __fpclassifyd(double) __NDK_FPABI_MATH__ __pure2;
+int __fpclassifyf(float) __NDK_FPABI_MATH__ __pure2;
+int __fpclassifyl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isfinitef(float) __NDK_FPABI_MATH__ __pure2;
+int __isfinite(double) __NDK_FPABI_MATH__ __pure2;
+int __isfinitel(long double) __NDK_FPABI_MATH__ __pure2;
+int __isinff(float) __NDK_FPABI_MATH__ __pure2;
+int __isinf(double) __NDK_FPABI_MATH__ __pure2;
+int __isinfl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isnanl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isnormalf(float) __NDK_FPABI_MATH__ __pure2;
+int __isnormal(double) __NDK_FPABI_MATH__ __pure2;
+int __isnormall(long double) __NDK_FPABI_MATH__ __pure2;
+int __signbit(double) __NDK_FPABI_MATH__ __pure2;
+int __signbitf(float) __NDK_FPABI_MATH__ __pure2;
+int __signbitl(long double) __NDK_FPABI_MATH__ __pure2;
+
+double acos(double) __NDK_FPABI_MATH__;
+double asin(double) __NDK_FPABI_MATH__;
+double atan(double) __NDK_FPABI_MATH__;
+double atan2(double, double) __NDK_FPABI_MATH__;
+double cos(double) __NDK_FPABI_MATH__;
+double sin(double) __NDK_FPABI_MATH__;
+double tan(double) __NDK_FPABI_MATH__;
+
+double cosh(double) __NDK_FPABI_MATH__;
+double sinh(double) __NDK_FPABI_MATH__;
+double tanh(double) __NDK_FPABI_MATH__;
+
+double exp(double) __NDK_FPABI_MATH__;
+double frexp(double, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+double ldexp(double, int) __NDK_FPABI_MATH__;
+double log(double) __NDK_FPABI_MATH__;
+double log10(double) __NDK_FPABI_MATH__;
+double modf(double, double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+
+double pow(double, double) __NDK_FPABI_MATH__;
+double sqrt(double) __NDK_FPABI_MATH__;
+
+double ceil(double) __NDK_FPABI_MATH__;
+double fabs(double) __NDK_FPABI_MATH__ __pure2;
+double floor(double) __NDK_FPABI_MATH__;
+double fmod(double, double) __NDK_FPABI_MATH__;
+
+/*
+ * These functions are not in C90.
+ */
+/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
+double acosh(double) __NDK_FPABI_MATH__;
+double asinh(double) __NDK_FPABI_MATH__;
+double atanh(double) __NDK_FPABI_MATH__;
+double cbrt(double) __NDK_FPABI_MATH__;
+double erf(double) __NDK_FPABI_MATH__;
+double erfc(double) __NDK_FPABI_MATH__;
+double exp2(double) __NDK_FPABI_MATH__;
+double expm1(double) __NDK_FPABI_MATH__;
+double fma(double, double, double) __NDK_FPABI_MATH__;
+double hypot(double, double) __NDK_FPABI_MATH__;
+int ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int (isinf)(double) __NDK_FPABI_MATH__ __pure2; */
+int (isnan)(double) __NDK_FPABI_MATH__ __pure2;
+double lgamma(double) __NDK_FPABI_MATH__;
+long long llrint(double) __NDK_FPABI_MATH__;
+long long llround(double) __NDK_FPABI_MATH__;
+double log1p(double) __NDK_FPABI_MATH__;
+double logb(double) __NDK_FPABI_MATH__;
+long lrint(double) __NDK_FPABI_MATH__;
+long lround(double) __NDK_FPABI_MATH__;
+double nan(const char *) __NDK_FPABI_MATH__ __pure2;
+double nextafter(double, double) __NDK_FPABI_MATH__;
+double remainder(double, double) __NDK_FPABI_MATH__;
+double remquo(double, double, int *) __NDK_FPABI_MATH__;
+double rint(double) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
+
+/* #if __BSD_VISIBLE || __XSI_VISIBLE */
+double j0(double) __NDK_FPABI_MATH__;
+double j1(double) __NDK_FPABI_MATH__;
+double jn(int, double) __NDK_FPABI_MATH__;
+double scalb(double, double) __NDK_FPABI_MATH__;
+double y0(double) __NDK_FPABI_MATH__;
+double y1(double) __NDK_FPABI_MATH__;
+double yn(int, double) __NDK_FPABI_MATH__;
+
+/* #if __XSI_VISIBLE <= 500 || __BSD_VISIBLE */
+double gamma(double) __NDK_FPABI_MATH__;
+/* #endif */
+/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
+
+/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 */
+double copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double fdim(double, double) __NDK_FPABI_MATH__;
+double fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double nearbyint(double) __NDK_FPABI_MATH__;
+double round(double) __NDK_FPABI_MATH__;
+double scalbln(double, long) __NDK_FPABI_MATH__;
+double scalbn(double, int) __NDK_FPABI_MATH__;
+double tgamma(double) __NDK_FPABI_MATH__;
+double trunc(double) __NDK_FPABI_MATH__;
+/* #endif */
+
+/*
+ * BSD math library entry points
+ */
+/* #if __BSD_VISIBLE */
+double drem(double, double) __NDK_FPABI_MATH__;
+int finite(double) __NDK_FPABI_MATH__ __pure2;
+int isnanf(float) __NDK_FPABI_MATH__ __pure2;
+
+/*
+ * Reentrant version of gamma & lgamma; passes signgam back by reference
+ * as the second argument; user must allocate space for signgam.
+ */
+double gamma_r(double, int *) __NDK_FPABI_MATH__;
+double lgamma_r(double, int *) __NDK_FPABI_MATH__;
+
+/*
+ * IEEE Test Vector
+ */
+double significand(double) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE */
+
+/* float versions of ANSI/POSIX functions */
+/*#if __ISO_C_VISIBLE >= 1999 */
+float acosf(float) __NDK_FPABI_MATH__;
+float asinf(float) __NDK_FPABI_MATH__;
+float atanf(float) __NDK_FPABI_MATH__;
+float atan2f(float, float) __NDK_FPABI_MATH__;
+float cosf(float) __NDK_FPABI_MATH__;
+float sinf(float) __NDK_FPABI_MATH__;
+float tanf(float) __NDK_FPABI_MATH__;
+
+float coshf(float) __NDK_FPABI_MATH__;
+float sinhf(float) __NDK_FPABI_MATH__;
+float tanhf(float) __NDK_FPABI_MATH__;
+
+float exp2f(float) __NDK_FPABI_MATH__;
+float expf(float) __NDK_FPABI_MATH__;
+float expm1f(float) __NDK_FPABI_MATH__;
+float frexpf(float, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+int ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float ldexpf(float, int) __NDK_FPABI_MATH__;
+float log10f(float) __NDK_FPABI_MATH__;
+float log1pf(float) __NDK_FPABI_MATH__;
+float logf(float) __NDK_FPABI_MATH__;
+float modff(float, float *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+
+float powf(float, float) __NDK_FPABI_MATH__;
+float sqrtf(float) __NDK_FPABI_MATH__;
+
+float ceilf(float) __NDK_FPABI_MATH__;
+float fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float floorf(float) __NDK_FPABI_MATH__;
+float fmodf(float, float) __NDK_FPABI_MATH__;
+float roundf(float) __NDK_FPABI_MATH__;
+
+float erff(float) __NDK_FPABI_MATH__;
+float erfcf(float) __NDK_FPABI_MATH__;
+float hypotf(float, float) __NDK_FPABI_MATH__;
+float lgammaf(float) __NDK_FPABI_MATH__;
+float tgammaf(float) __NDK_FPABI_MATH__;
+
+float acoshf(float) __NDK_FPABI_MATH__;
+float asinhf(float) __NDK_FPABI_MATH__;
+float atanhf(float) __NDK_FPABI_MATH__;
+float cbrtf(float) __NDK_FPABI_MATH__;
+float logbf(float) __NDK_FPABI_MATH__;
+float copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long llrintf(float) __NDK_FPABI_MATH__;
+long long llroundf(float) __NDK_FPABI_MATH__;
+long lrintf(float) __NDK_FPABI_MATH__;
+long lroundf(float) __NDK_FPABI_MATH__;
+float nanf(const char *) __NDK_FPABI_MATH__ __pure2;
+float nearbyintf(float) __NDK_FPABI_MATH__;
+float nextafterf(float, float) __NDK_FPABI_MATH__;
+float remainderf(float, float) __NDK_FPABI_MATH__;
+float remquof(float, float, int *) __NDK_FPABI_MATH__;
+float rintf(float) __NDK_FPABI_MATH__;
+float scalblnf(float, long) __NDK_FPABI_MATH__;
+float scalbnf(float, int) __NDK_FPABI_MATH__;
+float truncf(float) __NDK_FPABI_MATH__;
+
+float fdimf(float, float) __NDK_FPABI_MATH__;
+float fmaf(float, float, float) __NDK_FPABI_MATH__;
+float fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float fminf(float, float) __NDK_FPABI_MATH__ __pure2;
+/* #endif */
+
+/*
+ * float versions of BSD math library entry points
+ */
+/* #if __BSD_VISIBLE */
+float dremf(float, float) __NDK_FPABI_MATH__;
+int finitef(float) __NDK_FPABI_MATH__ __pure2;
+float gammaf(float) __NDK_FPABI_MATH__;
+float j0f(float) __NDK_FPABI_MATH__;
+float j1f(float) __NDK_FPABI_MATH__;
+float jnf(int, float) __NDK_FPABI_MATH__;
+float scalbf(float, float) __NDK_FPABI_MATH__;
+float y0f(float) __NDK_FPABI_MATH__;
+float y1f(float) __NDK_FPABI_MATH__;
+float ynf(int, float) __NDK_FPABI_MATH__;
+
+/*
+ * Float versions of reentrant version of gamma & lgamma; passes
+ * signgam back by reference as the second argument; user must
+ * allocate space for signgam.
+ */
+float gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float lgammaf_r(float, int *) __NDK_FPABI_MATH__;
+
+/*
+ * float version of IEEE Test Vector
+ */
+float significandf(float) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE */
+
+/*
+ * long double versions of ISO/POSIX math functions
+ */
+/* #if __ISO_C_VISIBLE >= 1999 */
+#if 0
+long double acoshl(long double) __NDK_FPABI_MATH__;
+long double acosl(long double) __NDK_FPABI_MATH__;
+long double asinhl(long double) __NDK_FPABI_MATH__;
+long double asinl(long double) __NDK_FPABI_MATH__;
+long double atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double atanhl(long double) __NDK_FPABI_MATH__;
+long double atanl(long double) __NDK_FPABI_MATH__;
+long double cbrtl(long double) __NDK_FPABI_MATH__;
+#endif
+long double ceill(long double) __NDK_FPABI_MATH__;
+long double copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double coshl(long double) __NDK_FPABI_MATH__;
+long double cosl(long double) __NDK_FPABI_MATH__;
+long double erfcl(long double) __NDK_FPABI_MATH__;
+long double erfl(long double) __NDK_FPABI_MATH__;
+long double exp2l(long double) __NDK_FPABI_MATH__;
+long double expl(long double) __NDK_FPABI_MATH__;
+long double expm1l(long double) __NDK_FPABI_MATH__;
+#endif
+long double fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double floorl(long double) __NDK_FPABI_MATH__;
+long double fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double fmodl(long double, long double) __NDK_FPABI_MATH__;
+#endif
+long double frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+#if 0
+long double hypotl(long double, long double) __NDK_FPABI_MATH__;
+#endif
+int ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double ldexpl(long double, int) __NDK_FPABI_MATH__;
+#if 0
+long double lgammal(long double) __NDK_FPABI_MATH__;
+long long llrintl(long double) __NDK_FPABI_MATH__;
+#endif
+long long llroundl(long double) __NDK_FPABI_MATH__;
+#if 0
+long double log10l(long double) __NDK_FPABI_MATH__;
+long double log1pl(long double) __NDK_FPABI_MATH__;
+long double log2l(long double) __NDK_FPABI_MATH__;
+long double logbl(long double) __NDK_FPABI_MATH__;
+long double logl(long double) __NDK_FPABI_MATH__;
+long lrintl(long double) __NDK_FPABI_MATH__;
+#endif
+long lroundl(long double) __NDK_FPABI_MATH__;
+#if 0
+long double modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+#endif
+long double nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double nearbyintl(long double) __NDK_FPABI_MATH__;
+#endif
+long double nextafterl(long double, long double) __NDK_FPABI_MATH__;
+double nexttoward(double, long double) __NDK_FPABI_MATH__;
+float nexttowardf(float, long double) __NDK_FPABI_MATH__;
+long double nexttowardl(long double, long double) __NDK_FPABI_MATH__;
+#if 0
+long double powl(long double, long double) __NDK_FPABI_MATH__;
+long double remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double rintl(long double) __NDK_FPABI_MATH__;
+#endif
+long double roundl(long double) __NDK_FPABI_MATH__;
+long double scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double scalbnl(long double, int) __NDK_FPABI_MATH__;
+#if 0
+long double sinhl(long double) __NDK_FPABI_MATH__;
+long double sinl(long double) __NDK_FPABI_MATH__;
+long double sqrtl(long double) __NDK_FPABI_MATH__;
+long double tanhl(long double) __NDK_FPABI_MATH__;
+long double tanl(long double) __NDK_FPABI_MATH__;
+long double tgammal(long double) __NDK_FPABI_MATH__;
+#endif
+long double truncl(long double) __NDK_FPABI_MATH__;
+
+/* BIONIC: GLibc compatibility - required by the ARM toolchain */
+#ifdef _GNU_SOURCE
+void sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
+#endif
+
+/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+__END_DECLS
+
+#endif /* !_MATH_H_ */
diff --git a/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..090b655
--- /dev/null
+++ b/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.functions.txt
@@ -0,0 +1,172 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.variables.txt b/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..090b655
--- /dev/null
+++ b/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.functions.txt
@@ -0,0 +1,172 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.variables.txt b/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..090b655
--- /dev/null
+++ b/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.functions.txt
@@ -0,0 +1,172 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.variables.txt b/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-14/include/android/input.h b/ndk/platforms/android-14/include/android/input.h
new file mode 100644
index 0000000..ac7bcc0
--- /dev/null
+++ b/ndk/platforms/android-14/include/android/input.h
@@ -0,0 +1,848 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_INPUT_H
+#define _ANDROID_INPUT_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process input events in
+ * native code.
+ *
+ * NOTE: These functions MUST be implemented by /system/lib/libui.so
+ */
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <android/keycodes.h>
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key states (may be returned by queries about the current state of a
+ * particular key code, scan code or switch).
+ */
+enum {
+ /* The key state is unknown or the requested key itself is not supported. */
+ AKEY_STATE_UNKNOWN = -1,
+
+ /* The key is up. */
+ AKEY_STATE_UP = 0,
+
+ /* The key is down. */
+ AKEY_STATE_DOWN = 1,
+
+ /* The key is down but is a virtual key press that is being emulated by the system. */
+ AKEY_STATE_VIRTUAL = 2
+};
+
+/*
+ * Meta key / modifer state.
+ */
+enum {
+ /* No meta keys are pressed. */
+ AMETA_NONE = 0,
+
+ /* This mask is used to check whether one of the ALT meta keys is pressed. */
+ AMETA_ALT_ON = 0x02,
+
+ /* This mask is used to check whether the left ALT meta key is pressed. */
+ AMETA_ALT_LEFT_ON = 0x10,
+
+ /* This mask is used to check whether the right ALT meta key is pressed. */
+ AMETA_ALT_RIGHT_ON = 0x20,
+
+ /* This mask is used to check whether one of the SHIFT meta keys is pressed. */
+ AMETA_SHIFT_ON = 0x01,
+
+ /* This mask is used to check whether the left SHIFT meta key is pressed. */
+ AMETA_SHIFT_LEFT_ON = 0x40,
+
+ /* This mask is used to check whether the right SHIFT meta key is pressed. */
+ AMETA_SHIFT_RIGHT_ON = 0x80,
+
+ /* This mask is used to check whether the SYM meta key is pressed. */
+ AMETA_SYM_ON = 0x04,
+
+ /* This mask is used to check whether the FUNCTION meta key is pressed. */
+ AMETA_FUNCTION_ON = 0x08,
+
+ /* This mask is used to check whether one of the CTRL meta keys is pressed. */
+ AMETA_CTRL_ON = 0x1000,
+
+ /* This mask is used to check whether the left CTRL meta key is pressed. */
+ AMETA_CTRL_LEFT_ON = 0x2000,
+
+ /* This mask is used to check whether the right CTRL meta key is pressed. */
+ AMETA_CTRL_RIGHT_ON = 0x4000,
+
+ /* This mask is used to check whether one of the META meta keys is pressed. */
+ AMETA_META_ON = 0x10000,
+
+ /* This mask is used to check whether the left META meta key is pressed. */
+ AMETA_META_LEFT_ON = 0x20000,
+
+ /* This mask is used to check whether the right META meta key is pressed. */
+ AMETA_META_RIGHT_ON = 0x40000,
+
+ /* This mask is used to check whether the CAPS LOCK meta key is on. */
+ AMETA_CAPS_LOCK_ON = 0x100000,
+
+ /* This mask is used to check whether the NUM LOCK meta key is on. */
+ AMETA_NUM_LOCK_ON = 0x200000,
+
+ /* This mask is used to check whether the SCROLL LOCK meta key is on. */
+ AMETA_SCROLL_LOCK_ON = 0x400000,
+};
+
+/*
+ * Input events.
+ *
+ * Input events are opaque structures. Use the provided accessors functions to
+ * read their properties.
+ */
+struct AInputEvent;
+typedef struct AInputEvent AInputEvent;
+
+/*
+ * Input event types.
+ */
+enum {
+ /* Indicates that the input event is a key event. */
+ AINPUT_EVENT_TYPE_KEY = 1,
+
+ /* Indicates that the input event is a motion event. */
+ AINPUT_EVENT_TYPE_MOTION = 2
+};
+
+/*
+ * Key event actions.
+ */
+enum {
+ /* The key has been pressed down. */
+ AKEY_EVENT_ACTION_DOWN = 0,
+
+ /* The key has been released. */
+ AKEY_EVENT_ACTION_UP = 1,
+
+ /* Multiple duplicate key events have occurred in a row, or a complex string is
+ * being delivered. The repeat_count property of the key event contains the number
+ * of times the given key code should be executed.
+ */
+ AKEY_EVENT_ACTION_MULTIPLE = 2
+};
+
+/*
+ * Key event flags.
+ */
+enum {
+ /* This mask is set if the device woke because of this key event. */
+ AKEY_EVENT_FLAG_WOKE_HERE = 0x1,
+
+ /* This mask is set if the key event was generated by a software keyboard. */
+ AKEY_EVENT_FLAG_SOFT_KEYBOARD = 0x2,
+
+ /* This mask is set if we don't want the key event to cause us to leave touch mode. */
+ AKEY_EVENT_FLAG_KEEP_TOUCH_MODE = 0x4,
+
+ /* This mask is set if an event was known to come from a trusted part
+ * of the system. That is, the event is known to come from the user,
+ * and could not have been spoofed by a third party component. */
+ AKEY_EVENT_FLAG_FROM_SYSTEM = 0x8,
+
+ /* This mask is used for compatibility, to identify enter keys that are
+ * coming from an IME whose enter key has been auto-labelled "next" or
+ * "done". This allows TextView to dispatch these as normal enter keys
+ * for old applications, but still do the appropriate action when
+ * receiving them. */
+ AKEY_EVENT_FLAG_EDITOR_ACTION = 0x10,
+
+ /* When associated with up key events, this indicates that the key press
+ * has been canceled. Typically this is used with virtual touch screen
+ * keys, where the user can slide from the virtual key area on to the
+ * display: in that case, the application will receive a canceled up
+ * event and should not perform the action normally associated with the
+ * key. Note that for this to work, the application can not perform an
+ * action for a key until it receives an up or the long press timeout has
+ * expired. */
+ AKEY_EVENT_FLAG_CANCELED = 0x20,
+
+ /* This key event was generated by a virtual (on-screen) hard key area.
+ * Typically this is an area of the touchscreen, outside of the regular
+ * display, dedicated to "hardware" buttons. */
+ AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY = 0x40,
+
+ /* This flag is set for the first key repeat that occurs after the
+ * long press timeout. */
+ AKEY_EVENT_FLAG_LONG_PRESS = 0x80,
+
+ /* Set when a key event has AKEY_EVENT_FLAG_CANCELED set because a long
+ * press action was executed while it was down. */
+ AKEY_EVENT_FLAG_CANCELED_LONG_PRESS = 0x100,
+
+ /* Set for AKEY_EVENT_ACTION_UP when this event's key code is still being
+ * tracked from its initial down. That is, somebody requested that tracking
+ * started on the key down and a long press has not caused
+ * the tracking to be canceled. */
+ AKEY_EVENT_FLAG_TRACKING = 0x200,
+
+ /* Set when a key event has been synthesized to implement default behavior
+ * for an event that the application did not handle.
+ * Fallback key events are generated by unhandled trackball motions
+ * (to emulate a directional keypad) and by certain unhandled key presses
+ * that are declared in the key map (such as special function numeric keypad
+ * keys when numlock is off). */
+ AKEY_EVENT_FLAG_FALLBACK = 0x400,
+};
+
+/*
+ * Motion event actions.
+ */
+
+/* Bit shift for the action bits holding the pointer index as
+ * defined by AMOTION_EVENT_ACTION_POINTER_INDEX_MASK.
+ */
+#define AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT 8
+
+enum {
+ /* Bit mask of the parts of the action code that are the action itself.
+ */
+ AMOTION_EVENT_ACTION_MASK = 0xff,
+
+ /* Bits in the action code that represent a pointer index, used with
+ * AMOTION_EVENT_ACTION_POINTER_DOWN and AMOTION_EVENT_ACTION_POINTER_UP. Shifting
+ * down by AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT provides the actual pointer
+ * index where the data for the pointer going up or down can be found.
+ */
+ AMOTION_EVENT_ACTION_POINTER_INDEX_MASK = 0xff00,
+
+ /* A pressed gesture has started, the motion contains the initial starting location.
+ */
+ AMOTION_EVENT_ACTION_DOWN = 0,
+
+ /* A pressed gesture has finished, the motion contains the final release location
+ * as well as any intermediate points since the last down or move event.
+ */
+ AMOTION_EVENT_ACTION_UP = 1,
+
+ /* A change has happened during a press gesture (between AMOTION_EVENT_ACTION_DOWN and
+ * AMOTION_EVENT_ACTION_UP). The motion contains the most recent point, as well as
+ * any intermediate points since the last down or move event.
+ */
+ AMOTION_EVENT_ACTION_MOVE = 2,
+
+ /* The current gesture has been aborted.
+ * You will not receive any more points in it. You should treat this as
+ * an up event, but not perform any action that you normally would.
+ */
+ AMOTION_EVENT_ACTION_CANCEL = 3,
+
+ /* A movement has happened outside of the normal bounds of the UI element.
+ * This does not provide a full gesture, but only the initial location of the movement/touch.
+ */
+ AMOTION_EVENT_ACTION_OUTSIDE = 4,
+
+ /* A non-primary pointer has gone down.
+ * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+ */
+ AMOTION_EVENT_ACTION_POINTER_DOWN = 5,
+
+ /* A non-primary pointer has gone up.
+ * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+ */
+ AMOTION_EVENT_ACTION_POINTER_UP = 6,
+
+ /* A change happened but the pointer is not down (unlike AMOTION_EVENT_ACTION_MOVE).
+ * The motion contains the most recent point, as well as any intermediate points since
+ * the last hover move event.
+ */
+ AMOTION_EVENT_ACTION_HOVER_MOVE = 7,
+
+ /* The motion event contains relative vertical and/or horizontal scroll offsets.
+ * Use getAxisValue to retrieve the information from AMOTION_EVENT_AXIS_VSCROLL
+ * and AMOTION_EVENT_AXIS_HSCROLL.
+ * The pointer may or may not be down when this event is dispatched.
+ * This action is always delivered to the winder under the pointer, which
+ * may not be the window currently touched.
+ */
+ AMOTION_EVENT_ACTION_SCROLL = 8,
+
+ /* The pointer is not down but has entered the boundaries of a window or view.
+ */
+ AMOTION_EVENT_ACTION_HOVER_ENTER = 9,
+
+ /* The pointer is not down but has exited the boundaries of a window or view.
+ */
+ AMOTION_EVENT_ACTION_HOVER_EXIT = 10,
+};
+
+/*
+ * Motion event flags.
+ */
+enum {
+ /* This flag indicates that the window that received this motion event is partly
+ * or wholly obscured by another visible window above it. This flag is set to true
+ * even if the event did not directly pass through the obscured area.
+ * A security sensitive application can check this flag to identify situations in which
+ * a malicious application may have covered up part of its content for the purpose
+ * of misleading the user or hijacking touches. An appropriate response might be
+ * to drop the suspect touches or to take additional precautions to confirm the user's
+ * actual intent.
+ */
+ AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED = 0x1,
+};
+
+/*
+ * Motion event edge touch flags.
+ */
+enum {
+ /* No edges intersected */
+ AMOTION_EVENT_EDGE_FLAG_NONE = 0,
+
+ /* Flag indicating the motion event intersected the top edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_TOP = 0x01,
+
+ /* Flag indicating the motion event intersected the bottom edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_BOTTOM = 0x02,
+
+ /* Flag indicating the motion event intersected the left edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_LEFT = 0x04,
+
+ /* Flag indicating the motion event intersected the right edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_RIGHT = 0x08
+};
+
+/*
+ * Constants that identify each individual axis of a motion event.
+ * Refer to the documentation on the MotionEvent class for descriptions of each axis.
+ */
+enum {
+ AMOTION_EVENT_AXIS_X = 0,
+ AMOTION_EVENT_AXIS_Y = 1,
+ AMOTION_EVENT_AXIS_PRESSURE = 2,
+ AMOTION_EVENT_AXIS_SIZE = 3,
+ AMOTION_EVENT_AXIS_TOUCH_MAJOR = 4,
+ AMOTION_EVENT_AXIS_TOUCH_MINOR = 5,
+ AMOTION_EVENT_AXIS_TOOL_MAJOR = 6,
+ AMOTION_EVENT_AXIS_TOOL_MINOR = 7,
+ AMOTION_EVENT_AXIS_ORIENTATION = 8,
+ AMOTION_EVENT_AXIS_VSCROLL = 9,
+ AMOTION_EVENT_AXIS_HSCROLL = 10,
+ AMOTION_EVENT_AXIS_Z = 11,
+ AMOTION_EVENT_AXIS_RX = 12,
+ AMOTION_EVENT_AXIS_RY = 13,
+ AMOTION_EVENT_AXIS_RZ = 14,
+ AMOTION_EVENT_AXIS_HAT_X = 15,
+ AMOTION_EVENT_AXIS_HAT_Y = 16,
+ AMOTION_EVENT_AXIS_LTRIGGER = 17,
+ AMOTION_EVENT_AXIS_RTRIGGER = 18,
+ AMOTION_EVENT_AXIS_THROTTLE = 19,
+ AMOTION_EVENT_AXIS_RUDDER = 20,
+ AMOTION_EVENT_AXIS_WHEEL = 21,
+ AMOTION_EVENT_AXIS_GAS = 22,
+ AMOTION_EVENT_AXIS_BRAKE = 23,
+ AMOTION_EVENT_AXIS_DISTANCE = 24,
+ AMOTION_EVENT_AXIS_TILT = 25,
+ AMOTION_EVENT_AXIS_GENERIC_1 = 32,
+ AMOTION_EVENT_AXIS_GENERIC_2 = 33,
+ AMOTION_EVENT_AXIS_GENERIC_3 = 34,
+ AMOTION_EVENT_AXIS_GENERIC_4 = 35,
+ AMOTION_EVENT_AXIS_GENERIC_5 = 36,
+ AMOTION_EVENT_AXIS_GENERIC_6 = 37,
+ AMOTION_EVENT_AXIS_GENERIC_7 = 38,
+ AMOTION_EVENT_AXIS_GENERIC_8 = 39,
+ AMOTION_EVENT_AXIS_GENERIC_9 = 40,
+ AMOTION_EVENT_AXIS_GENERIC_10 = 41,
+ AMOTION_EVENT_AXIS_GENERIC_11 = 42,
+ AMOTION_EVENT_AXIS_GENERIC_12 = 43,
+ AMOTION_EVENT_AXIS_GENERIC_13 = 44,
+ AMOTION_EVENT_AXIS_GENERIC_14 = 45,
+ AMOTION_EVENT_AXIS_GENERIC_15 = 46,
+ AMOTION_EVENT_AXIS_GENERIC_16 = 47,
+
+ // NOTE: If you add a new axis here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.
+};
+
+/*
+ * Constants that identify buttons that are associated with motion events.
+ * Refer to the documentation on the MotionEvent class for descriptions of each button.
+ */
+enum {
+ AMOTION_EVENT_BUTTON_PRIMARY = 1 << 0,
+ AMOTION_EVENT_BUTTON_SECONDARY = 1 << 1,
+ AMOTION_EVENT_BUTTON_TERTIARY = 1 << 2,
+ AMOTION_EVENT_BUTTON_BACK = 1 << 3,
+ AMOTION_EVENT_BUTTON_FORWARD = 1 << 4,
+};
+
+/*
+ * Constants that identify tool types.
+ * Refer to the documentation on the MotionEvent class for descriptions of each tool type.
+ */
+enum {
+ AMOTION_EVENT_TOOL_TYPE_UNKNOWN = 0,
+ AMOTION_EVENT_TOOL_TYPE_FINGER = 1,
+ AMOTION_EVENT_TOOL_TYPE_STYLUS = 2,
+ AMOTION_EVENT_TOOL_TYPE_MOUSE = 3,
+ AMOTION_EVENT_TOOL_TYPE_ERASER = 4,
+};
+
+/*
+ * Input sources.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ */
+enum {
+ AINPUT_SOURCE_CLASS_MASK = 0x000000ff,
+
+ AINPUT_SOURCE_CLASS_BUTTON = 0x00000001,
+ AINPUT_SOURCE_CLASS_POINTER = 0x00000002,
+ AINPUT_SOURCE_CLASS_NAVIGATION = 0x00000004,
+ AINPUT_SOURCE_CLASS_POSITION = 0x00000008,
+ AINPUT_SOURCE_CLASS_JOYSTICK = 0x00000010,
+};
+
+enum {
+ AINPUT_SOURCE_UNKNOWN = 0x00000000,
+
+ AINPUT_SOURCE_KEYBOARD = 0x00000100 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_DPAD = 0x00000200 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_GAMEPAD = 0x00000400 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_TOUCHSCREEN = 0x00001000 | AINPUT_SOURCE_CLASS_POINTER,
+ AINPUT_SOURCE_MOUSE = 0x00002000 | AINPUT_SOURCE_CLASS_POINTER,
+ AINPUT_SOURCE_STYLUS = 0x00004000 | AINPUT_SOURCE_CLASS_POINTER,
+ AINPUT_SOURCE_TRACKBALL = 0x00010000 | AINPUT_SOURCE_CLASS_NAVIGATION,
+ AINPUT_SOURCE_TOUCHPAD = 0x00100000 | AINPUT_SOURCE_CLASS_POSITION,
+ AINPUT_SOURCE_JOYSTICK = 0x01000000 | AINPUT_SOURCE_CLASS_JOYSTICK,
+
+ AINPUT_SOURCE_ANY = 0xffffff00,
+};
+
+/*
+ * Keyboard types.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details.
+ */
+enum {
+ AINPUT_KEYBOARD_TYPE_NONE = 0,
+ AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC = 1,
+ AINPUT_KEYBOARD_TYPE_ALPHABETIC = 2,
+};
+
+/*
+ * Constants used to retrieve information about the range of motion for a particular
+ * coordinate of a motion event.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ *
+ * DEPRECATION NOTICE: These constants are deprecated. Use AMOTION_EVENT_AXIS_* constants instead.
+ */
+enum {
+ AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X,
+ AINPUT_MOTION_RANGE_Y = AMOTION_EVENT_AXIS_Y,
+ AINPUT_MOTION_RANGE_PRESSURE = AMOTION_EVENT_AXIS_PRESSURE,
+ AINPUT_MOTION_RANGE_SIZE = AMOTION_EVENT_AXIS_SIZE,
+ AINPUT_MOTION_RANGE_TOUCH_MAJOR = AMOTION_EVENT_AXIS_TOUCH_MAJOR,
+ AINPUT_MOTION_RANGE_TOUCH_MINOR = AMOTION_EVENT_AXIS_TOUCH_MINOR,
+ AINPUT_MOTION_RANGE_TOOL_MAJOR = AMOTION_EVENT_AXIS_TOOL_MAJOR,
+ AINPUT_MOTION_RANGE_TOOL_MINOR = AMOTION_EVENT_AXIS_TOOL_MINOR,
+ AINPUT_MOTION_RANGE_ORIENTATION = AMOTION_EVENT_AXIS_ORIENTATION,
+} __attribute__ ((deprecated));
+
+
+/*
+ * Input event accessors.
+ *
+ * Note that most functions can only be used on input events that are of a given type.
+ * Calling these functions on input events of other types will yield undefined behavior.
+ */
+
+/*** Accessors for all input events. ***/
+
+/* Get the input event type. */
+int32_t AInputEvent_getType(const AInputEvent* event);
+
+/* Get the id for the device that an input event came from.
+ *
+ * Input events can be generated by multiple different input devices.
+ * Use the input device id to obtain information about the input
+ * device that was responsible for generating a particular event.
+ *
+ * An input device id of 0 indicates that the event didn't come from a physical device;
+ * other numbers are arbitrary and you shouldn't depend on the values.
+ * Use the provided input device query API to obtain information about input devices.
+ */
+int32_t AInputEvent_getDeviceId(const AInputEvent* event);
+
+/* Get the input event source. */
+int32_t AInputEvent_getSource(const AInputEvent* event);
+
+/*** Accessors for key events only. ***/
+
+/* Get the key event action. */
+int32_t AKeyEvent_getAction(const AInputEvent* key_event);
+
+/* Get the key event flags. */
+int32_t AKeyEvent_getFlags(const AInputEvent* key_event);
+
+/* Get the key code of the key event.
+ * This is the physical key that was pressed, not the Unicode character. */
+int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event);
+
+/* Get the hardware key id of this key event.
+ * These values are not reliable and vary from device to device. */
+int32_t AKeyEvent_getScanCode(const AInputEvent* key_event);
+
+/* Get the meta key state. */
+int32_t AKeyEvent_getMetaState(const AInputEvent* key_event);
+
+/* Get the repeat count of the event.
+ * For both key up an key down events, this is the number of times the key has
+ * repeated with the first down starting at 0 and counting up from there. For
+ * multiple key events, this is the number of down/up pairs that have occurred. */
+int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event);
+
+/* Get the time of the most recent key down event, in the
+ * java.lang.System.nanoTime() time base. If this is a down event,
+ * this will be the same as eventTime.
+ * Note that when chording keys, this value is the down time of the most recently
+ * pressed key, which may not be the same physical key of this event. */
+int64_t AKeyEvent_getDownTime(const AInputEvent* key_event);
+
+/* Get the time this event occurred, in the
+ * java.lang.System.nanoTime() time base. */
+int64_t AKeyEvent_getEventTime(const AInputEvent* key_event);
+
+/*** Accessors for motion events only. ***/
+
+/* Get the combined motion event action code and pointer index. */
+int32_t AMotionEvent_getAction(const AInputEvent* motion_event);
+
+/* Get the motion event flags. */
+int32_t AMotionEvent_getFlags(const AInputEvent* motion_event);
+
+/* Get the state of any meta / modifier keys that were in effect when the
+ * event was generated. */
+int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event);
+
+/* Get the button state of all buttons that are pressed. */
+int32_t AMotionEvent_getButtonState(const AInputEvent* motion_event);
+
+/* Get a bitfield indicating which edges, if any, were touched by this motion event.
+ * For touch events, clients can use this to determine if the user's finger was
+ * touching the edge of the display. */
+int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event);
+
+/* Get the time when the user originally pressed down to start a stream of
+ * position events, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event);
+
+/* Get the time when this specific event was generated,
+ * in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event);
+
+/* Get the X coordinate offset.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getXOffset(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the Y coordinates being reported.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getYOffset(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the X coordinates being reported.
+ * You can multiply this number with an X coordinate sample to find the
+ * actual hardware value of the X coordinate. */
+float AMotionEvent_getXPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the Y coordinates being reported.
+ * You can multiply this number with a Y coordinate sample to find the
+ * actual hardware value of the Y coordinate. */
+float AMotionEvent_getYPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the number of pointers of data contained in this event.
+ * Always >= 1. */
+size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event);
+
+/* Get the pointer identifier associated with a particular pointer
+ * data index in this event. The identifier tells you the actual pointer
+ * number associated with the data, accounting for individual pointers
+ * going up and down since the start of the current gesture. */
+int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the tool type of a pointer for the given pointer index.
+ * The tool type indicates the type of tool used to make contact such as a
+ * finger or stylus, if known. */
+int32_t AMotionEvent_getToolType(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current X coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current Y coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current pressure of this event for the given pointer index.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current scaled value of the approximate size for the given pointer index.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1. The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation. A positive angle
+ * indicates that the major axis of contact is oriented to the right. A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the value of the request axis for the given pointer index. */
+float AMotionEvent_getAxisValue(const AInputEvent* motion_event,
+ int32_t axis, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the number of historical points in this event. These are movements that
+ * have occurred between this event and the previous event. This only applies
+ * to AMOTION_EVENT_ACTION_MOVE events -- all other actions will have a size of 0.
+ * Historical samples are indexed from oldest to newest. */
+size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event);
+
+/* Get the time that a historical movement occurred between this event and
+ * the previous event, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getHistoricalEventTime(const AInputEvent* motion_event,
+ size_t history_index);
+
+/* Get the historical raw X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical raw Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical pressure of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the current scaled value of the approximate size for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1. The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation. A positive angle
+ * indicates that the major axis of contact is oriented to the right. A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index) __NDK_FPABI__;
+
+/* Get the historical value of the request axis for the given pointer index
+ * that occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
+ int32_t axis, size_t pointer_index, size_t history_index) __NDK_FPABI__;
+
+
+/*
+ * Input queue
+ *
+ * An input queue is the facility through which you retrieve input
+ * events.
+ */
+struct AInputQueue;
+typedef struct AInputQueue AInputQueue;
+
+/*
+ * Add this input queue to a looper for processing. See
+ * ALooper_addFd() for information on the ident, callback, and data params.
+ */
+void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
+ int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Remove the input queue from the looper it is currently attached to.
+ */
+void AInputQueue_detachLooper(AInputQueue* queue);
+
+/*
+ * Returns true if there are one or more events available in the
+ * input queue. Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int32_t AInputQueue_hasEvents(AInputQueue* queue);
+
+/*
+ * Returns the next available event from the queue. Returns a negative
+ * value if no events are available or an error has occurred.
+ */
+int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent);
+
+/*
+ * Sends the key for standard pre-dispatching -- that is, possibly deliver
+ * it to the current IME to be consumed before the app. Returns 0 if it
+ * was not pre-dispatched, meaning you can process it right now. If non-zero
+ * is returned, you must abandon the current event processing and allow the
+ * event to appear again in the event queue (if it does not get consumed during
+ * pre-dispatching).
+ */
+int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event);
+
+/*
+ * Report that dispatching has finished with the given event.
+ * This must be called after receiving an event with AInputQueue_get_event().
+ */
+void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_INPUT_H
diff --git a/ndk/platforms/android-14/include/android/keycodes.h b/ndk/platforms/android-14/include/android/keycodes.h
new file mode 100644
index 0000000..5d49775
--- /dev/null
+++ b/ndk/platforms/android-14/include/android/keycodes.h
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+ AKEYCODE_UNKNOWN = 0,
+ AKEYCODE_SOFT_LEFT = 1,
+ AKEYCODE_SOFT_RIGHT = 2,
+ AKEYCODE_HOME = 3,
+ AKEYCODE_BACK = 4,
+ AKEYCODE_CALL = 5,
+ AKEYCODE_ENDCALL = 6,
+ AKEYCODE_0 = 7,
+ AKEYCODE_1 = 8,
+ AKEYCODE_2 = 9,
+ AKEYCODE_3 = 10,
+ AKEYCODE_4 = 11,
+ AKEYCODE_5 = 12,
+ AKEYCODE_6 = 13,
+ AKEYCODE_7 = 14,
+ AKEYCODE_8 = 15,
+ AKEYCODE_9 = 16,
+ AKEYCODE_STAR = 17,
+ AKEYCODE_POUND = 18,
+ AKEYCODE_DPAD_UP = 19,
+ AKEYCODE_DPAD_DOWN = 20,
+ AKEYCODE_DPAD_LEFT = 21,
+ AKEYCODE_DPAD_RIGHT = 22,
+ AKEYCODE_DPAD_CENTER = 23,
+ AKEYCODE_VOLUME_UP = 24,
+ AKEYCODE_VOLUME_DOWN = 25,
+ AKEYCODE_POWER = 26,
+ AKEYCODE_CAMERA = 27,
+ AKEYCODE_CLEAR = 28,
+ AKEYCODE_A = 29,
+ AKEYCODE_B = 30,
+ AKEYCODE_C = 31,
+ AKEYCODE_D = 32,
+ AKEYCODE_E = 33,
+ AKEYCODE_F = 34,
+ AKEYCODE_G = 35,
+ AKEYCODE_H = 36,
+ AKEYCODE_I = 37,
+ AKEYCODE_J = 38,
+ AKEYCODE_K = 39,
+ AKEYCODE_L = 40,
+ AKEYCODE_M = 41,
+ AKEYCODE_N = 42,
+ AKEYCODE_O = 43,
+ AKEYCODE_P = 44,
+ AKEYCODE_Q = 45,
+ AKEYCODE_R = 46,
+ AKEYCODE_S = 47,
+ AKEYCODE_T = 48,
+ AKEYCODE_U = 49,
+ AKEYCODE_V = 50,
+ AKEYCODE_W = 51,
+ AKEYCODE_X = 52,
+ AKEYCODE_Y = 53,
+ AKEYCODE_Z = 54,
+ AKEYCODE_COMMA = 55,
+ AKEYCODE_PERIOD = 56,
+ AKEYCODE_ALT_LEFT = 57,
+ AKEYCODE_ALT_RIGHT = 58,
+ AKEYCODE_SHIFT_LEFT = 59,
+ AKEYCODE_SHIFT_RIGHT = 60,
+ AKEYCODE_TAB = 61,
+ AKEYCODE_SPACE = 62,
+ AKEYCODE_SYM = 63,
+ AKEYCODE_EXPLORER = 64,
+ AKEYCODE_ENVELOPE = 65,
+ AKEYCODE_ENTER = 66,
+ AKEYCODE_DEL = 67,
+ AKEYCODE_GRAVE = 68,
+ AKEYCODE_MINUS = 69,
+ AKEYCODE_EQUALS = 70,
+ AKEYCODE_LEFT_BRACKET = 71,
+ AKEYCODE_RIGHT_BRACKET = 72,
+ AKEYCODE_BACKSLASH = 73,
+ AKEYCODE_SEMICOLON = 74,
+ AKEYCODE_APOSTROPHE = 75,
+ AKEYCODE_SLASH = 76,
+ AKEYCODE_AT = 77,
+ AKEYCODE_NUM = 78,
+ AKEYCODE_HEADSETHOOK = 79,
+ AKEYCODE_FOCUS = 80, // *Camera* focus
+ AKEYCODE_PLUS = 81,
+ AKEYCODE_MENU = 82,
+ AKEYCODE_NOTIFICATION = 83,
+ AKEYCODE_SEARCH = 84,
+ AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+ AKEYCODE_MEDIA_STOP = 86,
+ AKEYCODE_MEDIA_NEXT = 87,
+ AKEYCODE_MEDIA_PREVIOUS = 88,
+ AKEYCODE_MEDIA_REWIND = 89,
+ AKEYCODE_MEDIA_FAST_FORWARD = 90,
+ AKEYCODE_MUTE = 91,
+ AKEYCODE_PAGE_UP = 92,
+ AKEYCODE_PAGE_DOWN = 93,
+ AKEYCODE_PICTSYMBOLS = 94,
+ AKEYCODE_SWITCH_CHARSET = 95,
+ AKEYCODE_BUTTON_A = 96,
+ AKEYCODE_BUTTON_B = 97,
+ AKEYCODE_BUTTON_C = 98,
+ AKEYCODE_BUTTON_X = 99,
+ AKEYCODE_BUTTON_Y = 100,
+ AKEYCODE_BUTTON_Z = 101,
+ AKEYCODE_BUTTON_L1 = 102,
+ AKEYCODE_BUTTON_R1 = 103,
+ AKEYCODE_BUTTON_L2 = 104,
+ AKEYCODE_BUTTON_R2 = 105,
+ AKEYCODE_BUTTON_THUMBL = 106,
+ AKEYCODE_BUTTON_THUMBR = 107,
+ AKEYCODE_BUTTON_START = 108,
+ AKEYCODE_BUTTON_SELECT = 109,
+ AKEYCODE_BUTTON_MODE = 110,
+ AKEYCODE_ESCAPE = 111,
+ AKEYCODE_FORWARD_DEL = 112,
+ AKEYCODE_CTRL_LEFT = 113,
+ AKEYCODE_CTRL_RIGHT = 114,
+ AKEYCODE_CAPS_LOCK = 115,
+ AKEYCODE_SCROLL_LOCK = 116,
+ AKEYCODE_META_LEFT = 117,
+ AKEYCODE_META_RIGHT = 118,
+ AKEYCODE_FUNCTION = 119,
+ AKEYCODE_SYSRQ = 120,
+ AKEYCODE_BREAK = 121,
+ AKEYCODE_MOVE_HOME = 122,
+ AKEYCODE_MOVE_END = 123,
+ AKEYCODE_INSERT = 124,
+ AKEYCODE_FORWARD = 125,
+ AKEYCODE_MEDIA_PLAY = 126,
+ AKEYCODE_MEDIA_PAUSE = 127,
+ AKEYCODE_MEDIA_CLOSE = 128,
+ AKEYCODE_MEDIA_EJECT = 129,
+ AKEYCODE_MEDIA_RECORD = 130,
+ AKEYCODE_F1 = 131,
+ AKEYCODE_F2 = 132,
+ AKEYCODE_F3 = 133,
+ AKEYCODE_F4 = 134,
+ AKEYCODE_F5 = 135,
+ AKEYCODE_F6 = 136,
+ AKEYCODE_F7 = 137,
+ AKEYCODE_F8 = 138,
+ AKEYCODE_F9 = 139,
+ AKEYCODE_F10 = 140,
+ AKEYCODE_F11 = 141,
+ AKEYCODE_F12 = 142,
+ AKEYCODE_NUM_LOCK = 143,
+ AKEYCODE_NUMPAD_0 = 144,
+ AKEYCODE_NUMPAD_1 = 145,
+ AKEYCODE_NUMPAD_2 = 146,
+ AKEYCODE_NUMPAD_3 = 147,
+ AKEYCODE_NUMPAD_4 = 148,
+ AKEYCODE_NUMPAD_5 = 149,
+ AKEYCODE_NUMPAD_6 = 150,
+ AKEYCODE_NUMPAD_7 = 151,
+ AKEYCODE_NUMPAD_8 = 152,
+ AKEYCODE_NUMPAD_9 = 153,
+ AKEYCODE_NUMPAD_DIVIDE = 154,
+ AKEYCODE_NUMPAD_MULTIPLY = 155,
+ AKEYCODE_NUMPAD_SUBTRACT = 156,
+ AKEYCODE_NUMPAD_ADD = 157,
+ AKEYCODE_NUMPAD_DOT = 158,
+ AKEYCODE_NUMPAD_COMMA = 159,
+ AKEYCODE_NUMPAD_ENTER = 160,
+ AKEYCODE_NUMPAD_EQUALS = 161,
+ AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+ AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+ AKEYCODE_VOLUME_MUTE = 164,
+ AKEYCODE_INFO = 165,
+ AKEYCODE_CHANNEL_UP = 166,
+ AKEYCODE_CHANNEL_DOWN = 167,
+ AKEYCODE_ZOOM_IN = 168,
+ AKEYCODE_ZOOM_OUT = 169,
+ AKEYCODE_TV = 170,
+ AKEYCODE_WINDOW = 171,
+ AKEYCODE_GUIDE = 172,
+ AKEYCODE_DVR = 173,
+ AKEYCODE_BOOKMARK = 174,
+ AKEYCODE_CAPTIONS = 175,
+ AKEYCODE_SETTINGS = 176,
+ AKEYCODE_TV_POWER = 177,
+ AKEYCODE_TV_INPUT = 178,
+ AKEYCODE_STB_POWER = 179,
+ AKEYCODE_STB_INPUT = 180,
+ AKEYCODE_AVR_POWER = 181,
+ AKEYCODE_AVR_INPUT = 182,
+ AKEYCODE_PROG_RED = 183,
+ AKEYCODE_PROG_GREEN = 184,
+ AKEYCODE_PROG_YELLOW = 185,
+ AKEYCODE_PROG_BLUE = 186,
+ AKEYCODE_APP_SWITCH = 187,
+ AKEYCODE_BUTTON_1 = 188,
+ AKEYCODE_BUTTON_2 = 189,
+ AKEYCODE_BUTTON_3 = 190,
+ AKEYCODE_BUTTON_4 = 191,
+ AKEYCODE_BUTTON_5 = 192,
+ AKEYCODE_BUTTON_6 = 193,
+ AKEYCODE_BUTTON_7 = 194,
+ AKEYCODE_BUTTON_8 = 195,
+ AKEYCODE_BUTTON_9 = 196,
+ AKEYCODE_BUTTON_10 = 197,
+ AKEYCODE_BUTTON_11 = 198,
+ AKEYCODE_BUTTON_12 = 199,
+ AKEYCODE_BUTTON_13 = 200,
+ AKEYCODE_BUTTON_14 = 201,
+ AKEYCODE_BUTTON_15 = 202,
+ AKEYCODE_BUTTON_16 = 203,
+ AKEYCODE_LANGUAGE_SWITCH = 204,
+ AKEYCODE_MANNER_MODE = 205,
+ AKEYCODE_3D_MODE = 206,
+
+ // NOTE: If you add a new keycode here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-14/include/android/native_window.h b/ndk/platforms/android-14/include/android/native_window.h
new file mode 100644
index 0000000..2f4f2d3
--- /dev/null
+++ b/ndk/platforms/android-14/include/android/native_window.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef ANDROID_NATIVE_WINDOW_H
+#define ANDROID_NATIVE_WINDOW_H
+
+#include <android/rect.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Pixel formats that a window can use.
+ */
+enum {
+ WINDOW_FORMAT_RGBA_8888 = 1,
+ WINDOW_FORMAT_RGBX_8888 = 2,
+ WINDOW_FORMAT_RGB_565 = 4,
+};
+
+struct ANativeWindow;
+typedef struct ANativeWindow ANativeWindow;
+
+typedef struct ANativeWindow_Buffer {
+ // The number of pixels that are show horizontally.
+ int32_t width;
+
+ // The number of pixels that are shown vertically.
+ int32_t height;
+
+ // The number of *pixels* that a line in the buffer takes in
+ // memory. This may be >= width.
+ int32_t stride;
+
+ // The format of the buffer. One of WINDOW_FORMAT_*
+ int32_t format;
+
+ // The actual bits.
+ void* bits;
+
+ // Do not touch.
+ uint32_t reserved[6];
+} ANativeWindow_Buffer;
+
+/**
+ * Acquire a reference on the given ANativeWindow object. This prevents the object
+ * from being deleted until the reference is removed.
+ */
+void ANativeWindow_acquire(ANativeWindow* window);
+
+/**
+ * Remove a reference that was previously acquired with ANativeWindow_acquire().
+ */
+void ANativeWindow_release(ANativeWindow* window);
+
+/*
+ * Return the current width in pixels of the window surface. Returns a
+ * negative value on error.
+ */
+int32_t ANativeWindow_getWidth(ANativeWindow* window);
+
+/*
+ * Return the current height in pixels of the window surface. Returns a
+ * negative value on error.
+ */
+int32_t ANativeWindow_getHeight(ANativeWindow* window);
+
+/*
+ * Return the current pixel format of the window surface. Returns a
+ * negative value on error.
+ */
+int32_t ANativeWindow_getFormat(ANativeWindow* window);
+
+/*
+ * Change the format and size of the window buffers.
+ *
+ * The width and height control the number of pixels in the buffers, not the
+ * dimensions of the window on screen. If these are different than the
+ * window's physical size, then it buffer will be scaled to match that size
+ * when compositing it to the screen.
+ *
+ * For all of these parameters, if 0 is supplied then the window's base
+ * value will come back in force.
+ *
+ * width and height must be either both zero or both non-zero.
+ *
+ */
+int32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window,
+ int32_t width, int32_t height, int32_t format);
+
+/**
+ * Lock the window's next drawing surface for writing.
+ * inOutDirtyBounds is used as an in/out parameter, upon entering the
+ * function, it contains the dirty region, that is, the region the caller
+ * intends to redraw. When the function returns, inOutDirtyBounds is updated
+ * with the actual area the caller needs to redraw -- this region is often
+ * extended by ANativeWindow_lock.
+ */
+int32_t ANativeWindow_lock(ANativeWindow* window, ANativeWindow_Buffer* outBuffer,
+ ARect* inOutDirtyBounds);
+
+/**
+ * Unlock the window's drawing surface after previously locking it,
+ * posting the new buffer to the display.
+ */
+int32_t ANativeWindow_unlockAndPost(ANativeWindow* window);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_WINDOW_H
diff --git a/ndk/platforms/android-14/include/android/rect.h b/ndk/platforms/android-14/include/android/rect.h
new file mode 100644
index 0000000..64d487d
--- /dev/null
+++ b/ndk/platforms/android-14/include/android/rect.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+
+#ifndef ANDROID_RECT_H
+#define ANDROID_RECT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ARect {
+#ifdef __cplusplus
+ typedef int32_t value_type;
+#endif
+ int32_t left;
+ int32_t top;
+ int32_t right;
+ int32_t bottom;
+} ARect;
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_RECT_H
diff --git a/ndk/platforms/android-15/include/android/keycodes.h b/ndk/platforms/android-15/include/android/keycodes.h
new file mode 100644
index 0000000..8414ff6
--- /dev/null
+++ b/ndk/platforms/android-15/include/android/keycodes.h
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+ AKEYCODE_UNKNOWN = 0,
+ AKEYCODE_SOFT_LEFT = 1,
+ AKEYCODE_SOFT_RIGHT = 2,
+ AKEYCODE_HOME = 3,
+ AKEYCODE_BACK = 4,
+ AKEYCODE_CALL = 5,
+ AKEYCODE_ENDCALL = 6,
+ AKEYCODE_0 = 7,
+ AKEYCODE_1 = 8,
+ AKEYCODE_2 = 9,
+ AKEYCODE_3 = 10,
+ AKEYCODE_4 = 11,
+ AKEYCODE_5 = 12,
+ AKEYCODE_6 = 13,
+ AKEYCODE_7 = 14,
+ AKEYCODE_8 = 15,
+ AKEYCODE_9 = 16,
+ AKEYCODE_STAR = 17,
+ AKEYCODE_POUND = 18,
+ AKEYCODE_DPAD_UP = 19,
+ AKEYCODE_DPAD_DOWN = 20,
+ AKEYCODE_DPAD_LEFT = 21,
+ AKEYCODE_DPAD_RIGHT = 22,
+ AKEYCODE_DPAD_CENTER = 23,
+ AKEYCODE_VOLUME_UP = 24,
+ AKEYCODE_VOLUME_DOWN = 25,
+ AKEYCODE_POWER = 26,
+ AKEYCODE_CAMERA = 27,
+ AKEYCODE_CLEAR = 28,
+ AKEYCODE_A = 29,
+ AKEYCODE_B = 30,
+ AKEYCODE_C = 31,
+ AKEYCODE_D = 32,
+ AKEYCODE_E = 33,
+ AKEYCODE_F = 34,
+ AKEYCODE_G = 35,
+ AKEYCODE_H = 36,
+ AKEYCODE_I = 37,
+ AKEYCODE_J = 38,
+ AKEYCODE_K = 39,
+ AKEYCODE_L = 40,
+ AKEYCODE_M = 41,
+ AKEYCODE_N = 42,
+ AKEYCODE_O = 43,
+ AKEYCODE_P = 44,
+ AKEYCODE_Q = 45,
+ AKEYCODE_R = 46,
+ AKEYCODE_S = 47,
+ AKEYCODE_T = 48,
+ AKEYCODE_U = 49,
+ AKEYCODE_V = 50,
+ AKEYCODE_W = 51,
+ AKEYCODE_X = 52,
+ AKEYCODE_Y = 53,
+ AKEYCODE_Z = 54,
+ AKEYCODE_COMMA = 55,
+ AKEYCODE_PERIOD = 56,
+ AKEYCODE_ALT_LEFT = 57,
+ AKEYCODE_ALT_RIGHT = 58,
+ AKEYCODE_SHIFT_LEFT = 59,
+ AKEYCODE_SHIFT_RIGHT = 60,
+ AKEYCODE_TAB = 61,
+ AKEYCODE_SPACE = 62,
+ AKEYCODE_SYM = 63,
+ AKEYCODE_EXPLORER = 64,
+ AKEYCODE_ENVELOPE = 65,
+ AKEYCODE_ENTER = 66,
+ AKEYCODE_DEL = 67,
+ AKEYCODE_GRAVE = 68,
+ AKEYCODE_MINUS = 69,
+ AKEYCODE_EQUALS = 70,
+ AKEYCODE_LEFT_BRACKET = 71,
+ AKEYCODE_RIGHT_BRACKET = 72,
+ AKEYCODE_BACKSLASH = 73,
+ AKEYCODE_SEMICOLON = 74,
+ AKEYCODE_APOSTROPHE = 75,
+ AKEYCODE_SLASH = 76,
+ AKEYCODE_AT = 77,
+ AKEYCODE_NUM = 78,
+ AKEYCODE_HEADSETHOOK = 79,
+ AKEYCODE_FOCUS = 80, // *Camera* focus
+ AKEYCODE_PLUS = 81,
+ AKEYCODE_MENU = 82,
+ AKEYCODE_NOTIFICATION = 83,
+ AKEYCODE_SEARCH = 84,
+ AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+ AKEYCODE_MEDIA_STOP = 86,
+ AKEYCODE_MEDIA_NEXT = 87,
+ AKEYCODE_MEDIA_PREVIOUS = 88,
+ AKEYCODE_MEDIA_REWIND = 89,
+ AKEYCODE_MEDIA_FAST_FORWARD = 90,
+ AKEYCODE_MUTE = 91,
+ AKEYCODE_PAGE_UP = 92,
+ AKEYCODE_PAGE_DOWN = 93,
+ AKEYCODE_PICTSYMBOLS = 94,
+ AKEYCODE_SWITCH_CHARSET = 95,
+ AKEYCODE_BUTTON_A = 96,
+ AKEYCODE_BUTTON_B = 97,
+ AKEYCODE_BUTTON_C = 98,
+ AKEYCODE_BUTTON_X = 99,
+ AKEYCODE_BUTTON_Y = 100,
+ AKEYCODE_BUTTON_Z = 101,
+ AKEYCODE_BUTTON_L1 = 102,
+ AKEYCODE_BUTTON_R1 = 103,
+ AKEYCODE_BUTTON_L2 = 104,
+ AKEYCODE_BUTTON_R2 = 105,
+ AKEYCODE_BUTTON_THUMBL = 106,
+ AKEYCODE_BUTTON_THUMBR = 107,
+ AKEYCODE_BUTTON_START = 108,
+ AKEYCODE_BUTTON_SELECT = 109,
+ AKEYCODE_BUTTON_MODE = 110,
+ AKEYCODE_ESCAPE = 111,
+ AKEYCODE_FORWARD_DEL = 112,
+ AKEYCODE_CTRL_LEFT = 113,
+ AKEYCODE_CTRL_RIGHT = 114,
+ AKEYCODE_CAPS_LOCK = 115,
+ AKEYCODE_SCROLL_LOCK = 116,
+ AKEYCODE_META_LEFT = 117,
+ AKEYCODE_META_RIGHT = 118,
+ AKEYCODE_FUNCTION = 119,
+ AKEYCODE_SYSRQ = 120,
+ AKEYCODE_BREAK = 121,
+ AKEYCODE_MOVE_HOME = 122,
+ AKEYCODE_MOVE_END = 123,
+ AKEYCODE_INSERT = 124,
+ AKEYCODE_FORWARD = 125,
+ AKEYCODE_MEDIA_PLAY = 126,
+ AKEYCODE_MEDIA_PAUSE = 127,
+ AKEYCODE_MEDIA_CLOSE = 128,
+ AKEYCODE_MEDIA_EJECT = 129,
+ AKEYCODE_MEDIA_RECORD = 130,
+ AKEYCODE_F1 = 131,
+ AKEYCODE_F2 = 132,
+ AKEYCODE_F3 = 133,
+ AKEYCODE_F4 = 134,
+ AKEYCODE_F5 = 135,
+ AKEYCODE_F6 = 136,
+ AKEYCODE_F7 = 137,
+ AKEYCODE_F8 = 138,
+ AKEYCODE_F9 = 139,
+ AKEYCODE_F10 = 140,
+ AKEYCODE_F11 = 141,
+ AKEYCODE_F12 = 142,
+ AKEYCODE_NUM_LOCK = 143,
+ AKEYCODE_NUMPAD_0 = 144,
+ AKEYCODE_NUMPAD_1 = 145,
+ AKEYCODE_NUMPAD_2 = 146,
+ AKEYCODE_NUMPAD_3 = 147,
+ AKEYCODE_NUMPAD_4 = 148,
+ AKEYCODE_NUMPAD_5 = 149,
+ AKEYCODE_NUMPAD_6 = 150,
+ AKEYCODE_NUMPAD_7 = 151,
+ AKEYCODE_NUMPAD_8 = 152,
+ AKEYCODE_NUMPAD_9 = 153,
+ AKEYCODE_NUMPAD_DIVIDE = 154,
+ AKEYCODE_NUMPAD_MULTIPLY = 155,
+ AKEYCODE_NUMPAD_SUBTRACT = 156,
+ AKEYCODE_NUMPAD_ADD = 157,
+ AKEYCODE_NUMPAD_DOT = 158,
+ AKEYCODE_NUMPAD_COMMA = 159,
+ AKEYCODE_NUMPAD_ENTER = 160,
+ AKEYCODE_NUMPAD_EQUALS = 161,
+ AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+ AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+ AKEYCODE_VOLUME_MUTE = 164,
+ AKEYCODE_INFO = 165,
+ AKEYCODE_CHANNEL_UP = 166,
+ AKEYCODE_CHANNEL_DOWN = 167,
+ AKEYCODE_ZOOM_IN = 168,
+ AKEYCODE_ZOOM_OUT = 169,
+ AKEYCODE_TV = 170,
+ AKEYCODE_WINDOW = 171,
+ AKEYCODE_GUIDE = 172,
+ AKEYCODE_DVR = 173,
+ AKEYCODE_BOOKMARK = 174,
+ AKEYCODE_CAPTIONS = 175,
+ AKEYCODE_SETTINGS = 176,
+ AKEYCODE_TV_POWER = 177,
+ AKEYCODE_TV_INPUT = 178,
+ AKEYCODE_STB_POWER = 179,
+ AKEYCODE_STB_INPUT = 180,
+ AKEYCODE_AVR_POWER = 181,
+ AKEYCODE_AVR_INPUT = 182,
+ AKEYCODE_PROG_RED = 183,
+ AKEYCODE_PROG_GREEN = 184,
+ AKEYCODE_PROG_YELLOW = 185,
+ AKEYCODE_PROG_BLUE = 186,
+ AKEYCODE_APP_SWITCH = 187,
+ AKEYCODE_BUTTON_1 = 188,
+ AKEYCODE_BUTTON_2 = 189,
+ AKEYCODE_BUTTON_3 = 190,
+ AKEYCODE_BUTTON_4 = 191,
+ AKEYCODE_BUTTON_5 = 192,
+ AKEYCODE_BUTTON_6 = 193,
+ AKEYCODE_BUTTON_7 = 194,
+ AKEYCODE_BUTTON_8 = 195,
+ AKEYCODE_BUTTON_9 = 196,
+ AKEYCODE_BUTTON_10 = 197,
+ AKEYCODE_BUTTON_11 = 198,
+ AKEYCODE_BUTTON_12 = 199,
+ AKEYCODE_BUTTON_13 = 200,
+ AKEYCODE_BUTTON_14 = 201,
+ AKEYCODE_BUTTON_15 = 202,
+ AKEYCODE_BUTTON_16 = 203,
+ AKEYCODE_LANGUAGE_SWITCH = 204,
+ AKEYCODE_MANNER_MODE = 205,
+ AKEYCODE_3D_MODE = 206,
+ AKEYCODE_CONTACTS = 207,
+ AKEYCODE_CALENDAR = 208,
+ AKEYCODE_MUSIC = 209,
+ AKEYCODE_CALCULATOR = 210,
+
+ // NOTE: If you add a new keycode here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..845515a
--- /dev/null
+++ b/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.functions.txt
@@ -0,0 +1,171 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.variables.txt b/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..845515a
--- /dev/null
+++ b/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.functions.txt
@@ -0,0 +1,171 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.variables.txt b/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..845515a
--- /dev/null
+++ b/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.functions.txt
@@ -0,0 +1,171 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.variables.txt b/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-16/include/android/configuration.h b/ndk/platforms/android-16/include/android/configuration.h
new file mode 100644
index 0000000..06cd3da
--- /dev/null
+++ b/ndk/platforms/android-16/include/android/configuration.h
@@ -0,0 +1,364 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef ANDROID_CONFIGURATION_H
+#define ANDROID_CONFIGURATION_H
+
+#include <android/asset_manager.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AConfiguration;
+typedef struct AConfiguration AConfiguration;
+
+enum {
+ ACONFIGURATION_ORIENTATION_ANY = 0x0000,
+ ACONFIGURATION_ORIENTATION_PORT = 0x0001,
+ ACONFIGURATION_ORIENTATION_LAND = 0x0002,
+ ACONFIGURATION_ORIENTATION_SQUARE = 0x0003,
+
+ ACONFIGURATION_TOUCHSCREEN_ANY = 0x0000,
+ ACONFIGURATION_TOUCHSCREEN_NOTOUCH = 0x0001,
+ ACONFIGURATION_TOUCHSCREEN_STYLUS = 0x0002,
+ ACONFIGURATION_TOUCHSCREEN_FINGER = 0x0003,
+
+ ACONFIGURATION_DENSITY_DEFAULT = 0,
+ ACONFIGURATION_DENSITY_LOW = 120,
+ ACONFIGURATION_DENSITY_MEDIUM = 160,
+ ACONFIGURATION_DENSITY_TV = 213,
+ ACONFIGURATION_DENSITY_HIGH = 240,
+ ACONFIGURATION_DENSITY_XHIGH = 320,
+ ACONFIGURATION_DENSITY_XXHIGH = 480,
+ ACONFIGURATION_DENSITY_NONE = 0xffff,
+
+ ACONFIGURATION_KEYBOARD_ANY = 0x0000,
+ ACONFIGURATION_KEYBOARD_NOKEYS = 0x0001,
+ ACONFIGURATION_KEYBOARD_QWERTY = 0x0002,
+ ACONFIGURATION_KEYBOARD_12KEY = 0x0003,
+
+ ACONFIGURATION_NAVIGATION_ANY = 0x0000,
+ ACONFIGURATION_NAVIGATION_NONAV = 0x0001,
+ ACONFIGURATION_NAVIGATION_DPAD = 0x0002,
+ ACONFIGURATION_NAVIGATION_TRACKBALL = 0x0003,
+ ACONFIGURATION_NAVIGATION_WHEEL = 0x0004,
+
+ ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000,
+ ACONFIGURATION_KEYSHIDDEN_NO = 0x0001,
+ ACONFIGURATION_KEYSHIDDEN_YES = 0x0002,
+ ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003,
+
+ ACONFIGURATION_NAVHIDDEN_ANY = 0x0000,
+ ACONFIGURATION_NAVHIDDEN_NO = 0x0001,
+ ACONFIGURATION_NAVHIDDEN_YES = 0x0002,
+
+ ACONFIGURATION_SCREENSIZE_ANY = 0x00,
+ ACONFIGURATION_SCREENSIZE_SMALL = 0x01,
+ ACONFIGURATION_SCREENSIZE_NORMAL = 0x02,
+ ACONFIGURATION_SCREENSIZE_LARGE = 0x03,
+ ACONFIGURATION_SCREENSIZE_XLARGE = 0x04,
+
+ ACONFIGURATION_SCREENLONG_ANY = 0x00,
+ ACONFIGURATION_SCREENLONG_NO = 0x1,
+ ACONFIGURATION_SCREENLONG_YES = 0x2,
+
+ ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00,
+ ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
+ ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
+ ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+ ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
+ ACONFIGURATION_UI_MODE_TYPE_APPLIANCE = 0x05,
+
+ ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
+ ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
+ ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
+
+ ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+ ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+ ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+ ACONFIGURATION_MCC = 0x0001,
+ ACONFIGURATION_MNC = 0x0002,
+ ACONFIGURATION_LOCALE = 0x0004,
+ ACONFIGURATION_TOUCHSCREEN = 0x0008,
+ ACONFIGURATION_KEYBOARD = 0x0010,
+ ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020,
+ ACONFIGURATION_NAVIGATION = 0x0040,
+ ACONFIGURATION_ORIENTATION = 0x0080,
+ ACONFIGURATION_DENSITY = 0x0100,
+ ACONFIGURATION_SCREEN_SIZE = 0x0200,
+ ACONFIGURATION_VERSION = 0x0400,
+ ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
+ ACONFIGURATION_UI_MODE = 0x1000,
+ ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
+};
+
+/**
+ * Create a new AConfiguration, initialized with no values set.
+ */
+AConfiguration* AConfiguration_new();
+
+/**
+ * Free an AConfiguration that was previously created with
+ * AConfiguration_new().
+ */
+void AConfiguration_delete(AConfiguration* config);
+
+/**
+ * Create and return a new AConfiguration based on the current configuration in
+ * use in the given AssetManager.
+ */
+void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am);
+
+/**
+ * Copy the contents of 'src' to 'dest'.
+ */
+void AConfiguration_copy(AConfiguration* dest, AConfiguration* src);
+
+/**
+ * Return the current MCC set in the configuration. 0 if not set.
+ */
+int32_t AConfiguration_getMcc(AConfiguration* config);
+
+/**
+ * Set the current MCC in the configuration. 0 to clear.
+ */
+void AConfiguration_setMcc(AConfiguration* config, int32_t mcc);
+
+/**
+ * Return the current MNC set in the configuration. 0 if not set.
+ */
+int32_t AConfiguration_getMnc(AConfiguration* config);
+
+/**
+ * Set the current MNC in the configuration. 0 to clear.
+ */
+void AConfiguration_setMnc(AConfiguration* config, int32_t mnc);
+
+/**
+ * Return the current language code set in the configuration. The output will
+ * be filled with an array of two characters. They are not 0-terminated. If
+ * a language is not set, they will be 0.
+ */
+void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage);
+
+/**
+ * Set the current language code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setLanguage(AConfiguration* config, const char* language);
+
+/**
+ * Return the current country code set in the configuration. The output will
+ * be filled with an array of two characters. They are not 0-terminated. If
+ * a country is not set, they will be 0.
+ */
+void AConfiguration_getCountry(AConfiguration* config, char* outCountry);
+
+/**
+ * Set the current country code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setCountry(AConfiguration* config, const char* country);
+
+/**
+ * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
+ */
+int32_t AConfiguration_getOrientation(AConfiguration* config);
+
+/**
+ * Set the current orientation in the configuration.
+ */
+void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation);
+
+/**
+ * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
+ */
+int32_t AConfiguration_getTouchscreen(AConfiguration* config);
+
+/**
+ * Set the current touchscreen in the configuration.
+ */
+void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen);
+
+/**
+ * Return the current ACONFIGURATION_DENSITY_* set in the configuration.
+ */
+int32_t AConfiguration_getDensity(AConfiguration* config);
+
+/**
+ * Set the current density in the configuration.
+ */
+void AConfiguration_setDensity(AConfiguration* config, int32_t density);
+
+/**
+ * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
+ */
+int32_t AConfiguration_getKeyboard(AConfiguration* config);
+
+/**
+ * Set the current keyboard in the configuration.
+ */
+void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard);
+
+/**
+ * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
+ */
+int32_t AConfiguration_getNavigation(AConfiguration* config);
+
+/**
+ * Set the current navigation in the configuration.
+ */
+void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation);
+
+/**
+ * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getKeysHidden(AConfiguration* config);
+
+/**
+ * Set the current keys hidden in the configuration.
+ */
+void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden);
+
+/**
+ * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getNavHidden(AConfiguration* config);
+
+/**
+ * Set the current nav hidden in the configuration.
+ */
+void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden);
+
+/**
+ * Return the current SDK (API) version set in the configuration.
+ */
+int32_t AConfiguration_getSdkVersion(AConfiguration* config);
+
+/**
+ * Set the current SDK version in the configuration.
+ */
+void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion);
+
+/**
+ * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenSize(AConfiguration* config);
+
+/**
+ * Set the current screen size in the configuration.
+ */
+void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize);
+
+/**
+ * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenLong(AConfiguration* config);
+
+/**
+ * Set the current screen long in the configuration.
+ */
+void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeType(AConfiguration* config);
+
+/**
+ * Set the current UI mode type in the configuration.
+ */
+void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeNight(AConfiguration* config);
+
+/**
+ * Set the current UI mode night in the configuration.
+ */
+void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
+
+/**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Perform a diff between two configurations. Returns a bit mask of
+ * ACONFIGURATION_* constants, each bit set meaning that configuration element
+ * is different between them.
+ */
+int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2);
+
+/**
+ * Determine whether 'base' is a valid configuration for use within the
+ * environment 'requested'. Returns 0 if there are any values in 'base'
+ * that conflict with 'requested'. Returns 1 if it does not conflict.
+ */
+int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested);
+
+/**
+ * Determine whether the configuration in 'test' is better than the existing
+ * configuration in 'base'. If 'requested' is non-NULL, this decision is based
+ * on the overall configuration given there. If it is NULL, this decision is
+ * simply based on which configuration is more specific. Returns non-0 if
+ * 'test' is better than 'base'.
+ *
+ * This assumes you have already filtered the configurations with
+ * AConfiguration_match().
+ */
+int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
+ AConfiguration* requested);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_CONFIGURATION_H
diff --git a/ndk/platforms/android-16/include/android/keycodes.h b/ndk/platforms/android-16/include/android/keycodes.h
new file mode 100644
index 0000000..282e729
--- /dev/null
+++ b/ndk/platforms/android-16/include/android/keycodes.h
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+ AKEYCODE_UNKNOWN = 0,
+ AKEYCODE_SOFT_LEFT = 1,
+ AKEYCODE_SOFT_RIGHT = 2,
+ AKEYCODE_HOME = 3,
+ AKEYCODE_BACK = 4,
+ AKEYCODE_CALL = 5,
+ AKEYCODE_ENDCALL = 6,
+ AKEYCODE_0 = 7,
+ AKEYCODE_1 = 8,
+ AKEYCODE_2 = 9,
+ AKEYCODE_3 = 10,
+ AKEYCODE_4 = 11,
+ AKEYCODE_5 = 12,
+ AKEYCODE_6 = 13,
+ AKEYCODE_7 = 14,
+ AKEYCODE_8 = 15,
+ AKEYCODE_9 = 16,
+ AKEYCODE_STAR = 17,
+ AKEYCODE_POUND = 18,
+ AKEYCODE_DPAD_UP = 19,
+ AKEYCODE_DPAD_DOWN = 20,
+ AKEYCODE_DPAD_LEFT = 21,
+ AKEYCODE_DPAD_RIGHT = 22,
+ AKEYCODE_DPAD_CENTER = 23,
+ AKEYCODE_VOLUME_UP = 24,
+ AKEYCODE_VOLUME_DOWN = 25,
+ AKEYCODE_POWER = 26,
+ AKEYCODE_CAMERA = 27,
+ AKEYCODE_CLEAR = 28,
+ AKEYCODE_A = 29,
+ AKEYCODE_B = 30,
+ AKEYCODE_C = 31,
+ AKEYCODE_D = 32,
+ AKEYCODE_E = 33,
+ AKEYCODE_F = 34,
+ AKEYCODE_G = 35,
+ AKEYCODE_H = 36,
+ AKEYCODE_I = 37,
+ AKEYCODE_J = 38,
+ AKEYCODE_K = 39,
+ AKEYCODE_L = 40,
+ AKEYCODE_M = 41,
+ AKEYCODE_N = 42,
+ AKEYCODE_O = 43,
+ AKEYCODE_P = 44,
+ AKEYCODE_Q = 45,
+ AKEYCODE_R = 46,
+ AKEYCODE_S = 47,
+ AKEYCODE_T = 48,
+ AKEYCODE_U = 49,
+ AKEYCODE_V = 50,
+ AKEYCODE_W = 51,
+ AKEYCODE_X = 52,
+ AKEYCODE_Y = 53,
+ AKEYCODE_Z = 54,
+ AKEYCODE_COMMA = 55,
+ AKEYCODE_PERIOD = 56,
+ AKEYCODE_ALT_LEFT = 57,
+ AKEYCODE_ALT_RIGHT = 58,
+ AKEYCODE_SHIFT_LEFT = 59,
+ AKEYCODE_SHIFT_RIGHT = 60,
+ AKEYCODE_TAB = 61,
+ AKEYCODE_SPACE = 62,
+ AKEYCODE_SYM = 63,
+ AKEYCODE_EXPLORER = 64,
+ AKEYCODE_ENVELOPE = 65,
+ AKEYCODE_ENTER = 66,
+ AKEYCODE_DEL = 67,
+ AKEYCODE_GRAVE = 68,
+ AKEYCODE_MINUS = 69,
+ AKEYCODE_EQUALS = 70,
+ AKEYCODE_LEFT_BRACKET = 71,
+ AKEYCODE_RIGHT_BRACKET = 72,
+ AKEYCODE_BACKSLASH = 73,
+ AKEYCODE_SEMICOLON = 74,
+ AKEYCODE_APOSTROPHE = 75,
+ AKEYCODE_SLASH = 76,
+ AKEYCODE_AT = 77,
+ AKEYCODE_NUM = 78,
+ AKEYCODE_HEADSETHOOK = 79,
+ AKEYCODE_FOCUS = 80, // *Camera* focus
+ AKEYCODE_PLUS = 81,
+ AKEYCODE_MENU = 82,
+ AKEYCODE_NOTIFICATION = 83,
+ AKEYCODE_SEARCH = 84,
+ AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+ AKEYCODE_MEDIA_STOP = 86,
+ AKEYCODE_MEDIA_NEXT = 87,
+ AKEYCODE_MEDIA_PREVIOUS = 88,
+ AKEYCODE_MEDIA_REWIND = 89,
+ AKEYCODE_MEDIA_FAST_FORWARD = 90,
+ AKEYCODE_MUTE = 91,
+ AKEYCODE_PAGE_UP = 92,
+ AKEYCODE_PAGE_DOWN = 93,
+ AKEYCODE_PICTSYMBOLS = 94,
+ AKEYCODE_SWITCH_CHARSET = 95,
+ AKEYCODE_BUTTON_A = 96,
+ AKEYCODE_BUTTON_B = 97,
+ AKEYCODE_BUTTON_C = 98,
+ AKEYCODE_BUTTON_X = 99,
+ AKEYCODE_BUTTON_Y = 100,
+ AKEYCODE_BUTTON_Z = 101,
+ AKEYCODE_BUTTON_L1 = 102,
+ AKEYCODE_BUTTON_R1 = 103,
+ AKEYCODE_BUTTON_L2 = 104,
+ AKEYCODE_BUTTON_R2 = 105,
+ AKEYCODE_BUTTON_THUMBL = 106,
+ AKEYCODE_BUTTON_THUMBR = 107,
+ AKEYCODE_BUTTON_START = 108,
+ AKEYCODE_BUTTON_SELECT = 109,
+ AKEYCODE_BUTTON_MODE = 110,
+ AKEYCODE_ESCAPE = 111,
+ AKEYCODE_FORWARD_DEL = 112,
+ AKEYCODE_CTRL_LEFT = 113,
+ AKEYCODE_CTRL_RIGHT = 114,
+ AKEYCODE_CAPS_LOCK = 115,
+ AKEYCODE_SCROLL_LOCK = 116,
+ AKEYCODE_META_LEFT = 117,
+ AKEYCODE_META_RIGHT = 118,
+ AKEYCODE_FUNCTION = 119,
+ AKEYCODE_SYSRQ = 120,
+ AKEYCODE_BREAK = 121,
+ AKEYCODE_MOVE_HOME = 122,
+ AKEYCODE_MOVE_END = 123,
+ AKEYCODE_INSERT = 124,
+ AKEYCODE_FORWARD = 125,
+ AKEYCODE_MEDIA_PLAY = 126,
+ AKEYCODE_MEDIA_PAUSE = 127,
+ AKEYCODE_MEDIA_CLOSE = 128,
+ AKEYCODE_MEDIA_EJECT = 129,
+ AKEYCODE_MEDIA_RECORD = 130,
+ AKEYCODE_F1 = 131,
+ AKEYCODE_F2 = 132,
+ AKEYCODE_F3 = 133,
+ AKEYCODE_F4 = 134,
+ AKEYCODE_F5 = 135,
+ AKEYCODE_F6 = 136,
+ AKEYCODE_F7 = 137,
+ AKEYCODE_F8 = 138,
+ AKEYCODE_F9 = 139,
+ AKEYCODE_F10 = 140,
+ AKEYCODE_F11 = 141,
+ AKEYCODE_F12 = 142,
+ AKEYCODE_NUM_LOCK = 143,
+ AKEYCODE_NUMPAD_0 = 144,
+ AKEYCODE_NUMPAD_1 = 145,
+ AKEYCODE_NUMPAD_2 = 146,
+ AKEYCODE_NUMPAD_3 = 147,
+ AKEYCODE_NUMPAD_4 = 148,
+ AKEYCODE_NUMPAD_5 = 149,
+ AKEYCODE_NUMPAD_6 = 150,
+ AKEYCODE_NUMPAD_7 = 151,
+ AKEYCODE_NUMPAD_8 = 152,
+ AKEYCODE_NUMPAD_9 = 153,
+ AKEYCODE_NUMPAD_DIVIDE = 154,
+ AKEYCODE_NUMPAD_MULTIPLY = 155,
+ AKEYCODE_NUMPAD_SUBTRACT = 156,
+ AKEYCODE_NUMPAD_ADD = 157,
+ AKEYCODE_NUMPAD_DOT = 158,
+ AKEYCODE_NUMPAD_COMMA = 159,
+ AKEYCODE_NUMPAD_ENTER = 160,
+ AKEYCODE_NUMPAD_EQUALS = 161,
+ AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+ AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+ AKEYCODE_VOLUME_MUTE = 164,
+ AKEYCODE_INFO = 165,
+ AKEYCODE_CHANNEL_UP = 166,
+ AKEYCODE_CHANNEL_DOWN = 167,
+ AKEYCODE_ZOOM_IN = 168,
+ AKEYCODE_ZOOM_OUT = 169,
+ AKEYCODE_TV = 170,
+ AKEYCODE_WINDOW = 171,
+ AKEYCODE_GUIDE = 172,
+ AKEYCODE_DVR = 173,
+ AKEYCODE_BOOKMARK = 174,
+ AKEYCODE_CAPTIONS = 175,
+ AKEYCODE_SETTINGS = 176,
+ AKEYCODE_TV_POWER = 177,
+ AKEYCODE_TV_INPUT = 178,
+ AKEYCODE_STB_POWER = 179,
+ AKEYCODE_STB_INPUT = 180,
+ AKEYCODE_AVR_POWER = 181,
+ AKEYCODE_AVR_INPUT = 182,
+ AKEYCODE_PROG_RED = 183,
+ AKEYCODE_PROG_GREEN = 184,
+ AKEYCODE_PROG_YELLOW = 185,
+ AKEYCODE_PROG_BLUE = 186,
+ AKEYCODE_APP_SWITCH = 187,
+ AKEYCODE_BUTTON_1 = 188,
+ AKEYCODE_BUTTON_2 = 189,
+ AKEYCODE_BUTTON_3 = 190,
+ AKEYCODE_BUTTON_4 = 191,
+ AKEYCODE_BUTTON_5 = 192,
+ AKEYCODE_BUTTON_6 = 193,
+ AKEYCODE_BUTTON_7 = 194,
+ AKEYCODE_BUTTON_8 = 195,
+ AKEYCODE_BUTTON_9 = 196,
+ AKEYCODE_BUTTON_10 = 197,
+ AKEYCODE_BUTTON_11 = 198,
+ AKEYCODE_BUTTON_12 = 199,
+ AKEYCODE_BUTTON_13 = 200,
+ AKEYCODE_BUTTON_14 = 201,
+ AKEYCODE_BUTTON_15 = 202,
+ AKEYCODE_BUTTON_16 = 203,
+ AKEYCODE_LANGUAGE_SWITCH = 204,
+ AKEYCODE_MANNER_MODE = 205,
+ AKEYCODE_3D_MODE = 206,
+ AKEYCODE_CONTACTS = 207,
+ AKEYCODE_CALENDAR = 208,
+ AKEYCODE_MUSIC = 209,
+ AKEYCODE_CALCULATOR = 210,
+ AKEYCODE_ZENKAKU_HANKAKU = 211,
+ AKEYCODE_EISU = 212,
+ AKEYCODE_MUHENKAN = 213,
+ AKEYCODE_HENKAN = 214,
+ AKEYCODE_KATAKANA_HIRAGANA = 215,
+ AKEYCODE_YEN = 216,
+ AKEYCODE_RO = 217,
+ AKEYCODE_KANA = 218,
+ AKEYCODE_ASSIST = 219,
+
+ // NOTE: If you add a new keycode here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-16/include/android/native_window_jni.h b/ndk/platforms/android-16/include/android/native_window_jni.h
new file mode 100644
index 0000000..b9e72ef
--- /dev/null
+++ b/ndk/platforms/android-16/include/android/native_window_jni.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef ANDROID_NATIVE_WINDOW_JNI_H
+#define ANDROID_NATIVE_WINDOW_JNI_H
+
+#include <android/native_window.h>
+
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Return the ANativeWindow associated with a Java Surface object,
+ * for interacting with it through native code. This acquires a reference
+ * on the ANativeWindow that is returned; be sure to use ANativeWindow_release()
+ * when done with it so that it doesn't leak.
+ */
+ANativeWindow* ANativeWindow_fromSurface(JNIEnv* env, jobject surface);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_WINDOW_H
diff --git a/ndk/platforms/android-16/include/android/rect.h b/ndk/platforms/android-16/include/android/rect.h
new file mode 100644
index 0000000..bcd42a9
--- /dev/null
+++ b/ndk/platforms/android-16/include/android/rect.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+
+#ifndef ANDROID_RECT_H
+#define ANDROID_RECT_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ARect {
+#ifdef __cplusplus
+ typedef int32_t value_type;
+#endif
+ int32_t left;
+ int32_t top;
+ int32_t right;
+ int32_t bottom;
+} ARect;
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_RECT_H
diff --git a/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..139e7cf
--- /dev/null
+++ b/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.functions.txt
@@ -0,0 +1,173 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getLayoutDirection
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setLayoutDirection
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.variables.txt b/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..139e7cf
--- /dev/null
+++ b/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.functions.txt
@@ -0,0 +1,173 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getLayoutDirection
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setLayoutDirection
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.variables.txt b/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..139e7cf
--- /dev/null
+++ b/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.functions.txt
@@ -0,0 +1,173 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getLayoutDirection
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setLayoutDirection
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.variables.txt b/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-17/include/android/configuration.h b/ndk/platforms/android-17/include/android/configuration.h
new file mode 100644
index 0000000..0f5c14a
--- /dev/null
+++ b/ndk/platforms/android-17/include/android/configuration.h
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef ANDROID_CONFIGURATION_H
+#define ANDROID_CONFIGURATION_H
+
+#include <android/asset_manager.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AConfiguration;
+typedef struct AConfiguration AConfiguration;
+
+enum {
+ ACONFIGURATION_ORIENTATION_ANY = 0x0000,
+ ACONFIGURATION_ORIENTATION_PORT = 0x0001,
+ ACONFIGURATION_ORIENTATION_LAND = 0x0002,
+ ACONFIGURATION_ORIENTATION_SQUARE = 0x0003,
+
+ ACONFIGURATION_TOUCHSCREEN_ANY = 0x0000,
+ ACONFIGURATION_TOUCHSCREEN_NOTOUCH = 0x0001,
+ ACONFIGURATION_TOUCHSCREEN_STYLUS = 0x0002,
+ ACONFIGURATION_TOUCHSCREEN_FINGER = 0x0003,
+
+ ACONFIGURATION_DENSITY_DEFAULT = 0,
+ ACONFIGURATION_DENSITY_LOW = 120,
+ ACONFIGURATION_DENSITY_MEDIUM = 160,
+ ACONFIGURATION_DENSITY_TV = 213,
+ ACONFIGURATION_DENSITY_HIGH = 240,
+ ACONFIGURATION_DENSITY_XHIGH = 320,
+ ACONFIGURATION_DENSITY_XXHIGH = 480,
+ ACONFIGURATION_DENSITY_NONE = 0xffff,
+
+ ACONFIGURATION_KEYBOARD_ANY = 0x0000,
+ ACONFIGURATION_KEYBOARD_NOKEYS = 0x0001,
+ ACONFIGURATION_KEYBOARD_QWERTY = 0x0002,
+ ACONFIGURATION_KEYBOARD_12KEY = 0x0003,
+
+ ACONFIGURATION_NAVIGATION_ANY = 0x0000,
+ ACONFIGURATION_NAVIGATION_NONAV = 0x0001,
+ ACONFIGURATION_NAVIGATION_DPAD = 0x0002,
+ ACONFIGURATION_NAVIGATION_TRACKBALL = 0x0003,
+ ACONFIGURATION_NAVIGATION_WHEEL = 0x0004,
+
+ ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000,
+ ACONFIGURATION_KEYSHIDDEN_NO = 0x0001,
+ ACONFIGURATION_KEYSHIDDEN_YES = 0x0002,
+ ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003,
+
+ ACONFIGURATION_NAVHIDDEN_ANY = 0x0000,
+ ACONFIGURATION_NAVHIDDEN_NO = 0x0001,
+ ACONFIGURATION_NAVHIDDEN_YES = 0x0002,
+
+ ACONFIGURATION_SCREENSIZE_ANY = 0x00,
+ ACONFIGURATION_SCREENSIZE_SMALL = 0x01,
+ ACONFIGURATION_SCREENSIZE_NORMAL = 0x02,
+ ACONFIGURATION_SCREENSIZE_LARGE = 0x03,
+ ACONFIGURATION_SCREENSIZE_XLARGE = 0x04,
+
+ ACONFIGURATION_SCREENLONG_ANY = 0x00,
+ ACONFIGURATION_SCREENLONG_NO = 0x1,
+ ACONFIGURATION_SCREENLONG_YES = 0x2,
+
+ ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00,
+ ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
+ ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
+ ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+ ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
+ ACONFIGURATION_UI_MODE_TYPE_APPLIANCE = 0x05,
+
+ ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
+ ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
+ ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
+
+ ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+ ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+ ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+ ACONFIGURATION_LAYOUTDIR_ANY = 0x00,
+ ACONFIGURATION_LAYOUTDIR_LTR = 0x01,
+ ACONFIGURATION_LAYOUTDIR_RTL = 0x02,
+
+ ACONFIGURATION_MCC = 0x0001,
+ ACONFIGURATION_MNC = 0x0002,
+ ACONFIGURATION_LOCALE = 0x0004,
+ ACONFIGURATION_TOUCHSCREEN = 0x0008,
+ ACONFIGURATION_KEYBOARD = 0x0010,
+ ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020,
+ ACONFIGURATION_NAVIGATION = 0x0040,
+ ACONFIGURATION_ORIENTATION = 0x0080,
+ ACONFIGURATION_DENSITY = 0x0100,
+ ACONFIGURATION_SCREEN_SIZE = 0x0200,
+ ACONFIGURATION_VERSION = 0x0400,
+ ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
+ ACONFIGURATION_UI_MODE = 0x1000,
+ ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
+ ACONFIGURATION_LAYOUTDIR = 0x4000,
+};
+
+/**
+ * Create a new AConfiguration, initialized with no values set.
+ */
+AConfiguration* AConfiguration_new();
+
+/**
+ * Free an AConfiguration that was previously created with
+ * AConfiguration_new().
+ */
+void AConfiguration_delete(AConfiguration* config);
+
+/**
+ * Create and return a new AConfiguration based on the current configuration in
+ * use in the given AssetManager.
+ */
+void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am);
+
+/**
+ * Copy the contents of 'src' to 'dest'.
+ */
+void AConfiguration_copy(AConfiguration* dest, AConfiguration* src);
+
+/**
+ * Return the current MCC set in the configuration. 0 if not set.
+ */
+int32_t AConfiguration_getMcc(AConfiguration* config);
+
+/**
+ * Set the current MCC in the configuration. 0 to clear.
+ */
+void AConfiguration_setMcc(AConfiguration* config, int32_t mcc);
+
+/**
+ * Return the current MNC set in the configuration. 0 if not set.
+ */
+int32_t AConfiguration_getMnc(AConfiguration* config);
+
+/**
+ * Set the current MNC in the configuration. 0 to clear.
+ */
+void AConfiguration_setMnc(AConfiguration* config, int32_t mnc);
+
+/**
+ * Return the current language code set in the configuration. The output will
+ * be filled with an array of two characters. They are not 0-terminated. If
+ * a language is not set, they will be 0.
+ */
+void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage);
+
+/**
+ * Set the current language code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setLanguage(AConfiguration* config, const char* language);
+
+/**
+ * Return the current country code set in the configuration. The output will
+ * be filled with an array of two characters. They are not 0-terminated. If
+ * a country is not set, they will be 0.
+ */
+void AConfiguration_getCountry(AConfiguration* config, char* outCountry);
+
+/**
+ * Set the current country code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setCountry(AConfiguration* config, const char* country);
+
+/**
+ * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
+ */
+int32_t AConfiguration_getOrientation(AConfiguration* config);
+
+/**
+ * Set the current orientation in the configuration.
+ */
+void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation);
+
+/**
+ * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
+ */
+int32_t AConfiguration_getTouchscreen(AConfiguration* config);
+
+/**
+ * Set the current touchscreen in the configuration.
+ */
+void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen);
+
+/**
+ * Return the current ACONFIGURATION_DENSITY_* set in the configuration.
+ */
+int32_t AConfiguration_getDensity(AConfiguration* config);
+
+/**
+ * Set the current density in the configuration.
+ */
+void AConfiguration_setDensity(AConfiguration* config, int32_t density);
+
+/**
+ * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
+ */
+int32_t AConfiguration_getKeyboard(AConfiguration* config);
+
+/**
+ * Set the current keyboard in the configuration.
+ */
+void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard);
+
+/**
+ * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
+ */
+int32_t AConfiguration_getNavigation(AConfiguration* config);
+
+/**
+ * Set the current navigation in the configuration.
+ */
+void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation);
+
+/**
+ * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getKeysHidden(AConfiguration* config);
+
+/**
+ * Set the current keys hidden in the configuration.
+ */
+void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden);
+
+/**
+ * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getNavHidden(AConfiguration* config);
+
+/**
+ * Set the current nav hidden in the configuration.
+ */
+void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden);
+
+/**
+ * Return the current SDK (API) version set in the configuration.
+ */
+int32_t AConfiguration_getSdkVersion(AConfiguration* config);
+
+/**
+ * Set the current SDK version in the configuration.
+ */
+void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion);
+
+/**
+ * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenSize(AConfiguration* config);
+
+/**
+ * Set the current screen size in the configuration.
+ */
+void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize);
+
+/**
+ * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenLong(AConfiguration* config);
+
+/**
+ * Set the current screen long in the configuration.
+ */
+void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeType(AConfiguration* config);
+
+/**
+ * Set the current UI mode type in the configuration.
+ */
+void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeNight(AConfiguration* config);
+
+/**
+ * Set the current UI mode night in the configuration.
+ */
+void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
+
+/**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's layout direction, or
+ * ACONFIGURATION_LAYOUTDIR_ANY if not set.
+ */
+int32_t AConfiguration_getLayoutDirection(AConfiguration* config);
+
+/**
+ * Set the configuration's layout direction.
+ */
+void AConfiguration_setLayoutDirection(AConfiguration* config, int32_t value);
+
+/**
+ * Perform a diff between two configurations. Returns a bit mask of
+ * ACONFIGURATION_* constants, each bit set meaning that configuration element
+ * is different between them.
+ */
+int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2);
+
+/**
+ * Determine whether 'base' is a valid configuration for use within the
+ * environment 'requested'. Returns 0 if there are any values in 'base'
+ * that conflict with 'requested'. Returns 1 if it does not conflict.
+ */
+int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested);
+
+/**
+ * Determine whether the configuration in 'test' is better than the existing
+ * configuration in 'base'. If 'requested' is non-NULL, this decision is based
+ * on the overall configuration given there. If it is NULL, this decision is
+ * simply based on which configuration is more specific. Returns non-0 if
+ * 'test' is better than 'base'.
+ *
+ * This assumes you have already filtered the configurations with
+ * AConfiguration_match().
+ */
+int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
+ AConfiguration* requested);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_CONFIGURATION_H
diff --git a/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml b/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml
new file mode 100644
index 0000000..510e97a
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.sample.teapot"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="11"
+ android:targetSdkVersion="17" />
+ <uses-feature android:glEsVersion="0x00020000"></uses-feature>
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
+ <application
+ android:allowBackup="true"
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme"
+ android:hasCode="true"
+ android:name="com.sample.teapot.TeapotApplication"
+ >
+
+ <!-- Our activity is the built-in NativeActivity framework class.
+ This will take care of integrating with our NDK code. -->
+ <activity android:name="com.sample.teapot.TeapotNativeActivity"
+ android:label="@string/app_name"
+ android:configChanges="orientation|keyboardHidden">
+ <!-- Tell NativeActivity the name of or .so -->
+ <meta-data android:name="android.app.lib_name"
+ android:value="TeapotNativeActivity" />
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/ndk/platforms/android-17/samples/Teapot/assets/Shaders/ShaderPlain.fsh b/ndk/platforms/android-17/samples/Teapot/assets/Shaders/ShaderPlain.fsh
new file mode 100644
index 0000000..1725138
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/assets/Shaders/ShaderPlain.fsh
@@ -0,0 +1,33 @@
+//
+// ShaderPlain.fsh
+//
+
+#define USE_PHONG (1)
+
+uniform lowp vec3 vMaterialAmbient;
+uniform lowp vec4 vMaterialSpecular;
+
+varying lowp vec4 colorDiffuse;
+
+#if USE_PHONG
+uniform highp vec3 vLight0;
+varying mediump vec3 position;
+varying mediump vec3 normal;
+#else
+varying lowp vec4 colorSpecular;
+#endif
+
+void main()
+{
+#if USE_PHONG
+ mediump vec3 halfVector = normalize(-vLight0 + position);
+ mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);
+ mediump float fPower = vMaterialSpecular.w;
+ mediump float specular = pow(NdotH, fPower);
+
+ lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );
+ gl_FragColor = colorDiffuse + colorSpecular;
+#else
+ gl_FragColor = colorDiffuse + colorSpecular;
+#endif
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/assets/Shaders/VS_ShaderPlain.vsh b/ndk/platforms/android-17/samples/Teapot/assets/Shaders/VS_ShaderPlain.vsh
new file mode 100644
index 0000000..f87a3c0
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/assets/Shaders/VS_ShaderPlain.vsh
@@ -0,0 +1,54 @@
+//
+// ShaderPlain.vsh
+//
+
+#define USE_PHONG (1)
+
+attribute highp vec3 myVertex;
+attribute highp vec3 myNormal;
+attribute mediump vec2 myUV;
+attribute mediump vec4 myBone;
+
+varying mediump vec2 texCoord;
+varying lowp vec4 colorDiffuse;
+
+#if USE_PHONG
+varying mediump vec3 position;
+varying mediump vec3 normal;
+#else
+varying lowp vec4 colorSpecular;
+#endif
+
+uniform highp mat4 uMVMatrix;
+uniform highp mat4 uPMatrix;
+
+uniform highp vec3 vLight0;
+
+uniform lowp vec4 vMaterialDiffuse;
+uniform lowp vec3 vMaterialAmbient;
+uniform lowp vec4 vMaterialSpecular;
+
+void main(void)
+{
+ highp vec4 p = vec4(myVertex,1);
+ gl_Position = uPMatrix * p;
+
+ texCoord = myUV;
+
+ highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);
+ highp vec3 ecPosition = p.xyz;
+
+ colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse + vec4( vMaterialAmbient, 1 );
+
+#if USE_PHONG
+ normal = worldNormal;
+ position = ecPosition;
+#else
+ highp vec3 halfVector = normalize(ecPosition - vLight0);
+
+ highp float NdotH = max(-dot(worldNormal, halfVector), 0.0);
+ float fPower = vMaterialSpecular.w;
+ highp float specular = min( pow(NdotH, fPower), 1.0);
+ colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );
+#endif
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/Android.mk b/ndk/platforms/android-17/samples/Teapot/jni/Android.mk
new file mode 100644
index 0000000..583743f
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/Android.mk
@@ -0,0 +1,20 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := TeapotNativeActivity
+LOCAL_SRC_FILES := TeapotNativeActivity.cpp \
+TeapotRenderer.cpp \
+
+LOCAL_C_INCLUDES :=
+
+LOCAL_CFLAGS :=
+
+LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2
+LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module,android/ndk_helper)
+$(call import-module,android/native_app_glue)
+$(call import-module,android/cpufeatures)
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/Application.mk b/ndk/platforms/android-17/samples/Teapot/jni/Application.mk
new file mode 100644
index 0000000..39b678d
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/Application.mk
@@ -0,0 +1,4 @@
+APP_PLATFORM := android-9
+APP_ABI := all
+
+APP_STL := stlport_static
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp b/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp
new file mode 100644
index 0000000..9efff81
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp
@@ -0,0 +1,488 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include <jni.h>
+#include <errno.h>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include <cpu-features.h>
+
+#include "TeapotRenderer.h"
+#include "NDKHelper.h"
+
+//-------------------------------------------------------------------------
+//Preprocessor
+//-------------------------------------------------------------------------
+#define HELPER_CLASS_NAME "com/sample/helper/NDKHelper" //Class name of helper function
+//-------------------------------------------------------------------------
+//Shared state for our app.
+//-------------------------------------------------------------------------
+struct android_app;
+class Engine
+{
+ TeapotRenderer renderer_;
+
+ ndk_helper::GLContext* gl_context_;
+
+ bool initialized_resources_;
+ bool has_focus_;
+
+ ndk_helper::DoubletapDetector doubletap_detector_;
+ ndk_helper::PinchDetector pinch_detector_;
+ ndk_helper::DragDetector drag_detector_;
+ ndk_helper::PerfMonitor monitor_;
+
+ ndk_helper::TapCamera tap_camera_;
+
+ android_app* app_;
+
+ ASensorManager* sensor_manager_;
+ const ASensor* accelerometer_sensor_;
+ ASensorEventQueue* sensor_event_queue_;
+
+ void UpdateFPS( float fFPS );
+ void ShowUI();
+ void TransformPosition( ndk_helper::Vec2& vec );
+
+public:
+ static void HandleCmd( struct android_app* app,
+ int32_t cmd );
+ static int32_t HandleInput( android_app* app,
+ AInputEvent* event );
+
+ Engine();
+ ~Engine();
+ void SetState( android_app* state );
+ int InitDisplay();
+ void LoadResources();
+ void UnloadResources();
+ void DrawFrame();
+ void TermDisplay();
+ void TrimMemory();
+ bool IsReady();
+
+ void UpdatePosition( AInputEvent* event,
+ int32_t iIndex,
+ float& fX,
+ float& fY );
+
+ void InitSensors();
+ void ProcessSensors( int32_t id );
+ void SuspendSensors();
+ void ResumeSensors();
+};
+
+//-------------------------------------------------------------------------
+//Ctor
+//-------------------------------------------------------------------------
+Engine::Engine() :
+ initialized_resources_( false ),
+ has_focus_( false ),
+ app_( NULL ),
+ sensor_manager_( NULL ),
+ accelerometer_sensor_( NULL ),
+ sensor_event_queue_( NULL )
+{
+ gl_context_ = ndk_helper::GLContext::GetInstance();
+}
+
+//-------------------------------------------------------------------------
+//Dtor
+//-------------------------------------------------------------------------
+Engine::~Engine()
+{
+}
+
+/**
+ * Load resources
+ */
+void Engine::LoadResources()
+{
+ renderer_.Init();
+ renderer_.Bind( &tap_camera_ );
+}
+
+/**
+ * Unload resources
+ */
+void Engine::UnloadResources()
+{
+ renderer_.Unload();
+}
+
+/**
+ * Initialize an EGL context for the current display.
+ */
+int Engine::InitDisplay()
+{
+ if( !initialized_resources_ )
+ {
+ gl_context_->Init( app_->window );
+ LoadResources();
+ initialized_resources_ = true;
+ }
+ else
+ {
+ // initialize OpenGL ES and EGL
+ if( EGL_SUCCESS != gl_context_->Resume( app_->window ) )
+ {
+ UnloadResources();
+ LoadResources();
+ }
+ }
+
+ ShowUI();
+
+ // Initialize GL state.
+ glEnable( GL_CULL_FACE );
+ glEnable( GL_DEPTH_TEST );
+ glDepthFunc( GL_LEQUAL );
+
+ //Note that screen size might have been changed
+ glViewport( 0, 0, gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() );
+ renderer_.UpdateViewport();
+
+ tap_camera_.SetFlip( 1.f, -1.f, -1.f );
+ tap_camera_.SetPinchTransformFactor( 2.f, 2.f, 8.f );
+
+ return 0;
+}
+
+/**
+ * Just the current frame in the display.
+ */
+void Engine::DrawFrame()
+{
+ float fFPS;
+ if( monitor_.Update( fFPS ) )
+ {
+ UpdateFPS( fFPS );
+ }
+ renderer_.Update( monitor_.GetCurrentTime() );
+
+ // Just fill the screen with a color.
+ glClearColor( 0.5f, 0.5f, 0.5f, 1.f );
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ renderer_.Render();
+
+ // Swap
+ if( EGL_SUCCESS != gl_context_->Swap() )
+ {
+ UnloadResources();
+ LoadResources();
+ }
+}
+
+/**
+ * Tear down the EGL context currently associated with the display.
+ */
+void Engine::TermDisplay()
+{
+ gl_context_->Suspend();
+
+}
+
+void Engine::TrimMemory()
+{
+ LOGI( "Trimming memory" );
+ gl_context_->Invalidate();
+}
+/**
+ * Process the next input event.
+ */
+int32_t Engine::HandleInput( android_app* app,
+ AInputEvent* event )
+{
+ Engine* eng = (Engine*) app->userData;
+ if( AInputEvent_getType( event ) == AINPUT_EVENT_TYPE_MOTION )
+ {
+ ndk_helper::GESTURE_STATE doubleTapState = eng->doubletap_detector_.Detect( event );
+ ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect( event );
+ ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect( event );
+
+ //Double tap detector has a priority over other detectors
+ if( doubleTapState == ndk_helper::GESTURE_STATE_ACTION )
+ {
+ //Detect double tap
+ eng->tap_camera_.Reset( true );
+ }
+ else
+ {
+ //Handle drag state
+ if( dragState & ndk_helper::GESTURE_STATE_START )
+ {
+ //Otherwise, start dragging
+ ndk_helper::Vec2 v;
+ eng->drag_detector_.GetPointer( v );
+ eng->TransformPosition( v );
+ eng->tap_camera_.BeginDrag( v );
+ }
+ else if( dragState & ndk_helper::GESTURE_STATE_MOVE )
+ {
+ ndk_helper::Vec2 v;
+ eng->drag_detector_.GetPointer( v );
+ eng->TransformPosition( v );
+ eng->tap_camera_.Drag( v );
+ }
+ else if( dragState & ndk_helper::GESTURE_STATE_END )
+ {
+ eng->tap_camera_.EndDrag();
+ }
+
+ //Handle pinch state
+ if( pinchState & ndk_helper::GESTURE_STATE_START )
+ {
+ //Start new pinch
+ ndk_helper::Vec2 v1;
+ ndk_helper::Vec2 v2;
+ eng->pinch_detector_.GetPointers( v1, v2 );
+ eng->TransformPosition( v1 );
+ eng->TransformPosition( v2 );
+ eng->tap_camera_.BeginPinch( v1, v2 );
+ }
+ else if( pinchState & ndk_helper::GESTURE_STATE_MOVE )
+ {
+ //Multi touch
+ //Start new pinch
+ ndk_helper::Vec2 v1;
+ ndk_helper::Vec2 v2;
+ eng->pinch_detector_.GetPointers( v1, v2 );
+ eng->TransformPosition( v1 );
+ eng->TransformPosition( v2 );
+ eng->tap_camera_.Pinch( v1, v2 );
+ }
+ }
+ return 1;
+ }
+ return 0;
+}
+
+/**
+ * Process the next main command.
+ */
+void Engine::HandleCmd( struct android_app* app,
+ int32_t cmd )
+{
+ Engine* eng = (Engine*) app->userData;
+ switch( cmd )
+ {
+ case APP_CMD_SAVE_STATE:
+ break;
+ case APP_CMD_INIT_WINDOW:
+ // The window is being shown, get it ready.
+ if( app->window != NULL )
+ {
+ eng->InitDisplay();
+ eng->DrawFrame();
+ }
+ break;
+ case APP_CMD_TERM_WINDOW:
+ // The window is being hidden or closed, clean it up.
+ eng->TermDisplay();
+ eng->has_focus_ = false;
+ break;
+ case APP_CMD_STOP:
+ break;
+ case APP_CMD_GAINED_FOCUS:
+ eng->ResumeSensors();
+ //Start animation
+ eng->has_focus_ = true;
+ break;
+ case APP_CMD_LOST_FOCUS:
+ eng->SuspendSensors();
+ // Also stop animating.
+ eng->has_focus_ = false;
+ eng->DrawFrame();
+ break;
+ case APP_CMD_LOW_MEMORY:
+ //Free up GL resources
+ eng->TrimMemory();
+ break;
+ }
+}
+
+//-------------------------------------------------------------------------
+//Sensor handlers
+//-------------------------------------------------------------------------
+void Engine::InitSensors()
+{
+ sensor_manager_ = ASensorManager_getInstance();
+ accelerometer_sensor_ = ASensorManager_getDefaultSensor( sensor_manager_,
+ ASENSOR_TYPE_ACCELEROMETER );
+ sensor_event_queue_ = ASensorManager_createEventQueue( sensor_manager_, app_->looper,
+ LOOPER_ID_USER, NULL, NULL );
+}
+
+void Engine::ProcessSensors( int32_t id )
+{
+ // If a sensor has data, process it now.
+ if( id == LOOPER_ID_USER )
+ {
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEvent event;
+ while( ASensorEventQueue_getEvents( sensor_event_queue_, &event, 1 ) > 0 )
+ {
+ }
+ }
+ }
+}
+
+void Engine::ResumeSensors()
+{
+ // When our app gains focus, we start monitoring the accelerometer.
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEventQueue_enableSensor( sensor_event_queue_, accelerometer_sensor_ );
+ // We'd like to get 60 events per second (in us).
+ ASensorEventQueue_setEventRate( sensor_event_queue_, accelerometer_sensor_,
+ (1000L / 60) * 1000 );
+ }
+}
+
+void Engine::SuspendSensors()
+{
+ // When our app loses focus, we stop monitoring the accelerometer.
+ // This is to avoid consuming battery while not being used.
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEventQueue_disableSensor( sensor_event_queue_, accelerometer_sensor_ );
+ }
+}
+
+//-------------------------------------------------------------------------
+//Misc
+//-------------------------------------------------------------------------
+void Engine::SetState( android_app* state )
+{
+ app_ = state;
+ doubletap_detector_.SetConfiguration( app_->config );
+ drag_detector_.SetConfiguration( app_->config );
+ pinch_detector_.SetConfiguration( app_->config );
+}
+
+bool Engine::IsReady()
+{
+ if( has_focus_ )
+ return true;
+
+ return false;
+}
+
+void Engine::TransformPosition( ndk_helper::Vec2& vec )
+{
+ vec = ndk_helper::Vec2( 2.0f, 2.0f ) * vec
+ / ndk_helper::Vec2( gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() )
+ - ndk_helper::Vec2( 1.f, 1.f );
+}
+
+void Engine::ShowUI()
+{
+ JNIEnv *jni;
+ app_->activity->vm->AttachCurrentThread( &jni, NULL );
+
+ //Default class retrieval
+ jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+ jmethodID methodID = jni->GetMethodID( clazz, "showUI", "()V" );
+ jni->CallVoidMethod( app_->activity->clazz, methodID );
+
+ app_->activity->vm->DetachCurrentThread();
+ return;
+}
+
+void Engine::UpdateFPS( float fFPS )
+{
+ JNIEnv *jni;
+ app_->activity->vm->AttachCurrentThread( &jni, NULL );
+
+ //Default class retrieval
+ jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+ jmethodID methodID = jni->GetMethodID( clazz, "updateFPS", "(F)V" );
+ jni->CallVoidMethod( app_->activity->clazz, methodID, fFPS );
+
+ app_->activity->vm->DetachCurrentThread();
+ return;
+}
+
+Engine g_engine;
+
+/**
+ * This is the main entry point of a native application that is using
+ * android_native_app_glue. It runs in its own thread, with its own
+ * event loop for receiving input events and doing other things.
+ */
+void android_main( android_app* state )
+{
+ app_dummy();
+
+ g_engine.SetState( state );
+
+ //Init helper functions
+ ndk_helper::JNIHelper::Init( state->activity, HELPER_CLASS_NAME );
+
+ state->userData = &g_engine;
+ state->onAppCmd = Engine::HandleCmd;
+ state->onInputEvent = Engine::HandleInput;
+
+#ifdef USE_NDK_PROFILER
+ monstartup("libTeapotNativeActivity.so");
+#endif
+
+ // Prepare to monitor accelerometer
+ g_engine.InitSensors();
+
+ // loop waiting for stuff to do.
+ while( 1 )
+ {
+ // Read all pending events.
+ int id;
+ int events;
+ android_poll_source* source;
+
+ // If not animating, we will block forever waiting for events.
+ // If animating, we loop until all events are read, then continue
+ // to draw the next frame of animation.
+ while( (id = ALooper_pollAll( g_engine.IsReady() ? 0 : -1, NULL, &events, (void**) &source ))
+ >= 0 )
+ {
+ // Process this event.
+ if( source != NULL )
+ source->process( state, source );
+
+ g_engine.ProcessSensors( id );
+
+ // Check if we are exiting.
+ if( state->destroyRequested != 0 )
+ {
+ g_engine.TermDisplay();
+ return;
+ }
+ }
+
+ if( g_engine.IsReady() )
+ {
+ // Drawing is throttled to the screen update rate, so there
+ // is no need to do timing here.
+ g_engine.DrawFrame();
+ }
+ }
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp
new file mode 100644
index 0000000..b7213dc
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp
@@ -0,0 +1,286 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// TeapotRenderer.cpp
+// Render a teapot
+//--------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include "TeapotRenderer.h"
+
+//--------------------------------------------------------------------------------
+// Teapot model data
+//--------------------------------------------------------------------------------
+#include "teapot.inl"
+
+//--------------------------------------------------------------------------------
+// Ctor
+//--------------------------------------------------------------------------------
+TeapotRenderer::TeapotRenderer()
+{
+
+}
+
+//--------------------------------------------------------------------------------
+// Dtor
+//--------------------------------------------------------------------------------
+TeapotRenderer::~TeapotRenderer()
+{
+ Unload();
+}
+
+void TeapotRenderer::Init()
+{
+ //Settings
+ glFrontFace( GL_CCW );
+
+ //Load shader
+ LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh",
+ "Shaders/ShaderPlain.fsh" );
+
+ //Create Index buffer
+ num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);
+ glGenBuffers( 1, &ibo_ );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+ glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices,
+ GL_STATIC_DRAW );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+
+ //Create VBO
+ num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;
+ int32_t iStride = sizeof(TEAPOT_VERTEX);
+ int32_t iIndex = 0;
+ TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];
+ for( int32_t i = 0; i < num_vertices_; ++i )
+ {
+ p[i].pos[0] = teapotPositions[iIndex];
+ p[i].pos[1] = teapotPositions[iIndex + 1];
+ p[i].pos[2] = teapotPositions[iIndex + 2];
+
+ p[i].normal[0] = teapotNormals[iIndex];
+ p[i].normal[1] = teapotNormals[iIndex + 1];
+ p[i].normal[2] = teapotNormals[iIndex + 2];
+ iIndex += 3;
+ }
+ glGenBuffers( 1, &vbo_ );
+ glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+ glBufferData( GL_ARRAY_BUFFER, iStride * num_vertices_, p, GL_STATIC_DRAW );
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
+
+ delete[] p;
+
+ UpdateViewport();
+ mat_model_ = ndk_helper::Mat4::Translation( 0, 0, -15.f );
+
+ ndk_helper::Mat4 mat = ndk_helper::Mat4::RotationX( M_PI / 3 );
+ mat_model_ = mat * mat_model_;
+}
+
+void TeapotRenderer::UpdateViewport()
+{
+ //Init Projection matrices
+ int32_t viewport[4];
+ glGetIntegerv( GL_VIEWPORT, viewport );
+ float fAspect = (float) viewport[2] / (float) viewport[3];
+
+ const float CAM_NEAR = 5.f;
+ const float CAM_FAR = 10000.f;
+ bool bRotate = false;
+ mat_projection_ = ndk_helper::Mat4::Perspective( fAspect, 1.f, CAM_NEAR, CAM_FAR );
+}
+
+void TeapotRenderer::Unload()
+{
+ if( vbo_ )
+ {
+ glDeleteBuffers( 1, &vbo_ );
+ vbo_ = 0;
+ }
+
+ if( ibo_ )
+ {
+ glDeleteBuffers( 1, &ibo_ );
+ ibo_ = 0;
+ }
+
+ if( shader_param_.program_ )
+ {
+ glDeleteProgram( shader_param_.program_ );
+ shader_param_.program_ = 0;
+ }
+}
+
+void TeapotRenderer::Update( float fTime )
+{
+ const float CAM_X = 0.f;
+ const float CAM_Y = 0.f;
+ const float CAM_Z = 700.f;
+
+ mat_view_ = ndk_helper::Mat4::LookAt( ndk_helper::Vec3( CAM_X, CAM_Y, CAM_Z ),
+ ndk_helper::Vec3( 0.f, 0.f, 0.f ), ndk_helper::Vec3( 0.f, 1.f, 0.f ) );
+
+ if( camera_ )
+ {
+ camera_->Update();
+ mat_view_ = camera_->GetTransformMatrix() * mat_view_
+ * camera_->GetRotationMatrix() * mat_model_;
+ }
+ else
+ {
+ mat_view_ = mat_view_ * mat_model_;
+ }
+}
+
+void TeapotRenderer::Render()
+{
+ //
+ // Feed Projection and Model View matrices to the shaders
+ ndk_helper::Mat4 mat_vp = mat_projection_ * mat_view_;
+
+ // Bind the VBO
+ glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+
+ int32_t iStride = sizeof(TEAPOT_VERTEX);
+ // Pass the vertex data
+ glVertexAttribPointer( ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride,
+ BUFFER_OFFSET( 0 ) );
+ glEnableVertexAttribArray( ATTRIB_VERTEX );
+
+ glVertexAttribPointer( ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,
+ BUFFER_OFFSET( 3 * sizeof(GLfloat) ) );
+ glEnableVertexAttribArray( ATTRIB_NORMAL );
+
+ // Bind the IB
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+
+ glUseProgram( shader_param_.program_ );
+
+ TEAPOT_MATERIALS material = { { 1.0f, 0.5f, 0.5f }, { 1.0f, 1.0f, 1.0f, 10.f }, {
+ 0.1f, 0.1f, 0.1f }, };
+
+ //Update uniforms
+ glUniform4f( shader_param_.material_diffuse_, material.diffuse_color[0],
+ material.diffuse_color[1], material.diffuse_color[2], 1.f );
+
+ glUniform4f( shader_param_.material_specular_, material.specular_color[0],
+ material.specular_color[1], material.specular_color[2],
+ material.specular_color[3] );
+ //
+ //using glUniform3fv here was troublesome
+ //
+ glUniform3f( shader_param_.material_ambient_, material.ambient_color[0],
+ material.ambient_color[1], material.ambient_color[2] );
+
+ glUniformMatrix4fv( shader_param_.matrix_projection_, 1, GL_FALSE, mat_vp.Ptr() );
+ glUniformMatrix4fv( shader_param_.matrix_view_, 1, GL_FALSE, mat_view_.Ptr() );
+ glUniform3f( shader_param_.light0_, 100.f, -200.f, -600.f );
+
+ glDrawElements( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0) );
+
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+}
+
+bool TeapotRenderer::LoadShaders( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh )
+{
+ GLuint program;
+ GLuint vert_shader, frag_shader;
+ char *vert_shader_pathname, *frag_shader_pathname;
+
+ // Create shader program
+ program = glCreateProgram();
+ LOGI( "Created Shader %d", program );
+
+ // Create and compile vertex shader
+ if( !ndk_helper::shader::CompileShader( &vert_shader, GL_VERTEX_SHADER, strVsh ) )
+ {
+ LOGI( "Failed to compile vertex shader" );
+ glDeleteProgram( program );
+ return false;
+ }
+
+ // Create and compile fragment shader
+ if( !ndk_helper::shader::CompileShader( &frag_shader, GL_FRAGMENT_SHADER, strFsh ) )
+ {
+ LOGI( "Failed to compile fragment shader" );
+ glDeleteProgram( program );
+ return false;
+ }
+
+ // Attach vertex shader to program
+ glAttachShader( program, vert_shader );
+
+ // Attach fragment shader to program
+ glAttachShader( program, frag_shader );
+
+ // Bind attribute locations
+ // this needs to be done prior to linking
+ glBindAttribLocation( program, ATTRIB_VERTEX, "myVertex" );
+ glBindAttribLocation( program, ATTRIB_NORMAL, "myNormal" );
+ glBindAttribLocation( program, ATTRIB_UV, "myUV" );
+
+ // Link program
+ if( !ndk_helper::shader::LinkProgram( program ) )
+ {
+ LOGI( "Failed to link program: %d", program );
+
+ if( vert_shader )
+ {
+ glDeleteShader( vert_shader );
+ vert_shader = 0;
+ }
+ if( frag_shader )
+ {
+ glDeleteShader( frag_shader );
+ frag_shader = 0;
+ }
+ if( program )
+ {
+ glDeleteProgram( program );
+ }
+
+ return false;
+ }
+
+ // Get uniform locations
+ params->matrix_projection_ = glGetUniformLocation( program, "uPMatrix" );
+ params->matrix_view_ = glGetUniformLocation( program, "uMVMatrix" );
+
+ params->light0_ = glGetUniformLocation( program, "vLight0" );
+ params->material_diffuse_ = glGetUniformLocation( program, "vMaterialDiffuse" );
+ params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+ params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
+
+ // Release vertex and fragment shaders
+ if( vert_shader )
+ glDeleteShader( vert_shader );
+ if( frag_shader )
+ glDeleteShader( frag_shader );
+
+ params->program_ = program;
+ return true;
+}
+
+bool TeapotRenderer::Bind( ndk_helper::TapCamera* camera )
+{
+ camera_ = camera;
+ return true;
+}
+
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h
new file mode 100644
index 0000000..a04f219
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// Teapot Renderer.h
+// Renderer for teapots
+//--------------------------------------------------------------------------------
+#ifndef _TEAPOTRENDERER_H
+#define _TEAPOTRENDERER_H
+
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include <jni.h>
+#include <errno.h>
+
+#include <vector>
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include <cpu-features.h>
+
+#define CLASS_NAME "android/app/NativeActivity"
+#define APPLICATION_CLASS_NAME "com/sample/teapot/TeapotApplication"
+
+#include "NDKHelper.h"
+
+#define BUFFER_OFFSET(i) ((char *)NULL + (i))
+
+struct TEAPOT_VERTEX
+{
+ float pos[3];
+ float normal[3];
+};
+
+enum SHADER_ATTRIBUTES
+{
+ ATTRIB_VERTEX, ATTRIB_NORMAL, ATTRIB_UV,
+};
+
+struct SHADER_PARAMS
+{
+ GLuint program_;
+ GLuint light0_;
+ GLuint material_diffuse_;
+ GLuint material_ambient_;
+ GLuint material_specular_;
+
+ GLuint matrix_projection_;
+ GLuint matrix_view_;
+};
+
+struct TEAPOT_MATERIALS
+{
+ float diffuse_color[3];
+ float specular_color[4];
+ float ambient_color[3];
+};
+
+class TeapotRenderer
+{
+ int32_t num_indices_;
+ int32_t num_vertices_;
+ GLuint ibo_;
+ GLuint vbo_;
+
+ SHADER_PARAMS shader_param_;
+ bool LoadShaders( SHADER_PARAMS* params, const char* strVsh, const char* strFsh );
+
+ ndk_helper::Mat4 mat_projection_;
+ ndk_helper::Mat4 mat_view_;
+ ndk_helper::Mat4 mat_model_;
+
+ ndk_helper::TapCamera* camera_;
+public:
+ TeapotRenderer();
+ virtual ~TeapotRenderer();
+ void Init();
+ void Render();
+ void Update( float dTime );
+ bool Bind( ndk_helper::TapCamera* camera );
+ void Unload();
+ void UpdateViewport();
+};
+
+#endif
+
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/teapot.inl b/ndk/platforms/android-17/samples/Teapot/jni/teapot.inl
new file mode 100644
index 0000000..7f42b88
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/teapot.inl
@@ -0,0 +1,2057 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//
+// Teapot.inl
+// Derived from WebGL sample
+// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js
+//
+
+float teapotPositions[] = { 17.83489990234375, 0, 30.573999404907227, 16.452699661254883, -7.000179767608643, 30.573999404907227,
+ 16.223100662231445, -6.902520179748535, 31.51460075378418, 17.586000442504883, 0, 31.51460075378418,
+ 16.48940086364746, -7.015810012817383, 31.828100204467773, 17.87470054626465, 0, 31.828100204467773,
+ 17.031099319458008, -7.246280193328857, 31.51460075378418, 18.46190071105957, 0, 31.51460075378418,
+ 17.62779998779297, -7.500199794769287, 30.573999404907227, 19.108800888061523, 0, 30.573999404907227,
+ 12.662699699401855, -12.662699699401855, 30.573999404907227, 12.486100196838379, -12.486100196838379, 31.51460075378418,
+ 12.690999984741211, -12.690999984741211, 31.828100204467773, 13.10789966583252, -13.10789966583252, 31.51460075378418,
+ 13.56719970703125, -13.56719970703125, 30.573999404907227, 7.000179767608643, -16.452699661254883, 30.573999404907227,
+ 6.902520179748535, -16.223100662231445, 31.51460075378418, 7.015810012817383, -16.48940086364746, 31.828100204467773,
+ 7.246280193328857, -17.031099319458008, 31.51460075378418, 7.500199794769287, -17.62779998779297, 30.573999404907227,
+ 0, -17.83489990234375, 30.573999404907227, 0, -17.586000442504883, 31.51460075378418,
+ 0, -17.87470054626465, 31.828100204467773, 0, -18.46190071105957, 31.51460075378418,
+ 0, -19.108800888061523, 30.573999404907227, 0, -17.83489990234375, 30.573999404907227,
+ -7.483870029449463, -16.452699661254883, 30.573999404907227, -7.106579780578613, -16.223100662231445, 31.51460075378418,
+ 0, -17.586000442504883, 31.51460075378418, -7.07627010345459, -16.48940086364746, 31.828100204467773,
+ 0, -17.87470054626465, 31.828100204467773, -7.25383996963501, -17.031099319458008, 31.51460075378418,
+ 0, -18.46190071105957, 31.51460075378418, -7.500199794769287, -17.62779998779297, 30.573999404907227,
+ 0, -19.108800888061523, 30.573999404907227, -13.092700004577637, -12.662699699401855, 30.573999404907227,
+ -12.667499542236328, -12.486100196838379, 31.51460075378418, -12.744799613952637, -12.690999984741211, 31.828100204467773,
+ -13.11460018157959, -13.10789966583252, 31.51460075378418, -13.56719970703125, -13.56719970703125, 30.573999404907227,
+ -16.61389923095703, -7.000179767608643, 30.573999404907227, -16.291099548339844, -6.902520179748535, 31.51460075378418,
+ -16.50950050354004, -7.015810012817383, 31.828100204467773, -17.033599853515625, -7.246280193328857, 31.51460075378418,
+ -17.62779998779297, -7.500199794769287, 30.573999404907227, -17.83489990234375, 0, 30.573999404907227,
+ -17.586000442504883, 0, 31.51460075378418, -17.87470054626465, 0, 31.828100204467773,
+ -18.46190071105957, 0, 31.51460075378418, -19.108800888061523, 0, 30.573999404907227,
+ -17.83489990234375, 0, 30.573999404907227, -16.452699661254883, 7.000179767608643, 30.573999404907227,
+ -16.223100662231445, 6.902520179748535, 31.51460075378418, -17.586000442504883, 0, 31.51460075378418,
+ -16.48940086364746, 7.015810012817383, 31.828100204467773, -17.87470054626465, 0, 31.828100204467773,
+ -17.031099319458008, 7.246280193328857, 31.51460075378418, -18.46190071105957, 0, 31.51460075378418,
+ -17.62779998779297, 7.500199794769287, 30.573999404907227, -19.108800888061523, 0, 30.573999404907227,
+ -12.662699699401855, 12.662699699401855, 30.573999404907227, -12.486100196838379, 12.486100196838379, 31.51460075378418,
+ -12.690999984741211, 12.690999984741211, 31.828100204467773, -13.10789966583252, 13.10789966583252, 31.51460075378418,
+ -13.56719970703125, 13.56719970703125, 30.573999404907227, -7.000179767608643, 16.452699661254883, 30.573999404907227,
+ -6.902520179748535, 16.223100662231445, 31.51460075378418, -7.015810012817383, 16.48940086364746, 31.828100204467773,
+ -7.246280193328857, 17.031099319458008, 31.51460075378418, -7.500199794769287, 17.62779998779297, 30.573999404907227,
+ 0, 17.83489990234375, 30.573999404907227, 0, 17.586000442504883, 31.51460075378418,
+ 0, 17.87470054626465, 31.828100204467773, 0, 18.46190071105957, 31.51460075378418,
+ 0, 19.108800888061523, 30.573999404907227, 0, 17.83489990234375, 30.573999404907227,
+ 7.000179767608643, 16.452699661254883, 30.573999404907227, 6.902520179748535, 16.223100662231445, 31.51460075378418,
+ 0, 17.586000442504883, 31.51460075378418, 7.015810012817383, 16.48940086364746, 31.828100204467773,
+ 0, 17.87470054626465, 31.828100204467773, 7.246280193328857, 17.031099319458008, 31.51460075378418,
+ 0, 18.46190071105957, 31.51460075378418, 7.500199794769287, 17.62779998779297, 30.573999404907227,
+ 0, 19.108800888061523, 30.573999404907227, 12.662699699401855, 12.662699699401855, 30.573999404907227,
+ 12.486100196838379, 12.486100196838379, 31.51460075378418, 12.690999984741211, 12.690999984741211, 31.828100204467773,
+ 13.10789966583252, 13.10789966583252, 31.51460075378418, 13.56719970703125, 13.56719970703125, 30.573999404907227,
+ 16.452699661254883, 7.000179767608643, 30.573999404907227, 16.223100662231445, 6.902520179748535, 31.51460075378418,
+ 16.48940086364746, 7.015810012817383, 31.828100204467773, 17.031099319458008, 7.246280193328857, 31.51460075378418,
+ 17.62779998779297, 7.500199794769287, 30.573999404907227, 17.83489990234375, 0, 30.573999404907227,
+ 17.586000442504883, 0, 31.51460075378418, 17.87470054626465, 0, 31.828100204467773,
+ 18.46190071105957, 0, 31.51460075378418, 19.108800888061523, 0, 30.573999404907227,
+ 19.108800888061523, 0, 30.573999404907227, 17.62779998779297, -7.500199794769287, 30.573999404907227,
+ 19.785400390625, -8.418190002441406, 25.572900772094727, 21.447599411010742, 0, 25.572900772094727,
+ 21.667600631713867, -9.218990325927734, 20.661399841308594, 23.487899780273438, 0, 20.661399841308594,
+ 22.99880027770996, -9.785409927368164, 15.928999900817871, 24.930999755859375, 0, 15.928999900817871,
+ 23.503799438476562, -10.000300407409668, 11.465299606323242, 25.4783992767334, 0, 11.465299606323242,
+ 13.56719970703125, -13.56719970703125, 30.573999404907227, 15.227800369262695, -15.227800369262695, 25.572900772094727,
+ 16.67639923095703, -16.67639923095703, 20.661399841308594, 17.701000213623047, -17.701000213623047, 15.928999900817871,
+ 18.089599609375, -18.089599609375, 11.465299606323242, 7.500199794769287, -17.62779998779297, 30.573999404907227,
+ 8.418190002441406, -19.785400390625, 25.572900772094727, 9.218990325927734, -21.667600631713867, 20.661399841308594,
+ 9.785409927368164, -22.99880027770996, 15.928999900817871, 10.000300407409668, -23.503799438476562, 11.465299606323242,
+ 0, -19.108800888061523, 30.573999404907227, 0, -21.447599411010742, 25.572900772094727,
+ 0, -23.487899780273438, 20.661399841308594, 0, -24.930999755859375, 15.928999900817871,
+ 0, -25.4783992767334, 11.465299606323242, 0, -19.108800888061523, 30.573999404907227,
+ -7.500199794769287, -17.62779998779297, 30.573999404907227, -8.418190002441406, -19.785400390625, 25.572900772094727,
+ 0, -21.447599411010742, 25.572900772094727, -9.218990325927734, -21.667600631713867, 20.661399841308594,
+ 0, -23.487899780273438, 20.661399841308594, -9.785409927368164, -22.99880027770996, 15.928999900817871,
+ 0, -24.930999755859375, 15.928999900817871, -10.000300407409668, -23.503799438476562, 11.465299606323242,
+ 0, -25.4783992767334, 11.465299606323242, -13.56719970703125, -13.56719970703125, 30.573999404907227,
+ -15.227800369262695, -15.227800369262695, 25.572900772094727, -16.67639923095703, -16.67639923095703, 20.661399841308594,
+ -17.701000213623047, -17.701000213623047, 15.928999900817871, -18.089599609375, -18.089599609375, 11.465299606323242,
+ -17.62779998779297, -7.500199794769287, 30.573999404907227, -19.785400390625, -8.418190002441406, 25.572900772094727,
+ -21.667600631713867, -9.218990325927734, 20.661399841308594, -22.99880027770996, -9.785409927368164, 15.928999900817871,
+ -23.503799438476562, -10.000300407409668, 11.465299606323242, -19.108800888061523, 0, 30.573999404907227,
+ -21.447599411010742, 0, 25.572900772094727, -23.487899780273438, 0, 20.661399841308594,
+ -24.930999755859375, 0, 15.928999900817871, -25.4783992767334, 0, 11.465299606323242,
+ -19.108800888061523, 0, 30.573999404907227, -17.62779998779297, 7.500199794769287, 30.573999404907227,
+ -19.785400390625, 8.418190002441406, 25.572900772094727, -21.447599411010742, 0, 25.572900772094727,
+ -21.667600631713867, 9.218990325927734, 20.661399841308594, -23.487899780273438, 0, 20.661399841308594,
+ -22.99880027770996, 9.785409927368164, 15.928999900817871, -24.930999755859375, 0, 15.928999900817871,
+ -23.503799438476562, 10.000300407409668, 11.465299606323242, -25.4783992767334, 0, 11.465299606323242,
+ -13.56719970703125, 13.56719970703125, 30.573999404907227, -15.227800369262695, 15.227800369262695, 25.572900772094727,
+ -16.67639923095703, 16.67639923095703, 20.661399841308594, -17.701000213623047, 17.701000213623047, 15.928999900817871,
+ -18.089599609375, 18.089599609375, 11.465299606323242, -7.500199794769287, 17.62779998779297, 30.573999404907227,
+ -8.418190002441406, 19.785400390625, 25.572900772094727, -9.218990325927734, 21.667600631713867, 20.661399841308594,
+ -9.785409927368164, 22.99880027770996, 15.928999900817871, -10.000300407409668, 23.503799438476562, 11.465299606323242,
+ 0, 19.108800888061523, 30.573999404907227, 0, 21.447599411010742, 25.572900772094727,
+ 0, 23.487899780273438, 20.661399841308594, 0, 24.930999755859375, 15.928999900817871,
+ 0, 25.4783992767334, 11.465299606323242, 0, 19.108800888061523, 30.573999404907227,
+ 7.500199794769287, 17.62779998779297, 30.573999404907227, 8.418190002441406, 19.785400390625, 25.572900772094727,
+ 0, 21.447599411010742, 25.572900772094727, 9.218990325927734, 21.667600631713867, 20.661399841308594,
+ 0, 23.487899780273438, 20.661399841308594, 9.785409927368164, 22.99880027770996, 15.928999900817871,
+ 0, 24.930999755859375, 15.928999900817871, 10.000300407409668, 23.503799438476562, 11.465299606323242,
+ 0, 25.4783992767334, 11.465299606323242, 13.56719970703125, 13.56719970703125, 30.573999404907227,
+ 15.227800369262695, 15.227800369262695, 25.572900772094727, 16.67639923095703, 16.67639923095703, 20.661399841308594,
+ 17.701000213623047, 17.701000213623047, 15.928999900817871, 18.089599609375, 18.089599609375, 11.465299606323242,
+ 17.62779998779297, 7.500199794769287, 30.573999404907227, 19.785400390625, 8.418190002441406, 25.572900772094727,
+ 21.667600631713867, 9.218990325927734, 20.661399841308594, 22.99880027770996, 9.785409927368164, 15.928999900817871,
+ 23.503799438476562, 10.000300407409668, 11.465299606323242, 19.108800888061523, 0, 30.573999404907227,
+ 21.447599411010742, 0, 25.572900772094727, 23.487899780273438, 0, 20.661399841308594,
+ 24.930999755859375, 0, 15.928999900817871, 25.4783992767334, 0, 11.465299606323242,
+ 25.4783992767334, 0, 11.465299606323242, 23.503799438476562, -10.000300407409668, 11.465299606323242,
+ 22.5856990814209, -9.609620094299316, 7.688300132751465, 24.48310089111328, 0, 7.688300132751465,
+ 20.565799713134766, -8.750229835510254, 4.89661979675293, 22.29360008239746, 0, 4.89661979675293,
+ 18.54599952697754, -7.890830039978027, 3.0006699562072754, 20.104000091552734, 0, 3.0006699562072754,
+ 17.62779998779297, -7.500199794769287, 1.9108799695968628, 19.108800888061523, 0, 1.9108799695968628,
+ 18.089599609375, -18.089599609375, 11.465299606323242, 17.382999420166016, -17.382999420166016, 7.688300132751465,
+ 15.828399658203125, -15.828399658203125, 4.89661979675293, 14.273900032043457, -14.273900032043457, 3.0006699562072754,
+ 13.56719970703125, -13.56719970703125, 1.9108799695968628, 10.000300407409668, -23.503799438476562, 11.465299606323242,
+ 9.609620094299316, -22.5856990814209, 7.688300132751465, 8.750229835510254, -20.565799713134766, 4.89661979675293,
+ 7.890830039978027, -18.54599952697754, 3.0006699562072754, 7.500199794769287, -17.62779998779297, 1.9108799695968628,
+ 0, -25.4783992767334, 11.465299606323242, 0, -24.48310089111328, 7.688300132751465,
+ 0, -22.29360008239746, 4.89661979675293, 0, -20.104000091552734, 3.0006699562072754,
+ 0, -19.108800888061523, 1.9108799695968628, 0, -25.4783992767334, 11.465299606323242,
+ -10.000300407409668, -23.503799438476562, 11.465299606323242, -9.609620094299316, -22.5856990814209, 7.688300132751465,
+ 0, -24.48310089111328, 7.688300132751465, -8.750229835510254, -20.565799713134766, 4.89661979675293,
+ 0, -22.29360008239746, 4.89661979675293, -7.890830039978027, -18.54599952697754, 3.0006699562072754,
+ 0, -20.104000091552734, 3.0006699562072754, -7.500199794769287, -17.62779998779297, 1.9108799695968628,
+ 0, -19.108800888061523, 1.9108799695968628, -18.089599609375, -18.089599609375, 11.465299606323242,
+ -17.382999420166016, -17.382999420166016, 7.688300132751465, -15.828399658203125, -15.828399658203125, 4.89661979675293,
+ -14.273900032043457, -14.273900032043457, 3.0006699562072754, -13.56719970703125, -13.56719970703125, 1.9108799695968628,
+ -23.503799438476562, -10.000300407409668, 11.465299606323242, -22.5856990814209, -9.609620094299316, 7.688300132751465,
+ -20.565799713134766, -8.750229835510254, 4.89661979675293, -18.54599952697754, -7.890830039978027, 3.0006699562072754,
+ -17.62779998779297, -7.500199794769287, 1.9108799695968628, -25.4783992767334, 0, 11.465299606323242,
+ -24.48310089111328, 0, 7.688300132751465, -22.29360008239746, 0, 4.89661979675293,
+ -20.104000091552734, 0, 3.0006699562072754, -19.108800888061523, 0, 1.9108799695968628,
+ -25.4783992767334, 0, 11.465299606323242, -23.503799438476562, 10.000300407409668, 11.465299606323242,
+ -22.5856990814209, 9.609620094299316, 7.688300132751465, -24.48310089111328, 0, 7.688300132751465,
+ -20.565799713134766, 8.750229835510254, 4.89661979675293, -22.29360008239746, 0, 4.89661979675293,
+ -18.54599952697754, 7.890830039978027, 3.0006699562072754, -20.104000091552734, 0, 3.0006699562072754,
+ -17.62779998779297, 7.500199794769287, 1.9108799695968628, -19.108800888061523, 0, 1.9108799695968628,
+ -18.089599609375, 18.089599609375, 11.465299606323242, -17.382999420166016, 17.382999420166016, 7.688300132751465,
+ -15.828399658203125, 15.828399658203125, 4.89661979675293, -14.273900032043457, 14.273900032043457, 3.0006699562072754,
+ -13.56719970703125, 13.56719970703125, 1.9108799695968628, -10.000300407409668, 23.503799438476562, 11.465299606323242,
+ -9.609620094299316, 22.5856990814209, 7.688300132751465, -8.750229835510254, 20.565799713134766, 4.89661979675293,
+ -7.890830039978027, 18.54599952697754, 3.0006699562072754, -7.500199794769287, 17.62779998779297, 1.9108799695968628,
+ 0, 25.4783992767334, 11.465299606323242, 0, 24.48310089111328, 7.688300132751465,
+ 0, 22.29360008239746, 4.89661979675293, 0, 20.104000091552734, 3.0006699562072754,
+ 0, 19.108800888061523, 1.9108799695968628, 0, 25.4783992767334, 11.465299606323242,
+ 10.000300407409668, 23.503799438476562, 11.465299606323242, 9.609620094299316, 22.5856990814209, 7.688300132751465,
+ 0, 24.48310089111328, 7.688300132751465, 8.750229835510254, 20.565799713134766, 4.89661979675293,
+ 0, 22.29360008239746, 4.89661979675293, 7.890830039978027, 18.54599952697754, 3.0006699562072754,
+ 0, 20.104000091552734, 3.0006699562072754, 7.500199794769287, 17.62779998779297, 1.9108799695968628,
+ 0, 19.108800888061523, 1.9108799695968628, 18.089599609375, 18.089599609375, 11.465299606323242,
+ 17.382999420166016, 17.382999420166016, 7.688300132751465, 15.828399658203125, 15.828399658203125, 4.89661979675293,
+ 14.273900032043457, 14.273900032043457, 3.0006699562072754, 13.56719970703125, 13.56719970703125, 1.9108799695968628,
+ 23.503799438476562, 10.000300407409668, 11.465299606323242, 22.5856990814209, 9.609620094299316, 7.688300132751465,
+ 20.565799713134766, 8.750229835510254, 4.89661979675293, 18.54599952697754, 7.890830039978027, 3.0006699562072754,
+ 17.62779998779297, 7.500199794769287, 1.9108799695968628, 25.4783992767334, 0, 11.465299606323242,
+ 24.48310089111328, 0, 7.688300132751465, 22.29360008239746, 0, 4.89661979675293,
+ 20.104000091552734, 0, 3.0006699562072754, 19.108800888061523, 0, 1.9108799695968628,
+ 19.108800888061523, 0, 1.9108799695968628, 17.62779998779297, -7.500199794769287, 1.9108799695968628,
+ 17.228500366210938, -7.330269813537598, 1.2092299461364746, 18.675800323486328, 0, 1.2092299461364746,
+ 15.093799591064453, -6.422039985656738, 0.5971490144729614, 16.361900329589844, 0, 0.5971490144729614,
+ 9.819259643554688, -4.177840232849121, 0.16421599686145782, 10.644200325012207, 0, 0.16421599686145782,
+ 0, 0, 0, 0, 0, 0,
+ 13.56719970703125, -13.56719970703125, 1.9108799695968628, 13.25979995727539, -13.25979995727539, 1.2092299461364746,
+ 11.616900444030762, -11.616900444030762, 0.5971490144729614, 7.557370185852051, -7.557370185852051, 0.16421599686145782,
+ 0, 0, 0, 7.500199794769287, -17.62779998779297, 1.9108799695968628,
+ 7.330269813537598, -17.228500366210938, 1.2092299461364746, 6.422039985656738, -15.093799591064453, 0.5971490144729614,
+ 4.177840232849121, -9.819259643554688, 0.16421599686145782, 0, 0, 0,
+ 0, -19.108800888061523, 1.9108799695968628, 0, -18.675800323486328, 1.2092299461364746,
+ 0, -16.361900329589844, 0.5971490144729614, 0, -10.644200325012207, 0.16421599686145782,
+ 0, 0, 0, 0, -19.108800888061523, 1.9108799695968628,
+ -7.500199794769287, -17.62779998779297, 1.9108799695968628, -7.330269813537598, -17.228500366210938, 1.2092299461364746,
+ 0, -18.675800323486328, 1.2092299461364746, -6.422039985656738, -15.093799591064453, 0.5971490144729614,
+ 0, -16.361900329589844, 0.5971490144729614, -4.177840232849121, -9.819259643554688, 0.16421599686145782,
+ 0, -10.644200325012207, 0.16421599686145782, 0, 0, 0,
+ 0, 0, 0, -13.56719970703125, -13.56719970703125, 1.9108799695968628,
+ -13.25979995727539, -13.25979995727539, 1.2092299461364746, -11.616900444030762, -11.616900444030762, 0.5971490144729614,
+ -7.557370185852051, -7.557370185852051, 0.16421599686145782, 0, 0, 0,
+ -17.62779998779297, -7.500199794769287, 1.9108799695968628, -17.228500366210938, -7.330269813537598, 1.2092299461364746,
+ -15.093799591064453, -6.422039985656738, 0.5971490144729614, -9.819259643554688, -4.177840232849121, 0.16421599686145782,
+ 0, 0, 0, -19.108800888061523, 0, 1.9108799695968628,
+ -18.675800323486328, 0, 1.2092299461364746, -16.361900329589844, 0, 0.5971490144729614,
+ -10.644200325012207, 0, 0.16421599686145782, 0, 0, 0,
+ -19.108800888061523, 0, 1.9108799695968628, -17.62779998779297, 7.500199794769287, 1.9108799695968628,
+ -17.228500366210938, 7.330269813537598, 1.2092299461364746, -18.675800323486328, 0, 1.2092299461364746,
+ -15.093799591064453, 6.422039985656738, 0.5971490144729614, -16.361900329589844, 0, 0.5971490144729614,
+ -9.819259643554688, 4.177840232849121, 0.16421599686145782, -10.644200325012207, 0, 0.16421599686145782,
+ 0, 0, 0, 0, 0, 0,
+ -13.56719970703125, 13.56719970703125, 1.9108799695968628, -13.25979995727539, 13.25979995727539, 1.2092299461364746,
+ -11.616900444030762, 11.616900444030762, 0.5971490144729614, -7.557370185852051, 7.557370185852051, 0.16421599686145782,
+ 0, 0, 0, -7.500199794769287, 17.62779998779297, 1.9108799695968628,
+ -7.330269813537598, 17.228500366210938, 1.2092299461364746, -6.422039985656738, 15.093799591064453, 0.5971490144729614,
+ -4.177840232849121, 9.819259643554688, 0.16421599686145782, 0, 0, 0,
+ 0, 19.108800888061523, 1.9108799695968628, 0, 18.675800323486328, 1.2092299461364746,
+ 0, 16.361900329589844, 0.5971490144729614, 0, 10.644200325012207, 0.16421599686145782,
+ 0, 0, 0, 0, 19.108800888061523, 1.9108799695968628,
+ 7.500199794769287, 17.62779998779297, 1.9108799695968628, 7.330269813537598, 17.228500366210938, 1.2092299461364746,
+ 0, 18.675800323486328, 1.2092299461364746, 6.422039985656738, 15.093799591064453, 0.5971490144729614,
+ 0, 16.361900329589844, 0.5971490144729614, 4.177840232849121, 9.819259643554688, 0.16421599686145782,
+ 0, 10.644200325012207, 0.16421599686145782, 0, 0, 0,
+ 0, 0, 0, 13.56719970703125, 13.56719970703125, 1.9108799695968628,
+ 13.25979995727539, 13.25979995727539, 1.2092299461364746, 11.616900444030762, 11.616900444030762, 0.5971490144729614,
+ 7.557370185852051, 7.557370185852051, 0.16421599686145782, 0, 0, 0,
+ 17.62779998779297, 7.500199794769287, 1.9108799695968628, 17.228500366210938, 7.330269813537598, 1.2092299461364746,
+ 15.093799591064453, 6.422039985656738, 0.5971490144729614, 9.819259643554688, 4.177840232849121, 0.16421599686145782,
+ 0, 0, 0, 19.108800888061523, 0, 1.9108799695968628,
+ 18.675800323486328, 0, 1.2092299461364746, 16.361900329589844, 0, 0.5971490144729614,
+ 10.644200325012207, 0, 0.16421599686145782, 0, 0, 0,
+ -20.382699966430664, 0, 25.796899795532227, -20.1835994720459, -2.149739980697632, 26.244699478149414,
+ -26.511600494384766, -2.149739980697632, 26.192899703979492, -26.334299087524414, 0, 25.752099990844727,
+ -31.156299591064453, -2.149739980697632, 25.830400466918945, -30.733299255371094, 0, 25.438600540161133,
+ -34.016998291015625, -2.149739980697632, 24.846500396728516, -33.46030044555664, 0, 24.587600708007812,
+ -34.99290084838867, -2.149739980697632, 22.930500030517578, -34.39580154418945, 0, 22.930500030517578,
+ -19.74570083618164, -2.8663198947906494, 27.229999542236328, -26.901599884033203, -2.8663198947906494, 27.162799835205078,
+ -32.08679962158203, -2.8663198947906494, 26.69260025024414, -35.241798400878906, -2.8663198947906494, 25.416200637817383,
+ -36.30670166015625, -2.8663198947906494, 22.930500030517578, -19.30780029296875, -2.149739980697632, 28.215299606323242,
+ -27.29159927368164, -2.149739980697632, 28.132699966430664, -33.017398834228516, -2.149739980697632, 27.55470085144043,
+ -36.46649932861328, -2.149739980697632, 25.98579978942871, -37.620399475097656, -2.149739980697632, 22.930500030517578,
+ -19.108800888061523, 0, 28.66320037841797, -27.468900680541992, 0, 28.57360076904297,
+ -33.440399169921875, 0, 27.94659996032715, -37.02330017089844, 0, 26.244699478149414,
+ -38.21760177612305, 0, 22.930500030517578, -19.108800888061523, 0, 28.66320037841797,
+ -19.30780029296875, 2.149739980697632, 28.215299606323242, -27.29159927368164, 2.149739980697632, 28.132699966430664,
+ -27.468900680541992, 0, 28.57360076904297, -33.017398834228516, 2.149739980697632, 27.55470085144043,
+ -33.440399169921875, 0, 27.94659996032715, -36.46649932861328, 2.149739980697632, 25.98579978942871,
+ -37.02330017089844, 0, 26.244699478149414, -37.620399475097656, 2.149739980697632, 22.930500030517578,
+ -38.21760177612305, 0, 22.930500030517578, -19.74570083618164, 2.8663198947906494, 27.229999542236328,
+ -26.901599884033203, 2.8663198947906494, 27.162799835205078, -32.08679962158203, 2.8663198947906494, 26.69260025024414,
+ -35.241798400878906, 2.8663198947906494, 25.416200637817383, -36.30670166015625, 2.8663198947906494, 22.930500030517578,
+ -20.1835994720459, 2.149739980697632, 26.244699478149414, -26.511600494384766, 2.149739980697632, 26.192899703979492,
+ -31.156299591064453, 2.149739980697632, 25.830400466918945, -34.016998291015625, 2.149739980697632, 24.846500396728516,
+ -34.99290084838867, 2.149739980697632, 22.930500030517578, -20.382699966430664, 0, 25.796899795532227,
+ -26.334299087524414, 0, 25.752099990844727, -30.733299255371094, 0, 25.438600540161133,
+ -33.46030044555664, 0, 24.587600708007812, -34.39580154418945, 0, 22.930500030517578,
+ -34.39580154418945, 0, 22.930500030517578, -34.99290084838867, -2.149739980697632, 22.930500030517578,
+ -34.44089889526367, -2.149739980697632, 20.082199096679688, -33.89820098876953, 0, 20.33289909362793,
+ -32.711299896240234, -2.149739980697632, 16.81529998779297, -32.32569885253906, 0, 17.197900772094727,
+ -29.69420051574707, -2.149739980697632, 13.590499877929688, -29.558900833129883, 0, 14.062899589538574,
+ -25.279300689697266, -2.149739980697632, 10.8681001663208, -25.4783992767334, 0, 11.465299606323242,
+ -36.30670166015625, -2.8663198947906494, 22.930500030517578, -35.6348991394043, -2.8663198947906494, 19.530500411987305,
+ -33.55979919433594, -2.8663198947906494, 15.973699569702148, -29.99180030822754, -2.8663198947906494, 12.551300048828125,
+ -24.841400146484375, -2.8663198947906494, 9.554389953613281, -37.620399475097656, -2.149739980697632, 22.930500030517578,
+ -36.82889938354492, -2.149739980697632, 18.97879981994629, -34.408199310302734, -2.149739980697632, 15.132100105285645,
+ -30.289499282836914, -2.149739980697632, 11.512200355529785, -24.403499603271484, -2.149739980697632, 8.240659713745117,
+ -38.21760177612305, 0, 22.930500030517578, -37.37160110473633, 0, 18.728099822998047,
+ -34.79389953613281, 0, 14.749600410461426, -30.424800872802734, 0, 11.039799690246582,
+ -24.204500198364258, 0, 7.643509864807129, -38.21760177612305, 0, 22.930500030517578,
+ -37.620399475097656, 2.149739980697632, 22.930500030517578, -36.82889938354492, 2.149739980697632, 18.97879981994629,
+ -37.37160110473633, 0, 18.728099822998047, -34.408199310302734, 2.149739980697632, 15.132100105285645,
+ -34.79389953613281, 0, 14.749600410461426, -30.289499282836914, 2.149739980697632, 11.512200355529785,
+ -30.424800872802734, 0, 11.039799690246582, -24.403499603271484, 2.149739980697632, 8.240659713745117,
+ -24.204500198364258, 0, 7.643509864807129, -36.30670166015625, 2.8663198947906494, 22.930500030517578,
+ -35.6348991394043, 2.8663198947906494, 19.530500411987305, -33.55979919433594, 2.8663198947906494, 15.973699569702148,
+ -29.99180030822754, 2.8663198947906494, 12.551300048828125, -24.841400146484375, 2.8663198947906494, 9.554389953613281,
+ -34.99290084838867, 2.149739980697632, 22.930500030517578, -34.44089889526367, 2.149739980697632, 20.082199096679688,
+ -32.711299896240234, 2.149739980697632, 16.81529998779297, -29.69420051574707, 2.149739980697632, 13.590499877929688,
+ -25.279300689697266, 2.149739980697632, 10.8681001663208, -34.39580154418945, 0, 22.930500030517578,
+ -33.89820098876953, 0, 20.33289909362793, -32.32569885253906, 0, 17.197900772094727,
+ -29.558900833129883, 0, 14.062899589538574, -25.4783992767334, 0, 11.465299606323242,
+ 21.656600952148438, 0, 18.15329933166504, 21.656600952148438, -4.729420185089111, 16.511199951171875,
+ 28.233999252319336, -4.270359992980957, 18.339000701904297, 27.76740074157715, 0, 19.55660057067871,
+ 31.011899948120117, -3.2604401111602783, 22.221399307250977, 30.4148006439209, 0, 22.930500030517578,
+ 32.59560012817383, -2.2505099773406982, 26.764400482177734, 31.867900848388672, 0, 27.020999908447266,
+ 35.5900993347168, -1.791450023651123, 30.573999404907227, 34.39580154418945, 0, 30.573999404907227,
+ 21.656600952148438, -6.3059000968933105, 12.89840030670166, 29.260299682617188, -5.693819999694824, 15.660200119018555,
+ 32.32569885253906, -4.347249984741211, 20.661399841308594, 34.19670104980469, -3.0006699562072754, 26.199899673461914,
+ 38.21760177612305, -2.3886001110076904, 30.573999404907227, 21.656600952148438, -4.729420185089111, 9.285670280456543,
+ 30.286699295043945, -4.270359992980957, 12.981499671936035, 33.639400482177734, -3.2604401111602783, 19.101299285888672,
+ 35.79790115356445, -2.2505099773406982, 25.635400772094727, 40.845001220703125, -1.791450023651123, 30.573999404907227,
+ 21.656600952148438, 0, 7.643509864807129, 30.75320053100586, 0, 11.763799667358398,
+ 34.23659896850586, 0, 18.392200469970703, 36.52560043334961, 0, 25.378799438476562,
+ 42.03929901123047, 0, 30.573999404907227, 21.656600952148438, 0, 7.643509864807129,
+ 21.656600952148438, 4.729420185089111, 9.285670280456543, 30.286699295043945, 4.270359992980957, 12.981499671936035,
+ 30.75320053100586, 0, 11.763799667358398, 33.639400482177734, 3.2604401111602783, 19.101299285888672,
+ 34.23659896850586, 0, 18.392200469970703, 35.79790115356445, 2.2505099773406982, 25.635400772094727,
+ 36.52560043334961, 0, 25.378799438476562, 40.845001220703125, 1.791450023651123, 30.573999404907227,
+ 42.03929901123047, 0, 30.573999404907227, 21.656600952148438, 6.3059000968933105, 12.89840030670166,
+ 29.260299682617188, 5.693819999694824, 15.660200119018555, 32.32569885253906, 4.347249984741211, 20.661399841308594,
+ 34.19670104980469, 3.0006699562072754, 26.199899673461914, 38.21760177612305, 2.3886001110076904, 30.573999404907227,
+ 21.656600952148438, 4.729420185089111, 16.511199951171875, 28.233999252319336, 4.270359992980957, 18.339000701904297,
+ 31.011899948120117, 3.2604401111602783, 22.221399307250977, 32.59560012817383, 2.2505099773406982, 26.764400482177734,
+ 35.5900993347168, 1.791450023651123, 30.573999404907227, 21.656600952148438, 0, 18.15329933166504,
+ 27.76740074157715, 0, 19.55660057067871, 30.4148006439209, 0, 22.930500030517578,
+ 31.867900848388672, 0, 27.020999908447266, 34.39580154418945, 0, 30.573999404907227,
+ 34.39580154418945, 0, 30.573999404907227, 35.5900993347168, -1.791450023651123, 30.573999404907227,
+ 36.59049987792969, -1.679479956626892, 31.137699127197266, 35.3114013671875, 0, 31.111499786376953,
+ 37.18870162963867, -1.4331599473953247, 31.332599639892578, 35.98820114135742, 0, 31.290599822998047,
+ 37.206600189208984, -1.1868300437927246, 31.1481990814209, 36.187198638916016, 0, 31.111499786376953,
+ 36.46590042114258, -1.074869990348816, 30.573999404907227, 35.669700622558594, 0, 30.573999404907227,
+ 38.21760177612305, -2.3886001110076904, 30.573999404907227, 39.40439987182617, -2.2393100261688232, 31.195499420166016,
+ 39.829898834228516, -1.9108799695968628, 31.424999237060547, 39.44919967651367, -1.582450032234192, 31.229000091552734,
+ 38.21760177612305, -1.4331599473953247, 30.573999404907227, 40.845001220703125, -1.791450023651123, 30.573999404907227,
+ 42.218299865722656, -1.679479956626892, 31.25320053100586, 42.47100067138672, -1.4331599473953247, 31.51740074157715,
+ 41.69169998168945, -1.1868300437927246, 31.309900283813477, 39.969200134277344, -1.074869990348816, 30.573999404907227,
+ 42.03929901123047, 0, 30.573999404907227, 43.49729919433594, 0, 31.279399871826172,
+ 43.67150115966797, 0, 31.55929946899414, 42.71110153198242, 0, 31.346599578857422,
+ 40.76539993286133, 0, 30.573999404907227, 42.03929901123047, 0, 30.573999404907227,
+ 40.845001220703125, 1.791450023651123, 30.573999404907227, 42.218299865722656, 1.679479956626892, 31.25320053100586,
+ 43.49729919433594, 0, 31.279399871826172, 42.47100067138672, 1.4331599473953247, 31.51740074157715,
+ 43.67150115966797, 0, 31.55929946899414, 41.69169998168945, 1.1868300437927246, 31.309900283813477,
+ 42.71110153198242, 0, 31.346599578857422, 39.969200134277344, 1.074869990348816, 30.573999404907227,
+ 40.76539993286133, 0, 30.573999404907227, 38.21760177612305, 2.3886001110076904, 30.573999404907227,
+ 39.40439987182617, 2.2393100261688232, 31.195499420166016, 39.829898834228516, 1.9108799695968628, 31.424999237060547,
+ 39.44919967651367, 1.582450032234192, 31.229000091552734, 38.21760177612305, 1.4331599473953247, 30.573999404907227,
+ 35.5900993347168, 1.791450023651123, 30.573999404907227, 36.59049987792969, 1.679479956626892, 31.137699127197266,
+ 37.18870162963867, 1.4331599473953247, 31.332599639892578, 37.206600189208984, 1.1868300437927246, 31.1481990814209,
+ 36.46590042114258, 1.074869990348816, 30.573999404907227, 34.39580154418945, 0, 30.573999404907227,
+ 35.3114013671875, 0, 31.111499786376953, 35.98820114135742, 0, 31.290599822998047,
+ 36.187198638916016, 0, 31.111499786376953, 35.669700622558594, 0, 30.573999404907227,
+ 0, 0, 40.12839889526367, 0, 0, 40.12839889526367,
+ 4.004499912261963, -1.7077000141143799, 39.501399993896484, 4.339280128479004, 0, 39.501399993896484,
+ 3.8207099437713623, -1.6290700435638428, 37.97869873046875, 4.140230178833008, 0, 37.97869873046875,
+ 2.314160108566284, -0.985912024974823, 36.09769821166992, 2.5080299377441406, 0, 36.09769821166992,
+ 2.3503799438476562, -1.0000300407409668, 34.39580154418945, 2.547840118408203, 0, 34.39580154418945,
+ 0, 0, 40.12839889526367, 3.0849199295043945, -3.0849199295043945, 39.501399993896484,
+ 2.943150043487549, -2.943150043487549, 37.97869873046875, 1.782039999961853, -1.782039999961853, 36.09769821166992,
+ 1.8089599609375, -1.8089599609375, 34.39580154418945, 0, 0, 40.12839889526367,
+ 1.7077000141143799, -4.004499912261963, 39.501399993896484, 1.6290700435638428, -3.8207099437713623, 37.97869873046875,
+ 0.985912024974823, -2.314160108566284, 36.09769821166992, 1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+ 0, 0, 40.12839889526367, 0, -4.339280128479004, 39.501399993896484,
+ 0, -4.140230178833008, 37.97869873046875, 0, -2.5080299377441406, 36.09769821166992,
+ 0, -2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+ 0, 0, 40.12839889526367, -1.7077000141143799, -4.004499912261963, 39.501399993896484,
+ 0, -4.339280128479004, 39.501399993896484, -1.6290700435638428, -3.8207099437713623, 37.97869873046875,
+ 0, -4.140230178833008, 37.97869873046875, -0.985912024974823, -2.314160108566284, 36.09769821166992,
+ 0, -2.5080299377441406, 36.09769821166992, -1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+ 0, -2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+ -3.0849199295043945, -3.0849199295043945, 39.501399993896484, -2.943150043487549, -2.943150043487549, 37.97869873046875,
+ -1.782039999961853, -1.782039999961853, 36.09769821166992, -1.8089599609375, -1.8089599609375, 34.39580154418945,
+ 0, 0, 40.12839889526367, -4.004499912261963, -1.7077000141143799, 39.501399993896484,
+ -3.8207099437713623, -1.6290700435638428, 37.97869873046875, -2.314160108566284, -0.985912024974823, 36.09769821166992,
+ -2.3503799438476562, -1.0000300407409668, 34.39580154418945, 0, 0, 40.12839889526367,
+ -4.339280128479004, 0, 39.501399993896484, -4.140230178833008, 0, 37.97869873046875,
+ -2.5080299377441406, 0, 36.09769821166992, -2.547840118408203, 0, 34.39580154418945,
+ 0, 0, 40.12839889526367, 0, 0, 40.12839889526367,
+ -4.004499912261963, 1.7077000141143799, 39.501399993896484, -4.339280128479004, 0, 39.501399993896484,
+ -3.8207099437713623, 1.6290700435638428, 37.97869873046875, -4.140230178833008, 0, 37.97869873046875,
+ -2.314160108566284, 0.985912024974823, 36.09769821166992, -2.5080299377441406, 0, 36.09769821166992,
+ -2.3503799438476562, 1.0000300407409668, 34.39580154418945, -2.547840118408203, 0, 34.39580154418945,
+ 0, 0, 40.12839889526367, -3.0849199295043945, 3.0849199295043945, 39.501399993896484,
+ -2.943150043487549, 2.943150043487549, 37.97869873046875, -1.782039999961853, 1.782039999961853, 36.09769821166992,
+ -1.8089599609375, 1.8089599609375, 34.39580154418945, 0, 0, 40.12839889526367,
+ -1.7077000141143799, 4.004499912261963, 39.501399993896484, -1.6290700435638428, 3.8207099437713623, 37.97869873046875,
+ -0.985912024974823, 2.314160108566284, 36.09769821166992, -1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+ 0, 0, 40.12839889526367, 0, 4.339280128479004, 39.501399993896484,
+ 0, 4.140230178833008, 37.97869873046875, 0, 2.5080299377441406, 36.09769821166992,
+ 0, 2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+ 0, 0, 40.12839889526367, 1.7077000141143799, 4.004499912261963, 39.501399993896484,
+ 0, 4.339280128479004, 39.501399993896484, 1.6290700435638428, 3.8207099437713623, 37.97869873046875,
+ 0, 4.140230178833008, 37.97869873046875, 0.985912024974823, 2.314160108566284, 36.09769821166992,
+ 0, 2.5080299377441406, 36.09769821166992, 1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+ 0, 2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+ 3.0849199295043945, 3.0849199295043945, 39.501399993896484, 2.943150043487549, 2.943150043487549, 37.97869873046875,
+ 1.782039999961853, 1.782039999961853, 36.09769821166992, 1.8089599609375, 1.8089599609375, 34.39580154418945,
+ 0, 0, 40.12839889526367, 4.004499912261963, 1.7077000141143799, 39.501399993896484,
+ 3.8207099437713623, 1.6290700435638428, 37.97869873046875, 2.314160108566284, 0.985912024974823, 36.09769821166992,
+ 2.3503799438476562, 1.0000300407409668, 34.39580154418945, 0, 0, 40.12839889526367,
+ 4.339280128479004, 0, 39.501399993896484, 4.140230178833008, 0, 37.97869873046875,
+ 2.5080299377441406, 0, 36.09769821166992, 2.547840118408203, 0, 34.39580154418945,
+ 2.547840118408203, 0, 34.39580154418945, 2.3503799438476562, -1.0000300407409668, 34.39580154418945,
+ 5.361800193786621, -2.2813100814819336, 33.261199951171875, 5.812250137329102, 0, 33.261199951171875,
+ 9.695320129394531, -4.125110149383545, 32.484901428222656, 10.50979995727539, 0, 32.484901428222656,
+ 13.58810043334961, -5.781400203704834, 31.708599090576172, 14.729700088500977, 0, 31.708599090576172,
+ 15.27750015258789, -6.5001702308654785, 30.573999404907227, 16.56089973449707, 0, 30.573999404907227,
+ 1.8089599609375, -1.8089599609375, 34.39580154418945, 4.126699924468994, -4.126699924468994, 33.261199951171875,
+ 7.461979866027832, -7.461979866027832, 32.484901428222656, 10.458100318908691, -10.458100318908691, 31.708599090576172,
+ 11.758299827575684, -11.758299827575684, 30.573999404907227, 1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+ 2.2813100814819336, -5.361800193786621, 33.261199951171875, 4.125110149383545, -9.695320129394531, 32.484901428222656,
+ 5.781400203704834, -13.58810043334961, 31.708599090576172, 6.5001702308654785, -15.27750015258789, 30.573999404907227,
+ 0, -2.547840118408203, 34.39580154418945, 0, -5.812250137329102, 33.261199951171875,
+ 0, -10.50979995727539, 32.484901428222656, 0, -14.729700088500977, 31.708599090576172,
+ 0, -16.56089973449707, 30.573999404907227, 0, -2.547840118408203, 34.39580154418945,
+ -1.0000300407409668, -2.3503799438476562, 34.39580154418945, -2.2813100814819336, -5.361800193786621, 33.261199951171875,
+ 0, -5.812250137329102, 33.261199951171875, -4.125110149383545, -9.695320129394531, 32.484901428222656,
+ 0, -10.50979995727539, 32.484901428222656, -5.781400203704834, -13.58810043334961, 31.708599090576172,
+ 0, -14.729700088500977, 31.708599090576172, -6.5001702308654785, -15.27750015258789, 30.573999404907227,
+ 0, -16.56089973449707, 30.573999404907227, -1.8089599609375, -1.8089599609375, 34.39580154418945,
+ -4.126699924468994, -4.126699924468994, 33.261199951171875, -7.461979866027832, -7.461979866027832, 32.484901428222656,
+ -10.458100318908691, -10.458100318908691, 31.708599090576172, -11.758299827575684, -11.758299827575684, 30.573999404907227,
+ -2.3503799438476562, -1.0000300407409668, 34.39580154418945, -5.361800193786621, -2.2813100814819336, 33.261199951171875,
+ -9.695320129394531, -4.125110149383545, 32.484901428222656, -13.58810043334961, -5.781400203704834, 31.708599090576172,
+ -15.27750015258789, -6.5001702308654785, 30.573999404907227, -2.547840118408203, 0, 34.39580154418945,
+ -5.812250137329102, 0, 33.261199951171875, -10.50979995727539, 0, 32.484901428222656,
+ -14.729700088500977, 0, 31.708599090576172, -16.56089973449707, 0, 30.573999404907227,
+ -2.547840118408203, 0, 34.39580154418945, -2.3503799438476562, 1.0000300407409668, 34.39580154418945,
+ -5.361800193786621, 2.2813100814819336, 33.261199951171875, -5.812250137329102, 0, 33.261199951171875,
+ -9.695320129394531, 4.125110149383545, 32.484901428222656, -10.50979995727539, 0, 32.484901428222656,
+ -13.58810043334961, 5.781400203704834, 31.708599090576172, -14.729700088500977, 0, 31.708599090576172,
+ -15.27750015258789, 6.5001702308654785, 30.573999404907227, -16.56089973449707, 0, 30.573999404907227,
+ -1.8089599609375, 1.8089599609375, 34.39580154418945, -4.126699924468994, 4.126699924468994, 33.261199951171875,
+ -7.461979866027832, 7.461979866027832, 32.484901428222656, -10.458100318908691, 10.458100318908691, 31.708599090576172,
+ -11.758299827575684, 11.758299827575684, 30.573999404907227, -1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+ -2.2813100814819336, 5.361800193786621, 33.261199951171875, -4.125110149383545, 9.695320129394531, 32.484901428222656,
+ -5.781400203704834, 13.58810043334961, 31.708599090576172, -6.5001702308654785, 15.27750015258789, 30.573999404907227,
+ 0, 2.547840118408203, 34.39580154418945, 0, 5.812250137329102, 33.261199951171875,
+ 0, 10.50979995727539, 32.484901428222656, 0, 14.729700088500977, 31.708599090576172,
+ 0, 16.56089973449707, 30.573999404907227, 0, 2.547840118408203, 34.39580154418945,
+ 1.0000300407409668, 2.3503799438476562, 34.39580154418945, 2.2813100814819336, 5.361800193786621, 33.261199951171875,
+ 0, 5.812250137329102, 33.261199951171875, 4.125110149383545, 9.695320129394531, 32.484901428222656,
+ 0, 10.50979995727539, 32.484901428222656, 5.781400203704834, 13.58810043334961, 31.708599090576172,
+ 0, 14.729700088500977, 31.708599090576172, 6.5001702308654785, 15.27750015258789, 30.573999404907227,
+ 0, 16.56089973449707, 30.573999404907227, 1.8089599609375, 1.8089599609375, 34.39580154418945,
+ 4.126699924468994, 4.126699924468994, 33.261199951171875, 7.461979866027832, 7.461979866027832, 32.484901428222656,
+ 10.458100318908691, 10.458100318908691, 31.708599090576172, 11.758299827575684, 11.758299827575684, 30.573999404907227,
+ 2.3503799438476562, 1.0000300407409668, 34.39580154418945, 5.361800193786621, 2.2813100814819336, 33.261199951171875,
+ 9.695320129394531, 4.125110149383545, 32.484901428222656, 13.58810043334961, 5.781400203704834, 31.708599090576172,
+ 15.27750015258789, 6.5001702308654785, 30.573999404907227, 2.547840118408203, 0, 34.39580154418945,
+ 5.812250137329102, 0, 33.261199951171875, 10.50979995727539, 0, 32.484901428222656,
+ 14.729700088500977, 0, 31.708599090576172, 16.56089973449707, 0, 30.573999404907227 };
+
+float teapotNormals[] = { -0.9667419791221619, 0, -0.25575199723243713, -0.8930140137672424, 0.3698819875717163, -0.2563450038433075,
+ -0.8934370279312134, 0.36910200119018555, 0.2559970021247864, -0.9668239951133728, 0, 0.2554430067539215,
+ -0.0838799998164177, 0.03550700098276138, 0.9958429932594299, -0.09205400198698044, 0, 0.9957540035247803,
+ 0.629721999168396, -0.2604379951953888, 0.7318620085716248, 0.6820489764213562, 0, 0.7313070297241211,
+ 0.803725004196167, -0.3325839936733246, 0.4933690130710602, 0.8703010082244873, 0, 0.4925200045108795,
+ -0.6834070086479187, 0.6834070086479187, -0.2567310035228729, -0.6835309863090515, 0.6835309863090515, 0.25606799125671387,
+ -0.06492599844932556, 0.06492500007152557, 0.9957759976387024, 0.48139700293540955, -0.48139700293540955, 0.7324709892272949,
+ 0.6148040294647217, -0.6148040294647217, 0.4939970076084137, -0.3698819875717163, 0.8930140137672424, -0.2563450038433075,
+ -0.36910200119018555, 0.8934370279312134, 0.2559959888458252, -0.03550700098276138, 0.0838790014386177, 0.9958429932594299,
+ 0.26043900847435, -0.6297230124473572, 0.7318609952926636, 0.3325839936733246, -0.803725004196167, 0.4933690130710602,
+ -0.002848000032827258, 0.9661769866943359, -0.25786298513412476, -0.001921999966725707, 0.9670090079307556, 0.2547360062599182,
+ -0.00026500000967644155, 0.09227199852466583, 0.9957339763641357, 0.00002300000051036477, -0.6820600032806396, 0.7312960028648376,
+ 0, -0.8703010082244873, 0.4925200045108795, -0.002848000032827258, 0.9661769866943359, -0.25786298513412476,
+ 0.37905800342559814, 0.852770984172821, -0.35929998755455017, 0.37711000442504883, 0.9140909910202026, 0.14908500015735626,
+ -0.001921999966725707, 0.9670090079307556, 0.2547360062599182, 0.0275030005723238, 0.12255500257015228, 0.9920809864997864,
+ -0.00026500000967644155, 0.09227199852466583, 0.9957339763641357, -0.26100900769233704, -0.6353650093078613, 0.7267630100250244,
+ 0.00002300000051036477, -0.6820600032806396, 0.7312960028648376, -0.33248499035835266, -0.8042709827423096, 0.4925459921360016,
+ 0, -0.8703010082244873, 0.4925200045108795, 0.6635469794273376, 0.6252639889717102, -0.4107919931411743,
+ 0.712664008140564, 0.6976209878921509, 0.07372400164604187, 0.09972699731588364, 0.12198299914598465, 0.98750901222229,
+ -0.4873189926147461, -0.4885669946670532, 0.7237560153007507, -0.6152420043945312, -0.6154839992523193, 0.4926010072231293,
+ 0.8800280094146729, 0.3387089967727661, -0.3329069912433624, 0.9172769784927368, 0.36149299144744873, 0.16711199283599854,
+ 0.11358699947595596, 0.04806999862194061, 0.9923650026321411, -0.6341490149497986, -0.2618879973888397, 0.7275090217590332,
+ -0.8041260242462158, -0.33270499110221863, 0.49263399839401245, 0.9666900038719177, -0.010453999973833561, -0.2557379901409149,
+ 0.967441976070404, -0.00810300000011921, 0.25296199321746826, 0.0934389978647232, -0.0012799999676644802, 0.9956240057945251,
+ -0.6821659803390503, 0.0003429999924264848, 0.7311969995498657, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+ 0.9666900038719177, -0.010453999973833561, -0.2557379901409149, 0.8930140137672424, -0.3698819875717163, -0.2563450038433075,
+ 0.8934370279312134, -0.36910200119018555, 0.2559970021247864, 0.967441976070404, -0.00810300000011921, 0.25296199321746826,
+ 0.0838799998164177, -0.03550700098276138, 0.9958429932594299, 0.0934389978647232, -0.0012799999676644802, 0.9956240057945251,
+ -0.629721999168396, 0.2604379951953888, 0.7318620085716248, -0.6821659803390503, 0.0003429999924264848, 0.7311969995498657,
+ -0.803725004196167, 0.3325839936733246, 0.4933690130710602, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+ 0.6834070086479187, -0.6834070086479187, -0.2567310035228729, 0.6835309863090515, -0.6835309863090515, 0.25606799125671387,
+ 0.06492599844932556, -0.06492500007152557, 0.9957759976387024, -0.48139700293540955, 0.48139700293540955, 0.7324709892272949,
+ -0.6148040294647217, 0.6148040294647217, 0.4939970076084137, 0.3698819875717163, -0.8930140137672424, -0.2563450038433075,
+ 0.36910200119018555, -0.8934370279312134, 0.2559959888458252, 0.03550700098276138, -0.0838790014386177, 0.9958429932594299,
+ -0.26043900847435, 0.6297230124473572, 0.7318609952926636, -0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+ 0, -0.9667419791221619, -0.25575199723243713, 0, -0.9668239951133728, 0.2554430067539215,
+ 0, -0.09205400198698044, 0.9957540035247803, 0, 0.6820489764213562, 0.7313070297241211,
+ 0, 0.8703010082244873, 0.4925200045108795, 0, -0.9667419791221619, -0.25575199723243713,
+ -0.3698819875717163, -0.8930140137672424, -0.2563450038433075, -0.36910200119018555, -0.8934370279312134, 0.2559970021247864,
+ 0, -0.9668239951133728, 0.2554430067539215, -0.03550700098276138, -0.0838799998164177, 0.9958429932594299,
+ 0, -0.09205400198698044, 0.9957540035247803, 0.2604379951953888, 0.629721999168396, 0.7318620085716248,
+ 0, 0.6820489764213562, 0.7313070297241211, 0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+ 0, 0.8703010082244873, 0.4925200045108795, -0.6834070086479187, -0.6834070086479187, -0.2567310035228729,
+ -0.6835309863090515, -0.6835309863090515, 0.25606799125671387, -0.06492500007152557, -0.06492599844932556, 0.9957759976387024,
+ 0.48139700293540955, 0.48139700293540955, 0.7324709892272949, 0.6148040294647217, 0.6148040294647217, 0.4939970076084137,
+ -0.8930140137672424, -0.3698819875717163, -0.2563450038433075, -0.8934370279312134, -0.36910200119018555, 0.2559959888458252,
+ -0.0838790014386177, -0.03550700098276138, 0.9958429932594299, 0.6297230124473572, 0.26043900847435, 0.7318609952926636,
+ 0.803725004196167, 0.3325839936733246, 0.4933690130710602, -0.9667419791221619, 0, -0.25575199723243713,
+ -0.9668239951133728, 0, 0.2554430067539215, -0.09205400198698044, 0, 0.9957540035247803,
+ 0.6820489764213562, 0, 0.7313070297241211, 0.8703010082244873, 0, 0.4925200045108795,
+ 0.8703010082244873, 0, 0.4925200045108795, 0.803725004196167, -0.3325839936733246, 0.4933690130710602,
+ 0.8454390168190002, -0.34983500838279724, 0.40354499220848083, 0.9153209924697876, 0, 0.4027250111103058,
+ 0.8699960112571716, -0.36004599928855896, 0.33685898780822754, 0.9418079853057861, 0, 0.33615100383758545,
+ 0.9041929841041565, -0.37428000569343567, 0.20579099655151367, 0.9786900281906128, 0, 0.20534199476242065,
+ 0.9218789935112, -0.38175201416015625, -0.06636899709701538, 0.9978039860725403, 0, -0.06623899936676025,
+ 0.6148040294647217, -0.6148040294647217, 0.4939970076084137, 0.6468020081520081, -0.6468020081520081, 0.40409600734710693,
+ 0.6656550168991089, -0.6656550168991089, 0.3373520076274872, 0.6919230222702026, -0.6919230222702026, 0.20611999928951263,
+ 0.7055429816246033, -0.7055429816246033, -0.06647899746894836, 0.3325839936733246, -0.803725004196167, 0.4933690130710602,
+ 0.34983500838279724, -0.8454390168190002, 0.40354499220848083, 0.36004701256752014, -0.8699960112571716, 0.33685800433158875,
+ 0.37428000569343567, -0.9041929841041565, 0.20579099655151367, 0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+ 0, -0.8703010082244873, 0.4925200045108795, 0, -0.9153209924697876, 0.4027250111103058,
+ 0, -0.9418079853057861, 0.33615100383758545, 0, -0.9786900281906128, 0.20534199476242065,
+ 0, -0.9978039860725403, -0.06623899936676025, 0, -0.8703010082244873, 0.4925200045108795,
+ -0.33248499035835266, -0.8042709827423096, 0.4925459921360016, -0.34983500838279724, -0.8454390168190002, 0.40354499220848083,
+ 0, -0.9153209924697876, 0.4027250111103058, -0.36004599928855896, -0.8699960112571716, 0.33685898780822754,
+ 0, -0.9418079853057861, 0.33615100383758545, -0.37428000569343567, -0.9041929841041565, 0.20579099655151367,
+ 0, -0.9786900281906128, 0.20534199476242065, -0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+ 0, -0.9978039860725403, -0.06623899936676025, -0.6152420043945312, -0.6154839992523193, 0.4926010072231293,
+ -0.6468020081520081, -0.6468020081520081, 0.40409600734710693, -0.6656550168991089, -0.6656550168991089, 0.3373520076274872,
+ -0.6919230222702026, -0.6919230222702026, 0.20611999928951263, -0.7055429816246033, -0.7055429816246033, -0.06647899746894836,
+ -0.8041260242462158, -0.33270499110221863, 0.49263399839401245, -0.8454390168190002, -0.34983500838279724, 0.40354499220848083,
+ -0.8699960112571716, -0.36004701256752014, 0.33685800433158875, -0.9041929841041565, -0.37428000569343567, 0.20579099655151367,
+ -0.9218789935112, -0.38175201416015625, -0.06636899709701538, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+ -0.9153209924697876, 0, 0.4027250111103058, -0.9418079853057861, 0, 0.33615100383758545,
+ -0.9786900281906128, 0, 0.20534199476242065, -0.9978039860725403, 0, -0.06623899936676025,
+ -0.8703219890594482, 0.00005400000009103678, 0.492482990026474, -0.803725004196167, 0.3325839936733246, 0.4933690130710602,
+ -0.8454390168190002, 0.34983500838279724, 0.40354499220848083, -0.9153209924697876, 0, 0.4027250111103058,
+ -0.8699960112571716, 0.36004599928855896, 0.33685898780822754, -0.9418079853057861, 0, 0.33615100383758545,
+ -0.9041929841041565, 0.37428000569343567, 0.20579099655151367, -0.9786900281906128, 0, 0.20534199476242065,
+ -0.9218789935112, 0.38175201416015625, -0.06636899709701538, -0.9978039860725403, 0, -0.06623899936676025,
+ -0.6148040294647217, 0.6148040294647217, 0.4939970076084137, -0.6468020081520081, 0.6468020081520081, 0.40409600734710693,
+ -0.6656550168991089, 0.6656550168991089, 0.3373520076274872, -0.6919230222702026, 0.6919230222702026, 0.20611999928951263,
+ -0.7055429816246033, 0.7055429816246033, -0.06647899746894836, -0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+ -0.34983500838279724, 0.8454390168190002, 0.40354499220848083, -0.36004701256752014, 0.8699960112571716, 0.33685800433158875,
+ -0.37428000569343567, 0.9041929841041565, 0.20579099655151367, -0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+ 0, 0.8703010082244873, 0.4925200045108795, 0, 0.9153209924697876, 0.4027250111103058,
+ 0, 0.9418079853057861, 0.33615100383758545, 0, 0.9786900281906128, 0.20534199476242065,
+ 0, 0.9978039860725403, -0.06623899936676025, 0, 0.8703010082244873, 0.4925200045108795,
+ 0.3325839936733246, 0.803725004196167, 0.4933690130710602, 0.34983500838279724, 0.8454390168190002, 0.40354499220848083,
+ 0, 0.9153209924697876, 0.4027250111103058, 0.36004599928855896, 0.8699960112571716, 0.33685898780822754,
+ 0, 0.9418079853057861, 0.33615100383758545, 0.37428000569343567, 0.9041929841041565, 0.20579099655151367,
+ 0, 0.9786900281906128, 0.20534199476242065, 0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+ 0, 0.9978039860725403, -0.06623899936676025, 0.6148040294647217, 0.6148040294647217, 0.4939970076084137,
+ 0.6468020081520081, 0.6468020081520081, 0.40409600734710693, 0.6656550168991089, 0.6656550168991089, 0.3373520076274872,
+ 0.6919230222702026, 0.6919230222702026, 0.20611999928951263, 0.7055429816246033, 0.7055429816246033, -0.06647899746894836,
+ 0.803725004196167, 0.3325839936733246, 0.4933690130710602, 0.8454390168190002, 0.34983500838279724, 0.40354499220848083,
+ 0.8699960112571716, 0.36004701256752014, 0.33685800433158875, 0.9041929841041565, 0.37428000569343567, 0.20579099655151367,
+ 0.9218789935112, 0.38175201416015625, -0.06636899709701538, 0.8703010082244873, 0, 0.4925200045108795,
+ 0.9153209924697876, 0, 0.4027250111103058, 0.9418079853057861, 0, 0.33615100383758545,
+ 0.9786900281906128, 0, 0.20534199476242065, 0.9978039860725403, 0, -0.06623899936676025,
+ 0.9978039860725403, 0, -0.06623899936676025, 0.9218789935112, -0.38175201416015625, -0.06636899709701538,
+ 0.8314369916915894, -0.3441790044307709, -0.4361799955368042, 0.9001820087432861, 0, -0.4355129897594452,
+ 0.6735119819641113, -0.2785939872264862, -0.6846650242805481, 0.7296109795570374, 0, -0.6838629841804504,
+ 0.6403989791870117, -0.26487401127815247, -0.7209240198135376, 0.6939510107040405, 0, -0.7200220227241516,
+ 0.7329490184783936, -0.303166002035141, -0.6089959740638733, 0.7939500212669373, 0, -0.6079840064048767,
+ 0.7055429816246033, -0.7055429816246033, -0.06647899746894836, 0.6360920071601868, -0.6360920071601868, -0.4367780089378357,
+ 0.5149649977684021, -0.5149649977684021, -0.6852890253067017, 0.48965099453926086, -0.48965099453926086, -0.7214459776878357,
+ 0.5605549812316895, -0.5605549812316895, -0.6095539927482605, 0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+ 0.3441790044307709, -0.8314369916915894, -0.4361799955368042, 0.2785939872264862, -0.6735119819641113, -0.6846650242805481,
+ 0.26487401127815247, -0.6403989791870117, -0.7209240198135376, 0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+ 0, -0.9978039860725403, -0.06623899936676025, 0, -0.9001820087432861, -0.4355129897594452,
+ 0, -0.7296109795570374, -0.6838629841804504, 0, -0.6939510107040405, -0.7200220227241516,
+ 0, -0.7939500212669373, -0.6079840064048767, 0, -0.9978039860725403, -0.06623899936676025,
+ -0.38175201416015625, -0.9218789935112, -0.06636899709701538, -0.3441790044307709, -0.8314369916915894, -0.4361799955368042,
+ 0, -0.9001820087432861, -0.4355129897594452, -0.2785939872264862, -0.6735119819641113, -0.6846650242805481,
+ 0, -0.7296109795570374, -0.6838629841804504, -0.26487401127815247, -0.6403989791870117, -0.7209240198135376,
+ 0, -0.6939510107040405, -0.7200220227241516, -0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+ 0, -0.7939500212669373, -0.6079840064048767, -0.7055429816246033, -0.7055429816246033, -0.06647899746894836,
+ -0.6360920071601868, -0.6360920071601868, -0.4367780089378357, -0.5149649977684021, -0.5149649977684021, -0.6852890253067017,
+ -0.48965099453926086, -0.48965099453926086, -0.7214459776878357, -0.5605549812316895, -0.5605549812316895, -0.6095539927482605,
+ -0.9218789935112, -0.38175201416015625, -0.06636899709701538, -0.8314369916915894, -0.3441790044307709, -0.4361799955368042,
+ -0.6735119819641113, -0.2785939872264862, -0.6846650242805481, -0.6403989791870117, -0.26487401127815247, -0.7209240198135376,
+ -0.7329490184783936, -0.303166002035141, -0.6089959740638733, -0.9978039860725403, 0, -0.06623899936676025,
+ -0.9001820087432861, 0, -0.4355129897594452, -0.7296109795570374, 0, -0.6838629841804504,
+ -0.6939510107040405, 0, -0.7200220227241516, -0.7939500212669373, 0, -0.6079840064048767,
+ -0.9978039860725403, 0, -0.06623899936676025, -0.9218789935112, 0.38175201416015625, -0.06636899709701538,
+ -0.8314369916915894, 0.3441790044307709, -0.4361799955368042, -0.9001820087432861, 0, -0.4355129897594452,
+ -0.6735119819641113, 0.2785939872264862, -0.6846650242805481, -0.7296109795570374, 0, -0.6838629841804504,
+ -0.6403989791870117, 0.26487401127815247, -0.7209240198135376, -0.6939510107040405, 0, -0.7200220227241516,
+ -0.7329490184783936, 0.303166002035141, -0.6089959740638733, -0.7939500212669373, 0, -0.6079840064048767,
+ -0.7055429816246033, 0.7055429816246033, -0.06647899746894836, -0.6360920071601868, 0.6360920071601868, -0.4367780089378357,
+ -0.5149649977684021, 0.5149649977684021, -0.6852890253067017, -0.48965099453926086, 0.48965099453926086, -0.7214459776878357,
+ -0.5605549812316895, 0.5605549812316895, -0.6095539927482605, -0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+ -0.3441790044307709, 0.8314369916915894, -0.4361799955368042, -0.2785939872264862, 0.6735119819641113, -0.6846650242805481,
+ -0.26487401127815247, 0.6403989791870117, -0.7209240198135376, -0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+ 0, 0.9978039860725403, -0.06623899936676025, 0, 0.9001820087432861, -0.4355129897594452,
+ 0, 0.7296109795570374, -0.6838629841804504, 0, 0.6939510107040405, -0.7200220227241516,
+ 0, 0.7939500212669373, -0.6079840064048767, 0, 0.9978039860725403, -0.06623899936676025,
+ 0.38175201416015625, 0.9218789935112, -0.06636899709701538, 0.3441790044307709, 0.8314369916915894, -0.4361799955368042,
+ 0, 0.9001820087432861, -0.4355129897594452, 0.2785939872264862, 0.6735119819641113, -0.6846650242805481,
+ 0, 0.7296109795570374, -0.6838629841804504, 0.26487401127815247, 0.6403989791870117, -0.7209240198135376,
+ 0, 0.6939510107040405, -0.7200220227241516, 0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+ 0, 0.7939500212669373, -0.6079840064048767, 0.7055429816246033, 0.7055429816246033, -0.06647899746894836,
+ 0.6360920071601868, 0.6360920071601868, -0.4367780089378357, 0.5149649977684021, 0.5149649977684021, -0.6852890253067017,
+ 0.48965099453926086, 0.48965099453926086, -0.7214459776878357, 0.5605549812316895, 0.5605549812316895, -0.6095539927482605,
+ 0.9218789935112, 0.38175201416015625, -0.06636899709701538, 0.8314369916915894, 0.3441790044307709, -0.4361799955368042,
+ 0.6735119819641113, 0.2785939872264862, -0.6846650242805481, 0.6403989791870117, 0.26487401127815247, -0.7209240198135376,
+ 0.7329490184783936, 0.303166002035141, -0.6089959740638733, 0.9978039860725403, 0, -0.06623899936676025,
+ 0.9001820087432861, 0, -0.4355129897594452, 0.7296109795570374, 0, -0.6838629841804504,
+ 0.6939510107040405, 0, -0.7200220227241516, 0.7939500212669373, 0, -0.6079840064048767,
+ 0.7939500212669373, 0, -0.6079840064048767, 0.7329490184783936, -0.303166002035141, -0.6089959740638733,
+ 0.576229989528656, -0.23821599781513214, -0.7818009853363037, 0.6238600015640259, 0, -0.7815359830856323,
+ 0.16362899541854858, -0.06752700358629227, -0.9842079877853394, 0.17729100584983826, 0, -0.984158992767334,
+ 0.04542100057005882, -0.018735000863671303, -0.9987919926643372, 0.04920699819922447, 0, -0.9987890124320984,
+ 0, 0, -1, 0, 0, -1,
+ 0.5605549812316895, -0.5605549812316895, -0.6095539927482605, 0.44041600823402405, -0.44041600823402405, -0.7823479771614075,
+ 0.12490200251340866, -0.12490200251340866, -0.9842759966850281, 0.034662000834941864, -0.034662000834941864, -0.9987980127334595,
+ 0, 0, -1, 0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+ 0.23821599781513214, -0.576229989528656, -0.7818009853363037, 0.06752700358629227, -0.16362899541854858, -0.9842079877853394,
+ 0.018735000863671303, -0.04542100057005882, -0.9987919926643372, 0, 0, -1,
+ 0, -0.7939500212669373, -0.6079840064048767, 0, -0.6238600015640259, -0.7815359830856323,
+ 0, -0.17729100584983826, -0.984158992767334, 0, -0.04920699819922447, -0.9987890124320984,
+ 0, 0, -1, 0, -0.7939500212669373, -0.6079840064048767,
+ -0.303166002035141, -0.7329490184783936, -0.6089959740638733, -0.23821599781513214, -0.576229989528656, -0.7818009853363037,
+ 0, -0.6238600015640259, -0.7815359830856323, -0.06752700358629227, -0.16362899541854858, -0.9842079877853394,
+ 0, -0.17729100584983826, -0.984158992767334, -0.018735000863671303, -0.04542100057005882, -0.9987919926643372,
+ 0, -0.04920699819922447, -0.9987890124320984, 0, 0, -1,
+ 0, 0, -1, -0.5605549812316895, -0.5605549812316895, -0.6095539927482605,
+ -0.44041600823402405, -0.44041600823402405, -0.7823479771614075, -0.12490200251340866, -0.12490200251340866, -0.9842759966850281,
+ -0.034662000834941864, -0.034662000834941864, -0.9987980127334595, 0, 0, -1,
+ -0.7329490184783936, -0.303166002035141, -0.6089959740638733, -0.576229989528656, -0.23821599781513214, -0.7818009853363037,
+ -0.16362899541854858, -0.06752700358629227, -0.9842079877853394, -0.04542100057005882, -0.018735000863671303, -0.9987919926643372,
+ 0, 0, -1, -0.7939500212669373, 0, -0.6079840064048767,
+ -0.6238600015640259, 0, -0.7815359830856323, -0.17729100584983826, 0, -0.984158992767334,
+ -0.04920699819922447, 0, -0.9987890124320984, 0, 0, -1,
+ -0.7939500212669373, 0, -0.6079840064048767, -0.7329490184783936, 0.303166002035141, -0.6089959740638733,
+ -0.576229989528656, 0.23821599781513214, -0.7818009853363037, -0.6238600015640259, 0, -0.7815359830856323,
+ -0.16362899541854858, 0.06752700358629227, -0.9842079877853394, -0.17729100584983826, 0, -0.984158992767334,
+ -0.04542100057005882, 0.018735000863671303, -0.9987919926643372, -0.04920699819922447, 0, -0.9987890124320984,
+ 0, 0, -1, 0, 0, -1,
+ -0.5605549812316895, 0.5605549812316895, -0.6095539927482605, -0.44041600823402405, 0.44041600823402405, -0.7823479771614075,
+ -0.12490200251340866, 0.12490200251340866, -0.9842759966850281, -0.034662000834941864, 0.034662000834941864, -0.9987980127334595,
+ 0, 0, -1, -0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+ -0.23821599781513214, 0.576229989528656, -0.7818009853363037, -0.06752700358629227, 0.16362899541854858, -0.9842079877853394,
+ -0.018735000863671303, 0.04542100057005882, -0.9987919926643372, 0, 0, -1,
+ 0, 0.7939500212669373, -0.6079840064048767, 0, 0.6238600015640259, -0.7815359830856323,
+ 0, 0.17729100584983826, -0.984158992767334, 0, 0.04920699819922447, -0.9987890124320984,
+ 0, 0, -1, 0, 0.7939500212669373, -0.6079840064048767,
+ 0.303166002035141, 0.7329490184783936, -0.6089959740638733, 0.23821599781513214, 0.576229989528656, -0.7818009853363037,
+ 0, 0.6238600015640259, -0.7815359830856323, 0.06752700358629227, 0.16362899541854858, -0.9842079877853394,
+ 0, 0.17729100584983826, -0.984158992767334, 0.018735000863671303, 0.04542100057005882, -0.9987919926643372,
+ 0, 0.04920699819922447, -0.9987890124320984, 0, 0, -1,
+ 0, 0, -1, 0.5605549812316895, 0.5605549812316895, -0.6095539927482605,
+ 0.44041600823402405, 0.44041600823402405, -0.7823479771614075, 0.12490200251340866, 0.12490200251340866, -0.9842759966850281,
+ 0.034662000834941864, 0.034662000834941864, -0.9987980127334595, 0, 0, -1,
+ 0.7329490184783936, 0.303166002035141, -0.6089959740638733, 0.576229989528656, 0.23821599781513214, -0.7818009853363037,
+ 0.16362899541854858, 0.06752700358629227, -0.9842079877853394, 0.04542100057005882, 0.018735000863671303, -0.9987919926643372,
+ 0, 0, -1, 0.7939500212669373, 0, -0.6079840064048767,
+ 0.6238600015640259, 0, -0.7815359830856323, 0.17729100584983826, 0, -0.984158992767334,
+ 0.04920699819922447, 0, -0.9987890124320984, 0, 0, -1,
+ 0.007784999907016754, 0.00021499999274965376, -0.999970018863678, 0.007038000039756298, -0.5829259753227234, -0.8124949932098389,
+ 0.0361270010471344, -0.5456140041351318, -0.837257981300354, 0.03913800045847893, 0.0009879999561235309, -0.9992330074310303,
+ 0.16184599697589874, -0.5630490183830261, -0.8104209899902344, 0.17951199412345886, 0.0043680001981556416, -0.9837459921836853,
+ 0.4823650121688843, -0.6427459716796875, -0.5951480269432068, 0.6122999787330627, 0.010459000244736671, -0.790556013584137,
+ 0.7387199997901917, -0.6641989946365356, -0.11459299921989441, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+ -0.0019079999765381217, -0.9867690205574036, 0.1621209979057312, 0.002761000068858266, -0.9998499751091003, 0.017105000093579292,
+ 0.010532000102102757, -0.9972469806671143, 0.07339800149202347, -0.06604000180959702, -0.9893029928207397, 0.13006900250911713,
+ -0.09442699700593948, -0.9953929781913757, 0.016594000160694122, -0.009201999753713608, -0.4902929961681366, 0.8715090155601501,
+ -0.04860600084066391, -0.5394579768180847, 0.8406090140342712, -0.22329799830913544, -0.5527390241622925, 0.8028810024261475,
+ -0.5963649749755859, -0.5751349925994873, 0.5599709749221802, -0.8033369779586792, -0.5916029810905457, 0.06823500245809555,
+ -0.01056000031530857, -0.00010299999848939478, 0.9999439716339111, -0.05879800021648407, -0.0007089999853633344, 0.9982699751853943,
+ -0.28071001172065735, -0.0032679999712854624, 0.9597870111465454, -0.7497230172157288, -0.004267000127583742, 0.6617379784584045,
+ -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.01056000031530857, -0.00010299999848939478, 0.9999439716339111,
+ -0.008791999891400337, 0.49032899737358093, 0.8714929819107056, -0.04649300128221512, 0.5387560129165649, 0.8411779999732971,
+ -0.05879800021648407, -0.0007089999853633344, 0.9982699751853943, -0.21790899336338043, 0.5491610169410706, 0.8068069815635681,
+ -0.28071001172065735, -0.0032679999712854624, 0.9597870111465454, -0.5972909927368164, 0.5741199851036072, 0.560027003288269,
+ -0.7497230172157288, -0.004267000127583742, 0.6617379784584045, -0.8040000200271606, 0.5912910103797913, 0.0629120022058487,
+ -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.0018050000071525574, 0.986840009689331, 0.16169099509716034,
+ 0.0020310000982135534, 0.999891996383667, 0.014553000219166279, 0.009215000085532665, 0.9981520175933838, 0.060068998485803604,
+ -0.059335000813007355, 0.9917230010032654, 0.11386600136756897, -0.08690100163221359, 0.9961410164833069, 0.01228999998420477,
+ 0.006417000200599432, 0.5830950140953064, -0.812379002571106, 0.03378299996256828, 0.5453730225563049, -0.8375130295753479,
+ 0.1571130007505417, 0.562188982963562, -0.8119469881057739, 0.4844059944152832, 0.6465290188789368, -0.5893650054931641,
+ 0.7388700246810913, 0.6661880016326904, -0.10131999850273132, 0.007784999907016754, 0.00021499999274965376, -0.999970018863678,
+ 0.03913800045847893, 0.0009879999561235309, -0.9992330074310303, 0.17951199412345886, 0.0043680001981556416, -0.9837459921836853,
+ 0.6122999787330627, 0.010459000244736671, -0.790556013584137, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+ 0.9861519932746887, 0.006668999791145325, -0.16570700705051422, 0.7387199997901917, -0.6641989946365356, -0.11459299921989441,
+ 0.7256090044975281, -0.6373609900474548, 0.25935098528862, 0.94651198387146, 0.0033569999504834414, 0.3226499855518341,
+ 0.6459450125694275, -0.6077200174331665, 0.46198800206184387, 0.8258299827575684, 0.007451999932527542, 0.5638700127601624,
+ 0.5316150188446045, -0.5586140155792236, 0.6366599798202515, 0.6500110030174255, 0.006936000194400549, 0.759893000125885,
+ 0.4249640107154846, -0.5955389738082886, 0.6817179918289185, 0.5324289798736572, 0.005243999883532524, 0.8464580178260803,
+ -0.09442699700593948, -0.9953929781913757, 0.016594000160694122, -0.04956100136041641, -0.9985759854316711, -0.01975500024855137,
+ -0.03781700134277344, -0.998649001121521, -0.035624999552965164, -0.0379129983484745, -0.9986140131950378, -0.03651199862360954,
+ -0.1688539981842041, -0.9395300149917603, -0.2979460060596466, -0.8033369779586792, -0.5916029810905457, 0.06823500245809555,
+ -0.7423409819602966, -0.5995240211486816, -0.2991659939289093, -0.6196020245552063, -0.5795029997825623, -0.5294060111045837,
+ -0.483707994222641, -0.5438370108604431, -0.6857600212097168, -0.44529199600219727, -0.4131770133972168, -0.7943549752235413,
+ -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.9265130162239075, -0.0019950000569224358, -0.3762570023536682,
+ -0.7539200186729431, -0.004317000042647123, -0.6569520235061646, -0.5662239789962769, -0.003461000043898821, -0.8242440223693848,
+ -0.4818040132522583, -0.0018500000005587935, -0.8762770295143127, -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288,
+ -0.8040000200271606, 0.5912910103797913, 0.0629120022058487, -0.7446749806404114, 0.5989770293235779, -0.29442399740219116,
+ -0.9265130162239075, -0.0019950000569224358, -0.3762570023536682, -0.6219490170478821, 0.5781649947166443, -0.5281140208244324,
+ -0.7539200186729431, -0.004317000042647123, -0.6569520235061646, -0.48117101192474365, 0.5428280234336853, -0.6883400082588196,
+ -0.5662239789962769, -0.003461000043898821, -0.8242440223693848, -0.43805500864982605, 0.41574400663375854, -0.7970349788665771,
+ -0.4818040132522583, -0.0018500000005587935, -0.8762770295143127, -0.08690100163221359, 0.9961410164833069, 0.01228999998420477,
+ -0.04433799907565117, 0.9988710284233093, -0.017055999487638474, -0.026177000254392624, 0.9992600083351135, -0.02816700004041195,
+ -0.025293000042438507, 0.9992780089378357, -0.028332000598311424, -0.15748199820518494, 0.9441670179367065, -0.28939300775527954,
+ 0.7388700246810913, 0.6661880016326904, -0.10131999850273132, 0.7282440066337585, 0.63714200258255, 0.25240999460220337,
+ 0.6470540165901184, 0.6082550287246704, 0.4597249925136566, 0.5229939818382263, 0.5621700286865234, 0.6406570076942444,
+ 0.4099780023097992, 0.6046689748764038, 0.6828569769859314, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+ 0.94651198387146, 0.0033569999504834414, 0.3226499855518341, 0.8258299827575684, 0.007451999932527542, 0.5638700127601624,
+ 0.6500110030174255, 0.006936000194400549, 0.759893000125885, 0.5324289798736572, 0.005243999883532524, 0.8464580178260803,
+ -0.230786994099617, 0.006523000076413155, 0.9729819893836975, -0.15287800133228302, -0.7101899981498718, 0.6872109770774841,
+ -0.31672099232673645, -0.7021129727363586, 0.6377500295639038, -0.5489360094070435, 0.0015109999803826213, 0.8358629941940308,
+ -0.6010670065879822, -0.645330011844635, 0.471451997756958, -0.8756710290908813, -0.009891999885439873, 0.4828070104122162,
+ -0.635890007019043, -0.629800021648407, 0.4460900127887726, -0.8775539994239807, -0.01909100078046322, 0.47909700870513916,
+ -0.4357450008392334, -0.670009970664978, 0.6010090112686157, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+ 0.11111299693584442, -0.9901599884033203, -0.08506900072097778, 0.22330999374389648, -0.9747260212898254, 0.006539999973028898,
+ 0.19009700417518616, -0.9694579839706421, 0.15496399998664856, 0.005270000081509352, -0.9818699955940247, 0.18948200345039368,
+ -0.011750999838113785, -0.9690240025520325, 0.24668699502944946, 0.3439059853553772, -0.5994120240211487, -0.7227950096130371,
+ 0.5724899768829346, -0.5916270017623901, -0.5676559805870056, 0.7874360084533691, -0.5605109930038452, -0.2564600110054016,
+ 0.6470969915390015, -0.6981409788131714, -0.3063740134239197, 0.4275279939174652, -0.7535750269889832, -0.49934399127960205,
+ 0.4109260141849518, -0.0012839999981224537, -0.9116680026054382, 0.6715199947357178, 0.0008989999769255519, -0.7409859895706177,
+ 0.9220259785652161, 0.00725199980661273, -0.3870599865913391, 0.8469099998474121, 0.01385399978607893, -0.5315560102462769,
+ 0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.4109260141849518, -0.0012839999981224537, -0.9116680026054382,
+ 0.3411880135536194, 0.6009309887886047, -0.7228230237960815, 0.5786640048027039, 0.591838002204895, -0.5611389875411987,
+ 0.6715199947357178, 0.0008989999769255519, -0.7409859895706177, 0.7848690152168274, 0.5665420293807983, -0.25102001428604126,
+ 0.9220259785652161, 0.00725199980661273, -0.3870599865913391, 0.6426810026168823, 0.7039899826049805, -0.3022570013999939,
+ 0.8469099998474121, 0.01385399978607893, -0.5315560102462769, 0.4185889959335327, 0.7581170201301575, -0.5000420212745667,
+ 0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.11580599844455719, 0.9901139736175537, -0.07913900166749954,
+ 0.23281100392341614, 0.9724410176277161, 0.012564999982714653, 0.20666299760341644, 0.9662799835205078, 0.15360000729560852,
+ 0.02449899911880493, 0.9865779876708984, 0.16144299507141113, 0.0033809999004006386, 0.9774550199508667, 0.2111150026321411,
+ -0.13491199910640717, 0.7135509848594666, 0.6874909996986389, -0.31953999400138855, 0.7050619721412659, 0.6330729722976685,
+ -0.6039019823074341, 0.6499029994010925, 0.4614419937133789, -0.6318150162696838, 0.6400719881057739, 0.43716898560523987,
+ -0.4243049919605255, 0.6667500138282776, 0.6127070188522339, -0.230786994099617, 0.006523000076413155, 0.9729819893836975,
+ -0.5489360094070435, 0.0015109999803826213, 0.8358629941940308, -0.8756710290908813, -0.009891999885439873, 0.4828070104122162,
+ -0.8775539994239807, -0.01909100078046322, 0.47909700870513916, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+ -0.6961889863014221, -0.02449600026011467, 0.7174400091171265, -0.4357450008392334, -0.670009970664978, 0.6010090112686157,
+ -0.25985801219940186, -0.5525479912757874, 0.7919380068778992, -0.42579901218414307, -0.010804999619722366, 0.9047530293464661,
+ 0.009537000209093094, 0.021669000387191772, 0.9997199773788452, 0.022041000425815582, -0.001623000018298626, 0.9997559785842896,
+ 0.4101540148258209, 0.8490809798240662, 0.3329179883003235, 0.9995980262756348, -0.01155600044876337, 0.02587899938225746,
+ 0.5415220260620117, 0.6370009779930115, -0.5486199855804443, 0.7095860242843628, -0.009670999832451344, -0.7045519948005676,
+ -0.011750999838113785, -0.9690240025520325, 0.24668699502944946, 0.046310000121593475, -0.8891720175743103, 0.45522499084472656,
+ -0.010688000358641148, -0.14889900386333466, 0.9887949824333191, -0.04437499865889549, 0.7291200160980225, 0.6829460263252258,
+ 0.12282499670982361, 0.9923850297927856, 0.009232000447809696, 0.4275279939174652, -0.7535750269889832, -0.49934399127960205,
+ 0.48183900117874146, -0.857479989528656, -0.18044300377368927, 0.45527198910713196, -0.49992498755455017, 0.7367510199546814,
+ -0.22054199874401093, 0.3582780063152313, 0.9071930050849915, -0.23591899871826172, 0.7157959938049316, 0.6572499871253967,
+ 0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.7280910015106201, 0.015584999695420265, -0.6853029727935791,
+ 0.8887389898300171, 0.016679000109434128, 0.4581089913845062, -0.26009801030158997, -0.0007999999797903001, 0.965582013130188,
+ -0.37161099910736084, 0.004416999872773886, 0.9283779859542847, 0.5359240174293518, 0.010503999888896942, -0.8442010283470154,
+ 0.4185889959335327, 0.7581170201301575, -0.5000420212745667, 0.4801650047302246, 0.8588529825210571, -0.17836299538612366,
+ 0.7280910015106201, 0.015584999695420265, -0.6853029727935791, 0.4881030023097992, 0.49794700741767883, 0.7168020009994507,
+ 0.8887389898300171, 0.016679000109434128, 0.4581089913845062, -0.2220049947500229, -0.36189401149749756, 0.9053990244865417,
+ -0.26009801030158997, -0.0007999999797903001, 0.965582013130188, -0.23540399968624115, -0.7104769945144653, 0.6631799936294556,
+ -0.37161099910736084, 0.004416999872773886, 0.9283779859542847, 0.0033809999004006386, 0.9774550199508667, 0.2111150026321411,
+ 0.058719001710414886, 0.8971999883651733, 0.437703013420105, 0.0013249999610707164, 0.164000004529953, 0.9864590167999268,
+ -0.04418899863958359, -0.7303190231323242, 0.6816750168800354, 0.13880200684070587, -0.9897300004959106, -0.034189000725746155,
+ -0.4243049919605255, 0.6667500138282776, 0.6127070188522339, -0.25888898968696594, 0.5453789830207825, 0.7972059845924377,
+ 0.012268000282347202, -0.01928500086069107, 0.9997389912605286, 0.3986299932003021, -0.8456630110740662, 0.3548929989337921,
+ 0.5375639796257019, -0.6107370257377625, -0.5813990235328674, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+ -0.42579901218414307, -0.010804999619722366, 0.9047530293464661, 0.022041000425815582, -0.001623000018298626, 0.9997559785842896,
+ 0.9995980262756348, -0.01155600044876337, 0.02587899938225746, 0.7095860242843628, -0.009670999832451344, -0.7045519948005676,
+ 0, 0, 1, 0, 0, 1,
+ 0.7626410126686096, -0.31482499837875366, 0.5650339722633362, 0.8245400190353394, -0.00001700000029813964, 0.5658029913902283,
+ 0.8479819893836975, -0.3500339984893799, -0.39799800515174866, 0.917701005935669, -0.00003300000025774352, -0.397271990776062,
+ 0.8641409873962402, -0.35644200444221497, -0.3552600145339966, 0.9352689981460571, -0.00011200000153621659, -0.3539389967918396,
+ 0.7209920287132263, -0.29793301224708557, 0.6256250143051147, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+ 0, 0, 1, 0.5833569765090942, -0.5833380222320557, 0.5651649832725525,
+ 0.648485004901886, -0.6484479904174805, -0.3987259864807129, 0.6608719825744629, -0.6607480049133301, -0.35589399933815,
+ 0.5518630146980286, -0.5517799854278564, 0.6252880096435547, 0, 0, 1,
+ 0.31482499837875366, -0.762628972530365, 0.5650510191917419, 0.35004499554634094, -0.8479880094528198, -0.39797601103782654,
+ 0.35647401213645935, -0.8641520142555237, -0.35519900918006897, 0.29798200726509094, -0.7210670113563538, 0.6255149841308594,
+ 0, 0, 1, -0.00001700000029813964, -0.8245400190353394, 0.5658029913902283,
+ -0.00003300000025774352, -0.917701005935669, -0.397271990776062, -0.00011200000153621659, -0.9352689981460571, -0.3539389967918396,
+ -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+ 0, 0, 1, -0.31482499837875366, -0.7626410126686096, 0.5650339722633362,
+ -0.00001700000029813964, -0.8245400190353394, 0.5658029913902283, -0.3500339984893799, -0.8479819893836975, -0.39799800515174866,
+ -0.00003300000025774352, -0.917701005935669, -0.397271990776062, -0.35644200444221497, -0.8641409873962402, -0.3552600145339966,
+ -0.00011200000153621659, -0.9352689981460571, -0.3539389967918396, -0.29793301224708557, -0.7209920287132263, 0.6256250143051147,
+ -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+ -0.5833380222320557, -0.5833569765090942, 0.5651649832725525, -0.6484479904174805, -0.648485004901886, -0.3987259864807129,
+ -0.6607480049133301, -0.6608719825744629, -0.35589399933815, -0.5517799854278564, -0.5518630146980286, 0.6252880096435547,
+ 0, 0, 1, -0.762628972530365, -0.31482499837875366, 0.5650510191917419,
+ -0.8479880094528198, -0.35004499554634094, -0.39797601103782654, -0.8641520142555237, -0.35647401213645935, -0.35519900918006897,
+ -0.7210670113563538, -0.29798200726509094, 0.6255149841308594, 0, 0, 1,
+ -0.8245400190353394, 0.00001700000029813964, 0.5658029913902283, -0.917701005935669, 0.00003300000025774352, -0.397271990776062,
+ -0.9352689981460571, 0.00011200000153621659, -0.3539389967918396, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+ 0, 0, 1, 0, 0, 1,
+ -0.7626410126686096, 0.31482499837875366, 0.5650339722633362, -0.8245400190353394, 0.00001700000029813964, 0.5658029913902283,
+ -0.8479819893836975, 0.3500339984893799, -0.39799800515174866, -0.917701005935669, 0.00003300000025774352, -0.397271990776062,
+ -0.8641409873962402, 0.35644200444221497, -0.3552600145339966, -0.9352689981460571, 0.00011200000153621659, -0.3539389967918396,
+ -0.7209920287132263, 0.29793301224708557, 0.6256250143051147, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+ 0, 0, 1, -0.5833569765090942, 0.5833380222320557, 0.5651649832725525,
+ -0.648485004901886, 0.6484479904174805, -0.3987259864807129, -0.6608719825744629, 0.6607480049133301, -0.35589399933815,
+ -0.5518630146980286, 0.5517799854278564, 0.6252880096435547, 0, 0, 1,
+ -0.31482499837875366, 0.762628972530365, 0.5650510191917419, -0.35004499554634094, 0.8479880094528198, -0.39797601103782654,
+ -0.35647401213645935, 0.8641520142555237, -0.35519900918006897, -0.29798200726509094, 0.7210670113563538, 0.6255149841308594,
+ 0, 0, 1, 0.00001700000029813964, 0.8245400190353394, 0.5658029913902283,
+ 0.00003300000025774352, 0.917701005935669, -0.397271990776062, 0.00011200000153621659, 0.9352689981460571, -0.3539389967918396,
+ 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+ 0, 0, 1, 0.31482499837875366, 0.7626410126686096, 0.5650339722633362,
+ 0.00001700000029813964, 0.8245400190353394, 0.5658029913902283, 0.3500339984893799, 0.8479819893836975, -0.39799800515174866,
+ 0.00003300000025774352, 0.917701005935669, -0.397271990776062, 0.35644200444221497, 0.8641409873962402, -0.3552600145339966,
+ 0.00011200000153621659, 0.9352689981460571, -0.3539389967918396, 0.29793301224708557, 0.7209920287132263, 0.6256250143051147,
+ 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+ 0.5833380222320557, 0.5833569765090942, 0.5651649832725525, 0.6484479904174805, 0.648485004901886, -0.3987259864807129,
+ 0.6607480049133301, 0.6608719825744629, -0.35589399933815, 0.5517799854278564, 0.5518630146980286, 0.6252880096435547,
+ 0, 0, 1, 0.762628972530365, 0.31482499837875366, 0.5650510191917419,
+ 0.8479880094528198, 0.35004499554634094, -0.39797601103782654, 0.8641520142555237, 0.35647401213645935, -0.35519900918006897,
+ 0.7210670113563538, 0.29798200726509094, 0.6255149841308594, 0, 0, 1,
+ 0.8245400190353394, -0.00001700000029813964, 0.5658029913902283, 0.917701005935669, -0.00003300000025774352, -0.397271990776062,
+ 0.9352689981460571, -0.00011200000153621659, -0.3539389967918396, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+ 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058, 0.7209920287132263, -0.29793301224708557, 0.6256250143051147,
+ 0.21797800064086914, -0.0902160033583641, 0.9717749953269958, 0.23658299446105957, 0, 0.9716110229492188,
+ 0.1595889925956726, -0.06596100330352783, 0.9849770069122314, 0.17308400571346283, 0, 0.9849069714546204,
+ 0.3504979908466339, -0.1447400003671646, 0.9253119826316833, 0.37970298528671265, 0, 0.925108015537262,
+ 0.48558899760246277, -0.20147399604320526, 0.8506529927253723, 0.5266720056533813, 0, 0.8500679731369019,
+ 0.5518630146980286, -0.5517799854278564, 0.6252880096435547, 0.16663099825382233, -0.16663099825382233, 0.9718379974365234,
+ 0.12190800160169601, -0.12190800160169601, 0.9850260019302368, 0.2676680088043213, -0.2676680088043213, 0.9255849719047546,
+ 0.37131500244140625, -0.37131500244140625, 0.8510289788246155, 0.29798200726509094, -0.7210670113563538, 0.6255149841308594,
+ 0.0902160033583641, -0.21797800064086914, 0.9717749953269958, 0.06596100330352783, -0.1595889925956726, 0.9849770069122314,
+ 0.1447400003671646, -0.3504979908466339, 0.9253119826316833, 0.20147399604320526, -0.48558899760246277, 0.8506529927253723,
+ -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, -0.23658299446105957, 0.9716110229492188,
+ 0, -0.17308400571346283, 0.9849069714546204, 0, -0.37970298528671265, 0.925108015537262,
+ 0, -0.5266720056533813, 0.8500679731369019, -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894,
+ -0.29793301224708557, -0.7209920287132263, 0.6256250143051147, -0.0902160033583641, -0.21797800064086914, 0.9717749953269958,
+ 0, -0.23658299446105957, 0.9716110229492188, -0.06596100330352783, -0.1595889925956726, 0.9849770069122314,
+ 0, -0.17308400571346283, 0.9849069714546204, -0.1447400003671646, -0.3504979908466339, 0.9253119826316833,
+ 0, -0.37970298528671265, 0.925108015537262, -0.20147399604320526, -0.48558899760246277, 0.8506529927253723,
+ 0, -0.5266720056533813, 0.8500679731369019, -0.5517799854278564, -0.5518630146980286, 0.6252880096435547,
+ -0.16663099825382233, -0.16663099825382233, 0.9718379974365234, -0.12190800160169601, -0.12190800160169601, 0.9850260019302368,
+ -0.2676680088043213, -0.2676680088043213, 0.9255849719047546, -0.37131500244140625, -0.37131500244140625, 0.8510289788246155,
+ -0.7210670113563538, -0.29798200726509094, 0.6255149841308594, -0.21797800064086914, -0.0902160033583641, 0.9717749953269958,
+ -0.1595889925956726, -0.06596100330352783, 0.9849770069122314, -0.3504979908466339, -0.1447400003671646, 0.9253119826316833,
+ -0.48558899760246277, -0.20147399604320526, 0.8506529927253723, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+ -0.23658299446105957, 0, 0.9716110229492188, -0.17308400571346283, 0, 0.9849069714546204,
+ -0.37970298528671265, 0, 0.925108015537262, -0.5266720056533813, 0, 0.8500679731369019,
+ -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894, -0.7209920287132263, 0.29793301224708557, 0.6256250143051147,
+ -0.21797800064086914, 0.0902160033583641, 0.9717749953269958, -0.23658299446105957, 0, 0.9716110229492188,
+ -0.1595889925956726, 0.06596100330352783, 0.9849770069122314, -0.17308400571346283, 0, 0.9849069714546204,
+ -0.3504979908466339, 0.1447400003671646, 0.9253119826316833, -0.37970298528671265, 0, 0.925108015537262,
+ -0.48558899760246277, 0.20147399604320526, 0.8506529927253723, -0.5266720056533813, 0, 0.8500679731369019,
+ -0.5518630146980286, 0.5517799854278564, 0.6252880096435547, -0.16663099825382233, 0.16663099825382233, 0.9718379974365234,
+ -0.12190800160169601, 0.12190800160169601, 0.9850260019302368, -0.2676680088043213, 0.2676680088043213, 0.9255849719047546,
+ -0.37131500244140625, 0.37131500244140625, 0.8510289788246155, -0.29798200726509094, 0.7210670113563538, 0.6255149841308594,
+ -0.0902160033583641, 0.21797800064086914, 0.9717749953269958, -0.06596100330352783, 0.1595889925956726, 0.9849770069122314,
+ -0.1447400003671646, 0.3504979908466339, 0.9253119826316833, -0.20147399604320526, 0.48558899760246277, 0.8506529927253723,
+ 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0.23658299446105957, 0.9716110229492188,
+ 0, 0.17308400571346283, 0.9849069714546204, 0, 0.37970298528671265, 0.925108015537262,
+ 0, 0.5266720056533813, 0.8500679731369019, 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894,
+ 0.29793301224708557, 0.7209920287132263, 0.6256250143051147, 0.0902160033583641, 0.21797800064086914, 0.9717749953269958,
+ 0, 0.23658299446105957, 0.9716110229492188, 0.06596100330352783, 0.1595889925956726, 0.9849770069122314,
+ 0, 0.17308400571346283, 0.9849069714546204, 0.1447400003671646, 0.3504979908466339, 0.9253119826316833,
+ 0, 0.37970298528671265, 0.925108015537262, 0.20147399604320526, 0.48558899760246277, 0.8506529927253723,
+ 0, 0.5266720056533813, 0.8500679731369019, 0.5517799854278564, 0.5518630146980286, 0.6252880096435547,
+ 0.16663099825382233, 0.16663099825382233, 0.9718379974365234, 0.12190800160169601, 0.12190800160169601, 0.9850260019302368,
+ 0.2676680088043213, 0.2676680088043213, 0.9255849719047546, 0.37131500244140625, 0.37131500244140625, 0.8510289788246155,
+ 0.7210670113563538, 0.29798200726509094, 0.6255149841308594, 0.21797800064086914, 0.0902160033583641, 0.9717749953269958,
+ 0.1595889925956726, 0.06596100330352783, 0.9849770069122314, 0.3504979908466339, 0.1447400003671646, 0.9253119826316833,
+ 0.48558899760246277, 0.20147399604320526, 0.8506529927253723, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+ 0.23658299446105957, 0, 0.9716110229492188, 0.17308400571346283, 0, 0.9849069714546204,
+ 0.37970298528671265, 0, 0.925108015537262, 0.5266720056533813, 0, 0.8500679731369019 };
+
+float teapotTangents[] = { 0.012897999957203865, 0.998727023601532, -0.048757001757621765, 0.3861910104751587, 0.9210079908370972, -0.016421999782323837,
+ 0.38136398792266846, 0.9230089783668518, 0.000155999994603917, 0.012866999953985214, 0.9987300038337708, 0.04870200157165527,
+ 0.3750790059566498, 0.9061710238456726, -0.0007169999880716205, 0.19210100173950195, 0.9812139868736267, 0.01775900088250637,
+ 0.3782620131969452, 0.9142940044403076, -0.00011300000187475234, 0.10451500117778778, 0.9897350072860718, -0.09747499972581863,
+ 0.3655939996242523, 0.9257190227508545, 0.028463000431656837, 0.04767199978232384, 0.9953050017356873, -0.08423800021409988,
+ 0.7092679738998413, 0.7031199932098389, -0.016364000737667084, 0.7061989903450012, 0.7061989903450012, 0,
+ 0.6937360167503357, 0.6937360167503357, 0, 0.6997770071029663, 0.6997770071029663, 0,
+ 0.6924030184745789, 0.7150859832763672, 0.02822900004684925, 0.9243540167808533, 0.37810400128364563, -0.01657800003886223,
+ 0.9230089783668518, 0.38136398792266846, -0.000155999994603917, 0.9061710238456726, 0.3750790059566498, 0.0007169999880716205,
+ 0.9142940044403076, 0.3782620131969452, 0.00011300000187475234, 0.9133660197257996, 0.39544400572776794, 0.028490999713540077,
+ 0.9987040162086487, 0.015853000804781914, 0.04836999997496605, 0.9987369775772095, 0.014649000018835068, -0.04806999862194061,
+ 0.9812150001525879, 0.19211700558662415, -0.01754000037908554, 0.9897350072860718, 0.10452800244092941, 0.09745799750089645,
+ 0.9953050017356873, 0.04767199978232384, 0.08423800021409988, 0.9988179802894592, -0.009758999571204185, -0.047600001096725464,
+ 0.9094679951667786, -0.4095839858055115, -0.012636999599635601, 0.9240090250968933, -0.3811509907245636, -0.0003150000120513141,
+ 0.9987890124320984, -0.01066299993544817, 0.04801800101995468, 0.9072269797325134, -0.37142300605773926, 0.0207310002297163,
+ 0.9814350008964539, -0.19095200300216675, 0.01795700006186962, 0.914870023727417, -0.3771440088748932, -0.0011480000102892518,
+ 0.989749014377594, -0.10442499816417694, -0.09742700308561325, 0.925815999507904, -0.3653950095176697, 0.028308000415563583,
+ 0.9953050017356873, -0.04767199978232384, -0.08423800021409988, 0.6768929958343506, -0.7314029932022095, -0.01988700032234192,
+ 0.6994619965553284, -0.7145140171051025, -0.00029799999902024865, 0.6940590143203735, -0.6933979988098145, 0.015560000203549862,
+ 0.7002580165863037, -0.6996300220489502, -0.000783999974373728, 0.715142011642456, -0.6923869848251343, 0.028078999370336533,
+ 0.351936012506485, -0.933899998664856, -0.019843999296426773, 0.36654001474380493, -0.9298419952392578, -0.0005210000090301037,
+ 0.37116900086402893, -0.9084830284118652, 0.00152299995534122, 0.3776479959487915, -0.9147650003433228, -0.00011000000085914508,
+ 0.39533698558807373, -0.9134349822998047, 0.028410999104380608, 0.0013210000470280647, -0.9989479780197144, 0.045830998569726944,
+ 0.003897000104188919, -0.9988909959793091, -0.04690299928188324, 0.18705999851226807, -0.9821630120277405, -0.018818000331521034,
+ 0.10363999754190445, -0.9898579716682434, 0.09715499728918076, 0.04757700115442276, -0.9953129887580872, 0.08418799936771393,
+ -0.02296699956059456, -0.9986780285835266, -0.04599199816584587, -0.3861910104751587, -0.9210079908370972, -0.016421999782323837,
+ -0.38136398792266846, -0.9230089783668518, 0.000155999994603917, -0.020431000739336014, -0.9987260103225708, 0.04614400118589401,
+ -0.3750790059566498, -0.9061710238456726, -0.0007169999880716205, -0.19216600060462952, -0.9812189936637878, 0.01677200011909008,
+ -0.3782620131969452, -0.9142940044403076, -0.00011300000187475234, -0.10471200197935104, -0.9897390007972717, -0.09722500294446945,
+ -0.3655939996242523, -0.9257190227508545, 0.028463000431656837, -0.047710999846458435, -0.9953050017356873, -0.08420699834823608,
+ -0.7092679738998413, -0.7031199932098389, -0.016364000737667084, -0.7061989903450012, -0.7061989903450012, 0,
+ -0.6937360167503357, -0.6937360167503357, 0, -0.6997770071029663, -0.6997770071029663, 0,
+ -0.6924030184745789, -0.7150859832763672, 0.02822900004684925, -0.9243540167808533, -0.37810400128364563, -0.01657800003886223,
+ -0.9230089783668518, -0.38136398792266846, -0.000155999994603917, -0.9061710238456726, -0.3750790059566498, 0.0007169999880716205,
+ -0.9142940044403076, -0.3782620131969452, 0.00011300000187475234, -0.9133660197257996, -0.39544400572776794, 0.028490999713540077,
+ -0.998727023601532, -0.012897999957203865, 0.048757001757621765, -0.9987300038337708, -0.012866999953985214, -0.04870200157165527,
+ -0.9812139868736267, -0.19210100173950195, -0.01775900088250637, -0.9897350072860718, -0.10451500117778778, 0.09747499972581863,
+ -0.9953050017356873, -0.04767199978232384, 0.08423800021409988, -0.998727023601532, 0.012897999957203865, -0.048757001757621765,
+ -0.9210079908370972, 0.3861910104751587, -0.016421999782323837, -0.9230089783668518, 0.38136398792266846, 0.000155999994603917,
+ -0.9987300038337708, 0.012866999953985214, 0.04870200157165527, -0.9061710238456726, 0.3750790059566498, -0.0007169999880716205,
+ -0.9812139868736267, 0.19210100173950195, 0.01775900088250637, -0.9142940044403076, 0.3782620131969452, -0.00011300000187475234,
+ -0.9897350072860718, 0.10451500117778778, -0.09747499972581863, -0.9257190227508545, 0.3655939996242523, 0.028463000431656837,
+ -0.9953050017356873, 0.04767199978232384, -0.08423800021409988, -0.7031199932098389, 0.7092679738998413, -0.016364000737667084,
+ -0.7061989903450012, 0.7061989903450012, 0, -0.6937360167503357, 0.6937360167503357, 0,
+ -0.6997770071029663, 0.6997770071029663, 0, -0.7150859832763672, 0.6924030184745789, 0.02822900004684925,
+ -0.37810400128364563, 0.9243540167808533, -0.01657800003886223, -0.38136398792266846, 0.9230089783668518, -0.000155999994603917,
+ -0.3750790059566498, 0.9061710238456726, 0.0007169999880716205, -0.3782620131969452, 0.9142940044403076, 0.00011300000187475234,
+ -0.39544400572776794, 0.9133660197257996, 0.028490999713540077, -0.012897999957203865, 0.998727023601532, 0.048757001757621765,
+ -0.012866999953985214, 0.9987300038337708, -0.04870200157165527, -0.19210100173950195, 0.9812139868736267, -0.01775900088250637,
+ -0.10451500117778778, 0.9897350072860718, 0.09747499972581863, -0.04767199978232384, 0.9953050017356873, 0.08423800021409988,
+ 0.04767199978232384, 0.9953050017356873, -0.08423800021409988, 0.39544400572776794, 0.9133660197257996, -0.028490999713540077,
+ 0.38111698627471924, 0.9210190176963806, -0.000015999999959603883, 0.031922999769449234, 0.9968529939651489, -0.07255599647760391,
+ 0.3815299868583679, 0.9219080209732056, 0.0000019999999949504854, 0.022261999547481537, 0.9978039860725403, -0.06237399950623512,
+ 0.3821389973163605, 0.9231889843940735, 0.00001700000029813964, 0.008317999541759491, 0.9991790056228638, -0.03964800015091896,
+ 0.38228899240493774, 0.9239469766616821, -0.004430000204592943, 0.0008660000166855752, 0.9999139904975891, 0.013048999942839146,
+ 0.7150859832763672, 0.6924030184745789, -0.02822900004684925, 0.7048519849777222, 0.7048519849777222, 0,
+ 0.7055330276489258, 0.7055330276489258, 0, 0.7065179944038391, 0.7065179944038391, 0,
+ 0.7068390250205994, 0.707252025604248, -0.004379999823868275, 0.9257190227508545, 0.3655939996242523, -0.028463000431656837,
+ 0.9210180044174194, 0.38111698627471924, 0.000015999999959603883, 0.9219080209732056, 0.3815299868583679, -0.0000019999999949504854,
+ 0.9231889843940735, 0.3821389973163605, -0.00001700000029813964, 0.9237229824066162, 0.38283199071884155, -0.004399999976158142,
+ 0.9953050017356873, 0.04767199978232384, 0.08423800021409988, 0.9968529939651489, 0.031922999769449234, 0.07255599647760391,
+ 0.9978039860725403, 0.022261999547481537, 0.06237399950623512, 0.9991790056228638, 0.008317999541759491, 0.03964800015091896,
+ 0.9999139904975891, 0.0008660000166855752, -0.013048999942839146, 0.9953050017356873, -0.04767199978232384, -0.08423800021409988,
+ 0.9135000109672546, -0.3951619863510132, -0.02861100062727928, 0.9210190176963806, -0.38111698627471924, -0.000015999999959603883,
+ 0.9968529939651489, -0.031922999769449234, -0.07255599647760391, 0.9219080209732056, -0.3815299868583679, 0.0000019999999949504854,
+ 0.9978039860725403, -0.022261999547481537, -0.06237399950623512, 0.9231889843940735, -0.3821389973163605, 0.00001700000029813964,
+ 0.9991790056228638, -0.008317999541759491, -0.03964800015091896, 0.9239469766616821, -0.38228899240493774, -0.004430000204592943,
+ 0.9999139904975891, -0.0008660000166855752, 0.013048999942839146, 0.6925899982452393, -0.7149369716644287, -0.028262000530958176,
+ 0.7048519849777222, -0.7048519849777222, 0, 0.7055330276489258, -0.7055330276489258, 0,
+ 0.7065179944038391, -0.7065179944038391, 0, 0.707252025604248, -0.7068390250205994, -0.004379999823868275,
+ 0.3656100034713745, -0.9257280230522156, -0.02841299958527088, 0.38111698627471924, -0.9210180044174194, 0.000015999999959603883,
+ 0.3815299868583679, -0.9219080209732056, -0.0000019999999949504854, 0.3821389973163605, -0.9231889843940735, -0.00001700000029813964,
+ 0.38283199071884155, -0.9237229824066162, -0.004399999976158142, 0.04757700115442276, -0.9953129887580872, 0.08418799936771393,
+ 0.031922999769449234, -0.9968529939651489, 0.07255599647760391, 0.022261999547481537, -0.9978039860725403, 0.06237399950623512,
+ 0.008317999541759491, -0.9991790056228638, 0.03964800015091896, 0.0008660000166855752, -0.9999139904975891, -0.013048999942839146,
+ -0.047710999846458435, -0.9953050017356873, -0.08420699834823608, -0.39544400572776794, -0.9133660197257996, -0.028490999713540077,
+ -0.38111698627471924, -0.9210190176963806, -0.000015999999959603883, -0.031922999769449234, -0.9968529939651489, -0.07255599647760391,
+ -0.3815299868583679, -0.9219080209732056, 0.0000019999999949504854, -0.022261999547481537, -0.9978039860725403, -0.06237399950623512,
+ -0.3821389973163605, -0.9231889843940735, 0.00001700000029813964, -0.008317999541759491, -0.9991790056228638, -0.03964800015091896,
+ -0.38228899240493774, -0.9239469766616821, -0.004430000204592943, -0.0008660000166855752, -0.9999139904975891, 0.013048999942839146,
+ -0.7150859832763672, -0.6924030184745789, -0.02822900004684925, -0.7048519849777222, -0.7048519849777222, 0,
+ -0.7055330276489258, -0.7055330276489258, 0, -0.7065179944038391, -0.7065179944038391, 0,
+ -0.7068390250205994, -0.707252025604248, -0.004379999823868275, -0.9257190227508545, -0.3655939996242523, -0.028463000431656837,
+ -0.9210180044174194, -0.38111698627471924, 0.000015999999959603883, -0.9219080209732056, -0.3815299868583679, -0.0000019999999949504854,
+ -0.9231889843940735, -0.3821389973163605, -0.00001700000029813964, -0.9237229824066162, -0.38283199071884155, -0.004399999976158142,
+ -0.9953050017356873, -0.04767199978232384, 0.08423800021409988, -0.9968529939651489, -0.031922999769449234, 0.07255599647760391,
+ -0.9978039860725403, -0.022261999547481537, 0.06237399950623512, -0.9991790056228638, -0.008317999541759491, 0.03964800015091896,
+ -0.9999139904975891, -0.0008660000166855752, -0.013048999942839146, -0.9953050017356873, 0.04767199978232384, -0.08423800021409988,
+ -0.9133660197257996, 0.39544400572776794, -0.028490999713540077, -0.9210190176963806, 0.38111698627471924, -0.000015999999959603883,
+ -0.9968529939651489, 0.031922999769449234, -0.07255599647760391, -0.9219080209732056, 0.3815299868583679, 0.0000019999999949504854,
+ -0.9978039860725403, 0.022261999547481537, -0.06237399950623512, -0.9231889843940735, 0.3821389973163605, 0.00001700000029813964,
+ -0.9991790056228638, 0.008317999541759491, -0.03964800015091896, -0.9239469766616821, 0.38228899240493774, -0.004430000204592943,
+ -0.9999139904975891, 0.0008660000166855752, 0.013048999942839146, -0.6924030184745789, 0.7150859832763672, -0.02822900004684925,
+ -0.7048519849777222, 0.7048519849777222, 0, -0.7055330276489258, 0.7055330276489258, 0,
+ -0.7065179944038391, 0.7065179944038391, 0, -0.707252025604248, 0.7068390250205994, -0.004379999823868275,
+ -0.3655939996242523, 0.9257190227508545, -0.028463000431656837, -0.38111698627471924, 0.9210180044174194, 0.000015999999959603883,
+ -0.3815299868583679, 0.9219080209732056, -0.0000019999999949504854, -0.3821389973163605, 0.9231889843940735, -0.00001700000029813964,
+ -0.38283199071884155, 0.9237229824066162, -0.004399999976158142, -0.04767199978232384, 0.9953050017356873, 0.08423800021409988,
+ -0.031922999769449234, 0.9968529939651489, 0.07255599647760391, -0.022261999547481537, 0.9978039860725403, 0.06237399950623512,
+ -0.008317999541759491, 0.9991790056228638, 0.03964800015091896, -0.0008660000166855752, 0.9999139904975891, -0.013048999942839146,
+ 0.0008660000166855752, 0.9999139904975891, 0.013048999942839146, 0.38283199071884155, 0.9237229824066162, 0.004399999976158142,
+ 0.38101500272750854, 0.9204739928245544, -0.00003899999865097925, 0.03731299936771393, 0.9963229894638062, 0.07712399959564209,
+ 0.37877199053764343, 0.9154880046844482, 0.00008399999933317304, 0.09151100367307663, 0.9910060167312622, 0.097632996737957,
+ 0.378387987613678, 0.9145749807357788, 0.00009999999747378752, 0.10134600102901459, 0.9900450110435486, 0.09767600148916245,
+ 0.356795996427536, 0.9266510009765625, -0.03188199922442436, 0.07246600091457367, 0.9928709864616394, 0.09463199973106384,
+ 0.707252025604248, 0.7068390250205994, 0.004379999823868275, 0.7044739723205566, 0.7044739723205566, 0,
+ 0.7006790041923523, 0.7006790041923523, 0, 0.6999930143356323, 0.6999930143356323, 0,
+ 0.6847820281982422, 0.7192310094833374, -0.03167999908328056, 0.9239469766616821, 0.38228899240493774, 0.004430000204592943,
+ 0.9204739928245544, 0.38101500272750854, 0.00003899999865097925, 0.9154880046844482, 0.37877199053764343, -0.00008399999933317304,
+ 0.9145749807357788, 0.378387987613678, -0.00009999999747378752, 0.9078760147094727, 0.40216198563575745, -0.03206299990415573,
+ 0.9999139904975891, 0.0008660000166855752, -0.013048999942839146, 0.9963229894638062, 0.03731299936771393, -0.07712399959564209,
+ 0.9910060167312622, 0.09151100367307663, -0.097632996737957, 0.9900450110435486, 0.10134600102901459, -0.09767600148916245,
+ 0.9928709864616394, 0.07246600091457367, -0.09463199973106384, 0.9999139904975891, -0.0008660000166855752, 0.013048999942839146,
+ 0.9237229824066162, -0.38283199071884155, 0.004399999976158142, 0.9204739928245544, -0.38101500272750854, -0.00003899999865097925,
+ 0.9963229894638062, -0.03731299936771393, 0.07712399959564209, 0.9154880046844482, -0.37877199053764343, 0.00008399999933317304,
+ 0.9910060167312622, -0.09151100367307663, 0.097632996737957, 0.9145749807357788, -0.378387987613678, 0.00009999999747378752,
+ 0.9900450110435486, -0.10134600102901459, 0.09767600148916245, 0.9266510009765625, -0.356795996427536, -0.03188199922442436,
+ 0.9928709864616394, -0.07246600091457367, 0.09463199973106384, 0.7068390250205994, -0.707252025604248, 0.004379999823868275,
+ 0.7044739723205566, -0.7044739723205566, 0, 0.7006790041923523, -0.7006790041923523, 0,
+ 0.6999930143356323, -0.6999930143356323, 0, 0.7192310094833374, -0.6847820281982422, -0.03167999908328056,
+ 0.38228899240493774, -0.9239469766616821, 0.004430000204592943, 0.38101500272750854, -0.9204739928245544, 0.00003899999865097925,
+ 0.37877199053764343, -0.9154880046844482, -0.00008399999933317304, 0.378387987613678, -0.9145749807357788, -0.00009999999747378752,
+ 0.40216198563575745, -0.9078760147094727, -0.03206299990415573, 0.0008660000166855752, -0.9999139904975891, -0.013048999942839146,
+ 0.03731299936771393, -0.9963229894638062, -0.07712399959564209, 0.09151100367307663, -0.9910060167312622, -0.097632996737957,
+ 0.10134600102901459, -0.9900450110435486, -0.09767600148916245, 0.07246600091457367, -0.9928709864616394, -0.09463199973106384,
+ -0.0008660000166855752, -0.9999139904975891, 0.013048999942839146, -0.38283199071884155, -0.9237229824066162, 0.004399999976158142,
+ -0.38101500272750854, -0.9204739928245544, -0.00003899999865097925, -0.03731299936771393, -0.9963229894638062, 0.07712399959564209,
+ -0.37877199053764343, -0.9154880046844482, 0.00008399999933317304, -0.09151100367307663, -0.9910060167312622, 0.097632996737957,
+ -0.378387987613678, -0.9145749807357788, 0.00009999999747378752, -0.10134600102901459, -0.9900450110435486, 0.09767600148916245,
+ -0.356795996427536, -0.9266510009765625, -0.03188199922442436, -0.07246600091457367, -0.9928709864616394, 0.09463199973106384,
+ -0.707252025604248, -0.7068390250205994, 0.004379999823868275, -0.7044739723205566, -0.7044739723205566, 0,
+ -0.7006790041923523, -0.7006790041923523, 0, -0.6999930143356323, -0.6999930143356323, 0,
+ -0.6847820281982422, -0.7192310094833374, -0.03167999908328056, -0.9239469766616821, -0.38228899240493774, 0.004430000204592943,
+ -0.9204739928245544, -0.38101500272750854, 0.00003899999865097925, -0.9154880046844482, -0.37877199053764343, -0.00008399999933317304,
+ -0.9145749807357788, -0.378387987613678, -0.00009999999747378752, -0.9078760147094727, -0.40216198563575745, -0.03206299990415573,
+ -0.9999139904975891, -0.0008660000166855752, -0.013048999942839146, -0.9963229894638062, -0.03731299936771393, -0.07712399959564209,
+ -0.9910060167312622, -0.09151100367307663, -0.097632996737957, -0.9900450110435486, -0.10134600102901459, -0.09767600148916245,
+ -0.9928709864616394, -0.07246600091457367, -0.09463199973106384, -0.9999139904975891, 0.0008660000166855752, 0.013048999942839146,
+ -0.9237229824066162, 0.38283199071884155, 0.004399999976158142, -0.9204739928245544, 0.38101500272750854, -0.00003899999865097925,
+ -0.9963229894638062, 0.03731299936771393, 0.07712399959564209, -0.9154880046844482, 0.37877199053764343, 0.00008399999933317304,
+ -0.9910060167312622, 0.09151100367307663, 0.097632996737957, -0.9145749807357788, 0.378387987613678, 0.00009999999747378752,
+ -0.9900450110435486, 0.10134600102901459, 0.09767600148916245, -0.9266510009765625, 0.356795996427536, -0.03188199922442436,
+ -0.9928709864616394, 0.07246600091457367, 0.09463199973106384, -0.7068390250205994, 0.707252025604248, 0.004379999823868275,
+ -0.7044739723205566, 0.7044739723205566, 0, -0.7006790041923523, 0.7006790041923523, 0,
+ -0.6999930143356323, 0.6999930143356323, 0, -0.7192310094833374, 0.6847820281982422, -0.03167999908328056,
+ -0.38228899240493774, 0.9239469766616821, 0.004430000204592943, -0.38101500272750854, 0.9204739928245544, 0.00003899999865097925,
+ -0.37877199053764343, 0.9154880046844482, -0.00008399999933317304, -0.378387987613678, 0.9145749807357788, -0.00009999999747378752,
+ -0.40216198563575745, 0.9078760147094727, -0.03206299990415573, -0.0008660000166855752, 0.9999139904975891, -0.013048999942839146,
+ -0.03731299936771393, 0.9963229894638062, -0.07712399959564209, -0.09151100367307663, 0.9910060167312622, -0.097632996737957,
+ -0.10134600102901459, 0.9900450110435486, -0.09767600148916245, -0.07246600091457367, 0.9928709864616394, -0.09463199973106384,
+ 0.07246600091457367, 0.9928709864616394, 0.09463199973106384, 0.40216198563575745, 0.9078760147094727, 0.03206299990415573,
+ 0.37766799330711365, 0.912958025932312, 0.00018099999579135329, 0.11919300258159637, 0.9883019924163818, 0.09514500200748444,
+ 0.37516000866889954, 0.906607985496521, 0.00016799999866634607, 0.187733992934227, 0.9816380143165588, 0.03381900116801262,
+ 0.2823430001735687, 0.767549991607666, -0.1682250052690506, 0.12883399426937103, 0.6540690064430237, -0.32698601484298706,
+ 0.06457000225782394, 0.32701900601387024, -0.6666669845581055, 0, 0, -1,
+ 0.7192320227622986, 0.6847820281982422, 0.03167999908328056, 0.6987630128860474, 0.6987630128860474, 0,
+ 0.694034993648529, 0.694034993648529, 0, 0.5551990270614624, 0.6008960008621216, -0.16825300455093384,
+ 0.1854030042886734, 0.27701398730278015, -0.6666669845581055, 0.9266499876976013, 0.3567950129508972, 0.03188199922442436,
+ 0.912958025932312, 0.37766799330711365, -0.00018099999579135329, 0.906607985496521, 0.37516000866889954, -0.00016799999866634607,
+ 0.742605984210968, 0.3426159918308258, -0.1683180034160614, 0.27701398730278015, 0.1854030042886734, -0.6666669845581055,
+ 0.9928709864616394, 0.07246600091457367, -0.09463199973106384, 0.9883019924163818, 0.11919300258159637, -0.09514500200748444,
+ 0.9816370010375977, 0.187733992934227, -0.03381900116801262, 0.9811030030250549, 0.19325199723243713, -0.009519999846816063,
+ 0.49052900075912476, 0.0968559980392456, -0.5, 0.9928709864616394, -0.07246600091457367, 0.09463199973106384,
+ 0.9078760147094727, -0.40216198563575745, 0.03206299990415573, 0.912958025932312, -0.37766799330711365, 0.00018099999579135329,
+ 0.9883019924163818, -0.11919300258159637, 0.09514500200748444, 0.906607985496521, -0.37516000866889954, 0.00016799999866634607,
+ 0.9816380143165588, -0.187733992934227, 0.03381900116801262, 0.767549991607666, -0.2823430001735687, -0.1682250052690506,
+ 0.6540690064430237, -0.12883399426937103, -0.32698601484298706, 0.32701900601387024, -0.06457000225782394, -0.6666669845581055,
+ 0, 0, -1, 0.6847820281982422, -0.7192320227622986, 0.03167999908328056,
+ 0.6987630128860474, -0.6987630128860474, 0, 0.694034993648529, -0.694034993648529, 0,
+ 0.6008960008621216, -0.5551990270614624, -0.16825300455093384, 0.27701398730278015, -0.1854030042886734, -0.6666669845581055,
+ 0.3567950129508972, -0.9266499876976013, 0.03188199922442436, 0.37766799330711365, -0.912958025932312, -0.00018099999579135329,
+ 0.37516000866889954, -0.906607985496521, -0.00016799999866634607, 0.3426159918308258, -0.742605984210968, -0.1683180034160614,
+ 0.1854030042886734, -0.27701398730278015, -0.6666669845581055, 0.07246600091457367, -0.9928709864616394, -0.09463199973106384,
+ 0.11919300258159637, -0.9883019924163818, -0.09514500200748444, 0.187733992934227, -0.9816370010375977, -0.03381900116801262,
+ 0.19325199723243713, -0.9811030030250549, -0.009519999846816063, 0.0968559980392456, -0.49052900075912476, -0.5,
+ -0.07246600091457367, -0.9928709864616394, 0.09463199973106384, -0.40216198563575745, -0.9078760147094727, 0.03206299990415573,
+ -0.37766799330711365, -0.912958025932312, 0.00018099999579135329, -0.11919300258159637, -0.9883019924163818, 0.09514500200748444,
+ -0.37516000866889954, -0.906607985496521, 0.00016799999866634607, -0.187733992934227, -0.9816380143165588, 0.03381900116801262,
+ -0.2823430001735687, -0.767549991607666, -0.1682250052690506, -0.12883399426937103, -0.6540690064430237, -0.32698601484298706,
+ -0.06457000225782394, -0.32701900601387024, -0.6666669845581055, 0, 0, -1,
+ -0.7192320227622986, -0.6847820281982422, 0.03167999908328056, -0.6987630128860474, -0.6987630128860474, 0,
+ -0.694034993648529, -0.694034993648529, 0, -0.5551990270614624, -0.6008960008621216, -0.16825300455093384,
+ -0.1854030042886734, -0.27701398730278015, -0.6666669845581055, -0.9266499876976013, -0.3567950129508972, 0.03188199922442436,
+ -0.912958025932312, -0.37766799330711365, -0.00018099999579135329, -0.906607985496521, -0.37516000866889954, -0.00016799999866634607,
+ -0.742605984210968, -0.3426159918308258, -0.1683180034160614, -0.27701398730278015, -0.1854030042886734, -0.6666669845581055,
+ -0.9928709864616394, -0.07246600091457367, -0.09463199973106384, -0.9883019924163818, -0.11919300258159637, -0.09514500200748444,
+ -0.9816370010375977, -0.187733992934227, -0.03381900116801262, -0.9811030030250549, -0.19325199723243713, -0.009519999846816063,
+ -0.49052900075912476, -0.0968559980392456, -0.5, -0.9928709864616394, 0.07246600091457367, 0.09463199973106384,
+ -0.9078760147094727, 0.40216198563575745, 0.03206299990415573, -0.912958025932312, 0.37766799330711365, 0.00018099999579135329,
+ -0.9883019924163818, 0.11919300258159637, 0.09514500200748444, -0.906607985496521, 0.37516000866889954, 0.00016799999866634607,
+ -0.9816380143165588, 0.187733992934227, 0.03381900116801262, -0.767549991607666, 0.2823430001735687, -0.1682250052690506,
+ -0.6540690064430237, 0.12883399426937103, -0.32698601484298706, -0.32701900601387024, 0.06457000225782394, -0.6666669845581055,
+ 0, 0, -1, -0.6847820281982422, 0.7192320227622986, 0.03167999908328056,
+ -0.6987630128860474, 0.6987630128860474, 0, -0.694034993648529, 0.694034993648529, 0,
+ -0.6008960008621216, 0.5551990270614624, -0.16825300455093384, -0.27701398730278015, 0.1854030042886734, -0.6666669845581055,
+ -0.3567950129508972, 0.9266499876976013, 0.03188199922442436, -0.37766799330711365, 0.912958025932312, -0.00018099999579135329,
+ -0.37516000866889954, 0.906607985496521, -0.00016799999866634607, -0.3426159918308258, 0.742605984210968, -0.1683180034160614,
+ -0.1854030042886734, 0.27701398730278015, -0.6666669845581055, -0.07246600091457367, 0.9928709864616394, -0.09463199973106384,
+ -0.11919300258159637, 0.9883019924163818, -0.09514500200748444, -0.187733992934227, 0.9816370010375977, -0.03381900116801262,
+ -0.19325199723243713, 0.9811030030250549, -0.009519999846816063, -0.0968559980392456, 0.49052900075912476, -0.5,
+ -0.006597999949008226, 0.9961680173873901, 0.0001630000042496249, -0.043907999992370605, 0.779125988483429, -0.55936598777771,
+ 0.23287899792194366, 0.79271000623703, -0.506534993648529, 0.11139900237321854, 0.9923329949378967, 0.0053449999541044235,
+ 0.4521920084953308, 0.7370989918708801, -0.42180201411247253, 0.17797799408435822, 0.9827970266342163, 0.036841001361608505,
+ 0.6075379848480225, 0.7066869735717773, -0.270797997713089, 0.11894699931144714, 0.9864829778671265, 0.10517799854278564,
+ 0.6583719849586487, 0.7438470125198364, -0.06727500259876251, 0.0010629999451339245, 0.99891597032547, 0.04653400182723999,
+ -0.1622990071773529, -0.14869500696659088, -0.9069569706916809, 0.3020159900188446, -0.014301000162959099, -0.8847119808197021,
+ 0.7048640251159668, -0.042514998465776443, -0.6788020133972168, 0.8948519825935364, -0.11078000068664551, -0.38824599981307983,
+ 0.9622920155525208, -0.09367900341749191, -0.14349600672721863, -0.12511900067329407, -0.8479049801826477, -0.4783349931240082,
+ 0.11315400153398514, -0.8153669834136963, -0.5167160034179688, 0.3956319987773895, -0.7910019755363464, -0.4345270097255707,
+ 0.5244609713554382, -0.8012329936027527, -0.2643829882144928, 0.571465015411377, -0.7902160286903381, -0.12332800030708313,
+ -0.0943560004234314, -0.9955379962921143, -0.0010989999864250422, 0.012040999718010426, -0.9965500235557556, 0,
+ 0.09501499682664871, -0.9936969876289368, 0.02440500073134899, 0.03737499937415123, -0.9978089928627014, 0.035909999161958694,
+ -0.0008800000068731606, -0.9973530173301697, -0.04031199961900711, 0.007164000067859888, -0.9961649775505066, -0.00002700000004551839,
+ 0.043988000601530075, -0.8330309987068176, 0.4691329896450043, -0.2334270030260086, -0.7983189821243286, 0.49840399622917175,
+ -0.10737399756908417, -0.9927549958229065, -0.007029999978840351, -0.45147499442100525, -0.7576299905776978, 0.39375001192092896,
+ -0.15364399552345276, -0.9863160252571106, -0.048294998705387115, -0.5575600266456604, -0.7753210067749023, 0.2001740038394928,
+ -0.07242999970912933, -0.9923030138015747, -0.08845999836921692, -0.5877019762992859, -0.8041930198669434, 0.04768599942326546,
+ 0.0005830000154674053, -0.9997940063476562, -0.020301999524235725, 0.13663700222969055, -0.14665700495243073, 0.8966140151023865,
+ -0.3045389950275421, -0.012237999588251114, 0.8833180069923401, -0.7020289897918701, -0.033987998962402344, 0.6724730134010315,
+ -0.8890330195426941, -0.09636799991130829, 0.37605398893356323, -0.9668099880218506, -0.08601800352334976, 0.1358419954776764,
+ 0.12022499740123749, 0.7918559908866882, 0.5693140029907227, -0.11313500255346298, 0.8111780285835266, 0.5236610174179077,
+ -0.39790698885917664, 0.7734419703483582, 0.45853298902511597, -0.5793390274047852, 0.7346490025520325, 0.32973799109458923,
+ -0.6447499990463257, 0.7340419888496399, 0.12459299713373184, 0.09378799796104431, 0.9955919981002808, 0.000944000028539449,
+ -0.01607999950647354, 0.9964879751205444, 0.00035600000410340726, -0.11933200061321259, 0.9912199974060059, -0.01737299934029579,
+ -0.08618299663066864, 0.9940080046653748, -0.053598999977111816, -0.004110999871045351, 0.9980229735374451, 0.015703000128269196,
+ 0.010142000392079353, 0.9933879971504211, 0.10034400224685669, 0.6597890257835388, 0.7114480137825012, 0.12964099645614624,
+ 0.5634239912033081, 0.7594000101089478, 0.289902001619339, -0.021227000281214714, 0.9976930022239685, 0.05189099907875061,
+ 0.3972559869289398, 0.7709670066833496, 0.45872700214385986, -0.05054600164294243, 0.9957669973373413, 0.060869000852108,
+ 0.11805199831724167, 0.7611619830131531, 0.5692800283432007, -0.11414600163698196, 0.9869359731674194, 0.08862999826669693,
+ -0.0012870000209659338, 0.7195389866828918, 0.6293820142745972, -0.18971200287342072, 0.9752820134162903, 0.11328700184822083,
+ 0.9685969948768616, -0.08966200053691864, 0.13331100344657898, 0.8902140259742737, -0.051961999386548996, 0.39323100447654724,
+ 0.6728280186653137, -0.050324998795986176, 0.6965069770812988, 0.25133201479911804, -0.04306900128722191, 0.9169719815254211,
+ -0.19813700020313263, -0.2512879967689514, 0.9046909809112549, 0.5937719941139221, -0.8024669885635376, 0.03307799994945526,
+ 0.5571249723434448, -0.7907459735870361, 0.2022089958190918, 0.4313510060310364, -0.8083119988441467, 0.37996000051498413,
+ 0.19395600259304047, -0.8197799921035767, 0.5133119821548462, -0.1517219990491867, -0.8084930181503296, 0.5055829882621765,
+ 0.0035200000274926424, -0.9997940063476562, 0.019979000091552734, 0.01159599982202053, -0.9981369972229004, -0.02326199971139431,
+ 0.01310999970883131, -0.9988970160484314, -0.008480999618768692, -0.02485400065779686, -0.9978809952735901, 0.021263999864459038,
+ -0.11335399746894836, -0.9881970286369324, 0.06441199779510498, -0.0035459999926388264, -0.9954169988632202, -0.07682599872350693,
+ -0.5816869735717773, -0.7760900259017944, -0.13957500457763672, -0.5260769724845886, -0.790789008140564, -0.2781960070133209,
+ 0.017288999632000923, -0.9983699917793274, -0.03728000074625015, -0.36800798773765564, -0.7982890009880066, -0.4405499994754791,
+ 0.03743100166320801, -0.9973520040512085, -0.03640099987387657, -0.09636899828910828, -0.7829139828681946, -0.5500450134277344,
+ 0.10426300019025803, -0.9894949793815613, -0.06746900081634521, 0.10083399713039398, -0.8161320090293884, -0.48112401366233826,
+ 0.18510299921035767, -0.9776470065116882, -0.09971100091934204, -0.9615049958229065, -0.08203399926424026, -0.14958199858665466,
+ -0.8876789808273315, -0.04622500017285347, -0.39955899119377136, -0.6675580143928528, -0.03723999857902527, -0.7007560133934021,
+ -0.245511993765831, -0.03216199949383736, -0.9151920080184937, 0.15477199852466583, -0.24929499626159668, -0.8975690007209778,
+ -0.6700729727745056, 0.7402250170707703, -0.01942499913275242, -0.5923460125923157, 0.7624830007553101, -0.21566900610923767,
+ -0.45611900091171265, 0.7868310213088989, -0.39906400442123413, -0.21001900732517242, 0.8031420111656189, -0.5333020091056824,
+ 0.05119999870657921, 0.7096909880638123, -0.6591699719429016, -0.014175999909639359, 0.9989240169525146, -0.04416000097990036,
+ -0.0065449997782707214, 0.9983869791030884, 0.008813999593257904, 0.0023960000835359097, 0.9989259839057922, -0.016711000353097916,
+ 0.03813000023365021, 0.9969249963760376, -0.04171599820256233, 0.11744900047779083, 0.986670970916748, -0.0799890011548996,
+ -0.02072799950838089, -0.997963011264801, 0.0017740000039339066, 0.10236400365829468, -0.695684015750885, -0.6961740255355835,
+ 0.28174999356269836, -0.7065439820289612, -0.6379269957542419, -0.027713999152183533, -0.9983959794044495, -0.016395000740885735,
+ 0.4621469974517822, -0.7501789927482605, -0.43765199184417725, -0.014942999929189682, -0.9960020184516907, -0.04751100018620491,
+ 0.6121799945831299, -0.7355859875679016, -0.1658719927072525, 0.08200599998235703, -0.9833409786224365, 0.11102399975061417,
+ 0.7232419848442078, -0.6012910008430481, -0.14595800638198853, 0.32238098978996277, -0.9036369919776917, 0.28197699785232544,
+ 0.1188960000872612, 0.09661199897527695, -0.9692260026931763, 0.3230240046977997, 0.06791900098323822, -0.9069269895553589,
+ 0.6287810206413269, 0.00962899997830391, -0.711097002029419, 0.8952469825744629, -0.060169998556375504, -0.3366979956626892,
+ 0.9689210057258606, -0.04508800059556961, -0.13095800578594208, 0.06500200182199478, 0.7708680033683777, -0.6083509922027588,
+ 0.1816529929637909, 0.7457069754600525, -0.593995988368988, 0.37600401043891907, 0.7467949986457825, -0.4776870012283325,
+ 0.6288849711418152, 0.7020969986915588, -0.27160701155662537, 0.8230010271072388, 0.5295370221138, -0.09450399875640869,
+ -0.12820099294185638, 0.9899809956550598, -0.05917999893426895, -0.11097600311040878, 0.9872509837150574, -0.09937400370836258,
+ -0.06767299771308899, 0.9865689873695374, -0.1427209973335266, -0.0003349999897181988, 0.9967420101165771, 0.025443999096751213,
+ 0.29019099473953247, 0.9243509769439697, 0.1957239955663681, 0.07294999808073044, 0.9949049949645996, 0.03147900104522705,
+ -0.04948300123214722, 0.7695090174674988, 0.6163870096206665, -0.24193400144577026, 0.7750219702720642, 0.5679330229759216,
+ 0.05620399862527847, 0.9959489703178406, 0.052143000066280365, -0.4294399917125702, 0.779321014881134, 0.41615501046180725,
+ 0.023887999355793, 0.9943940043449402, 0.07553800195455551, -0.6655910015106201, 0.6939520239830017, 0.20106400549411774,
+ -0.09678799659013748, 0.9791589975357056, -0.12869000434875488, -0.7716730237007141, 0.5443729758262634, 0.1793539971113205,
+ -0.417836993932724, 0.8721759915351868, -0.2544029951095581, -0.09499499946832657, 0.08934500068426132, 0.9787889719009399,
+ -0.3299880027770996, 0.06701900064945221, 0.9273520112037659, -0.6511250138282776, 0.023523999378085136, 0.7280719876289368,
+ -0.9116759896278381, -0.033263999968767166, 0.34162598848342896, -0.9896330237388611, -0.013496000319719315, 0.07834099978208542,
+ -0.07044100016355515, -0.6954740285873413, 0.7080140113830566, -0.21969600021839142, -0.6959800124168396, 0.6642320156097412,
+ -0.4075010120868683, -0.7370589971542358, 0.5047789812088013, -0.5866039991378784, -0.7473030090332031, 0.24636299908161163,
+ -0.799036979675293, -0.5617390275001526, 0.05794600024819374, 0.07605399936437607, -0.9967970252037048, 0.02472200058400631,
+ 0.08756300061941147, -0.9926980137825012, 0.05929899960756302, 0.07250799983739853, -0.9901790022850037, 0.11122000217437744,
+ 0.015556000173091888, -0.9970260262489319, -0.011235999874770641, -0.194814994931221, -0.9439409971237183, -0.22127500176429749,
+ 0.3417310118675232, -0.8896859884262085, 0.3012309968471527, 0.8375009894371033, -0.4931910037994385, 0.05739299952983856,
+ 0.8273029923439026, -0.4684619903564453, -0.05539099872112274, 0.5311300158500671, -0.8121910095214844, 0.24026300013065338,
+ 0.8069959878921509, -0.47689300775527954, 0.002638000063598156, 0.644743025302887, -0.7642210125923157, -0.015455000102519989,
+ 0.8856800198554993, -0.4464530050754547, 0.047488000243902206, -0.011536000296473503, -0.999845027923584, -0.0008730000117793679,
+ 0.7597830295562744, -0.6229599714279175, 0.026636000722646713, 0.321245014667511, -0.8855000138282776, 0.3356960117816925,
+ 0.998091995716095, -0.005673000123351812, 0.025262000039219856, 0.9941530227661133, 0.046904999762773514, -0.00951599981635809,
+ 0.9838590025901794, -0.00041700000292621553, 0.010572000406682491, 0.990556001663208, 0.01886500045657158, 0.04422200098633766,
+ 0.9921990036964417, -0.12290599942207336, 0.011202000081539154, 0.828000009059906, 0.5258169770240784, -0.0846100002527237,
+ 0.8704839944839478, 0.4878079891204834, 0.00635599996894598, 0.7773939967155457, 0.5659670233726501, -0.09634699672460556,
+ 0.8190580010414124, 0.4740380048751831, 0.01190400030463934, 0.9017590284347534, 0.3486430048942566, -0.05601400136947632,
+ 0.41038599610328674, 0.870602011680603, 0.27135801315307617, 0.3019320070743561, 0.8897680044174194, 0.34101900458335876,
+ 0.13912299275398254, 0.9423390030860901, -0.3042120039463043, 0.6167309880256653, 0.7692840099334717, 0.1667650043964386,
+ 0.5558350086212158, 0.8010749816894531, 0.21867799758911133, -0.4410029947757721, 0.8555399775505066, -0.2693159878253937,
+ -0.8639690279960632, 0.464356005191803, -0.019222000613808632, -0.8705710172653198, 0.4855479896068573, -0.005623999983072281,
+ -0.33969300985336304, 0.8762779831886292, -0.34097298979759216, -0.7608209848403931, 0.5840269923210144, 0.11236599832773209,
+ -0.16763299703598022, 0.9419429898262024, 0.29091599583625793, -0.8260639905929565, 0.47304999828338623, -0.0134699996560812,
+ -0.6006280183792114, 0.7822970151901245, -0.1611420065164566, -0.8495870232582092, 0.4440779983997345, 0.17417700588703156,
+ -0.5251449942588806, 0.8236340284347534, -0.21412399411201477, -0.9991480112075806, 0.0017519999528303742, 0.007890000008046627,
+ -0.9946579933166504, 0.06129400059580803, 0.007796999998390675, -0.9840919971466064, 0.008732999674975872, -0.0001289999927394092,
+ -0.9916059970855713, 0.015207000076770782, -0.04798699915409088, -0.9899899959564209, -0.13816699385643005, -0.019433999434113503,
+ -0.7927820086479187, -0.5669599771499634, 0.06795799732208252, -0.8363490104675293, -0.4685719907283783, 0.048955000936985016,
+ -0.8138830065727234, -0.4743089973926544, 0.0008379999781027436, -0.8869869709014893, -0.4417180120944977, -0.05625399947166443,
+ -0.7898640036582947, -0.5522750020027161, -0.15016800165176392, -0.297340989112854, -0.8998129963874817, -0.3192580044269562,
+ -0.49759799242019653, -0.8317790031433105, -0.24411599338054657, -0.6295620203018188, -0.7765420079231262, 0.01261799968779087,
+ -0.011338000185787678, -0.9998990297317505, -0.008561000227928162, -0.3547320067882538, -0.8679590225219727, -0.3453510105609894,
+ 0.09618999809026718, 0.49066001176834106, -0.5, 0.1851000040769577, 0.27721700072288513, -0.6666669845581055,
+ 0.32566601037979126, 0.76139897108078, -0.18199099600315094, 0.062401000410318375, 0.9939020276069641, -0.09090700000524521,
+ 0.3803209960460663, 0.9214360117912292, -0.00007100000220816582, 0.030918000265955925, 0.9969729781150818, 0.07133600115776062,
+ 0.3804109990596771, 0.9220889806747437, 0.0001630000042496249, 0.02471200004220009, 0.9975799918174744, 0.06498300284147263,
+ 0.35510900616645813, 0.926891028881073, 0.03216100111603737, 0.07657899707555771, 0.9924740195274353, -0.09555599838495255,
+ 0.27721700072288513, 0.1851000040769577, -0.6666669845581055, 0.5929989814758301, 0.5781109929084778, -0.18205299973487854,
+ 0.7048519849777222, 0.7048519849777222, 0, 0.7052720189094543, 0.7054179906845093, -0.00002499999936844688,
+ 0.6835219860076904, 0.7199410200119019, 0.03204600140452385, 0.3271070122718811, 0.06412599980831146, -0.6666669845581055,
+ 0.7694699764251709, 0.3061000108718872, -0.18225300312042236, 0.9214379787445068, 0.38033199310302734, 0.0000670000008540228,
+ 0.9220880270004272, 0.3804430067539215, -0.00016799999866634607, 0.9071130156517029, 0.403003990650177, 0.032437000423669815,
+ 0, 0, -1, 0.6626030206680298, 0.04157499969005585, -0.272724986076355,
+ 0.9969789981842041, 0.03082600049674511, -0.07129299640655518, 0.9975910186767578, 0.024447999894618988, -0.06492199748754501,
+ 0.9925040006637573, 0.07630900293588638, 0.09545700252056122, 0.49066001176834106, -0.09618999809026718, -0.5,
+ 0.27721700072288513, -0.1851000040769577, -0.6666669845581055, 0.76139897108078, -0.32566601037979126, -0.18199099600315094,
+ 0.9939020276069641, -0.062401000410318375, -0.09090700000524521, 0.9214360117912292, -0.3803209960460663, -0.00007100000220816582,
+ 0.9969729781150818, -0.030918000265955925, 0.07133600115776062, 0.9220889806747437, -0.3804109990596771, 0.0001630000042496249,
+ 0.9975799918174744, -0.02471200004220009, 0.06498300284147263, 0.926891028881073, -0.35510900616645813, 0.03216100111603737,
+ 0.9924740195274353, -0.07657899707555771, -0.09555599838495255, 0.1851000040769577, -0.27721700072288513, -0.6666669845581055,
+ 0.5781109929084778, -0.5929989814758301, -0.18205299973487854, 0.7048519849777222, -0.7048519849777222, 0,
+ 0.7054179906845093, -0.7052720189094543, -0.00002499999936844688, 0.7199410200119019, -0.6835219860076904, 0.03204600140452385,
+ 0.06412599980831146, -0.3271070122718811, -0.6666669845581055, 0.3061000108718872, -0.7694699764251709, -0.18225300312042236,
+ 0.38033199310302734, -0.9214379787445068, 0.0000670000008540228, 0.3804430067539215, -0.9220880270004272, -0.00016799999866634607,
+ 0.403003990650177, -0.9071130156517029, 0.032437000423669815, 0, 0, -1,
+ 0.04157499969005585, -0.6626030206680298, -0.272724986076355, 0.03082600049674511, -0.9969789981842041, -0.07129299640655518,
+ 0.024447999894618988, -0.9975910186767578, -0.06492199748754501, 0.07630900293588638, -0.9925040006637573, 0.09545700252056122,
+ -0.09618999809026718, -0.49066001176834106, -0.5, -0.1851000040769577, -0.27721700072288513, -0.6666669845581055,
+ -0.32566601037979126, -0.76139897108078, -0.18199099600315094, -0.062401000410318375, -0.9939020276069641, -0.09090700000524521,
+ -0.3803209960460663, -0.9214360117912292, -0.00007100000220816582, -0.030918000265955925, -0.9969729781150818, 0.07133600115776062,
+ -0.3804109990596771, -0.9220889806747437, 0.0001630000042496249, -0.02471200004220009, -0.9975799918174744, 0.06498300284147263,
+ -0.35510900616645813, -0.926891028881073, 0.03216100111603737, -0.07657899707555771, -0.9924740195274353, -0.09555599838495255,
+ -0.27721700072288513, -0.1851000040769577, -0.6666669845581055, -0.5929989814758301, -0.5781109929084778, -0.18205299973487854,
+ -0.7048519849777222, -0.7048519849777222, 0, -0.7052720189094543, -0.7054179906845093, -0.00002499999936844688,
+ -0.6835219860076904, -0.7199410200119019, 0.03204600140452385, -0.3271070122718811, -0.06412599980831146, -0.6666669845581055,
+ -0.7694699764251709, -0.3061000108718872, -0.18225300312042236, -0.9214379787445068, -0.38033199310302734, 0.0000670000008540228,
+ -0.9220880270004272, -0.3804430067539215, -0.00016799999866634607, -0.9071130156517029, -0.403003990650177, 0.032437000423669815,
+ 0, 0, -1, -0.6626030206680298, -0.04157499969005585, -0.272724986076355,
+ -0.9969789981842041, -0.03082600049674511, -0.07129299640655518, -0.9975910186767578, -0.024447999894618988, -0.06492199748754501,
+ -0.9925040006637573, -0.07630900293588638, 0.09545700252056122, -0.49066001176834106, 0.09618999809026718, -0.5,
+ -0.27721700072288513, 0.1851000040769577, -0.6666669845581055, -0.76139897108078, 0.32566601037979126, -0.18199099600315094,
+ -0.9939020276069641, 0.062401000410318375, -0.09090700000524521, -0.9214360117912292, 0.3803209960460663, -0.00007100000220816582,
+ -0.9969729781150818, 0.030918000265955925, 0.07133600115776062, -0.9220889806747437, 0.3804109990596771, 0.0001630000042496249,
+ -0.9975799918174744, 0.02471200004220009, 0.06498300284147263, -0.926891028881073, 0.35510900616645813, 0.03216100111603737,
+ -0.9924740195274353, 0.07657899707555771, -0.09555599838495255, -0.1851000040769577, 0.27721700072288513, -0.6666669845581055,
+ -0.5781109929084778, 0.5929989814758301, -0.18205299973487854, -0.7048519849777222, 0.7048519849777222, 0,
+ -0.7054179906845093, 0.7052720189094543, -0.00002499999936844688, -0.7199410200119019, 0.6835219860076904, 0.03204600140452385,
+ -0.06412599980831146, 0.3271070122718811, -0.6666669845581055, -0.3061000108718872, 0.7694699764251709, -0.18225300312042236,
+ -0.38033199310302734, 0.9214379787445068, 0.0000670000008540228, -0.3804430067539215, 0.9220880270004272, -0.00016799999866634607,
+ -0.403003990650177, 0.9071130156517029, 0.032437000423669815, 0, 0, -1,
+ -0.04157499969005585, 0.6626030206680298, -0.272724986076355, -0.03082600049674511, 0.9969789981842041, -0.07129299640655518,
+ -0.024447999894618988, 0.9975910186767578, -0.06492199748754501, -0.07630900293588638, 0.9925040006637573, 0.09545700252056122,
+ 0.07657899707555771, 0.9924740195274353, -0.09555599838495255, 0.40307098627090454, 0.9070649743080139, -0.03255299851298332,
+ 0.3753640055656433, 0.9070209860801697, 0.000007000000096013537, 0.18306200206279755, 0.9820899963378906, -0.04457399994134903,
+ 0.3751649856567383, 0.9065750241279602, -0.00007400000322377309, 0.18801499903202057, 0.9816100001335144, -0.03304100036621094,
+ 0.3759070038795471, 0.908607006072998, -0.00026199998683296144, 0.16623400151729584, 0.983722984790802, -0.06822899729013443,
+ 0.33324098587036133, 0.9290030002593994, 0.029803000390529633, 0.14071400463581085, 0.9862040281295776, -0.08718100190162659,
+ 0.7198299765586853, 0.6836559772491455, -0.032017000019550323, 0.6943539977073669, 0.6943539977073669, 0,
+ 0.694034993648529, 0.694034993648529, 0, 0.6955100297927856, 0.6955100297927856, 0,
+ 0.6639170050621033, 0.7306150197982788, 0.029100999236106873, 0.9268649816513062, 0.35523301362991333, -0.03203999996185303,
+ 0.9070209860801697, 0.3753649890422821, -0.000007000000096013537, 0.9065750241279602, 0.3751649856567383, 0.00007300000288523734,
+ 0.908607006072998, 0.3759070038795471, 0.00026199998683296144, 0.8926259875297546, 0.4211460053920746, 0.028991999104619026,
+ 0.9924740195274353, 0.07646500319242477, 0.09565100073814392, 0.9820899963378906, 0.18306200206279755, 0.04457399994134903,
+ 0.9816100001335144, 0.18801499903202057, 0.03304100036621094, 0.983722984790802, 0.16623400151729584, 0.06822899729013443,
+ 0.9862040281295776, 0.14071400463581085, 0.08718100190162659, 0.9924740195274353, -0.07657899707555771, -0.09555599838495255,
+ 0.9070649743080139, -0.40307098627090454, -0.03255299851298332, 0.9070209860801697, -0.3753640055656433, 0.000007000000096013537,
+ 0.9820899963378906, -0.18306200206279755, -0.04457399994134903, 0.9065750241279602, -0.3751649856567383, -0.00007400000322377309,
+ 0.9816100001335144, -0.18801499903202057, -0.03304100036621094, 0.908607006072998, -0.3759070038795471, -0.00026199998683296144,
+ 0.983722984790802, -0.16623400151729584, -0.06822899729013443, 0.9290030002593994, -0.33324098587036133, 0.029803000390529633,
+ 0.9862040281295776, -0.14071400463581085, -0.08718100190162659, 0.6836559772491455, -0.7198299765586853, -0.032017000019550323,
+ 0.6943539977073669, -0.6943539977073669, 0, 0.694034993648529, -0.694034993648529, 0,
+ 0.6955100297927856, -0.6955100297927856, 0, 0.7306150197982788, -0.6639170050621033, 0.029100999236106873,
+ 0.35523301362991333, -0.9268649816513062, -0.03203999996185303, 0.3753649890422821, -0.9070209860801697, -0.000007000000096013537,
+ 0.3751649856567383, -0.9065750241279602, 0.00007300000288523734, 0.3759070038795471, -0.908607006072998, 0.00026199998683296144,
+ 0.4211460053920746, -0.8926259875297546, 0.028991999104619026, 0.07646500319242477, -0.9924740195274353, 0.09565100073814392,
+ 0.18306200206279755, -0.9820899963378906, 0.04457399994134903, 0.18801499903202057, -0.9816100001335144, 0.03304100036621094,
+ 0.16623400151729584, -0.983722984790802, 0.06822899729013443, 0.14071400463581085, -0.9862040281295776, 0.08718100190162659,
+ -0.07657899707555771, -0.9924740195274353, -0.09555599838495255, -0.40307098627090454, -0.9070649743080139, -0.03255299851298332,
+ -0.3753640055656433, -0.9070209860801697, 0.000007000000096013537, -0.18306200206279755, -0.9820899963378906, -0.04457399994134903,
+ -0.3751649856567383, -0.9065750241279602, -0.00007400000322377309, -0.18801499903202057, -0.9816100001335144, -0.03304100036621094,
+ -0.3759070038795471, -0.908607006072998, -0.00026199998683296144, -0.16623400151729584, -0.983722984790802, -0.06822899729013443,
+ -0.33324098587036133, -0.9290030002593994, 0.029803000390529633, -0.14071400463581085, -0.9862040281295776, -0.08718100190162659,
+ -0.7198299765586853, -0.6836559772491455, -0.032017000019550323, -0.6943539977073669, -0.6943539977073669, 0,
+ -0.694034993648529, -0.694034993648529, 0, -0.6955100297927856, -0.6955100297927856, 0,
+ -0.6639170050621033, -0.7306150197982788, 0.029100999236106873, -0.9268649816513062, -0.35523301362991333, -0.03203999996185303,
+ -0.9070209860801697, -0.3753649890422821, -0.000007000000096013537, -0.9065750241279602, -0.3751649856567383, 0.00007300000288523734,
+ -0.908607006072998, -0.3759070038795471, 0.00026199998683296144, -0.8926259875297546, -0.4211460053920746, 0.028991999104619026,
+ -0.9924740195274353, -0.07646500319242477, 0.09565100073814392, -0.9820899963378906, -0.18306200206279755, 0.04457399994134903,
+ -0.9816100001335144, -0.18801499903202057, 0.03304100036621094, -0.983722984790802, -0.16623400151729584, 0.06822899729013443,
+ -0.9862040281295776, -0.14071400463581085, 0.08718100190162659, -0.9924740195274353, 0.07657899707555771, -0.09555599838495255,
+ -0.9070649743080139, 0.40307098627090454, -0.03255299851298332, -0.9070209860801697, 0.3753640055656433, 0.000007000000096013537,
+ -0.9820899963378906, 0.18306200206279755, -0.04457399994134903, -0.9065750241279602, 0.3751649856567383, -0.00007400000322377309,
+ -0.9816100001335144, 0.18801499903202057, -0.03304100036621094, -0.908607006072998, 0.3759070038795471, -0.00026199998683296144,
+ -0.983722984790802, 0.16623400151729584, -0.06822899729013443, -0.9290030002593994, 0.33324098587036133, 0.029803000390529633,
+ -0.9862040281295776, 0.14071400463581085, -0.08718100190162659, -0.6836559772491455, 0.7198299765586853, -0.032017000019550323,
+ -0.6943539977073669, 0.6943539977073669, 0, -0.694034993648529, 0.694034993648529, 0,
+ -0.6955100297927856, 0.6955100297927856, 0, -0.7306150197982788, 0.6639170050621033, 0.029100999236106873,
+ -0.35523301362991333, 0.9268649816513062, -0.03203999996185303, -0.3753649890422821, 0.9070209860801697, -0.000007000000096013537,
+ -0.3751649856567383, 0.9065750241279602, 0.00007300000288523734, -0.3759070038795471, 0.908607006072998, 0.00026199998683296144,
+ -0.4211460053920746, 0.8926259875297546, 0.028991999104619026, -0.07646500319242477, 0.9924740195274353, 0.09565100073814392,
+ -0.18306200206279755, 0.9820899963378906, 0.04457399994134903, -0.18801499903202057, 0.9816100001335144, 0.03304100036621094,
+ -0.16623400151729584, 0.983722984790802, 0.06822899729013443, -0.14071400463581085, 0.9862040281295776, 0.08718100190162659 };
+
+
+float teapotBinormals[] = { 0.2554270029067993, -0.05043400079011917, -0.9655119776725769, 0.2302899956703186, -0.11379700154066086, -0.9664459824562073,
+ -0.23653900623321533, 0.09789499640464783, -0.9666780233383179, -0.2551180124282837, 0.05037299916148186, -0.9655969738960266,
+ -0.9201610088348389, 0.38079801201820374, -0.09108299762010574, -0.9770479798316956, 0.1929199993610382, -0.09032399952411652,
+ -0.6762400269508362, 0.2798590064048767, 0.6814529895782471, -0.723800003528595, 0.1429159939289093, 0.6750479936599731,
+ -0.4681990146636963, 0.1581760048866272, 0.869350016117096, -0.4902079999446869, 0.09679199755191803, 0.8662149906158447,
+ 0.16952399909496307, -0.1934960037469864, -0.9663439989089966, -0.18106800317764282, 0.18106800317764282, -0.9666590094566345,
+ -0.7041199803352356, 0.7041199803352356, -0.09181900322437286, -0.5179349780082703, 0.5179349780082703, 0.6807990074157715,
+ -0.37217798829078674, 0.3260670006275177, 0.8690019845962524, 0.08221600204706192, -0.243368998169899, -0.9664430022239685,
+ -0.09789499640464783, 0.23653900623321533, -0.9666780233383179, -0.38079801201820374, 0.9201610088348389, -0.09108199924230576,
+ -0.2798590064048767, 0.6762400269508362, 0.6814540028572083, -0.21894000470638275, 0.44305500388145447, 0.8693490028381348,
+ 0.050822000950574875, -0.2573910057544708, -0.9649699926376343, -0.05021600052714348, 0.25432100892066956, -0.965815007686615,
+ -0.19291600584983826, 0.9770249724388123, -0.09059000015258789, -0.14291299879550934, 0.7237870097160339, 0.6750609874725342,
+ -0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.048507001250982285, -0.2576940059661865, -0.965008020401001,
+ -0.15833300352096558, -0.3227809965610504, -0.933135986328125, 0.05656199902296066, 0.13793900609016418, -0.9888240098953247,
+ 0.049150001257658005, 0.2545199990272522, -0.9658179879188538, 0.378387987613678, 0.9173290133476257, -0.12381099909543991,
+ 0.1917950063943863, 0.9772530198097229, -0.09050799906253815, 0.2777239978313446, 0.6716070175170898, 0.6868870258331299,
+ 0.14281700551509857, 0.7238019704818726, 0.6750659942626953, 0.15788200497627258, 0.4674209952354431, 0.8698220252990723,
+ 0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.3139069974422455, -0.2657270133495331, -0.9115110039710999,
+ 0.05247500166296959, 0.05178600177168846, -0.9972789883613586, 0.699787974357605, 0.6969379782676697, -0.15676100552082062,
+ 0.511929988861084, 0.5116159915924072, 0.6900550127029419, 0.32515400648117065, 0.37111398577690125, 0.8697980046272278,
+ -0.3181929886341095, -0.09987600147724152, -0.9427499771118164, 0.1552799940109253, 0.06176299974322319, -0.9859380125999451,
+ 0.9187250137329102, 0.3751460015773773, -0.1233299970626831, 0.6724870204925537, 0.2775439918041229, 0.6860979795455933,
+ 0.4424299895763397, 0.21853800117969513, 0.8697689771652222, -0.255948007106781, -0.04464200139045715, -0.9656590223312378,
+ 0.25306200981140137, 0.046362001448869705, -0.9663389921188354, 0.9778940081596375, 0.18800100684165955, -0.09153299778699875,
+ 0.7238150238990784, 0.14205799996852875, 0.675212025642395, 0.49017900228500366, 0.0967010036110878, 0.8662409782409668,
+ -0.25491899251937866, 0.05033399909734726, -0.9656509757041931, -0.2302899956703186, 0.11379700154066086, -0.9664459824562073,
+ 0.23653900623321533, -0.09789499640464783, -0.9666780233383179, 0.252265989780426, -0.04980999976396561, -0.9663749933242798,
+ 0.9201610088348389, -0.38079801201820374, -0.09108299762010574, 0.9769039750099182, -0.19289200007915497, -0.09193000197410583,
+ 0.6762400269508362, -0.2798590064048767, 0.6814529895782471, 0.7236610054969788, -0.14288799464702606, 0.6752020120620728,
+ 0.4681990146636963, -0.1581760048866272, 0.869350016117096, 0.4901660084724426, -0.09678400307893753, 0.8662390112876892,
+ -0.16952399909496307, 0.1934960037469864, -0.9663439989089966, 0.18106800317764282, -0.18106800317764282, -0.9666590094566345,
+ 0.7041199803352356, -0.7041199803352356, -0.09181900322437286, 0.5179349780082703, -0.5179349780082703, 0.6807990074157715,
+ 0.37217798829078674, -0.3260670006275177, 0.8690019845962524, -0.08221600204706192, 0.243368998169899, -0.9664430022239685,
+ 0.09789499640464783, -0.23653900623321533, -0.9666780233383179, 0.38079801201820374, -0.9201610088348389, -0.09108199924230576,
+ 0.2798590064048767, -0.6762400269508362, 0.6814540028572083, 0.21894000470638275, -0.44305500388145447, 0.8693490028381348,
+ -0.05043400079011917, 0.2554270029067993, -0.9655119776725769, 0.05037299916148186, -0.2551180124282837, -0.9655969738960266,
+ 0.1929199993610382, -0.9770479798316956, -0.09032399952411652, 0.1429159939289093, -0.723800003528595, 0.6750479936599731,
+ 0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.05043400079011917, 0.2554270029067993, -0.9655119776725769,
+ 0.11379700154066086, 0.2302899956703186, -0.9664459824562073, -0.09789499640464783, -0.23653900623321533, -0.9666780233383179,
+ -0.05037299916148186, -0.2551180124282837, -0.9655969738960266, -0.38079801201820374, -0.9201610088348389, -0.09108299762010574,
+ -0.1929199993610382, -0.9770479798316956, -0.09032399952411652, -0.2798590064048767, -0.6762400269508362, 0.6814529895782471,
+ -0.1429159939289093, -0.723800003528595, 0.6750479936599731, -0.1581760048866272, -0.4681990146636963, 0.869350016117096,
+ -0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.1934960037469864, 0.16952399909496307, -0.9663439989089966,
+ -0.18106800317764282, -0.18106800317764282, -0.9666590094566345, -0.7041199803352356, -0.7041199803352356, -0.09181900322437286,
+ -0.5179349780082703, -0.5179349780082703, 0.6807990074157715, -0.3260670006275177, -0.37217798829078674, 0.8690019845962524,
+ 0.243368998169899, 0.08221600204706192, -0.9664430022239685, -0.23653900623321533, -0.09789499640464783, -0.9666780233383179,
+ -0.9201610088348389, -0.38079801201820374, -0.09108199924230576, -0.6762400269508362, -0.2798590064048767, 0.6814540028572083,
+ -0.44305500388145447, -0.21894000470638275, 0.8693490028381348, 0.2554270029067993, 0.05043400079011917, -0.9655119776725769,
+ -0.2551180124282837, -0.05037299916148186, -0.9655969738960266, -0.9770479798316956, -0.1929199993610382, -0.09032399952411652,
+ -0.723800003528595, -0.1429159939289093, 0.6750479936599731, -0.4902079999446869, -0.09679199755191803, 0.8662149906158447,
+ -0.4902079999446869, 0.09679199755191803, 0.8662149906158447, -0.44305500388145447, 0.21893900632858276, 0.8693490028381348,
+ -0.37287598848342896, 0.15431199967861176, 0.9149600267410278, -0.4014579951763153, 0.07926800101995468, 0.9124410152435303,
+ -0.3112579882144928, 0.12881100177764893, 0.9415550231933594, -0.33541300892829895, 0.0662280023097992, 0.939740002155304,
+ -0.19015200436115265, 0.07869099825620651, 0.9785959720611572, -0.20517399907112122, 0.040511999279260635, 0.977886974811554,
+ 0.06301800161600113, -0.021289000287652016, 0.9977849721908569, 0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+ -0.3260670006275177, 0.37217798829078674, 0.8690019845962524, -0.285739004611969, 0.285739004611969, 0.9147170186042786,
+ -0.23854400217533112, 0.23854400217533112, 0.9413790106773376, -0.14574900269508362, 0.14574900269508362, 0.9785270094871521,
+ 0.05011200159788132, -0.04390300065279007, 0.9977779984474182, -0.1581760048866272, 0.4681999981403351, 0.869350016117096,
+ -0.15431199967861176, 0.37287598848342896, 0.9149600267410278, -0.12881100177764893, 0.3112579882144928, 0.9415550231933594,
+ -0.07869099825620651, 0.19015100598335266, 0.9785959720611572, 0.02946699969470501, -0.05963199958205223, 0.9977849721908569,
+ -0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.07926800101995468, 0.4014579951763153, 0.9124410152435303,
+ -0.0662280023097992, 0.33541300892829895, 0.939740002155304, -0.040511999279260635, 0.20517399907112122, 0.977886974811554,
+ 0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.09679199755191803, 0.4902079999446869, 0.8662149906158447,
+ 0.21858200430870056, 0.4423219859600067, 0.86981201171875, 0.15431199967861176, 0.37287598848342896, 0.9149600267410278,
+ 0.07926800101995468, 0.4014579951763153, 0.9124410152435303, 0.12881100177764893, 0.3112579882144928, 0.9415550231933594,
+ 0.0662280023097992, 0.33541300892829895, 0.939740002155304, 0.07869099825620651, 0.19015200436115265, 0.9785959720611572,
+ 0.040511999279260635, 0.20517399907112122, 0.977886974811554, -0.021289000287652016, -0.06301800161600113, 0.9977849721908569,
+ -0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.3711329996585846, 0.3251489996910095, 0.8697919845581055,
+ 0.285739004611969, 0.285739004611969, 0.9147170186042786, 0.23854400217533112, 0.23854400217533112, 0.9413790106773376,
+ 0.14574900269508362, 0.14574900269508362, 0.9785270094871521, -0.04390300065279007, -0.05011200159788132, 0.9977779984474182,
+ 0.46750199794769287, 0.15794099867343903, 0.8697680234909058, 0.37287598848342896, 0.15431199967861176, 0.9149600267410278,
+ 0.3112579882144928, 0.12881100177764893, 0.9415550231933594, 0.19015100598335266, 0.07869099825620651, 0.9785959720611572,
+ -0.05963199958205223, -0.02946699969470501, 0.9977849721908569, 0.49017900228500366, 0.0967010036110878, 0.8662409782409668,
+ 0.4014579951763153, 0.07926800101995468, 0.9124410152435303, 0.33541300892829895, 0.0662280023097992, 0.939740002155304,
+ 0.20517399907112122, 0.040511999279260635, 0.977886974811554, -0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+ 0.4901660084724426, -0.09678400307893753, 0.8662390112876892, 0.44305500388145447, -0.21893900632858276, 0.8693490028381348,
+ 0.37287598848342896, -0.15431199967861176, 0.9149600267410278, 0.4014579951763153, -0.07926800101995468, 0.9124410152435303,
+ 0.3112579882144928, -0.12881100177764893, 0.9415550231933594, 0.33541300892829895, -0.0662280023097992, 0.939740002155304,
+ 0.19015200436115265, -0.07869099825620651, 0.9785959720611572, 0.20517399907112122, -0.040511999279260635, 0.977886974811554,
+ -0.06301800161600113, 0.021289000287652016, 0.9977849721908569, -0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+ 0.3260670006275177, -0.37217798829078674, 0.8690019845962524, 0.285739004611969, -0.285739004611969, 0.9147170186042786,
+ 0.23854400217533112, -0.23854400217533112, 0.9413790106773376, 0.14574900269508362, -0.14574900269508362, 0.9785270094871521,
+ -0.05011200159788132, 0.04390300065279007, 0.9977779984474182, 0.1581760048866272, -0.4681999981403351, 0.869350016117096,
+ 0.15431199967861176, -0.37287598848342896, 0.9149600267410278, 0.12881100177764893, -0.3112579882144928, 0.9415550231933594,
+ 0.07869099825620651, -0.19015100598335266, 0.9785959720611572, -0.02946699969470501, 0.05963199958205223, 0.9977849721908569,
+ 0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.07926800101995468, -0.4014579951763153, 0.9124410152435303,
+ 0.0662280023097992, -0.33541300892829895, 0.939740002155304, 0.040511999279260635, -0.20517399907112122, 0.977886974811554,
+ -0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.09679199755191803, -0.4902079999446869, 0.8662149906158447,
+ -0.21893900632858276, -0.44305500388145447, 0.8693490028381348, -0.15431199967861176, -0.37287598848342896, 0.9149600267410278,
+ -0.07926800101995468, -0.4014579951763153, 0.9124410152435303, -0.12881100177764893, -0.3112579882144928, 0.9415550231933594,
+ -0.0662280023097992, -0.33541300892829895, 0.939740002155304, -0.07869099825620651, -0.19015200436115265, 0.9785959720611572,
+ -0.040511999279260635, -0.20517399907112122, 0.977886974811554, 0.021289000287652016, 0.06301800161600113, 0.9977849721908569,
+ 0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.37217798829078674, -0.3260670006275177, 0.8690019845962524,
+ -0.285739004611969, -0.285739004611969, 0.9147170186042786, -0.23854400217533112, -0.23854400217533112, 0.9413790106773376,
+ -0.14574900269508362, -0.14574900269508362, 0.9785270094871521, 0.04390300065279007, 0.05011200159788132, 0.9977779984474182,
+ -0.4681999981403351, -0.1581760048866272, 0.869350016117096, -0.37287598848342896, -0.15431199967861176, 0.9149600267410278,
+ -0.3112579882144928, -0.12881100177764893, 0.9415550231933594, -0.19015100598335266, -0.07869099825620651, 0.9785959720611572,
+ 0.05963199958205223, 0.02946699969470501, 0.9977849721908569, -0.4902079999446869, -0.09679199755191803, 0.8662149906158447,
+ -0.4014579951763153, -0.07926800101995468, 0.9124410152435303, -0.33541300892829895, -0.0662280023097992, 0.939740002155304,
+ -0.20517399907112122, -0.040511999279260635, 0.977886974811554, 0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+ 0.06623400002717972, -0.013078000396490097, 0.9977179765701294, 0.05963199958205223, -0.02946699969470501, 0.9977849721908569,
+ 0.40303200483322144, -0.1667889952659607, 0.8998590111732483, 0.4339120090007782, -0.08567699790000916, 0.8968719840049744,
+ 0.6326310038566589, -0.2618109881877899, 0.7288579940795898, 0.6777120232582092, -0.13381600379943848, 0.723048985004425,
+ 0.6661339998245239, -0.27567601203918457, 0.6930140256881714, 0.7128540277481079, -0.14075499773025513, 0.6870430111885071,
+ 0.5777599811553955, -0.19519099593162537, 0.792523980140686, 0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+ 0.04390300065279007, -0.05011200159788132, 0.9977779984474182, 0.30884799361228943, -0.30884799361228943, 0.8995699882507324,
+ 0.48457300662994385, -0.48457300662994385, 0.7282710075378418, 0.510138988494873, -0.510138988494873, 0.6924710273742676,
+ 0.4591110050678253, -0.40222999453544617, 0.7921029925346375, 0.021289000287652016, -0.06301800161600113, 0.9977849721908569,
+ 0.16678999364376068, -0.40303200483322144, 0.8998590111732483, 0.2618109881877899, -0.6326310038566589, 0.7288579940795898,
+ 0.27567601203918457, -0.6661339998245239, 0.6930140256881714, 0.2701770067214966, -0.546737015247345, 0.7925170063972473,
+ 0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.08567599952220917, -0.4339120090007782, 0.8968719840049744,
+ 0.13381600379943848, -0.6777120232582092, 0.723048985004425, 0.14075499773025513, -0.7128540277481079, 0.6870430111885071,
+ 0.11919199675321579, -0.6036490201950073, 0.7882900238037109, -0.013078000396490097, -0.06623400002717972, 0.9977179765701294,
+ -0.02946699969470501, -0.05963199958205223, 0.9977849721908569, -0.1667889952659607, -0.40303200483322144, 0.8998590111732483,
+ -0.08567699790000916, -0.4339120090007782, 0.8968719840049744, -0.2618109881877899, -0.6326310038566589, 0.7288579940795898,
+ -0.13381600379943848, -0.6777120232582092, 0.723048985004425, -0.27567601203918457, -0.6661339998245239, 0.6930140256881714,
+ -0.14075499773025513, -0.7128540277481079, 0.6870430111885071, -0.19519099593162537, -0.5777599811553955, 0.792523980140686,
+ -0.11919199675321579, -0.6036490201950073, 0.7882900238037109, -0.05011200159788132, -0.04390300065279007, 0.9977779984474182,
+ -0.30884799361228943, -0.30884799361228943, 0.8995699882507324, -0.48457300662994385, -0.48457300662994385, 0.7282710075378418,
+ -0.510138988494873, -0.510138988494873, 0.6924710273742676, -0.40222999453544617, -0.4591110050678253, 0.7921029925346375,
+ -0.06301800161600113, -0.021289000287652016, 0.9977849721908569, -0.40303200483322144, -0.16678999364376068, 0.8998590111732483,
+ -0.6326310038566589, -0.2618109881877899, 0.7288579940795898, -0.6661339998245239, -0.27567601203918457, 0.6930140256881714,
+ -0.546737015247345, -0.2701770067214966, 0.7925170063972473, -0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+ -0.4339120090007782, -0.08567599952220917, 0.8968719840049744, -0.6777120232582092, -0.13381600379943848, 0.723048985004425,
+ -0.7128540277481079, -0.14075499773025513, 0.6870430111885071, -0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+ -0.06623400002717972, 0.013078000396490097, 0.9977179765701294, -0.05963199958205223, 0.02946699969470501, 0.9977849721908569,
+ -0.40303200483322144, 0.1667889952659607, 0.8998590111732483, -0.4339120090007782, 0.08567699790000916, 0.8968719840049744,
+ -0.6326310038566589, 0.2618109881877899, 0.7288579940795898, -0.6777120232582092, 0.13381600379943848, 0.723048985004425,
+ -0.6661339998245239, 0.27567601203918457, 0.6930140256881714, -0.7128540277481079, 0.14075499773025513, 0.6870430111885071,
+ -0.5777599811553955, 0.19519099593162537, 0.792523980140686, -0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+ -0.04390300065279007, 0.05011200159788132, 0.9977779984474182, -0.30884799361228943, 0.30884799361228943, 0.8995699882507324,
+ -0.48457300662994385, 0.48457300662994385, 0.7282710075378418, -0.510138988494873, 0.510138988494873, 0.6924710273742676,
+ -0.4591110050678253, 0.40222999453544617, 0.7921029925346375, -0.021289000287652016, 0.06301800161600113, 0.9977849721908569,
+ -0.16678999364376068, 0.40303200483322144, 0.8998590111732483, -0.2618109881877899, 0.6326310038566589, 0.7288579940795898,
+ -0.27567601203918457, 0.6661339998245239, 0.6930140256881714, -0.2701770067214966, 0.546737015247345, 0.7925170063972473,
+ -0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.08567599952220917, 0.4339120090007782, 0.8968719840049744,
+ -0.13381600379943848, 0.6777120232582092, 0.723048985004425, -0.14075499773025513, 0.7128540277481079, 0.6870430111885071,
+ -0.11919199675321579, 0.6036490201950073, 0.7882900238037109, 0.013078000396490097, 0.06623400002717972, 0.9977179765701294,
+ 0.02946699969470501, 0.05963199958205223, 0.9977849721908569, 0.1667889952659607, 0.40303200483322144, 0.8998590111732483,
+ 0.08567699790000916, 0.4339120090007782, 0.8968719840049744, 0.2618109881877899, 0.6326310038566589, 0.7288579940795898,
+ 0.13381600379943848, 0.6777120232582092, 0.723048985004425, 0.27567601203918457, 0.6661339998245239, 0.6930140256881714,
+ 0.14075499773025513, 0.7128540277481079, 0.6870430111885071, 0.19519099593162537, 0.5777599811553955, 0.792523980140686,
+ 0.11919199675321579, 0.6036490201950073, 0.7882900238037109, 0.05011200159788132, 0.04390300065279007, 0.9977779984474182,
+ 0.30884799361228943, 0.30884799361228943, 0.8995699882507324, 0.48457300662994385, 0.48457300662994385, 0.7282710075378418,
+ 0.510138988494873, 0.510138988494873, 0.6924710273742676, 0.40222999453544617, 0.4591110050678253, 0.7921029925346375,
+ 0.06301800161600113, 0.021289000287652016, 0.9977849721908569, 0.40303200483322144, 0.16678999364376068, 0.8998590111732483,
+ 0.6326310038566589, 0.2618109881877899, 0.7288579940795898, 0.6661339998245239, 0.27567601203918457, 0.6930140256881714,
+ 0.546737015247345, 0.2701770067214966, 0.7925170063972473, 0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+ 0.4339120090007782, 0.08567599952220917, 0.8968719840049744, 0.6777120232582092, 0.13381600379943848, 0.723048985004425,
+ 0.7128540277481079, 0.14075499773025513, 0.6870430111885071, 0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+ 0.6036490201950073, -0.11919199675321579, 0.7882900238037109, 0.546737015247345, -0.2701770067214966, 0.7925170063972473,
+ 0.7223830223083496, -0.2989569902420044, 0.623528003692627, 0.7723940014839172, -0.15251100063323975, 0.616562008857727,
+ 0.9094089865684509, -0.3763520121574402, 0.1770150065422058, 0.9660869836807251, -0.19075599312782288, 0.1740349978208542,
+ 0.9408230185508728, -0.3353259861469269, 0.04907499998807907, 0.9843119978904724, -0.16964000463485718, 0.048493001610040665,
+ 0.9810580015182495, -0.1937119960784912, 0, 0.7071070075035095, -0.7071070075035095, 0,
+ 0.40222999453544617, -0.4591110050678253, 0.7921029925346375, 0.5532029867172241, -0.5532029867172241, 0.622842013835907,
+ 0.6959879994392395, -0.6959879994392395, 0.17663900554180145, 0.7403979897499084, -0.6703829765319824, 0.048958998173475266,
+ 0.8310419917106628, -0.5562090277671814, 0, 0.19519099593162537, -0.5777599811553955, 0.792523980140686,
+ 0.2989560067653656, -0.7223830223083496, 0.623528003692627, 0.3763520121574402, -0.9094089865684509, 0.1770150065422058,
+ 0.4275760054588318, -0.902646005153656, 0.04906899854540825, 0.5562090277671814, -0.8310419917106628, 0,
+ 0.11919199675321579, -0.6036490201950073, 0.7882900238037109, 0.15251100063323975, -0.7723940014839172, 0.616562008857727,
+ 0.19075599312782288, -0.9660869836807251, 0.1740349978208542, 0.19348600506782532, -0.9799140095710754, 0.048277001827955246,
+ 0.1937119960784912, -0.9810580015182495, 0, -0.11919199675321579, -0.6036490201950073, 0.7882900238037109,
+ -0.2701770067214966, -0.546737015247345, 0.7925170063972473, -0.2989569902420044, -0.7223830223083496, 0.623528003692627,
+ -0.15251100063323975, -0.7723940014839172, 0.616562008857727, -0.3763520121574402, -0.9094089865684509, 0.1770150065422058,
+ -0.19075599312782288, -0.9660869836807251, 0.1740349978208542, -0.3353259861469269, -0.9408230185508728, 0.04907499998807907,
+ -0.16964000463485718, -0.9843119978904724, 0.04849399998784065, -0.1937119960784912, -0.9810580015182495, 0,
+ 0.7071070075035095, -0.7071070075035095, 0, -0.4591110050678253, -0.40222999453544617, 0.7921029925346375,
+ -0.5532029867172241, -0.5532029867172241, 0.622842013835907, -0.6959879994392395, -0.6959879994392395, 0.17663900554180145,
+ -0.6703829765319824, -0.7403979897499084, 0.048958998173475266, -0.5562090277671814, -0.8310419917106628, 0,
+ -0.5777599811553955, -0.19519099593162537, 0.792523980140686, -0.7223830223083496, -0.2989560067653656, 0.623528003692627,
+ -0.9094089865684509, -0.3763520121574402, 0.1770150065422058, -0.902646005153656, -0.4275760054588318, 0.04906899854540825,
+ -0.8310419917106628, -0.5562090277671814, 0, -0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+ -0.7723940014839172, -0.15251100063323975, 0.616562008857727, -0.9660869836807251, -0.19075599312782288, 0.1740349978208542,
+ -0.9799140095710754, -0.19348600506782532, 0.048277001827955246, -0.9810580015182495, -0.1937119960784912, 0,
+ -0.6036490201950073, 0.11919199675321579, 0.7882900238037109, -0.546737015247345, 0.2701770067214966, 0.7925170063972473,
+ -0.7223830223083496, 0.2989569902420044, 0.623528003692627, -0.7723940014839172, 0.15251100063323975, 0.616562008857727,
+ -0.9094089865684509, 0.3763520121574402, 0.1770150065422058, -0.9660869836807251, 0.19075599312782288, 0.1740349978208542,
+ -0.9408230185508728, 0.3353259861469269, 0.04907499998807907, -0.9843119978904724, 0.16964000463485718, 0.04849399998784065,
+ -0.9810580015182495, 0.1937119960784912, 0, 0.7071070075035095, -0.7071070075035095, 0,
+ -0.40222999453544617, 0.4591110050678253, 0.7921029925346375, -0.5532029867172241, 0.5532029867172241, 0.622842013835907,
+ -0.6959879994392395, 0.6959879994392395, 0.17663900554180145, -0.7403979897499084, 0.6703829765319824, 0.048958998173475266,
+ -0.8310419917106628, 0.5562090277671814, 0, -0.19519099593162537, 0.5777599811553955, 0.792523980140686,
+ -0.2989560067653656, 0.7223830223083496, 0.623528003692627, -0.3763520121574402, 0.9094089865684509, 0.1770150065422058,
+ -0.4275760054588318, 0.902646005153656, 0.04906899854540825, -0.5562090277671814, 0.8310419917106628, 0,
+ -0.11919199675321579, 0.6036490201950073, 0.7882900238037109, -0.15251100063323975, 0.7723940014839172, 0.616562008857727,
+ -0.19075599312782288, 0.9660869836807251, 0.1740349978208542, -0.19348600506782532, 0.9799140095710754, 0.048277001827955246,
+ -0.1937119960784912, 0.9810580015182495, 0, 0.11919199675321579, 0.6036490201950073, 0.7882900238037109,
+ 0.2701770067214966, 0.546737015247345, 0.7925170063972473, 0.2989569902420044, 0.7223830223083496, 0.623528003692627,
+ 0.15251100063323975, 0.7723940014839172, 0.616562008857727, 0.3763520121574402, 0.9094089865684509, 0.1770150065422058,
+ 0.19075599312782288, 0.9660869836807251, 0.1740349978208542, 0.3353259861469269, 0.9408230185508728, 0.04907499998807907,
+ 0.16964000463485718, 0.9843119978904724, 0.04849399998784065, 0.1937119960784912, 0.9810580015182495, 0,
+ 0.7071070075035095, -0.7071070075035095, 0, 0.4591110050678253, 0.40222999453544617, 0.7921029925346375,
+ 0.5532029867172241, 0.5532029867172241, 0.622842013835907, 0.6959879994392395, 0.6959879994392395, 0.17663900554180145,
+ 0.6703829765319824, 0.7403979897499084, 0.048958998173475266, 0.5562090277671814, 0.8310419917106628, 0,
+ 0.5777599811553955, 0.19519099593162537, 0.792523980140686, 0.7223830223083496, 0.2989560067653656, 0.623528003692627,
+ 0.9094089865684509, 0.3763520121574402, 0.1770150065422058, 0.902646005153656, 0.4275760054588318, 0.04906899854540825,
+ 0.8310419917106628, 0.5562090277671814, 0, 0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+ 0.7723940014839172, 0.15251100063323975, 0.616562008857727, 0.9660869836807251, 0.19075599312782288, 0.1740349978208542,
+ 0.9799150228500366, 0.19348600506782532, 0.048277001827955246, 0.9810580015182495, 0.1937119960784912, 0,
+ 0.9999480247497559, 0.006622000131756067, 0.007786999922245741, 0.9989290237426758, 0.04125700145959854, -0.020945999771356583,
+ 0.9700260162353516, -0.18230900168418884, 0.1606609970331192, 0.9929869771003723, -0.1116809993982315, 0.038782998919487,
+ 0.8677089810371399, -0.30993399024009705, 0.38861599564552307, 0.9675049781799316, -0.18179599940776825, 0.17574100196361542,
+ 0.6127229928970337, -0.23797500133514404, 0.753616988658905, 0.781611979007721, -0.1585649996995926, 0.6032750010490417,
+ 0.13049399852752686, -0.02585900016129017, 0.9911119937896729, 0.16583800315856934, -0.04606600105762482, 0.9850770235061646,
+ 0.9847609996795654, -0.03004699945449829, -0.17129500210285187, 0.9463850259780884, 0.008138000033795834, 0.3229379951953888,
+ 0.6942890286445618, 0.06011800095438957, 0.7171810269355774, 0.405923992395401, 0.09244199842214584, 0.9092199802398682,
+ 0.1477230042219162, 0.0024739999789744616, 0.9890260100364685, 0.991798996925354, -0.11557900160551071, -0.05454900115728378,
+ 0.9920099973678589, 0.07202500104904175, 0.10358300060033798, 0.8882240056991577, 0.2238840013742447, 0.40116599202156067,
+ 0.6046879887580872, 0.13691100478172302, 0.7846069931983948, 0.12908099591732025, -0.06111999973654747, 0.989749014377594,
+ 0.9954820275306702, -0.09436299651861191, 0.010502999648451805, 0.9981970191001892, 0.012060999870300293, 0.05880200117826462,
+ 0.9550639986991882, 0.09819000214338303, 0.27966299653053284, 0.6606940031051636, 0.05169999971985817, 0.7488729953765869,
+ 0.07273799926042557, -0.04034300148487091, 0.9965350031852722, 0.9999179840087891, 0.007191000040620565, 0.010560999624431133,
+ 0.9989050030708313, 0.04436499997973442, -0.014883999712765217, 0.9694769978523254, -0.17860299348831177, 0.1679760068655014,
+ 0.9924619793891907, -0.10775599628686905, 0.058378998190164566, 0.8567489981651306, -0.28829601407051086, 0.4276289939880371,
+ 0.9473999738693237, -0.16112199425697327, 0.27653801441192627, 0.5627779960632324, -0.19747799634933472, 0.8026729822158813,
+ 0.6577669978141785, -0.11438000202178955, 0.7444859743118286, 0.07901199907064438, 0.0013689999468624592, 0.9968730211257935,
+ 0.07274100184440613, -0.02020600065588951, 0.9971460103988647, 0.9888780117034912, 0.025808999314904213, -0.14647500216960907,
+ 0.9453979730606079, -0.006663000211119652, 0.3258500099182129, 0.6921399831771851, -0.04972299933433533, 0.7200480103492737,
+ 0.3957499861717224, -0.08134900033473969, 0.9147480130195618, 0.13914500176906586, -0.00007899999764049426, 0.9902719855308533,
+ 0.9924669861793518, -0.10311000049114227, -0.06616800278425217, 0.9926300048828125, 0.07926999777555466, 0.09165900200605392,
+ 0.900858998298645, 0.2553130090236664, 0.3510949909687042, 0.6513699889183044, 0.18318000435829163, 0.7363160252571106,
+ 0.15978699922561646, -0.02714099921286106, 0.9867780208587646, 0.9955620169639587, -0.09379199892282486, 0.0077309999614953995,
+ 0.9991030097007751, 0.01610800065100193, 0.039149001240730286, 0.9764699935913086, 0.12068899720907211, 0.17871999740600586,
+ 0.7859060168266296, 0.10103499889373779, 0.6100350022315979, 0.16579000651836395, -0.014832000248134136, 0.986050009727478,
+ 0.1655299961566925, -0.10078699886798859, 0.9810410141944885, -0.0046790000051259995, -0.1750659942626953, 0.9845460057258606,
+ -0.3859579861164093, -0.06494200229644775, 0.9202280044555664, -0.3219670057296753, -0.05600599944591522, 0.9450929760932922,
+ -0.6471610069274902, -0.11495299637317657, 0.7536370158195496, -0.5616440176963806, -0.078855000436306, 0.8236119747161865,
+ -0.8379700183868408, -0.23749999701976776, 0.4913240075111389, -0.7512590289115906, -0.1447169929742813, 0.6439470052719116,
+ -0.9052090048789978, -0.2807050049304962, 0.3190630078315735, -0.8249419927597046, -0.2209009975194931, 0.5202630162239075,
+ -0.13363699615001678, 0.0291920006275177, 0.9905999898910522, -0.4039649963378906, 0.0019519999623298645, 0.9147719740867615,
+ -0.7191359996795654, 0.002443999983370304, 0.6948649883270264, -0.9637579917907715, 0.026884999126195908, 0.26541900634765625,
+ -0.9637719988822937, 0.2207069993019104, -0.14977200329303741, 0.03522900119423866, 0.06716900318861008, 0.9971190094947815,
+ -0.3620629906654358, -0.01676199957728386, 0.9320030212402344, -0.6534259915351868, 0.007120999973267317, 0.7569569945335388,
+ -0.8528590202331543, 0.11686599999666214, 0.5088940262794495, -0.8814889788627625, 0.3579840064048767, 0.3079349994659424,
+ 0.0726580023765564, 0.02018200047314167, 0.9971529841423035, -0.37608298659324646, -0.025955000892281532, 0.926222026348114,
+ -0.6568350195884705, -0.015021000057458878, 0.7538840174674988, -0.8238760232925415, 0.03257700055837631, 0.5658339858055115,
+ -0.8688690066337585, 0.13078700006008148, 0.4774540066719055, 0.07265599817037582, -0.07700400054454803, 0.994379997253418,
+ -0.0343950018286705, -0.151870995759964, 0.9878020286560059, -0.40362000465393066, -0.05282000079751015, 0.9134010076522827,
+ -0.37586501240730286, -0.041078001260757446, 0.9257640242576599, -0.6878190040588379, -0.0810059979557991, 0.721347987651825,
+ -0.6558970212936401, -0.052101001143455505, 0.7530509829521179, -0.8708800077438354, -0.2062380015850067, 0.44613200426101685,
+ -0.8175939917564392, -0.12448199838399887, 0.5621780157089233, -0.8926960229873657, -0.3055669963359833, 0.33124300837516785,
+ -0.8565059900283813, -0.21024300158023834, 0.4713769853115082, -0.15155400335788727, -0.025412000715732574, 0.9881219863891602,
+ -0.41033700108528137, -0.0026420000940561295, 0.9119300246238708, -0.7240620255470276, 0.00047400000039488077, 0.6897349953651428,
+ -0.9655590057373047, -0.017078999429941177, 0.2596229910850525, -0.973825991153717, -0.19711799919605255, -0.1131730005145073,
+ 0.06214199960231781, 0.08235500007867813, 0.9946640133857727, -0.3334290087223053, 0.007625999860465527, 0.9427440166473389,
+ -0.608610987663269, 0.04885999858379364, 0.7919629812240601, -0.8253309726715088, 0.14631199836730957, 0.5453640222549438,
+ -0.9105669856071472, 0.3146660029888153, 0.2680560052394867, 0.16523399949073792, 0.04589800164103508, 0.985185980796814,
+ -0.32260099053382874, -0.010471000336110592, 0.9464769959449768, -0.5639140009880066, 0.015166000463068485, 0.8256940245628357,
+ -0.758965015411377, 0.05617399886250496, 0.6487039923667908, -0.8382350206375122, 0.14245299994945526, 0.5263739824295044,
+ 0.9727830290794373, -0.019794000312685966, 0.2308720052242279, 0.9828159809112549, -0.036465998739004135, 0.18095199763774872,
+ 0.9050639867782593, -0.02252200059592724, 0.4246790111064911, 0.8354039788246155, -0.03220000118017197, 0.5486930012702942,
+ 0.6465700268745422, -0.045921001583337784, 0.7614709734916687, 0.4826749861240387, -0.04895399883389473, 0.8744300007820129,
+ 0.4453999996185303, 0.17256900668144226, 0.8785430192947388, 0.47231200337409973, 0.13768500089645386, 0.8706120252609253,
+ 0.4824250042438507, 0.3898639976978302, 0.7843930125236511, 0.641398012638092, 0.4275979995727539, 0.6370000243186951,
+ 0.9863939881324768, 0.0994419977068901, 0.13091400265693665, 0.9154840111732483, 0.2120320051908493, 0.34195101261138916,
+ 0.7246469855308533, 0.245046004652977, 0.6440799832344055, 0.35685500502586365, 0.17885500192642212, 0.9168779850006104,
+ 0.14101800322532654, 0.24263200163841248, 0.9598140120506287, 0.9366779923439026, 0.16484400629997253, 0.3089669942855835,
+ 0.7982620000839233, 0.2441370040178299, 0.5506129860877991, 0.4769439995288849, 0.2904820144176483, 0.8295450210571289,
+ 0.4125959873199463, -0.017246000468730927, 0.9107509851455688, 0.341374009847641, -0.37689098715782166, 0.8610560297966003,
+ 0.9026100039482117, 0.14119599759578705, 0.40664398670196533, 0.7326020002365112, 0.1491979956626892, 0.6641039848327637,
+ 0.38115599751472473, 0.15792299807071686, 0.9109230041503906, 0.5317370295524597, -0.02143399976193905, 0.846638023853302,
+ 0.7915729880332947, -0.3539769947528839, 0.49810999631881714, 0.9087340235710144, -0.07959599792957306, 0.40971601009368896,
+ 0.9386569857597351, -0.17680299282073975, 0.29607900977134705, 0.7781569957733154, -0.19467000663280487, 0.5971400141716003,
+ 0.738847017288208, -0.07674700021743774, 0.6694890260696411, 0.43915998935699463, -0.22276799380779266, 0.870352029800415,
+ 0.3863860070705414, -0.0790880024433136, 0.918940007686615, 0.3576120138168335, 0.07325199991464615, 0.9309930205345154,
+ 0.5227140188217163, 0.16167999804019928, 0.8370360136032104, 0.4246380031108856, 0.3233239948749542, 0.845661997795105,
+ 0.733618974685669, 0.48907899856567383, 0.4718089997768402, 0.9886019825935364, -0.10717800259590149, 0.10573200136423111,
+ 0.9131960272789001, -0.22303399443626404, 0.3410690128803253, 0.7163559794425964, -0.25636500120162964, 0.6489310264587402,
+ 0.35149699449539185, -0.15968100726604462, 0.922469973564148, 0.07999800145626068, -0.2107039988040924, 0.9742709994316101,
+ 0.9883249998092651, 0.04732999950647354, 0.14482200145721436, 0.9210500121116638, 0.07413999736309052, 0.3823229968547821,
+ 0.6804890036582947, 0.11895299702882767, 0.7230389714241028, 0.4935390055179596, -0.10269299894571304, 0.8636389970779419,
+ 0.3912479877471924, -0.4752289950847626, 0.7880880236625671, 0.9700270295143127, 0.07970499992370605, 0.2295520007610321,
+ 0.831250011920929, 0.10592100024223328, 0.5457149744033813, 0.4774230122566223, 0.13252699375152588, 0.8686220049858093,
+ 0.47922399640083313, -0.0024129999801516533, 0.877689003944397, 0.6902980208396912, -0.29711300134658813, 0.6597059965133667,
+ 0.6312130093574524, 0.4550989866256714, 0.628055989742279, 0.26494699716567993, 0.5426689982414246, 0.797065019607544,
+ 0.4216960072517395, 0.6728450059890747, 0.6078259944915771, 0.7324270009994507, 0.5829970240592957, 0.35166099667549133,
+ 0.5086709856987, 0.8606399893760681, -0.023507000878453255, 0.7640720009803772, 0.6449369788169861, -0.015798000618815422,
+ 0.19029100239276886, 0.2773289978504181, -0.9417420029640198, 0.02588699944317341, 0.0005750000127591193, -0.9996650218963623,
+ -0.33045700192451477, -0.4387669861316681, -0.8356329798698425, -0.6271269917488098, -0.4645389914512634, -0.6252319812774658,
+ -0.02311599999666214, 0.2469020038843155, 0.9687650203704834, -0.012950999662280083, 0.45514100790023804, 0.8903250098228455,
+ -0.001180000021122396, 0.9888520240783691, 0.14889399707317352, 0.019520999863743782, 0.6841210126876831, -0.7291070222854614,
+ 0.012253000400960445, 0.007784999907016754, -0.9998949766159058, 0.3314639925956726, -0.3832260072231293, 0.8621309995651245,
+ 0.08274699747562408, -0.16047699749469757, 0.9835649728775024, -0.381630003452301, 0.638043999671936, 0.6687729954719543,
+ -0.44988399744033813, 0.787883996963501, -0.42052799463272095, -0.2780170142650604, 0.5983560085296631, -0.7514500021934509,
+ 0.7378140091896057, -0.4918749928474426, 0.4622659981250763, 0.6153389811515808, -0.45540300011634827, 0.6434019804000854,
+ -0.43678900599479675, 0.33411499857902527, 0.8352140188217163, -0.7429530024528503, 0.6388909816741943, -0.1995989978313446,
+ -0.7432950139045715, 0.5977380275726318, -0.3003700077533722, 0.7197920083999634, 0.5168960094451904, 0.4633769989013672,
+ 0.22183099389076233, 0.4485720098018646, 0.8657789826393127, 0.08203200250864029, 0.15848000347614288, 0.9839479923248291,
+ 0.5953459739685059, 0.4811680018901825, 0.6434599757194519, -0.37556400895118713, -0.6215270161628723, 0.6875,
+ -0.42666301131248474, -0.33534398674964905, 0.8399419784545898, -0.44476398825645447, -0.7887529730796814, -0.42432600259780884,
+ -0.7557309865951538, -0.6222699880599976, -0.20408600568771362, -0.4292669892311096, -0.5361850261688232, -0.7267979979515076,
+ -0.7655900120735168, -0.5671039819717407, -0.30375200510025024, 0.007348000071942806, -0.21113499999046326, 0.9774289727210999,
+ -0.01990099996328354, -0.4373210072517395, 0.8990849852561951, -0.008775000460445881, -0.9864199757575989, 0.16400499641895294,
+ 0.024855999276041985, -0.6829339861869812, -0.7300570011138916, 0.014514000155031681, 0.03655200079083443, -0.9992259740829468,
+ 0.40192899107933044, -0.4676550030708313, 0.7872430086135864, 0.41696101427078247, -0.6813820004463196, 0.6015490293502808,
+ 0.5033609867095947, -0.8637740015983582, -0.022839000448584557, 0.2058819979429245, -0.2945750057697296, -0.9331870079040527,
+ -0.2351589947938919, 0.5535579919815063, -0.7989199757575989, 0.6533820033073425, -0.435588002204895, 0.619156002998352,
+ 0.7555500268936157, -0.554410994052887, 0.3489600121974945, 0.7765160202980042, -0.6298360228538513, -0.01814199984073639,
+ 0.025975000113248825, 0.008264999836683273, -0.9996280074119568, -0.6086519956588745, 0.49536699056625366, -0.6198019981384277,
+ -0.9813200235366821, 0.19238099455833435, 0, -0.831650972366333, 0.5552989840507507, 0,
+ -0.4425640106201172, 0.38308998942375183, 0.8107889890670776, -0.5623509883880615, 0.11026400327682495, 0.8195139765739441,
+ 0.367917001247406, -0.15178599953651428, 0.917385995388031, 0.3960669934749603, -0.07774800062179565, 0.9149240255355835,
+ 0.3283520042896271, -0.13562799990177155, 0.9347670078277588, 0.3530749976634979, -0.06952299922704697, 0.9330080151557922,
+ -0.5935590267181396, 0.20035800337791443, 0.7794510126113892, -0.6201800107955933, 0.12245599925518036, 0.7748429775238037,
+ -0.5552989840507507, 0.831650972366333, 0, -0.2616960108280182, 0.523730993270874, 0.8106920123100281,
+ 0.2819640040397644, -0.2819199860095978, 0.9170699715614319, 0.25169798731803894, -0.25161200761795044, 0.9345269799232483,
+ -0.4710330069065094, 0.41249701380729675, 0.7797269821166992, -0.19238099455833435, 0.9813200235366821, 0,
+ -0.04031100124120712, 0.5840420126914978, 0.8107219934463501, 0.1517850011587143, -0.3678950071334839, 0.9173960089683533,
+ 0.13561999797821045, -0.3282899856567383, 0.9347900152206421, -0.27737799286842346, 0.561601996421814, 0.779528021812439,
+ -1, 0, 0, 0.29074999690055847, 0.5413560271263123, 0.7889220118522644,
+ 0.07767199724912643, -0.39607399702072144, 0.9149270057678223, 0.0693729966878891, -0.3530940115451813, 0.9330130219459534,
+ -0.12221000343561172, 0.6202139854431152, 0.7748550176620483, 0.19238099455833435, 0.9813200235366821, 0,
+ 0.5552989840507507, 0.831650972366333, 0, 0.38308998942375183, 0.4425640106201172, 0.8107889890670776,
+ 0.11026400327682495, 0.5623509883880615, 0.8195139765739441, -0.15178599953651428, -0.367917001247406, 0.917385995388031,
+ -0.07774800062179565, -0.3960669934749603, 0.9149240255355835, -0.13562799990177155, -0.3283520042896271, 0.9347670078277588,
+ -0.06952299922704697, -0.3530749976634979, 0.9330080151557922, 0.20035800337791443, 0.5935590267181396, 0.7794510126113892,
+ 0.12245599925518036, 0.6201800107955933, 0.7748429775238037, 0.831650972366333, 0.5552989840507507, 0,
+ 0.523730993270874, 0.2616960108280182, 0.8106920123100281, -0.2819199860095978, -0.2819640040397644, 0.9170699715614319,
+ -0.25161200761795044, -0.25169798731803894, 0.9345269799232483, 0.41249701380729675, 0.4710330069065094, 0.7797269821166992,
+ 0.9813200235366821, 0.19238099455833435, 0, 0.5840420126914978, 0.04031100124120712, 0.8107219934463501,
+ -0.3678950071334839, -0.1517850011587143, 0.9173960089683533, -0.3282899856567383, -0.13561999797821045, 0.9347900152206421,
+ 0.561601996421814, 0.27737799286842346, 0.779528021812439, -1, 0, 0,
+ 0.5413560271263123, -0.29074999690055847, 0.7889220118522644, -0.39607399702072144, -0.07767199724912643, 0.9149270057678223,
+ -0.3530940115451813, -0.0693729966878891, 0.9330130219459534, 0.6202139854431152, 0.12221000343561172, 0.7748550176620483,
+ 0.9813200235366821, -0.19238099455833435, 0, 0.831650972366333, -0.5552989840507507, 0,
+ 0.4425640106201172, -0.38308998942375183, 0.8107889890670776, 0.5623509883880615, -0.11026400327682495, 0.8195139765739441,
+ -0.367917001247406, 0.15178599953651428, 0.917385995388031, -0.3960669934749603, 0.07774800062179565, 0.9149240255355835,
+ -0.3283520042896271, 0.13562799990177155, 0.9347670078277588, -0.3530749976634979, 0.06952299922704697, 0.9330080151557922,
+ 0.5935590267181396, -0.20035800337791443, 0.7794510126113892, 0.6201800107955933, -0.12245599925518036, 0.7748429775238037,
+ 0.5552989840507507, -0.831650972366333, 0, 0.2616960108280182, -0.523730993270874, 0.8106920123100281,
+ -0.2819640040397644, 0.2819199860095978, 0.9170699715614319, -0.25169798731803894, 0.25161200761795044, 0.9345269799232483,
+ 0.4710330069065094, -0.41249701380729675, 0.7797269821166992, 0.19238099455833435, -0.9813200235366821, 0,
+ 0.04031100124120712, -0.5840420126914978, 0.8107219934463501, -0.1517850011587143, 0.3678950071334839, 0.9173960089683533,
+ -0.13561999797821045, 0.3282899856567383, 0.9347900152206421, 0.27737799286842346, -0.561601996421814, 0.779528021812439,
+ -1, 0, 0, -0.29074999690055847, -0.5413560271263123, 0.7889220118522644,
+ -0.07767199724912643, 0.39607399702072144, 0.9149270057678223, -0.0693729966878891, 0.3530940115451813, 0.9330130219459534,
+ 0.12221000343561172, -0.6202139854431152, 0.7748550176620483, -0.19238099455833435, -0.9813200235366821, 0,
+ -0.5552989840507507, -0.831650972366333, 0, -0.38308998942375183, -0.4425640106201172, 0.8107889890670776,
+ -0.11026400327682495, -0.5623509883880615, 0.8195139765739441, 0.15178599953651428, 0.367917001247406, 0.917385995388031,
+ 0.07774800062179565, 0.3960669934749603, 0.9149240255355835, 0.13562799990177155, 0.3283520042896271, 0.9347670078277588,
+ 0.06952299922704697, 0.3530749976634979, 0.9330080151557922, -0.20035800337791443, -0.5935590267181396, 0.7794510126113892,
+ -0.12245599925518036, -0.6201800107955933, 0.7748429775238037, -0.831650972366333, -0.5552989840507507, 0,
+ -0.523730993270874, -0.2616960108280182, 0.8106920123100281, 0.2819199860095978, 0.2819640040397644, 0.9170699715614319,
+ 0.25161200761795044, 0.25169798731803894, 0.9345269799232483, -0.41249701380729675, -0.4710330069065094, 0.7797269821166992,
+ -0.9813200235366821, -0.19238099455833435, 0, -0.5840420126914978, -0.04031100124120712, 0.8107219934463501,
+ 0.3678950071334839, 0.1517850011587143, 0.9173960089683533, 0.3282899856567383, 0.13561999797821045, 0.9347900152206421,
+ -0.561601996421814, -0.27737799286842346, 0.779528021812439, -1, 0, 0,
+ -0.5413560271263123, 0.29074999690055847, 0.7889220118522644, 0.39607399702072144, 0.07767199724912643, 0.9149270057678223,
+ 0.3530940115451813, 0.0693729966878891, 0.9330130219459534, -0.6202139854431152, -0.12221000343561172, 0.7748550176620483,
+ -0.6201800107955933, 0.12245599925518036, 0.7748429775238037, -0.5616469979286194, 0.27755099534988403, 0.7794349789619446,
+ -0.8979210257530212, 0.37159600853919983, 0.23590999841690063, -0.9542099833488464, 0.18841099739074707, 0.23234599828720093,
+ -0.9101200103759766, 0.3766449987888336, 0.17268399894237518, -0.966795027256012, 0.19089600443840027, 0.16990099847316742,
+ -0.8549879789352417, 0.35383298993110657, 0.3792079985141754, -0.9100499749183655, 0.17969100177288055, 0.3735229969024658,
+ -0.8064150214195251, 0.2724289894104004, 0.5248600244522095, -0.8383409976959229, 0.16553199291229248, 0.5194069743156433,
+ -0.4125959873199463, 0.47094500064849854, 0.7797279953956604, -0.687192976474762, 0.687192976474762, 0.23565199971199036,
+ -0.6965190172195435, 0.6965190172195435, 0.17240400612354279, -0.6544880270957947, 0.6544870138168335, 0.37853899598121643,
+ -0.6404970288276672, 0.5611429810523987, 0.5242909789085388, -0.20047900080680847, 0.5933949947357178, 0.7795450091362,
+ -0.3715969920158386, 0.8979210257530212, 0.23590999841690063, -0.3766449987888336, 0.9101200103759766, 0.17268399894237518,
+ -0.35383298993110657, 0.8549879789352417, 0.3792079985141754, -0.3770729899406433, 0.7630789875984192, 0.5249059796333313,
+ -0.12245900183916092, 0.6201940178871155, 0.7748309969902039, -0.18841099739074707, 0.9542099833488464, 0.23234599828720093,
+ -0.19089600443840027, 0.966795027256012, 0.16990099847316742, -0.17969200015068054, 0.9100499749183655, 0.3735229969024658,
+ -0.16553199291229248, 0.8383409976959229, 0.5194069743156433, 0.12245599925518036, 0.6201800107955933, 0.7748429775238037,
+ 0.27755099534988403, 0.5616469979286194, 0.7794349789619446, 0.37159600853919983, 0.8979210257530212, 0.23590999841690063,
+ 0.18841099739074707, 0.9542099833488464, 0.23234599828720093, 0.3766449987888336, 0.9101200103759766, 0.17268399894237518,
+ 0.19089600443840027, 0.966795027256012, 0.16990099847316742, 0.35383298993110657, 0.8549879789352417, 0.3792079985141754,
+ 0.17969100177288055, 0.9100499749183655, 0.3735229969024658, 0.2724289894104004, 0.8064150214195251, 0.5248600244522095,
+ 0.16553199291229248, 0.8383409976959229, 0.5194069743156433, 0.47094500064849854, 0.4125959873199463, 0.7797279953956604,
+ 0.687192976474762, 0.687192976474762, 0.23565199971199036, 0.6965190172195435, 0.6965190172195435, 0.17240400612354279,
+ 0.6544870138168335, 0.6544880270957947, 0.37853899598121643, 0.5611429810523987, 0.6404970288276672, 0.5242909789085388,
+ 0.5933949947357178, 0.20047900080680847, 0.7795450091362, 0.8979210257530212, 0.3715969920158386, 0.23590999841690063,
+ 0.9101200103759766, 0.3766449987888336, 0.17268399894237518, 0.8549879789352417, 0.35383298993110657, 0.3792079985141754,
+ 0.7630789875984192, 0.3770729899406433, 0.5249059796333313, 0.6201940178871155, 0.12245900183916092, 0.7748309969902039,
+ 0.9542099833488464, 0.18841099739074707, 0.23234599828720093, 0.966795027256012, 0.19089600443840027, 0.16990099847316742,
+ 0.9100499749183655, 0.17969200015068054, 0.3735229969024658, 0.8383409976959229, 0.16553199291229248, 0.5194069743156433,
+ 0.6201800107955933, -0.12245599925518036, 0.7748429775238037, 0.5616469979286194, -0.27755099534988403, 0.7794349789619446,
+ 0.8979210257530212, -0.37159600853919983, 0.23590999841690063, 0.9542099833488464, -0.18841099739074707, 0.23234599828720093,
+ 0.9101200103759766, -0.3766449987888336, 0.17268399894237518, 0.966795027256012, -0.19089600443840027, 0.16990099847316742,
+ 0.8549879789352417, -0.35383298993110657, 0.3792079985141754, 0.9100499749183655, -0.17969100177288055, 0.3735229969024658,
+ 0.8064150214195251, -0.2724289894104004, 0.5248600244522095, 0.8383409976959229, -0.16553199291229248, 0.5194069743156433,
+ 0.4125959873199463, -0.47094500064849854, 0.7797279953956604, 0.687192976474762, -0.687192976474762, 0.23565199971199036,
+ 0.6965190172195435, -0.6965190172195435, 0.17240400612354279, 0.6544880270957947, -0.6544870138168335, 0.37853899598121643,
+ 0.6404970288276672, -0.5611429810523987, 0.5242909789085388, 0.20047900080680847, -0.5933949947357178, 0.7795450091362,
+ 0.3715969920158386, -0.8979210257530212, 0.23590999841690063, 0.3766449987888336, -0.9101200103759766, 0.17268399894237518,
+ 0.35383298993110657, -0.8549879789352417, 0.3792079985141754, 0.3770729899406433, -0.7630789875984192, 0.5249059796333313,
+ 0.12245900183916092, -0.6201940178871155, 0.7748309969902039, 0.18841099739074707, -0.9542099833488464, 0.23234599828720093,
+ 0.19089600443840027, -0.966795027256012, 0.16990099847316742, 0.17969200015068054, -0.9100499749183655, 0.3735229969024658,
+ 0.16553199291229248, -0.8383409976959229, 0.5194069743156433, -0.12245599925518036, -0.6201800107955933, 0.7748429775238037,
+ -0.27755099534988403, -0.5616469979286194, 0.7794349789619446, -0.37159600853919983, -0.8979210257530212, 0.23590999841690063,
+ -0.18841099739074707, -0.9542099833488464, 0.23234599828720093, -0.3766449987888336, -0.9101200103759766, 0.17268399894237518,
+ -0.19089600443840027, -0.966795027256012, 0.16990099847316742, -0.35383298993110657, -0.8549879789352417, 0.3792079985141754,
+ -0.17969100177288055, -0.9100499749183655, 0.3735229969024658, -0.2724289894104004, -0.8064150214195251, 0.5248600244522095,
+ -0.16553199291229248, -0.8383409976959229, 0.5194069743156433, -0.47094500064849854, -0.4125959873199463, 0.7797279953956604,
+ -0.687192976474762, -0.687192976474762, 0.23565199971199036, -0.6965190172195435, -0.6965190172195435, 0.17240400612354279,
+ -0.6544870138168335, -0.6544880270957947, 0.37853899598121643, -0.5611429810523987, -0.6404970288276672, 0.5242909789085388,
+ -0.5933949947357178, -0.20047900080680847, 0.7795450091362, -0.8979210257530212, -0.3715969920158386, 0.23590999841690063,
+ -0.9101200103759766, -0.3766449987888336, 0.17268399894237518, -0.8549879789352417, -0.35383298993110657, 0.3792079985141754,
+ -0.7630789875984192, -0.3770729899406433, 0.5249059796333313, -0.6201940178871155, -0.12245900183916092, 0.7748309969902039,
+ -0.9542099833488464, -0.18841099739074707, 0.23234599828720093, -0.966795027256012, -0.19089600443840027, 0.16990099847316742,
+ -0.9100499749183655, -0.17969200015068054, 0.3735229969024658, -0.8383409976959229, -0.16553199291229248, 0.5194069743156433 };
+
+
+float teapotTexCoords[] = { 2, 2, 0, 1.75, 2, 0, 1.75, 1.975000023841858,
+ 0, 2, 1.975000023841858, 0, 1.75, 1.9500000476837158, 0, 2,
+ 1.9500000476837158, 0, 1.75, 1.9249999523162842, 0, 2, 1.9249999523162842, 0,
+ 1.75, 1.899999976158142, 0, 2, 1.899999976158142, 0, 1.5, 2,
+ 0, 1.5, 1.975000023841858, 0, 1.5, 1.9500000476837158, 0, 1.5,
+ 1.9249999523162842, 0, 1.5, 1.899999976158142, 0, 1.25, 2, 0,
+ 1.25, 1.975000023841858, 0, 1.25, 1.9500000476837158, 0, 1.25, 1.9249999523162842,
+ 0, 1.25, 1.899999976158142, 0, 1, 2, 0, 1,
+ 1.975000023841858, 0, 1, 1.9500000476837158, 0, 1, 1.9249999523162842, 0,
+ 1, 1.899999976158142, 0, 1, 2, 0, 0.75, 2,
+ 0, 0.75, 1.975000023841858, 0, 1, 1.975000023841858, 0, 0.75,
+ 1.9500000476837158, 0, 1, 1.9500000476837158, 0, 0.75, 1.9249999523162842, 0,
+ 1, 1.9249999523162842, 0, 0.75, 1.899999976158142, 0, 1, 1.899999976158142,
+ 0, 0.5, 2, 0, 0.5, 1.975000023841858, 0, 0.5,
+ 1.9500000476837158, 0, 0.5, 1.9249999523162842, 0, 0.5, 1.899999976158142, 0,
+ 0.25, 2, 0, 0.25, 1.975000023841858, 0, 0.25, 1.9500000476837158,
+ 0, 0.25, 1.9249999523162842, 0, 0.25, 1.899999976158142, 0, 0,
+ 2, 0, 0, 1.975000023841858, 0, 0, 1.9500000476837158, 0,
+ 0, 1.9249999523162842, 0, 0, 1.899999976158142, 0, 2, 2,
+ 0, 1.75, 2, 0, 1.75, 1.975000023841858, 0, 2,
+ 1.975000023841858, 0, 1.75, 1.9500000476837158, 0, 2, 1.9500000476837158, 0,
+ 1.75, 1.9249999523162842, 0, 2, 1.9249999523162842, 0, 1.75, 1.899999976158142,
+ 0, 2, 1.899999976158142, 0, 1.5, 2, 0, 1.5,
+ 1.975000023841858, 0, 1.5, 1.9500000476837158, 0, 1.5, 1.9249999523162842, 0,
+ 1.5, 1.899999976158142, 0, 1.25, 2, 0, 1.25, 1.975000023841858,
+ 0, 1.25, 1.9500000476837158, 0, 1.25, 1.9249999523162842, 0, 1.25,
+ 1.899999976158142, 0, 1, 2, 0, 1, 1.975000023841858, 0,
+ 1, 1.9500000476837158, 0, 1, 1.9249999523162842, 0, 1, 1.899999976158142,
+ 0, 1, 2, 0, 0.75, 2, 0, 0.75,
+ 1.975000023841858, 0, 1, 1.975000023841858, 0, 0.75, 1.9500000476837158, 0,
+ 1, 1.9500000476837158, 0, 0.75, 1.9249999523162842, 0, 1, 1.9249999523162842,
+ 0, 0.75, 1.899999976158142, 0, 1, 1.899999976158142, 0, 0.5,
+ 2, 0, 0.5, 1.975000023841858, 0, 0.5, 1.9500000476837158, 0,
+ 0.5, 1.9249999523162842, 0, 0.5, 1.899999976158142, 0, 0.25, 2,
+ 0, 0.25, 1.975000023841858, 0, 0.25, 1.9500000476837158, 0, 0.25,
+ 1.9249999523162842, 0, 0.25, 1.899999976158142, 0, 0, 2, 0,
+ 0, 1.975000023841858, 0, 0, 1.9500000476837158, 0, 0, 1.9249999523162842,
+ 0, 0, 1.899999976158142, 0, 2, 1.899999976158142, 0, 1.75,
+ 1.899999976158142, 0, 1.75, 1.6749999523162842, 0, 2, 1.6749999523162842, 0,
+ 1.75, 1.4500000476837158, 0, 2, 1.4500000476837158, 0, 1.75, 1.225000023841858,
+ 0, 2, 1.225000023841858, 0, 1.75, 1, 0, 2,
+ 1, 0, 1.5, 1.899999976158142, 0, 1.5, 1.6749999523162842, 0,
+ 1.5, 1.4500000476837158, 0, 1.5, 1.225000023841858, 0, 1.5, 1,
+ 0, 1.25, 1.899999976158142, 0, 1.25, 1.6749999523162842, 0, 1.25,
+ 1.4500000476837158, 0, 1.25, 1.225000023841858, 0, 1.25, 1, 0,
+ 1, 1.899999976158142, 0, 1, 1.6749999523162842, 0, 1, 1.4500000476837158,
+ 0, 1, 1.225000023841858, 0, 1, 1, 0, 1,
+ 1.899999976158142, 0, 0.75, 1.899999976158142, 0, 0.75, 1.6749999523162842, 0,
+ 1, 1.6749999523162842, 0, 0.75, 1.4500000476837158, 0, 1, 1.4500000476837158,
+ 0, 0.75, 1.225000023841858, 0, 1, 1.225000023841858, 0, 0.75,
+ 1, 0, 1, 1, 0, 0.5, 1.899999976158142, 0,
+ 0.5, 1.6749999523162842, 0, 0.5, 1.4500000476837158, 0, 0.5, 1.225000023841858,
+ 0, 0.5, 1, 0, 0.25, 1.899999976158142, 0, 0.25,
+ 1.6749999523162842, 0, 0.25, 1.4500000476837158, 0, 0.25, 1.225000023841858, 0,
+ 0.25, 1, 0, 0, 1.899999976158142, 0, 0, 1.6749999523162842,
+ 0, 0, 1.4500000476837158, 0, 0, 1.225000023841858, 0, 0,
+ 1, 0, 2, 1.899999976158142, 0, 1.75, 1.899999976158142, 0,
+ 1.75, 1.6749999523162842, 0, 2, 1.6749999523162842, 0, 1.75, 1.4500000476837158,
+ 0, 2, 1.4500000476837158, 0, 1.75, 1.225000023841858, 0, 2,
+ 1.225000023841858, 0, 1.75, 1, 0, 2, 1, 0,
+ 1.5, 1.899999976158142, 0, 1.5, 1.6749999523162842, 0, 1.5, 1.4500000476837158,
+ 0, 1.5, 1.225000023841858, 0, 1.5, 1, 0, 1.25,
+ 1.899999976158142, 0, 1.25, 1.6749999523162842, 0, 1.25, 1.4500000476837158, 0,
+ 1.25, 1.225000023841858, 0, 1.25, 1, 0, 1, 1.899999976158142,
+ 0, 1, 1.6749999523162842, 0, 1, 1.4500000476837158, 0, 1,
+ 1.225000023841858, 0, 1, 1, 0, 1, 1.899999976158142, 0,
+ 0.75, 1.899999976158142, 0, 0.75, 1.6749999523162842, 0, 1, 1.6749999523162842,
+ 0, 0.75, 1.4500000476837158, 0, 1, 1.4500000476837158, 0, 0.75,
+ 1.225000023841858, 0, 1, 1.225000023841858, 0, 0.75, 1, 0,
+ 1, 1, 0, 0.5, 1.899999976158142, 0, 0.5, 1.6749999523162842,
+ 0, 0.5, 1.4500000476837158, 0, 0.5, 1.225000023841858, 0, 0.5,
+ 1, 0, 0.25, 1.899999976158142, 0, 0.25, 1.6749999523162842, 0,
+ 0.25, 1.4500000476837158, 0, 0.25, 1.225000023841858, 0, 0.25, 1,
+ 0, 0, 1.899999976158142, 0, 0, 1.6749999523162842, 0, 0,
+ 1.4500000476837158, 0, 0, 1.225000023841858, 0, 0, 1, 0,
+ 2, 1, 0, 1.75, 1, 0, 1.75, 0.8500000238418579,
+ 0, 2, 0.8500000238418579, 0, 1.75, 0.699999988079071, 0, 2,
+ 0.699999988079071, 0, 1.75, 0.550000011920929, 0, 2, 0.550000011920929, 0,
+ 1.75, 0.4000000059604645, 0, 2, 0.4000000059604645, 0, 1.5, 1,
+ 0, 1.5, 0.8500000238418579, 0, 1.5, 0.699999988079071, 0, 1.5,
+ 0.550000011920929, 0, 1.5, 0.4000000059604645, 0, 1.25, 1, 0,
+ 1.25, 0.8500000238418579, 0, 1.25, 0.699999988079071, 0, 1.25, 0.550000011920929,
+ 0, 1.25, 0.4000000059604645, 0, 1, 1, 0, 1,
+ 0.8500000238418579, 0, 1, 0.699999988079071, 0, 1, 0.550000011920929, 0,
+ 1, 0.4000000059604645, 0, 1, 1, 0, 0.75, 1,
+ 0, 0.75, 0.8500000238418579, 0, 1, 0.8500000238418579, 0, 0.75,
+ 0.699999988079071, 0, 1, 0.699999988079071, 0, 0.75, 0.550000011920929, 0,
+ 1, 0.550000011920929, 0, 0.75, 0.4000000059604645, 0, 1, 0.4000000059604645,
+ 0, 0.5, 1, 0, 0.5, 0.8500000238418579, 0, 0.5,
+ 0.699999988079071, 0, 0.5, 0.550000011920929, 0, 0.5, 0.4000000059604645, 0,
+ 0.25, 1, 0, 0.25, 0.8500000238418579, 0, 0.25, 0.699999988079071,
+ 0, 0.25, 0.550000011920929, 0, 0.25, 0.4000000059604645, 0, 0,
+ 1, 0, 0, 0.8500000238418579, 0, 0, 0.699999988079071, 0,
+ 0, 0.550000011920929, 0, 0, 0.4000000059604645, 0, 2, 1,
+ 0, 1.75, 1, 0, 1.75, 0.8500000238418579, 0, 2,
+ 0.8500000238418579, 0, 1.75, 0.699999988079071, 0, 2, 0.699999988079071, 0,
+ 1.75, 0.550000011920929, 0, 2, 0.550000011920929, 0, 1.75, 0.4000000059604645,
+ 0, 2, 0.4000000059604645, 0, 1.5, 1, 0, 1.5,
+ 0.8500000238418579, 0, 1.5, 0.699999988079071, 0, 1.5, 0.550000011920929, 0,
+ 1.5, 0.4000000059604645, 0, 1.25, 1, 0, 1.25, 0.8500000238418579,
+ 0, 1.25, 0.699999988079071, 0, 1.25, 0.550000011920929, 0, 1.25,
+ 0.4000000059604645, 0, 1, 1, 0, 1, 0.8500000238418579, 0,
+ 1, 0.699999988079071, 0, 1, 0.550000011920929, 0, 1, 0.4000000059604645,
+ 0, 1, 1, 0, 0.75, 1, 0, 0.75,
+ 0.8500000238418579, 0, 1, 0.8500000238418579, 0, 0.75, 0.699999988079071, 0,
+ 1, 0.699999988079071, 0, 0.75, 0.550000011920929, 0, 1, 0.550000011920929,
+ 0, 0.75, 0.4000000059604645, 0, 1, 0.4000000059604645, 0, 0.5,
+ 1, 0, 0.5, 0.8500000238418579, 0, 0.5, 0.699999988079071, 0,
+ 0.5, 0.550000011920929, 0, 0.5, 0.4000000059604645, 0, 0.25, 1,
+ 0, 0.25, 0.8500000238418579, 0, 0.25, 0.699999988079071, 0, 0.25,
+ 0.550000011920929, 0, 0.25, 0.4000000059604645, 0, 0, 1, 0,
+ 0, 0.8500000238418579, 0, 0, 0.699999988079071, 0, 0, 0.550000011920929,
+ 0, 0, 0.4000000059604645, 0, 2, 0.4000000059604645, 0, 1.75,
+ 0.4000000059604645, 0, 1.75, 0.30000001192092896, 0, 2, 0.30000001192092896, 0,
+ 1.75, 0.20000000298023224, 0, 2, 0.20000000298023224, 0, 1.75, 0.10000000149011612,
+ 0, 2, 0.10000000149011612, 0, 1.75, 0, 0, 2,
+ 0, 0, 1.5, 0.4000000059604645, 0, 1.5, 0.30000001192092896, 0,
+ 1.5, 0.20000000298023224, 0, 1.5, 0.10000000149011612, 0, 1.5, 0,
+ 0, 1.25, 0.4000000059604645, 0, 1.25, 0.30000001192092896, 0, 1.25,
+ 0.20000000298023224, 0, 1.25, 0.10000000149011612, 0, 1.25, 0, 0,
+ 1, 0.4000000059604645, 0, 1, 0.30000001192092896, 0, 1, 0.20000000298023224,
+ 0, 1, 0.10000000149011612, 0, 1, 0, 0, 1,
+ 0.4000000059604645, 0, 0.75, 0.4000000059604645, 0, 0.75, 0.30000001192092896, 0,
+ 1, 0.30000001192092896, 0, 0.75, 0.20000000298023224, 0, 1, 0.20000000298023224,
+ 0, 0.75, 0.10000000149011612, 0, 1, 0.10000000149011612, 0, 0.75,
+ 0, 0, 1, 0, 0, 0.5, 0.4000000059604645, 0,
+ 0.5, 0.30000001192092896, 0, 0.5, 0.20000000298023224, 0, 0.5, 0.10000000149011612,
+ 0, 0.5, 0, 0, 0.25, 0.4000000059604645, 0, 0.25,
+ 0.30000001192092896, 0, 0.25, 0.20000000298023224, 0, 0.25, 0.10000000149011612, 0,
+ 0.25, 0, 0, 0, 0.4000000059604645, 0, 0, 0.30000001192092896,
+ 0, 0, 0.20000000298023224, 0, 0, 0.10000000149011612, 0, 0,
+ 0, 0, 2, 0.4000000059604645, 0, 1.75, 0.4000000059604645, 0,
+ 1.75, 0.30000001192092896, 0, 2, 0.30000001192092896, 0, 1.75, 0.20000000298023224,
+ 0, 2, 0.20000000298023224, 0, 1.75, 0.10000000149011612, 0, 2,
+ 0.10000000149011612, 0, 1.75, 0, 0, 2, 0, 0,
+ 1.5, 0.4000000059604645, 0, 1.5, 0.30000001192092896, 0, 1.5, 0.20000000298023224,
+ 0, 1.5, 0.10000000149011612, 0, 1.5, 0, 0, 1.25,
+ 0.4000000059604645, 0, 1.25, 0.30000001192092896, 0, 1.25, 0.20000000298023224, 0,
+ 1.25, 0.10000000149011612, 0, 1.25, 0, 0, 1, 0.4000000059604645,
+ 0, 1, 0.30000001192092896, 0, 1, 0.20000000298023224, 0, 1,
+ 0.10000000149011612, 0, 1, 0, 0, 1, 0.4000000059604645, 0,
+ 0.75, 0.4000000059604645, 0, 0.75, 0.30000001192092896, 0, 1, 0.30000001192092896,
+ 0, 0.75, 0.20000000298023224, 0, 1, 0.20000000298023224, 0, 0.75,
+ 0.10000000149011612, 0, 1, 0.10000000149011612, 0, 0.75, 0, 0,
+ 1, 0, 0, 0.5, 0.4000000059604645, 0, 0.5, 0.30000001192092896,
+ 0, 0.5, 0.20000000298023224, 0, 0.5, 0.10000000149011612, 0, 0.5,
+ 0, 0, 0.25, 0.4000000059604645, 0, 0.25, 0.30000001192092896, 0,
+ 0.25, 0.20000000298023224, 0, 0.25, 0.10000000149011612, 0, 0.25, 0,
+ 0, 0, 0.4000000059604645, 0, 0, 0.30000001192092896, 0, 0,
+ 0.20000000298023224, 0, 0, 0.10000000149011612, 0, 0, 0, 0,
+ 1, 1, 0, 0.875, 1, 0, 0.875, 0.875,
+ 0, 1, 0.875, 0, 0.875, 0.75, 0, 1,
+ 0.75, 0, 0.875, 0.625, 0, 1, 0.625, 0,
+ 0.875, 0.5, 0, 1, 0.5, 0, 0.75, 1,
+ 0, 0.75, 0.875, 0, 0.75, 0.75, 0, 0.75,
+ 0.625, 0, 0.75, 0.5, 0, 0.625, 1, 0,
+ 0.625, 0.875, 0, 0.625, 0.75, 0, 0.625, 0.625,
+ 0, 0.625, 0.5, 0, 0.5, 1, 0, 0.5,
+ 0.875, 0, 0.5, 0.75, 0, 0.5, 0.625, 0,
+ 0.5, 0.5, 0, 0.5, 1, 0, 0.375, 1,
+ 0, 0.375, 0.875, 0, 0.5, 0.875, 0, 0.375,
+ 0.75, 0, 0.5, 0.75, 0, 0.375, 0.625, 0,
+ 0.5, 0.625, 0, 0.375, 0.5, 0, 0.5, 0.5,
+ 0, 0.25, 1, 0, 0.25, 0.875, 0, 0.25,
+ 0.75, 0, 0.25, 0.625, 0, 0.25, 0.5, 0,
+ 0.125, 1, 0, 0.125, 0.875, 0, 0.125, 0.75,
+ 0, 0.125, 0.625, 0, 0.125, 0.5, 0, 0,
+ 1, 0, 0, 0.875, 0, 0, 0.75, 0,
+ 0, 0.625, 0, 0, 0.5, 0, 1, 0.5,
+ 0, 0.875, 0.5, 0, 0.875, 0.375, 0, 1,
+ 0.375, 0, 0.875, 0.25, 0, 1, 0.25, 0,
+ 0.875, 0.125, 0, 1, 0.125, 0, 0.875, 0,
+ 0, 1, 0, 0, 0.75, 0.5, 0, 0.75,
+ 0.375, 0, 0.75, 0.25, 0, 0.75, 0.125, 0,
+ 0.75, 0, 0, 0.625, 0.5, 0, 0.625, 0.375,
+ 0, 0.625, 0.25, 0, 0.625, 0.125, 0, 0.625,
+ 0, 0, 0.5, 0.5, 0, 0.5, 0.375, 0,
+ 0.5, 0.25, 0, 0.5, 0.125, 0, 0.5, 0,
+ 0, 0.5, 0.5, 0, 0.375, 0.5, 0, 0.375,
+ 0.375, 0, 0.5, 0.375, 0, 0.375, 0.25, 0,
+ 0.5, 0.25, 0, 0.375, 0.125, 0, 0.5, 0.125,
+ 0, 0.375, 0, 0, 0.5, 0, 0, 0.25,
+ 0.5, 0, 0.25, 0.375, 0, 0.25, 0.25, 0,
+ 0.25, 0.125, 0, 0.25, 0, 0, 0.125, 0.5,
+ 0, 0.125, 0.375, 0, 0.125, 0.25, 0, 0.125,
+ 0.125, 0, 0.125, 0, 0, 0, 0.5, 0,
+ 0, 0.375, 0, 0, 0.25, 0, 0, 0.125,
+ 0, 0, 0, 0, 0.5, 0, 0, 0.625,
+ 0, 0, 0.625, 0.22499999403953552, 0, 0.5, 0.22499999403953552, 0,
+ 0.625, 0.44999998807907104, 0, 0.5, 0.44999998807907104, 0, 0.625, 0.675000011920929,
+ 0, 0.5, 0.675000011920929, 0, 0.625, 0.8999999761581421, 0, 0.5,
+ 0.8999999761581421, 0, 0.75, 0, 0, 0.75, 0.22499999403953552, 0,
+ 0.75, 0.44999998807907104, 0, 0.75, 0.675000011920929, 0, 0.75, 0.8999999761581421,
+ 0, 0.875, 0, 0, 0.875, 0.22499999403953552, 0, 0.875,
+ 0.44999998807907104, 0, 0.875, 0.675000011920929, 0, 0.875, 0.8999999761581421, 0,
+ 1, 0, 0, 1, 0.22499999403953552, 0, 1, 0.44999998807907104,
+ 0, 1, 0.675000011920929, 0, 1, 0.8999999761581421, 0, 0,
+ 0, 0, 0.125, 0, 0, 0.125, 0.22499999403953552, 0,
+ 0, 0.22499999403953552, 0, 0.125, 0.44999998807907104, 0, 0, 0.44999998807907104,
+ 0, 0.125, 0.675000011920929, 0, 0, 0.675000011920929, 0, 0.125,
+ 0.8999999761581421, 0, 0, 0.8999999761581421, 0, 0.25, 0, 0,
+ 0.25, 0.22499999403953552, 0, 0.25, 0.44999998807907104, 0, 0.25, 0.675000011920929,
+ 0, 0.25, 0.8999999761581421, 0, 0.375, 0, 0, 0.375,
+ 0.22499999403953552, 0, 0.375, 0.44999998807907104, 0, 0.375, 0.675000011920929, 0,
+ 0.375, 0.8999999761581421, 0, 0.5, 0, 0, 0.5, 0.22499999403953552,
+ 0, 0.5, 0.44999998807907104, 0, 0.5, 0.675000011920929, 0, 0.5,
+ 0.8999999761581421, 0, 0.5, 0.8999999761581421, 0, 0.625, 0.8999999761581421, 0,
+ 0.625, 0.925000011920929, 0, 0.5, 0.925000011920929, 0, 0.625, 0.949999988079071,
+ 0, 0.5, 0.949999988079071, 0, 0.625, 0.9750000238418579, 0, 0.5,
+ 0.9750000238418579, 0, 0.625, 1, 0, 0.5, 1, 0,
+ 0.75, 0.8999999761581421, 0, 0.75, 0.925000011920929, 0, 0.75, 0.949999988079071,
+ 0, 0.75, 0.9750000238418579, 0, 0.75, 1, 0, 0.875,
+ 0.8999999761581421, 0, 0.875, 0.925000011920929, 0, 0.875, 0.949999988079071, 0,
+ 0.875, 0.9750000238418579, 0, 0.875, 1, 0, 1, 0.8999999761581421,
+ 0, 1, 0.925000011920929, 0, 1, 0.949999988079071, 0, 1,
+ 0.9750000238418579, 0, 1, 1, 0, 0, 0.8999999761581421, 0,
+ 0.125, 0.8999999761581421, 0, 0.125, 0.925000011920929, 0, 0, 0.925000011920929,
+ 0, 0.125, 0.949999988079071, 0, 0, 0.949999988079071, 0, 0.125,
+ 0.9750000238418579, 0, 0, 0.9750000238418579, 0, 0.125, 1, 0,
+ 0, 1, 0, 0.25, 0.8999999761581421, 0, 0.25, 0.925000011920929,
+ 0, 0.25, 0.949999988079071, 0, 0.25, 0.9750000238418579, 0, 0.25,
+ 1, 0, 0.375, 0.8999999761581421, 0, 0.375, 0.925000011920929, 0,
+ 0.375, 0.949999988079071, 0, 0.375, 0.9750000238418579, 0, 0.375, 1,
+ 0, 0.5, 0.8999999761581421, 0, 0.5, 0.925000011920929, 0, 0.5,
+ 0.949999988079071, 0, 0.5, 0.9750000238418579, 0, 0.5, 1, 0,
+ 1, 1, 0, 0.875, 1, 0, 0.875, 0.75,
+ 0, 1, 0.75, 0, 0.875, 0.5, 0, 1,
+ 0.5, 0, 0.875, 0.25, 0, 1, 0.25, 0,
+ 0.875, 0, 0, 1, 0, 0, 0.75, 1,
+ 0, 0.75, 0.75, 0, 0.75, 0.5, 0, 0.75,
+ 0.25, 0, 0.75, 0, 0, 0.625, 1, 0,
+ 0.625, 0.75, 0, 0.625, 0.5, 0, 0.625, 0.25,
+ 0, 0.625, 0, 0, 0.5, 1, 0, 0.5,
+ 0.75, 0, 0.5, 0.5, 0, 0.5, 0.25, 0,
+ 0.5, 0, 0, 0.5, 1, 0, 0.375, 1,
+ 0, 0.375, 0.75, 0, 0.5, 0.75, 0, 0.375,
+ 0.5, 0, 0.5, 0.5, 0, 0.375, 0.25, 0,
+ 0.5, 0.25, 0, 0.375, 0, 0, 0.5, 0,
+ 0, 0.25, 1, 0, 0.25, 0.75, 0, 0.25,
+ 0.5, 0, 0.25, 0.25, 0, 0.25, 0, 0,
+ 0.125, 1, 0, 0.125, 0.75, 0, 0.125, 0.5,
+ 0, 0.125, 0.25, 0, 0.125, 0, 0, 0,
+ 1, 0, 0, 0.75, 0, 0, 0.5, 0,
+ 0, 0.25, 0, 0, 0, 0, 1, 1,
+ 0, 0.875, 1, 0, 0.875, 0.75, 0, 1,
+ 0.75, 0, 0.875, 0.5, 0, 1, 0.5, 0,
+ 0.875, 0.25, 0, 1, 0.25, 0, 0.875, 0,
+ 0, 1, 0, 0, 0.75, 1, 0, 0.75,
+ 0.75, 0, 0.75, 0.5, 0, 0.75, 0.25, 0,
+ 0.75, 0, 0, 0.625, 1, 0, 0.625, 0.75,
+ 0, 0.625, 0.5, 0, 0.625, 0.25, 0, 0.625,
+ 0, 0, 0.5, 1, 0, 0.5, 0.75, 0,
+ 0.5, 0.5, 0, 0.5, 0.25, 0, 0.5, 0,
+ 0, 0.5, 1, 0, 0.375, 1, 0, 0.375,
+ 0.75, 0, 0.5, 0.75, 0, 0.375, 0.5, 0,
+ 0.5, 0.5, 0, 0.375, 0.25, 0, 0.5, 0.25,
+ 0, 0.375, 0, 0, 0.5, 0, 0, 0.25,
+ 1, 0, 0.25, 0.75, 0, 0.25, 0.5, 0,
+ 0.25, 0.25, 0, 0.25, 0, 0, 0.125, 1,
+ 0, 0.125, 0.75, 0, 0.125, 0.5, 0, 0.125,
+ 0.25, 0, 0.125, 0, 0, 0, 1, 0,
+ 0, 0.75, 0, 0, 0.5, 0, 0, 0.25,
+ 0, 0, 0, 0, 1, 1, 0, 0.875,
+ 1, 0, 0.875, 0.75, 0, 1, 0.75, 0,
+ 0.875, 0.5, 0, 1, 0.5, 0, 0.875, 0.25,
+ 0, 1, 0.25, 0, 0.875, 0, 0, 1,
+ 0, 0, 0.75, 1, 0, 0.75, 0.75, 0,
+ 0.75, 0.5, 0, 0.75, 0.25, 0, 0.75, 0,
+ 0, 0.625, 1, 0, 0.625, 0.75, 0, 0.625,
+ 0.5, 0, 0.625, 0.25, 0, 0.625, 0, 0,
+ 0.5, 1, 0, 0.5, 0.75, 0, 0.5, 0.5,
+ 0, 0.5, 0.25, 0, 0.5, 0, 0, 0.5,
+ 1, 0, 0.375, 1, 0, 0.375, 0.75, 0,
+ 0.5, 0.75, 0, 0.375, 0.5, 0, 0.5, 0.5,
+ 0, 0.375, 0.25, 0, 0.5, 0.25, 0, 0.375,
+ 0, 0, 0.5, 0, 0, 0.25, 1, 0,
+ 0.25, 0.75, 0, 0.25, 0.5, 0, 0.25, 0.25,
+ 0, 0.25, 0, 0, 0.125, 1, 0, 0.125,
+ 0.75, 0, 0.125, 0.5, 0, 0.125, 0.25, 0,
+ 0.125, 0, 0, 0, 1, 0, 0, 0.75,
+ 0, 0, 0.5, 0, 0, 0.25, 0, 0,
+ 0, 0, 1, 1, 0, 0.875, 1, 0,
+ 0.875, 0.75, 0, 1, 0.75, 0, 0.875, 0.5,
+ 0, 1, 0.5, 0, 0.875, 0.25, 0, 1,
+ 0.25, 0, 0.875, 0, 0, 1, 0, 0,
+ 0.75, 1, 0, 0.75, 0.75, 0, 0.75, 0.5,
+ 0, 0.75, 0.25, 0, 0.75, 0, 0, 0.625,
+ 1, 0, 0.625, 0.75, 0, 0.625, 0.5, 0,
+ 0.625, 0.25, 0, 0.625, 0, 0, 0.5, 1,
+ 0, 0.5, 0.75, 0, 0.5, 0.5, 0, 0.5,
+ 0.25, 0, 0.5, 0, 0, 0.5, 1, 0,
+ 0.375, 1, 0, 0.375, 0.75, 0, 0.5, 0.75,
+ 0, 0.375, 0.5, 0, 0.5, 0.5, 0, 0.375,
+ 0.25, 0, 0.5, 0.25, 0, 0.375, 0, 0,
+ 0.5, 0, 0, 0.25, 1, 0, 0.25, 0.75,
+ 0, 0.25, 0.5, 0, 0.25, 0.25, 0, 0.25,
+ 0, 0, 0.125, 1, 0, 0.125, 0.75, 0,
+ 0.125, 0.5, 0, 0.125, 0.25, 0, 0.125, 0,
+ 0, 0, 1, 0, 0, 0.75, 0, 0,
+ 0.5, 0, 0, 0.25, 0, 0, 0, 0 };
+
+uint16_t teapotIndices[] = { 0, 1, 2, 2, 3, 0, 3, 2, 4, 4, 5, 3, 5, 4, 6, 6, 7, 5, 7, 6, 8, 8, 9, 7,
+ 1, 10, 11, 11, 2, 1, 2, 11, 12, 12, 4, 2, 4, 12, 13, 13, 6, 4, 6, 13, 14, 14, 8, 6,
+ 10, 15, 16, 16, 11, 10, 11, 16, 17, 17, 12, 11, 12, 17, 18, 18, 13, 12, 13, 18, 19, 19, 14, 13,
+ 15, 20, 21, 21, 16, 15, 16, 21, 22, 22, 17, 16, 17, 22, 23, 23, 18, 17, 18, 23, 24, 24, 19, 18,
+ 25, 26, 27, 27, 28, 25, 28, 27, 29, 29, 30, 28, 30, 29, 31, 31, 32, 30, 32, 31, 33, 33, 34, 32,
+ 26, 35, 36, 36, 27, 26, 27, 36, 37, 37, 29, 27, 29, 37, 38, 38, 31, 29, 31, 38, 39, 39, 33, 31,
+ 35, 40, 41, 41, 36, 35, 36, 41, 42, 42, 37, 36, 37, 42, 43, 43, 38, 37, 38, 43, 44, 44, 39, 38,
+ 40, 45, 46, 46, 41, 40, 41, 46, 47, 47, 42, 41, 42, 47, 48, 48, 43, 42, 43, 48, 49, 49, 44, 43,
+ 50, 51, 52, 52, 53, 50, 53, 52, 54, 54, 55, 53, 55, 54, 56, 56, 57, 55, 57, 56, 58, 58, 59, 57,
+ 51, 60, 61, 61, 52, 51, 52, 61, 62, 62, 54, 52, 54, 62, 63, 63, 56, 54, 56, 63, 64, 64, 58, 56,
+ 60, 65, 66, 66, 61, 60, 61, 66, 67, 67, 62, 61, 62, 67, 68, 68, 63, 62, 63, 68, 69, 69, 64, 63,
+ 65, 70, 71, 71, 66, 65, 66, 71, 72, 72, 67, 66, 67, 72, 73, 73, 68, 67, 68, 73, 74, 74, 69, 68,
+ 75, 76, 77, 77, 78, 75, 78, 77, 79, 79, 80, 78, 80, 79, 81, 81, 82, 80, 82, 81, 83, 83, 84, 82,
+ 76, 85, 86, 86, 77, 76, 77, 86, 87, 87, 79, 77, 79, 87, 88, 88, 81, 79, 81, 88, 89, 89, 83, 81,
+ 85, 90, 91, 91, 86, 85, 86, 91, 92, 92, 87, 86, 87, 92, 93, 93, 88, 87, 88, 93, 94, 94, 89, 88,
+ 90, 95, 96, 96, 91, 90, 91, 96, 97, 97, 92, 91, 92, 97, 98, 98, 93, 92, 93, 98, 99, 99, 94, 93,
+ 100, 101, 102, 102, 103, 100, 103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108, 108, 109, 107,
+ 101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102, 104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106,
+ 110, 115, 116, 116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112, 113, 118, 119, 119, 114, 113,
+ 115, 120, 121, 121, 116, 115, 116, 121, 122, 122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,
+ 125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131, 131, 132, 130, 132, 131, 133, 133, 134, 132,
+ 126, 135, 136, 136, 127, 126, 127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139, 139, 133, 131,
+ 135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136, 137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138,
+ 140, 145, 146, 146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142, 143, 148, 149, 149, 144, 143,
+ 150, 151, 152, 152, 153, 150, 153, 152, 154, 154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,
+ 151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163, 163, 156, 154, 156, 163, 164, 164, 158, 156,
+ 160, 165, 166, 166, 161, 160, 161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169, 169, 164, 163,
+ 165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166, 167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168,
+ 175, 176, 177, 177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180, 182, 181, 183, 183, 184, 182,
+ 176, 185, 186, 186, 177, 176, 177, 186, 187, 187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,
+ 185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193, 193, 188, 187, 188, 193, 194, 194, 189, 188,
+ 190, 195, 196, 196, 191, 190, 191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199, 199, 194, 193,
+ 200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203, 205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207,
+ 201, 210, 211, 211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204, 206, 213, 214, 214, 208, 206,
+ 210, 215, 216, 216, 211, 210, 211, 216, 217, 217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,
+ 215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223, 223, 218, 217, 218, 223, 224, 224, 219, 218,
+ 225, 226, 227, 227, 228, 225, 228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233, 233, 234, 232,
+ 226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227, 229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231,
+ 235, 240, 241, 241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237, 238, 243, 244, 244, 239, 238,
+ 240, 245, 246, 246, 241, 240, 241, 246, 247, 247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,
+ 250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256, 256, 257, 255, 257, 256, 258, 258, 259, 257,
+ 251, 260, 261, 261, 252, 251, 252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264, 264, 258, 256,
+ 260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261, 262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263,
+ 265, 270, 271, 271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267, 268, 273, 274, 274, 269, 268,
+ 275, 276, 277, 277, 278, 275, 278, 277, 279, 279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,
+ 276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288, 288, 281, 279, 281, 288, 289, 289, 283, 281,
+ 285, 290, 291, 291, 286, 285, 286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294, 294, 289, 288,
+ 290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291, 292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293,
+ 300, 301, 302, 302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305, 307, 306, 308, 308, 309, 307,
+ 301, 310, 311, 311, 302, 301, 302, 311, 312, 312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,
+ 310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318, 318, 313, 312, 313, 318, 319, 319, 314, 313,
+ 315, 320, 321, 321, 316, 315, 316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324, 324, 319, 318,
+ 325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328, 330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332,
+ 326, 335, 336, 336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329, 331, 338, 339, 339, 333, 331,
+ 335, 340, 341, 341, 336, 335, 336, 341, 342, 342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,
+ 340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348, 348, 343, 342, 343, 348, 349, 349, 344, 343,
+ 350, 351, 352, 352, 353, 350, 353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358, 358, 359, 357,
+ 351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352, 354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356,
+ 360, 365, 366, 366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362, 363, 368, 369, 369, 364, 363,
+ 365, 370, 371, 371, 366, 365, 366, 371, 372, 372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,
+ 375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381, 381, 382, 380, 382, 381, 383, 383, 384, 382,
+ 376, 385, 386, 386, 377, 376, 377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389, 389, 383, 381,
+ 385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386, 387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388,
+ 390, 395, 396, 396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392, 393, 398, 399, 399, 394, 393,
+ 400, 401, 402, 402, 403, 400, 403, 402, 404, 404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,
+ 401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413, 413, 406, 404, 406, 413, 414, 414, 408, 406,
+ 410, 415, 416, 416, 411, 410, 411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419, 419, 414, 413,
+ 415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416, 417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418,
+ 425, 426, 427, 427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430, 432, 431, 433, 433, 434, 432,
+ 426, 435, 436, 436, 427, 426, 427, 436, 437, 437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,
+ 435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443, 443, 438, 437, 438, 443, 444, 444, 439, 438,
+ 440, 445, 446, 446, 441, 440, 441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449, 449, 444, 443,
+ 450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453, 455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457,
+ 451, 460, 461, 461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454, 456, 463, 464, 464, 458, 456,
+ 460, 465, 466, 466, 461, 460, 461, 466, 467, 467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,
+ 465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473, 473, 468, 467, 468, 473, 474, 474, 469, 468,
+ 475, 476, 477, 477, 478, 475, 478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483, 483, 484, 482,
+ 476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477, 479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481,
+ 485, 490, 491, 491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487, 488, 493, 494, 494, 489, 488,
+ 490, 495, 496, 496, 491, 490, 491, 496, 497, 497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,
+ 500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506, 506, 507, 505, 507, 506, 508, 508, 509, 507,
+ 501, 510, 511, 511, 502, 501, 502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514, 514, 508, 506,
+ 510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511, 512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513,
+ 515, 520, 521, 521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517, 518, 523, 524, 524, 519, 518,
+ 525, 526, 527, 527, 528, 525, 528, 527, 529, 529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,
+ 526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538, 538, 531, 529, 531, 538, 539, 539, 533, 531,
+ 535, 540, 541, 541, 536, 535, 536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544, 544, 539, 538,
+ 540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541, 542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543,
+ 550, 551, 552, 552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555, 557, 556, 558, 558, 559, 557,
+ 551, 560, 561, 561, 552, 551, 552, 561, 562, 562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,
+ 560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568, 568, 563, 562, 563, 568, 569, 569, 564, 563,
+ 565, 570, 571, 571, 566, 565, 566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574, 574, 569, 568,
+ 575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578, 580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582,
+ 576, 585, 586, 586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579, 581, 588, 589, 589, 583, 581,
+ 585, 590, 591, 591, 586, 585, 586, 591, 592, 592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,
+ 590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598, 598, 593, 592, 593, 598, 599, 599, 594, 593,
+ 600, 601, 602, 602, 603, 600, 603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608, 608, 609, 607,
+ 601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602, 604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606,
+ 610, 615, 616, 616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612, 613, 618, 619, 619, 614, 613,
+ 615, 620, 621, 621, 616, 615, 616, 621, 622, 622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,
+ 625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631, 631, 632, 630, 632, 631, 633, 633, 634, 632,
+ 626, 635, 636, 636, 627, 626, 627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639, 639, 633, 631,
+ 635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636, 637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638,
+ 640, 645, 646, 646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642, 643, 648, 649, 649, 644, 643,
+ 650, 651, 652, 652, 653, 650, 653, 652, 654, 654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,
+ 651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663, 663, 656, 654, 656, 663, 664, 664, 658, 656,
+ 660, 665, 666, 666, 661, 660, 661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669, 669, 664, 663,
+ 665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666, 667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668,
+ 675, 676, 677, 677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680, 682, 681, 683, 683, 684, 682,
+ 676, 685, 686, 686, 677, 676, 677, 686, 687, 687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,
+ 685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693, 693, 688, 687, 688, 693, 694, 694, 689, 688,
+ 690, 695, 696, 696, 691, 690, 691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699, 699, 694, 693,
+ 700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703, 705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707,
+ 701, 710, 711, 711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704, 706, 713, 714, 714, 708, 706,
+ 710, 715, 716, 716, 711, 710, 711, 716, 717, 717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,
+ 715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723, 723, 718, 717, 718, 723, 724, 724, 719, 718,
+ 725, 726, 727, 727, 728, 725, 728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733, 733, 734, 732,
+ 726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727, 729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731,
+ 735, 740, 741, 741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737, 738, 743, 744, 744, 739, 738,
+ 740, 745, 746, 746, 741, 740, 741, 746, 747, 747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,
+ 750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756, 756, 757, 755, 757, 756, 758, 758, 759, 757,
+ 751, 760, 761, 761, 752, 751, 752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764, 764, 758, 756,
+ 760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761, 762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763,
+ 765, 770, 771, 771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767, 768, 773, 774, 774, 769, 768,
+ 775, 776, 777, 777, 778, 775, 778, 777, 779, 779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,
+ 776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788, 788, 781, 779, 781, 788, 789, 789, 783, 781,
+ 785, 790, 791, 791, 786, 785, 786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794, 794, 789, 788,
+ 790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791, 792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793 };
diff --git a/ndk/platforms/android-17/samples/Teapot/lint.xml b/ndk/platforms/android-17/samples/Teapot/lint.xml
new file mode 100644
index 0000000..ee0eead
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/lint.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+</lint>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/project.properties b/ndk/platforms/android-17/samples/Teapot/project.properties
new file mode 100644
index 0000000..0c9830a
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=Google Inc.:Google APIs:17
diff --git a/ndk/platforms/android-17/samples/Teapot/res/drawable-hdpi/ic_launcher.png b/ndk/platforms/android-17/samples/Teapot/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..ea01cbf
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-17/samples/Teapot/res/drawable-ldpi/ic_launcher.png b/ndk/platforms/android-17/samples/Teapot/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..a3d6a18
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-17/samples/Teapot/res/drawable-mdpi/ic_launcher.png b/ndk/platforms/android-17/samples/Teapot/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..8f80897
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-17/samples/Teapot/res/drawable-xhdpi/ic_launcher.png b/ndk/platforms/android-17/samples/Teapot/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..b779a2b
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-17/samples/Teapot/res/layout/widgets.xml b/ndk/platforms/android-17/samples/Teapot/res/layout/widgets.xml
new file mode 100644
index 0000000..36b64f3
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/layout/widgets.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="top"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/textViewFPS"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="right"
+ android:text="0.0 FPS"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="@android:color/white" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/res/values-v11/styles.xml b/ndk/platforms/android-17/samples/Teapot/res/values-v11/styles.xml
new file mode 100644
index 0000000..541752f
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+<resources>
+
+ <!--
+ Base application theme for API 11+. This theme completely replaces
+ AppBaseTheme from res/values/styles.xml on API 11+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
+ <!-- API 11 theme customizations can go here. -->
+ </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/res/values-v14/styles.xml b/ndk/platforms/android-17/samples/Teapot/res/values-v14/styles.xml
new file mode 100644
index 0000000..f20e015
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+<resources>
+
+ <!--
+ Base application theme for API 14+. This theme completely replaces
+ AppBaseTheme from BOTH res/values/styles.xml and
+ res/values-v11/styles.xml on API 14+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+ <!-- API 14 theme customizations can go here. -->
+ </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/res/values/strings.xml b/ndk/platforms/android-17/samples/Teapot/res/values/strings.xml
new file mode 100644
index 0000000..a13b1f0
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/values/strings.xml
@@ -0,0 +1,5 @@
+<resources>
+
+ <string name="app_name">Teapot</string>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/res/values/styles.xml b/ndk/platforms/android-17/samples/Teapot/res/values/styles.xml
new file mode 100644
index 0000000..4a10ca4
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/values/styles.xml
@@ -0,0 +1,20 @@
+<resources>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Light">
+ <!--
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+ -->
+ </style>
+
+ <!-- Application theme. -->
+ <style name="AppTheme" parent="AppBaseTheme">
+ <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+ </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java
new file mode 100644
index 0000000..3385a5d
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.sample.helper;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import javax.microedition.khronos.opengles.GL10;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.opengl.GLUtils;
+import android.util.Log;
+
+public class NDKHelper
+{
+ private static Context context;
+
+ public static void setContext(Context c)
+ {
+ Log.i("NDKHelper", "setContext:" + c);
+ context = c;
+ }
+
+ //
+ // Load Bitmap
+ // Java helper is useful decoding PNG, TIFF etc rather than linking libPng
+ // etc separately
+ //
+ private int nextPOT(int i)
+ {
+ int pot = 1;
+ while (pot < i)
+ pot <<= 1;
+ return pot;
+ }
+
+ private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight)
+ {
+ if (bitmapToScale == null)
+ return null;
+ // get the original width and height
+ int width = bitmapToScale.getWidth();
+ int height = bitmapToScale.getHeight();
+ // create a matrix for the manipulation
+ Matrix matrix = new Matrix();
+
+ // resize the bit map
+ matrix.postScale(newWidth / width, newHeight / height);
+
+ // recreate the new Bitmap and set it back
+ return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(),
+ bitmapToScale.getHeight(), matrix, true);
+ }
+
+ public boolean loadTexture(String path)
+ {
+ Bitmap bitmap = null;
+ try
+ {
+ String str = path;
+ if (!path.startsWith("/"))
+ {
+ str = "/" + path;
+ }
+
+ File file = new File(context.getExternalFilesDir(null), str);
+ if (file.canRead())
+ {
+ bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
+ } else
+ {
+ bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+ .open(path));
+ }
+ // Matrix matrix = new Matrix();
+ // // resize the bit map
+ // matrix.postScale(-1F, 1F);
+ //
+ // // recreate the new Bitmap and set it back
+ // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
+ // bitmap.getHeight(), matrix, true);
+
+ } catch (Exception e)
+ {
+ Log.w("NDKHelper", "Coundn't load a file:" + path);
+ return false;
+ }
+
+ if (bitmap != null)
+ {
+ GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
+ }
+ return true;
+
+ }
+
+ public Bitmap openBitmap(String path, boolean iScalePOT)
+ {
+ Bitmap bitmap = null;
+ try
+ {
+ bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+ .open(path));
+ if (iScalePOT)
+ {
+ int originalWidth = getBitmapWidth(bitmap);
+ int originalHeight = getBitmapHeight(bitmap);
+ int width = nextPOT(originalWidth);
+ int height = nextPOT(originalHeight);
+ if (originalWidth != width || originalHeight != height)
+ {
+ // Scale it
+ bitmap = scaleBitmap(bitmap, width, height);
+ }
+ }
+
+ } catch (Exception e)
+ {
+ Log.w("NDKHelper", "Coundn't load a file:" + path);
+ }
+
+ return bitmap;
+ }
+
+ public int getBitmapWidth(Bitmap bmp)
+ {
+ return bmp.getWidth();
+ }
+
+ public int getBitmapHeight(Bitmap bmp)
+ {
+ return bmp.getHeight();
+ }
+
+ public void getBitmapPixels(Bitmap bmp, int[] pixels)
+ {
+ int w = bmp.getWidth();
+ int h = bmp.getHeight();
+ bmp.getPixels(pixels, 0, w, 0, 0, w, h);
+ }
+
+ public void closeBitmap(Bitmap bmp)
+ {
+ bmp.recycle();
+ }
+
+ public static String getNativeLibraryDirectory(Context appContext)
+ {
+ ApplicationInfo ai = context.getApplicationInfo();
+
+ Log.w("NDKHelper", "ai.nativeLibraryDir:" + ai.nativeLibraryDir);
+
+ if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
+ || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
+ {
+ return ai.nativeLibraryDir;
+ }
+ return "/system/lib/";
+ }
+
+ public int getNativeAudioBufferSize()
+ {
+ int SDK_INT = android.os.Build.VERSION.SDK_INT;
+ if (SDK_INT >= 17)
+ {
+ AudioManager am = (AudioManager) context
+ .getSystemService(Context.AUDIO_SERVICE);
+ String framesPerBuffer = am
+ .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
+ return Integer.parseInt(framesPerBuffer);
+ } else
+ {
+ return 0;
+ }
+ }
+
+ public int getNativeAudioSampleRate()
+ {
+ return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
+
+ }
+
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java
new file mode 100644
index 0000000..3b24bc4
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.sample.teapot;
+
+import javax.microedition.khronos.opengles.GL10;
+
+import android.app.Application;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.opengl.GLUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+public class TeapotApplication extends Application {
+ public void onCreate(){
+ Log.w("native-activity", "onCreate");
+
+ final PackageManager pm = getApplicationContext().getPackageManager();
+ ApplicationInfo ai;
+ try {
+ ai = pm.getApplicationInfo( this.getPackageName(), 0);
+ } catch (final NameNotFoundException e) {
+ ai = null;
+ }
+ final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");
+ Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();
+ }
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java
new file mode 100644
index 0000000..f6a2e33
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.sample.teapot;
+
+import android.app.NativeActivity;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.view.WindowManager.LayoutParams;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+public class TeapotNativeActivity extends NativeActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ protected void onResume() {
+ super.onResume();
+
+ //Hide toolbar
+ int SDK_INT = android.os.Build.VERSION.SDK_INT;
+ if(SDK_INT >= 11 && SDK_INT < 14)
+ {
+ getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
+ }
+ else if(SDK_INT >= 14)
+ {
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);
+ }
+
+ }
+ // Our popup window, you will call it from your C/C++ code later
+
+ TeapotNativeActivity _activity;
+ PopupWindow _popupWindow;
+ TextView _label;
+
+ public void showUI()
+ {
+ if( _popupWindow != null )
+ return;
+
+ _activity = this;
+
+ this.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ LayoutInflater layoutInflater
+ = (LayoutInflater)getBaseContext()
+ .getSystemService(LAYOUT_INFLATER_SERVICE);
+ View popupView = layoutInflater.inflate(R.layout.widgets, null);
+ _popupWindow = new PopupWindow(
+ popupView,
+ LayoutParams.WRAP_CONTENT,
+ LayoutParams.WRAP_CONTENT);
+
+ LinearLayout mainLayout = new LinearLayout(_activity);
+ MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+ params.setMargins(0, 0, 0, 0);
+ _activity.setContentView(mainLayout, params);
+
+ // Show our UI over NativeActivity window
+ _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.LEFT, 10, 10);
+ _popupWindow.update();
+
+ _label = (TextView)popupView.findViewById(R.id.textViewFPS);
+
+ }});
+ }
+
+ protected void onPause()
+ {
+ super.onPause();
+ if (_popupWindow != null) {
+ _popupWindow.dismiss();
+ _popupWindow = null;
+ }
+ }
+
+ public void updateFPS(final float fFPS)
+ {
+ if( _label == null )
+ return;
+
+ _activity = this;
+ this.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ _label.setText(String.format("%2.2f FPS", fFPS));
+
+ }});
+ }
+}
+
+
diff --git a/ndk/platforms/android-18/arch-arm/symbols/libm.so.functions.txt b/ndk/platforms/android-18/arch-arm/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..7701917
--- /dev/null
+++ b/ndk/platforms/android-18/arch-arm/symbols/libm.so.functions.txt
@@ -0,0 +1,239 @@
+__addsf3
+__aeabi_cfcmpeq
+__aeabi_cfcmple
+__aeabi_cfrcmple
+__aeabi_d2lz
+__aeabi_d2uiz
+__aeabi_d2ulz
+__aeabi_dcmpun
+__aeabi_f2iz
+__aeabi_f2lz
+__aeabi_f2ulz
+__aeabi_fadd
+__aeabi_fcmpeq
+__aeabi_fcmpge
+__aeabi_fcmpgt
+__aeabi_fcmple
+__aeabi_fcmplt
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2f
+__aeabi_l2f
+__aeabi_ui2f
+__aeabi_ul2f
+__cmpsf2
+__divsf3
+__eqsf2
+__exp__D
+__fixdfdi
+__fixsfdi
+__fixsfsi
+__fixunsdfdi
+__fixunsdfsi
+__fixunssfdi
+__floatdisf
+__floatsisf
+__floatundisf
+__floatunsisf
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__gesf2
+__gtsf2
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__lesf2
+__log__D
+__ltsf2
+__mulsf3
+__nesf2
+__signbit
+__signbitf
+__signbitl
+__subsf3
+__unorddf2
+__unordsf2
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttoward
+nexttowardf
+nexttowardl
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-18/arch-arm/symbols/libm.so.variables.txt b/ndk/platforms/android-18/arch-arm/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-18/arch-arm/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-18/arch-mips/symbols/libm.so.functions.txt b/ndk/platforms/android-18/arch-mips/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..b7360ba
--- /dev/null
+++ b/ndk/platforms/android-18/arch-mips/symbols/libm.so.functions.txt
@@ -0,0 +1,191 @@
+__exp__D
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__log__D
+__signbit
+__signbitf
+__signbitl
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttoward
+nexttowardf
+nexttowardl
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-18/arch-mips/symbols/libm.so.variables.txt b/ndk/platforms/android-18/arch-mips/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-18/arch-mips/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-18/arch-x86/symbols/libm.so.functions.txt b/ndk/platforms/android-18/arch-x86/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..e78f0e3
--- /dev/null
+++ b/ndk/platforms/android-18/arch-x86/symbols/libm.so.functions.txt
@@ -0,0 +1,202 @@
+__exp__D
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__log__D
+__signbit
+__signbitf
+__signbitl
+_scan_nan
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+feclearexcept
+fedisableexcept
+feenableexcept
+fegetenv
+fegetexcept
+fegetexceptflag
+fegetround
+feholdexcept
+feraiseexcept
+fesetenv
+fesetexceptflag
+fesetround
+fetestexcept
+feupdateenv
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttoward
+nexttowardf
+nexttowardl
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-18/arch-x86/symbols/libm.so.variables.txt b/ndk/platforms/android-18/arch-x86/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..6e5cdee
--- /dev/null
+++ b/ndk/platforms/android-18/arch-x86/symbols/libm.so.variables.txt
@@ -0,0 +1,3 @@
+__fe_dfl_env
+__has_sse
+signgam
diff --git a/ndk/platforms/android-18/include/android/bitmap.h b/ndk/platforms/android-18/include/android/bitmap.h
new file mode 100644
index 0000000..6e18763
--- /dev/null
+++ b/ndk/platforms/android-18/include/android/bitmap.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef ANDROID_BITMAP_H
+#define ANDROID_BITMAP_H
+
+#include <stdint.h>
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ANDROID_BITMAP_RESULT_SUCCESS 0
+#define ANDROID_BITMAP_RESULT_BAD_PARAMETER -1
+#define ANDROID_BITMAP_RESULT_JNI_EXCEPTION -2
+#define ANDROID_BITMAP_RESULT_ALLOCATION_FAILED -3
+
+/* Backward compatibility: this macro used to be misspelled. */
+#define ANDROID_BITMAP_RESUT_SUCCESS ANDROID_BITMAP_RESULT_SUCCESS
+
+enum AndroidBitmapFormat {
+ ANDROID_BITMAP_FORMAT_NONE = 0,
+ ANDROID_BITMAP_FORMAT_RGBA_8888 = 1,
+ ANDROID_BITMAP_FORMAT_RGB_565 = 4,
+ ANDROID_BITMAP_FORMAT_RGBA_4444 = 7,
+ ANDROID_BITMAP_FORMAT_A_8 = 8,
+};
+
+typedef struct {
+ uint32_t width;
+ uint32_t height;
+ uint32_t stride;
+ int32_t format;
+ uint32_t flags; // 0 for now
+} AndroidBitmapInfo;
+
+/**
+ * Given a java bitmap object, fill out the AndroidBitmap struct for it.
+ * If the call fails, the info parameter will be ignored
+ */
+int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap,
+ AndroidBitmapInfo* info);
+
+/**
+ * Given a java bitmap object, attempt to lock the pixel address.
+ * Locking will ensure that the memory for the pixels will not move
+ * until the unlockPixels call, and ensure that, if the pixels had been
+ * previously purged, they will have been restored.
+ *
+ * If this call succeeds, it must be balanced by a call to
+ * AndroidBitmap_unlockPixels, after which time the address of the pixels should
+ * no longer be used.
+ *
+ * If this succeeds, *addrPtr will be set to the pixel address. If the call
+ * fails, addrPtr will be ignored.
+ */
+int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr);
+
+/**
+ * Call this to balanace a successful call to AndroidBitmap_lockPixels
+ */
+int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ndk/platforms/android-18/include/android/configuration.h b/ndk/platforms/android-18/include/android/configuration.h
new file mode 100644
index 0000000..d5cddb3
--- /dev/null
+++ b/ndk/platforms/android-18/include/android/configuration.h
@@ -0,0 +1,381 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef ANDROID_CONFIGURATION_H
+#define ANDROID_CONFIGURATION_H
+
+#include <android/asset_manager.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AConfiguration;
+typedef struct AConfiguration AConfiguration;
+
+enum {
+ ACONFIGURATION_ORIENTATION_ANY = 0x0000,
+ ACONFIGURATION_ORIENTATION_PORT = 0x0001,
+ ACONFIGURATION_ORIENTATION_LAND = 0x0002,
+ ACONFIGURATION_ORIENTATION_SQUARE = 0x0003,
+
+ ACONFIGURATION_TOUCHSCREEN_ANY = 0x0000,
+ ACONFIGURATION_TOUCHSCREEN_NOTOUCH = 0x0001,
+ ACONFIGURATION_TOUCHSCREEN_STYLUS = 0x0002,
+ ACONFIGURATION_TOUCHSCREEN_FINGER = 0x0003,
+
+ ACONFIGURATION_DENSITY_DEFAULT = 0,
+ ACONFIGURATION_DENSITY_LOW = 120,
+ ACONFIGURATION_DENSITY_MEDIUM = 160,
+ ACONFIGURATION_DENSITY_TV = 213,
+ ACONFIGURATION_DENSITY_HIGH = 240,
+ ACONFIGURATION_DENSITY_XHIGH = 320,
+ ACONFIGURATION_DENSITY_XXHIGH = 480,
+ ACONFIGURATION_DENSITY_XXXHIGH = 640,
+ ACONFIGURATION_DENSITY_NONE = 0xffff,
+
+ ACONFIGURATION_KEYBOARD_ANY = 0x0000,
+ ACONFIGURATION_KEYBOARD_NOKEYS = 0x0001,
+ ACONFIGURATION_KEYBOARD_QWERTY = 0x0002,
+ ACONFIGURATION_KEYBOARD_12KEY = 0x0003,
+
+ ACONFIGURATION_NAVIGATION_ANY = 0x0000,
+ ACONFIGURATION_NAVIGATION_NONAV = 0x0001,
+ ACONFIGURATION_NAVIGATION_DPAD = 0x0002,
+ ACONFIGURATION_NAVIGATION_TRACKBALL = 0x0003,
+ ACONFIGURATION_NAVIGATION_WHEEL = 0x0004,
+
+ ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000,
+ ACONFIGURATION_KEYSHIDDEN_NO = 0x0001,
+ ACONFIGURATION_KEYSHIDDEN_YES = 0x0002,
+ ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003,
+
+ ACONFIGURATION_NAVHIDDEN_ANY = 0x0000,
+ ACONFIGURATION_NAVHIDDEN_NO = 0x0001,
+ ACONFIGURATION_NAVHIDDEN_YES = 0x0002,
+
+ ACONFIGURATION_SCREENSIZE_ANY = 0x00,
+ ACONFIGURATION_SCREENSIZE_SMALL = 0x01,
+ ACONFIGURATION_SCREENSIZE_NORMAL = 0x02,
+ ACONFIGURATION_SCREENSIZE_LARGE = 0x03,
+ ACONFIGURATION_SCREENSIZE_XLARGE = 0x04,
+
+ ACONFIGURATION_SCREENLONG_ANY = 0x00,
+ ACONFIGURATION_SCREENLONG_NO = 0x1,
+ ACONFIGURATION_SCREENLONG_YES = 0x2,
+
+ ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00,
+ ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
+ ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
+ ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+ ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
+ ACONFIGURATION_UI_MODE_TYPE_APPLIANCE = 0x05,
+
+ ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
+ ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
+ ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
+
+ ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+ ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+ ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+ ACONFIGURATION_LAYOUTDIR_ANY = 0x00,
+ ACONFIGURATION_LAYOUTDIR_LTR = 0x01,
+ ACONFIGURATION_LAYOUTDIR_RTL = 0x02,
+
+ ACONFIGURATION_MCC = 0x0001,
+ ACONFIGURATION_MNC = 0x0002,
+ ACONFIGURATION_LOCALE = 0x0004,
+ ACONFIGURATION_TOUCHSCREEN = 0x0008,
+ ACONFIGURATION_KEYBOARD = 0x0010,
+ ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020,
+ ACONFIGURATION_NAVIGATION = 0x0040,
+ ACONFIGURATION_ORIENTATION = 0x0080,
+ ACONFIGURATION_DENSITY = 0x0100,
+ ACONFIGURATION_SCREEN_SIZE = 0x0200,
+ ACONFIGURATION_VERSION = 0x0400,
+ ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
+ ACONFIGURATION_UI_MODE = 0x1000,
+ ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
+ ACONFIGURATION_LAYOUTDIR = 0x4000,
+};
+
+/**
+ * Create a new AConfiguration, initialized with no values set.
+ */
+AConfiguration* AConfiguration_new();
+
+/**
+ * Free an AConfiguration that was previously created with
+ * AConfiguration_new().
+ */
+void AConfiguration_delete(AConfiguration* config);
+
+/**
+ * Create and return a new AConfiguration based on the current configuration in
+ * use in the given AssetManager.
+ */
+void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am);
+
+/**
+ * Copy the contents of 'src' to 'dest'.
+ */
+void AConfiguration_copy(AConfiguration* dest, AConfiguration* src);
+
+/**
+ * Return the current MCC set in the configuration. 0 if not set.
+ */
+int32_t AConfiguration_getMcc(AConfiguration* config);
+
+/**
+ * Set the current MCC in the configuration. 0 to clear.
+ */
+void AConfiguration_setMcc(AConfiguration* config, int32_t mcc);
+
+/**
+ * Return the current MNC set in the configuration. 0 if not set.
+ */
+int32_t AConfiguration_getMnc(AConfiguration* config);
+
+/**
+ * Set the current MNC in the configuration. 0 to clear.
+ */
+void AConfiguration_setMnc(AConfiguration* config, int32_t mnc);
+
+/**
+ * Return the current language code set in the configuration. The output will
+ * be filled with an array of two characters. They are not 0-terminated. If
+ * a language is not set, they will be 0.
+ */
+void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage);
+
+/**
+ * Set the current language code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setLanguage(AConfiguration* config, const char* language);
+
+/**
+ * Return the current country code set in the configuration. The output will
+ * be filled with an array of two characters. They are not 0-terminated. If
+ * a country is not set, they will be 0.
+ */
+void AConfiguration_getCountry(AConfiguration* config, char* outCountry);
+
+/**
+ * Set the current country code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setCountry(AConfiguration* config, const char* country);
+
+/**
+ * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
+ */
+int32_t AConfiguration_getOrientation(AConfiguration* config);
+
+/**
+ * Set the current orientation in the configuration.
+ */
+void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation);
+
+/**
+ * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
+ */
+int32_t AConfiguration_getTouchscreen(AConfiguration* config);
+
+/**
+ * Set the current touchscreen in the configuration.
+ */
+void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen);
+
+/**
+ * Return the current ACONFIGURATION_DENSITY_* set in the configuration.
+ */
+int32_t AConfiguration_getDensity(AConfiguration* config);
+
+/**
+ * Set the current density in the configuration.
+ */
+void AConfiguration_setDensity(AConfiguration* config, int32_t density);
+
+/**
+ * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
+ */
+int32_t AConfiguration_getKeyboard(AConfiguration* config);
+
+/**
+ * Set the current keyboard in the configuration.
+ */
+void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard);
+
+/**
+ * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
+ */
+int32_t AConfiguration_getNavigation(AConfiguration* config);
+
+/**
+ * Set the current navigation in the configuration.
+ */
+void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation);
+
+/**
+ * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getKeysHidden(AConfiguration* config);
+
+/**
+ * Set the current keys hidden in the configuration.
+ */
+void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden);
+
+/**
+ * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getNavHidden(AConfiguration* config);
+
+/**
+ * Set the current nav hidden in the configuration.
+ */
+void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden);
+
+/**
+ * Return the current SDK (API) version set in the configuration.
+ */
+int32_t AConfiguration_getSdkVersion(AConfiguration* config);
+
+/**
+ * Set the current SDK version in the configuration.
+ */
+void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion);
+
+/**
+ * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenSize(AConfiguration* config);
+
+/**
+ * Set the current screen size in the configuration.
+ */
+void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize);
+
+/**
+ * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenLong(AConfiguration* config);
+
+/**
+ * Set the current screen long in the configuration.
+ */
+void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeType(AConfiguration* config);
+
+/**
+ * Set the current UI mode type in the configuration.
+ */
+void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeNight(AConfiguration* config);
+
+/**
+ * Set the current UI mode night in the configuration.
+ */
+void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
+
+/**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's layout direction, or
+ * ACONFIGURATION_LAYOUTDIR_ANY if not set.
+ */
+int32_t AConfiguration_getLayoutDirection(AConfiguration* config);
+
+/**
+ * Set the configuration's layout direction.
+ */
+void AConfiguration_setLayoutDirection(AConfiguration* config, int32_t value);
+
+/**
+ * Perform a diff between two configurations. Returns a bit mask of
+ * ACONFIGURATION_* constants, each bit set meaning that configuration element
+ * is different between them.
+ */
+int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2);
+
+/**
+ * Determine whether 'base' is a valid configuration for use within the
+ * environment 'requested'. Returns 0 if there are any values in 'base'
+ * that conflict with 'requested'. Returns 1 if it does not conflict.
+ */
+int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested);
+
+/**
+ * Determine whether the configuration in 'test' is better than the existing
+ * configuration in 'base'. If 'requested' is non-NULL, this decision is based
+ * on the overall configuration given there. If it is NULL, this decision is
+ * simply based on which configuration is more specific. Returns non-0 if
+ * 'test' is better than 'base'.
+ *
+ * This assumes you have already filtered the configurations with
+ * AConfiguration_match().
+ */
+int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
+ AConfiguration* requested);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_CONFIGURATION_H
diff --git a/ndk/platforms/android-18/include/android/input.h b/ndk/platforms/android-18/include/android/input.h
new file mode 100644
index 0000000..fead769
--- /dev/null
+++ b/ndk/platforms/android-18/include/android/input.h
@@ -0,0 +1,850 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_INPUT_H
+#define _ANDROID_INPUT_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process input events in
+ * native code.
+ *
+ * NOTE: These functions MUST be implemented by /system/lib/libui.so
+ */
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <android/keycodes.h>
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key states (may be returned by queries about the current state of a
+ * particular key code, scan code or switch).
+ */
+enum {
+ /* The key state is unknown or the requested key itself is not supported. */
+ AKEY_STATE_UNKNOWN = -1,
+
+ /* The key is up. */
+ AKEY_STATE_UP = 0,
+
+ /* The key is down. */
+ AKEY_STATE_DOWN = 1,
+
+ /* The key is down but is a virtual key press that is being emulated by the system. */
+ AKEY_STATE_VIRTUAL = 2
+};
+
+/*
+ * Meta key / modifer state.
+ */
+enum {
+ /* No meta keys are pressed. */
+ AMETA_NONE = 0,
+
+ /* This mask is used to check whether one of the ALT meta keys is pressed. */
+ AMETA_ALT_ON = 0x02,
+
+ /* This mask is used to check whether the left ALT meta key is pressed. */
+ AMETA_ALT_LEFT_ON = 0x10,
+
+ /* This mask is used to check whether the right ALT meta key is pressed. */
+ AMETA_ALT_RIGHT_ON = 0x20,
+
+ /* This mask is used to check whether one of the SHIFT meta keys is pressed. */
+ AMETA_SHIFT_ON = 0x01,
+
+ /* This mask is used to check whether the left SHIFT meta key is pressed. */
+ AMETA_SHIFT_LEFT_ON = 0x40,
+
+ /* This mask is used to check whether the right SHIFT meta key is pressed. */
+ AMETA_SHIFT_RIGHT_ON = 0x80,
+
+ /* This mask is used to check whether the SYM meta key is pressed. */
+ AMETA_SYM_ON = 0x04,
+
+ /* This mask is used to check whether the FUNCTION meta key is pressed. */
+ AMETA_FUNCTION_ON = 0x08,
+
+ /* This mask is used to check whether one of the CTRL meta keys is pressed. */
+ AMETA_CTRL_ON = 0x1000,
+
+ /* This mask is used to check whether the left CTRL meta key is pressed. */
+ AMETA_CTRL_LEFT_ON = 0x2000,
+
+ /* This mask is used to check whether the right CTRL meta key is pressed. */
+ AMETA_CTRL_RIGHT_ON = 0x4000,
+
+ /* This mask is used to check whether one of the META meta keys is pressed. */
+ AMETA_META_ON = 0x10000,
+
+ /* This mask is used to check whether the left META meta key is pressed. */
+ AMETA_META_LEFT_ON = 0x20000,
+
+ /* This mask is used to check whether the right META meta key is pressed. */
+ AMETA_META_RIGHT_ON = 0x40000,
+
+ /* This mask is used to check whether the CAPS LOCK meta key is on. */
+ AMETA_CAPS_LOCK_ON = 0x100000,
+
+ /* This mask is used to check whether the NUM LOCK meta key is on. */
+ AMETA_NUM_LOCK_ON = 0x200000,
+
+ /* This mask is used to check whether the SCROLL LOCK meta key is on. */
+ AMETA_SCROLL_LOCK_ON = 0x400000,
+};
+
+/*
+ * Input events.
+ *
+ * Input events are opaque structures. Use the provided accessors functions to
+ * read their properties.
+ */
+struct AInputEvent;
+typedef struct AInputEvent AInputEvent;
+
+/*
+ * Input event types.
+ */
+enum {
+ /* Indicates that the input event is a key event. */
+ AINPUT_EVENT_TYPE_KEY = 1,
+
+ /* Indicates that the input event is a motion event. */
+ AINPUT_EVENT_TYPE_MOTION = 2
+};
+
+/*
+ * Key event actions.
+ */
+enum {
+ /* The key has been pressed down. */
+ AKEY_EVENT_ACTION_DOWN = 0,
+
+ /* The key has been released. */
+ AKEY_EVENT_ACTION_UP = 1,
+
+ /* Multiple duplicate key events have occurred in a row, or a complex string is
+ * being delivered. The repeat_count property of the key event contains the number
+ * of times the given key code should be executed.
+ */
+ AKEY_EVENT_ACTION_MULTIPLE = 2
+};
+
+/*
+ * Key event flags.
+ */
+enum {
+ /* This mask is set if the device woke because of this key event. */
+ AKEY_EVENT_FLAG_WOKE_HERE = 0x1,
+
+ /* This mask is set if the key event was generated by a software keyboard. */
+ AKEY_EVENT_FLAG_SOFT_KEYBOARD = 0x2,
+
+ /* This mask is set if we don't want the key event to cause us to leave touch mode. */
+ AKEY_EVENT_FLAG_KEEP_TOUCH_MODE = 0x4,
+
+ /* This mask is set if an event was known to come from a trusted part
+ * of the system. That is, the event is known to come from the user,
+ * and could not have been spoofed by a third party component. */
+ AKEY_EVENT_FLAG_FROM_SYSTEM = 0x8,
+
+ /* This mask is used for compatibility, to identify enter keys that are
+ * coming from an IME whose enter key has been auto-labelled "next" or
+ * "done". This allows TextView to dispatch these as normal enter keys
+ * for old applications, but still do the appropriate action when
+ * receiving them. */
+ AKEY_EVENT_FLAG_EDITOR_ACTION = 0x10,
+
+ /* When associated with up key events, this indicates that the key press
+ * has been canceled. Typically this is used with virtual touch screen
+ * keys, where the user can slide from the virtual key area on to the
+ * display: in that case, the application will receive a canceled up
+ * event and should not perform the action normally associated with the
+ * key. Note that for this to work, the application can not perform an
+ * action for a key until it receives an up or the long press timeout has
+ * expired. */
+ AKEY_EVENT_FLAG_CANCELED = 0x20,
+
+ /* This key event was generated by a virtual (on-screen) hard key area.
+ * Typically this is an area of the touchscreen, outside of the regular
+ * display, dedicated to "hardware" buttons. */
+ AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY = 0x40,
+
+ /* This flag is set for the first key repeat that occurs after the
+ * long press timeout. */
+ AKEY_EVENT_FLAG_LONG_PRESS = 0x80,
+
+ /* Set when a key event has AKEY_EVENT_FLAG_CANCELED set because a long
+ * press action was executed while it was down. */
+ AKEY_EVENT_FLAG_CANCELED_LONG_PRESS = 0x100,
+
+ /* Set for AKEY_EVENT_ACTION_UP when this event's key code is still being
+ * tracked from its initial down. That is, somebody requested that tracking
+ * started on the key down and a long press has not caused
+ * the tracking to be canceled. */
+ AKEY_EVENT_FLAG_TRACKING = 0x200,
+
+ /* Set when a key event has been synthesized to implement default behavior
+ * for an event that the application did not handle.
+ * Fallback key events are generated by unhandled trackball motions
+ * (to emulate a directional keypad) and by certain unhandled key presses
+ * that are declared in the key map (such as special function numeric keypad
+ * keys when numlock is off). */
+ AKEY_EVENT_FLAG_FALLBACK = 0x400,
+};
+
+/*
+ * Motion event actions.
+ */
+
+/* Bit shift for the action bits holding the pointer index as
+ * defined by AMOTION_EVENT_ACTION_POINTER_INDEX_MASK.
+ */
+#define AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT 8
+
+enum {
+ /* Bit mask of the parts of the action code that are the action itself.
+ */
+ AMOTION_EVENT_ACTION_MASK = 0xff,
+
+ /* Bits in the action code that represent a pointer index, used with
+ * AMOTION_EVENT_ACTION_POINTER_DOWN and AMOTION_EVENT_ACTION_POINTER_UP. Shifting
+ * down by AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT provides the actual pointer
+ * index where the data for the pointer going up or down can be found.
+ */
+ AMOTION_EVENT_ACTION_POINTER_INDEX_MASK = 0xff00,
+
+ /* A pressed gesture has started, the motion contains the initial starting location.
+ */
+ AMOTION_EVENT_ACTION_DOWN = 0,
+
+ /* A pressed gesture has finished, the motion contains the final release location
+ * as well as any intermediate points since the last down or move event.
+ */
+ AMOTION_EVENT_ACTION_UP = 1,
+
+ /* A change has happened during a press gesture (between AMOTION_EVENT_ACTION_DOWN and
+ * AMOTION_EVENT_ACTION_UP). The motion contains the most recent point, as well as
+ * any intermediate points since the last down or move event.
+ */
+ AMOTION_EVENT_ACTION_MOVE = 2,
+
+ /* The current gesture has been aborted.
+ * You will not receive any more points in it. You should treat this as
+ * an up event, but not perform any action that you normally would.
+ */
+ AMOTION_EVENT_ACTION_CANCEL = 3,
+
+ /* A movement has happened outside of the normal bounds of the UI element.
+ * This does not provide a full gesture, but only the initial location of the movement/touch.
+ */
+ AMOTION_EVENT_ACTION_OUTSIDE = 4,
+
+ /* A non-primary pointer has gone down.
+ * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+ */
+ AMOTION_EVENT_ACTION_POINTER_DOWN = 5,
+
+ /* A non-primary pointer has gone up.
+ * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+ */
+ AMOTION_EVENT_ACTION_POINTER_UP = 6,
+
+ /* A change happened but the pointer is not down (unlike AMOTION_EVENT_ACTION_MOVE).
+ * The motion contains the most recent point, as well as any intermediate points since
+ * the last hover move event.
+ */
+ AMOTION_EVENT_ACTION_HOVER_MOVE = 7,
+
+ /* The motion event contains relative vertical and/or horizontal scroll offsets.
+ * Use getAxisValue to retrieve the information from AMOTION_EVENT_AXIS_VSCROLL
+ * and AMOTION_EVENT_AXIS_HSCROLL.
+ * The pointer may or may not be down when this event is dispatched.
+ * This action is always delivered to the winder under the pointer, which
+ * may not be the window currently touched.
+ */
+ AMOTION_EVENT_ACTION_SCROLL = 8,
+
+ /* The pointer is not down but has entered the boundaries of a window or view.
+ */
+ AMOTION_EVENT_ACTION_HOVER_ENTER = 9,
+
+ /* The pointer is not down but has exited the boundaries of a window or view.
+ */
+ AMOTION_EVENT_ACTION_HOVER_EXIT = 10,
+};
+
+/*
+ * Motion event flags.
+ */
+enum {
+ /* This flag indicates that the window that received this motion event is partly
+ * or wholly obscured by another visible window above it. This flag is set to true
+ * even if the event did not directly pass through the obscured area.
+ * A security sensitive application can check this flag to identify situations in which
+ * a malicious application may have covered up part of its content for the purpose
+ * of misleading the user or hijacking touches. An appropriate response might be
+ * to drop the suspect touches or to take additional precautions to confirm the user's
+ * actual intent.
+ */
+ AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED = 0x1,
+};
+
+/*
+ * Motion event edge touch flags.
+ */
+enum {
+ /* No edges intersected */
+ AMOTION_EVENT_EDGE_FLAG_NONE = 0,
+
+ /* Flag indicating the motion event intersected the top edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_TOP = 0x01,
+
+ /* Flag indicating the motion event intersected the bottom edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_BOTTOM = 0x02,
+
+ /* Flag indicating the motion event intersected the left edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_LEFT = 0x04,
+
+ /* Flag indicating the motion event intersected the right edge of the screen. */
+ AMOTION_EVENT_EDGE_FLAG_RIGHT = 0x08
+};
+
+/*
+ * Constants that identify each individual axis of a motion event.
+ * Refer to the documentation on the MotionEvent class for descriptions of each axis.
+ */
+enum {
+ AMOTION_EVENT_AXIS_X = 0,
+ AMOTION_EVENT_AXIS_Y = 1,
+ AMOTION_EVENT_AXIS_PRESSURE = 2,
+ AMOTION_EVENT_AXIS_SIZE = 3,
+ AMOTION_EVENT_AXIS_TOUCH_MAJOR = 4,
+ AMOTION_EVENT_AXIS_TOUCH_MINOR = 5,
+ AMOTION_EVENT_AXIS_TOOL_MAJOR = 6,
+ AMOTION_EVENT_AXIS_TOOL_MINOR = 7,
+ AMOTION_EVENT_AXIS_ORIENTATION = 8,
+ AMOTION_EVENT_AXIS_VSCROLL = 9,
+ AMOTION_EVENT_AXIS_HSCROLL = 10,
+ AMOTION_EVENT_AXIS_Z = 11,
+ AMOTION_EVENT_AXIS_RX = 12,
+ AMOTION_EVENT_AXIS_RY = 13,
+ AMOTION_EVENT_AXIS_RZ = 14,
+ AMOTION_EVENT_AXIS_HAT_X = 15,
+ AMOTION_EVENT_AXIS_HAT_Y = 16,
+ AMOTION_EVENT_AXIS_LTRIGGER = 17,
+ AMOTION_EVENT_AXIS_RTRIGGER = 18,
+ AMOTION_EVENT_AXIS_THROTTLE = 19,
+ AMOTION_EVENT_AXIS_RUDDER = 20,
+ AMOTION_EVENT_AXIS_WHEEL = 21,
+ AMOTION_EVENT_AXIS_GAS = 22,
+ AMOTION_EVENT_AXIS_BRAKE = 23,
+ AMOTION_EVENT_AXIS_DISTANCE = 24,
+ AMOTION_EVENT_AXIS_TILT = 25,
+ AMOTION_EVENT_AXIS_GENERIC_1 = 32,
+ AMOTION_EVENT_AXIS_GENERIC_2 = 33,
+ AMOTION_EVENT_AXIS_GENERIC_3 = 34,
+ AMOTION_EVENT_AXIS_GENERIC_4 = 35,
+ AMOTION_EVENT_AXIS_GENERIC_5 = 36,
+ AMOTION_EVENT_AXIS_GENERIC_6 = 37,
+ AMOTION_EVENT_AXIS_GENERIC_7 = 38,
+ AMOTION_EVENT_AXIS_GENERIC_8 = 39,
+ AMOTION_EVENT_AXIS_GENERIC_9 = 40,
+ AMOTION_EVENT_AXIS_GENERIC_10 = 41,
+ AMOTION_EVENT_AXIS_GENERIC_11 = 42,
+ AMOTION_EVENT_AXIS_GENERIC_12 = 43,
+ AMOTION_EVENT_AXIS_GENERIC_13 = 44,
+ AMOTION_EVENT_AXIS_GENERIC_14 = 45,
+ AMOTION_EVENT_AXIS_GENERIC_15 = 46,
+ AMOTION_EVENT_AXIS_GENERIC_16 = 47,
+
+ // NOTE: If you add a new axis here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.
+};
+
+/*
+ * Constants that identify buttons that are associated with motion events.
+ * Refer to the documentation on the MotionEvent class for descriptions of each button.
+ */
+enum {
+ AMOTION_EVENT_BUTTON_PRIMARY = 1 << 0,
+ AMOTION_EVENT_BUTTON_SECONDARY = 1 << 1,
+ AMOTION_EVENT_BUTTON_TERTIARY = 1 << 2,
+ AMOTION_EVENT_BUTTON_BACK = 1 << 3,
+ AMOTION_EVENT_BUTTON_FORWARD = 1 << 4,
+};
+
+/*
+ * Constants that identify tool types.
+ * Refer to the documentation on the MotionEvent class for descriptions of each tool type.
+ */
+enum {
+ AMOTION_EVENT_TOOL_TYPE_UNKNOWN = 0,
+ AMOTION_EVENT_TOOL_TYPE_FINGER = 1,
+ AMOTION_EVENT_TOOL_TYPE_STYLUS = 2,
+ AMOTION_EVENT_TOOL_TYPE_MOUSE = 3,
+ AMOTION_EVENT_TOOL_TYPE_ERASER = 4,
+};
+
+/*
+ * Input sources.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ */
+enum {
+ AINPUT_SOURCE_CLASS_MASK = 0x000000ff,
+
+ AINPUT_SOURCE_CLASS_NONE = 0x00000000,
+ AINPUT_SOURCE_CLASS_BUTTON = 0x00000001,
+ AINPUT_SOURCE_CLASS_POINTER = 0x00000002,
+ AINPUT_SOURCE_CLASS_NAVIGATION = 0x00000004,
+ AINPUT_SOURCE_CLASS_POSITION = 0x00000008,
+ AINPUT_SOURCE_CLASS_JOYSTICK = 0x00000010,
+};
+
+enum {
+ AINPUT_SOURCE_UNKNOWN = 0x00000000,
+
+ AINPUT_SOURCE_KEYBOARD = 0x00000100 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_DPAD = 0x00000200 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_GAMEPAD = 0x00000400 | AINPUT_SOURCE_CLASS_BUTTON,
+ AINPUT_SOURCE_TOUCHSCREEN = 0x00001000 | AINPUT_SOURCE_CLASS_POINTER,
+ AINPUT_SOURCE_MOUSE = 0x00002000 | AINPUT_SOURCE_CLASS_POINTER,
+ AINPUT_SOURCE_STYLUS = 0x00004000 | AINPUT_SOURCE_CLASS_POINTER,
+ AINPUT_SOURCE_TRACKBALL = 0x00010000 | AINPUT_SOURCE_CLASS_NAVIGATION,
+ AINPUT_SOURCE_TOUCHPAD = 0x00100000 | AINPUT_SOURCE_CLASS_POSITION,
+ AINPUT_SOURCE_TOUCH_NAVIGATION = 0x00200000 | AINPUT_SOURCE_CLASS_NONE,
+ AINPUT_SOURCE_JOYSTICK = 0x01000000 | AINPUT_SOURCE_CLASS_JOYSTICK,
+
+ AINPUT_SOURCE_ANY = 0xffffff00,
+};
+
+/*
+ * Keyboard types.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details.
+ */
+enum {
+ AINPUT_KEYBOARD_TYPE_NONE = 0,
+ AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC = 1,
+ AINPUT_KEYBOARD_TYPE_ALPHABETIC = 2,
+};
+
+/*
+ * Constants used to retrieve information about the range of motion for a particular
+ * coordinate of a motion event.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ *
+ * DEPRECATION NOTICE: These constants are deprecated. Use AMOTION_EVENT_AXIS_* constants instead.
+ */
+enum {
+ AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X,
+ AINPUT_MOTION_RANGE_Y = AMOTION_EVENT_AXIS_Y,
+ AINPUT_MOTION_RANGE_PRESSURE = AMOTION_EVENT_AXIS_PRESSURE,
+ AINPUT_MOTION_RANGE_SIZE = AMOTION_EVENT_AXIS_SIZE,
+ AINPUT_MOTION_RANGE_TOUCH_MAJOR = AMOTION_EVENT_AXIS_TOUCH_MAJOR,
+ AINPUT_MOTION_RANGE_TOUCH_MINOR = AMOTION_EVENT_AXIS_TOUCH_MINOR,
+ AINPUT_MOTION_RANGE_TOOL_MAJOR = AMOTION_EVENT_AXIS_TOOL_MAJOR,
+ AINPUT_MOTION_RANGE_TOOL_MINOR = AMOTION_EVENT_AXIS_TOOL_MINOR,
+ AINPUT_MOTION_RANGE_ORIENTATION = AMOTION_EVENT_AXIS_ORIENTATION,
+} __attribute__ ((deprecated));
+
+
+/*
+ * Input event accessors.
+ *
+ * Note that most functions can only be used on input events that are of a given type.
+ * Calling these functions on input events of other types will yield undefined behavior.
+ */
+
+/*** Accessors for all input events. ***/
+
+/* Get the input event type. */
+int32_t AInputEvent_getType(const AInputEvent* event);
+
+/* Get the id for the device that an input event came from.
+ *
+ * Input events can be generated by multiple different input devices.
+ * Use the input device id to obtain information about the input
+ * device that was responsible for generating a particular event.
+ *
+ * An input device id of 0 indicates that the event didn't come from a physical device;
+ * other numbers are arbitrary and you shouldn't depend on the values.
+ * Use the provided input device query API to obtain information about input devices.
+ */
+int32_t AInputEvent_getDeviceId(const AInputEvent* event);
+
+/* Get the input event source. */
+int32_t AInputEvent_getSource(const AInputEvent* event);
+
+/*** Accessors for key events only. ***/
+
+/* Get the key event action. */
+int32_t AKeyEvent_getAction(const AInputEvent* key_event);
+
+/* Get the key event flags. */
+int32_t AKeyEvent_getFlags(const AInputEvent* key_event);
+
+/* Get the key code of the key event.
+ * This is the physical key that was pressed, not the Unicode character. */
+int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event);
+
+/* Get the hardware key id of this key event.
+ * These values are not reliable and vary from device to device. */
+int32_t AKeyEvent_getScanCode(const AInputEvent* key_event);
+
+/* Get the meta key state. */
+int32_t AKeyEvent_getMetaState(const AInputEvent* key_event);
+
+/* Get the repeat count of the event.
+ * For both key up an key down events, this is the number of times the key has
+ * repeated with the first down starting at 0 and counting up from there. For
+ * multiple key events, this is the number of down/up pairs that have occurred. */
+int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event);
+
+/* Get the time of the most recent key down event, in the
+ * java.lang.System.nanoTime() time base. If this is a down event,
+ * this will be the same as eventTime.
+ * Note that when chording keys, this value is the down time of the most recently
+ * pressed key, which may not be the same physical key of this event. */
+int64_t AKeyEvent_getDownTime(const AInputEvent* key_event);
+
+/* Get the time this event occurred, in the
+ * java.lang.System.nanoTime() time base. */
+int64_t AKeyEvent_getEventTime(const AInputEvent* key_event);
+
+/*** Accessors for motion events only. ***/
+
+/* Get the combined motion event action code and pointer index. */
+int32_t AMotionEvent_getAction(const AInputEvent* motion_event);
+
+/* Get the motion event flags. */
+int32_t AMotionEvent_getFlags(const AInputEvent* motion_event);
+
+/* Get the state of any meta / modifier keys that were in effect when the
+ * event was generated. */
+int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event);
+
+/* Get the button state of all buttons that are pressed. */
+int32_t AMotionEvent_getButtonState(const AInputEvent* motion_event);
+
+/* Get a bitfield indicating which edges, if any, were touched by this motion event.
+ * For touch events, clients can use this to determine if the user's finger was
+ * touching the edge of the display. */
+int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event);
+
+/* Get the time when the user originally pressed down to start a stream of
+ * position events, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event);
+
+/* Get the time when this specific event was generated,
+ * in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event);
+
+/* Get the X coordinate offset.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getXOffset(const AInputEvent* motion_event);
+
+/* Get the precision of the Y coordinates being reported.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getYOffset(const AInputEvent* motion_event);
+
+/* Get the precision of the X coordinates being reported.
+ * You can multiply this number with an X coordinate sample to find the
+ * actual hardware value of the X coordinate. */
+float AMotionEvent_getXPrecision(const AInputEvent* motion_event);
+
+/* Get the precision of the Y coordinates being reported.
+ * You can multiply this number with a Y coordinate sample to find the
+ * actual hardware value of the Y coordinate. */
+float AMotionEvent_getYPrecision(const AInputEvent* motion_event);
+
+/* Get the number of pointers of data contained in this event.
+ * Always >= 1. */
+size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event);
+
+/* Get the pointer identifier associated with a particular pointer
+ * data index in this event. The identifier tells you the actual pointer
+ * number associated with the data, accounting for individual pointers
+ * going up and down since the start of the current gesture. */
+int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the tool type of a pointer for the given pointer index.
+ * The tool type indicates the type of tool used to make contact such as a
+ * finger or stylus, if known. */
+int32_t AMotionEvent_getToolType(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current X coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current Y coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current pressure of this event for the given pointer index.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current scaled value of the approximate size for the given pointer index.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1. The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation. A positive angle
+ * indicates that the major axis of contact is oriented to the right. A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the value of the request axis for the given pointer index. */
+float AMotionEvent_getAxisValue(const AInputEvent* motion_event,
+ int32_t axis, size_t pointer_index);
+
+/* Get the number of historical points in this event. These are movements that
+ * have occurred between this event and the previous event. This only applies
+ * to AMOTION_EVENT_ACTION_MOVE events -- all other actions will have a size of 0.
+ * Historical samples are indexed from oldest to newest. */
+size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event);
+
+/* Get the time that a historical movement occurred between this event and
+ * the previous event, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getHistoricalEventTime(const AInputEvent* motion_event,
+ size_t history_index);
+
+/* Get the historical raw X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical raw Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical pressure of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the current scaled value of the approximate size for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1. The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation. A positive angle
+ * indicates that the major axis of contact is oriented to the right. A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
+ size_t history_index);
+
+/* Get the historical value of the request axis for the given pointer index
+ * that occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
+ int32_t axis, size_t pointer_index, size_t history_index);
+
+
+/*
+ * Input queue
+ *
+ * An input queue is the facility through which you retrieve input
+ * events.
+ */
+struct AInputQueue;
+typedef struct AInputQueue AInputQueue;
+
+/*
+ * Add this input queue to a looper for processing. See
+ * ALooper_addFd() for information on the ident, callback, and data params.
+ */
+void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
+ int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Remove the input queue from the looper it is currently attached to.
+ */
+void AInputQueue_detachLooper(AInputQueue* queue);
+
+/*
+ * Returns true if there are one or more events available in the
+ * input queue. Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int32_t AInputQueue_hasEvents(AInputQueue* queue);
+
+/*
+ * Returns the next available event from the queue. Returns a negative
+ * value if no events are available or an error has occurred.
+ */
+int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent);
+
+/*
+ * Sends the key for standard pre-dispatching -- that is, possibly deliver
+ * it to the current IME to be consumed before the app. Returns 0 if it
+ * was not pre-dispatched, meaning you can process it right now. If non-zero
+ * is returned, you must abandon the current event processing and allow the
+ * event to appear again in the event queue (if it does not get consumed during
+ * pre-dispatching).
+ */
+int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event);
+
+/*
+ * Report that dispatching has finished with the given event.
+ * This must be called after receiving an event with AInputQueue_get_event().
+ */
+void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_INPUT_H
diff --git a/ndk/platforms/android-18/include/android/keycodes.h b/ndk/platforms/android-18/include/android/keycodes.h
new file mode 100644
index 0000000..cf38d1a
--- /dev/null
+++ b/ndk/platforms/android-18/include/android/keycodes.h
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+ AKEYCODE_UNKNOWN = 0,
+ AKEYCODE_SOFT_LEFT = 1,
+ AKEYCODE_SOFT_RIGHT = 2,
+ AKEYCODE_HOME = 3,
+ AKEYCODE_BACK = 4,
+ AKEYCODE_CALL = 5,
+ AKEYCODE_ENDCALL = 6,
+ AKEYCODE_0 = 7,
+ AKEYCODE_1 = 8,
+ AKEYCODE_2 = 9,
+ AKEYCODE_3 = 10,
+ AKEYCODE_4 = 11,
+ AKEYCODE_5 = 12,
+ AKEYCODE_6 = 13,
+ AKEYCODE_7 = 14,
+ AKEYCODE_8 = 15,
+ AKEYCODE_9 = 16,
+ AKEYCODE_STAR = 17,
+ AKEYCODE_POUND = 18,
+ AKEYCODE_DPAD_UP = 19,
+ AKEYCODE_DPAD_DOWN = 20,
+ AKEYCODE_DPAD_LEFT = 21,
+ AKEYCODE_DPAD_RIGHT = 22,
+ AKEYCODE_DPAD_CENTER = 23,
+ AKEYCODE_VOLUME_UP = 24,
+ AKEYCODE_VOLUME_DOWN = 25,
+ AKEYCODE_POWER = 26,
+ AKEYCODE_CAMERA = 27,
+ AKEYCODE_CLEAR = 28,
+ AKEYCODE_A = 29,
+ AKEYCODE_B = 30,
+ AKEYCODE_C = 31,
+ AKEYCODE_D = 32,
+ AKEYCODE_E = 33,
+ AKEYCODE_F = 34,
+ AKEYCODE_G = 35,
+ AKEYCODE_H = 36,
+ AKEYCODE_I = 37,
+ AKEYCODE_J = 38,
+ AKEYCODE_K = 39,
+ AKEYCODE_L = 40,
+ AKEYCODE_M = 41,
+ AKEYCODE_N = 42,
+ AKEYCODE_O = 43,
+ AKEYCODE_P = 44,
+ AKEYCODE_Q = 45,
+ AKEYCODE_R = 46,
+ AKEYCODE_S = 47,
+ AKEYCODE_T = 48,
+ AKEYCODE_U = 49,
+ AKEYCODE_V = 50,
+ AKEYCODE_W = 51,
+ AKEYCODE_X = 52,
+ AKEYCODE_Y = 53,
+ AKEYCODE_Z = 54,
+ AKEYCODE_COMMA = 55,
+ AKEYCODE_PERIOD = 56,
+ AKEYCODE_ALT_LEFT = 57,
+ AKEYCODE_ALT_RIGHT = 58,
+ AKEYCODE_SHIFT_LEFT = 59,
+ AKEYCODE_SHIFT_RIGHT = 60,
+ AKEYCODE_TAB = 61,
+ AKEYCODE_SPACE = 62,
+ AKEYCODE_SYM = 63,
+ AKEYCODE_EXPLORER = 64,
+ AKEYCODE_ENVELOPE = 65,
+ AKEYCODE_ENTER = 66,
+ AKEYCODE_DEL = 67,
+ AKEYCODE_GRAVE = 68,
+ AKEYCODE_MINUS = 69,
+ AKEYCODE_EQUALS = 70,
+ AKEYCODE_LEFT_BRACKET = 71,
+ AKEYCODE_RIGHT_BRACKET = 72,
+ AKEYCODE_BACKSLASH = 73,
+ AKEYCODE_SEMICOLON = 74,
+ AKEYCODE_APOSTROPHE = 75,
+ AKEYCODE_SLASH = 76,
+ AKEYCODE_AT = 77,
+ AKEYCODE_NUM = 78,
+ AKEYCODE_HEADSETHOOK = 79,
+ AKEYCODE_FOCUS = 80, // *Camera* focus
+ AKEYCODE_PLUS = 81,
+ AKEYCODE_MENU = 82,
+ AKEYCODE_NOTIFICATION = 83,
+ AKEYCODE_SEARCH = 84,
+ AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+ AKEYCODE_MEDIA_STOP = 86,
+ AKEYCODE_MEDIA_NEXT = 87,
+ AKEYCODE_MEDIA_PREVIOUS = 88,
+ AKEYCODE_MEDIA_REWIND = 89,
+ AKEYCODE_MEDIA_FAST_FORWARD = 90,
+ AKEYCODE_MUTE = 91,
+ AKEYCODE_PAGE_UP = 92,
+ AKEYCODE_PAGE_DOWN = 93,
+ AKEYCODE_PICTSYMBOLS = 94,
+ AKEYCODE_SWITCH_CHARSET = 95,
+ AKEYCODE_BUTTON_A = 96,
+ AKEYCODE_BUTTON_B = 97,
+ AKEYCODE_BUTTON_C = 98,
+ AKEYCODE_BUTTON_X = 99,
+ AKEYCODE_BUTTON_Y = 100,
+ AKEYCODE_BUTTON_Z = 101,
+ AKEYCODE_BUTTON_L1 = 102,
+ AKEYCODE_BUTTON_R1 = 103,
+ AKEYCODE_BUTTON_L2 = 104,
+ AKEYCODE_BUTTON_R2 = 105,
+ AKEYCODE_BUTTON_THUMBL = 106,
+ AKEYCODE_BUTTON_THUMBR = 107,
+ AKEYCODE_BUTTON_START = 108,
+ AKEYCODE_BUTTON_SELECT = 109,
+ AKEYCODE_BUTTON_MODE = 110,
+ AKEYCODE_ESCAPE = 111,
+ AKEYCODE_FORWARD_DEL = 112,
+ AKEYCODE_CTRL_LEFT = 113,
+ AKEYCODE_CTRL_RIGHT = 114,
+ AKEYCODE_CAPS_LOCK = 115,
+ AKEYCODE_SCROLL_LOCK = 116,
+ AKEYCODE_META_LEFT = 117,
+ AKEYCODE_META_RIGHT = 118,
+ AKEYCODE_FUNCTION = 119,
+ AKEYCODE_SYSRQ = 120,
+ AKEYCODE_BREAK = 121,
+ AKEYCODE_MOVE_HOME = 122,
+ AKEYCODE_MOVE_END = 123,
+ AKEYCODE_INSERT = 124,
+ AKEYCODE_FORWARD = 125,
+ AKEYCODE_MEDIA_PLAY = 126,
+ AKEYCODE_MEDIA_PAUSE = 127,
+ AKEYCODE_MEDIA_CLOSE = 128,
+ AKEYCODE_MEDIA_EJECT = 129,
+ AKEYCODE_MEDIA_RECORD = 130,
+ AKEYCODE_F1 = 131,
+ AKEYCODE_F2 = 132,
+ AKEYCODE_F3 = 133,
+ AKEYCODE_F4 = 134,
+ AKEYCODE_F5 = 135,
+ AKEYCODE_F6 = 136,
+ AKEYCODE_F7 = 137,
+ AKEYCODE_F8 = 138,
+ AKEYCODE_F9 = 139,
+ AKEYCODE_F10 = 140,
+ AKEYCODE_F11 = 141,
+ AKEYCODE_F12 = 142,
+ AKEYCODE_NUM_LOCK = 143,
+ AKEYCODE_NUMPAD_0 = 144,
+ AKEYCODE_NUMPAD_1 = 145,
+ AKEYCODE_NUMPAD_2 = 146,
+ AKEYCODE_NUMPAD_3 = 147,
+ AKEYCODE_NUMPAD_4 = 148,
+ AKEYCODE_NUMPAD_5 = 149,
+ AKEYCODE_NUMPAD_6 = 150,
+ AKEYCODE_NUMPAD_7 = 151,
+ AKEYCODE_NUMPAD_8 = 152,
+ AKEYCODE_NUMPAD_9 = 153,
+ AKEYCODE_NUMPAD_DIVIDE = 154,
+ AKEYCODE_NUMPAD_MULTIPLY = 155,
+ AKEYCODE_NUMPAD_SUBTRACT = 156,
+ AKEYCODE_NUMPAD_ADD = 157,
+ AKEYCODE_NUMPAD_DOT = 158,
+ AKEYCODE_NUMPAD_COMMA = 159,
+ AKEYCODE_NUMPAD_ENTER = 160,
+ AKEYCODE_NUMPAD_EQUALS = 161,
+ AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+ AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+ AKEYCODE_VOLUME_MUTE = 164,
+ AKEYCODE_INFO = 165,
+ AKEYCODE_CHANNEL_UP = 166,
+ AKEYCODE_CHANNEL_DOWN = 167,
+ AKEYCODE_ZOOM_IN = 168,
+ AKEYCODE_ZOOM_OUT = 169,
+ AKEYCODE_TV = 170,
+ AKEYCODE_WINDOW = 171,
+ AKEYCODE_GUIDE = 172,
+ AKEYCODE_DVR = 173,
+ AKEYCODE_BOOKMARK = 174,
+ AKEYCODE_CAPTIONS = 175,
+ AKEYCODE_SETTINGS = 176,
+ AKEYCODE_TV_POWER = 177,
+ AKEYCODE_TV_INPUT = 178,
+ AKEYCODE_STB_POWER = 179,
+ AKEYCODE_STB_INPUT = 180,
+ AKEYCODE_AVR_POWER = 181,
+ AKEYCODE_AVR_INPUT = 182,
+ AKEYCODE_PROG_RED = 183,
+ AKEYCODE_PROG_GREEN = 184,
+ AKEYCODE_PROG_YELLOW = 185,
+ AKEYCODE_PROG_BLUE = 186,
+ AKEYCODE_APP_SWITCH = 187,
+ AKEYCODE_BUTTON_1 = 188,
+ AKEYCODE_BUTTON_2 = 189,
+ AKEYCODE_BUTTON_3 = 190,
+ AKEYCODE_BUTTON_4 = 191,
+ AKEYCODE_BUTTON_5 = 192,
+ AKEYCODE_BUTTON_6 = 193,
+ AKEYCODE_BUTTON_7 = 194,
+ AKEYCODE_BUTTON_8 = 195,
+ AKEYCODE_BUTTON_9 = 196,
+ AKEYCODE_BUTTON_10 = 197,
+ AKEYCODE_BUTTON_11 = 198,
+ AKEYCODE_BUTTON_12 = 199,
+ AKEYCODE_BUTTON_13 = 200,
+ AKEYCODE_BUTTON_14 = 201,
+ AKEYCODE_BUTTON_15 = 202,
+ AKEYCODE_BUTTON_16 = 203,
+ AKEYCODE_LANGUAGE_SWITCH = 204,
+ AKEYCODE_MANNER_MODE = 205,
+ AKEYCODE_3D_MODE = 206,
+ AKEYCODE_CONTACTS = 207,
+ AKEYCODE_CALENDAR = 208,
+ AKEYCODE_MUSIC = 209,
+ AKEYCODE_CALCULATOR = 210,
+ AKEYCODE_ZENKAKU_HANKAKU = 211,
+ AKEYCODE_EISU = 212,
+ AKEYCODE_MUHENKAN = 213,
+ AKEYCODE_HENKAN = 214,
+ AKEYCODE_KATAKANA_HIRAGANA = 215,
+ AKEYCODE_YEN = 216,
+ AKEYCODE_RO = 217,
+ AKEYCODE_KANA = 218,
+ AKEYCODE_ASSIST = 219,
+ AKEYCODE_BRIGHTNESS_DOWN = 220,
+ AKEYCODE_BRIGHTNESS_UP = 221,
+
+ // NOTE: If you add a new keycode here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-18/include/math.h b/ndk/platforms/android-18/include/math.h
new file mode 100644
index 0000000..59b4499
--- /dev/null
+++ b/ndk/platforms/android-18/include/math.h
@@ -0,0 +1,502 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * from: @(#)fdlibm.h 5.1 93/09/24
+ * $FreeBSD: src/lib/msun/src/math.h,v 1.61 2005/04/16 21:12:47 das Exp $
+ */
+
+#ifndef _MATH_H_
+#define _MATH_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <limits.h>
+
+#define __pure2
+
+/*
+ * ANSI/POSIX
+ */
+extern const union __infinity_un {
+ unsigned char __uc[8];
+ double __ud;
+} __infinity;
+
+extern const union __nan_un {
+ unsigned char __uc[sizeof(float)];
+ float __uf;
+} __nan;
+
+/* #if __GNUC_PREREQ__(3, 3) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800) */
+#if 1
+#define __MATH_BUILTIN_CONSTANTS
+#endif
+
+/* #if __GNUC_PREREQ__(3, 0) && !defined(__INTEL_COMPILER) */
+#if 1
+#define __MATH_BUILTIN_RELOPS
+#endif
+
+/* #ifdef __MATH_BUILTIN_CONSTANTS */
+#if 1
+#define HUGE_VAL __builtin_huge_val()
+#else
+#define HUGE_VAL (__infinity.__ud)
+#endif
+
+/* #if __ISO_C_VISIBLE >= 1999 */
+#if 0
+#define FP_ILOGB0 (-__INT_MAX)
+#define FP_ILOGBNAN __INT_MAX
+#else
+#define FP_ILOGB0 (-INT_MAX)
+#define FP_ILOGBNAN INT_MAX
+#endif
+
+#ifdef __MATH_BUILTIN_CONSTANTS
+#define HUGE_VALF __builtin_huge_valf()
+#define HUGE_VALL __builtin_huge_vall()
+#define INFINITY __builtin_inf()
+#define NAN __builtin_nan("")
+#else
+#define HUGE_VALF (float)HUGE_VAL
+#define HUGE_VALL (long double)HUGE_VAL
+#define INFINITY HUGE_VALF
+#define NAN (__nan.__uf)
+#endif /* __MATH_BUILTIN_CONSTANTS */
+
+#define MATH_ERRNO 1
+#define MATH_ERREXCEPT 2
+#define math_errhandling MATH_ERREXCEPT
+
+/* XXX We need a <machine/math.h>. */
+#if defined(__ia64__) || defined(__sparc64__)
+#define FP_FAST_FMA
+#endif
+#ifdef __ia64__
+#define FP_FAST_FMAL
+#endif
+#define FP_FAST_FMAF
+
+/* Symbolic constants to classify floating point numbers. */
+#define FP_INFINITE 0x01
+#define FP_NAN 0x02
+#define FP_NORMAL 0x04
+#define FP_SUBNORMAL 0x08
+#define FP_ZERO 0x10
+#define fpclassify(x) \
+ ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
+ : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
+ : __fpclassifyl(x))
+
+#define isfinite(x) \
+ ((sizeof (x) == sizeof (float)) ? __isfinitef(x) \
+ : (sizeof (x) == sizeof (double)) ? __isfinite(x) \
+ : __isfinitel(x))
+#define isinf(x) \
+ ((sizeof (x) == sizeof (float)) ? __isinff(x) \
+ : (sizeof (x) == sizeof (double)) ? __isinf(x) \
+ : __isinfl(x))
+#define isnan(x) \
+ ((sizeof (x) == sizeof (float)) ? isnanf(x) \
+ : (sizeof (x) == sizeof (double)) ? isnan(x) \
+ : __isnanl(x))
+#define isnormal(x) \
+ ((sizeof (x) == sizeof (float)) ? __isnormalf(x) \
+ : (sizeof (x) == sizeof (double)) ? __isnormal(x) \
+ : __isnormall(x))
+
+#ifdef __MATH_BUILTIN_RELOPS
+#define isgreater(x, y) __builtin_isgreater((x), (y))
+#define isgreaterequal(x, y) __builtin_isgreaterequal((x), (y))
+#define isless(x, y) __builtin_isless((x), (y))
+#define islessequal(x, y) __builtin_islessequal((x), (y))
+#define islessgreater(x, y) __builtin_islessgreater((x), (y))
+#define isunordered(x, y) __builtin_isunordered((x), (y))
+#else
+#define isgreater(x, y) (!isunordered((x), (y)) && (x) > (y))
+#define isgreaterequal(x, y) (!isunordered((x), (y)) && (x) >= (y))
+#define isless(x, y) (!isunordered((x), (y)) && (x) < (y))
+#define islessequal(x, y) (!isunordered((x), (y)) && (x) <= (y))
+#define islessgreater(x, y) (!isunordered((x), (y)) && \
+ ((x) > (y) || (y) > (x)))
+#define isunordered(x, y) (isnan(x) || isnan(y))
+#endif /* __MATH_BUILTIN_RELOPS */
+
+#define signbit(x) \
+ ((sizeof (x) == sizeof (float)) ? __signbitf(x) \
+ : (sizeof (x) == sizeof (double)) ? __signbit(x) \
+ : __signbitl(x))
+
+#if 0
+typedef __double_t double_t;
+typedef __float_t float_t;
+#endif
+/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+
+/*
+ * XOPEN/SVID
+ */
+/* #if __BSD_VISIBLE || __XSI_VISIBLE */
+#define M_E 2.7182818284590452354 /* e */
+#define M_LOG2E 1.4426950408889634074 /* log 2e */
+#define M_LOG10E 0.43429448190325182765 /* log 10e */
+#define M_LN2 0.69314718055994530942 /* log e2 */
+#define M_LN10 2.30258509299404568402 /* log e10 */
+#define M_PI 3.14159265358979323846 /* pi */
+#define M_PI_2 1.57079632679489661923 /* pi/2 */
+#define M_PI_4 0.78539816339744830962 /* pi/4 */
+#define M_1_PI 0.31830988618379067154 /* 1/pi */
+#define M_2_PI 0.63661977236758134308 /* 2/pi */
+#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
+#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
+
+#define MAXFLOAT ((float)3.40282346638528860e+38)
+extern int signgam;
+/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
+
+#if __BSD_VISIBLE
+#if 0
+/* Old value from 4.4BSD-Lite math.h; this is probably better. */
+#define HUGE HUGE_VAL
+#else
+#define HUGE MAXFLOAT
+#endif
+#endif /* __BSD_VISIBLE */
+
+/*
+ * Most of these functions depend on the rounding mode and have the side
+ * effect of raising floating-point exceptions, so they are not declared
+ * as __pure2. In C99, FENV_ACCESS affects the purity of these functions.
+ */
+__BEGIN_DECLS
+/*
+ * ANSI/POSIX
+ */
+int __fpclassifyd(double) __NDK_FPABI_MATH__ __pure2;
+int __fpclassifyf(float) __NDK_FPABI_MATH__ __pure2;
+int __fpclassifyl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isfinitef(float) __NDK_FPABI_MATH__ __pure2;
+int __isfinite(double) __NDK_FPABI_MATH__ __pure2;
+int __isfinitel(long double) __NDK_FPABI_MATH__ __pure2;
+int __isinff(float) __NDK_FPABI_MATH__ __pure2;
+int __isinf(double) __NDK_FPABI_MATH__ __pure2;
+int __isinfl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isnanl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isnormalf(float) __NDK_FPABI_MATH__ __pure2;
+int __isnormal(double) __NDK_FPABI_MATH__ __pure2;
+int __isnormall(long double) __NDK_FPABI_MATH__ __pure2;
+int __signbit(double) __NDK_FPABI_MATH__ __pure2;
+int __signbitf(float) __NDK_FPABI_MATH__ __pure2;
+int __signbitl(long double) __NDK_FPABI_MATH__ __pure2;
+
+double acos(double) __NDK_FPABI_MATH__;
+double asin(double) __NDK_FPABI_MATH__;
+double atan(double) __NDK_FPABI_MATH__;
+double atan2(double, double) __NDK_FPABI_MATH__;
+double cos(double) __NDK_FPABI_MATH__;
+double sin(double) __NDK_FPABI_MATH__;
+double tan(double) __NDK_FPABI_MATH__;
+
+double cosh(double) __NDK_FPABI_MATH__;
+double sinh(double) __NDK_FPABI_MATH__;
+double tanh(double) __NDK_FPABI_MATH__;
+
+double exp(double) __NDK_FPABI_MATH__;
+double frexp(double, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+double ldexp(double, int) __NDK_FPABI_MATH__;
+double log(double) __NDK_FPABI_MATH__;
+double log10(double) __NDK_FPABI_MATH__;
+double modf(double, double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+
+double pow(double, double) __NDK_FPABI_MATH__;
+double sqrt(double) __NDK_FPABI_MATH__;
+
+double ceil(double) __NDK_FPABI_MATH__;
+double fabs(double) __NDK_FPABI_MATH__ __pure2;
+double floor(double) __NDK_FPABI_MATH__;
+double fmod(double, double) __NDK_FPABI_MATH__;
+
+/*
+ * These functions are not in C90.
+ */
+/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
+double acosh(double) __NDK_FPABI_MATH__;
+double asinh(double) __NDK_FPABI_MATH__;
+double atanh(double) __NDK_FPABI_MATH__;
+double cbrt(double) __NDK_FPABI_MATH__;
+double erf(double) __NDK_FPABI_MATH__;
+double erfc(double) __NDK_FPABI_MATH__;
+double exp2(double) __NDK_FPABI_MATH__;
+double expm1(double) __NDK_FPABI_MATH__;
+double fma(double, double, double) __NDK_FPABI_MATH__;
+double hypot(double, double) __NDK_FPABI_MATH__;
+int ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int (isinf)(double) __NDK_FPABI_MATH__ __pure2; */
+int (isnan)(double) __NDK_FPABI_MATH__ __pure2;
+double lgamma(double) __NDK_FPABI_MATH__;
+long long llrint(double) __NDK_FPABI_MATH__;
+long long llround(double) __NDK_FPABI_MATH__;
+double log1p(double) __NDK_FPABI_MATH__;
+double log2(double) __NDK_FPABI_MATH__;
+double logb(double) __NDK_FPABI_MATH__;
+long lrint(double) __NDK_FPABI_MATH__;
+long lround(double) __NDK_FPABI_MATH__;
+double nan(const char *) __NDK_FPABI_MATH__ __pure2;
+double nextafter(double, double) __NDK_FPABI_MATH__;
+double remainder(double, double) __NDK_FPABI_MATH__;
+double remquo(double, double, int *) __NDK_FPABI_MATH__;
+double rint(double) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
+
+/* #if __BSD_VISIBLE || __XSI_VISIBLE */
+double j0(double) __NDK_FPABI_MATH__;
+double j1(double) __NDK_FPABI_MATH__;
+double jn(int, double) __NDK_FPABI_MATH__;
+double scalb(double, double) __NDK_FPABI_MATH__;
+double y0(double) __NDK_FPABI_MATH__;
+double y1(double) __NDK_FPABI_MATH__;
+double yn(int, double) __NDK_FPABI_MATH__;
+
+/* #if __XSI_VISIBLE <= 500 || __BSD_VISIBLE */
+double gamma(double) __NDK_FPABI_MATH__;
+/* #endif */
+/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
+
+/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 */
+double copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double fdim(double, double) __NDK_FPABI_MATH__;
+double fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double nearbyint(double) __NDK_FPABI_MATH__;
+double round(double) __NDK_FPABI_MATH__;
+double scalbln(double, long) __NDK_FPABI_MATH__;
+double scalbn(double, int) __NDK_FPABI_MATH__;
+double tgamma(double) __NDK_FPABI_MATH__;
+double trunc(double) __NDK_FPABI_MATH__;
+/* #endif */
+
+/*
+ * BSD math library entry points
+ */
+/* #if __BSD_VISIBLE */
+double drem(double, double) __NDK_FPABI_MATH__;
+int finite(double) __NDK_FPABI_MATH__ __pure2;
+int isnanf(float) __NDK_FPABI_MATH__ __pure2;
+
+/*
+ * Reentrant version of gamma & lgamma; passes signgam back by reference
+ * as the second argument; user must allocate space for signgam.
+ */
+double gamma_r(double, int *) __NDK_FPABI_MATH__;
+double lgamma_r(double, int *) __NDK_FPABI_MATH__;
+
+/*
+ * IEEE Test Vector
+ */
+double significand(double) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE */
+
+/* float versions of ANSI/POSIX functions */
+/*#if __ISO_C_VISIBLE >= 1999 */
+float acosf(float) __NDK_FPABI_MATH__;
+float asinf(float) __NDK_FPABI_MATH__;
+float atanf(float) __NDK_FPABI_MATH__;
+float atan2f(float, float) __NDK_FPABI_MATH__;
+float cosf(float) __NDK_FPABI_MATH__;
+float sinf(float) __NDK_FPABI_MATH__;
+float tanf(float) __NDK_FPABI_MATH__;
+
+float coshf(float) __NDK_FPABI_MATH__;
+float sinhf(float) __NDK_FPABI_MATH__;
+float tanhf(float) __NDK_FPABI_MATH__;
+
+float exp2f(float) __NDK_FPABI_MATH__;
+float expf(float) __NDK_FPABI_MATH__;
+float expm1f(float) __NDK_FPABI_MATH__;
+float frexpf(float, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+int ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float ldexpf(float, int) __NDK_FPABI_MATH__;
+float log10f(float) __NDK_FPABI_MATH__;
+float log1pf(float) __NDK_FPABI_MATH__;
+float log2f(float) __NDK_FPABI_MATH__;
+float logf(float) __NDK_FPABI_MATH__;
+float modff(float, float *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+
+float powf(float, float) __NDK_FPABI_MATH__;
+float sqrtf(float) __NDK_FPABI_MATH__;
+
+float ceilf(float) __NDK_FPABI_MATH__;
+float fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float floorf(float) __NDK_FPABI_MATH__;
+float fmodf(float, float) __NDK_FPABI_MATH__;
+float roundf(float) __NDK_FPABI_MATH__;
+
+float erff(float) __NDK_FPABI_MATH__;
+float erfcf(float) __NDK_FPABI_MATH__;
+float hypotf(float, float) __NDK_FPABI_MATH__;
+float lgammaf(float) __NDK_FPABI_MATH__;
+float tgammaf(float) __NDK_FPABI_MATH__;
+
+float acoshf(float) __NDK_FPABI_MATH__;
+float asinhf(float) __NDK_FPABI_MATH__;
+float atanhf(float) __NDK_FPABI_MATH__;
+float cbrtf(float) __NDK_FPABI_MATH__;
+float logbf(float) __NDK_FPABI_MATH__;
+float copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long llrintf(float) __NDK_FPABI_MATH__;
+long long llroundf(float) __NDK_FPABI_MATH__;
+long lrintf(float) __NDK_FPABI_MATH__;
+long lroundf(float) __NDK_FPABI_MATH__;
+float nanf(const char *) __NDK_FPABI_MATH__ __pure2;
+float nearbyintf(float) __NDK_FPABI_MATH__;
+float nextafterf(float, float) __NDK_FPABI_MATH__;
+float remainderf(float, float) __NDK_FPABI_MATH__;
+float remquof(float, float, int *) __NDK_FPABI_MATH__;
+float rintf(float) __NDK_FPABI_MATH__;
+float scalblnf(float, long) __NDK_FPABI_MATH__;
+float scalbnf(float, int) __NDK_FPABI_MATH__;
+float truncf(float) __NDK_FPABI_MATH__;
+
+float fdimf(float, float) __NDK_FPABI_MATH__;
+float fmaf(float, float, float) __NDK_FPABI_MATH__;
+float fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float fminf(float, float) __NDK_FPABI_MATH__ __pure2;
+/* #endif */
+
+/*
+ * float versions of BSD math library entry points
+ */
+/* #if __BSD_VISIBLE */
+float dremf(float, float) __NDK_FPABI_MATH__;
+int finitef(float) __NDK_FPABI_MATH__ __pure2;
+float gammaf(float) __NDK_FPABI_MATH__;
+float j0f(float) __NDK_FPABI_MATH__;
+float j1f(float) __NDK_FPABI_MATH__;
+float jnf(int, float) __NDK_FPABI_MATH__;
+float scalbf(float, float) __NDK_FPABI_MATH__;
+float y0f(float) __NDK_FPABI_MATH__;
+float y1f(float) __NDK_FPABI_MATH__;
+float ynf(int, float) __NDK_FPABI_MATH__;
+
+/*
+ * Float versions of reentrant version of gamma & lgamma; passes
+ * signgam back by reference as the second argument; user must
+ * allocate space for signgam.
+ */
+float gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float lgammaf_r(float, int *) __NDK_FPABI_MATH__;
+
+/*
+ * float version of IEEE Test Vector
+ */
+float significandf(float) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE */
+
+/*
+ * long double versions of ISO/POSIX math functions
+ */
+/* #if __ISO_C_VISIBLE >= 1999 */
+#if 0
+long double acoshl(long double) __NDK_FPABI_MATH__;
+long double acosl(long double) __NDK_FPABI_MATH__;
+long double asinhl(long double) __NDK_FPABI_MATH__;
+long double asinl(long double) __NDK_FPABI_MATH__;
+long double atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double atanhl(long double) __NDK_FPABI_MATH__;
+long double atanl(long double) __NDK_FPABI_MATH__;
+long double cbrtl(long double) __NDK_FPABI_MATH__;
+#endif
+long double ceill(long double) __NDK_FPABI_MATH__;
+long double copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double coshl(long double) __NDK_FPABI_MATH__;
+long double cosl(long double) __NDK_FPABI_MATH__;
+long double erfcl(long double) __NDK_FPABI_MATH__;
+long double erfl(long double) __NDK_FPABI_MATH__;
+long double exp2l(long double) __NDK_FPABI_MATH__;
+long double expl(long double) __NDK_FPABI_MATH__;
+long double expm1l(long double) __NDK_FPABI_MATH__;
+#endif
+long double fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double floorl(long double) __NDK_FPABI_MATH__;
+long double fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double fmodl(long double, long double) __NDK_FPABI_MATH__;
+#endif
+long double frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+#if 0
+long double hypotl(long double, long double) __NDK_FPABI_MATH__;
+#endif
+int ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double ldexpl(long double, int) __NDK_FPABI_MATH__;
+#if 0
+long double lgammal(long double) __NDK_FPABI_MATH__;
+long long llrintl(long double) __NDK_FPABI_MATH__;
+#endif
+long long llroundl(long double) __NDK_FPABI_MATH__;
+#if 0
+long double log10l(long double) __NDK_FPABI_MATH__;
+long double log1pl(long double) __NDK_FPABI_MATH__;
+long double log2l(long double) __NDK_FPABI_MATH__;
+#endif
+long double logbl(long double) __NDK_FPABI_MATH__;
+#if 0
+long lrintl(long double) __NDK_FPABI_MATH__;
+#endif
+long lroundl(long double) __NDK_FPABI_MATH__;
+#if 0
+long double modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+#endif
+long double nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double nearbyintl(long double) __NDK_FPABI_MATH__;
+#endif
+long double nextafterl(long double, long double) __NDK_FPABI_MATH__;
+double nexttoward(double, long double) __NDK_FPABI_MATH__;
+float nexttowardf(float, long double) __NDK_FPABI_MATH__;
+long double nexttowardl(long double, long double) __NDK_FPABI_MATH__;
+#if 0
+long double powl(long double, long double) __NDK_FPABI_MATH__;
+long double remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double rintl(long double) __NDK_FPABI_MATH__;
+#endif
+long double roundl(long double) __NDK_FPABI_MATH__;
+long double scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double scalbnl(long double, int) __NDK_FPABI_MATH__;
+#if 0
+long double sinhl(long double) __NDK_FPABI_MATH__;
+long double sinl(long double) __NDK_FPABI_MATH__;
+long double sqrtl(long double) __NDK_FPABI_MATH__;
+long double tanhl(long double) __NDK_FPABI_MATH__;
+long double tanl(long double) __NDK_FPABI_MATH__;
+long double tgammal(long double) __NDK_FPABI_MATH__;
+#endif
+long double truncl(long double) __NDK_FPABI_MATH__;
+
+/* BIONIC: GLibc compatibility - required by the ARM toolchain */
+#ifdef _GNU_SOURCE
+void sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
+#endif
+
+/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+long double log2l(long double) __NDK_FPABI_MATH__;
+__END_DECLS
+
+#endif /* !_MATH_H_ */
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml b/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml
new file mode 100644
index 0000000..ae0bc3d
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.sample.moreteapots"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="11"
+ android:targetSdkVersion="17" />
+ <uses-feature android:glEsVersion="0x00020000"></uses-feature>
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
+ <application
+ android:allowBackup="true"
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme"
+ android:hasCode="true"
+ android:name="com.sample.moreteapots.MoreTeapotsApplication"
+ >
+
+ <!-- Our activity is the built-in NativeActivity framework class.
+ This will take care of integrating with our NDK code. -->
+ <activity android:name="com.sample.moreteapots.MoreTeapotsNativeActivity"
+ android:label="@string/app_name"
+ android:configChanges="orientation|keyboardHidden">
+ <!-- Tell NativeActivity the name of or .so -->
+ <meta-data android:name="android.app.lib_name"
+ android:value="MoreTeapotsNativeActivity" />
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlain.fsh b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlain.fsh
new file mode 100644
index 0000000..cf52e9d
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlain.fsh
@@ -0,0 +1,23 @@
+//
+// ShaderPlain.fsh
+//
+
+uniform lowp vec3 vMaterialAmbient;
+uniform lowp vec4 vMaterialSpecular;
+
+varying lowp vec4 colorDiffuse;
+
+uniform highp vec3 vLight0;
+varying mediump vec3 position;
+varying mediump vec3 normal;
+
+void main()
+{
+ mediump vec3 halfVector = normalize(-vLight0 + position);
+ mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);
+ mediump float fPower = vMaterialSpecular.w;
+ mediump float specular = pow(NdotH, fPower);
+
+ lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );
+ gl_FragColor = colorDiffuse + colorSpecular;
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlainES3.fsh b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlainES3.fsh
new file mode 100644
index 0000000..e9fefc9
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlainES3.fsh
@@ -0,0 +1,21 @@
+#version 300 es
+precision mediump float;
+
+uniform lowp vec4 vMaterialSpecular;
+uniform highp vec3 vLight0;
+
+in lowp vec4 colorDiffuse;
+in vec3 position;
+in vec3 normal;
+out vec4 outColor;
+
+void main()
+{
+ mediump vec3 halfVector = normalize(-vLight0 + position);
+ mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);
+ mediump float fPower = vMaterialSpecular.w;
+ mediump float specular = pow(NdotH, fPower);
+
+ lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );
+ outColor = colorDiffuse + colorSpecular;
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlain.vsh b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlain.vsh
new file mode 100644
index 0000000..725b44f
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlain.vsh
@@ -0,0 +1,34 @@
+//
+// ShaderPlain.vsh
+//
+
+attribute highp vec3 myVertex;
+attribute highp vec3 myNormal;
+
+varying lowp vec4 colorDiffuse;
+
+varying mediump vec3 position;
+varying mediump vec3 normal;
+
+uniform highp mat4 uMVMatrix;
+uniform highp mat4 uPMatrix;
+
+uniform highp vec3 vLight0;
+
+uniform lowp vec4 vMaterialDiffuse;
+uniform lowp vec3 vMaterialAmbient;
+uniform lowp vec4 vMaterialSpecular;
+
+void main(void)
+{
+ highp vec4 p = vec4(myVertex,1);
+ gl_Position = uPMatrix * p;
+
+ highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);
+ highp vec3 ecPosition = p.xyz;
+
+ colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse + vec4( vMaterialAmbient, 1 );
+
+ normal = worldNormal;
+ position = ecPosition;
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlainES3.vsh b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlainES3.vsh
new file mode 100644
index 0000000..06197c7
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlainES3.vsh
@@ -0,0 +1,42 @@
+#version 300 es
+precision mediump float;
+
+//
+//Shader with phoneshading + geometry instancing support
+//Parameters with %PARAM_NAME% will be replaced to actual parameter at compile time
+//
+
+const int NUM_OBJECTS = %NUM_TEAPOT%;
+layout(location=%LOCATION_VERTEX%) in highp vec3 myVertex;
+layout(location=%LOCATION_NORMAL%) in highp vec3 myNormal;
+
+layout(std140) uniform ParamBlock {
+ mat4 uPMatrix[NUM_OBJECTS];
+ mat4 uMVMatrix[NUM_OBJECTS];
+ vec3 vMaterialDiffuse[NUM_OBJECTS];
+};
+
+uniform highp vec3 vLight0;
+uniform lowp vec3 vMaterialAmbient;
+uniform lowp vec4 vMaterialSpecular;
+
+out lowp vec4 colorDiffuse;
+
+out mediump vec3 position;
+out mediump vec3 normal;
+
+void main(void)
+{
+ highp vec4 p = vec4(myVertex,1);
+ gl_Position = uPMatrix[gl_InstanceID%ARB%] * p;
+
+ highp vec3 worldNormal = vec3(mat3(uMVMatrix[gl_InstanceID%ARB%][0].xyz,
+ uMVMatrix[gl_InstanceID%ARB%][1].xyz,
+ uMVMatrix[gl_InstanceID%ARB%][2].xyz) * myNormal);
+ highp vec3 ecPosition = p.xyz;
+
+ colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vec4(vMaterialDiffuse[gl_InstanceID%ARB%], 1.f) + vec4( vMaterialAmbient, 1 );
+
+ normal = worldNormal;
+ position = ecPosition;
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk b/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk
new file mode 100644
index 0000000..cb0faf7
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk
@@ -0,0 +1,19 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := MoreTeapotsNativeActivity
+LOCAL_SRC_FILES := MoreTeapotsNativeActivity.cpp \
+MoreTeapotsRenderer.cpp \
+
+LOCAL_C_INCLUDES :=
+LOCAL_CFLAGS :=
+
+LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2
+LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module,android/ndk_helper)
+$(call import-module,android/native_app_glue)
+$(call import-module,android/cpufeatures)
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/Application.mk b/ndk/platforms/android-18/samples/MoreTeapots/jni/Application.mk
new file mode 100644
index 0000000..39b678d
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/Application.mk
@@ -0,0 +1,4 @@
+APP_PLATFORM := android-9
+APP_ABI := all
+
+APP_STL := stlport_static
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp
new file mode 100644
index 0000000..d5f215a
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp
@@ -0,0 +1,500 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include <jni.h>
+#include <errno.h>
+
+#include <vector>
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include <cpu-features.h>
+
+#include "MoreTeapotsRenderer.h"
+
+//-------------------------------------------------------------------------
+//Preprocessor
+//-------------------------------------------------------------------------
+#define HELPER_CLASS_NAME "com/sample/helper/NDKHelper" //Class name of helper function
+//-------------------------------------------------------------------------
+//Constants
+//-------------------------------------------------------------------------
+const int32_t NUM_TEAPOTS_X = 8;
+const int32_t NUM_TEAPOTS_Y = 8;
+const int32_t NUM_TEAPOTS_Z = 6;
+
+//-------------------------------------------------------------------------
+//Shared state for our app.
+//-------------------------------------------------------------------------
+struct android_app;
+class Engine
+{
+ MoreTeapotsRenderer renderer_;
+
+ ndk_helper::GLContext* gl_context_;
+
+ bool initialized_resources_;
+ bool has_focus_;
+
+ ndk_helper::DoubletapDetector doubletap_detector_;
+ ndk_helper::PinchDetector pinch_detector_;
+ ndk_helper::DragDetector drag_detector_;
+ ndk_helper::PerfMonitor monitor_;
+
+ ndk_helper::TapCamera tap_camera_;
+
+ android_app* app_;
+
+ ASensorManager* sensor_manager_;
+ const ASensor* accelerometer_sensor_;
+ ASensorEventQueue* sensor_event_queue_;
+
+ void UpdateFPS( float fps );
+ void ShowUI();
+ void TransformPosition( ndk_helper::Vec2& vec );
+
+public:
+ static void HandleCmd( struct android_app* app,
+ int32_t cmd );
+ static int32_t HandleInput( android_app* app,
+ AInputEvent* event );
+
+ Engine();
+ ~Engine();
+ void SetState( android_app* state );
+ int InitDisplay();
+ void LoadResources();
+ void UnloadResources();
+ void DrawFrame();
+ void TermDisplay();
+ void TrimMemory();
+ bool IsReady();
+
+ void UpdatePosition( AInputEvent* event,
+ int32_t index,
+ float& x,
+ float& y );
+
+ void InitSensors();
+ void ProcessSensors( int32_t id );
+ void SuspendSensors();
+ void ResumeSensors();
+};
+
+//-------------------------------------------------------------------------
+//Ctor
+//-------------------------------------------------------------------------
+Engine::Engine() :
+ initialized_resources_( false ),
+ has_focus_( false ),
+ app_( NULL ),
+ sensor_manager_( NULL ),
+ accelerometer_sensor_( NULL ),
+ sensor_event_queue_( NULL )
+{
+ gl_context_ = ndk_helper::GLContext::GetInstance();
+}
+
+//-------------------------------------------------------------------------
+//Dtor
+//-------------------------------------------------------------------------
+Engine::~Engine()
+{
+}
+
+/**
+ * Load resources
+ */
+void Engine::LoadResources()
+{
+ renderer_.Init( NUM_TEAPOTS_X, NUM_TEAPOTS_Y, NUM_TEAPOTS_Z );
+ renderer_.Bind( &tap_camera_ );
+}
+
+/**
+ * Unload resources
+ */
+void Engine::UnloadResources()
+{
+ renderer_.Unload();
+}
+
+/**
+ * Initialize an EGL context for the current display.
+ */
+int Engine::InitDisplay()
+{
+ if( !initialized_resources_ )
+ {
+ gl_context_->Init( app_->window );
+ LoadResources();
+ initialized_resources_ = true;
+ }
+ else
+ {
+ // initialize OpenGL ES and EGL
+ if( EGL_SUCCESS != gl_context_->Resume( app_->window ) )
+ {
+ UnloadResources();
+ LoadResources();
+ }
+ }
+
+ ShowUI();
+
+ // Initialize GL state.
+ glEnable( GL_CULL_FACE );
+ glEnable( GL_DEPTH_TEST );
+ glDepthFunc( GL_LEQUAL );
+
+ //Note that screen size might have been changed
+ glViewport( 0, 0, gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() );
+ renderer_.UpdateViewport();
+
+ tap_camera_.SetFlip( 1.f, -1.f, -1.f );
+ tap_camera_.SetPinchTransformFactor( 10.f, 10.f, 8.f );
+
+ return 0;
+}
+
+/**
+ * Just the current frame in the display.
+ */
+void Engine::DrawFrame()
+{
+ float fps;
+ if( monitor_.Update( fps ) )
+ {
+ UpdateFPS( fps );
+ }
+ double dTime = monitor_.GetCurrentTime();
+ renderer_.Update( dTime );
+
+ // Just fill the screen with a color.
+ glClearColor( 0.5f, 0.5f, 0.5f, 1.f );
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ renderer_.Render();
+
+ // Swap
+ if( EGL_SUCCESS != gl_context_->Swap() )
+ {
+ UnloadResources();
+ LoadResources();
+ }
+}
+
+/**
+ * Tear down the EGL context currently associated with the display.
+ */
+void Engine::TermDisplay()
+{
+ gl_context_->Suspend();
+
+}
+
+void Engine::TrimMemory()
+{
+ LOGI( "Trimming memory" );
+ gl_context_->Invalidate();
+}
+/**
+ * Process the next input event.
+ */
+int32_t Engine::HandleInput( android_app* app,
+ AInputEvent* event )
+{
+ Engine* eng = (Engine*) app->userData;
+ if( AInputEvent_getType( event ) == AINPUT_EVENT_TYPE_MOTION )
+ {
+ ndk_helper::GESTURE_STATE doubleTapState = eng->doubletap_detector_.Detect( event );
+ ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect( event );
+ ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect( event );
+
+ //Double tap detector has a priority over other detectors
+ if( doubleTapState == ndk_helper::GESTURE_STATE_ACTION )
+ {
+ //Detect double tap
+ eng->tap_camera_.Reset( true );
+ }
+ else
+ {
+ //Handle drag state
+ if( dragState & ndk_helper::GESTURE_STATE_START )
+ {
+ //Otherwise, start dragging
+ ndk_helper::Vec2 v;
+ eng->drag_detector_.GetPointer( v );
+ eng->TransformPosition( v );
+ eng->tap_camera_.BeginDrag( v );
+ }
+ else if( dragState & ndk_helper::GESTURE_STATE_MOVE )
+ {
+ ndk_helper::Vec2 v;
+ eng->drag_detector_.GetPointer( v );
+ eng->TransformPosition( v );
+ eng->tap_camera_.Drag( v );
+ }
+ else if( dragState & ndk_helper::GESTURE_STATE_END )
+ {
+ eng->tap_camera_.EndDrag();
+ }
+
+ //Handle pinch state
+ if( pinchState & ndk_helper::GESTURE_STATE_START )
+ {
+ //Start new pinch
+ ndk_helper::Vec2 v1;
+ ndk_helper::Vec2 v2;
+ eng->pinch_detector_.GetPointers( v1, v2 );
+ eng->TransformPosition( v1 );
+ eng->TransformPosition( v2 );
+ eng->tap_camera_.BeginPinch( v1, v2 );
+ }
+ else if( pinchState & ndk_helper::GESTURE_STATE_MOVE )
+ {
+ //Multi touch
+ //Start new pinch
+ ndk_helper::Vec2 v1;
+ ndk_helper::Vec2 v2;
+ eng->pinch_detector_.GetPointers( v1, v2 );
+ eng->TransformPosition( v1 );
+ eng->TransformPosition( v2 );
+ eng->tap_camera_.Pinch( v1, v2 );
+ }
+ }
+ return 1;
+ }
+ return 0;
+}
+
+/**
+ * Process the next main command.
+ */
+void Engine::HandleCmd( struct android_app* app,
+ int32_t cmd )
+{
+ Engine* eng = (Engine*) app->userData;
+ switch( cmd )
+ {
+ case APP_CMD_SAVE_STATE:
+ break;
+ case APP_CMD_INIT_WINDOW:
+ // The window is being shown, get it ready.
+ if( app->window != NULL )
+ {
+ eng->InitDisplay();
+ eng->DrawFrame();
+ }
+ break;
+ case APP_CMD_TERM_WINDOW:
+ // The window is being hidden or closed, clean it up.
+ eng->TermDisplay();
+ eng->has_focus_ = false;
+ break;
+ case APP_CMD_STOP:
+ break;
+ case APP_CMD_GAINED_FOCUS:
+ eng->ResumeSensors();
+ //Start animation
+ eng->has_focus_ = true;
+ break;
+ case APP_CMD_LOST_FOCUS:
+ eng->SuspendSensors();
+ // Also stop animating.
+ eng->has_focus_ = false;
+ eng->DrawFrame();
+ break;
+ case APP_CMD_LOW_MEMORY:
+ //Free up GL resources
+ eng->TrimMemory();
+ break;
+ }
+}
+
+//-------------------------------------------------------------------------
+//Sensor handlers
+//-------------------------------------------------------------------------
+void Engine::InitSensors()
+{
+ sensor_manager_ = ASensorManager_getInstance();
+ accelerometer_sensor_ = ASensorManager_getDefaultSensor( sensor_manager_,
+ ASENSOR_TYPE_ACCELEROMETER );
+ sensor_event_queue_ = ASensorManager_createEventQueue( sensor_manager_, app_->looper,
+ LOOPER_ID_USER, NULL, NULL );
+}
+
+void Engine::ProcessSensors( int32_t id )
+{
+ // If a sensor has data, process it now.
+ if( id == LOOPER_ID_USER )
+ {
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEvent event;
+ while( ASensorEventQueue_getEvents( sensor_event_queue_, &event, 1 ) > 0 )
+ {
+ }
+ }
+ }
+}
+
+void Engine::ResumeSensors()
+{
+ // When our app gains focus, we start monitoring the accelerometer.
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEventQueue_enableSensor( sensor_event_queue_, accelerometer_sensor_ );
+ // We'd like to get 60 events per second (in us).
+ ASensorEventQueue_setEventRate( sensor_event_queue_, accelerometer_sensor_,
+ (1000L / 60) * 1000 );
+ }
+}
+
+void Engine::SuspendSensors()
+{
+ // When our app loses focus, we stop monitoring the accelerometer.
+ // This is to avoid consuming battery while not being used.
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEventQueue_disableSensor( sensor_event_queue_, accelerometer_sensor_ );
+ }
+}
+
+//-------------------------------------------------------------------------
+//Misc
+//-------------------------------------------------------------------------
+void Engine::SetState( android_app* state )
+{
+ app_ = state;
+ doubletap_detector_.SetConfiguration( app_->config );
+ drag_detector_.SetConfiguration( app_->config );
+ pinch_detector_.SetConfiguration( app_->config );
+}
+
+bool Engine::IsReady()
+{
+ if( has_focus_ )
+ return true;
+
+ return false;
+}
+
+void Engine::TransformPosition( ndk_helper::Vec2& vec )
+{
+ vec = ndk_helper::Vec2( 2.0f, 2.0f ) * vec
+ / ndk_helper::Vec2( gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() )
+ - ndk_helper::Vec2( 1.f, 1.f );
+}
+
+void Engine::ShowUI()
+{
+ JNIEnv *jni;
+ app_->activity->vm->AttachCurrentThread( &jni, NULL );
+
+ //Default class retrieval
+ jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+ jmethodID methodID = jni->GetMethodID( clazz, "showUI", "()V" );
+ jni->CallVoidMethod( app_->activity->clazz, methodID );
+
+ app_->activity->vm->DetachCurrentThread();
+ return;
+}
+
+void Engine::UpdateFPS( float fps )
+{
+ JNIEnv *jni;
+ app_->activity->vm->AttachCurrentThread( &jni, NULL );
+
+ //Default class retrieval
+ jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+ jmethodID methodID = jni->GetMethodID( clazz, "updateFPS", "(F)V" );
+ jni->CallVoidMethod( app_->activity->clazz, methodID, fps );
+
+ app_->activity->vm->DetachCurrentThread();
+ return;
+}
+
+Engine g_engine;
+
+/**
+ * This is the main entry point of a native application that is using
+ * android_native_app_glue. It runs in its own thread, with its own
+ * event loop for receiving input events and doing other things.
+ */
+void android_main( android_app* state )
+{
+ app_dummy();
+
+ g_engine.SetState( state );
+
+ //Init helper functions
+ ndk_helper::JNIHelper::GetInstance()->Init( state->activity, HELPER_CLASS_NAME );
+
+ state->userData = &g_engine;
+ state->onAppCmd = Engine::HandleCmd;
+ state->onInputEvent = Engine::HandleInput;
+
+#ifdef USE_NDK_PROFILER
+ monstartup("libMoreTeapotsNativeActivity.so");
+#endif
+
+ // Prepare to monitor accelerometer
+ g_engine.InitSensors();
+
+ // loop waiting for stuff to do.
+ while( 1 )
+ {
+ // Read all pending events.
+ int id;
+ int events;
+ android_poll_source* source;
+
+ // If not animating, we will block forever waiting for events.
+ // If animating, we loop until all events are read, then continue
+ // to draw the next frame of animation.
+ while( (id = ALooper_pollAll( g_engine.IsReady() ? 0 : -1, NULL, &events, (void**) &source ))
+ >= 0 )
+ {
+ // Process this event.
+ if( source != NULL )
+ source->process( state, source );
+
+ g_engine.ProcessSensors( id );
+
+ // Check if we are exiting.
+ if( state->destroyRequested != 0 )
+ {
+ g_engine.TermDisplay();
+ return;
+ }
+ }
+
+ if( g_engine.IsReady() )
+ {
+ // Drawing is throttled to the screen update rate, so there
+ // is no need to do timing here.
+ g_engine.DrawFrame();
+ }
+ }
+}
+
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp
new file mode 100644
index 0000000..4adf4ed
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp
@@ -0,0 +1,555 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// MoreTeapotsRenderer.cpp
+// Render teapots
+//--------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include "MoreTeapotsRenderer.h"
+
+//--------------------------------------------------------------------------------
+// Teapot model data
+//--------------------------------------------------------------------------------
+#include "teapot.inl"
+
+//--------------------------------------------------------------------------------
+// Ctor
+//--------------------------------------------------------------------------------
+MoreTeapotsRenderer::MoreTeapotsRenderer() :
+ geometry_instancing_support_( false )
+{
+
+}
+
+//--------------------------------------------------------------------------------
+// Dtor
+//--------------------------------------------------------------------------------
+MoreTeapotsRenderer::~MoreTeapotsRenderer()
+{
+ Unload();
+}
+
+//--------------------------------------------------------------------------------
+// Init
+//--------------------------------------------------------------------------------
+void MoreTeapotsRenderer::Init( const int32_t numX,
+ const int32_t numY,
+ const int32_t numZ )
+{
+ if( ndk_helper::GLContext::GetInstance()->GetGLVersion() >= 3.0 )
+ {
+ geometry_instancing_support_ = true;
+ }
+ else if( ndk_helper::GLContext::GetInstance()->CheckExtension( "GL_NV_draw_instanced" )
+ && ndk_helper::GLContext::GetInstance()->CheckExtension(
+ "GL_NV_uniform_buffer_object" ) )
+ {
+ LOGI( "Supported via extension!" );
+ //_bGeometryInstancingSupport = true;
+ //_bARBSupport = true; //Need to patch shaders
+ //Currently this has been disabled
+ }
+
+ //Settings
+ glFrontFace( GL_CCW );
+
+ //Create Index buffer
+ num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);
+ glGenBuffers( 1, &ibo_ );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+ glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices, GL_STATIC_DRAW );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+
+ //Create VBO
+ num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;
+ int32_t iStride = sizeof(TEAPOT_VERTEX);
+ int32_t iIndex = 0;
+ TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];
+ for( int32_t i = 0; i < num_vertices_; ++i )
+ {
+ p[i].pos[0] = teapotPositions[iIndex];
+ p[i].pos[1] = teapotPositions[iIndex + 1];
+ p[i].pos[2] = teapotPositions[iIndex + 2];
+
+ p[i].normal[0] = teapotNormals[iIndex];
+ p[i].normal[1] = teapotNormals[iIndex + 1];
+ p[i].normal[2] = teapotNormals[iIndex + 2];
+ iIndex += 3;
+ }
+ glGenBuffers( 1, &vbo_ );
+ glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+ glBufferData( GL_ARRAY_BUFFER, iStride * num_vertices_, p, GL_STATIC_DRAW );
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
+ delete[] p;
+
+ //Init Projection matrices
+ teapot_x_ = numX;
+ teapot_y_ = numY;
+ teapot_z_ = numZ;
+ vec_mat_models_.reserve( teapot_x_ * teapot_y_ * teapot_z_ );
+
+ UpdateViewport();
+
+ const float total_width = 500.f;
+ float gap_x = total_width / (teapot_x_ - 1);
+ float gap_y = total_width / (teapot_y_ - 1);
+ float gap_z = total_width / (teapot_z_ - 1);
+ float offset_x = -total_width / 2.f;
+ float offset_y = -total_width / 2.f;
+ float offset_z = -total_width / 2.f;
+
+ for( int32_t iX = 0; iX < teapot_x_; ++iX )
+ for( int32_t iY = 0; iY < teapot_y_; ++iY )
+ for( int32_t iZ = 0; iZ < teapot_z_; ++iZ )
+ {
+ vec_mat_models_.push_back(
+ ndk_helper::Mat4::Translation( iX * gap_x + offset_x, iY * gap_y + offset_y,
+ iZ * gap_z + offset_z ) );
+ vec_colors_.push_back(
+ ndk_helper::Vec3( random() / float( RAND_MAX * 1.1 ),
+ random() / float( RAND_MAX * 1.1 ),
+ random() / float( RAND_MAX * 1.1 ) ) );
+
+ float fX = random() / float( RAND_MAX ) - 0.5f;
+ float fY = random() / float( RAND_MAX ) - 0.5f;
+ vec_rotations_.push_back( ndk_helper::Vec2( fX * 0.05f, fY * 0.05f ) );
+ vec_current_rotations_.push_back( ndk_helper::Vec2( fX * M_PI, fY * M_PI ) );
+ }
+
+ if( geometry_instancing_support_ )
+ {
+ //
+ //Create parameter dictionary for shader patch
+ std::map<std::string, std::string> param;
+ param[std::string( "%NUM_TEAPOT%" )] = ToString( teapot_x_ * teapot_y_ * teapot_z_ );
+ param[std::string( "%LOCATION_VERTEX%" )] = ToString( ATTRIB_VERTEX );
+ param[std::string( "%LOCATION_NORMAL%" )] = ToString( ATTRIB_NORMAL );
+ if( arb_support_ )
+ param[std::string( "%ARB%" )] = std::string( "ARB" );
+ else
+ param[std::string( "%ARB%" )] = std::string( "" );
+
+ //Load shader
+ bool b = LoadShadersES3( &shader_param_, "Shaders/VS_ShaderPlainES3.vsh",
+ "Shaders/ShaderPlainES3.fsh", param );
+ if( b )
+ {
+ //
+ //Create uniform buffer
+ //
+ GLuint bindingPoint = 1;
+ GLuint blockIndex;
+ blockIndex = glGetUniformBlockIndex( shader_param_.program_, "ParamBlock" );
+ glUniformBlockBinding( shader_param_.program_, blockIndex, bindingPoint );
+
+ //Retrieve array stride value
+ int32_t iNumIndices;
+ glGetActiveUniformBlockiv( shader_param_.program_, blockIndex,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &iNumIndices );
+ GLint i[iNumIndices];
+ GLint stride[iNumIndices];
+ glGetActiveUniformBlockiv( shader_param_.program_, blockIndex,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, i );
+ glGetActiveUniformsiv( shader_param_.program_, iNumIndices, (GLuint*) i,
+ GL_UNIFORM_ARRAY_STRIDE, stride );
+
+ ubo_matrix_stride_ = stride[0] / sizeof(float);
+ ubo_vector_stride_ = stride[2] / sizeof(float);
+
+ glGenBuffers( 1, &ubo_ );
+ glBindBuffer( GL_UNIFORM_BUFFER, ubo_ );
+ glBindBufferBase( GL_UNIFORM_BUFFER, bindingPoint, ubo_ );
+
+ //Store color value which wouldn't be updated every frame
+ int32_t iSize = teapot_x_ * teapot_y_ * teapot_z_
+ * (ubo_matrix_stride_ + ubo_matrix_stride_ + ubo_vector_stride_); //Mat4 + Mat4 + Vec3 + 1 stride
+ float* pBuffer = new float[iSize];
+ float* pColor = pBuffer + teapot_x_ * teapot_y_ * teapot_z_ * ubo_matrix_stride_ * 2;
+ for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
+ {
+ memcpy( pColor, &vec_colors_[i], 3 * sizeof(float) );
+ pColor += ubo_vector_stride_; //Assuming std140 layout which is 4 DWORD stride for vectors
+ }
+
+ glBufferData( GL_UNIFORM_BUFFER, iSize * sizeof(float), pBuffer, GL_DYNAMIC_DRAW );
+ delete[] pBuffer;
+ }
+ else
+ {
+ LOGI( "Shader compilation failed!! Falls back to ES2.0 pass" );
+ //This happens some devices.
+ geometry_instancing_support_ = false;
+ //Load shader for GLES2.0
+ LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
+ }
+ }
+ else
+ {
+ //Load shader for GLES2.0
+ LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
+ }
+}
+
+void MoreTeapotsRenderer::UpdateViewport()
+{
+ int32_t viewport[4];
+ glGetIntegerv( GL_VIEWPORT, viewport );
+ float fAspect = (float) viewport[2] / (float) viewport[3];
+
+ const float CAM_NEAR = 5.f;
+ const float CAM_FAR = 10000.f;
+ bool bRotate = false;
+ mat_projection_ = ndk_helper::Mat4::Perspective( fAspect, 1.f, CAM_NEAR, CAM_FAR );
+}
+
+//--------------------------------------------------------------------------------
+// Unload
+//--------------------------------------------------------------------------------
+void MoreTeapotsRenderer::Unload()
+{
+ if( vbo_ )
+ {
+ glDeleteBuffers( 1, &vbo_ );
+ vbo_ = 0;
+ }
+ if( ubo_ )
+ {
+ glDeleteBuffers( 1, &ubo_ );
+ ubo_ = 0;
+ }
+ if( ibo_ )
+ {
+ glDeleteBuffers( 1, &ibo_ );
+ ibo_ = 0;
+ }
+ if( shader_param_.program_ )
+ {
+ glDeleteProgram( shader_param_.program_ );
+ shader_param_.program_ = 0;
+ }
+}
+
+//--------------------------------------------------------------------------------
+// Update
+//--------------------------------------------------------------------------------
+void MoreTeapotsRenderer::Update( float fTime )
+{
+ const float CAM_X = 0.f;
+ const float CAM_Y = 0.f;
+ const float CAM_Z = 2000.f;
+
+ mat_view_ = ndk_helper::Mat4::LookAt( ndk_helper::Vec3( CAM_X, CAM_Y, CAM_Z ),
+ ndk_helper::Vec3( 0.f, 0.f, 0.f ), ndk_helper::Vec3( 0.f, 1.f, 0.f ) );
+
+ if( camera_ )
+ {
+ camera_->Update();
+ mat_view_ = camera_->GetTransformMatrix() * mat_view_ * camera_->GetRotationMatrix();
+ }
+}
+
+//--------------------------------------------------------------------------------
+// Render
+//--------------------------------------------------------------------------------
+void MoreTeapotsRenderer::Render()
+{
+ // Bind the VBO
+ glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+
+ int32_t iStride = sizeof(TEAPOT_VERTEX);
+ // Pass the vertex data
+ glVertexAttribPointer( ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride, BUFFER_OFFSET( 0 ) );
+ glEnableVertexAttribArray( ATTRIB_VERTEX );
+
+ glVertexAttribPointer( ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,
+ BUFFER_OFFSET( 3 * sizeof(GLfloat) ) );
+ glEnableVertexAttribArray( ATTRIB_NORMAL );
+
+ // Bind the IB
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+
+ glUseProgram( shader_param_.program_ );
+
+ TEAPOT_MATERIALS material = { { 1.0f, 1.0f, 1.0f, 10.f }, { 0.1f, 0.1f, 0.1f }, };
+
+ //Update uniforms
+ //
+ //using glUniform3fv here was troublesome..
+ //
+ glUniform4f( shader_param_.material_specular_, material.specular_color[0],
+ material.specular_color[1], material.specular_color[2], material.specular_color[3] );
+ glUniform3f( shader_param_.material_ambient_, material.ambient_color[0],
+ material.ambient_color[1], material.ambient_color[2] );
+
+ glUniform3f( shader_param_.light0_, 100.f, -200.f, -600.f );
+
+ if( geometry_instancing_support_ )
+ {
+ //
+ //Geometry instancing, new feature in GLES3.0
+ //
+
+ //Update UBO
+ glBindBuffer( GL_UNIFORM_BUFFER, ubo_ );
+ float* p = (float*) glMapBufferRange( GL_UNIFORM_BUFFER, 0,
+ teapot_x_ * teapot_y_ * teapot_z_ * (ubo_matrix_stride_ * 2) * sizeof(float),
+ GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT );
+ float* pMVPMat = p;
+ float* pMVMat = p + teapot_x_ * teapot_y_ * teapot_z_ * ubo_matrix_stride_;
+ for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
+ {
+ //Rotation
+ float fX, fY;
+ vec_current_rotations_[i] += vec_rotations_[i];
+ vec_current_rotations_[i].Value( fX, fY );
+ ndk_helper::Mat4 mat_rotation = ndk_helper::Mat4::RotationX( fX )
+ * ndk_helper::Mat4::RotationY( fY );
+
+ // Feed Projection and Model View matrices to the shaders
+ ndk_helper::Mat4 mat_v = mat_view_ * vec_mat_models_[i] * mat_rotation;
+ ndk_helper::Mat4 mat_vp = mat_projection_ * mat_v;
+
+ memcpy( pMVPMat, mat_vp.Ptr(), sizeof(mat_v) );
+ pMVPMat += ubo_matrix_stride_;
+
+ memcpy( pMVMat, mat_v.Ptr(), sizeof(mat_v) );
+ pMVMat += ubo_matrix_stride_;
+ }
+ glUnmapBuffer( GL_UNIFORM_BUFFER );
+
+ //Instanced rendering
+ glDrawElementsInstanced( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0),
+ teapot_x_ * teapot_y_ * teapot_z_ );
+
+ }
+ else
+ {
+ //Regular rendering pass
+ for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
+ {
+ //Set diffuse
+ float x, y, z;
+ vec_colors_[i].Value( x, y, z );
+ glUniform4f( shader_param_.material_diffuse_, x, y, z, 1.f );
+
+ //Rotation
+ vec_current_rotations_[i] += vec_rotations_[i];
+ vec_current_rotations_[i].Value( x, y );
+ ndk_helper::Mat4 mat_rotation = ndk_helper::Mat4::RotationX( x )
+ * ndk_helper::Mat4::RotationY( y );
+
+ // Feed Projection and Model View matrices to the shaders
+ ndk_helper::Mat4 mat_v = mat_view_ * vec_mat_models_[i] * mat_rotation;
+ ndk_helper::Mat4 mat_vp = mat_projection_ * mat_v;
+ glUniformMatrix4fv( shader_param_.matrix_projection_, 1, GL_FALSE, mat_vp.Ptr() );
+ glUniformMatrix4fv( shader_param_.matrix_view_, 1, GL_FALSE, mat_v.Ptr() );
+
+ glDrawElements( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0) );
+
+ }
+ }
+
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+}
+
+//--------------------------------------------------------------------------------
+// LoadShaders
+//--------------------------------------------------------------------------------
+bool MoreTeapotsRenderer::LoadShaders( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh )
+{
+ //
+ //Shader load for GLES2
+ //In GLES2.0, shader attribute locations need to be explicitly specified before linking
+ //
+ GLuint program;
+ GLuint vertShader, fragShader;
+ char *vertShaderPathname, *fragShaderPathname;
+
+ // Create shader program
+ program = glCreateProgram();
+ LOGI( "Created Shader %d", program );
+
+ // Create and compile vertex shader
+ if( !ndk_helper::shader::CompileShader( &vertShader, GL_VERTEX_SHADER, strVsh ) )
+ {
+ LOGI( "Failed to compile vertex shader" );
+ glDeleteProgram( program );
+ return false;
+ }
+
+ // Create and compile fragment shader
+ if( !ndk_helper::shader::CompileShader( &fragShader, GL_FRAGMENT_SHADER, strFsh ) )
+ {
+ LOGI( "Failed to compile fragment shader" );
+ glDeleteProgram( program );
+ return false;
+ }
+
+ // Attach vertex shader to program
+ glAttachShader( program, vertShader );
+
+ // Attach fragment shader to program
+ glAttachShader( program, fragShader );
+
+ // Bind attribute locations
+ // this needs to be done prior to linking
+ glBindAttribLocation( program, ATTRIB_VERTEX, "myVertex" );
+ glBindAttribLocation( program, ATTRIB_NORMAL, "myNormal" );
+
+ // Link program
+ if( !ndk_helper::shader::LinkProgram( program ) )
+ {
+ LOGI( "Failed to link program: %d", program );
+
+ if( vertShader )
+ {
+ glDeleteShader( vertShader );
+ vertShader = 0;
+ }
+ if( fragShader )
+ {
+ glDeleteShader( fragShader );
+ fragShader = 0;
+ }
+ if( program )
+ {
+ glDeleteProgram( program );
+ }
+ return false;
+ }
+
+ // Get uniform locations
+ params->matrix_projection_ = glGetUniformLocation( program, "uPMatrix" );
+ params->matrix_view_ = glGetUniformLocation( program, "uMVMatrix" );
+
+ params->light0_ = glGetUniformLocation( program, "vLight0" );
+ params->material_diffuse_ = glGetUniformLocation( program, "vMaterialDiffuse" );
+ params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+ params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
+
+ // Release vertex and fragment shaders
+ if( vertShader )
+ glDeleteShader( vertShader );
+ if( fragShader )
+ glDeleteShader( fragShader );
+
+ params->program_ = program;
+ return true;
+}
+
+bool MoreTeapotsRenderer::LoadShadersES3( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh,
+ std::map<std::string, std::string>&shaderParams )
+{
+ //
+ //Shader load for GLES3
+ //In GLES3.0, shader attribute index can be described in a shader code directly with layout() attribute
+ //
+ GLuint program;
+ GLuint vertShader, fragShader;
+ char *vertShaderPathname, *fragShaderPathname;
+
+ // Create shader program
+ program = glCreateProgram();
+ LOGI( "Created Shader %d", program );
+
+ // Create and compile vertex shader
+ if( !ndk_helper::shader::CompileShader( &vertShader, GL_VERTEX_SHADER, strVsh, shaderParams ) )
+ {
+ LOGI( "Failed to compile vertex shader" );
+ glDeleteProgram( program );
+ return false;
+ }
+
+ // Create and compile fragment shader
+ if( !ndk_helper::shader::CompileShader( &fragShader, GL_FRAGMENT_SHADER, strFsh,
+ shaderParams ) )
+ {
+ LOGI( "Failed to compile fragment shader" );
+ glDeleteProgram( program );
+ return false;
+ }
+
+ // Attach vertex shader to program
+ glAttachShader( program, vertShader );
+
+ // Attach fragment shader to program
+ glAttachShader( program, fragShader );
+
+ // Link program
+ if( !ndk_helper::shader::LinkProgram( program ) )
+ {
+ LOGI( "Failed to link program: %d", program );
+
+ if( vertShader )
+ {
+ glDeleteShader( vertShader );
+ vertShader = 0;
+ }
+ if( fragShader )
+ {
+ glDeleteShader( fragShader );
+ fragShader = 0;
+ }
+ if( program )
+ {
+ glDeleteProgram( program );
+ }
+
+ return false;
+ }
+
+ // Get uniform locations
+ params->light0_ = glGetUniformLocation( program, "vLight0" );
+ params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+ params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
+
+ // Release vertex and fragment shaders
+ if( vertShader )
+ glDeleteShader( vertShader );
+ if( fragShader )
+ glDeleteShader( fragShader );
+
+ params->program_ = program;
+ return true;
+}
+
+//--------------------------------------------------------------------------------
+// Bind
+//--------------------------------------------------------------------------------
+bool MoreTeapotsRenderer::Bind( ndk_helper::TapCamera* camera )
+{
+ camera_ = camera;
+ return true;
+}
+
+//--------------------------------------------------------------------------------
+// Helper functions
+//--------------------------------------------------------------------------------
+std::string MoreTeapotsRenderer::ToString( const int32_t i )
+{
+ char str[64];
+ snprintf( str, sizeof(str), "%d", i );
+ return std::string( str );
+}
+
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h
new file mode 100644
index 0000000..346d873
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// MoreTeapotsRenderer.h
+// Renderer for teapots
+//--------------------------------------------------------------------------------
+#ifndef _MoreTeapotsRenderer_H
+#define _MoreTeapotsRenderer_H
+
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include <jni.h>
+#include <errno.h>
+
+#include <vector>
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include <cpu-features.h>
+
+#define CLASS_NAME "android/app/NativeActivity"
+#define APPLICATION_CLASS_NAME "com/sample/moreteapotss/MoreTeapotsApplication"
+
+#include "NDKHelper.h"
+
+#define BUFFER_OFFSET(i) ((char *)NULL + (i))
+
+struct TEAPOT_VERTEX
+{
+ float pos[3];
+ float normal[3];
+};
+
+enum SHADER_ATTRIBUTES
+{
+ ATTRIB_VERTEX, ATTRIB_NORMAL, ATTRIB_COLOR, ATTRIB_UV
+};
+
+struct SHADER_PARAMS
+{
+ GLuint program_;
+ GLuint light0_;
+ GLuint material_diffuse_;
+ GLuint material_ambient_;
+ GLuint material_specular_;
+
+ GLuint matrix_projection_;
+ GLuint matrix_view_;
+};
+
+struct TEAPOT_MATERIALS
+{
+ float specular_color[4];
+ float ambient_color[3];
+};
+
+class MoreTeapotsRenderer
+{
+ int32_t num_indices_;
+ int32_t num_vertices_;
+ GLuint ibo_;
+ GLuint vbo_;
+ GLuint ubo_;
+
+ SHADER_PARAMS shader_param_;
+ bool LoadShaders( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh );
+ bool LoadShadersES3( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh,
+ std::map<std::string, std::string>&shaderParameters );
+
+ ndk_helper::Mat4 mat_projection_;
+ ndk_helper::Mat4 mat_view_;
+ std::vector<ndk_helper::Mat4> vec_mat_models_;
+ std::vector<ndk_helper::Vec3> vec_colors_;
+ std::vector<ndk_helper::Vec2> vec_rotations_;
+ std::vector<ndk_helper::Vec2> vec_current_rotations_;
+
+ ndk_helper::TapCamera* camera_;
+
+ int32_t teapot_x_;
+ int32_t teapot_y_;
+ int32_t teapot_z_;
+ int32_t ubo_matrix_stride_;
+ int32_t ubo_vector_stride_;
+ bool geometry_instancing_support_;
+ bool arb_support_;
+
+ std::string ToString( const int32_t i );
+public:
+ MoreTeapotsRenderer();
+ virtual ~MoreTeapotsRenderer();
+ void Init( const int32_t numX,
+ const int32_t numY,
+ const int32_t numZ );
+ void Render();
+ void Update( float dTime );
+ bool Bind( ndk_helper::TapCamera* camera );
+ void Unload();
+ void UpdateViewport();
+};
+
+#endif
+
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/teapot.inl b/ndk/platforms/android-18/samples/MoreTeapots/jni/teapot.inl
new file mode 100644
index 0000000..7f42b88
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/teapot.inl
@@ -0,0 +1,2057 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//
+// Teapot.inl
+// Derived from WebGL sample
+// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js
+//
+
+float teapotPositions[] = { 17.83489990234375, 0, 30.573999404907227, 16.452699661254883, -7.000179767608643, 30.573999404907227,
+ 16.223100662231445, -6.902520179748535, 31.51460075378418, 17.586000442504883, 0, 31.51460075378418,
+ 16.48940086364746, -7.015810012817383, 31.828100204467773, 17.87470054626465, 0, 31.828100204467773,
+ 17.031099319458008, -7.246280193328857, 31.51460075378418, 18.46190071105957, 0, 31.51460075378418,
+ 17.62779998779297, -7.500199794769287, 30.573999404907227, 19.108800888061523, 0, 30.573999404907227,
+ 12.662699699401855, -12.662699699401855, 30.573999404907227, 12.486100196838379, -12.486100196838379, 31.51460075378418,
+ 12.690999984741211, -12.690999984741211, 31.828100204467773, 13.10789966583252, -13.10789966583252, 31.51460075378418,
+ 13.56719970703125, -13.56719970703125, 30.573999404907227, 7.000179767608643, -16.452699661254883, 30.573999404907227,
+ 6.902520179748535, -16.223100662231445, 31.51460075378418, 7.015810012817383, -16.48940086364746, 31.828100204467773,
+ 7.246280193328857, -17.031099319458008, 31.51460075378418, 7.500199794769287, -17.62779998779297, 30.573999404907227,
+ 0, -17.83489990234375, 30.573999404907227, 0, -17.586000442504883, 31.51460075378418,
+ 0, -17.87470054626465, 31.828100204467773, 0, -18.46190071105957, 31.51460075378418,
+ 0, -19.108800888061523, 30.573999404907227, 0, -17.83489990234375, 30.573999404907227,
+ -7.483870029449463, -16.452699661254883, 30.573999404907227, -7.106579780578613, -16.223100662231445, 31.51460075378418,
+ 0, -17.586000442504883, 31.51460075378418, -7.07627010345459, -16.48940086364746, 31.828100204467773,
+ 0, -17.87470054626465, 31.828100204467773, -7.25383996963501, -17.031099319458008, 31.51460075378418,
+ 0, -18.46190071105957, 31.51460075378418, -7.500199794769287, -17.62779998779297, 30.573999404907227,
+ 0, -19.108800888061523, 30.573999404907227, -13.092700004577637, -12.662699699401855, 30.573999404907227,
+ -12.667499542236328, -12.486100196838379, 31.51460075378418, -12.744799613952637, -12.690999984741211, 31.828100204467773,
+ -13.11460018157959, -13.10789966583252, 31.51460075378418, -13.56719970703125, -13.56719970703125, 30.573999404907227,
+ -16.61389923095703, -7.000179767608643, 30.573999404907227, -16.291099548339844, -6.902520179748535, 31.51460075378418,
+ -16.50950050354004, -7.015810012817383, 31.828100204467773, -17.033599853515625, -7.246280193328857, 31.51460075378418,
+ -17.62779998779297, -7.500199794769287, 30.573999404907227, -17.83489990234375, 0, 30.573999404907227,
+ -17.586000442504883, 0, 31.51460075378418, -17.87470054626465, 0, 31.828100204467773,
+ -18.46190071105957, 0, 31.51460075378418, -19.108800888061523, 0, 30.573999404907227,
+ -17.83489990234375, 0, 30.573999404907227, -16.452699661254883, 7.000179767608643, 30.573999404907227,
+ -16.223100662231445, 6.902520179748535, 31.51460075378418, -17.586000442504883, 0, 31.51460075378418,
+ -16.48940086364746, 7.015810012817383, 31.828100204467773, -17.87470054626465, 0, 31.828100204467773,
+ -17.031099319458008, 7.246280193328857, 31.51460075378418, -18.46190071105957, 0, 31.51460075378418,
+ -17.62779998779297, 7.500199794769287, 30.573999404907227, -19.108800888061523, 0, 30.573999404907227,
+ -12.662699699401855, 12.662699699401855, 30.573999404907227, -12.486100196838379, 12.486100196838379, 31.51460075378418,
+ -12.690999984741211, 12.690999984741211, 31.828100204467773, -13.10789966583252, 13.10789966583252, 31.51460075378418,
+ -13.56719970703125, 13.56719970703125, 30.573999404907227, -7.000179767608643, 16.452699661254883, 30.573999404907227,
+ -6.902520179748535, 16.223100662231445, 31.51460075378418, -7.015810012817383, 16.48940086364746, 31.828100204467773,
+ -7.246280193328857, 17.031099319458008, 31.51460075378418, -7.500199794769287, 17.62779998779297, 30.573999404907227,
+ 0, 17.83489990234375, 30.573999404907227, 0, 17.586000442504883, 31.51460075378418,
+ 0, 17.87470054626465, 31.828100204467773, 0, 18.46190071105957, 31.51460075378418,
+ 0, 19.108800888061523, 30.573999404907227, 0, 17.83489990234375, 30.573999404907227,
+ 7.000179767608643, 16.452699661254883, 30.573999404907227, 6.902520179748535, 16.223100662231445, 31.51460075378418,
+ 0, 17.586000442504883, 31.51460075378418, 7.015810012817383, 16.48940086364746, 31.828100204467773,
+ 0, 17.87470054626465, 31.828100204467773, 7.246280193328857, 17.031099319458008, 31.51460075378418,
+ 0, 18.46190071105957, 31.51460075378418, 7.500199794769287, 17.62779998779297, 30.573999404907227,
+ 0, 19.108800888061523, 30.573999404907227, 12.662699699401855, 12.662699699401855, 30.573999404907227,
+ 12.486100196838379, 12.486100196838379, 31.51460075378418, 12.690999984741211, 12.690999984741211, 31.828100204467773,
+ 13.10789966583252, 13.10789966583252, 31.51460075378418, 13.56719970703125, 13.56719970703125, 30.573999404907227,
+ 16.452699661254883, 7.000179767608643, 30.573999404907227, 16.223100662231445, 6.902520179748535, 31.51460075378418,
+ 16.48940086364746, 7.015810012817383, 31.828100204467773, 17.031099319458008, 7.246280193328857, 31.51460075378418,
+ 17.62779998779297, 7.500199794769287, 30.573999404907227, 17.83489990234375, 0, 30.573999404907227,
+ 17.586000442504883, 0, 31.51460075378418, 17.87470054626465, 0, 31.828100204467773,
+ 18.46190071105957, 0, 31.51460075378418, 19.108800888061523, 0, 30.573999404907227,
+ 19.108800888061523, 0, 30.573999404907227, 17.62779998779297, -7.500199794769287, 30.573999404907227,
+ 19.785400390625, -8.418190002441406, 25.572900772094727, 21.447599411010742, 0, 25.572900772094727,
+ 21.667600631713867, -9.218990325927734, 20.661399841308594, 23.487899780273438, 0, 20.661399841308594,
+ 22.99880027770996, -9.785409927368164, 15.928999900817871, 24.930999755859375, 0, 15.928999900817871,
+ 23.503799438476562, -10.000300407409668, 11.465299606323242, 25.4783992767334, 0, 11.465299606323242,
+ 13.56719970703125, -13.56719970703125, 30.573999404907227, 15.227800369262695, -15.227800369262695, 25.572900772094727,
+ 16.67639923095703, -16.67639923095703, 20.661399841308594, 17.701000213623047, -17.701000213623047, 15.928999900817871,
+ 18.089599609375, -18.089599609375, 11.465299606323242, 7.500199794769287, -17.62779998779297, 30.573999404907227,
+ 8.418190002441406, -19.785400390625, 25.572900772094727, 9.218990325927734, -21.667600631713867, 20.661399841308594,
+ 9.785409927368164, -22.99880027770996, 15.928999900817871, 10.000300407409668, -23.503799438476562, 11.465299606323242,
+ 0, -19.108800888061523, 30.573999404907227, 0, -21.447599411010742, 25.572900772094727,
+ 0, -23.487899780273438, 20.661399841308594, 0, -24.930999755859375, 15.928999900817871,
+ 0, -25.4783992767334, 11.465299606323242, 0, -19.108800888061523, 30.573999404907227,
+ -7.500199794769287, -17.62779998779297, 30.573999404907227, -8.418190002441406, -19.785400390625, 25.572900772094727,
+ 0, -21.447599411010742, 25.572900772094727, -9.218990325927734, -21.667600631713867, 20.661399841308594,
+ 0, -23.487899780273438, 20.661399841308594, -9.785409927368164, -22.99880027770996, 15.928999900817871,
+ 0, -24.930999755859375, 15.928999900817871, -10.000300407409668, -23.503799438476562, 11.465299606323242,
+ 0, -25.4783992767334, 11.465299606323242, -13.56719970703125, -13.56719970703125, 30.573999404907227,
+ -15.227800369262695, -15.227800369262695, 25.572900772094727, -16.67639923095703, -16.67639923095703, 20.661399841308594,
+ -17.701000213623047, -17.701000213623047, 15.928999900817871, -18.089599609375, -18.089599609375, 11.465299606323242,
+ -17.62779998779297, -7.500199794769287, 30.573999404907227, -19.785400390625, -8.418190002441406, 25.572900772094727,
+ -21.667600631713867, -9.218990325927734, 20.661399841308594, -22.99880027770996, -9.785409927368164, 15.928999900817871,
+ -23.503799438476562, -10.000300407409668, 11.465299606323242, -19.108800888061523, 0, 30.573999404907227,
+ -21.447599411010742, 0, 25.572900772094727, -23.487899780273438, 0, 20.661399841308594,
+ -24.930999755859375, 0, 15.928999900817871, -25.4783992767334, 0, 11.465299606323242,
+ -19.108800888061523, 0, 30.573999404907227, -17.62779998779297, 7.500199794769287, 30.573999404907227,
+ -19.785400390625, 8.418190002441406, 25.572900772094727, -21.447599411010742, 0, 25.572900772094727,
+ -21.667600631713867, 9.218990325927734, 20.661399841308594, -23.487899780273438, 0, 20.661399841308594,
+ -22.99880027770996, 9.785409927368164, 15.928999900817871, -24.930999755859375, 0, 15.928999900817871,
+ -23.503799438476562, 10.000300407409668, 11.465299606323242, -25.4783992767334, 0, 11.465299606323242,
+ -13.56719970703125, 13.56719970703125, 30.573999404907227, -15.227800369262695, 15.227800369262695, 25.572900772094727,
+ -16.67639923095703, 16.67639923095703, 20.661399841308594, -17.701000213623047, 17.701000213623047, 15.928999900817871,
+ -18.089599609375, 18.089599609375, 11.465299606323242, -7.500199794769287, 17.62779998779297, 30.573999404907227,
+ -8.418190002441406, 19.785400390625, 25.572900772094727, -9.218990325927734, 21.667600631713867, 20.661399841308594,
+ -9.785409927368164, 22.99880027770996, 15.928999900817871, -10.000300407409668, 23.503799438476562, 11.465299606323242,
+ 0, 19.108800888061523, 30.573999404907227, 0, 21.447599411010742, 25.572900772094727,
+ 0, 23.487899780273438, 20.661399841308594, 0, 24.930999755859375, 15.928999900817871,
+ 0, 25.4783992767334, 11.465299606323242, 0, 19.108800888061523, 30.573999404907227,
+ 7.500199794769287, 17.62779998779297, 30.573999404907227, 8.418190002441406, 19.785400390625, 25.572900772094727,
+ 0, 21.447599411010742, 25.572900772094727, 9.218990325927734, 21.667600631713867, 20.661399841308594,
+ 0, 23.487899780273438, 20.661399841308594, 9.785409927368164, 22.99880027770996, 15.928999900817871,
+ 0, 24.930999755859375, 15.928999900817871, 10.000300407409668, 23.503799438476562, 11.465299606323242,
+ 0, 25.4783992767334, 11.465299606323242, 13.56719970703125, 13.56719970703125, 30.573999404907227,
+ 15.227800369262695, 15.227800369262695, 25.572900772094727, 16.67639923095703, 16.67639923095703, 20.661399841308594,
+ 17.701000213623047, 17.701000213623047, 15.928999900817871, 18.089599609375, 18.089599609375, 11.465299606323242,
+ 17.62779998779297, 7.500199794769287, 30.573999404907227, 19.785400390625, 8.418190002441406, 25.572900772094727,
+ 21.667600631713867, 9.218990325927734, 20.661399841308594, 22.99880027770996, 9.785409927368164, 15.928999900817871,
+ 23.503799438476562, 10.000300407409668, 11.465299606323242, 19.108800888061523, 0, 30.573999404907227,
+ 21.447599411010742, 0, 25.572900772094727, 23.487899780273438, 0, 20.661399841308594,
+ 24.930999755859375, 0, 15.928999900817871, 25.4783992767334, 0, 11.465299606323242,
+ 25.4783992767334, 0, 11.465299606323242, 23.503799438476562, -10.000300407409668, 11.465299606323242,
+ 22.5856990814209, -9.609620094299316, 7.688300132751465, 24.48310089111328, 0, 7.688300132751465,
+ 20.565799713134766, -8.750229835510254, 4.89661979675293, 22.29360008239746, 0, 4.89661979675293,
+ 18.54599952697754, -7.890830039978027, 3.0006699562072754, 20.104000091552734, 0, 3.0006699562072754,
+ 17.62779998779297, -7.500199794769287, 1.9108799695968628, 19.108800888061523, 0, 1.9108799695968628,
+ 18.089599609375, -18.089599609375, 11.465299606323242, 17.382999420166016, -17.382999420166016, 7.688300132751465,
+ 15.828399658203125, -15.828399658203125, 4.89661979675293, 14.273900032043457, -14.273900032043457, 3.0006699562072754,
+ 13.56719970703125, -13.56719970703125, 1.9108799695968628, 10.000300407409668, -23.503799438476562, 11.465299606323242,
+ 9.609620094299316, -22.5856990814209, 7.688300132751465, 8.750229835510254, -20.565799713134766, 4.89661979675293,
+ 7.890830039978027, -18.54599952697754, 3.0006699562072754, 7.500199794769287, -17.62779998779297, 1.9108799695968628,
+ 0, -25.4783992767334, 11.465299606323242, 0, -24.48310089111328, 7.688300132751465,
+ 0, -22.29360008239746, 4.89661979675293, 0, -20.104000091552734, 3.0006699562072754,
+ 0, -19.108800888061523, 1.9108799695968628, 0, -25.4783992767334, 11.465299606323242,
+ -10.000300407409668, -23.503799438476562, 11.465299606323242, -9.609620094299316, -22.5856990814209, 7.688300132751465,
+ 0, -24.48310089111328, 7.688300132751465, -8.750229835510254, -20.565799713134766, 4.89661979675293,
+ 0, -22.29360008239746, 4.89661979675293, -7.890830039978027, -18.54599952697754, 3.0006699562072754,
+ 0, -20.104000091552734, 3.0006699562072754, -7.500199794769287, -17.62779998779297, 1.9108799695968628,
+ 0, -19.108800888061523, 1.9108799695968628, -18.089599609375, -18.089599609375, 11.465299606323242,
+ -17.382999420166016, -17.382999420166016, 7.688300132751465, -15.828399658203125, -15.828399658203125, 4.89661979675293,
+ -14.273900032043457, -14.273900032043457, 3.0006699562072754, -13.56719970703125, -13.56719970703125, 1.9108799695968628,
+ -23.503799438476562, -10.000300407409668, 11.465299606323242, -22.5856990814209, -9.609620094299316, 7.688300132751465,
+ -20.565799713134766, -8.750229835510254, 4.89661979675293, -18.54599952697754, -7.890830039978027, 3.0006699562072754,
+ -17.62779998779297, -7.500199794769287, 1.9108799695968628, -25.4783992767334, 0, 11.465299606323242,
+ -24.48310089111328, 0, 7.688300132751465, -22.29360008239746, 0, 4.89661979675293,
+ -20.104000091552734, 0, 3.0006699562072754, -19.108800888061523, 0, 1.9108799695968628,
+ -25.4783992767334, 0, 11.465299606323242, -23.503799438476562, 10.000300407409668, 11.465299606323242,
+ -22.5856990814209, 9.609620094299316, 7.688300132751465, -24.48310089111328, 0, 7.688300132751465,
+ -20.565799713134766, 8.750229835510254, 4.89661979675293, -22.29360008239746, 0, 4.89661979675293,
+ -18.54599952697754, 7.890830039978027, 3.0006699562072754, -20.104000091552734, 0, 3.0006699562072754,
+ -17.62779998779297, 7.500199794769287, 1.9108799695968628, -19.108800888061523, 0, 1.9108799695968628,
+ -18.089599609375, 18.089599609375, 11.465299606323242, -17.382999420166016, 17.382999420166016, 7.688300132751465,
+ -15.828399658203125, 15.828399658203125, 4.89661979675293, -14.273900032043457, 14.273900032043457, 3.0006699562072754,
+ -13.56719970703125, 13.56719970703125, 1.9108799695968628, -10.000300407409668, 23.503799438476562, 11.465299606323242,
+ -9.609620094299316, 22.5856990814209, 7.688300132751465, -8.750229835510254, 20.565799713134766, 4.89661979675293,
+ -7.890830039978027, 18.54599952697754, 3.0006699562072754, -7.500199794769287, 17.62779998779297, 1.9108799695968628,
+ 0, 25.4783992767334, 11.465299606323242, 0, 24.48310089111328, 7.688300132751465,
+ 0, 22.29360008239746, 4.89661979675293, 0, 20.104000091552734, 3.0006699562072754,
+ 0, 19.108800888061523, 1.9108799695968628, 0, 25.4783992767334, 11.465299606323242,
+ 10.000300407409668, 23.503799438476562, 11.465299606323242, 9.609620094299316, 22.5856990814209, 7.688300132751465,
+ 0, 24.48310089111328, 7.688300132751465, 8.750229835510254, 20.565799713134766, 4.89661979675293,
+ 0, 22.29360008239746, 4.89661979675293, 7.890830039978027, 18.54599952697754, 3.0006699562072754,
+ 0, 20.104000091552734, 3.0006699562072754, 7.500199794769287, 17.62779998779297, 1.9108799695968628,
+ 0, 19.108800888061523, 1.9108799695968628, 18.089599609375, 18.089599609375, 11.465299606323242,
+ 17.382999420166016, 17.382999420166016, 7.688300132751465, 15.828399658203125, 15.828399658203125, 4.89661979675293,
+ 14.273900032043457, 14.273900032043457, 3.0006699562072754, 13.56719970703125, 13.56719970703125, 1.9108799695968628,
+ 23.503799438476562, 10.000300407409668, 11.465299606323242, 22.5856990814209, 9.609620094299316, 7.688300132751465,
+ 20.565799713134766, 8.750229835510254, 4.89661979675293, 18.54599952697754, 7.890830039978027, 3.0006699562072754,
+ 17.62779998779297, 7.500199794769287, 1.9108799695968628, 25.4783992767334, 0, 11.465299606323242,
+ 24.48310089111328, 0, 7.688300132751465, 22.29360008239746, 0, 4.89661979675293,
+ 20.104000091552734, 0, 3.0006699562072754, 19.108800888061523, 0, 1.9108799695968628,
+ 19.108800888061523, 0, 1.9108799695968628, 17.62779998779297, -7.500199794769287, 1.9108799695968628,
+ 17.228500366210938, -7.330269813537598, 1.2092299461364746, 18.675800323486328, 0, 1.2092299461364746,
+ 15.093799591064453, -6.422039985656738, 0.5971490144729614, 16.361900329589844, 0, 0.5971490144729614,
+ 9.819259643554688, -4.177840232849121, 0.16421599686145782, 10.644200325012207, 0, 0.16421599686145782,
+ 0, 0, 0, 0, 0, 0,
+ 13.56719970703125, -13.56719970703125, 1.9108799695968628, 13.25979995727539, -13.25979995727539, 1.2092299461364746,
+ 11.616900444030762, -11.616900444030762, 0.5971490144729614, 7.557370185852051, -7.557370185852051, 0.16421599686145782,
+ 0, 0, 0, 7.500199794769287, -17.62779998779297, 1.9108799695968628,
+ 7.330269813537598, -17.228500366210938, 1.2092299461364746, 6.422039985656738, -15.093799591064453, 0.5971490144729614,
+ 4.177840232849121, -9.819259643554688, 0.16421599686145782, 0, 0, 0,
+ 0, -19.108800888061523, 1.9108799695968628, 0, -18.675800323486328, 1.2092299461364746,
+ 0, -16.361900329589844, 0.5971490144729614, 0, -10.644200325012207, 0.16421599686145782,
+ 0, 0, 0, 0, -19.108800888061523, 1.9108799695968628,
+ -7.500199794769287, -17.62779998779297, 1.9108799695968628, -7.330269813537598, -17.228500366210938, 1.2092299461364746,
+ 0, -18.675800323486328, 1.2092299461364746, -6.422039985656738, -15.093799591064453, 0.5971490144729614,
+ 0, -16.361900329589844, 0.5971490144729614, -4.177840232849121, -9.819259643554688, 0.16421599686145782,
+ 0, -10.644200325012207, 0.16421599686145782, 0, 0, 0,
+ 0, 0, 0, -13.56719970703125, -13.56719970703125, 1.9108799695968628,
+ -13.25979995727539, -13.25979995727539, 1.2092299461364746, -11.616900444030762, -11.616900444030762, 0.5971490144729614,
+ -7.557370185852051, -7.557370185852051, 0.16421599686145782, 0, 0, 0,
+ -17.62779998779297, -7.500199794769287, 1.9108799695968628, -17.228500366210938, -7.330269813537598, 1.2092299461364746,
+ -15.093799591064453, -6.422039985656738, 0.5971490144729614, -9.819259643554688, -4.177840232849121, 0.16421599686145782,
+ 0, 0, 0, -19.108800888061523, 0, 1.9108799695968628,
+ -18.675800323486328, 0, 1.2092299461364746, -16.361900329589844, 0, 0.5971490144729614,
+ -10.644200325012207, 0, 0.16421599686145782, 0, 0, 0,
+ -19.108800888061523, 0, 1.9108799695968628, -17.62779998779297, 7.500199794769287, 1.9108799695968628,
+ -17.228500366210938, 7.330269813537598, 1.2092299461364746, -18.675800323486328, 0, 1.2092299461364746,
+ -15.093799591064453, 6.422039985656738, 0.5971490144729614, -16.361900329589844, 0, 0.5971490144729614,
+ -9.819259643554688, 4.177840232849121, 0.16421599686145782, -10.644200325012207, 0, 0.16421599686145782,
+ 0, 0, 0, 0, 0, 0,
+ -13.56719970703125, 13.56719970703125, 1.9108799695968628, -13.25979995727539, 13.25979995727539, 1.2092299461364746,
+ -11.616900444030762, 11.616900444030762, 0.5971490144729614, -7.557370185852051, 7.557370185852051, 0.16421599686145782,
+ 0, 0, 0, -7.500199794769287, 17.62779998779297, 1.9108799695968628,
+ -7.330269813537598, 17.228500366210938, 1.2092299461364746, -6.422039985656738, 15.093799591064453, 0.5971490144729614,
+ -4.177840232849121, 9.819259643554688, 0.16421599686145782, 0, 0, 0,
+ 0, 19.108800888061523, 1.9108799695968628, 0, 18.675800323486328, 1.2092299461364746,
+ 0, 16.361900329589844, 0.5971490144729614, 0, 10.644200325012207, 0.16421599686145782,
+ 0, 0, 0, 0, 19.108800888061523, 1.9108799695968628,
+ 7.500199794769287, 17.62779998779297, 1.9108799695968628, 7.330269813537598, 17.228500366210938, 1.2092299461364746,
+ 0, 18.675800323486328, 1.2092299461364746, 6.422039985656738, 15.093799591064453, 0.5971490144729614,
+ 0, 16.361900329589844, 0.5971490144729614, 4.177840232849121, 9.819259643554688, 0.16421599686145782,
+ 0, 10.644200325012207, 0.16421599686145782, 0, 0, 0,
+ 0, 0, 0, 13.56719970703125, 13.56719970703125, 1.9108799695968628,
+ 13.25979995727539, 13.25979995727539, 1.2092299461364746, 11.616900444030762, 11.616900444030762, 0.5971490144729614,
+ 7.557370185852051, 7.557370185852051, 0.16421599686145782, 0, 0, 0,
+ 17.62779998779297, 7.500199794769287, 1.9108799695968628, 17.228500366210938, 7.330269813537598, 1.2092299461364746,
+ 15.093799591064453, 6.422039985656738, 0.5971490144729614, 9.819259643554688, 4.177840232849121, 0.16421599686145782,
+ 0, 0, 0, 19.108800888061523, 0, 1.9108799695968628,
+ 18.675800323486328, 0, 1.2092299461364746, 16.361900329589844, 0, 0.5971490144729614,
+ 10.644200325012207, 0, 0.16421599686145782, 0, 0, 0,
+ -20.382699966430664, 0, 25.796899795532227, -20.1835994720459, -2.149739980697632, 26.244699478149414,
+ -26.511600494384766, -2.149739980697632, 26.192899703979492, -26.334299087524414, 0, 25.752099990844727,
+ -31.156299591064453, -2.149739980697632, 25.830400466918945, -30.733299255371094, 0, 25.438600540161133,
+ -34.016998291015625, -2.149739980697632, 24.846500396728516, -33.46030044555664, 0, 24.587600708007812,
+ -34.99290084838867, -2.149739980697632, 22.930500030517578, -34.39580154418945, 0, 22.930500030517578,
+ -19.74570083618164, -2.8663198947906494, 27.229999542236328, -26.901599884033203, -2.8663198947906494, 27.162799835205078,
+ -32.08679962158203, -2.8663198947906494, 26.69260025024414, -35.241798400878906, -2.8663198947906494, 25.416200637817383,
+ -36.30670166015625, -2.8663198947906494, 22.930500030517578, -19.30780029296875, -2.149739980697632, 28.215299606323242,
+ -27.29159927368164, -2.149739980697632, 28.132699966430664, -33.017398834228516, -2.149739980697632, 27.55470085144043,
+ -36.46649932861328, -2.149739980697632, 25.98579978942871, -37.620399475097656, -2.149739980697632, 22.930500030517578,
+ -19.108800888061523, 0, 28.66320037841797, -27.468900680541992, 0, 28.57360076904297,
+ -33.440399169921875, 0, 27.94659996032715, -37.02330017089844, 0, 26.244699478149414,
+ -38.21760177612305, 0, 22.930500030517578, -19.108800888061523, 0, 28.66320037841797,
+ -19.30780029296875, 2.149739980697632, 28.215299606323242, -27.29159927368164, 2.149739980697632, 28.132699966430664,
+ -27.468900680541992, 0, 28.57360076904297, -33.017398834228516, 2.149739980697632, 27.55470085144043,
+ -33.440399169921875, 0, 27.94659996032715, -36.46649932861328, 2.149739980697632, 25.98579978942871,
+ -37.02330017089844, 0, 26.244699478149414, -37.620399475097656, 2.149739980697632, 22.930500030517578,
+ -38.21760177612305, 0, 22.930500030517578, -19.74570083618164, 2.8663198947906494, 27.229999542236328,
+ -26.901599884033203, 2.8663198947906494, 27.162799835205078, -32.08679962158203, 2.8663198947906494, 26.69260025024414,
+ -35.241798400878906, 2.8663198947906494, 25.416200637817383, -36.30670166015625, 2.8663198947906494, 22.930500030517578,
+ -20.1835994720459, 2.149739980697632, 26.244699478149414, -26.511600494384766, 2.149739980697632, 26.192899703979492,
+ -31.156299591064453, 2.149739980697632, 25.830400466918945, -34.016998291015625, 2.149739980697632, 24.846500396728516,
+ -34.99290084838867, 2.149739980697632, 22.930500030517578, -20.382699966430664, 0, 25.796899795532227,
+ -26.334299087524414, 0, 25.752099990844727, -30.733299255371094, 0, 25.438600540161133,
+ -33.46030044555664, 0, 24.587600708007812, -34.39580154418945, 0, 22.930500030517578,
+ -34.39580154418945, 0, 22.930500030517578, -34.99290084838867, -2.149739980697632, 22.930500030517578,
+ -34.44089889526367, -2.149739980697632, 20.082199096679688, -33.89820098876953, 0, 20.33289909362793,
+ -32.711299896240234, -2.149739980697632, 16.81529998779297, -32.32569885253906, 0, 17.197900772094727,
+ -29.69420051574707, -2.149739980697632, 13.590499877929688, -29.558900833129883, 0, 14.062899589538574,
+ -25.279300689697266, -2.149739980697632, 10.8681001663208, -25.4783992767334, 0, 11.465299606323242,
+ -36.30670166015625, -2.8663198947906494, 22.930500030517578, -35.6348991394043, -2.8663198947906494, 19.530500411987305,
+ -33.55979919433594, -2.8663198947906494, 15.973699569702148, -29.99180030822754, -2.8663198947906494, 12.551300048828125,
+ -24.841400146484375, -2.8663198947906494, 9.554389953613281, -37.620399475097656, -2.149739980697632, 22.930500030517578,
+ -36.82889938354492, -2.149739980697632, 18.97879981994629, -34.408199310302734, -2.149739980697632, 15.132100105285645,
+ -30.289499282836914, -2.149739980697632, 11.512200355529785, -24.403499603271484, -2.149739980697632, 8.240659713745117,
+ -38.21760177612305, 0, 22.930500030517578, -37.37160110473633, 0, 18.728099822998047,
+ -34.79389953613281, 0, 14.749600410461426, -30.424800872802734, 0, 11.039799690246582,
+ -24.204500198364258, 0, 7.643509864807129, -38.21760177612305, 0, 22.930500030517578,
+ -37.620399475097656, 2.149739980697632, 22.930500030517578, -36.82889938354492, 2.149739980697632, 18.97879981994629,
+ -37.37160110473633, 0, 18.728099822998047, -34.408199310302734, 2.149739980697632, 15.132100105285645,
+ -34.79389953613281, 0, 14.749600410461426, -30.289499282836914, 2.149739980697632, 11.512200355529785,
+ -30.424800872802734, 0, 11.039799690246582, -24.403499603271484, 2.149739980697632, 8.240659713745117,
+ -24.204500198364258, 0, 7.643509864807129, -36.30670166015625, 2.8663198947906494, 22.930500030517578,
+ -35.6348991394043, 2.8663198947906494, 19.530500411987305, -33.55979919433594, 2.8663198947906494, 15.973699569702148,
+ -29.99180030822754, 2.8663198947906494, 12.551300048828125, -24.841400146484375, 2.8663198947906494, 9.554389953613281,
+ -34.99290084838867, 2.149739980697632, 22.930500030517578, -34.44089889526367, 2.149739980697632, 20.082199096679688,
+ -32.711299896240234, 2.149739980697632, 16.81529998779297, -29.69420051574707, 2.149739980697632, 13.590499877929688,
+ -25.279300689697266, 2.149739980697632, 10.8681001663208, -34.39580154418945, 0, 22.930500030517578,
+ -33.89820098876953, 0, 20.33289909362793, -32.32569885253906, 0, 17.197900772094727,
+ -29.558900833129883, 0, 14.062899589538574, -25.4783992767334, 0, 11.465299606323242,
+ 21.656600952148438, 0, 18.15329933166504, 21.656600952148438, -4.729420185089111, 16.511199951171875,
+ 28.233999252319336, -4.270359992980957, 18.339000701904297, 27.76740074157715, 0, 19.55660057067871,
+ 31.011899948120117, -3.2604401111602783, 22.221399307250977, 30.4148006439209, 0, 22.930500030517578,
+ 32.59560012817383, -2.2505099773406982, 26.764400482177734, 31.867900848388672, 0, 27.020999908447266,
+ 35.5900993347168, -1.791450023651123, 30.573999404907227, 34.39580154418945, 0, 30.573999404907227,
+ 21.656600952148438, -6.3059000968933105, 12.89840030670166, 29.260299682617188, -5.693819999694824, 15.660200119018555,
+ 32.32569885253906, -4.347249984741211, 20.661399841308594, 34.19670104980469, -3.0006699562072754, 26.199899673461914,
+ 38.21760177612305, -2.3886001110076904, 30.573999404907227, 21.656600952148438, -4.729420185089111, 9.285670280456543,
+ 30.286699295043945, -4.270359992980957, 12.981499671936035, 33.639400482177734, -3.2604401111602783, 19.101299285888672,
+ 35.79790115356445, -2.2505099773406982, 25.635400772094727, 40.845001220703125, -1.791450023651123, 30.573999404907227,
+ 21.656600952148438, 0, 7.643509864807129, 30.75320053100586, 0, 11.763799667358398,
+ 34.23659896850586, 0, 18.392200469970703, 36.52560043334961, 0, 25.378799438476562,
+ 42.03929901123047, 0, 30.573999404907227, 21.656600952148438, 0, 7.643509864807129,
+ 21.656600952148438, 4.729420185089111, 9.285670280456543, 30.286699295043945, 4.270359992980957, 12.981499671936035,
+ 30.75320053100586, 0, 11.763799667358398, 33.639400482177734, 3.2604401111602783, 19.101299285888672,
+ 34.23659896850586, 0, 18.392200469970703, 35.79790115356445, 2.2505099773406982, 25.635400772094727,
+ 36.52560043334961, 0, 25.378799438476562, 40.845001220703125, 1.791450023651123, 30.573999404907227,
+ 42.03929901123047, 0, 30.573999404907227, 21.656600952148438, 6.3059000968933105, 12.89840030670166,
+ 29.260299682617188, 5.693819999694824, 15.660200119018555, 32.32569885253906, 4.347249984741211, 20.661399841308594,
+ 34.19670104980469, 3.0006699562072754, 26.199899673461914, 38.21760177612305, 2.3886001110076904, 30.573999404907227,
+ 21.656600952148438, 4.729420185089111, 16.511199951171875, 28.233999252319336, 4.270359992980957, 18.339000701904297,
+ 31.011899948120117, 3.2604401111602783, 22.221399307250977, 32.59560012817383, 2.2505099773406982, 26.764400482177734,
+ 35.5900993347168, 1.791450023651123, 30.573999404907227, 21.656600952148438, 0, 18.15329933166504,
+ 27.76740074157715, 0, 19.55660057067871, 30.4148006439209, 0, 22.930500030517578,
+ 31.867900848388672, 0, 27.020999908447266, 34.39580154418945, 0, 30.573999404907227,
+ 34.39580154418945, 0, 30.573999404907227, 35.5900993347168, -1.791450023651123, 30.573999404907227,
+ 36.59049987792969, -1.679479956626892, 31.137699127197266, 35.3114013671875, 0, 31.111499786376953,
+ 37.18870162963867, -1.4331599473953247, 31.332599639892578, 35.98820114135742, 0, 31.290599822998047,
+ 37.206600189208984, -1.1868300437927246, 31.1481990814209, 36.187198638916016, 0, 31.111499786376953,
+ 36.46590042114258, -1.074869990348816, 30.573999404907227, 35.669700622558594, 0, 30.573999404907227,
+ 38.21760177612305, -2.3886001110076904, 30.573999404907227, 39.40439987182617, -2.2393100261688232, 31.195499420166016,
+ 39.829898834228516, -1.9108799695968628, 31.424999237060547, 39.44919967651367, -1.582450032234192, 31.229000091552734,
+ 38.21760177612305, -1.4331599473953247, 30.573999404907227, 40.845001220703125, -1.791450023651123, 30.573999404907227,
+ 42.218299865722656, -1.679479956626892, 31.25320053100586, 42.47100067138672, -1.4331599473953247, 31.51740074157715,
+ 41.69169998168945, -1.1868300437927246, 31.309900283813477, 39.969200134277344, -1.074869990348816, 30.573999404907227,
+ 42.03929901123047, 0, 30.573999404907227, 43.49729919433594, 0, 31.279399871826172,
+ 43.67150115966797, 0, 31.55929946899414, 42.71110153198242, 0, 31.346599578857422,
+ 40.76539993286133, 0, 30.573999404907227, 42.03929901123047, 0, 30.573999404907227,
+ 40.845001220703125, 1.791450023651123, 30.573999404907227, 42.218299865722656, 1.679479956626892, 31.25320053100586,
+ 43.49729919433594, 0, 31.279399871826172, 42.47100067138672, 1.4331599473953247, 31.51740074157715,
+ 43.67150115966797, 0, 31.55929946899414, 41.69169998168945, 1.1868300437927246, 31.309900283813477,
+ 42.71110153198242, 0, 31.346599578857422, 39.969200134277344, 1.074869990348816, 30.573999404907227,
+ 40.76539993286133, 0, 30.573999404907227, 38.21760177612305, 2.3886001110076904, 30.573999404907227,
+ 39.40439987182617, 2.2393100261688232, 31.195499420166016, 39.829898834228516, 1.9108799695968628, 31.424999237060547,
+ 39.44919967651367, 1.582450032234192, 31.229000091552734, 38.21760177612305, 1.4331599473953247, 30.573999404907227,
+ 35.5900993347168, 1.791450023651123, 30.573999404907227, 36.59049987792969, 1.679479956626892, 31.137699127197266,
+ 37.18870162963867, 1.4331599473953247, 31.332599639892578, 37.206600189208984, 1.1868300437927246, 31.1481990814209,
+ 36.46590042114258, 1.074869990348816, 30.573999404907227, 34.39580154418945, 0, 30.573999404907227,
+ 35.3114013671875, 0, 31.111499786376953, 35.98820114135742, 0, 31.290599822998047,
+ 36.187198638916016, 0, 31.111499786376953, 35.669700622558594, 0, 30.573999404907227,
+ 0, 0, 40.12839889526367, 0, 0, 40.12839889526367,
+ 4.004499912261963, -1.7077000141143799, 39.501399993896484, 4.339280128479004, 0, 39.501399993896484,
+ 3.8207099437713623, -1.6290700435638428, 37.97869873046875, 4.140230178833008, 0, 37.97869873046875,
+ 2.314160108566284, -0.985912024974823, 36.09769821166992, 2.5080299377441406, 0, 36.09769821166992,
+ 2.3503799438476562, -1.0000300407409668, 34.39580154418945, 2.547840118408203, 0, 34.39580154418945,
+ 0, 0, 40.12839889526367, 3.0849199295043945, -3.0849199295043945, 39.501399993896484,
+ 2.943150043487549, -2.943150043487549, 37.97869873046875, 1.782039999961853, -1.782039999961853, 36.09769821166992,
+ 1.8089599609375, -1.8089599609375, 34.39580154418945, 0, 0, 40.12839889526367,
+ 1.7077000141143799, -4.004499912261963, 39.501399993896484, 1.6290700435638428, -3.8207099437713623, 37.97869873046875,
+ 0.985912024974823, -2.314160108566284, 36.09769821166992, 1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+ 0, 0, 40.12839889526367, 0, -4.339280128479004, 39.501399993896484,
+ 0, -4.140230178833008, 37.97869873046875, 0, -2.5080299377441406, 36.09769821166992,
+ 0, -2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+ 0, 0, 40.12839889526367, -1.7077000141143799, -4.004499912261963, 39.501399993896484,
+ 0, -4.339280128479004, 39.501399993896484, -1.6290700435638428, -3.8207099437713623, 37.97869873046875,
+ 0, -4.140230178833008, 37.97869873046875, -0.985912024974823, -2.314160108566284, 36.09769821166992,
+ 0, -2.5080299377441406, 36.09769821166992, -1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+ 0, -2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+ -3.0849199295043945, -3.0849199295043945, 39.501399993896484, -2.943150043487549, -2.943150043487549, 37.97869873046875,
+ -1.782039999961853, -1.782039999961853, 36.09769821166992, -1.8089599609375, -1.8089599609375, 34.39580154418945,
+ 0, 0, 40.12839889526367, -4.004499912261963, -1.7077000141143799, 39.501399993896484,
+ -3.8207099437713623, -1.6290700435638428, 37.97869873046875, -2.314160108566284, -0.985912024974823, 36.09769821166992,
+ -2.3503799438476562, -1.0000300407409668, 34.39580154418945, 0, 0, 40.12839889526367,
+ -4.339280128479004, 0, 39.501399993896484, -4.140230178833008, 0, 37.97869873046875,
+ -2.5080299377441406, 0, 36.09769821166992, -2.547840118408203, 0, 34.39580154418945,
+ 0, 0, 40.12839889526367, 0, 0, 40.12839889526367,
+ -4.004499912261963, 1.7077000141143799, 39.501399993896484, -4.339280128479004, 0, 39.501399993896484,
+ -3.8207099437713623, 1.6290700435638428, 37.97869873046875, -4.140230178833008, 0, 37.97869873046875,
+ -2.314160108566284, 0.985912024974823, 36.09769821166992, -2.5080299377441406, 0, 36.09769821166992,
+ -2.3503799438476562, 1.0000300407409668, 34.39580154418945, -2.547840118408203, 0, 34.39580154418945,
+ 0, 0, 40.12839889526367, -3.0849199295043945, 3.0849199295043945, 39.501399993896484,
+ -2.943150043487549, 2.943150043487549, 37.97869873046875, -1.782039999961853, 1.782039999961853, 36.09769821166992,
+ -1.8089599609375, 1.8089599609375, 34.39580154418945, 0, 0, 40.12839889526367,
+ -1.7077000141143799, 4.004499912261963, 39.501399993896484, -1.6290700435638428, 3.8207099437713623, 37.97869873046875,
+ -0.985912024974823, 2.314160108566284, 36.09769821166992, -1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+ 0, 0, 40.12839889526367, 0, 4.339280128479004, 39.501399993896484,
+ 0, 4.140230178833008, 37.97869873046875, 0, 2.5080299377441406, 36.09769821166992,
+ 0, 2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+ 0, 0, 40.12839889526367, 1.7077000141143799, 4.004499912261963, 39.501399993896484,
+ 0, 4.339280128479004, 39.501399993896484, 1.6290700435638428, 3.8207099437713623, 37.97869873046875,
+ 0, 4.140230178833008, 37.97869873046875, 0.985912024974823, 2.314160108566284, 36.09769821166992,
+ 0, 2.5080299377441406, 36.09769821166992, 1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+ 0, 2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+ 3.0849199295043945, 3.0849199295043945, 39.501399993896484, 2.943150043487549, 2.943150043487549, 37.97869873046875,
+ 1.782039999961853, 1.782039999961853, 36.09769821166992, 1.8089599609375, 1.8089599609375, 34.39580154418945,
+ 0, 0, 40.12839889526367, 4.004499912261963, 1.7077000141143799, 39.501399993896484,
+ 3.8207099437713623, 1.6290700435638428, 37.97869873046875, 2.314160108566284, 0.985912024974823, 36.09769821166992,
+ 2.3503799438476562, 1.0000300407409668, 34.39580154418945, 0, 0, 40.12839889526367,
+ 4.339280128479004, 0, 39.501399993896484, 4.140230178833008, 0, 37.97869873046875,
+ 2.5080299377441406, 0, 36.09769821166992, 2.547840118408203, 0, 34.39580154418945,
+ 2.547840118408203, 0, 34.39580154418945, 2.3503799438476562, -1.0000300407409668, 34.39580154418945,
+ 5.361800193786621, -2.2813100814819336, 33.261199951171875, 5.812250137329102, 0, 33.261199951171875,
+ 9.695320129394531, -4.125110149383545, 32.484901428222656, 10.50979995727539, 0, 32.484901428222656,
+ 13.58810043334961, -5.781400203704834, 31.708599090576172, 14.729700088500977, 0, 31.708599090576172,
+ 15.27750015258789, -6.5001702308654785, 30.573999404907227, 16.56089973449707, 0, 30.573999404907227,
+ 1.8089599609375, -1.8089599609375, 34.39580154418945, 4.126699924468994, -4.126699924468994, 33.261199951171875,
+ 7.461979866027832, -7.461979866027832, 32.484901428222656, 10.458100318908691, -10.458100318908691, 31.708599090576172,
+ 11.758299827575684, -11.758299827575684, 30.573999404907227, 1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+ 2.2813100814819336, -5.361800193786621, 33.261199951171875, 4.125110149383545, -9.695320129394531, 32.484901428222656,
+ 5.781400203704834, -13.58810043334961, 31.708599090576172, 6.5001702308654785, -15.27750015258789, 30.573999404907227,
+ 0, -2.547840118408203, 34.39580154418945, 0, -5.812250137329102, 33.261199951171875,
+ 0, -10.50979995727539, 32.484901428222656, 0, -14.729700088500977, 31.708599090576172,
+ 0, -16.56089973449707, 30.573999404907227, 0, -2.547840118408203, 34.39580154418945,
+ -1.0000300407409668, -2.3503799438476562, 34.39580154418945, -2.2813100814819336, -5.361800193786621, 33.261199951171875,
+ 0, -5.812250137329102, 33.261199951171875, -4.125110149383545, -9.695320129394531, 32.484901428222656,
+ 0, -10.50979995727539, 32.484901428222656, -5.781400203704834, -13.58810043334961, 31.708599090576172,
+ 0, -14.729700088500977, 31.708599090576172, -6.5001702308654785, -15.27750015258789, 30.573999404907227,
+ 0, -16.56089973449707, 30.573999404907227, -1.8089599609375, -1.8089599609375, 34.39580154418945,
+ -4.126699924468994, -4.126699924468994, 33.261199951171875, -7.461979866027832, -7.461979866027832, 32.484901428222656,
+ -10.458100318908691, -10.458100318908691, 31.708599090576172, -11.758299827575684, -11.758299827575684, 30.573999404907227,
+ -2.3503799438476562, -1.0000300407409668, 34.39580154418945, -5.361800193786621, -2.2813100814819336, 33.261199951171875,
+ -9.695320129394531, -4.125110149383545, 32.484901428222656, -13.58810043334961, -5.781400203704834, 31.708599090576172,
+ -15.27750015258789, -6.5001702308654785, 30.573999404907227, -2.547840118408203, 0, 34.39580154418945,
+ -5.812250137329102, 0, 33.261199951171875, -10.50979995727539, 0, 32.484901428222656,
+ -14.729700088500977, 0, 31.708599090576172, -16.56089973449707, 0, 30.573999404907227,
+ -2.547840118408203, 0, 34.39580154418945, -2.3503799438476562, 1.0000300407409668, 34.39580154418945,
+ -5.361800193786621, 2.2813100814819336, 33.261199951171875, -5.812250137329102, 0, 33.261199951171875,
+ -9.695320129394531, 4.125110149383545, 32.484901428222656, -10.50979995727539, 0, 32.484901428222656,
+ -13.58810043334961, 5.781400203704834, 31.708599090576172, -14.729700088500977, 0, 31.708599090576172,
+ -15.27750015258789, 6.5001702308654785, 30.573999404907227, -16.56089973449707, 0, 30.573999404907227,
+ -1.8089599609375, 1.8089599609375, 34.39580154418945, -4.126699924468994, 4.126699924468994, 33.261199951171875,
+ -7.461979866027832, 7.461979866027832, 32.484901428222656, -10.458100318908691, 10.458100318908691, 31.708599090576172,
+ -11.758299827575684, 11.758299827575684, 30.573999404907227, -1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+ -2.2813100814819336, 5.361800193786621, 33.261199951171875, -4.125110149383545, 9.695320129394531, 32.484901428222656,
+ -5.781400203704834, 13.58810043334961, 31.708599090576172, -6.5001702308654785, 15.27750015258789, 30.573999404907227,
+ 0, 2.547840118408203, 34.39580154418945, 0, 5.812250137329102, 33.261199951171875,
+ 0, 10.50979995727539, 32.484901428222656, 0, 14.729700088500977, 31.708599090576172,
+ 0, 16.56089973449707, 30.573999404907227, 0, 2.547840118408203, 34.39580154418945,
+ 1.0000300407409668, 2.3503799438476562, 34.39580154418945, 2.2813100814819336, 5.361800193786621, 33.261199951171875,
+ 0, 5.812250137329102, 33.261199951171875, 4.125110149383545, 9.695320129394531, 32.484901428222656,
+ 0, 10.50979995727539, 32.484901428222656, 5.781400203704834, 13.58810043334961, 31.708599090576172,
+ 0, 14.729700088500977, 31.708599090576172, 6.5001702308654785, 15.27750015258789, 30.573999404907227,
+ 0, 16.56089973449707, 30.573999404907227, 1.8089599609375, 1.8089599609375, 34.39580154418945,
+ 4.126699924468994, 4.126699924468994, 33.261199951171875, 7.461979866027832, 7.461979866027832, 32.484901428222656,
+ 10.458100318908691, 10.458100318908691, 31.708599090576172, 11.758299827575684, 11.758299827575684, 30.573999404907227,
+ 2.3503799438476562, 1.0000300407409668, 34.39580154418945, 5.361800193786621, 2.2813100814819336, 33.261199951171875,
+ 9.695320129394531, 4.125110149383545, 32.484901428222656, 13.58810043334961, 5.781400203704834, 31.708599090576172,
+ 15.27750015258789, 6.5001702308654785, 30.573999404907227, 2.547840118408203, 0, 34.39580154418945,
+ 5.812250137329102, 0, 33.261199951171875, 10.50979995727539, 0, 32.484901428222656,
+ 14.729700088500977, 0, 31.708599090576172, 16.56089973449707, 0, 30.573999404907227 };
+
+float teapotNormals[] = { -0.9667419791221619, 0, -0.25575199723243713, -0.8930140137672424, 0.3698819875717163, -0.2563450038433075,
+ -0.8934370279312134, 0.36910200119018555, 0.2559970021247864, -0.9668239951133728, 0, 0.2554430067539215,
+ -0.0838799998164177, 0.03550700098276138, 0.9958429932594299, -0.09205400198698044, 0, 0.9957540035247803,
+ 0.629721999168396, -0.2604379951953888, 0.7318620085716248, 0.6820489764213562, 0, 0.7313070297241211,
+ 0.803725004196167, -0.3325839936733246, 0.4933690130710602, 0.8703010082244873, 0, 0.4925200045108795,
+ -0.6834070086479187, 0.6834070086479187, -0.2567310035228729, -0.6835309863090515, 0.6835309863090515, 0.25606799125671387,
+ -0.06492599844932556, 0.06492500007152557, 0.9957759976387024, 0.48139700293540955, -0.48139700293540955, 0.7324709892272949,
+ 0.6148040294647217, -0.6148040294647217, 0.4939970076084137, -0.3698819875717163, 0.8930140137672424, -0.2563450038433075,
+ -0.36910200119018555, 0.8934370279312134, 0.2559959888458252, -0.03550700098276138, 0.0838790014386177, 0.9958429932594299,
+ 0.26043900847435, -0.6297230124473572, 0.7318609952926636, 0.3325839936733246, -0.803725004196167, 0.4933690130710602,
+ -0.002848000032827258, 0.9661769866943359, -0.25786298513412476, -0.001921999966725707, 0.9670090079307556, 0.2547360062599182,
+ -0.00026500000967644155, 0.09227199852466583, 0.9957339763641357, 0.00002300000051036477, -0.6820600032806396, 0.7312960028648376,
+ 0, -0.8703010082244873, 0.4925200045108795, -0.002848000032827258, 0.9661769866943359, -0.25786298513412476,
+ 0.37905800342559814, 0.852770984172821, -0.35929998755455017, 0.37711000442504883, 0.9140909910202026, 0.14908500015735626,
+ -0.001921999966725707, 0.9670090079307556, 0.2547360062599182, 0.0275030005723238, 0.12255500257015228, 0.9920809864997864,
+ -0.00026500000967644155, 0.09227199852466583, 0.9957339763641357, -0.26100900769233704, -0.6353650093078613, 0.7267630100250244,
+ 0.00002300000051036477, -0.6820600032806396, 0.7312960028648376, -0.33248499035835266, -0.8042709827423096, 0.4925459921360016,
+ 0, -0.8703010082244873, 0.4925200045108795, 0.6635469794273376, 0.6252639889717102, -0.4107919931411743,
+ 0.712664008140564, 0.6976209878921509, 0.07372400164604187, 0.09972699731588364, 0.12198299914598465, 0.98750901222229,
+ -0.4873189926147461, -0.4885669946670532, 0.7237560153007507, -0.6152420043945312, -0.6154839992523193, 0.4926010072231293,
+ 0.8800280094146729, 0.3387089967727661, -0.3329069912433624, 0.9172769784927368, 0.36149299144744873, 0.16711199283599854,
+ 0.11358699947595596, 0.04806999862194061, 0.9923650026321411, -0.6341490149497986, -0.2618879973888397, 0.7275090217590332,
+ -0.8041260242462158, -0.33270499110221863, 0.49263399839401245, 0.9666900038719177, -0.010453999973833561, -0.2557379901409149,
+ 0.967441976070404, -0.00810300000011921, 0.25296199321746826, 0.0934389978647232, -0.0012799999676644802, 0.9956240057945251,
+ -0.6821659803390503, 0.0003429999924264848, 0.7311969995498657, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+ 0.9666900038719177, -0.010453999973833561, -0.2557379901409149, 0.8930140137672424, -0.3698819875717163, -0.2563450038433075,
+ 0.8934370279312134, -0.36910200119018555, 0.2559970021247864, 0.967441976070404, -0.00810300000011921, 0.25296199321746826,
+ 0.0838799998164177, -0.03550700098276138, 0.9958429932594299, 0.0934389978647232, -0.0012799999676644802, 0.9956240057945251,
+ -0.629721999168396, 0.2604379951953888, 0.7318620085716248, -0.6821659803390503, 0.0003429999924264848, 0.7311969995498657,
+ -0.803725004196167, 0.3325839936733246, 0.4933690130710602, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+ 0.6834070086479187, -0.6834070086479187, -0.2567310035228729, 0.6835309863090515, -0.6835309863090515, 0.25606799125671387,
+ 0.06492599844932556, -0.06492500007152557, 0.9957759976387024, -0.48139700293540955, 0.48139700293540955, 0.7324709892272949,
+ -0.6148040294647217, 0.6148040294647217, 0.4939970076084137, 0.3698819875717163, -0.8930140137672424, -0.2563450038433075,
+ 0.36910200119018555, -0.8934370279312134, 0.2559959888458252, 0.03550700098276138, -0.0838790014386177, 0.9958429932594299,
+ -0.26043900847435, 0.6297230124473572, 0.7318609952926636, -0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+ 0, -0.9667419791221619, -0.25575199723243713, 0, -0.9668239951133728, 0.2554430067539215,
+ 0, -0.09205400198698044, 0.9957540035247803, 0, 0.6820489764213562, 0.7313070297241211,
+ 0, 0.8703010082244873, 0.4925200045108795, 0, -0.9667419791221619, -0.25575199723243713,
+ -0.3698819875717163, -0.8930140137672424, -0.2563450038433075, -0.36910200119018555, -0.8934370279312134, 0.2559970021247864,
+ 0, -0.9668239951133728, 0.2554430067539215, -0.03550700098276138, -0.0838799998164177, 0.9958429932594299,
+ 0, -0.09205400198698044, 0.9957540035247803, 0.2604379951953888, 0.629721999168396, 0.7318620085716248,
+ 0, 0.6820489764213562, 0.7313070297241211, 0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+ 0, 0.8703010082244873, 0.4925200045108795, -0.6834070086479187, -0.6834070086479187, -0.2567310035228729,
+ -0.6835309863090515, -0.6835309863090515, 0.25606799125671387, -0.06492500007152557, -0.06492599844932556, 0.9957759976387024,
+ 0.48139700293540955, 0.48139700293540955, 0.7324709892272949, 0.6148040294647217, 0.6148040294647217, 0.4939970076084137,
+ -0.8930140137672424, -0.3698819875717163, -0.2563450038433075, -0.8934370279312134, -0.36910200119018555, 0.2559959888458252,
+ -0.0838790014386177, -0.03550700098276138, 0.9958429932594299, 0.6297230124473572, 0.26043900847435, 0.7318609952926636,
+ 0.803725004196167, 0.3325839936733246, 0.4933690130710602, -0.9667419791221619, 0, -0.25575199723243713,
+ -0.9668239951133728, 0, 0.2554430067539215, -0.09205400198698044, 0, 0.9957540035247803,
+ 0.6820489764213562, 0, 0.7313070297241211, 0.8703010082244873, 0, 0.4925200045108795,
+ 0.8703010082244873, 0, 0.4925200045108795, 0.803725004196167, -0.3325839936733246, 0.4933690130710602,
+ 0.8454390168190002, -0.34983500838279724, 0.40354499220848083, 0.9153209924697876, 0, 0.4027250111103058,
+ 0.8699960112571716, -0.36004599928855896, 0.33685898780822754, 0.9418079853057861, 0, 0.33615100383758545,
+ 0.9041929841041565, -0.37428000569343567, 0.20579099655151367, 0.9786900281906128, 0, 0.20534199476242065,
+ 0.9218789935112, -0.38175201416015625, -0.06636899709701538, 0.9978039860725403, 0, -0.06623899936676025,
+ 0.6148040294647217, -0.6148040294647217, 0.4939970076084137, 0.6468020081520081, -0.6468020081520081, 0.40409600734710693,
+ 0.6656550168991089, -0.6656550168991089, 0.3373520076274872, 0.6919230222702026, -0.6919230222702026, 0.20611999928951263,
+ 0.7055429816246033, -0.7055429816246033, -0.06647899746894836, 0.3325839936733246, -0.803725004196167, 0.4933690130710602,
+ 0.34983500838279724, -0.8454390168190002, 0.40354499220848083, 0.36004701256752014, -0.8699960112571716, 0.33685800433158875,
+ 0.37428000569343567, -0.9041929841041565, 0.20579099655151367, 0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+ 0, -0.8703010082244873, 0.4925200045108795, 0, -0.9153209924697876, 0.4027250111103058,
+ 0, -0.9418079853057861, 0.33615100383758545, 0, -0.9786900281906128, 0.20534199476242065,
+ 0, -0.9978039860725403, -0.06623899936676025, 0, -0.8703010082244873, 0.4925200045108795,
+ -0.33248499035835266, -0.8042709827423096, 0.4925459921360016, -0.34983500838279724, -0.8454390168190002, 0.40354499220848083,
+ 0, -0.9153209924697876, 0.4027250111103058, -0.36004599928855896, -0.8699960112571716, 0.33685898780822754,
+ 0, -0.9418079853057861, 0.33615100383758545, -0.37428000569343567, -0.9041929841041565, 0.20579099655151367,
+ 0, -0.9786900281906128, 0.20534199476242065, -0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+ 0, -0.9978039860725403, -0.06623899936676025, -0.6152420043945312, -0.6154839992523193, 0.4926010072231293,
+ -0.6468020081520081, -0.6468020081520081, 0.40409600734710693, -0.6656550168991089, -0.6656550168991089, 0.3373520076274872,
+ -0.6919230222702026, -0.6919230222702026, 0.20611999928951263, -0.7055429816246033, -0.7055429816246033, -0.06647899746894836,
+ -0.8041260242462158, -0.33270499110221863, 0.49263399839401245, -0.8454390168190002, -0.34983500838279724, 0.40354499220848083,
+ -0.8699960112571716, -0.36004701256752014, 0.33685800433158875, -0.9041929841041565, -0.37428000569343567, 0.20579099655151367,
+ -0.9218789935112, -0.38175201416015625, -0.06636899709701538, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+ -0.9153209924697876, 0, 0.4027250111103058, -0.9418079853057861, 0, 0.33615100383758545,
+ -0.9786900281906128, 0, 0.20534199476242065, -0.9978039860725403, 0, -0.06623899936676025,
+ -0.8703219890594482, 0.00005400000009103678, 0.492482990026474, -0.803725004196167, 0.3325839936733246, 0.4933690130710602,
+ -0.8454390168190002, 0.34983500838279724, 0.40354499220848083, -0.9153209924697876, 0, 0.4027250111103058,
+ -0.8699960112571716, 0.36004599928855896, 0.33685898780822754, -0.9418079853057861, 0, 0.33615100383758545,
+ -0.9041929841041565, 0.37428000569343567, 0.20579099655151367, -0.9786900281906128, 0, 0.20534199476242065,
+ -0.9218789935112, 0.38175201416015625, -0.06636899709701538, -0.9978039860725403, 0, -0.06623899936676025,
+ -0.6148040294647217, 0.6148040294647217, 0.4939970076084137, -0.6468020081520081, 0.6468020081520081, 0.40409600734710693,
+ -0.6656550168991089, 0.6656550168991089, 0.3373520076274872, -0.6919230222702026, 0.6919230222702026, 0.20611999928951263,
+ -0.7055429816246033, 0.7055429816246033, -0.06647899746894836, -0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+ -0.34983500838279724, 0.8454390168190002, 0.40354499220848083, -0.36004701256752014, 0.8699960112571716, 0.33685800433158875,
+ -0.37428000569343567, 0.9041929841041565, 0.20579099655151367, -0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+ 0, 0.8703010082244873, 0.4925200045108795, 0, 0.9153209924697876, 0.4027250111103058,
+ 0, 0.9418079853057861, 0.33615100383758545, 0, 0.9786900281906128, 0.20534199476242065,
+ 0, 0.9978039860725403, -0.06623899936676025, 0, 0.8703010082244873, 0.4925200045108795,
+ 0.3325839936733246, 0.803725004196167, 0.4933690130710602, 0.34983500838279724, 0.8454390168190002, 0.40354499220848083,
+ 0, 0.9153209924697876, 0.4027250111103058, 0.36004599928855896, 0.8699960112571716, 0.33685898780822754,
+ 0, 0.9418079853057861, 0.33615100383758545, 0.37428000569343567, 0.9041929841041565, 0.20579099655151367,
+ 0, 0.9786900281906128, 0.20534199476242065, 0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+ 0, 0.9978039860725403, -0.06623899936676025, 0.6148040294647217, 0.6148040294647217, 0.4939970076084137,
+ 0.6468020081520081, 0.6468020081520081, 0.40409600734710693, 0.6656550168991089, 0.6656550168991089, 0.3373520076274872,
+ 0.6919230222702026, 0.6919230222702026, 0.20611999928951263, 0.7055429816246033, 0.7055429816246033, -0.06647899746894836,
+ 0.803725004196167, 0.3325839936733246, 0.4933690130710602, 0.8454390168190002, 0.34983500838279724, 0.40354499220848083,
+ 0.8699960112571716, 0.36004701256752014, 0.33685800433158875, 0.9041929841041565, 0.37428000569343567, 0.20579099655151367,
+ 0.9218789935112, 0.38175201416015625, -0.06636899709701538, 0.8703010082244873, 0, 0.4925200045108795,
+ 0.9153209924697876, 0, 0.4027250111103058, 0.9418079853057861, 0, 0.33615100383758545,
+ 0.9786900281906128, 0, 0.20534199476242065, 0.9978039860725403, 0, -0.06623899936676025,
+ 0.9978039860725403, 0, -0.06623899936676025, 0.9218789935112, -0.38175201416015625, -0.06636899709701538,
+ 0.8314369916915894, -0.3441790044307709, -0.4361799955368042, 0.9001820087432861, 0, -0.4355129897594452,
+ 0.6735119819641113, -0.2785939872264862, -0.6846650242805481, 0.7296109795570374, 0, -0.6838629841804504,
+ 0.6403989791870117, -0.26487401127815247, -0.7209240198135376, 0.6939510107040405, 0, -0.7200220227241516,
+ 0.7329490184783936, -0.303166002035141, -0.6089959740638733, 0.7939500212669373, 0, -0.6079840064048767,
+ 0.7055429816246033, -0.7055429816246033, -0.06647899746894836, 0.6360920071601868, -0.6360920071601868, -0.4367780089378357,
+ 0.5149649977684021, -0.5149649977684021, -0.6852890253067017, 0.48965099453926086, -0.48965099453926086, -0.7214459776878357,
+ 0.5605549812316895, -0.5605549812316895, -0.6095539927482605, 0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+ 0.3441790044307709, -0.8314369916915894, -0.4361799955368042, 0.2785939872264862, -0.6735119819641113, -0.6846650242805481,
+ 0.26487401127815247, -0.6403989791870117, -0.7209240198135376, 0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+ 0, -0.9978039860725403, -0.06623899936676025, 0, -0.9001820087432861, -0.4355129897594452,
+ 0, -0.7296109795570374, -0.6838629841804504, 0, -0.6939510107040405, -0.7200220227241516,
+ 0, -0.7939500212669373, -0.6079840064048767, 0, -0.9978039860725403, -0.06623899936676025,
+ -0.38175201416015625, -0.9218789935112, -0.06636899709701538, -0.3441790044307709, -0.8314369916915894, -0.4361799955368042,
+ 0, -0.9001820087432861, -0.4355129897594452, -0.2785939872264862, -0.6735119819641113, -0.6846650242805481,
+ 0, -0.7296109795570374, -0.6838629841804504, -0.26487401127815247, -0.6403989791870117, -0.7209240198135376,
+ 0, -0.6939510107040405, -0.7200220227241516, -0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+ 0, -0.7939500212669373, -0.6079840064048767, -0.7055429816246033, -0.7055429816246033, -0.06647899746894836,
+ -0.6360920071601868, -0.6360920071601868, -0.4367780089378357, -0.5149649977684021, -0.5149649977684021, -0.6852890253067017,
+ -0.48965099453926086, -0.48965099453926086, -0.7214459776878357, -0.5605549812316895, -0.5605549812316895, -0.6095539927482605,
+ -0.9218789935112, -0.38175201416015625, -0.06636899709701538, -0.8314369916915894, -0.3441790044307709, -0.4361799955368042,
+ -0.6735119819641113, -0.2785939872264862, -0.6846650242805481, -0.6403989791870117, -0.26487401127815247, -0.7209240198135376,
+ -0.7329490184783936, -0.303166002035141, -0.6089959740638733, -0.9978039860725403, 0, -0.06623899936676025,
+ -0.9001820087432861, 0, -0.4355129897594452, -0.7296109795570374, 0, -0.6838629841804504,
+ -0.6939510107040405, 0, -0.7200220227241516, -0.7939500212669373, 0, -0.6079840064048767,
+ -0.9978039860725403, 0, -0.06623899936676025, -0.9218789935112, 0.38175201416015625, -0.06636899709701538,
+ -0.8314369916915894, 0.3441790044307709, -0.4361799955368042, -0.9001820087432861, 0, -0.4355129897594452,
+ -0.6735119819641113, 0.2785939872264862, -0.6846650242805481, -0.7296109795570374, 0, -0.6838629841804504,
+ -0.6403989791870117, 0.26487401127815247, -0.7209240198135376, -0.6939510107040405, 0, -0.7200220227241516,
+ -0.7329490184783936, 0.303166002035141, -0.6089959740638733, -0.7939500212669373, 0, -0.6079840064048767,
+ -0.7055429816246033, 0.7055429816246033, -0.06647899746894836, -0.6360920071601868, 0.6360920071601868, -0.4367780089378357,
+ -0.5149649977684021, 0.5149649977684021, -0.6852890253067017, -0.48965099453926086, 0.48965099453926086, -0.7214459776878357,
+ -0.5605549812316895, 0.5605549812316895, -0.6095539927482605, -0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+ -0.3441790044307709, 0.8314369916915894, -0.4361799955368042, -0.2785939872264862, 0.6735119819641113, -0.6846650242805481,
+ -0.26487401127815247, 0.6403989791870117, -0.7209240198135376, -0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+ 0, 0.9978039860725403, -0.06623899936676025, 0, 0.9001820087432861, -0.4355129897594452,
+ 0, 0.7296109795570374, -0.6838629841804504, 0, 0.6939510107040405, -0.7200220227241516,
+ 0, 0.7939500212669373, -0.6079840064048767, 0, 0.9978039860725403, -0.06623899936676025,
+ 0.38175201416015625, 0.9218789935112, -0.06636899709701538, 0.3441790044307709, 0.8314369916915894, -0.4361799955368042,
+ 0, 0.9001820087432861, -0.4355129897594452, 0.2785939872264862, 0.6735119819641113, -0.6846650242805481,
+ 0, 0.7296109795570374, -0.6838629841804504, 0.26487401127815247, 0.6403989791870117, -0.7209240198135376,
+ 0, 0.6939510107040405, -0.7200220227241516, 0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+ 0, 0.7939500212669373, -0.6079840064048767, 0.7055429816246033, 0.7055429816246033, -0.06647899746894836,
+ 0.6360920071601868, 0.6360920071601868, -0.4367780089378357, 0.5149649977684021, 0.5149649977684021, -0.6852890253067017,
+ 0.48965099453926086, 0.48965099453926086, -0.7214459776878357, 0.5605549812316895, 0.5605549812316895, -0.6095539927482605,
+ 0.9218789935112, 0.38175201416015625, -0.06636899709701538, 0.8314369916915894, 0.3441790044307709, -0.4361799955368042,
+ 0.6735119819641113, 0.2785939872264862, -0.6846650242805481, 0.6403989791870117, 0.26487401127815247, -0.7209240198135376,
+ 0.7329490184783936, 0.303166002035141, -0.6089959740638733, 0.9978039860725403, 0, -0.06623899936676025,
+ 0.9001820087432861, 0, -0.4355129897594452, 0.7296109795570374, 0, -0.6838629841804504,
+ 0.6939510107040405, 0, -0.7200220227241516, 0.7939500212669373, 0, -0.6079840064048767,
+ 0.7939500212669373, 0, -0.6079840064048767, 0.7329490184783936, -0.303166002035141, -0.6089959740638733,
+ 0.576229989528656, -0.23821599781513214, -0.7818009853363037, 0.6238600015640259, 0, -0.7815359830856323,
+ 0.16362899541854858, -0.06752700358629227, -0.9842079877853394, 0.17729100584983826, 0, -0.984158992767334,
+ 0.04542100057005882, -0.018735000863671303, -0.9987919926643372, 0.04920699819922447, 0, -0.9987890124320984,
+ 0, 0, -1, 0, 0, -1,
+ 0.5605549812316895, -0.5605549812316895, -0.6095539927482605, 0.44041600823402405, -0.44041600823402405, -0.7823479771614075,
+ 0.12490200251340866, -0.12490200251340866, -0.9842759966850281, 0.034662000834941864, -0.034662000834941864, -0.9987980127334595,
+ 0, 0, -1, 0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+ 0.23821599781513214, -0.576229989528656, -0.7818009853363037, 0.06752700358629227, -0.16362899541854858, -0.9842079877853394,
+ 0.018735000863671303, -0.04542100057005882, -0.9987919926643372, 0, 0, -1,
+ 0, -0.7939500212669373, -0.6079840064048767, 0, -0.6238600015640259, -0.7815359830856323,
+ 0, -0.17729100584983826, -0.984158992767334, 0, -0.04920699819922447, -0.9987890124320984,
+ 0, 0, -1, 0, -0.7939500212669373, -0.6079840064048767,
+ -0.303166002035141, -0.7329490184783936, -0.6089959740638733, -0.23821599781513214, -0.576229989528656, -0.7818009853363037,
+ 0, -0.6238600015640259, -0.7815359830856323, -0.06752700358629227, -0.16362899541854858, -0.9842079877853394,
+ 0, -0.17729100584983826, -0.984158992767334, -0.018735000863671303, -0.04542100057005882, -0.9987919926643372,
+ 0, -0.04920699819922447, -0.9987890124320984, 0, 0, -1,
+ 0, 0, -1, -0.5605549812316895, -0.5605549812316895, -0.6095539927482605,
+ -0.44041600823402405, -0.44041600823402405, -0.7823479771614075, -0.12490200251340866, -0.12490200251340866, -0.9842759966850281,
+ -0.034662000834941864, -0.034662000834941864, -0.9987980127334595, 0, 0, -1,
+ -0.7329490184783936, -0.303166002035141, -0.6089959740638733, -0.576229989528656, -0.23821599781513214, -0.7818009853363037,
+ -0.16362899541854858, -0.06752700358629227, -0.9842079877853394, -0.04542100057005882, -0.018735000863671303, -0.9987919926643372,
+ 0, 0, -1, -0.7939500212669373, 0, -0.6079840064048767,
+ -0.6238600015640259, 0, -0.7815359830856323, -0.17729100584983826, 0, -0.984158992767334,
+ -0.04920699819922447, 0, -0.9987890124320984, 0, 0, -1,
+ -0.7939500212669373, 0, -0.6079840064048767, -0.7329490184783936, 0.303166002035141, -0.6089959740638733,
+ -0.576229989528656, 0.23821599781513214, -0.7818009853363037, -0.6238600015640259, 0, -0.7815359830856323,
+ -0.16362899541854858, 0.06752700358629227, -0.9842079877853394, -0.17729100584983826, 0, -0.984158992767334,
+ -0.04542100057005882, 0.018735000863671303, -0.9987919926643372, -0.04920699819922447, 0, -0.9987890124320984,
+ 0, 0, -1, 0, 0, -1,
+ -0.5605549812316895, 0.5605549812316895, -0.6095539927482605, -0.44041600823402405, 0.44041600823402405, -0.7823479771614075,
+ -0.12490200251340866, 0.12490200251340866, -0.9842759966850281, -0.034662000834941864, 0.034662000834941864, -0.9987980127334595,
+ 0, 0, -1, -0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+ -0.23821599781513214, 0.576229989528656, -0.7818009853363037, -0.06752700358629227, 0.16362899541854858, -0.9842079877853394,
+ -0.018735000863671303, 0.04542100057005882, -0.9987919926643372, 0, 0, -1,
+ 0, 0.7939500212669373, -0.6079840064048767, 0, 0.6238600015640259, -0.7815359830856323,
+ 0, 0.17729100584983826, -0.984158992767334, 0, 0.04920699819922447, -0.9987890124320984,
+ 0, 0, -1, 0, 0.7939500212669373, -0.6079840064048767,
+ 0.303166002035141, 0.7329490184783936, -0.6089959740638733, 0.23821599781513214, 0.576229989528656, -0.7818009853363037,
+ 0, 0.6238600015640259, -0.7815359830856323, 0.06752700358629227, 0.16362899541854858, -0.9842079877853394,
+ 0, 0.17729100584983826, -0.984158992767334, 0.018735000863671303, 0.04542100057005882, -0.9987919926643372,
+ 0, 0.04920699819922447, -0.9987890124320984, 0, 0, -1,
+ 0, 0, -1, 0.5605549812316895, 0.5605549812316895, -0.6095539927482605,
+ 0.44041600823402405, 0.44041600823402405, -0.7823479771614075, 0.12490200251340866, 0.12490200251340866, -0.9842759966850281,
+ 0.034662000834941864, 0.034662000834941864, -0.9987980127334595, 0, 0, -1,
+ 0.7329490184783936, 0.303166002035141, -0.6089959740638733, 0.576229989528656, 0.23821599781513214, -0.7818009853363037,
+ 0.16362899541854858, 0.06752700358629227, -0.9842079877853394, 0.04542100057005882, 0.018735000863671303, -0.9987919926643372,
+ 0, 0, -1, 0.7939500212669373, 0, -0.6079840064048767,
+ 0.6238600015640259, 0, -0.7815359830856323, 0.17729100584983826, 0, -0.984158992767334,
+ 0.04920699819922447, 0, -0.9987890124320984, 0, 0, -1,
+ 0.007784999907016754, 0.00021499999274965376, -0.999970018863678, 0.007038000039756298, -0.5829259753227234, -0.8124949932098389,
+ 0.0361270010471344, -0.5456140041351318, -0.837257981300354, 0.03913800045847893, 0.0009879999561235309, -0.9992330074310303,
+ 0.16184599697589874, -0.5630490183830261, -0.8104209899902344, 0.17951199412345886, 0.0043680001981556416, -0.9837459921836853,
+ 0.4823650121688843, -0.6427459716796875, -0.5951480269432068, 0.6122999787330627, 0.010459000244736671, -0.790556013584137,
+ 0.7387199997901917, -0.6641989946365356, -0.11459299921989441, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+ -0.0019079999765381217, -0.9867690205574036, 0.1621209979057312, 0.002761000068858266, -0.9998499751091003, 0.017105000093579292,
+ 0.010532000102102757, -0.9972469806671143, 0.07339800149202347, -0.06604000180959702, -0.9893029928207397, 0.13006900250911713,
+ -0.09442699700593948, -0.9953929781913757, 0.016594000160694122, -0.009201999753713608, -0.4902929961681366, 0.8715090155601501,
+ -0.04860600084066391, -0.5394579768180847, 0.8406090140342712, -0.22329799830913544, -0.5527390241622925, 0.8028810024261475,
+ -0.5963649749755859, -0.5751349925994873, 0.5599709749221802, -0.8033369779586792, -0.5916029810905457, 0.06823500245809555,
+ -0.01056000031530857, -0.00010299999848939478, 0.9999439716339111, -0.05879800021648407, -0.0007089999853633344, 0.9982699751853943,
+ -0.28071001172065735, -0.0032679999712854624, 0.9597870111465454, -0.7497230172157288, -0.004267000127583742, 0.6617379784584045,
+ -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.01056000031530857, -0.00010299999848939478, 0.9999439716339111,
+ -0.008791999891400337, 0.49032899737358093, 0.8714929819107056, -0.04649300128221512, 0.5387560129165649, 0.8411779999732971,
+ -0.05879800021648407, -0.0007089999853633344, 0.9982699751853943, -0.21790899336338043, 0.5491610169410706, 0.8068069815635681,
+ -0.28071001172065735, -0.0032679999712854624, 0.9597870111465454, -0.5972909927368164, 0.5741199851036072, 0.560027003288269,
+ -0.7497230172157288, -0.004267000127583742, 0.6617379784584045, -0.8040000200271606, 0.5912910103797913, 0.0629120022058487,
+ -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.0018050000071525574, 0.986840009689331, 0.16169099509716034,
+ 0.0020310000982135534, 0.999891996383667, 0.014553000219166279, 0.009215000085532665, 0.9981520175933838, 0.060068998485803604,
+ -0.059335000813007355, 0.9917230010032654, 0.11386600136756897, -0.08690100163221359, 0.9961410164833069, 0.01228999998420477,
+ 0.006417000200599432, 0.5830950140953064, -0.812379002571106, 0.03378299996256828, 0.5453730225563049, -0.8375130295753479,
+ 0.1571130007505417, 0.562188982963562, -0.8119469881057739, 0.4844059944152832, 0.6465290188789368, -0.5893650054931641,
+ 0.7388700246810913, 0.6661880016326904, -0.10131999850273132, 0.007784999907016754, 0.00021499999274965376, -0.999970018863678,
+ 0.03913800045847893, 0.0009879999561235309, -0.9992330074310303, 0.17951199412345886, 0.0043680001981556416, -0.9837459921836853,
+ 0.6122999787330627, 0.010459000244736671, -0.790556013584137, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+ 0.9861519932746887, 0.006668999791145325, -0.16570700705051422, 0.7387199997901917, -0.6641989946365356, -0.11459299921989441,
+ 0.7256090044975281, -0.6373609900474548, 0.25935098528862, 0.94651198387146, 0.0033569999504834414, 0.3226499855518341,
+ 0.6459450125694275, -0.6077200174331665, 0.46198800206184387, 0.8258299827575684, 0.007451999932527542, 0.5638700127601624,
+ 0.5316150188446045, -0.5586140155792236, 0.6366599798202515, 0.6500110030174255, 0.006936000194400549, 0.759893000125885,
+ 0.4249640107154846, -0.5955389738082886, 0.6817179918289185, 0.5324289798736572, 0.005243999883532524, 0.8464580178260803,
+ -0.09442699700593948, -0.9953929781913757, 0.016594000160694122, -0.04956100136041641, -0.9985759854316711, -0.01975500024855137,
+ -0.03781700134277344, -0.998649001121521, -0.035624999552965164, -0.0379129983484745, -0.9986140131950378, -0.03651199862360954,
+ -0.1688539981842041, -0.9395300149917603, -0.2979460060596466, -0.8033369779586792, -0.5916029810905457, 0.06823500245809555,
+ -0.7423409819602966, -0.5995240211486816, -0.2991659939289093, -0.6196020245552063, -0.5795029997825623, -0.5294060111045837,
+ -0.483707994222641, -0.5438370108604431, -0.6857600212097168, -0.44529199600219727, -0.4131770133972168, -0.7943549752235413,
+ -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.9265130162239075, -0.0019950000569224358, -0.3762570023536682,
+ -0.7539200186729431, -0.004317000042647123, -0.6569520235061646, -0.5662239789962769, -0.003461000043898821, -0.8242440223693848,
+ -0.4818040132522583, -0.0018500000005587935, -0.8762770295143127, -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288,
+ -0.8040000200271606, 0.5912910103797913, 0.0629120022058487, -0.7446749806404114, 0.5989770293235779, -0.29442399740219116,
+ -0.9265130162239075, -0.0019950000569224358, -0.3762570023536682, -0.6219490170478821, 0.5781649947166443, -0.5281140208244324,
+ -0.7539200186729431, -0.004317000042647123, -0.6569520235061646, -0.48117101192474365, 0.5428280234336853, -0.6883400082588196,
+ -0.5662239789962769, -0.003461000043898821, -0.8242440223693848, -0.43805500864982605, 0.41574400663375854, -0.7970349788665771,
+ -0.4818040132522583, -0.0018500000005587935, -0.8762770295143127, -0.08690100163221359, 0.9961410164833069, 0.01228999998420477,
+ -0.04433799907565117, 0.9988710284233093, -0.017055999487638474, -0.026177000254392624, 0.9992600083351135, -0.02816700004041195,
+ -0.025293000042438507, 0.9992780089378357, -0.028332000598311424, -0.15748199820518494, 0.9441670179367065, -0.28939300775527954,
+ 0.7388700246810913, 0.6661880016326904, -0.10131999850273132, 0.7282440066337585, 0.63714200258255, 0.25240999460220337,
+ 0.6470540165901184, 0.6082550287246704, 0.4597249925136566, 0.5229939818382263, 0.5621700286865234, 0.6406570076942444,
+ 0.4099780023097992, 0.6046689748764038, 0.6828569769859314, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+ 0.94651198387146, 0.0033569999504834414, 0.3226499855518341, 0.8258299827575684, 0.007451999932527542, 0.5638700127601624,
+ 0.6500110030174255, 0.006936000194400549, 0.759893000125885, 0.5324289798736572, 0.005243999883532524, 0.8464580178260803,
+ -0.230786994099617, 0.006523000076413155, 0.9729819893836975, -0.15287800133228302, -0.7101899981498718, 0.6872109770774841,
+ -0.31672099232673645, -0.7021129727363586, 0.6377500295639038, -0.5489360094070435, 0.0015109999803826213, 0.8358629941940308,
+ -0.6010670065879822, -0.645330011844635, 0.471451997756958, -0.8756710290908813, -0.009891999885439873, 0.4828070104122162,
+ -0.635890007019043, -0.629800021648407, 0.4460900127887726, -0.8775539994239807, -0.01909100078046322, 0.47909700870513916,
+ -0.4357450008392334, -0.670009970664978, 0.6010090112686157, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+ 0.11111299693584442, -0.9901599884033203, -0.08506900072097778, 0.22330999374389648, -0.9747260212898254, 0.006539999973028898,
+ 0.19009700417518616, -0.9694579839706421, 0.15496399998664856, 0.005270000081509352, -0.9818699955940247, 0.18948200345039368,
+ -0.011750999838113785, -0.9690240025520325, 0.24668699502944946, 0.3439059853553772, -0.5994120240211487, -0.7227950096130371,
+ 0.5724899768829346, -0.5916270017623901, -0.5676559805870056, 0.7874360084533691, -0.5605109930038452, -0.2564600110054016,
+ 0.6470969915390015, -0.6981409788131714, -0.3063740134239197, 0.4275279939174652, -0.7535750269889832, -0.49934399127960205,
+ 0.4109260141849518, -0.0012839999981224537, -0.9116680026054382, 0.6715199947357178, 0.0008989999769255519, -0.7409859895706177,
+ 0.9220259785652161, 0.00725199980661273, -0.3870599865913391, 0.8469099998474121, 0.01385399978607893, -0.5315560102462769,
+ 0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.4109260141849518, -0.0012839999981224537, -0.9116680026054382,
+ 0.3411880135536194, 0.6009309887886047, -0.7228230237960815, 0.5786640048027039, 0.591838002204895, -0.5611389875411987,
+ 0.6715199947357178, 0.0008989999769255519, -0.7409859895706177, 0.7848690152168274, 0.5665420293807983, -0.25102001428604126,
+ 0.9220259785652161, 0.00725199980661273, -0.3870599865913391, 0.6426810026168823, 0.7039899826049805, -0.3022570013999939,
+ 0.8469099998474121, 0.01385399978607893, -0.5315560102462769, 0.4185889959335327, 0.7581170201301575, -0.5000420212745667,
+ 0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.11580599844455719, 0.9901139736175537, -0.07913900166749954,
+ 0.23281100392341614, 0.9724410176277161, 0.012564999982714653, 0.20666299760341644, 0.9662799835205078, 0.15360000729560852,
+ 0.02449899911880493, 0.9865779876708984, 0.16144299507141113, 0.0033809999004006386, 0.9774550199508667, 0.2111150026321411,
+ -0.13491199910640717, 0.7135509848594666, 0.6874909996986389, -0.31953999400138855, 0.7050619721412659, 0.6330729722976685,
+ -0.6039019823074341, 0.6499029994010925, 0.4614419937133789, -0.6318150162696838, 0.6400719881057739, 0.43716898560523987,
+ -0.4243049919605255, 0.6667500138282776, 0.6127070188522339, -0.230786994099617, 0.006523000076413155, 0.9729819893836975,
+ -0.5489360094070435, 0.0015109999803826213, 0.8358629941940308, -0.8756710290908813, -0.009891999885439873, 0.4828070104122162,
+ -0.8775539994239807, -0.01909100078046322, 0.47909700870513916, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+ -0.6961889863014221, -0.02449600026011467, 0.7174400091171265, -0.4357450008392334, -0.670009970664978, 0.6010090112686157,
+ -0.25985801219940186, -0.5525479912757874, 0.7919380068778992, -0.42579901218414307, -0.010804999619722366, 0.9047530293464661,
+ 0.009537000209093094, 0.021669000387191772, 0.9997199773788452, 0.022041000425815582, -0.001623000018298626, 0.9997559785842896,
+ 0.4101540148258209, 0.8490809798240662, 0.3329179883003235, 0.9995980262756348, -0.01155600044876337, 0.02587899938225746,
+ 0.5415220260620117, 0.6370009779930115, -0.5486199855804443, 0.7095860242843628, -0.009670999832451344, -0.7045519948005676,
+ -0.011750999838113785, -0.9690240025520325, 0.24668699502944946, 0.046310000121593475, -0.8891720175743103, 0.45522499084472656,
+ -0.010688000358641148, -0.14889900386333466, 0.9887949824333191, -0.04437499865889549, 0.7291200160980225, 0.6829460263252258,
+ 0.12282499670982361, 0.9923850297927856, 0.009232000447809696, 0.4275279939174652, -0.7535750269889832, -0.49934399127960205,
+ 0.48183900117874146, -0.857479989528656, -0.18044300377368927, 0.45527198910713196, -0.49992498755455017, 0.7367510199546814,
+ -0.22054199874401093, 0.3582780063152313, 0.9071930050849915, -0.23591899871826172, 0.7157959938049316, 0.6572499871253967,
+ 0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.7280910015106201, 0.015584999695420265, -0.6853029727935791,
+ 0.8887389898300171, 0.016679000109434128, 0.4581089913845062, -0.26009801030158997, -0.0007999999797903001, 0.965582013130188,
+ -0.37161099910736084, 0.004416999872773886, 0.9283779859542847, 0.5359240174293518, 0.010503999888896942, -0.8442010283470154,
+ 0.4185889959335327, 0.7581170201301575, -0.5000420212745667, 0.4801650047302246, 0.8588529825210571, -0.17836299538612366,
+ 0.7280910015106201, 0.015584999695420265, -0.6853029727935791, 0.4881030023097992, 0.49794700741767883, 0.7168020009994507,
+ 0.8887389898300171, 0.016679000109434128, 0.4581089913845062, -0.2220049947500229, -0.36189401149749756, 0.9053990244865417,
+ -0.26009801030158997, -0.0007999999797903001, 0.965582013130188, -0.23540399968624115, -0.7104769945144653, 0.6631799936294556,
+ -0.37161099910736084, 0.004416999872773886, 0.9283779859542847, 0.0033809999004006386, 0.9774550199508667, 0.2111150026321411,
+ 0.058719001710414886, 0.8971999883651733, 0.437703013420105, 0.0013249999610707164, 0.164000004529953, 0.9864590167999268,
+ -0.04418899863958359, -0.7303190231323242, 0.6816750168800354, 0.13880200684070587, -0.9897300004959106, -0.034189000725746155,
+ -0.4243049919605255, 0.6667500138282776, 0.6127070188522339, -0.25888898968696594, 0.5453789830207825, 0.7972059845924377,
+ 0.012268000282347202, -0.01928500086069107, 0.9997389912605286, 0.3986299932003021, -0.8456630110740662, 0.3548929989337921,
+ 0.5375639796257019, -0.6107370257377625, -0.5813990235328674, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+ -0.42579901218414307, -0.010804999619722366, 0.9047530293464661, 0.022041000425815582, -0.001623000018298626, 0.9997559785842896,
+ 0.9995980262756348, -0.01155600044876337, 0.02587899938225746, 0.7095860242843628, -0.009670999832451344, -0.7045519948005676,
+ 0, 0, 1, 0, 0, 1,
+ 0.7626410126686096, -0.31482499837875366, 0.5650339722633362, 0.8245400190353394, -0.00001700000029813964, 0.5658029913902283,
+ 0.8479819893836975, -0.3500339984893799, -0.39799800515174866, 0.917701005935669, -0.00003300000025774352, -0.397271990776062,
+ 0.8641409873962402, -0.35644200444221497, -0.3552600145339966, 0.9352689981460571, -0.00011200000153621659, -0.3539389967918396,
+ 0.7209920287132263, -0.29793301224708557, 0.6256250143051147, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+ 0, 0, 1, 0.5833569765090942, -0.5833380222320557, 0.5651649832725525,
+ 0.648485004901886, -0.6484479904174805, -0.3987259864807129, 0.6608719825744629, -0.6607480049133301, -0.35589399933815,
+ 0.5518630146980286, -0.5517799854278564, 0.6252880096435547, 0, 0, 1,
+ 0.31482499837875366, -0.762628972530365, 0.5650510191917419, 0.35004499554634094, -0.8479880094528198, -0.39797601103782654,
+ 0.35647401213645935, -0.8641520142555237, -0.35519900918006897, 0.29798200726509094, -0.7210670113563538, 0.6255149841308594,
+ 0, 0, 1, -0.00001700000029813964, -0.8245400190353394, 0.5658029913902283,
+ -0.00003300000025774352, -0.917701005935669, -0.397271990776062, -0.00011200000153621659, -0.9352689981460571, -0.3539389967918396,
+ -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+ 0, 0, 1, -0.31482499837875366, -0.7626410126686096, 0.5650339722633362,
+ -0.00001700000029813964, -0.8245400190353394, 0.5658029913902283, -0.3500339984893799, -0.8479819893836975, -0.39799800515174866,
+ -0.00003300000025774352, -0.917701005935669, -0.397271990776062, -0.35644200444221497, -0.8641409873962402, -0.3552600145339966,
+ -0.00011200000153621659, -0.9352689981460571, -0.3539389967918396, -0.29793301224708557, -0.7209920287132263, 0.6256250143051147,
+ -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+ -0.5833380222320557, -0.5833569765090942, 0.5651649832725525, -0.6484479904174805, -0.648485004901886, -0.3987259864807129,
+ -0.6607480049133301, -0.6608719825744629, -0.35589399933815, -0.5517799854278564, -0.5518630146980286, 0.6252880096435547,
+ 0, 0, 1, -0.762628972530365, -0.31482499837875366, 0.5650510191917419,
+ -0.8479880094528198, -0.35004499554634094, -0.39797601103782654, -0.8641520142555237, -0.35647401213645935, -0.35519900918006897,
+ -0.7210670113563538, -0.29798200726509094, 0.6255149841308594, 0, 0, 1,
+ -0.8245400190353394, 0.00001700000029813964, 0.5658029913902283, -0.917701005935669, 0.00003300000025774352, -0.397271990776062,
+ -0.9352689981460571, 0.00011200000153621659, -0.3539389967918396, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+ 0, 0, 1, 0, 0, 1,
+ -0.7626410126686096, 0.31482499837875366, 0.5650339722633362, -0.8245400190353394, 0.00001700000029813964, 0.5658029913902283,
+ -0.8479819893836975, 0.3500339984893799, -0.39799800515174866, -0.917701005935669, 0.00003300000025774352, -0.397271990776062,
+ -0.8641409873962402, 0.35644200444221497, -0.3552600145339966, -0.9352689981460571, 0.00011200000153621659, -0.3539389967918396,
+ -0.7209920287132263, 0.29793301224708557, 0.6256250143051147, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+ 0, 0, 1, -0.5833569765090942, 0.5833380222320557, 0.5651649832725525,
+ -0.648485004901886, 0.6484479904174805, -0.3987259864807129, -0.6608719825744629, 0.6607480049133301, -0.35589399933815,
+ -0.5518630146980286, 0.5517799854278564, 0.6252880096435547, 0, 0, 1,
+ -0.31482499837875366, 0.762628972530365, 0.5650510191917419, -0.35004499554634094, 0.8479880094528198, -0.39797601103782654,
+ -0.35647401213645935, 0.8641520142555237, -0.35519900918006897, -0.29798200726509094, 0.7210670113563538, 0.6255149841308594,
+ 0, 0, 1, 0.00001700000029813964, 0.8245400190353394, 0.5658029913902283,
+ 0.00003300000025774352, 0.917701005935669, -0.397271990776062, 0.00011200000153621659, 0.9352689981460571, -0.3539389967918396,
+ 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+ 0, 0, 1, 0.31482499837875366, 0.7626410126686096, 0.5650339722633362,
+ 0.00001700000029813964, 0.8245400190353394, 0.5658029913902283, 0.3500339984893799, 0.8479819893836975, -0.39799800515174866,
+ 0.00003300000025774352, 0.917701005935669, -0.397271990776062, 0.35644200444221497, 0.8641409873962402, -0.3552600145339966,
+ 0.00011200000153621659, 0.9352689981460571, -0.3539389967918396, 0.29793301224708557, 0.7209920287132263, 0.6256250143051147,
+ 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+ 0.5833380222320557, 0.5833569765090942, 0.5651649832725525, 0.6484479904174805, 0.648485004901886, -0.3987259864807129,
+ 0.6607480049133301, 0.6608719825744629, -0.35589399933815, 0.5517799854278564, 0.5518630146980286, 0.6252880096435547,
+ 0, 0, 1, 0.762628972530365, 0.31482499837875366, 0.5650510191917419,
+ 0.8479880094528198, 0.35004499554634094, -0.39797601103782654, 0.8641520142555237, 0.35647401213645935, -0.35519900918006897,
+ 0.7210670113563538, 0.29798200726509094, 0.6255149841308594, 0, 0, 1,
+ 0.8245400190353394, -0.00001700000029813964, 0.5658029913902283, 0.917701005935669, -0.00003300000025774352, -0.397271990776062,
+ 0.9352689981460571, -0.00011200000153621659, -0.3539389967918396, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+ 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058, 0.7209920287132263, -0.29793301224708557, 0.6256250143051147,
+ 0.21797800064086914, -0.0902160033583641, 0.9717749953269958, 0.23658299446105957, 0, 0.9716110229492188,
+ 0.1595889925956726, -0.06596100330352783, 0.9849770069122314, 0.17308400571346283, 0, 0.9849069714546204,
+ 0.3504979908466339, -0.1447400003671646, 0.9253119826316833, 0.37970298528671265, 0, 0.925108015537262,
+ 0.48558899760246277, -0.20147399604320526, 0.8506529927253723, 0.5266720056533813, 0, 0.8500679731369019,
+ 0.5518630146980286, -0.5517799854278564, 0.6252880096435547, 0.16663099825382233, -0.16663099825382233, 0.9718379974365234,
+ 0.12190800160169601, -0.12190800160169601, 0.9850260019302368, 0.2676680088043213, -0.2676680088043213, 0.9255849719047546,
+ 0.37131500244140625, -0.37131500244140625, 0.8510289788246155, 0.29798200726509094, -0.7210670113563538, 0.6255149841308594,
+ 0.0902160033583641, -0.21797800064086914, 0.9717749953269958, 0.06596100330352783, -0.1595889925956726, 0.9849770069122314,
+ 0.1447400003671646, -0.3504979908466339, 0.9253119826316833, 0.20147399604320526, -0.48558899760246277, 0.8506529927253723,
+ -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, -0.23658299446105957, 0.9716110229492188,
+ 0, -0.17308400571346283, 0.9849069714546204, 0, -0.37970298528671265, 0.925108015537262,
+ 0, -0.5266720056533813, 0.8500679731369019, -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894,
+ -0.29793301224708557, -0.7209920287132263, 0.6256250143051147, -0.0902160033583641, -0.21797800064086914, 0.9717749953269958,
+ 0, -0.23658299446105957, 0.9716110229492188, -0.06596100330352783, -0.1595889925956726, 0.9849770069122314,
+ 0, -0.17308400571346283, 0.9849069714546204, -0.1447400003671646, -0.3504979908466339, 0.9253119826316833,
+ 0, -0.37970298528671265, 0.925108015537262, -0.20147399604320526, -0.48558899760246277, 0.8506529927253723,
+ 0, -0.5266720056533813, 0.8500679731369019, -0.5517799854278564, -0.5518630146980286, 0.6252880096435547,
+ -0.16663099825382233, -0.16663099825382233, 0.9718379974365234, -0.12190800160169601, -0.12190800160169601, 0.9850260019302368,
+ -0.2676680088043213, -0.2676680088043213, 0.9255849719047546, -0.37131500244140625, -0.37131500244140625, 0.8510289788246155,
+ -0.7210670113563538, -0.29798200726509094, 0.6255149841308594, -0.21797800064086914, -0.0902160033583641, 0.9717749953269958,
+ -0.1595889925956726, -0.06596100330352783, 0.9849770069122314, -0.3504979908466339, -0.1447400003671646, 0.9253119826316833,
+ -0.48558899760246277, -0.20147399604320526, 0.8506529927253723, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+ -0.23658299446105957, 0, 0.9716110229492188, -0.17308400571346283, 0, 0.9849069714546204,
+ -0.37970298528671265, 0, 0.925108015537262, -0.5266720056533813, 0, 0.8500679731369019,
+ -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894, -0.7209920287132263, 0.29793301224708557, 0.6256250143051147,
+ -0.21797800064086914, 0.0902160033583641, 0.9717749953269958, -0.23658299446105957, 0, 0.9716110229492188,
+ -0.1595889925956726, 0.06596100330352783, 0.9849770069122314, -0.17308400571346283, 0, 0.9849069714546204,
+ -0.3504979908466339, 0.1447400003671646, 0.9253119826316833, -0.37970298528671265, 0, 0.925108015537262,
+ -0.48558899760246277, 0.20147399604320526, 0.8506529927253723, -0.5266720056533813, 0, 0.8500679731369019,
+ -0.5518630146980286, 0.5517799854278564, 0.6252880096435547, -0.16663099825382233, 0.16663099825382233, 0.9718379974365234,
+ -0.12190800160169601, 0.12190800160169601, 0.9850260019302368, -0.2676680088043213, 0.2676680088043213, 0.9255849719047546,
+ -0.37131500244140625, 0.37131500244140625, 0.8510289788246155, -0.29798200726509094, 0.7210670113563538, 0.6255149841308594,
+ -0.0902160033583641, 0.21797800064086914, 0.9717749953269958, -0.06596100330352783, 0.1595889925956726, 0.9849770069122314,
+ -0.1447400003671646, 0.3504979908466339, 0.9253119826316833, -0.20147399604320526, 0.48558899760246277, 0.8506529927253723,
+ 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0.23658299446105957, 0.9716110229492188,
+ 0, 0.17308400571346283, 0.9849069714546204, 0, 0.37970298528671265, 0.925108015537262,
+ 0, 0.5266720056533813, 0.8500679731369019, 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894,
+ 0.29793301224708557, 0.7209920287132263, 0.6256250143051147, 0.0902160033583641, 0.21797800064086914, 0.9717749953269958,
+ 0, 0.23658299446105957, 0.9716110229492188, 0.06596100330352783, 0.1595889925956726, 0.9849770069122314,
+ 0, 0.17308400571346283, 0.9849069714546204, 0.1447400003671646, 0.3504979908466339, 0.9253119826316833,
+ 0, 0.37970298528671265, 0.925108015537262, 0.20147399604320526, 0.48558899760246277, 0.8506529927253723,
+ 0, 0.5266720056533813, 0.8500679731369019, 0.5517799854278564, 0.5518630146980286, 0.6252880096435547,
+ 0.16663099825382233, 0.16663099825382233, 0.9718379974365234, 0.12190800160169601, 0.12190800160169601, 0.9850260019302368,
+ 0.2676680088043213, 0.2676680088043213, 0.9255849719047546, 0.37131500244140625, 0.37131500244140625, 0.8510289788246155,
+ 0.7210670113563538, 0.29798200726509094, 0.6255149841308594, 0.21797800064086914, 0.0902160033583641, 0.9717749953269958,
+ 0.1595889925956726, 0.06596100330352783, 0.9849770069122314, 0.3504979908466339, 0.1447400003671646, 0.9253119826316833,
+ 0.48558899760246277, 0.20147399604320526, 0.8506529927253723, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+ 0.23658299446105957, 0, 0.9716110229492188, 0.17308400571346283, 0, 0.9849069714546204,
+ 0.37970298528671265, 0, 0.925108015537262, 0.5266720056533813, 0, 0.8500679731369019 };
+
+float teapotTangents[] = { 0.012897999957203865, 0.998727023601532, -0.048757001757621765, 0.3861910104751587, 0.9210079908370972, -0.016421999782323837,
+ 0.38136398792266846, 0.9230089783668518, 0.000155999994603917, 0.012866999953985214, 0.9987300038337708, 0.04870200157165527,
+ 0.3750790059566498, 0.9061710238456726, -0.0007169999880716205, 0.19210100173950195, 0.9812139868736267, 0.01775900088250637,
+ 0.3782620131969452, 0.9142940044403076, -0.00011300000187475234, 0.10451500117778778, 0.9897350072860718, -0.09747499972581863,
+ 0.3655939996242523, 0.9257190227508545, 0.028463000431656837, 0.04767199978232384, 0.9953050017356873, -0.08423800021409988,
+ 0.7092679738998413, 0.7031199932098389, -0.016364000737667084, 0.7061989903450012, 0.7061989903450012, 0,
+ 0.6937360167503357, 0.6937360167503357, 0, 0.6997770071029663, 0.6997770071029663, 0,
+ 0.6924030184745789, 0.7150859832763672, 0.02822900004684925, 0.9243540167808533, 0.37810400128364563, -0.01657800003886223,
+ 0.9230089783668518, 0.38136398792266846, -0.000155999994603917, 0.9061710238456726, 0.3750790059566498, 0.0007169999880716205,
+ 0.9142940044403076, 0.3782620131969452, 0.00011300000187475234, 0.9133660197257996, 0.39544400572776794, 0.028490999713540077,
+ 0.9987040162086487, 0.015853000804781914, 0.04836999997496605, 0.9987369775772095, 0.014649000018835068, -0.04806999862194061,
+ 0.9812150001525879, 0.19211700558662415, -0.01754000037908554, 0.9897350072860718, 0.10452800244092941, 0.09745799750089645,
+ 0.9953050017356873, 0.04767199978232384, 0.08423800021409988, 0.9988179802894592, -0.009758999571204185, -0.047600001096725464,
+ 0.9094679951667786, -0.4095839858055115, -0.012636999599635601, 0.9240090250968933, -0.3811509907245636, -0.0003150000120513141,
+ 0.9987890124320984, -0.01066299993544817, 0.04801800101995468, 0.9072269797325134, -0.37142300605773926, 0.0207310002297163,
+ 0.9814350008964539, -0.19095200300216675, 0.01795700006186962, 0.914870023727417, -0.3771440088748932, -0.0011480000102892518,
+ 0.989749014377594, -0.10442499816417694, -0.09742700308561325, 0.925815999507904, -0.3653950095176697, 0.028308000415563583,
+ 0.9953050017356873, -0.04767199978232384, -0.08423800021409988, 0.6768929958343506, -0.7314029932022095, -0.01988700032234192,
+ 0.6994619965553284, -0.7145140171051025, -0.00029799999902024865, 0.6940590143203735, -0.6933979988098145, 0.015560000203549862,
+ 0.7002580165863037, -0.6996300220489502, -0.000783999974373728, 0.715142011642456, -0.6923869848251343, 0.028078999370336533,
+ 0.351936012506485, -0.933899998664856, -0.019843999296426773, 0.36654001474380493, -0.9298419952392578, -0.0005210000090301037,
+ 0.37116900086402893, -0.9084830284118652, 0.00152299995534122, 0.3776479959487915, -0.9147650003433228, -0.00011000000085914508,
+ 0.39533698558807373, -0.9134349822998047, 0.028410999104380608, 0.0013210000470280647, -0.9989479780197144, 0.045830998569726944,
+ 0.003897000104188919, -0.9988909959793091, -0.04690299928188324, 0.18705999851226807, -0.9821630120277405, -0.018818000331521034,
+ 0.10363999754190445, -0.9898579716682434, 0.09715499728918076, 0.04757700115442276, -0.9953129887580872, 0.08418799936771393,
+ -0.02296699956059456, -0.9986780285835266, -0.04599199816584587, -0.3861910104751587, -0.9210079908370972, -0.016421999782323837,
+ -0.38136398792266846, -0.9230089783668518, 0.000155999994603917, -0.020431000739336014, -0.9987260103225708, 0.04614400118589401,
+ -0.3750790059566498, -0.9061710238456726, -0.0007169999880716205, -0.19216600060462952, -0.9812189936637878, 0.01677200011909008,
+ -0.3782620131969452, -0.9142940044403076, -0.00011300000187475234, -0.10471200197935104, -0.9897390007972717, -0.09722500294446945,
+ -0.3655939996242523, -0.9257190227508545, 0.028463000431656837, -0.047710999846458435, -0.9953050017356873, -0.08420699834823608,
+ -0.7092679738998413, -0.7031199932098389, -0.016364000737667084, -0.7061989903450012, -0.7061989903450012, 0,
+ -0.6937360167503357, -0.6937360167503357, 0, -0.6997770071029663, -0.6997770071029663, 0,
+ -0.6924030184745789, -0.7150859832763672, 0.02822900004684925, -0.9243540167808533, -0.37810400128364563, -0.01657800003886223,
+ -0.9230089783668518, -0.38136398792266846, -0.000155999994603917, -0.9061710238456726, -0.3750790059566498, 0.0007169999880716205,
+ -0.9142940044403076, -0.3782620131969452, 0.00011300000187475234, -0.9133660197257996, -0.39544400572776794, 0.028490999713540077,
+ -0.998727023601532, -0.012897999957203865, 0.048757001757621765, -0.9987300038337708, -0.012866999953985214, -0.04870200157165527,
+ -0.9812139868736267, -0.19210100173950195, -0.01775900088250637, -0.9897350072860718, -0.10451500117778778, 0.09747499972581863,
+ -0.9953050017356873, -0.04767199978232384, 0.08423800021409988, -0.998727023601532, 0.012897999957203865, -0.048757001757621765,
+ -0.9210079908370972, 0.3861910104751587, -0.016421999782323837, -0.9230089783668518, 0.38136398792266846, 0.000155999994603917,
+ -0.9987300038337708, 0.012866999953985214, 0.04870200157165527, -0.9061710238456726, 0.3750790059566498, -0.0007169999880716205,
+ -0.9812139868736267, 0.19210100173950195, 0.01775900088250637, -0.9142940044403076, 0.3782620131969452, -0.00011300000187475234,
+ -0.9897350072860718, 0.10451500117778778, -0.09747499972581863, -0.9257190227508545, 0.3655939996242523, 0.028463000431656837,
+ -0.9953050017356873, 0.04767199978232384, -0.08423800021409988, -0.7031199932098389, 0.7092679738998413, -0.016364000737667084,
+ -0.7061989903450012, 0.7061989903450012, 0, -0.6937360167503357, 0.6937360167503357, 0,
+ -0.6997770071029663, 0.6997770071029663, 0, -0.7150859832763672, 0.6924030184745789, 0.02822900004684925,
+ -0.37810400128364563, 0.9243540167808533, -0.01657800003886223, -0.38136398792266846, 0.9230089783668518, -0.000155999994603917,
+ -0.3750790059566498, 0.9061710238456726, 0.0007169999880716205, -0.3782620131969452, 0.9142940044403076, 0.00011300000187475234,
+ -0.39544400572776794, 0.9133660197257996, 0.028490999713540077, -0.012897999957203865, 0.998727023601532, 0.048757001757621765,
+ -0.012866999953985214, 0.9987300038337708, -0.04870200157165527, -0.19210100173950195, 0.9812139868736267, -0.01775900088250637,
+ -0.10451500117778778, 0.9897350072860718, 0.09747499972581863, -0.04767199978232384, 0.9953050017356873, 0.08423800021409988,
+ 0.04767199978232384, 0.9953050017356873, -0.08423800021409988, 0.39544400572776794, 0.9133660197257996, -0.028490999713540077,
+ 0.38111698627471924, 0.9210190176963806, -0.000015999999959603883, 0.031922999769449234, 0.9968529939651489, -0.07255599647760391,
+ 0.3815299868583679, 0.9219080209732056, 0.0000019999999949504854, 0.022261999547481537, 0.9978039860725403, -0.06237399950623512,
+ 0.3821389973163605, 0.9231889843940735, 0.00001700000029813964, 0.008317999541759491, 0.9991790056228638, -0.03964800015091896,
+ 0.38228899240493774, 0.9239469766616821, -0.004430000204592943, 0.0008660000166855752, 0.9999139904975891, 0.013048999942839146,
+ 0.7150859832763672, 0.6924030184745789, -0.02822900004684925, 0.7048519849777222, 0.7048519849777222, 0,
+ 0.7055330276489258, 0.7055330276489258, 0, 0.7065179944038391, 0.7065179944038391, 0,
+ 0.7068390250205994, 0.707252025604248, -0.004379999823868275, 0.9257190227508545, 0.3655939996242523, -0.028463000431656837,
+ 0.9210180044174194, 0.38111698627471924, 0.000015999999959603883, 0.9219080209732056, 0.3815299868583679, -0.0000019999999949504854,
+ 0.9231889843940735, 0.3821389973163605, -0.00001700000029813964, 0.9237229824066162, 0.38283199071884155, -0.004399999976158142,
+ 0.9953050017356873, 0.04767199978232384, 0.08423800021409988, 0.9968529939651489, 0.031922999769449234, 0.07255599647760391,
+ 0.9978039860725403, 0.022261999547481537, 0.06237399950623512, 0.9991790056228638, 0.008317999541759491, 0.03964800015091896,
+ 0.9999139904975891, 0.0008660000166855752, -0.013048999942839146, 0.9953050017356873, -0.04767199978232384, -0.08423800021409988,
+ 0.9135000109672546, -0.3951619863510132, -0.02861100062727928, 0.9210190176963806, -0.38111698627471924, -0.000015999999959603883,
+ 0.9968529939651489, -0.031922999769449234, -0.07255599647760391, 0.9219080209732056, -0.3815299868583679, 0.0000019999999949504854,
+ 0.9978039860725403, -0.022261999547481537, -0.06237399950623512, 0.9231889843940735, -0.3821389973163605, 0.00001700000029813964,
+ 0.9991790056228638, -0.008317999541759491, -0.03964800015091896, 0.9239469766616821, -0.38228899240493774, -0.004430000204592943,
+ 0.9999139904975891, -0.0008660000166855752, 0.013048999942839146, 0.6925899982452393, -0.7149369716644287, -0.028262000530958176,
+ 0.7048519849777222, -0.7048519849777222, 0, 0.7055330276489258, -0.7055330276489258, 0,
+ 0.7065179944038391, -0.7065179944038391, 0, 0.707252025604248, -0.7068390250205994, -0.004379999823868275,
+ 0.3656100034713745, -0.9257280230522156, -0.02841299958527088, 0.38111698627471924, -0.9210180044174194, 0.000015999999959603883,
+ 0.3815299868583679, -0.9219080209732056, -0.0000019999999949504854, 0.3821389973163605, -0.9231889843940735, -0.00001700000029813964,
+ 0.38283199071884155, -0.9237229824066162, -0.004399999976158142, 0.04757700115442276, -0.9953129887580872, 0.08418799936771393,
+ 0.031922999769449234, -0.9968529939651489, 0.07255599647760391, 0.022261999547481537, -0.9978039860725403, 0.06237399950623512,
+ 0.008317999541759491, -0.9991790056228638, 0.03964800015091896, 0.0008660000166855752, -0.9999139904975891, -0.013048999942839146,
+ -0.047710999846458435, -0.9953050017356873, -0.08420699834823608, -0.39544400572776794, -0.9133660197257996, -0.028490999713540077,
+ -0.38111698627471924, -0.9210190176963806, -0.000015999999959603883, -0.031922999769449234, -0.9968529939651489, -0.07255599647760391,
+ -0.3815299868583679, -0.9219080209732056, 0.0000019999999949504854, -0.022261999547481537, -0.9978039860725403, -0.06237399950623512,
+ -0.3821389973163605, -0.9231889843940735, 0.00001700000029813964, -0.008317999541759491, -0.9991790056228638, -0.03964800015091896,
+ -0.38228899240493774, -0.9239469766616821, -0.004430000204592943, -0.0008660000166855752, -0.9999139904975891, 0.013048999942839146,
+ -0.7150859832763672, -0.6924030184745789, -0.02822900004684925, -0.7048519849777222, -0.7048519849777222, 0,
+ -0.7055330276489258, -0.7055330276489258, 0, -0.7065179944038391, -0.7065179944038391, 0,
+ -0.7068390250205994, -0.707252025604248, -0.004379999823868275, -0.9257190227508545, -0.3655939996242523, -0.028463000431656837,
+ -0.9210180044174194, -0.38111698627471924, 0.000015999999959603883, -0.9219080209732056, -0.3815299868583679, -0.0000019999999949504854,
+ -0.9231889843940735, -0.3821389973163605, -0.00001700000029813964, -0.9237229824066162, -0.38283199071884155, -0.004399999976158142,
+ -0.9953050017356873, -0.04767199978232384, 0.08423800021409988, -0.9968529939651489, -0.031922999769449234, 0.07255599647760391,
+ -0.9978039860725403, -0.022261999547481537, 0.06237399950623512, -0.9991790056228638, -0.008317999541759491, 0.03964800015091896,
+ -0.9999139904975891, -0.0008660000166855752, -0.013048999942839146, -0.9953050017356873, 0.04767199978232384, -0.08423800021409988,
+ -0.9133660197257996, 0.39544400572776794, -0.028490999713540077, -0.9210190176963806, 0.38111698627471924, -0.000015999999959603883,
+ -0.9968529939651489, 0.031922999769449234, -0.07255599647760391, -0.9219080209732056, 0.3815299868583679, 0.0000019999999949504854,
+ -0.9978039860725403, 0.022261999547481537, -0.06237399950623512, -0.9231889843940735, 0.3821389973163605, 0.00001700000029813964,
+ -0.9991790056228638, 0.008317999541759491, -0.03964800015091896, -0.9239469766616821, 0.38228899240493774, -0.004430000204592943,
+ -0.9999139904975891, 0.0008660000166855752, 0.013048999942839146, -0.6924030184745789, 0.7150859832763672, -0.02822900004684925,
+ -0.7048519849777222, 0.7048519849777222, 0, -0.7055330276489258, 0.7055330276489258, 0,
+ -0.7065179944038391, 0.7065179944038391, 0, -0.707252025604248, 0.7068390250205994, -0.004379999823868275,
+ -0.3655939996242523, 0.9257190227508545, -0.028463000431656837, -0.38111698627471924, 0.9210180044174194, 0.000015999999959603883,
+ -0.3815299868583679, 0.9219080209732056, -0.0000019999999949504854, -0.3821389973163605, 0.9231889843940735, -0.00001700000029813964,
+ -0.38283199071884155, 0.9237229824066162, -0.004399999976158142, -0.04767199978232384, 0.9953050017356873, 0.08423800021409988,
+ -0.031922999769449234, 0.9968529939651489, 0.07255599647760391, -0.022261999547481537, 0.9978039860725403, 0.06237399950623512,
+ -0.008317999541759491, 0.9991790056228638, 0.03964800015091896, -0.0008660000166855752, 0.9999139904975891, -0.013048999942839146,
+ 0.0008660000166855752, 0.9999139904975891, 0.013048999942839146, 0.38283199071884155, 0.9237229824066162, 0.004399999976158142,
+ 0.38101500272750854, 0.9204739928245544, -0.00003899999865097925, 0.03731299936771393, 0.9963229894638062, 0.07712399959564209,
+ 0.37877199053764343, 0.9154880046844482, 0.00008399999933317304, 0.09151100367307663, 0.9910060167312622, 0.097632996737957,
+ 0.378387987613678, 0.9145749807357788, 0.00009999999747378752, 0.10134600102901459, 0.9900450110435486, 0.09767600148916245,
+ 0.356795996427536, 0.9266510009765625, -0.03188199922442436, 0.07246600091457367, 0.9928709864616394, 0.09463199973106384,
+ 0.707252025604248, 0.7068390250205994, 0.004379999823868275, 0.7044739723205566, 0.7044739723205566, 0,
+ 0.7006790041923523, 0.7006790041923523, 0, 0.6999930143356323, 0.6999930143356323, 0,
+ 0.6847820281982422, 0.7192310094833374, -0.03167999908328056, 0.9239469766616821, 0.38228899240493774, 0.004430000204592943,
+ 0.9204739928245544, 0.38101500272750854, 0.00003899999865097925, 0.9154880046844482, 0.37877199053764343, -0.00008399999933317304,
+ 0.9145749807357788, 0.378387987613678, -0.00009999999747378752, 0.9078760147094727, 0.40216198563575745, -0.03206299990415573,
+ 0.9999139904975891, 0.0008660000166855752, -0.013048999942839146, 0.9963229894638062, 0.03731299936771393, -0.07712399959564209,
+ 0.9910060167312622, 0.09151100367307663, -0.097632996737957, 0.9900450110435486, 0.10134600102901459, -0.09767600148916245,
+ 0.9928709864616394, 0.07246600091457367, -0.09463199973106384, 0.9999139904975891, -0.0008660000166855752, 0.013048999942839146,
+ 0.9237229824066162, -0.38283199071884155, 0.004399999976158142, 0.9204739928245544, -0.38101500272750854, -0.00003899999865097925,
+ 0.9963229894638062, -0.03731299936771393, 0.07712399959564209, 0.9154880046844482, -0.37877199053764343, 0.00008399999933317304,
+ 0.9910060167312622, -0.09151100367307663, 0.097632996737957, 0.9145749807357788, -0.378387987613678, 0.00009999999747378752,
+ 0.9900450110435486, -0.10134600102901459, 0.09767600148916245, 0.9266510009765625, -0.356795996427536, -0.03188199922442436,
+ 0.9928709864616394, -0.07246600091457367, 0.09463199973106384, 0.7068390250205994, -0.707252025604248, 0.004379999823868275,
+ 0.7044739723205566, -0.7044739723205566, 0, 0.7006790041923523, -0.7006790041923523, 0,
+ 0.6999930143356323, -0.6999930143356323, 0, 0.7192310094833374, -0.6847820281982422, -0.03167999908328056,
+ 0.38228899240493774, -0.9239469766616821, 0.004430000204592943, 0.38101500272750854, -0.9204739928245544, 0.00003899999865097925,
+ 0.37877199053764343, -0.9154880046844482, -0.00008399999933317304, 0.378387987613678, -0.9145749807357788, -0.00009999999747378752,
+ 0.40216198563575745, -0.9078760147094727, -0.03206299990415573, 0.0008660000166855752, -0.9999139904975891, -0.013048999942839146,
+ 0.03731299936771393, -0.9963229894638062, -0.07712399959564209, 0.09151100367307663, -0.9910060167312622, -0.097632996737957,
+ 0.10134600102901459, -0.9900450110435486, -0.09767600148916245, 0.07246600091457367, -0.9928709864616394, -0.09463199973106384,
+ -0.0008660000166855752, -0.9999139904975891, 0.013048999942839146, -0.38283199071884155, -0.9237229824066162, 0.004399999976158142,
+ -0.38101500272750854, -0.9204739928245544, -0.00003899999865097925, -0.03731299936771393, -0.9963229894638062, 0.07712399959564209,
+ -0.37877199053764343, -0.9154880046844482, 0.00008399999933317304, -0.09151100367307663, -0.9910060167312622, 0.097632996737957,
+ -0.378387987613678, -0.9145749807357788, 0.00009999999747378752, -0.10134600102901459, -0.9900450110435486, 0.09767600148916245,
+ -0.356795996427536, -0.9266510009765625, -0.03188199922442436, -0.07246600091457367, -0.9928709864616394, 0.09463199973106384,
+ -0.707252025604248, -0.7068390250205994, 0.004379999823868275, -0.7044739723205566, -0.7044739723205566, 0,
+ -0.7006790041923523, -0.7006790041923523, 0, -0.6999930143356323, -0.6999930143356323, 0,
+ -0.6847820281982422, -0.7192310094833374, -0.03167999908328056, -0.9239469766616821, -0.38228899240493774, 0.004430000204592943,
+ -0.9204739928245544, -0.38101500272750854, 0.00003899999865097925, -0.9154880046844482, -0.37877199053764343, -0.00008399999933317304,
+ -0.9145749807357788, -0.378387987613678, -0.00009999999747378752, -0.9078760147094727, -0.40216198563575745, -0.03206299990415573,
+ -0.9999139904975891, -0.0008660000166855752, -0.013048999942839146, -0.9963229894638062, -0.03731299936771393, -0.07712399959564209,
+ -0.9910060167312622, -0.09151100367307663, -0.097632996737957, -0.9900450110435486, -0.10134600102901459, -0.09767600148916245,
+ -0.9928709864616394, -0.07246600091457367, -0.09463199973106384, -0.9999139904975891, 0.0008660000166855752, 0.013048999942839146,
+ -0.9237229824066162, 0.38283199071884155, 0.004399999976158142, -0.9204739928245544, 0.38101500272750854, -0.00003899999865097925,
+ -0.9963229894638062, 0.03731299936771393, 0.07712399959564209, -0.9154880046844482, 0.37877199053764343, 0.00008399999933317304,
+ -0.9910060167312622, 0.09151100367307663, 0.097632996737957, -0.9145749807357788, 0.378387987613678, 0.00009999999747378752,
+ -0.9900450110435486, 0.10134600102901459, 0.09767600148916245, -0.9266510009765625, 0.356795996427536, -0.03188199922442436,
+ -0.9928709864616394, 0.07246600091457367, 0.09463199973106384, -0.7068390250205994, 0.707252025604248, 0.004379999823868275,
+ -0.7044739723205566, 0.7044739723205566, 0, -0.7006790041923523, 0.7006790041923523, 0,
+ -0.6999930143356323, 0.6999930143356323, 0, -0.7192310094833374, 0.6847820281982422, -0.03167999908328056,
+ -0.38228899240493774, 0.9239469766616821, 0.004430000204592943, -0.38101500272750854, 0.9204739928245544, 0.00003899999865097925,
+ -0.37877199053764343, 0.9154880046844482, -0.00008399999933317304, -0.378387987613678, 0.9145749807357788, -0.00009999999747378752,
+ -0.40216198563575745, 0.9078760147094727, -0.03206299990415573, -0.0008660000166855752, 0.9999139904975891, -0.013048999942839146,
+ -0.03731299936771393, 0.9963229894638062, -0.07712399959564209, -0.09151100367307663, 0.9910060167312622, -0.097632996737957,
+ -0.10134600102901459, 0.9900450110435486, -0.09767600148916245, -0.07246600091457367, 0.9928709864616394, -0.09463199973106384,
+ 0.07246600091457367, 0.9928709864616394, 0.09463199973106384, 0.40216198563575745, 0.9078760147094727, 0.03206299990415573,
+ 0.37766799330711365, 0.912958025932312, 0.00018099999579135329, 0.11919300258159637, 0.9883019924163818, 0.09514500200748444,
+ 0.37516000866889954, 0.906607985496521, 0.00016799999866634607, 0.187733992934227, 0.9816380143165588, 0.03381900116801262,
+ 0.2823430001735687, 0.767549991607666, -0.1682250052690506, 0.12883399426937103, 0.6540690064430237, -0.32698601484298706,
+ 0.06457000225782394, 0.32701900601387024, -0.6666669845581055, 0, 0, -1,
+ 0.7192320227622986, 0.6847820281982422, 0.03167999908328056, 0.6987630128860474, 0.6987630128860474, 0,
+ 0.694034993648529, 0.694034993648529, 0, 0.5551990270614624, 0.6008960008621216, -0.16825300455093384,
+ 0.1854030042886734, 0.27701398730278015, -0.6666669845581055, 0.9266499876976013, 0.3567950129508972, 0.03188199922442436,
+ 0.912958025932312, 0.37766799330711365, -0.00018099999579135329, 0.906607985496521, 0.37516000866889954, -0.00016799999866634607,
+ 0.742605984210968, 0.3426159918308258, -0.1683180034160614, 0.27701398730278015, 0.1854030042886734, -0.6666669845581055,
+ 0.9928709864616394, 0.07246600091457367, -0.09463199973106384, 0.9883019924163818, 0.11919300258159637, -0.09514500200748444,
+ 0.9816370010375977, 0.187733992934227, -0.03381900116801262, 0.9811030030250549, 0.19325199723243713, -0.009519999846816063,
+ 0.49052900075912476, 0.0968559980392456, -0.5, 0.9928709864616394, -0.07246600091457367, 0.09463199973106384,
+ 0.9078760147094727, -0.40216198563575745, 0.03206299990415573, 0.912958025932312, -0.37766799330711365, 0.00018099999579135329,
+ 0.9883019924163818, -0.11919300258159637, 0.09514500200748444, 0.906607985496521, -0.37516000866889954, 0.00016799999866634607,
+ 0.9816380143165588, -0.187733992934227, 0.03381900116801262, 0.767549991607666, -0.2823430001735687, -0.1682250052690506,
+ 0.6540690064430237, -0.12883399426937103, -0.32698601484298706, 0.32701900601387024, -0.06457000225782394, -0.6666669845581055,
+ 0, 0, -1, 0.6847820281982422, -0.7192320227622986, 0.03167999908328056,
+ 0.6987630128860474, -0.6987630128860474, 0, 0.694034993648529, -0.694034993648529, 0,
+ 0.6008960008621216, -0.5551990270614624, -0.16825300455093384, 0.27701398730278015, -0.1854030042886734, -0.6666669845581055,
+ 0.3567950129508972, -0.9266499876976013, 0.03188199922442436, 0.37766799330711365, -0.912958025932312, -0.00018099999579135329,
+ 0.37516000866889954, -0.906607985496521, -0.00016799999866634607, 0.3426159918308258, -0.742605984210968, -0.1683180034160614,
+ 0.1854030042886734, -0.27701398730278015, -0.6666669845581055, 0.07246600091457367, -0.9928709864616394, -0.09463199973106384,
+ 0.11919300258159637, -0.9883019924163818, -0.09514500200748444, 0.187733992934227, -0.9816370010375977, -0.03381900116801262,
+ 0.19325199723243713, -0.9811030030250549, -0.009519999846816063, 0.0968559980392456, -0.49052900075912476, -0.5,
+ -0.07246600091457367, -0.9928709864616394, 0.09463199973106384, -0.40216198563575745, -0.9078760147094727, 0.03206299990415573,
+ -0.37766799330711365, -0.912958025932312, 0.00018099999579135329, -0.11919300258159637, -0.9883019924163818, 0.09514500200748444,
+ -0.37516000866889954, -0.906607985496521, 0.00016799999866634607, -0.187733992934227, -0.9816380143165588, 0.03381900116801262,
+ -0.2823430001735687, -0.767549991607666, -0.1682250052690506, -0.12883399426937103, -0.6540690064430237, -0.32698601484298706,
+ -0.06457000225782394, -0.32701900601387024, -0.6666669845581055, 0, 0, -1,
+ -0.7192320227622986, -0.6847820281982422, 0.03167999908328056, -0.6987630128860474, -0.6987630128860474, 0,
+ -0.694034993648529, -0.694034993648529, 0, -0.5551990270614624, -0.6008960008621216, -0.16825300455093384,
+ -0.1854030042886734, -0.27701398730278015, -0.6666669845581055, -0.9266499876976013, -0.3567950129508972, 0.03188199922442436,
+ -0.912958025932312, -0.37766799330711365, -0.00018099999579135329, -0.906607985496521, -0.37516000866889954, -0.00016799999866634607,
+ -0.742605984210968, -0.3426159918308258, -0.1683180034160614, -0.27701398730278015, -0.1854030042886734, -0.6666669845581055,
+ -0.9928709864616394, -0.07246600091457367, -0.09463199973106384, -0.9883019924163818, -0.11919300258159637, -0.09514500200748444,
+ -0.9816370010375977, -0.187733992934227, -0.03381900116801262, -0.9811030030250549, -0.19325199723243713, -0.009519999846816063,
+ -0.49052900075912476, -0.0968559980392456, -0.5, -0.9928709864616394, 0.07246600091457367, 0.09463199973106384,
+ -0.9078760147094727, 0.40216198563575745, 0.03206299990415573, -0.912958025932312, 0.37766799330711365, 0.00018099999579135329,
+ -0.9883019924163818, 0.11919300258159637, 0.09514500200748444, -0.906607985496521, 0.37516000866889954, 0.00016799999866634607,
+ -0.9816380143165588, 0.187733992934227, 0.03381900116801262, -0.767549991607666, 0.2823430001735687, -0.1682250052690506,
+ -0.6540690064430237, 0.12883399426937103, -0.32698601484298706, -0.32701900601387024, 0.06457000225782394, -0.6666669845581055,
+ 0, 0, -1, -0.6847820281982422, 0.7192320227622986, 0.03167999908328056,
+ -0.6987630128860474, 0.6987630128860474, 0, -0.694034993648529, 0.694034993648529, 0,
+ -0.6008960008621216, 0.5551990270614624, -0.16825300455093384, -0.27701398730278015, 0.1854030042886734, -0.6666669845581055,
+ -0.3567950129508972, 0.9266499876976013, 0.03188199922442436, -0.37766799330711365, 0.912958025932312, -0.00018099999579135329,
+ -0.37516000866889954, 0.906607985496521, -0.00016799999866634607, -0.3426159918308258, 0.742605984210968, -0.1683180034160614,
+ -0.1854030042886734, 0.27701398730278015, -0.6666669845581055, -0.07246600091457367, 0.9928709864616394, -0.09463199973106384,
+ -0.11919300258159637, 0.9883019924163818, -0.09514500200748444, -0.187733992934227, 0.9816370010375977, -0.03381900116801262,
+ -0.19325199723243713, 0.9811030030250549, -0.009519999846816063, -0.0968559980392456, 0.49052900075912476, -0.5,
+ -0.006597999949008226, 0.9961680173873901, 0.0001630000042496249, -0.043907999992370605, 0.779125988483429, -0.55936598777771,
+ 0.23287899792194366, 0.79271000623703, -0.506534993648529, 0.11139900237321854, 0.9923329949378967, 0.0053449999541044235,
+ 0.4521920084953308, 0.7370989918708801, -0.42180201411247253, 0.17797799408435822, 0.9827970266342163, 0.036841001361608505,
+ 0.6075379848480225, 0.7066869735717773, -0.270797997713089, 0.11894699931144714, 0.9864829778671265, 0.10517799854278564,
+ 0.6583719849586487, 0.7438470125198364, -0.06727500259876251, 0.0010629999451339245, 0.99891597032547, 0.04653400182723999,
+ -0.1622990071773529, -0.14869500696659088, -0.9069569706916809, 0.3020159900188446, -0.014301000162959099, -0.8847119808197021,
+ 0.7048640251159668, -0.042514998465776443, -0.6788020133972168, 0.8948519825935364, -0.11078000068664551, -0.38824599981307983,
+ 0.9622920155525208, -0.09367900341749191, -0.14349600672721863, -0.12511900067329407, -0.8479049801826477, -0.4783349931240082,
+ 0.11315400153398514, -0.8153669834136963, -0.5167160034179688, 0.3956319987773895, -0.7910019755363464, -0.4345270097255707,
+ 0.5244609713554382, -0.8012329936027527, -0.2643829882144928, 0.571465015411377, -0.7902160286903381, -0.12332800030708313,
+ -0.0943560004234314, -0.9955379962921143, -0.0010989999864250422, 0.012040999718010426, -0.9965500235557556, 0,
+ 0.09501499682664871, -0.9936969876289368, 0.02440500073134899, 0.03737499937415123, -0.9978089928627014, 0.035909999161958694,
+ -0.0008800000068731606, -0.9973530173301697, -0.04031199961900711, 0.007164000067859888, -0.9961649775505066, -0.00002700000004551839,
+ 0.043988000601530075, -0.8330309987068176, 0.4691329896450043, -0.2334270030260086, -0.7983189821243286, 0.49840399622917175,
+ -0.10737399756908417, -0.9927549958229065, -0.007029999978840351, -0.45147499442100525, -0.7576299905776978, 0.39375001192092896,
+ -0.15364399552345276, -0.9863160252571106, -0.048294998705387115, -0.5575600266456604, -0.7753210067749023, 0.2001740038394928,
+ -0.07242999970912933, -0.9923030138015747, -0.08845999836921692, -0.5877019762992859, -0.8041930198669434, 0.04768599942326546,
+ 0.0005830000154674053, -0.9997940063476562, -0.020301999524235725, 0.13663700222969055, -0.14665700495243073, 0.8966140151023865,
+ -0.3045389950275421, -0.012237999588251114, 0.8833180069923401, -0.7020289897918701, -0.033987998962402344, 0.6724730134010315,
+ -0.8890330195426941, -0.09636799991130829, 0.37605398893356323, -0.9668099880218506, -0.08601800352334976, 0.1358419954776764,
+ 0.12022499740123749, 0.7918559908866882, 0.5693140029907227, -0.11313500255346298, 0.8111780285835266, 0.5236610174179077,
+ -0.39790698885917664, 0.7734419703483582, 0.45853298902511597, -0.5793390274047852, 0.7346490025520325, 0.32973799109458923,
+ -0.6447499990463257, 0.7340419888496399, 0.12459299713373184, 0.09378799796104431, 0.9955919981002808, 0.000944000028539449,
+ -0.01607999950647354, 0.9964879751205444, 0.00035600000410340726, -0.11933200061321259, 0.9912199974060059, -0.01737299934029579,
+ -0.08618299663066864, 0.9940080046653748, -0.053598999977111816, -0.004110999871045351, 0.9980229735374451, 0.015703000128269196,
+ 0.010142000392079353, 0.9933879971504211, 0.10034400224685669, 0.6597890257835388, 0.7114480137825012, 0.12964099645614624,
+ 0.5634239912033081, 0.7594000101089478, 0.289902001619339, -0.021227000281214714, 0.9976930022239685, 0.05189099907875061,
+ 0.3972559869289398, 0.7709670066833496, 0.45872700214385986, -0.05054600164294243, 0.9957669973373413, 0.060869000852108,
+ 0.11805199831724167, 0.7611619830131531, 0.5692800283432007, -0.11414600163698196, 0.9869359731674194, 0.08862999826669693,
+ -0.0012870000209659338, 0.7195389866828918, 0.6293820142745972, -0.18971200287342072, 0.9752820134162903, 0.11328700184822083,
+ 0.9685969948768616, -0.08966200053691864, 0.13331100344657898, 0.8902140259742737, -0.051961999386548996, 0.39323100447654724,
+ 0.6728280186653137, -0.050324998795986176, 0.6965069770812988, 0.25133201479911804, -0.04306900128722191, 0.9169719815254211,
+ -0.19813700020313263, -0.2512879967689514, 0.9046909809112549, 0.5937719941139221, -0.8024669885635376, 0.03307799994945526,
+ 0.5571249723434448, -0.7907459735870361, 0.2022089958190918, 0.4313510060310364, -0.8083119988441467, 0.37996000051498413,
+ 0.19395600259304047, -0.8197799921035767, 0.5133119821548462, -0.1517219990491867, -0.8084930181503296, 0.5055829882621765,
+ 0.0035200000274926424, -0.9997940063476562, 0.019979000091552734, 0.01159599982202053, -0.9981369972229004, -0.02326199971139431,
+ 0.01310999970883131, -0.9988970160484314, -0.008480999618768692, -0.02485400065779686, -0.9978809952735901, 0.021263999864459038,
+ -0.11335399746894836, -0.9881970286369324, 0.06441199779510498, -0.0035459999926388264, -0.9954169988632202, -0.07682599872350693,
+ -0.5816869735717773, -0.7760900259017944, -0.13957500457763672, -0.5260769724845886, -0.790789008140564, -0.2781960070133209,
+ 0.017288999632000923, -0.9983699917793274, -0.03728000074625015, -0.36800798773765564, -0.7982890009880066, -0.4405499994754791,
+ 0.03743100166320801, -0.9973520040512085, -0.03640099987387657, -0.09636899828910828, -0.7829139828681946, -0.5500450134277344,
+ 0.10426300019025803, -0.9894949793815613, -0.06746900081634521, 0.10083399713039398, -0.8161320090293884, -0.48112401366233826,
+ 0.18510299921035767, -0.9776470065116882, -0.09971100091934204, -0.9615049958229065, -0.08203399926424026, -0.14958199858665466,
+ -0.8876789808273315, -0.04622500017285347, -0.39955899119377136, -0.6675580143928528, -0.03723999857902527, -0.7007560133934021,
+ -0.245511993765831, -0.03216199949383736, -0.9151920080184937, 0.15477199852466583, -0.24929499626159668, -0.8975690007209778,
+ -0.6700729727745056, 0.7402250170707703, -0.01942499913275242, -0.5923460125923157, 0.7624830007553101, -0.21566900610923767,
+ -0.45611900091171265, 0.7868310213088989, -0.39906400442123413, -0.21001900732517242, 0.8031420111656189, -0.5333020091056824,
+ 0.05119999870657921, 0.7096909880638123, -0.6591699719429016, -0.014175999909639359, 0.9989240169525146, -0.04416000097990036,
+ -0.0065449997782707214, 0.9983869791030884, 0.008813999593257904, 0.0023960000835359097, 0.9989259839057922, -0.016711000353097916,
+ 0.03813000023365021, 0.9969249963760376, -0.04171599820256233, 0.11744900047779083, 0.986670970916748, -0.0799890011548996,
+ -0.02072799950838089, -0.997963011264801, 0.0017740000039339066, 0.10236400365829468, -0.695684015750885, -0.6961740255355835,
+ 0.28174999356269836, -0.7065439820289612, -0.6379269957542419, -0.027713999152183533, -0.9983959794044495, -0.016395000740885735,
+ 0.4621469974517822, -0.7501789927482605, -0.43765199184417725, -0.014942999929189682, -0.9960020184516907, -0.04751100018620491,
+ 0.6121799945831299, -0.7355859875679016, -0.1658719927072525, 0.08200599998235703, -0.9833409786224365, 0.11102399975061417,
+ 0.7232419848442078, -0.6012910008430481, -0.14595800638198853, 0.32238098978996277, -0.9036369919776917, 0.28197699785232544,
+ 0.1188960000872612, 0.09661199897527695, -0.9692260026931763, 0.3230240046977997, 0.06791900098323822, -0.9069269895553589,
+ 0.6287810206413269, 0.00962899997830391, -0.711097002029419, 0.8952469825744629, -0.060169998556375504, -0.3366979956626892,
+ 0.9689210057258606, -0.04508800059556961, -0.13095800578594208, 0.06500200182199478, 0.7708680033683777, -0.6083509922027588,
+ 0.1816529929637909, 0.7457069754600525, -0.593995988368988, 0.37600401043891907, 0.7467949986457825, -0.4776870012283325,
+ 0.6288849711418152, 0.7020969986915588, -0.27160701155662537, 0.8230010271072388, 0.5295370221138, -0.09450399875640869,
+ -0.12820099294185638, 0.9899809956550598, -0.05917999893426895, -0.11097600311040878, 0.9872509837150574, -0.09937400370836258,
+ -0.06767299771308899, 0.9865689873695374, -0.1427209973335266, -0.0003349999897181988, 0.9967420101165771, 0.025443999096751213,
+ 0.29019099473953247, 0.9243509769439697, 0.1957239955663681, 0.07294999808073044, 0.9949049949645996, 0.03147900104522705,
+ -0.04948300123214722, 0.7695090174674988, 0.6163870096206665, -0.24193400144577026, 0.7750219702720642, 0.5679330229759216,
+ 0.05620399862527847, 0.9959489703178406, 0.052143000066280365, -0.4294399917125702, 0.779321014881134, 0.41615501046180725,
+ 0.023887999355793, 0.9943940043449402, 0.07553800195455551, -0.6655910015106201, 0.6939520239830017, 0.20106400549411774,
+ -0.09678799659013748, 0.9791589975357056, -0.12869000434875488, -0.7716730237007141, 0.5443729758262634, 0.1793539971113205,
+ -0.417836993932724, 0.8721759915351868, -0.2544029951095581, -0.09499499946832657, 0.08934500068426132, 0.9787889719009399,
+ -0.3299880027770996, 0.06701900064945221, 0.9273520112037659, -0.6511250138282776, 0.023523999378085136, 0.7280719876289368,
+ -0.9116759896278381, -0.033263999968767166, 0.34162598848342896, -0.9896330237388611, -0.013496000319719315, 0.07834099978208542,
+ -0.07044100016355515, -0.6954740285873413, 0.7080140113830566, -0.21969600021839142, -0.6959800124168396, 0.6642320156097412,
+ -0.4075010120868683, -0.7370589971542358, 0.5047789812088013, -0.5866039991378784, -0.7473030090332031, 0.24636299908161163,
+ -0.799036979675293, -0.5617390275001526, 0.05794600024819374, 0.07605399936437607, -0.9967970252037048, 0.02472200058400631,
+ 0.08756300061941147, -0.9926980137825012, 0.05929899960756302, 0.07250799983739853, -0.9901790022850037, 0.11122000217437744,
+ 0.015556000173091888, -0.9970260262489319, -0.011235999874770641, -0.194814994931221, -0.9439409971237183, -0.22127500176429749,
+ 0.3417310118675232, -0.8896859884262085, 0.3012309968471527, 0.8375009894371033, -0.4931910037994385, 0.05739299952983856,
+ 0.8273029923439026, -0.4684619903564453, -0.05539099872112274, 0.5311300158500671, -0.8121910095214844, 0.24026300013065338,
+ 0.8069959878921509, -0.47689300775527954, 0.002638000063598156, 0.644743025302887, -0.7642210125923157, -0.015455000102519989,
+ 0.8856800198554993, -0.4464530050754547, 0.047488000243902206, -0.011536000296473503, -0.999845027923584, -0.0008730000117793679,
+ 0.7597830295562744, -0.6229599714279175, 0.026636000722646713, 0.321245014667511, -0.8855000138282776, 0.3356960117816925,
+ 0.998091995716095, -0.005673000123351812, 0.025262000039219856, 0.9941530227661133, 0.046904999762773514, -0.00951599981635809,
+ 0.9838590025901794, -0.00041700000292621553, 0.010572000406682491, 0.990556001663208, 0.01886500045657158, 0.04422200098633766,
+ 0.9921990036964417, -0.12290599942207336, 0.011202000081539154, 0.828000009059906, 0.5258169770240784, -0.0846100002527237,
+ 0.8704839944839478, 0.4878079891204834, 0.00635599996894598, 0.7773939967155457, 0.5659670233726501, -0.09634699672460556,
+ 0.8190580010414124, 0.4740380048751831, 0.01190400030463934, 0.9017590284347534, 0.3486430048942566, -0.05601400136947632,
+ 0.41038599610328674, 0.870602011680603, 0.27135801315307617, 0.3019320070743561, 0.8897680044174194, 0.34101900458335876,
+ 0.13912299275398254, 0.9423390030860901, -0.3042120039463043, 0.6167309880256653, 0.7692840099334717, 0.1667650043964386,
+ 0.5558350086212158, 0.8010749816894531, 0.21867799758911133, -0.4410029947757721, 0.8555399775505066, -0.2693159878253937,
+ -0.8639690279960632, 0.464356005191803, -0.019222000613808632, -0.8705710172653198, 0.4855479896068573, -0.005623999983072281,
+ -0.33969300985336304, 0.8762779831886292, -0.34097298979759216, -0.7608209848403931, 0.5840269923210144, 0.11236599832773209,
+ -0.16763299703598022, 0.9419429898262024, 0.29091599583625793, -0.8260639905929565, 0.47304999828338623, -0.0134699996560812,
+ -0.6006280183792114, 0.7822970151901245, -0.1611420065164566, -0.8495870232582092, 0.4440779983997345, 0.17417700588703156,
+ -0.5251449942588806, 0.8236340284347534, -0.21412399411201477, -0.9991480112075806, 0.0017519999528303742, 0.007890000008046627,
+ -0.9946579933166504, 0.06129400059580803, 0.007796999998390675, -0.9840919971466064, 0.008732999674975872, -0.0001289999927394092,
+ -0.9916059970855713, 0.015207000076770782, -0.04798699915409088, -0.9899899959564209, -0.13816699385643005, -0.019433999434113503,
+ -0.7927820086479187, -0.5669599771499634, 0.06795799732208252, -0.8363490104675293, -0.4685719907283783, 0.048955000936985016,
+ -0.8138830065727234, -0.4743089973926544, 0.0008379999781027436, -0.8869869709014893, -0.4417180120944977, -0.05625399947166443,
+ -0.7898640036582947, -0.5522750020027161, -0.15016800165176392, -0.297340989112854, -0.8998129963874817, -0.3192580044269562,
+ -0.49759799242019653, -0.8317790031433105, -0.24411599338054657, -0.6295620203018188, -0.7765420079231262, 0.01261799968779087,
+ -0.011338000185787678, -0.9998990297317505, -0.008561000227928162, -0.3547320067882538, -0.8679590225219727, -0.3453510105609894,
+ 0.09618999809026718, 0.49066001176834106, -0.5, 0.1851000040769577, 0.27721700072288513, -0.6666669845581055,
+ 0.32566601037979126, 0.76139897108078, -0.18199099600315094, 0.062401000410318375, 0.9939020276069641, -0.09090700000524521,
+ 0.3803209960460663, 0.9214360117912292, -0.00007100000220816582, 0.030918000265955925, 0.9969729781150818, 0.07133600115776062,
+ 0.3804109990596771, 0.9220889806747437, 0.0001630000042496249, 0.02471200004220009, 0.9975799918174744, 0.06498300284147263,
+ 0.35510900616645813, 0.926891028881073, 0.03216100111603737, 0.07657899707555771, 0.9924740195274353, -0.09555599838495255,
+ 0.27721700072288513, 0.1851000040769577, -0.6666669845581055, 0.5929989814758301, 0.5781109929084778, -0.18205299973487854,
+ 0.7048519849777222, 0.7048519849777222, 0, 0.7052720189094543, 0.7054179906845093, -0.00002499999936844688,
+ 0.6835219860076904, 0.7199410200119019, 0.03204600140452385, 0.3271070122718811, 0.06412599980831146, -0.6666669845581055,
+ 0.7694699764251709, 0.3061000108718872, -0.18225300312042236, 0.9214379787445068, 0.38033199310302734, 0.0000670000008540228,
+ 0.9220880270004272, 0.3804430067539215, -0.00016799999866634607, 0.9071130156517029, 0.403003990650177, 0.032437000423669815,
+ 0, 0, -1, 0.6626030206680298, 0.04157499969005585, -0.272724986076355,
+ 0.9969789981842041, 0.03082600049674511, -0.07129299640655518, 0.9975910186767578, 0.024447999894618988, -0.06492199748754501,
+ 0.9925040006637573, 0.07630900293588638, 0.09545700252056122, 0.49066001176834106, -0.09618999809026718, -0.5,
+ 0.27721700072288513, -0.1851000040769577, -0.6666669845581055, 0.76139897108078, -0.32566601037979126, -0.18199099600315094,
+ 0.9939020276069641, -0.062401000410318375, -0.09090700000524521, 0.9214360117912292, -0.3803209960460663, -0.00007100000220816582,
+ 0.9969729781150818, -0.030918000265955925, 0.07133600115776062, 0.9220889806747437, -0.3804109990596771, 0.0001630000042496249,
+ 0.9975799918174744, -0.02471200004220009, 0.06498300284147263, 0.926891028881073, -0.35510900616645813, 0.03216100111603737,
+ 0.9924740195274353, -0.07657899707555771, -0.09555599838495255, 0.1851000040769577, -0.27721700072288513, -0.6666669845581055,
+ 0.5781109929084778, -0.5929989814758301, -0.18205299973487854, 0.7048519849777222, -0.7048519849777222, 0,
+ 0.7054179906845093, -0.7052720189094543, -0.00002499999936844688, 0.7199410200119019, -0.6835219860076904, 0.03204600140452385,
+ 0.06412599980831146, -0.3271070122718811, -0.6666669845581055, 0.3061000108718872, -0.7694699764251709, -0.18225300312042236,
+ 0.38033199310302734, -0.9214379787445068, 0.0000670000008540228, 0.3804430067539215, -0.9220880270004272, -0.00016799999866634607,
+ 0.403003990650177, -0.9071130156517029, 0.032437000423669815, 0, 0, -1,
+ 0.04157499969005585, -0.6626030206680298, -0.272724986076355, 0.03082600049674511, -0.9969789981842041, -0.07129299640655518,
+ 0.024447999894618988, -0.9975910186767578, -0.06492199748754501, 0.07630900293588638, -0.9925040006637573, 0.09545700252056122,
+ -0.09618999809026718, -0.49066001176834106, -0.5, -0.1851000040769577, -0.27721700072288513, -0.6666669845581055,
+ -0.32566601037979126, -0.76139897108078, -0.18199099600315094, -0.062401000410318375, -0.9939020276069641, -0.09090700000524521,
+ -0.3803209960460663, -0.9214360117912292, -0.00007100000220816582, -0.030918000265955925, -0.9969729781150818, 0.07133600115776062,
+ -0.3804109990596771, -0.9220889806747437, 0.0001630000042496249, -0.02471200004220009, -0.9975799918174744, 0.06498300284147263,
+ -0.35510900616645813, -0.926891028881073, 0.03216100111603737, -0.07657899707555771, -0.9924740195274353, -0.09555599838495255,
+ -0.27721700072288513, -0.1851000040769577, -0.6666669845581055, -0.5929989814758301, -0.5781109929084778, -0.18205299973487854,
+ -0.7048519849777222, -0.7048519849777222, 0, -0.7052720189094543, -0.7054179906845093, -0.00002499999936844688,
+ -0.6835219860076904, -0.7199410200119019, 0.03204600140452385, -0.3271070122718811, -0.06412599980831146, -0.6666669845581055,
+ -0.7694699764251709, -0.3061000108718872, -0.18225300312042236, -0.9214379787445068, -0.38033199310302734, 0.0000670000008540228,
+ -0.9220880270004272, -0.3804430067539215, -0.00016799999866634607, -0.9071130156517029, -0.403003990650177, 0.032437000423669815,
+ 0, 0, -1, -0.6626030206680298, -0.04157499969005585, -0.272724986076355,
+ -0.9969789981842041, -0.03082600049674511, -0.07129299640655518, -0.9975910186767578, -0.024447999894618988, -0.06492199748754501,
+ -0.9925040006637573, -0.07630900293588638, 0.09545700252056122, -0.49066001176834106, 0.09618999809026718, -0.5,
+ -0.27721700072288513, 0.1851000040769577, -0.6666669845581055, -0.76139897108078, 0.32566601037979126, -0.18199099600315094,
+ -0.9939020276069641, 0.062401000410318375, -0.09090700000524521, -0.9214360117912292, 0.3803209960460663, -0.00007100000220816582,
+ -0.9969729781150818, 0.030918000265955925, 0.07133600115776062, -0.9220889806747437, 0.3804109990596771, 0.0001630000042496249,
+ -0.9975799918174744, 0.02471200004220009, 0.06498300284147263, -0.926891028881073, 0.35510900616645813, 0.03216100111603737,
+ -0.9924740195274353, 0.07657899707555771, -0.09555599838495255, -0.1851000040769577, 0.27721700072288513, -0.6666669845581055,
+ -0.5781109929084778, 0.5929989814758301, -0.18205299973487854, -0.7048519849777222, 0.7048519849777222, 0,
+ -0.7054179906845093, 0.7052720189094543, -0.00002499999936844688, -0.7199410200119019, 0.6835219860076904, 0.03204600140452385,
+ -0.06412599980831146, 0.3271070122718811, -0.6666669845581055, -0.3061000108718872, 0.7694699764251709, -0.18225300312042236,
+ -0.38033199310302734, 0.9214379787445068, 0.0000670000008540228, -0.3804430067539215, 0.9220880270004272, -0.00016799999866634607,
+ -0.403003990650177, 0.9071130156517029, 0.032437000423669815, 0, 0, -1,
+ -0.04157499969005585, 0.6626030206680298, -0.272724986076355, -0.03082600049674511, 0.9969789981842041, -0.07129299640655518,
+ -0.024447999894618988, 0.9975910186767578, -0.06492199748754501, -0.07630900293588638, 0.9925040006637573, 0.09545700252056122,
+ 0.07657899707555771, 0.9924740195274353, -0.09555599838495255, 0.40307098627090454, 0.9070649743080139, -0.03255299851298332,
+ 0.3753640055656433, 0.9070209860801697, 0.000007000000096013537, 0.18306200206279755, 0.9820899963378906, -0.04457399994134903,
+ 0.3751649856567383, 0.9065750241279602, -0.00007400000322377309, 0.18801499903202057, 0.9816100001335144, -0.03304100036621094,
+ 0.3759070038795471, 0.908607006072998, -0.00026199998683296144, 0.16623400151729584, 0.983722984790802, -0.06822899729013443,
+ 0.33324098587036133, 0.9290030002593994, 0.029803000390529633, 0.14071400463581085, 0.9862040281295776, -0.08718100190162659,
+ 0.7198299765586853, 0.6836559772491455, -0.032017000019550323, 0.6943539977073669, 0.6943539977073669, 0,
+ 0.694034993648529, 0.694034993648529, 0, 0.6955100297927856, 0.6955100297927856, 0,
+ 0.6639170050621033, 0.7306150197982788, 0.029100999236106873, 0.9268649816513062, 0.35523301362991333, -0.03203999996185303,
+ 0.9070209860801697, 0.3753649890422821, -0.000007000000096013537, 0.9065750241279602, 0.3751649856567383, 0.00007300000288523734,
+ 0.908607006072998, 0.3759070038795471, 0.00026199998683296144, 0.8926259875297546, 0.4211460053920746, 0.028991999104619026,
+ 0.9924740195274353, 0.07646500319242477, 0.09565100073814392, 0.9820899963378906, 0.18306200206279755, 0.04457399994134903,
+ 0.9816100001335144, 0.18801499903202057, 0.03304100036621094, 0.983722984790802, 0.16623400151729584, 0.06822899729013443,
+ 0.9862040281295776, 0.14071400463581085, 0.08718100190162659, 0.9924740195274353, -0.07657899707555771, -0.09555599838495255,
+ 0.9070649743080139, -0.40307098627090454, -0.03255299851298332, 0.9070209860801697, -0.3753640055656433, 0.000007000000096013537,
+ 0.9820899963378906, -0.18306200206279755, -0.04457399994134903, 0.9065750241279602, -0.3751649856567383, -0.00007400000322377309,
+ 0.9816100001335144, -0.18801499903202057, -0.03304100036621094, 0.908607006072998, -0.3759070038795471, -0.00026199998683296144,
+ 0.983722984790802, -0.16623400151729584, -0.06822899729013443, 0.9290030002593994, -0.33324098587036133, 0.029803000390529633,
+ 0.9862040281295776, -0.14071400463581085, -0.08718100190162659, 0.6836559772491455, -0.7198299765586853, -0.032017000019550323,
+ 0.6943539977073669, -0.6943539977073669, 0, 0.694034993648529, -0.694034993648529, 0,
+ 0.6955100297927856, -0.6955100297927856, 0, 0.7306150197982788, -0.6639170050621033, 0.029100999236106873,
+ 0.35523301362991333, -0.9268649816513062, -0.03203999996185303, 0.3753649890422821, -0.9070209860801697, -0.000007000000096013537,
+ 0.3751649856567383, -0.9065750241279602, 0.00007300000288523734, 0.3759070038795471, -0.908607006072998, 0.00026199998683296144,
+ 0.4211460053920746, -0.8926259875297546, 0.028991999104619026, 0.07646500319242477, -0.9924740195274353, 0.09565100073814392,
+ 0.18306200206279755, -0.9820899963378906, 0.04457399994134903, 0.18801499903202057, -0.9816100001335144, 0.03304100036621094,
+ 0.16623400151729584, -0.983722984790802, 0.06822899729013443, 0.14071400463581085, -0.9862040281295776, 0.08718100190162659,
+ -0.07657899707555771, -0.9924740195274353, -0.09555599838495255, -0.40307098627090454, -0.9070649743080139, -0.03255299851298332,
+ -0.3753640055656433, -0.9070209860801697, 0.000007000000096013537, -0.18306200206279755, -0.9820899963378906, -0.04457399994134903,
+ -0.3751649856567383, -0.9065750241279602, -0.00007400000322377309, -0.18801499903202057, -0.9816100001335144, -0.03304100036621094,
+ -0.3759070038795471, -0.908607006072998, -0.00026199998683296144, -0.16623400151729584, -0.983722984790802, -0.06822899729013443,
+ -0.33324098587036133, -0.9290030002593994, 0.029803000390529633, -0.14071400463581085, -0.9862040281295776, -0.08718100190162659,
+ -0.7198299765586853, -0.6836559772491455, -0.032017000019550323, -0.6943539977073669, -0.6943539977073669, 0,
+ -0.694034993648529, -0.694034993648529, 0, -0.6955100297927856, -0.6955100297927856, 0,
+ -0.6639170050621033, -0.7306150197982788, 0.029100999236106873, -0.9268649816513062, -0.35523301362991333, -0.03203999996185303,
+ -0.9070209860801697, -0.3753649890422821, -0.000007000000096013537, -0.9065750241279602, -0.3751649856567383, 0.00007300000288523734,
+ -0.908607006072998, -0.3759070038795471, 0.00026199998683296144, -0.8926259875297546, -0.4211460053920746, 0.028991999104619026,
+ -0.9924740195274353, -0.07646500319242477, 0.09565100073814392, -0.9820899963378906, -0.18306200206279755, 0.04457399994134903,
+ -0.9816100001335144, -0.18801499903202057, 0.03304100036621094, -0.983722984790802, -0.16623400151729584, 0.06822899729013443,
+ -0.9862040281295776, -0.14071400463581085, 0.08718100190162659, -0.9924740195274353, 0.07657899707555771, -0.09555599838495255,
+ -0.9070649743080139, 0.40307098627090454, -0.03255299851298332, -0.9070209860801697, 0.3753640055656433, 0.000007000000096013537,
+ -0.9820899963378906, 0.18306200206279755, -0.04457399994134903, -0.9065750241279602, 0.3751649856567383, -0.00007400000322377309,
+ -0.9816100001335144, 0.18801499903202057, -0.03304100036621094, -0.908607006072998, 0.3759070038795471, -0.00026199998683296144,
+ -0.983722984790802, 0.16623400151729584, -0.06822899729013443, -0.9290030002593994, 0.33324098587036133, 0.029803000390529633,
+ -0.9862040281295776, 0.14071400463581085, -0.08718100190162659, -0.6836559772491455, 0.7198299765586853, -0.032017000019550323,
+ -0.6943539977073669, 0.6943539977073669, 0, -0.694034993648529, 0.694034993648529, 0,
+ -0.6955100297927856, 0.6955100297927856, 0, -0.7306150197982788, 0.6639170050621033, 0.029100999236106873,
+ -0.35523301362991333, 0.9268649816513062, -0.03203999996185303, -0.3753649890422821, 0.9070209860801697, -0.000007000000096013537,
+ -0.3751649856567383, 0.9065750241279602, 0.00007300000288523734, -0.3759070038795471, 0.908607006072998, 0.00026199998683296144,
+ -0.4211460053920746, 0.8926259875297546, 0.028991999104619026, -0.07646500319242477, 0.9924740195274353, 0.09565100073814392,
+ -0.18306200206279755, 0.9820899963378906, 0.04457399994134903, -0.18801499903202057, 0.9816100001335144, 0.03304100036621094,
+ -0.16623400151729584, 0.983722984790802, 0.06822899729013443, -0.14071400463581085, 0.9862040281295776, 0.08718100190162659 };
+
+
+float teapotBinormals[] = { 0.2554270029067993, -0.05043400079011917, -0.9655119776725769, 0.2302899956703186, -0.11379700154066086, -0.9664459824562073,
+ -0.23653900623321533, 0.09789499640464783, -0.9666780233383179, -0.2551180124282837, 0.05037299916148186, -0.9655969738960266,
+ -0.9201610088348389, 0.38079801201820374, -0.09108299762010574, -0.9770479798316956, 0.1929199993610382, -0.09032399952411652,
+ -0.6762400269508362, 0.2798590064048767, 0.6814529895782471, -0.723800003528595, 0.1429159939289093, 0.6750479936599731,
+ -0.4681990146636963, 0.1581760048866272, 0.869350016117096, -0.4902079999446869, 0.09679199755191803, 0.8662149906158447,
+ 0.16952399909496307, -0.1934960037469864, -0.9663439989089966, -0.18106800317764282, 0.18106800317764282, -0.9666590094566345,
+ -0.7041199803352356, 0.7041199803352356, -0.09181900322437286, -0.5179349780082703, 0.5179349780082703, 0.6807990074157715,
+ -0.37217798829078674, 0.3260670006275177, 0.8690019845962524, 0.08221600204706192, -0.243368998169899, -0.9664430022239685,
+ -0.09789499640464783, 0.23653900623321533, -0.9666780233383179, -0.38079801201820374, 0.9201610088348389, -0.09108199924230576,
+ -0.2798590064048767, 0.6762400269508362, 0.6814540028572083, -0.21894000470638275, 0.44305500388145447, 0.8693490028381348,
+ 0.050822000950574875, -0.2573910057544708, -0.9649699926376343, -0.05021600052714348, 0.25432100892066956, -0.965815007686615,
+ -0.19291600584983826, 0.9770249724388123, -0.09059000015258789, -0.14291299879550934, 0.7237870097160339, 0.6750609874725342,
+ -0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.048507001250982285, -0.2576940059661865, -0.965008020401001,
+ -0.15833300352096558, -0.3227809965610504, -0.933135986328125, 0.05656199902296066, 0.13793900609016418, -0.9888240098953247,
+ 0.049150001257658005, 0.2545199990272522, -0.9658179879188538, 0.378387987613678, 0.9173290133476257, -0.12381099909543991,
+ 0.1917950063943863, 0.9772530198097229, -0.09050799906253815, 0.2777239978313446, 0.6716070175170898, 0.6868870258331299,
+ 0.14281700551509857, 0.7238019704818726, 0.6750659942626953, 0.15788200497627258, 0.4674209952354431, 0.8698220252990723,
+ 0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.3139069974422455, -0.2657270133495331, -0.9115110039710999,
+ 0.05247500166296959, 0.05178600177168846, -0.9972789883613586, 0.699787974357605, 0.6969379782676697, -0.15676100552082062,
+ 0.511929988861084, 0.5116159915924072, 0.6900550127029419, 0.32515400648117065, 0.37111398577690125, 0.8697980046272278,
+ -0.3181929886341095, -0.09987600147724152, -0.9427499771118164, 0.1552799940109253, 0.06176299974322319, -0.9859380125999451,
+ 0.9187250137329102, 0.3751460015773773, -0.1233299970626831, 0.6724870204925537, 0.2775439918041229, 0.6860979795455933,
+ 0.4424299895763397, 0.21853800117969513, 0.8697689771652222, -0.255948007106781, -0.04464200139045715, -0.9656590223312378,
+ 0.25306200981140137, 0.046362001448869705, -0.9663389921188354, 0.9778940081596375, 0.18800100684165955, -0.09153299778699875,
+ 0.7238150238990784, 0.14205799996852875, 0.675212025642395, 0.49017900228500366, 0.0967010036110878, 0.8662409782409668,
+ -0.25491899251937866, 0.05033399909734726, -0.9656509757041931, -0.2302899956703186, 0.11379700154066086, -0.9664459824562073,
+ 0.23653900623321533, -0.09789499640464783, -0.9666780233383179, 0.252265989780426, -0.04980999976396561, -0.9663749933242798,
+ 0.9201610088348389, -0.38079801201820374, -0.09108299762010574, 0.9769039750099182, -0.19289200007915497, -0.09193000197410583,
+ 0.6762400269508362, -0.2798590064048767, 0.6814529895782471, 0.7236610054969788, -0.14288799464702606, 0.6752020120620728,
+ 0.4681990146636963, -0.1581760048866272, 0.869350016117096, 0.4901660084724426, -0.09678400307893753, 0.8662390112876892,
+ -0.16952399909496307, 0.1934960037469864, -0.9663439989089966, 0.18106800317764282, -0.18106800317764282, -0.9666590094566345,
+ 0.7041199803352356, -0.7041199803352356, -0.09181900322437286, 0.5179349780082703, -0.5179349780082703, 0.6807990074157715,
+ 0.37217798829078674, -0.3260670006275177, 0.8690019845962524, -0.08221600204706192, 0.243368998169899, -0.9664430022239685,
+ 0.09789499640464783, -0.23653900623321533, -0.9666780233383179, 0.38079801201820374, -0.9201610088348389, -0.09108199924230576,
+ 0.2798590064048767, -0.6762400269508362, 0.6814540028572083, 0.21894000470638275, -0.44305500388145447, 0.8693490028381348,
+ -0.05043400079011917, 0.2554270029067993, -0.9655119776725769, 0.05037299916148186, -0.2551180124282837, -0.9655969738960266,
+ 0.1929199993610382, -0.9770479798316956, -0.09032399952411652, 0.1429159939289093, -0.723800003528595, 0.6750479936599731,
+ 0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.05043400079011917, 0.2554270029067993, -0.9655119776725769,
+ 0.11379700154066086, 0.2302899956703186, -0.9664459824562073, -0.09789499640464783, -0.23653900623321533, -0.9666780233383179,
+ -0.05037299916148186, -0.2551180124282837, -0.9655969738960266, -0.38079801201820374, -0.9201610088348389, -0.09108299762010574,
+ -0.1929199993610382, -0.9770479798316956, -0.09032399952411652, -0.2798590064048767, -0.6762400269508362, 0.6814529895782471,
+ -0.1429159939289093, -0.723800003528595, 0.6750479936599731, -0.1581760048866272, -0.4681990146636963, 0.869350016117096,
+ -0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.1934960037469864, 0.16952399909496307, -0.9663439989089966,
+ -0.18106800317764282, -0.18106800317764282, -0.9666590094566345, -0.7041199803352356, -0.7041199803352356, -0.09181900322437286,
+ -0.5179349780082703, -0.5179349780082703, 0.6807990074157715, -0.3260670006275177, -0.37217798829078674, 0.8690019845962524,
+ 0.243368998169899, 0.08221600204706192, -0.9664430022239685, -0.23653900623321533, -0.09789499640464783, -0.9666780233383179,
+ -0.9201610088348389, -0.38079801201820374, -0.09108199924230576, -0.6762400269508362, -0.2798590064048767, 0.6814540028572083,
+ -0.44305500388145447, -0.21894000470638275, 0.8693490028381348, 0.2554270029067993, 0.05043400079011917, -0.9655119776725769,
+ -0.2551180124282837, -0.05037299916148186, -0.9655969738960266, -0.9770479798316956, -0.1929199993610382, -0.09032399952411652,
+ -0.723800003528595, -0.1429159939289093, 0.6750479936599731, -0.4902079999446869, -0.09679199755191803, 0.8662149906158447,
+ -0.4902079999446869, 0.09679199755191803, 0.8662149906158447, -0.44305500388145447, 0.21893900632858276, 0.8693490028381348,
+ -0.37287598848342896, 0.15431199967861176, 0.9149600267410278, -0.4014579951763153, 0.07926800101995468, 0.9124410152435303,
+ -0.3112579882144928, 0.12881100177764893, 0.9415550231933594, -0.33541300892829895, 0.0662280023097992, 0.939740002155304,
+ -0.19015200436115265, 0.07869099825620651, 0.9785959720611572, -0.20517399907112122, 0.040511999279260635, 0.977886974811554,
+ 0.06301800161600113, -0.021289000287652016, 0.9977849721908569, 0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+ -0.3260670006275177, 0.37217798829078674, 0.8690019845962524, -0.285739004611969, 0.285739004611969, 0.9147170186042786,
+ -0.23854400217533112, 0.23854400217533112, 0.9413790106773376, -0.14574900269508362, 0.14574900269508362, 0.9785270094871521,
+ 0.05011200159788132, -0.04390300065279007, 0.9977779984474182, -0.1581760048866272, 0.4681999981403351, 0.869350016117096,
+ -0.15431199967861176, 0.37287598848342896, 0.9149600267410278, -0.12881100177764893, 0.3112579882144928, 0.9415550231933594,
+ -0.07869099825620651, 0.19015100598335266, 0.9785959720611572, 0.02946699969470501, -0.05963199958205223, 0.9977849721908569,
+ -0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.07926800101995468, 0.4014579951763153, 0.9124410152435303,
+ -0.0662280023097992, 0.33541300892829895, 0.939740002155304, -0.040511999279260635, 0.20517399907112122, 0.977886974811554,
+ 0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.09679199755191803, 0.4902079999446869, 0.8662149906158447,
+ 0.21858200430870056, 0.4423219859600067, 0.86981201171875, 0.15431199967861176, 0.37287598848342896, 0.9149600267410278,
+ 0.07926800101995468, 0.4014579951763153, 0.9124410152435303, 0.12881100177764893, 0.3112579882144928, 0.9415550231933594,
+ 0.0662280023097992, 0.33541300892829895, 0.939740002155304, 0.07869099825620651, 0.19015200436115265, 0.9785959720611572,
+ 0.040511999279260635, 0.20517399907112122, 0.977886974811554, -0.021289000287652016, -0.06301800161600113, 0.9977849721908569,
+ -0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.3711329996585846, 0.3251489996910095, 0.8697919845581055,
+ 0.285739004611969, 0.285739004611969, 0.9147170186042786, 0.23854400217533112, 0.23854400217533112, 0.9413790106773376,
+ 0.14574900269508362, 0.14574900269508362, 0.9785270094871521, -0.04390300065279007, -0.05011200159788132, 0.9977779984474182,
+ 0.46750199794769287, 0.15794099867343903, 0.8697680234909058, 0.37287598848342896, 0.15431199967861176, 0.9149600267410278,
+ 0.3112579882144928, 0.12881100177764893, 0.9415550231933594, 0.19015100598335266, 0.07869099825620651, 0.9785959720611572,
+ -0.05963199958205223, -0.02946699969470501, 0.9977849721908569, 0.49017900228500366, 0.0967010036110878, 0.8662409782409668,
+ 0.4014579951763153, 0.07926800101995468, 0.9124410152435303, 0.33541300892829895, 0.0662280023097992, 0.939740002155304,
+ 0.20517399907112122, 0.040511999279260635, 0.977886974811554, -0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+ 0.4901660084724426, -0.09678400307893753, 0.8662390112876892, 0.44305500388145447, -0.21893900632858276, 0.8693490028381348,
+ 0.37287598848342896, -0.15431199967861176, 0.9149600267410278, 0.4014579951763153, -0.07926800101995468, 0.9124410152435303,
+ 0.3112579882144928, -0.12881100177764893, 0.9415550231933594, 0.33541300892829895, -0.0662280023097992, 0.939740002155304,
+ 0.19015200436115265, -0.07869099825620651, 0.9785959720611572, 0.20517399907112122, -0.040511999279260635, 0.977886974811554,
+ -0.06301800161600113, 0.021289000287652016, 0.9977849721908569, -0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+ 0.3260670006275177, -0.37217798829078674, 0.8690019845962524, 0.285739004611969, -0.285739004611969, 0.9147170186042786,
+ 0.23854400217533112, -0.23854400217533112, 0.9413790106773376, 0.14574900269508362, -0.14574900269508362, 0.9785270094871521,
+ -0.05011200159788132, 0.04390300065279007, 0.9977779984474182, 0.1581760048866272, -0.4681999981403351, 0.869350016117096,
+ 0.15431199967861176, -0.37287598848342896, 0.9149600267410278, 0.12881100177764893, -0.3112579882144928, 0.9415550231933594,
+ 0.07869099825620651, -0.19015100598335266, 0.9785959720611572, -0.02946699969470501, 0.05963199958205223, 0.9977849721908569,
+ 0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.07926800101995468, -0.4014579951763153, 0.9124410152435303,
+ 0.0662280023097992, -0.33541300892829895, 0.939740002155304, 0.040511999279260635, -0.20517399907112122, 0.977886974811554,
+ -0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.09679199755191803, -0.4902079999446869, 0.8662149906158447,
+ -0.21893900632858276, -0.44305500388145447, 0.8693490028381348, -0.15431199967861176, -0.37287598848342896, 0.9149600267410278,
+ -0.07926800101995468, -0.4014579951763153, 0.9124410152435303, -0.12881100177764893, -0.3112579882144928, 0.9415550231933594,
+ -0.0662280023097992, -0.33541300892829895, 0.939740002155304, -0.07869099825620651, -0.19015200436115265, 0.9785959720611572,
+ -0.040511999279260635, -0.20517399907112122, 0.977886974811554, 0.021289000287652016, 0.06301800161600113, 0.9977849721908569,
+ 0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.37217798829078674, -0.3260670006275177, 0.8690019845962524,
+ -0.285739004611969, -0.285739004611969, 0.9147170186042786, -0.23854400217533112, -0.23854400217533112, 0.9413790106773376,
+ -0.14574900269508362, -0.14574900269508362, 0.9785270094871521, 0.04390300065279007, 0.05011200159788132, 0.9977779984474182,
+ -0.4681999981403351, -0.1581760048866272, 0.869350016117096, -0.37287598848342896, -0.15431199967861176, 0.9149600267410278,
+ -0.3112579882144928, -0.12881100177764893, 0.9415550231933594, -0.19015100598335266, -0.07869099825620651, 0.9785959720611572,
+ 0.05963199958205223, 0.02946699969470501, 0.9977849721908569, -0.4902079999446869, -0.09679199755191803, 0.8662149906158447,
+ -0.4014579951763153, -0.07926800101995468, 0.9124410152435303, -0.33541300892829895, -0.0662280023097992, 0.939740002155304,
+ -0.20517399907112122, -0.040511999279260635, 0.977886974811554, 0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+ 0.06623400002717972, -0.013078000396490097, 0.9977179765701294, 0.05963199958205223, -0.02946699969470501, 0.9977849721908569,
+ 0.40303200483322144, -0.1667889952659607, 0.8998590111732483, 0.4339120090007782, -0.08567699790000916, 0.8968719840049744,
+ 0.6326310038566589, -0.2618109881877899, 0.7288579940795898, 0.6777120232582092, -0.13381600379943848, 0.723048985004425,
+ 0.6661339998245239, -0.27567601203918457, 0.6930140256881714, 0.7128540277481079, -0.14075499773025513, 0.6870430111885071,
+ 0.5777599811553955, -0.19519099593162537, 0.792523980140686, 0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+ 0.04390300065279007, -0.05011200159788132, 0.9977779984474182, 0.30884799361228943, -0.30884799361228943, 0.8995699882507324,
+ 0.48457300662994385, -0.48457300662994385, 0.7282710075378418, 0.510138988494873, -0.510138988494873, 0.6924710273742676,
+ 0.4591110050678253, -0.40222999453544617, 0.7921029925346375, 0.021289000287652016, -0.06301800161600113, 0.9977849721908569,
+ 0.16678999364376068, -0.40303200483322144, 0.8998590111732483, 0.2618109881877899, -0.6326310038566589, 0.7288579940795898,
+ 0.27567601203918457, -0.6661339998245239, 0.6930140256881714, 0.2701770067214966, -0.546737015247345, 0.7925170063972473,
+ 0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.08567599952220917, -0.4339120090007782, 0.8968719840049744,
+ 0.13381600379943848, -0.6777120232582092, 0.723048985004425, 0.14075499773025513, -0.7128540277481079, 0.6870430111885071,
+ 0.11919199675321579, -0.6036490201950073, 0.7882900238037109, -0.013078000396490097, -0.06623400002717972, 0.9977179765701294,
+ -0.02946699969470501, -0.05963199958205223, 0.9977849721908569, -0.1667889952659607, -0.40303200483322144, 0.8998590111732483,
+ -0.08567699790000916, -0.4339120090007782, 0.8968719840049744, -0.2618109881877899, -0.6326310038566589, 0.7288579940795898,
+ -0.13381600379943848, -0.6777120232582092, 0.723048985004425, -0.27567601203918457, -0.6661339998245239, 0.6930140256881714,
+ -0.14075499773025513, -0.7128540277481079, 0.6870430111885071, -0.19519099593162537, -0.5777599811553955, 0.792523980140686,
+ -0.11919199675321579, -0.6036490201950073, 0.7882900238037109, -0.05011200159788132, -0.04390300065279007, 0.9977779984474182,
+ -0.30884799361228943, -0.30884799361228943, 0.8995699882507324, -0.48457300662994385, -0.48457300662994385, 0.7282710075378418,
+ -0.510138988494873, -0.510138988494873, 0.6924710273742676, -0.40222999453544617, -0.4591110050678253, 0.7921029925346375,
+ -0.06301800161600113, -0.021289000287652016, 0.9977849721908569, -0.40303200483322144, -0.16678999364376068, 0.8998590111732483,
+ -0.6326310038566589, -0.2618109881877899, 0.7288579940795898, -0.6661339998245239, -0.27567601203918457, 0.6930140256881714,
+ -0.546737015247345, -0.2701770067214966, 0.7925170063972473, -0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+ -0.4339120090007782, -0.08567599952220917, 0.8968719840049744, -0.6777120232582092, -0.13381600379943848, 0.723048985004425,
+ -0.7128540277481079, -0.14075499773025513, 0.6870430111885071, -0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+ -0.06623400002717972, 0.013078000396490097, 0.9977179765701294, -0.05963199958205223, 0.02946699969470501, 0.9977849721908569,
+ -0.40303200483322144, 0.1667889952659607, 0.8998590111732483, -0.4339120090007782, 0.08567699790000916, 0.8968719840049744,
+ -0.6326310038566589, 0.2618109881877899, 0.7288579940795898, -0.6777120232582092, 0.13381600379943848, 0.723048985004425,
+ -0.6661339998245239, 0.27567601203918457, 0.6930140256881714, -0.7128540277481079, 0.14075499773025513, 0.6870430111885071,
+ -0.5777599811553955, 0.19519099593162537, 0.792523980140686, -0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+ -0.04390300065279007, 0.05011200159788132, 0.9977779984474182, -0.30884799361228943, 0.30884799361228943, 0.8995699882507324,
+ -0.48457300662994385, 0.48457300662994385, 0.7282710075378418, -0.510138988494873, 0.510138988494873, 0.6924710273742676,
+ -0.4591110050678253, 0.40222999453544617, 0.7921029925346375, -0.021289000287652016, 0.06301800161600113, 0.9977849721908569,
+ -0.16678999364376068, 0.40303200483322144, 0.8998590111732483, -0.2618109881877899, 0.6326310038566589, 0.7288579940795898,
+ -0.27567601203918457, 0.6661339998245239, 0.6930140256881714, -0.2701770067214966, 0.546737015247345, 0.7925170063972473,
+ -0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.08567599952220917, 0.4339120090007782, 0.8968719840049744,
+ -0.13381600379943848, 0.6777120232582092, 0.723048985004425, -0.14075499773025513, 0.7128540277481079, 0.6870430111885071,
+ -0.11919199675321579, 0.6036490201950073, 0.7882900238037109, 0.013078000396490097, 0.06623400002717972, 0.9977179765701294,
+ 0.02946699969470501, 0.05963199958205223, 0.9977849721908569, 0.1667889952659607, 0.40303200483322144, 0.8998590111732483,
+ 0.08567699790000916, 0.4339120090007782, 0.8968719840049744, 0.2618109881877899, 0.6326310038566589, 0.7288579940795898,
+ 0.13381600379943848, 0.6777120232582092, 0.723048985004425, 0.27567601203918457, 0.6661339998245239, 0.6930140256881714,
+ 0.14075499773025513, 0.7128540277481079, 0.6870430111885071, 0.19519099593162537, 0.5777599811553955, 0.792523980140686,
+ 0.11919199675321579, 0.6036490201950073, 0.7882900238037109, 0.05011200159788132, 0.04390300065279007, 0.9977779984474182,
+ 0.30884799361228943, 0.30884799361228943, 0.8995699882507324, 0.48457300662994385, 0.48457300662994385, 0.7282710075378418,
+ 0.510138988494873, 0.510138988494873, 0.6924710273742676, 0.40222999453544617, 0.4591110050678253, 0.7921029925346375,
+ 0.06301800161600113, 0.021289000287652016, 0.9977849721908569, 0.40303200483322144, 0.16678999364376068, 0.8998590111732483,
+ 0.6326310038566589, 0.2618109881877899, 0.7288579940795898, 0.6661339998245239, 0.27567601203918457, 0.6930140256881714,
+ 0.546737015247345, 0.2701770067214966, 0.7925170063972473, 0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+ 0.4339120090007782, 0.08567599952220917, 0.8968719840049744, 0.6777120232582092, 0.13381600379943848, 0.723048985004425,
+ 0.7128540277481079, 0.14075499773025513, 0.6870430111885071, 0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+ 0.6036490201950073, -0.11919199675321579, 0.7882900238037109, 0.546737015247345, -0.2701770067214966, 0.7925170063972473,
+ 0.7223830223083496, -0.2989569902420044, 0.623528003692627, 0.7723940014839172, -0.15251100063323975, 0.616562008857727,
+ 0.9094089865684509, -0.3763520121574402, 0.1770150065422058, 0.9660869836807251, -0.19075599312782288, 0.1740349978208542,
+ 0.9408230185508728, -0.3353259861469269, 0.04907499998807907, 0.9843119978904724, -0.16964000463485718, 0.048493001610040665,
+ 0.9810580015182495, -0.1937119960784912, 0, 0.7071070075035095, -0.7071070075035095, 0,
+ 0.40222999453544617, -0.4591110050678253, 0.7921029925346375, 0.5532029867172241, -0.5532029867172241, 0.622842013835907,
+ 0.6959879994392395, -0.6959879994392395, 0.17663900554180145, 0.7403979897499084, -0.6703829765319824, 0.048958998173475266,
+ 0.8310419917106628, -0.5562090277671814, 0, 0.19519099593162537, -0.5777599811553955, 0.792523980140686,
+ 0.2989560067653656, -0.7223830223083496, 0.623528003692627, 0.3763520121574402, -0.9094089865684509, 0.1770150065422058,
+ 0.4275760054588318, -0.902646005153656, 0.04906899854540825, 0.5562090277671814, -0.8310419917106628, 0,
+ 0.11919199675321579, -0.6036490201950073, 0.7882900238037109, 0.15251100063323975, -0.7723940014839172, 0.616562008857727,
+ 0.19075599312782288, -0.9660869836807251, 0.1740349978208542, 0.19348600506782532, -0.9799140095710754, 0.048277001827955246,
+ 0.1937119960784912, -0.9810580015182495, 0, -0.11919199675321579, -0.6036490201950073, 0.7882900238037109,
+ -0.2701770067214966, -0.546737015247345, 0.7925170063972473, -0.2989569902420044, -0.7223830223083496, 0.623528003692627,
+ -0.15251100063323975, -0.7723940014839172, 0.616562008857727, -0.3763520121574402, -0.9094089865684509, 0.1770150065422058,
+ -0.19075599312782288, -0.9660869836807251, 0.1740349978208542, -0.3353259861469269, -0.9408230185508728, 0.04907499998807907,
+ -0.16964000463485718, -0.9843119978904724, 0.04849399998784065, -0.1937119960784912, -0.9810580015182495, 0,
+ 0.7071070075035095, -0.7071070075035095, 0, -0.4591110050678253, -0.40222999453544617, 0.7921029925346375,
+ -0.5532029867172241, -0.5532029867172241, 0.622842013835907, -0.6959879994392395, -0.6959879994392395, 0.17663900554180145,
+ -0.6703829765319824, -0.7403979897499084, 0.048958998173475266, -0.5562090277671814, -0.8310419917106628, 0,
+ -0.5777599811553955, -0.19519099593162537, 0.792523980140686, -0.7223830223083496, -0.2989560067653656, 0.623528003692627,
+ -0.9094089865684509, -0.3763520121574402, 0.1770150065422058, -0.902646005153656, -0.4275760054588318, 0.04906899854540825,
+ -0.8310419917106628, -0.5562090277671814, 0, -0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+ -0.7723940014839172, -0.15251100063323975, 0.616562008857727, -0.9660869836807251, -0.19075599312782288, 0.1740349978208542,
+ -0.9799140095710754, -0.19348600506782532, 0.048277001827955246, -0.9810580015182495, -0.1937119960784912, 0,
+ -0.6036490201950073, 0.11919199675321579, 0.7882900238037109, -0.546737015247345, 0.2701770067214966, 0.7925170063972473,
+ -0.7223830223083496, 0.2989569902420044, 0.623528003692627, -0.7723940014839172, 0.15251100063323975, 0.616562008857727,
+ -0.9094089865684509, 0.3763520121574402, 0.1770150065422058, -0.9660869836807251, 0.19075599312782288, 0.1740349978208542,
+ -0.9408230185508728, 0.3353259861469269, 0.04907499998807907, -0.9843119978904724, 0.16964000463485718, 0.04849399998784065,
+ -0.9810580015182495, 0.1937119960784912, 0, 0.7071070075035095, -0.7071070075035095, 0,
+ -0.40222999453544617, 0.4591110050678253, 0.7921029925346375, -0.5532029867172241, 0.5532029867172241, 0.622842013835907,
+ -0.6959879994392395, 0.6959879994392395, 0.17663900554180145, -0.7403979897499084, 0.6703829765319824, 0.048958998173475266,
+ -0.8310419917106628, 0.5562090277671814, 0, -0.19519099593162537, 0.5777599811553955, 0.792523980140686,
+ -0.2989560067653656, 0.7223830223083496, 0.623528003692627, -0.3763520121574402, 0.9094089865684509, 0.1770150065422058,
+ -0.4275760054588318, 0.902646005153656, 0.04906899854540825, -0.5562090277671814, 0.8310419917106628, 0,
+ -0.11919199675321579, 0.6036490201950073, 0.7882900238037109, -0.15251100063323975, 0.7723940014839172, 0.616562008857727,
+ -0.19075599312782288, 0.9660869836807251, 0.1740349978208542, -0.19348600506782532, 0.9799140095710754, 0.048277001827955246,
+ -0.1937119960784912, 0.9810580015182495, 0, 0.11919199675321579, 0.6036490201950073, 0.7882900238037109,
+ 0.2701770067214966, 0.546737015247345, 0.7925170063972473, 0.2989569902420044, 0.7223830223083496, 0.623528003692627,
+ 0.15251100063323975, 0.7723940014839172, 0.616562008857727, 0.3763520121574402, 0.9094089865684509, 0.1770150065422058,
+ 0.19075599312782288, 0.9660869836807251, 0.1740349978208542, 0.3353259861469269, 0.9408230185508728, 0.04907499998807907,
+ 0.16964000463485718, 0.9843119978904724, 0.04849399998784065, 0.1937119960784912, 0.9810580015182495, 0,
+ 0.7071070075035095, -0.7071070075035095, 0, 0.4591110050678253, 0.40222999453544617, 0.7921029925346375,
+ 0.5532029867172241, 0.5532029867172241, 0.622842013835907, 0.6959879994392395, 0.6959879994392395, 0.17663900554180145,
+ 0.6703829765319824, 0.7403979897499084, 0.048958998173475266, 0.5562090277671814, 0.8310419917106628, 0,
+ 0.5777599811553955, 0.19519099593162537, 0.792523980140686, 0.7223830223083496, 0.2989560067653656, 0.623528003692627,
+ 0.9094089865684509, 0.3763520121574402, 0.1770150065422058, 0.902646005153656, 0.4275760054588318, 0.04906899854540825,
+ 0.8310419917106628, 0.5562090277671814, 0, 0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+ 0.7723940014839172, 0.15251100063323975, 0.616562008857727, 0.9660869836807251, 0.19075599312782288, 0.1740349978208542,
+ 0.9799150228500366, 0.19348600506782532, 0.048277001827955246, 0.9810580015182495, 0.1937119960784912, 0,
+ 0.9999480247497559, 0.006622000131756067, 0.007786999922245741, 0.9989290237426758, 0.04125700145959854, -0.020945999771356583,
+ 0.9700260162353516, -0.18230900168418884, 0.1606609970331192, 0.9929869771003723, -0.1116809993982315, 0.038782998919487,
+ 0.8677089810371399, -0.30993399024009705, 0.38861599564552307, 0.9675049781799316, -0.18179599940776825, 0.17574100196361542,
+ 0.6127229928970337, -0.23797500133514404, 0.753616988658905, 0.781611979007721, -0.1585649996995926, 0.6032750010490417,
+ 0.13049399852752686, -0.02585900016129017, 0.9911119937896729, 0.16583800315856934, -0.04606600105762482, 0.9850770235061646,
+ 0.9847609996795654, -0.03004699945449829, -0.17129500210285187, 0.9463850259780884, 0.008138000033795834, 0.3229379951953888,
+ 0.6942890286445618, 0.06011800095438957, 0.7171810269355774, 0.405923992395401, 0.09244199842214584, 0.9092199802398682,
+ 0.1477230042219162, 0.0024739999789744616, 0.9890260100364685, 0.991798996925354, -0.11557900160551071, -0.05454900115728378,
+ 0.9920099973678589, 0.07202500104904175, 0.10358300060033798, 0.8882240056991577, 0.2238840013742447, 0.40116599202156067,
+ 0.6046879887580872, 0.13691100478172302, 0.7846069931983948, 0.12908099591732025, -0.06111999973654747, 0.989749014377594,
+ 0.9954820275306702, -0.09436299651861191, 0.010502999648451805, 0.9981970191001892, 0.012060999870300293, 0.05880200117826462,
+ 0.9550639986991882, 0.09819000214338303, 0.27966299653053284, 0.6606940031051636, 0.05169999971985817, 0.7488729953765869,
+ 0.07273799926042557, -0.04034300148487091, 0.9965350031852722, 0.9999179840087891, 0.007191000040620565, 0.010560999624431133,
+ 0.9989050030708313, 0.04436499997973442, -0.014883999712765217, 0.9694769978523254, -0.17860299348831177, 0.1679760068655014,
+ 0.9924619793891907, -0.10775599628686905, 0.058378998190164566, 0.8567489981651306, -0.28829601407051086, 0.4276289939880371,
+ 0.9473999738693237, -0.16112199425697327, 0.27653801441192627, 0.5627779960632324, -0.19747799634933472, 0.8026729822158813,
+ 0.6577669978141785, -0.11438000202178955, 0.7444859743118286, 0.07901199907064438, 0.0013689999468624592, 0.9968730211257935,
+ 0.07274100184440613, -0.02020600065588951, 0.9971460103988647, 0.9888780117034912, 0.025808999314904213, -0.14647500216960907,
+ 0.9453979730606079, -0.006663000211119652, 0.3258500099182129, 0.6921399831771851, -0.04972299933433533, 0.7200480103492737,
+ 0.3957499861717224, -0.08134900033473969, 0.9147480130195618, 0.13914500176906586, -0.00007899999764049426, 0.9902719855308533,
+ 0.9924669861793518, -0.10311000049114227, -0.06616800278425217, 0.9926300048828125, 0.07926999777555466, 0.09165900200605392,
+ 0.900858998298645, 0.2553130090236664, 0.3510949909687042, 0.6513699889183044, 0.18318000435829163, 0.7363160252571106,
+ 0.15978699922561646, -0.02714099921286106, 0.9867780208587646, 0.9955620169639587, -0.09379199892282486, 0.0077309999614953995,
+ 0.9991030097007751, 0.01610800065100193, 0.039149001240730286, 0.9764699935913086, 0.12068899720907211, 0.17871999740600586,
+ 0.7859060168266296, 0.10103499889373779, 0.6100350022315979, 0.16579000651836395, -0.014832000248134136, 0.986050009727478,
+ 0.1655299961566925, -0.10078699886798859, 0.9810410141944885, -0.0046790000051259995, -0.1750659942626953, 0.9845460057258606,
+ -0.3859579861164093, -0.06494200229644775, 0.9202280044555664, -0.3219670057296753, -0.05600599944591522, 0.9450929760932922,
+ -0.6471610069274902, -0.11495299637317657, 0.7536370158195496, -0.5616440176963806, -0.078855000436306, 0.8236119747161865,
+ -0.8379700183868408, -0.23749999701976776, 0.4913240075111389, -0.7512590289115906, -0.1447169929742813, 0.6439470052719116,
+ -0.9052090048789978, -0.2807050049304962, 0.3190630078315735, -0.8249419927597046, -0.2209009975194931, 0.5202630162239075,
+ -0.13363699615001678, 0.0291920006275177, 0.9905999898910522, -0.4039649963378906, 0.0019519999623298645, 0.9147719740867615,
+ -0.7191359996795654, 0.002443999983370304, 0.6948649883270264, -0.9637579917907715, 0.026884999126195908, 0.26541900634765625,
+ -0.9637719988822937, 0.2207069993019104, -0.14977200329303741, 0.03522900119423866, 0.06716900318861008, 0.9971190094947815,
+ -0.3620629906654358, -0.01676199957728386, 0.9320030212402344, -0.6534259915351868, 0.007120999973267317, 0.7569569945335388,
+ -0.8528590202331543, 0.11686599999666214, 0.5088940262794495, -0.8814889788627625, 0.3579840064048767, 0.3079349994659424,
+ 0.0726580023765564, 0.02018200047314167, 0.9971529841423035, -0.37608298659324646, -0.025955000892281532, 0.926222026348114,
+ -0.6568350195884705, -0.015021000057458878, 0.7538840174674988, -0.8238760232925415, 0.03257700055837631, 0.5658339858055115,
+ -0.8688690066337585, 0.13078700006008148, 0.4774540066719055, 0.07265599817037582, -0.07700400054454803, 0.994379997253418,
+ -0.0343950018286705, -0.151870995759964, 0.9878020286560059, -0.40362000465393066, -0.05282000079751015, 0.9134010076522827,
+ -0.37586501240730286, -0.041078001260757446, 0.9257640242576599, -0.6878190040588379, -0.0810059979557991, 0.721347987651825,
+ -0.6558970212936401, -0.052101001143455505, 0.7530509829521179, -0.8708800077438354, -0.2062380015850067, 0.44613200426101685,
+ -0.8175939917564392, -0.12448199838399887, 0.5621780157089233, -0.8926960229873657, -0.3055669963359833, 0.33124300837516785,
+ -0.8565059900283813, -0.21024300158023834, 0.4713769853115082, -0.15155400335788727, -0.025412000715732574, 0.9881219863891602,
+ -0.41033700108528137, -0.0026420000940561295, 0.9119300246238708, -0.7240620255470276, 0.00047400000039488077, 0.6897349953651428,
+ -0.9655590057373047, -0.017078999429941177, 0.2596229910850525, -0.973825991153717, -0.19711799919605255, -0.1131730005145073,
+ 0.06214199960231781, 0.08235500007867813, 0.9946640133857727, -0.3334290087223053, 0.007625999860465527, 0.9427440166473389,
+ -0.608610987663269, 0.04885999858379364, 0.7919629812240601, -0.8253309726715088, 0.14631199836730957, 0.5453640222549438,
+ -0.9105669856071472, 0.3146660029888153, 0.2680560052394867, 0.16523399949073792, 0.04589800164103508, 0.985185980796814,
+ -0.32260099053382874, -0.010471000336110592, 0.9464769959449768, -0.5639140009880066, 0.015166000463068485, 0.8256940245628357,
+ -0.758965015411377, 0.05617399886250496, 0.6487039923667908, -0.8382350206375122, 0.14245299994945526, 0.5263739824295044,
+ 0.9727830290794373, -0.019794000312685966, 0.2308720052242279, 0.9828159809112549, -0.036465998739004135, 0.18095199763774872,
+ 0.9050639867782593, -0.02252200059592724, 0.4246790111064911, 0.8354039788246155, -0.03220000118017197, 0.5486930012702942,
+ 0.6465700268745422, -0.045921001583337784, 0.7614709734916687, 0.4826749861240387, -0.04895399883389473, 0.8744300007820129,
+ 0.4453999996185303, 0.17256900668144226, 0.8785430192947388, 0.47231200337409973, 0.13768500089645386, 0.8706120252609253,
+ 0.4824250042438507, 0.3898639976978302, 0.7843930125236511, 0.641398012638092, 0.4275979995727539, 0.6370000243186951,
+ 0.9863939881324768, 0.0994419977068901, 0.13091400265693665, 0.9154840111732483, 0.2120320051908493, 0.34195101261138916,
+ 0.7246469855308533, 0.245046004652977, 0.6440799832344055, 0.35685500502586365, 0.17885500192642212, 0.9168779850006104,
+ 0.14101800322532654, 0.24263200163841248, 0.9598140120506287, 0.9366779923439026, 0.16484400629997253, 0.3089669942855835,
+ 0.7982620000839233, 0.2441370040178299, 0.5506129860877991, 0.4769439995288849, 0.2904820144176483, 0.8295450210571289,
+ 0.4125959873199463, -0.017246000468730927, 0.9107509851455688, 0.341374009847641, -0.37689098715782166, 0.8610560297966003,
+ 0.9026100039482117, 0.14119599759578705, 0.40664398670196533, 0.7326020002365112, 0.1491979956626892, 0.6641039848327637,
+ 0.38115599751472473, 0.15792299807071686, 0.9109230041503906, 0.5317370295524597, -0.02143399976193905, 0.846638023853302,
+ 0.7915729880332947, -0.3539769947528839, 0.49810999631881714, 0.9087340235710144, -0.07959599792957306, 0.40971601009368896,
+ 0.9386569857597351, -0.17680299282073975, 0.29607900977134705, 0.7781569957733154, -0.19467000663280487, 0.5971400141716003,
+ 0.738847017288208, -0.07674700021743774, 0.6694890260696411, 0.43915998935699463, -0.22276799380779266, 0.870352029800415,
+ 0.3863860070705414, -0.0790880024433136, 0.918940007686615, 0.3576120138168335, 0.07325199991464615, 0.9309930205345154,
+ 0.5227140188217163, 0.16167999804019928, 0.8370360136032104, 0.4246380031108856, 0.3233239948749542, 0.845661997795105,
+ 0.733618974685669, 0.48907899856567383, 0.4718089997768402, 0.9886019825935364, -0.10717800259590149, 0.10573200136423111,
+ 0.9131960272789001, -0.22303399443626404, 0.3410690128803253, 0.7163559794425964, -0.25636500120162964, 0.6489310264587402,
+ 0.35149699449539185, -0.15968100726604462, 0.922469973564148, 0.07999800145626068, -0.2107039988040924, 0.9742709994316101,
+ 0.9883249998092651, 0.04732999950647354, 0.14482200145721436, 0.9210500121116638, 0.07413999736309052, 0.3823229968547821,
+ 0.6804890036582947, 0.11895299702882767, 0.7230389714241028, 0.4935390055179596, -0.10269299894571304, 0.8636389970779419,
+ 0.3912479877471924, -0.4752289950847626, 0.7880880236625671, 0.9700270295143127, 0.07970499992370605, 0.2295520007610321,
+ 0.831250011920929, 0.10592100024223328, 0.5457149744033813, 0.4774230122566223, 0.13252699375152588, 0.8686220049858093,
+ 0.47922399640083313, -0.0024129999801516533, 0.877689003944397, 0.6902980208396912, -0.29711300134658813, 0.6597059965133667,
+ 0.6312130093574524, 0.4550989866256714, 0.628055989742279, 0.26494699716567993, 0.5426689982414246, 0.797065019607544,
+ 0.4216960072517395, 0.6728450059890747, 0.6078259944915771, 0.7324270009994507, 0.5829970240592957, 0.35166099667549133,
+ 0.5086709856987, 0.8606399893760681, -0.023507000878453255, 0.7640720009803772, 0.6449369788169861, -0.015798000618815422,
+ 0.19029100239276886, 0.2773289978504181, -0.9417420029640198, 0.02588699944317341, 0.0005750000127591193, -0.9996650218963623,
+ -0.33045700192451477, -0.4387669861316681, -0.8356329798698425, -0.6271269917488098, -0.4645389914512634, -0.6252319812774658,
+ -0.02311599999666214, 0.2469020038843155, 0.9687650203704834, -0.012950999662280083, 0.45514100790023804, 0.8903250098228455,
+ -0.001180000021122396, 0.9888520240783691, 0.14889399707317352, 0.019520999863743782, 0.6841210126876831, -0.7291070222854614,
+ 0.012253000400960445, 0.007784999907016754, -0.9998949766159058, 0.3314639925956726, -0.3832260072231293, 0.8621309995651245,
+ 0.08274699747562408, -0.16047699749469757, 0.9835649728775024, -0.381630003452301, 0.638043999671936, 0.6687729954719543,
+ -0.44988399744033813, 0.787883996963501, -0.42052799463272095, -0.2780170142650604, 0.5983560085296631, -0.7514500021934509,
+ 0.7378140091896057, -0.4918749928474426, 0.4622659981250763, 0.6153389811515808, -0.45540300011634827, 0.6434019804000854,
+ -0.43678900599479675, 0.33411499857902527, 0.8352140188217163, -0.7429530024528503, 0.6388909816741943, -0.1995989978313446,
+ -0.7432950139045715, 0.5977380275726318, -0.3003700077533722, 0.7197920083999634, 0.5168960094451904, 0.4633769989013672,
+ 0.22183099389076233, 0.4485720098018646, 0.8657789826393127, 0.08203200250864029, 0.15848000347614288, 0.9839479923248291,
+ 0.5953459739685059, 0.4811680018901825, 0.6434599757194519, -0.37556400895118713, -0.6215270161628723, 0.6875,
+ -0.42666301131248474, -0.33534398674964905, 0.8399419784545898, -0.44476398825645447, -0.7887529730796814, -0.42432600259780884,
+ -0.7557309865951538, -0.6222699880599976, -0.20408600568771362, -0.4292669892311096, -0.5361850261688232, -0.7267979979515076,
+ -0.7655900120735168, -0.5671039819717407, -0.30375200510025024, 0.007348000071942806, -0.21113499999046326, 0.9774289727210999,
+ -0.01990099996328354, -0.4373210072517395, 0.8990849852561951, -0.008775000460445881, -0.9864199757575989, 0.16400499641895294,
+ 0.024855999276041985, -0.6829339861869812, -0.7300570011138916, 0.014514000155031681, 0.03655200079083443, -0.9992259740829468,
+ 0.40192899107933044, -0.4676550030708313, 0.7872430086135864, 0.41696101427078247, -0.6813820004463196, 0.6015490293502808,
+ 0.5033609867095947, -0.8637740015983582, -0.022839000448584557, 0.2058819979429245, -0.2945750057697296, -0.9331870079040527,
+ -0.2351589947938919, 0.5535579919815063, -0.7989199757575989, 0.6533820033073425, -0.435588002204895, 0.619156002998352,
+ 0.7555500268936157, -0.554410994052887, 0.3489600121974945, 0.7765160202980042, -0.6298360228538513, -0.01814199984073639,
+ 0.025975000113248825, 0.008264999836683273, -0.9996280074119568, -0.6086519956588745, 0.49536699056625366, -0.6198019981384277,
+ -0.9813200235366821, 0.19238099455833435, 0, -0.831650972366333, 0.5552989840507507, 0,
+ -0.4425640106201172, 0.38308998942375183, 0.8107889890670776, -0.5623509883880615, 0.11026400327682495, 0.8195139765739441,
+ 0.367917001247406, -0.15178599953651428, 0.917385995388031, 0.3960669934749603, -0.07774800062179565, 0.9149240255355835,
+ 0.3283520042896271, -0.13562799990177155, 0.9347670078277588, 0.3530749976634979, -0.06952299922704697, 0.9330080151557922,
+ -0.5935590267181396, 0.20035800337791443, 0.7794510126113892, -0.6201800107955933, 0.12245599925518036, 0.7748429775238037,
+ -0.5552989840507507, 0.831650972366333, 0, -0.2616960108280182, 0.523730993270874, 0.8106920123100281,
+ 0.2819640040397644, -0.2819199860095978, 0.9170699715614319, 0.25169798731803894, -0.25161200761795044, 0.9345269799232483,
+ -0.4710330069065094, 0.41249701380729675, 0.7797269821166992, -0.19238099455833435, 0.9813200235366821, 0,
+ -0.04031100124120712, 0.5840420126914978, 0.8107219934463501, 0.1517850011587143, -0.3678950071334839, 0.9173960089683533,
+ 0.13561999797821045, -0.3282899856567383, 0.9347900152206421, -0.27737799286842346, 0.561601996421814, 0.779528021812439,
+ -1, 0, 0, 0.29074999690055847, 0.5413560271263123, 0.7889220118522644,
+ 0.07767199724912643, -0.39607399702072144, 0.9149270057678223, 0.0693729966878891, -0.3530940115451813, 0.9330130219459534,
+ -0.12221000343561172, 0.6202139854431152, 0.7748550176620483, 0.19238099455833435, 0.9813200235366821, 0,
+ 0.5552989840507507, 0.831650972366333, 0, 0.38308998942375183, 0.4425640106201172, 0.8107889890670776,
+ 0.11026400327682495, 0.5623509883880615, 0.8195139765739441, -0.15178599953651428, -0.367917001247406, 0.917385995388031,
+ -0.07774800062179565, -0.3960669934749603, 0.9149240255355835, -0.13562799990177155, -0.3283520042896271, 0.9347670078277588,
+ -0.06952299922704697, -0.3530749976634979, 0.9330080151557922, 0.20035800337791443, 0.5935590267181396, 0.7794510126113892,
+ 0.12245599925518036, 0.6201800107955933, 0.7748429775238037, 0.831650972366333, 0.5552989840507507, 0,
+ 0.523730993270874, 0.2616960108280182, 0.8106920123100281, -0.2819199860095978, -0.2819640040397644, 0.9170699715614319,
+ -0.25161200761795044, -0.25169798731803894, 0.9345269799232483, 0.41249701380729675, 0.4710330069065094, 0.7797269821166992,
+ 0.9813200235366821, 0.19238099455833435, 0, 0.5840420126914978, 0.04031100124120712, 0.8107219934463501,
+ -0.3678950071334839, -0.1517850011587143, 0.9173960089683533, -0.3282899856567383, -0.13561999797821045, 0.9347900152206421,
+ 0.561601996421814, 0.27737799286842346, 0.779528021812439, -1, 0, 0,
+ 0.5413560271263123, -0.29074999690055847, 0.7889220118522644, -0.39607399702072144, -0.07767199724912643, 0.9149270057678223,
+ -0.3530940115451813, -0.0693729966878891, 0.9330130219459534, 0.6202139854431152, 0.12221000343561172, 0.7748550176620483,
+ 0.9813200235366821, -0.19238099455833435, 0, 0.831650972366333, -0.5552989840507507, 0,
+ 0.4425640106201172, -0.38308998942375183, 0.8107889890670776, 0.5623509883880615, -0.11026400327682495, 0.8195139765739441,
+ -0.367917001247406, 0.15178599953651428, 0.917385995388031, -0.3960669934749603, 0.07774800062179565, 0.9149240255355835,
+ -0.3283520042896271, 0.13562799990177155, 0.9347670078277588, -0.3530749976634979, 0.06952299922704697, 0.9330080151557922,
+ 0.5935590267181396, -0.20035800337791443, 0.7794510126113892, 0.6201800107955933, -0.12245599925518036, 0.7748429775238037,
+ 0.5552989840507507, -0.831650972366333, 0, 0.2616960108280182, -0.523730993270874, 0.8106920123100281,
+ -0.2819640040397644, 0.2819199860095978, 0.9170699715614319, -0.25169798731803894, 0.25161200761795044, 0.9345269799232483,
+ 0.4710330069065094, -0.41249701380729675, 0.7797269821166992, 0.19238099455833435, -0.9813200235366821, 0,
+ 0.04031100124120712, -0.5840420126914978, 0.8107219934463501, -0.1517850011587143, 0.3678950071334839, 0.9173960089683533,
+ -0.13561999797821045, 0.3282899856567383, 0.9347900152206421, 0.27737799286842346, -0.561601996421814, 0.779528021812439,
+ -1, 0, 0, -0.29074999690055847, -0.5413560271263123, 0.7889220118522644,
+ -0.07767199724912643, 0.39607399702072144, 0.9149270057678223, -0.0693729966878891, 0.3530940115451813, 0.9330130219459534,
+ 0.12221000343561172, -0.6202139854431152, 0.7748550176620483, -0.19238099455833435, -0.9813200235366821, 0,
+ -0.5552989840507507, -0.831650972366333, 0, -0.38308998942375183, -0.4425640106201172, 0.8107889890670776,
+ -0.11026400327682495, -0.5623509883880615, 0.8195139765739441, 0.15178599953651428, 0.367917001247406, 0.917385995388031,
+ 0.07774800062179565, 0.3960669934749603, 0.9149240255355835, 0.13562799990177155, 0.3283520042896271, 0.9347670078277588,
+ 0.06952299922704697, 0.3530749976634979, 0.9330080151557922, -0.20035800337791443, -0.5935590267181396, 0.7794510126113892,
+ -0.12245599925518036, -0.6201800107955933, 0.7748429775238037, -0.831650972366333, -0.5552989840507507, 0,
+ -0.523730993270874, -0.2616960108280182, 0.8106920123100281, 0.2819199860095978, 0.2819640040397644, 0.9170699715614319,
+ 0.25161200761795044, 0.25169798731803894, 0.9345269799232483, -0.41249701380729675, -0.4710330069065094, 0.7797269821166992,
+ -0.9813200235366821, -0.19238099455833435, 0, -0.5840420126914978, -0.04031100124120712, 0.8107219934463501,
+ 0.3678950071334839, 0.1517850011587143, 0.9173960089683533, 0.3282899856567383, 0.13561999797821045, 0.9347900152206421,
+ -0.561601996421814, -0.27737799286842346, 0.779528021812439, -1, 0, 0,
+ -0.5413560271263123, 0.29074999690055847, 0.7889220118522644, 0.39607399702072144, 0.07767199724912643, 0.9149270057678223,
+ 0.3530940115451813, 0.0693729966878891, 0.9330130219459534, -0.6202139854431152, -0.12221000343561172, 0.7748550176620483,
+ -0.6201800107955933, 0.12245599925518036, 0.7748429775238037, -0.5616469979286194, 0.27755099534988403, 0.7794349789619446,
+ -0.8979210257530212, 0.37159600853919983, 0.23590999841690063, -0.9542099833488464, 0.18841099739074707, 0.23234599828720093,
+ -0.9101200103759766, 0.3766449987888336, 0.17268399894237518, -0.966795027256012, 0.19089600443840027, 0.16990099847316742,
+ -0.8549879789352417, 0.35383298993110657, 0.3792079985141754, -0.9100499749183655, 0.17969100177288055, 0.3735229969024658,
+ -0.8064150214195251, 0.2724289894104004, 0.5248600244522095, -0.8383409976959229, 0.16553199291229248, 0.5194069743156433,
+ -0.4125959873199463, 0.47094500064849854, 0.7797279953956604, -0.687192976474762, 0.687192976474762, 0.23565199971199036,
+ -0.6965190172195435, 0.6965190172195435, 0.17240400612354279, -0.6544880270957947, 0.6544870138168335, 0.37853899598121643,
+ -0.6404970288276672, 0.5611429810523987, 0.5242909789085388, -0.20047900080680847, 0.5933949947357178, 0.7795450091362,
+ -0.3715969920158386, 0.8979210257530212, 0.23590999841690063, -0.3766449987888336, 0.9101200103759766, 0.17268399894237518,
+ -0.35383298993110657, 0.8549879789352417, 0.3792079985141754, -0.3770729899406433, 0.7630789875984192, 0.5249059796333313,
+ -0.12245900183916092, 0.6201940178871155, 0.7748309969902039, -0.18841099739074707, 0.9542099833488464, 0.23234599828720093,
+ -0.19089600443840027, 0.966795027256012, 0.16990099847316742, -0.17969200015068054, 0.9100499749183655, 0.3735229969024658,
+ -0.16553199291229248, 0.8383409976959229, 0.5194069743156433, 0.12245599925518036, 0.6201800107955933, 0.7748429775238037,
+ 0.27755099534988403, 0.5616469979286194, 0.7794349789619446, 0.37159600853919983, 0.8979210257530212, 0.23590999841690063,
+ 0.18841099739074707, 0.9542099833488464, 0.23234599828720093, 0.3766449987888336, 0.9101200103759766, 0.17268399894237518,
+ 0.19089600443840027, 0.966795027256012, 0.16990099847316742, 0.35383298993110657, 0.8549879789352417, 0.3792079985141754,
+ 0.17969100177288055, 0.9100499749183655, 0.3735229969024658, 0.2724289894104004, 0.8064150214195251, 0.5248600244522095,
+ 0.16553199291229248, 0.8383409976959229, 0.5194069743156433, 0.47094500064849854, 0.4125959873199463, 0.7797279953956604,
+ 0.687192976474762, 0.687192976474762, 0.23565199971199036, 0.6965190172195435, 0.6965190172195435, 0.17240400612354279,
+ 0.6544870138168335, 0.6544880270957947, 0.37853899598121643, 0.5611429810523987, 0.6404970288276672, 0.5242909789085388,
+ 0.5933949947357178, 0.20047900080680847, 0.7795450091362, 0.8979210257530212, 0.3715969920158386, 0.23590999841690063,
+ 0.9101200103759766, 0.3766449987888336, 0.17268399894237518, 0.8549879789352417, 0.35383298993110657, 0.3792079985141754,
+ 0.7630789875984192, 0.3770729899406433, 0.5249059796333313, 0.6201940178871155, 0.12245900183916092, 0.7748309969902039,
+ 0.9542099833488464, 0.18841099739074707, 0.23234599828720093, 0.966795027256012, 0.19089600443840027, 0.16990099847316742,
+ 0.9100499749183655, 0.17969200015068054, 0.3735229969024658, 0.8383409976959229, 0.16553199291229248, 0.5194069743156433,
+ 0.6201800107955933, -0.12245599925518036, 0.7748429775238037, 0.5616469979286194, -0.27755099534988403, 0.7794349789619446,
+ 0.8979210257530212, -0.37159600853919983, 0.23590999841690063, 0.9542099833488464, -0.18841099739074707, 0.23234599828720093,
+ 0.9101200103759766, -0.3766449987888336, 0.17268399894237518, 0.966795027256012, -0.19089600443840027, 0.16990099847316742,
+ 0.8549879789352417, -0.35383298993110657, 0.3792079985141754, 0.9100499749183655, -0.17969100177288055, 0.3735229969024658,
+ 0.8064150214195251, -0.2724289894104004, 0.5248600244522095, 0.8383409976959229, -0.16553199291229248, 0.5194069743156433,
+ 0.4125959873199463, -0.47094500064849854, 0.7797279953956604, 0.687192976474762, -0.687192976474762, 0.23565199971199036,
+ 0.6965190172195435, -0.6965190172195435, 0.17240400612354279, 0.6544880270957947, -0.6544870138168335, 0.37853899598121643,
+ 0.6404970288276672, -0.5611429810523987, 0.5242909789085388, 0.20047900080680847, -0.5933949947357178, 0.7795450091362,
+ 0.3715969920158386, -0.8979210257530212, 0.23590999841690063, 0.3766449987888336, -0.9101200103759766, 0.17268399894237518,
+ 0.35383298993110657, -0.8549879789352417, 0.3792079985141754, 0.3770729899406433, -0.7630789875984192, 0.5249059796333313,
+ 0.12245900183916092, -0.6201940178871155, 0.7748309969902039, 0.18841099739074707, -0.9542099833488464, 0.23234599828720093,
+ 0.19089600443840027, -0.966795027256012, 0.16990099847316742, 0.17969200015068054, -0.9100499749183655, 0.3735229969024658,
+ 0.16553199291229248, -0.8383409976959229, 0.5194069743156433, -0.12245599925518036, -0.6201800107955933, 0.7748429775238037,
+ -0.27755099534988403, -0.5616469979286194, 0.7794349789619446, -0.37159600853919983, -0.8979210257530212, 0.23590999841690063,
+ -0.18841099739074707, -0.9542099833488464, 0.23234599828720093, -0.3766449987888336, -0.9101200103759766, 0.17268399894237518,
+ -0.19089600443840027, -0.966795027256012, 0.16990099847316742, -0.35383298993110657, -0.8549879789352417, 0.3792079985141754,
+ -0.17969100177288055, -0.9100499749183655, 0.3735229969024658, -0.2724289894104004, -0.8064150214195251, 0.5248600244522095,
+ -0.16553199291229248, -0.8383409976959229, 0.5194069743156433, -0.47094500064849854, -0.4125959873199463, 0.7797279953956604,
+ -0.687192976474762, -0.687192976474762, 0.23565199971199036, -0.6965190172195435, -0.6965190172195435, 0.17240400612354279,
+ -0.6544870138168335, -0.6544880270957947, 0.37853899598121643, -0.5611429810523987, -0.6404970288276672, 0.5242909789085388,
+ -0.5933949947357178, -0.20047900080680847, 0.7795450091362, -0.8979210257530212, -0.3715969920158386, 0.23590999841690063,
+ -0.9101200103759766, -0.3766449987888336, 0.17268399894237518, -0.8549879789352417, -0.35383298993110657, 0.3792079985141754,
+ -0.7630789875984192, -0.3770729899406433, 0.5249059796333313, -0.6201940178871155, -0.12245900183916092, 0.7748309969902039,
+ -0.9542099833488464, -0.18841099739074707, 0.23234599828720093, -0.966795027256012, -0.19089600443840027, 0.16990099847316742,
+ -0.9100499749183655, -0.17969200015068054, 0.3735229969024658, -0.8383409976959229, -0.16553199291229248, 0.5194069743156433 };
+
+
+float teapotTexCoords[] = { 2, 2, 0, 1.75, 2, 0, 1.75, 1.975000023841858,
+ 0, 2, 1.975000023841858, 0, 1.75, 1.9500000476837158, 0, 2,
+ 1.9500000476837158, 0, 1.75, 1.9249999523162842, 0, 2, 1.9249999523162842, 0,
+ 1.75, 1.899999976158142, 0, 2, 1.899999976158142, 0, 1.5, 2,
+ 0, 1.5, 1.975000023841858, 0, 1.5, 1.9500000476837158, 0, 1.5,
+ 1.9249999523162842, 0, 1.5, 1.899999976158142, 0, 1.25, 2, 0,
+ 1.25, 1.975000023841858, 0, 1.25, 1.9500000476837158, 0, 1.25, 1.9249999523162842,
+ 0, 1.25, 1.899999976158142, 0, 1, 2, 0, 1,
+ 1.975000023841858, 0, 1, 1.9500000476837158, 0, 1, 1.9249999523162842, 0,
+ 1, 1.899999976158142, 0, 1, 2, 0, 0.75, 2,
+ 0, 0.75, 1.975000023841858, 0, 1, 1.975000023841858, 0, 0.75,
+ 1.9500000476837158, 0, 1, 1.9500000476837158, 0, 0.75, 1.9249999523162842, 0,
+ 1, 1.9249999523162842, 0, 0.75, 1.899999976158142, 0, 1, 1.899999976158142,
+ 0, 0.5, 2, 0, 0.5, 1.975000023841858, 0, 0.5,
+ 1.9500000476837158, 0, 0.5, 1.9249999523162842, 0, 0.5, 1.899999976158142, 0,
+ 0.25, 2, 0, 0.25, 1.975000023841858, 0, 0.25, 1.9500000476837158,
+ 0, 0.25, 1.9249999523162842, 0, 0.25, 1.899999976158142, 0, 0,
+ 2, 0, 0, 1.975000023841858, 0, 0, 1.9500000476837158, 0,
+ 0, 1.9249999523162842, 0, 0, 1.899999976158142, 0, 2, 2,
+ 0, 1.75, 2, 0, 1.75, 1.975000023841858, 0, 2,
+ 1.975000023841858, 0, 1.75, 1.9500000476837158, 0, 2, 1.9500000476837158, 0,
+ 1.75, 1.9249999523162842, 0, 2, 1.9249999523162842, 0, 1.75, 1.899999976158142,
+ 0, 2, 1.899999976158142, 0, 1.5, 2, 0, 1.5,
+ 1.975000023841858, 0, 1.5, 1.9500000476837158, 0, 1.5, 1.9249999523162842, 0,
+ 1.5, 1.899999976158142, 0, 1.25, 2, 0, 1.25, 1.975000023841858,
+ 0, 1.25, 1.9500000476837158, 0, 1.25, 1.9249999523162842, 0, 1.25,
+ 1.899999976158142, 0, 1, 2, 0, 1, 1.975000023841858, 0,
+ 1, 1.9500000476837158, 0, 1, 1.9249999523162842, 0, 1, 1.899999976158142,
+ 0, 1, 2, 0, 0.75, 2, 0, 0.75,
+ 1.975000023841858, 0, 1, 1.975000023841858, 0, 0.75, 1.9500000476837158, 0,
+ 1, 1.9500000476837158, 0, 0.75, 1.9249999523162842, 0, 1, 1.9249999523162842,
+ 0, 0.75, 1.899999976158142, 0, 1, 1.899999976158142, 0, 0.5,
+ 2, 0, 0.5, 1.975000023841858, 0, 0.5, 1.9500000476837158, 0,
+ 0.5, 1.9249999523162842, 0, 0.5, 1.899999976158142, 0, 0.25, 2,
+ 0, 0.25, 1.975000023841858, 0, 0.25, 1.9500000476837158, 0, 0.25,
+ 1.9249999523162842, 0, 0.25, 1.899999976158142, 0, 0, 2, 0,
+ 0, 1.975000023841858, 0, 0, 1.9500000476837158, 0, 0, 1.9249999523162842,
+ 0, 0, 1.899999976158142, 0, 2, 1.899999976158142, 0, 1.75,
+ 1.899999976158142, 0, 1.75, 1.6749999523162842, 0, 2, 1.6749999523162842, 0,
+ 1.75, 1.4500000476837158, 0, 2, 1.4500000476837158, 0, 1.75, 1.225000023841858,
+ 0, 2, 1.225000023841858, 0, 1.75, 1, 0, 2,
+ 1, 0, 1.5, 1.899999976158142, 0, 1.5, 1.6749999523162842, 0,
+ 1.5, 1.4500000476837158, 0, 1.5, 1.225000023841858, 0, 1.5, 1,
+ 0, 1.25, 1.899999976158142, 0, 1.25, 1.6749999523162842, 0, 1.25,
+ 1.4500000476837158, 0, 1.25, 1.225000023841858, 0, 1.25, 1, 0,
+ 1, 1.899999976158142, 0, 1, 1.6749999523162842, 0, 1, 1.4500000476837158,
+ 0, 1, 1.225000023841858, 0, 1, 1, 0, 1,
+ 1.899999976158142, 0, 0.75, 1.899999976158142, 0, 0.75, 1.6749999523162842, 0,
+ 1, 1.6749999523162842, 0, 0.75, 1.4500000476837158, 0, 1, 1.4500000476837158,
+ 0, 0.75, 1.225000023841858, 0, 1, 1.225000023841858, 0, 0.75,
+ 1, 0, 1, 1, 0, 0.5, 1.899999976158142, 0,
+ 0.5, 1.6749999523162842, 0, 0.5, 1.4500000476837158, 0, 0.5, 1.225000023841858,
+ 0, 0.5, 1, 0, 0.25, 1.899999976158142, 0, 0.25,
+ 1.6749999523162842, 0, 0.25, 1.4500000476837158, 0, 0.25, 1.225000023841858, 0,
+ 0.25, 1, 0, 0, 1.899999976158142, 0, 0, 1.6749999523162842,
+ 0, 0, 1.4500000476837158, 0, 0, 1.225000023841858, 0, 0,
+ 1, 0, 2, 1.899999976158142, 0, 1.75, 1.899999976158142, 0,
+ 1.75, 1.6749999523162842, 0, 2, 1.6749999523162842, 0, 1.75, 1.4500000476837158,
+ 0, 2, 1.4500000476837158, 0, 1.75, 1.225000023841858, 0, 2,
+ 1.225000023841858, 0, 1.75, 1, 0, 2, 1, 0,
+ 1.5, 1.899999976158142, 0, 1.5, 1.6749999523162842, 0, 1.5, 1.4500000476837158,
+ 0, 1.5, 1.225000023841858, 0, 1.5, 1, 0, 1.25,
+ 1.899999976158142, 0, 1.25, 1.6749999523162842, 0, 1.25, 1.4500000476837158, 0,
+ 1.25, 1.225000023841858, 0, 1.25, 1, 0, 1, 1.899999976158142,
+ 0, 1, 1.6749999523162842, 0, 1, 1.4500000476837158, 0, 1,
+ 1.225000023841858, 0, 1, 1, 0, 1, 1.899999976158142, 0,
+ 0.75, 1.899999976158142, 0, 0.75, 1.6749999523162842, 0, 1, 1.6749999523162842,
+ 0, 0.75, 1.4500000476837158, 0, 1, 1.4500000476837158, 0, 0.75,
+ 1.225000023841858, 0, 1, 1.225000023841858, 0, 0.75, 1, 0,
+ 1, 1, 0, 0.5, 1.899999976158142, 0, 0.5, 1.6749999523162842,
+ 0, 0.5, 1.4500000476837158, 0, 0.5, 1.225000023841858, 0, 0.5,
+ 1, 0, 0.25, 1.899999976158142, 0, 0.25, 1.6749999523162842, 0,
+ 0.25, 1.4500000476837158, 0, 0.25, 1.225000023841858, 0, 0.25, 1,
+ 0, 0, 1.899999976158142, 0, 0, 1.6749999523162842, 0, 0,
+ 1.4500000476837158, 0, 0, 1.225000023841858, 0, 0, 1, 0,
+ 2, 1, 0, 1.75, 1, 0, 1.75, 0.8500000238418579,
+ 0, 2, 0.8500000238418579, 0, 1.75, 0.699999988079071, 0, 2,
+ 0.699999988079071, 0, 1.75, 0.550000011920929, 0, 2, 0.550000011920929, 0,
+ 1.75, 0.4000000059604645, 0, 2, 0.4000000059604645, 0, 1.5, 1,
+ 0, 1.5, 0.8500000238418579, 0, 1.5, 0.699999988079071, 0, 1.5,
+ 0.550000011920929, 0, 1.5, 0.4000000059604645, 0, 1.25, 1, 0,
+ 1.25, 0.8500000238418579, 0, 1.25, 0.699999988079071, 0, 1.25, 0.550000011920929,
+ 0, 1.25, 0.4000000059604645, 0, 1, 1, 0, 1,
+ 0.8500000238418579, 0, 1, 0.699999988079071, 0, 1, 0.550000011920929, 0,
+ 1, 0.4000000059604645, 0, 1, 1, 0, 0.75, 1,
+ 0, 0.75, 0.8500000238418579, 0, 1, 0.8500000238418579, 0, 0.75,
+ 0.699999988079071, 0, 1, 0.699999988079071, 0, 0.75, 0.550000011920929, 0,
+ 1, 0.550000011920929, 0, 0.75, 0.4000000059604645, 0, 1, 0.4000000059604645,
+ 0, 0.5, 1, 0, 0.5, 0.8500000238418579, 0, 0.5,
+ 0.699999988079071, 0, 0.5, 0.550000011920929, 0, 0.5, 0.4000000059604645, 0,
+ 0.25, 1, 0, 0.25, 0.8500000238418579, 0, 0.25, 0.699999988079071,
+ 0, 0.25, 0.550000011920929, 0, 0.25, 0.4000000059604645, 0, 0,
+ 1, 0, 0, 0.8500000238418579, 0, 0, 0.699999988079071, 0,
+ 0, 0.550000011920929, 0, 0, 0.4000000059604645, 0, 2, 1,
+ 0, 1.75, 1, 0, 1.75, 0.8500000238418579, 0, 2,
+ 0.8500000238418579, 0, 1.75, 0.699999988079071, 0, 2, 0.699999988079071, 0,
+ 1.75, 0.550000011920929, 0, 2, 0.550000011920929, 0, 1.75, 0.4000000059604645,
+ 0, 2, 0.4000000059604645, 0, 1.5, 1, 0, 1.5,
+ 0.8500000238418579, 0, 1.5, 0.699999988079071, 0, 1.5, 0.550000011920929, 0,
+ 1.5, 0.4000000059604645, 0, 1.25, 1, 0, 1.25, 0.8500000238418579,
+ 0, 1.25, 0.699999988079071, 0, 1.25, 0.550000011920929, 0, 1.25,
+ 0.4000000059604645, 0, 1, 1, 0, 1, 0.8500000238418579, 0,
+ 1, 0.699999988079071, 0, 1, 0.550000011920929, 0, 1, 0.4000000059604645,
+ 0, 1, 1, 0, 0.75, 1, 0, 0.75,
+ 0.8500000238418579, 0, 1, 0.8500000238418579, 0, 0.75, 0.699999988079071, 0,
+ 1, 0.699999988079071, 0, 0.75, 0.550000011920929, 0, 1, 0.550000011920929,
+ 0, 0.75, 0.4000000059604645, 0, 1, 0.4000000059604645, 0, 0.5,
+ 1, 0, 0.5, 0.8500000238418579, 0, 0.5, 0.699999988079071, 0,
+ 0.5, 0.550000011920929, 0, 0.5, 0.4000000059604645, 0, 0.25, 1,
+ 0, 0.25, 0.8500000238418579, 0, 0.25, 0.699999988079071, 0, 0.25,
+ 0.550000011920929, 0, 0.25, 0.4000000059604645, 0, 0, 1, 0,
+ 0, 0.8500000238418579, 0, 0, 0.699999988079071, 0, 0, 0.550000011920929,
+ 0, 0, 0.4000000059604645, 0, 2, 0.4000000059604645, 0, 1.75,
+ 0.4000000059604645, 0, 1.75, 0.30000001192092896, 0, 2, 0.30000001192092896, 0,
+ 1.75, 0.20000000298023224, 0, 2, 0.20000000298023224, 0, 1.75, 0.10000000149011612,
+ 0, 2, 0.10000000149011612, 0, 1.75, 0, 0, 2,
+ 0, 0, 1.5, 0.4000000059604645, 0, 1.5, 0.30000001192092896, 0,
+ 1.5, 0.20000000298023224, 0, 1.5, 0.10000000149011612, 0, 1.5, 0,
+ 0, 1.25, 0.4000000059604645, 0, 1.25, 0.30000001192092896, 0, 1.25,
+ 0.20000000298023224, 0, 1.25, 0.10000000149011612, 0, 1.25, 0, 0,
+ 1, 0.4000000059604645, 0, 1, 0.30000001192092896, 0, 1, 0.20000000298023224,
+ 0, 1, 0.10000000149011612, 0, 1, 0, 0, 1,
+ 0.4000000059604645, 0, 0.75, 0.4000000059604645, 0, 0.75, 0.30000001192092896, 0,
+ 1, 0.30000001192092896, 0, 0.75, 0.20000000298023224, 0, 1, 0.20000000298023224,
+ 0, 0.75, 0.10000000149011612, 0, 1, 0.10000000149011612, 0, 0.75,
+ 0, 0, 1, 0, 0, 0.5, 0.4000000059604645, 0,
+ 0.5, 0.30000001192092896, 0, 0.5, 0.20000000298023224, 0, 0.5, 0.10000000149011612,
+ 0, 0.5, 0, 0, 0.25, 0.4000000059604645, 0, 0.25,
+ 0.30000001192092896, 0, 0.25, 0.20000000298023224, 0, 0.25, 0.10000000149011612, 0,
+ 0.25, 0, 0, 0, 0.4000000059604645, 0, 0, 0.30000001192092896,
+ 0, 0, 0.20000000298023224, 0, 0, 0.10000000149011612, 0, 0,
+ 0, 0, 2, 0.4000000059604645, 0, 1.75, 0.4000000059604645, 0,
+ 1.75, 0.30000001192092896, 0, 2, 0.30000001192092896, 0, 1.75, 0.20000000298023224,
+ 0, 2, 0.20000000298023224, 0, 1.75, 0.10000000149011612, 0, 2,
+ 0.10000000149011612, 0, 1.75, 0, 0, 2, 0, 0,
+ 1.5, 0.4000000059604645, 0, 1.5, 0.30000001192092896, 0, 1.5, 0.20000000298023224,
+ 0, 1.5, 0.10000000149011612, 0, 1.5, 0, 0, 1.25,
+ 0.4000000059604645, 0, 1.25, 0.30000001192092896, 0, 1.25, 0.20000000298023224, 0,
+ 1.25, 0.10000000149011612, 0, 1.25, 0, 0, 1, 0.4000000059604645,
+ 0, 1, 0.30000001192092896, 0, 1, 0.20000000298023224, 0, 1,
+ 0.10000000149011612, 0, 1, 0, 0, 1, 0.4000000059604645, 0,
+ 0.75, 0.4000000059604645, 0, 0.75, 0.30000001192092896, 0, 1, 0.30000001192092896,
+ 0, 0.75, 0.20000000298023224, 0, 1, 0.20000000298023224, 0, 0.75,
+ 0.10000000149011612, 0, 1, 0.10000000149011612, 0, 0.75, 0, 0,
+ 1, 0, 0, 0.5, 0.4000000059604645, 0, 0.5, 0.30000001192092896,
+ 0, 0.5, 0.20000000298023224, 0, 0.5, 0.10000000149011612, 0, 0.5,
+ 0, 0, 0.25, 0.4000000059604645, 0, 0.25, 0.30000001192092896, 0,
+ 0.25, 0.20000000298023224, 0, 0.25, 0.10000000149011612, 0, 0.25, 0,
+ 0, 0, 0.4000000059604645, 0, 0, 0.30000001192092896, 0, 0,
+ 0.20000000298023224, 0, 0, 0.10000000149011612, 0, 0, 0, 0,
+ 1, 1, 0, 0.875, 1, 0, 0.875, 0.875,
+ 0, 1, 0.875, 0, 0.875, 0.75, 0, 1,
+ 0.75, 0, 0.875, 0.625, 0, 1, 0.625, 0,
+ 0.875, 0.5, 0, 1, 0.5, 0, 0.75, 1,
+ 0, 0.75, 0.875, 0, 0.75, 0.75, 0, 0.75,
+ 0.625, 0, 0.75, 0.5, 0, 0.625, 1, 0,
+ 0.625, 0.875, 0, 0.625, 0.75, 0, 0.625, 0.625,
+ 0, 0.625, 0.5, 0, 0.5, 1, 0, 0.5,
+ 0.875, 0, 0.5, 0.75, 0, 0.5, 0.625, 0,
+ 0.5, 0.5, 0, 0.5, 1, 0, 0.375, 1,
+ 0, 0.375, 0.875, 0, 0.5, 0.875, 0, 0.375,
+ 0.75, 0, 0.5, 0.75, 0, 0.375, 0.625, 0,
+ 0.5, 0.625, 0, 0.375, 0.5, 0, 0.5, 0.5,
+ 0, 0.25, 1, 0, 0.25, 0.875, 0, 0.25,
+ 0.75, 0, 0.25, 0.625, 0, 0.25, 0.5, 0,
+ 0.125, 1, 0, 0.125, 0.875, 0, 0.125, 0.75,
+ 0, 0.125, 0.625, 0, 0.125, 0.5, 0, 0,
+ 1, 0, 0, 0.875, 0, 0, 0.75, 0,
+ 0, 0.625, 0, 0, 0.5, 0, 1, 0.5,
+ 0, 0.875, 0.5, 0, 0.875, 0.375, 0, 1,
+ 0.375, 0, 0.875, 0.25, 0, 1, 0.25, 0,
+ 0.875, 0.125, 0, 1, 0.125, 0, 0.875, 0,
+ 0, 1, 0, 0, 0.75, 0.5, 0, 0.75,
+ 0.375, 0, 0.75, 0.25, 0, 0.75, 0.125, 0,
+ 0.75, 0, 0, 0.625, 0.5, 0, 0.625, 0.375,
+ 0, 0.625, 0.25, 0, 0.625, 0.125, 0, 0.625,
+ 0, 0, 0.5, 0.5, 0, 0.5, 0.375, 0,
+ 0.5, 0.25, 0, 0.5, 0.125, 0, 0.5, 0,
+ 0, 0.5, 0.5, 0, 0.375, 0.5, 0, 0.375,
+ 0.375, 0, 0.5, 0.375, 0, 0.375, 0.25, 0,
+ 0.5, 0.25, 0, 0.375, 0.125, 0, 0.5, 0.125,
+ 0, 0.375, 0, 0, 0.5, 0, 0, 0.25,
+ 0.5, 0, 0.25, 0.375, 0, 0.25, 0.25, 0,
+ 0.25, 0.125, 0, 0.25, 0, 0, 0.125, 0.5,
+ 0, 0.125, 0.375, 0, 0.125, 0.25, 0, 0.125,
+ 0.125, 0, 0.125, 0, 0, 0, 0.5, 0,
+ 0, 0.375, 0, 0, 0.25, 0, 0, 0.125,
+ 0, 0, 0, 0, 0.5, 0, 0, 0.625,
+ 0, 0, 0.625, 0.22499999403953552, 0, 0.5, 0.22499999403953552, 0,
+ 0.625, 0.44999998807907104, 0, 0.5, 0.44999998807907104, 0, 0.625, 0.675000011920929,
+ 0, 0.5, 0.675000011920929, 0, 0.625, 0.8999999761581421, 0, 0.5,
+ 0.8999999761581421, 0, 0.75, 0, 0, 0.75, 0.22499999403953552, 0,
+ 0.75, 0.44999998807907104, 0, 0.75, 0.675000011920929, 0, 0.75, 0.8999999761581421,
+ 0, 0.875, 0, 0, 0.875, 0.22499999403953552, 0, 0.875,
+ 0.44999998807907104, 0, 0.875, 0.675000011920929, 0, 0.875, 0.8999999761581421, 0,
+ 1, 0, 0, 1, 0.22499999403953552, 0, 1, 0.44999998807907104,
+ 0, 1, 0.675000011920929, 0, 1, 0.8999999761581421, 0, 0,
+ 0, 0, 0.125, 0, 0, 0.125, 0.22499999403953552, 0,
+ 0, 0.22499999403953552, 0, 0.125, 0.44999998807907104, 0, 0, 0.44999998807907104,
+ 0, 0.125, 0.675000011920929, 0, 0, 0.675000011920929, 0, 0.125,
+ 0.8999999761581421, 0, 0, 0.8999999761581421, 0, 0.25, 0, 0,
+ 0.25, 0.22499999403953552, 0, 0.25, 0.44999998807907104, 0, 0.25, 0.675000011920929,
+ 0, 0.25, 0.8999999761581421, 0, 0.375, 0, 0, 0.375,
+ 0.22499999403953552, 0, 0.375, 0.44999998807907104, 0, 0.375, 0.675000011920929, 0,
+ 0.375, 0.8999999761581421, 0, 0.5, 0, 0, 0.5, 0.22499999403953552,
+ 0, 0.5, 0.44999998807907104, 0, 0.5, 0.675000011920929, 0, 0.5,
+ 0.8999999761581421, 0, 0.5, 0.8999999761581421, 0, 0.625, 0.8999999761581421, 0,
+ 0.625, 0.925000011920929, 0, 0.5, 0.925000011920929, 0, 0.625, 0.949999988079071,
+ 0, 0.5, 0.949999988079071, 0, 0.625, 0.9750000238418579, 0, 0.5,
+ 0.9750000238418579, 0, 0.625, 1, 0, 0.5, 1, 0,
+ 0.75, 0.8999999761581421, 0, 0.75, 0.925000011920929, 0, 0.75, 0.949999988079071,
+ 0, 0.75, 0.9750000238418579, 0, 0.75, 1, 0, 0.875,
+ 0.8999999761581421, 0, 0.875, 0.925000011920929, 0, 0.875, 0.949999988079071, 0,
+ 0.875, 0.9750000238418579, 0, 0.875, 1, 0, 1, 0.8999999761581421,
+ 0, 1, 0.925000011920929, 0, 1, 0.949999988079071, 0, 1,
+ 0.9750000238418579, 0, 1, 1, 0, 0, 0.8999999761581421, 0,
+ 0.125, 0.8999999761581421, 0, 0.125, 0.925000011920929, 0, 0, 0.925000011920929,
+ 0, 0.125, 0.949999988079071, 0, 0, 0.949999988079071, 0, 0.125,
+ 0.9750000238418579, 0, 0, 0.9750000238418579, 0, 0.125, 1, 0,
+ 0, 1, 0, 0.25, 0.8999999761581421, 0, 0.25, 0.925000011920929,
+ 0, 0.25, 0.949999988079071, 0, 0.25, 0.9750000238418579, 0, 0.25,
+ 1, 0, 0.375, 0.8999999761581421, 0, 0.375, 0.925000011920929, 0,
+ 0.375, 0.949999988079071, 0, 0.375, 0.9750000238418579, 0, 0.375, 1,
+ 0, 0.5, 0.8999999761581421, 0, 0.5, 0.925000011920929, 0, 0.5,
+ 0.949999988079071, 0, 0.5, 0.9750000238418579, 0, 0.5, 1, 0,
+ 1, 1, 0, 0.875, 1, 0, 0.875, 0.75,
+ 0, 1, 0.75, 0, 0.875, 0.5, 0, 1,
+ 0.5, 0, 0.875, 0.25, 0, 1, 0.25, 0,
+ 0.875, 0, 0, 1, 0, 0, 0.75, 1,
+ 0, 0.75, 0.75, 0, 0.75, 0.5, 0, 0.75,
+ 0.25, 0, 0.75, 0, 0, 0.625, 1, 0,
+ 0.625, 0.75, 0, 0.625, 0.5, 0, 0.625, 0.25,
+ 0, 0.625, 0, 0, 0.5, 1, 0, 0.5,
+ 0.75, 0, 0.5, 0.5, 0, 0.5, 0.25, 0,
+ 0.5, 0, 0, 0.5, 1, 0, 0.375, 1,
+ 0, 0.375, 0.75, 0, 0.5, 0.75, 0, 0.375,
+ 0.5, 0, 0.5, 0.5, 0, 0.375, 0.25, 0,
+ 0.5, 0.25, 0, 0.375, 0, 0, 0.5, 0,
+ 0, 0.25, 1, 0, 0.25, 0.75, 0, 0.25,
+ 0.5, 0, 0.25, 0.25, 0, 0.25, 0, 0,
+ 0.125, 1, 0, 0.125, 0.75, 0, 0.125, 0.5,
+ 0, 0.125, 0.25, 0, 0.125, 0, 0, 0,
+ 1, 0, 0, 0.75, 0, 0, 0.5, 0,
+ 0, 0.25, 0, 0, 0, 0, 1, 1,
+ 0, 0.875, 1, 0, 0.875, 0.75, 0, 1,
+ 0.75, 0, 0.875, 0.5, 0, 1, 0.5, 0,
+ 0.875, 0.25, 0, 1, 0.25, 0, 0.875, 0,
+ 0, 1, 0, 0, 0.75, 1, 0, 0.75,
+ 0.75, 0, 0.75, 0.5, 0, 0.75, 0.25, 0,
+ 0.75, 0, 0, 0.625, 1, 0, 0.625, 0.75,
+ 0, 0.625, 0.5, 0, 0.625, 0.25, 0, 0.625,
+ 0, 0, 0.5, 1, 0, 0.5, 0.75, 0,
+ 0.5, 0.5, 0, 0.5, 0.25, 0, 0.5, 0,
+ 0, 0.5, 1, 0, 0.375, 1, 0, 0.375,
+ 0.75, 0, 0.5, 0.75, 0, 0.375, 0.5, 0,
+ 0.5, 0.5, 0, 0.375, 0.25, 0, 0.5, 0.25,
+ 0, 0.375, 0, 0, 0.5, 0, 0, 0.25,
+ 1, 0, 0.25, 0.75, 0, 0.25, 0.5, 0,
+ 0.25, 0.25, 0, 0.25, 0, 0, 0.125, 1,
+ 0, 0.125, 0.75, 0, 0.125, 0.5, 0, 0.125,
+ 0.25, 0, 0.125, 0, 0, 0, 1, 0,
+ 0, 0.75, 0, 0, 0.5, 0, 0, 0.25,
+ 0, 0, 0, 0, 1, 1, 0, 0.875,
+ 1, 0, 0.875, 0.75, 0, 1, 0.75, 0,
+ 0.875, 0.5, 0, 1, 0.5, 0, 0.875, 0.25,
+ 0, 1, 0.25, 0, 0.875, 0, 0, 1,
+ 0, 0, 0.75, 1, 0, 0.75, 0.75, 0,
+ 0.75, 0.5, 0, 0.75, 0.25, 0, 0.75, 0,
+ 0, 0.625, 1, 0, 0.625, 0.75, 0, 0.625,
+ 0.5, 0, 0.625, 0.25, 0, 0.625, 0, 0,
+ 0.5, 1, 0, 0.5, 0.75, 0, 0.5, 0.5,
+ 0, 0.5, 0.25, 0, 0.5, 0, 0, 0.5,
+ 1, 0, 0.375, 1, 0, 0.375, 0.75, 0,
+ 0.5, 0.75, 0, 0.375, 0.5, 0, 0.5, 0.5,
+ 0, 0.375, 0.25, 0, 0.5, 0.25, 0, 0.375,
+ 0, 0, 0.5, 0, 0, 0.25, 1, 0,
+ 0.25, 0.75, 0, 0.25, 0.5, 0, 0.25, 0.25,
+ 0, 0.25, 0, 0, 0.125, 1, 0, 0.125,
+ 0.75, 0, 0.125, 0.5, 0, 0.125, 0.25, 0,
+ 0.125, 0, 0, 0, 1, 0, 0, 0.75,
+ 0, 0, 0.5, 0, 0, 0.25, 0, 0,
+ 0, 0, 1, 1, 0, 0.875, 1, 0,
+ 0.875, 0.75, 0, 1, 0.75, 0, 0.875, 0.5,
+ 0, 1, 0.5, 0, 0.875, 0.25, 0, 1,
+ 0.25, 0, 0.875, 0, 0, 1, 0, 0,
+ 0.75, 1, 0, 0.75, 0.75, 0, 0.75, 0.5,
+ 0, 0.75, 0.25, 0, 0.75, 0, 0, 0.625,
+ 1, 0, 0.625, 0.75, 0, 0.625, 0.5, 0,
+ 0.625, 0.25, 0, 0.625, 0, 0, 0.5, 1,
+ 0, 0.5, 0.75, 0, 0.5, 0.5, 0, 0.5,
+ 0.25, 0, 0.5, 0, 0, 0.5, 1, 0,
+ 0.375, 1, 0, 0.375, 0.75, 0, 0.5, 0.75,
+ 0, 0.375, 0.5, 0, 0.5, 0.5, 0, 0.375,
+ 0.25, 0, 0.5, 0.25, 0, 0.375, 0, 0,
+ 0.5, 0, 0, 0.25, 1, 0, 0.25, 0.75,
+ 0, 0.25, 0.5, 0, 0.25, 0.25, 0, 0.25,
+ 0, 0, 0.125, 1, 0, 0.125, 0.75, 0,
+ 0.125, 0.5, 0, 0.125, 0.25, 0, 0.125, 0,
+ 0, 0, 1, 0, 0, 0.75, 0, 0,
+ 0.5, 0, 0, 0.25, 0, 0, 0, 0 };
+
+uint16_t teapotIndices[] = { 0, 1, 2, 2, 3, 0, 3, 2, 4, 4, 5, 3, 5, 4, 6, 6, 7, 5, 7, 6, 8, 8, 9, 7,
+ 1, 10, 11, 11, 2, 1, 2, 11, 12, 12, 4, 2, 4, 12, 13, 13, 6, 4, 6, 13, 14, 14, 8, 6,
+ 10, 15, 16, 16, 11, 10, 11, 16, 17, 17, 12, 11, 12, 17, 18, 18, 13, 12, 13, 18, 19, 19, 14, 13,
+ 15, 20, 21, 21, 16, 15, 16, 21, 22, 22, 17, 16, 17, 22, 23, 23, 18, 17, 18, 23, 24, 24, 19, 18,
+ 25, 26, 27, 27, 28, 25, 28, 27, 29, 29, 30, 28, 30, 29, 31, 31, 32, 30, 32, 31, 33, 33, 34, 32,
+ 26, 35, 36, 36, 27, 26, 27, 36, 37, 37, 29, 27, 29, 37, 38, 38, 31, 29, 31, 38, 39, 39, 33, 31,
+ 35, 40, 41, 41, 36, 35, 36, 41, 42, 42, 37, 36, 37, 42, 43, 43, 38, 37, 38, 43, 44, 44, 39, 38,
+ 40, 45, 46, 46, 41, 40, 41, 46, 47, 47, 42, 41, 42, 47, 48, 48, 43, 42, 43, 48, 49, 49, 44, 43,
+ 50, 51, 52, 52, 53, 50, 53, 52, 54, 54, 55, 53, 55, 54, 56, 56, 57, 55, 57, 56, 58, 58, 59, 57,
+ 51, 60, 61, 61, 52, 51, 52, 61, 62, 62, 54, 52, 54, 62, 63, 63, 56, 54, 56, 63, 64, 64, 58, 56,
+ 60, 65, 66, 66, 61, 60, 61, 66, 67, 67, 62, 61, 62, 67, 68, 68, 63, 62, 63, 68, 69, 69, 64, 63,
+ 65, 70, 71, 71, 66, 65, 66, 71, 72, 72, 67, 66, 67, 72, 73, 73, 68, 67, 68, 73, 74, 74, 69, 68,
+ 75, 76, 77, 77, 78, 75, 78, 77, 79, 79, 80, 78, 80, 79, 81, 81, 82, 80, 82, 81, 83, 83, 84, 82,
+ 76, 85, 86, 86, 77, 76, 77, 86, 87, 87, 79, 77, 79, 87, 88, 88, 81, 79, 81, 88, 89, 89, 83, 81,
+ 85, 90, 91, 91, 86, 85, 86, 91, 92, 92, 87, 86, 87, 92, 93, 93, 88, 87, 88, 93, 94, 94, 89, 88,
+ 90, 95, 96, 96, 91, 90, 91, 96, 97, 97, 92, 91, 92, 97, 98, 98, 93, 92, 93, 98, 99, 99, 94, 93,
+ 100, 101, 102, 102, 103, 100, 103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108, 108, 109, 107,
+ 101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102, 104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106,
+ 110, 115, 116, 116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112, 113, 118, 119, 119, 114, 113,
+ 115, 120, 121, 121, 116, 115, 116, 121, 122, 122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,
+ 125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131, 131, 132, 130, 132, 131, 133, 133, 134, 132,
+ 126, 135, 136, 136, 127, 126, 127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139, 139, 133, 131,
+ 135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136, 137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138,
+ 140, 145, 146, 146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142, 143, 148, 149, 149, 144, 143,
+ 150, 151, 152, 152, 153, 150, 153, 152, 154, 154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,
+ 151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163, 163, 156, 154, 156, 163, 164, 164, 158, 156,
+ 160, 165, 166, 166, 161, 160, 161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169, 169, 164, 163,
+ 165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166, 167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168,
+ 175, 176, 177, 177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180, 182, 181, 183, 183, 184, 182,
+ 176, 185, 186, 186, 177, 176, 177, 186, 187, 187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,
+ 185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193, 193, 188, 187, 188, 193, 194, 194, 189, 188,
+ 190, 195, 196, 196, 191, 190, 191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199, 199, 194, 193,
+ 200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203, 205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207,
+ 201, 210, 211, 211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204, 206, 213, 214, 214, 208, 206,
+ 210, 215, 216, 216, 211, 210, 211, 216, 217, 217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,
+ 215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223, 223, 218, 217, 218, 223, 224, 224, 219, 218,
+ 225, 226, 227, 227, 228, 225, 228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233, 233, 234, 232,
+ 226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227, 229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231,
+ 235, 240, 241, 241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237, 238, 243, 244, 244, 239, 238,
+ 240, 245, 246, 246, 241, 240, 241, 246, 247, 247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,
+ 250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256, 256, 257, 255, 257, 256, 258, 258, 259, 257,
+ 251, 260, 261, 261, 252, 251, 252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264, 264, 258, 256,
+ 260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261, 262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263,
+ 265, 270, 271, 271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267, 268, 273, 274, 274, 269, 268,
+ 275, 276, 277, 277, 278, 275, 278, 277, 279, 279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,
+ 276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288, 288, 281, 279, 281, 288, 289, 289, 283, 281,
+ 285, 290, 291, 291, 286, 285, 286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294, 294, 289, 288,
+ 290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291, 292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293,
+ 300, 301, 302, 302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305, 307, 306, 308, 308, 309, 307,
+ 301, 310, 311, 311, 302, 301, 302, 311, 312, 312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,
+ 310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318, 318, 313, 312, 313, 318, 319, 319, 314, 313,
+ 315, 320, 321, 321, 316, 315, 316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324, 324, 319, 318,
+ 325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328, 330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332,
+ 326, 335, 336, 336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329, 331, 338, 339, 339, 333, 331,
+ 335, 340, 341, 341, 336, 335, 336, 341, 342, 342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,
+ 340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348, 348, 343, 342, 343, 348, 349, 349, 344, 343,
+ 350, 351, 352, 352, 353, 350, 353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358, 358, 359, 357,
+ 351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352, 354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356,
+ 360, 365, 366, 366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362, 363, 368, 369, 369, 364, 363,
+ 365, 370, 371, 371, 366, 365, 366, 371, 372, 372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,
+ 375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381, 381, 382, 380, 382, 381, 383, 383, 384, 382,
+ 376, 385, 386, 386, 377, 376, 377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389, 389, 383, 381,
+ 385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386, 387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388,
+ 390, 395, 396, 396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392, 393, 398, 399, 399, 394, 393,
+ 400, 401, 402, 402, 403, 400, 403, 402, 404, 404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,
+ 401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413, 413, 406, 404, 406, 413, 414, 414, 408, 406,
+ 410, 415, 416, 416, 411, 410, 411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419, 419, 414, 413,
+ 415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416, 417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418,
+ 425, 426, 427, 427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430, 432, 431, 433, 433, 434, 432,
+ 426, 435, 436, 436, 427, 426, 427, 436, 437, 437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,
+ 435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443, 443, 438, 437, 438, 443, 444, 444, 439, 438,
+ 440, 445, 446, 446, 441, 440, 441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449, 449, 444, 443,
+ 450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453, 455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457,
+ 451, 460, 461, 461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454, 456, 463, 464, 464, 458, 456,
+ 460, 465, 466, 466, 461, 460, 461, 466, 467, 467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,
+ 465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473, 473, 468, 467, 468, 473, 474, 474, 469, 468,
+ 475, 476, 477, 477, 478, 475, 478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483, 483, 484, 482,
+ 476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477, 479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481,
+ 485, 490, 491, 491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487, 488, 493, 494, 494, 489, 488,
+ 490, 495, 496, 496, 491, 490, 491, 496, 497, 497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,
+ 500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506, 506, 507, 505, 507, 506, 508, 508, 509, 507,
+ 501, 510, 511, 511, 502, 501, 502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514, 514, 508, 506,
+ 510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511, 512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513,
+ 515, 520, 521, 521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517, 518, 523, 524, 524, 519, 518,
+ 525, 526, 527, 527, 528, 525, 528, 527, 529, 529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,
+ 526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538, 538, 531, 529, 531, 538, 539, 539, 533, 531,
+ 535, 540, 541, 541, 536, 535, 536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544, 544, 539, 538,
+ 540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541, 542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543,
+ 550, 551, 552, 552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555, 557, 556, 558, 558, 559, 557,
+ 551, 560, 561, 561, 552, 551, 552, 561, 562, 562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,
+ 560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568, 568, 563, 562, 563, 568, 569, 569, 564, 563,
+ 565, 570, 571, 571, 566, 565, 566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574, 574, 569, 568,
+ 575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578, 580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582,
+ 576, 585, 586, 586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579, 581, 588, 589, 589, 583, 581,
+ 585, 590, 591, 591, 586, 585, 586, 591, 592, 592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,
+ 590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598, 598, 593, 592, 593, 598, 599, 599, 594, 593,
+ 600, 601, 602, 602, 603, 600, 603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608, 608, 609, 607,
+ 601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602, 604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606,
+ 610, 615, 616, 616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612, 613, 618, 619, 619, 614, 613,
+ 615, 620, 621, 621, 616, 615, 616, 621, 622, 622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,
+ 625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631, 631, 632, 630, 632, 631, 633, 633, 634, 632,
+ 626, 635, 636, 636, 627, 626, 627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639, 639, 633, 631,
+ 635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636, 637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638,
+ 640, 645, 646, 646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642, 643, 648, 649, 649, 644, 643,
+ 650, 651, 652, 652, 653, 650, 653, 652, 654, 654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,
+ 651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663, 663, 656, 654, 656, 663, 664, 664, 658, 656,
+ 660, 665, 666, 666, 661, 660, 661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669, 669, 664, 663,
+ 665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666, 667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668,
+ 675, 676, 677, 677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680, 682, 681, 683, 683, 684, 682,
+ 676, 685, 686, 686, 677, 676, 677, 686, 687, 687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,
+ 685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693, 693, 688, 687, 688, 693, 694, 694, 689, 688,
+ 690, 695, 696, 696, 691, 690, 691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699, 699, 694, 693,
+ 700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703, 705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707,
+ 701, 710, 711, 711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704, 706, 713, 714, 714, 708, 706,
+ 710, 715, 716, 716, 711, 710, 711, 716, 717, 717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,
+ 715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723, 723, 718, 717, 718, 723, 724, 724, 719, 718,
+ 725, 726, 727, 727, 728, 725, 728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733, 733, 734, 732,
+ 726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727, 729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731,
+ 735, 740, 741, 741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737, 738, 743, 744, 744, 739, 738,
+ 740, 745, 746, 746, 741, 740, 741, 746, 747, 747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,
+ 750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756, 756, 757, 755, 757, 756, 758, 758, 759, 757,
+ 751, 760, 761, 761, 752, 751, 752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764, 764, 758, 756,
+ 760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761, 762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763,
+ 765, 770, 771, 771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767, 768, 773, 774, 774, 769, 768,
+ 775, 776, 777, 777, 778, 775, 778, 777, 779, 779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,
+ 776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788, 788, 781, 779, 781, 788, 789, 789, 783, 781,
+ 785, 790, 791, 791, 786, 785, 786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794, 794, 789, 788,
+ 790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791, 792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793 };
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/lint.xml b/ndk/platforms/android-18/samples/MoreTeapots/lint.xml
new file mode 100644
index 0000000..ee0eead
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/lint.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+</lint>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/project.properties b/ndk/platforms/android-18/samples/MoreTeapots/project.properties
new file mode 100644
index 0000000..0c9830a
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=Google Inc.:Google APIs:17
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-hdpi/ic_launcher.png b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..ea01cbf
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-ldpi/ic_launcher.png b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..a3d6a18
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-mdpi/ic_launcher.png b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..8f80897
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-xhdpi/ic_launcher.png b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..b779a2b
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/layout/widgets.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/layout/widgets.xml
new file mode 100644
index 0000000..36b64f3
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/layout/widgets.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="top"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/textViewFPS"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="right"
+ android:text="0.0 FPS"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="@android:color/white" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/values-v11/styles.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/values-v11/styles.xml
new file mode 100644
index 0000000..541752f
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+<resources>
+
+ <!--
+ Base application theme for API 11+. This theme completely replaces
+ AppBaseTheme from res/values/styles.xml on API 11+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
+ <!-- API 11 theme customizations can go here. -->
+ </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/values-v14/styles.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/values-v14/styles.xml
new file mode 100644
index 0000000..f20e015
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+<resources>
+
+ <!--
+ Base application theme for API 14+. This theme completely replaces
+ AppBaseTheme from BOTH res/values/styles.xml and
+ res/values-v11/styles.xml on API 14+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+ <!-- API 14 theme customizations can go here. -->
+ </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/values/strings.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/values/strings.xml
new file mode 100644
index 0000000..c6620a9
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/values/strings.xml
@@ -0,0 +1,5 @@
+<resources>
+
+ <string name="app_name">More Teapots</string>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/values/styles.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/values/styles.xml
new file mode 100644
index 0000000..4a10ca4
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/values/styles.xml
@@ -0,0 +1,20 @@
+<resources>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Light">
+ <!--
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+ -->
+ </style>
+
+ <!-- Application theme. -->
+ <style name="AppTheme" parent="AppBaseTheme">
+ <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+ </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java
new file mode 100644
index 0000000..c864e72
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.sample.helper;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import javax.microedition.khronos.opengles.GL10;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.opengl.GLUtils;
+import android.util.Log;
+
+public class NDKHelper
+{
+ private static Context context;
+
+ public static void setContext(Context c)
+ {
+ Log.i("NDKHelper", "setContext:" + c);
+ context = c;
+ }
+
+ //
+ // Load Bitmap
+ // Java helper is useful decoding PNG, TIFF etc rather than linking libPng
+ // etc separately
+ //
+ private int nextPOT(int i)
+ {
+ int pot = 1;
+ while (pot < i)
+ pot <<= 1;
+ return pot;
+ }
+
+ private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight)
+ {
+ if (bitmapToScale == null)
+ return null;
+ // get the original width and height
+ int width = bitmapToScale.getWidth();
+ int height = bitmapToScale.getHeight();
+ // create a matrix for the manipulation
+ Matrix matrix = new Matrix();
+
+ // resize the bit map
+ matrix.postScale(newWidth / width, newHeight / height);
+
+ // recreate the new Bitmap and set it back
+ return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(),
+ bitmapToScale.getHeight(), matrix, true);
+ }
+
+ public boolean loadTexture(String path)
+ {
+ Bitmap bitmap = null;
+ try
+ {
+ String str = path;
+ if (!path.startsWith("/"))
+ {
+ str = "/" + path;
+ }
+
+ File file = new File(context.getExternalFilesDir(null), str);
+ if (file.canRead())
+ {
+ bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
+ } else
+ {
+ bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+ .open(path));
+ }
+ // Matrix matrix = new Matrix();
+ // // resize the bit map
+ // matrix.postScale(-1F, 1F);
+ //
+ // // recreate the new Bitmap and set it back
+ // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
+ // bitmap.getHeight(), matrix, true);
+
+ } catch (Exception e)
+ {
+ Log.w("NDKHelper", "Coundn't load a file:" + path);
+ return false;
+ }
+
+ if (bitmap != null)
+ {
+ GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
+ }
+ return true;
+
+ }
+
+ public Bitmap openBitmap(String path, boolean iScalePOT)
+ {
+ Bitmap bitmap = null;
+ try
+ {
+ bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+ .open(path));
+ if (iScalePOT)
+ {
+ int originalWidth = getBitmapWidth(bitmap);
+ int originalHeight = getBitmapHeight(bitmap);
+ int width = nextPOT(originalWidth);
+ int height = nextPOT(originalHeight);
+ if (originalWidth != width || originalHeight != height)
+ {
+ // Scale it
+ bitmap = scaleBitmap(bitmap, width, height);
+ }
+ }
+
+ } catch (Exception e)
+ {
+ Log.w("NDKHelper", "Coundn't load a file:" + path);
+ }
+
+ return bitmap;
+ }
+
+ public int getBitmapWidth(Bitmap bmp)
+ {
+ return bmp.getWidth();
+ }
+
+ public int getBitmapHeight(Bitmap bmp)
+ {
+ return bmp.getHeight();
+ }
+
+ public void getBitmapPixels(Bitmap bmp, int[] pixels)
+ {
+ int w = bmp.getWidth();
+ int h = bmp.getHeight();
+ bmp.getPixels(pixels, 0, w, 0, 0, w, h);
+ }
+
+ public void closeBitmap(Bitmap bmp)
+ {
+ bmp.recycle();
+ }
+
+ public static String getNativeLibraryDirectory(Context appContext)
+ {
+ ApplicationInfo ai = context.getApplicationInfo();
+
+ Log.w("NDKHelper", "ai.nativeLibraryDir:" + ai.nativeLibraryDir);
+
+ if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
+ || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
+ {
+ return ai.nativeLibraryDir;
+ }
+ return "/system/lib/";
+ }
+
+ public int getNativeAudioBufferSize()
+ {
+ int SDK_INT = android.os.Build.VERSION.SDK_INT;
+ if (SDK_INT >= 17)
+ {
+ AudioManager am = (AudioManager) context
+ .getSystemService(Context.AUDIO_SERVICE);
+ String framesPerBuffer = am
+ .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
+ return Integer.parseInt(framesPerBuffer);
+ } else
+ {
+ return 0;
+ }
+ }
+
+ public int getNativeAudioSampleRate()
+ {
+ return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
+
+ }
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java
new file mode 100644
index 0000000..b37d75a
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.sample.moreteapots;
+
+import javax.microedition.khronos.opengles.GL10;
+
+import com.sample.helper.NDKHelper;
+
+import android.app.Application;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.opengl.GLUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+public class MoreTeapotsApplication extends Application {
+ private static Context context;
+ public void onCreate(){
+ context=getApplicationContext();
+ NDKHelper.setContext(context);
+ Log.w("native-activity", "onCreate");
+
+ final PackageManager pm = getApplicationContext().getPackageManager();
+ ApplicationInfo ai;
+ try {
+ ai = pm.getApplicationInfo( this.getPackageName(), 0);
+ } catch (final NameNotFoundException e) {
+ ai = null;
+ }
+ final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");
+ Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();
+ }
+
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java
new file mode 100644
index 0000000..7f8248a
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.sample.moreteapots;
+
+import android.app.NativeActivity;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.view.WindowManager.LayoutParams;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+public class MoreTeapotsNativeActivity extends NativeActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ protected void onResume() {
+ super.onResume();
+
+ //Hide toolbar
+ int SDK_INT = android.os.Build.VERSION.SDK_INT;
+ if(SDK_INT >= 11 && SDK_INT < 14) {
+ getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
+ }else if(SDK_INT >= 14){
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);
+ }
+
+ }
+
+ protected void onPause()
+ {
+ super.onPause();
+ if (_popupWindow != null) {
+
+ _popupWindow.dismiss();
+ _popupWindow = null;
+ }
+ }
+ // Our popup window, you will call it from your C/C++ code later
+
+ MoreTeapotsNativeActivity _activity;
+ PopupWindow _popupWindow;
+ TextView _label;
+
+ public void showUI()
+ {
+ if( _popupWindow != null )
+ return;
+
+ _activity = this;
+
+ this.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ LayoutInflater layoutInflater
+ = (LayoutInflater)getBaseContext()
+ .getSystemService(LAYOUT_INFLATER_SERVICE);
+ View popupView = layoutInflater.inflate(R.layout.widgets, null);
+ _popupWindow = new PopupWindow(
+ popupView,
+ LayoutParams.WRAP_CONTENT,
+ LayoutParams.WRAP_CONTENT);
+
+ LinearLayout mainLayout = new LinearLayout(_activity);
+ MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+ params.setMargins(0, 0, 0, 0);
+ _activity.setContentView(mainLayout, params);
+
+ // Show our UI over NativeActivity window
+ _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.LEFT, 10, 10);
+ _popupWindow.update();
+
+ _label = (TextView)popupView.findViewById(R.id.textViewFPS);
+
+ }});
+ }
+
+ public void updateFPS(final float fFPS)
+ {
+ if( _label == null )
+ return;
+
+ _activity = this;
+ this.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ _label.setText(String.format("%2.2f FPS", fFPS));
+
+ }});
+ }
+}
+
+
diff --git a/ndk/platforms/android-19/arch-arm/symbols/libc.so.functions.txt b/ndk/platforms/android-19/arch-arm/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..771b4d6
--- /dev/null
+++ b/ndk/platforms/android-19/arch-arm/symbols/libc.so.functions.txt
@@ -0,0 +1,1085 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+_Unwind_Backtrace
+_Unwind_Complete
+_Unwind_DeleteException
+_Unwind_ForcedUnwind
+_Unwind_GetCFA
+_Unwind_GetDataRelBase
+_Unwind_GetLanguageSpecificData
+_Unwind_GetRegionStart
+_Unwind_GetTextRelBase
+_Unwind_RaiseException
+_Unwind_Resume
+_Unwind_Resume_or_Rethrow
+_Unwind_VRS_Get
+_Unwind_VRS_Pop
+_Unwind_VRS_Set
+___Unwind_Backtrace
+___Unwind_ForcedUnwind
+___Unwind_RaiseException
+___Unwind_Resume
+___Unwind_Resume_or_Rethrow
+__adddf3
+__addsf3
+__aeabi_atexit
+__aeabi_cdcmpeq
+__aeabi_cdcmple
+__aeabi_cdrcmple
+__aeabi_d2f
+__aeabi_d2iz
+__aeabi_dadd
+__aeabi_dcmpeq
+__aeabi_dcmpge
+__aeabi_dcmpgt
+__aeabi_dcmple
+__aeabi_dcmplt
+__aeabi_dcmpun
+__aeabi_ddiv
+__aeabi_dmul
+__aeabi_drsub
+__aeabi_dsub
+__aeabi_f2d
+__aeabi_f2iz
+__aeabi_fadd
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2d
+__aeabi_i2f
+__aeabi_idiv
+__aeabi_idiv0
+__aeabi_idivmod
+__aeabi_l2d
+__aeabi_l2f
+__aeabi_ldiv0
+__aeabi_ldivmod
+__aeabi_lmul
+__aeabi_memclr
+__aeabi_memclr4
+__aeabi_memclr8
+__aeabi_memcpy
+__aeabi_memcpy4
+__aeabi_memcpy8
+__aeabi_memmove
+__aeabi_memmove4
+__aeabi_memmove8
+__aeabi_memset
+__aeabi_memset4
+__aeabi_memset8
+__aeabi_ui2d
+__aeabi_ui2f
+__aeabi_uidiv
+__aeabi_uidivmod
+__aeabi_ul2d
+__aeabi_ul2f
+__aeabi_uldivmod
+__aeabi_unwind_cpp_pr0
+__aeabi_unwind_cpp_pr1
+__aeabi_unwind_cpp_pr2
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__atomic_cmpxchg
+__atomic_dec
+__atomic_inc
+__atomic_swap
+__b64_ntop
+__b64_pton
+__bionic_clone
+__bionic_clone_entry
+__bionic_libgcc_compat_hooks
+__brk
+__cmpdf2
+__cxa_atexit
+__cxa_finalize
+__div0
+__divdf3
+__divdi3
+__divsf3
+__divsi3
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__eqdf2
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__extendsfdf2
+__fcntl
+__fcntl64
+__findenv
+__fixdfsi
+__fixsfsi
+__floatdidf
+__floatdisf
+__floatsidf
+__floatsisf
+__floatundidf
+__floatundisf
+__floatunsidf
+__floatunsisf
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__gedf2
+__get_h_errno
+__get_pc
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__getcwd
+__getpriority
+__gnu_Unwind_Backtrace
+__gnu_Unwind_Find_exidx
+__gnu_Unwind_ForcedUnwind
+__gnu_Unwind_RaiseException
+__gnu_Unwind_Restore_VFP
+__gnu_Unwind_Restore_VFP_D
+__gnu_Unwind_Restore_VFP_D_16_to_31
+__gnu_Unwind_Restore_WMMXC
+__gnu_Unwind_Restore_WMMXD
+__gnu_Unwind_Resume
+__gnu_Unwind_Resume_or_Rethrow
+__gnu_Unwind_Save_VFP
+__gnu_Unwind_Save_VFP_D
+__gnu_Unwind_Save_VFP_D_16_to_31
+__gnu_Unwind_Save_WMMXC
+__gnu_Unwind_Save_WMMXD
+__gnu_ldivmod_helper
+__gnu_uldivmod_helper
+__gnu_unwind_execute
+__gnu_unwind_frame
+__gtdf2
+__hostalias
+__init_tls
+__ioctl
+__ledf2
+__libc_android_abort
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__ltdf2
+__memcmp16
+__mmap2
+__muldf3
+__muldi3
+__mulsf3
+__nedf2
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__restore_core_regs
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__subdf3
+__subsf3
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__truncdfsf2
+__udivdi3
+__udivsi3
+__unorddf2
+__unordsf2
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atexit
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+cacheflush
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+ffs
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+futimens
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+restore_core_regs
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimensat
+utimes
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-19/arch-arm/symbols/libc.so.variables.txt b/ndk/platforms/android-19/arch-arm/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-19/arch-arm/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-19/arch-mips/symbols/libc.so.functions.txt b/ndk/platforms/android-19/arch-mips/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..3f3c4b3
--- /dev/null
+++ b/ndk/platforms/android-19/arch-mips/symbols/libc.so.functions.txt
@@ -0,0 +1,951 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__atomic_cmpxchg
+__atomic_dec
+__atomic_inc
+__atomic_swap
+__b64_ntop
+__b64_pton
+__brk
+__clone_thread_start
+__cxa_atexit
+__cxa_finalize
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__fcntl
+__fcntl64
+__findenv
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__get_h_errno
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__get_tls
+__getcwd
+__getpriority
+__hostalias
+__init_tls
+__ioctl
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__memcmp16
+__mmap2
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_thread_area
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_flush_cache
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+_waitpid
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atexit
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+cacheflush
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+ffs
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+futimens
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimes
+utimensat
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-19/arch-mips/symbols/libc.so.variables.txt b/ndk/platforms/android-19/arch-mips/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-19/arch-mips/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-19/arch-x86/symbols/libc.so.functions.txt b/ndk/platforms/android-19/arch-x86/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..d2a06ff
--- /dev/null
+++ b/ndk/platforms/android-19/arch-x86/symbols/libc.so.functions.txt
@@ -0,0 +1,945 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__b64_ntop
+__b64_pton
+__brk
+__cxa_atexit
+__cxa_finalize
+__divdi3
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__fcntl
+__fcntl64
+__findenv
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__get_h_errno
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__get_tls
+__getcwd
+__getpriority
+__hostalias
+__init_tls
+__ioctl
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__mmap2
+__moddi3
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_thread_area
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__udivdi3
+__umoddi3
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+_waitpid
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+futimens
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimensat
+utimes
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-19/arch-x86/symbols/libc.so.variables.txt b/ndk/platforms/android-19/arch-x86/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-19/arch-x86/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-19/include/android/keycodes.h b/ndk/platforms/android-19/include/android/keycodes.h
new file mode 100644
index 0000000..1ca1332
--- /dev/null
+++ b/ndk/platforms/android-19/include/android/keycodes.h
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+ AKEYCODE_UNKNOWN = 0,
+ AKEYCODE_SOFT_LEFT = 1,
+ AKEYCODE_SOFT_RIGHT = 2,
+ AKEYCODE_HOME = 3,
+ AKEYCODE_BACK = 4,
+ AKEYCODE_CALL = 5,
+ AKEYCODE_ENDCALL = 6,
+ AKEYCODE_0 = 7,
+ AKEYCODE_1 = 8,
+ AKEYCODE_2 = 9,
+ AKEYCODE_3 = 10,
+ AKEYCODE_4 = 11,
+ AKEYCODE_5 = 12,
+ AKEYCODE_6 = 13,
+ AKEYCODE_7 = 14,
+ AKEYCODE_8 = 15,
+ AKEYCODE_9 = 16,
+ AKEYCODE_STAR = 17,
+ AKEYCODE_POUND = 18,
+ AKEYCODE_DPAD_UP = 19,
+ AKEYCODE_DPAD_DOWN = 20,
+ AKEYCODE_DPAD_LEFT = 21,
+ AKEYCODE_DPAD_RIGHT = 22,
+ AKEYCODE_DPAD_CENTER = 23,
+ AKEYCODE_VOLUME_UP = 24,
+ AKEYCODE_VOLUME_DOWN = 25,
+ AKEYCODE_POWER = 26,
+ AKEYCODE_CAMERA = 27,
+ AKEYCODE_CLEAR = 28,
+ AKEYCODE_A = 29,
+ AKEYCODE_B = 30,
+ AKEYCODE_C = 31,
+ AKEYCODE_D = 32,
+ AKEYCODE_E = 33,
+ AKEYCODE_F = 34,
+ AKEYCODE_G = 35,
+ AKEYCODE_H = 36,
+ AKEYCODE_I = 37,
+ AKEYCODE_J = 38,
+ AKEYCODE_K = 39,
+ AKEYCODE_L = 40,
+ AKEYCODE_M = 41,
+ AKEYCODE_N = 42,
+ AKEYCODE_O = 43,
+ AKEYCODE_P = 44,
+ AKEYCODE_Q = 45,
+ AKEYCODE_R = 46,
+ AKEYCODE_S = 47,
+ AKEYCODE_T = 48,
+ AKEYCODE_U = 49,
+ AKEYCODE_V = 50,
+ AKEYCODE_W = 51,
+ AKEYCODE_X = 52,
+ AKEYCODE_Y = 53,
+ AKEYCODE_Z = 54,
+ AKEYCODE_COMMA = 55,
+ AKEYCODE_PERIOD = 56,
+ AKEYCODE_ALT_LEFT = 57,
+ AKEYCODE_ALT_RIGHT = 58,
+ AKEYCODE_SHIFT_LEFT = 59,
+ AKEYCODE_SHIFT_RIGHT = 60,
+ AKEYCODE_TAB = 61,
+ AKEYCODE_SPACE = 62,
+ AKEYCODE_SYM = 63,
+ AKEYCODE_EXPLORER = 64,
+ AKEYCODE_ENVELOPE = 65,
+ AKEYCODE_ENTER = 66,
+ AKEYCODE_DEL = 67,
+ AKEYCODE_GRAVE = 68,
+ AKEYCODE_MINUS = 69,
+ AKEYCODE_EQUALS = 70,
+ AKEYCODE_LEFT_BRACKET = 71,
+ AKEYCODE_RIGHT_BRACKET = 72,
+ AKEYCODE_BACKSLASH = 73,
+ AKEYCODE_SEMICOLON = 74,
+ AKEYCODE_APOSTROPHE = 75,
+ AKEYCODE_SLASH = 76,
+ AKEYCODE_AT = 77,
+ AKEYCODE_NUM = 78,
+ AKEYCODE_HEADSETHOOK = 79,
+ AKEYCODE_FOCUS = 80, // *Camera* focus
+ AKEYCODE_PLUS = 81,
+ AKEYCODE_MENU = 82,
+ AKEYCODE_NOTIFICATION = 83,
+ AKEYCODE_SEARCH = 84,
+ AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+ AKEYCODE_MEDIA_STOP = 86,
+ AKEYCODE_MEDIA_NEXT = 87,
+ AKEYCODE_MEDIA_PREVIOUS = 88,
+ AKEYCODE_MEDIA_REWIND = 89,
+ AKEYCODE_MEDIA_FAST_FORWARD = 90,
+ AKEYCODE_MUTE = 91,
+ AKEYCODE_PAGE_UP = 92,
+ AKEYCODE_PAGE_DOWN = 93,
+ AKEYCODE_PICTSYMBOLS = 94,
+ AKEYCODE_SWITCH_CHARSET = 95,
+ AKEYCODE_BUTTON_A = 96,
+ AKEYCODE_BUTTON_B = 97,
+ AKEYCODE_BUTTON_C = 98,
+ AKEYCODE_BUTTON_X = 99,
+ AKEYCODE_BUTTON_Y = 100,
+ AKEYCODE_BUTTON_Z = 101,
+ AKEYCODE_BUTTON_L1 = 102,
+ AKEYCODE_BUTTON_R1 = 103,
+ AKEYCODE_BUTTON_L2 = 104,
+ AKEYCODE_BUTTON_R2 = 105,
+ AKEYCODE_BUTTON_THUMBL = 106,
+ AKEYCODE_BUTTON_THUMBR = 107,
+ AKEYCODE_BUTTON_START = 108,
+ AKEYCODE_BUTTON_SELECT = 109,
+ AKEYCODE_BUTTON_MODE = 110,
+ AKEYCODE_ESCAPE = 111,
+ AKEYCODE_FORWARD_DEL = 112,
+ AKEYCODE_CTRL_LEFT = 113,
+ AKEYCODE_CTRL_RIGHT = 114,
+ AKEYCODE_CAPS_LOCK = 115,
+ AKEYCODE_SCROLL_LOCK = 116,
+ AKEYCODE_META_LEFT = 117,
+ AKEYCODE_META_RIGHT = 118,
+ AKEYCODE_FUNCTION = 119,
+ AKEYCODE_SYSRQ = 120,
+ AKEYCODE_BREAK = 121,
+ AKEYCODE_MOVE_HOME = 122,
+ AKEYCODE_MOVE_END = 123,
+ AKEYCODE_INSERT = 124,
+ AKEYCODE_FORWARD = 125,
+ AKEYCODE_MEDIA_PLAY = 126,
+ AKEYCODE_MEDIA_PAUSE = 127,
+ AKEYCODE_MEDIA_CLOSE = 128,
+ AKEYCODE_MEDIA_EJECT = 129,
+ AKEYCODE_MEDIA_RECORD = 130,
+ AKEYCODE_F1 = 131,
+ AKEYCODE_F2 = 132,
+ AKEYCODE_F3 = 133,
+ AKEYCODE_F4 = 134,
+ AKEYCODE_F5 = 135,
+ AKEYCODE_F6 = 136,
+ AKEYCODE_F7 = 137,
+ AKEYCODE_F8 = 138,
+ AKEYCODE_F9 = 139,
+ AKEYCODE_F10 = 140,
+ AKEYCODE_F11 = 141,
+ AKEYCODE_F12 = 142,
+ AKEYCODE_NUM_LOCK = 143,
+ AKEYCODE_NUMPAD_0 = 144,
+ AKEYCODE_NUMPAD_1 = 145,
+ AKEYCODE_NUMPAD_2 = 146,
+ AKEYCODE_NUMPAD_3 = 147,
+ AKEYCODE_NUMPAD_4 = 148,
+ AKEYCODE_NUMPAD_5 = 149,
+ AKEYCODE_NUMPAD_6 = 150,
+ AKEYCODE_NUMPAD_7 = 151,
+ AKEYCODE_NUMPAD_8 = 152,
+ AKEYCODE_NUMPAD_9 = 153,
+ AKEYCODE_NUMPAD_DIVIDE = 154,
+ AKEYCODE_NUMPAD_MULTIPLY = 155,
+ AKEYCODE_NUMPAD_SUBTRACT = 156,
+ AKEYCODE_NUMPAD_ADD = 157,
+ AKEYCODE_NUMPAD_DOT = 158,
+ AKEYCODE_NUMPAD_COMMA = 159,
+ AKEYCODE_NUMPAD_ENTER = 160,
+ AKEYCODE_NUMPAD_EQUALS = 161,
+ AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+ AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+ AKEYCODE_VOLUME_MUTE = 164,
+ AKEYCODE_INFO = 165,
+ AKEYCODE_CHANNEL_UP = 166,
+ AKEYCODE_CHANNEL_DOWN = 167,
+ AKEYCODE_ZOOM_IN = 168,
+ AKEYCODE_ZOOM_OUT = 169,
+ AKEYCODE_TV = 170,
+ AKEYCODE_WINDOW = 171,
+ AKEYCODE_GUIDE = 172,
+ AKEYCODE_DVR = 173,
+ AKEYCODE_BOOKMARK = 174,
+ AKEYCODE_CAPTIONS = 175,
+ AKEYCODE_SETTINGS = 176,
+ AKEYCODE_TV_POWER = 177,
+ AKEYCODE_TV_INPUT = 178,
+ AKEYCODE_STB_POWER = 179,
+ AKEYCODE_STB_INPUT = 180,
+ AKEYCODE_AVR_POWER = 181,
+ AKEYCODE_AVR_INPUT = 182,
+ AKEYCODE_PROG_RED = 183,
+ AKEYCODE_PROG_GREEN = 184,
+ AKEYCODE_PROG_YELLOW = 185,
+ AKEYCODE_PROG_BLUE = 186,
+ AKEYCODE_APP_SWITCH = 187,
+ AKEYCODE_BUTTON_1 = 188,
+ AKEYCODE_BUTTON_2 = 189,
+ AKEYCODE_BUTTON_3 = 190,
+ AKEYCODE_BUTTON_4 = 191,
+ AKEYCODE_BUTTON_5 = 192,
+ AKEYCODE_BUTTON_6 = 193,
+ AKEYCODE_BUTTON_7 = 194,
+ AKEYCODE_BUTTON_8 = 195,
+ AKEYCODE_BUTTON_9 = 196,
+ AKEYCODE_BUTTON_10 = 197,
+ AKEYCODE_BUTTON_11 = 198,
+ AKEYCODE_BUTTON_12 = 199,
+ AKEYCODE_BUTTON_13 = 200,
+ AKEYCODE_BUTTON_14 = 201,
+ AKEYCODE_BUTTON_15 = 202,
+ AKEYCODE_BUTTON_16 = 203,
+ AKEYCODE_LANGUAGE_SWITCH = 204,
+ AKEYCODE_MANNER_MODE = 205,
+ AKEYCODE_3D_MODE = 206,
+ AKEYCODE_CONTACTS = 207,
+ AKEYCODE_CALENDAR = 208,
+ AKEYCODE_MUSIC = 209,
+ AKEYCODE_CALCULATOR = 210,
+ AKEYCODE_ZENKAKU_HANKAKU = 211,
+ AKEYCODE_EISU = 212,
+ AKEYCODE_MUHENKAN = 213,
+ AKEYCODE_HENKAN = 214,
+ AKEYCODE_KATAKANA_HIRAGANA = 215,
+ AKEYCODE_YEN = 216,
+ AKEYCODE_RO = 217,
+ AKEYCODE_KANA = 218,
+ AKEYCODE_ASSIST = 219,
+ AKEYCODE_BRIGHTNESS_DOWN = 220,
+ AKEYCODE_BRIGHTNESS_UP = 221,
+ AKEYCODE_MEDIA_AUDIO_TRACK = 222,
+
+ // NOTE: If you add a new keycode here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-19/include/android/sensor.h b/ndk/platforms/android-19/include/android/sensor.h
new file mode 100644
index 0000000..589058d
--- /dev/null
+++ b/ndk/platforms/android-19/include/android/sensor.h
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * 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.
+ */
+
+
+#ifndef ANDROID_SENSOR_H
+#define ANDROID_SENSOR_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process sensor events in
+ * native code.
+ *
+ */
+
+#include <sys/types.h>
+
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * Sensor types
+ * (keep in sync with hardware/sensor.h)
+ */
+
+enum {
+ ASENSOR_TYPE_ACCELEROMETER = 1,
+ ASENSOR_TYPE_MAGNETIC_FIELD = 2,
+ ASENSOR_TYPE_GYROSCOPE = 4,
+ ASENSOR_TYPE_LIGHT = 5,
+ ASENSOR_TYPE_PROXIMITY = 8
+};
+
+/*
+ * Sensor accuracy measure
+ */
+enum {
+ ASENSOR_STATUS_UNRELIABLE = 0,
+ ASENSOR_STATUS_ACCURACY_LOW = 1,
+ ASENSOR_STATUS_ACCURACY_MEDIUM = 2,
+ ASENSOR_STATUS_ACCURACY_HIGH = 3
+};
+
+/*
+ * A few useful constants
+ */
+
+/* Earth's gravity in m/s^2 */
+#define ASENSOR_STANDARD_GRAVITY (9.80665f)
+/* Maximum magnetic field on Earth's surface in uT */
+#define ASENSOR_MAGNETIC_FIELD_EARTH_MAX (60.0f)
+/* Minimum magnetic field on Earth's surface in uT*/
+#define ASENSOR_MAGNETIC_FIELD_EARTH_MIN (30.0f)
+
+/*
+ * A sensor event.
+ */
+
+/* NOTE: Must match hardware/sensors.h */
+typedef struct ASensorVector {
+ union {
+ float v[3];
+ struct {
+ float x;
+ float y;
+ float z;
+ };
+ struct {
+ float azimuth;
+ float pitch;
+ float roll;
+ };
+ };
+ int8_t status;
+ uint8_t reserved[3];
+} ASensorVector;
+
+typedef struct AMetaDataEvent {
+ int32_t what;
+ int32_t sensor;
+} AMetaDataEvent;
+
+typedef struct AUncalibratedEvent {
+ union {
+ float uncalib[3];
+ struct {
+ float x_uncalib;
+ float y_uncalib;
+ float z_uncalib;
+ };
+ };
+ union {
+ float bias[3];
+ struct {
+ float x_bias;
+ float y_bias;
+ float z_bias;
+ };
+ };
+} AUncalibratedEvent;
+
+/* NOTE: Must match hardware/sensors.h */
+typedef struct ASensorEvent {
+ int32_t version; /* sizeof(struct ASensorEvent) */
+ int32_t sensor;
+ int32_t type;
+ int32_t reserved0;
+ int64_t timestamp;
+ union {
+ union {
+ float data[16];
+ ASensorVector vector;
+ ASensorVector acceleration;
+ ASensorVector magnetic;
+ float temperature;
+ float distance;
+ float light;
+ float pressure;
+ float relative_humidity;
+ AUncalibratedEvent uncalibrated_gyro;
+ AUncalibratedEvent uncalibrated_magnetic;
+ AMetaDataEvent meta_data;
+ };
+ union {
+ uint64_t data[8];
+ uint64_t step_counter;
+ } u64;
+ };
+ int32_t reserved1[4];
+} ASensorEvent;
+
+struct ASensorManager;
+typedef struct ASensorManager ASensorManager;
+
+struct ASensorEventQueue;
+typedef struct ASensorEventQueue ASensorEventQueue;
+
+struct ASensor;
+typedef struct ASensor ASensor;
+typedef ASensor const* ASensorRef;
+typedef ASensorRef const* ASensorList;
+
+/*****************************************************************************/
+
+/*
+ * Get a reference to the sensor manager. ASensorManager is a singleton.
+ *
+ * Example:
+ *
+ * ASensorManager* sensorManager = ASensorManager_getInstance();
+ *
+ */
+ASensorManager* ASensorManager_getInstance();
+
+
+/*
+ * Returns the list of available sensors.
+ */
+int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list);
+
+/*
+ * Returns the default sensor for the given type, or NULL if no sensor
+ * of that type exist.
+ */
+ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type);
+
+/*
+ * Creates a new sensor event queue and associate it with a looper.
+ */
+ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
+ ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Destroys the event queue and free all resources associated to it.
+ */
+int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue);
+
+
+/*****************************************************************************/
+
+/*
+ * Enable the selected sensor. Returns a negative error code on failure.
+ */
+int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor);
+
+/*
+ * Disable the selected sensor. Returns a negative error code on failure.
+ */
+int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor);
+
+/*
+ * Sets the delivery rate of events in microseconds for the given sensor.
+ * Note that this is a hint only, generally event will arrive at a higher
+ * rate. It is an error to set a rate inferior to the value returned by
+ * ASensor_getMinDelay().
+ * Returns a negative error code on failure.
+ */
+int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
+
+/*
+ * Returns true if there are one or more events available in the
+ * sensor queue. Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int ASensorEventQueue_hasEvents(ASensorEventQueue* queue);
+
+/*
+ * Returns the next available events from the queue. Returns a negative
+ * value if no events are available or an error has occurred, otherwise
+ * the number of events returned.
+ *
+ * Examples:
+ * ASensorEvent event;
+ * ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1);
+ *
+ * ASensorEvent eventBuffer[8];
+ * ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8);
+ *
+ */
+ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue,
+ ASensorEvent* events, size_t count);
+
+
+/*****************************************************************************/
+
+/*
+ * Returns this sensor's name (non localized)
+ */
+const char* ASensor_getName(ASensor const* sensor);
+
+/*
+ * Returns this sensor's vendor's name (non localized)
+ */
+const char* ASensor_getVendor(ASensor const* sensor);
+
+/*
+ * Return this sensor's type
+ */
+int ASensor_getType(ASensor const* sensor);
+
+/*
+ * Returns this sensors's resolution
+ */
+float ASensor_getResolution(ASensor const* sensor) __NDK_FPABI__;
+
+/*
+ * Returns the minimum delay allowed between events in microseconds.
+ * A value of zero means that this sensor doesn't report events at a
+ * constant rate, but rather only when a new data is available.
+ */
+int ASensor_getMinDelay(ASensor const* sensor);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_SENSOR_H
diff --git a/ndk/platforms/android-19/include/sys/stat.h b/ndk/platforms/android-19/include/sys/stat.h
new file mode 100644
index 0000000..c156f43
--- /dev/null
+++ b/ndk/platforms/android-19/include/sys/stat.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * 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.
+ *
+ * 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.
+ */
+#ifndef _SYS_STAT_H_
+#define _SYS_STAT_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <linux/stat.h>
+
+#include <endian.h>
+
+__BEGIN_DECLS
+
+/* really matches stat64 in the kernel, hence the padding
+ * Note: The kernel zero's the padded region because glibc might read them
+ * in the hope that the kernel has stretched to using larger sizes.
+ */
+struct stat {
+ unsigned long long st_dev;
+ unsigned char __pad0[4];
+
+ unsigned long __st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+
+ unsigned long st_uid;
+ unsigned long st_gid;
+
+ unsigned long long st_rdev;
+ unsigned char __pad3[4];
+
+ long long st_size;
+ unsigned long st_blksize;
+ unsigned long long st_blocks;
+
+ unsigned long st_atime;
+ unsigned long st_atime_nsec;
+
+ unsigned long st_mtime;
+ unsigned long st_mtime_nsec;
+
+ unsigned long st_ctime;
+ unsigned long st_ctime_nsec;
+
+ unsigned long long st_ino;
+};
+
+/* For compatibility with GLibc, we provide macro aliases
+ * for the non-Posix nano-seconds accessors.
+ */
+#define st_atimensec st_atime_nsec
+#define st_mtimensec st_mtime_nsec
+#define st_ctimensec st_ctime_nsec
+
+extern int chmod(const char *, mode_t);
+extern int fchmod(int, mode_t);
+extern int mkdir(const char *, mode_t);
+
+extern int stat(const char *, struct stat *);
+extern int fstat(int, struct stat *);
+extern int lstat(const char *, struct stat *);
+extern int mknod(const char *, mode_t, dev_t);
+extern mode_t umask(mode_t);
+
+#define stat64 stat
+#define fstat64 fstat
+#define lstat64 lstat
+
+static __inline__ int mkfifo(const char *__p, mode_t __m)
+{
+ return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
+}
+
+extern int fstatat(int dirfd, const char *path, struct stat *buf, int flags);
+extern int mkdirat(int dirfd, const char *pathname, mode_t mode);
+extern int fchownat(int dirfd, const char *path, uid_t owner, gid_t group, int flags);
+extern int fchmodat(int dirfd, const char *path, mode_t mode, int flags);
+extern int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
+
+# define UTIME_NOW ((1l << 30) - 1l)
+# define UTIME_OMIT ((1l << 30) - 2l)
+extern int utimensat(int fd, const char *path, const struct timespec times[2], int flags);
+extern int futimens(int fd, const struct timespec times[2]);
+
+__END_DECLS
+
+#endif /* _SYS_STAT_H_ */
diff --git a/ndk/platforms/android-3/arch-arm/lib/libm_hard.a b/ndk/platforms/android-3/arch-arm/lib/libm_hard.a
new file mode 100644
index 0000000..2ff6e1d
--- /dev/null
+++ b/ndk/platforms/android-3/arch-arm/lib/libm_hard.a
Binary files differ
diff --git a/ndk/platforms/android-3/header-patches/headers.patch b/ndk/platforms/android-3/header-patches/headers.patch
new file mode 100644
index 0000000..56b44a4
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/headers.patch
@@ -0,0 +1,138 @@
+diff -Naur a/include/asm/a.out.h b/include/asm/a.out.h
+--- a/include/asm/a.out.h 2013-06-10 08:16:13.496310000 +0800
++++ b/include/asm/a.out.h 2013-09-06 14:13:28.366275000 +0800
+@@ -33,7 +33,7 @@
+ #define N_DRSIZE(a) ((a).a_drsize)
+ #define N_SYMSIZE(a) ((a).a_syms)
+
+-#define M_MACHINE 103
++#define M_ARM 103
+
+ #ifndef LIBRARY_START_TEXT
+ #define LIBRARY_START_TEXT (0x00c00000)
+diff -Naur a/include/asm/byteorder.h b/include/asm/byteorder.h
+--- a/include/asm/byteorder.h 2013-09-03 12:33:37.353419000 +0800
++++ b/include/asm/byteorder.h 2013-08-30 17:41:09.234265000 +0800
+@@ -19,12 +19,6 @@
+ {
+ __u32 t;
+
+-#ifndef __thumb__
+- if (!__builtin_constant_p(x)) {
+-
+- __asm__ ("eor\t%0, %1, %1, ror #16" : "=r" (t) : "r" (x));
+- } else
+-#endif
+ t = x ^ ((x << 16) | (x >> 16));
+
+ x = (x << 24) | (x >> 8);
+diff -Naur a/include/asm/stat.h b/include/asm/stat.h
+--- a/include/asm/stat.h 2013-09-03 12:33:37.367418000 +0800
++++ b/include/asm/stat.h 2013-08-30 17:41:09.431302000 +0800
+@@ -29,23 +29,13 @@
+ #define STAT_HAVE_NSEC
+
+ struct stat {
+-#ifdef __ARMEB__
+- unsigned short st_dev;
+- unsigned short __pad1;
+-#else
+ unsigned long st_dev;
+-#endif
+ unsigned long st_ino;
+ unsigned short st_mode;
+ unsigned short st_nlink;
+ unsigned short st_uid;
+ unsigned short st_gid;
+-#ifdef __ARMEB__
+- unsigned short st_rdev;
+- unsigned short __pad2;
+-#else
+ unsigned long st_rdev;
+-#endif
+ unsigned long st_size;
+ unsigned long st_blksize;
+ unsigned long st_blocks;
+diff -Naur a/include/asm/types.h b/include/asm/types.h
+--- a/include/asm/types.h 2013-09-03 12:33:37.313428000 +0800
++++ b/include/asm/types.h 2013-08-30 17:41:09.467274000 +0800
+@@ -25,7 +25,7 @@
+ typedef __signed__ int __s32;
+ typedef unsigned int __u32;
+
+-#ifdef __GNUC__
++#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+ typedef __signed__ long long __s64;
+ typedef unsigned long long __u64;
+ #endif
+diff -Naur a/include/asm/unaligned.h b/include/asm/unaligned.h
+--- a/include/asm/unaligned.h 2013-09-03 12:33:37.376422000 +0800
++++ b/include/asm/unaligned.h 2013-08-30 17:41:09.500316000 +0800
+@@ -28,11 +28,6 @@
+
+ #define __put_unaligned_le(val,ptr) ({ switch (sizeof(*(ptr))) { case 1: *(ptr) = (val); break; case 2: __put_unaligned_2_le((val),(__u8 *)(ptr)); break; case 4: __put_unaligned_4_le((val),(__u8 *)(ptr)); break; case 8: __put_unaligned_8_le((val),(__u8 *)(ptr)); break; default: __bug_unaligned_x(ptr); break; } (void) 0; })
+ #define __put_unaligned_be(val,ptr) ({ switch (sizeof(*(ptr))) { case 1: *(ptr) = (val); break; case 2: __put_unaligned_2_be((val),(__u8 *)(ptr)); break; case 4: __put_unaligned_4_be((val),(__u8 *)(ptr)); break; case 8: __put_unaligned_8_be((val),(__u8 *)(ptr)); break; default: __bug_unaligned_x(ptr); break; } (void) 0; })
+-#ifndef __ARMEB__
+ #define get_unaligned __get_unaligned_le
+ #define put_unaligned __put_unaligned_le
+-#else
+-#define get_unaligned __get_unaligned_be
+-#define put_unaligned __put_unaligned_be
+-#endif
+ #endif
+diff -Naur a/include/asm/unistd.h b/include/asm/unistd.h
+--- a/include/asm/unistd.h 2013-09-03 12:33:37.322427000 +0800
++++ b/include/asm/unistd.h 2013-08-30 17:41:09.506276000 +0800
+@@ -19,12 +19,7 @@
+ #ifndef __ASM_MACHINE_UNISTD_H
+ #define __ASM_MACHINE_UNISTD_H
+ #define __NR_OABI_SYSCALL_BASE 0x900000
+-#if defined(__thumb__) || defined(__ARM_EABI__)
+-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ #define __NR_SYSCALL_BASE 0
+-#else
+-#define __NR_SYSCALL_BASE __NR_OABI_SYSCALL_BASE
+-#endif
+ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ #define __NR_restart_syscall (__NR_SYSCALL_BASE+ 0)
+ #define __NR_exit (__NR_SYSCALL_BASE+ 1)
+diff -Naur a/include/asm/user.h b/include/asm/user.h
+--- a/include/asm/user.h 2013-09-03 12:33:37.118421000 +0800
++++ b/include/asm/user.h 2013-08-30 17:41:09.519301000 +0800
+@@ -58,15 +58,4 @@
+ #define HOST_TEXT_START_ADDR (u.start_code)
+ #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
+
+-struct user_vfp {
+- unsigned long long fpregs[32];
+- unsigned long fpscr;
+-};
+-
+-struct user_vfp_exc {
+- unsigned long fpexc;
+- unsigned long fpinst;
+- unsigned long fpinst2;
+-};
+-
+ #endif
+diff -Naur a/include/machine/asm.h b/include/machine/asm.h
+--- a/include/machine/asm.h 2013-09-03 12:33:37.135419000 +0800
++++ b/include/machine/asm.h 2013-08-30 17:41:09.533294000 +0800
+@@ -78,17 +78,7 @@
+ .fnend; \
+ _ASM_SIZE(x)
+
+-#ifdef GPROF
+-# ifdef __ELF__
+-# define _PROF_PROLOGUE \
+- mov ip, lr; bl __mcount
+-# else
+-# define _PROF_PROLOGUE \
+- mov ip,lr; bl mcount
+-# endif
+-#else
+ # define _PROF_PROLOGUE
+-#endif
+
+ #define ENTRY(y) _ENTRY(_C_LABEL(y)); _PROF_PROLOGUE
+ #define ENTRY_NP(y) _ENTRY(_C_LABEL(y))
diff --git a/ndk/platforms/android-3/header-patches/include/asm-generic/fcntl.h b/ndk/platforms/android-3/header-patches/include/asm-generic/fcntl.h
new file mode 100644
index 0000000..83c58e6
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm-generic/fcntl.h
@@ -0,0 +1,138 @@
+#ifndef _ASM_GENERIC_FCNTL_H
+#define _ASM_GENERIC_FCNTL_H
+
+#include <linux/types.h>
+
+#define O_ACCMODE 00000003
+#define O_RDONLY 00000000
+#define O_WRONLY 00000001
+#define O_RDWR 00000002
+#ifndef O_CREAT
+#define O_CREAT 00000100
+#endif
+#ifndef O_EXCL
+#define O_EXCL 00000200
+#endif
+#ifndef O_NOCTTY
+#define O_NOCTTY 00000400
+#endif
+#ifndef O_TRUNC
+#define O_TRUNC 00001000
+#endif
+#ifndef O_APPEND
+#define O_APPEND 00002000
+#endif
+#ifndef O_NONBLOCK
+#define O_NONBLOCK 00004000
+#endif
+#ifndef O_SYNC
+#define O_SYNC 00010000
+#endif
+#ifndef FASYNC
+#define FASYNC 00020000
+#endif
+#ifndef O_DIRECT
+#define O_DIRECT 00040000
+#endif
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 00100000
+#endif
+#ifndef O_DIRECTORY
+#define O_DIRECTORY 00200000
+#endif
+#ifndef O_NOFOLLOW
+#define O_NOFOLLOW 00400000
+#endif
+#ifndef O_NOATIME
+#define O_NOATIME 01000000
+#endif
+#ifndef O_NDELAY
+#define O_NDELAY O_NONBLOCK
+#endif
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+#ifndef F_GETLK
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+#endif
+#ifndef F_SETOWN
+#define F_SETOWN 8
+#define F_GETOWN 9
+#endif
+#ifndef F_SETSIG
+#define F_SETSIG 10
+#define F_GETSIG 11
+#endif
+
+#define FD_CLOEXEC 1
+
+#ifndef F_RDLCK
+#define F_RDLCK 0
+#define F_WRLCK 1
+#define F_UNLCK 2
+#endif
+
+#ifndef F_EXLCK
+#define F_EXLCK 4
+#define F_SHLCK 8
+#endif
+
+#ifndef F_INPROGRESS
+#define F_INPROGRESS 16
+#endif
+
+#define LOCK_SH 1
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_UN 8
+
+#define LOCK_MAND 32
+#define LOCK_READ 64
+#define LOCK_WRITE 128
+#define LOCK_RW 192
+
+#define F_LINUX_SPECIFIC_BASE 1024
+
+#ifndef HAVE_ARCH_STRUCT_FLOCK
+#ifndef __ARCH_FLOCK_PAD
+#define __ARCH_FLOCK_PAD
+#endif
+
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+ __ARCH_FLOCK_PAD
+};
+#endif
+
+#ifndef F_GETLK64
+#define F_GETLK64 12
+#define F_SETLK64 13
+#define F_SETLKW64 14
+#endif
+
+#ifndef HAVE_ARCH_STRUCT_FLOCK64
+#ifndef __ARCH_FLOCK64_PAD
+#define __ARCH_FLOCK64_PAD
+#endif
+
+struct flock64 {
+ short l_type;
+ short l_whence;
+ unsigned char __padding[4];
+ loff_t l_start;
+ loff_t l_len;
+ pid_t l_pid;
+ __ARCH_FLOCK64_PAD
+};
+
+#endif
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/div64.h b/ndk/platforms/android-3/header-patches/include/asm/div64.h
new file mode 100644
index 0000000..cde7274
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/div64.h
@@ -0,0 +1,6 @@
+#ifndef __ASM_DIV64_H
+#define __ASM_DIV64_H
+
+#include <asm/system.h>
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/elf.h b/ndk/platforms/android-3/header-patches/include/asm/elf.h
new file mode 100644
index 0000000..cec9338
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/elf.h
@@ -0,0 +1,31 @@
+#ifndef __ASM_ELF_H
+#define __ASM_ELF_H
+
+#include <asm/ptrace.h>
+#include <asm/user.h>
+
+typedef unsigned long elf_greg_t;
+typedef unsigned long elf_freg_t[3];
+
+
+#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+typedef struct user_fp elf_fpregset_t;
+
+#define ELF_CLASS ELFCLASS32
+#define ELF_DATA ELFDATA2LSB
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 4096
+
+#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)
+
+
+#define ELF_HWCAP (elf_hwcap)
+
+#define ELF_PLATFORM_SIZE 8
+
+#define ELF_PLATFORM (elf_platform)
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/locks.h b/ndk/platforms/android-3/header-patches/include/asm/locks.h
new file mode 100644
index 0000000..4463603
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/locks.h
@@ -0,0 +1,7 @@
+#ifndef __ASM_PROC_LOCKS_H
+#define __ASM_PROC_LOCKS_H
+
+#define RW_LOCK_BIAS 0x01000000
+#define RW_LOCK_BIAS_STR "0x01000000"
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/ptrace.h b/ndk/platforms/android-3/header-patches/include/asm/ptrace.h
new file mode 100644
index 0000000..a0877cf
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/ptrace.h
@@ -0,0 +1,105 @@
+#ifndef __ASM_PTRACE_H
+#define __ASM_PTRACE_H
+
+#define PTRACE_GETREGS 12
+#define PTRACE_SETREGS 13
+#define PTRACE_GETFPREGS 14
+#define PTRACE_SETFPREGS 15
+
+#define PTRACE_GETWMMXREGS 18
+#define PTRACE_SETWMMXREGS 19
+
+#define PTRACE_OLDSETOPTIONS 21
+
+#define PTRACE_GET_THREAD_AREA 22
+
+#define PTRACE_SET_SYSCALL 23
+
+#define PTRACE_GETCRUNCHREGS 25
+#define PTRACE_SETCRUNCHREGS 26
+
+#define USR26_MODE 0x00000000
+#define FIQ26_MODE 0x00000001
+#define IRQ26_MODE 0x00000002
+#define SVC26_MODE 0x00000003
+#define USR_MODE 0x00000010
+#define FIQ_MODE 0x00000011
+#define IRQ_MODE 0x00000012
+#define SVC_MODE 0x00000013
+#define ABT_MODE 0x00000017
+#define UND_MODE 0x0000001b
+#define SYSTEM_MODE 0x0000001f
+#define MODE32_BIT 0x00000010
+#define MODE_MASK 0x0000001f
+#define PSR_T_BIT 0x00000020
+#define PSR_F_BIT 0x00000040
+#define PSR_I_BIT 0x00000080
+#define PSR_J_BIT 0x01000000
+#define PSR_Q_BIT 0x08000000
+#define PSR_V_BIT 0x10000000
+#define PSR_C_BIT 0x20000000
+#define PSR_Z_BIT 0x40000000
+#define PSR_N_BIT 0x80000000
+#define PCMASK 0
+
+#define PSR_f 0xff000000
+#define PSR_s 0x00ff0000
+#define PSR_x 0x0000ff00
+#define PSR_c 0x000000ff
+
+#ifndef __ASSEMBLY__
+
+struct pt_regs {
+ long uregs[44]; // Increase array size for ARM/x86/MIPS compatibility
+};
+
+#define ARM_cpsr uregs[16]
+#define ARM_pc uregs[15]
+#define ARM_lr uregs[14]
+#define ARM_sp uregs[13]
+#define ARM_ip uregs[12]
+#define ARM_fp uregs[11]
+#define ARM_r10 uregs[10]
+#define ARM_r9 uregs[9]
+#define ARM_r8 uregs[8]
+#define ARM_r7 uregs[7]
+#define ARM_r6 uregs[6]
+#define ARM_r5 uregs[5]
+#define ARM_r4 uregs[4]
+#define ARM_r3 uregs[3]
+#define ARM_r2 uregs[2]
+#define ARM_r1 uregs[1]
+#define ARM_r0 uregs[0]
+#define ARM_ORIG_r0 uregs[17]
+
+#define x86_r15 uregs[0]
+#define x86_r14 uregs[1]
+#define x86_r13 uregs[2]
+#define x86_r12 uregs[3]
+#define x86_rbp uregs[4]
+#define x86_rbx uregs[5]
+#define x86_r11 uregs[6]
+#define x86_r10 uregs[7]
+#define x86_r9 uregs[8]
+#define x86_r8 uregs[9]
+#define x86_rax uregs[10]
+#define x86_rcx uregs[11]
+#define x86_rdx uregs[12]
+#define x86_rsi uregs[13]
+#define x86_rdi uregs[14]
+#define x86_orig_rax uregs[15]
+#define x86_rip uregs[16]
+#define x86_cs uregs[17]
+#define x86_eflags uregs[18]
+#define x86_rsp uregs[19]
+#define x86_ss uregs[20]
+
+#define pc_pointer(v) ((v) & ~PCMASK)
+
+#define instruction_pointer(regs) (pc_pointer((regs)->ARM_pc))
+
+#define profile_pc(regs) instruction_pointer(regs)
+
+#endif
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/sigcontext.h b/ndk/platforms/android-3/header-patches/include/asm/sigcontext.h
new file mode 100644
index 0000000..ebbcafa
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/sigcontext.h
@@ -0,0 +1,4 @@
+#ifndef _ASM_SIGCONTEXT_H
+#define _ASM_SIGCONTEXT_H
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/uaccess.h b/ndk/platforms/android-3/header-patches/include/asm/uaccess.h
new file mode 100644
index 0000000..ace935e
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/uaccess.h
@@ -0,0 +1,37 @@
+#ifndef _ASM_UACCESS_H
+#define _ASM_UACCESS_H
+
+#include <linux/sched.h>
+#include <asm/errno.h>
+#include <asm/memory.h>
+#include <asm/system.h>
+
+#define VERIFY_READ 0
+#define VERIFY_WRITE 1
+
+struct exception_table_entry
+{
+ unsigned long insn, fixup;
+};
+
+#define KERNEL_DS 0x00000000
+#define get_ds() (KERNEL_DS)
+
+#define USER_DS KERNEL_DS
+
+#define segment_eq(a,b) (1)
+#define __addr_ok(addr) (1)
+#define __range_ok(addr,size) (0)
+#define get_fs() (KERNEL_DS)
+
+#define get_user(x,p)
+#define put_user(x,p)
+#define access_ok(type,addr,size) (__range_ok(addr,size) == 0)
+#define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0)
+#define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0)
+#define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0)
+
+#define __copy_to_user_inatomic __copy_to_user
+#define __copy_from_user_inatomic __copy_from_user
+#define strlen_user(s) strnlen_user(s, ~0UL >> 1)
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/fenv.h b/ndk/platforms/android-3/header-patches/include/fenv.h
new file mode 100644
index 0000000..2ee530d
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/fenv.h
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+ * 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 THE AUTHOR 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 AUTHOR 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.
+ *
+ * $FreeBSD: src/lib/msun/arm/fenv.h,v 1.5 2005/03/16 19:03:45 das Exp $
+ */
+
+/*
+ * Rewritten for Android.
+ *
+ * The ARM FPSCR is described here:
+ * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344b/Chdfafia.html
+ */
+
+#ifndef _FENV_H_
+#define _FENV_H_
+
+#include <sys/types.h>
+
+__BEGIN_DECLS
+
+/*
+ * arm/mips definition
+ */
+typedef __uint32_t fenv_t;
+typedef __uint32_t fexcept_t;
+
+/*
+ * x86 definition
+ */
+/*
+typedef struct {
+ __uint16_t __control;
+ __uint16_t __mxcsr_hi;
+ __uint16_t __status;
+ __uint16_t __mxcsr_lo;
+ __uint32_t __tag;
+ char __other[16];
+} fenv_t;
+*/
+
+
+/* Exception flags. */
+#define FE_INVALID 0x01
+#define FE_DIVBYZERO 0x02
+#define FE_OVERFLOW 0x04
+#define FE_UNDERFLOW 0x08
+#define FE_INEXACT 0x10
+#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
+
+/* Rounding modes. */
+#define FE_TONEAREST 0x0
+#define FE_UPWARD 0x1
+#define FE_DOWNWARD 0x2
+#define FE_TOWARDZERO 0x3
+
+/* Default floating-point environment. */
+extern const fenv_t __fe_dfl_env;
+#define FE_DFL_ENV (&__fe_dfl_env)
+
+/*
+ * Need implementations in libportable to enable following functions
+ *
+ * int fegetenv(fenv_t* __envp);
+ * int fesetenv(const fenv_t* __envp);
+ * int feholdexcept(fenv_t* __envp);
+ * int feupdateenv(const fenv_t* __envp);
+ */
+
+int feclearexcept(int __excepts);
+int fegetexceptflag(fexcept_t* __flagp, int __excepts);
+int fesetexceptflag(const fexcept_t* __flagp, int __excepts);
+int feraiseexcept(int __excepts);
+int fetestexcept(int __excepts);
+int fegetround(void);
+int fesetround(int __round);
+
+__END_DECLS
+
+#endif /* !_FENV_H_ */
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-3/header-patches/include/machine/endian.h
similarity index 66%
copy from ndk/platforms/android-9/arch-x86/src/__dso_handle.S
copy to ndk/platforms/android-3/header-patches/include/machine/endian.h
index 3e80128..5f69357 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ b/ndk/platforms/android-3/header-patches/include/machine/endian.h
@@ -1,5 +1,7 @@
+/* $OpenBSD: endian.h,v 1.3 2005/12/13 00:35:23 millert Exp $ */
+
/*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,17 +28,28 @@
* SUCH DAMAGE.
*/
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
- .section .bss
- .align 4
+#ifndef _MACHINE_ENDIAN_H_
+#define _MACHINE_ENDIAN_H_
-#ifndef CRT_LEGACY_WORKAROUND
- .hidden __dso_handle
-#endif
+#ifdef __GNUC__
- .globl __dso_handle
-__dso_handle:
- .long 0
+/*
+ * Implement below swap{16,32,64}md functions in libportable
+ * that are optimized for your architecture.
+ *
+ * uint16_t __swap16md(uint16_t x);
+ * uint32_t __swap32md(uint32_t x);
+ * uint64_t __swap64md(uint64_t x);
+ */
+
+/* Tell sys/endian.h we have MD variants of the swap macros.
+ * #define MD_SWAP
+ */
+#endif /* __GNUC__ */
+
+#define _BYTE_ORDER _LITTLE_ENDIAN
+#define __STRICT_ALIGNMENT
+#include <sys/types.h>
+#include <sys/endian.h>
+
+#endif /* !_MACHINE_ENDIAN_H_ */
diff --git a/ndk/platforms/android-3/header-patches/include/machine/ieee.h b/ndk/platforms/android-3/header-patches/include/machine/ieee.h
new file mode 100644
index 0000000..823f5ef
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/machine/ieee.h
@@ -0,0 +1,151 @@
+/* $OpenBSD: ieee.h,v 1.1 2004/02/01 05:09:49 drahn Exp $ */
+/* $NetBSD: ieee.h,v 1.2 2001/02/21 17:43:50 bjh21 Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Lawrence Berkeley Laboratory.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ *
+ * @(#)ieee.h 8.1 (Berkeley) 6/11/93
+ */
+
+/*
+ * ieee.h defines the machine-dependent layout of the machine's IEEE
+ * floating point.
+ */
+
+/*
+ * Define the number of bits in each fraction and exponent.
+ *
+ * k k+1
+ * Note that 1.0 x 2 == 0.1 x 2 and that denorms are represented
+ *
+ * (-exp_bias+1)
+ * as fractions that look like 0.fffff x 2 . This means that
+ *
+ * -126
+ * the number 0.10000 x 2 , for instance, is the same as the normalized
+ *
+ * -127 -128
+ * float 1.0 x 2 . Thus, to represent 2 , we need one leading zero
+ *
+ * -129
+ * in the fraction; to represent 2 , we need two, and so on. This
+ *
+ * (-exp_bias-fracbits+1)
+ * implies that the smallest denormalized number is 2
+ *
+ * for whichever format we are talking about: for single precision, for
+ *
+ * -126 -149
+ * instance, we get .00000000000000000000001 x 2 , or 1.0 x 2 , and
+ *
+ * -149 == -127 - 23 + 1.
+ */
+
+/*
+ * The ARM has two sets of FP data formats. The FPA supports 32-bit, 64-bit
+ * and 96-bit IEEE formats, with the words in big-endian order. VFP supports
+ * 32-bin and 64-bit IEEE formats with the words in the CPU's native byte
+ * order.
+ *
+ * The FPA also has two packed decimal formats, but we ignore them here.
+ */
+
+#define SNG_EXPBITS 8
+#define SNG_FRACBITS 23
+
+#define DBL_EXPBITS 11
+#define DBL_FRACBITS 52
+
+#define EXT_EXPBITS 15
+#define EXT_FRACBITS 112
+
+struct ieee_single {
+ u_int sng_frac:23;
+ u_int sng_exp:8;
+ u_int sng_sign:1;
+};
+
+struct ieee_double {
+ u_int dbl_fracl;
+ u_int dbl_frach:20;
+ u_int dbl_exp:11;
+ u_int dbl_sign:1;
+};
+
+union ieee_double_u {
+ double dblu_d;
+ struct ieee_double dblu_dbl;
+};
+
+struct ieee_ext {
+ u_int ext_frach:16;
+ u_int ext_exp:15;
+ u_int ext_sign:1;
+ u_int ext_frachm;
+ u_int ext_fraclm;
+ u_int ext_fracl;
+};
+
+/*
+ * Floats whose exponent is in [1..INFNAN) (of whatever type) are
+ * `normal'. Floats whose exponent is INFNAN are either Inf or NaN.
+ * Floats whose exponent is zero are either zero (iff all fraction
+ * bits are zero) or subnormal values.
+ *
+ * A NaN is a `signalling NaN' if its QUIETNAN bit is clear in its
+ * high fraction; if the bit is set, it is a `quiet NaN'.
+ */
+#define SNG_EXP_INFNAN 255
+#define DBL_EXP_INFNAN 2047
+#define EXT_EXP_INFNAN 32767
+
+#if 0
+#define SNG_QUIETNAN (1 << 22)
+#define DBL_QUIETNAN (1 << 19)
+#define EXT_QUIETNAN (1 << 15)
+#endif
+
+/*
+ * Exponent biases.
+ */
+#define SNG_EXP_BIAS 127
+#define DBL_EXP_BIAS 1023
+#define EXT_EXP_BIAS 16383
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-3/header-patches/include/machine/setjmp.h
similarity index 77%
rename from ndk/platforms/android-9/arch-x86/src/__dso_handle.S
rename to ndk/platforms/android-3/header-patches/include/machine/setjmp.h
index 3e80128..d7b792e 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ b/ndk/platforms/android-3/header-patches/include/machine/setjmp.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,17 +26,14 @@
* SUCH DAMAGE.
*/
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
- .section .bss
- .align 4
+/*
+ * machine/setjmp.h: machine dependent setjmp-related information.
+ */
-#ifndef CRT_LEGACY_WORKAROUND
- .hidden __dso_handle
-#endif
-
- .globl __dso_handle
-__dso_handle:
- .long 0
+/* _JBLEN is the size of a jmp_buf in longs.
+ * Do not modify this value or you will break the ABI !
+ *
+ * This value comes from the mips machine/setjmp.h header
+ * because it has the biggest jump buffer length.
+ */
+#define _JBLEN 157
diff --git a/ndk/platforms/android-3/header-patches/include/sys/epoll.h b/ndk/platforms/android-3/header-patches/include/sys/epoll.h
new file mode 100644
index 0000000..c6b0882
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/sys/epoll.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * 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.
+ *
+ * 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.
+ */
+#ifndef _SYS_EPOLL_H_
+#define _SYS_EPOLL_H_
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+#define EPOLLIN 0x00000001
+#define EPOLLPRI 0x00000002
+#define EPOLLOUT 0x00000004
+#define EPOLLERR 0x00000008
+#define EPOLLHUP 0x00000010
+#define EPOLLRDNORM 0x00000040
+#define EPOLLRDBAND 0x00000080
+#define EPOLLWRNORM 0x00000100
+#define EPOLLWRBAND 0x00000200
+#define EPOLLMSG 0x00000400
+#define EPOLLET 0x80000000
+
+#define EPOLL_CTL_ADD 1
+#define EPOLL_CTL_DEL 2
+#define EPOLL_CTL_MOD 3
+
+typedef union epoll_data
+{
+ void *ptr;
+ int fd;
+ unsigned int u32;
+ unsigned long long u64;
+} epoll_data_t;
+
+struct epoll_event
+{
+ unsigned int events;
+ unsigned char __padding[4];
+ epoll_data_t data;
+};
+
+int epoll_create(int size);
+int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
+int epoll_wait(int epfd, struct epoll_event *events, int max, int timeout);
+
+__END_DECLS
+
+#endif /* _SYS_EPOLL_H_ */
diff --git a/ndk/platforms/android-3/header-patches/include/sys/stat.h b/ndk/platforms/android-3/header-patches/include/sys/stat.h
new file mode 100644
index 0000000..0a9af5b
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/sys/stat.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * 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.
+ *
+ * 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.
+ */
+#ifndef _SYS_STAT_H_
+#define _SYS_STAT_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <linux/stat.h>
+
+#include <endian.h>
+
+__BEGIN_DECLS
+
+/* really matches stat64 in the kernel, hence the padding
+ * Note: The kernel zero's the padded region because glibc might read them
+ * in the hope that the kernel has stretched to using larger sizes.
+ */
+struct stat {
+ unsigned long long st_dev;
+ unsigned char __pad0[4];
+
+ unsigned long __st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+
+ unsigned long st_uid;
+ unsigned long st_gid;
+
+ unsigned long long st_rdev;
+ unsigned char __pad3[4];
+
+ unsigned char __pad4[4];
+ long long st_size;
+ unsigned long st_blksize;
+ unsigned char __pad5[4];
+ unsigned long long st_blocks;
+
+ unsigned long st_atime;
+ unsigned long st_atime_nsec;
+
+ unsigned long st_mtime;
+ unsigned long st_mtime_nsec;
+
+ unsigned long st_ctime;
+ unsigned long st_ctime_nsec;
+
+ unsigned long long st_ino;
+};
+
+/* For compatibility with GLibc, we provide macro aliases
+ * for the non-Posix nano-seconds accessors.
+ */
+#define st_atimensec st_atime_nsec
+#define st_mtimensec st_mtime_nsec
+#define st_ctimensec st_ctime_nsec
+
+extern int chmod(const char *, mode_t);
+extern int fchmod(int, mode_t);
+extern int mkdir(const char *, mode_t);
+
+extern int stat(const char *, struct stat *);
+extern int fstat(int, struct stat *);
+extern int lstat(const char *, struct stat *);
+extern int mknod(const char *, mode_t, dev_t);
+extern mode_t umask(mode_t);
+
+#define stat64 stat
+#define fstat64 fstat
+#define lstat64 lstat
+
+static __inline__ int mkfifo(const char *__p, mode_t __m)
+{
+ return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
+}
+
+extern int fstatat(int dirfd, const char *path, struct stat *buf, int flags);
+extern int mkdirat(int dirfd, const char *pathname, mode_t mode);
+extern int fchownat(int dirfd, const char *path, uid_t owner, gid_t group, int flags);
+extern int fchmodat(int dirfd, const char *path, mode_t mode, int flags);
+extern int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
+
+__END_DECLS
+
+#endif /* _SYS_STAT_H_ */
diff --git a/ndk/platforms/android-3/include/inttypes.h b/ndk/platforms/android-3/include/inttypes.h
index 73b22db..62e12c6 100644
--- a/ndk/platforms/android-3/include/inttypes.h
+++ b/ndk/platforms/android-3/include/inttypes.h
@@ -249,8 +249,6 @@
} imaxdiv_t;
__BEGIN_DECLS
-intmax_t imaxabs(intmax_t);
-imaxdiv_t imaxdiv(intmax_t, intmax_t);
intmax_t strtoimax(const char *, char **, int);
uintmax_t strtoumax(const char *, char **, int);
diff --git a/ndk/platforms/android-3/include/jni.h b/ndk/platforms/android-3/include/jni.h
index 495902c..21ad370 100644
--- a/ndk/platforms/android-3/include/jni.h
+++ b/ndk/platforms/android-3/include/jni.h
@@ -24,6 +24,7 @@
#ifndef JNI_H_
#define JNI_H_
+#include <sys/cdefs.h>
#include <stdarg.h>
/*
@@ -231,12 +232,12 @@
jlong (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);
jlong (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);
jlong (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
- jfloat (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...);
- jfloat (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list);
- jfloat (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
- jdouble (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...);
- jdouble (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list);
- jdouble (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
+ jfloat (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;
+ jfloat (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;
+ jfloat (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;
+ jdouble (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;
+ jdouble (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;
+ jdouble (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;
void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
void (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);
void (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
@@ -284,17 +285,17 @@
jlong (*CallNonvirtualLongMethodA)(JNIEnv*, jobject, jclass,
jmethodID, jvalue*);
jfloat (*CallNonvirtualFloatMethod)(JNIEnv*, jobject, jclass,
- jmethodID, ...);
+ jmethodID, ...) __NDK_FPABI__;
jfloat (*CallNonvirtualFloatMethodV)(JNIEnv*, jobject, jclass,
- jmethodID, va_list);
+ jmethodID, va_list) __NDK_FPABI__;
jfloat (*CallNonvirtualFloatMethodA)(JNIEnv*, jobject, jclass,
- jmethodID, jvalue*);
+ jmethodID, jvalue*) __NDK_FPABI__;
jdouble (*CallNonvirtualDoubleMethod)(JNIEnv*, jobject, jclass,
- jmethodID, ...);
+ jmethodID, ...) __NDK_FPABI__;
jdouble (*CallNonvirtualDoubleMethodV)(JNIEnv*, jobject, jclass,
- jmethodID, va_list);
+ jmethodID, va_list) __NDK_FPABI__;
jdouble (*CallNonvirtualDoubleMethodA)(JNIEnv*, jobject, jclass,
- jmethodID, jvalue*);
+ jmethodID, jvalue*) __NDK_FPABI__;
void (*CallNonvirtualVoidMethod)(JNIEnv*, jobject, jclass,
jmethodID, ...);
void (*CallNonvirtualVoidMethodV)(JNIEnv*, jobject, jclass,
@@ -311,8 +312,8 @@
jshort (*GetShortField)(JNIEnv*, jobject, jfieldID);
jint (*GetIntField)(JNIEnv*, jobject, jfieldID);
jlong (*GetLongField)(JNIEnv*, jobject, jfieldID);
- jfloat (*GetFloatField)(JNIEnv*, jobject, jfieldID);
- jdouble (*GetDoubleField)(JNIEnv*, jobject, jfieldID);
+ jfloat (*GetFloatField)(JNIEnv*, jobject, jfieldID) __NDK_FPABI__;
+ jdouble (*GetDoubleField)(JNIEnv*, jobject, jfieldID) __NDK_FPABI__;
void (*SetObjectField)(JNIEnv*, jobject, jfieldID, jobject);
void (*SetBooleanField)(JNIEnv*, jobject, jfieldID, jboolean);
@@ -321,8 +322,8 @@
void (*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);
void (*SetIntField)(JNIEnv*, jobject, jfieldID, jint);
void (*SetLongField)(JNIEnv*, jobject, jfieldID, jlong);
- void (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat);
- void (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble);
+ void (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat) __NDK_FPABI__;
+ void (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble) __NDK_FPABI__;
jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
@@ -349,12 +350,12 @@
jlong (*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...);
jlong (*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list);
jlong (*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
- jfloat (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...);
- jfloat (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list);
- jfloat (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
- jdouble (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...);
- jdouble (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list);
- jdouble (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
+ jfloat (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...) __NDK_FPABI__;
+ jfloat (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list) __NDK_FPABI__;
+ jfloat (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*) __NDK_FPABI__;
+ jdouble (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...) __NDK_FPABI__;
+ jdouble (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list) __NDK_FPABI__;
+ jdouble (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*) __NDK_FPABI__;
void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
void (*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list);
void (*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
@@ -369,8 +370,8 @@
jshort (*GetStaticShortField)(JNIEnv*, jclass, jfieldID);
jint (*GetStaticIntField)(JNIEnv*, jclass, jfieldID);
jlong (*GetStaticLongField)(JNIEnv*, jclass, jfieldID);
- jfloat (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID);
- jdouble (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID);
+ jfloat (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID) __NDK_FPABI__;
+ jdouble (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID) __NDK_FPABI__;
void (*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject);
void (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean);
@@ -379,8 +380,8 @@
void (*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort);
void (*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint);
void (*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong);
- void (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat);
- void (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble);
+ void (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat) __NDK_FPABI__;
+ void (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble) __NDK_FPABI__;
jstring (*NewString)(JNIEnv*, const jchar*, jsize);
jsize (*GetStringLength)(JNIEnv*, jstring);
@@ -605,6 +606,7 @@
{ return functions->GetMethodID(this, clazz, name, sig); }
#define CALL_TYPE_METHOD(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...) \
{ \
_jtype result; \
@@ -616,10 +618,12 @@
return result; \
}
#define CALL_TYPE_METHODV(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype Call##_jname##MethodV(jobject obj, jmethodID methodID, \
va_list args) \
{ return functions->Call##_jname##MethodV(this, obj, methodID, args); }
#define CALL_TYPE_METHODA(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype Call##_jname##MethodA(jobject obj, jmethodID methodID, \
jvalue* args) \
{ return functions->Call##_jname##MethodA(this, obj, methodID, args); }
@@ -652,6 +656,7 @@
{ functions->CallVoidMethodA(this, obj, methodID, args); }
#define CALL_NONVIRT_TYPE_METHOD(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype CallNonvirtual##_jname##Method(jobject obj, jclass clazz, \
jmethodID methodID, ...) \
{ \
@@ -664,11 +669,13 @@
return result; \
}
#define CALL_NONVIRT_TYPE_METHODV(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype CallNonvirtual##_jname##MethodV(jobject obj, jclass clazz, \
jmethodID methodID, va_list args) \
{ return functions->CallNonvirtual##_jname##MethodV(this, obj, clazz, \
methodID, args); }
#define CALL_NONVIRT_TYPE_METHODA(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype CallNonvirtual##_jname##MethodA(jobject obj, jclass clazz, \
jmethodID methodID, jvalue* args) \
{ return functions->CallNonvirtual##_jname##MethodA(this, obj, clazz, \
@@ -721,8 +728,10 @@
{ return functions->GetIntField(this, obj, fieldID); }
jlong GetLongField(jobject obj, jfieldID fieldID)
{ return functions->GetLongField(this, obj, fieldID); }
+ __NDK_FPABI__
jfloat GetFloatField(jobject obj, jfieldID fieldID)
{ return functions->GetFloatField(this, obj, fieldID); }
+ __NDK_FPABI__
jdouble GetDoubleField(jobject obj, jfieldID fieldID)
{ return functions->GetDoubleField(this, obj, fieldID); }
@@ -740,8 +749,10 @@
{ functions->SetIntField(this, obj, fieldID, value); }
void SetLongField(jobject obj, jfieldID fieldID, jlong value)
{ functions->SetLongField(this, obj, fieldID, value); }
+ __NDK_FPABI__
void SetFloatField(jobject obj, jfieldID fieldID, jfloat value)
{ functions->SetFloatField(this, obj, fieldID, value); }
+ __NDK_FPABI__
void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value)
{ functions->SetDoubleField(this, obj, fieldID, value); }
@@ -749,6 +760,7 @@
{ return functions->GetStaticMethodID(this, clazz, name, sig); }
#define CALL_STATIC_TYPE_METHOD(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype CallStatic##_jname##Method(jclass clazz, jmethodID methodID, \
...) \
{ \
@@ -761,11 +773,13 @@
return result; \
}
#define CALL_STATIC_TYPE_METHODV(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype CallStatic##_jname##MethodV(jclass clazz, jmethodID methodID, \
va_list args) \
{ return functions->CallStatic##_jname##MethodV(this, clazz, methodID, \
args); }
#define CALL_STATIC_TYPE_METHODA(_jtype, _jname) \
+ __NDK_FPABI__ \
_jtype CallStatic##_jname##MethodA(jclass clazz, jmethodID methodID, \
jvalue* args) \
{ return functions->CallStatic##_jname##MethodA(this, clazz, methodID, \
@@ -815,8 +829,10 @@
{ return functions->GetStaticIntField(this, clazz, fieldID); }
jlong GetStaticLongField(jclass clazz, jfieldID fieldID)
{ return functions->GetStaticLongField(this, clazz, fieldID); }
+ __NDK_FPABI__
jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID)
{ return functions->GetStaticFloatField(this, clazz, fieldID); }
+ __NDK_FPABI__
jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID)
{ return functions->GetStaticDoubleField(this, clazz, fieldID); }
@@ -834,8 +850,10 @@
{ functions->SetStaticIntField(this, clazz, fieldID, value); }
void SetStaticLongField(jclass clazz, jfieldID fieldID, jlong value)
{ functions->SetStaticLongField(this, clazz, fieldID, value); }
+ __NDK_FPABI__
void SetStaticFloatField(jclass clazz, jfieldID fieldID, jfloat value)
{ functions->SetStaticFloatField(this, clazz, fieldID, value); }
+ __NDK_FPABI__
void SetStaticDoubleField(jclass clazz, jfieldID fieldID, jdouble value)
{ functions->SetStaticDoubleField(this, clazz, fieldID, value); }
diff --git a/ndk/platforms/android-3/include/math.h b/ndk/platforms/android-3/include/math.h
index ef6a9e6..c1d9bd8 100644
--- a/ndk/platforms/android-3/include/math.h
+++ b/ndk/platforms/android-3/include/math.h
@@ -183,219 +183,219 @@
/*
* ANSI/POSIX
*/
-int __fpclassifyd(double) __pure2;
-int __fpclassifyf(float) __pure2;
-int __fpclassifyl(long double) __pure2;
-int __isfinitef(float) __pure2;
-int __isfinite(double) __pure2;
-int __isfinitel(long double) __pure2;
-int __isinff(float) __pure2;
-int __isinf(double) __pure2;
-int __isinfl(long double) __pure2;
-int __isnanl(long double) __pure2;
-int __isnormalf(float) __pure2;
-int __isnormal(double) __pure2;
-int __isnormall(long double) __pure2;
-int __signbit(double) __pure2;
-int __signbitf(float) __pure2;
-int __signbitl(long double) __pure2;
+int __fpclassifyd(double) __NDK_FPABI_MATH__ __pure2;
+int __fpclassifyf(float) __NDK_FPABI_MATH__ __pure2;
+int __fpclassifyl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isfinitef(float) __NDK_FPABI_MATH__ __pure2;
+int __isfinite(double) __NDK_FPABI_MATH__ __pure2;
+int __isfinitel(long double) __NDK_FPABI_MATH__ __pure2;
+int __isinff(float) __NDK_FPABI_MATH__ __pure2;
+int __isinf(double) __NDK_FPABI_MATH__ __pure2;
+int __isinfl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isnanl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isnormalf(float) __NDK_FPABI_MATH__ __pure2;
+int __isnormal(double) __NDK_FPABI_MATH__ __pure2;
+int __isnormall(long double) __NDK_FPABI_MATH__ __pure2;
+int __signbit(double) __NDK_FPABI_MATH__ __pure2;
+int __signbitf(float) __NDK_FPABI_MATH__ __pure2;
+int __signbitl(long double) __NDK_FPABI_MATH__ __pure2;
-double acos(double);
-double asin(double);
-double atan(double);
-double atan2(double, double);
-double cos(double);
-double sin(double);
-double tan(double);
+double acos(double) __NDK_FPABI_MATH__;
+double asin(double) __NDK_FPABI_MATH__;
+double atan(double) __NDK_FPABI_MATH__;
+double atan2(double, double) __NDK_FPABI_MATH__;
+double cos(double) __NDK_FPABI_MATH__;
+double sin(double) __NDK_FPABI_MATH__;
+double tan(double) __NDK_FPABI_MATH__;
-double cosh(double);
-double sinh(double);
-double tanh(double);
+double cosh(double) __NDK_FPABI_MATH__;
+double sinh(double) __NDK_FPABI_MATH__;
+double tanh(double) __NDK_FPABI_MATH__;
-double exp(double);
-double frexp(double, int *); /* fundamentally !__pure2 */
-double ldexp(double, int);
-double log(double);
-double log10(double);
-double modf(double, double *); /* fundamentally !__pure2 */
+double exp(double) __NDK_FPABI_MATH__;
+double frexp(double, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+double ldexp(double, int) __NDK_FPABI_MATH__;
+double log(double) __NDK_FPABI_MATH__;
+double log10(double) __NDK_FPABI_MATH__;
+double modf(double, double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
-double pow(double, double);
-double sqrt(double);
+double pow(double, double) __NDK_FPABI_MATH__;
+double sqrt(double) __NDK_FPABI_MATH__;
-double ceil(double);
-double fabs(double) __pure2;
-double floor(double);
-double fmod(double, double);
+double ceil(double) __NDK_FPABI_MATH__;
+double fabs(double) __NDK_FPABI_MATH__ __pure2;
+double floor(double) __NDK_FPABI_MATH__;
+double fmod(double, double) __NDK_FPABI_MATH__;
/*
* These functions are not in C90.
*/
/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
-double acosh(double);
-double asinh(double);
-double atanh(double);
-double cbrt(double);
-double erf(double);
-double erfc(double);
-double exp2(double);
-double expm1(double);
-double fma(double, double, double);
-double hypot(double, double);
-int ilogb(double) __pure2;
-/* int (isinf)(double) __pure2; */
-int (isnan)(double) __pure2;
-double lgamma(double);
-long long llrint(double);
-long long llround(double);
-double log1p(double);
-double logb(double);
-long lrint(double);
-long lround(double);
-double nextafter(double, double);
-double remainder(double, double);
-double remquo(double, double, int *);
-double rint(double);
+double acosh(double) __NDK_FPABI_MATH__;
+double asinh(double) __NDK_FPABI_MATH__;
+double atanh(double) __NDK_FPABI_MATH__;
+double cbrt(double) __NDK_FPABI_MATH__;
+double erf(double) __NDK_FPABI_MATH__;
+double erfc(double) __NDK_FPABI_MATH__;
+double exp2(double) __NDK_FPABI_MATH__;
+double expm1(double) __NDK_FPABI_MATH__;
+double fma(double, double, double) __NDK_FPABI_MATH__;
+double hypot(double, double) __NDK_FPABI_MATH__;
+int ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int (isinf)(double) __NDK_FPABI_MATH__ __pure2; */
+int (isnan)(double) __NDK_FPABI_MATH__ __pure2;
+double lgamma(double) __NDK_FPABI_MATH__;
+long long llrint(double) __NDK_FPABI_MATH__;
+long long llround(double) __NDK_FPABI_MATH__;
+double log1p(double) __NDK_FPABI_MATH__;
+double logb(double) __NDK_FPABI_MATH__;
+long lrint(double) __NDK_FPABI_MATH__;
+long lround(double) __NDK_FPABI_MATH__;
+double nextafter(double, double) __NDK_FPABI_MATH__;
+double remainder(double, double) __NDK_FPABI_MATH__;
+double remquo(double, double, int *) __NDK_FPABI_MATH__;
+double rint(double) __NDK_FPABI_MATH__;
/* #endif */ /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
/* #if __BSD_VISIBLE || __XSI_VISIBLE */
-double j0(double);
-double j1(double);
-double jn(int, double);
-double scalb(double, double);
-double y0(double);
-double y1(double);
-double yn(int, double);
+double j0(double) __NDK_FPABI_MATH__;
+double j1(double) __NDK_FPABI_MATH__;
+double jn(int, double) __NDK_FPABI_MATH__;
+double scalb(double, double) __NDK_FPABI_MATH__;
+double y0(double) __NDK_FPABI_MATH__;
+double y1(double) __NDK_FPABI_MATH__;
+double yn(int, double) __NDK_FPABI_MATH__;
/* #if __XSI_VISIBLE <= 500 || __BSD_VISIBLE */
-double gamma(double);
+double gamma(double) __NDK_FPABI_MATH__;
/* #endif */
/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 */
-double copysign(double, double) __pure2;
-double fdim(double, double);
-double fmax(double, double) __pure2;
-double fmin(double, double) __pure2;
-double nearbyint(double);
-double round(double);
-double scalbln(double, long);
-double scalbn(double, int);
-double tgamma(double);
-double trunc(double);
+double copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double fdim(double, double) __NDK_FPABI_MATH__;
+double fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double nearbyint(double) __NDK_FPABI_MATH__;
+double round(double) __NDK_FPABI_MATH__;
+double scalbln(double, long) __NDK_FPABI_MATH__;
+double scalbn(double, int) __NDK_FPABI_MATH__;
+double tgamma(double) __NDK_FPABI_MATH__;
+double trunc(double) __NDK_FPABI_MATH__;
/* #endif */
/*
* BSD math library entry points
*/
/* #if __BSD_VISIBLE */
-double drem(double, double);
-int finite(double) __pure2;
-int isnanf(float) __pure2;
+double drem(double, double) __NDK_FPABI_MATH__;
+int finite(double) __NDK_FPABI_MATH__ __pure2;
+int isnanf(float) __NDK_FPABI_MATH__ __pure2;
/*
* Reentrant version of gamma & lgamma; passes signgam back by reference
* as the second argument; user must allocate space for signgam.
*/
-double gamma_r(double, int *);
-double lgamma_r(double, int *);
+double gamma_r(double, int *) __NDK_FPABI_MATH__;
+double lgamma_r(double, int *) __NDK_FPABI_MATH__;
/*
* IEEE Test Vector
*/
-double significand(double);
+double significand(double) __NDK_FPABI_MATH__;
/* #endif */ /* __BSD_VISIBLE */
/* float versions of ANSI/POSIX functions */
/*#if __ISO_C_VISIBLE >= 1999 */
-float acosf(float);
-float asinf(float);
-float atanf(float);
-float atan2f(float, float);
-float cosf(float);
-float sinf(float);
-float tanf(float);
+float acosf(float) __NDK_FPABI_MATH__;
+float asinf(float) __NDK_FPABI_MATH__;
+float atanf(float) __NDK_FPABI_MATH__;
+float atan2f(float, float) __NDK_FPABI_MATH__;
+float cosf(float) __NDK_FPABI_MATH__;
+float sinf(float) __NDK_FPABI_MATH__;
+float tanf(float) __NDK_FPABI_MATH__;
-float coshf(float);
-float sinhf(float);
-float tanhf(float);
+float coshf(float) __NDK_FPABI_MATH__;
+float sinhf(float) __NDK_FPABI_MATH__;
+float tanhf(float) __NDK_FPABI_MATH__;
-float exp2f(float);
-float expf(float);
-float expm1f(float);
-float frexpf(float, int *); /* fundamentally !__pure2 */
-int ilogbf(float) __pure2;
-float ldexpf(float, int);
-float log10f(float);
-float log1pf(float);
-float logf(float);
-float modff(float, float *); /* fundamentally !__pure2 */
+float exp2f(float) __NDK_FPABI_MATH__;
+float expf(float) __NDK_FPABI_MATH__;
+float expm1f(float) __NDK_FPABI_MATH__;
+float frexpf(float, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+int ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float ldexpf(float, int) __NDK_FPABI_MATH__;
+float log10f(float) __NDK_FPABI_MATH__;
+float log1pf(float) __NDK_FPABI_MATH__;
+float logf(float) __NDK_FPABI_MATH__;
+float modff(float, float *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
-float powf(float, float);
-float sqrtf(float);
+float powf(float, float) __NDK_FPABI_MATH__;
+float sqrtf(float) __NDK_FPABI_MATH__;
-float ceilf(float);
-float fabsf(float) __pure2;
-float floorf(float);
-float fmodf(float, float);
-float roundf(float);
+float ceilf(float) __NDK_FPABI_MATH__;
+float fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float floorf(float) __NDK_FPABI_MATH__;
+float fmodf(float, float) __NDK_FPABI_MATH__;
+float roundf(float) __NDK_FPABI_MATH__;
-float erff(float);
-float erfcf(float);
-float hypotf(float, float);
-float lgammaf(float);
+float erff(float) __NDK_FPABI_MATH__;
+float erfcf(float) __NDK_FPABI_MATH__;
+float hypotf(float, float) __NDK_FPABI_MATH__;
+float lgammaf(float) __NDK_FPABI_MATH__;
-float acoshf(float);
-float asinhf(float);
-float atanhf(float);
-float cbrtf(float);
-float logbf(float);
-float copysignf(float, float) __pure2;
-long long llrintf(float);
-long long llroundf(float);
-long lrintf(float);
-long lroundf(float);
-float nearbyintf(float);
-float nextafterf(float, float);
-float remainderf(float, float);
-float remquof(float, float, int *);
-float rintf(float);
-float scalblnf(float, long);
-float scalbnf(float, int);
-float truncf(float);
+float acoshf(float) __NDK_FPABI_MATH__;
+float asinhf(float) __NDK_FPABI_MATH__;
+float atanhf(float) __NDK_FPABI_MATH__;
+float cbrtf(float) __NDK_FPABI_MATH__;
+float logbf(float) __NDK_FPABI_MATH__;
+float copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long llrintf(float) __NDK_FPABI_MATH__;
+long long llroundf(float) __NDK_FPABI_MATH__;
+long lrintf(float) __NDK_FPABI_MATH__;
+long lroundf(float) __NDK_FPABI_MATH__;
+float nearbyintf(float) __NDK_FPABI_MATH__;
+float nextafterf(float, float) __NDK_FPABI_MATH__;
+float remainderf(float, float) __NDK_FPABI_MATH__;
+float remquof(float, float, int *) __NDK_FPABI_MATH__;
+float rintf(float) __NDK_FPABI_MATH__;
+float scalblnf(float, long) __NDK_FPABI_MATH__;
+float scalbnf(float, int) __NDK_FPABI_MATH__;
+float truncf(float) __NDK_FPABI_MATH__;
-float fdimf(float, float);
-float fmaf(float, float, float);
-float fmaxf(float, float) __pure2;
-float fminf(float, float) __pure2;
+float fdimf(float, float) __NDK_FPABI_MATH__;
+float fmaf(float, float, float) __NDK_FPABI_MATH__;
+float fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float fminf(float, float) __NDK_FPABI_MATH__ __pure2;
/* #endif */
/*
* float versions of BSD math library entry points
*/
/* #if __BSD_VISIBLE */
-float dremf(float, float);
-int finitef(float) __pure2;
-float gammaf(float);
-float j0f(float);
-float j1f(float);
-float jnf(int, float);
-float scalbf(float, float);
-float y0f(float);
-float y1f(float);
-float ynf(int, float);
+float dremf(float, float) __NDK_FPABI_MATH__;
+int finitef(float) __NDK_FPABI_MATH__ __pure2;
+float gammaf(float) __NDK_FPABI_MATH__;
+float j0f(float) __NDK_FPABI_MATH__;
+float j1f(float) __NDK_FPABI_MATH__;
+float jnf(int, float) __NDK_FPABI_MATH__;
+float scalbf(float, float) __NDK_FPABI_MATH__;
+float y0f(float) __NDK_FPABI_MATH__;
+float y1f(float) __NDK_FPABI_MATH__;
+float ynf(int, float) __NDK_FPABI_MATH__;
/*
* Float versions of reentrant version of gamma & lgamma; passes
* signgam back by reference as the second argument; user must
* allocate space for signgam.
*/
-float gammaf_r(float, int *);
-float lgammaf_r(float, int *);
+float gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float lgammaf_r(float, int *) __NDK_FPABI_MATH__;
/*
* float version of IEEE Test Vector
*/
-float significandf(float);
+float significandf(float) __NDK_FPABI_MATH__;
/* #endif */ /* __BSD_VISIBLE */
/*
@@ -403,82 +403,82 @@
*/
/* #if __ISO_C_VISIBLE >= 1999 */
#if 0
-long double acoshl(long double);
-long double acosl(long double);
-long double asinhl(long double);
-long double asinl(long double);
-long double atan2l(long double, long double);
-long double atanhl(long double);
-long double atanl(long double);
-long double cbrtl(long double);
+long double acoshl(long double) __NDK_FPABI_MATH__;
+long double acosl(long double) __NDK_FPABI_MATH__;
+long double asinhl(long double) __NDK_FPABI_MATH__;
+long double asinl(long double) __NDK_FPABI_MATH__;
+long double atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double atanhl(long double) __NDK_FPABI_MATH__;
+long double atanl(long double) __NDK_FPABI_MATH__;
+long double cbrtl(long double) __NDK_FPABI_MATH__;
#endif
-long double ceill(long double);
-long double copysignl(long double, long double) __pure2;
+long double ceill(long double) __NDK_FPABI_MATH__;
+long double copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
#if 0
-long double coshl(long double);
-long double cosl(long double);
-long double erfcl(long double);
-long double erfl(long double);
-long double exp2l(long double);
-long double expl(long double);
-long double expm1l(long double);
+long double coshl(long double) __NDK_FPABI_MATH__;
+long double cosl(long double) __NDK_FPABI_MATH__;
+long double erfcl(long double) __NDK_FPABI_MATH__;
+long double erfl(long double) __NDK_FPABI_MATH__;
+long double exp2l(long double) __NDK_FPABI_MATH__;
+long double expl(long double) __NDK_FPABI_MATH__;
+long double expm1l(long double) __NDK_FPABI_MATH__;
#endif
-long double fabsl(long double) __pure2;
-long double fdiml(long double, long double);
-long double floorl(long double);
-long double fmal(long double, long double, long double);
-long double fmaxl(long double, long double) __pure2;
-long double fminl(long double, long double) __pure2;
+long double fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double floorl(long double) __NDK_FPABI_MATH__;
+long double fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
#if 0
-long double fmodl(long double, long double);
+long double fmodl(long double, long double) __NDK_FPABI_MATH__;
#endif
-long double frexpl(long double value, int *); /* fundamentally !__pure2 */
+long double frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
#if 0
-long double hypotl(long double, long double);
+long double hypotl(long double, long double) __NDK_FPABI_MATH__;
#endif
-int ilogbl(long double) __pure2;
-long double ldexpl(long double, int);
+int ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double ldexpl(long double, int) __NDK_FPABI_MATH__;
#if 0
-long double lgammal(long double);
-long long llrintl(long double);
+long double lgammal(long double) __NDK_FPABI_MATH__;
+long long llrintl(long double) __NDK_FPABI_MATH__;
#endif
-long long llroundl(long double);
+long long llroundl(long double) __NDK_FPABI_MATH__;
#if 0
-long double log10l(long double);
-long double log1pl(long double);
-long double log2l(long double);
-long double logbl(long double);
-long double logl(long double);
-long lrintl(long double);
+long double log10l(long double) __NDK_FPABI_MATH__;
+long double log1pl(long double) __NDK_FPABI_MATH__;
+long double log2l(long double) __NDK_FPABI_MATH__;
+long double logbl(long double) __NDK_FPABI_MATH__;
+long double logl(long double) __NDK_FPABI_MATH__;
+long lrintl(long double) __NDK_FPABI_MATH__;
#endif
-long lroundl(long double);
+long lroundl(long double) __NDK_FPABI_MATH__;
#if 0
-long double modfl(long double, long double *); /* fundamentally !__pure2 */
-long double nanl(const char *) __pure2;
-long double nearbyintl(long double);
+long double modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+long double nearbyintl(long double) __NDK_FPABI_MATH__;
#endif
-long double nextafterl(long double, long double);
-double nexttoward(double, long double);
-float nexttowardf(float, long double);
-long double nexttowardl(long double, long double);
+long double nextafterl(long double, long double) __NDK_FPABI_MATH__;
+double nexttoward(double, long double) __NDK_FPABI_MATH__;
+float nexttowardf(float, long double) __NDK_FPABI_MATH__;
+long double nexttowardl(long double, long double) __NDK_FPABI_MATH__;
#if 0
-long double powl(long double, long double);
-long double remainderl(long double, long double);
-long double remquol(long double, long double, int *);
-long double rintl(long double);
+long double powl(long double, long double) __NDK_FPABI_MATH__;
+long double remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double rintl(long double) __NDK_FPABI_MATH__;
#endif
-long double roundl(long double);
-long double scalblnl(long double, long);
-long double scalbnl(long double, int);
+long double roundl(long double) __NDK_FPABI_MATH__;
+long double scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double scalbnl(long double, int) __NDK_FPABI_MATH__;
#if 0
-long double sinhl(long double);
-long double sinl(long double);
-long double sqrtl(long double);
-long double tanhl(long double);
-long double tanl(long double);
-long double tgammal(long double);
+long double sinhl(long double) __NDK_FPABI_MATH__;
+long double sinl(long double) __NDK_FPABI_MATH__;
+long double sqrtl(long double) __NDK_FPABI_MATH__;
+long double tanhl(long double) __NDK_FPABI_MATH__;
+long double tanl(long double) __NDK_FPABI_MATH__;
+long double tgammal(long double) __NDK_FPABI_MATH__;
#endif
-long double truncl(long double);
+long double truncl(long double) __NDK_FPABI_MATH__;
/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
__END_DECLS
diff --git a/ndk/platforms/android-3/include/poll.h b/ndk/platforms/android-3/include/poll.h
index 560be89..91068e4 100644
--- a/ndk/platforms/android-3/include/poll.h
+++ b/ndk/platforms/android-3/include/poll.h
@@ -35,8 +35,7 @@
typedef unsigned int nfds_t;
-/* POSIX specifies "int" for the timeout, Linux seems to use long... */
-extern int poll(struct pollfd *, nfds_t, long);
+extern int poll(struct pollfd *, nfds_t, int);
__END_DECLS
diff --git a/ndk/platforms/android-3/include/pthread.h b/ndk/platforms/android-3/include/pthread.h
index ae55782..63ddb76 100644
--- a/ndk/platforms/android-3/include/pthread.h
+++ b/ndk/platforms/android-3/include/pthread.h
@@ -138,7 +138,9 @@
int pthread_create(pthread_t *thread, pthread_attr_t const * attr,
void *(*start_routine)(void *), void * arg);
-void pthread_exit(void * retval);
+
+__noreturn void pthread_exit(void * retval);
+
int pthread_join(pthread_t thid, void ** ret_val);
int pthread_detach(pthread_t thid);
diff --git a/ndk/platforms/android-3/include/stdlib.h b/ndk/platforms/android-3/include/stdlib.h
index 424adb4..bb5b3b8 100644
--- a/ndk/platforms/android-3/include/stdlib.h
+++ b/ndk/platforms/android-3/include/stdlib.h
@@ -56,6 +56,7 @@
extern int setenv(const char *, const char *, int);
extern int unsetenv(const char *);
+extern char *mkdtemp(char *);
extern char *mktemp (char *);
extern int mkstemp (char *);
@@ -63,8 +64,9 @@
extern long long strtoll(const char *, char **, int);
extern unsigned long strtoul(const char *, char **, int);
extern unsigned long long strtoull(const char *, char **, int);
-extern double strtod(const char *nptr, char **endptr);
+extern double strtod(const char *nptr, char **endptr) __NDK_FPABI__;
+__NDK_FPABI__
static __inline__ float strtof(const char *nptr, char **endptr)
{
return (float)strtod(nptr, endptr);
@@ -74,6 +76,7 @@
extern long atol(const char *);
extern long long atoll(const char *);
+ __NDK_FPABI__
static __inline__ double atof(const char *nptr)
{
return (strtod(nptr, NULL));
@@ -105,8 +108,8 @@
extern long nrand48(unsigned short *);
extern long lrand48(void);
extern unsigned short *seed48(unsigned short*);
-extern double erand48(unsigned short xsubi[3]);
-extern double drand48(void);
+extern double erand48(unsigned short xsubi[3]) __NDK_FPABI__;
+extern double drand48(void) __NDK_FPABI__;
extern void srand48(long);
extern unsigned int arc4random(void);
extern void arc4random_stir(void);
diff --git a/ndk/platforms/android-3/include/sys/cdefs.h b/ndk/platforms/android-3/include/sys/cdefs.h
index 88ce720..e840064 100644
--- a/ndk/platforms/android-3/include/sys/cdefs.h
+++ b/ndk/platforms/android-3/include/sys/cdefs.h
@@ -530,4 +530,31 @@
#define __BIONIC__ 1
#include <android/api-level.h>
+/* __NDK_FPABI__ or __NDK_FPABI_MATH__ are applied to APIs taking or returning float or
+ [long] double, to ensure even at the presence of -mhard-float (which implies
+ -mfloat-abi=hard), calling to 32-bit Android native APIs still follow -mfloat-abi=softfp.
+
+ __NDK_FPABI_MATH__ is applied to APIs in math.h. It normally equals to __NDK_FPABI__,
+ but allows use of customized libm.a compiled with -mhard-float by -D_NDK_MATH_NO_SOFTFP=1
+
+ NOTE: Disable for clang for now unless _NDK_MATH_NO_SOFTFP=1, because clang before 3.4 doesn't
+ allow change of calling convension for builtin and produces error message reads:
+
+ a.i:564:6: error: function declared 'aapcs' here was previously declared without calling convention
+ int sin(double d) __attribute__((pcs("aapcs")));
+ ^
+ a.i:564:6: note: previous declaration is here
+ */
+#if defined(__ANDROID__) && !__LP64__ && defined( __arm__)
+#define __NDK_FPABI__ __attribute__((pcs("aapcs")))
+#else
+#define __NDK_FPABI__
+#endif
+
+#if (!defined(_NDK_MATH_NO_SOFTFP) || _NDK_MATH_NO_SOFTFP != 1) && !defined(__clang__)
+#define __NDK_FPABI_MATH__ __NDK_FPABI__
+#else
+#define __NDK_FPABI_MATH__ /* nothing */
+#endif
+
#endif /* !_SYS_CDEFS_H_ */
diff --git a/ndk/platforms/android-3/include/sys/cdefs_elf.h b/ndk/platforms/android-3/include/sys/cdefs_elf.h
index 1e57470..5d2e0f3 100644
--- a/ndk/platforms/android-3/include/sys/cdefs_elf.h
+++ b/ndk/platforms/android-3/include/sys/cdefs_elf.h
@@ -32,7 +32,7 @@
#ifdef __LEADING_UNDERSCORE
#define _C_LABEL(x) __CONCAT(_,x)
-#define _C_LABEL_STRING(x) "_"x
+#define _C_LABEL_STRING(x) "_" x
#else
#define _C_LABEL(x) x
#define _C_LABEL_STRING(x) x
diff --git a/ndk/platforms/android-3/include/sys/vfs.h b/ndk/platforms/android-3/include/sys/vfs.h
index 4adaf5f..4ec0e0d 100644
--- a/ndk/platforms/android-3/include/sys/vfs.h
+++ b/ndk/platforms/android-3/include/sys/vfs.h
@@ -34,20 +34,42 @@
__BEGIN_DECLS
-/* note: this corresponds to the kernel's statfs64 type */
+/* The kernel's __kernel_fsid_t has a 'val' member but glibc uses '__val'. */
+typedef struct { int __val[2]; } __fsid_t;
+
+/* Our struct statfs corresponds to the kernel's statfs64 type. */
+#ifdef __mips__
struct statfs {
- uint32_t f_type;
- uint32_t f_bsize;
- uint64_t f_blocks;
- uint64_t f_bfree;
- uint64_t f_bavail;
- uint64_t f_files;
- uint64_t f_ffree;
- __kernel_fsid_t f_fsid;
- uint32_t f_namelen;
- uint32_t f_frsize;
- uint32_t f_spare[5];
+ uint32_t f_type;
+ uint32_t f_bsize;
+ uint32_t f_frsize;
+ uint32_t __pad;
+ uint64_t f_blocks;
+ uint64_t f_bfree;
+ uint64_t f_files;
+ uint64_t f_ffree;
+ uint64_t f_bavail;
+ __fsid_t f_fsid;
+ uint32_t f_namelen;
+ uint32_t f_flags;
+ uint32_t f_spare[5];
};
+#else
+struct statfs {
+ uint32_t f_type;
+ uint32_t f_bsize;
+ uint64_t f_blocks;
+ uint64_t f_bfree;
+ uint64_t f_bavail;
+ uint64_t f_files;
+ uint64_t f_ffree;
+ __fsid_t f_fsid;
+ uint32_t f_namelen;
+ uint32_t f_frsize;
+ uint32_t f_flags;
+ uint32_t f_spare[4];
+};
+#endif
#define ADFS_SUPER_MAGIC 0xadf5
#define AFFS_SUPER_MAGIC 0xADFF
diff --git a/ndk/platforms/android-3/include/time.h b/ndk/platforms/android-3/include/time.h
index caf6aa7..40fd5c9 100644
--- a/ndk/platforms/android-3/include/time.h
+++ b/ndk/platforms/android-3/include/time.h
@@ -67,7 +67,7 @@
extern char* asctime_r(const struct tm* a, char* buf);
/* Return the difference between TIME1 and TIME0. */
-extern double difftime (time_t __time1, time_t __time0);
+extern double difftime (time_t __time1, time_t __time0) __NDK_FPABI__;
extern time_t mktime (struct tm *a);
extern struct tm* localtime(const time_t *t);
diff --git a/ndk/platforms/android-3/include/wchar.h b/ndk/platforms/android-3/include/wchar.h
index 575da4d..0e61859 100644
--- a/ndk/platforms/android-3/include/wchar.h
+++ b/ndk/platforms/android-3/include/wchar.h
@@ -134,7 +134,7 @@
extern size_t wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
extern size_t wcsspn(const wchar_t *, const wchar_t *);
extern wchar_t *wcsstr(const wchar_t *, const wchar_t *);
-extern double wcstod(const wchar_t *, wchar_t **);
+extern double wcstod(const wchar_t *, wchar_t **) __NDK_FPABI__;
extern wchar_t *wcstok(wchar_t *, const wchar_t *, wchar_t **);
extern long int wcstol(const wchar_t *, wchar_t **, int);
extern unsigned long int wcstoul(const wchar_t *, wchar_t **, int);
diff --git a/ndk/platforms/android-4/include/KHR/khrplatform.h b/ndk/platforms/android-4/include/KHR/khrplatform.h
index 75bc551..2bca446 100644
--- a/ndk/platforms/android-4/include/KHR/khrplatform.h
+++ b/ndk/platforms/android-4/include/KHR/khrplatform.h
@@ -92,7 +92,8 @@
#elif defined (__SYMBIAN32__)
# define KHRONOS_APICALL IMPORT_C
#elif defined(__ANDROID__)
-# define KHRONOS_APICALL __attribute__((visibility("default")))
+# include <sys/cdefs.h>
+# define KHRONOS_APICALL __attribute__((visibility("default"))) __NDK_FPABI__
#else
# define KHRONOS_APICALL
#endif
diff --git a/ndk/platforms/android-5/include/pthread.h b/ndk/platforms/android-5/include/pthread.h
index ba40fa1..b3e0f9f 100644
--- a/ndk/platforms/android-5/include/pthread.h
+++ b/ndk/platforms/android-5/include/pthread.h
@@ -138,7 +138,9 @@
int pthread_create(pthread_t *thread, pthread_attr_t const * attr,
void *(*start_routine)(void *), void * arg);
-void pthread_exit(void * retval);
+
+__noreturn void pthread_exit(void * retval);
+
int pthread_join(pthread_t thid, void ** ret_val);
int pthread_detach(pthread_t thid);
diff --git a/ndk/platforms/android-8/include/pthread.h b/ndk/platforms/android-8/include/pthread.h
index 7741fcf..7de3634 100644
--- a/ndk/platforms/android-8/include/pthread.h
+++ b/ndk/platforms/android-8/include/pthread.h
@@ -138,7 +138,9 @@
int pthread_create(pthread_t *thread, pthread_attr_t const * attr,
void *(*start_routine)(void *), void * arg);
-void pthread_exit(void * retval);
+
+__noreturn void pthread_exit(void * retval);
+
int pthread_join(pthread_t thid, void ** ret_val);
int pthread_detach(pthread_t thid);
diff --git a/ndk/platforms/android-8/include/stdlib.h b/ndk/platforms/android-8/include/stdlib.h
index ddaf32c..e89db56 100644
--- a/ndk/platforms/android-8/include/stdlib.h
+++ b/ndk/platforms/android-8/include/stdlib.h
@@ -57,6 +57,7 @@
extern int unsetenv(const char *);
extern int clearenv(void);
+extern char *mkdtemp(char *);
extern char *mktemp (char *);
extern int mkstemp (char *);
@@ -64,8 +65,9 @@
extern long long strtoll(const char *, char **, int);
extern unsigned long strtoul(const char *, char **, int);
extern unsigned long long strtoull(const char *, char **, int);
-extern double strtod(const char *nptr, char **endptr);
+extern double strtod(const char *nptr, char **endptr) __NDK_FPABI__;
+__NDK_FPABI__
static __inline__ float strtof(const char *nptr, char **endptr)
{
return (float)strtod(nptr, endptr);
@@ -75,6 +77,7 @@
extern long atol(const char *);
extern long long atoll(const char *);
+ __NDK_FPABI__
static __inline__ double atof(const char *nptr)
{
return (strtod(nptr, NULL));
@@ -106,8 +109,8 @@
extern long nrand48(unsigned short *);
extern long lrand48(void);
extern unsigned short *seed48(unsigned short*);
-extern double erand48(unsigned short xsubi[3]);
-extern double drand48(void);
+extern double erand48(unsigned short xsubi[3]) __NDK_FPABI__;
+extern double drand48(void) __NDK_FPABI__;
extern void srand48(long);
extern unsigned int arc4random(void);
extern void arc4random_stir(void);
diff --git a/ndk/platforms/android-8/include/time.h b/ndk/platforms/android-8/include/time.h
index 6163c6d..e7ead0f 100644
--- a/ndk/platforms/android-8/include/time.h
+++ b/ndk/platforms/android-8/include/time.h
@@ -67,7 +67,7 @@
extern char* asctime_r(const struct tm* a, char* buf);
/* Return the difference between TIME1 and TIME0. */
-extern double difftime (time_t __time1, time_t __time0);
+extern double difftime (time_t __time1, time_t __time0) __NDK_FPABI__;
extern time_t mktime (struct tm *a);
extern struct tm* localtime(const time_t *t);
diff --git a/ndk/platforms/android-8/include/wchar.h b/ndk/platforms/android-8/include/wchar.h
index 453b6d5..b9dfa66 100644
--- a/ndk/platforms/android-8/include/wchar.h
+++ b/ndk/platforms/android-8/include/wchar.h
@@ -140,7 +140,7 @@
extern size_t wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
extern size_t wcsspn(const wchar_t *, const wchar_t *);
extern wchar_t *wcsstr(const wchar_t *, const wchar_t *);
-extern double wcstod(const wchar_t *, wchar_t **);
+extern double wcstod(const wchar_t *, wchar_t **) __NDK_FPABI__;
extern wchar_t *wcstok(wchar_t *, const wchar_t *, wchar_t **);
extern long int wcstol(const wchar_t *, wchar_t **, int);
extern size_t wcstombs(char *, const wchar_t *, size_t);
diff --git a/ndk/platforms/android-8/samples/bitmap-plasma/src/com/example/plasma/Plasma.java b/ndk/platforms/android-8/samples/bitmap-plasma/src/com/example/plasma/Plasma.java
index f0938d1..281d3ef 100644
--- a/ndk/platforms/android-8/samples/bitmap-plasma/src/com/example/plasma/Plasma.java
+++ b/ndk/platforms/android-8/samples/bitmap-plasma/src/com/example/plasma/Plasma.java
@@ -21,6 +21,8 @@
import android.view.View;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.view.Display;
+import android.view.WindowManager;
public class Plasma extends Activity
{
@@ -29,7 +31,8 @@
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
- setContentView(new PlasmaView(this));
+ Display display = getWindowManager().getDefaultDisplay();
+ setContentView(new PlasmaView(this, display.getWidth(), display.getHeight()));
}
/* load our native library */
@@ -45,13 +48,9 @@
/* implementend by libplasma.so */
private static native void renderPlasma(Bitmap bitmap, long time_ms);
- public PlasmaView(Context context) {
+ public PlasmaView(Context context, int width, int height) {
super(context);
-
- final int W = 200;
- final int H = 200;
-
- mBitmap = Bitmap.createBitmap(W, H, Bitmap.Config.RGB_565);
+ mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
mStartTime = System.currentTimeMillis();
}
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/bitsperlong.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/bitsperlong.h
new file mode 100644
index 0000000..7f0a0fc
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/bitsperlong.h
@@ -0,0 +1,25 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__ASM_GENERIC_BITS_PER_LONG
+#define _UAPI__ASM_GENERIC_BITS_PER_LONG
+#ifndef __BITS_PER_LONG
+#define __BITS_PER_LONG 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/int-ll64.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/int-ll64.h
new file mode 100644
index 0000000..7622c49
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/int-ll64.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_GENERIC_INT_LL64_H
+#define _UAPI_ASM_GENERIC_INT_LL64_H
+#include <asm/bitsperlong.h>
+#ifndef __ASSEMBLY__
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+#ifdef __GNUC__
+__extension__ typedef __signed__ long long __s64;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+__extension__ typedef unsigned long long __u64;
+#else
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#endif
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/posix_types.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/posix_types.h
new file mode 100644
index 0000000..1519aff
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/posix_types.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_GENERIC_POSIX_TYPES_H
+#define __ASM_GENERIC_POSIX_TYPES_H
+#include <asm/bitsperlong.h>
+#ifndef __kernel_long_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef long __kernel_long_t;
+typedef unsigned long __kernel_ulong_t;
+#endif
+#ifndef __kernel_ino_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __kernel_ulong_t __kernel_ino_t;
+#endif
+#ifndef __kernel_mode_t
+typedef unsigned int __kernel_mode_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __kernel_pid_t
+typedef int __kernel_pid_t;
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef __kernel_ipc_pid_t
+typedef int __kernel_ipc_pid_t;
+#endif
+#ifndef __kernel_uid_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef unsigned int __kernel_uid_t;
+typedef unsigned int __kernel_gid_t;
+#endif
+#ifndef __kernel_suseconds_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __kernel_long_t __kernel_suseconds_t;
+#endif
+#ifndef __kernel_daddr_t
+typedef int __kernel_daddr_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __kernel_uid32_t
+typedef unsigned int __kernel_uid32_t;
+typedef unsigned int __kernel_gid32_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __kernel_old_uid_t
+typedef __kernel_uid_t __kernel_old_uid_t;
+typedef __kernel_gid_t __kernel_old_gid_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __kernel_old_dev_t
+typedef unsigned int __kernel_old_dev_t;
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef __kernel_size_t
+#if __BITS_PER_LONG != 64
+typedef unsigned int __kernel_size_t;
+typedef int __kernel_ssize_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef int __kernel_ptrdiff_t;
+#else
+typedef __kernel_ulong_t __kernel_size_t;
+typedef __kernel_long_t __kernel_ssize_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __kernel_long_t __kernel_ptrdiff_t;
+#endif
+#endif
+#ifndef __kernel_fsid_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct {
+ int val[2];
+} __kernel_fsid_t;
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __kernel_long_t __kernel_off_t;
+typedef long long __kernel_loff_t;
+typedef __kernel_long_t __kernel_time_t;
+typedef __kernel_long_t __kernel_clock_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef int __kernel_timer_t;
+typedef int __kernel_clockid_t;
+typedef char * __kernel_caddr_t;
+typedef unsigned short __kernel_uid16_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef unsigned short __kernel_gid16_t;
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal-defs.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal-defs.h
new file mode 100644
index 0000000..f47cbe7
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal-defs.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_GENERIC_SIGNAL_DEFS_H
+#define __ASM_GENERIC_SIGNAL_DEFS_H
+#include <linux/compiler.h>
+#ifndef SIG_BLOCK
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIG_BLOCK 0
+#endif
+#ifndef SIG_UNBLOCK
+#define SIG_UNBLOCK 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef SIG_SETMASK
+#define SIG_SETMASK 2
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef __ASSEMBLY__
+typedef void __signalfn_t(int);
+typedef __signalfn_t __user *__sighandler_t;
+typedef void __restorefn_t(void);
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __restorefn_t __user *__sigrestore_t;
+#define SIG_DFL ((__force __sighandler_t)0)
+#define SIG_IGN ((__force __sighandler_t)1)
+#define SIG_ERR ((__force __sighandler_t)-1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal.h
new file mode 100644
index 0000000..c4c7e00
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal.h
@@ -0,0 +1,116 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__ASM_GENERIC_SIGNAL_H
+#define _UAPI__ASM_GENERIC_SIGNAL_H
+#include <linux/types.h>
+#define _NSIG 64
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define _NSIG_BPW __BITS_PER_LONG
+#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
+#define SIGHUP 1
+#define SIGINT 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGIOT 6
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGPOLL SIGIO
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED 31
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGRTMIN 32
+#ifndef SIGRTMAX
+#define SIGRTMAX _NSIG
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SA_NOCLDSTOP 0x00000001
+#define SA_NOCLDWAIT 0x00000002
+#define SA_SIGINFO 0x00000004
+#define SA_ONSTACK 0x08000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_NOMASK SA_NODEFER
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SA_ONESHOT SA_RESETHAND
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#ifndef __ASSEMBLY__
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct {
+ unsigned long sig[_NSIG_WORDS];
+} sigset_t;
+typedef unsigned long old_sigset_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <asm-generic/signal-defs.h>
+#ifdef SA_RESTORER
+#define __ARCH_HAS_SA_RESTORER
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct sigaction {
+ __sighandler_t sa_handler;
+ unsigned long sa_flags;
+#ifdef SA_RESTORER
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __sigrestore_t sa_restorer;
+#endif
+ sigset_t sa_mask;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct sigaltstack {
+ void __user *ss_sp;
+ int ss_flags;
+ size_t ss_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} stack_t;
+#endif
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/types.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/types.h
new file mode 100644
index 0000000..c0d4bea
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/types.h
@@ -0,0 +1,23 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _ASM_GENERIC_TYPES_H
+#define _ASM_GENERIC_TYPES_H
+#include <asm-generic/int-ll64.h>
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/bitsperlong.h b/ndk/platforms/android-9/arch-aarch64/include/asm/bitsperlong.h
new file mode 100644
index 0000000..e53ff65
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/bitsperlong.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_BITSPERLONG_H
+#define __ASM_BITSPERLONG_H
+#define __BITS_PER_LONG 64
+#include <asm-generic/bitsperlong.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/errno.h b/ndk/platforms/android-9/arch-aarch64/include/asm/errno.h
new file mode 100644
index 0000000..392cd94
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/errno.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/errno.h>
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/fcntl.h b/ndk/platforms/android-9/arch-aarch64/include/asm/fcntl.h
new file mode 100644
index 0000000..c62f260
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/fcntl.h
@@ -0,0 +1,28 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_FCNTL_H
+#define __ASM_FCNTL_H
+#define O_DIRECTORY 040000
+#define O_NOFOLLOW 0100000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define O_DIRECT 0200000
+#define O_LARGEFILE 0400000
+#include <asm-generic/fcntl.h>
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/page.h b/ndk/platforms/android-9/arch-aarch64/include/asm/page.h
new file mode 100644
index 0000000..f980343
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/page.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _ASMARM_PAGE_H
+#define _ASMARM_PAGE_H
+
+#define PAGE_SHIFT 12
+#define PAGE_SIZE (1UL << PAGE_SHIFT)
+#define PAGE_MASK (~(PAGE_SIZE-1))
+
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/posix_types.h b/ndk/platforms/android-9/arch-aarch64/include/asm/posix_types.h
new file mode 100644
index 0000000..1b89253
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/posix_types.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/posix_types.h>
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/sigcontext.h b/ndk/platforms/android-9/arch-aarch64/include/asm/sigcontext.h
new file mode 100644
index 0000000..c59f9c0
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/sigcontext.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__ASM_SIGCONTEXT_H
+#define _UAPI__ASM_SIGCONTEXT_H
+#include <linux/types.h>
+struct sigcontext {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 fault_address;
+ __u64 regs[31];
+ __u64 sp;
+ __u64 pc;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 pstate;
+ __u8 __reserved[4096] __attribute__((__aligned__(16)));
+};
+struct _aarch64_ctx {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 magic;
+ __u32 size;
+};
+#define FPSIMD_MAGIC 0x46508001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct fpsimd_context {
+ struct _aarch64_ctx head;
+ __u32 fpsr;
+ __u32 fpcr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __uint128_t vregs[32];
+};
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/siginfo.h b/ndk/platforms/android-9/arch-aarch64/include/asm/siginfo.h
new file mode 100644
index 0000000..82fe0a2
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/siginfo.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_SIGINFO_H
+#define __ASM_SIGINFO_H
+#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
+#include <asm-generic/siginfo.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/signal.h b/ndk/platforms/android-9/arch-aarch64/include/asm/signal.h
new file mode 100644
index 0000000..39f8c48
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/signal.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_SIGNAL_H
+#define __ASM_SIGNAL_H
+#define SA_RESTORER 0x04000000
+#include <asm-generic/signal.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/types.h b/ndk/platforms/android-9/arch-aarch64/include/asm/types.h
new file mode 100644
index 0000000..8250f43
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/types.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/types.h>
diff --git a/ndk/platforms/android-9/arch-aarch64/include/machine/_types.h b/ndk/platforms/android-9/arch-aarch64/include/machine/_types.h
new file mode 100644
index 0000000..dbab9d5
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/_types.h
@@ -0,0 +1,139 @@
+/* $OpenBSD: _types.h,v 1.13 2013/07/05 19:46:27 guenther Exp $ */
+
+/*
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. 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.
+ * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ *
+ * @(#)types.h 8.3 (Berkeley) 1/5/94
+ * @(#)ansi.h 8.2 (Berkeley) 1/4/94
+ */
+
+#ifndef _MACHINE__TYPES_H_
+#define _MACHINE__TYPES_H_
+
+/*
+ * _ALIGN(p) rounds p (pointer or byte index) up to a correctly-aligned
+ * value for all data types (int, long, ...). The result is an
+ * unsigned long and must be cast to any desired pointer type.
+ *
+ * _ALIGNED_POINTER is a boolean macro that checks whether an address
+ * is valid to fetch data elements of type t from on this architecture.
+ * This does not reflect the optimal alignment, just the possibility
+ * (within reasonable limits).
+ */
+#define _ALIGNBYTES (sizeof(long) - 1)
+#define _ALIGN(p) (((unsigned long)(p) + _ALIGNBYTES) &~_ALIGNBYTES)
+#define _ALIGNED_POINTER(p,t) 1
+
+#if defined(_KERNEL)
+typedef struct label_t {
+ long val[8];
+} label_t;
+#endif
+
+/* 7.18.1.1 Exact-width integer types */
+typedef __signed char __int8_t;
+typedef unsigned char __uint8_t;
+typedef short __int16_t;
+typedef unsigned short __uint16_t;
+typedef int __int32_t;
+typedef unsigned int __uint32_t;
+/* LONGLONG */
+typedef long long __int64_t;
+/* LONGLONG */
+typedef unsigned long long __uint64_t;
+
+/* 7.18.1.2 Minimum-width integer types */
+typedef __int8_t __int_least8_t;
+typedef __uint8_t __uint_least8_t;
+typedef __int16_t __int_least16_t;
+typedef __uint16_t __uint_least16_t;
+typedef __int32_t __int_least32_t;
+typedef __uint32_t __uint_least32_t;
+typedef __int64_t __int_least64_t;
+typedef __uint64_t __uint_least64_t;
+
+/* 7.18.1.3 Fastest minimum-width integer types */
+typedef __int32_t __int_fast8_t;
+typedef __uint32_t __uint_fast8_t;
+typedef __int32_t __int_fast16_t;
+typedef __uint32_t __uint_fast16_t;
+typedef __int32_t __int_fast32_t;
+typedef __uint32_t __uint_fast32_t;
+typedef __int64_t __int_fast64_t;
+typedef __uint64_t __uint_fast64_t;
+#define __INT_FAST8_MIN INT32_MIN
+#define __INT_FAST16_MIN INT32_MIN
+#define __INT_FAST32_MIN INT32_MIN
+#define __INT_FAST64_MIN INT64_MIN
+#define __INT_FAST8_MAX INT32_MAX
+#define __INT_FAST16_MAX INT32_MAX
+#define __INT_FAST32_MAX INT32_MAX
+#define __INT_FAST64_MAX INT64_MAX
+#define __UINT_FAST8_MAX UINT32_MAX
+#define __UINT_FAST16_MAX UINT32_MAX
+#define __UINT_FAST32_MAX UINT32_MAX
+#define __UINT_FAST64_MAX UINT64_MAX
+
+/* 7.18.1.4 Integer types capable of holding object pointers */
+typedef long __intptr_t;
+typedef unsigned long __uintptr_t;
+
+/* 7.18.1.5 Greatest-width integer types */
+typedef __int64_t __intmax_t;
+typedef __uint64_t __uintmax_t;
+
+/* Register size */
+typedef long __register_t;
+
+/* VM system types */
+typedef unsigned long __vaddr_t;
+typedef unsigned long __paddr_t;
+typedef unsigned long __vsize_t;
+typedef unsigned long __psize_t;
+
+/* Standard system types */
+typedef double __double_t;
+typedef float __float_t;
+typedef long __ptrdiff_t;
+typedef long __ssize_t;
+#if defined(__GNUC__) && __GNUC__ >= 3
+typedef __builtin_va_list __va_list;
+#else
+typedef char * __va_list;
+#endif
+
+/* Wide character support types */
+#ifndef __cplusplus
+typedef int __wchar_t;
+#endif
+typedef int __wint_t;
+typedef int __rune_t;
+typedef void * __wctrans_t;
+typedef void * __wctype_t;
+
+#endif /* _MACHINE__TYPES_H_ */
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S b/ndk/platforms/android-9/arch-aarch64/include/machine/endian.h
similarity index 79%
rename from ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S
rename to ndk/platforms/android-9/arch-aarch64/include/machine/endian.h
index 77a5d7f..3a62e9c 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/endian.h
@@ -1,5 +1,7 @@
+/* $OpenBSD: endian.h,v 1.6 2011/11/08 17:06:51 deraadt Exp $ */
+
/*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,13 +28,12 @@
* SUCH DAMAGE.
*/
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
- .data
- .align 4
- .hidden __dso_handle
- .globl __dso_handle
-__dso_handle:
- .long __dso_handle
+#ifndef __AARCH64_ENDIAN_H_
+#define __AARCH64_ENDIAN_H_
+
+/* FIXME - work in progress */
+#define _BYTE_ORDER _LITTLE_ENDIAN
+#define __STRICT_ALIGNMENT
+#include <sys/endian.h>
+
+#endif /* __AARCH64_ENDIAN_H_ */
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-9/arch-aarch64/include/machine/exec.h
similarity index 75%
copy from ndk/platforms/android-9/arch-x86/src/__dso_handle.S
copy to ndk/platforms/android-9/arch-aarch64/include/machine/exec.h
index 3e80128..a8e1641 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/exec.h
@@ -1,5 +1,10 @@
+/* $OpenBSD: exec.h,v 1.4 2012/09/11 15:44:17 deraadt Exp $ */
/*
- * Copyright (C) 2010 The Android Open Source Project
+ * Written by Artur Grabowski <art@openbsd.org> Public Domain
+ */
+
+/*
+ * Copyright (C) 2013 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,17 +31,18 @@
* SUCH DAMAGE.
*/
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
- .section .bss
- .align 4
+#ifndef _MACHINE_EXEC_H_
+#define _MACHINE_EXEC_H_
-#ifndef CRT_LEGACY_WORKAROUND
- .hidden __dso_handle
+#define __LDPGSZ 4096
+
+#define ARCH_ELFSIZE 64
+
+#define ELF_TARG_CLASS ELFCLASS64
+#define ELF_TARG_DATA ELFDATA2LSB
+#define ELF_TARG_MACH EM_AARCH64
+
+#define _NLIST_DO_ELF
+#define _KERN_DO_ELF64
+
#endif
-
- .globl __dso_handle
-__dso_handle:
- .long 0
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-9/arch-aarch64/include/machine/kernel.h
similarity index 69%
copy from ndk/platforms/android-9/arch-x86/src/__dso_handle.S
copy to ndk/platforms/android-9/arch-aarch64/include/machine/kernel.h
index 3e80128..c6f0c8c 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/kernel.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,17 +26,18 @@
* SUCH DAMAGE.
*/
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
- .section .bss
- .align 4
+#ifndef _ARCH_AARCH64_KERNEL_H
+#define _ARCH_AARCH64_KERNEL_H
-#ifndef CRT_LEGACY_WORKAROUND
- .hidden __dso_handle
-#endif
+/* this file contains kernel-specific definitions that were optimized out of
+ our processed kernel headers, but still useful nonetheless... */
- .globl __dso_handle
-__dso_handle:
- .long 0
+typedef __kernel_ulong_t __kernel_blkcnt_t;
+typedef __kernel_ulong_t __kernel_blksize_t;
+
+/* these aren't really defined by the kernel headers though... */
+typedef __kernel_ulong_t __kernel_fsblkcnt_t;
+typedef __kernel_ulong_t __kernel_fsfilcnt_t;
+typedef unsigned int __kernel_id_t;
+
+#endif /* _ARCH_AARCH64_KERNEL_H */
diff --git a/ndk/platforms/android-9/arch-aarch64/include/machine/limits.h b/ndk/platforms/android-9/arch-aarch64/include/machine/limits.h
new file mode 100644
index 0000000..a8c4a88
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/limits.h
@@ -0,0 +1,55 @@
+/* $OpenBSD: limits.h,v 1.5 2009/11/27 19:54:35 guenther Exp $ */
+
+/*
+ * Copyright (c) 1988 The Regents of the University of California.
+ * 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.
+ * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ *
+ * @(#)limits.h 7.2 (Berkeley) 6/28/90
+ */
+
+#ifndef _MACHINE_LIMITS_H_
+#define _MACHINE_LIMITS_H_
+
+#include <sys/cdefs.h>
+
+#if __POSIX_VISIBLE || __XPG_VISIBLE
+#ifndef SIZE_MAX
+#define SIZE_MAX ULONG_MAX /* max value for a size_t */
+#endif
+#define SSIZE_MAX LONG_MAX /* max value for a ssize_t */
+#endif
+
+#if __BSD_VISIBLE
+#define SIZE_T_MAX ULONG_MAX /* max value for a size_t (historic) */
+
+#define UQUAD_MAX 0xffffffffffffffffULL /* max unsigned quad */
+#define QUAD_MAX 0x7fffffffffffffffLL /* max signed quad */
+#define QUAD_MIN (-0x7fffffffffffffffLL-1) /* min signed quad */
+
+#endif /* __BSD_VISIBLE */
+
+#endif /* _MACHINE_LIMITS_H_ */
diff --git a/ndk/platforms/android-9/arch-aarch64/include/sys/limits.h b/ndk/platforms/android-9/arch-aarch64/include/sys/limits.h
new file mode 100644
index 0000000..36f73b2
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/sys/limits.h
@@ -0,0 +1,174 @@
+/* $OpenBSD: limits.h,v 1.6 2005/12/13 00:35:23 millert Exp $ */
+/*
+ * Copyright (c) 2002 Marc Espie.
+ *
+ * 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 THE OPENBSD PROJECT 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 OPENBSD
+ * PROJECT 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.
+ */
+#ifndef _SYS_LIMITS_H_
+#define _SYS_LIMITS_H_
+
+#include <sys/cdefs.h>
+#include <linux/limits.h>
+
+/* Common definitions for limits.h. */
+
+/* Legacy */
+#include <machine/limits.h>
+
+#define CHAR_BIT 8 /* number of bits in a char */
+
+#define SCHAR_MAX 0x7f /* max value for a signed char */
+#define SCHAR_MIN (-0x7f-1) /* min value for a signed char */
+
+#define UCHAR_MAX 0xffU /* max value for an unsigned char */
+#ifdef __CHAR_UNSIGNED__
+# define CHAR_MIN 0 /* min value for a char */
+# define CHAR_MAX 0xff /* max value for a char */
+#else
+# define CHAR_MAX 0x7f
+# define CHAR_MIN (-0x7f-1)
+#endif
+
+#define USHRT_MAX 0xffffU /* max value for an unsigned short */
+#define SHRT_MAX 0x7fff /* max value for a short */
+#define SHRT_MIN (-0x7fff-1) /* min value for a short */
+
+#define UINT_MAX 0xffffffffU /* max value for an unsigned int */
+#define INT_MAX 0x7fffffff /* max value for an int */
+#define INT_MIN (-0x7fffffff-1) /* min value for an int */
+
+#ifdef __LP64__
+# define ULONG_MAX 0xffffffffffffffffUL
+ /* max value for unsigned long */
+# define LONG_MAX 0x7fffffffffffffffL
+ /* max value for a signed long */
+# define LONG_MIN (-0x7fffffffffffffffL-1)
+ /* min value for a signed long */
+#else
+# define ULONG_MAX 0xffffffffUL /* max value for an unsigned long */
+# define LONG_MAX 0x7fffffffL /* max value for a long */
+# define LONG_MIN (-0x7fffffffL-1)/* min value for a long */
+#endif
+
+#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999
+# define ULLONG_MAX 0xffffffffffffffffULL
+ /* max value for unsigned long long */
+# define LLONG_MAX 0x7fffffffffffffffLL
+ /* max value for a signed long long */
+# define LLONG_MIN (-0x7fffffffffffffffLL-1)
+ /* min value for a signed long long */
+#endif
+
+#if __BSD_VISIBLE
+# define UID_MAX UINT_MAX /* max value for a uid_t */
+# define GID_MAX UINT_MAX /* max value for a gid_t */
+#endif
+
+
+#ifdef __LP64__
+# define LONG_BIT 64
+#else
+# define LONG_BIT 32
+#endif
+
+/* float.h defines these as well */
+# if !defined(DBL_DIG)
+# if defined(__DBL_DIG)
+# define DBL_DIG __DBL_DIG
+# define DBL_MAX __DBL_MAX
+# define DBL_MIN __DBL_MIN
+
+# define FLT_DIG __FLT_DIG
+# define FLT_MAX __FLT_MAX
+# define FLT_MIN __FLT_MIN
+# else
+# define DBL_DIG 15
+# define DBL_MAX 1.7976931348623157E+308
+# define DBL_MIN 2.2250738585072014E-308
+
+# define FLT_DIG 6
+# define FLT_MAX 3.40282347E+38F
+# define FLT_MIN 1.17549435E-38F
+# endif
+# endif
+
+/* Bionic: the following has been optimized out from our processed kernel headers */
+
+#define CHILD_MAX 999
+#define OPEN_MAX 256
+
+/* Bionic-specific definitions */
+
+#define _POSIX_VERSION 200112L /* Posix C language bindings version */
+#define _POSIX2_VERSION -1 /* we don't support Posix command-line tools */
+#define _POSIX2_C_VERSION _POSIX_VERSION
+#define _XOPEN_VERSION 500 /* by Posix definition */
+#define _XOPEN_XCU_VERSION -1 /* we don't support command-line utilities */
+
+/* tell what we implement legacy stuff when appropriate */
+#if _POSIX_VERSION > 0
+#define _XOPEN_XPG2 1
+#define _XOPEN_XPG3 1
+#define _XOPEN_XPG4 1
+#define _XOPEN_UNIX 1
+#endif
+
+#define _XOPEN_ENH_I18N -1 /* we don't support internationalization in the C library */
+#define _XOPEN_CRYPT -1 /* don't support X/Open Encryption */
+#define _XOPEN_LEGACY -1 /* don't claim we support these, we have some of them but not all */
+#define _XOPEN_REALTIME -1 /* we don't support all these functions */
+#define _XOPEN_REALTIME_THREADS -1 /* same here */
+
+#define _POSIX_REALTIME_SIGNALS -1 /* for now, this is not supported */
+#define _POSIX_PRIORITY_SCHEDULING 1 /* priority scheduling is a Linux feature */
+#define _POSIX_TIMERS 1 /* Posix timers are supported */
+#undef _POSIX_ASYNCHRONOUS_IO /* aio_ functions are not supported */
+#define _POSIX_SYNCHRONIZED_IO 1 /* synchronized i/o supported */
+#define _POSIX_FSYNC 1 /* fdatasync() supported */
+#define _POSIX_MAPPED_FILES 1 /* mmap-ed files supported */
+
+/* XXX: TODO: complete and check list here */
+
+
+#define _POSIX_THREADS 1 /* we support threads */
+#define _POSIX_THREAD_STACKADDR 1 /* we support thread stack address */
+#define _POSIX_THREAD_STACKSIZE 1 /* we support thread stack size */
+#define _POSIX_THREAD_PRIO_INHERIT 200112L /* linux feature */
+#define _POSIX_THREAD_PRIO_PROTECT 200112L /* linux feature */
+
+#undef _POSIX_PROCESS_SHARED /* we don't support process-shared synchronization */
+#undef _POSIX_THREAD_SAFE_FUNCTIONS /* most functions are, but not everything yet */
+#define _POSIX_CHOWN_RESTRICTED 1 /* yes, chown requires appropriate privileges */
+#define _POSIX_MONOTONIC_CLOCK 0 /* the monotonic clock may be available; ask sysconf */
+#define _POSIX_NO_TRUNC 1 /* very long pathnames generate an error */
+#define _POSIX_SAVED_IDS 1 /* saved user ids is a Linux feature */
+#define _POSIX_JOB_CONTROL 1 /* job control is a Linux feature */
+
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 /* the minimum mandated by POSIX */
+#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS
+#define _POSIX_THREAD_KEYS_MAX 128 /* the minimum mandated by POSIX */
+#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX
+#define _POSIX_THREAD_THREADS_MAX 64 /* the minimum mandated by POSIX */
+#define PTHREAD_THREADS_MAX /* bionic has no specific limit */
+
+
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/sys/types.h b/ndk/platforms/android-9/arch-aarch64/include/sys/types.h
new file mode 100644
index 0000000..875692d
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/sys/types.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * 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.
+ *
+ * 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.
+ */
+#ifndef _SYS_TYPES_H_
+#define _SYS_TYPES_H_
+
+#define __need_size_t
+#define __need_ptrdiff_t
+#include <stddef.h>
+#include <stdint.h>
+#include <sys/cdefs.h>
+
+#include <linux/posix_types.h>
+#include <asm/types.h>
+#include <linux/types.h>
+#include <machine/kernel.h>
+
+typedef __u32 __kernel_dev_t;
+
+/* be careful with __kernel_gid_t and __kernel_uid_t
+ * these are defined as 16-bit for legacy reason, but
+ * the kernel uses 32-bits instead.
+ *
+ * 32-bit valuea are required for Android, so use
+ * __kernel_uid32_t and __kernel_gid32_t
+ */
+
+typedef __kernel_blkcnt_t blkcnt_t;
+typedef __kernel_blksize_t blksize_t;
+typedef __kernel_clock_t clock_t;
+typedef __kernel_clockid_t clockid_t;
+typedef __kernel_dev_t dev_t;
+typedef __kernel_fsblkcnt_t fsblkcnt_t;
+typedef __kernel_fsfilcnt_t fsfilcnt_t;
+typedef __kernel_gid32_t gid_t;
+typedef __kernel_id_t id_t;
+typedef __kernel_ino_t ino_t;
+typedef __kernel_key_t key_t;
+typedef __kernel_mode_t mode_t;
+#ifndef _OFF_T_DEFINED_
+#define _OFF_T_DEFINED_
+typedef __kernel_off_t off_t;
+#endif
+typedef __kernel_loff_t loff_t;
+typedef loff_t off64_t; /* GLibc-specific */
+
+typedef __kernel_pid_t pid_t;
+
+/* while POSIX wants these in <sys/types.h>, we
+ * declare then in <pthread.h> instead */
+#if 0
+typedef .... pthread_attr_t;
+typedef .... pthread_cond_t;
+typedef .... pthread_condattr_t;
+typedef .... pthread_key_t;
+typedef .... pthread_mutex_t;
+typedef .... pthread_once_t;
+typedef .... pthread_rwlock_t;
+typedef .... pthread_rwlock_attr_t;
+typedef .... pthread_t;
+#endif
+
+#ifndef _SSIZE_T_DEFINED_
+#define _SSIZE_T_DEFINED_
+typedef long int ssize_t;
+#endif
+
+typedef __kernel_suseconds_t suseconds_t;
+typedef __kernel_time_t time_t;
+typedef __kernel_uid32_t uid_t;
+typedef signed long useconds_t;
+
+typedef __kernel_daddr_t daddr_t;
+typedef __kernel_timer_t timer_t;
+typedef __kernel_mqd_t mqd_t;
+
+typedef __kernel_caddr_t caddr_t;
+typedef unsigned int uint_t;
+typedef unsigned int uint;
+
+/* for some applications */
+#include <sys/sysmacros.h>
+
+#ifdef __BSD_VISIBLE
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+
+typedef uint32_t u_int32_t;
+typedef uint16_t u_int16_t;
+typedef uint8_t u_int8_t;
+typedef uint64_t u_int64_t;
+#endif
+
+#endif
diff --git a/ndk/platforms/android-9/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-9/arch-arm/symbols/libandroid.so.functions.txt
index 4438c5e..f71d8f8 100644
--- a/ndk/platforms/android-9/arch-arm/symbols/libandroid.so.functions.txt
+++ b/ndk/platforms/android-9/arch-arm/symbols/libandroid.so.functions.txt
@@ -1,14 +1,14 @@
+AAsset_close
AAssetDir_close
AAssetDir_getNextFileName
AAssetDir_rewind
-AAssetManager_fromJava
-AAssetManager_open
-AAssetManager_openDir
-AAsset_close
AAsset_getBuffer
AAsset_getLength
AAsset_getRemainingLength
AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
AAsset_openFileDescriptor
AAsset_read
AAsset_seek
@@ -83,8 +83,15 @@
AMotionEvent_getEventTime
AMotionEvent_getFlags
AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
AMotionEvent_getHistoricalX
AMotionEvent_getHistoricalY
AMotionEvent_getHistorySize
@@ -130,16 +137,16 @@
ASensorEventQueue_getEvents
ASensorEventQueue_hasEvents
ASensorEventQueue_setEventRate
-ASensorManager_createEventQueue
-ASensorManager_destroyEventQueue
-ASensorManager_getDefaultSensor
-ASensorManager_getInstance
-ASensorManager_getSensorList
ASensor_getMinDelay
ASensor_getName
ASensor_getResolution
ASensor_getType
ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
AStorageManager_delete
AStorageManager_getMountedObbPath
AStorageManager_isObbMounted
diff --git a/ndk/platforms/android-9/arch-arm/symbols/libm.so.functions.txt b/ndk/platforms/android-9/arch-arm/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..a9b2d7a
--- /dev/null
+++ b/ndk/platforms/android-9/arch-arm/symbols/libm.so.functions.txt
@@ -0,0 +1,229 @@
+__addsf3
+__aeabi_cfcmpeq
+__aeabi_cfcmple
+__aeabi_cfrcmple
+__aeabi_d2lz
+__aeabi_d2uiz
+__aeabi_d2ulz
+__aeabi_dcmpun
+__aeabi_f2iz
+__aeabi_f2lz
+__aeabi_f2ulz
+__aeabi_fadd
+__aeabi_fcmpeq
+__aeabi_fcmpge
+__aeabi_fcmpgt
+__aeabi_fcmple
+__aeabi_fcmplt
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2f
+__aeabi_l2f
+__aeabi_ui2f
+__aeabi_ul2f
+__cmpsf2
+__divsf3
+__eqsf2
+__exp__D
+__fixdfdi
+__fixsfdi
+__fixsfsi
+__fixunsdfdi
+__fixunsdfsi
+__fixunssfdi
+__floatdisf
+__floatsisf
+__floatundisf
+__floatunsisf
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__gesf2
+__gtsf2
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__lesf2
+__log__D
+__ltsf2
+__mulsf3
+__nesf2
+__signbit
+__signbitf
+__signbitl
+__subsf3
+__unorddf2
+__unordsf2
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+logb
+logbf
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttowardf
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-9/arch-arm/symbols/libm.so.variables.txt b/ndk/platforms/android-9/arch-arm/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-9/arch-arm/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-9/arch-mips/include/sys/vfs.h b/ndk/platforms/android-9/arch-mips/include/sys/vfs.h
deleted file mode 100644
index d14944d..0000000
--- a/ndk/platforms/android-9/arch-mips/include/sys/vfs.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * 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.
- *
- * 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.
- */
-#ifndef _SYS_VFS_H_
-#define _SYS_VFS_H_
-
-#include <stdint.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-__BEGIN_DECLS
-
-/* note: this corresponds to the kernel's statfs64 type */
-#ifdef __mips__
-struct statfs {
- uint32_t f_type;
- uint32_t f_bsize;
- uint32_t f_frsize;
- uint32_t __pad;
- uint64_t f_blocks;
- uint64_t f_bfree;
- uint64_t f_files;
- uint64_t f_ffree;
- uint64_t f_bavail;
- __kernel_fsid_t f_fsid;
- uint32_t f_namelen;
- uint32_t f_spare[6];
-};
-#else
-struct statfs {
- uint32_t f_type;
- uint32_t f_bsize;
- uint64_t f_blocks;
- uint64_t f_bfree;
- uint64_t f_bavail;
- uint64_t f_files;
- uint64_t f_ffree;
- __kernel_fsid_t f_fsid;
- uint32_t f_namelen;
- uint32_t f_frsize;
- uint32_t f_spare[5];
-};
-#endif
-
-#define ADFS_SUPER_MAGIC 0xadf5
-#define AFFS_SUPER_MAGIC 0xADFF
-#define BEFS_SUPER_MAGIC 0x42465331
-#define BFS_MAGIC 0x1BADFACE
-#define CIFS_MAGIC_NUMBER 0xFF534D42
-#define CODA_SUPER_MAGIC 0x73757245
-#define COH_SUPER_MAGIC 0x012FF7B7
-#define CRAMFS_MAGIC 0x28cd3d45
-#define DEVFS_SUPER_MAGIC 0x1373
-#define EFS_SUPER_MAGIC 0x00414A53
-#define EXT_SUPER_MAGIC 0x137D
-#define EXT2_OLD_SUPER_MAGIC 0xEF51
-#define EXT2_SUPER_MAGIC 0xEF53
-#define EXT3_SUPER_MAGIC 0xEF53
-#define HFS_SUPER_MAGIC 0x4244
-#define HPFS_SUPER_MAGIC 0xF995E849
-#define HUGETLBFS_MAGIC 0x958458f6
-#define ISOFS_SUPER_MAGIC 0x9660
-#define JFFS2_SUPER_MAGIC 0x72b6
-#define JFS_SUPER_MAGIC 0x3153464a
-#define MINIX_SUPER_MAGIC 0x137F /* orig. minix */
-#define MINIX_SUPER_MAGIC2 0x138F /* 30 char minix */
-#define MINIX2_SUPER_MAGIC 0x2468 /* minix V2 */
-#define MINIX2_SUPER_MAGIC2 0x2478 /* minix V2, 30 char names */
-#define MSDOS_SUPER_MAGIC 0x4d44
-#define NCP_SUPER_MAGIC 0x564c
-#define NFS_SUPER_MAGIC 0x6969
-#define NTFS_SB_MAGIC 0x5346544e
-#define OPENPROM_SUPER_MAGIC 0x9fa1
-#define PROC_SUPER_MAGIC 0x9fa0
-#define QNX4_SUPER_MAGIC 0x002f
-#define REISERFS_SUPER_MAGIC 0x52654973
-#define ROMFS_MAGIC 0x7275
-#define SMB_SUPER_MAGIC 0x517B
-#define SYSV2_SUPER_MAGIC 0x012FF7B6
-#define SYSV4_SUPER_MAGIC 0x012FF7B5
-#define TMPFS_MAGIC 0x01021994
-#define UDF_SUPER_MAGIC 0x15013346
-#define UFS_MAGIC 0x00011954
-#define USBDEVICE_SUPER_MAGIC 0x9fa2
-#define VXFS_SUPER_MAGIC 0xa501FCF5
-#define XENIX_SUPER_MAGIC 0x012FF7B4
-#define XFS_SUPER_MAGIC 0x58465342
-#define _XIAFS_SUPER_MAGIC 0x012FD16D
-
-extern int statfs(const char *, struct statfs *);
-extern int fstatfs(int, struct statfs *);
-
-__END_DECLS
-
-#endif /* _SYS_VFS_H_ */
diff --git a/ndk/platforms/android-9/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-9/arch-mips/symbols/libandroid.so.functions.txt
index 4438c5e..f71d8f8 100644
--- a/ndk/platforms/android-9/arch-mips/symbols/libandroid.so.functions.txt
+++ b/ndk/platforms/android-9/arch-mips/symbols/libandroid.so.functions.txt
@@ -1,14 +1,14 @@
+AAsset_close
AAssetDir_close
AAssetDir_getNextFileName
AAssetDir_rewind
-AAssetManager_fromJava
-AAssetManager_open
-AAssetManager_openDir
-AAsset_close
AAsset_getBuffer
AAsset_getLength
AAsset_getRemainingLength
AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
AAsset_openFileDescriptor
AAsset_read
AAsset_seek
@@ -83,8 +83,15 @@
AMotionEvent_getEventTime
AMotionEvent_getFlags
AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
AMotionEvent_getHistoricalX
AMotionEvent_getHistoricalY
AMotionEvent_getHistorySize
@@ -130,16 +137,16 @@
ASensorEventQueue_getEvents
ASensorEventQueue_hasEvents
ASensorEventQueue_setEventRate
-ASensorManager_createEventQueue
-ASensorManager_destroyEventQueue
-ASensorManager_getDefaultSensor
-ASensorManager_getInstance
-ASensorManager_getSensorList
ASensor_getMinDelay
ASensor_getName
ASensor_getResolution
ASensor_getType
ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
AStorageManager_delete
AStorageManager_getMountedObbPath
AStorageManager_isObbMounted
diff --git a/ndk/platforms/android-9/arch-mips64 b/ndk/platforms/android-9/arch-mips64
new file mode 120000
index 0000000..8f3e95f
--- /dev/null
+++ b/ndk/platforms/android-9/arch-mips64
@@ -0,0 +1 @@
+arch-mips
\ No newline at end of file
diff --git a/ndk/platforms/android-9/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-9/arch-x86/symbols/libandroid.so.functions.txt
index 4438c5e..f71d8f8 100644
--- a/ndk/platforms/android-9/arch-x86/symbols/libandroid.so.functions.txt
+++ b/ndk/platforms/android-9/arch-x86/symbols/libandroid.so.functions.txt
@@ -1,14 +1,14 @@
+AAsset_close
AAssetDir_close
AAssetDir_getNextFileName
AAssetDir_rewind
-AAssetManager_fromJava
-AAssetManager_open
-AAssetManager_openDir
-AAsset_close
AAsset_getBuffer
AAsset_getLength
AAsset_getRemainingLength
AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
AAsset_openFileDescriptor
AAsset_read
AAsset_seek
@@ -83,8 +83,15 @@
AMotionEvent_getEventTime
AMotionEvent_getFlags
AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
AMotionEvent_getHistoricalX
AMotionEvent_getHistoricalY
AMotionEvent_getHistorySize
@@ -130,16 +137,16 @@
ASensorEventQueue_getEvents
ASensorEventQueue_hasEvents
ASensorEventQueue_setEventRate
-ASensorManager_createEventQueue
-ASensorManager_destroyEventQueue
-ASensorManager_getDefaultSensor
-ASensorManager_getInstance
-ASensorManager_getSensorList
ASensor_getMinDelay
ASensor_getName
ASensor_getResolution
ASensor_getType
ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
AStorageManager_delete
AStorageManager_getMountedObbPath
AStorageManager_isObbMounted
diff --git a/ndk/platforms/android-9/include/android/input.h b/ndk/platforms/android-9/include/android/input.h
index b9dffad..0aac02f 100644
--- a/ndk/platforms/android-9/include/android/input.h
+++ b/ndk/platforms/android-9/include/android/input.h
@@ -433,23 +433,23 @@
* For touch events on the screen, this is the delta that was added to the raw
* screen coordinates to adjust for the absolute position of the containing windows
* and views. */
-float AMotionEvent_getXOffset(const AInputEvent* motion_event);
+float AMotionEvent_getXOffset(const AInputEvent* motion_event) __NDK_FPABI__;
/* Get the precision of the Y coordinates being reported.
* For touch events on the screen, this is the delta that was added to the raw
* screen coordinates to adjust for the absolute position of the containing windows
* and views. */
-float AMotionEvent_getYOffset(const AInputEvent* motion_event);
+float AMotionEvent_getYOffset(const AInputEvent* motion_event) __NDK_FPABI__;
/* Get the precision of the X coordinates being reported.
* You can multiply this number with an X coordinate sample to find the
* actual hardware value of the X coordinate. */
-float AMotionEvent_getXPrecision(const AInputEvent* motion_event);
+float AMotionEvent_getXPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
/* Get the precision of the Y coordinates being reported.
* You can multiply this number with a Y coordinate sample to find the
* actual hardware value of the Y coordinate. */
-float AMotionEvent_getYPrecision(const AInputEvent* motion_event);
+float AMotionEvent_getYPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
/* Get the number of pointers of data contained in this event.
* Always >= 1. */
@@ -465,29 +465,29 @@
* For touch events on the screen, this is the original location of the event
* on the screen, before it had been adjusted for the containing window
* and views. */
-float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the original raw X coordinate of this event.
* For touch events on the screen, this is the original location of the event
* on the screen, before it had been adjusted for the containing window
* and views. */
-float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current X coordinate of this event for the given pointer index.
* Whole numbers are pixels; the value may have a fraction for input devices
* that are sub-pixel precise. */
-float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current Y coordinate of this event for the given pointer index.
* Whole numbers are pixels; the value may have a fraction for input devices
* that are sub-pixel precise. */
-float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current pressure of this event for the given pointer index.
* The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
* although values higher than 1 may be generated depending on the calibration of
* the input device. */
-float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current scaled value of the approximate size for the given pointer index.
* This represents some approximation of the area of the screen being
@@ -495,27 +495,27 @@
* touch is normalized with the device specific range of values
* and scaled to a value between 0 and 1. The value of size can be used to
* determine fat touch events. */
-float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current length of the major axis of an ellipse that describes the touch area
* at the point of contact for the given pointer index. */
-float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current length of the minor axis of an ellipse that describes the touch area
* at the point of contact for the given pointer index. */
-float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current length of the major axis of an ellipse that describes the size
* of the approaching tool for the given pointer index.
* The tool area represents the estimated size of the finger or pen that is
* touching the device independent of its actual touch area at the point of contact. */
-float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current length of the minor axis of an ellipse that describes the size
* of the approaching tool for the given pointer index.
* The tool area represents the estimated size of the finger or pen that is
* touching the device independent of its actual touch area at the point of contact. */
-float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the current orientation of the touch area and tool area in radians clockwise from
* vertical for the given pointer index.
@@ -525,7 +525,7 @@
* indicates that the major axis of contact is oriented to the left.
* The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
* (finger pointing fully right). */
-float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
/* Get the number of historical points in this event. These are movements that
* have occurred between this event and the previous event. This only applies
@@ -546,7 +546,7 @@
* Whole numbers are pixels; the value may have a fraction for input devices
* that are sub-pixel precise. */
float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical raw Y coordinate of this event for the given pointer index that
* occurred between this event and the previous motion event.
@@ -556,21 +556,21 @@
* Whole numbers are pixels; the value may have a fraction for input devices
* that are sub-pixel precise. */
float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical X coordinate of this event for the given pointer index that
* occurred between this event and the previous motion event.
* Whole numbers are pixels; the value may have a fraction for input devices
* that are sub-pixel precise. */
float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical Y coordinate of this event for the given pointer index that
* occurred between this event and the previous motion event.
* Whole numbers are pixels; the value may have a fraction for input devices
* that are sub-pixel precise. */
float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical pressure of this event for the given pointer index that
* occurred between this event and the previous motion event.
@@ -578,7 +578,7 @@
* although values higher than 1 may be generated depending on the calibration of
* the input device. */
float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the current scaled value of the approximate size for the given pointer index that
* occurred between this event and the previous motion event.
@@ -588,19 +588,19 @@
* and scaled to a value between 0 and 1. The value of size can be used to
* determine fat touch events. */
float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical length of the major axis of an ellipse that describes the touch area
* at the point of contact for the given pointer index that
* occurred between this event and the previous motion event. */
float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical length of the minor axis of an ellipse that describes the touch area
* at the point of contact for the given pointer index that
* occurred between this event and the previous motion event. */
float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical length of the major axis of an ellipse that describes the size
* of the approaching tool for the given pointer index that
@@ -608,7 +608,7 @@
* The tool area represents the estimated size of the finger or pen that is
* touching the device independent of its actual touch area at the point of contact. */
float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical length of the minor axis of an ellipse that describes the size
* of the approaching tool for the given pointer index that
@@ -616,7 +616,7 @@
* The tool area represents the estimated size of the finger or pen that is
* touching the device independent of its actual touch area at the point of contact. */
float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/* Get the historical orientation of the touch area and tool area in radians clockwise from
* vertical for the given pointer index that
@@ -628,7 +628,7 @@
* The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
* (finger pointing fully right). */
float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
- size_t history_index);
+ size_t history_index) __NDK_FPABI__;
/*
diff --git a/ndk/platforms/android-9/include/android/sensor.h b/ndk/platforms/android-9/include/android/sensor.h
index f163f18..e6a63c2 100644
--- a/ndk/platforms/android-9/include/android/sensor.h
+++ b/ndk/platforms/android-9/include/android/sensor.h
@@ -239,7 +239,7 @@
/*
* Returns this sensors's resolution
*/
-float ASensor_getResolution(ASensor const* sensor);
+float ASensor_getResolution(ASensor const* sensor) __NDK_FPABI__;
/*
* Returns the minimum delay allowed between events in microseconds.
diff --git a/ndk/platforms/android-9/include/math.h b/ndk/platforms/android-9/include/math.h
index 3b5660f..6a43ac6 100644
--- a/ndk/platforms/android-9/include/math.h
+++ b/ndk/platforms/android-9/include/math.h
@@ -183,219 +183,219 @@
/*
* ANSI/POSIX
*/
-int __fpclassifyd(double) __pure2;
-int __fpclassifyf(float) __pure2;
-int __fpclassifyl(long double) __pure2;
-int __isfinitef(float) __pure2;
-int __isfinite(double) __pure2;
-int __isfinitel(long double) __pure2;
-int __isinff(float) __pure2;
-int __isinf(double) __pure2;
-int __isinfl(long double) __pure2;
-int __isnanl(long double) __pure2;
-int __isnormalf(float) __pure2;
-int __isnormal(double) __pure2;
-int __isnormall(long double) __pure2;
-int __signbit(double) __pure2;
-int __signbitf(float) __pure2;
-int __signbitl(long double) __pure2;
+int __fpclassifyd(double) __NDK_FPABI_MATH__ __pure2;
+int __fpclassifyf(float) __NDK_FPABI_MATH__ __pure2;
+int __fpclassifyl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isfinitef(float) __NDK_FPABI_MATH__ __pure2;
+int __isfinite(double) __NDK_FPABI_MATH__ __pure2;
+int __isfinitel(long double) __NDK_FPABI_MATH__ __pure2;
+int __isinff(float) __NDK_FPABI_MATH__ __pure2;
+int __isinf(double) __NDK_FPABI_MATH__ __pure2;
+int __isinfl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isnanl(long double) __NDK_FPABI_MATH__ __pure2;
+int __isnormalf(float) __NDK_FPABI_MATH__ __pure2;
+int __isnormal(double) __NDK_FPABI_MATH__ __pure2;
+int __isnormall(long double) __NDK_FPABI_MATH__ __pure2;
+int __signbit(double) __NDK_FPABI_MATH__ __pure2;
+int __signbitf(float) __NDK_FPABI_MATH__ __pure2;
+int __signbitl(long double) __NDK_FPABI_MATH__ __pure2;
-double acos(double);
-double asin(double);
-double atan(double);
-double atan2(double, double);
-double cos(double);
-double sin(double);
-double tan(double);
+double acos(double) __NDK_FPABI_MATH__;
+double asin(double) __NDK_FPABI_MATH__;
+double atan(double) __NDK_FPABI_MATH__;
+double atan2(double, double) __NDK_FPABI_MATH__;
+double cos(double) __NDK_FPABI_MATH__;
+double sin(double) __NDK_FPABI_MATH__;
+double tan(double) __NDK_FPABI_MATH__;
-double cosh(double);
-double sinh(double);
-double tanh(double);
+double cosh(double) __NDK_FPABI_MATH__;
+double sinh(double) __NDK_FPABI_MATH__;
+double tanh(double) __NDK_FPABI_MATH__;
-double exp(double);
-double frexp(double, int *); /* fundamentally !__pure2 */
-double ldexp(double, int);
-double log(double);
-double log10(double);
-double modf(double, double *); /* fundamentally !__pure2 */
+double exp(double) __NDK_FPABI_MATH__;
+double frexp(double, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+double ldexp(double, int) __NDK_FPABI_MATH__;
+double log(double) __NDK_FPABI_MATH__;
+double log10(double) __NDK_FPABI_MATH__;
+double modf(double, double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
-double pow(double, double);
-double sqrt(double);
+double pow(double, double) __NDK_FPABI_MATH__;
+double sqrt(double) __NDK_FPABI_MATH__;
-double ceil(double);
-double fabs(double) __pure2;
-double floor(double);
-double fmod(double, double);
+double ceil(double) __NDK_FPABI_MATH__;
+double fabs(double) __NDK_FPABI_MATH__ __pure2;
+double floor(double) __NDK_FPABI_MATH__;
+double fmod(double, double) __NDK_FPABI_MATH__;
/*
* These functions are not in C90.
*/
/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
-double acosh(double);
-double asinh(double);
-double atanh(double);
-double cbrt(double);
-double erf(double);
-double erfc(double);
-double exp2(double);
-double expm1(double);
-double fma(double, double, double);
-double hypot(double, double);
-int ilogb(double) __pure2;
-/* int (isinf)(double) __pure2; */
-int (isnan)(double) __pure2;
-double lgamma(double);
-long long llrint(double);
-long long llround(double);
-double log1p(double);
-double logb(double);
-long lrint(double);
-long lround(double);
-double nextafter(double, double);
-double remainder(double, double);
-double remquo(double, double, int *);
-double rint(double);
+double acosh(double) __NDK_FPABI_MATH__;
+double asinh(double) __NDK_FPABI_MATH__;
+double atanh(double) __NDK_FPABI_MATH__;
+double cbrt(double) __NDK_FPABI_MATH__;
+double erf(double) __NDK_FPABI_MATH__;
+double erfc(double) __NDK_FPABI_MATH__;
+double exp2(double) __NDK_FPABI_MATH__;
+double expm1(double) __NDK_FPABI_MATH__;
+double fma(double, double, double) __NDK_FPABI_MATH__;
+double hypot(double, double) __NDK_FPABI_MATH__;
+int ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int (isinf)(double) __NDK_FPABI_MATH__ __pure2; */
+int (isnan)(double) __NDK_FPABI_MATH__ __pure2;
+double lgamma(double) __NDK_FPABI_MATH__;
+long long llrint(double) __NDK_FPABI_MATH__;
+long long llround(double) __NDK_FPABI_MATH__;
+double log1p(double) __NDK_FPABI_MATH__;
+double logb(double) __NDK_FPABI_MATH__;
+long lrint(double) __NDK_FPABI_MATH__;
+long lround(double) __NDK_FPABI_MATH__;
+double nextafter(double, double) __NDK_FPABI_MATH__;
+double remainder(double, double) __NDK_FPABI_MATH__;
+double remquo(double, double, int *) __NDK_FPABI_MATH__;
+double rint(double) __NDK_FPABI_MATH__;
/* #endif */ /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
/* #if __BSD_VISIBLE || __XSI_VISIBLE */
-double j0(double);
-double j1(double);
-double jn(int, double);
-double scalb(double, double);
-double y0(double);
-double y1(double);
-double yn(int, double);
+double j0(double) __NDK_FPABI_MATH__;
+double j1(double) __NDK_FPABI_MATH__;
+double jn(int, double) __NDK_FPABI_MATH__;
+double scalb(double, double) __NDK_FPABI_MATH__;
+double y0(double) __NDK_FPABI_MATH__;
+double y1(double) __NDK_FPABI_MATH__;
+double yn(int, double) __NDK_FPABI_MATH__;
/* #if __XSI_VISIBLE <= 500 || __BSD_VISIBLE */
-double gamma(double);
+double gamma(double) __NDK_FPABI_MATH__;
/* #endif */
/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 */
-double copysign(double, double) __pure2;
-double fdim(double, double);
-double fmax(double, double) __pure2;
-double fmin(double, double) __pure2;
-double nearbyint(double);
-double round(double);
-double scalbln(double, long);
-double scalbn(double, int);
-double tgamma(double);
-double trunc(double);
+double copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double fdim(double, double) __NDK_FPABI_MATH__;
+double fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double nearbyint(double) __NDK_FPABI_MATH__;
+double round(double) __NDK_FPABI_MATH__;
+double scalbln(double, long) __NDK_FPABI_MATH__;
+double scalbn(double, int) __NDK_FPABI_MATH__;
+double tgamma(double) __NDK_FPABI_MATH__;
+double trunc(double) __NDK_FPABI_MATH__;
/* #endif */
/*
* BSD math library entry points
*/
/* #if __BSD_VISIBLE */
-double drem(double, double);
-int finite(double) __pure2;
-int isnanf(float) __pure2;
+double drem(double, double) __NDK_FPABI_MATH__;
+int finite(double) __NDK_FPABI_MATH__ __pure2;
+int isnanf(float) __NDK_FPABI_MATH__ __pure2;
/*
* Reentrant version of gamma & lgamma; passes signgam back by reference
* as the second argument; user must allocate space for signgam.
*/
-double gamma_r(double, int *);
-double lgamma_r(double, int *);
+double gamma_r(double, int *) __NDK_FPABI_MATH__;
+double lgamma_r(double, int *) __NDK_FPABI_MATH__;
/*
* IEEE Test Vector
*/
-double significand(double);
+double significand(double) __NDK_FPABI_MATH__;
/* #endif */ /* __BSD_VISIBLE */
/* float versions of ANSI/POSIX functions */
/*#if __ISO_C_VISIBLE >= 1999 */
-float acosf(float);
-float asinf(float);
-float atanf(float);
-float atan2f(float, float);
-float cosf(float);
-float sinf(float);
-float tanf(float);
+float acosf(float) __NDK_FPABI_MATH__;
+float asinf(float) __NDK_FPABI_MATH__;
+float atanf(float) __NDK_FPABI_MATH__;
+float atan2f(float, float) __NDK_FPABI_MATH__;
+float cosf(float) __NDK_FPABI_MATH__;
+float sinf(float) __NDK_FPABI_MATH__;
+float tanf(float) __NDK_FPABI_MATH__;
-float coshf(float);
-float sinhf(float);
-float tanhf(float);
+float coshf(float) __NDK_FPABI_MATH__;
+float sinhf(float) __NDK_FPABI_MATH__;
+float tanhf(float) __NDK_FPABI_MATH__;
-float exp2f(float);
-float expf(float);
-float expm1f(float);
-float frexpf(float, int *); /* fundamentally !__pure2 */
-int ilogbf(float) __pure2;
-float ldexpf(float, int);
-float log10f(float);
-float log1pf(float);
-float logf(float);
-float modff(float, float *); /* fundamentally !__pure2 */
+float exp2f(float) __NDK_FPABI_MATH__;
+float expf(float) __NDK_FPABI_MATH__;
+float expm1f(float) __NDK_FPABI_MATH__;
+float frexpf(float, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+int ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float ldexpf(float, int) __NDK_FPABI_MATH__;
+float log10f(float) __NDK_FPABI_MATH__;
+float log1pf(float) __NDK_FPABI_MATH__;
+float logf(float) __NDK_FPABI_MATH__;
+float modff(float, float *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
-float powf(float, float);
-float sqrtf(float);
+float powf(float, float) __NDK_FPABI_MATH__;
+float sqrtf(float) __NDK_FPABI_MATH__;
-float ceilf(float);
-float fabsf(float) __pure2;
-float floorf(float);
-float fmodf(float, float);
-float roundf(float);
+float ceilf(float) __NDK_FPABI_MATH__;
+float fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float floorf(float) __NDK_FPABI_MATH__;
+float fmodf(float, float) __NDK_FPABI_MATH__;
+float roundf(float) __NDK_FPABI_MATH__;
-float erff(float);
-float erfcf(float);
-float hypotf(float, float);
-float lgammaf(float);
+float erff(float) __NDK_FPABI_MATH__;
+float erfcf(float) __NDK_FPABI_MATH__;
+float hypotf(float, float) __NDK_FPABI_MATH__;
+float lgammaf(float) __NDK_FPABI_MATH__;
-float acoshf(float);
-float asinhf(float);
-float atanhf(float);
-float cbrtf(float);
-float logbf(float);
-float copysignf(float, float) __pure2;
-long long llrintf(float);
-long long llroundf(float);
-long lrintf(float);
-long lroundf(float);
-float nearbyintf(float);
-float nextafterf(float, float);
-float remainderf(float, float);
-float remquof(float, float, int *);
-float rintf(float);
-float scalblnf(float, long);
-float scalbnf(float, int);
-float truncf(float);
+float acoshf(float) __NDK_FPABI_MATH__;
+float asinhf(float) __NDK_FPABI_MATH__;
+float atanhf(float) __NDK_FPABI_MATH__;
+float cbrtf(float) __NDK_FPABI_MATH__;
+float logbf(float) __NDK_FPABI_MATH__;
+float copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long llrintf(float) __NDK_FPABI_MATH__;
+long long llroundf(float) __NDK_FPABI_MATH__;
+long lrintf(float) __NDK_FPABI_MATH__;
+long lroundf(float) __NDK_FPABI_MATH__;
+float nearbyintf(float) __NDK_FPABI_MATH__;
+float nextafterf(float, float) __NDK_FPABI_MATH__;
+float remainderf(float, float) __NDK_FPABI_MATH__;
+float remquof(float, float, int *) __NDK_FPABI_MATH__;
+float rintf(float) __NDK_FPABI_MATH__;
+float scalblnf(float, long) __NDK_FPABI_MATH__;
+float scalbnf(float, int) __NDK_FPABI_MATH__;
+float truncf(float) __NDK_FPABI_MATH__;
-float fdimf(float, float);
-float fmaf(float, float, float);
-float fmaxf(float, float) __pure2;
-float fminf(float, float) __pure2;
+float fdimf(float, float) __NDK_FPABI_MATH__;
+float fmaf(float, float, float) __NDK_FPABI_MATH__;
+float fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float fminf(float, float) __NDK_FPABI_MATH__ __pure2;
/* #endif */
/*
* float versions of BSD math library entry points
*/
/* #if __BSD_VISIBLE */
-float dremf(float, float);
-int finitef(float) __pure2;
-float gammaf(float);
-float j0f(float);
-float j1f(float);
-float jnf(int, float);
-float scalbf(float, float);
-float y0f(float);
-float y1f(float);
-float ynf(int, float);
+float dremf(float, float) __NDK_FPABI_MATH__;
+int finitef(float) __NDK_FPABI_MATH__ __pure2;
+float gammaf(float) __NDK_FPABI_MATH__;
+float j0f(float) __NDK_FPABI_MATH__;
+float j1f(float) __NDK_FPABI_MATH__;
+float jnf(int, float) __NDK_FPABI_MATH__;
+float scalbf(float, float) __NDK_FPABI_MATH__;
+float y0f(float) __NDK_FPABI_MATH__;
+float y1f(float) __NDK_FPABI_MATH__;
+float ynf(int, float) __NDK_FPABI_MATH__;
/*
* Float versions of reentrant version of gamma & lgamma; passes
* signgam back by reference as the second argument; user must
* allocate space for signgam.
*/
-float gammaf_r(float, int *);
-float lgammaf_r(float, int *);
+float gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float lgammaf_r(float, int *) __NDK_FPABI_MATH__;
/*
* float version of IEEE Test Vector
*/
-float significandf(float);
+float significandf(float) __NDK_FPABI_MATH__;
/* #endif */ /* __BSD_VISIBLE */
/*
@@ -403,88 +403,88 @@
*/
/* #if __ISO_C_VISIBLE >= 1999 */
#if 0
-long double acoshl(long double);
-long double acosl(long double);
-long double asinhl(long double);
-long double asinl(long double);
-long double atan2l(long double, long double);
-long double atanhl(long double);
-long double atanl(long double);
-long double cbrtl(long double);
+long double acoshl(long double) __NDK_FPABI_MATH__;
+long double acosl(long double) __NDK_FPABI_MATH__;
+long double asinhl(long double) __NDK_FPABI_MATH__;
+long double asinl(long double) __NDK_FPABI_MATH__;
+long double atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double atanhl(long double) __NDK_FPABI_MATH__;
+long double atanl(long double) __NDK_FPABI_MATH__;
+long double cbrtl(long double) __NDK_FPABI_MATH__;
#endif
-long double ceill(long double);
-long double copysignl(long double, long double) __pure2;
+long double ceill(long double) __NDK_FPABI_MATH__;
+long double copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
#if 0
-long double coshl(long double);
-long double cosl(long double);
-long double erfcl(long double);
-long double erfl(long double);
-long double exp2l(long double);
-long double expl(long double);
-long double expm1l(long double);
+long double coshl(long double) __NDK_FPABI_MATH__;
+long double cosl(long double) __NDK_FPABI_MATH__;
+long double erfcl(long double) __NDK_FPABI_MATH__;
+long double erfl(long double) __NDK_FPABI_MATH__;
+long double exp2l(long double) __NDK_FPABI_MATH__;
+long double expl(long double) __NDK_FPABI_MATH__;
+long double expm1l(long double) __NDK_FPABI_MATH__;
#endif
-long double fabsl(long double) __pure2;
-long double fdiml(long double, long double);
-long double floorl(long double);
-long double fmal(long double, long double, long double);
-long double fmaxl(long double, long double) __pure2;
-long double fminl(long double, long double) __pure2;
+long double fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double floorl(long double) __NDK_FPABI_MATH__;
+long double fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
#if 0
-long double fmodl(long double, long double);
+long double fmodl(long double, long double) __NDK_FPABI_MATH__;
#endif
-long double frexpl(long double value, int *); /* fundamentally !__pure2 */
+long double frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
#if 0
-long double hypotl(long double, long double);
+long double hypotl(long double, long double) __NDK_FPABI_MATH__;
#endif
-int ilogbl(long double) __pure2;
-long double ldexpl(long double, int);
+int ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double ldexpl(long double, int) __NDK_FPABI_MATH__;
#if 0
-long double lgammal(long double);
-long long llrintl(long double);
+long double lgammal(long double) __NDK_FPABI_MATH__;
+long long llrintl(long double) __NDK_FPABI_MATH__;
#endif
-long long llroundl(long double);
+long long llroundl(long double) __NDK_FPABI_MATH__;
#if 0
-long double log10l(long double);
-long double log1pl(long double);
-long double log2l(long double);
-long double logbl(long double);
-long double logl(long double);
-long lrintl(long double);
+long double log10l(long double) __NDK_FPABI_MATH__;
+long double log1pl(long double) __NDK_FPABI_MATH__;
+long double log2l(long double) __NDK_FPABI_MATH__;
+long double logbl(long double) __NDK_FPABI_MATH__;
+long double logl(long double) __NDK_FPABI_MATH__;
+long lrintl(long double) __NDK_FPABI_MATH__;
#endif
-long lroundl(long double);
+long lroundl(long double) __NDK_FPABI_MATH__;
#if 0
-long double modfl(long double, long double *); /* fundamentally !__pure2 */
-long double nanl(const char *) __pure2;
-long double nearbyintl(long double);
+long double modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+long double nearbyintl(long double) __NDK_FPABI_MATH__;
#endif
-long double nextafterl(long double, long double);
-double nexttoward(double, long double);
-float nexttowardf(float, long double);
-long double nexttowardl(long double, long double);
+long double nextafterl(long double, long double) __NDK_FPABI_MATH__;
+double nexttoward(double, long double) __NDK_FPABI_MATH__;
+float nexttowardf(float, long double) __NDK_FPABI_MATH__;
+long double nexttowardl(long double, long double) __NDK_FPABI_MATH__;
#if 0
-long double powl(long double, long double);
-long double remainderl(long double, long double);
-long double remquol(long double, long double, int *);
-long double rintl(long double);
+long double powl(long double, long double) __NDK_FPABI_MATH__;
+long double remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double rintl(long double) __NDK_FPABI_MATH__;
#endif
-long double roundl(long double);
-long double scalblnl(long double, long);
-long double scalbnl(long double, int);
+long double roundl(long double) __NDK_FPABI_MATH__;
+long double scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double scalbnl(long double, int) __NDK_FPABI_MATH__;
#if 0
-long double sinhl(long double);
-long double sinl(long double);
-long double sqrtl(long double);
-long double tanhl(long double);
-long double tanl(long double);
-long double tgammal(long double);
+long double sinhl(long double) __NDK_FPABI_MATH__;
+long double sinl(long double) __NDK_FPABI_MATH__;
+long double sqrtl(long double) __NDK_FPABI_MATH__;
+long double tanhl(long double) __NDK_FPABI_MATH__;
+long double tanl(long double) __NDK_FPABI_MATH__;
+long double tgammal(long double) __NDK_FPABI_MATH__;
#endif
-long double truncl(long double);
+long double truncl(long double) __NDK_FPABI_MATH__;
/* BIONIC: GLibc compatibility - required by the ARM toolchain */
#ifdef _GNU_SOURCE
-void sincos(double x, double *sin, double *cos);
-void sincosf(float x, float *sin, float *cos);
-void sincosl(long double x, long double *sin, long double *cos);
+void sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
#endif
/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
diff --git a/ndk/platforms/android-9/include/pthread.h b/ndk/platforms/android-9/include/pthread.h
index c3f055e..0176abd 100644
--- a/ndk/platforms/android-9/include/pthread.h
+++ b/ndk/platforms/android-9/include/pthread.h
@@ -142,7 +142,9 @@
int pthread_create(pthread_t *thread, pthread_attr_t const * attr,
void *(*start_routine)(void *), void * arg);
-void pthread_exit(void * retval);
+
+__noreturn void pthread_exit(void * retval);
+
int pthread_join(pthread_t thid, void ** ret_val);
int pthread_detach(pthread_t thid);
diff --git a/ndk/platforms/android-9/include/stdlib.h b/ndk/platforms/android-9/include/stdlib.h
index 97d8e46..6011787 100644
--- a/ndk/platforms/android-9/include/stdlib.h
+++ b/ndk/platforms/android-9/include/stdlib.h
@@ -57,6 +57,7 @@
extern int unsetenv(const char *);
extern int clearenv(void);
+extern char *mkdtemp(char *);
extern char *mktemp (char *);
extern int mkstemp (char *);
@@ -64,8 +65,9 @@
extern long long strtoll(const char *, char **, int);
extern unsigned long strtoul(const char *, char **, int);
extern unsigned long long strtoull(const char *, char **, int);
-extern double strtod(const char *nptr, char **endptr);
+extern double strtod(const char *nptr, char **endptr) __NDK_FPABI__;
+__NDK_FPABI__
static __inline__ float strtof(const char *nptr, char **endptr)
{
return (float)strtod(nptr, endptr);
@@ -75,6 +77,7 @@
extern long atol(const char *);
extern long long atoll(const char *);
+ __NDK_FPABI__
static __inline__ double atof(const char *nptr)
{
return (strtod(nptr, NULL));
@@ -106,8 +109,8 @@
extern long nrand48(unsigned short *);
extern long lrand48(void);
extern unsigned short *seed48(unsigned short*);
-extern double erand48(unsigned short xsubi[3]);
-extern double drand48(void);
+extern double erand48(unsigned short xsubi[3]) __NDK_FPABI__;
+extern double drand48(void) __NDK_FPABI__;
extern void srand48(long);
extern unsigned int arc4random(void);
extern void arc4random_stir(void);
diff --git a/ndk/platforms/android-9/include/sys/cdefs.h b/ndk/platforms/android-9/include/sys/cdefs.h
index 92035d4..beb35c4 100644
--- a/ndk/platforms/android-9/include/sys/cdefs.h
+++ b/ndk/platforms/android-9/include/sys/cdefs.h
@@ -499,4 +499,31 @@
#define __BIONIC__ 1
#include <android/api-level.h>
+/* __NDK_FPABI__ or __NDK_FPABI_MATH__ are applied to APIs taking or returning float or
+ [long] double, to ensure even at the presence of -mhard-float (which implies
+ -mfloat-abi=hard), calling to 32-bit Android native APIs still follow -mfloat-abi=softfp.
+
+ __NDK_FPABI_MATH__ is applied to APIs in math.h. It normally equals to __NDK_FPABI__,
+ but allows use of customized libm.a compiled with -mhard-float by -D_NDK_MATH_NO_SOFTFP=1
+
+ NOTE: Disable for clang for now unless _NDK_MATH_NO_SOFTFP=1, because clang before 3.4 doesn't
+ allow change of calling convension for builtin and produces error message reads:
+
+ a.i:564:6: error: function declared 'aapcs' here was previously declared without calling convention
+ int sin(double d) __attribute__((pcs("aapcs")));
+ ^
+ a.i:564:6: note: previous declaration is here
+ */
+#if defined(__ANDROID__) && !__LP64__ && defined( __arm__)
+#define __NDK_FPABI__ __attribute__((pcs("aapcs")))
+#else
+#define __NDK_FPABI__
+#endif
+
+#if (!defined(_NDK_MATH_NO_SOFTFP) || _NDK_MATH_NO_SOFTFP != 1) && !defined(__clang__)
+#define __NDK_FPABI_MATH__ __NDK_FPABI__
+#else
+#define __NDK_FPABI_MATH__ /* nothing */
+#endif
+
#endif /* !_SYS_CDEFS_H_ */
diff --git a/ndk/platforms/android-9/include/wchar.h b/ndk/platforms/android-9/include/wchar.h
index 806e3d1..b10f470 100644
--- a/ndk/platforms/android-9/include/wchar.h
+++ b/ndk/platforms/android-9/include/wchar.h
@@ -121,7 +121,7 @@
extern size_t wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
extern size_t wcsspn(const wchar_t *, const wchar_t *);
extern wchar_t *wcsstr(const wchar_t *, const wchar_t *);
-extern double wcstod(const wchar_t *, wchar_t **);
+extern double wcstod(const wchar_t *, wchar_t **) __NDK_FPABI__;
extern wchar_t *wcstok(wchar_t *, const wchar_t *, wchar_t **);
extern long int wcstol(const wchar_t *, wchar_t **, int);
extern size_t wcstombs(char *, const wchar_t *, size_t);
diff --git a/ndk/sources/android/libportable/arch-mips/poll.c b/ndk/sources/android/libportable/arch-mips/poll.c
index 3f97176..54059dd 100644
--- a/ndk/sources/android/libportable/arch-mips/poll.c
+++ b/ndk/sources/android/libportable/arch-mips/poll.c
@@ -104,9 +104,9 @@
return mips_events;
}
-extern int poll(struct pollfd *, nfds_t, long);
+extern int poll(struct pollfd *, nfds_t, int);
-int WRAP(poll)(struct pollfd *fds, nfds_t nfds, long timeout)
+int WRAP(poll)(struct pollfd *fds, nfds_t nfds, int timeout)
{
nfds_t i;
int ret;
diff --git a/ndk/sources/android/libportable/arch-mips/pthread.c b/ndk/sources/android/libportable/arch-mips/pthread.c
index 5b75623..f6c3037 100644
--- a/ndk/sources/android/libportable/arch-mips/pthread.c
+++ b/ndk/sources/android/libportable/arch-mips/pthread.c
@@ -114,7 +114,7 @@
PTHREAD_WRAPPER(pthread_attr_setscope, (pthread_attr_t *attr, int scope), (attr, scope),
"(attr:%p, scope:%d)");
-PTHREAD_WRAPPER(pthread_attr_getscope, (pthread_attr_t const *attr), (attr), "(attr:%p)");
+PTHREAD_WRAPPER(pthread_attr_getscope, (pthread_attr_t const *attr, int* scope), (attr, scope), "(attr:%p, scope:%p)");
PTHREAD_WRAPPER(pthread_getattr_np, (pthread_t thid, pthread_attr_t *attr), (thid, attr),
"(thid:%lx, attr:%p)");
diff --git a/ndk/sources/android/libportable/arch-mips/statfs.c b/ndk/sources/android/libportable/arch-mips/statfs.c
index 45dfd09..013cde9 100644
--- a/ndk/sources/android/libportable/arch-mips/statfs.c
+++ b/ndk/sources/android/libportable/arch-mips/statfs.c
@@ -33,6 +33,7 @@
p_statfs->f_fsid = n_statfs->f_fsid;
p_statfs->f_namelen = n_statfs->f_namelen;
p_statfs->f_frsize = n_statfs->f_frsize;
+ p_statfs->f_flags = n_statfs->f_flags;
}
int WRAP(statfs)(const char* path, struct statfs_portable* stat)
diff --git a/ndk/sources/android/libportable/common/include/asm-generic/portability.h b/ndk/sources/android/libportable/common/include/asm-generic/portability.h
index 8d91854..a575b95 100644
--- a/ndk/sources/android/libportable/common/include/asm-generic/portability.h
+++ b/ndk/sources/android/libportable/common/include/asm-generic/portability.h
@@ -21,8 +21,8 @@
#define WRAP(f) f ## _portable
#define REAL(f) f
#else
-/* On host app link with libpportable.a with -Wl,--wrap=symbol, which resolve symbol symbol to __wrap_symbol,
- * and __real_symbol refer to the original symbol
+/* On host app link with libpportable.a with -Wl,--wrap=symbol, which resolves undefined symbol to __wrap_symbol,
+ * and undefined __real_symbol to the original symbol
*/
#define WRAP(f) __wrap_ ## f
#define REAL(f) __real_ ## f
diff --git a/ndk/sources/android/libportable/common/include/statfs_portable.h b/ndk/sources/android/libportable/common/include/statfs_portable.h
index 23451ea..6774696 100644
--- a/ndk/sources/android/libportable/common/include/statfs_portable.h
+++ b/ndk/sources/android/libportable/common/include/statfs_portable.h
@@ -28,10 +28,11 @@
uint64_t f_bavail;
uint64_t f_files;
uint64_t f_ffree;
- __kernel_fsid_t f_fsid;
+ __fsid_t f_fsid;
uint32_t f_namelen;
uint32_t f_frsize;
- uint32_t f_spare[5];
+ uint32_t f_flags;
+ uint32_t f_spare[4];
};
/*
@@ -46,9 +47,10 @@
uint64_t f_files;
uint64_t f_ffree;
uint64_t f_bavail;
- __kernel_fsid_t f_fsid;
+ __fsid_t f_fsid;
uint32_t f_namelen;
- uint32_t f_spare[6];
+ uint32_t f_flags;
+ uint32_t f_spare[5];
};
*/
#endif /* _STATFS_PORTABLE_H_ */
diff --git a/ndk/sources/android/ndk_helper/Android.mk b/ndk/sources/android/ndk_helper/Android.mk
new file mode 100644
index 0000000..e7134da
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/Android.mk
@@ -0,0 +1,16 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= ndk_helper
+LOCAL_SRC_FILES:= JNIHelper.cpp interpolator.cpp tapCamera.cpp gestureDetector.cpp perfMonitor.cpp vecmath.cpp GLContext.cpp shader.cpp gl3stub.c
+
+LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
+LOCAL_EXPORT_LDLIBS := -llog -landroid -lEGL -lGLESv2
+
+LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue
+
+include $(BUILD_STATIC_LIBRARY)
+
+#$(call import-module,android/native_app_glue)
+#$(call import-module,android/cpufeatures)
\ No newline at end of file
diff --git a/ndk/sources/android/ndk_helper/GLContext.cpp b/ndk/sources/android/ndk_helper/GLContext.cpp
new file mode 100644
index 0000000..edfdd6c
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/GLContext.cpp
@@ -0,0 +1,294 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// GLContext.cpp
+//--------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+// includes
+//--------------------------------------------------------------------------------
+#include <unistd.h>
+#include "GLContext.h"
+#include "gl3stub.h"
+
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// eGLContext
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+// Ctor
+//--------------------------------------------------------------------------------
+GLContext::GLContext() :
+ display_( EGL_NO_DISPLAY ),
+ surface_( EGL_NO_SURFACE ),
+ context_( EGL_NO_CONTEXT ),
+ screen_width_( 0 ),
+ screen_height_( 0 ),
+ es3_supported_( false ),
+ egl_context_initialized_( false ),
+ gles_initialized_( false )
+{
+}
+
+void GLContext::InitGLES()
+{
+ if( gles_initialized_ )
+ return;
+ //
+ //Initialize OpenGL ES 3 if available
+ //
+ const char* versionStr = (const char*) glGetString( GL_VERSION );
+ if( strstr( versionStr, "OpenGL ES 3." ) && gl3stubInit() )
+ {
+ es3_supported_ = true;
+ gl_version_ = 3.0f;
+ }
+ else
+ {
+ gl_version_ = 2.0f;
+ }
+
+ gles_initialized_ = true;
+}
+
+//--------------------------------------------------------------------------------
+// Dtor
+//--------------------------------------------------------------------------------
+GLContext::~GLContext()
+{
+ Terminate();
+}
+
+bool GLContext::Init( ANativeWindow* window )
+{
+ if( egl_context_initialized_ )
+ return true;
+
+ //
+ //Initialize EGL
+ //
+ window_ = window;
+ InitEGLSurface();
+ InitEGLContext();
+ InitGLES();
+
+ egl_context_initialized_ = true;
+
+ return true;
+}
+
+bool GLContext::InitEGLSurface()
+{
+ display_ = eglGetDisplay( EGL_DEFAULT_DISPLAY );
+ eglInitialize( display_, 0, 0 );
+
+ /*
+ * Here specify the attributes of the desired configuration.
+ * Below, we select an EGLConfig with at least 8 bits per color
+ * component compatible with on-screen windows
+ */
+ const EGLint attribs[] = { EGL_RENDERABLE_TYPE,
+ EGL_OPENGL_ES2_BIT, //Request opengl ES2.0
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8,
+ EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_NONE };
+ color_size_ = 8;
+ depth_size_ = 24;
+
+ EGLint num_configs;
+ eglChooseConfig( display_, attribs, &config_, 1, &num_configs );
+
+ if( !num_configs )
+ {
+ //Fall back to 16bit depth buffer
+ const EGLint attribs[] = { EGL_RENDERABLE_TYPE,
+ EGL_OPENGL_ES2_BIT, //Request opengl ES2.0
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8,
+ EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 16, EGL_NONE };
+ eglChooseConfig( display_, attribs, &config_, 1, &num_configs );
+ depth_size_ = 16;
+ }
+
+ if( !num_configs )
+ {
+ LOGW( "Unable to retrieve EGL config" );
+ return false;
+ }
+
+ surface_ = eglCreateWindowSurface( display_, config_, window_, NULL );
+ eglQuerySurface( display_, surface_, EGL_WIDTH, &screen_width_ );
+ eglQuerySurface( display_, surface_, EGL_HEIGHT, &screen_height_ );
+
+ /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
+ * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
+ * As soon as we picked a EGLConfig, we can safely reconfigure the
+ * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
+ EGLint format;
+ eglGetConfigAttrib( display_, config_, EGL_NATIVE_VISUAL_ID, &format );
+ ANativeWindow_setBuffersGeometry( window_, 0, 0, format );
+
+ return true;
+}
+
+bool GLContext::InitEGLContext()
+{
+ const EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, //Request opengl ES2.0
+ EGL_NONE };
+ context_ = eglCreateContext( display_, config_, NULL, context_attribs );
+
+ if( eglMakeCurrent( display_, surface_, surface_, context_ ) == EGL_FALSE )
+ {
+ LOGW( "Unable to eglMakeCurrent" );
+ return false;
+ }
+
+ context_valid_ = true;
+ return true;
+}
+
+EGLint GLContext::Swap()
+{
+ bool b = eglSwapBuffers( display_, surface_ );
+ if( !b )
+ {
+ EGLint err = eglGetError();
+ if( err == EGL_BAD_SURFACE )
+ {
+ //Recreate surface
+ InitEGLSurface();
+ return EGL_SUCCESS; //Still consider glContext is valid
+ }
+ else if( err == EGL_CONTEXT_LOST || err == EGL_BAD_CONTEXT )
+ {
+ //Context has been lost!!
+ context_valid_ = false;
+ Terminate();
+ InitEGLContext();
+ }
+ return err;
+ }
+ return EGL_SUCCESS;
+}
+
+void GLContext::Terminate()
+{
+ if( display_ != EGL_NO_DISPLAY )
+ {
+ eglMakeCurrent( display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
+ if( context_ != EGL_NO_CONTEXT )
+ {
+ eglDestroyContext( display_, context_ );
+ }
+
+ if( surface_ != EGL_NO_SURFACE )
+ {
+ eglDestroySurface( display_, surface_ );
+ }
+ eglTerminate( display_ );
+ }
+
+ display_ = EGL_NO_DISPLAY;
+ context_ = EGL_NO_CONTEXT;
+ surface_ = EGL_NO_SURFACE;
+ context_valid_ = false;
+
+}
+
+EGLint GLContext::Resume( ANativeWindow* window )
+{
+ if( egl_context_initialized_ == false )
+ {
+ Init( window );
+ return EGL_SUCCESS;
+ }
+
+ int32_t original_widhth = screen_width_;
+ int32_t original_height = screen_height_;
+
+ //Create surface
+ window_ = window;
+ surface_ = eglCreateWindowSurface( display_, config_, window_, NULL );
+ eglQuerySurface( display_, surface_, EGL_WIDTH, &screen_width_ );
+ eglQuerySurface( display_, surface_, EGL_HEIGHT, &screen_height_ );
+
+ if( screen_width_ != original_widhth || screen_height_ != original_height )
+ {
+ //Screen resized
+ LOGI( "Screen resized" );
+ }
+
+ if( eglMakeCurrent( display_, surface_, surface_, context_ ) == EGL_TRUE )
+ return EGL_SUCCESS;
+
+ EGLint err = eglGetError();
+ LOGW( "Unable to eglMakeCurrent %d", err );
+
+ if( err == EGL_CONTEXT_LOST )
+ {
+ //Recreate context
+ LOGI( "Re-creating egl context" );
+ InitEGLContext();
+ }
+ else
+ {
+ //Recreate surface
+ Terminate();
+ InitEGLSurface();
+ InitEGLContext();
+ }
+
+ return err;
+
+}
+
+void GLContext::Suspend()
+{
+ if( surface_ != EGL_NO_SURFACE )
+ {
+ eglDestroySurface( display_, surface_ );
+ surface_ = EGL_NO_SURFACE;
+ }
+}
+
+bool GLContext::Invalidate()
+{
+ Terminate();
+
+ egl_context_initialized_ = false;
+ return true;
+}
+
+bool GLContext::CheckExtension( const char* extension )
+{
+ if( extension == NULL )
+ return false;
+
+ std::string extensions = std::string( (char*) glGetString( GL_EXTENSIONS ) );
+ std::string str = std::string( extension );
+ str.append( " " );
+
+ size_t pos = 0;
+ if( extensions.find( extension, pos ) != std::string::npos )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/GLContext.h b/ndk/sources/android/ndk_helper/GLContext.h
new file mode 100644
index 0000000..cc0db46
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/GLContext.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// GLContext.h
+//--------------------------------------------------------------------------------
+#ifndef GLCONTEXT_H_
+#define GLCONTEXT_H_
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <android/log.h>
+
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// Constants
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+// Class
+//--------------------------------------------------------------------------------
+
+/******************************************************************
+ * OpenGL context handler
+ * The class handles OpenGL and EGL context based on Android activity life cycle
+ * The caller needs to call corresponding methods for each activity life cycle events as it's done in sample codes.
+ *
+ * Also the class initializes OpenGL ES3 when the compatible driver is installed in the device.
+ * getGLVersion() returns 3.0~ when the device supports OpenGLES3.0
+ *
+ * Thread safety: OpenGL context is expecting used within dedicated single thread,
+ * thus GLContext class is not designed as a thread-safe
+ */
+class GLContext
+{
+private:
+ //EGL configurations
+ ANativeWindow* window_;
+ EGLDisplay display_;
+ EGLSurface surface_;
+ EGLContext context_;
+ EGLConfig config_;
+
+ //Screen parameters
+ int32_t screen_width_;
+ int32_t screen_height_;
+ int32_t color_size_;
+ int32_t depth_size_;
+
+ //Flags
+ bool gles_initialized_;
+ bool egl_context_initialized_;
+ bool es3_supported_;
+ float gl_version_;
+ bool context_valid_;
+
+ void InitGLES();
+ void Terminate();
+ bool InitEGLSurface();
+ bool InitEGLContext();
+
+ GLContext( GLContext const& );
+ void operator=( GLContext const& );
+ GLContext();
+ virtual ~GLContext();
+public:
+ static GLContext* GetInstance()
+ {
+ //Singleton
+ static GLContext instance;
+
+ return &instance;
+ }
+
+ bool Init( ANativeWindow* window );
+ EGLint Swap();
+ bool Invalidate();
+
+ void Suspend();
+ EGLint Resume( ANativeWindow* window );
+
+ int32_t GetScreenWidth()
+ {
+ return screen_width_;
+ }
+ int32_t GetScreenHeight()
+ {
+ return screen_height_;
+ }
+
+ int32_t GetBufferColorSize()
+ {
+ return color_size_;
+ }
+ int32_t GetBufferDepthSize()
+ {
+ return depth_size_;
+ }
+ float GetGLVersion()
+ {
+ return gl_version_;
+ }
+ bool CheckExtension( const char* extension );
+};
+
+} //namespace ndkHelper
+
+#endif /* GLCONTEXT_H_ */
diff --git a/ndk/sources/android/ndk_helper/JNIHelper.cpp b/ndk/sources/android/ndk_helper/JNIHelper.cpp
new file mode 100644
index 0000000..e06520a
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/JNIHelper.cpp
@@ -0,0 +1,376 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <fstream>
+#include <iostream>
+
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+#define CLASS_NAME "android/app/NativeActivity"
+
+//---------------------------------------------------------------------------
+//JNI Helper functions
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+//Singleton
+//---------------------------------------------------------------------------
+JNIHelper* JNIHelper::GetInstance()
+{
+ static JNIHelper helper;
+ return &helper;
+}
+
+//---------------------------------------------------------------------------
+//Ctor
+//---------------------------------------------------------------------------
+JNIHelper::JNIHelper()
+{
+ pthread_mutex_init( &mutex_, NULL );
+}
+
+//---------------------------------------------------------------------------
+//Dtor
+//---------------------------------------------------------------------------
+JNIHelper::~JNIHelper()
+{
+ pthread_mutex_lock( &mutex_ );
+
+ JNIEnv *env;
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ env->DeleteGlobalRef( jni_helper_java_ref_ );
+ env->DeleteGlobalRef( jni_helper_java_class_ );
+
+ activity_->vm->DetachCurrentThread();
+
+ pthread_mutex_destroy( &mutex_ );
+}
+
+//---------------------------------------------------------------------------
+//Init
+//---------------------------------------------------------------------------
+void JNIHelper::Init( ANativeActivity* activity,
+ const char* helper_class_name )
+{
+ JNIHelper& helper = *GetInstance();
+ pthread_mutex_lock( &helper.mutex_ );
+
+ helper.activity_ = activity;
+
+ JNIEnv *env;
+ helper.activity_->vm->AttachCurrentThread( &env, NULL );
+
+ //Retrieve app name
+ jclass android_content_Context = env->GetObjectClass( helper.activity_->clazz );
+ jmethodID midGetPackageName = env->GetMethodID( android_content_Context, "getPackageName",
+ "()Ljava/lang/String;" );
+
+ jstring packageName = (jstring) env->CallObjectMethod( helper.activity_->clazz,
+ midGetPackageName );
+ const char* appname = env->GetStringUTFChars( packageName, NULL );
+ helper.app_name_ = std::string( appname );
+
+ jclass cls = helper.RetrieveClass( env, helper_class_name );
+ helper.jni_helper_java_class_ = (jclass) env->NewGlobalRef( cls );
+
+ jmethodID constructor = env->GetMethodID( helper.jni_helper_java_class_, "<init>", "()V" );
+ helper.jni_helper_java_ref_ = env->NewObject( helper.jni_helper_java_class_, constructor );
+ helper.jni_helper_java_ref_ = env->NewGlobalRef( helper.jni_helper_java_ref_ );
+
+ env->ReleaseStringUTFChars( packageName, appname );
+ helper.activity_->vm->DetachCurrentThread();
+
+ pthread_mutex_unlock( &helper.mutex_ );
+}
+
+//---------------------------------------------------------------------------
+//readFile
+//---------------------------------------------------------------------------
+bool JNIHelper::ReadFile( const char* fileName,
+ std::vector<uint8_t>* buffer_ref )
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized.Call init() to initialize the helper" );
+ return false;
+ }
+
+ //First, try reading from externalFileDir;
+ JNIEnv *env;
+ jmethodID mid;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ jstring str_path = GetExternalFilesDirJString( env );
+ const char* path = env->GetStringUTFChars( str_path, NULL );
+ std::string s( path );
+
+ if( fileName[0] != '/' )
+ {
+ s.append( "/" );
+ }
+ s.append( fileName );
+ std::ifstream f( s.c_str(), std::ios::binary );
+
+ env->DeleteLocalRef( str_path );
+ env->ReleaseStringUTFChars( str_path, path );
+ activity_->vm->DetachCurrentThread();
+
+ if( f )
+ {
+ LOGI( "reading:%s", s.c_str() );
+ f.seekg( 0, std::ifstream::end );
+ int32_t fileSize = f.tellg();
+ f.seekg( 0, std::ifstream::beg );
+ buffer_ref->reserve( fileSize );
+ buffer_ref->assign( std::istreambuf_iterator<char>( f ), std::istreambuf_iterator<char>() );
+ f.close();
+ pthread_mutex_unlock( &mutex_ );
+ return true;
+ }
+ else
+ {
+ //Fallback to assetManager
+ AAssetManager* assetManager = activity_->assetManager;
+ AAsset* assetFile = AAssetManager_open( assetManager, fileName, AASSET_MODE_BUFFER );
+ if( !assetFile )
+ {
+ pthread_mutex_unlock( &mutex_ );
+ return false;
+ }
+ uint8_t* data = (uint8_t*) AAsset_getBuffer( assetFile );
+ int32_t size = AAsset_getLength( assetFile );
+ if( data == NULL )
+ {
+ AAsset_close( assetFile );
+
+ LOGI( "Failed to load:%s", fileName );
+ pthread_mutex_unlock( &mutex_ );
+ return false;
+ }
+
+ buffer_ref->reserve( size );
+ buffer_ref->assign( data, data + size );
+
+ AAsset_close( assetFile );
+ pthread_mutex_unlock( &mutex_ );
+ return true;
+ }
+}
+
+std::string JNIHelper::GetExternalFilesDir()
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return std::string( "" );
+ }
+
+ pthread_mutex_lock( &mutex_ );
+
+ //First, try reading from externalFileDir;
+ JNIEnv *env;
+ jmethodID mid;
+
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ jstring strPath = GetExternalFilesDirJString( env );
+ const char* path = env->GetStringUTFChars( strPath, NULL );
+ std::string s( path );
+
+ env->DeleteLocalRef( strPath );
+ env->ReleaseStringUTFChars( strPath, path );
+ activity_->vm->DetachCurrentThread();
+
+ pthread_mutex_unlock( &mutex_ );
+ return s;
+}
+
+uint32_t JNIHelper::LoadTexture( const char* file_name )
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return 0;
+ }
+
+ JNIEnv *env;
+ jmethodID mid;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ jstring name = env->NewStringUTF( file_name );
+
+ GLuint tex;
+ glGenTextures( 1, &tex );
+ glBindTexture( GL_TEXTURE_2D, tex );
+
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+
+ mid = env->GetMethodID( jni_helper_java_class_, "loadTexture", "(Ljava/lang/String;)Z" );
+ jboolean ret = env->CallBooleanMethod( jni_helper_java_ref_, mid, name );
+ if( !ret )
+ {
+ glDeleteTextures( 1, &tex );
+ tex = -1;
+ LOGI( "Texture load failed %s", file_name );
+ }
+
+ //Generate mipmap
+ glGenerateMipmap( GL_TEXTURE_2D );
+
+ env->DeleteLocalRef( name );
+ activity_->vm->DetachCurrentThread();
+ pthread_mutex_unlock( &mutex_ );
+
+ return tex;
+
+}
+
+std::string JNIHelper::ConvertString( const char* str,
+ const char* encode )
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return std::string( "" );
+ }
+
+ JNIEnv *env;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ int32_t iLength = strlen( (const char*) str );
+
+ jbyteArray array = env->NewByteArray( iLength );
+ env->SetByteArrayRegion( array, 0, iLength, (const signed char*) str );
+
+ jstring strEncode = env->NewStringUTF( encode );
+
+ jclass cls = env->FindClass( "java/lang/String" );
+ jmethodID ctor = env->GetMethodID( cls, "<init>", "([BLjava/lang/String;)V" );
+ jstring object = (jstring) env->NewObject( cls, ctor, array, strEncode );
+
+ const char *cparam = env->GetStringUTFChars( object, NULL );
+
+ std::string s = std::string( cparam );
+
+ env->DeleteLocalRef( strEncode );
+ env->DeleteLocalRef( object );
+ env->ReleaseStringUTFChars( object, cparam );
+ activity_->vm->DetachCurrentThread();
+ pthread_mutex_unlock( &mutex_ );
+
+ return s;
+}
+
+//---------------------------------------------------------------------------
+//Audio helpers
+//---------------------------------------------------------------------------
+int32_t JNIHelper::GetNativeAudioBufferSize()
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return 0;
+ }
+
+ JNIEnv *env;
+ jmethodID mid;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ mid = env->GetMethodID( jni_helper_java_class_, "getNativeAudioBufferSize", "()I" );
+ int32_t i = env->CallIntMethod( jni_helper_java_ref_, mid );
+ activity_->vm->DetachCurrentThread();
+ pthread_mutex_unlock( &mutex_ );
+
+ return i;
+}
+
+int32_t JNIHelper::GetNativeAudioSampleRate()
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return 0;
+ }
+
+ JNIEnv *env;
+ jmethodID mid;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ mid = env->GetMethodID( jni_helper_java_class_, "getNativeAudioSampleRate", "()I" );
+ int32_t i = env->CallIntMethod( jni_helper_java_ref_, mid );
+ activity_->vm->DetachCurrentThread();
+ pthread_mutex_unlock( &mutex_ );
+
+ return i;
+}
+
+//---------------------------------------------------------------------------
+//Misc implementations
+//---------------------------------------------------------------------------
+jclass JNIHelper::RetrieveClass( JNIEnv *jni,
+ const char* class_name )
+{
+ jclass activity_class = jni->FindClass( CLASS_NAME );
+ jmethodID get_class_loader = jni->GetMethodID( activity_class, "getClassLoader",
+ "()Ljava/lang/ClassLoader;" );
+ jobject cls = jni->CallObjectMethod( activity_->clazz, get_class_loader );
+ jclass class_loader = jni->FindClass( "java/lang/ClassLoader" );
+ jmethodID find_class = jni->GetMethodID( class_loader, "loadClass",
+ "(Ljava/lang/String;)Ljava/lang/Class;" );
+
+ jstring str_class_name = jni->NewStringUTF( class_name );
+ jclass class_retrieved = (jclass) jni->CallObjectMethod( cls, find_class, str_class_name );
+ jni->DeleteLocalRef( str_class_name );
+ return class_retrieved;
+}
+
+jstring JNIHelper::GetExternalFilesDirJString( JNIEnv *env )
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return NULL;
+ }
+
+ // Invoking getExternalFilesDir() java API
+ jclass cls_Env = env->FindClass( CLASS_NAME );
+ jmethodID mid = env->GetMethodID( cls_Env, "getExternalFilesDir",
+ "(Ljava/lang/String;)Ljava/io/File;" );
+ jobject obj_File = env->CallObjectMethod( activity_->clazz, mid, NULL );
+ jclass cls_File = env->FindClass( "java/io/File" );
+ jmethodID mid_getPath = env->GetMethodID( cls_File, "getPath", "()Ljava/lang/String;" );
+ jstring obj_Path = (jstring) env->CallObjectMethod( obj_File, mid_getPath );
+
+ return obj_Path;
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/JNIHelper.h b/ndk/sources/android/ndk_helper/JNIHelper.h
new file mode 100644
index 0000000..7a77d76
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/JNIHelper.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include <jni.h>
+#include <vector>
+#include <string>
+
+#include <android/log.h>
+#include <android_native_app_glue.h>
+
+#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Helper functions for JNI calls
+ * This class wraps JNI calls and provides handy interface calling commonly used features
+ * in Java SDK.
+ * Such as
+ * - loading graphics files (e.g. PNG, JPG)
+ * - character code conversion
+ * - retrieving system properties which only supported in Java SDK
+ *
+ * NOTE: To use this class, add NDKHelper.java as a corresponding helpers in Java code
+ */
+class JNIHelper
+{
+private:
+ std::string app_name_;
+
+ ANativeActivity* activity_;
+ jobject jni_helper_java_ref_;
+ jclass jni_helper_java_class_;
+
+ //mutex for synchronization
+ //This class uses singleton pattern and can be invoked from multiple threads,
+ //each methods locks the mutex for a thread safety
+ mutable pthread_mutex_t mutex_;
+
+ jstring GetExternalFilesDirJString( JNIEnv *env );
+ jclass RetrieveClass( JNIEnv *jni,
+ const char* class_name );
+
+ JNIHelper();
+ ~JNIHelper();
+ JNIHelper( const JNIHelper& rhs );
+ JNIHelper& operator=( const JNIHelper& rhs );
+
+public:
+ /*
+ * To load your own Java classes, JNIHelper requires to be initialized with a ANativeActivity handle.
+ * This methods need to be called before any call to the helper class.
+ * Static member of the class
+ *
+ * arguments:
+ * in: activity, pointer to ANativeActivity. Used internally to set up JNI environment
+ * in: helper_class_name, pointer to Java side helper class name. (e.g. "com/sample/helper/NDKHelper" in samples )
+ */
+ static void Init( ANativeActivity* activity,
+ const char* helper_class_name );
+
+ /*
+ * Retrieve the singleton object of the helper.
+ * Static member of the class
+
+ * Methods in the class are designed as thread safe.
+ */
+ static JNIHelper* GetInstance();
+
+ /*
+ * Read a file from a strorage.
+ * First, the method tries to read the file from an external storage.
+ * If it fails to read, it falls back to use assset manager and try to read the file from APK asset.
+ *
+ * arguments:
+ * in: file_name, file name to read
+ * out: buffer_ref, pointer to a vector buffer to read a file.
+ * when the call succeeded, the buffer includes contents of specified file
+ * when the call failed, contents of the buffer remains same
+ * return:
+ * true when file read succeeded
+ * false when it failed to read the file
+ */
+ bool ReadFile( const char* file_name,
+ std::vector<uint8_t>* buffer_ref );
+
+ /*
+ * Load and create OpenGL texture from given file name.
+ * The method invokes BitmapFactory in Java so it can read jpeg/png formatted files
+ *
+ * The methods creates mip-map and set texture parameters like this,
+ * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+ * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ * glGenerateMipmap( GL_TEXTURE_2D );
+ *
+ * arguments:
+ * in: file_name, file name to read, PNG&JPG is supported
+ * return:
+ * OpenGL texture name when the call succeeded
+ * When it failed to load the texture, it returns -1
+ */
+ uint32_t LoadTexture( const char* file_name );
+
+ /*
+ * Convert string from character code other than UTF-8
+ *
+ * arguments:
+ * in: str, pointer to a string which is encoded other than UTF-8
+ * in: encoding, pointer to a character encoding string.
+ * The encoding string can be any valid java.nio.charset.Charset name
+ * e.g. "UTF-16", "Shift_JIS"
+ * return: converted input string as an UTF-8 std::string
+ */
+ std::string ConvertString( const char* str,
+ const char* encode );
+ /*
+ * Retrieve external file directory through JNI call
+ *
+ * return: std::string containing external file diretory
+ */
+ std::string GetExternalFilesDir();
+
+ /*
+ * Audio helper
+ * Retrieves native audio buffer size which is required to achieve low latency audio
+ *
+ * return: Native audio buffer size which is a hint to achieve low latency audio
+ * If the API is not supported (API level < 17), it returns 0
+ */
+ int32_t GetNativeAudioBufferSize();
+
+ /*
+ * Audio helper
+ * Retrieves native audio sample rate which is required to achieve low latency audio
+ *
+ * return: Native audio sample rate which is a hint to achieve low latency audio
+ */
+ int32_t GetNativeAudioSampleRate();
+
+ /*
+ * Retrieves application bundle name
+ *
+ * return: pointer to an app name string
+ *
+ */
+ const char* GetAppName()
+ {
+ return app_name_.c_str();
+ }
+
+};
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/NDKHelper.h b/ndk/sources/android/ndk_helper/NDKHelper.h
new file mode 100644
index 0000000..de2a10e
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/NDKHelper.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef _NDKSUPPORT_H
+#define _NDKSUPPORT_H
+
+/******************************************************************
+ * NDK support helpers
+ * Utility module to provide misc functionalities that is used widely in native applications,
+ * such as gesture detection, jni bridge, openGL context etc.
+ *
+ * The purpose of this module is,
+ * - Provide best practices using NDK
+ * - Provide handy utility functions for NDK development
+ * - Make NDK samples more simpler and readable
+ */
+#include "gl3stub.h" //GLES3 stubs
+#include "GLContext.h" //EGL & OpenGL manager
+#include "shader.h" //Shader compiler support
+#include "vecmath.h" //Vector math support, C++ implementation n current version
+#include "tapCamera.h" //Tap/Pinch camera control
+#include "JNIHelper.h" //JNI support
+#include "gestureDetector.h" //Tap/Doubletap/Pinch detector
+#include "perfMonitor.h" //FPS counter
+#include "interpolator.h" //Interpolator
+#endif
diff --git a/ndk/sources/android/ndk_helper/gestureDetector.cpp b/ndk/sources/android/ndk_helper/gestureDetector.cpp
new file mode 100644
index 0000000..19d8212
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gestureDetector.cpp
@@ -0,0 +1,350 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#include "gestureDetector.h"
+
+//--------------------------------------------------------------------------------
+// gestureDetector.cpp
+//--------------------------------------------------------------------------------
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// includes
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+// GestureDetector
+//--------------------------------------------------------------------------------
+GestureDetector::GestureDetector()
+{
+ dp_factor_ = 1.f;
+}
+
+void GestureDetector::SetConfiguration( AConfiguration* config )
+{
+ dp_factor_ = 160.f / AConfiguration_getDensity( config );
+}
+
+//--------------------------------------------------------------------------------
+// TapDetector
+//--------------------------------------------------------------------------------
+GESTURE_STATE TapDetector::Detect( const AInputEvent* motion_event )
+{
+ if( AMotionEvent_getPointerCount( motion_event ) > 1 )
+ {
+ //Only support single touch
+ return false;
+ }
+
+ int32_t action = AMotionEvent_getAction( motion_event );
+ unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
+ switch( flags )
+ {
+ case AMOTION_EVENT_ACTION_DOWN:
+ down_pointer_id_ = AMotionEvent_getPointerId( motion_event, 0 );
+ down_x_ = AMotionEvent_getX( motion_event, 0 );
+ down_y_ = AMotionEvent_getY( motion_event, 0 );
+ break;
+ case AMOTION_EVENT_ACTION_UP:
+ {
+ int64_t eventTime = AMotionEvent_getEventTime( motion_event );
+ int64_t downTime = AMotionEvent_getDownTime( motion_event );
+ if( eventTime - downTime <= TAP_TIMEOUT )
+ {
+ if( down_pointer_id_ == AMotionEvent_getPointerId( motion_event, 0 ) )
+ {
+ float x = AMotionEvent_getX( motion_event, 0 ) - down_x_;
+ float y = AMotionEvent_getY( motion_event, 0 ) - down_y_;
+ if( x * x + y * y < TOUCH_SLOP * TOUCH_SLOP * dp_factor_ )
+ {
+ LOGI( "TapDetector: Tap detected" );
+ return GESTURE_STATE_ACTION;
+ }
+ }
+ }
+ break;
+ }
+ }
+ return GESTURE_STATE_NONE;
+}
+
+//--------------------------------------------------------------------------------
+// DoubletapDetector
+//--------------------------------------------------------------------------------
+GESTURE_STATE DoubletapDetector::Detect( const AInputEvent* motion_event )
+{
+ if( AMotionEvent_getPointerCount( motion_event ) > 1 )
+ {
+ //Only support single double tap
+ return false;
+ }
+
+ bool tap_detected = tap_detector_.Detect( motion_event );
+
+ int32_t action = AMotionEvent_getAction( motion_event );
+ unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
+ switch( flags )
+ {
+ case AMOTION_EVENT_ACTION_DOWN:
+ {
+ int64_t eventTime = AMotionEvent_getEventTime( motion_event );
+ if( eventTime - last_tap_time_ <= DOUBLE_TAP_TIMEOUT )
+ {
+ float x = AMotionEvent_getX( motion_event, 0 ) - last_tap_x_;
+ float y = AMotionEvent_getY( motion_event, 0 ) - last_tap_y_;
+ if( x * x + y * y < DOUBLE_TAP_SLOP * DOUBLE_TAP_SLOP * dp_factor_ )
+ {
+ LOGI( "DoubletapDetector: Doubletap detected" );
+ return GESTURE_STATE_ACTION;
+ }
+ }
+ break;
+ }
+ case AMOTION_EVENT_ACTION_UP:
+ if( tap_detected )
+ {
+ last_tap_time_ = AMotionEvent_getEventTime( motion_event );
+ last_tap_x_ = AMotionEvent_getX( motion_event, 0 );
+ last_tap_y_ = AMotionEvent_getY( motion_event, 0 );
+ }
+ break;
+ }
+ return GESTURE_STATE_NONE;
+}
+
+void DoubletapDetector::SetConfiguration( AConfiguration* config )
+{
+ dp_factor_ = 160.f / AConfiguration_getDensity( config );
+ tap_detector_.SetConfiguration( config );
+}
+
+//--------------------------------------------------------------------------------
+// PinchDetector
+//--------------------------------------------------------------------------------
+
+int32_t PinchDetector::FindIndex( const AInputEvent* event, int32_t id )
+{
+ int32_t count = AMotionEvent_getPointerCount( event );
+ for( uint32_t i = 0; i < count; ++i )
+ {
+ if( id == AMotionEvent_getPointerId( event, i ) )
+ return i;
+ }
+ return -1;
+}
+
+GESTURE_STATE PinchDetector::Detect( const AInputEvent* event )
+{
+ GESTURE_STATE ret = GESTURE_STATE_NONE;
+ int32_t action = AMotionEvent_getAction( event );
+ uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;
+ event_ = event;
+
+ int32_t count = AMotionEvent_getPointerCount( event );
+ switch( flags )
+ {
+ case AMOTION_EVENT_ACTION_DOWN:
+ vec_pointers_.push_back( AMotionEvent_getPointerId( event, 0 ) );
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_DOWN:
+ {
+ int32_t iIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+ >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+ vec_pointers_.push_back( AMotionEvent_getPointerId( event, iIndex ) );
+ if( count == 2 )
+ {
+ //Start new pinch
+ ret = GESTURE_STATE_START;
+ }
+ }
+ break;
+ case AMOTION_EVENT_ACTION_UP:
+ vec_pointers_.pop_back();
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_UP:
+ {
+ int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+ >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+ int32_t released_pointer_id = AMotionEvent_getPointerId( event, index );
+
+ std::vector<int32_t>::iterator it = vec_pointers_.begin();
+ std::vector<int32_t>::iterator it_end = vec_pointers_.end();
+ int32_t i = 0;
+ for( ; it != it_end; ++it, ++i )
+ {
+ if( *it == released_pointer_id )
+ {
+ vec_pointers_.erase( it );
+ break;
+ }
+ }
+
+ if( i <= 1 )
+ {
+ //Reset pinch or drag
+ if( count != 2 )
+ {
+ //Start new pinch
+ ret = GESTURE_STATE_START | GESTURE_STATE_END;
+ }
+ }
+ }
+ break;
+ case AMOTION_EVENT_ACTION_MOVE:
+ switch( count )
+ {
+ case 1:
+ break;
+ default:
+ //Multi touch
+ ret = GESTURE_STATE_MOVE;
+ break;
+ }
+ break;
+ case AMOTION_EVENT_ACTION_CANCEL:
+ break;
+ }
+
+ return ret;
+}
+
+bool PinchDetector::GetPointers( Vec2& v1, Vec2& v2 )
+{
+ if( vec_pointers_.size() < 2 )
+ return false;
+
+ int32_t index = FindIndex( event_, vec_pointers_[0] );
+ if( index == -1 )
+ return false;
+
+ float x = AMotionEvent_getX( event_, index );
+ float y = AMotionEvent_getY( event_, index );
+
+ index = FindIndex( event_, vec_pointers_[1] );
+ if( index == -1 )
+ return false;
+
+ float x2 = AMotionEvent_getX( event_, index );
+ float y2 = AMotionEvent_getY( event_, index );
+
+ v1 = Vec2( x, y );
+ v2 = Vec2( x2, y2 );
+
+ return true;
+}
+
+//--------------------------------------------------------------------------------
+// DragDetector
+//--------------------------------------------------------------------------------
+
+int32_t DragDetector::FindIndex( const AInputEvent* event, int32_t id )
+{
+ int32_t count = AMotionEvent_getPointerCount( event );
+ for( uint32_t i = 0; i < count; ++i )
+ {
+ if( id == AMotionEvent_getPointerId( event, i ) )
+ return i;
+ }
+ return -1;
+}
+
+GESTURE_STATE DragDetector::Detect( const AInputEvent* event )
+{
+ GESTURE_STATE ret = GESTURE_STATE_NONE;
+ int32_t action = AMotionEvent_getAction( event );
+ int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+ >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+ uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;
+ event_ = event;
+
+ int32_t count = AMotionEvent_getPointerCount( event );
+ switch( flags )
+ {
+ case AMOTION_EVENT_ACTION_DOWN:
+ vec_pointers_.push_back( AMotionEvent_getPointerId( event, 0 ) );
+ ret = GESTURE_STATE_START;
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_DOWN:
+ vec_pointers_.push_back( AMotionEvent_getPointerId( event, index ) );
+ break;
+ case AMOTION_EVENT_ACTION_UP:
+ vec_pointers_.pop_back();
+ ret = GESTURE_STATE_END;
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_UP:
+ {
+ int32_t released_pointer_id = AMotionEvent_getPointerId( event, index );
+
+ std::vector<int32_t>::iterator it = vec_pointers_.begin();
+ std::vector<int32_t>::iterator it_end = vec_pointers_.end();
+ int32_t i = 0;
+ for( ; it != it_end; ++it, ++i )
+ {
+ if( *it == released_pointer_id )
+ {
+ vec_pointers_.erase( it );
+ break;
+ }
+ }
+
+ if( i <= 1 )
+ {
+ //Reset pinch or drag
+ if( count == 2 )
+ {
+ ret = GESTURE_STATE_START;
+ }
+ }
+ break;
+ }
+ case AMOTION_EVENT_ACTION_MOVE:
+ switch( count )
+ {
+ case 1:
+ //Drag
+ ret = GESTURE_STATE_MOVE;
+ break;
+ default:
+ break;
+ }
+ break;
+ case AMOTION_EVENT_ACTION_CANCEL:
+ break;
+ }
+
+ return ret;
+}
+
+bool DragDetector::GetPointer( Vec2& v )
+{
+ if( vec_pointers_.size() < 1 )
+ return false;
+
+ int32_t iIndex = FindIndex( event_, vec_pointers_[0] );
+ if( iIndex == -1 )
+ return false;
+
+ float x = AMotionEvent_getX( event_, iIndex );
+ float y = AMotionEvent_getY( event_, iIndex );
+
+ v = Vec2( x, y );
+
+ return true;
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/gestureDetector.h b/ndk/sources/android/ndk_helper/gestureDetector.h
new file mode 100644
index 0000000..6ae5d80
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gestureDetector.h
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//--------------------------------------------------------------------------------
+// gestureDetector.h
+//--------------------------------------------------------------------------------
+#ifndef GESTUREDETECTOR_H_
+#define GESTUREDETECTOR_H_
+
+#include <vector>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include "JNIHelper.h"
+#include "vecmath.h"
+
+namespace ndk_helper
+{
+//--------------------------------------------------------------------------------
+// Constants
+//--------------------------------------------------------------------------------
+const int32_t DOUBLE_TAP_TIMEOUT = 300 * 1000000;
+const int32_t TAP_TIMEOUT = 180 * 1000000;
+const int32_t DOUBLE_TAP_SLOP = 100;
+const int32_t TOUCH_SLOP = 8;
+
+enum
+{
+ GESTURE_STATE_NONE = 0,
+ GESTURE_STATE_START = 1,
+ GESTURE_STATE_MOVE = 2,
+ GESTURE_STATE_END = 4,
+ GESTURE_STATE_ACTION = (GESTURE_STATE_START | GESTURE_STATE_END),
+};
+typedef int32_t GESTURE_STATE;
+
+/******************************************************************
+ * Base class of Gesture Detectors
+ * GestureDetectors handles input events and detect gestures
+ * Note that different detectors may detect gestures with an event at
+ * same time. The caller needs to manage gesture priority accordingly
+ *
+ */
+class GestureDetector
+{
+protected:
+ float dp_factor_;
+public:
+ GestureDetector();
+ virtual ~GestureDetector()
+ {
+ }
+ virtual void SetConfiguration( AConfiguration* config );
+
+ virtual GESTURE_STATE Detect( const AInputEvent* motion_event ) = 0;
+};
+
+/******************************************************************
+ * Tap gesture detector
+ * Returns GESTURE_STATE_ACTION when a tap gesture is detected
+ *
+ */
+class TapDetector: public GestureDetector
+{
+private:
+ int32_t down_pointer_id_;
+ float down_x_;
+ float down_y_;
+public:
+ TapDetector()
+ {
+ }
+ virtual ~TapDetector()
+ {
+ }
+ virtual GESTURE_STATE Detect( const AInputEvent* motion_event );
+};
+
+/******************************************************************
+ * Pinch gesture detector
+ * Returns GESTURE_STATE_ACTION when a double-tap gesture is detected
+ *
+ */
+class DoubletapDetector: public GestureDetector
+{
+private:
+ TapDetector tap_detector_;
+ int64_t last_tap_time_;
+ float last_tap_x_;
+ float last_tap_y_;
+
+public:
+ DoubletapDetector()
+ {
+ }
+ virtual ~DoubletapDetector()
+ {
+ }
+ virtual GESTURE_STATE Detect( const AInputEvent* motion_event );
+ virtual void SetConfiguration( AConfiguration* config );
+};
+
+/******************************************************************
+ * Double gesture detector
+ * Returns pinch gesture state when a pinch gesture is detected
+ * The class handles multiple touches more than 2
+ * When the finger 1,2,3 are tapped and then finger 1 is released,
+ * the detector start new pinch gesture with finger 2 & 3.
+ */
+class PinchDetector: public GestureDetector
+{
+private:
+ int32_t FindIndex( const AInputEvent* event, int32_t id );
+ const AInputEvent* event_;
+ std::vector<int32_t> vec_pointers_;
+
+public:
+ PinchDetector()
+ {
+ }
+ virtual ~PinchDetector()
+ {
+ }
+ virtual GESTURE_STATE Detect( const AInputEvent* event );
+ bool GetPointers( Vec2& v1, Vec2& v2 );
+};
+
+/******************************************************************
+ * Drag gesture detector
+ * Returns drag gesture state when a drag-tap gesture is detected
+ *
+ */
+class DragDetector: public GestureDetector
+{
+private:
+ int32_t FindIndex( const AInputEvent* event, int32_t id );
+ const AInputEvent* event_;
+ std::vector<int32_t> vec_pointers_;
+public:
+ DragDetector()
+ {
+ }
+ virtual ~DragDetector()
+ {
+ }
+ virtual GESTURE_STATE Detect( const AInputEvent* event );
+ bool GetPointer( Vec2& v );
+};
+
+} //namespace ndkHelper
+#endif /* GESTUREDETECTOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/gl3stub.c b/ndk/sources/android/ndk_helper/gl3stub.c
new file mode 100644
index 0000000..c34d791
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gl3stub.c
@@ -0,0 +1,512 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#include <EGL/egl.h>
+#include "gl3stub.h"
+
+GLboolean gl3stubInit()
+{
+#define FIND_PROC(s) s = (void*)eglGetProcAddress(#s);
+ FIND_PROC( glReadBuffer );
+ FIND_PROC( glDrawRangeElements );
+ FIND_PROC( glTexImage3D );
+ FIND_PROC( glTexSubImage3D );
+ FIND_PROC( glCopyTexSubImage3D );
+ FIND_PROC( glCompressedTexImage3D );
+ FIND_PROC( glCompressedTexSubImage3D );
+ FIND_PROC( glGenQueries );
+ FIND_PROC( glDeleteQueries );
+ FIND_PROC( glIsQuery );
+ FIND_PROC( glBeginQuery );
+ FIND_PROC( glEndQuery );
+ FIND_PROC( glGetQueryiv );
+ FIND_PROC( glGetQueryObjectuiv );
+ FIND_PROC( glUnmapBuffer );
+ FIND_PROC( glGetBufferPointerv );
+ FIND_PROC( glDrawBuffers );
+ FIND_PROC( glUniformMatrix2x3fv );
+ FIND_PROC( glUniformMatrix3x2fv );
+ FIND_PROC( glUniformMatrix2x4fv );
+ FIND_PROC( glUniformMatrix4x2fv );
+ FIND_PROC( glUniformMatrix3x4fv );
+ FIND_PROC( glUniformMatrix4x3fv );
+ FIND_PROC( glBlitFramebuffer );
+ FIND_PROC( glRenderbufferStorageMultisample );
+ FIND_PROC( glFramebufferTextureLayer );
+ FIND_PROC( glMapBufferRange );
+ FIND_PROC( glFlushMappedBufferRange );
+ FIND_PROC( glBindVertexArray );
+ FIND_PROC( glDeleteVertexArrays );
+ FIND_PROC( glGenVertexArrays );
+ FIND_PROC( glIsVertexArray );
+ FIND_PROC( glGetIntegeri_v );
+ FIND_PROC( glBeginTransformFeedback );
+ FIND_PROC( glEndTransformFeedback );
+ FIND_PROC( glBindBufferRange );
+ FIND_PROC( glBindBufferBase );
+ FIND_PROC( glTransformFeedbackVaryings );
+ FIND_PROC( glGetTransformFeedbackVarying );
+ FIND_PROC( glVertexAttribIPointer );
+ FIND_PROC( glGetVertexAttribIiv );
+ FIND_PROC( glGetVertexAttribIuiv );
+ FIND_PROC( glVertexAttribI4i );
+ FIND_PROC( glVertexAttribI4ui );
+ FIND_PROC( glVertexAttribI4iv );
+ FIND_PROC( glVertexAttribI4uiv );
+ FIND_PROC( glGetUniformuiv );
+ FIND_PROC( glGetFragDataLocation );
+ FIND_PROC( glUniform1ui );
+ FIND_PROC( glUniform2ui );
+ FIND_PROC( glUniform3ui );
+ FIND_PROC( glUniform4ui );
+ FIND_PROC( glUniform1uiv );
+ FIND_PROC( glUniform2uiv );
+ FIND_PROC( glUniform3uiv );
+ FIND_PROC( glUniform4uiv );
+ FIND_PROC( glClearBufferiv );
+ FIND_PROC( glClearBufferuiv );
+ FIND_PROC( glClearBufferfv );
+ FIND_PROC( glClearBufferfi );
+ FIND_PROC( glGetStringi );
+ FIND_PROC( glCopyBufferSubData );
+ FIND_PROC( glGetUniformIndices );
+ FIND_PROC( glGetActiveUniformsiv );
+ FIND_PROC( glGetUniformBlockIndex );
+ FIND_PROC( glGetActiveUniformBlockiv );
+ FIND_PROC( glGetActiveUniformBlockName );
+ FIND_PROC( glUniformBlockBinding );
+ FIND_PROC( glDrawArraysInstanced );
+ FIND_PROC( glDrawElementsInstanced );
+ FIND_PROC( glFenceSync );
+ FIND_PROC( glIsSync );
+ FIND_PROC( glDeleteSync );
+ FIND_PROC( glClientWaitSync );
+ FIND_PROC( glWaitSync );
+ FIND_PROC( glGetInteger64v );
+ FIND_PROC( glGetSynciv );
+ FIND_PROC( glGetInteger64i_v );
+ FIND_PROC( glGetBufferParameteri64v );
+ FIND_PROC( glGenSamplers );
+ FIND_PROC( glDeleteSamplers );
+ FIND_PROC( glIsSampler );
+ FIND_PROC( glBindSampler );
+ FIND_PROC( glSamplerParameteri );
+ FIND_PROC( glSamplerParameteriv );
+ FIND_PROC( glSamplerParameterf );
+ FIND_PROC( glSamplerParameterfv );
+ FIND_PROC( glGetSamplerParameteriv );
+ FIND_PROC( glGetSamplerParameterfv );
+ FIND_PROC( glVertexAttribDivisor );
+ FIND_PROC( glBindTransformFeedback );
+ FIND_PROC( glDeleteTransformFeedbacks );
+ FIND_PROC( glGenTransformFeedbacks );
+ FIND_PROC( glIsTransformFeedback );
+ FIND_PROC( glPauseTransformFeedback );
+ FIND_PROC( glResumeTransformFeedback );
+ FIND_PROC( glGetProgramBinary );
+ FIND_PROC( glProgramBinary );
+ FIND_PROC( glProgramParameteri );
+ FIND_PROC( glInvalidateFramebuffer );
+ FIND_PROC( glInvalidateSubFramebuffer );
+ FIND_PROC( glTexStorage2D );
+ FIND_PROC( glTexStorage3D );
+ FIND_PROC( glGetInternalformativ );
+#undef FIND_PROC
+
+ if( !glReadBuffer || !glDrawRangeElements || !glTexImage3D || !glTexSubImage3D
+ || !glCopyTexSubImage3D || !glCompressedTexImage3D
+ || !glCompressedTexSubImage3D || !glGenQueries || !glDeleteQueries
+ || !glIsQuery || !glBeginQuery || !glEndQuery || !glGetQueryiv
+ || !glGetQueryObjectuiv || !glUnmapBuffer || !glGetBufferPointerv
+ || !glDrawBuffers || !glUniformMatrix2x3fv || !glUniformMatrix3x2fv
+ || !glUniformMatrix2x4fv || !glUniformMatrix4x2fv || !glUniformMatrix3x4fv
+ || !glUniformMatrix4x3fv || !glBlitFramebuffer
+ || !glRenderbufferStorageMultisample || !glFramebufferTextureLayer
+ || !glMapBufferRange || !glFlushMappedBufferRange || !glBindVertexArray
+ || !glDeleteVertexArrays || !glGenVertexArrays || !glIsVertexArray
+ || !glGetIntegeri_v || !glBeginTransformFeedback || !glEndTransformFeedback
+ || !glBindBufferRange || !glBindBufferBase || !glTransformFeedbackVaryings
+ || !glGetTransformFeedbackVarying || !glVertexAttribIPointer
+ || !glGetVertexAttribIiv || !glGetVertexAttribIuiv || !glVertexAttribI4i
+ || !glVertexAttribI4ui || !glVertexAttribI4iv || !glVertexAttribI4uiv
+ || !glGetUniformuiv || !glGetFragDataLocation || !glUniform1ui
+ || !glUniform2ui || !glUniform3ui || !glUniform4ui || !glUniform1uiv
+ || !glUniform2uiv || !glUniform3uiv || !glUniform4uiv || !glClearBufferiv
+ || !glClearBufferuiv || !glClearBufferfv || !glClearBufferfi || !glGetStringi
+ || !glCopyBufferSubData || !glGetUniformIndices || !glGetActiveUniformsiv
+ || !glGetUniformBlockIndex || !glGetActiveUniformBlockiv
+ || !glGetActiveUniformBlockName || !glUniformBlockBinding
+ || !glDrawArraysInstanced || !glDrawElementsInstanced || !glFenceSync
+ || !glIsSync || !glDeleteSync || !glClientWaitSync || !glWaitSync
+ || !glGetInteger64v || !glGetSynciv || !glGetInteger64i_v
+ || !glGetBufferParameteri64v || !glGenSamplers || !glDeleteSamplers
+ || !glIsSampler || !glBindSampler || !glSamplerParameteri
+ || !glSamplerParameteriv || !glSamplerParameterf || !glSamplerParameterfv
+ || !glGetSamplerParameteriv || !glGetSamplerParameterfv
+ || !glVertexAttribDivisor || !glBindTransformFeedback
+ || !glDeleteTransformFeedbacks || !glGenTransformFeedbacks
+ || !glIsTransformFeedback || !glPauseTransformFeedback
+ || !glResumeTransformFeedback || !glGetProgramBinary || !glProgramBinary
+ || !glProgramParameteri || !glInvalidateFramebuffer
+ || !glInvalidateSubFramebuffer || !glTexStorage2D || !glTexStorage3D
+ || !glGetInternalformativ )
+ {
+ return GL_FALSE;
+ }
+
+ return GL_TRUE;
+}
+
+/* Function pointer definitions */GL_APICALL void (* GL_APIENTRY glReadBuffer)( GLenum mode );
+GL_APICALL void (* GL_APIENTRY glDrawRangeElements)( GLenum mode,
+ GLuint start,
+ GLuint end,
+ GLsizei count,
+ GLenum type,
+ const GLvoid* indices );
+GL_APICALL void (* GL_APIENTRY glTexImage3D)( GLenum target,
+ GLint level,
+ GLint internalformat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLint border,
+ GLenum format,
+ GLenum type,
+ const GLvoid* pixels );
+GL_APICALL void (* GL_APIENTRY glTexSubImage3D)( GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLint zoffset,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLenum format,
+ GLenum type,
+ const GLvoid* pixels );
+GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D)( GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLint zoffset,
+ GLint x,
+ GLint y,
+ GLsizei width,
+ GLsizei height );
+GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D)( GLenum target,
+ GLint level,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLint border,
+ GLsizei imageSize,
+ const GLvoid* data );
+GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D)( GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLint zoffset,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLenum format,
+ GLsizei imageSize,
+ const GLvoid* data );
+GL_APICALL void (* GL_APIENTRY glGenQueries)( GLsizei n, GLuint* ids );
+GL_APICALL void (* GL_APIENTRY glDeleteQueries)( GLsizei n, const GLuint* ids );
+GL_APICALL GLboolean (* GL_APIENTRY glIsQuery)( GLuint id );
+GL_APICALL void (* GL_APIENTRY glBeginQuery)( GLenum target, GLuint id );
+GL_APICALL void (* GL_APIENTRY glEndQuery)( GLenum target );
+GL_APICALL void (* GL_APIENTRY glGetQueryiv)( GLenum target, GLenum pname, GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv)( GLuint id,
+ GLenum pname,
+ GLuint* params );
+GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer)( GLenum target );
+GL_APICALL void (* GL_APIENTRY glGetBufferPointerv)( GLenum target,
+ GLenum pname,
+ GLvoid** params );
+GL_APICALL void (* GL_APIENTRY glDrawBuffers)( GLsizei n, const GLenum* bufs );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glBlitFramebuffer)( GLint srcX0,
+ GLint srcY0,
+ GLint srcX1,
+ GLint srcY1,
+ GLint dstX0,
+ GLint dstY0,
+ GLint dstX1,
+ GLint dstY1,
+ GLbitfield mask,
+ GLenum filter );
+GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample)( GLenum target,
+ GLsizei samples,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height );
+GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer)( GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer );
+GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange)( GLenum target,
+ GLintptr offset,
+ GLsizeiptr length,
+ GLbitfield access );
+GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange)( GLenum target,
+ GLintptr offset,
+ GLsizeiptr length );
+GL_APICALL void (* GL_APIENTRY glBindVertexArray)( GLuint array );
+GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays)( GLsizei n, const GLuint* arrays );
+GL_APICALL void (* GL_APIENTRY glGenVertexArrays)( GLsizei n, GLuint* arrays );
+GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray)( GLuint array );
+GL_APICALL void (* GL_APIENTRY glGetIntegeri_v)( GLenum target,
+ GLuint index,
+ GLint* data );
+GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback)( GLenum primitiveMode );
+GL_APICALL void (* GL_APIENTRY glEndTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glBindBufferRange)( GLenum target,
+ GLuint index,
+ GLuint buffer,
+ GLintptr offset,
+ GLsizeiptr size );
+GL_APICALL void (* GL_APIENTRY glBindBufferBase)( GLenum target,
+ GLuint index,
+ GLuint buffer );
+GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings)( GLuint program,
+ GLsizei count,
+ const GLchar* const * varyings,
+ GLenum bufferMode );
+GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying)( GLuint program,
+ GLuint index,
+ GLsizei bufSize,
+ GLsizei* length,
+ GLsizei* size,
+ GLenum* type,
+ GLchar* name );
+GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer)( GLuint index,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const GLvoid* pointer );
+GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv)( GLuint index,
+ GLenum pname,
+ GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv)( GLuint index,
+ GLenum pname,
+ GLuint* params );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4i)( GLuint index,
+ GLint x,
+ GLint y,
+ GLint z,
+ GLint w );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui)( GLuint index,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv)( GLuint index, const GLint* v );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv)( GLuint index, const GLuint* v );
+GL_APICALL void (* GL_APIENTRY glGetUniformuiv)( GLuint program,
+ GLint location,
+ GLuint* params );
+GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation)( GLuint program,
+ const GLchar *name );
+GL_APICALL void (* GL_APIENTRY glUniform1ui)( GLint location, GLuint v0 );
+GL_APICALL void (* GL_APIENTRY glUniform2ui)( GLint location, GLuint v0, GLuint v1 );
+GL_APICALL void (* GL_APIENTRY glUniform3ui)( GLint location,
+ GLuint v0,
+ GLuint v1,
+ GLuint v2 );
+GL_APICALL void (* GL_APIENTRY glUniform4ui)( GLint location,
+ GLuint v0,
+ GLuint v1,
+ GLuint v2,
+ GLuint v3 );
+GL_APICALL void (* GL_APIENTRY glUniform1uiv)( GLint location,
+ GLsizei count,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform2uiv)( GLint location,
+ GLsizei count,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform3uiv)( GLint location,
+ GLsizei count,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform4uiv)( GLint location,
+ GLsizei count,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferiv)( GLenum buffer,
+ GLint drawbuffer,
+ const GLint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferuiv)( GLenum buffer,
+ GLint drawbuffer,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferfv)( GLenum buffer,
+ GLint drawbuffer,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferfi)( GLenum buffer,
+ GLint drawbuffer,
+ GLfloat depth,
+ GLint stencil );
+GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi)( GLenum name, GLuint index );
+GL_APICALL void (* GL_APIENTRY glCopyBufferSubData)( GLenum readTarget,
+ GLenum writeTarget,
+ GLintptr readOffset,
+ GLintptr writeOffset,
+ GLsizeiptr size );
+GL_APICALL void (* GL_APIENTRY glGetUniformIndices)( GLuint program,
+ GLsizei uniformCount,
+ const GLchar* const * uniformNames,
+ GLuint* uniformIndices );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv)( GLuint program,
+ GLsizei uniformCount,
+ const GLuint* uniformIndices,
+ GLenum pname,
+ GLint* params );
+GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex)( GLuint program,
+ const GLchar* uniformBlockName );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv)( GLuint program,
+ GLuint uniformBlockIndex,
+ GLenum pname,
+ GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName)( GLuint program,
+ GLuint uniformBlockIndex,
+ GLsizei bufSize,
+ GLsizei* length,
+ GLchar* uniformBlockName );
+GL_APICALL void (* GL_APIENTRY glUniformBlockBinding)( GLuint program,
+ GLuint uniformBlockIndex,
+ GLuint uniformBlockBinding );
+GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced)( GLenum mode,
+ GLint first,
+ GLsizei count,
+ GLsizei instanceCount );
+GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced)( GLenum mode,
+ GLsizei count,
+ GLenum type,
+ const GLvoid* indices,
+ GLsizei instanceCount );
+GL_APICALL GLsync (* GL_APIENTRY glFenceSync)( GLenum condition, GLbitfield flags );
+GL_APICALL GLboolean (* GL_APIENTRY glIsSync)( GLsync sync );
+GL_APICALL void (* GL_APIENTRY glDeleteSync)( GLsync sync );
+GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync)( GLsync sync,
+ GLbitfield flags,
+ GLuint64 timeout );
+GL_APICALL void (* GL_APIENTRY glWaitSync)( GLsync sync,
+ GLbitfield flags,
+ GLuint64 timeout );
+GL_APICALL void (* GL_APIENTRY glGetInteger64v)( GLenum pname, GLint64* params );
+GL_APICALL void (* GL_APIENTRY glGetSynciv)( GLsync sync,
+ GLenum pname,
+ GLsizei bufSize,
+ GLsizei* length,
+ GLint* values );
+GL_APICALL void (* GL_APIENTRY glGetInteger64i_v)( GLenum target,
+ GLuint index,
+ GLint64* data );
+GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v)( GLenum target,
+ GLenum pname,
+ GLint64* params );
+GL_APICALL void (* GL_APIENTRY glGenSamplers)( GLsizei count, GLuint* samplers );
+GL_APICALL void (* GL_APIENTRY glDeleteSamplers)( GLsizei count, const GLuint* samplers );
+GL_APICALL GLboolean (* GL_APIENTRY glIsSampler)( GLuint sampler );
+GL_APICALL void (* GL_APIENTRY glBindSampler)( GLuint unit, GLuint sampler );
+GL_APICALL void (* GL_APIENTRY glSamplerParameteri)( GLuint sampler,
+ GLenum pname,
+ GLint param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameteriv)( GLuint sampler,
+ GLenum pname,
+ const GLint* param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameterf)( GLuint sampler,
+ GLenum pname,
+ GLfloat param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameterfv)( GLuint sampler,
+ GLenum pname,
+ const GLfloat* param );
+GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv)( GLuint sampler,
+ GLenum pname,
+ GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv)( GLuint sampler,
+ GLenum pname,
+ GLfloat* params );
+GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor)( GLuint index, GLuint divisor );
+GL_APICALL void (* GL_APIENTRY glBindTransformFeedback)( GLenum target, GLuint id );
+GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks)( GLsizei n, const GLuint* ids );
+GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks)( GLsizei n, GLuint* ids );
+GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback)( GLuint id );
+GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glGetProgramBinary)( GLuint program,
+ GLsizei bufSize,
+ GLsizei* length,
+ GLenum* binaryFormat,
+ GLvoid* binary );
+GL_APICALL void (* GL_APIENTRY glProgramBinary)( GLuint program,
+ GLenum binaryFormat,
+ const GLvoid* binary,
+ GLsizei length );
+GL_APICALL void (* GL_APIENTRY glProgramParameteri)( GLuint program,
+ GLenum pname,
+ GLint value );
+GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer)( GLenum target,
+ GLsizei numAttachments,
+ const GLenum* attachments );
+GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer)( GLenum target,
+ GLsizei numAttachments,
+ const GLenum* attachments,
+ GLint x,
+ GLint y,
+ GLsizei width,
+ GLsizei height );
+GL_APICALL void (* GL_APIENTRY glTexStorage2D)( GLenum target,
+ GLsizei levels,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height );
+GL_APICALL void (* GL_APIENTRY glTexStorage3D)( GLenum target,
+ GLsizei levels,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth );
+GL_APICALL void (* GL_APIENTRY glGetInternalformativ)( GLenum target,
+ GLenum internalformat,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params );
diff --git a/ndk/sources/android/ndk_helper/gl3stub.h b/ndk/sources/android/ndk_helper/gl3stub.h
new file mode 100644
index 0000000..537dd28
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gl3stub.h
@@ -0,0 +1,501 @@
+#ifndef __gl3_h_
+#define __gl3_h_
+
+/*
+ * stub gl3.h for dynamic loading, based on:
+ * gl3.h last updated on $Date: 2013-02-12 14:37:24 -0800 (Tue, 12 Feb 2013) $
+ *
+ * Changes:
+ * - Added #include <GLES2/gl2.h>
+ * - Removed duplicate OpenGL ES 2.0 declarations
+ * - Converted OpenGL ES 3.0 function prototypes to function pointer
+ * declarations
+ * - Added gl3stubInit() declaration
+ */
+
+#include <GLES2/gl2.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*
+ ** Copyright (c) 2007-2013 The Khronos Group Inc.
+ **
+ ** Permission is hereby granted, free of charge, to any person obtaining a
+ ** copy of this software and/or associated documentation files (the
+ ** "Materials"), to deal in the Materials without restriction, including
+ ** without limitation the rights to use, copy, modify, merge, publish,
+ ** distribute, sublicense, and/or sell copies of the Materials, and to
+ ** permit persons to whom the Materials are 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 Materials.
+ **
+ ** THE MATERIALS 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.
+ ** 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
+ ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ */
+
+/*
+ * This files is for apps that want to use ES3 if present,
+ * but continue to work on pre-API-18 devices. They can't just link to -lGLESv3 since
+ * that library doesn't exist on pre-API-18 devices.
+ * The function dynamically check if OpenGLES3.0 APIs are present and fill in if there are.
+ * Also the header defines some extra variables for OpenGLES3.0.
+ *
+ */
+
+/* Call this function before calling any OpenGL ES 3.0 functions. It will
+ * return GL_TRUE if the OpenGL ES 3.0 was successfully initialized, GL_FALSE
+ * otherwise. */
+GLboolean gl3stubInit();
+
+/*-------------------------------------------------------------------------
+ * Data type definitions
+ *-----------------------------------------------------------------------*/
+
+/* OpenGL ES 3.0 */
+
+typedef unsigned short GLhalf;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef struct __GLsync *GLsync;
+
+/*-------------------------------------------------------------------------
+ * Token definitions
+ *-----------------------------------------------------------------------*/
+
+/* OpenGL ES core versions */
+#define GL_ES_VERSION_3_0 1
+
+/* OpenGL ES 3.0 */
+
+#define GL_READ_BUFFER 0x0C02
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+#define GL_RED 0x1903
+#define GL_RGB8 0x8051
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_HALF_FLOAT 0x140B
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_RG8 0x822B
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_COPY_READ_BUFFER_BINDING GL_COPY_READ_BUFFER
+#define GL_COPY_WRITE_BUFFER_BINDING GL_COPY_WRITE_BUFFER
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING 0x8919
+#define GL_RGB10_A2UI 0x906F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_INT_2_10_10_10_REV 0x8D9F
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+
+/*-------------------------------------------------------------------------
+ * Entrypoint definitions
+ *-----------------------------------------------------------------------*/
+
+/* OpenGL ES 3.0 */
+
+extern GL_APICALL void (* GL_APIENTRY glReadBuffer) (GLenum mode);
+extern GL_APICALL void (* GL_APIENTRY glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices);
+extern GL_APICALL void (* GL_APIENTRY glTexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
+extern GL_APICALL void (* GL_APIENTRY glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
+extern GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
+extern GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
+extern GL_APICALL void (* GL_APIENTRY glGenQueries) (GLsizei n, GLuint* ids);
+extern GL_APICALL void (* GL_APIENTRY glDeleteQueries) (GLsizei n, const GLuint* ids);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsQuery) (GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glBeginQuery) (GLenum target, GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glEndQuery) (GLenum target);
+extern GL_APICALL void (* GL_APIENTRY glGetQueryiv) (GLenum target, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint* params);
+extern GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer) (GLenum target);
+extern GL_APICALL void (* GL_APIENTRY glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid** params);
+extern GL_APICALL void (* GL_APIENTRY glDrawBuffers) (GLsizei n, const GLenum* bufs);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+extern GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+extern GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+extern GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length);
+extern GL_APICALL void (* GL_APIENTRY glBindVertexArray) (GLuint array);
+extern GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays) (GLsizei n, const GLuint* arrays);
+extern GL_APICALL void (* GL_APIENTRY glGenVertexArrays) (GLsizei n, GLuint* arrays);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray) (GLuint array);
+extern GL_APICALL void (* GL_APIENTRY glGetIntegeri_v) (GLenum target, GLuint index, GLint* data);
+extern GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback) (GLenum primitiveMode);
+extern GL_APICALL void (* GL_APIENTRY glEndTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+extern GL_APICALL void (* GL_APIENTRY glBindBufferBase) (GLenum target, GLuint index, GLuint buffer);
+extern GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);
+extern GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
+extern GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint* params);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4i) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv) (GLuint index, const GLint* v);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv) (GLuint index, const GLuint* v);
+extern GL_APICALL void (* GL_APIENTRY glGetUniformuiv) (GLuint program, GLint location, GLuint* params);
+extern GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation) (GLuint program, const GLchar *name);
+extern GL_APICALL void (* GL_APIENTRY glUniform1ui) (GLint location, GLuint v0);
+extern GL_APICALL void (* GL_APIENTRY glUniform2ui) (GLint location, GLuint v0, GLuint v1);
+extern GL_APICALL void (* GL_APIENTRY glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+extern GL_APICALL void (* GL_APIENTRY glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern GL_APICALL void (* GL_APIENTRY glUniform1uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform2uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform3uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform4uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferiv) (GLenum buffer, GLint drawbuffer, const GLint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferuiv) (GLenum buffer, GLint drawbuffer, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferfv) (GLenum buffer, GLint drawbuffer, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferfi) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+extern GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi) (GLenum name, GLuint index);
+extern GL_APICALL void (* GL_APIENTRY glCopyBufferSubData) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+extern GL_APICALL void (* GL_APIENTRY glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
+extern GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex) (GLuint program, const GLchar* uniformBlockName);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
+extern GL_APICALL void (* GL_APIENTRY glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+extern GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
+extern GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount);
+extern GL_APICALL GLsync (* GL_APIENTRY glFenceSync) (GLenum condition, GLbitfield flags);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsSync) (GLsync sync);
+extern GL_APICALL void (* GL_APIENTRY glDeleteSync) (GLsync sync);
+extern GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+extern GL_APICALL void (* GL_APIENTRY glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+extern GL_APICALL void (* GL_APIENTRY glGetInteger64v) (GLenum pname, GLint64* params);
+extern GL_APICALL void (* GL_APIENTRY glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values);
+extern GL_APICALL void (* GL_APIENTRY glGetInteger64i_v) (GLenum target, GLuint index, GLint64* data);
+extern GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v) (GLenum target, GLenum pname, GLint64* params);
+extern GL_APICALL void (* GL_APIENTRY glGenSamplers) (GLsizei count, GLuint* samplers);
+extern GL_APICALL void (* GL_APIENTRY glDeleteSamplers) (GLsizei count, const GLuint* samplers);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsSampler) (GLuint sampler);
+extern GL_APICALL void (* GL_APIENTRY glBindSampler) (GLuint unit, GLuint sampler);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint* param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat* param);
+extern GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat* params);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor) (GLuint index, GLuint divisor);
+extern GL_APICALL void (* GL_APIENTRY glBindTransformFeedback) (GLenum target, GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks) (GLsizei n, const GLuint* ids);
+extern GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks) (GLsizei n, GLuint* ids);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback) (GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glGetProgramBinary) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary);
+extern GL_APICALL void (* GL_APIENTRY glProgramBinary) (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length);
+extern GL_APICALL void (* GL_APIENTRY glProgramParameteri) (GLuint program, GLenum pname, GLint value);
+extern GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
+extern GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern GL_APICALL void (* GL_APIENTRY glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ndk/sources/android/ndk_helper/interpolator.cpp b/ndk/sources/android/ndk_helper/interpolator.cpp
new file mode 100644
index 0000000..4167051
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/interpolator.cpp
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#include "interpolator.h"
+#include <math.h>
+#include "interpolator.h"
+
+namespace ndk_helper
+{
+
+//-------------------------------------------------
+//Ctor
+//-------------------------------------------------
+Interpolator::Interpolator()
+{
+ list_params_.clear();
+}
+
+//-------------------------------------------------
+//Dtor
+//-------------------------------------------------
+Interpolator::~Interpolator()
+{
+ list_params_.clear();
+}
+
+void Interpolator::Clear()
+{
+ list_params_.clear();
+}
+
+Interpolator& Interpolator::Set( const float start,
+ const float dest,
+ const INTERPOLATOR_TYPE type,
+ const double duration )
+{
+ //init the parameters for the interpolation process
+ start_time_ = PerfMonitor::GetCurrentTime();
+ dest_time_ = start_time_ + duration;
+ type_ = type;
+
+ start_value_ = start;
+ dest_value_ = dest;
+ return *this;
+}
+
+Interpolator& Interpolator::Add( const float dest,
+ const INTERPOLATOR_TYPE type,
+ const double duration )
+{
+ InterpolatorParams param;
+ param.dest_value_ = dest;
+ param.type_ = type;
+ param.duration_ = duration;
+ list_params_.push_back( param );
+ return *this;
+}
+
+bool Interpolator::Update( const double current_time, float& p )
+{
+ bool bContinue;
+ if( current_time >= dest_time_ )
+ {
+ p = dest_value_;
+ if( list_params_.size() )
+ {
+ InterpolatorParams& item = list_params_.front();
+ Set( dest_value_, item.dest_value_, item.type_, item.duration_ );
+ list_params_.pop_front();
+
+ bContinue = true;
+ }
+ else
+ {
+ bContinue = false;
+ }
+ }
+ else
+ {
+ float t = (float) (current_time - start_time_);
+ float d = (float) (dest_time_ - start_time_);
+ float b = start_value_;
+ float c = dest_value_ - start_value_;
+ p = GetFormula( type_, t, b, d, c );
+
+ bContinue = true;
+ }
+ return bContinue;
+}
+
+float Interpolator::GetFormula( const INTERPOLATOR_TYPE type,
+ const float t,
+ const float b,
+ const float d,
+ const float c )
+{
+ float t1;
+ switch( type )
+ {
+ case INTERPOLATOR_TYPE_LINEAR:
+ // simple linear interpolation - no easing
+ return (c * t / d + b);
+
+ case INTERPOLATOR_TYPE_EASEINQUAD:
+ // quadratic (t^2) easing in - accelerating from zero velocity
+ t1 = t / d;
+ return (c * t1 * t1 + b);
+
+ case INTERPOLATOR_TYPE_EASEOUTQUAD:
+ // quadratic (t^2) easing out - decelerating to zero velocity
+ t1 = t / d;
+ return (-c * t1 * (t1 - 2) + b);
+
+ case INTERPOLATOR_TYPE_EASEINOUTQUAD:
+ // quadratic easing in/out - acceleration until halfway, then deceleration
+ t1 = t / d / 2;
+ if( t1 < 1 )
+ return (c / 2 * t1 * t1 + b);
+ else
+ {
+ t1 = t1 - 1;
+ return (-c / 2 * (t1 * (t1 - 2) - 1) + b);
+ }
+ case INTERPOLATOR_TYPE_EASEINCUBIC:
+ // cubic easing in - accelerating from zero velocity
+ t1 = t / d;
+ return (c * t1 * t1 * t1 + b);
+
+ case INTERPOLATOR_TYPE_EASEOUTCUBIC:
+ // cubic easing in - accelerating from zero velocity
+ t1 = t / d - 1;
+ return (c * (t1 * t1 * t1 + 1) + b);
+
+ case INTERPOLATOR_TYPE_EASEINOUTCUBIC:
+ // cubic easing in - accelerating from zero velocity
+ t1 = t / d / 2;
+
+ if( t1 < 1 )
+ return (c / 2 * t1 * t1 * t1 + b);
+ else
+ {
+ t1 -= 2;
+ return (c / 2 * (t1 * t1 * t1 + 2) + b);
+ }
+ case INTERPOLATOR_TYPE_EASEINQUART:
+ // quartic easing in - accelerating from zero velocity
+ t1 = t / d;
+ return (c * t1 * t1 * t1 * t1 + b);
+
+ case INTERPOLATOR_TYPE_EASEINEXPO:
+ // exponential (2^t) easing in - accelerating from zero velocity
+ if( t == 0 )
+ return b;
+ else
+ return (c * powf( 2, (10 * (t / d - 1)) ) + b);
+
+ case INTERPOLATOR_TYPE_EASEOUTEXPO:
+ // exponential (2^t) easing out - decelerating to zero velocity
+ if( t == d )
+ return (b + c);
+ else
+ return (c * (-powf( 2, -10 * t / d ) + 1) + b);
+ default:
+ return 0;
+ }
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/interpolator.h b/ndk/sources/android/ndk_helper/interpolator.h
new file mode 100644
index 0000000..1226e33
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/interpolator.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef INTERPOLATOR_H_
+#define INTERPOLATOR_H_
+
+#include <jni.h>
+#include <errno.h>
+#include <time.h>
+#include "JNIHelper.h"
+#include "perfMonitor.h"
+#include <list>
+
+namespace ndk_helper
+{
+
+enum INTERPOLATOR_TYPE
+{
+ INTERPOLATOR_TYPE_LINEAR,
+ INTERPOLATOR_TYPE_EASEINQUAD,
+ INTERPOLATOR_TYPE_EASEOUTQUAD,
+ INTERPOLATOR_TYPE_EASEINOUTQUAD,
+ INTERPOLATOR_TYPE_EASEINCUBIC,
+ INTERPOLATOR_TYPE_EASEOUTCUBIC,
+ INTERPOLATOR_TYPE_EASEINOUTCUBIC,
+ INTERPOLATOR_TYPE_EASEINQUART,
+ INTERPOLATOR_TYPE_EASEINEXPO,
+ INTERPOLATOR_TYPE_EASEOUTEXPO,
+};
+
+struct InterpolatorParams
+{
+ float dest_value_;
+ INTERPOLATOR_TYPE type_;
+ double duration_;
+};
+
+/******************************************************************
+ * Interpolates values with several interpolation methods
+ */
+class Interpolator
+{
+private:
+ double start_time_;
+ double dest_time_;
+ INTERPOLATOR_TYPE type_;
+
+ float start_value_;
+ float dest_value_;
+ std::list<InterpolatorParams> list_params_;
+
+ float GetFormula( const INTERPOLATOR_TYPE type,
+ const float t,
+ const float b,
+ const float d,
+ const float c );
+public:
+ Interpolator();
+ ~Interpolator();
+
+ Interpolator& Set( const float start,
+ const float dest,
+ const INTERPOLATOR_TYPE type,
+ double duration );
+
+ Interpolator& Add( const float dest,
+ const INTERPOLATOR_TYPE type,
+ const double duration );
+
+ bool Update( const double currentTime, float& p );
+
+ void Clear();
+};
+
+} //namespace ndkHelper
+#endif /* INTERPOLATOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/perfMonitor.cpp b/ndk/sources/android/ndk_helper/perfMonitor.cpp
new file mode 100644
index 0000000..dad0e68
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/perfMonitor.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#include "perfMonitor.h"
+
+namespace ndk_helper
+{
+
+PerfMonitor::PerfMonitor() :
+ last_tick_( 0.f ),
+ tv_last_sec_( 0 ),
+ tickindex_( 0 ),
+ ticksum_( 0 )
+{
+ for( int32_t i = 0; i < NUM_SAMPLES; ++i )
+ ticklist_[i] = 0;
+}
+
+PerfMonitor::~PerfMonitor()
+{
+}
+
+double PerfMonitor::UpdateTick( double currentTick )
+{
+ ticksum_ -= ticklist_[tickindex_];
+ ticksum_ += currentTick;
+ ticklist_[tickindex_] = currentTick;
+ tickindex_ = (tickindex_ + 1) % NUM_SAMPLES;
+
+ return ((double) ticksum_ / NUM_SAMPLES);
+}
+
+bool PerfMonitor::Update( float &fFPS )
+{
+ struct timeval Time;
+ gettimeofday( &Time, NULL );
+
+ double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;
+ double tick = time - last_tick_;
+ double d = UpdateTick( tick );
+ last_tick_ = time;
+
+ if( Time.tv_sec - tv_last_sec_ >= 1 )
+ {
+ double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;
+ current_FPS_ = 1.f / d;
+ tv_last_sec_ = Time.tv_sec;
+ fFPS = current_FPS_;
+ return true;
+ }
+ else
+ {
+ fFPS = current_FPS_;
+ return false;
+ }
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/perfMonitor.h b/ndk/sources/android/ndk_helper/perfMonitor.h
new file mode 100644
index 0000000..f418c43
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/perfMonitor.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef PERFMONITOR_H_
+#define PERFMONITOR_H_
+
+#include <jni.h>
+#include <errno.h>
+#include <time.h>
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+const int32_t NUM_SAMPLES = 100;
+
+/******************************************************************
+ * Helper class for a performance monitoring and get current tick time
+ */
+class PerfMonitor
+{
+private:
+ float current_FPS_;
+ time_t tv_last_sec_;
+
+ double last_tick_;
+ int32_t tickindex_;
+ double ticksum_;
+ double ticklist_[NUM_SAMPLES];
+
+ double UpdateTick( double current_tick );
+public:
+ PerfMonitor();
+ virtual ~PerfMonitor();
+
+ bool Update( float &fFPS );
+
+ static double GetCurrentTime()
+ {
+ struct timeval time;
+ gettimeofday( &time, NULL );
+ double ret = time.tv_sec + time.tv_usec * 1.0 / 1000000.0;
+ return ret;
+ }
+};
+
+} //namespace ndkHelper
+#endif /* PERFMONITOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/shader.cpp b/ndk/sources/android/ndk_helper/shader.cpp
new file mode 100644
index 0000000..74b3887
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/shader.cpp
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+
+#include "shader.h"
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+#define DEBUG (1)
+
+bool shader::CompileShader( GLuint *shader,
+ const GLenum type,
+ const char *str_file_name,
+ const std::map<std::string, std::string>& map_parameters )
+{
+ std::vector<uint8_t> data;
+ if( !JNIHelper::GetInstance()->ReadFile( str_file_name, &data ) )
+ {
+ LOGI( "Can not open a file:%s", str_file_name );
+ return false;
+ }
+
+ const char REPLACEMENT_TAG = '*';
+ //Fill-in parameters
+ std::string str( data.begin(), data.end() );
+ std::string str_replacement_map( data.size(), ' ' );
+
+ std::map<std::string, std::string>::const_iterator it = map_parameters.begin();
+ std::map<std::string, std::string>::const_iterator itEnd = map_parameters.end();
+ while( it != itEnd )
+ {
+ size_t pos = 0;
+ while( (pos = str.find( it->first, pos )) != std::string::npos )
+ {
+ //Check if the sub string is already touched
+
+ size_t replaced_pos = str_replacement_map.find( REPLACEMENT_TAG, pos );
+ if( replaced_pos == std::string::npos || replaced_pos > pos )
+ {
+
+ str.replace( pos, it->first.length(), it->second );
+ str_replacement_map.replace( pos, it->first.length(), it->first.length(),
+ REPLACEMENT_TAG );
+ pos += it->second.length();
+ }
+ else
+ {
+ //The replacement target has been touched by other tag, skipping them
+ pos += it->second.length();
+ }
+ }
+ it++;
+ }
+
+ LOGI( "Patched Shdader:\n%s", str.c_str() );
+
+ std::vector<uint8_t> v( str.begin(), str.end() );
+ str.clear();
+ return shader::CompileShader( shader, type, v );
+}
+
+bool shader::CompileShader( GLuint *shader,
+ const GLenum type,
+ const GLchar *source,
+ const int32_t iSize )
+{
+ if( source == NULL || iSize <= 0 )
+ return false;
+
+ *shader = glCreateShader( type );
+ glShaderSource( *shader, 1, &source, &iSize ); //Not specifying 3rd parameter (size) could be troublesome..
+
+ glCompileShader( *shader );
+
+#if defined(DEBUG)
+ GLint logLength;
+ glGetShaderiv( *shader, GL_INFO_LOG_LENGTH, &logLength );
+ if( logLength > 0 )
+ {
+ GLchar *log = (GLchar *) malloc( logLength );
+ glGetShaderInfoLog( *shader, logLength, &logLength, log );
+ LOGI( "Shader compile log:\n%s", log );
+ free( log );
+ }
+#endif
+
+ GLint status;
+ glGetShaderiv( *shader, GL_COMPILE_STATUS, &status );
+ if( status == 0 )
+ {
+ glDeleteShader( *shader );
+ return false;
+ }
+
+ return true;
+}
+
+bool shader::CompileShader( GLuint *shader,
+ const GLenum type,
+ std::vector<uint8_t>& data )
+{
+ if( !data.size() )
+ return false;
+
+ const GLchar *source = (GLchar *) &data[0];
+ int32_t iSize = data.size();
+ return shader::CompileShader( shader, type, source, iSize );
+}
+
+bool shader::CompileShader( GLuint *shader,
+ const GLenum type,
+ const char *strFileName )
+{
+ std::vector<uint8_t> data;
+ bool b = JNIHelper::GetInstance()->ReadFile( strFileName, &data );
+ if( !b )
+ {
+ LOGI( "Can not open a file:%s", strFileName );
+ return false;
+ }
+
+ return shader::CompileShader( shader, type, data );
+}
+
+bool shader::LinkProgram( const GLuint prog )
+{
+ GLint status;
+
+ glLinkProgram( prog );
+
+#if defined(DEBUG)
+ GLint logLength;
+ glGetProgramiv( prog, GL_INFO_LOG_LENGTH, &logLength );
+ if( logLength > 0 )
+ {
+ GLchar *log = (GLchar *) malloc( logLength );
+ glGetProgramInfoLog( prog, logLength, &logLength, log );
+ LOGI( "Program link log:\n%s", log );
+ free( log );
+ }
+#endif
+
+ glGetProgramiv( prog, GL_LINK_STATUS, &status );
+ if( status == 0 )
+ {
+ LOGI( "Program link failed\n" );
+ return false;
+ }
+
+ return true;
+}
+
+bool shader::ValidateProgram( const GLuint prog )
+{
+ GLint logLength, status;
+
+ glValidateProgram( prog );
+ glGetProgramiv( prog, GL_INFO_LOG_LENGTH, &logLength );
+ if( logLength > 0 )
+ {
+ GLchar *log = (GLchar *) malloc( logLength );
+ glGetProgramInfoLog( prog, logLength, &logLength, log );
+ LOGI( "Program validate log:\n%s", log );
+ free( log );
+ }
+
+ glGetProgramiv( prog, GL_VALIDATE_STATUS, &status );
+ if( status == 0 )
+ return false;
+
+ return true;
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/shader.h b/ndk/sources/android/ndk_helper/shader.h
new file mode 100644
index 0000000..d362a53
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/shader.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef SHADER_H_
+#define SHADER_H_
+
+#include <jni.h>
+
+#include <vector>
+#include <map>
+#include <string>
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/log.h>
+
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+namespace shader
+{
+
+/******************************************************************
+ * Shader compiler helper
+ * namespace: ndkHelper::shader
+ *
+ */
+
+/******************************************************************
+ * CompileShader() with vector
+ *
+ * arguments:
+ * out: shader, shader variable
+ * in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ * in: data, source vector
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader, const GLenum type, std::vector<uint8_t>& data );
+
+/******************************************************************
+ * CompileShader() with buffer
+ *
+ * arguments:
+ * out: shader, shader variable
+ * in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ * in: source, source buffer
+ * in: iSize, buffer size
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader,
+ const GLenum type,
+ const GLchar *source,
+ const int32_t iSize );
+
+/******************************************************************
+ * CompileShader() with filename
+ *
+ * arguments:
+ * out: shader, shader variable
+ * in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ * in: strFilename, filename
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader, const GLenum type, const char *strFileName );
+
+/******************************************************************
+ * CompileShader() with std::map helps patching on a shader on the fly.
+ *
+ * arguments:
+ * out: shader, shader variable
+ * in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ * in: mapParameters
+ * For a example,
+ * map : %KEY% -> %VALUE% replaces all %KEY% entries in the given shader code to %VALUE"
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader,
+ const GLenum type,
+ const char *str_file_name,
+ const std::map<std::string, std::string>& map_parameters );
+
+/******************************************************************
+ * LinkProgram()
+ *
+ * arguments:
+ * in: program, program
+ * return: true if a shader linkage succeeded, false if it failed
+ *
+ */
+bool LinkProgram( const GLuint prog );
+
+/******************************************************************
+ * validateProgram()
+ *
+ * arguments:
+ * in: program, program
+ * return: true if a shader validation succeeded, false if it failed
+ *
+ */
+bool ValidateProgram( const GLuint prog );
+} //namespace shader
+
+} //namespace ndkHelper
+#endif /* SHADER_H_ */
diff --git a/ndk/sources/android/ndk_helper/tapCamera.cpp b/ndk/sources/android/ndk_helper/tapCamera.cpp
new file mode 100644
index 0000000..5a4ff8b
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/tapCamera.cpp
@@ -0,0 +1,320 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+//----------------------------------------------------------
+// tapCamera.cpp
+// Camera control with tap
+//
+//----------------------------------------------------------
+#include <fstream>
+#include "tapCamera.h"
+
+namespace ndk_helper
+{
+
+const float TRANSFORM_FACTOR = 15.f;
+const float TRANSFORM_FACTORZ = 10.f;
+
+const float MOMENTUM_FACTOR_DECREASE = 0.85f;
+const float MOMENTUM_FACTOR_DECREASE_SHIFT = 0.9f;
+const float MOMENTUM_FACTOR = 0.8f;
+const float MOMENTUM_FACTOR_THRESHOLD = 0.001f;
+
+//----------------------------------------------------------
+// Ctor
+//----------------------------------------------------------
+TapCamera::TapCamera() :
+ dragging_( false ),
+ pinching_( false ),
+ momentum_( false ),
+ ball_radius_( 0.75f ),
+ pinch_start_distance_SQ_( 0.f ),
+ camera_rotation_( 0.f ),
+ camera_rotation_start_( 0.f ),
+ camera_rotation_now_( 0.f ),
+ momemtum_steps_( 0.f ),
+ flip_z_( 0.f )
+{
+ //Init offset
+ InitParameters();
+
+ vec_flip_ = Vec2( 1.f, -1.f );
+ flip_z_ = -1.f;
+ vec_pinch_transform_factor_ = Vec3( 1.f, 1.f, 1.f );
+
+ vec_ball_center_ = Vec2( 0, 0 );
+ vec_ball_now_ = Vec2( 0, 0 );
+ vec_ball_down_ = Vec2( 0, 0 );
+
+ vec_pinch_start_ = Vec2( 0, 0 );
+ vec_pinch_start_center_ = Vec2( 0, 0 );
+
+ vec_flip_ = Vec2( 0, 0 );
+
+}
+
+void TapCamera::InitParameters()
+{
+ //Init parameters
+ vec_offset_ = Vec3();
+ vec_offset_now_ = Vec3();
+
+ quat_ball_rot_ = Quaternion();
+ quat_ball_now_ = Quaternion();
+ quat_ball_now_.ToMatrix( mat_rotation_ );
+ camera_rotation_ = 0.f;
+
+ vec_drag_delta_ = Vec2();
+ vec_offset_delta_ = Vec3();
+
+ momentum_ = false;
+}
+
+//----------------------------------------------------------
+// Dtor
+//----------------------------------------------------------
+TapCamera::~TapCamera()
+{
+
+}
+
+void TapCamera::Update()
+{
+ if( momentum_ )
+ {
+ float momenttum_steps = momemtum_steps_;
+
+ //Momentum rotation
+ Vec2 v = vec_drag_delta_;
+ BeginDrag( Vec2() ); //NOTE:This call reset _VDragDelta
+ Drag( v * vec_flip_ );
+
+ //Momentum shift
+ vec_offset_ += vec_offset_delta_;
+
+ BallUpdate();
+ EndDrag();
+
+ //Decrease deltas
+ vec_drag_delta_ = v * MOMENTUM_FACTOR_DECREASE;
+ vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR_DECREASE_SHIFT;
+
+ //Count steps
+ momemtum_steps_ = momenttum_steps * MOMENTUM_FACTOR_DECREASE;
+ if( momemtum_steps_ < MOMENTUM_FACTOR_THRESHOLD )
+ {
+ momentum_ = false;
+ }
+ }
+ else
+ {
+ vec_drag_delta_ *= MOMENTUM_FACTOR;
+ vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR;
+ BallUpdate();
+ }
+
+ Vec3 vec = vec_offset_ + vec_offset_now_;
+ Vec3 vec_tmp( TRANSFORM_FACTOR, -TRANSFORM_FACTOR, TRANSFORM_FACTORZ );
+
+ vec *= vec_tmp * vec_pinch_transform_factor_;
+
+ mat_transform_ = Mat4::Translation( vec );
+}
+
+Mat4& TapCamera::GetRotationMatrix()
+{
+ return mat_rotation_;
+}
+
+Mat4& TapCamera::GetTransformMatrix()
+{
+ return mat_transform_;
+}
+
+void TapCamera::Reset( const bool bAnimate )
+{
+ InitParameters();
+ Update();
+
+}
+
+//----------------------------------------------------------
+//Drag control
+//----------------------------------------------------------
+void TapCamera::BeginDrag( const Vec2& v )
+{
+ if( dragging_ )
+ EndDrag();
+
+ if( pinching_ )
+ EndPinch();
+
+ Vec2 vec = v * vec_flip_;
+ vec_ball_now_ = vec;
+ vec_ball_down_ = vec_ball_now_;
+
+ dragging_ = true;
+ momentum_ = false;
+ vec_last_input_ = vec;
+ vec_drag_delta_ = Vec2();
+}
+
+void TapCamera::EndDrag()
+{
+ quat_ball_down_ = quat_ball_now_;
+ quat_ball_rot_ = Quaternion();
+
+ dragging_ = false;
+ momentum_ = true;
+ momemtum_steps_ = 1.0f;
+}
+
+void TapCamera::Drag( const Vec2& v )
+{
+ if( !dragging_ )
+ return;
+
+ Vec2 vec = v * vec_flip_;
+ vec_ball_now_ = vec;
+
+ vec_drag_delta_ = vec_drag_delta_ * MOMENTUM_FACTOR + (vec - vec_last_input_);
+ vec_last_input_ = vec;
+}
+
+//----------------------------------------------------------
+//Pinch controll
+//----------------------------------------------------------
+void TapCamera::BeginPinch( const Vec2& v1, const Vec2& v2 )
+{
+ if( dragging_ )
+ EndDrag();
+
+ if( pinching_ )
+ EndPinch();
+
+ BeginDrag( Vec2() );
+
+ vec_pinch_start_center_ = (v1 + v2) / 2.f;
+
+ Vec2 vec = v1 - v2;
+ float x_diff;
+ float y_diff;
+ vec.Value( x_diff, y_diff );
+
+ pinch_start_distance_SQ_ = x_diff * x_diff + y_diff * y_diff;
+ camera_rotation_start_ = atan2f( y_diff, x_diff );
+ camera_rotation_now_ = 0;
+
+ pinching_ = true;
+ momentum_ = false;
+
+ //Init momentum factors
+ vec_offset_delta_ = Vec3();
+}
+
+void TapCamera::EndPinch()
+{
+ pinching_ = false;
+ momentum_ = true;
+ momemtum_steps_ = 1.f;
+ vec_offset_ += vec_offset_now_;
+ camera_rotation_ += camera_rotation_now_;
+ vec_offset_now_ = Vec3();
+
+ camera_rotation_now_ = 0;
+
+ EndDrag();
+}
+
+void TapCamera::Pinch( const Vec2& v1, const Vec2& v2 )
+{
+ if( !pinching_ )
+ return;
+
+ //Update momentum factor
+ vec_offset_last_ = vec_offset_now_;
+
+ float x_diff, y_diff;
+ Vec2 vec = v1 - v2;
+ vec.Value( x_diff, y_diff );
+
+ float fDistanceSQ = x_diff * x_diff + y_diff * y_diff;
+
+ float f = pinch_start_distance_SQ_ / fDistanceSQ;
+ if( f < 1.f )
+ f = -1.f / f + 1.0f;
+ else
+ f = f - 1.f;
+ if( isnan( f ) )
+ f = 0.f;
+
+ vec = (v1 + v2) / 2.f - vec_pinch_start_center_;
+ vec_offset_now_ = Vec3( vec, flip_z_ * f );
+
+ //Update momentum factor
+ vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR
+ + (vec_offset_now_ - vec_offset_last_);
+
+ //
+ //Update ration quaternion
+ float fRotation = atan2f( y_diff, x_diff );
+ camera_rotation_now_ = fRotation - camera_rotation_start_;
+
+ //Trackball rotation
+ quat_ball_rot_ = Quaternion( 0.f, 0.f, sinf( -camera_rotation_now_ * 0.5f ),
+ cosf( -camera_rotation_now_ * 0.5f ) );
+}
+
+//----------------------------------------------------------
+//Trackball controll
+//----------------------------------------------------------
+void TapCamera::BallUpdate()
+{
+ if( dragging_ )
+ {
+ Vec3 vec_from = PointOnSphere( vec_ball_down_ );
+ Vec3 vec_to = PointOnSphere( vec_ball_now_ );
+
+ Vec3 vec = vec_from.Cross( vec_to );
+ float w = vec_from.Dot( vec_to );
+
+ Quaternion qDrag = Quaternion( vec, w );
+ qDrag = qDrag * quat_ball_down_;
+ quat_ball_now_ = quat_ball_rot_ * qDrag;
+ }
+ quat_ball_now_.ToMatrix( mat_rotation_ );
+}
+
+Vec3 TapCamera::PointOnSphere( Vec2& point )
+{
+ Vec3 ball_mouse;
+ float mag;
+ Vec2 vec = (point - vec_ball_center_) / ball_radius_;
+ mag = vec.Dot( vec );
+ if( mag > 1.f )
+ {
+ float scale = 1.f / sqrtf( mag );
+ vec *= scale;
+ ball_mouse = Vec3( vec, 0.f );
+ }
+ else
+ {
+ ball_mouse = Vec3( vec, sqrtf( 1.f - mag ) );
+ }
+ return ball_mouse;
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/tapCamera.h b/ndk/sources/android/ndk_helper/tapCamera.h
new file mode 100644
index 0000000..7d124e8
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/tapCamera.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#pragma once
+#include <vector>
+#include <string>
+#include <GLES2/gl2.h>
+
+#include "JNIHelper.h"
+#include "vecmath.h"
+#include "interpolator.h"
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Camera control helper class with a tap gesture
+ * This class is mainly used for 3D space camera control in samples.
+ *
+ */
+class TapCamera
+{
+private:
+ //Trackball
+ Vec2 vec_ball_center_;
+ float ball_radius_;
+ Quaternion quat_ball_now_;
+ Quaternion quat_ball_down_;
+ Vec2 vec_ball_now_;
+ Vec2 vec_ball_down_;
+ Quaternion quat_ball_rot_;
+
+ bool dragging_;
+ bool pinching_;
+
+ //Pinch related info
+ Vec2 vec_pinch_start_;
+ Vec2 vec_pinch_start_center_;
+ float pinch_start_distance_SQ_;
+
+ //Camera shift
+ Vec3 vec_offset_;
+ Vec3 vec_offset_now_;
+
+ //Camera Rotation
+ float camera_rotation_;
+ float camera_rotation_start_;
+ float camera_rotation_now_;
+
+ //Momentum support
+ bool momentum_;
+ Vec2 vec_drag_delta_;
+ Vec2 vec_last_input_;
+ Vec3 vec_offset_last_;
+ Vec3 vec_offset_delta_;
+ float momemtum_steps_;
+
+ Vec2 vec_flip_;
+ float flip_z_;
+
+ Mat4 mat_rotation_;
+ Mat4 mat_transform_;
+
+ Vec3 vec_pinch_transform_factor_;
+
+ Vec3 PointOnSphere( Vec2& point );
+ void BallUpdate();
+ void InitParameters();
+public:
+ TapCamera();
+ virtual ~TapCamera();
+ void BeginDrag( const Vec2& vec );
+ void EndDrag();
+ void Drag( const Vec2& vec );
+ void Update();
+
+ Mat4& GetRotationMatrix();
+ Mat4& GetTransformMatrix();
+
+ void BeginPinch( const Vec2& v1, const Vec2& v2 );
+ void EndPinch();
+ void Pinch( const Vec2& v1, const Vec2& v2 );
+
+ void SetFlip( const float x, const float y, const float z )
+ {
+ vec_flip_ = Vec2( x, y );
+ flip_z_ = z;
+ }
+
+ void SetPinchTransformFactor( const float x, const float y, const float z )
+ {
+ vec_pinch_transform_factor_ = Vec3( x, y, z );
+ }
+
+ void Reset( const bool bAnimate );
+
+};
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/vecmath.cpp b/ndk/sources/android/ndk_helper/vecmath.cpp
new file mode 100644
index 0000000..f4ae5f3
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/vecmath.cpp
@@ -0,0 +1,379 @@
+/*
+ * Copy_right 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * y_ou may_ not use this file ex_cept 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 ex_press or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// vecmath.cpp
+//--------------------------------------------------------------------------------
+#include "vecmath.h"
+
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// vec3
+//--------------------------------------------------------------------------------
+Vec3::Vec3( const Vec4& vec )
+{
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+}
+
+//--------------------------------------------------------------------------------
+// vec4
+//--------------------------------------------------------------------------------
+Vec4 Vec4::operator*( const Mat4& rhs ) const
+{
+ Vec4 out;
+ out.x_ = x_ * rhs.f_[0] + y_ * rhs.f_[1] + z_ * rhs.f_[2] + w_ * rhs.f_[3];
+ out.y_ = x_ * rhs.f_[4] + y_ * rhs.f_[5] + z_ * rhs.f_[6] + w_ * rhs.f_[7];
+ out.z_ = x_ * rhs.f_[8] + y_ * rhs.f_[9] + z_ * rhs.f_[10] + w_ * rhs.f_[11];
+ out.w_ = x_ * rhs.f_[12] + y_ * rhs.f_[13] + z_ * rhs.f_[14] + w_ * rhs.f_[15];
+ return out;
+}
+
+//--------------------------------------------------------------------------------
+// mat4
+//--------------------------------------------------------------------------------
+Mat4::Mat4()
+{
+ for( int32_t i = 0; i < 16; ++i )
+ f_[i] = 0.f;
+}
+
+Mat4::Mat4( const float* mIn )
+{
+ for( int32_t i = 0; i < 16; ++i )
+ f_[i] = mIn[i];
+}
+
+Mat4 Mat4::operator*( const Mat4& rhs ) const
+{
+ Mat4 ret;
+ ret.f_[0] = f_[0] * rhs.f_[0] + f_[4] * rhs.f_[1] + f_[8] * rhs.f_[2]
+ + f_[12] * rhs.f_[3];
+ ret.f_[1] = f_[1] * rhs.f_[0] + f_[5] * rhs.f_[1] + f_[9] * rhs.f_[2]
+ + f_[13] * rhs.f_[3];
+ ret.f_[2] = f_[2] * rhs.f_[0] + f_[6] * rhs.f_[1] + f_[10] * rhs.f_[2]
+ + f_[14] * rhs.f_[3];
+ ret.f_[3] = f_[3] * rhs.f_[0] + f_[7] * rhs.f_[1] + f_[11] * rhs.f_[2]
+ + f_[15] * rhs.f_[3];
+
+ ret.f_[4] = f_[0] * rhs.f_[4] + f_[4] * rhs.f_[5] + f_[8] * rhs.f_[6]
+ + f_[12] * rhs.f_[7];
+ ret.f_[5] = f_[1] * rhs.f_[4] + f_[5] * rhs.f_[5] + f_[9] * rhs.f_[6]
+ + f_[13] * rhs.f_[7];
+ ret.f_[6] = f_[2] * rhs.f_[4] + f_[6] * rhs.f_[5] + f_[10] * rhs.f_[6]
+ + f_[14] * rhs.f_[7];
+ ret.f_[7] = f_[3] * rhs.f_[4] + f_[7] * rhs.f_[5] + f_[11] * rhs.f_[6]
+ + f_[15] * rhs.f_[7];
+
+ ret.f_[8] = f_[0] * rhs.f_[8] + f_[4] * rhs.f_[9] + f_[8] * rhs.f_[10]
+ + f_[12] * rhs.f_[11];
+ ret.f_[9] = f_[1] * rhs.f_[8] + f_[5] * rhs.f_[9] + f_[9] * rhs.f_[10]
+ + f_[13] * rhs.f_[11];
+ ret.f_[10] = f_[2] * rhs.f_[8] + f_[6] * rhs.f_[9] + f_[10] * rhs.f_[10]
+ + f_[14] * rhs.f_[11];
+ ret.f_[11] = f_[3] * rhs.f_[8] + f_[7] * rhs.f_[9] + f_[11] * rhs.f_[10]
+ + f_[15] * rhs.f_[11];
+
+ ret.f_[12] = f_[0] * rhs.f_[12] + f_[4] * rhs.f_[13] + f_[8] * rhs.f_[14]
+ + f_[12] * rhs.f_[15];
+ ret.f_[13] = f_[1] * rhs.f_[12] + f_[5] * rhs.f_[13] + f_[9] * rhs.f_[14]
+ + f_[13] * rhs.f_[15];
+ ret.f_[14] = f_[2] * rhs.f_[12] + f_[6] * rhs.f_[13] + f_[10] * rhs.f_[14]
+ + f_[14] * rhs.f_[15];
+ ret.f_[15] = f_[3] * rhs.f_[12] + f_[7] * rhs.f_[13] + f_[11] * rhs.f_[14]
+ + f_[15] * rhs.f_[15];
+
+ return ret;
+}
+
+Vec4 Mat4::operator*( const Vec4& rhs ) const
+{
+ Vec4 ret;
+ ret.x_ = rhs.x_ * f_[0] + rhs.y_ * f_[4] + rhs.z_ * f_[8] + rhs.w_ * f_[12];
+ ret.y_ = rhs.x_ * f_[1] + rhs.y_ * f_[5] + rhs.z_ * f_[9] + rhs.w_ * f_[13];
+ ret.z_ = rhs.x_ * f_[2] + rhs.y_ * f_[6] + rhs.z_ * f_[10] + rhs.w_ * f_[14];
+ ret.w_ = rhs.x_ * f_[3] + rhs.y_ * f_[7] + rhs.z_ * f_[11] + rhs.w_ * f_[15];
+ return ret;
+}
+
+Mat4 Mat4::Inverse()
+{
+ Mat4 ret;
+ float det_1;
+ float pos = 0;
+ float neg = 0;
+ float temp;
+
+ temp = f_[0] * f_[5] * f_[10];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = f_[4] * f_[9] * f_[2];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = f_[8] * f_[1] * f_[6];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = -f_[8] * f_[5] * f_[2];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = -f_[4] * f_[1] * f_[10];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = -f_[0] * f_[9] * f_[6];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ det_1 = pos + neg;
+
+ if( det_1 == 0.0 )
+ {
+ //Error
+ }
+ else
+ {
+ det_1 = 1.0f / det_1;
+ ret.f_[0] = (f_[5] * f_[10] - f_[9] * f_[6]) * det_1;
+ ret.f_[1] = -(f_[1] * f_[10] - f_[9] * f_[2]) * det_1;
+ ret.f_[2] = (f_[1] * f_[6] - f_[5] * f_[2]) * det_1;
+ ret.f_[4] = -(f_[4] * f_[10] - f_[8] * f_[6]) * det_1;
+ ret.f_[5] = (f_[0] * f_[10] - f_[8] * f_[2]) * det_1;
+ ret.f_[6] = -(f_[0] * f_[6] - f_[4] * f_[2]) * det_1;
+ ret.f_[8] = (f_[4] * f_[9] - f_[8] * f_[5]) * det_1;
+ ret.f_[9] = -(f_[0] * f_[9] - f_[8] * f_[1]) * det_1;
+ ret.f_[10] = (f_[0] * f_[5] - f_[4] * f_[1]) * det_1;
+
+ /* Calculate -C * inverse(A) */
+ ret.f_[12] = -(f_[12] * ret.f_[0] + f_[13] * ret.f_[4] + f_[14] * ret.f_[8]);
+ ret.f_[13] = -(f_[12] * ret.f_[1] + f_[13] * ret.f_[5] + f_[14] * ret.f_[9]);
+ ret.f_[14] = -(f_[12] * ret.f_[2] + f_[13] * ret.f_[6] + f_[14] * ret.f_[10]);
+
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ }
+
+ *this = ret;
+ return *this;
+}
+
+//--------------------------------------------------------------------------------
+// Misc
+//--------------------------------------------------------------------------------
+Mat4 Mat4::RotationX( const float fAngle )
+{
+ Mat4 ret;
+ float fCosine, fSine;
+
+ fCosine = cosf( fAngle );
+ fSine = sinf( fAngle );
+
+ ret.f_[0] = 1.0f;
+ ret.f_[4] = 0.0f;
+ ret.f_[8] = 0.0f;
+ ret.f_[12] = 0.0f;
+ ret.f_[1] = 0.0f;
+ ret.f_[5] = fCosine;
+ ret.f_[9] = fSine;
+ ret.f_[13] = 0.0f;
+ ret.f_[2] = 0.0f;
+ ret.f_[6] = -fSine;
+ ret.f_[10] = fCosine;
+ ret.f_[14] = 0.0f;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+}
+
+Mat4 Mat4::RotationY( const float fAngle )
+{
+ Mat4 ret;
+ float fCosine, fSine;
+
+ fCosine = cosf( fAngle );
+ fSine = sinf( fAngle );
+
+ ret.f_[0] = fCosine;
+ ret.f_[4] = 0.0f;
+ ret.f_[8] = -fSine;
+ ret.f_[12] = 0.0f;
+ ret.f_[1] = 0.0f;
+ ret.f_[5] = 1.0f;
+ ret.f_[9] = 0.0f;
+ ret.f_[13] = 0.0f;
+ ret.f_[2] = fSine;
+ ret.f_[6] = 0.0f;
+ ret.f_[10] = fCosine;
+ ret.f_[14] = 0.0f;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+
+}
+
+Mat4 Mat4::RotationZ( const float fAngle )
+{
+ Mat4 ret;
+ float fCosine, fSine;
+
+ fCosine = cosf( fAngle );
+ fSine = sinf( fAngle );
+
+ ret.f_[0] = fCosine;
+ ret.f_[4] = fSine;
+ ret.f_[8] = 0.0f;
+ ret.f_[12] = 0.0f;
+ ret.f_[1] = -fSine;
+ ret.f_[5] = fCosine;
+ ret.f_[9] = 0.0f;
+ ret.f_[13] = 0.0f;
+ ret.f_[2] = 0.0f;
+ ret.f_[6] = 0.0f;
+ ret.f_[10] = 1.0f;
+ ret.f_[14] = 0.0f;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+}
+
+Mat4 Mat4::Translation( const float fX, const float fY, const float fZ )
+{
+ Mat4 ret;
+ ret.f_[0] = 1.0f;
+ ret.f_[4] = 0.0f;
+ ret.f_[8] = 0.0f;
+ ret.f_[12] = fX;
+ ret.f_[1] = 0.0f;
+ ret.f_[5] = 1.0f;
+ ret.f_[9] = 0.0f;
+ ret.f_[13] = fY;
+ ret.f_[2] = 0.0f;
+ ret.f_[6] = 0.0f;
+ ret.f_[10] = 1.0f;
+ ret.f_[14] = fZ;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+}
+
+Mat4 Mat4::Translation( const Vec3 vec )
+{
+ Mat4 ret;
+ ret.f_[0] = 1.0f;
+ ret.f_[4] = 0.0f;
+ ret.f_[8] = 0.0f;
+ ret.f_[12] = vec.x_;
+ ret.f_[1] = 0.0f;
+ ret.f_[5] = 1.0f;
+ ret.f_[9] = 0.0f;
+ ret.f_[13] = vec.y_;
+ ret.f_[2] = 0.0f;
+ ret.f_[6] = 0.0f;
+ ret.f_[10] = 1.0f;
+ ret.f_[14] = vec.z_;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+}
+
+Mat4 Mat4::Perspective( float width, float height, float nearPlane, float farPlane )
+{
+ float n2 = 2.0f * nearPlane;
+ float rcpnmf = 1.f / (nearPlane - farPlane);
+
+ Mat4 result;
+ result.f_[0] = n2 / width;
+ result.f_[4] = 0;
+ result.f_[8] = 0;
+ result.f_[12] = 0;
+ result.f_[1] = 0;
+ result.f_[5] = n2 / height;
+ result.f_[9] = 0;
+ result.f_[13] = 0;
+ result.f_[2] = 0;
+ result.f_[6] = 0;
+ result.f_[10] = (farPlane + nearPlane) * rcpnmf;
+ result.f_[14] = farPlane * rcpnmf * n2;
+ result.f_[3] = 0;
+ result.f_[7] = 0;
+ result.f_[11] = -1.0;
+ result.f_[15] = 0;
+
+ return result;
+}
+
+Mat4 Mat4::LookAt( const Vec3& vec_eye, const Vec3& vec_at, const Vec3& vec_up )
+{
+ Vec3 vec_forward, vec_up_norm, vec_side;
+ Mat4 result;
+
+ vec_forward.x_ = vec_eye.x_ - vec_at.x_;
+ vec_forward.y_ = vec_eye.y_ - vec_at.y_;
+ vec_forward.z_ = vec_eye.z_ - vec_at.z_;
+
+ vec_forward.Normalize();
+ vec_up_norm = vec_up;
+ vec_up_norm.Normalize();
+ vec_side = vec_up_norm.Cross( vec_forward );
+ vec_up_norm = vec_forward.Cross( vec_side );
+
+ result.f_[0] = vec_side.x_;
+ result.f_[4] = vec_side.y_;
+ result.f_[8] = vec_side.z_;
+ result.f_[12] = 0;
+ result.f_[1] = vec_up_norm.x_;
+ result.f_[5] = vec_up_norm.y_;
+ result.f_[9] = vec_up_norm.z_;
+ result.f_[13] = 0;
+ result.f_[2] = vec_forward.x_;
+ result.f_[6] = vec_forward.y_;
+ result.f_[10] = vec_forward.z_;
+ result.f_[14] = 0;
+ result.f_[3] = 0;
+ result.f_[7] = 0;
+ result.f_[11] = 0;
+ result.f_[15] = 1.0;
+
+ result.PostTranslate( -vec_eye.x_, -vec_eye.y_, -vec_eye.z_ );
+ return result;
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/vecmath.h b/ndk/sources/android/ndk_helper/vecmath.h
new file mode 100644
index 0000000..0692e3d
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/vecmath.h
@@ -0,0 +1,1116 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef VECMATH_H_
+#define VECMATH_H_
+
+#include <math.h>
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Helper class for vector math operations
+ * Currently all implementations are in pure C++.
+ * Each class is an opaque class so caller does not have a direct access
+ * to each element. This is for an ease of future optimization to use vector operations.
+ *
+ */
+
+class Vec2;
+class Vec3;
+class Vec4;
+class Mat4;
+
+/******************************************************************
+ * 2 elements vector class
+ *
+ */
+class Vec2
+{
+private:
+ float x_;
+ float y_;
+
+public:
+ friend class Vec3;
+ friend class Vec4;
+ friend class Mat4;
+ friend class Quaternion;
+
+ Vec2()
+ {
+ x_ = y_ = 0.f;
+ }
+
+ Vec2( const float fX, const float fY )
+ {
+ x_ = fX;
+ y_ = fY;
+ }
+
+ Vec2( const Vec2& vec )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ }
+
+ Vec2( const float* pVec )
+ {
+ x_ = (*pVec++);
+ y_ = (*pVec++);
+ }
+
+ //Operators
+ Vec2 operator*( const Vec2& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ * rhs.x_;
+ ret.y_ = y_ * rhs.y_;
+ return ret;
+ }
+
+ Vec2 operator/( const Vec2& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ / rhs.x_;
+ ret.y_ = y_ / rhs.y_;
+ return ret;
+ }
+
+ Vec2 operator+( const Vec2& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ + rhs.x_;
+ ret.y_ = y_ + rhs.y_;
+ return ret;
+ }
+
+ Vec2 operator-( const Vec2& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ - rhs.x_;
+ ret.y_ = y_ - rhs.y_;
+ return ret;
+ }
+
+ Vec2& operator+=( const Vec2& rhs )
+ {
+ x_ += rhs.x_;
+ y_ += rhs.y_;
+ return *this;
+ }
+
+ Vec2& operator-=( const Vec2& rhs )
+ {
+ x_ -= rhs.x_;
+ y_ -= rhs.y_;
+ return *this;
+ }
+
+ Vec2& operator*=( const Vec2& rhs )
+ {
+ x_ *= rhs.x_;
+ y_ *= rhs.y_;
+ return *this;
+ }
+
+ Vec2& operator/=( const Vec2& rhs )
+ {
+ x_ /= rhs.x_;
+ y_ /= rhs.y_;
+ return *this;
+ }
+
+ //External operators
+ friend Vec2 operator-( const Vec2& rhs )
+ {
+ return Vec2( rhs ) *= -1;
+ }
+
+ friend Vec2 operator*( const float lhs, const Vec2& rhs )
+ {
+ Vec2 ret;
+ ret.x_ = lhs * rhs.x_;
+ ret.y_ = lhs * rhs.y_;
+ return ret;
+ }
+
+ friend Vec2 operator/( const float lhs, const Vec2& rhs )
+ {
+ Vec2 ret;
+ ret.x_ = lhs / rhs.x_;
+ ret.y_ = lhs / rhs.y_;
+ return ret;
+ }
+
+ //Operators with float
+ Vec2 operator*( const float& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ * rhs;
+ ret.y_ = y_ * rhs;
+ return ret;
+ }
+
+ Vec2& operator*=( const float& rhs )
+ {
+ x_ = x_ * rhs;
+ y_ = y_ * rhs;
+ return *this;
+ }
+
+ Vec2 operator/( const float& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ / rhs;
+ ret.y_ = y_ / rhs;
+ return ret;
+ }
+
+ Vec2& operator/=( const float& rhs )
+ {
+ x_ = x_ / rhs;
+ y_ = y_ / rhs;
+ return *this;
+ }
+
+ //Compare
+ bool operator==( const Vec2& rhs ) const
+ {
+ if( x_ != rhs.x_ || y_ != rhs.y_ )
+ return false;
+ return true;
+ }
+
+ bool operator!=( const Vec2& rhs ) const
+ {
+ if( x_ == rhs.x_ )
+ return false;
+
+ return true;
+ }
+
+ float Length() const
+ {
+ return sqrtf( x_ * x_ + y_ * y_ );
+ }
+
+ Vec2 Normalize()
+ {
+ float len = Length();
+ x_ = x_ / len;
+ y_ = y_ / len;
+ return *this;
+ }
+
+ float Dot( const Vec2& rhs )
+ {
+ return x_ * rhs.x_ + y_ * rhs.y_;
+ }
+
+ bool Validate()
+ {
+ if( isnan( x_ ) || isnan( y_ ) )
+ return false;
+ return true;
+ }
+
+ void Value( float& fX, float& fY )
+ {
+ fX = x_;
+ fY = y_;
+ }
+
+ void Dump()
+ {
+ LOGI( "Vec2 %f %f", x_, y_ );
+ }
+};
+
+/******************************************************************
+ * 3 elements vector class
+ *
+ */
+class Vec3
+{
+private:
+ float x_, y_, z_;
+
+public:
+ friend class Vec4;
+ friend class Mat4;
+ friend class Quaternion;
+
+ Vec3()
+ {
+ x_ = y_ = z_ = 0.f;
+ }
+
+ Vec3( const float fX, const float fY, const float fZ )
+ {
+ x_ = fX;
+ y_ = fY;
+ z_ = fZ;
+ }
+
+ Vec3( const Vec3& vec )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+ }
+
+ Vec3( const float* pVec )
+ {
+ x_ = (*pVec++);
+ y_ = (*pVec++);
+ z_ = *pVec;
+ }
+
+ Vec3( const Vec2& vec, float f )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = f;
+ }
+
+ Vec3( const Vec4& vec );
+
+ //Operators
+ Vec3 operator*( const Vec3& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ * rhs.x_;
+ ret.y_ = y_ * rhs.y_;
+ ret.z_ = z_ * rhs.z_;
+ return ret;
+ }
+
+ Vec3 operator/( const Vec3& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ / rhs.x_;
+ ret.y_ = y_ / rhs.y_;
+ ret.z_ = z_ / rhs.z_;
+ return ret;
+ }
+
+ Vec3 operator+( const Vec3& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ + rhs.x_;
+ ret.y_ = y_ + rhs.y_;
+ ret.z_ = z_ + rhs.z_;
+ return ret;
+ }
+
+ Vec3 operator-( const Vec3& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ - rhs.x_;
+ ret.y_ = y_ - rhs.y_;
+ ret.z_ = z_ - rhs.z_;
+ return ret;
+ }
+
+ Vec3& operator+=( const Vec3& rhs )
+ {
+ x_ += rhs.x_;
+ y_ += rhs.y_;
+ z_ += rhs.z_;
+ return *this;
+ }
+
+ Vec3& operator-=( const Vec3& rhs )
+ {
+ x_ -= rhs.x_;
+ y_ -= rhs.y_;
+ z_ -= rhs.z_;
+ return *this;
+ }
+
+ Vec3& operator*=( const Vec3& rhs )
+ {
+ x_ *= rhs.x_;
+ y_ *= rhs.y_;
+ z_ *= rhs.z_;
+ return *this;
+ }
+
+ Vec3& operator/=( const Vec3& rhs )
+ {
+ x_ /= rhs.x_;
+ y_ /= rhs.y_;
+ z_ /= rhs.z_;
+ return *this;
+ }
+
+ //External operators
+ friend Vec3 operator-( const Vec3& rhs )
+ {
+ return Vec3( rhs ) *= -1;
+ }
+
+ friend Vec3 operator*( const float lhs, const Vec3& rhs )
+ {
+ Vec3 ret;
+ ret.x_ = lhs * rhs.x_;
+ ret.y_ = lhs * rhs.y_;
+ ret.z_ = lhs * rhs.z_;
+ return ret;
+ }
+
+ friend Vec3 operator/( const float lhs, const Vec3& rhs )
+ {
+ Vec3 ret;
+ ret.x_ = lhs / rhs.x_;
+ ret.y_ = lhs / rhs.y_;
+ ret.z_ = lhs / rhs.z_;
+ return ret;
+ }
+
+ //Operators with float
+ Vec3 operator*( const float& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ * rhs;
+ ret.y_ = y_ * rhs;
+ ret.z_ = z_ * rhs;
+ return ret;
+ }
+
+ Vec3& operator*=( const float& rhs )
+ {
+ x_ = x_ * rhs;
+ y_ = y_ * rhs;
+ z_ = z_ * rhs;
+ return *this;
+ }
+
+ Vec3 operator/( const float& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ / rhs;
+ ret.y_ = y_ / rhs;
+ ret.z_ = z_ / rhs;
+ return ret;
+ }
+
+ Vec3& operator/=( const float& rhs )
+ {
+ x_ = x_ / rhs;
+ y_ = y_ / rhs;
+ z_ = z_ / rhs;
+ return *this;
+ }
+
+ //Compare
+ bool operator==( const Vec3& rhs ) const
+ {
+ if( x_ != rhs.x_ || y_ != rhs.y_ || z_ != rhs.z_ )
+ return false;
+ return true;
+ }
+
+ bool operator!=( const Vec3& rhs ) const
+ {
+ if( x_ == rhs.x_ )
+ return false;
+
+ return true;
+ }
+
+ float Length() const
+ {
+ return sqrtf( x_ * x_ + y_ * y_ + z_ * z_ );
+ }
+
+ Vec3 Normalize()
+ {
+ float len = Length();
+ x_ = x_ / len;
+ y_ = y_ / len;
+ z_ = z_ / len;
+ return *this;
+ }
+
+ float Dot( const Vec3& rhs )
+ {
+ return x_ * rhs.x_ + y_ * rhs.y_ + z_ * rhs.z_;
+ }
+
+ Vec3 Cross( const Vec3& rhs )
+ {
+ Vec3 ret;
+ ret.x_ = y_ * rhs.z_ - z_ * rhs.y_;
+ ret.y_ = z_ * rhs.x_ - x_ * rhs.z_;
+ ret.z_ = x_ * rhs.y_ - y_ * rhs.x_;
+ return ret;
+ }
+
+ bool Validate()
+ {
+ if( isnan( x_ ) || isnan( y_ ) || isnan( z_ ) )
+ return false;
+ return true;
+ }
+
+ void Value( float& fX, float& fY, float& fZ )
+ {
+ fX = x_;
+ fY = y_;
+ fZ = z_;
+ }
+
+ void Dump()
+ {
+ LOGI( "Vec3 %f %f %f", x_, y_, z_ );
+ }
+};
+
+/******************************************************************
+ * 4 elements vector class
+ *
+ */
+class Vec4
+{
+private:
+ float x_, y_, z_, w_;
+
+public:
+ friend class Vec3;
+ friend class Mat4;
+ friend class Quaternion;
+
+ Vec4()
+ {
+ x_ = y_ = z_ = w_ = 0.f;
+ }
+
+ Vec4( const float fX, const float fY, const float fZ, const float fW )
+ {
+ x_ = fX;
+ y_ = fY;
+ z_ = fZ;
+ w_ = fW;
+ }
+
+ Vec4( const Vec4& vec )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+ w_ = vec.w_;
+ }
+
+ Vec4( const Vec3& vec, const float fW )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+ w_ = fW;
+ }
+
+ Vec4( const float* pVec )
+ {
+ x_ = (*pVec++);
+ y_ = (*pVec++);
+ z_ = *pVec;
+ w_ = *pVec;
+ }
+
+ //Operators
+ Vec4 operator*( const Vec4& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ * rhs.x_;
+ ret.y_ = y_ * rhs.y_;
+ ret.z_ = z_ * rhs.z_;
+ ret.w_ = z_ * rhs.w_;
+ return ret;
+ }
+
+ Vec4 operator/( const Vec4& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ / rhs.x_;
+ ret.y_ = y_ / rhs.y_;
+ ret.z_ = z_ / rhs.z_;
+ ret.w_ = z_ / rhs.w_;
+ return ret;
+ }
+
+ Vec4 operator+( const Vec4& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ + rhs.x_;
+ ret.y_ = y_ + rhs.y_;
+ ret.z_ = z_ + rhs.z_;
+ ret.w_ = z_ + rhs.w_;
+ return ret;
+ }
+
+ Vec4 operator-( const Vec4& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ - rhs.x_;
+ ret.y_ = y_ - rhs.y_;
+ ret.z_ = z_ - rhs.z_;
+ ret.w_ = z_ - rhs.w_;
+ return ret;
+ }
+
+ Vec4& operator+=( const Vec4& rhs )
+ {
+ x_ += rhs.x_;
+ y_ += rhs.y_;
+ z_ += rhs.z_;
+ w_ += rhs.w_;
+ return *this;
+ }
+
+ Vec4& operator-=( const Vec4& rhs )
+ {
+ x_ -= rhs.x_;
+ y_ -= rhs.y_;
+ z_ -= rhs.z_;
+ w_ -= rhs.w_;
+ return *this;
+ }
+
+ Vec4& operator*=( const Vec4& rhs )
+ {
+ x_ *= rhs.x_;
+ y_ *= rhs.y_;
+ z_ *= rhs.z_;
+ w_ *= rhs.w_;
+ return *this;
+ }
+
+ Vec4& operator/=( const Vec4& rhs )
+ {
+ x_ /= rhs.x_;
+ y_ /= rhs.y_;
+ z_ /= rhs.z_;
+ w_ /= rhs.w_;
+ return *this;
+ }
+
+ //External operators
+ friend Vec4 operator-( const Vec4& rhs )
+ {
+ return Vec4( rhs ) *= -1;
+ }
+
+ friend Vec4 operator*( const float lhs, const Vec4& rhs )
+ {
+ Vec4 ret;
+ ret.x_ = lhs * rhs.x_;
+ ret.y_ = lhs * rhs.y_;
+ ret.z_ = lhs * rhs.z_;
+ ret.w_ = lhs * rhs.w_;
+ return ret;
+ }
+
+ friend Vec4 operator/( const float lhs, const Vec4& rhs )
+ {
+ Vec4 ret;
+ ret.x_ = lhs / rhs.x_;
+ ret.y_ = lhs / rhs.y_;
+ ret.z_ = lhs / rhs.z_;
+ ret.w_ = lhs / rhs.w_;
+ return ret;
+ }
+
+ //Operators with float
+ Vec4 operator*( const float& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ * rhs;
+ ret.y_ = y_ * rhs;
+ ret.z_ = z_ * rhs;
+ ret.w_ = w_ * rhs;
+ return ret;
+ }
+
+ Vec4& operator*=( const float& rhs )
+ {
+ x_ = x_ * rhs;
+ y_ = y_ * rhs;
+ z_ = z_ * rhs;
+ w_ = w_ * rhs;
+ return *this;
+ }
+
+ Vec4 operator/( const float& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ / rhs;
+ ret.y_ = y_ / rhs;
+ ret.z_ = z_ / rhs;
+ ret.w_ = w_ / rhs;
+ return ret;
+ }
+
+ Vec4& operator/=( const float& rhs )
+ {
+ x_ = x_ / rhs;
+ y_ = y_ / rhs;
+ z_ = z_ / rhs;
+ w_ = w_ / rhs;
+ return *this;
+ }
+
+ //Compare
+ bool operator==( const Vec4& rhs ) const
+ {
+ if( x_ != rhs.x_ || y_ != rhs.y_ || z_ != rhs.z_ || w_ != rhs.w_ )
+ return false;
+ return true;
+ }
+
+ bool operator!=( const Vec4& rhs ) const
+ {
+ if( x_ == rhs.x_ )
+ return false;
+
+ return true;
+ }
+
+ Vec4 operator*( const Mat4& rhs ) const;
+
+ float Length() const
+ {
+ return sqrtf( x_ * x_ + y_ * y_ + z_ * z_ + w_ * w_ );
+ }
+
+ Vec4 Normalize()
+ {
+ float len = Length();
+ x_ = x_ / len;
+ y_ = y_ / len;
+ z_ = z_ / len;
+ w_ = w_ / len;
+ return *this;
+ }
+
+ float Dot( const Vec3& rhs )
+ {
+ return x_ * rhs.x_ + y_ * rhs.y_ + z_ * rhs.z_;
+ }
+
+ Vec3 Cross( const Vec3& rhs )
+ {
+ Vec3 ret;
+ ret.x_ = y_ * rhs.z_ - z_ * rhs.y_;
+ ret.y_ = z_ * rhs.x_ - x_ * rhs.z_;
+ ret.z_ = x_ * rhs.y_ - y_ * rhs.x_;
+ return ret;
+ }
+
+ bool Validate()
+ {
+ if( isnan( x_ ) || isnan( y_ ) || isnan( z_ ) || isnan( w_ ) )
+ return false;
+ return true;
+ }
+
+ void Value( float& fX, float& fY, float& fZ, float& fW )
+ {
+ fX = x_;
+ fY = y_;
+ fZ = z_;
+ fW = w_;
+ }
+};
+
+/******************************************************************
+ * 4x4 matrix
+ *
+ */
+class Mat4
+{
+private:
+ float f_[16];
+
+public:
+ friend class Vec3;
+ friend class Vec4;
+ friend class Quaternion;
+
+ Mat4();
+ Mat4( const float* );
+
+ Mat4 operator*( const Mat4& rhs ) const;
+ Vec4 operator*( const Vec4& rhs ) const;
+
+ Mat4 operator+( const Mat4& rhs ) const
+ {
+ Mat4 ret;
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ ret.f_[i] = f_[i] + rhs.f_[i];
+ }
+ return ret;
+ }
+
+ Mat4 operator-( const Mat4& rhs ) const
+ {
+ Mat4 ret;
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ ret.f_[i] = f_[i] - rhs.f_[i];
+ }
+ return ret;
+ }
+
+ Mat4& operator+=( const Mat4& rhs )
+ {
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ f_[i] += rhs.f_[i];
+ }
+ return *this;
+ }
+
+ Mat4& operator-=( const Mat4& rhs )
+ {
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ f_[i] -= rhs.f_[i];
+ }
+ return *this;
+ }
+
+ Mat4& operator*=( const Mat4& rhs )
+ {
+ Mat4 ret;
+ ret.f_[0] = f_[0] * rhs.f_[0] + f_[4] * rhs.f_[1] + f_[8] * rhs.f_[2]
+ + f_[12] * rhs.f_[3];
+ ret.f_[1] = f_[1] * rhs.f_[0] + f_[5] * rhs.f_[1] + f_[9] * rhs.f_[2]
+ + f_[13] * rhs.f_[3];
+ ret.f_[2] = f_[2] * rhs.f_[0] + f_[6] * rhs.f_[1] + f_[10] * rhs.f_[2]
+ + f_[14] * rhs.f_[3];
+ ret.f_[3] = f_[3] * rhs.f_[0] + f_[7] * rhs.f_[1] + f_[11] * rhs.f_[2]
+ + f_[15] * rhs.f_[3];
+
+ ret.f_[4] = f_[0] * rhs.f_[4] + f_[4] * rhs.f_[5] + f_[8] * rhs.f_[6]
+ + f_[12] * rhs.f_[7];
+ ret.f_[5] = f_[1] * rhs.f_[4] + f_[5] * rhs.f_[5] + f_[9] * rhs.f_[6]
+ + f_[13] * rhs.f_[7];
+ ret.f_[6] = f_[2] * rhs.f_[4] + f_[6] * rhs.f_[5] + f_[10] * rhs.f_[6]
+ + f_[14] * rhs.f_[7];
+ ret.f_[7] = f_[3] * rhs.f_[4] + f_[7] * rhs.f_[5] + f_[11] * rhs.f_[6]
+ + f_[15] * rhs.f_[7];
+
+ ret.f_[8] = f_[0] * rhs.f_[8] + f_[4] * rhs.f_[9] + f_[8] * rhs.f_[10]
+ + f_[12] * rhs.f_[11];
+ ret.f_[9] = f_[1] * rhs.f_[8] + f_[5] * rhs.f_[9] + f_[9] * rhs.f_[10]
+ + f_[13] * rhs.f_[11];
+ ret.f_[10] = f_[2] * rhs.f_[8] + f_[6] * rhs.f_[9] + f_[10] * rhs.f_[10]
+ + f_[14] * rhs.f_[11];
+ ret.f_[11] = f_[3] * rhs.f_[8] + f_[7] * rhs.f_[9] + f_[11] * rhs.f_[10]
+ + f_[15] * rhs.f_[11];
+
+ ret.f_[12] = f_[0] * rhs.f_[12] + f_[4] * rhs.f_[13] + f_[8] * rhs.f_[14]
+ + f_[12] * rhs.f_[15];
+ ret.f_[13] = f_[1] * rhs.f_[12] + f_[5] * rhs.f_[13] + f_[9] * rhs.f_[14]
+ + f_[13] * rhs.f_[15];
+ ret.f_[14] = f_[2] * rhs.f_[12] + f_[6] * rhs.f_[13] + f_[10] * rhs.f_[14]
+ + f_[14] * rhs.f_[15];
+ ret.f_[15] = f_[3] * rhs.f_[12] + f_[7] * rhs.f_[13] + f_[11] * rhs.f_[14]
+ + f_[15] * rhs.f_[15];
+
+ *this = ret;
+ return *this;
+ }
+
+ Mat4 operator*( const float rhs )
+ {
+ Mat4 ret;
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ ret.f_[i] = f_[i] * rhs;
+ }
+ return ret;
+ }
+
+ Mat4& operator*=( const float rhs )
+ {
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ f_[i] *= rhs;
+ }
+ return *this;
+ }
+
+ Mat4& operator=( const Mat4& rhs )
+ {
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ f_[i] = rhs.f_[i];
+ }
+ return *this;
+ }
+
+ Mat4 Inverse();
+
+ Mat4 Transpose()
+ {
+ Mat4 ret;
+ ret.f_[0] = f_[0];
+ ret.f_[1] = f_[4];
+ ret.f_[2] = f_[8];
+ ret.f_[3] = f_[12];
+ ret.f_[4] = f_[1];
+ ret.f_[5] = f_[5];
+ ret.f_[6] = f_[9];
+ ret.f_[7] = f_[13];
+ ret.f_[8] = f_[2];
+ ret.f_[9] = f_[6];
+ ret.f_[10] = f_[10];
+ ret.f_[11] = f_[14];
+ ret.f_[12] = f_[3];
+ ret.f_[13] = f_[7];
+ ret.f_[14] = f_[11];
+ ret.f_[15] = f_[15];
+ *this = ret;
+ return *this;
+ }
+
+ Mat4& PostTranslate( float tx, float ty, float tz )
+ {
+ f_[12] += (tx * f_[0]) + (ty * f_[4]) + (tz * f_[8]);
+ f_[13] += (tx * f_[1]) + (ty * f_[5]) + (tz * f_[9]);
+ f_[14] += (tx * f_[2]) + (ty * f_[6]) + (tz * f_[10]);
+ f_[15] += (tx * f_[3]) + (ty * f_[7]) + (tz * f_[11]);
+ return *this;
+ }
+
+ float* Ptr()
+ {
+ return f_;
+ }
+
+ //--------------------------------------------------------------------------------
+ // Misc
+ //--------------------------------------------------------------------------------
+ static Mat4 Perspective( float width, float height, float nearPlane, float farPlane );
+
+ static Mat4 LookAt( const Vec3& vEye, const Vec3& vAt, const Vec3& vUp );
+
+ static Mat4 Translation( const float fX, const float fY, const float fZ );
+ static Mat4 Translation( const Vec3 vec );
+
+ static Mat4 RotationX( const float angle );
+
+ static Mat4 RotationY( const float angle );
+
+ static Mat4 RotationZ( const float angle );
+
+ static Mat4 Identity()
+ {
+ Mat4 ret;
+ ret.f_[0] = 1.f;
+ ret.f_[1] = 0;
+ ret.f_[2] = 0;
+ ret.f_[3] = 0;
+ ret.f_[4] = 0;
+ ret.f_[5] = 1.f;
+ ret.f_[6] = 0;
+ ret.f_[7] = 0;
+ ret.f_[8] = 0;
+ ret.f_[9] = 0;
+ ret.f_[10] = 1.f;
+ ret.f_[11] = 0;
+ ret.f_[12] = 0;
+ ret.f_[13] = 0;
+ ret.f_[14] = 0;
+ ret.f_[15] = 1.f;
+ return ret;
+ }
+
+ void Dump()
+ {
+ LOGI( "%f %f %f %f", f_[0], f_[1], f_[2], f_[3] );
+ LOGI( "%f %f %f %f", f_[4], f_[5], f_[6], f_[7] );
+ LOGI( "%f %f %f %f", f_[8], f_[9], f_[10], f_[11] );
+ LOGI( "%f %f %f %f", f_[12], f_[13], f_[14], f_[15] );
+ }
+};
+
+/******************************************************************
+ * Quaternion class
+ *
+ */
+class Quaternion
+{
+private:
+ float x_, y_, z_, w_;
+
+public:
+ friend class Vec3;
+ friend class Vec4;
+ friend class Mat4;
+
+ Quaternion()
+ {
+ x_ = 0.f;
+ y_ = 0.f;
+ z_ = 0.f;
+ w_ = 1.f;
+ }
+
+ Quaternion( const float fX, const float fY, const float fZ, const float fW )
+ {
+ x_ = fX;
+ y_ = fY;
+ z_ = fZ;
+ w_ = fW;
+ }
+
+ Quaternion( const Vec3 vec, const float fW )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+ w_ = fW;
+ }
+
+ Quaternion( const float* p )
+ {
+ x_ = *p++;
+ y_ = *p++;
+ z_ = *p++;
+ w_ = *p++;
+ }
+
+ Quaternion operator*( const Quaternion rhs )
+ {
+ Quaternion ret;
+ ret.x_ = x_ * rhs.w_ + y_ * rhs.z_ - z_ * rhs.y_ + w_ * rhs.x_;
+ ret.y_ = -x_ * rhs.z_ + y_ * rhs.w_ + z_ * rhs.x_ + w_ * rhs.y_;
+ ret.z_ = x_ * rhs.y_ - y_ * rhs.x_ + z_ * rhs.w_ + w_ * rhs.z_;
+ ret.w_ = -x_ * rhs.x_ - y_ * rhs.y_ - z_ * rhs.z_ + w_ * rhs.w_;
+ return ret;
+ }
+
+ Quaternion& operator*=( const Quaternion rhs )
+ {
+ Quaternion ret;
+ ret.x_ = x_ * rhs.w_ + y_ * rhs.z_ - z_ * rhs.y_ + w_ * rhs.x_;
+ ret.y_ = -x_ * rhs.z_ + y_ * rhs.w_ + z_ * rhs.x_ + w_ * rhs.y_;
+ ret.z_ = x_ * rhs.y_ - y_ * rhs.x_ + z_ * rhs.w_ + w_ * rhs.z_;
+ ret.w_ = -x_ * rhs.x_ - y_ * rhs.y_ - z_ * rhs.z_ + w_ * rhs.w_;
+ *this = ret;
+ return *this;
+ }
+
+ Quaternion Conjugate()
+ {
+ x_ = -x_;
+ y_ = -y_;
+ z_ = -z_;
+ return *this;
+ }
+
+ //Non destuctive version
+ Quaternion Conjugated()
+ {
+ Quaternion ret;
+ ret.x_ = -x_;
+ ret.y_ = -y_;
+ ret.z_ = -z_;
+ ret.w_ = w_;
+ return ret;
+ }
+
+ void ToMatrix( Mat4& mat )
+ {
+ float x2 = x_ * x_ * 2.0f;
+ float y2 = y_ * y_ * 2.0f;
+ float z2 = z_ * z_ * 2.0f;
+ float xy = x_ * y_ * 2.0f;
+ float yz = y_ * z_ * 2.0f;
+ float zx = z_ * x_ * 2.0f;
+ float xw = x_ * w_ * 2.0f;
+ float yw = y_ * w_ * 2.0f;
+ float zw = z_ * w_ * 2.0f;
+
+ mat.f_[0] = 1.0f - y2 - z2;
+ mat.f_[1] = xy + zw;
+ mat.f_[2] = zx - yw;
+ mat.f_[4] = xy - zw;
+ mat.f_[5] = 1.0f - z2 - x2;
+ mat.f_[6] = yz + xw;
+ mat.f_[8] = zx + yw;
+ mat.f_[9] = yz - xw;
+ mat.f_[10] = 1.0f - x2 - y2;
+
+ mat.f_[3] = mat.f_[7] = mat.f_[11] = mat.f_[12] = mat.f_[13] = mat.f_[14] = 0.0f;
+ mat.f_[15] = 1.0f;
+ }
+
+ void ToMatrixPreserveTranslate( Mat4& mat )
+ {
+ float x2 = x_ * x_ * 2.0f;
+ float y2 = y_ * y_ * 2.0f;
+ float z2 = z_ * z_ * 2.0f;
+ float xy = x_ * y_ * 2.0f;
+ float yz = y_ * z_ * 2.0f;
+ float zx = z_ * x_ * 2.0f;
+ float xw = x_ * w_ * 2.0f;
+ float yw = y_ * w_ * 2.0f;
+ float zw = z_ * w_ * 2.0f;
+
+ mat.f_[0] = 1.0f - y2 - z2;
+ mat.f_[1] = xy + zw;
+ mat.f_[2] = zx - yw;
+ mat.f_[4] = xy - zw;
+ mat.f_[5] = 1.0f - z2 - x2;
+ mat.f_[6] = yz + xw;
+ mat.f_[8] = zx + yw;
+ mat.f_[9] = yz - xw;
+ mat.f_[10] = 1.0f - x2 - y2;
+
+ mat.f_[3] = mat.f_[7] = mat.f_[11] = 0.0f;
+ mat.f_[15] = 1.0f;
+ }
+
+ static Quaternion RotationAxis( const Vec3 axis, const float angle )
+ {
+ Quaternion ret;
+ float s = sinf( angle / 2 );
+ ret.x_ = s * axis.x_;
+ ret.y_ = s * axis.y_;
+ ret.z_ = s * axis.z_;
+ ret.w_ = cosf( angle / 2 );
+ return ret;
+ }
+
+ void Value( float& fX, float& fY, float& fZ, float& fW )
+ {
+ fX = x_;
+ fY = y_;
+ fZ = z_;
+ fW = w_;
+ }
+};
+
+} //namespace ndk_helper
+#endif /* VECMATH_H_ */
diff --git a/ndk/tools/headers-diff-bionic-vs-ndk.py b/ndk/tools/headers-diff-bionic-vs-ndk.py
index 1f8a9e3..cb4157d 100755
--- a/ndk/tools/headers-diff-bionic-vs-ndk.py
+++ b/ndk/tools/headers-diff-bionic-vs-ndk.py
@@ -152,7 +152,8 @@
path_bionic = os.path.join(self.bionic_root, arch_root, 'include', root)
## for every header that both in Bionic and sysroot ##
for include in pack[1]:
- if include in self.sysincludes[arch][root]:
+ if (root in self.sysincludes[arch]) and \
+ (include in self.sysincludes[arch][root]):
## completing paths ##
platform = self.sysincludes[arch][root][include][0]
file_origin = os.path.join(path_bionic, include)
diff --git a/samples/AccelerometerPlay/src/com/example/android/accelerometerplay/AccelerometerPlayActivity.java b/samples/AccelerometerPlay/src/com/example/android/accelerometerplay/AccelerometerPlayActivity.java
index c9e840f..f71cf9f 100644
--- a/samples/AccelerometerPlay/src/com/example/android/accelerometerplay/AccelerometerPlayActivity.java
+++ b/samples/AccelerometerPlay/src/com/example/android/accelerometerplay/AccelerometerPlayActivity.java
@@ -165,7 +165,7 @@
final float gy = -sy * m;
/*
- * ·F = mA <=> A = ·F / m We could simplify the code by
+ * F = mA <=> A = F / m We could simplify the code by
* completely eliminating "m" (the mass) from all the equations,
* but it would hide the concepts from this sample code.
*/
@@ -175,12 +175,12 @@
/*
* Time-corrected Verlet integration The position Verlet
- * integrator is defined as x(t+Æt) = x(t) + x(t) - x(t-Æt) +
- * a(t)Ætö2 However, the above equation doesn't handle variable
- * Æt very well, a time-corrected version is needed: x(t+Æt) =
- * x(t) + (x(t) - x(t-Æt)) * (Æt/Æt_prev) + a(t)Ætö2 We also add
- * a simple friction term (f) to the equation: x(t+Æt) = x(t) +
- * (1-f) * (x(t) - x(t-Æt)) * (Æt/Æt_prev) + a(t)Ætö2
+ * integrator is defined as x(t+dt) = x(t) + x(t) - x(t-dt) +
+ * a(t).t^2 However, the above equation doesn't handle variable
+ * dt very well, a time-corrected version is needed: x(t+dt) =
+ * x(t) + (x(t) - x(t-dt)) * (dt/dt_prev) + a(t).t^2 We also add
+ * a simple friction term (f) to the equation: x(t+dt) = x(t) +
+ * (1-f) * (x(t) - x(t-dt)) * (dt/dt_prev) + a(t)t^2
*/
final float dTdT = dT * dT;
final float x = mPosX + mOneMinusFriction * dTC * (mPosX - mLastPosX) + mAccelX
diff --git a/samples/browseable/ActivityInstrumentation/_index.jd b/samples/browseable/ActivityInstrumentation/_index.jd
index fa62724..369ff7e 100644
--- a/samples/browseable/ActivityInstrumentation/_index.jd
+++ b/samples/browseable/ActivityInstrumentation/_index.jd
@@ -5,8 +5,8 @@
sample.group=Testing
@jd:body
-<p>This sample demonstrates how to use an
-{@link android.test.InstrumentationTestCase} to test the internal state of an
+<p>This sample demonstrates how to use an
+{@link android.test.InstrumentationTestCase} to test the internal state of an
{@link android.app.Activity}.</p>
<p>To learn more about using Android's custom testing framework, see
<a href="{@docRoot}training/activity-testing/index.html">Testing Your
diff --git a/samples/browseable/TextLinkify/_index.jd b/samples/browseable/TextLinkify/_index.jd
index 9f31930..36aa075 100644
--- a/samples/browseable/TextLinkify/_index.jd
+++ b/samples/browseable/TextLinkify/_index.jd
@@ -8,7 +8,7 @@
<p>This sample demonstrates how to add clickable links to a
{@link android.widget.TextView}, by using these techniques:
<ul>
-<li>Setting the {@link android.R.styleable#TextView_autoLink} property
+<li>Setting the {@link android.R.styleable#TextView_autoLink} property
to automatically convert the text to a link.</li>
<li>Parsing a String as HTML</li>
<li>Manually by constructing a {@link android.text.SpannableString}.</li>
diff --git a/tools/recovery_l10n/res/values-en-rIN/strings.xml b/tools/recovery_l10n/res/values-en-rIN/strings.xml
deleted file mode 100644
index b70d678c..0000000
--- a/tools/recovery_l10n/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"Installing system update…"</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"Erasing…"</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"No command."</string>
- <string name="recovery_error" msgid="4550265746256727080">"Error!"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-et-rEE/strings.xml b/tools/recovery_l10n/res/values-et-rEE/strings.xml
deleted file mode 100644
index 407a53d..0000000
--- a/tools/recovery_l10n/res/values-et-rEE/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"Süsteemivärskenduste installimine ..."</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"Kustutamine ..."</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"Käsk puudub."</string>
- <string name="recovery_error" msgid="4550265746256727080">"Viga!"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-fr-rCA/strings.xml b/tools/recovery_l10n/res/values-fr-rCA/strings.xml
deleted file mode 100644
index f2a85d8..0000000
--- a/tools/recovery_l10n/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"Installation de la mise à jour du système en cours…"</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"Effacement en cours…"</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"Aucune commande."</string>
- <string name="recovery_error" msgid="4550265746256727080">"Erreur!"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-hi/strings.xml b/tools/recovery_l10n/res/values-hi/strings.xml
index a470d12..3dfab3e 100644
--- a/tools/recovery_l10n/res/values-hi/strings.xml
+++ b/tools/recovery_l10n/res/values-hi/strings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"सिस्टम के बारे में नई जानकारी मिल रही है…"</string>
+ <string name="recovery_installing" msgid="7864047928003865598">"सिस्टम अपडेट इंस्टॉल कर रहा है…"</string>
<string name="recovery_erasing" msgid="4612809744968710197">"मिटा रहा है…"</string>
<string name="recovery_no_command" msgid="1915703879031023455">"कोई आदेश नहीं."</string>
<string name="recovery_error" msgid="4550265746256727080">"त्रुटि!"</string>
diff --git a/tools/recovery_l10n/res/values-hy-rAM/strings.xml b/tools/recovery_l10n/res/values-hy-rAM/strings.xml
deleted file mode 100644
index 7babe80..0000000
--- a/tools/recovery_l10n/res/values-hy-rAM/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"Համակարգի թարմացման տեղադրում…"</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"Ջնջում…"</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"Հրամանը տրված չէ:"</string>
- <string name="recovery_error" msgid="4550265746256727080">"Սխալ"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-ka-rGE/strings.xml b/tools/recovery_l10n/res/values-ka-rGE/strings.xml
deleted file mode 100644
index 2d27c17..0000000
--- a/tools/recovery_l10n/res/values-ka-rGE/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"სისტემის განახლების დაყენება…"</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"მიმდინარეობს წაშლა…"</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"ბრძანება არ არის."</string>
- <string name="recovery_error" msgid="4550265746256727080">"შეცდომა!"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-km-rKH/strings.xml b/tools/recovery_l10n/res/values-km-rKH/strings.xml
deleted file mode 100644
index 0c1c272..0000000
--- a/tools/recovery_l10n/res/values-km-rKH/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"កំពុងដំឡើងបច្ចុប្បន្នភាពប្រព័ន្ធ…"</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"កំពុងលុប…"</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"គ្មានពាក្យបញ្ជា។"</string>
- <string name="recovery_error" msgid="4550265746256727080">"កំហុស!"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-lo-rLA/strings.xml b/tools/recovery_l10n/res/values-lo-rLA/strings.xml
deleted file mode 100644
index 5880cca..0000000
--- a/tools/recovery_l10n/res/values-lo-rLA/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"ກຳລັງຕິດຕັ້ງການອັບເດດລະບົບ..."</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"ກຳລັງລຶບ..."</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"ບໍ່ມີຄຳສັ່ງ."</string>
- <string name="recovery_error" msgid="4550265746256727080">"ຜິດພາດ!"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-mn-rMN/strings.xml b/tools/recovery_l10n/res/values-mn-rMN/strings.xml
deleted file mode 100644
index 463cafe..0000000
--- a/tools/recovery_l10n/res/values-mn-rMN/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"Системийн шинэчлэлтийг суулгаж байна…"</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"Арилгаж байна…"</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"Команд байхгүй."</string>
- <string name="recovery_error" msgid="4550265746256727080">"Алдаа!"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-ms-rMY/strings.xml b/tools/recovery_l10n/res/values-ms-rMY/strings.xml
deleted file mode 100644
index f563591..0000000
--- a/tools/recovery_l10n/res/values-ms-rMY/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"Memasang kemas kini sistem..."</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"Memadam..."</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"Tiada arahan."</string>
- <string name="recovery_error" msgid="4550265746256727080">"Ralat!"</string>
-</resources>
diff --git a/tools/recovery_l10n/res/values-zh-rHK/strings.xml b/tools/recovery_l10n/res/values-zh-rHK/strings.xml
deleted file mode 100644
index f615c7a..0000000
--- a/tools/recovery_l10n/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="recovery_installing" msgid="7864047928003865598">"正在安裝系統更新…"</string>
- <string name="recovery_erasing" msgid="4612809744968710197">"正在清除…"</string>
- <string name="recovery_no_command" msgid="1915703879031023455">"沒有指令。"</string>
- <string name="recovery_error" msgid="4550265746256727080">"錯誤!"</string>
-</resources>