summaryrefslogtreecommitdiff
authorXindong Xu <xindong.xu@amlogic.com>2018-02-22 05:30:47 (GMT)
committer Xindong Xu <xindong.xu@amlogic.com>2018-02-22 05:30:47 (GMT)
commitdec7f9cbfbae09c0eb32d059c1ddd67c76d9f058 (patch)
treec58418f5d3372db096d3a9946d35ae9f740b13b9
parent855447d7e51ee5889edfd188a758ddefb130d73b (diff)
downloadampere-dec7f9cbfbae09c0eb32d059c1ddd67c76d9f058.zip
ampere-dec7f9cbfbae09c0eb32d059c1ddd67c76d9f058.tar.gz
ampere-dec7f9cbfbae09c0eb32d059c1ddd67c76d9f058.tar.bz2
ampere: add some missing documents [1/1]
PD# NONE add some missing documents Change-Id: I6fa4edfd73d780122b4efd8ddb552455735c5b0a
Diffstat
-rwxr-xr-xframeworks/.gitignore3
-rw-r--r--prebuilt/.gitignore4
-rwxr-xr-xprebuilt/libmedia/Android.mk16
-rwxr-xr-xprebuilt/libmedia/codec/Android.mk22
-rwxr-xr-xprebuilt/libmedia/codec/lib/libstagefright_soft_amsoftdec.so84
-rwxr-xr-xprebuilt/libmedia/codec/lib64/libstagefright_soft_amsoftdec.so60
-rwxr-xr-xprebuilt/libmedia/libavenhancements/Android.mk54
-rwxr-xr-xprebuilt/libmedia/libavenhancements/lib/libamffmpegadapter.so630
-rwxr-xr-xprebuilt/libmedia/libavenhancements/lib/libamnuplayer.so2322
-rwxr-xr-xprebuilt/libmedia/libavenhancements/lib/libavenhancements.so88
-rwxr-xr-xprebuilt/libmedia/libavenhancements/lib64/libamffmpegadapter.so281
-rwxr-xr-xprebuilt/libmedia/libavenhancements/lib64/libavenhancements.so43
-rwxr-xr-xprebuilt/libstagefrighthw/Android.mk192
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libHwAudio_dcvdec.so83
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libOmxAudio.so84
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libOmxBase.so72
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libOmxCore.so50
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libOmxCoreSw.so51
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libOmxVideo.so3191
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libdatachunkqueue_alt.so68
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libfpscalculator_alt.so69
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libomx_av_core_alt.so55
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libomx_clock_utils_alt.so55
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libomx_framework_alt.so397
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libomx_timed_task_queue_alt.so65
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libomx_worker_peer_alt.so52
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libstagefrighthw.so61
-rwxr-xr-xprebuilt/libstagefrighthw/lib/libthreadworker_alt.so44
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libHwAudio_dcvdec.so83
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libOmxAudio.so69
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libOmxBase.so72
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libOmxCore.so14
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libOmxCoreSw.so24
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libOmxVideo.so2762
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libdatachunkqueue_alt.so37
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libfpscalculator_alt.so10
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libomx_av_core_alt.so14
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libomx_clock_utils_alt.so24
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libomx_framework_alt.so436
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libomx_timed_task_queue_alt.so32
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libomx_worker_peer_alt.so8
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libstagefrighthw.so32
-rwxr-xr-xprebuilt/libstagefrighthw/lib64/libthreadworker_alt.so9
-rw-r--r--system/.gitignore3
-rwxr-xr-xsystem/droidvold/Android.mk73
-rwxr-xr-xsystem/droidvold/Disk.cpp593
-rwxr-xr-xsystem/droidvold/Disk.h135
-rwxr-xr-xsystem/droidvold/DroidVold.cpp198
-rwxr-xr-xsystem/droidvold/DroidVold.h77
-rwxr-xr-xsystem/droidvold/NetlinkHandler.cpp57
-rwxr-xr-xsystem/droidvold/NetlinkHandler.h34
-rwxr-xr-xsystem/droidvold/NetlinkManager.cpp109
-rwxr-xr-xsystem/droidvold/NetlinkManager.h52
-rwxr-xr-xsystem/droidvold/Process.cpp222
-rwxr-xr-xsystem/droidvold/Process.h44
-rwxr-xr-xsystem/droidvold/PublicVolume.cpp297
-rwxr-xr-xsystem/droidvold/PublicVolume.h87
-rwxr-xr-xsystem/droidvold/ResponseCode.cpp42
-rwxr-xr-xsystem/droidvold/ResponseCode.h81
-rwxr-xr-xsystem/droidvold/Utils.cpp713
-rwxr-xr-xsystem/droidvold/Utils.h160
-rwxr-xr-xsystem/droidvold/VolumeBase.cpp275
-rwxr-xr-xsystem/droidvold/VolumeBase.h165
-rwxr-xr-xsystem/droidvold/VolumeManager.cpp437
-rwxr-xr-xsystem/droidvold/VolumeManager.h125
-rwxr-xr-xsystem/droidvold/droidvold.rc4
-rwxr-xr-xsystem/droidvold/fs/Exfat.cpp215
-rwxr-xr-xsystem/droidvold/fs/Exfat.h37
-rwxr-xr-xsystem/droidvold/fs/Ext4.cpp186
-rwxr-xr-xsystem/droidvold/fs/Ext4.h41
-rwxr-xr-xsystem/droidvold/fs/F2fs.cpp82
-rwxr-xr-xsystem/droidvold/fs/F2fs.h38
-rwxr-xr-xsystem/droidvold/fs/Hfsplus.cpp152
-rwxr-xr-xsystem/droidvold/fs/Hfsplus.h37
-rwxr-xr-xsystem/droidvold/fs/Iso9660.cpp87
-rwxr-xr-xsystem/droidvold/fs/Iso9660.h37
-rwxr-xr-xsystem/droidvold/fs/Ntfs.cpp249
-rwxr-xr-xsystem/droidvold/fs/Ntfs.h38
-rwxr-xr-xsystem/droidvold/fs/Sdcardfs.cpp171
-rwxr-xr-xsystem/droidvold/fs/Sdcardfs.h38
-rwxr-xr-xsystem/droidvold/fs/Vfat.cpp209
-rwxr-xr-xsystem/droidvold/fs/Vfat.h40
-rwxr-xr-xsystem/droidvold/main.cpp183
-rw-r--r--tdk/.gitignore2
-rwxr-xr-xtdk/ta_export/keys/root_aes_key.bin1
-rwxr-xr-xtdk/ta_export/keys/ta_aes_iv.bin1
-rwxr-xr-xtdk/ta_export/keys/ta_aes_key.bin1
-rwxr-xr-xtdk/ta_export/lib/libmpa.a1286
-rwxr-xr-xtdk/ta_export/lib/libpng.a5440
-rwxr-xr-xtdk/ta_export/lib/libutee.a2937
-rwxr-xr-xtdk/ta_export/lib/libutils.a3935
-rwxr-xr-xtdk/ta_export/lib/libzlib.a1004
92 files changed, 32240 insertions, 12 deletions
diff --git a/frameworks/.gitignore b/frameworks/.gitignore
deleted file mode 100755
index 51e7587..0000000
--- a/frameworks/.gitignore
+++ b/dev/null
@@ -1,3 +0,0 @@
-# av is a separate git project
-/av/
-/pppoe/ \ No newline at end of file
diff --git a/prebuilt/.gitignore b/prebuilt/.gitignore
deleted file mode 100644
index 0d43ade..0000000
--- a/prebuilt/.gitignore
+++ b/dev/null
@@ -1,4 +0,0 @@
-# libmedia is a separate git project
-/libmedia/
-#libstagefrighthw is a separate git project
-/libstagefrighthw/
diff --git a/prebuilt/libmedia/Android.mk b/prebuilt/libmedia/Android.mk
new file mode 100755
index 0000000..2d6a257
--- a/dev/null
+++ b/prebuilt/libmedia/Android.mk
@@ -0,0 +1,16 @@
+# Copyright (C) 2012 Amlogic 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.
+
+include $(call all-subdir-makefiles)
+
diff --git a/prebuilt/libmedia/codec/Android.mk b/prebuilt/libmedia/codec/Android.mk
new file mode 100755
index 0000000..2c52dd0
--- a/dev/null
+++ b/prebuilt/libmedia/codec/Android.mk
@@ -0,0 +1,22 @@
+ifeq (,$(wildcard $(LOCAL_PATH)/../../../AmFFmpegAdapter))
+ifeq (,$(wildcard $(BOARD_AML_VENDOR_PATH)/AmFFmpegAdapter))
+LOCAL_PATH := $(call my-dir)
+
+PATH_32 := $(TARGET_OUT_VENDOR)/lib/
+PATH_64 := $(TARGET_OUT_VENDOR)/lib64/
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libstagefright_soft_amsoftdec
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX :=.so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(PATH_32)
+LOCAL_MODULE_PATH_64 := $(PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+
+include $(BUILD_PREBUILT)
+endif
+endif
diff --git a/prebuilt/libmedia/codec/lib/libstagefright_soft_amsoftdec.so b/prebuilt/libmedia/codec/lib/libstagefright_soft_amsoftdec.so
new file mode 100755
index 0000000..fa63faf
--- a/dev/null
+++ b/prebuilt/libmedia/codec/lib/libstagefright_soft_amsoftdec.so
@@ -0,0 +1,84 @@
+ELF
+
+
+
+
+
+
+
+
+vQ "a$W
+e= jQ kd= E.w)YyzU153s^b6ZJ4
+
+
+03/K
+ȳWW
+SHxDPHxDNHxDKHxD
+h
+
+
+ %
+&m h0Fh:HxD
+!xDI
+P
+l l 
+ B
+444$4
+
+I FyD)h Fp5+
+5 KjtD
+ p(
+l Hl
+
+
+
+
+
+F(FFz00F)F"Fp@ҽ@
+
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+)
+ bh^h
+
+
+A 
+ "&D7zXZ
+]
+ĢQR9A82*f1u;{pK> H<a#*m:7T
+Y3 'O ~HOdL0fqP!g@%4Δ#|PXѭ҅؋[5mk(G|ҏ
+MKdX/L
+5Es̮PZ0git*<<2w!ފ03Z
+pC"\Y|[|o <o0]T7}]tH2AԖy@b>㭚_Umq/f.`bmԛY-w#^=HΉ&& .Չu>'D7ˇ&t?&x}AtUM®ο<O
+/6L#|@cDW 2%E4pahC1sمIv 70nޖٛW0춧m8mv.5@ a?A)™ޚ=$
+>ue`hfS haҦg2ҭ7rկNˡYߵvc_Yt7x !'Δh:JDVQu|CsqES@C@ٌtPX9/m|e[CNbN\ڨ=Sykd!?.҃poI]ŮȞBucc柳Z&hrǒk(:rj)v1;\dm90^ɹx,ifki6;ri;@̅ J\fM$:^1[5(T/j`@%,3`ڒJd%k Ƭ~[wKF .dJՕx0OT/3zɽ;XH*[e$,k
+`2 g%zjjr3\* -~䤨ce2֢f⫕5 E>j^J̝!O\7ʞ~${R"
+䒕{&f@- B(pV*PIs$PN%poHȦ=&9p
+ :|Rh'jrc)V|'{7)Tx|!;hJ=a2%Mjf@Jm@`^c
+[91MFwQ݈nAP0yF$[+9 m]"zSұk$b{J4==A?Kγ=PӰN,2$qi{}
+عElӓ^LIEduwD'\W XQBէ9k\KHRJ'To'J#p-ԨbOW蚔[h Bo=xxd_߭M\6
+
diff --git a/prebuilt/libmedia/codec/lib64/libstagefright_soft_amsoftdec.so b/prebuilt/libmedia/codec/lib64/libstagefright_soft_amsoftdec.so
new file mode 100755
index 0000000..d75310d
--- a/dev/null
+++ b/prebuilt/libmedia/codec/lib64/libstagefright_soft_amsoftdec.so
@@ -0,0 +1,60 @@
+ELF
+
+
+
+
+
+
+
+
+e= V= E.wkd)U15r^]yzZJ4
+
+GB8 0
+H;@
+
+)) )
+
+ 
+
+@
+@C
+@?
+@
+
+{ H;@
++
+#
+k
+k
++T(} 
+yH;@@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+
+Fyiݻ6{P
+JחQ5_E8b/ۊݱWg06u&*xfO_7'7) RJҳƇzr7õpΧ#ADvܑiWi
+q'3v| kry,b&Sq0MGJo/2xTPreRf[ug
+Bln*2AʅZ -?hz=z*Fםq)7o,qpvѯYXj!#k=vWBIWG hi&[U꫁ҝM` x@Uj܄iD wF>]|{Jq74.P;?dcE9󫗍 \Q\`YNm3}R1ɪřAet~D\53̞{ih9B^F%R7UZpRd}2|
+s0Q65}ZnqأcSssMs bL`5TchrjLEp~'Ѯ!$3>-E*w Yzd;4b546 ;aibj7uVOggb
+
diff --git a/prebuilt/libmedia/libavenhancements/Android.mk b/prebuilt/libmedia/libavenhancements/Android.mk
new file mode 100755
index 0000000..3a8c559
--- a/dev/null
+++ b/prebuilt/libmedia/libavenhancements/Android.mk
@@ -0,0 +1,54 @@
+LOCAL_PATH := $(call my-dir)
+
+PATH_32 := $(TARGET_OUT_VENDOR)/lib/
+PATH_64 := $(TARGET_OUT_VENDOR)/lib64/
+
+ifeq (,$(wildcard $(LOCAL_PATH)/../../../frameworks/av/AmFFmpegAdapter))
+ifeq (,$(wildcard $(LOCAL_PATH)/../../../AmFFmpegAdapter))
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libamffmpegadapter
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX :=.so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(PATH_32)
+LOCAL_MODULE_PATH_64 := $(PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libavenhancements
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX :=.so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(PATH_32)
+LOCAL_MODULE_PATH_64 := $(PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+
+include $(BUILD_PREBUILT)
+
+endif
+endif
+
+ifeq (,$(wildcard $(LOCAL_PATH)/../../../frameworks/av/amnuplayer))
+ifeq (,$(wildcard $(LOCAL_PATH)/../../../amnuplayer))
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libamnuplayer
+LOCAL_MULTILIB := 32
+LOCAL_MODULE_SUFFIX :=.so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(PATH_32)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+
+include $(BUILD_PREBUILT)
+endif
+endif
+
diff --git a/prebuilt/libmedia/libavenhancements/lib/libamffmpegadapter.so b/prebuilt/libmedia/libavenhancements/lib/libamffmpegadapter.so
new file mode 100755
index 0000000..5a4ec52
--- a/dev/null
+++ b/prebuilt/libmedia/libavenhancements/lib/libamffmpegadapter.so
@@ -0,0 +1,630 @@
+ELF
+
+
+
+
+
+
+ 
+h
+BD*p@
+
+
+8]Z
+PʡE:0y/\̕YeSE Ky[" qX
+VߤQ{l(IF=
+(4$,4$ ,4$(4$,4$  $
+
+
+R +R 
+ s`
+
+
+
+yQ$~}
+
+|88888888Y
+
+s _$
+
+
+
+@1A0@1A@XR@@1A1! ;1!1<Rb
+R .
+03/K
+"
+
+
+
+
+
+`.
+8044!
+pP
+
+
+
+
+
+
+
+
+
+E
+
+
+
+
+
+
+W
+
+PU$
+
+u
+
+h
+p00
+
+x
+
+PV
+
+T
+>
+`
+D`
+00 0C
+
+|
+@
+
+
+
+p
+
+   
+k
+
+J
+H'B @ 
+q!
+
+ 
+
+
+
+@,
+0 " 0(
+
+ 0"0( "
+
+x
+
++
+EQP
+ P
+
+T2\
+@
+
+
+$0 .
+
+Pp 
+
+
+
+@x<p804 Pa!o!v's!?,
+
+
+
+
+
+
+@
+J
+
+a rF
+L(
+( 
+
+
+p
+D%<
+
+
+
+
+ N
+P
+h
+
+h
+
+
+
+$$q$
+$
+  g
+ 
+
+wD
+Dr
+
+
+T \
+@
+
+`
+
+\
+P
+L
+
+v
+
+
+`
+Udp
+P
+
+b
+
+
+
+
+@
+
+\
+0pP/
+
+0`Pmo
+@
+
+ @
+
+
+
+h@8P
+
+
+
+t
+
+
+h@8P
+
+
+嫚
+8
+
+
+
+
+
+
+ 
+G 0
+8<
+
+
+{
+
+
+
+ /
+
+:.
+
+
+
+(
+,@x
+
+
+
+
+PP @PT
+tp
+pl
+lh
+hd
+d,
+`m
+\
+\
+`E
+@
+X,T
+TP
+PL
+LH
+HD
+D@
+@<
+<8
+84
+4
+
+
+
+0z|
+
+I
+A
+@
+@
+@h
+< 偀
+
+<@pD Ā#4!?#7!?L0($,4
+(@8
+
+
+
+ L
+
+
+
+$
+ 0`8
+`,pw
+
+q,@
+`$
+<f<
+<L
+,L
+/
+P0`?
+
+9
+ p -
+
+',P `(
+
+_
+p
+?p
+
+
+
+84P
+
+
+
+?O 
+4p
+
+
+
+$
+ 0`8
+!6
+H
+$,
+
+
+
+p
+
+
+1
+
+`
+
+
+
+
+
+
+
+|
+0 =
+
+
+
+
+
+ !
+ `
+
+
+G
+
+
+
+
+
+
+
+
+P
+
+
+`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A@T
+/
+ 
+
+
+
+
+
+
+x
+`
+H
+0
+
+
+
+
+
+
+
+P
+ 
+0
+K
+Q
+
+
+
+
+
+
+ 
+
+`
+AJ
+d
+
+t
+#
+h
+h 
+
+
+
+(p
+
+
+
+
+
+
+d
+
+
+
+hP
+p
+b
+
+ 0
+\
+D
+
+
+
+`
+
+
+
+@
+
+
+
+@
+
+K
+
+
+=
+/
+
+
+
+ 
+
+0
+
+8
+ 
+d/
+(
+
+8
+ $
+
+
+ 0[Y
+0 80
+
+8
+8O[parseSei]mBuffer == NULL
+
+
+
+P
+0p 
+
+0.0
+(
+
+
+ 
+`
+
+e``
+:
+
+
+
+7X
+
+
+
+@@
+
+
+bPU
+A
+
+
+
+
+
+A@T
+
+
+b@T B
+AA
+h`
+X
+Q
+C
+
+` X
+\
+
+
+
+
+`
+
+
+@
+
+
+
+@
+
+
+`,
+A
+
+d
+
+
+`
+$
+
+(
+
+8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+l
+T
+s
+uo
+rk
+
+YS
+VO
+
+
+
+
+
+0
+p
+
+
+ 
+
+@PA
+ A
+ e
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+j
+T  
+
+`V
+V  
+
+
+
+
+
+
+
+A 
+ "&D7zXZ
+IѨa)yz}Z \nW"HzӬ0j[Ei˪z0\Ź ꪼImk}WN$io$"_
+[HFŁ <e+Rbo
+xv="r7}LJN>ªCcѽH~VyCΙ` aKE<VHH'S70<z p:!hSbۡͧ"
+(->" XDWPk%.W7v~IXXd-}u%VEj˅qxF@SH&aeoQ^[2H&r~>oKl"bXE) Aܩ35vh#Z0mbڊ;[ͤ&`8ZZdJOb jwy|⎐|"= ttxfsX\h'MVrocRij$*=q~Ε`?a۾1RբX}xim|tGf=VF@qV&>6uIY-!6jjLA~g
+A62)Ǹ e;~m.% HrXkk
+L\?a.H #nʓCLk+= GwG/B@$-eGI2lft"nh?2Mbd{ÆC|i$Ȟ
+K{k2<
+'<nݻ83Vj|nǸcUTs2X0dL(=՜7}|@rVcHWy4dLLS0sNCXqŹ +U\)alht46:[
+sY,gێ77/煤 UJ
+G *I{bE3^6S/kǭccrn~WG>~ZlWC- Dnc^W e+BSh/C
+,dC<8CYX )UG=[Yli+&5GuA ]JpٚH=h?l!=o(8Qvw2<p
+dP֧Xpr fgY ZT#P-a.ϩ+P|S2`OlBR %+$ 6JNT
+tuC A
+_g%nv8^Xd̲Vm/JK4l&b'U'$$ 7R7~yyUt`[&g3kg+4|Pa^>+)S Zf=E16/UEB,0!y]h*h qנ02Gf| WAxȀAƐhfsyK5dۇ{>.$g)M'742GmJxZ,:IZ!XբH? +
+*Z]-,(
+?3HC;Edd< Eǜ_37$r'+엽Bntzus'3!k!WwX ?t[/xUqJ
+ ѓIݜ섅n
+[>KtC.D!۝֘nq3u0F5/Ywֆ#t:d(SGM8Xcʮ|랴e !D6Sv/h[3< 9b21@,7l'
+g
diff --git a/prebuilt/libmedia/libavenhancements/lib/libamnuplayer.so b/prebuilt/libmedia/libavenhancements/lib/libamnuplayer.so
new file mode 100755
index 0000000..357767c
--- a/dev/null
+++ b/prebuilt/libmedia/libavenhancements/lib/libamnuplayer.so
@@ -0,0 +1,2322 @@
+ELF
+
+
+
+
+
+
+
+
+
+/
+F
+I
+w
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+j
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+ `FK1
+
+d
+" B@b3Pb4
+
+$!
+@
+"`@H %
+
+@
+
+
+B0
+
+
+
+
+A=/5nQH
+~a>+ҖW@цsT e]Qlb7gq_1X~0$QrN)θLI#i-lh2&WC*Nٝ+LL(
+ sϿy8P=}Hb#sBCEOc#̃ɷSIFR 0:(7yP Cvh</:V}f}p\;R΂9v
+g UR<a
+?@sm;oS<hmU7f).1z6b;)?WoȀߗڿD5tҽ[Jcmy䗶;!Y`W@^V>XA(I~Jy9eX>Xcwoop:ZIQ'xɸ3R#R%n{T=XH2ЙC+
+vp;T,v麝}iޔ&M٦;de>Nj )j:7H]f'mDKMc31"P1r ?1 !2Uv
+ ԎX^u>Qh:Pܺ<75:7pU$O?ѕl#,ڰ{-ܦpN]r>%HzZ~G@x!PJ3V=پ&s"o6[ֺ+z L3xtZ=*|γ?s؏G =3W㖀NFDȳ#v"{$SRКB*BӖqMnpgU1jcc pIpnQoxWNnc(UpmѪʊ ƺX=dv:=3*7 #"z[=X>2D ~ D@E; a2/H}A2hmEae5$`,+m+ἤ<֚xq/}SryN+eU R]]=YH5U6 (o{y1t>7s8E!c (#8 lZc,x \$}G>Z jrOH~ZtVTFXfæ@矣ŴLbZ&+XB|lqA"[ DQZ++/1iN?TOوwTqzh
+/'y͍H+0b笈K3 w>P9g4HIB 'A:8.78#n^ɽoܝXgccNl9,>o BH1x,0mmxeq?u!>Y{]6GwH;1Z= I,o{vnMK 2tK>w寥5 ޯRY7ma|urWV"`ߙƏ%A>~`MgXgUOղZ4=LhY7FfS>kqSiK tcA՟:X`S#[܏ye,!$qXmv{j'?<|$O[v[JOK]0 u('#U(Wy8(M*ƻjpp%1LkMWFlOPcj vɄ,I80qÍ]<؅D< F8b!ʰ9Ty< GFHGzn+M/#)̵"_^6sAQO${zn3 i=B Ž҄5'K*Du0yin4#@6XCRw%
+Uo'EVҲQg,<َ
+ aW;],jbn#[NRy|J ./ O*`-F(îLubs~I&MX]O
+ T(.+@U-^X@D50:d6e]]1߱|7C H5kc~Ƃȡas41>$o Z,$ƿ5{Bqq{Z8D9:mnuǹ{1ܷq* 9DyV|st+D/XXV-
+){VUՙyx"2o bfMBٶ,yl W8oMgB:0-ǮY;QjgaLue0ҋ#q?=l0ʥE"lT Rه^c>-J@lNxW@n+vkuDUt"[;UJCTv5n[1d1v <䃡o!Ҹ" ?f*=Il.SE
+\9PqoVfʿ烮Rx10ygWӸ꒒:JMɻq2䠋OGƻ5fV2UG`{n{عLDefWQy+SahYUTF-ׯw$
+ѯW]<l"㵠eJɏWl?5NݘL:0yk-Z;VirLS{5y_G%px ]j67$Kƿ ouY噏.(]-`L!Y@F"-
+Q̎:dT Zf)>&lOÐ/pPIy(?Fvd:k1JLgWQ x(:AG i%ȹt5qZdN#M}zZ[v,pn3hNÙByܘҟ1NPc5{L*vZnS`)mrw+rrE¨B8=Wj-\7$D`{0} IxzUTߌD7Y[R (Բz ]zt){Fd׍M:K NyҜ'/XR9K/$'0# q7.>nM2'@Jv)v2#M"J×e-cŻћ/N<DK%z[S%O0R ̞Oڋi*#}ib1_eP: rsV0W
+_uGp iA*C v=Ϩv
+a_`ZU8E<$F&S T_,Jpa3o $Ph;eMi<,w|\AIgiH J03YpEʘ^<ik!2vZRHhsNZ]y!%˸&Nޯ`N 8Q?gé2CЁ+kM87h݆{</s!HwP蔼L ?KR癬%fxRpZuػ^W<`gyl3QeD0 =C*`c&e[v6HIS,mh B
+ݑ7F9$-6&N ]XLI[
+)G]򍀢/ L
+9huR@{GM-pX_V^2432`S*-}ԆtK_,+X 1yDv\!WIF<hɥ}:P*@/ >@\%z])HM ȩ> 0.ǿ lR vk1o{ v,@p=?;L
+Qm΁ASua;T-P]Ai#=J6gϹ<ney ƣTo[[a~:qmJw%OkiK/CDl<M8<P*V&@ٷ%>" WG[V4TmxY*Qsz`-d@o.0/{!d'QyK/IoWNh3+G98wʣy;|j{<ib'04{ߝ!M@Kݱ
+<3!q8d3Hoʘ@5(4.&<lFd"VKaɒNJ&kÑg1"g{VIG`J
+/d+բVWq\]eU!K-~lXse+qV{7x/
+jQ(q3MK>wT)}TT1!j]q7
+y8KPP膑C87i^)oPĸQHSJ KŢpt:||.jmq1-@
+( K1Xx|Iy1Xz27PRޯ@-lM8zvet[<3;TY?"+]n)3`@ۀ^ H(]I8tͽg˦vS{
+7܊X{1>az#6!M
+
+(
+
+o
+M
+
+n
+
+
+Z
+
+|
+
+C
+{
+
+
+$
+
+
+
+|
+' a   
+ 8BW&
+ 
+#
+$$
+
+
+
+
+
+
+H*FxDh H1!`xD!F@X6]
+h)FHxD
+
+h!F@WԿ~^
+IxDyD
+h!F@W
+03/K
+
+ZP9IhFyD0/hF%
+
+n\Y
+4X
+
+
+ Uppuh(F
+paaa HxD
+
+ hB F%`p𵁰FFFF0Fp!K
+
+ 0 FFI J+FyDzDf'H F`'
+
+ I  yDO
+ A3
+
+ A3
+pG
+t
+
+i
+i
+i
+PF9FuQF(F(h
+o!F
+
+ h
+
+ xD
+
+
+ F!2F
+
+>0
+YI
+i
+
+#
+KRra
+H
+I KxDyD{D H I KxDyD{D0
+8hz
+'
+
+(H%y
+
+%4 FF(FF(F
+
+0
+
+
+
+
+I
+KyD{DHIKxDyD{D
+I
+KyD{DHIKxDyD{Dv"
+I
+KyD{DHIKxDyD{D!
+HIKxDyD{DZIKyD{DRH IKxDyD{DHH IKxDyD{D@
+"CFFO O 'FWyh
+
+
+HxD
+
+HxD
+IKxDyD{D
+iI(F "yDfHxD
+
+XI"FyD
+!
+xt$I*FyD"I"FyD I:FCFyD
+8jFL(
+i
+
+!I*F#FyD8I2FyD
+8(
+LDF~-&
+mD 
+iQt
+yD QF Ga!
+uAF  D-UI
+#yDRI
+KxDyD{D H I KxDyD{D
+FkFFF#
+
+YFBFeQiA
+
+! FA"FYF
+Fxч{x{xkx+
+B*`
+
+;y|+Cy+
+( J)F&FF!FiiXFFXF DXFF!F@FF@FFXF.ii+DD5&q
+OFicDD^O
+  ( I)FFV!FXiiXFFXFDXFF!FJ@FF@FFXFvii3DD#6OuOu`iiV(D9F"F`9 WFicDDF\H xD2
+
+
+
+
+ A2t
+ Fp
+8h
+jiFG0#
+
+A1 J 8FAF!A0 (F d)ȿd!d
+
+HxD
+HxD
+HxD
+)F0FD
+2H"F2IxDyD
+I
+KyD{D^
+ F@Q
+(h<0hQ D)F.5
+
+
+
+
+
+
+
+
+
+
+jGsAPa
+B, BBCc A,BB
+Ac!as
+
+
+
+)Fz
+DSAI1
+
+ )Fh FSqT1  )FXGP!i1)FFGP4tD@a)F4!F)F&A)FGPQd1n
+
+`+Ep
+
+1
+(
+
+F F
+
+
+
+(!
+
+F FO
+@F!@F!@F!@F!
+~0Oc` 0OC0O#0
+
+!FA
+"`(FF
+
+
+@5bG'@!
+p
+
+
+xD
+h
+8FF9F` hi FG
+
+
+)F"o
+ `1F츱&F
+(h
+
+h,,e
+xD
+
+"yD" yD
+ O3h(h)h*h,h0h4h<h@hDhHLhP(T8
+#X8\hA
+CX4Qxh|hiF(
+I}D KxDyD
+FHxD
+M H
+J}D
+KxDzD
+1h (F D jFp
+G
+(o
+
+yD8(``
+yD(@w xD
+mGHD@"
+yD(
+b4yDP(0b
+yD(
+
+!F  E
+ݚI yD `(LۚNlO
+ yD2F;F
+yD( a
+<(`
+;(`_IyD(a`h
+
+JHxD
+
+
+
+
+%%%%%%% %%% % % % I
+ #FyD % I  #FyD
+
+
+
+
+%I%OcyD
+
+0F!FXI yD8
+
+0@8`}J06(`
+F@(
+
+!F
+8jF(
+Z hO`!F"<!FI(F"FyDI
+o
+D!F4
+8jF(
+#<err
+8
+
+
+xI*F#FyD$I:FyDIBFyD
+yDp0FxcI2F(hyD(
+++@^IyDI yDHxDuQIR yDlTIyD0F1F0F0FF(hT2F
+ F F0F F1F0FF0F F1F0F
+(%(hC븳(hO
+Gl!DB5DR!DqBxFMAuB@EAf1B
+mG
+F
+
+
+`(d8O
+p(hyD
+
+jGF;(hyD
+
+@
+
+
+ѷ
+(HFL(f
+ h
+>#
+
+@HF
+
+
+G
+
+
+ h
+
+
+
+N᱙ȱh
+"@(
+yD(
+*!F@(
+r 'yDzD
+
+
+
+
+
+
+p
+
+
+
+I
+&)h
+hlG(hh oG
+h
+
+єpI
+Ŀ(hH
+I yDZ{
+eFF<(h )F
+ ; < F
+( ; < Fh!
+ h kG!I" yD'I( yD
+')hlGx)Fx
+@I yD
+,
+G
+
+$A
+(Fv7h
+
+yD
+"H@
+">(FR
+
+ h
+ 
+*\V@(
+yD(`I
+yD
+
+OppbFa7
+"5
+(yDh60hP 0D
+(
+ZIyDbhlGGrL1(*NIyD h*:6
+
+. I KyD{DJ<t
+n
+I
+ yD
+
+!"FGFelB FF I
+
+yD
+
+*(&љI
++ (ۗNJ~D
+HC JF 1F
+چOsBFF,F kI kJ3FyD
+pG
+mG #I JyDzDd FHxD
+
+AI AJyDzDo%0
+yD 
+9F"
+h
+hlG
+8R(
+IKxDyD{D4O
+x H I*FyDJI"FyDI:FCFyDX
+HxD
+KIyD
+!F0FE
+2H*F2IxDyD
+H
+I KxDyD{D
+uIv yD v
+uIu yDz v DVa
+s(
+uIv yDd
+w FeQ iQ(@ v "(Fl
+v>
+h(&W
+j
+i)$i
+Z5
+#
+lH
+IKxDyD{D
+
+
+
+
+
+
+H
+I
+KxDyD{D^4
+4
+ 
+  F
+D
+hhIh@hBFpGFH!FxD
+
+
+(hyDV
+   n
+F
+
+8(
+(hA
+
+
+pB
+
+O
+
+1F@F !p
+pHIHF yDKIyDN
+
+h  
+
+
+yD)k IEC2 ibyDIBF yD
+m
+G
+D@3LO
+Ps
+
+FB
+B
+
+p<:I:F yD
+H
+I
+KxDyD{DIKyD{D
+F8F?d:F
+
+F(FZ?
+P
+0F0FR
+.
+0F0F<
+ k8F0FO3yDPFk*F0FO3yD0
+8hyD4(8hyD*( 
+kyDBIkyD<@(
+
+T
+
+
+0hQ D)F |HxD
+
+I
+E
+yDzD
+ FYIFyDXIyD F
+r FSIFyD
+
+
+
+N$N
+
+
+
+0
+T@(% w%o& D  
+
+<5
+0
+OЉO
+.L@) p9:
+#FFPBO
+$(
+*`
+O
+9F
+
+$l0hl2FGF
+@BH @ (@8hm 1s0X ir!1s0X ir! 9I
+  5H
+xD
+
+I
+KyD{D
+ ` 1 F
+ 0
+iHB ho|qBl FG 
+
+&
+F
+
+r0hh0FG
++I,+KyD{DJH JIJKxDyD{DBH BICKxDyD{D
+
+F IcFyD h h
+
+K {DK {D)H*KxD{DR
+
+@
+
+I
+ yD
+
+
+P1P
+ (F
+ KyD{Dn
+
+
+ii(DDBFz h
+
+
+`
+0F)F!j)O
+0F)F!j )O
+)
+ (F FF(F F
+p FR
+IyD F> FhIF
+HxD
+j*pGd
+
+(j(е
+
+(!
+(O
+
+
+ +FyDpm)F"FF8F F
+
+
+
+ b
+
+
+vX
+
+
+
+
+
+
+IlF FyDl FIF
+!
+IyD F0 FZIF
+@* @
+H xD
+
+
+
+
+D
+
+pGj
+
+  .&
+HF9FG
+6 %IyD#IyDIyD iF@FHlFxD
+I
+(hGiPFd(FIFRFGFPF-@FIF46Bͱ(hP (D
+ F4 F)F2F41F*F6 F&
+ FE
+67B HxD
+xD
+
+
+A
+O
+
+0 h
+B=GI h
+:pG+b
+;A
+pG+b
+;A
+pGo
+9;@
+
+~xHxD
+!E
+CX4P(b,
+
+7
+ q8 F(F1Fhi`(h&`
+
+
+
+
+F hR#
+IyD F F IF
+8jF(
+
+
+ F h
+o)FGXe
+|
+)hg`o
+|
+
+ Օ *2A I  yD,d
+
+A `p|
+
+p8=e
+8(
+
+DRaV1(FNI"FyDJ
+4X
+yD
+
+8FD
+ NF(h(:IJ1yDqzD
+
+k
+
+yDD1I yD>@(
+8FD@F>(FPH
+9F AF
+@(
+
+P@(
+(F@(
+@
+ 
+ 
+
+
+J FF 0F9F
+
+
+FF0
+HFA
+F@(
+tIF0"  -xpy
+sxD&yD
+
+P 0
+o
+|G
+
+гxD
+O
+bG
+x@F
+rFHDxD
+ (HOqxD"Ozr
+o
+|G
+H
+
+H
+
+
+P
+XInyD*F#F HHxD
+h FjGE7ڻ
+F1F(h
+z 
+
+tpA8FHF@FR\FEH
+0h
+I
+yD
+
+1h I yDF  蝹F #`oF
+H xD
+
+i
+ G_O0qA m
+`<(FlDiBє Fl
+ kF1F F
+kF)F FRPGJ
+F8FQF(F!FRFI:oyDIyDkI"FyDI*FyDIyD2FJFCF HxD
+o|GliB F
+`
+`EFFF H(7\
+
+`FFT*@
+0khjGF(FVqmDpe@
+FI"FyD 
+(F~&`p
+
+(FAF"Fi9BHxD
+ F<7FWyh
+
+xD
+)h F
+'
+O3s D@4O
+F
+a O1 q O
+O7{w
+O
+!$TF
+
+N
+
+bO
+
+xDFIKyD{D ]
+
+liFG
+0F9F oF1hObhi8FG
+H
+I KxDyD{D
+
+H xD
+RIK
+yD{DK
+=
+HxDh  F
+JzDQ hD 2 F2
+HxDh ) F
+HxDh F%1(F
+JzDQ hD ) F
+1F
+`xipal(haiaia(ha&`
+
+` hi FG
+
+
+
+H xD
+A5IKyD{D IKyD{DIyD F8 FbIF
+ P/UP
+PFx
+8Ft(Fp0FFIFSF
+d
+ (FHxD
+ H I KxDyD{Db<
+j
+0hQ D0hQ DHxD
+8jFB(
+KxDyD{D
+
+
+
+(%OzsDXCqI;F'F4Fv 
+
+
+BO
+2HxD
+ FxD
+
+(h
+D FH
+
+&(hFkQe1B1(hyD
+(hyD
+# F u(hjFlAoB, xD
+xD
+0F(F1Fx
+o`0F0F
+(hyD
+
+
+
+
+!F
+0hQ D
+X
+
+
+
+
+
+ F
+
+
+`*
+
+
+
+!F
+!F"(F
+)F0
+
+f
+
+
+
+
+ F>XFyDp(hyDP
+
+x(hyD2
+(hyDj
+!v F)F 
+(hyDN
+#
+
+
+
+(hyD$
+JlQF
+>FiB
+i
+i(hyD
+
+@
+
+p
+
+
+TyD>
+*@B
+TxI (F!F  A0 p Q0 FFyD~V
+-
+ FZ^IFyD]
+ F.IFyDyIzKyD{D`yIyD F
+ FtIFyDIKyD{DKHIIKyD{DFSIyD F
+z F
+H F_IFyDqSITKyD{D$VQIyD F
+0 FLIFyDYYH
+YIZKxDyD{D>
+
+
+
+
+
+
+iQ(@
+iQ:6
+KyD{DIK yD{Dd
+IF
+p
+H
+I KxDyD{D
+ H I KxDyD{D
+
+
+
+L
+|z FyD: FyD4
+ Fh% F)F( F)F$@(
+H FH
+p
+X F
+|
+
+|&(FyD(FyD
+(FTd(F!F D@"
+|L FyDD FyD
+ FU F)F| F)Fx@(
+ FPF0)FJG21e!
+
+x
+X(F(FyD(FyD
+(F4(F!F(F!F(F@@Z F Fb(F.
+X FI FyDI FyD
+ F듥 F)F F)F@(
+I FyIyD(F F)F(F
+X FNqI FyDoI FyD
+- F@(
+
+
+|._p FyD_x FyD
+ F F)F F)F F@P F(F F:_
+LiA
+XAF8F< ` HF P XF F 0F|8FPIF[F
+H!F(FjH
+iA
+"dF FP8EЛ
+HDO
+
+H
+|d FyD$ FyD
+ FT4 F)F F)F@(
+
+
+p
+X
+|
+p
+Xx<
+
+
+ȼȼ
+L
+ H
+L L
+)F
+ hiFb(  F F
+",($
+(F(F!F(F!F 
+
+@@yDg Fx F1F艡 Fp F9F00FYF4
+
+ 
+WD =((FIFRF g
+
+"F F|HxD
+ u(FB(F:Fp
+"pF0F\F @
+"RF8
+
+` Q0  :
+FFA1 B 9Fa (F@ FQ ~b.
+ ?
+i1D#STD"b Kb "q
+T D`p q `q q q r(Ff `F(F(F`r(F
+F(FF0F9F(FFg r0FF0Fr 50F hF0FFHF9F0F(D
+pp
+ H xD
+HxD
+i ah(FB
+9mhBk\I> #yDLWIF
+
+(h<0hQ D)Fd 5
+
+
+0
+
+ <@
+ 0b@W 0h9R ,D > =
+4`'
+@'(h0hQ D)F
+xDbJyD
+hKh
+P `
+D `
+FxD)F
+ 
+0hQ DHxD
+
+
+
+L0 H @
+
+SBFiiD!(n
+ mF( CFk
+!Ff
+
+
+
+TF /(TF FF F?!|FW}B=F )Fd
+BG0F:!FJEJF
+
+*
+*pGHh
+
+
+
+`YFF
+ EF
+QDi8hki
+"
+1A
+pa(haiaia(ha&`𽀵HxD
+
+
+
+h
+
+ixDi
+@ hiiDu hiiDF!Iu
+HIKxDyD{DIyD F6 F`
+IF
+ OE(O
+WD =(0FIFRF g
+)(
+)o/aɲ)oVAɲ)'o6 D@(FK
+"FzFB
+0!i2DZ F< -H xD
+~F
+#Ga!uA
+"
+"
+"Fn FsGGeJc9sWr:
+h1F8 h'
+h1F h
+ \
+ GEx
+
+h1FN'
+i1D
+!p!qAAq
+8p#ixp7#i28FD#
+0p#ipp6#i20FD#
+i1
+h1F(x'
+h1FR'
+h1F h
+DB(
+h1FZHxDh
+h1FP'#
+i1D
+s0'i* B
+-H/-I-KxDyD{D
+I"FyD.XI F"yD&F
+h1F(F| hGeAr1 hFnc1HxD
+
+0hAFiBO(
+iiDD"QD
+qHq
+eBI2FyDI*FyD&I"FyDP
+
+IyD Fp FIF
+8
+@F
+I
+KyD{DnIKyD{Df
+O6FH8h)F"xh)F"
+D%8h1F"( F9F"Pxh1F"t︱ F9F
+C
+8i
+hB F F+HxD
+C!'F
+
+yD{D
+FbJ H !F"A
+F@ChF
+5
+
+<U A U A TU  ?
+-p)p
+H `  
+@
+"
+
+"
+"
+0 AFFHF)F 0
+~l,"f숹 8F`F(FAFHF)F"I
+b
+yl>">2F:*F#F
+iiD"
+TD!Ap
+shs@ S@0t#Attt
+i
+T `
+rhr`{0tpth
+thtwaIT
+ñ?O
+
+vv1w qw
+ww
+I hyD((F@)IKyD{D\
+O0d
+,?N݋I
+0(B
+`n"Dan"HBx
+
+0F&0F
+
+0FI2F(hyDt
+ 0FF0F
+(FO
+"
+  IHxD
+
+0(B
+`n"an"HBx
+"0F
+"
+ F8FIF0F!F @FtIF@FYFX@F9F@FYFz@F!F0F\@F1F(FTjfn(Fb(F9Fl(F!FZk(FV
+ SH&xD
+
+Q(F~ )FBF(F."
+QFL
+б
+
+
+"F $`B
+
+
+N%u $Bx
+9F*F
+
+ F
+?7 Ei
+^
+"F>FB
+
+뵱( )FF~ !F,0 *FjiiDPF
+<
+ F F
+~
+ F F
+nx
+t
+ F_I"FyD
+
+(FJF(FpTIF F2FyDRIR yDPF
+
+%H
+
+ F
+"IFyD!IyD F
+t FIFyD
+(
+( FAF"`$. F( Н`(FAF"x
+ B!i2(FD@
+HxD
+"FOFvB xYt
+(h 0l0FR0F(
+"F$F B
+xD
+
+
+IyD h hpP
+(8@0 F1F&7/HxD
+ F@&y
+
+H !
+xDO
+
+"0F!F F0F!F:0F
+"!F
+"0!F
+1@
+
+` Q0 r%
+ȿ
+"9F0F9F F F
+"!FF!F0F`0F
+4I64K#yD{DHIyD F|" FIFyD&I KyD{D0IyD Fd
+ FIFyDIyD FT F~
+IFyD
+IyD h!,(
+IyD h!,(
+!,(
+
+b F
+jG
+iiD*F
+|  7HxD
++H+I+KxDyD{D
+O E(O
+:@Fb T1
+$^$a 
+#E(
+)
+'SE(
+iiiP2F8DQD
+ QE(
+IF"HB(
+H
+HxD
+&B&E 
+)F"HB(
+/FW/B(Ffj9`1F#F HxD
+QFi"#FHB(
+T2
+
+$
+H
+HxD
+jB$$ v ja
+x
+w
+
+LjhB
+T iiDBpj IFijFAFh
+I
+KyD{D
+(}
+
+xD
+)o/aɲ)oVAɲ)
+(F
+O
+F$/$ ! f(!`
+
+O
+x( / !@Bѧ
+)Ff "
+I!!!!
+tHxD
+HxD
+jB $K$O 0
+I KyD{D 
+!`
+E lElf` `(b hb
+|p
+
+ OE(O
+WD =(0FIFRF2 g
+)(
+"FB x
+ 0F)F:FiBшhB
+jB &k&o T
+
+!mB F"
+` e } i)iiD,F!
+
+iiD
+
+!l!lDB(
+
+ EJ 
+
+U%c
+
+"
+FFPFF
+y@
+ A0
+@
+`ahA`ah```
+ 
+
+" qp'!p
+p!"Qu@O*p@*
+D@0L
+@*t
+(FT@FRHxD@F(F AFϊ
+@*
+(F(@F&造@Fl(Fj AFϊ
+@*
+(F@FO
+
+qqqSHuxD
+A)T
+x
+
+"$B&$8Fj
+6H-6I6KxDyD{DIK(yD{D
+GH!aV!1F h
+ FI*F#FyDdI2FyD
+h p $pF
+p
+p
+o
+1F`
+  ޻ 8  x)) 4 X
+А
+AF
+F
+xD
+q
+
+
+GH&GIGKxDyD{D
+
+u)F()F.` HxD
+H
+I KxDyD{D| I KyD{Dt
+FhFvH xD
+O
+8B+Х 0FIF(# F9Fx8B(FZ(
+HFZI^
+
+85YFT
+0FTIRF
+tFxDF
+8BPF1F"FD( QF"F(FBHF)F 0hQ D)FO 4  ,^FW  F i7IF6
+v@
+
+0FPJYF(hzD(
+D8F  ((h  E8I JyDzDq
+
+&dHXxDLhhp\PX
+hB51B
+R F)IF
+
+(hyD:
+z v 4
+
+ p p
+,
+(
+B=8F F!FXF9F!F1
+CBF
+pI
+h(@ q
+ |
+F8F
+P`
+
+0@
+ `1F
+0@
+ B. *FPF`
+
+x)6F
+
+#1F0*0hQ DIFr $0Y0hQ ,1Df< 4 ^
+xD 
+P  F
+P F
+v 
+p 
+%O
+
+
+ +?O
+
+
+8iIFJ yDzD`8i!p8i
+IFyD
+ 8 PF8IFd(F9F 8 PF8IFZy(FJFd)F%F
+X
+ O
+8
+ 7pt 
+
+
+)-ۊB+ڐt1[p1?+X:
+pGIK yD{D6
+"B~ x
+":
+
+
+HxD
+P6 @
+A0 ` 
+@EAFF
+
+
+0
+
+
+
+Zx 
+zD
+!
+
+HxD
+HxD
+FFh!FA Ph`(hR ,D FFHxD
+
+
+
+;A
+pG+b
+;A
+pGo
+9;@
+
+
+
+", bB xaiBHO0
+h|yjzjIyD@zjIyD `HxD
+w
+
+(  EPF,
+8%DFPFzDAPFV(
+2PFF
+ yD\ {I[FyD:FR@
+DIyD FD
+
+pGipGi `
+
+DAF
+p~pl
+ F F8
+1l
+1l
+, nF
+1l
+IyD F< FfIF
+D*fDEBRrB
+D *#@%#B@Ir2Gbbe2BXG`"p"B
+D*F rnESbVBB
+Gpra2C41RB@܀C51RBEGBNB
+D*GalRFvlRB@ŀGabdbB
+" F
+F
+>PFXFQFPFF" F0F
+,*.hA ^@(
+"0FB x ,)
+0F&E6 (  T
+8F1FRFx슡8F
+
+"FZFB4
+"F6FBxx) D
+" F(B x
+E
+"F"
+
+"F
+ HxD
+
+  $XF|HFz@Fv
+XFfIF yDj
+   
+IJyDzD ODt 
+"%H(xD
+
+"
+IlF FyDH FrIF
+
+$$
+
+p|anF@
+0Fm(F1F
+p@
+HxD
+q!FQ5H%FxD
+
+xD
+
+*F0F0F
+(F(F
+|D0Ff
+yDPF~QFBFPFOG
+^
+vF"0FQF(CIg
+I(FD
+yDj
+F
+)F`F(F/1 T!F8F"t1F"(Fn@(
+(F"
+(0
+(O
+
+(F6!h5I*FyD
+D<+
+iFiDt]B5B
+xD
+
+FI"FyD 
+"yD8 F
+!m8FT
+
+HI"`myD`m`I 0hyD
+I
+0hyD
+*u
+*u
+
+
+0hQ D)F
+6
+d
+vO
+ O:O5O1
+xD
+*n7{Dp
+
+ F FX,F7 O
+
+@F!FFF
+FhC` F 0hQ D9F  
+
+?
+F
+H
+I
+KxDyD{D
+H
+I KxDyD{D
+iiQ\G) pG
+id(
+UA
+NF
+
+j
+
+
+IyD F FDIF
+KxDyD{D H I KxDyD{D1
+H
+I
+KxDyD{DV H I
+KxDyD{DN
+HF. IyD h h
+ !F !F!F
+  pO
+xD
+!
+d! ! "
+
+ B
+
+
+  HA d
+FJ
+
+
+
+B1  O
+
+FB
+hhi G б!hp
+xD
+( ]G+ 0G+ 48BI@$pyDI@'pyD
+
+D
+N"F
+yD
+
+" IF0
+
+
+>D
+hhQ
+ D X
+
+
+xD
+
+( F F~F8F81F7`0hi FF FD FhF 
+xD
+
+ 0
+Ba
+O
+jG.FF0F0F(@tozvHxD
+C
+O
+!@ap
+
+
+
+
+O2
+@0F9F*Fhh mGhh mG
+i28FD"9F0F-")F"xh ~ iC:툱"I# yDt
+E
+
+
+H&xD
+
+
+
+
+
+(
+I$yD h h m
+HxD@p
+e 
+HxD@p
+e 
+!
+
+W
+PF`!
+]
+TIyDF.@
+@
+i1
+
+ (
+
+ꜱ 
+i1
+
+ DF-@
+
+i1
+i1
+0F!
+xD
+!
+ 
+
+ yDF IF.d
+
+
+pk\  @i
+ $ FQF*FEd
+xD
+yDF
+AF-xk@i
+C
+
+O
+ 0FO
+(жhmB9O
+1h(F)F0)Fl^(1h(F )F@)FX%
+ (FIF2Fh\Eh
+HxDh ) F
+HxDh F%1(Fn
+JzDQ hD ) FR
+0
+( B
+@0HF)FFDFThh騻0F!F?.` Z
+YF8l0F!FZFp t$
+,F
+#hF h F"1jihiGرFeQiQx(H"xD
+
+hh9FY
+\HxD
+F0F0FHxD
+O{ F!DF F!@F -(
+
+
+EF1FPFFt2FE
+
+ @
+(j `HhQ D!FX창
+i* **'*$шkر(
+i#* *%!@"B*$*B*
+   
+fE oEl(a IP
+(c hc
+& ((((E(4(@𢀠h&hh@
+hFeQiQ$Fd a1(x @1FF(F9FHxD
+HxD
+(F!d(@V  *(
+@pCX @W(
+1/
+1(F!F2(F!.(F!*(C(F!$(F! (@(F!(F!(@(F !(F!
+(@ /(
+1? /HI JOcyDzDI J@CyDzDI J@CyDzD
+1
+2(Fp
+2(FYFKI KJ@SyDzD(F!(((F!(F!(((F!(F!(((F!(F!(( /(
+1?!I !J@CyDzDdI J@CyDzDZI J@CyDzDPI J@CyDzDF
+
+F0hQ DIF   FIFF$F p
+
+gm
+
+iiDIFw-amiB
+hiHFGIhyD
+iiDDRF 
+iB
+iB
+
+bmO
+iB.
+iiii
+i7
+:F3F
+
+i i2(FD F)FF=Ih yD
+ xD
+ +p`.I
+I  yD|o HxD
+X
+fH
+
+
+@
+)F$ 
+F PF? `
+ PF*F&
+)F6^Ej F !HxD
+(F2lI lJOcyDzDOFvi
+F
+B(
+B(
+ E@F2F;F
+
+
+  
+ 
+(
+H%FxD
+IyD h!,(
+ ,(
+Ѕi
+4
+
+4
+
+K
+D
+F$0hQ DAF(B (B?
+F(F:P
+
+F
+
+HFH0hQ DAFD(B (B8h
+ R ,D*(B(B IyD h h
+9Fȱ
+
+4
+8h$R ,DD(B(B
+)h"Fhi(FG
+o
+
+4
+$
+h
+yD h h ؏
+s
+
+徰FHxD
+e
+
+
+
+
+C
+
+@
+
+!,(
+
+8T BD |T 8TBD p(=(?
+8FYFRFB
+-AF ah
+
+` 
+s
+FRKB
+F```1hAh``h
+FRKB
+F`C``!s
+FR;sE
+F`
+FR;sE
+F`
+hFiB[h
+p I cyD
+8pG
+
+!
+
+8F"!F4i B(
+
+
+
+hx
+8F"!FTHi B(
+8F!F
+#B(
+(0I1JyDzD,
++
+#B(
+ 
+  !FBF(
+iiD
+hB"Ox
+HxD F)FHxD
+
+HBO(
+
+!B(
+
+
+ʡ"F
+OxO
+$UE(
+@
+<XmгjQ"Pzhii D)FF
+"FiiD)FPD0 !B(
+jQ"iiii8DPDbh0aD^ahBO(
+iDjiB(
+
+MI"F+FyD
+DI"yD4FTPh
+(F F)Fl
+"iIE(
+e
+`
+ &I&JyDzDIyD 
+
+x
+v
+xDO6O
+FtA iqFg e1FIŢ0yD
+O
+B ЃF
+
+HxD0 h
+Fn
+c1
+
+yD
+ E(
+iD
+2(
+
+@I"
+yD
+
+
+i1
+F`  "
+< $$    `
+
+
+
+
+0FBF
+5Fj)F"xD
+
+(FIFD ((O (wO
+
+hFeQiQ8hFtA iq8hFg
+eI}
+yD
+i1
+FAF\  VO (
+
+ TE(
+ji)
+hFeQiQ.8hFnc1"28hGeAr1K2*8hDeQC""
+xD
+,[
+hFeQiQ
+ Y
+!
+hFeQiQ hFnc1
+xDO
+!E(
+
+8F
+BAI HEO
+iiD1F(
+iB(
+iB(
+PF
+#aaЩ
+(
+iB(
+n'B(
+
+`pF8H FxD
+2
+T hi
+ FO
+M   Ex
+i1
+F
+I
+@
+
+iiDa
+A
+!F
+H
+/6 $O
+HxD
+
+QkF"FC
+ZF3I yD") BO(
+1kF"FC
+F3I yD
+ B(
+.ƀ
+HxD
+hiG𵅰F$HF FxD
+x
+ OIF yD,O
+P
+H IxD JyD
+O
+O
+?ȿO
+
+0F!F` FdO Oih
+jGx
+
+
+*F
+I  yD" F(F
+
+
+
+
+0
+8h1R ,DZ FH@xD
+jG`DTyD h hU
+M?O
+
+
+
+
+PU$
+F1FRW45P
+ 
+
+
+HxDh  F
+JzDQ hD  F:
+HxDh :) F
+HxDh F
+%1(F
+JzDQ hD ) F
+IyD h!,(
+IyD h!,(
+ `FOL-|t], dFtE7]/4tE
+ |
+ F OE p
+
+`-O  %H 
+%O xDD
+
+
+
+
+
+ECg1xAB@逪/ F!^
+D? Fr
+=
+!-
+
+
+
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+?o/o C02
+@-@
+
+
+/oo
+@-@
+JZt
+
+
+@D u
+
+
+   ! 0bà01@O
+",#<r 
+ BQ 0c1
+
+
+T \
+
+0/
+``!
+
+6R#2"<$!R \
+R&^b1>!,°
+
+
+Ѝ
+
+
+
+Ѝ
+
+j
+T  
+
+`V
+V  
+
+ 
+
+
+tjjj jLkPtu Huuvxwwww
+ 0 (HN j
+
+
+$
+P
+
+4  
+odppxqqq drr r,s
+06@ ر< h
+
+
+ H H  2 ,`hL (X
+SS DU0W?]
+^__
+m?`w
+l 8$
+̙H
+
+Lxxx$ | H& Ʈ `
+D
+
+p    T  hp
+|"" $L$n$ $$
+(WX\Z] ` cDcdxee4fhi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FLAG_CAN_SEEK_FORWARD: %d FLAG_CAN_SEEK: %d FLAG_DYNAMIC_DURATION: %d
+ FLAG_SECURE: %d FLAG_PROTECTED: %d
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<O8pLHERA_[–VuVR6j+n cZg@y]}z{pf^t#W✎9`<'RdX[+F6`}h-/30] lm2'pVIKqL6" Ε=u(:Fy>Cͼ-}wp4mG0K=V9'C#=
+VM#RV/K`mpl +e= hﶻ'؀odj#ͳ`~>ɐ}:{y`6q}[Fu2 t-0q].KYT@PENOJ+ GC!}{`COF
+A 
+ "&D7zXZ
+]EOkgvK-9允
+QQt R]&,= ^7$KbҲr$mLpC1=LY&.o8riitv[%Tj,DLbi+]c.vZ#C+
+[񸕨9ݛ5_h!9.^'dCf3K]qاXIն2.?WA+>ߖ,Pl8k*Ț(Sɂ |(:YJذnQj]VqtxHkH9pQH3dI(%vY@p8zNu9
+b<)^V'ֳUxA>?Pb2I@ɻl$|BXRbLel9{ޞ^ECS9asV6G
+6Yػ?=1L8Lk[q8ѱ C@Yq.l@d?@ٗ. ,<FkISZ cFUe/6Sc*iIMe-=,~K.Qq[yNFA,' =pV55e7M{1_!qƅ}s&1 Ճ[{j\,B d,HղAATV!\kTB*H"qşX!LK aMVHbqDLە~ڋDC+#ցYe f֋QnJJw[k=iF,f.%:xx]y;ez釕F8]yWtIHrjO$=nՎmx TWM^[G
+[OZ>nEa3;\fh}B
+7yFPqofEwNKgnO5{1aoC1 !>XRM{oZn[yL`jwk,a G+_ND(n*q}2K3l7YGCbGZO&D
+kYny^5}}ȱ]~W"F0d|7PBh9Yn.
+Ӧ.3K}E/da>ZWgI]tDu|; Ayؒ^u;컠j~UPt Xb5 vUq-Lu@Z"ƜuƼSl@2ʊJFJW#xr:GN*|>t__60d
+=VeQI(̲gr-xY66!λWWpMp3r ѧ/)CV.ehl9A7 Q&'n7#@e'Yy3_ej}OeOxdwtm @կHW4U3>k
+B)70]lJAGD)(Ati\A}~V1)䷜5d||2:>HIȬp!@/ FmPENAm lmBbV'R[8KT(^]ZėP:[%/L"fqZlwa"vT#..d
+:L&~ t^DadrfďF1ӓ&w
+w'#+<ݼex03TH0F>{tM fr('C׼^_c^"6הx4gC04T }p_S Gqrk )?}idPh{
+\ȗ] x x>
+-8=G>ȋr[OԾZ_U#̯|%%ҬXSi"jzz,d~pTӛq#x$M.<Α![;>uoL=DXOJL/EkT~O@H#ͱv yTii5V+\E֠kWvPLFQTLFzU`+-}81>9I Un;b ;;{vMihA'/jmӶ囊!؛k[DIhFDaYM%]4&D散Fs),S4 #%Y:ɋP*aB.i3r%]D0yhc)ѻ?߆]Hj݀hVƶ>pTܭCijY@u~+ɂ0gL=0(5ğ#bŮrh` F^dl[<7ґ Yqa9]
+Pl#5I].A!:޹gk*pW|B_bjocoi̯a.=P=,? Sı#t}if,feb:|@>F\/~;#]fH&Τ>Tk/Pz4wd\߬ īځ# 0KϳwGxLj(jUU%P:'M~%i?sB0@>CTo8ܖl(%Ie3e{kwp AE
+$DjAL\+E{csXs<P;yÒ i)e@NxS xlY^kFiہ G_E4ӷ9b^k=M-E)Z3^MM TVfG8 m)#gK%(ѩU@:l&!?
+pWf7 5…}a
+FLQ^E>nsaكsu[lR]M9ZօIܰcgIWEAZ0R9FwDS7^~@1WUW mE{`<AZ#w䑙]ͽ˵^]zMmy⺮GڃT.ɢ B36<HQK'{]ٕK{b:k% ڥ? ]'pV-gVS]:ӳ_m*F6v$؝Q0IbW&כ_,eysVOh1^CL_vCΜva4@{H8q"%xGo\i`վ}>m .H!
+FF.Na/h
+FAh=C25Z: ;/n\*#.,P!ǍN5GCiK
+3}ȉeN|}<hKk˘ =Ic
+4f4kiZڭ8c̺ݝ9馦#I} *f):vGuAg$9 Uzi_c2S⚁w:V\#<qnSj$9k<3pgQa4Zz&-T{BӍf#D3 Tl1y(91'|{'8DVCO`vzݲ6DAGҎ*sk
+Ö\9)<4FEzZS:`յMЁՌv])#s{V)̛+qT9gwȭB6IxSq 3p)*nU5!ԓaW ƛ4&iP9u=n3cREsc\Ef[DaRU~~/L!yK#<<p̞*|Sz=a! ~MV.'p%sEkq =GaA/ Yt#r)Zް{¶/
+Hfc==GӘx%b,Ŝ! 3|-8zmu*\?@:)5Ú;ZN qr"~p[G׿Qi-HzCb_{bJo/k4izW&{v?&
+odv$;Uv&Nd& h~0
+|雊9!U28r35c\irb UE p)u[=$>a}\wE1B+%R}WKLߨV'qLWW-1{HFg9/K8xGt6`0k
+ j~u3 z*<"[O-w, 5׃z7m\&thBepC;W'^s& %C“*F1Tm9FV򴂨}\ΐtvsϣ[[YAϷJvKtӡE qk&Qc`l&,`JL4r= 2"(z׎X lvX@ў)tv<9Sez`<UNPaW M}rt-ښφ3x΋
+`u h< 4]N9Z+xWre pQ:ܡw8)^!E2&N&
+g^3UlMHd
+N`nKl,-T5(eU ܳb8(RLe
+D?-1~0l&qz%kǩ^N uQ>=`j*at MiP*;^mƩ Nx؇̔*SR"P,4<ٽB?YeraigSa!Ea
+dtM7~ۍhN\1`GJ
+I_*vF1uG þ9rEݥFLY+;pէr~) ;
+tuWf=m]y24cxpOL_Ngd长$1 qYZ$
+oZPnhdQي%3D<9#qw*WnH_.Q/yďT,wmzeXэޣ*SN|/шȃ:hLKN~arui|qcf5d :`R9 :fm͂%2RoڟkA++Pi&tm$A9xӖm'IdQ-Nջ%ppZa[;Ui諌ō]Oz#)*9!x]/]EOYBPd_˨ثuTl/@$t}{}T<zD2.NlE#L_|uy[ҡcҞ2C-^2ũ@GS]D6Voim,, eT\x"7@x.#?w
+eD XH!ryP0brff7|i-xk}zIL)Y)oS'\P~)"":OѶ$=,k1@¡
+rFuJ79
+za@gF<<jYJi:C\ ({4:GgqS{\~`wm޹~O:1m\c'G3;ɸ Jxv@S`Cm*JEZ 3&Jp8R}cksFq^T2fh}ҁXL5?
+i ;kr!tعG`!Mģ(;Hgh,YlC@,
+Y۞H(n!ώHQ4@¢-dY_WY hT}"qD;TXI25a l(|2IS< H0ѲBjYBs4pOєJGHDKk
+7nnd9w&[$ťY䋸IJ2#>G<E&2%CvK݇iv($r%\R T_r@bllV qc
+~}ExXl>/1e<C=cʌ^Ԟ(*ױ
+uZ/F8YKZ|ܡMrrWmYuV-AajmӘk3غw7k*87ӣ3dWg
+qGًͭ8a]m)@Lp+!FC)L(A/
+m}(ƨk1RG۹>+Y lilj} s Iz>/qMVb F/`sԯ*:ڬp6vSIȵ3.n+
+R&;át-Iկp鳖㻝1[#HX
+h*U
+e: 7R/4)qi!fW?ZO}NA(-S&#{lFRddd]M b iZj%;;M/+\B͖P=5(BJrLZ 5Y#V9+ :H
+zUɘ
+y[o$
+gA(R/&w™}ITJO?Z 0
+111$'u07kQ&YSI]teJ[C\BRa2 RNYvO&vW 2
+D90^$(X 7+@&)!L{2"jNcA_Ry
+W+5|* V3ƻ2 $AgM$ 2\ce>(jw">!Խ%ͷ <<(b pP, Fg,Q7'Y%Jr^ C%LΰdnVY BZZk]*-_-^ AԌ+!G^V|vLDݨ(^KY̽L1uJ
+ԅgWھ/,k*9S#AK\w ;4_6;ekZ;؋W
+o[JSz Z_XpB]_-%Y+s%od6Wj\C5Y"'.@6odB/HMb
+iHFlS:@gS%Dps6/S;e\\k0_"19inzC:_STn#b󋳪*.q̷B*1[)o*5"$(5 AQʥ2iϾ F1IR(vBpxpdKq7M%KܷrLuBCTT H_,uφNKԋV˖#l<}{\YiL1/?ae zY7 "Lĥ%Wfc^hp@pg&m6#!Y\R&C[1<9zfNUƫSĤ)/=0PM
+J6ID
+(ܚ\|hShe@b)
+= l"h yk}TS :\%zđ
+ʻaʌ*RDY`zJ[wəmQJz &͆P(< B>|f渌sYȦlb: R\
+=>`l=N 3ևa&NG {U[f0"@U\84 ^ͥ:?秸?Ee #z7YzeCr&qG.W7qx+G!3,XL#]!\xsբ"W
+B#eB@|Jftr9XnI>B7l\-s/\rs>;p WS+{:\CSo0|FG'b:(o?/u.[Gd~ٰ>1*# rV}'Qzz:H,PpK=42ڨ^#V,q~g0Ӈ˝la=۔eRzvX)coxmx2E;8³^R
+Vhs < zd
+4:I*己F.J]Ɛ (yarMfrRIIZxȒo,,Rْ#Z 3nbBQ6֣TE(W
+a84gf!c_ Rg [B+ԛL@mN!7$ jBb&$%_
+Nh9CYoMF4v`dψi=
+Sq@(d/Nie;iMq>ՙcѴ<M?
+)C%Y?K'1a$%/5{KӤOUe1`(lr9-V8L<)otcCe+$vV0:gZ CRݚ
+vө_M15=<rt70FxHwWnOq`tY:,~GIw^C4$,+$3( փ\ICNcKLٲ̍aO
+=J~q:0;
+әv'F$"+}/s,L-)CuyeX ߤKKK]rzuD8go Rk)snaRwEsCJG 
+Fa95*EjΒO׳lB.qM\8 Ǥ~%zvQn?d$zBVVz sW*:) GG0)]gZ]dM'"'7p-WؼN\qpzQeN65>.GL'\)>/cαRZN]a{O\lZJl zjAi7]z F<@;lޙ-b-yodh, UIAƣЌȷiʞj";B:6 xXh1(:E֤3 5auV%H7\
+K433=
+€Da䒨;ɽ!8C64Ӕc]/\DT3
+y5uxd,U)qPEw "}I
+=Xİ5ɱȬJ
+M/6-*Q#0oK.ˎpK)Fb `w)ϰs>vjHٖ٨"]]N+*vDm-?H"0U!AZϘ7n}Zb eQkT"~B9O?!=&7v`7z}I!9 AUoH2i='^p-lp*33_J wv-~tI6`X{fkt.l6Y|@s
+UBvQnyySEn-.b~:²lK?,DV9clL{hd
+dV+}b3S1? sCk%wN/
+TNDF>B$RY-h_-0B5gu3k1^`
+
+
+
+
+
+
+
diff --git a/prebuilt/libmedia/libavenhancements/lib/libavenhancements.so b/prebuilt/libmedia/libavenhancements/lib/libavenhancements.so
new file mode 100755
index 0000000..b42211c
--- a/dev/null
+++ b/prebuilt/libmedia/libavenhancements/lib/libavenhancements.so
@@ -0,0 +1,88 @@
+ELF
+
+
+
+
+
+
+
+
+03/K
+#
+` p
+
+
+
+
+
+
+
+t
+\
+D
+,
+
+
+
+\
+
+
+
+7 P
+@L
+@<
+@,
+@
+@
+@h
+
+, 
+
+
+
+
+P
+
+/
+@
+@
+@$```
+ R
+"
+
+ ,
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+
+A 
+ "&D7zXZ
+FE~m^aʬOXr3b0  f`j3 LClɪwK kk,O/~S8Oq/zUkEu|ߑ_H"UЉJ2"{r٤82\[w7?M(}h֦tcH^6XnwpEè86ǀæфy7kϫLzp5d)EB$ wjY/
+E "6
+,`{ŸסQf1J>(dVNb,/ mnPTꁻл
+O5h&Ia'ԽdQ:>]VC4Vsd~BANysk=uEG^/ ɴ>7YZivuCJq6_@~+W`Ȩ_ vK@ۏoH^'wf\'#L/!KI\Bi6^6wIՋu1~q:KftEKёc^u !;7qsr!?'sWp2ʫ(0?l$hN *)G즛@{6:Tjq>r".-OOJZL`e+$'Ģzv!#:I  3Ɩɔ5W+)nwh󡷌eNRƹxц9/`$(m
+<UBucY{љb^4B)v"uNzK.RxъQBFYoxi8)|"89$Aȡ3Iwxyk{OXeR %^}
diff --git a/prebuilt/libmedia/libavenhancements/lib64/libamffmpegadapter.so b/prebuilt/libmedia/libavenhancements/lib64/libamffmpegadapter.so
new file mode 100755
index 0000000..ee8bbb1
--- a/dev/null
+++ b/prebuilt/libmedia/libavenhancements/lib64/libamffmpegadapter.so
@@ -0,0 +1,281 @@
+ELF
+
+
+
+
+
+'
+
+
+dn`z2`%( h)fc4xDy){Bcŀ'()sE))ȿ l 9g4 v|K/oa:Ap3Lj=9܌DE8E:Mmp< :CA'f<n %nو\ /FY1-k-{pX8 PʡE
+)6ŨBVߤQ{l(IFd<t
+
+'
+:m:}::;{
+<x
+
+
+CB ְ
+DB ְ
+EB( ְ
+FB0 ְ
+GB8 ְ
+
+A
+I
+q
+
+
+
+ !
+)
+1
+9
+A I
+Q
+Y
+a i q y               Y_O{C
+
+2@
+ 4A
+2
+|
+@
+@9
+
+`8j
+ K@9 
++
+@Mh
+m
+cT{AO¨_g_WO{C @!#
+ ˚ R)U*hr?
+K
+A~ )}
+)qS)}@ 1
+k!*
+
+
+k
+
+ }+_
+`Ӫ
+}@ R,}R)} J} ?
+!T `I
+a
+@
+@z@T
+@
+p}}
+
+
+
+
+
+
+
+
+
+@"@
+
+ ˚
+@A
+ ˚Z@&@
+C*#
+;@
+@7
+)} ( Ț^@)!B 
+@2h
+_ W O {H;@
+@1@A)CTI
+ ?
+T*^@@yx
+`g)A
+@
+@
+_WO{
+
+2@U
+
+2*
+{AO¨
+O{
+@
+)
++@
+`?k
+
+@AA
+@
+
+@AA
+@
+
+@h
+CWO{H;@
+@H
+@#
+@
+@a@@
+
+@
+@e
+
+@AA
+@A
+@`
+@=
+
+
+@WB
+@
+Rh
+@ A?
+@@ 
+@i
+@(i
+@(1
+@(ia@(@
+@ u@)2 u
+@ u@)2 u
+@`
+{ H;@
+@
+@3
+@@C
+@
+@A
+@`
+@
+
+
+
+
+
+@
+
+@AA
+@AA
+_ W O {I;)@w
+
+
+
+ 
+
+
+@ @ C 
+a w(@@@#
+ 1 @@*H;@@ A
+
+
+
+
+7v
+}SSx*mSsx/@x+@3xJ@y'@@y;
+
+B>c
+{C
+B8 2*{__WO{*h
+
+
+*J
+
+B>c4
+B>c
+B>c O{C
+
+
+@
+
+@BA
+@BA
+@
+@@
+H
+h
+@d@~*
+@d@R!r*@b@RAor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+ 
+ 
+ 
+ 
+ H
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+
+
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+
+[aYSLg ,3 rw`hBuX0B_o_2Ɨwe9]z c"+92؜!d7
+kCV Ks̭ z>nÝvuw^i9Id z Zy:om]XArfLGEu0 3ޠK:<>g›ڄ,T!ܟz*>M8Y Zr`eʃϱ_Cy j$< f!s
+~auȲU i~sWJ%ņ{G@.
+-fÝR|޴X5E1zt]{F}=)Feb2eg=ANLIԾ`oڤpįT+O M+*
+׍s)և I~Ʈfy$$)v1tŶ;X(Èkgn42 PU#]i,6 `lJ%mioeƬ=gt[ӄ\(2R74AA<v*S^8A(c ,NI9a_$ywj"\%[#<dvE**]^$KƳJ% kI7{zg*L5Ķh
+[R JF]h}thM3JW2-FZʿl
+\*9hJLYޡZ ""E92kwek2},*}?1FZ"Jx"ҲȐf-ˠS׏[f_VGQqo4@F5^qssXoUu"uzZ6GXמʟhǧ=}+L^X&zZD=Uxnjag⢎Pu)Mc# :wk`l~SIeA b62b>o]2D7-Ӌ_UbM*j[ƓŬNmV@Z̦ܲ|/?!WP7`񱃆t- ٥B"C!
+fz$RWw+>p^ȚGvА'u=9tFŒ1em"w,,s>`J齰/-y
diff --git a/prebuilt/libmedia/libavenhancements/lib64/libavenhancements.so b/prebuilt/libmedia/libavenhancements/lib64/libavenhancements.so
new file mode 100755
index 0000000..3ad0f04
--- a/dev/null
+++ b/prebuilt/libmedia/libavenhancements/lib64/libavenhancements.so
@@ -0,0 +1,43 @@
+ELF
+
+
+
+
+
+
+!
+
+9
+
+Q
+
+i
+
+
+
+=
+
+a
+
+
+
+
+
+
+
+
+
+
+
+A=g
+
+
+
+
+
+@@
+
+ 
+
+Sq=I[iQNTf3sJn@imW ;
+
diff --git a/prebuilt/libstagefrighthw/Android.mk b/prebuilt/libstagefrighthw/Android.mk
new file mode 100755
index 0000000..04133b1
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/Android.mk
@@ -0,0 +1,192 @@
+ifeq (,$(wildcard hardware/amlogic/omx))
+LOCAL_PATH := $(call my-dir)
+
+ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26 && echo OK),OK)
+OMX_PATH_32 := $(TARGET_OUT_VENDOR)/lib/
+OMX_PATH_64 := $(TARGET_OUT_VENDOR)/lib64/
+else
+OMX_PATH_32 := $(TARGET_OUT)/lib/
+OMX_PATH_64 := $(TARGET_OUT)/lib64/
+endif
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libstagefrighthw
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libthreadworker_alt
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libOmxVideo
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libOmxAudio
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libHwAudio_dcvdec
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libOmxCore
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libOmxCoreSw
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libOmxBase
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libomx_worker_peer_alt
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libomx_timed_task_queue_alt
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libomx_framework_alt
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libomx_clock_utils_alt
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libomx_av_core_alt
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libfpscalculator_alt
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libdatachunkqueue_alt
+LOCAL_MULTILIB := both
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH_32 := $(OMX_PATH_32)
+LOCAL_MODULE_PATH_64 := $(OMX_PATH_64)
+LOCAL_SRC_FILES_arm := lib/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+LOCAL_SRC_FILES_arm64 := lib64/$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)
+include $(BUILD_PREBUILT)
+
+endif
diff --git a/prebuilt/libstagefrighthw/lib/libHwAudio_dcvdec.so b/prebuilt/libstagefrighthw/lib/libHwAudio_dcvdec.so
new file mode 100755
index 0000000..b41922d
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libHwAudio_dcvdec.so
@@ -0,0 +1,83 @@
+ELF
+
+
+03/K
+ hRA
+
+ hRA
+
+OQ
+
+@
+p @`#9S'0Cb.
+2b
+
+*FB
+B
+f(r` a
+pc
+@
+0
+
+F@
+@
+Yb(@\bгZ^먳
+ $?H?IxD?JyD
+
+
+
+hIiyDjJ
+h1
+bHxD
+6
+
+8
+
+
+
+
+
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+$
+
+ bh^h
+ *H Ph 
+
+
+
+
+
+
+A 
+ "&D7zXZ
+ S*8ZlD"(-ET
+ GѷFHcD혡ц󝋓>,~
+_lmj T9t]gy!)BOٖ`:ڇIÕj8 vv5ME06.>8dKf ޶!,ҞxvH}0XlR=Ȕ V`ÔP ,]k0MC$(,xwA ӐoCa }?+yD:5T?Cy0-~ bq?wxm[y*fXCBg
+V[`T9[ ׋[A
+ߎ/N#cfK`9.&z$X/Hb >o|?o'W+FZNyBh+y4gQ >3EJV0ˢ_. i]m,8lọ=M]~/|3|[GI*}`<I9 YIaMYY %,|_f}_`|MlM b;OĐK+shk%c7w̚xx$}ѪVmlr^BVQw\H(bJϥY.%~u3]Tt]Hkq"jcys|t|.
+mʜ7[)vִb&}wsQur~5ġGܶIC8|''= 5ui[iٗBB`P 9shM~⠩5Dtb^;$Lwֽ TcyFmx.BH MM9p;:%R;N" x˜QLlq_jfe.Oi5<18N5RePV;,##ԛphQ?ݠ#6)f;=.27$ʏquK-(y\"9=7IGdhf|L{$[L&GV%ӯE]yWF$+A.[݃љ}PN)E@ŀʏeG_E>_S0gUxh]򚱯i`12oPWC֩1o,nk*/y9tpnqjƼD `='7կQ9Uy4F_5z4yT+&&؋~_ɏE8esLnR*n#|^=Rvm,yM92P&#=c\~G .Ta%t
+B .b1h*M<3mJ9- ~yaD|
+
+
diff --git a/prebuilt/libstagefrighthw/lib/libOmxAudio.so b/prebuilt/libstagefrighthw/lib/libOmxAudio.so
new file mode 100755
index 0000000..ee11da9
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libOmxAudio.so
@@ -0,0 +1,84 @@
+ELF
+
+
+
+
+
+03/K
+O0O1gHxD
+FA
+A
+K1a(Frp
+FyD #F,P$
+
++b*-bJBJ$B
+4B* "bd  S+8F` iSB(K2 !" "|
+`7F
+
+
+
+ L 0
+IJhyDzD
+
+
+
+
+X
+O a*A*$A
+!Qcc<n hK+(!`N
+ hB. F%`p
+
+
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+?o/o C02
+@-@
+
+
+/oo
+@-@
+j
+T  
+
+`V
+V  
+
+
+
+
+
+
+A 
+ "&D7zXZ
+.f7Z*M8u%2M/Q2>8S3`L[Q;ND-t]3i~kǍXb19.Tkk x@[X>T{Khuw#E6^x<wխ7dyS.ҫ&d3ěd]5
+>đ(3pb ᒢǔ^4:E]E[ӟ.4 X
+ `YMA3Vi܉gÒF&@2]=qHKgsa47P[ja5~n~-Ѿ mƖ-P1Τ_
+P.[u*#;l]}÷IrLYwVRض0/"h8^!
+ MXvúOکqY9i(+q{Rۈ+K#zmm:>AnlnVziK
+xc;AL7l^fIZw`21:vGm>!(gGpƔѧe| <FKs7l-r5Z?6Lbs*ԖUx7Y{r hP<h]<7pKǛ I!bO\ޫY.btB mp7<V1& 3RճvQTXik]Ҁ.4C?v4` Äsf'_n]B<`*卮rʨkhs@g>#8F2̴1^xBh
+/b V/2uz' .ҋǮXNnDn<2m#e!mVDE<w>JפOuLlW5h.X 1m4~!`;&dwʏ1o:q3Ca7wF=mSșU$ ߼GTۓ*v{$y?M aL*drٹa}) c%×ҞCVFPPHQaxe"We J[U*\E~ 0Dۆm*';KI!ݻ8FU{txܙr&Q=t/ДK>: US) kx!{"7Ld%{H&`a c.jd&ECLr=_(" jJ@p--Bog2M8@m珄<drw2g ɥ~ćd)Lx hfB ~]uG#+) 4+'
+
diff --git a/prebuilt/libstagefrighthw/lib/libOmxBase.so b/prebuilt/libstagefrighthw/lib/libOmxBase.so
new file mode 100755
index 0000000..66abdcd
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libOmxBase.so
@@ -0,0 +1,72 @@
+ELF
+
+
+
+
+
+* XHНJ
+bCQw*'dm0
+d~+vMA)ZkaS:~1v'[jvCEST}1|(U){V@B:*
+
+
+03/K
+AIA
+kbh`pGF-H F
+h@hh
+-
+o#Da`| FP@
+IhhyD.(
+(FPX/AhBhB2BъB
+*nB`m0eiF F
+
+
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+hX
+
+ bh^h
+j
+T  
+
+`V
+V  
+
+
+A 
+ "&D7zXZ
+3`(ݤ#|.f
+Df)+ȲԤr9b
+ v [k7j
+5NW"cc6@1/ yз+ST)yh4[Wqso?h#
+ߧbBP+S!Cl FG><PǥF!zK9\3et >NJɏ ';б
+W1tosmd3:\ZG yU joa,&M;0v'ꏒ>NS.~
+;2:CRhEb[ŷV4I FՌU
+0a֫|Q{O"x&y+g9dgͼHΑU=MG Ǽ<e-|YF}IM
+^v#2"`2_ T 1g;-_^1i5Bݮ
+}mՖ,[Y85#`9D` !s)"Zk[5o#f e;#8%IJoWsV ;wߡ}dSEgf5)7dG&UeNx\Ⱥ6.TtӅ Tf#?Qɷ9xFмu#/i;#$x'cH#{zo㑤fúX:UNU57 2b+AMhz1;y1O-^IHkBqr/# 66@eAHt-R~I_R@}0(\S5MleJ+L׿ !.rwݢgm+s5
+};|e;mXp=Kb[]rON3]ECŸf!R%Dg:\+7 EDp9|%"zHlKKVŃ'*ew<7`ݣntta<wy?E?btw#8Z="E%5e}a bwyJ hToW(V hwκ\N mY4K9D0PMѓ
+
+:>5XAs}8U"/Fv('0 B[ԞfLm~^ĘqVQ$|el@aȃ\bO崁۫By\]m_!a7wT"h$Pj'u96/zOPڻݡrfmg еWkT=N%!Bc2J<sy恹R!hwjln*= ^)<fk\j$eE3|eC
+
diff --git a/prebuilt/libstagefrighthw/lib/libOmxCore.so b/prebuilt/libstagefrighthw/lib/libOmxCore.so
new file mode 100755
index 0000000..800c3b8
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libOmxCore.so
@@ -0,0 +1,50 @@
+ELF
+
+03/K
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+p!P
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+--------------------------------
+ARCH = %s
+author:aml.sh multi-media team
+branch name: %s
+git version: %s
+last changed: %s
+build-time: %s
+build-name: %s
+uncommitted-file-num:%d
+--------------------------------
+
+
+A 
+ "&D7zXZ
+%=x4Gtm*FO-{c*L<z4ghkPbpŌEğAuRaܳ2g0[돿gaUU M7GfѨ%SBZ4~M}{9@MHBX}!*rR2H}Lqx[9`O sp#[ [
+3I*i ,d~R>]0,…A "2*mFF۹
+]cpף䂘Y-vo:9;Ʃ;QR-dAM̷8'%KE鄙$T3xLں
+fyDiFΈ&|"<͚sBjjDy]-&R3KM8s̲\V[c Li y[ =W۶ bsV_O
+ZPK$OƼlfw!٘IqUҰ"d .ity+4{tL K#gG}v} :4=|3rXpoךOXf(D[cM5 yVyBr
+D
+{,1 -{k`6sk\[`ڿS` t9]@m=Sբrg#y@̶]|5-HT*Qe퇞"d %'95/Bs?ZZydoJI&`U Ÿd^of
diff --git a/prebuilt/libstagefrighthw/lib/libOmxCoreSw.so b/prebuilt/libstagefrighthw/lib/libOmxCoreSw.so
new file mode 100755
index 0000000..7b17ef0
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libOmxCoreSw.so
@@ -0,0 +1,51 @@
+ELF
+
+
+
+
+
+
+
+h!F@
+03/K
+. 4 HFxDP!(F
+$I% yDX F\ .HxD&-HxD
+
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+ *H Ph 
+
+A 
+ "&D7zXZ
+19 R$֑!] Lڒ렛k"IbRj"&>a)PVQ37UvJn U@G8 Zwa+Xv8<Zi
+rBG]Ӄ)o(ndZ$
+bC4} @kEқBUp?nYyDs1=`ׁ A7hĶYU]xI*uVhwue,qnKWlnĆUU3Gy/#y@t(R1S GH3,D˅ARywȝt<b<O˳̦Vg 8ZNQ6KV^[A6\t5FZv(*Q.J~g!5"r뀳%;ǠJB Rr]aKb-;Ja<I]n 3ΰž]|k X58WUo{>vd5]ꀟa4:‚Kʍ>#mp"۾zGX<Tkf#EI,5F}eoSn )h+L%0'K+`n~pxݑ4N`6~cF`\fP#oPDQ34>] A"*,´XNRCߴYn_:^":W_RgmTK(km.x)>Gi(XXr3@,vH~`O% ش"U"լWc-tWjHj&pj(48-4@ SfҼ{XLB2OϭaL<5Oid2ʴO~C o1|b
+Hq&ϭ?¡(72;$7,ubݲxT91 0ug>hup(W/a:sٞG-沄*R2Aߘސ؜`>RSaJ;ejh,Q<K}hóhC15H<HD=$@jDi|AK@ǙWWz% )K1b
+X,_DL`h3Bl}iK|)5펑l5ջxz2)4Sv
+&/IihR$ pm~P%]HܓR@oSivBR ~++Z*5y;}^rr*h%?O,#a}l^QF
+$}Ml' Q"1mlz~O^W"PuA_mEzP|K%7H{5te8=w}]D!)"^ПZ!'v\kСK{u/ډ*^E&"Zcˬ`JC}vq)
+޺ *k]Zj>dŤ>1ZYJ+qxoS\;&\uh',|åS݁<7tVWU7g77}zLz-.%(g=lP
diff --git a/prebuilt/libstagefrighthw/lib/libOmxVideo.so b/prebuilt/libstagefrighthw/lib/libOmxVideo.so
new file mode 100755
index 0000000..0ac58e0
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libOmxVideo.so
@@ -0,0 +1,3191 @@
+ELF
+
+
+
+x
+
+
+
+
+
+
+
+
+
+
+
+
+|
+
+
+>
+y
+@@
+
+
+zP&[:\?BM=tki5niqso΢CoЫ]Վs<]ޤmmc>J==rlr21}q
+jQOWM `p *D,uKR `(/5'K3
+g7 %G:M= i퍑 _<v.v
+x+vF0K}? dL=4db[ky_Mc$t 1vCݏf &n1Ncu<37_- j.Ѓl^~ϴT9ȗ_znL:RRxN35zo$ O;4n\Ǘ<IQGfVogSSB hb 6wNι]arʏP.\Џ`nN]UpؓE/1a¥?YSHapM:o_Hz6>T.Ar_lyTpnw"'zV)t%8=34t;g $X ZWվN\MҨ,Re)H/hV+SF%-Xc tI`L7yKTk+ {g`rD.f]
+ΏJ *ԏ4tؓuO*
+;OQ%QK/Z4 ͚Dߗc,uYj 줚{y4
+& vp+xDGDUI QC(nb6D.0we
+di^sPk2<egM=Wi+$x&|:F'q=3F88]J
+
+,e%fEW vVb ChÝhpqo@|W1zԚ1ϝg E%z>T.KY'h|\R')h#zlu48Q-mWW5?81"إJqX4l6ohm8Q jE+5yť {t|bǦ>4HIiK/[< 7dh7J
+)ɇY8"Ie
+k
+
+k
+f
+|
+|yu qqg
+ {
+
+h
+
+`
+
+
+~
+l
+
+
+
+
+
+l
+x
+~
+
+
+n
+
+o
+
+
+}
+
+s
+v  z i  i  i   
+ l
+ e
+ z
+  y |  l
+ p  x
+ d
+ f o 
+
+
+h!F@0k
+I"yD1`
+03/K
+L|D FHOQxDH
+(
+IyD
+ I yD
+
+
+
+
+!
+
+P Xpquaajfta@*
+
+``te
+
+O pOp`hoI.0yD
+
+ F@
+@
+HF F@!
+
+(F@
+@
+hl%F(F@!
+F IcFyD h h
+IF
+J yD
+zD
+zD
+ A a = #amIJ (#(#yD#dzD3%hh*
+  a  a  a I J#yDazD d  a d
+\0;*F.ȿ&8F2FOs
+8FV hBh
+h *@𔀊hJh
+F5 )F
+Ib6LD3LABFAȿCL
+D
+u((FOryD !D(F(ѝ
+F5P
+,D
+D
+ D
+$597P;"
+p6H"j
+`
+,(xD,
+|D
+u
+v0FnO rXyD?h )L,|DhzD !FvB !Fp0FP( FAFb
+uX`d
+FF
+r
+t F`
+ 
+x
+p8
+p
+p
+@FX0"HCB, yDzD@FPF
+
+X 2F^?݁D^h )@vD `t p+yDzD@FQ
+-%A01
+u(FX0(HCB( yDzD1?Q
+,C
+C
+ C
+#59
+v0F$@yD.
+,zDA
+A
+ A
+!5
+y hh*q)`C(FO@a"
+vF0Fz
+,zDA
+A
+ A
+!5
+
+v0FX)FO@b?h )HDH$|DhzD !Fբ !F0F(F
+(@ $yDzDK8FF`
+(FO!U"@
+
+vF0FB
+,zDA
+A
+ A
+!5
+
+(I yD 
+
+
+
+(S (@JA*(0zDXa
+(
+
+\0;*E-ȿ%0F*FOs@
+I
+ yDH$
+
+E
+
+
+
+BXJ
+
+2N3J~DzDT1F 
+PIyD
+
+#Y@P@C5GI
+9I* yD
+t:F+OF+MD}D@X
+ f ft
+Op!p
+H%FxD
+0F
+
+w0" k
+(F(F勉 n!CnGF+1I1 yD
+H
+MO
+
+FFHxD
+xxCB2C
+DaE2bE$
+
+B
+0(FIF"F(FIF"F(((FIF
+/ 1 ,OG
+ x( x(ؿ
+@
+ /KO
+,
+<
+L
+X
+
+
+  E
+
+
+
+DP[xkp]%dx
+ѹc
+O
+
+O
+"<"pPYRPR@
+ XZRQQPQRQA
+ bpR|*gU]`b
+@"&O
+
+0F
+`O
+(V (h
+(
+(!
+PF?  #+FyDzD #+FyDzDv`h2JCٱpo8Opa Io8Ob " yDJ20zD
+(#0
+(0#
+(Z (ѭHxDHxDFHxDFHxDI3FJyD
+!jP I
+
+
+
+Icj
+yD `j(8
+ F
+
+
+
+
+H
+
+
+EO
+
+
+
+
+
+
+
+
+
+0yD(zD
+D
+|hJFAF0l@
+
+
+@
+@
+
+
+
+
+Bܔ
+"yD
+
+
+(
+\
+
+P
+\!@
+,
+
+
+
+0
+)
+
+0 1+
+
+2 3-
+
+4 5/
+
+6 7%
+
+8 9'
+
+: ;1
+
+< =3
+
+> ?9
+
+@ A5
+
+B C;
+
+D E7
+yDF |RG
+ "T HXi(@
+G
+
+g(EFoј
+F(F !(@\
+
+(F !
+ @poRF
+
+E LehyD.
+-HE
+cHI HJyDzD }
+
+
+
+
+
+@
+@
+
+(
+LD2FLC
+FBCȿ
+O
+
+xD 'F,,
+xD F
+xD F0BBll*yDa
+xD
+LD2FLC
+FBCȿ
+O
+*(!B %yDJzD L1o o Eb&q@P@C`F%yDbezDG
+
+xD
+ 0yD`*
+ @!
+IhyDR , h1 F,
+QP@O8`*d
+t
+ F
+
+ 1 1
+
+(F@
+@
+
+(O8%pA
+
+
+ FD\b
+8'zA 9F
+JzD# IF3F
+ F F F &f^
+F")b
+F:&)F"%zD
+r
+
+(F@
+@
+(F
+NF~D0F
+
+HI@J yDpzDNLP0I6yD
+\!(F H)F
+$
+( c!
+u 
+p@
+u
+p@O
+xD
+Fȿ#O
+Fȿ#O
+
+/
+)i)
+FȿO
+
+Fȿ#O
+
+\k#X+~D
+F
+
+q
+(
+
+O
+O
+8'zAO*
+9Fb
+dd)3F yD
+A
+
+( zD
+lC@
+F
+
+- EY`1 BO O i )ؔ
+FC
+p
+p@
+G
+\""1F
+;A
+pG+b
+;A
+pGo
+9;@
+
+H$xD
+H$xD
+
+F IcFyD h h
+"xD
+
+1)`{ 0pcC1
+ 0J
+1BA1i! u v
+Svv)h1)`u
+>p F+F
+ApG
+o)hD
+ qq!qq"3rqrrr1srsss!r\1)D
+"1tpttt0uru4(h2I0(`1yD
+f
+aO*@
+
+0@*(h0(`u
+yD h h "鐠
+@ @ 0 @@0#@3+ D
+$0
+@
+
+@ @ 0 @@0#@3+ DH
+$0
+@
+aF
+p F
+
+ApG
+o)hD
+  Bq"qqr#BrrrsCsss"\2*D
+
+#tAtttuCu)h1)`u
+f
+aO*@
+
+0@*(h0(`u
+yD h h
+D\a9))3cEӐ" I
+  @pG
+
+!d
+
+ I yD
+E
+
+#Fh
+? IF]hxx(
+"yD0Fr\ )F0F H豔t
+
+1
+:`o!
+
+9mHIHyD^)h F
+1)`>D
+  pbB1
+0
+ A
+!
+"=KD{DY
+st (h0(`u(F(F<p,I,JyDzD'I(JyDzD
+
+IxD
+JyD
+2 )F
+KFO0F
+.Bw
+,
+
+
+ 
+A
+
+E
+P*pZF
+oa  oA o!C
+
+
+)g H豕t
+IF
+,C
+ 2C
+B
+" :i D@rxiCD
+t'%I+F
+
+
+
+
+
+EP@O8`*d
+t
+
+``qhA`qh`p`0
+11
+
+(F@
+@
+
+t??I ?J0yDzD
+(O8%p@
+
+
+ ED\b
+8'zA 9F
+JzD# IF3F
+
+F")b
+r
+c P
+ ,
+
+HF@
+@
+HFHF
+u
+p@
+u
+p@
+o
+FȿO
+
+
+
+o
+FȿO
+
+
+
+
+W
+0rdF7DVP)
+0@J B+DRqb
+
++
+)i)
+FȿO
+
+o
+FȿO
+
+
+
+
+
+(zD@
+ f|
+j
+%`#F 
+ 0%yDzD v8D8
+q
+(
+
+O
+O
+8'zAO*
+9F8
+#3F yD
+A
+
+J zD
+lC@
+.H1.I/KxDyD{DZ
+p@
+G
+[""1F
+p
+`F`iq9
+qq/r@irr0 -&.FcA O ?-AO
+j|Cb0B"D6>`pCa".A!7!OvOwyD&'yD&`'yD Ov'yD&x'yD`"#0F
+iq9
+qq/r-A+F FB O
+kr+rF  -OAAa^#|
+ q
+
+   
+Aݪ
+
+
+F.
+xDyD
+h
+xDyD
+xD
+xD
+xD
+xD
+xD
+xD
+xDyD
+xD
+xD
+xD
+xD
+xD
+xD
+%-F  
+?GcC#3C*޿
+-F@ EFQ#D
+
+
+
+
+F.!
+ @o0
+(yD
+ 
+
+h('8D.
+)#4.zDQ$,(9Ss#
+ 
+
+ h*F)`fFYF:F|, 
+A!Aݪ
+
+
+F.#B)
+ @o1
+DR)`Ss#
+ 
+
+$)ȿ@9D (ȿ@8 @0` 7h5/O@
+@
+
+  "F(Ѐ(
+ @o0
+ 0xx
+-F<F- O A AaxA!cA")4
+x)-E
+(&
+
+-,*FF ?O A 
+ ²
+
+
++ 
+-LF
++ o"߿
+
+
+ Bj!.-ZF
+0xx(OCCbB"޿
+-F
+
+!2C@
+B
+ @"o_1%Ѫ.-
+ 
+@o_!)
+?
+
+  xDHyDIhRr "
+?
+
+  dyD
+?
+
+  4xD
+FFF-7 $Da+xA!-޿  _-y1C@*C ' `x xx6Fa-
+
+)+ A
+aA!(sq;
+C qF@yJq7rzDsrrha .(-߿- .FMF  
+ 0xx)OCCbB
+-侩F   `@xx!-Aa(A!F&FF-uF"FA,0IDBbB" x{.
+ 0FF
+%s
+(
+I JyDzD(\!(FH)F
+F h$MIMJyD#hzD
+h2
+`
+I  yD
+FFHxD0F
+HxD I  yD ".&
+
+IyD h h
+!
+
+
+-A F
+"xF F (FV
+"fFHxD
+` F
+ dll
+0
+
++0
+*
+
+zBO
+ (b!
+
+
+i k k
+.h
+2k
+JzDhR# Rh:FcFhrFF@`G
+L|D$hT" 
+G
+
+
+
+
+
+(  j)F(2'
+(BB I
+O
+0/ȿ0'O
+pi
+0A
+8_x
+*   Q1 A0 "
+
+p (x
+
+ѨhBI
+
+II
+
+
+
+hha
+hhaa
+ 
+
+
+H
+gI
+OzpAF2F
+QqB8FF.F
+ '(
+
+p@
+
+՟,
+՟(
+
+L$
+F* 
+
+
+pGff??̌?
+@
+
+i`hj`a(
+
+
+
+
+!aabbhao
+  )08A"eO2b(`fc0`'* T
+@ ɛQ0 (A O
+ YF
+@ zȋQ0 A PFF
+F
+ 
+L
+꘱eIe#hyD
+ `
+d   a
+
+tF
+H
+й A
+
+
+`9F(h(h! $
+i i@)" ²(F`!z F
+$
+`oo
+i C i@(@ " 
+$A
+aoo !e hAF h!9
+ i i@.@@
+i A d d
+$
+`oo
+i C i@(@ " 
+$
+`oo
+$
+`oo
+2Fi A d d
+$
+`oo
+ h!9
+PF5
+
+L |P
+0F)FDQF
+O
+@ h Q0 (
+DOp5B
+ +g*B
+B* 0g*a
+B* B
+ Pg*a
+B* @B
+
+a
+ Կ ` Q0 pG
+@ p i Q0 A0 9
+RE9BFF
+@F
+@ p i Q0 A0 9
+@ p i Q0 A0 9
+(3 pG
+
+(O
+(w sBЙ  1t qt  tt 1uqu u
+(1 b rr
+ r  @j
+r  @pf
+
+
+Ei
+J )FzD
+
+
+
+
+
+
+
+!2F#F
+F !F*F`) !FzD
+I  yDH!oxDpO6
+ F FIݢ yDNB@p&
+xEo
+yD h h 
+vdi_get_common_memory, pady:0x%08x
+
+monet.bin size :%d!!!
+
+VPU INIT Start!!!
+
+
+ eO
+ hA1.0 hOq
+
+
+
+`fO
+ h^?@m hn!oD hOq"on h
+
+
+
+
+
+
+sC
+,P
+qA
+q@A
+qTA
+h
+
+P
+
+O
+E@r As?
+? ?
+
+COq h"Oq hjOq h
+ FOaqbX rO`p"XLF hf$ h1^8 h 1FVL hj9FP67
+
+D
+D ED h`!Oq< hOq6 hp!"0 hOq
+
+
+
+
+IjyD
+ Fl
+
+
+
+
+
+!`
+IyD I yD .
+
+мI cayD F
+kH(l8hl(ll
+P@yHxD
+bhyDh h
+`)h0FF i(VD'h(h0FVD7 iB
+)h0F`hh
+B0F
+
+`ha`j0b J
+
+
+۞HxDi1aHO1xDA`!bI?yDH`@󾀚H!xDrT0OQ
+\zK
+TJO
+B
+"X
+
+
+yDB
+*h@,ATX3P!`2N2J~DzD1ml0l
+`
+ch
+}D,!hB
+cJ`zD4
+“
+lT0hBh#DB10#I
+HxDk IyDj"HxDi9a@h
+
+`
+a
+IyDHh
+ zAEa
+h1`
+@
+Q<`B
+IyD h hb
+
+h
+A
+T `B
+IyD h h 
+h
+C
+T `B
+&`He
+xDB
+*hA,ATX3P ` i!hJhzD
+p"퀈
+
+0HL
+xD
+B
+
+<l
+DB
+
+zDh2 `hR LB32-#I
+L
+R
+(`  &HxD
+Y
+
+
+
+D`h\
+hB31hb
+L
+
+HxD
+ a  
+sDa)1F+
+F )9D+!
+*
+*:
+ :   
+
+
+p
+s+a ( F!Opi B0aBF
+Fgo
+ ` Q0 (v
+!i! {I+*!z`  O0(`
+i0a
+
+hB 
+
+@
+
+i`hj`a(Fo)F
+%(p4(FP
+"G&OK
+
+   aaiab caha
+)Qr
+ fdA{Fv&dIv feI&eBF
+I J;FyDzD F~
+ff g `g!D
+
+ *
+ F)FP4
+
+t*
+DW
+
+`9F(hF(h! $
+xD
+
+@
+ ll
+
+
+@
+ ll
+ d h h! T
+1b J
+IyDzD
+
+
+
+B F? O
+
+ !"
+Q|$!!zDOR\ Do  dD
+
+
+
+2
+
+D  5T
+#\
+  0
+@"F
+c
+
+
+8F
+D0\6] P
+
+
+
+uFD8FM}D,]4D 0__
+D] dLU5F
+N
+D
+
+ p
+
+ b  DYIE
+ @F pW
+P
+  ` wr'
+ r' @3@! HB%xD]H
+xDD
+DjH56xxD% ]@+H xD] ;j
+
+O
+7@#
+
+*XxxG'
+[x
+
+U
+q$U@;(/
+"
+
+J
+T 
+U
+
+3+~?D 0rH 
+
+GL7H_
+BO A2J?
+A&OuV
+"H0Jp
+3q
+
+
+ @ T!
+ER
+
+@ZDЀ
+
+
+
+B D E
+
+ 
+O~PA*O}Q%IFA
+B
+A
+O
+ F$l
+F
+
+2*
+
+
+
+qgd
+O
+ 
+
+.ܰ
+
+l)F0FB a!
+!LQF0F
+ 
+
+
+
+
+
+
+
+
+
+e@RLXFDF9F ?
+**
+??-@
+*
+B*A
+
+0
+
+l
+
+
+QI
+
+
+
+7Q0 S1+@
+A1 p k
+(3 ;+
+
+@F)FDaFF%m -
+0PH,P 
+3SHmbDS\p2D)D9DEp 1D:DwFB
+
+mp0 amwFAIBOp8 IB
+ !
+"mm
+P[ !
+"\0p
+Bڒp
+B%
+ mEVQUQPqEi(O
+v
+ m) ` o`
+
+( ѧ /
+ z"489/8"F
+
+
+
+
+
+
+
+
+F
+ F
+
+PD)DDOq
+ Qq!  D?BZTOXrOXb
+
+E
+D
+ + 
+HxD
+,*B
+, *,G'7B
+, *,G&6B
+, *,G%5B
+, *,G$4B
+, *,G#3B
+, *,G"2B
+, *,G!1B
+h hꈳ#yDzD#h V Fv$yD#hzD#yDzD #yDzD#yDzD#h 2 F
+ڪIJyD
+b @F@F
+p
+<ua*uO!LO!P |^"C*AJ#"dhFt
+Q `@do&,o??&  #
+sX(:@FYF*F4dD@+ h
+#N'F
+
+D
+=к @d
+qlP
+F0F)F:F4=D^DDE )F
+pl
+
+J
+
+qOa
+DW
+
+`9F(h*(h! $
+xD
+!n
+E
+
+ F!*F
+&  hrP
+xR m)FFgafaP0 (Oa{8O
+!n
+E
+MF)F
+`y
+
+.?k0ct
+ F
+8
+ F!*FDWD@&t
+0y4 i&   h F
+x mAF$FgafaP0 (Oa{8O
+`y
+ 
+ hDQ
+F .
+ F
+ F`H\
+pH
+
+
+
+h
+&7
+2
+ (
+
+
+
+y
+ ` p 
+[
+
+) ѐo
+
+#\
+
+L5 
+
+A'!!
++
+FO +
+A'?!
+-
+
+fHH!xD`
+
+@' t
+l
+O 
+
+
+ID\ kIyDa
+N L
+
+O
+dʛ
+
+
+@D0F^ q$
+
+O9
+
+
+p
+
+
+
+
+B T
+hWYp
+
+ d
+
+ 
+*
+
+ !
+
+
+
+
+
+*1
+!l)۷
+:2*1C 
+
+
+ iEVQUQ@
+
+՟,
+՟(
+
+L$
+F* 
+
+
+pGff??̌?
+𻼰F
+@
+
+i`(
+
+
+**!a!bbha
+ c
+
+ dTUeaa
+! ` 
+\
+(F
+@*2l
+݀ h 0a
+d0IyD h h\
+
+
+
+PF PF!< (F! Oy/\Ow,
+ #
+
+
+
+p`
+t )`1F
+,QC
+
+
+  UE)7B(D"^ \ X VH.xD
+
+@ P! PA% gjF% HG% J@G"R$T!&VA(Xa*ZBtE AaEF .
+O"M"M'"M7BBBdBBDHFHHHJH]JHTTTTTTT
+FtD FBl
+
+
+O
+
+
+ܰ "
+ ܸ
+
+
+
+FD 
+
+O
+
+
+ܰ "
+ ܸ
+
+
+
+ @W|h Ok
+ $ O + 
+P\
+DW\
+D AR\z' '
+ h/
+@
+$
+FO
+ D 3D
+Ff7
+Gg&;
+Cc #C#&CC 4$4(4 4#S #S_FײV
+RTB+DBB'D7DB"B@$
+^E%
+VO
+FBWB"K6BT$O b BBhB
+WOF Wv
+P
+D2D 2CnChSCSC#
+'y
+Q
+!!!!+ ]]9DG2]!O !&)
+`
+xK ! FAA`
+
+Bb
+Cc
+Aa< ce(@_ R
+DFFE#c0@ B$1D 1O L
+HH DC
+aAAHG
+ <  DPDDWIP PGGG'@GTtO gGGG
+0
+KCgGBB"`$ 0DDBPCB"Bbd$r2DCRC
+ \ vO
+OyxDi
+nn
+ 
+
+
+I
+J yDzDN F@/dev/amvideo
+
+)h E1mF*Fa
+D
+!`IyD h h~
+)h E 1mF*Fa
+D
+!`IyD h h@
+F0h E12FF
+E
+?(` F I
+p
+
+
+
+
+
+
+
+"#d
+FI(yD h h  
+
+ I JyDzD
+
+ I JyDzD
+
+"#J
+
+ I JyDzD$
+FE1
+FE1@h
+FE1ڻ
+FVh F# F
+
+FEC1@h
+FEE1@h
+FEG1𬹀IjFyD h h
+FE1 @h
+FE1IkF@ yD h h
+
+
+ I JyDzD
+FE1r
+FE18 FACP
+
+ I JyDzD
+F`E1L?
+ܽ@I JyDzD
+
+1
+/ I
+
+
+
+
+(F9F2FF?
+HxDE
+B
+ HxD0hBXAh
+ F)F6F?
+
+ FF?p3@0BE0
+ FP
+
+@
+ FJFF
+AF
+`?%:I#F:J
+O5f%IF%JyD
+"HxD
+P
+d
+
+
+H(
+
+
+
+
+$
+kkkkkkkkkkkkamHC
+
+/
+'''''''''' ''HC
+
+
+
+
+
+
+
+
+
+
+
+
+(8
+9 O0,
+9 O0"
+9 Հ-:!!G!!W!'!g!7!w!͇!!͗!!ͧ!!ͷ!H@J`
+@*@'J@Gj@g@@7@W@w
+@*@'J@Gj@g@@7@W@w
+@*@'J@Gj@g@@7@W@w
+@*@'J@Gj@g@@7@W@w!!G!!W!'!g!7!w!͇!!͗!!ͧ!!ͷ!H@J`
+@*@'J@Gj@g@@7@W@w
+@*@'J@Gj@g@@7@W@w
+@*@'J@Gj@g@@7@W@w
+@*@'J@Gj@g@@7@W@wpG-OS
+@*@'J@Gj@g@@7@W@w
+@*@'J@Gj@g@@7@W@w
+C*C'JCGjCgCC7CWCw
+C*C'JCGjCgCC7CWCwpG- FFdFO
+ ! """ аNѾ!Ɍ Žbb'b7!b 1a "bWbgbw%Pf`QqPaIBbb͗bͧb̷)j晴﫱abbb-na
+ ! """ аNҾ!Ɍ Žbb'b7!b 2a "bWbgbw%Pf`RrPaIBbb͗bͧb̷)j朗﫲abbb-na
+ ! """ аNӾ!Ɍ Žbb'b7!b 3a "bWbgbw%Pf`SsPaIBbb͗bͧb̷)j望﫳abbb-na
+ ! """ аNԾ!Ɍ Žbb'b7!b 4a "bWbgbw%Pf`TtPaIBbb͗bͧb̷)j杖﫴abbb-na
+ ! """ аNվ!Ɍ Žbb'b7!b 5a "bWbgbw%Pf`UuPaIBbb͗bͧb̷)j歹﫵abbb-na
+ ! """ аN־!Ɍ Žbb'b7!b 6a "bWbgbw%Pf`VvPaIBbb͗bͧb̷)j殺﫶abbb-na
+ ! """ аN׾!Ɍ Žbb'b7!b 7a "bWbgbw%Pf`WwPaIBbb͗bͧb̷)j流﫷abbb-na
+`RCJXII
+`1RJ8 zDv5A pKL|D`h
+xl<u0<
+ 1Fd  E0FOd
+
+HxD
+HxD`hHP
+`\
+ FF(h*h#FI
+
+FEa
+
+(C
+C
+C
+#<0 h
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+G
+
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+?o/o C02
+@-@
+
+
+/oo
+@-@
+JZt
+
+
+@D u
+
+
+   ! 0bà01@Op@-̌!J#Z
+T \
+
+0/
+``!
+
+6R#2"<$!R \
+R&^b1>!,°
+
+
+Ѝ
+
+
+
+Ѝ
+
+j
+T  
+
+`V
+V  
+
+0 
+,
+
+Z0[l
+4 ܧl
+(, t&x
+
+)H14$56(8h<(
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ do codec reset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+;`@0ɛ @) @9! @ 1 @
+w
+
+Ș w @
+
+@
+@
+@
+ 8v
+
+
+*:J_|@Lv
+
+@
+@@ (
+
+
+հx s@?@s
+ @
+ȉ`@x
+
+
+l@
+
+Zcl@6
+
+y
+ȃ`@ x x
+Ɔ䃸l@8@x
+l@
+Ȃ`@ x x
+ްx
+8F,h@9
+@,i@k
+h@F
+@Ԃ
+
+
+Ȅ`@
+`@
+‚䄸p@
+4p@
+䄸p@t@@8A@8
+ @ @ @!@  @1@
+$ @@) @@9 @"@  @2@@F)
+'߀@@
+Zw
+s
+s w
+s w
+s w
+Ș䑸
+Ș䒸 
+@Q
+Au 
+Ȑu 
+@܁u
+
+ɉ@Չ
+ t
+@؁ Չ"ȋu 
+
+
+
+YI9 ) __)
+p`P@0 
+u
+YI9 ) ___)
+p`P@0 
+u
+Y I9 ) ___)
+p`P@0 
+u
+Y I9 ) ___)
+p`P@0 
+u
+Y I9 ) ___)
+p`P@0 
+u
+Y I9 ) __ޘu
+Ȑu w
+Hu 
+ɐu AuA
+Ȑu
+
+@#@
+@}(
+ɐ &@8
+ɐ@9&@8
+ɐ@)_8 
+䛸
+ɐ@
+@ 
+ɒ@ '@"
+ɐ@  
+ɐ@   &@8
+ɐ@  9
+@ex@KF @KF8@憸@T
+@e@]ߌ@
+@e
+Ș w
+w @pB@(
+w
+@
+w
+w@`)
+w P w
+@e$
+@e@zi9@zi9@ziT9@6F41
+@e(%b@v#
+@e
+@e!1@ve@A(
+@e!@
+@e!@3@v@=@!1@!
+@eL
+@e!
+ _Ih>MlI)v@(
+@e2@KQ()C恸@pa@0@KQ()C恸@a4A0@KQ()C恸@d@0@KQ()C恸@Xd@0
+@e0D
+@e
+@e
+@e!
+@e1@Kq0@K0@
+@e1
+@e_@v
+@e1@KQ @
+@e
+@e)C@d 3@KQ()C恸@d4A
+@e@KA(x@KQ)
+@
+@eɒ
+
+@8@48H@ @(
+(@t8H@ (
+(@8H@T> @
+)t9H (
+(@D8Ic (@ގ@0߀@!ߎ@+ߘuB48@
+@@Q(
+ȋ@( @Nʊ(
+(
+@e8?߅ߘ
+ȃ@T2@ 1@# +@߄=M3 @h>M @
+@
+PɄɦȄITX(V,@"8
+䂸@9"
+Ȇ@( @
+8 @BAĄ䂸@9@"
+2@
+(Ȓɉ
+$$2_((
+@(Ȓɉ
+H
+,-伸
+,-
+, # @&@((䔸ێ䀸( ᇸ(Ȧ/89,ᇸ(,ᇸ (Ȧ)8Ȇ@4
+䀉ȁ(y9ը(9ȑ)8c
+ɑ)@(8@)8ȡ)8c _ض
+@ 
+@ 
+@ c
+A J
+
+䚸 (
+@
+
+
+@e0(!?>@ 
+@e0 AAP*Ș
+@e0
+@e OA@*Ș
+@e ރ1
+@e 
+@e @ _
+@e1@KQ&
+@eX(XY@cߐ䚸(F
+@e@
+@e$ @_@>@ @_ߨ@
+@
+@e wމ3@$(
+@e
+1@8 2@>@@KX$@@H@TD@
+(Ȑq@n(䪈Ȑq@g(2@1({@m8(8(8@z(
+$$@
+(
+(
+@*(@P@:(@K
+(
+D
+D
+ @l)
+Ȅ@
+#@
+@e*ʷ=@#@
+Ճ@E߃@_ @@Q߃@߃@_ @ 9 1
+
+"I!Փ䐸
+(8@8_ @@=c0(
+@8@8_ @ _8i
+@e8
+@e3
+@e#
+@e#
+"I!Փ䑸
+(8@8_@@=cA(
+@e8
+@e2
+@e"
+@e"@(
+ (@=cB1
+@0؂(;M-
+
+ 
+
+ @Y
+@T3
+@T)@2a(@$
+@T)0 8I +M @
+Ȁ䀸@4@
+@e# 1 @
+@[!
+ @
+ (
+@e>
+@e>
+@[! H8+M8@KX" @$(@g,
+ @
+@e&@KV @@g !
+
+@) @x91؂ @8_@(9+M( @(
+ȍ2M2M
+
+
+
+
+@
+@
+@
+@
+@
+@e@6
+@e
+@e2@6
+@e3@@3@@zi(
+@
+@8;M"@
+@e"@
+@e2 @
+@e @H
+ɉ @P8
+@e2 @&
+@e@6, @
+@
+@
+@8 @P( @Q8@
+Ճ@ :P-"@[(@@q
+rȈ
+@k"
+@e#
+@e(@ᆘ,ᇸ
+@e ? @, @
+@e)
+@e8
+@e
+@e
+@e
+@e?M@ ?M>M3@# >M3[@KS )C@pa
+@e@@
+@e
+@e<M3$@[%@(ՊȃlB)i@(h@
+@e
+@e _1@8h>@`@3H@{&zO(@F(
+@F$<
+Ȍ2M@>
+Ȍ2M@( 6}&(@v(@)@)ٸ
+Ȍ2M
+@e<?@
+@e<
+@e<_@M
+@e,
+Հ@@@2A!(Ւ@$@$4A(
+Հ@@$@$@F
+-&@$=6@4
+(Î@" `(8
+@V
+$(&@,
+@86@0(Ï@" `(8
+@Ȇ@Ȅɿ@
+@e, 
+@e,@4h
+@8@@ 0 0
+@e4?@q
+@e4
+@e4 @O
+@e8@@T 
+@e8@@u
+ 
+i@LϏ`@ @+Y@@"
+@e
+@e@2@3@1@1 y$@8d@d
+
+@e1
+@e1=M1׃@@Y߹
+@e!@@
+@e!@@P߁@
+@e!
+@e1vށ@@|
+@e!
+@e!
+@e1ȩ@
+@e1 
+
+
+@e@
+@e2@EW
+@e
+@e
+@e
+@e
+@eո߆h@
+@e @Ղ@߱
+@e@Ղ@ȥ
+@e
+@e
+@e@
+@e
+@e@Ղ
+@e@
+@e
+@e@rՂ
+@e"
+@e2
+@e@
+@e=LչNߘXչ
+@e@AՂ
+@e"
+@e2
+@e@
+@eU
+@e@"Ղ@3
+@e
+@e
+@e@
+@e6ރ@
+@T!
+
+
+@e4 @AߘՖ_@
+@e4 @!2H"ppHBPOp"ޘ _h)
+
+
+@e6 @#ߘՔ_@
+@e6 @ 0HBQOp"aH"ABޘ 
+@e
+
+@e: \Հ  ضi
+
+@e0
+@e0@ _1@(
+@̸>M@
+ۚ@
+&A
+ۚ@@ۖIȊ@1
+, ;
+&@ɇH،?@z8@
+89
+&'
+&ÆH )
+i@Q@\Q@W01(ظa
+ȃ;M! @@6@38
+
+
+Ȃ;M6䂸@H+@2*:ހ
+Ȃ 䒸@Y(@I8
+@e&
+ɔ 
+@e 
+@e (
+@e 
+@e @(
+@e @
+@e @y(@ (
+@e @
+@e @9(H@i(
+@e0
+@e0
+@e0
+@e0
+
+w
+w
+Ʌ
+
+@
+ɐ  
+ۘ 
+߀@ @@8
+@@!@@
+@
+@
+@
+@@#A (>@
+@:@#@#:@@3 C
+@:@#:@F @+@f
+
+@
+_@
+ߑb@ހ@խރ @(tD)Ԁ@
+J
+@@<@:@@ @@,@*@<@:@@@
+@Ԅ @ᐸ@ؽAᐸ@ؽ@: @* @:@
+@@@*?A
+
+
+@
+@@
+@
+@`
+@@@,@*@<@:@ @
+
+@@@,@*@
+@ @
+ @
+@@Dˎȃ&$VT@@@ؽ@@@ؽ@ؽފ@@@@@@ؽ@@@}ؽ@@@sؽ@@@iؽ@@@_ؽ@@@Uؽ@@@]ؽ@@@Sؽ
+
+ !@3@*
+@:@
+ފ @ @@ؽAA@
+ؽ@<@: @, @* @< @:@ @
+@@@,@*A[@:@ @
+@ 
+@
+
+@
+@
+@,
+@*
+@<
+@: @ @
+ yފ@@3ؽ@@*ؽ
+ 2ފ@@ؽ@@ؽ
+ ފ@@@ @
+(
+(
+(
+(} @ @@(
+@@(
+@@(
+@$@(
+@4@(} @@(
+
+(
+(
+(
+(
+^y@4@
+Q@@(
+2iȄA
+
+@
+(
+@
+(
+@
+(
+Ra@$@
+2a@4@
+a@
+@Z( @@4@2m@@m@
+@z(@@$@
+A$@
+4ʈAڊA$A4
+Ó䚸@Ȇ
+@@g
+@4@k @ @$ @4@@4@@@$A?3
+)
+@
+@
+@$
+@4 @ @ @$ @4 @ @ @$ @4@4ޔA 
+@
+@
+@$
+@4 @ @ @$ @4 @ @ @$-
+@ @@ @*@$ @:@4'A$A$
+)
+@
+@
+@$
+@4 @ @ @$ @4 @ @ @$ @4h)I P
+Ȃx@1.}؉"u
+ȁ
+@(@@HA@
+@!ASCDq_@@1q@1
+@(
+@
+@((
+
+@!SC
+@!_@@SCbA3Q@(8 @ @׃
+_@
+_@ ߂( ߁ ((("(
+M$
+@@
+@@
+@!@
+@1@
+@A@
+@Q@
+@a@
+@q@ @@ @@ @!@ @1@ @!@ @1@z}0g@A
+ȃx@(
+ȃx 9@
+߄&ߢ7@
+ɔ 
+_@
+@A@A
+ ¢Lۃ䂺9@^߄
+Ȍa_|@
+
+
+ɞ @
+1@
+
+ɆȎ @
+?@
+
+ @"@2@H7@ߘRB _@1h@,ߘ ԃ_ @_ @
+2 _hI
+OY ;@߃
+
+P
+䃸䘺Qš䘺Gߘ
+@߁@P߁@߁0@E
+@
+
+$@@(
+ȁ@(
+ȁ@(@
+ @2 @24
+ @@ZȈ@@2
+ @A
+@
+@#
+@
+@3
+ @
+@wW@"@3@@_
+@" @
+@2@
+@)@9@#
+@
+ @@ @@ @
+@$
+`
+@A8((Xt
+@9
+@9
+@!9
+@19
+@A9
+@Q9
+@a9
+@q9 @9 @9 @!9 @19_ @ @A8((&t
+@18 @Q8((t
+@Q8h
+@a8d @a8
+@q8] @q8ߨa
+@8 @8N
+@8 @8G
+@!8 @!8@ _Hh9@ltD@߂
+9G
+Ȉ'B@3BT@$2@
+@$R @S
+
+ɒd@ @@# @@#1tD@
+ȁ
+ȁ$@  
+
+ 
+ᗸ @@и*_@ }mm}9F=@*
+@g9F
+&@ )+ @
+
+
+
+)œ
+@4_@@
+@"
+
+@2 _@Ը@
+@ * @=
+@ $$  Ɂ ؄Ê
+ @
+ȏ 
+@ * (@$
+@(90@4 @
+@(
+@8@ |_tD 9@ܸ
+ɜ@@䀸*( 
+ɜ@䀸* ($#$ؒ
+ɜ@ @
+ɜ@ @
+ȃ &&B @ &
+ȃ @ @+@,@ _Hi8@4
+@"@ Ɇ _@
+@"BA
+
+@8_@(9@$
+@(
+ l
+Ɔ䊸@&*@93Դ@}߁ȉ
+
+@Æ䊸@]
+ @
+䍸`@
+CLg@h@
+1ƃ
+ ȉ  
+Ȋ
+
+Lᗸ
+ȊɎ 4_@Ɏ @M (@
+Ș䝸`@ȍ(  
+ȍ @@ i ޒd_䔙
+’䞸@@=`@  @  Ñ`@
+nF@D`@ 
+Ȏ@ 
+ڸ  
+ϟ䞸@@@@@@
+ɞ}A  ۆ˶@
+ɞ{A  R
+ɞA  a
+’䖸
+ɘ`@
+
+Ȁڿ0
+ɞ}A  @ۆ@@ @@0(B@H@&H
+
+䋸@FԀ䋸@ 9@8
+ɛ @8h@Ȇh2ء8_ @ _ @
+*_/0
+ȁ@ +,۸
+!@$ M 
+
+ق(
+Ã䏸Ճ@7Ț#80
+4
+ɉ䏸 Չ@ᗸȪ)80
+@
+ɉ䍸Չ@
+@
+H
+@@ @v@
+@@ @@ @@ @@ @t@ @H@ @@ @䐿ۀ䐿ڀ ـ䐿؉ @ @ )
+Հ@@  @|fߘgCB@ @|S @Nߘn@ _)թ/#!
+"@
+
+ @
+ @h-@
+ Սߘߘߘ
+ߘ
+䃸߃%
+ɛ  *
+ɛ  *@@c
+Ȋߘ8(
+
+yߘSOL n3OL h@OL _(
+sOL SSOL O
+o
+߃(ߘl nߘjߘZaߘ]ߘMsOL 4P
+K丿:&,ڸ
+䜸 
+N_@ށ䊸  (@($@2" @ @@@@ȋ@@  @@
+ɚ  <1ۃ@@
+ɚ  
+
+
+D@&@6!"# &2@6-ߘMH
+@*&&@ȆC
+ B
+
+
+ @Ȃ@
+@2@&A,_ _@ )@-܁@/Ճ@1~ߘߘ @!(
+
+
+
+ 䁺
+_ _A.$A¢B
+ @ᅖ@ᆓ٘B@阽݉@^ _ @@TBOB
+e@~^ɉ _9
+ U
+O*A@OXb@
+b@=,'b;
+/ @s
+ @
+
+ @ᅖ@ᆔ
+@߈3
+@߈ւ@E߃ @
+@߈@
+@ތ@<(9_
+Ą
+J︞@
+ @-߃ @GjTOFW
+@vzOv @߃
+@L0sO3s@߃
+@ߓ@
+@߃@ߓ
+@(9
+@w߃
+@s߃
+@m(9䃞
+@ߍ
+@
+@߃@ߋ @ߌ 
+@:߃
+@4ߕ
+@RߨEpob
+@Dw?` Opl 
+@6߃@E
+@ ߏ@.
+x@o@
+@@߯Ekol @߃@UUSUOUU@߃@߃@n䃘@
+ʚɔ
+ HԂ
+Q@@ՋQ@@
+ Q@@ՋQ@@"Փ}ɋ} " 䋽Ȃރ@ @ J
+ Q@@ՋQ@@#Փ}ɋ} #Ճ䋽Ȃ @ԋQ@@ԋ@J
+ Q@@ՋQ@@$Փ}ɋ} * 䋽Ȃރ@ԋQ@@ԋ@ԓ}ɋ}  J
+Q@@ՋQ@@* ;ԃ䋽
+
+@
+
+(@.
+Ċ@
+
+@F
+@8
+@
+
+
+0(@@
+
+
+/_@+@xR
+\p'<ޏ @
+@՛@RՌ
+ȉՃ4@ᄘ=H@
+ 8ك @lhcll.
+ 
+
+d*@  &Մ䀺`
+
+d׆_@@
+
+ 
+@ @ՁH
+@@
+
+䂸@ԑ䖸
+Ȁ-
+䖸
+Ȁ0 @ ޚ 
+@8 8/
+
+H@
+@߱ո䳺䱿ݑ$
+Dݐ
+@rDT$ރ@\բ
+
+ג䑸d@h@
+@
+@
+@3
+>@;
+@3
+>@;
+@
+ȉ @-@0 )@1-@8Ւ
+ɘ 
+ɘ 
+
+
+@@)
+(
+@h@䉽
+
+Ċ@
+
+@C ?@
+%@
+ߊ&@
+t@8
+@
+
+
+
+
+%@&@
+ȉՃT@ᄘ%@t@^@Նh䌿Ֆ%@ߊ@T@
+h߆@q
+䖸
+ۜLe@E&@
+@8
+@
+ȸ䳸@七hn 
+@߈=
+n nn@_@
+
+@tߊMQ@O@@C@B@@@n
+
+݀@'@@߆@
+ @
+ +
+ @ $Ֆ ( 8'
+@
+'@'
+@ߊ@'@߇ ۃ'@G߇
+@sߊ ۃ'@j߇@@
+](@
+ @'@8
+
+@ߊ 
+
+@ߊ
+(@
+@ߊ@,@!@ Ֆ ( 8L)@h18a:' @q߈ȑA
+A'@߈N
+@8`ރ'@߈>@L$ a
+ȉH@ H
+@߈ȑ
+
+@Xߊ@^
+@ߊ8
+@6!ԍ@ԍ_
+@ߊ@8
+@)
+98@)2
+
+@@( @1
+ȉ
+ȆXF_ @ ɊȖF
+Rߊa _H  e
+
+
+
+ȅo
+˿@ĸ
+ T O#o=
+
+9@o 
+Ș䒸@ 
+øB
+B@D
+ʤ@
+qߘ
+83
+_4@ @D@
+_4@hɃ <@+ߨ@$(@A ( R²<@RҺ<@ 
+A@ 
+ ]&0@!ܐ@
+@ 
+@
+
+
+
+
+
+8
+
+LDN&Nb
+< & N(LD.k.C
+<r3
+< $
+Lj΄̆fb.sf.*E>
+0.(
+<D
+LDN $ LF(H(Lb
+Ϟˢ.!M!MϞ.
+G
+L(
+<(*M(
+&(:'(J?*
+<L
+<? <LL*L*NGF*(R`~̀ <(*(<<
+C(D*C><9
+<A<M
+
+((71X445<.)$*L
+2(X2<3(3<4&5N)*ς/ .LE$FLG$HL4&5N$%.($$%L @$
+D0(A<
+8
+
+LDN&Nb
+< & N(LD.k.C
+<r3
+< $
+Lj΄̆fb.sf.*E>
+Li&jNE
+<x
+<I
+*>
+C˄4<6>Ik>I~2Y0 N>"0(w9~*y%(D*N
+Lj΄̆fb
+>#<
+.q(*tx
+f
+U(K
+
+407<+>z>>=(X(b(>
+l(u
+.=(**(
+
+7+(4Y*;Z({.g*f(e
+a>.(*3M*({<p(<(<(q U(K
+.
+q
+-m<m&N X#* f<
+$L
+=.
+k*x(Uy(Uz(
+U{(U
+T,@A+T(* 
+,
+ 
+   !( ")0#*18$+29%,3:&-4;'.5</6=7>?$#)/#,6A)6FX$/AXs!!)!)6!)6G!)6G[b
+
+
+
+
+
+
+
+
+DISPLAY QUE OVER-FLOW
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@
+
+ 
+
+
+
+
+
+ 
+ 
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
+$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
+t
+1mx1` Ձ$S'~trE@jИMMJ8ˠ}pѝlZB3*hXAa `r)vE\l7N.,Od҆>"?čOft^Q%- S[],(%&`(
+-Agt|8SP7#Jr+,3z=%vˍ$i3'XQ<L;JN hX} P[?~q#dp¹JƮ?~#UhdV3N ꮯ1r#ri+6>,r#R!mN:[/;EO\Z5ThpMLVl8)x^{=%V^bi}{OGp^{Ho@lN5Gq"@RbjreUic.ͧ:2Jvz)|F;O@*-k#Bv}у])wB
+.˕鏳xN V" eU
+y҄N *ҘCs=(l/DG I"ċ*mXRy@(Omb
+>;SYʟp29DF:Bk*D*C ̰/,aR?ߟFX`rt2{AM3{}lΞҚUZϷj
+H%͸~"U,!x ?O10a8UT^BAOqE, ~CFb9\^|ZWVx?t--R[{y2_?b"^AL}n<ۧ׮f?vΑdx>ulW(ob=G;pSbTFh;ܷxB[^d( 姀ݓ9v[J\"ɳU2dJ !{8K̤d0+$~ּ';~;˻#Q
+n , /PF%홄&dʹ.EV@_Fj jWtv [[lJ4sW2DvS[ޒ-X}ߞpfǸeb>
+j30:r/H}Ldc&lD&1eIӵUli%26k-UXOؾ+&s*{GgOv >"bQ",/tu~fNߗTXJjx U3
+"<j\Frzl\\{S=!Kjȥ7X<Ծ>znj%&RvפR\k:Kw iPIzHf Optv+OZO m( 2k WQǢ!E$"e2'Eoۋ"xxjjq1'%GcTS"X9ξTXh ('qh;SBf5+b+, w(>!*I':r>$aCK>cгI8rh0[8}w*7b \^[cSv`r qC凌Wf 9@U41u\5@Q;!=O2fB6.-svYB4Ɯ(^$f`s0@w0 bP-&ުt[Mp&Y >Z;2qg8$&fg
+.!ul"ZZ)vt# X>W-_Avש;=bf%/G+:iU戶M@.kO0DBFSF; e<\VgJ
+6gF 'i<`ڧ
+K тymy-Gj8={%]5:Yk1Cr*/_TX)څ!/<޳S~ɷQ5}y8fd lU
+zRC;+NG&b}f@/:Qhr̷7N9oZs7ɳ9(%q_Qe:ƤV@J+|o!]@t YSE^3YkL 'ɷj`w&\)Q,a,KKބCNeT~jٳ ч#cA;ף 3|;4Tt+Sfoj8= S.ӂijG4-g6yMszxbP
+15]@±Ӳv8HI̗p5 nƨ)c[wc f`S"w0xvco0sڽP08mW |J0̉a)a(kuU0c~nj܉W2
+݇AU8]L)dK8cQS Kgt=A]ivor_}d5ǮTI}>[yrϺYB|k42W%ܶCF\ldDU(=@G
+aq/2웑js%n ԧ'UB;<MԜ.(jOK!u
+mv-aQ4ӹ8P<]¬'eOVg洕sDMY-|ڼ=M4]/vʃoP$Bݲ5` "߇؛٨cQ)(ɟ=OTai7Z7:._LdEj`1-8r-Dtpv{tZÇ'$ 0 _Oۧl&nƺh+R4
+8
+R
+ =|Y{ѻ8~ҚYc*7pT5HLf:/Wӑє 9e%2T<Ϟt߮RC,ÌXܓN.Ń%(ppSYG&ZkJFQ/ۅ(O\MXoɩ!Waka6א
+cgGU3W;BDY63OAlj5XӗH_դ5GhʽY6@ej,ri
+z'!!Y'!d;fJ2Gpl,Ÿ~*a1^DLA29J@Pto`qnQk/0) T8Y䒈"K i{$6]w$y>cSWݫbǴݹf<]SԲl軨cn{~ko}<7PXn;ylk q#n41) r=˻qѾ>S.c$FJea{;%L\?_!3&͇iE}sb>ꪋ0Lt5O7Vuckuc,!5Ja `ƺfu`S
+딧3"6 <牔/@DB<Kp
+d|^4I-<j͎L#qaH} o7,x9N"| 3W#%r%E4\\:
+U2۪
+yW&~< 1(>\" 7?+f@wnipg($[CTo^"Kh=ڡޡg*yp\
+
+Ai!g߆)G&Z2ÆMwQkyEږ CTV޳j?/iP,=ݫ\VaU.oK֊oRjA0EG#a_d/sGN#:y_n@k&~<S'߹ ҍg\Kh]=2,}E(z/O# %+5Y0eOeWN/7dQThWfs& ܭx3(Aw`5ETl68⪹9Ye!e,_8sU~>\@BߊrqNY
+\yy^eU_ TFdyɹK,-2 0e'<`™7j!"a~Yt͘,HQ<|ѡ
+WHnGQ~CoafnHMS='T޸u.G+抶wgF Kv t
+CO\ tG#d8?6b*n[LJv{ݨ$+l,)Tj:oZ$W=-BdU(\++B*ܤ3' B (n;r徦'[\Ϝ 2%\oAm)B.0J"!^ŠjDQ"
+(؟𞉂{<PCZžCN>3|N;Zj}MؿS=sn'0S?v-9QL[mpI!NĶՠrKk{9ۗDŽövZAhZ >(}_8M|cӎZ!dlOe> ;"Gm*&)zHaeVk_^CT']\ֳ7ܨvہTBTi[ߌ҅K߀61MV*lY36kUizS)88T;Z~cט~tGDŽr-]
+1kcJ:#0/
+
+2 w#Ͻ5LNu, z@6X-qǏЁ~esO ݚ"\[ڍ\#*ec_L M|PI8]"'BܮNИg*"B#Qќ[:VN ^!fKcz $)HH=uҹD
+Y2,w]( E .*6 .ɕ(s+:^fP# ē
+VL20oBd3' :iJ`uł '[@lkmHwNX3
+9 'X
+yJհ
+] (_}H \MhW 䮳\s6N.z]`$pDQx "h2Ps
+І(_
+0=sGc3D~%ZgFk },En6WI|b3 YJX܏^ }jM䍐GOO82q[\rdn[QF&GDLuWIlJe?(Q(k `WL/se:
+9tT{5t5\#qcL?d7}Y(7O"*ǰ'>Ċ1uKpd'{,a-_S G`13x&pU+[L}ѡкb6g_q)16KC ěF<DH<X4~s
+/!HME G|0DQd~<[bV1}NF<-l|
+)AD8%*|JrBTA:o~:En5!G
+-\!t`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+A 
+ "&D7zXZ
+'/kuykfJg$}0t`9v*=<~jw뗲"R|ݓ4h1X?2p6[)&UaX淲@gޓ(/`9'WVy7rBC
+7_N|]ߏ1ILϊl)CC~l֍7._̻ 6!E~-㞇Qe$59߹6j*Trs>k_7߉+iy""[?ߨ{&ޣR"gl_t D|8:Ym)Ɩfi\5bC[oו$+ӕYG#}^ZPIH ݉B2ބosM \u ) ϓ%n> L2o %$x.(-F,
+-R$$<%2:vk;7PZ#Ֆ1~-5+BQJ ~ӑ9)5rҬ)
+PhoUc3J݈=ZK L!xX4nnHkc)"}MQœ/h
+m(N(pѯЎiBJ2!c*pV&6ޕYaKBq{5"n "hKYTWÛYOD,D] 0gmPwtSFb7j6Yu?x35x^S/˭dH+EI
+c cɉl8SL=<gACcixn p,FOH0 ~ZCsx㊦G;:8bM ʞȟuȩ(3u)WNJ|NZn_6%?xD3i-ax결Gָ{$tp
+ٕѰ,rIb &_Z\j1d>6h1p UFoG<9ډ㝺.̸uQm8WN;vnj+͗Ab5:F߆D @٢vm0S 1)*G@sEN0:Ϟ\oRg!k[-[s\ .Y]侩%&]
+Mez%WOT0
+2WSt-ؑ]
+q"tN ̇פlNoT> \6 ka97$XhP9դ˰]:G8
+3QܗڽL xAi5qT[2.aGD
+ڪ <݊4p<[|$[,Sq4 \
+`oAWR3FXi.\IGC8SI'[ӷ,Z۰P=L=czGhosgdÇ*B_2}Z|׾Bhr-oV6U'o!bqQ}6whA '0blMD8
+aEARb=$o(3 0m|lZʆ`ME~Npk@ug'dlG8Z3P"Ag*8jq*d⦫8m ECn㍂7?HDON?cl?Wn#Yi >BYfbΩ{?mt
+LZ=@;HK+׊ j)Ho2
+\| e)(o (Yxgh9!k$p{
+hdX+lxt H`[g9lE~([zĬlvEaQ=Oơ\5#6LITLn<J
+DO>V'0sbJz4joU wbT;ڳR v3u|wCJhV
+!o(s0PSCȫ ۻ1Y1MViڇJr9 YGm|=vRUw6yL=PN;
+e1BV_"O-d6[?ܞo&y,Kpn;-zޅqJ5?bu(vBU,|_(ns bϘګg6d1r$?֭kŅYRaZ},7Rl+ ԄL`]qv1#
+ #"?&
+5gǍ|~~a)GfD$^L{ߜ%(C
+ٔ?
+LG{:\*W>P[v7p#t ֹF2Aׁgc!yٗ-e"&Px
+=#e";yBYvנ*1 "uxPJtHZx:3ZQoǣv{pn]_w`~c^S6 .T/,| >c c;h5*fc؞ypo ~Č y Y#<!R!?FܙyΆ pEG>BH_7h$(!͖8I 庿P4"`b+}jO<ϼbr
+St5zZdQ1(NNe;81ը
+{lw
+
diff --git a/prebuilt/libstagefrighthw/lib/libdatachunkqueue_alt.so b/prebuilt/libstagefrighthw/lib/libdatachunkqueue_alt.so
new file mode 100755
index 0000000..bf25129
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libdatachunkqueue_alt.so
@@ -0,0 +1,68 @@
+ELF
+
+
+03/K
+H%FxD
+ah(FB
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+ "&D7zXZ
+ڈvF
+-JKJ-A;hRR>y֨'xwKdθC΃}g75F'(G٨)Y\{9rX{Hu'?}?ȋVT'fVd}1Cs Q~9516r焽uM]xmDn5S!]#*lHY8
+Mj1qm/`ed,~O?I԰;ѵfqVph1ߺ \օ V5N(]/qrv]{u.;)pC@ 9׭CZdk,qg$dV.~{zYFpߪ(rHJ CZ9啕 rY(\-Kb0Oݎ}}1욠v{5`5+y50
+ݬ(gb/V2ZNUeYou % /MNaW9BYn֫yʕL(E4pfbKZ])X)PBBOT6{sFh SQcE
+KñC$k7.ηW;{4"*q?wa!_$6MzI:<i8!{ 9~4%0"B<*ؿEǔeDWL}{j]RZeAH@X+(!0j*QJZQ
+.h9Lz"@C/d_wh9/8P☝Kg(Mߺjˋe
+b F 8w60PDzl!gleOqR3!^ehK*{ X^j瀏cTxق%~ZZ5v)T*LeLqLߗb9`Sìh=:ɀJ-Kj&=w$Jv|Wc@.`YZ;iKջdPch>7_酨}v^]RbMdfp@|”mLw9\ʷdՖL#뵧`<e.!n,Zb\z~a<A̢e^:u5y>ޗ+Bri%_Xׄ\4i_F ]xAVf
+d%=$q^^dϝ;uN0PkZyY&vtfۓR!~3nZ<}<,L5dBQ\ jO\?J y!}6 u~urM4SRJ{USYfrA ;homזGHܿ(NWO
+noBG-ehQ"βv8Fg͉*{4ѭi}_[F<\?V[y؟\{SRrR~m9`mZo@
+@
+
+
diff --git a/prebuilt/libstagefrighthw/lib/libfpscalculator_alt.so b/prebuilt/libstagefrighthw/lib/libfpscalculator_alt.so
new file mode 100755
index 0000000..98930cc
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libfpscalculator_alt.so
@@ -0,0 +1,69 @@
+ELF
+
+03/K
+
+
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+
+pJ
+pJ
+ FoG 
+
+ bh^h
+JZt
+
+
+@D u
+
+
+   ! 0bà01@OxGF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+ "&D7zXZ
+WY_qGQQ=
+{f^,g~i6ewji!ѸH2}G!~j38rx߲^BękXHC1;DZ<Aq:XHP&%spW/wolHkZϘ5AKBk3CDTvkKÒ2v Ab9$J3  3!Ȍ|YGcT'C$#*}l
+eiyde<<*ޭ`WY8_ N-M&H.mlgį؀DsPV h&=NWx,;wSe;}#3ܟU~.Z@;$&ǒ%F{9hAϹEx =,'S/q
+>Wcc*0kj<QVAϢPU8 )
+,,s %w/;h7(`8h;|+=*ʏΠU+gDwL& 3Fy8-IvX,!ĄYSL3KwpƳX{/S>Fk>R*FfOzŦ-%m"$!QF7; *4-m_TlQL(Ӓz} i˄5O0b2&_g4/s.3C
+ou B$*s*C\j0^i1-jpq{~5O,V)3cMuU|[v [Nh-<T+'{2;vNjxdC% EptqF_p6-x<⟤h3G@[4_9*RHˉZ #QwtC+k39anT{NaLg!U@<*#)15AA
+8%(EҎ,n_3УEDX3DZ-|0nlmG0ΚZ{\;Ik6 L~FdžKBzOG[tcB=&Ue|ծ9BRJhBL(;XE^ %2x1p*⮄bߑK]XT( Œ%m)t1 _ ~ڰ,6L1x~OH:[;f
+
+
+
+
diff --git a/prebuilt/libstagefrighthw/lib/libomx_av_core_alt.so b/prebuilt/libstagefrighthw/lib/libomx_av_core_alt.so
new file mode 100755
index 0000000..295e29a
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libomx_av_core_alt.so
@@ -0,0 +1,55 @@
+ELF
+
+|+GܐwCE KDw9-N"9{]IУ&9]蘚9GvK>o F܄6t2BY
+
+03/K
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+
+
+A 
+ "&D7zXZ
+:ȶh&8
+;=cmf
+\ +y7n8"IZAc}٠Ʀ-ˁMNc$_^@pϒfÉn9ԇP_ps
+ v)TvG\[Fێߏ{DLr-;.
+m 7fbz!|;I7
+sYG 5Vm 7xXC[|sThJId1jDBzJfFL>'ENkST3admUd2QͽHU] &qN-# $ME9|CZ<,)J٩H*Z'YbqJ^F|g߫<k EܣfgՓܖ}Gftc>qc
+$BE_x"+cnh.nNB+b9ۋpNpXfZai$住$Z+(6؃caO] 4@]~sh~~; {»b<u`{({V
+ V_nioJlpM%o.D7x sZvhu`gӶٴumاFbn6W#Qbĉ4[eCkVKR8:}+P HRXG["(<WM$C0^=xӎKG#YWaա ҳqu2P
+&1]izA YҠe416ܹ7E㧭ه:.(i'D8hW˻k:ZR" 3:Gq@]1h*[ "̥^P#\U l
+
+m̓8jU6Bnrp#99o2?˲M#ls
+G W#mKߩ^1Is
+`EEC~ytg.̙A;r߾ nj&K5ɺX'F%,0Aq@`Kgbd gxvP0U 3!dOM}o9d^?Ǘ
+՗x=QX1o_.߭叩a+)eL<_@45WOYDD]A{`-jXƇ}wq*I\HRiQҸC";fz>
+$ZU=C6.| 84u~_Ϛ4SUMM+XDN:YVJqinT.`EY A̴0< x¦%!ݤЮ۽>زe\QvVlp9'ltx+x-8h C8ؽC蕲ٗKL c47sGźiV u 5cxؚc 9Qm)%v'TZ
+Lm4|)όaJOg؍^R
+Z wP8o5 p|{FqqNyy#=:;\5~36~zIfys6L8]vu5F3XX @
+:>Lȯ}>˵!x_VIwe=f>׺hcȉ><
+ w"ѳ係J݃]lRy0]7٘+`k'Ý:-\G Xgs a ױ?U<($vS^z*q,wsPD'CZJV\B*q -@,@XB&KNiT
+
+
diff --git a/prebuilt/libstagefrighthw/lib/libomx_clock_utils_alt.so b/prebuilt/libstagefrighthw/lib/libomx_clock_utils_alt.so
new file mode 100755
index 0000000..3a578e9
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libomx_clock_utils_alt.so
@@ -0,0 +1,55 @@
+ELF
+
+@BM`
+
+03/K
+!JFQF
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+P
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+j
+T  
+
+`V
+V  
+
+
+A 
+ "&D7zXZ
+1-cMBSFC$8n aZ+W+~fv@;)6Ϋl`;s~$C #]4.RC
+'0qko*<|}dqra_Q7gQ+_ypcP`&ԴBk_fd= ^{kOI7: SEuH5F_?4j _V mJ+en&b;(AG^2D qWfz} 6_$5u1q]b<Nio8*W;?埵R^ᔵ!9.MrZ wyUWg>bFW(b80ȁA|rAii@s,mR9`\e31uʼnWD *^kbjKǶv鱎#(&tEYY Y]goE?~3M8
+"߳}zZ9fJ
+xP\d=d7U^L
+
+ #͵_=CJVQ
+1ͺ(!p;6~6"YPAiFRc !,T
+{b]*3`?ke,d16sV?NAfi
+J;$݇ \u$=/"/DdYfY3~̽89QpLV
+ AxMFeFj;m2+
+يTgo}z@;6:zeYvU0/9Ƕɓ:ww'1wk},V0zL#t@a)QFAN.3غL֕Y,9^ E| J?X BrM+]W%A
+?e B2}zGK=n4?\vY t@Kޜ t+j0/}'ST]FQ0؃;Pٛ|!A)b"P㝫dvTM/~Q1V=zI)LKz>}mhpkLC^8^ώƍ'ɚ=vǢ.zх~TbҠ+t0
+ Zxy2
+
diff --git a/prebuilt/libstagefrighthw/lib/libomx_framework_alt.so b/prebuilt/libstagefrighthw/lib/libomx_framework_alt.so
new file mode 100755
index 0000000..716dbbc
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libomx_framework_alt.so
@@ -0,0 +1,397 @@
+ELF
+
+
+
+
+
+W
+
+
+
+
+
+
+
+
+
+
+
+
+
+Em@`<(
+@ ${Da0h
+$! (P#A 'YDԞa@I .L!0
+
+)ePjI@[o۠e?ckguG XuW /|jckTZV%q8>~ 쎦Ż*dI8  T]ѓw8K^&aY6GFPk۲g~S6c q&=!TP4'eP*0*Cme*DzMP[nT$\+ķ'Hԥ~d'oO9!zzJ|* {_6ByZPy"JNKVjՓvQCEKS%=34Nhk_Ld @EEsV"22ϞJüouͽ* maTso[k R> U!9X2ؙ>!bW^S(Iԭ! &19MPig75-.9NQUP!М
+At[Ŋ֚KV6Piz50yA_XM+B7}zb`Av=^_XNE=a|ռ.8B;[s]@9mޚer&hpSp+ 
+>/
+۠k ]42狔˄"`dFqTchPhIa+ˉ jh -'Ϟ*ur ˼oI\_wnC~|nX/B:k9Ƅ VeL~fRqlv[efxR
+lTy o+BJ"7qX"H)yeho>) 7'\5#?~
+`ޭ&^!(:#|Fp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+H*FxDh H1!`xD!F@N7
+03/K
+H!
+F
+ F@Y
+(
+FxD
+
+F
+
++
+)h<1`hh
+'
+(6B
+ F0F.(
+)I) yDxh m I yDxhImG F
+|
+|
+-OF(H FFxD
+G IJ yDzDGHF F HxD
+/3O:FO F?I@ ?
+FO2FI.
+A yD
+
+FO:FI
+zD Lw8F48FA4 
+C0hQ D F"0hQ Dz0hQ Dr H xD
+
+H xD
+
+6Bv0FL0FqJA
+)F
+
+
+
+D
+0F
+p@
+0Fl(lv0F4p"!F0F(hmLHPxD
+h@p 
+(HPxD
+FxD F
+
+
+K
+H |8|
+VP
+4
+
+ 
+(c8F(8Fndd~ F
+4
+
+(c8F(8Fndd F
+1IRyD.
+
+
+
+E
+|F(F F
+л0F
+KyD{D:IKyD{D2
+
+
+s
+
+
+o
+퀽#h;A pG
+C
+56
+S
+
+
+
+
+HxD
+
+
+W
+
+ V A zYA,V
+zD!OKDNM{D?h~Db}DO
+_ Ih
+k+F
+K{Dhhh
+guAFu`"u@
+ gO0tupvpwppp,wgs p
+0FE
+! ig
+(`!
+ E
+
+(`!
+(`!
+
+ppF. F0F
+`*
+0Fp@ +
+H
+I
+KxDyD{D>
+H
+I KxDyD{D6
+!sssB
+sqssA
+!ss0Fss
+!G$xhh !G%)xhh!G' F.u>d0xhh!G
+!GHxhh !GLH0xD
+](F ](F鸳 '<s@ud(FF
+'a+I+ +FyDA
+
+ XF
+v F@
+40F@
+8@
+%s
+(c0F(
+I@m
+J
+
+
+D
+
+D
+
+!
+.. yDzDlA
+O
+
+(
+F
+ -yDzDr!`
+!F`*
+@*8F&T 6xD
+(OS0 ,-yD0zD
+(Oc
+((y(@@wh8F
+F
+
+>c(i`hxd@F FF
+yD`'sp@
+wp*@' zDhh
+((y(@@wh8F.
+F
+((y(@ǃ||h yD+F
+((y(@Vh
+)
+
+
+8F@
+@
+FJF8F FH8F
+
+ $yDzD
+06xD
+
+8@wh8FF
+$D
+ `2IJyD
+JzD0F)F
+`*<@@
+`@*koI@mcoJ
+`@
+(h8D)h>)y)=8I h@f0yD
+@@
+(h$
+
+єp8P(F(F8F(
+ I.
+(F I  +FyD
+
+ Uxhh!G Fe<H1xD
+9F`*
+@*0Fn
+Xqa*@
+D*Np`
+HSp`
+\D
+
+HxD
+`*Xp@
+[p@*e
+Np@
+(hHe
+Sp@
+(h\
+HxD
+ fxhh!G FelP
+Xp@
+ `NpdSecgc@
+ Hc8<S=c?cA
+\cL HPSxDQcSc
+9F`*
+@*0Fj
+[p`*
+5h@p
+Hh@p
+\D
+ `
+b
+`*Xp@
+[p@*;h@p
+Np@
+0hH"!I#!J
+Sp@
+0h\
+9F`*
+@*0F
+ <s@AcCcA*!ccpqccA*!cupccc@
+N
+ fxhh!Gxhh!G Fhd"a
+O
+eq|sffA*O
+0.,$ yDzDA
+D
+ `6
+D
+
+
+(F@
+@
+(F3(F
+
+.& yDzDA
+& dd$yDzD
+pp!h@
+`hBY!iB
+jpd'@
+@'dh1B6@p
+DBآDB ٕI p `
+AF`*
+@pai
+
+
+
+hHF
+
+D& F"F  =h(FF F)F FIF"
+(x
+PF0FJ
+# h S FfhB
+
+
+
+-
+Sp@
+Op@
+4 lc<\p@sAcCc@
+ cptsucwcA
+h!cmpscc@
+jp@
+fp@
+, upscc@
+qp@
+$ c`scc@
+~p@
+zp@
+0 `scc@
+`@
+( <d8d`tddT`h!@TDtEdGdF FTtdd FAF Fw
+'JDA`*dH`B
+"\$trddB*w0@D!@
+ @xHdxDT0
+P
+PPPhBxhn!q xhn xhn!
+HxD I  yDp
+XFQF HxD
+H)FxDh8hj F8F!FJFGF F- F)F@F Fp(F
+IyD h hjl
+
+
+@F
+F IcFyD h h
+"F FZ (F
+"FHxD
+` F
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+?o/o C02
+@-@
+
+
+
+
+secure memory not enough. but at least 1
+
+
+
+
+
+
+
+
+
+
+A 
+ "&D7zXZ
+,dPRE\I"C{SA6wKktd9ե\vw~/* Q#oV)
+"} j[B*iRusV{|X35gmy5.;H>$nE-L  ,~NZ˾AyA=Z~?d5$1>`
+w}H~Mxﺐ@#27ď s4
+Iknɵj jJ}ͣMd+p~7\Ddd8eF\DD<: ?/G&,N͡\,سGd:Sb5+Px$>yN<x$ܣ-ٹBj+,AЂ|+楖飿bG r+S ?kZϝ
+l3Io7@yPgA~?7
+3Zfaﺑ!łviaɈqOP;=$ b=p_wI^Yn˳L|7Zs>
+"zܛ3";UVJ{vE$h^R.Uo>婓)}=ɖ `wz7a FB[ֲetf+)قc'~ bV}o~(~EBu]=ecZVJ]p?
+FVŹ 9uϢNk!$k,,sO=5byT!&񞼉Ȣ{i
+JeISVLy
+C:UǨ, yE5O>#3Ж<mTh$H@B\m<= 8 US#) xWq:5#V̺.f  Zrj*.Lgw"<YA vŤt'-bTU|w@׊_ Ѝ0M?ߺ''n%+}+!.tx1ZZc
+:&'gNUr;/M`rPRmԺ@k0c&Ѕpus$
+Zҽ!Ty%E*)(O놔7o[F`^EIrKO\tAm;J<BF` KZ,rl 6,$z"t>.ԟz.>*mO~{K~`gl {\h]oߖpB=gGfOP!z^n+Piq/y+97'0$;N*l,eiJKfqV`kU$4|m>nZh/{@m?FY ЈBw 6KJ,s?VC*NFnRR3A~|BXuH_3 d?j{Z`qdclSh߬]?nSSD$ zRmwm"a7o$P kM/qC-Xiԍ/T?+SiW&.\@@scò
+i@vg1K)84z -"r78inkz@[{Ȕk` 6Hn@ԃ`aevTy'7(SvbS)rtAͤ]=ȴ$T-h9ucFnM4xK8o5D/}gN( kJDa䦑#R۾i bbK""1S>ȏ MH<X`jzK$wNњez'wbg4M`kuU͂5kJHXꇯN }7A]ڻ;6 ȇ$
+ȎBԣhؔ\=qfkmJ2ay
+d 0۩WG#JH`l)5E3u~Q|>+w~JfKSV]!0{,":5V*8x ?kĨ\*rb=_D@ю% <;ZҦbu@J]&e_9pcjxKh1auɃmM0gZWZܻ<KoB׌LJ<el4Wj0襮泡zh.ab@~zndUdkZ FWPt#ܮmrw/$86ȉ஑Qqu ًurYo>IJFebS\x#T$e2*
+: {bLHN^f>kt[`
+k?:6ȯteab/nkѻ@HQ<`JNQx=[].;Fץ @2ÄF{q^zٜ"|JcC
+Am/:ջޅ4g#ARoj9>KEzrD$tsk^R#b%Y 2Y4=*! &OP7N|W#>R# 'WD_;aEMWW>KHJ5N #oTOٙ7`1^7P&tx"ϬyȜwmypFgJ *UZfkN
diff --git a/prebuilt/libstagefrighthw/lib/libomx_timed_task_queue_alt.so b/prebuilt/libstagefrighthw/lib/libomx_timed_task_queue_alt.so
new file mode 100755
index 0000000..697d8cb
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libomx_timed_task_queue_alt.so
@@ -0,0 +1,65 @@
+ELF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@0
+rk!A4uMczqX*.H|]}xWCE쪏oo[[˜_˚q*L%%qۦ
+
+03/K
+H%FxD
+@
+
+
+6
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+
+
+A 
+ "&D7zXZ
+N5%m:!rfR!r:OVHQ1l)eTƴj$aұ(#bZѥ+aϹtҶlGI
+f&P * lȈ<L#&sI ׊BxXpt=1D2B3j3Dɋ16}m
+}Xz).e<1A߿x>S0İlV]1VA˃CiU)>ȯ}
+sda"
+gC'Tȋ'ܨ[^ $+F䊾:fē,uOx ƿ١YnJ1A1ܢY2>G% =EeSSW4\F֢BS[sқ=8ПTI^?9;f`Q!!Sмψn]NSs%]3OVA5BdJg3 ԋ#e*.y~(bVՃvXOVNkT*HnnDDU w(od脅YkT/7dh(`?"mJ6jV\)*R.MBo0H\Y9$`[iѿ@.tk<\F|y ęB?g;pf֨˘" =,Tfɏko+g{EoMpH(vpu^辇[\h\I1dD
+\Җ)ȩG p-X35<9ׁ_9Um{1Mg{qtkHn0ފKi7/otJgy^eӶ~aL~(BUjRVﯨbWe@"Of_5x'`C
+.őx(SsC*g.>L f4=!%jL'=+JEʇlH\yA)o<@!9JIt #~qzfCaNTmP>?~r15j#KttMaaȬeP#=ћ ᛿ 7ugM]\(xA~*m3;B4Oh,joMW@sjJ)/[9l)wu8~0Ƽ;: dR2uDE[@Umy=\<- 
+zR;F
+J902Vjfgkӫf+J% =?vs iا
+
diff --git a/prebuilt/libstagefrighthw/lib/libomx_worker_peer_alt.so b/prebuilt/libstagefrighthw/lib/libomx_worker_peer_alt.so
new file mode 100755
index 0000000..7065b60
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libomx_worker_peer_alt.so
@@ -0,0 +1,52 @@
+ELF
+
+
+
+03/K
+
+
+Bp AFJF3Ff6(Fh hB(FGƼ\
+IF
+JO
+K
+yDzD{D
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+
+
+A 
+ "&D7zXZ
+Hu>bES͑=8Jfɉ)iC75dj 5gp=!uO_p Fi?# dqvh[(}tj\xA֍Tz86]y,+jTu0P^v>odl";$$9ܥ--va m㰪VTPcsQ. R͎ hϽBRhyNс]Aj$"qz݈&gz_LƧdIX;H>hgs+J0ť9
+SsOP/Hefw_nO4x8:qU̾s;{MbD֥{rRG
+}%#}:v(E^&d&|PmP['r<sIiY߃T*a:nFWMmt a)ZLQUV{u2!ID;ʜkՍ%Zd]"%'ĎX+0GZ\u-QѩōxnFM27qᅜ$$|T|:&mшl\ N}:R
+\
+.['*\@Sx5w_i/fZ0ҟ]zwSy.<K@rvw&%G$\$:`&:k(T[^g4Ce5`y°NYiA,5)5*R!NN~ku0Pe5a<k=cn*,U~L vx_BzЗJа$WLB7Y!7)Mڡk0Pky㐩+geDn cj*$bHzϪlQ<$zPfnv<K_׆I|R%4DAAJy%4eV>r* a%{U"PC%&%Ol:?" UN#.%X2fРTjS9>Wt,p(`{U1!,Ngeٸ|m Y,
+3bT2"3 \ȒJ+,:vxzbXͲ~KG|v~Qo|gZ͹SAgyA)lk:㜌ct8ޱE YdYSy(dۈ9tyVj}
+*Dچh(H:ũO789<Ar_VdϧIb@S[!a=>ܕo֊>^K٭?`,nПe=wx>oPw·me&t{0#5 v@}z 8f{Fꃩ ԷAC4 ^qIE}Ez.ĒɿW?1 .C*hV#o(%d7Sqz-)tD[cXM}1Y3zGfM!1ƕz
+‰{Txz,h^QssXJ~2d=vj03z OP|Z
+ϟn /tĊLjz69ўY\`}sFAcQ<tk"Ob>9U$#Rhgn<_ګP(mկelr@um-3T}HLa5
+i?ƜP `pk9Fժm' .8mCpsT;Yg$&ͯEo xD_mt|
+
diff --git a/prebuilt/libstagefrighthw/lib/libstagefrighthw.so b/prebuilt/libstagefrighthw/lib/libstagefrighthw.so
new file mode 100755
index 0000000..4fbbf72
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libstagefrighthw.so
@@ -0,0 +1,61 @@
+ELF
+
+
+
+
+
+
+
+
+
+03/K
+ @
+,
+ @
+,
+HxD
+
+! C
+ F
+
+
+IF
+J yD
+zD
+
+6A
+XFBF
+ "O@
+
+
+
+FVF
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+
+pJ
+pJ
+ FoG 
+
+ bh^h
+
+A 
+ "&D7zXZ
+41Cz>&|6/LbF~|sFy xekǾ2$[#>݆UE}-+N
+
+{@?ƤZ"yH2. ,{nHeI)E%]9d1~]ƎX(B*^|@Tv\f#!k 0Sк+8m\9$ F
+Tו6[ݾ?^o5Eqj_l@`G{ޅ…J.qr c[1䤉tLphFmb=TҺ*Z}oD3)U@g tG h3K맽PDt) Tg\q!IYR -Jc Z؛E>!TQxZBCV<ܜrdC{ 42dɀ
+0]2laI!ImR~"' Sxu:jBQl?o7t5zz8ƈv>s"d$Qcړ^SN "4j.VBx"(g~2{
+45m:! efYvS] +HܠJ]l"SScߘ)"k6;xvp˿sOΦkU{Fp#Xb[LE<=a`3k,ʤQj!piECjQZ*BCnGn۪qg>ؽ<;7!GiP]\`؄Fw<ȼMd⪇9^2IŹ( smt(3ywsDG+FL=TyxEˬsn7QI|6O(؉#P M|y*fi:>)qUL)4kS!+(Џd.ٖw(+ꐰbXw{D
+7:.q}2)<xmG]/{b$pl %(P4 Kǡz:t:Tr0eQⳣ5e)dO4Sf}a;#b;ӭ
diff --git a/prebuilt/libstagefrighthw/lib/libthreadworker_alt.so b/prebuilt/libstagefrighthw/lib/libthreadworker_alt.so
new file mode 100755
index 0000000..f7edcd8
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib/libthreadworker_alt.so
@@ -0,0 +1,44 @@
+ELF
+
+
+
+03/K
+
+I  yD/a/s0Fp
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+
+ bh^h
+
+A 
+ "&D7zXZ
+G6
+/rH N֖28~h40Wטq.m-HA&yGl}Ws~|qȮ.߫5o%+3rmU&98ڋjOsw(nS%Z<|s <1I˷6;fc wׇ< P8)E%4/}tޡJJM }P
+yW1!⸒q/ I|Zr=
+:(fK,g ^UV%6PePAepbIg@f2(gC~,}t˚A򙡈sD;y`5XB`$ѯj
+~"0:昞'Ql!aaD lT-E EFqRPժF4j \]?o)
+Xɑ{GŒ|=!^1㽤#Gmo45M=P9TXFQ֋o:Pܢݻp"%|U$7Is'>t
+`7i;wg:sy%b~0Wɞ^̎JEU;A-<`&;y/SqXD@X=QBKDm%"'sJNrIdaZK<dǀ wj
+^Xf 4wעq sgV! "m)VQ{DD`kzMM-^@%mL8;jeRlᇣ1a.,!o`[3M{Znulŷ 4k;g͍ Qt%p&cO](stME 1)hVTRQxhP ta}
+s"Hb3dN14; }?٦ ~c|X]4ͬ!^9dn= "jߗS!js=C>wX/YJ;jfumÐC iHC,p^3=S=zN~3gJVSI]mbj.=a&"RybI(\f6Wk&EYt_:nK`: aFI;,?Jn<vOӣ|gEP8cRaoQyj<m*p#}j;TU9wIPLM`Oe @G /"wi_}Gp[U P$ :^w#??%RukN
diff --git a/prebuilt/libstagefrighthw/lib64/libHwAudio_dcvdec.so b/prebuilt/libstagefrighthw/lib64/libHwAudio_dcvdec.so
new file mode 100755
index 0000000..b41922d
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libHwAudio_dcvdec.so
@@ -0,0 +1,83 @@
+ELF
+
+
+03/K
+ hRA
+
+ hRA
+
+OQ
+
+@
+p @`#9S'0Cb.
+2b
+
+*FB
+B
+f(r` a
+pc
+@
+0
+
+F@
+@
+Yb(@\bгZ^먳
+ $?H?IxD?JyD
+
+
+
+hIiyDjJ
+h1
+bHxD
+6
+
+8
+
+
+
+
+
+
+6A
+XFBF
+ "O@
+
+
+
+
+
+G
+xD
+!F
+(FoBF
+
+ GpGF
+pR@
+p@
+ F RR
+Nreu h
+.,dp .pldpcp .
+pJ
+pJ
+ FoG 
+$
+
+ bh^h
+ *H Ph 
+
+
+
+
+
+
+A 
+ "&D7zXZ
+ S*8ZlD"(-ET
+ GѷFHcD혡ц󝋓>,~
+_lmj T9t]gy!)BOٖ`:ڇIÕj8 vv5ME06.>8dKf ޶!,ҞxvH}0XlR=Ȕ V`ÔP ,]k0MC$(,xwA ӐoCa }?+yD:5T?Cy0-~ bq?wxm[y*fXCBg
+V[`T9[ ׋[A
+ߎ/N#cfK`9.&z$X/Hb >o|?o'W+FZNyBh+y4gQ >3EJV0ˢ_. i]m,8lọ=M]~/|3|[GI*}`<I9 YIaMYY %,|_f}_`|MlM b;OĐK+shk%c7w̚xx$}ѪVmlr^BVQw\H(bJϥY.%~u3]Tt]Hkq"jcys|t|.
+mʜ7[)vִb&}wsQur~5ġGܶIC8|''= 5ui[iٗBB`P 9shM~⠩5Dtb^;$Lwֽ TcyFmx.BH MM9p;:%R;N" x˜QLlq_jfe.Oi5<18N5RePV;,##ԛphQ?ݠ#6)f;=.27$ʏquK-(y\"9=7IGdhf|L{$[L&GV%ӯE]yWF$+A.[݃љ}PN)E@ŀʏeG_E>_S0gUxh]򚱯i`12oPWC֩1o,nk*/y9tpnqjƼD `='7կQ9Uy4F_5z4yT+&&؋~_ɏE8esLnR*n#|^=Rvm,yM92P&#=c\~G .Ta%t
+B .b1h*M<3mJ9- ~yaD|
+
+
diff --git a/prebuilt/libstagefrighthw/lib64/libOmxAudio.so b/prebuilt/libstagefrighthw/lib64/libOmxAudio.so
new file mode 100755
index 0000000..1466d89
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libOmxAudio.so
@@ -0,0 +1,69 @@
+ELF
+
+
+
+
+
+GB8 0
+h ` 
+
+R2
+A2CpR`F||||
+'`B
+%`" #`b%{AB%{C
+uK9
+sK9{A*O¨_O{C
+;K9(
+hK9
+
+
+
+
+pR1(
+H;@
+@
+@
+.
+!9B8 cT ,
+R 
+
+` `:A`
+Rc*{_{
+RS*{_O{
+Au2K9F
+#s2K9({A*O¨_O{C
+9{A*O¨_{
+2K9(
+u2K9
+9e
+9{AO¨$RH
+k
+k
+@
+@~`
+ @_ ka
+@K@_ k
+BqI
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+ 
+
+ 
+
+
+ 
+
+ߕbf>nIJ*j9ho {"۟x5sSuʜY+747ONfpA]7((E*}ffЇ ṳ%C!$ÐNn>bz/Yp'TDGvnov\B>3"SÁઁxu7.(-(H$ R u<pRHU!ݐ8Bx"- 0M|[7
+
diff --git a/prebuilt/libstagefrighthw/lib64/libOmxBase.so b/prebuilt/libstagefrighthw/lib64/libOmxBase.so
new file mode 100755
index 0000000..6e37c7c
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libOmxBase.so
@@ -0,0 +1,72 @@
+ELF
+
+
+
+
+
+
+ DHь<J
+bCQw*dm0
+d~MA)S:~'[jvCE}1|{V@B:*
+
+
+GB8 0
+,@R Hr
+)
+)
+@R Hri
+
+k!
+@ 
+@#
+@ 
+
+RI R @r{
+?
+h
+
+ 
+
+P`JA`
+L`FA`
+HJ`A`
+A
+!
+
+
+
+
+@`JAa@hz@h~F`@
+@h
+@`JAa&:`JA2/"
+@
+@
+@irB
+hrj&A
+@_
+Rf
+@)*C_ 
+
+`b,
+{AO¨WO{
+
+@2~h2
+@a
+@
+@*
+@(HAh
+
+ 
+
+
+
+
+ 
+
+
+
+/,^f# v9‹lUL_u$cnqŔ$ͼoBkI1.2w7@fE4~v b\@j=DGNCt ?<24) (] <1_n3jON`?VoVD/%dBw}{n46{?Nii.ETȺk-hSC=+Le8Bٕ'BP-Qjr=j߃lQ7'IVn.A*yT-LV䉰n1 /UqzW A Z$%Gz7OuA[t4Zm
+$Lm*,N+tk$_SG+y$>(-ʂ"&u{(p2J^߳JtQ۷TJVȦ4}j6'0DN&1̳ ^eU%~Ҏ'^3Fn0|INeP"ø\4=0^YR}]d±:cܠ&+Q:!"
+jn՝`/ F E+3q/%D6֞
+
+
diff --git a/prebuilt/libstagefrighthw/lib64/libOmxCore.so b/prebuilt/libstagefrighthw/lib64/libOmxCore.so
new file mode 100755
index 0000000..b6f25b1
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libOmxCore.so
@@ -0,0 +1,14 @@
+ELF
+--------------------------------
+ARCH = %s
+author:aml.sh multi-media team
+branch name: %s
+git version: %s
+last changed: %s
+build-time: %s
+build-name: %s
+uncommitted-file-num:%d
+--------------------------------
+
+
+>P3?dN=f-)=k&'ޑ6UOe:|_66a}07b@
diff --git a/prebuilt/libstagefrighthw/lib64/libOmxCoreSw.so b/prebuilt/libstagefrighthw/lib64/libOmxCoreSw.so
new file mode 100755
index 0000000..c1d4b3f
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libOmxCoreSw.so
@@ -0,0 +1,24 @@
+ELF
+
+
+
+
+ A" @@C
+
+
+ 
+
+
+
+
+
+
+緒
+|*_$:_rC?5V=֧F95ى˘2@uE>|V]g<KyH=p]apHk/gO>J4UŮ;mOS FFYǼF+ ]]n&A1갈XD?GO_(+`~)j=mM,V݃̀ݟclȵdAE,̬oxTjgm* ;ޑwu }:ow`1ƤWxa:F5s視}?༦ ~۽.cm
+lU%
+
+
+
+
+
+
diff --git a/prebuilt/libstagefrighthw/lib64/libOmxVideo.so b/prebuilt/libstagefrighthw/lib64/libOmxVideo.so
new file mode 100755
index 0000000..401e9fa
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libOmxVideo.so
@@ -0,0 +1,2762 @@
+ELF
+
+
+
+
+
+
+
+
+
+
+AP@
+P
+`L@0
+
+
+
+
+
+kz9 &SHap .eڢШf镙tؓ4\lD9{
+D]^{YPzǦ>K}Xaԏ}W:bý"oG~m!u'"IyN?is,R8]Jd
+,7]ebZs&[@yؓeE/1 줚9uh#zW| -J *G0c nDZW8so΢>BM=6߷qSF%tpbZh<m+ťg7.f]֍>g\<mdg29J]aoL#uЫ]I $yf,5lemn5FC7_z ;1 p,xu4+48 +T@x]jid^*qXb
+xOcNnN!x
+(]ޤme)_z0ȗʐ
+hrʏ^<pi
+{M=_&S6҆FNn]{]^Z4 p~q˞דٿ
+ &nj2M DF,iE!x  Ai!0h]l>YhHI%M.{t|\AWBIQGip1ĤsP-iXuQ j5ȗR' R5#w
+ 
+ UQQQPSz 
+} 
+ 
+M 
+ 
+%*%O& &l'8(8(0(s( (W())U**(** *R
+ 
+.`  .b
+ 
+5c 
+5[ 
+6z 
+9Y 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+
+ 
+ 
+
+
+AB P
+ P
+ P
+ P
+ P
+ P
+ P
+ P
+ P
+BB P
+CB P
+DB P
+EB( P
+FB0 P
+GB8 P
+B
+h
+
+k 
+
+B{C
+i
+т3mA_
+=@
+ 
+@J
+ {AB_{C
+`
+
+9a=
+9
+9thB 99?
+h& i6 "9> 9?
+
+
+
+
+}R ך(!
+h.w@vR 9hh@A
+J922` 
+O
+(`CK
+ka
+ka
+ka
+ka
+ka
+k|
+_ B
+
+A
+
+87hJ9
+
+
+
+@H
+
+A
+J9 R R
+@H
+J9 RA
+@9@#@
+J9 RA
+R
+
+J9 RA
+@
+= E M U]emu}
+~ *;
+ka
+
+
+k
+R
+
+
+C
+ 
+
+
+*
+*
+k
+*
+
+
+ 
+
+
+k
+
+k+T)
+k
+
+k+T)
+ 
+L
+*
+ Q
+
+
+
+ 
+
+
+
+
+j2J
+
+ _ k
+
+
+
+ 
+
+  kkT
+
+ 
+
+ 
+
+ _ k
+ 
+
+  kkT_
+  kk
+
+
+
+
+
+ 
+
+  kkT
+
+kT k
+ 
+
+  kkT_
+ 
+
+ 
+
+ 
+!o
+
+R
+R2+
+
+ 
+
+ kkT_
+ ?k
+
+ 
+
+ kkT
+
+ 
+kATi 
+
+
+j
+ 
+
+ 
+ _k
+
+
+
+
+
+
+
+ m
+
+ kkTi
+
+ 
+
+ kkT
+(J@9J4**K)8)
+
+
+
+O
+) )}S
+
+
+R
+9N D9
+Ri
+9 D9i
+9 qAiuA?q)iA q ZRh
+
+
+{ H;@
+@
+@
+kT
+
+
+
+a
+ ]
+
+
+O { H;@
+@
+
+J92u"
+
+
+Q9
+
+E
+M
+U!l:BH +}S
+]22+}S
+5+}S
+=+}S
+e+}S
+m+}S
++}S
+u+}S
+}+}S
+:I@9?qU
+Q9H
+99H;@Z
+
+
+9 hB4
+*@_ k TJ
+{ H;@
+
+Ո hŠ
+7bN@BI9h
++A8k
+(
+ @
+ kT?
+k
+R
+
+ kT?
+
+
+h
+
+ kT?
+ kT?
+]STA *?
+9j
+9
+9vhi
+29u*b 99V^`*
+9s
+9
+
+9 Y@
+
+u
+9.(
+* a
+* a
+clBA%ef#
+ )}Xk|qS`"+GJ}iIk=RJf%룐rJ} }@q(} efBA%#
+9`
+D@7)
+H;@@ A
+* a
+* a
+
+( #
+
+( #
+* a
+* a
+9@
+9thH9
+
+}R-
+(A
+K K
+Kh
+93
+90 
+9
+* a
+9`B 
+* a
+* a
+* a
+
+
+Ո Ê?
+Ո Ê?
+D
+9
+a
+* a
+* a
+ G5H>|W G
+K-
+G
+
+!
+j#
+
+%
+Ո Š7
+
+
+
+Ո hÊ?
+* a
+9;*
+* a
+
+* a
+* a
+~
+ @@!a
+* a
+D
+ ijj^ kK
+ jjC)} "IqS)}$fӉ|
+}@qH} e%#
+a@)
+*)2 a
+9hbI9h
+* a
+9(
+* a
+ 
+* a
+* a
+* a
+
+K
+
+
+  }S)!
+*C
+e@(@j}
+?
+G
+9J
+
+il5ifJ9)l5
+92dR*hB
+* a
+
+
+
+*
+* a
+
+* a
+* a
+* a
+R*)')ں
+S
+
+}S }Shj
+@2#
+yA
+!
+E
+Q
+A
+M
+y9A
+@9@9Bl=2
+@9
+@9
+
+
+@9
+@*
+    @#sW/
+C
+ C 
+J92t"
+
+@ 
+
+R
+}S }S
+
+J92
+
+
+9J
+9f
+9whix
+9̳
+9
+@
+9 Y@
+9.(
+* a
+* a
+cl>A%ef#
+ )}Xk|qS`"+GJ}iIk=RJf%룐rJ} }@q(} ef>A%#
+9`D@7;
+* a
+* a
+
+( #
+
+( #
+|hRA(
+* a
+* a
+9@
+9tϫhH9
+
+#̫@@
+DgDh2Hyi6Hyj:Hyk>Hy
+D6
+K K
+Kh
+D6
+9+
+ 
+9U 
+9
+* a
+9`" 
+* a
+* a
+* a
+
+
+Ո Ê/
+Ո Ê/
+9
+a
+* a
+* a
+ G5Hp|W G
+K-
+G
+
+!
+J"
+*$
+Ո Š'
+
+
+
+Ո hÊ/
+
+
+* a
+9z
+
+* a
+* a
+K
+Dh6`B
+Dh6h"Hy
+*3
+9)
+`@aRAФRJ
+9J2dR*hB
+* a
+
+*
+
+ ibjV kk
+ jbC)} "IqS)}$fӉ|
+}@qH} e%#
+a@)
+*)2 a
+9hRI9h
+* a
+9(
+* a
+* a
+* a
+* a
+* a
+R*)')
+h! @9 @9 @9
+
+_(
+3J*
+H
+@9 @9 @9 @9JSj33H**!
+xS x3)~J
+k   ? kk
+ *?kj
+K(@K_
+_ W O {(R
+@9@9*
+S*3I}S)
+
+)5<
+
+
+Kk L!
+)
+*
+@9?qE@9S_kp3Q@3k*
+
+
+*
+
+@9 @9 @9)SI3i3Z(*7
++
+UZK=
+j=
+1Sj+8`j
+J`yS})}j*8_` )
+} `J`
+K vS_
+ 
+
+@9$@9
+
+@9 @9 @9 @9JSj3'
+(
+*
+
+@9 @9 @9)SI3i3(*#
+*Zj
+ )_
+ +}@ k
+ IQ
+)n5
+  *
+@9R@91S331*Y
+
+@91@9
+.h5 jm8/@9,
+@9-@9
+
+ p}@_
+ QU
+
+St3J
+* $`@9jr8je8k @9
+q
+h
+@4yu4
+
+@yz
+
+@yz@\
+@yy
+
+_
+Kj 
+
+*
+@
+
+
+
+@
+@
+
+
+@ 
+@
+ *
+
+H;@*
+2
+
+9
+
+
+
+9i
+
+@
+@ 
+
+{ H;@**
+kR(1 *Rji8i
+ k}kckb
+ _k
+k)
+k
+kb
+k
+}
+rJ}Jc_k"
+kC
+}S_k
+
+I-
+@ka
+
+
+k
+k
+
+k
+}+
+b
+ "A!(
+
+@@
+k*
+}RJ  } j R̬Řr } }+ӌb _ k(
+ *RJ 쳊
+R
+
+
+
+
+@(! *A *a *I )
+
+!
+A
+
+
++
+
+K 
+cA)
+ib
+@wZ
+
+
+)eS&
+
+*
+HhJ
+?k
+ }
+} _
+
+_
+
+
+?
+ -  
+@9
+Hr Ke@-
+ K
+
+k
+*L
+kQ 
+*CT
+*)
+
+i(0
+
+
+
+k
+
+}K} 
+}@*|~{EODWC_BgAF_*Rhh8
+DI*} lc?
+*
+Ϛ}P
+kQ 
+*T
+*)
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*
+*/)/)
+J_ @qThFIiNI(}
+
+0@9
+
+
+0@91
+
+
+
+0@9
+
+h
+h
+j#h
+;
+
+@9
+@9}Sr
+ D)
+AI f@
+F?
+k;
+
+
+*EUU+BJ
+ *jI lEy)
+ j kIy
+ j ?aTh
+f@
+F?
+k
+HT?
+km&
+A9*
+ E
+B)
+ E
+B)
+ D)
+AI f@
+E?
+kJ
+G?
+kM
+ D)
+AI f@h6
+G?
+km
+
+SB(2!tu&S
+SB02Js
+yR*y6R*x
+R*x
+R*x
+
+x
+SS
+<
+2p}R**+w
+SBd2o
+u<
+R**sqR
+R*s
+R**s
+k1CqR&R*ps$R**ls R *hs 2
+
+
+R**rqR
+R*r
+R**r
+R*er
+Rk
+R*^rqR
+R*rr
+R**Xr2***Sr
+k1CqR&R* r$R**r R *r 2
+R**q{21
+~~~ ~ ~~~~~~~~~~~~~~~~
+iA):}
+@@-n
+I} uS3
+ tM{!
+@@hm
+}S}S)])mk!@@
+U
+hm@7`@a
+BbBm
+B+Rm`@ @+Rm`@ 2
+k`@3R*k`@4R*k`@4R*j`@3R*j`@ 2
+2/dc.@a
+2*&d`@2j4
+ja
+@
+7
+7%j 7@;Ri
+
+@ib@ k
+@
+
+
+K
+K
+K>
+
+K
+K
+}
+}
+
+@j.@2 J
+ H h
+@I
+@
+7@ @
+@2 2L
+@
+
+@a
+@J
+r
+@J
+r
+!@9
+!@9
+*_
+@ !@9
+@ !@9
+2,!
+)2!
+)2!
+aRj
+
+*!
+@ !@9)LS aR
+@_%
+@ !@9, K
+7
+@ aR
+k2K!
+@ !@9 
+7
+@+!@k B K%
+@ !@9
+`R @ `R*
+ J
+J2!
+@ !@9
+7
+@ aR
+K!
+@ !@9_
+@짟
+I!
+!@9@?
+*[]*
+
+
+K@
+hJ
+(+!
+hJ
+(!@
+@@?
+GHH)(!
+GHH)(!
+a
+
+
+@?
+h
+
+
+
+
+7hR@9( 6
+7hR@9
+
+
+6
+
+
+@
+
+
+
+@*
+@
+
+[
+
+
+
+S
+
+
+
+
+
+
+
+
+
+
+$q
+Qi
+
+@
+߿Rr@
+k
+* *uN{
+R* r?
+k@
+k
+R* r?
+k@
+k
+R* r?
+k@
+k
+
+
+
+
+
+
+R*J.@
+@C
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ do codec reset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+%s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+vdi_get_common_memory, pady:0x%08x
+
+monet.bin size :%d!!!
+
+VPU INIT Start!!!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+;`@0ɛ @) @9! @ 1 @
+w
+
+Ș w @
+
+@
+@
+@
+ 8v
+
+
+*:J_|@Lv
+
+@
+@@ (
+
+
+հx s@?@s
+ @
+ȉ`@x
+
+
+l@
+
+Zcl@6
+
+y
+ȃ`@ x x
+Ɔ䃸l@8@x
+l@
+Ȃ`@ x x
+ްx
+8F,h@9
+@,i@k
+h@F
+@Ԃ
+
+
+Ȅ`@
+`@
+‚䄸p@
+4p@
+䄸p@t@@8A@8
+ @ @ @!@  @1@
+$ @@) @@9 @"@  @2@@F)
+'߀@@
+Zw
+s
+s w
+s w
+s w
+Ș䑸
+Ș䒸 
+@Q
+Au 
+Ȑu 
+@܁u
+
+ɉ@Չ
+ t
+@؁ Չ"ȋu 
+
+
+
+YI9 ) __)
+p`P@0 
+u
+YI9 ) ___)
+p`P@0 
+u
+Y I9 ) ___)
+p`P@0 
+u
+Y I9 ) ___)
+p`P@0 
+u
+Y I9 ) ___)
+p`P@0 
+u
+Y I9 ) __ޘu
+Ȑu w
+Hu 
+ɐu AuA
+Ȑu
+
+@#@
+@}(
+ɐ &@8
+ɐ@9&@8
+ɐ@)_8 
+䛸
+ɐ@
+@ 
+ɒ@ '@"
+ɐ@  
+ɐ@   &@8
+ɐ@  9
+@ex@KF @KF8@憸@T
+@e@]ߌ@
+@e
+Ș w
+w @pB@(
+w
+@
+w
+w@`)
+w P w
+@e$
+@e@zi9@zi9@ziT9@6F41
+@e(%b@v#
+@e
+@e!1@ve@A(
+@e!@
+@e!@3@v@=@!1@!
+@eL
+@e!
+ _Ih>MlI)v@(
+@e2@KQ()C恸@pa@0@KQ()C恸@a4A0@KQ()C恸@d@0@KQ()C恸@Xd@0
+@e0D
+@e
+@e
+@e!
+@e1@Kq0@K0@
+@e1
+@e_@v
+@e1@KQ @
+@e
+@e)C@d 3@KQ()C恸@d4A
+@e@KA(x@KQ)
+@
+@eɒ
+
+@8@48H@ @(
+(@t8H@ (
+(@8H@T> @
+)t9H (
+(@D8Ic (@ގ@0߀@!ߎ@+ߘuB48@
+@@Q(
+ȋ@( @Nʊ(
+(
+@e8?߅ߘ
+ȃ@T2@ 1@# +@߄=M3 @h>M @
+@
+PɄɦȄITX(V,@"8
+䂸@9"
+Ȇ@( @
+8 @BAĄ䂸@9@"
+2@
+(Ȓɉ
+$$2_((
+@(Ȓɉ
+H
+,-伸
+,-
+, # @&@((䔸ێ䀸( ᇸ(Ȧ/89,ᇸ(,ᇸ (Ȧ)8Ȇ@4
+䀉ȁ(y9ը(9ȑ)8c
+ɑ)@(8@)8ȡ)8c _ض
+@ 
+@ 
+@ c
+A J
+
+䚸 (
+@
+
+
+@e0(!?>@ 
+@e0 AAP*Ș
+@e0
+@e OA@*Ș
+@e ރ1
+@e 
+@e @ _
+@e1@KQ&
+@eX(XY@cߐ䚸(F
+@e@
+@e$ @_@>@ @_ߨ@
+@
+@e wމ3@$(
+@e
+1@8 2@>@@KX$@@H@TD@
+(Ȑq@n(䪈Ȑq@g(2@1({@m8(8(8@z(
+$$@
+(
+(
+@*(@P@:(@K
+(
+D
+D
+ @l)
+Ȅ@
+#@
+@e*ʷ=@#@
+Ճ@E߃@_ @@Q߃@߃@_ @ 9 1
+
+"I!Փ䐸
+(8@8_ @@=c0(
+@8@8_ @ _8i
+@e8
+@e3
+@e#
+@e#
+"I!Փ䑸
+(8@8_@@=cA(
+@e8
+@e2
+@e"
+@e"@(
+ (@=cB1
+@0؂(;M-
+
+ 
+
+ @Y
+@T3
+@T)@2a(@$
+@T)0 8I +M @
+Ȁ䀸@4@
+@e# 1 @
+@[!
+ @
+ (
+@e>
+@e>
+@[! H8+M8@KX" @$(@g,
+ @
+@e&@KV @@g !
+
+@) @x91؂ @8_@(9+M( @(
+ȍ2M2M
+
+
+
+
+@
+@
+@
+@
+@
+@e@6
+@e
+@e2@6
+@e3@@3@@zi(
+@
+@8;M"@
+@e"@
+@e2 @
+@e @H
+ɉ @P8
+@e2 @&
+@e@6, @
+@
+@
+@8 @P( @Q8@
+Ճ@ :P-"@[(@@q
+rȈ
+@k"
+@e#
+@e(@ᆘ,ᇸ
+@e ? @, @
+@e)
+@e8
+@e
+@e
+@e
+@e?M@ ?M>M3@# >M3[@KS )C@pa
+@e@@
+@e
+@e<M3$@[%@(ՊȃlB)i@(h@
+@e
+@e _1@8h>@`@3H@{&zO(@F(
+@F$<
+Ȍ2M@>
+Ȍ2M@( 6}&(@v(@)@)ٸ
+Ȍ2M
+@e<?@
+@e<
+@e<_@M
+@e,
+Հ@@@2A!(Ւ@$@$4A(
+Հ@@$@$@F
+-&@$=6@4
+(Î@" `(8
+@V
+$(&@,
+@86@0(Ï@" `(8
+@Ȇ@Ȅɿ@
+@e, 
+@e,@4h
+@8@@ 0 0
+@e4?@q
+@e4
+@e4 @O
+@e8@@T 
+@e8@@u
+ 
+i@LϏ`@ @+Y@@"
+@e
+@e@2@3@1@1 y$@8d@d
+
+@e1
+@e1=M1׃@@Y߹
+@e!@@
+@e!@@P߁@
+@e!
+@e1vށ@@|
+@e!
+@e!
+@e1ȩ@
+@e1 
+
+
+@e@
+@e2@EW
+@e
+@e
+@e
+@e
+@eո߆h@
+@e @Ղ@߱
+@e@Ղ@ȥ
+@e
+@e
+@e@
+@e
+@e@Ղ
+@e@
+@e
+@e@rՂ
+@e"
+@e2
+@e@
+@e=LչNߘXչ
+@e@AՂ
+@e"
+@e2
+@e@
+@eU
+@e@"Ղ@3
+@e
+@e
+@e@
+@e6ރ@
+@T!
+
+
+@e4 @AߘՖ_@
+@e4 @!2H"ppHBPOp"ޘ _h)
+
+
+@e6 @#ߘՔ_@
+@e6 @ 0HBQOp"aH"ABޘ 
+@e
+
+@e: \Հ  ضi
+
+@e0
+@e0@ _1@(
+@̸>M@
+ۚ@
+&A
+ۚ@@ۖIȊ@1
+, ;
+&@ɇH،?@z8@
+89
+&'
+&ÆH )
+i@Q@\Q@W01(ظa
+ȃ;M! @@6@38
+
+
+Ȃ;M6䂸@H+@2*:ހ
+Ȃ 䒸@Y(@I8
+@e&
+ɔ 
+@e 
+@e (
+@e 
+@e @(
+@e @
+@e @y(@ (
+@e @
+@e @9(H@i(
+@e0
+@e0
+@e0
+@e0
+
+w
+w
+Ʌ
+
+@
+ɐ  
+ۘ 
+߀@ @@8
+@@!@@
+@
+@
+@
+@@#A (>@
+@:@#@#:@@3 C
+@:@#:@F @+@f
+
+@
+_@
+ߑb@ހ@խރ @(tD)Ԁ@
+J
+@@<@:@@ @@,@*@<@:@@@
+@Ԅ @ᐸ@ؽAᐸ@ؽ@: @* @:@
+@@@*?A
+
+
+@
+@@
+@
+@`
+@@@,@*@<@:@ @
+
+@@@,@*@
+@ @
+ @
+@@Dˎȃ&$VT@@@ؽ@@@ؽ@ؽފ@@@@@@ؽ@@@}ؽ@@@sؽ@@@iؽ@@@_ؽ@@@Uؽ@@@]ؽ@@@Sؽ
+
+ !@3@*
+@:@
+ފ @ @@ؽAA@
+ؽ@<@: @, @* @< @:@ @
+@@@,@*A[@:@ @
+@ 
+@
+
+@
+@
+@,
+@*
+@<
+@: @ @
+ yފ@@3ؽ@@*ؽ
+ 2ފ@@ؽ@@ؽ
+ ފ@@@ @
+(
+(
+(
+(} @ @@(
+@@(
+@@(
+@$@(
+@4@(} @@(
+
+(
+(
+(
+(
+^y@4@
+Q@@(
+2iȄA
+
+@
+(
+@
+(
+@
+(
+Ra@$@
+2a@4@
+a@
+@Z( @@4@2m@@m@
+@z(@@$@
+A$@
+4ʈAڊA$A4
+Ó䚸@Ȇ
+@@g
+@4@k @ @$ @4@@4@@@$A?3
+)
+@
+@
+@$
+@4 @ @ @$ @4 @ @ @$ @4@4ޔA 
+@
+@
+@$
+@4 @ @ @$ @4 @ @ @$-
+@ @@ @*@$ @:@4'A$A$
+)
+@
+@
+@$
+@4 @ @ @$ @4 @ @ @$ @4h)I P
+Ȃx@1.}؉"u
+ȁ
+@(@@HA@
+@!ASCDq_@@1q@1
+@(
+@
+@((
+
+@!SC
+@!_@@SCbA3Q@(8 @ @׃
+_@
+_@ ߂( ߁ ((("(
+M$
+@@
+@@
+@!@
+@1@
+@A@
+@Q@
+@a@
+@q@ @@ @@ @!@ @1@ @!@ @1@z}0g@A
+ȃx@(
+ȃx 9@
+߄&ߢ7@
+ɔ 
+_@
+@A@A
+ ¢Lۃ䂺9@^߄
+Ȍa_|@
+
+
+ɞ @
+1@
+
+ɆȎ @
+?@
+
+ @"@2@H7@ߘRB _@1h@,ߘ ԃ_ @_ @
+2 _hI
+OY ;@߃
+
+P
+䃸䘺Qš䘺Gߘ
+@߁@P߁@߁0@E
+@
+
+$@@(
+ȁ@(
+ȁ@(@
+ @2 @24
+ @@ZȈ@@2
+ @A
+@
+@#
+@
+@3
+ @
+@wW@"@3@@_
+@" @
+@2@
+@)@9@#
+@
+ @@ @@ @
+@$
+`
+@A8((Xt
+@9
+@9
+@!9
+@19
+@A9
+@Q9
+@a9
+@q9 @9 @9 @!9 @19_ @ @A8((&t
+@18 @Q8((t
+@Q8h
+@a8d @a8
+@q8] @q8ߨa
+@8 @8N
+@8 @8G
+@!8 @!8@ _Hh9@ltD@߂
+9G
+Ȉ'B@3BT@$2@
+@$R @S
+
+ɒd@ @@# @@#1tD@
+ȁ
+ȁ$@  
+
+ 
+ᗸ @@и*_@ }mm}9F=@*
+@g9F
+&@ )+ @
+
+
+
+)œ
+@4_@@
+@"
+
+@2 _@Ը@
+@ * @=
+@ $$  Ɂ ؄Ê
+ @
+ȏ 
+@ * (@$
+@(90@4 @
+@(
+@8@ |_tD 9@ܸ
+ɜ@@䀸*( 
+ɜ@䀸* ($#$ؒ
+ɜ@ @
+ɜ@ @
+ȃ &&B @ &
+ȃ @ @+@,@ _Hi8@4
+@"@ Ɇ _@
+@"BA
+
+@8_@(9@$
+@(
+ l
+Ɔ䊸@&*@93Դ@}߁ȉ
+
+@Æ䊸@]
+ @
+䍸`@
+CLg@h@
+1ƃ
+ ȉ  
+Ȋ
+
+Lᗸ
+ȊɎ 4_@Ɏ @M (@
+Ș䝸`@ȍ(  
+ȍ @@ i ޒd_䔙
+’䞸@@=`@  @  Ñ`@
+nF@D`@ 
+Ȏ@ 
+ڸ  
+ϟ䞸@@@@@@
+ɞ}A  ۆ˶@
+ɞ{A  R
+ɞA  a
+’䖸
+ɘ`@
+
+Ȁڿ0
+ɞ}A  @ۆ@@ @@0(B@H@&H
+
+䋸@FԀ䋸@ 9@8
+ɛ @8h@Ȇh2ء8_ @ _ @
+*_/0
+ȁ@ +,۸
+!@$ M 
+
+ق(
+Ã䏸Ճ@7Ț#80
+4
+ɉ䏸 Չ@ᗸȪ)80
+@
+ɉ䍸Չ@
+@
+H
+@@ @v@
+@@ @@ @@ @@ @t@ @H@ @@ @䐿ۀ䐿ڀ ـ䐿؉ @ @ )
+Հ@@  @|fߘgCB@ @|S @Nߘn@ _)թ/#!
+"@
+
+ @
+ @h-@
+ Սߘߘߘ
+ߘ
+䃸߃%
+ɛ  *
+ɛ  *@@c
+Ȋߘ8(
+
+yߘSOL n3OL h@OL _(
+sOL SSOL O
+o
+߃(ߘl nߘjߘZaߘ]ߘMsOL 4P
+K丿:&,ڸ
+䜸 
+N_@ށ䊸  (@($@2" @ @@@@ȋ@@  @@
+ɚ  <1ۃ@@
+ɚ  
+
+
+D@&@6!"# &2@6-ߘMH
+@*&&@ȆC
+ B
+
+
+ @Ȃ@
+@2@&A,_ _@ )@-܁@/Ճ@1~ߘߘ @!(
+
+
+
+ 䁺
+_ _A.$A¢B
+ @ᅖ@ᆓ٘B@阽݉@^ _ @@TBOB
+e@~^ɉ _9
+ U
+O*A@OXb@
+b@=,'b;
+/ @s
+ @
+
+ @ᅖ@ᆔ
+@߈3
+@߈ւ@E߃ @
+@߈@
+@ތ@<(9_
+Ą
+J︞@
+ @-߃ @GjTOFW
+@vzOv @߃
+@L0sO3s@߃
+@ߓ@
+@߃@ߓ
+@(9
+@w߃
+@s߃
+@m(9䃞
+@ߍ
+@
+@߃@ߋ @ߌ 
+@:߃
+@4ߕ
+@RߨEpob
+@Dw?` Opl 
+@6߃@E
+@ ߏ@.
+x@o@
+@@߯Ekol @߃@UUSUOUU@߃@߃@n䃘@
+ʚɔ
+ HԂ
+Q@@ՋQ@@
+ Q@@ՋQ@@"Փ}ɋ} " 䋽Ȃރ@ @ J
+ Q@@ՋQ@@#Փ}ɋ} #Ճ䋽Ȃ @ԋQ@@ԋ@J
+ Q@@ՋQ@@$Փ}ɋ} * 䋽Ȃރ@ԋQ@@ԋ@ԓ}ɋ}  J
+Q@@ՋQ@@* ;ԃ䋽
+
+@
+
+(@.
+Ċ@
+
+@F
+@8
+@
+
+
+0(@@
+
+
+/_@+@xR
+\p'<ޏ @
+@՛@RՌ
+ȉՃ4@ᄘ=H@
+ 8ك @lhcll.
+ 
+
+d*@  &Մ䀺`
+
+d׆_@@
+
+ 
+@ @ՁH
+@@
+
+䂸@ԑ䖸
+Ȁ-
+䖸
+Ȁ0 @ ޚ 
+@8 8/
+
+H@
+@߱ո䳺䱿ݑ$
+Dݐ
+@rDT$ރ@\բ
+
+ג䑸d@h@
+@
+@
+@3
+>@;
+@3
+>@;
+@
+ȉ @-@0 )@1-@8Ւ
+ɘ 
+ɘ 
+
+
+@@)
+(
+@h@䉽
+
+Ċ@
+
+@C ?@
+%@
+ߊ&@
+t@8
+@
+
+
+
+
+%@&@
+ȉՃT@ᄘ%@t@^@Նh䌿Ֆ%@ߊ@T@
+h߆@q
+䖸
+ۜLe@E&@
+@8
+@
+ȸ䳸@七hn 
+@߈=
+n nn@_@
+
+@tߊMQ@O@@C@B@@@n
+
+݀@'@@߆@
+ @
+ +
+ @ $Ֆ ( 8'
+@
+'@'
+@ߊ@'@߇ ۃ'@G߇
+@sߊ ۃ'@j߇@@
+](@
+ @'@8
+
+@ߊ 
+
+@ߊ
+(@
+@ߊ@,@!@ Ֆ ( 8L)@h18a:' @q߈ȑA
+A'@߈N
+@8`ރ'@߈>@L$ a
+ȉH@ H
+@߈ȑ
+
+@Xߊ@^
+@ߊ8
+@6!ԍ@ԍ_
+@ߊ@8
+@)
+98@)2
+
+@@( @1
+ȉ
+ȆXF_ @ ɊȖF
+Rߊa _H  e
+
+
+
+ȅo
+˿@ĸ
+ T O#o=
+
+9@o 
+Ș䒸@ 
+øB
+B@D
+ʤ@
+qߘ
+83
+_4@ @D@
+_4@hɃ <@+ߨ@$(@A ( R²<@RҺ<@ 
+A@ 
+ ]&0@!ܐ@
+@ 
+@
+
+
+
+
+
+8
+
+LDN&Nb
+< & N(LD.k.C
+<r3
+< $
+Lj΄̆fb.sf.*E>
+0.(
+<D
+LDN $ LF(H(Lb
+Ϟˢ.!M!MϞ.
+G
+L(
+<(*M(
+&(:'(J?*
+<L
+<? <LL*L*NGF*(R`~̀ <(*(<<
+C(D*C><9
+<A<M
+
+((71X445<.)$*L
+2(X2<3(3<4&5N)*ς/ .LE$FLG$HL4&5N$%.($$%L @$
+D0(A<
+8
+
+LDN&Nb
+< & N(LD.k.C
+<r3
+< $
+Lj΄̆fb.sf.*E>
+Li&jNE
+<x
+<I
+*>
+C˄4<6>Ik>I~2Y0 N>"0(w9~*y%(D*N
+Lj΄̆fb
+>#<
+.q(*tx
+f
+U(K
+
+407<+>z>>=(X(b(>
+l(u
+.=(**(
+
+7+(4Y*;Z({.g*f(e
+a>.(*3M*({<p(<(<(q U(K
+.
+q
+-m<m&N X#* f<
+$L
+=.
+k*x(Uy(Uz(
+U{(U
+T,@A+T(* 
+,
+ 
+   !( ")0#*18$+29%,3:&-4;'.5</6=7>?$#)/#,6A)6FX$/AXs!!)!)6!)6G!)6G[b
+
+
+
+
+
+
+
+
+DISPLAY QUE OVER-FLOW
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+ 
+
+ 
+ 
+ H
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+
+
+
+
+ 
+
+
+
+ 
+
+ 
+ 
+ 
+
+ 
+ 
+
+ 
+ 
+ 
+
+
+
+
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+
+ 
+
+
+ 
+
+ 
+ 
+ 
+
+
+
+ 
+
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 
+
+ 
+
+
+
+ 
+
+ 
+
+
+
+
+
+ 
+
+
+ 
+
+ 
+ 
+ H
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+
+
+ 
+
+ 
+
+ 
+
+ 
+
+ 
+ 
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
+$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
+t
+1mx1` Ձ$S'~trE@jИMMJ8ˠ}pѝlZB3*hXAa `r)vE\l7N.,Od҆>"?čOft^Q%- S[],(%&`(
+-Agt|8SP7#Jr+,3z=%vˍ$i3'XQ<L;JN hX} P[?~q#dp¹JƮ?~#UhdV3N ꮯ1r#ri+6>,r#R!mN:[/;EO\Z5ThpMLVl8)x^{=%V^bi}{OGp^{Ho@lN5Gq"@RbjreUic.ͧ:2Jvz)|F;O@*-k#Bv}у])wB
+.˕鏳xN V" eU
+y҄N *ҘCs=(l/DG I"ċ*mXRy@(Omb
+>;SYʟp29DF:Bk*D*C ̰/,aR?ߟFX`rt2{AM3{}lΞҚUZϷj
+H%͸~"U,!x ?O10a8UT^BAOqE, ~CFb9\^|ZWVx?t--R[{y2_?b"^AL}n<ۧ׮f?vΑdx>ulW(ob=G;pSbTFh;ܷxB[^d( 姀ݓ9v[J\"ɳU2dJ !{8K̤d0+$~ּ';~;˻#Q
+n , /PF%홄&dʹ.EV@_Fj jWtv [[lJ4sW2DvS[ޒ-X}ߞpfǸeb>
+j30:r/H}Ldc&lD&1eIӵUli%26k-UXOؾ+&s*{GgOv >"bQ",/tu~fNߗTXJjx U3
+"<j\Frzl\\{S=!Kjȥ7X<Ծ>znj%&RvפR\k:Kw iPIzHf Optv+OZO m( 2k WQǢ!E$"e2'Eoۋ"xxjjq1'%GcTS"X9ξTXh ('qh;SBf5+b+, w(>!*I':r>$aCK>cгI8rh0[8}w*7b \^[cSv`r qC凌Wf 9@U41u\5@Q;!=O2fB6.-svYB4Ɯ(^$f`s0@w0 bP-&ުt[Mp&Y >Z;2qg8$&fg
+.!ul"ZZ)vt# X>W-_Avש;=bf%/G+:iU戶M@.kO0DBFSF; e<\VgJ
+6gF 'i<`ڧ
+K тymy-Gj8={%]5:Yk1Cr*/_TX)څ!/<޳S~ɷQ5}y8fd lU
+zRC;+NG&b}f@/:Qhr̷7N9oZs7ɳ9(%q_Qe:ƤV@J+|o!]@t YSE^3YkL 'ɷj`w&\)Q,a,KKބCNeT~jٳ ч#cA;ף 3|;4Tt+Sfoj8= S.ӂijG4-g6yMszxbP
+15]@±Ӳv8HI̗p5 nƨ)c[wc f`S"w0xvco0sڽP08mW |J0̉a)a(kuU0c~nj܉W2
+݇AU8]L)dK8cQS Kgt=A]ivor_}d5ǮTI}>[yrϺYB|k42W%ܶCF\ldDU(=@G
+aq/2웑js%n ԧ'UB;<MԜ.(jOK!u
+mv-aQ4ӹ8P<]¬'eOVg洕sDMY-|ڼ=M4]/vʃoP$Bݲ5` "߇؛٨cQ)(ɟ=OTai7Z7:._LdEj`1-8r-Dtpv{tZÇ'$ 0 _Oۧl&nƺh+R4
+8
+R
+ =|Y{ѻ8~ҚYc*7pT5HLf:/Wӑє 9e%2T<Ϟt߮RC,ÌXܓN.Ń%(ppSYG&ZkJFQ/ۅ(O\MXoɩ!Waka6א
+cgGU3W;BDY63OAlj5XӗH_դ5GhʽY6@ej,ri
+z'!!Y'!d;fJ2Gpl,Ÿ~*a1^DLA29J@Pto`qnQk/0) T8Y䒈"K i{$6]w$y>cSWݫbǴݹf<]SԲl軨cn{~ko}<7PXn;ylk q#n41) r=˻qѾ>S.c$FJea{;%L\?_!3&͇iE}sb>ꪋ0Lt5O7Vuckuc,!5Ja `ƺfu`S
+딧3"6 <牔/@DB<Kp
+d|^4I-<j͎L#qaH} o7,x9N"| 3W#%r%E4\\:
+U2۪
+yW&~< 1(>\" 7?+f@wnipg($[CTo^"Kh=ڡޡg*yp\
+
+Ai!g߆)G&Z2ÆMwQkyEږ CTV޳j?/iP,=ݫ\VaU.oK֊oRjA0EG#a_d/sGN#:y_n@k&~<S'߹ ҍg\Kh]=2,}E(z/O# %+5Y0eOeWN/7dQThWfs& ܭx3(Aw`5ETl68⪹9Ye!e,_8sU~>\@BߊrqNY
+\yy^eU_ TFdyɹK,-2 0e'<`™7j!"a~Yt͘,HQ<|ѡ
+WHnGQ~CoafnHMS='T޸u.G+抶wgF Kv t
+CO\ tG#d8?6b*n[LJv{ݨ$+l,)Tj:oZ$W=-BdU(\++B*ܤ3' B (n;r徦'[\Ϝ 2%\oAm)B.0J"!^ŠjDQ"
+(؟𞉂{<PCZžCN>3|N;Zj}MؿS=sn'0S?v-9QL[mpI!NĶՠrKk{9ۗDŽövZAhZ >(}_8M|cӎZ!dlOe> ;"Gm*&)zHaeVk_^CT']\ֳ7ܨvہTBTi[ߌ҅K߀61MV*lY36kUizS)88T;Z~cט~tGDŽr-]
+1kcJ:#0/
+
+2 w#Ͻ5LNu, z@6X-qǏЁ~esO ݚ"\[ڍ\#*ec_L M|PI8]"'BܮNИg*"B#Qќ[:VN ^!fKcz $)HH=uҹD
+Y2,w]( E .*6 .ɕ(s+:^fP# ē
+VL20oBd3' :iJ`uł '[@lkmHwNX3
+9 'X
+yJհ
+] (_}H \MhW 䮳\s6N.z]`$pDQx "h2Ps
+І(_
+0=sGc3D~%ZgFk },En6WI|b3 YJX܏^ }jM䍐GOO82q[\rdn[QF&GDLuWIlJe?(Q(k `WL/se:
+9tT{5t5\#qcL?d7}Y(7O"*ǰ'>Ċ1uKpd'{,a-_S G`13x&pU+[L}ѡкb6g_q)16KC ěF<DH<X4~s
+/!HME G|0DQd~<[bV1}NF<-l|
+)AD8%*|JrBTA:o~:En5!G
+-\!t`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+kş6BoeԌz9prkң[ NS%qI?r/Vyq<1J. uDR'5S2pTho`h}FT=(͐lzm/N W|dy1ե_rd}V
+ QfnD{|Lvd<dɯkٮBHcAַD>Q#L-*փOkEXO|$@c.qplD.,$[[u1ÉZe^pZ9AKt)KuXPPfjHED3fGEtOˊWXlv%Lz%H"l眻+$'B9zAoJ! rhphHS[M4\>*^oP];t84IR/96BtK;_|]]i!lv/jbc lk#[-9qW)U83 ĭ{ )|.юEgxu{_{qGiz;W6gcOwט v`/fd\Z8F"'JL:^oxw)'6NfDgf@ >FEΝXG&NںfUZ_2&hYi{nO;CS L]ր3߯Yk] 5? .
+B&5K14@r+4(k$o}k=Q'|x>,]+
+鄷0m
+Wr/Fي~+n^]pIE1% U
+TK؏Z<~
++^k+5JuHx M%ޔ4ojuGmi 9g=JqﵘbbRkM÷VjΌT$yt`$`=|Upj8I&̔&|$7ާ
+a\X`W OViH)>7Ͳa
+fx᭽6߲ \C:y\nD>)ZEt5|K>z^v ,tL5& ۠ ?gQsGh
diff --git a/prebuilt/libstagefrighthw/lib64/libdatachunkqueue_alt.so b/prebuilt/libstagefrighthw/lib64/libdatachunkqueue_alt.so
new file mode 100755
index 0000000..117fdfa
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libdatachunkqueue_alt.so
@@ -0,0 +1,37 @@
+ELF
+<#|D
+
+
+
+@)G)A
+@AT
+@
+@
+@
+@`
+@h
+@aT
+@
+@AT
+@
+@2
+@*
+@@B7@@
+@i@  Th@A7!
+
+@)|@H @
+@
+T
+@9 @@5@E
+@2F
+
+ 
+ 
+
+
+~H#zAM&s#Q/\n-~ٙx}V,*:,j9 Ix8жu$1HEd*rA yqZtFL2ivP؇Ɣy#t*]HdvN Qh:~5XIUwgH
+INS686z)K^C]}i|b__nؕuԝΪ= oӠrl캢lbIpϓgz0/
+hQc)bpQ;q@ UY+Q&ecgS>%dF1wP4Z[`pFu7/#[.تc/JZocJ4!o-KË>E^qL&? 8h; zr=ZX }`õEIw
+l,2>k褴)!תmq~<x# Xcu=HثO$T)pΌ>1 !=`!Jd/- T͌d5d ڋXt 1NxےJ$8<owƃe߻ST
+
+
diff --git a/prebuilt/libstagefrighthw/lib64/libfpscalculator_alt.so b/prebuilt/libstagefrighthw/lib64/libfpscalculator_alt.so
new file mode 100755
index 0000000..e74e49b
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libfpscalculator_alt.so
@@ -0,0 +1,10 @@
+ELF
+
+
+
+ 
+ 
+
+H^[2-ahvέ-j#?e.èdc%1`p!|Q#ZEykE*<c%^8RAGΝAzolcKcQ;
+Ur 0a1zDL|}I7g@Y@TM*B} (b tW 4"˃ywi'|h#tV ߧX;E2.oFsz (A[*4.{^L}i]iVR
+y|eq,` u/ gݛFqNJ-Y|$Pgs$'FCCKAYkS4c :Iɉ9x 30J+|0ABw)8No!;zڶz0C+iu[I(6#c]{EdvTy%1# J)u6աsj@Yrp
diff --git a/prebuilt/libstagefrighthw/lib64/libomx_av_core_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_av_core_alt.so
new file mode 100755
index 0000000..4a4ff4f
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libomx_av_core_alt.so
@@ -0,0 +1,14 @@
+ELF
+|+GܐwCE KDw9-N"9{]IУ&9]蘚9GvK>o F܄6t2BY
+
+
+
+
+
+@J
+
+
+
+_iա;y{$ CDvN MN@w;u҈QDEʮh|BC*X!?UAճNQ\
+}j8{{\S=B$>h^YAM0"y P.dyO=V}oAG(Py+|sa{ڥ&&FⰨY)ӣ 0#+2J)fXZY2cթֱ= @@z҉xX۷=!&2|z݀ϨwQv1#|\ k
+( |Jf/4!_T1 v!1J: <Mgm•+K@(z 7Q3J""<묷Ubw]
diff --git a/prebuilt/libstagefrighthw/lib64/libomx_clock_utils_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_clock_utils_alt.so
new file mode 100755
index 0000000..762d2e2
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libomx_clock_utils_alt.so
@@ -0,0 +1,24 @@
+ELF
+
+
+B
+Hr
+_
+
+)
+
+@2~h2
+@a
+@
+PB 0 @*
+Jp)@U ˚ ?֨{BOA
+@a2
+@(HAh
+
+ 
+ 
+
+
+m 1Lf<S: 5) *ik 1.ev0u`Keª7{gWcO:0yDfq<q4Y0;80O<*ʚ| nɺH
+X־V3ݰ;QSJƬ|{w˥ONL+tAH3޷j*XU
+
diff --git a/prebuilt/libstagefrighthw/lib64/libomx_framework_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_framework_alt.so
new file mode 100755
index 0000000..dd569b9
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libomx_framework_alt.so
@@ -0,0 +1,436 @@
+ELF
+
+
+
+
+
+
+
+
+
+
+
+3 @0@4)  a@0 VΨ
+k P
+Q$'!"}!Ahh
+)ePjI@[o۠8e>c)SkguG XuW /|$N4jckT[V%>~ 쎦ŻdI8 ]ѓ8K*aY6GFPc&g~c q&=*0me*!T'ePMP[nT$\+ķ'Hԥdh9!'oOzz {_6ByZPy"JN]KVjՓvQCEKS34Nhkd @E_LVūϞKüo* $22aTso[k S> 9X>bWV!^S(Iԭ! &9MPig75-.9NPTU!М
+n&ٕAŊ֚KV7PizAx[_XMAv=`|ռ^_.8K;[s]A9^F^6er&hp/Ԑ>/
+۠kTp+ ]42"`˄dFqT0tDchPhIa+ˉh -'Ϟ*ur ˼oIwnC~|nX/k9oƄ VeL~fRqlv[efxRy o+BJ"7 qX"H)yei) 7'\5#?s>&^!(:#|vF`$Z2۠>ZgLT`BϩePl 8W3>ZApz }ʄSZ
+
+
+33n445l
+
+
+CB 
+DB 
+EB( 
+FB0 
+GB8 
+O { H;@
+
+
+@A K%
+@A K%
+@A K%
+
+
+
+)
++@
+
+
+`
+ R*ZVvw
+9
+9 Rh
+vw
+9
+9
+999ihn8r 9
+
+@#
+@@#
+
+ y;);k
+kk:( kca
+
+kA
+
+
+
+
+H;@**
+
+
+h@sA
+{ H;@
+{ H;@*
+O { H;@*
+U;ը@V
+H;@
+@"#K
+@"#K
+
+
+@"#K
+@"#K
+@"#K
+
+
+
+
+@"{
+
+@"{
+@"{
+
+
+
+
+
+
+2
+-
+
+
+
+
+
+R*`
+_ W O {H;@
+hA
+R*
+O { H;@
+{ H;@
+A
+
+
+{ H;@
+hA
+
+
+@R=
+
+BsA
+
+@sA
+a
+
+
+@
+@
+{AO¨
+@
+@
+@
+
+@(
+@(
+@
+@
+I +
+
+@
+@
+Rw
+@4`@{AB4{C
+h
+(Mh
+^8
+!<C
+A
+H
+{ H;@A
+^8
+
+H;@*
+@"#
+
+
+
+@VD kA
+
+R*h
+h& )
+)i" )i* )i& )
+@iVD k
+@`"
+@B)A
+@`"
+
+@`"
+@.
+@f
+
+
+@`"
+j ?A q+
+
+ki
+
+R
+} _k
+ R2,1?@q-1?kJ
+k1i")?@q2#1@q!
+@!
+
+@
+
+@A
+@A
+@A
+@A
+@A
+@A
+
+@"#
+c
+@q)j)C*Ǒ)}
+
+ RBh
+
+
+@"#
+@"#
+c
+@q)j
+
+ R @h
+
+
+@`"
+
+@`"
+@@!
+@`"
+c
+@q)j)C*Ǒ$}
+
+^8
+@"
+@"
+@
+=
+@
+=
+T;Ո@
+@"
+@"
+@"#
+@"#
+=
+@"#
+@"#
+@"#
+=
+@"#
+@"
+@"
+rhB9F9J9N9jz`:=9{BOAC_{
+{ H;@!
+H;@
+@
+
+Eh
+@
+@RD
+@
+@D k
+@D
+
+@A k
+Rh
+)hR
+r?
+k
+)iZ
+R*!
+
+
+@
+
+@jA@?
+k8
+
+@
+
+@!
+@iA k
+@`"
+
+@)
+@iRD k!
+@iD k
+@*h'
+@iD k
+@=i*(
+
+
+ _ k
+ _ k
+y@yh&
+y@h
+@h"@yh2
+y&@yh6
+y*@yh:
+y.@yh>
+y
+
+@)
+
+@)
+@A ka
+
+@ւ
+@2`
+}@(
+k
+*@9
+
+
+@_
+
+
+@i@9
+@
+_
+%s
+
+
+
+
+secure memory not enough. but at least 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+ 
+
+ 
+ 
+ 
+ 
+ 
+
+
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+8
+ 
+
+ 
+ 
+ 
+
+
+ 
+ 
+ 
+ 
+
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+ 
+
+ 
+
+ 
+ 
+
+ 
+ 
+
+
+
+
+
+ 
+ 
+
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+ 
+
+ 
+
+
+
+
+
+ 
+
+x
+ ` 4  0P8p
+
+#xԗ I N>E2=3T
+hw,X$N;&a,N:KBn@m 'MFH[lȕ/Ųmlq>Z0EDDN<Ln tvQ)0-S0\jr ]"̰xhM@M~ooP+r|`FrBF2&579\cP J.VĞF1 ; ۹JTR෧ _]K8STkۙ<𿷮m>n&?;85X
+ 36o,aNF2G5Ali%Wpˉ"e'P/;&xY'rSddl_Yk@;//r9I !g?1e\"3l7Y~&/Z+) s,*ao.@>]]>b{*B.B(hF-F XKY,WΏp0!jn]۳ A"@@rDۇe(ÑNKo+F%b/sKmY-΂(rk}rJ<61FwWӕ޲3=lj[zn_ϟ+UC6 Tnxvj?-OUɎ;E9]t/_4M h0gWPpiY
+n;aYex%
+P댁MҠ%D>.6jP6?
+[g˜FwR-'Lrלxe^"W,\l~+mIY7R@ 5$цlGnZ t2AviDmי8!/xqF.9P
+ŧ8ܮ+ c`@4 |Ne %↤L7--Gx<>cQI #,Ɖx
+/
+g
+
+
diff --git a/prebuilt/libstagefrighthw/lib64/libomx_timed_task_queue_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_timed_task_queue_alt.so
new file mode 100755
index 0000000..3d14d1f
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libomx_timed_task_queue_alt.so
@@ -0,0 +1,32 @@
+ELF
+
+
+
+
+
+%qrk!A4MczqX*.H|wxWCE쪏ooZ[a}_%q*Lۦ
+
+
+)
++`
+
+
+ 
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+˂ηd}gJ|11V4@YNB(Pm+"E"rE
+1疢juRB qY;0~6傛H׋Giyb)]r&+Bm.bil 21u{r &SG %H<H/f@r2@՟7Bk%U3҂Q
+ ʭ$Hv|"hdQho'^~W+.]ѸCvt"T)u7:A(/~ZDTLM<7e~L"5 ȽHJo$*wmؕ 'q]qATKHmgqK]~3$R.}oFQ[g{?(
+j>Kj6dca5mp!zc&XvVr
+
diff --git a/prebuilt/libstagefrighthw/lib64/libomx_worker_peer_alt.so b/prebuilt/libstagefrighthw/lib64/libomx_worker_peer_alt.so
new file mode 100755
index 0000000..ac78f28
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libomx_worker_peer_alt.so
@@ -0,0 +1,8 @@
+ELF
+
+
+
+ 
+
+
+ UwPY |\lp{PC3؂-=:SP"-vIR~շ +%+eWS^4=6v4ܖzR9Z`Ve=u6Õ~f&Qe}H=(LNjӠW,[eZLLN>PUCQPA} YQ8g`W¶wa­:0zI4
diff --git a/prebuilt/libstagefrighthw/lib64/libstagefrighthw.so b/prebuilt/libstagefrighthw/lib64/libstagefrighthw.so
new file mode 100755
index 0000000..f6d3d6d
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libstagefrighthw.so
@@ -0,0 +1,32 @@
+ELF
+
+
+
+
+
+
+
+
+
+
+@`"
+
+@{AB
+
+ 
+ 
+ 
+ 
+
+ 
+
+
+
+
+
+
+
+
+Ѝu6zި[ҬQ
+9q1~kֳ?t?Ãls ::;dLv՛2]K*7F;Nä֞XJ7pnٓ3+33-#IbXj`0="@6`^@`;*NPNtȘ"?qLA
+Fx`{+
diff --git a/prebuilt/libstagefrighthw/lib64/libthreadworker_alt.so b/prebuilt/libstagefrighthw/lib64/libthreadworker_alt.so
new file mode 100755
index 0000000..9bd2e93
--- a/dev/null
+++ b/prebuilt/libstagefrighthw/lib64/libthreadworker_alt.so
@@ -0,0 +1,9 @@
+ELF
+
+
+
+
+
+ 
+
+~+0-|Key9
diff --git a/system/.gitignore b/system/.gitignore
deleted file mode 100644
index 549ab22..0000000
--- a/system/.gitignore
+++ b/dev/null
@@ -1,3 +0,0 @@
-# modem is a separate git project
-/modem/
-/droidvold/
diff --git a/system/droidvold/Android.mk b/system/droidvold/Android.mk
new file mode 100755
index 0000000..6356425
--- a/dev/null
+++ b/system/droidvold/Android.mk
@@ -0,0 +1,73 @@
+LOCAL_PATH:= $(call my-dir)
+
+common_src_files := \
+ VolumeManager.cpp \
+ DroidVold.cpp \
+ NetlinkManager.cpp \
+ NetlinkHandler.cpp \
+ Process.cpp \
+ fs/Ext4.cpp \
+ fs/Vfat.cpp \
+ fs/Ntfs.cpp \
+ fs/Exfat.cpp \
+ fs/Hfsplus.cpp \
+ fs/Iso9660.cpp \
+ fs/Sdcardfs.cpp \
+ Disk.cpp \
+ VolumeBase.cpp \
+ PublicVolume.cpp \
+ ResponseCode.cpp \
+ Utils.cpp
+
+common_c_includes := \
+ system/libhidl/transport/include/hidl \
+ external/libcxx/include
+
+common_shared_libraries := \
+ vendor.amlogic.hardware.droidvold@1.0_vendor \
+ libhidlbase \
+ libhidltransport \
+ libsysutils \
+ libcutils \
+ liblog \
+ liblogwrap \
+ libext4_utils \
+ libselinux \
+ libutils \
+ libbinder \
+ libbase \
+ libext2_blkid \
+ libext2fs \
+ libext2_com_err \
+ libext2_e2p
+
+
+common_static_libraries := \
+ libfs_mgr \
+
+vold_conlyflags := -std=c11
+vold_cflags := -W -Wall -Wno-missing-field-initializers -Wno-unused-variable -Wno-unused-parameter
+
+include $(CLEAR_VARS)
+
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_MODULE := droidvold
+LOCAL_CLANG := true
+LOCAL_SRC_FILES := \
+ main.cpp \
+ $(common_src_files)
+
+LOCAL_INIT_RC := droidvold.rc
+
+LOCAL_C_INCLUDES := $(common_c_includes)
+LOCAL_CFLAGS := $(vold_cflags)
+LOCAL_CFLAGS += -DHAS_NTFS_3G
+LOCAL_CFLAGS += -DHAS_VIRTUAL_CDROM
+LOCAL_CONLYFLAGS := $(vold_conlyflags)
+
+LOCAL_SHARED_LIBRARIES := $(common_shared_libraries)
+LOCAL_STATIC_LIBRARIES := $(common_static_libraries)
+
+LOCAL_PROPRIETARY_MODULE := true
+
+include $(BUILD_EXECUTABLE)
diff --git a/system/droidvold/Disk.cpp b/system/droidvold/Disk.cpp
new file mode 100755
index 0000000..8bd3e41
--- a/dev/null
+++ b/system/droidvold/Disk.cpp
@@ -0,0 +1,593 @@
+/*
+ * Copyright (C) 2015 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 "Disk.h"
+#include "PublicVolume.h"
+#include "Utils.h"
+#include "VolumeBase.h"
+#include "VolumeManager.h"
+#include "ResponseCode.h"
+
+#include <android-base/file.h>
+#include <android-base/stringprintf.h>
+#include <android-base/logging.h>
+
+#include <vector>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <sys/sysmacros.h>
+
+using android::base::ReadFileToString;
+using android::base::WriteStringToFile;
+using android::base::StringPrintf;
+
+namespace android {
+namespace droidvold {
+
+static const char* kSgdiskPath = "/system/bin/sgdisk";
+static const char* kSgdiskToken = " \t\n";
+
+static const char* kSysfsMmcMaxMinors = "/sys/module/mmcblk/parameters/perdev_minors";
+
+static const unsigned int kMajorBlockScsiA = 8;
+static const unsigned int kMajorBlockSr = 11;
+static const unsigned int kMajorBlockScsiB = 65;
+static const unsigned int kMajorBlockScsiC = 66;
+static const unsigned int kMajorBlockScsiD = 67;
+static const unsigned int kMajorBlockScsiE = 68;
+static const unsigned int kMajorBlockScsiF = 69;
+static const unsigned int kMajorBlockScsiG = 70;
+static const unsigned int kMajorBlockScsiH = 71;
+static const unsigned int kMajorBlockScsiI = 128;
+static const unsigned int kMajorBlockScsiJ = 129;
+static const unsigned int kMajorBlockScsiK = 130;
+static const unsigned int kMajorBlockScsiL = 131;
+static const unsigned int kMajorBlockScsiM = 132;
+static const unsigned int kMajorBlockScsiN = 133;
+static const unsigned int kMajorBlockScsiO = 134;
+static const unsigned int kMajorBlockScsiP = 135;
+static const unsigned int kMajorBlockMmc = 179;
+static const unsigned int kMajorBlockExperimentalMin = 240;
+static const unsigned int kMajorBlockExperimentalMax = 254;
+
+static const char* kGptBasicData = "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7";
+static const char* kGptAndroidMeta = "19A710A2-B3CA-11E4-B026-10604B889DCF";
+static const char* kGptAndroidExpand = "193D1EA4-B3CA-11E4-B075-10604B889DCF";
+
+enum class Table {
+ kUnknown,
+ kMbr,
+ kGpt,
+};
+
+static bool isVirtioBlkDevice(unsigned int major) {
+ /*
+ * The new emulator's "ranchu" virtual board no longer includes a goldfish
+ * MMC-based SD card device; instead, it emulates SD cards with virtio-blk,
+ * which has been supported by upstream kernel and QEMU for quite a while.
+ * Unfortunately, the virtio-blk block device driver does not use a fixed
+ * major number, but relies on the kernel to assign one from a specific
+ * range of block majors, which are allocated for "LOCAL/EXPERIMENAL USE"
+ * per Documentation/devices.txt. This is true even for the latest Linux
+ * kernel (4.4; see init() in drivers/block/virtio_blk.c).
+ *
+ * This makes it difficult for vold to detect a virtio-blk based SD card.
+ * The current solution checks two conditions (both must be met):
+ *
+ * a) If the running environment is the emulator;
+ * b) If the major number is an experimental block device major number (for
+ * x86/x86_64 3.10 ranchu kernels, virtio-blk always gets major number
+ * 253, but it is safer to match the range than just one value).
+ *
+ * Other conditions could be used, too, e.g. the hardware name should be
+ * "ranchu", the device's sysfs path should end with "/block/vd[d-z]", etc.
+ * But just having a) and b) is enough for now.
+ */
+ return IsRunningInEmulator() && major >= kMajorBlockExperimentalMin
+ && major <= kMajorBlockExperimentalMax;
+}
+
+Disk::Disk(const std::string& eventPath, dev_t device,
+ const std::string& nickname, const std::string& eventName, int flags):
+ mDevice(device), mSize(-1), mNickname(nickname), mFlags(flags), mCreated(
+ false), mJustPartitioned(false) {
+ mId = StringPrintf("disk:%u,%u", major(device), minor(device));
+ mEventPath = eventPath;
+ mDevName = eventName;
+ mSysPath = StringPrintf("/sys/%s", eventPath.c_str());
+ mDevPath = StringPrintf("/dev/block/%s", mDevName.c_str());
+
+ mSrdisk = (!strncmp(nickname.c_str(), "sr", 2)) ? true : false;
+}
+
+Disk::~Disk() {
+ CHECK(!mCreated);
+}
+
+std::shared_ptr<VolumeBase> Disk::findVolume(const std::string& id) {
+ for (auto vol : mVolumes) {
+ if (vol->getId() == id) {
+ return vol;
+ }
+ auto stackedVol = vol->findVolume(id);
+ if (stackedVol != nullptr) {
+ return stackedVol;
+ }
+ }
+ return nullptr;
+}
+
+std::shared_ptr<VolumeBase> Disk::findVolumeByPath(const std::string& path) {
+ for (auto vol : mVolumes) {
+ if (vol->getPath() == path) {
+ return vol;
+ }
+ }
+ return nullptr;
+}
+
+void Disk::listVolumes(VolumeBase::Type type, std::list<std::string>& list) {
+ for (auto vol : mVolumes) {
+ if (vol->getType() == type) {
+ list.push_back(vol->getId());
+ }
+ // TODO: consider looking at stacked volumes
+ }
+}
+
+status_t Disk::create() {
+ CHECK(!mCreated);
+ mCreated = true;
+ notifyEvent(ResponseCode::DiskCreated, StringPrintf("%d", mFlags));
+
+ // do nothing when srdisk is created
+ if (mSrdisk)
+ return OK;
+
+ readDiskMetadata();
+ // sleep 10ms
+ usleep(10000);
+
+ std::string fsType;
+ std::string unused;
+
+ // if no partition, handle here
+ if (ReadPartMetadata(mDevPath, fsType, unused, unused) == OK) {
+ if (!fsType.empty()) {
+ if (VolumeManager::Instance()->getDebug())
+ LOG(DEBUG) << "treat entire disk as partition, devPath=" << mDevPath;
+ createPublicVolume(mDevName, true, 0);
+ }
+ }
+
+ return OK;
+}
+
+status_t Disk::reset() {
+ CHECK(!mCreated);
+ mCreated = true;
+ notifyEvent(ResponseCode::DiskCreated, StringPrintf("%d", mFlags));
+
+ // do nothing when srdisk is created
+ if (mSrdisk)
+ return OK;
+
+ readDiskMetadata();
+
+ if (mPartNo.size() == 0) {
+ createPublicVolume(mDevName, true, 0);
+ } else {
+ std::string partDevName;
+ for (auto part : mPartNo) {
+ if (mFlags & Flags::kUsb)
+ partDevName = StringPrintf("%s%d", mDevName.c_str(), part);
+ else if (mFlags & Flags::kSd)
+ partDevName = StringPrintf("%sp%d", mDevName.c_str(), part);
+
+ createPublicVolume(partDevName, false, part);
+ }
+ }
+
+
+ return OK;
+}
+
+status_t Disk::destroy() {
+ CHECK(mCreated);
+ destroyAllVolumes();
+ notifyEvent(ResponseCode::DiskDestroyed);
+ mCreated = false;
+ return OK;
+}
+
+void Disk::handleJustPublicPhysicalDevice(
+ const std::string& physicalDevName) {
+ auto vol = std::shared_ptr<VolumeBase>(new PublicVolume(physicalDevName, true));
+ if (mJustPartitioned) {
+ LOG(DEBUG) << "Device just partitioned; silently formatting";
+ vol->setSilent(true);
+ vol->create();
+ vol->format("auto");
+ vol->destroy();
+ vol->setSilent(false);
+ }
+
+ mVolumes.push_back(vol);
+ vol->setDiskId(getId());
+ vol->setSysPath(getSysPath());
+ vol->create();
+ //vol->mount();
+}
+
+void Disk::createPublicVolume(const std::string& partDevName,
+ const bool isPhysical, int part) {
+ auto vol = std::shared_ptr<VolumeBase>(new PublicVolume(partDevName, isPhysical));
+ if (mJustPartitioned) {
+ LOG(DEBUG) << "Device just partitioned; silently formatting";
+ vol->setSilent(true);
+ vol->create();
+ vol->format("auto");
+ vol->destroy();
+ vol->setSilent(false);
+ }
+
+ mVolumes.push_back(vol);
+ vol->setDiskId(getId());
+ vol->setSysPath(getSysPath());
+ vol->setDiskFlags(mFlags);
+ vol->setPartNo(part);
+
+ vol->create();
+ //vol->mount();
+}
+
+void Disk::destroyAllVolumes() {
+ for (auto vol : mVolumes) {
+ vol->destroy();
+ }
+ mVolumes.clear();
+}
+
+status_t Disk::readDiskMetadata() {
+ mSize = -1;
+ mLabel.clear();
+
+ int fd = open(mDevPath.c_str(), O_RDONLY | O_CLOEXEC);
+ if (fd != -1) {
+ if (ioctl(fd, BLKGETSIZE64, &mSize)) {
+ mSize = -1;
+ }
+ close(fd);
+ }
+
+ unsigned int majorId = major(mDevice);
+ switch (majorId) {
+ case kMajorBlockSr:
+ case kMajorBlockScsiA: case kMajorBlockScsiB: case kMajorBlockScsiC: case kMajorBlockScsiD:
+ case kMajorBlockScsiE: case kMajorBlockScsiF: case kMajorBlockScsiG: case kMajorBlockScsiH:
+ case kMajorBlockScsiI: case kMajorBlockScsiJ: case kMajorBlockScsiK: case kMajorBlockScsiL:
+ case kMajorBlockScsiM: case kMajorBlockScsiN: case kMajorBlockScsiO: case kMajorBlockScsiP: {
+ std::string path(mSysPath + "/device/vendor");
+ std::string tmp;
+ if (!ReadFileToString(path, &tmp)) {
+ PLOG(WARNING) << "Failed to read vendor from " << path;
+ return -errno;
+ }
+ mLabel = tmp;
+ break;
+ }
+ case kMajorBlockMmc: {
+ std::string path(mSysPath + "/device/manfid");
+ std::string tmp;
+ if (!ReadFileToString(path, &tmp)) {
+ PLOG(WARNING) << "Failed to read manufacturer from " << path;
+ return -errno;
+ }
+ uint64_t manfid = strtoll(tmp.c_str(), nullptr, 16);
+ // Our goal here is to give the user a meaningful label, ideally
+ // matching whatever is silk-screened on the card. To reduce
+ // user confusion, this list doesn't contain white-label manfid.
+ switch (manfid) {
+ case 0x000003: mLabel = "SanDisk"; break;
+ case 0x00001b: mLabel = "Samsung"; break;
+ case 0x000028: mLabel = "Lexar"; break;
+ case 0x000074: mLabel = "Transcend"; break;
+ }
+ break;
+ }
+ default: {
+ if (isVirtioBlkDevice(majorId)) {
+ LOG(DEBUG) << "Recognized experimental block major ID " << majorId
+ << " as virtio-blk (emulator's virtual SD card device)";
+ mLabel = "Virtual";
+ break;
+ }
+ LOG(WARNING) << "Unsupported block major type " << majorId;
+ return -ENOTSUP;
+ }
+ }
+
+ notifyEvent(ResponseCode::DiskSizeChanged, StringPrintf("%" PRIu64, mSize));
+ notifyEvent(ResponseCode::DiskLabelChanged, mLabel);
+ notifyEvent(ResponseCode::DiskSysPathChanged, mSysPath);
+ return OK;
+}
+
+void Disk::handleBlockEvent(NetlinkEvent *evt) {
+ std::string eventPath(evt->findParam("DEVPATH")?evt->findParam("DEVPATH"):"");
+ std::string devName(evt->findParam("DEVNAME")?evt->findParam("DEVNAME"):"");
+ std::string devType(evt->findParam("DEVTYPE")?evt->findParam("DEVTYPE"):"");
+
+ // can we handle this event
+ if (eventPath.find(mEventPath) == std::string::npos) {
+ LOG(DEBUG) << "evt will handle by other disk " << mEventPath;
+ return;
+ }
+
+ if (devType != "partition") {
+ LOG(DEBUG) << "evt type is not partition " << devType;
+ evt->dump();
+ return;
+ }
+
+ std::string partDevName;
+ switch (evt->getAction()) {
+ case NetlinkEvent::Action::kAdd: {
+ int part = atoi(evt->findParam("PARTN"));
+
+ mPartNo.push_back(part);
+ if (mFlags & Flags::kUsb)
+ partDevName = StringPrintf("%s%d", mDevName.c_str(), part);
+ else if (mFlags & Flags::kSd)
+ partDevName = StringPrintf("%sp%d", mDevName.c_str(), part);
+
+ LOG(INFO) << " partDevName =" << partDevName;
+ createPublicVolume(partDevName, false, part);
+ break;
+ }
+ case NetlinkEvent::Action::kChange: {
+ // ignore
+ LOG(DEBUG) << "Disk at " << mDevPath << " changed";
+ break;
+ }
+ case NetlinkEvent::Action::kRemove: {
+ // will handle by vm
+ break;
+ }
+ default: {
+ LOG(WARNING) << "Unexpected block event action " << (int) evt->getAction();
+ break;
+ }
+ }
+}
+
+#if 0
+status_t Disk::readPartitions() {
+ if (mSrdisk) {
+ // srdisk has no partiton concept.
+ LOG(INFO) << "srdisk try entire disk as fake partition";
+ //createPublicVolume(mDevice);
+ return OK;
+ }
+
+ int8_t maxMinors = getMaxMinors();
+ if (maxMinors < 0) {
+ return -ENOTSUP;
+ }
+
+ destroyAllVolumes();
+
+ // Parse partition table
+
+ std::vector<std::string> cmd;
+ cmd.push_back(kSgdiskPath);
+ cmd.push_back("--android-dump");
+ cmd.push_back(mDevPath);
+
+ std::vector<std::string> output;
+ status_t res = ForkExecvp(cmd, output);
+ if (res != OK) {
+ LOG(WARNING) << "sgdisk failed to scan " << mDevPath;
+ notifyEvent(ResponseCode::DiskScanned);
+ mJustPartitioned = false;
+ return res;
+ }
+
+ Table table = Table::kUnknown;
+ bool foundParts = false;
+ std::string physicalDevName, partDevName;
+ for (auto line : output) {
+ char* cline = (char*) line.c_str();
+ char* token = strtok(cline, kSgdiskToken);
+ if (token == nullptr) continue;
+
+ if (!strcmp(token, "DISK")) {
+ const char* type = strtok(nullptr, kSgdiskToken);
+ if (!strcmp(type, "mbr")) {
+ table = Table::kMbr;
+ } else if (!strcmp(type, "gpt")) {
+ table = Table::kGpt;
+ }
+ } else if (!strcmp(token, "PART")) {
+ foundParts = true;
+ int i = strtol(strtok(nullptr, kSgdiskToken), nullptr, 10);
+ if (i <= 0 || i > maxMinors) {
+ LOG(WARNING) << mId << " is ignoring partition " << i
+ << " beyond max supported devices";
+ continue;
+ }
+ dev_t partDevice = makedev(major(mDevice), minor(mDevice) + i);
+
+ if (mFlags & Flags::kUsb)
+ partDevName = StringPrintf("%s%d", mDevName.c_str(), i);
+ else if (mFlags & Flags::kSd)
+ partDevName = StringPrintf("%sp%d", mDevName.c_str(), i);
+ LOG(INFO) << " partDevName =" << partDevName;
+
+ if (table == Table::kMbr) {
+ const char* type = strtok(nullptr, kSgdiskToken);
+
+ if (IsJustPhysicalDevice(mSysPath, physicalDevName)) {
+ LOG(INFO) << " here,we don't create public:xx,xx for physical device only!";
+ handleJustPublicPhysicalDevice(physicalDevName);
+ break;
+ }
+
+ // support mort than 16 partitions
+ if (i > 15)
+ getPhysicalDev(partDevice, mSysPath, i);
+
+ switch (strtol(type, nullptr, 16)) {
+ case 0x06: // FAT16
+ case 0x0b: // W95 FAT32 (LBA)
+ case 0x0c: // W95 FAT32 (LBA)
+ case 0x0e: // W95 FAT16 (LBA)
+
+ case 0x07: // NTFS & EXFAT
+ createPublicVolume(partDevName, false);
+ break;
+
+ default:
+ // We should still create public volume here
+ // cause some disk table types are not matched above
+ // but can be mounted successfully
+ createPublicVolume(partDevName, false);
+ LOG(WARNING) << "unsupported table kMbr type " << type;
+ break;
+ }
+ } else if (table == Table::kGpt) {
+ const char* typeGuid = strtok(nullptr, kSgdiskToken);
+ const char* partGuid = strtok(nullptr, kSgdiskToken);
+
+ if (!strcasecmp(typeGuid, kGptBasicData)) {
+ createPublicVolume(partDevName, false);
+ }
+ }
+ }
+ }
+
+ // Ugly last ditch effort, treat entire disk as partition
+ if (table == Table::kUnknown || !foundParts) {
+ LOG(WARNING) << mId << " has unknown partition table; trying entire device";
+
+ std::string fsType;
+ std::string unused;
+ if (ReadPartMetadata(mDevPath, fsType, unused, unused) == OK) {
+ if (IsJustPhysicalDevice(mSysPath, physicalDevName)) {
+ handleJustPublicPhysicalDevice(physicalDevName);
+ } else {
+ createPublicVolume(partDevName, false);
+ }
+ } else {
+ LOG(WARNING) << mId << " failed to identify, giving up";
+ }
+ }
+
+ notifyEvent(ResponseCode::DiskScanned);
+ mJustPartitioned = false;
+ return OK;
+}
+#endif
+
+status_t Disk::unmountAll() {
+ for (auto vol : mVolumes) {
+ vol->unmount();
+ }
+ return OK;
+}
+
+void Disk::notifyEvent(int event) {
+ VolumeManager::Instance()->getBroadcaster()->sendBroadcast(event,
+ getId());
+}
+
+void Disk::notifyEvent(int event, const std::string& value) {
+ VolumeManager::Instance()->getBroadcaster()->sendBroadcast(event,
+ StringPrintf("%s %s", getId().c_str(), value.c_str()));
+}
+
+
+bool Disk::isSrdiskMounted() {
+ if (!mSrdisk) {
+ return false;
+ }
+
+ for (auto vol : mVolumes) {
+ return vol->isSrdiskMounted();
+ }
+
+ return false;
+}
+
+int Disk::getMaxMinors() {
+ // Figure out maximum partition devices supported
+ unsigned int majorId = major(mDevice);
+ switch (majorId) {
+ case kMajorBlockScsiA: case kMajorBlockScsiB: case kMajorBlockScsiC: case kMajorBlockScsiD:
+ case kMajorBlockScsiE: case kMajorBlockScsiF: case kMajorBlockScsiG: case kMajorBlockScsiH:
+ case kMajorBlockScsiI: case kMajorBlockScsiJ: case kMajorBlockScsiK: case kMajorBlockScsiL:
+ case kMajorBlockScsiM: case kMajorBlockScsiN: case kMajorBlockScsiO: case kMajorBlockScsiP: {
+ // Per Documentation/devices.txt this is static
+ return 31;
+ }
+ case kMajorBlockMmc: {
+ // Per Documentation/devices.txt this is dynamic
+ std::string tmp;
+ if (!ReadFileToString(kSysfsMmcMaxMinors, &tmp)) {
+ LOG(ERROR) << "Failed to read max minors";
+ return -errno;
+ }
+ return atoi(tmp.c_str());
+ }
+ default: {
+ if (isVirtioBlkDevice(majorId)) {
+ // drivers/block/virtio_blk.c has "#define PART_BITS 4", so max is
+ // 2^4 - 1 = 15
+ return 15;
+ }
+ }
+ }
+
+ LOG(ERROR) << "Unsupported block major type " << majorId;
+ return -ENOTSUP;
+}
+
+void Disk::getPhysicalDev(dev_t &device, const std:: string& sysPath, int part) {
+ std::string smajor, sminor;
+ std::string physicalDev, lpDev;
+ int major, minor;
+
+ if (part <= 15)
+ return;
+
+ if (GetPhysicalDevice(sysPath, physicalDev) == OK) {
+ lpDev = StringPrintf("%s%d", physicalDev.c_str(), part);
+ if (!access(lpDev.c_str(), F_OK) &&
+ readBlockDevMajorAndMinor(lpDev, smajor, sminor) == OK) {
+ major = atoi(smajor.c_str());
+ minor = atoi(sminor.c_str());
+ device = makedev(major, minor);
+ }
+ }
+}
+
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/Disk.h b/system/droidvold/Disk.h
new file mode 100755
index 0000000..a623a62
--- a/dev/null
+++ b/system/droidvold/Disk.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2015 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_VOLD_DISK_H
+#define ANDROID_VOLD_DISK_H
+
+#include "Utils.h"
+#include "VolumeBase.h"
+
+#include <utils/Errors.h>
+#include <sysutils/NetlinkEvent.h>
+
+#include <vector>
+
+namespace android {
+namespace droidvold {
+
+class VolumeBase;
+
+/*
+ * Representation of detected physical media.
+ *
+ * Knows how to create volumes based on the partition tables found, and also
+ * how to repartition itself.
+ */
+class Disk {
+public:
+ Disk(const std::string& eventPath, dev_t device, const std::string& nickname,
+ const std::string& eventName, int flags);
+ virtual ~Disk();
+
+ enum Flags {
+ /* Flag that disk is adoptable */
+ kAdoptable = 1 << 0,
+ /* Flag that disk is considered primary when the user hasn't
+ * explicitly picked a primary storage location */
+ kDefaultPrimary = 1 << 1,
+ /* Flag that disk is SD card */
+ kSd = 1 << 2,
+ /* Flag that disk is USB disk */
+ kUsb = 1 << 3,
+ /* Flag that disk is EMMC internal */
+ kEmmc = 1 << 4,
+ };
+
+ const std::string& getId() { return mId; }
+ const std::string& getEventPath() { return mEventPath; }
+ const std::string& getSysPath() { return mSysPath; }
+ const std::string& getDevPath() { return mDevPath; }
+ dev_t getDevice() { return mDevice; }
+ uint64_t getSize() { return mSize; }
+ const std::string& getLabel() { return mLabel; }
+ int getFlags() { return mFlags; }
+
+ std::shared_ptr<VolumeBase> findVolume(const std::string& id);
+ std::shared_ptr<VolumeBase> findVolumeByPath(const std::string& path);
+
+ void listVolumes(VolumeBase::Type type, std::list<std::string>& list);
+
+ status_t create();
+ status_t destroy();
+
+ status_t readDiskMetadata();
+ status_t readPartitions();
+
+ status_t unmountAll();
+
+ bool isSrdiskMounted();
+ void notifyEvent(int msg);
+ void notifyEvent(int msg, const std::string& value);
+ void destroyAllVolumes();
+
+ void handleBlockEvent(NetlinkEvent *evt);
+ status_t reset();
+
+private:
+ /* ID that uniquely references this disk */
+ std::string mId;
+ /* Original event path */
+ std::string mEventPath;
+ /* Device path under sysfs */
+ std::string mSysPath;
+ /* Device path under dev */
+ std::string mDevPath;
+
+ std::string mDevName;
+ /* Kernel device representing disk */
+ dev_t mDevice;
+ /* Size of disk, in bytes */
+ uint64_t mSize;
+ /* User-visible label, such as manufacturer */
+ std::string mLabel;
+ /* Current partitions on disk */
+ std::vector<std::shared_ptr<VolumeBase>> mVolumes;
+ /* Nickname for this disk */
+ std::string mNickname;
+ /* Flags applicable to this disk */
+ int mFlags;
+ /* Flag indicating object is created */
+ bool mCreated;
+ /* Flag that we just partitioned and should format all volumes */
+ bool mJustPartitioned;
+ /* Flag indicating is srdisk or not */
+ bool mSrdisk;
+
+ std::vector<int> mPartNo;
+
+ void createPublicVolume(const std::string& partDevName,
+ const bool isPhysical, int part);
+ void createPrivateVolume(dev_t device, const std::string& partGuid);
+ void handleJustPublicPhysicalDevice(const std::string& physicalDevName);
+ void getPhysicalDev(dev_t &device, const std:: string& sysPath, int part);
+
+ int getMaxMinors();
+
+ DISALLOW_COPY_AND_ASSIGN(Disk);
+};
+
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/DroidVold.cpp b/system/droidvold/DroidVold.cpp
new file mode 100755
index 0000000..a1db38f
--- a/dev/null
+++ b/system/droidvold/DroidVold.cpp
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2016 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 "DroidVold.h"
+
+#define LOG_TAG "DroidVold"
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+#include <cutils/fs.h>
+#include <cutils/log.h>
+
+#include "VolumeManager.h"
+
+namespace vendor {
+namespace amlogic {
+namespace hardware {
+namespace droidvold {
+namespace V1_0 {
+namespace implementation {
+
+DroidVold *sInstance;
+
+DroidVold *DroidVold::Instance() {
+ if (!sInstance)
+ sInstance = new DroidVold();
+ return sInstance;
+}
+
+DroidVold::DroidVold() {
+ mCallback = NULL;
+}
+
+DroidVold::~DroidVold() {
+}
+
+Return<void> DroidVold::setCallback(const sp<IDroidVoldCallback>& callback) {
+ if (VolumeManager::Instance()->getDebug())
+ LOG(DEBUG) << "setCallback =" << callback.get();
+
+ /*
+ if (callback != NULL) {
+ mClients.push_back(callback);
+ }
+ */
+
+ mCallback = callback;
+ return Void();
+}
+
+Return<Result> DroidVold::reset() {
+ VolumeManager *vm = VolumeManager::Instance();
+ vm->reset();
+ return Result::OK;
+}
+
+Return<Result> DroidVold::shutdown() {
+ VolumeManager *vm = VolumeManager::Instance();
+ vm->shutdown();
+ return Result::OK;
+}
+
+Return<Result> DroidVold::mount(const hidl_string& id, uint32_t flag, uint32_t uid) {
+ // mount [volId] [flags]
+ if (VolumeManager::Instance()->getDebug())
+ LOG(DEBUG) << "mount id=" << id << " flag=" << flag;
+
+ VolumeManager *vm = VolumeManager::Instance();
+ std::string vid = id;
+
+#ifdef HAS_VIRTUAL_CDROM
+ // is loop volume
+ if (flag == 0xF) {
+ if (vm->mountloop(vid.c_str())) {
+ LOG(ERROR) << " mount loop error!";
+ return Result::FAIL;
+ }
+ return Result::OK;
+ }
+#endif
+
+ auto vol = vm->findVolume(vid);
+ if (vol == nullptr) {
+ LOG(ERROR) << "mount ,count not find volume id=" << vid;
+ return Result::FAIL;
+ }
+
+ vol->setMountFlags(flag);
+ vol->setMountUserId(uid);
+
+ int res = vol->mount();
+ if (res != 0) {
+ LOG(ERROR) << "failed to mount volume=" << vol;
+ return Result::FAIL;
+ }
+
+ return Result::OK;
+}
+
+Return<Result> DroidVold::unmount(const hidl_string& id) {
+ // unmount [volId]
+ VolumeManager *vm = VolumeManager::Instance();
+ std::string vid = id;
+
+#ifdef HAS_VIRTUAL_CDROM
+ if (vid.find("/mnt/loop") != std::string::npos) {
+ if (vm->unmountloop(true)) {
+ LOG(ERROR) << "unmount loop error!";
+ return Result::FAIL;
+ }
+ return Result::OK;
+ }
+#endif
+
+ auto vol = vm->findVolume(vid);
+ if (vol == nullptr) {
+ LOG(ERROR) << "unmount, count not find volume id=" << vid;
+ return Result::FAIL;
+ }
+
+ int res = vol->unmount();
+
+ if (res != 0) {
+ LOG(ERROR) << "failed to unmount volume=" << vol;
+ return Result::FAIL;
+ }
+
+ return Result::OK;
+}
+
+Return<Result> DroidVold::format(const hidl_string& id, const hidl_string& type) {
+ // format [volId] [fsType|auto]
+ VolumeManager *vm = VolumeManager::Instance();
+ std::string vid = id;
+ std::string fsType= type;
+ auto vol = vm->findVolume(id);
+
+ if (vol == nullptr) {
+ LOG(ERROR) << "format, count not find volume id=" << vid;
+ return Result::FAIL;
+ }
+
+ int res = vol->format(fsType);
+
+ if (res != 0) {
+ LOG(ERROR) << "failed to unmount volume=" << vol;
+ return Result::FAIL;
+ }
+
+ return Result::OK;
+}
+
+void DroidVold::sendBroadcast(int event, const std::string& message) {
+ if (VolumeManager::Instance()->getDebug())
+ LOG(DEBUG) << "event=" << event << " message=" << message;
+
+ hidl_string mss = message;
+ if (mCallback != NULL)
+ mCallback->onEvent(event, mss);
+
+ /*
+ for (int i = 0; i < clientSize; i++) {
+ mClients[i]->onEvent(event, mss);
+ }
+ for (auto client : mClients) {
+ client->onEvent(event, mss);
+ }
+ */
+}
+
+Return<int32_t> DroidVold::getDiskFlag(const hidl_string &path) {
+ int32_t flag = 0;
+ std::string mPath = path;
+
+ flag = VolumeManager::Instance()->getDiskFlag(mPath);
+
+ return flag;
+}
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace droidvold
+} // namespace hardware
+} // namespace amlogic
+} // namespace vendor
diff --git a/system/droidvold/DroidVold.h b/system/droidvold/DroidVold.h
new file mode 100755
index 0000000..0c576cf
--- a/dev/null
+++ b/system/droidvold/DroidVold.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2016 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 VENDOR_AMLOGIC_HARDWARE_DROIDVOLD_V1_0_DROIDVOLD_H
+#define VENDOR_AMLOGIC_HARDWARE_DROIDVOLD_V1_0_DROIDVOLD_H
+
+#include <vendor/amlogic/hardware/droidvold/1.0/IDroidVold.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+
+#include <utils/Mutex.h>
+#include <vector>
+
+namespace vendor {
+namespace amlogic {
+namespace hardware {
+namespace droidvold {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::hidl::base::V1_0::DebugInfo;
+using ::android::hidl::base::V1_0::IBase;
+using ::vendor::amlogic::hardware::droidvold::V1_0::IDroidVold;
+using ::vendor::amlogic::hardware::droidvold::V1_0::IDroidVoldCallback;
+using ::vendor::amlogic::hardware::droidvold::V1_0::Result;
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+class DroidVold : public IDroidVold {
+public:
+ DroidVold();
+ virtual ~DroidVold();
+
+ // Methods from ::vendor::amlogic::hardware::droidvold::V1_0::IDroidVold follow.
+ Return<void> setCallback(const sp<IDroidVoldCallback>& callback) override;
+ Return<Result> reset() override;
+ Return<Result> shutdown() override;
+ Return<Result> mount(const hidl_string& id, uint32_t flag, uint32_t uid) override;
+ Return<Result> unmount(const hidl_string& id) override;
+ Return<Result> format(const hidl_string& id, const hidl_string& type) override;
+ Return<int32_t> getDiskFlag(const hidl_string &path) override;
+
+ static DroidVold *Instance();
+ void sendBroadcast(int event, const std::string& message);
+
+private:
+ //std::vector<sp<IDroidVoldCallback>> mClients;
+ sp<IDroidVoldCallback> mCallback;
+ mutable android::Mutex mLock;
+};
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace droidvold
+} // namespace hardware
+} // namespace amlogic
+} // namespace vendor
+
+#endif // VENDOR_AMLOGIC_HARDWARE_DROIDVOLD_V1_0_DROIDVOLD_H
diff --git a/system/droidvold/NetlinkHandler.cpp b/system/droidvold/NetlinkHandler.cpp
new file mode 100755
index 0000000..5c3efc4
--- a/dev/null
+++ b/system/droidvold/NetlinkHandler.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#define LOG_TAG "droidVold"
+
+#include <cutils/log.h>
+
+#include <sysutils/NetlinkEvent.h>
+#include "NetlinkHandler.h"
+#include "VolumeManager.h"
+
+NetlinkHandler::NetlinkHandler(int listenerSocket) :
+ NetlinkListener(listenerSocket) {
+}
+
+NetlinkHandler::~NetlinkHandler() {
+}
+
+int NetlinkHandler::start() {
+ return this->startListener();
+}
+
+int NetlinkHandler::stop() {
+ return this->stopListener();
+}
+
+void NetlinkHandler::onEvent(NetlinkEvent *evt) {
+ VolumeManager *vm = VolumeManager::Instance();
+ const char *subsys = evt->getSubsystem();
+
+ if (!subsys) {
+ SLOGW("No subsystem found in netlink event");
+ return;
+ }
+
+ if (!strcmp(subsys, "block")) {
+ vm->handleBlockEvent(evt);
+ }
+}
diff --git a/system/droidvold/NetlinkHandler.h b/system/droidvold/NetlinkHandler.h
new file mode 100755
index 0000000..00a31c8
--- a/dev/null
+++ b/system/droidvold/NetlinkHandler.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008 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 _NETLINKHANDLER_H
+#define _NETLINKHANDLER_H
+
+#include <sysutils/NetlinkListener.h>
+
+class NetlinkHandler: public NetlinkListener {
+
+public:
+ NetlinkHandler(int listenerSocket);
+ virtual ~NetlinkHandler();
+
+ int start(void);
+ int stop(void);
+
+protected:
+ virtual void onEvent(NetlinkEvent *evt);
+};
+#endif
diff --git a/system/droidvold/NetlinkManager.cpp b/system/droidvold/NetlinkManager.cpp
new file mode 100755
index 0000000..177dba8
--- a/dev/null
+++ b/system/droidvold/NetlinkManager.cpp
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/un.h>
+
+#include <linux/netlink.h>
+
+#define LOG_TAG "droidVold"
+
+#include <cutils/log.h>
+
+#include "NetlinkManager.h"
+#include "NetlinkHandler.h"
+
+NetlinkManager *NetlinkManager::sInstance = NULL;
+
+NetlinkManager *NetlinkManager::Instance() {
+ if (!sInstance)
+ sInstance = new NetlinkManager();
+ return sInstance;
+}
+
+NetlinkManager::NetlinkManager() {
+ mBroadcaster = NULL;
+}
+
+NetlinkManager::~NetlinkManager() {
+}
+
+int NetlinkManager::start() {
+ struct sockaddr_nl nladdr;
+ int sz = 64 * 1024;
+ int on = 1;
+
+ memset(&nladdr, 0, sizeof(nladdr));
+ nladdr.nl_family = AF_NETLINK;
+ nladdr.nl_pid = getpid();
+ nladdr.nl_groups = 0xffffffff;
+
+ if ((mSock = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC,
+ NETLINK_KOBJECT_UEVENT)) < 0) {
+ SLOGE("Unable to create uevent socket: %s", strerror(errno));
+ return -1;
+ }
+
+ if (setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) {
+ SLOGE("Unable to set uevent socket SO_RCVBUFFORCE option: %s", strerror(errno));
+ goto out;
+ }
+
+ if (setsockopt(mSock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0) {
+ SLOGE("Unable to set uevent socket SO_PASSCRED option: %s", strerror(errno));
+ goto out;
+ }
+
+ if (bind(mSock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {
+ SLOGE("Unable to bind uevent socket: %s", strerror(errno));
+ goto out;
+ }
+
+ mHandler = new NetlinkHandler(mSock);
+ if (mHandler->start()) {
+ SLOGE("Unable to start NetlinkHandler: %s", strerror(errno));
+ goto out;
+ }
+
+ return 0;
+
+out:
+ close(mSock);
+ return -1;
+}
+
+int NetlinkManager::stop() {
+ int status = 0;
+
+ if (mHandler->stop()) {
+ SLOGE("Unable to stop NetlinkHandler: %s", strerror(errno));
+ status = -1;
+ }
+ delete mHandler;
+ mHandler = NULL;
+
+ close(mSock);
+ mSock = -1;
+
+ return status;
+}
diff --git a/system/droidvold/NetlinkManager.h b/system/droidvold/NetlinkManager.h
new file mode 100755
index 0000000..f123fa0
--- a/dev/null
+++ b/system/droidvold/NetlinkManager.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2008 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 _NETLINKMANAGER_H
+#define _NETLINKMANAGER_H
+
+#include <sysutils/SocketListener.h>
+#include <sysutils/NetlinkListener.h>
+#include "DroidVold.h"
+
+using namespace android;
+using ::vendor::amlogic::hardware::droidvold::V1_0::implementation::DroidVold;
+
+class NetlinkHandler;
+
+class NetlinkManager {
+private:
+ static NetlinkManager *sInstance;
+
+private:
+ DroidVold *mBroadcaster;
+ NetlinkHandler *mHandler;
+ int mSock;
+
+public:
+ virtual ~NetlinkManager();
+
+ int start();
+ int stop();
+
+ void setBroadcaster(DroidVold *sl) { mBroadcaster = sl; }
+ DroidVold *getBroadcaster() { return mBroadcaster; }
+
+ static NetlinkManager *Instance();
+
+private:
+ NetlinkManager();
+};
+#endif
diff --git a/system/droidvold/Process.cpp b/system/droidvold/Process.cpp
new file mode 100755
index 0000000..e68011e
--- a/dev/null
+++ b/system/droidvold/Process.cpp
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <pwd.h>
+#include <stdlib.h>
+#include <poll.h>
+#include <sys/stat.h>
+#include <signal.h>
+
+#define LOG_TAG "ProcessKiller"
+#include <cutils/log.h>
+
+#include "Process.h"
+
+int Process::readSymLink(const char *path, char *link, size_t max) {
+ struct stat s;
+ int length;
+
+ if (lstat(path, &s) < 0)
+ return 0;
+ if ((s.st_mode & S_IFMT) != S_IFLNK)
+ return 0;
+
+ // we have a symlink
+ length = readlink(path, link, max- 1);
+ if (length <= 0)
+ return 0;
+ link[length] = 0;
+ return 1;
+}
+
+int Process::pathMatchesMountPoint(const char* path, const char* mountPoint) {
+ int length = strlen(mountPoint);
+ if (length > 1 && strncmp(path, mountPoint, length) == 0) {
+ // we need to do extra checking if mountPoint does not end in a '/'
+ if (mountPoint[length - 1] == '/')
+ return 1;
+ // if mountPoint does not have a trailing slash, we need to make sure
+ // there is one in the path to avoid partial matches.
+ return (path[length] == 0 || path[length] == '/');
+ }
+
+ return 0;
+}
+
+void Process::getProcessName(int pid, char *buffer, size_t max) {
+ int fd;
+ snprintf(buffer, max, "/proc/%d/cmdline", pid);
+ fd = open(buffer, O_RDONLY | O_CLOEXEC);
+ if (fd < 0) {
+ strcpy(buffer, "???");
+ } else {
+ int length = read(fd, buffer, max - 1);
+ buffer[length] = 0;
+ close(fd);
+ }
+}
+
+int Process::checkFileDescriptorSymLinks(int pid, const char *mountPoint) {
+ return checkFileDescriptorSymLinks(pid, mountPoint, NULL, 0);
+}
+
+int Process::checkFileDescriptorSymLinks(int pid, const char *mountPoint, char *openFilename, size_t max) {
+
+
+ // compute path to process's directory of open files
+ char path[PATH_MAX];
+ sprintf(path, "/proc/%d/fd", pid);
+ DIR *dir = opendir(path);
+ if (!dir)
+ return 0;
+
+ // remember length of the path
+ int parent_length = strlen(path);
+ // append a trailing '/'
+ path[parent_length++] = '/';
+
+ struct dirent* de;
+ while ((de = readdir(dir))) {
+ if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")
+ || strlen(de->d_name) + parent_length + 1 >= PATH_MAX)
+ continue;
+
+ // append the file name, after truncating to parent directory
+ path[parent_length] = 0;
+ strcat(path, de->d_name);
+
+ char link[PATH_MAX];
+
+ if (readSymLink(path, link, sizeof(link)) && pathMatchesMountPoint(link, mountPoint)) {
+ if (openFilename) {
+ memset(openFilename, 0, max);
+ strlcpy(openFilename, link, max);
+ }
+ closedir(dir);
+ return 1;
+ }
+ }
+
+ closedir(dir);
+ return 0;
+}
+
+int Process::checkFileMaps(int pid, const char *mountPoint) {
+ return checkFileMaps(pid, mountPoint, NULL, 0);
+}
+
+int Process::checkFileMaps(int pid, const char *mountPoint, char *openFilename, size_t max) {
+ FILE *file;
+ char buffer[PATH_MAX + 100];
+
+ sprintf(buffer, "/proc/%d/maps", pid);
+ file = fopen(buffer, "r");
+ if (!file)
+ return 0;
+
+ while (fgets(buffer, sizeof(buffer), file)) {
+ // skip to the path
+ const char* path = strchr(buffer, '/');
+ if (path && pathMatchesMountPoint(path, mountPoint)) {
+ if (openFilename) {
+ memset(openFilename, 0, max);
+ strlcpy(openFilename, path, max);
+ }
+ fclose(file);
+ return 1;
+ }
+ }
+
+ fclose(file);
+ return 0;
+}
+
+int Process::checkSymLink(int pid, const char *mountPoint, const char *name) {
+ char path[PATH_MAX];
+ char link[PATH_MAX];
+
+ sprintf(path, "/proc/%d/%s", pid, name);
+ if (readSymLink(path, link, sizeof(link)) && pathMatchesMountPoint(link, mountPoint))
+ return 1;
+ return 0;
+}
+
+int Process::getPid(const char *s) {
+ int result = 0;
+ while (*s) {
+ if (!isdigit(*s)) return -1;
+ result = 10 * result + (*s++ - '0');
+ }
+ return result;
+}
+
+extern "C" void vold_killProcessesWithOpenFiles(const char *path, int signal) {
+ Process::killProcessesWithOpenFiles(path, signal);
+}
+
+/*
+ * Hunt down processes that have files open at the given mount point.
+ */
+int Process::killProcessesWithOpenFiles(const char *path, int signal) {
+ int count = 0;
+ DIR* dir;
+ struct dirent* de;
+
+ if (!(dir = opendir("/proc"))) {
+ SLOGE("opendir failed (%s)", strerror(errno));
+ return count;
+ }
+
+ while ((de = readdir(dir))) {
+ int pid = getPid(de->d_name);
+ char name[PATH_MAX];
+
+ if (pid == -1)
+ continue;
+ getProcessName(pid, name, sizeof(name));
+
+ char openfile[PATH_MAX];
+
+ if (checkFileDescriptorSymLinks(pid, path, openfile, sizeof(openfile))) {
+ SLOGE("Process %s (%d) has open file %s", name, pid, openfile);
+ } else if (checkFileMaps(pid, path, openfile, sizeof(openfile))) {
+ SLOGE("Process %s (%d) has open filemap for %s", name, pid, openfile);
+ } else if (checkSymLink(pid, path, "cwd")) {
+ SLOGE("Process %s (%d) has cwd within %s", name, pid, path);
+ } else if (checkSymLink(pid, path, "root")) {
+ SLOGE("Process %s (%d) has chroot within %s", name, pid, path);
+ } else if (checkSymLink(pid, path, "exe")) {
+ SLOGE("Process %s (%d) has executable path within %s", name, pid, path);
+ } else {
+ continue;
+ }
+
+ if (signal != 0) {
+ SLOGW("Sending %s to process %d", strsignal(signal), pid);
+ kill(pid, signal);
+ count++;
+ }
+ }
+ closedir(dir);
+ return count;
+}
diff --git a/system/droidvold/Process.h b/system/droidvold/Process.h
new file mode 100755
index 0000000..62a9313
--- a/dev/null
+++ b/system/droidvold/Process.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008 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 _PROCESS_H
+#define _PROCESS_H
+
+#ifdef __cplusplus
+
+class Process {
+public:
+ static int killProcessesWithOpenFiles(const char *path, int signal);
+ static int getPid(const char *s);
+ static int checkSymLink(int pid, const char *path, const char *name);
+ static int checkFileMaps(int pid, const char *path);
+ static int checkFileMaps(int pid, const char *path, char *openFilename, size_t max);
+ static int checkFileDescriptorSymLinks(int pid, const char *mountPoint);
+ static int checkFileDescriptorSymLinks(int pid, const char *mountPoint, char *openFilename, size_t max);
+ static void getProcessName(int pid, char *buffer, size_t max);
+private:
+ static int readSymLink(const char *path, char *link, size_t max);
+ static int pathMatchesMountPoint(const char *path, const char *mountPoint);
+};
+
+extern "C" {
+#endif /* __cplusplus */
+ void vold_killProcessesWithOpenFiles(const char *path, int signal);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/system/droidvold/PublicVolume.cpp b/system/droidvold/PublicVolume.cpp
new file mode 100755
index 0000000..a389993
--- a/dev/null
+++ b/system/droidvold/PublicVolume.cpp
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2015 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 "fs/Vfat.h"
+#include "fs/Ntfs.h"
+#include "fs/Exfat.h"
+#include "fs/Hfsplus.h"
+#include "fs/Iso9660.h"
+#include "fs/Ext4.h"
+#include "fs/Sdcardfs.h"
+#include "PublicVolume.h"
+#include "Utils.h"
+#include "VolumeManager.h"
+#include "ResponseCode.h"
+
+#include <android-base/stringprintf.h>
+#include <android-base/logging.h>
+#include <cutils/fs.h>
+#include <private/android_filesystem_config.h>
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/sysmacros.h>
+
+using android::base::StringPrintf;
+
+namespace android {
+namespace droidvold {
+
+static const char* kChownPath = "/system/bin/chown";
+
+PublicVolume::PublicVolume(const std::string& physicalDevName, const bool isPhysical) :
+ VolumeBase(Type::kPublic), mJustPhysicalDev(isPhysical) {
+ setId(physicalDevName);
+ mDevPath = StringPrintf("/dev/block/%s", getId().c_str());
+}
+
+PublicVolume::~PublicVolume() {
+}
+
+status_t PublicVolume::readMetadata() {
+ status_t res = ReadPartMetadata(mDevPath, mFsType, mFsUuid, mFsLabel);
+
+ if (VolumeManager::Instance()->getDebug())
+ LOG(DEBUG) << "blkid get devPath=" << mDevPath << " fsType= " << mFsType;
+
+ notifyEvent(ResponseCode::VolumeFsTypeChanged, mFsType);
+
+ // TODO: find the Uuid of srdisk
+ // If mFsUuid of publicVolume is empty,
+ // it will cause systemUi crash when it is mounted
+ if (mFsUuid.empty()) {
+ if (major(mDevice) == 11)
+ mFsUuid = "sr0";
+ else
+ mFsUuid = "fakeUuid";
+ }
+
+ notifyEvent(ResponseCode::VolumeFsUuidChanged, mFsUuid);
+ notifyEvent(ResponseCode::VolumeFsLabelChanged, mFsLabel);
+
+ return OK;
+}
+
+status_t PublicVolume::doCreate() {
+ return 0;
+}
+
+status_t PublicVolume::doDestroy() {
+ return 0;
+}
+
+status_t PublicVolume::doMount() {
+ // TODO: expand to support mounting other filesystems
+ readMetadata();
+
+ if (mFsType != "vfat" &&
+ mFsType != "ntfs" &&
+ mFsType != "exfat" &&
+ strncmp(mFsType.c_str(), "ext", 3) &&
+ mFsType != "hfs" &&
+ mFsType != "iso9660" &&
+ mFsType != "udf") {
+ LOG(ERROR) << getId() << " unsupported filesystem " << mFsType;
+ return -EIO;
+ }
+
+ // Use UUID as stable name, if available
+ std::string stableName = getId();
+ if (!mFsUuid.empty()) {
+ stableName = mFsUuid;
+ }
+ mRawPath = StringPrintf("/mnt/media_rw/%s", stableName.c_str());
+
+ mFuseDefault = StringPrintf("/mnt/runtime/default/%s", stableName.c_str());
+ mFuseRead = StringPrintf("/mnt/runtime/read/%s", stableName.c_str());
+ mFuseWrite = StringPrintf("/mnt/runtime/write/%s", stableName.c_str());
+
+
+ VolumeManager *vm = VolumeManager::Instance();
+
+ if (mFsType == "vfat") {
+#ifdef HAS_VFAT
+ sleep(5);
+ if (vm->isMountpointMounted(mRawPath.c_str())) {
+ LOG(DEBUG) << getId() << " vfat will handle by vold";
+ return 0;
+ }
+#else
+ LOG(DEBUG) << getId() << " vfat will handle by vold";
+ return 0;
+#endif
+ }
+
+ if (vm->isMountpointMounted(mRawPath.c_str())) {
+ LOG(ERROR) << " path:" << mRawPath << " is already mounted";
+ return -EIO;
+ }
+
+ setInternalPath(mRawPath);
+
+ if (getMountFlags() & MountFlags::kVisible) {
+ setPath(StringPrintf("/storage/%s", stableName.c_str()));
+ } else {
+ setPath(mRawPath);
+ }
+
+ if (prepareDir(mRawPath, 0700, AID_ROOT, AID_ROOT)) {
+ PLOG(ERROR) << getId() << " failed to create mount points";
+ return -errno;
+ }
+
+ if (prepareDir(mFuseDefault.c_str(), 0700, AID_ROOT, AID_ROOT) ||
+ prepareDir(mFuseRead.c_str(), 0700, AID_ROOT, AID_ROOT) ||
+ prepareDir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT)) {
+ rmdir(mRawPath.c_str());
+ PLOG(ERROR) << getId() << " failed to create FUSE mount points";
+ return -errno;
+ }
+
+
+ // Mount device
+ status_t mountStatus = -1;
+
+ if (mFsType == "vfat") {
+ mountStatus = vfat::Mount(mDevPath, mRawPath, false, false, false,
+ AID_MEDIA_RW, AID_MEDIA_RW, 0007, true);
+ } else if (mFsType == "ntfs") {
+ mountStatus = ntfs::Mount(mDevPath.c_str(), mRawPath.c_str(), false, false,
+ AID_MEDIA_RW, AID_MEDIA_RW, 0007, true);
+ } else if (mFsType == "exfat") {
+ mountStatus = exfat::Mount(mDevPath.c_str(), mRawPath.c_str(), false, false,
+ AID_MEDIA_RW, AID_MEDIA_RW, 0007, true);
+ } else if (!strncmp(mFsType.c_str(), "ext", 3)) {
+ mountStatus = ext4::Mount(mDevPath, mRawPath, false, false, true, mFsType);
+ } else if (mFsType == "hfs") {
+ mountStatus = hfsplus::Mount(mDevPath.c_str(), mRawPath.c_str(), false, false,
+ AID_MEDIA_RW, AID_MEDIA_RW, 0007, true);
+ } else if (mFsType == "iso9660" || mFsType == "udf") {
+ if ((mountStatus = iso9660::Mount(mDevPath.c_str(), mRawPath.c_str(), false, false,
+ AID_MEDIA_RW, AID_MEDIA_RW, 0007, true)) == 0)
+ mSrMounted = true;
+ }
+
+ if (mountStatus) {
+ PLOG(ERROR) << " failed to mount " << mDevPath << " as " << mFsType;
+ rmdir(mRawPath.c_str());
+ return -EIO;
+ } else {
+ LOG(INFO) << "successfully mount " << mDevPath << " as " << mFsType;
+ }
+
+ if (!strncmp(mFsType.c_str(), "ext", 3)) {
+ std::vector<std::string> cmd;
+ cmd.push_back(kChownPath);
+ cmd.push_back("-R");
+ cmd.push_back("media_rw:media_rw");
+ cmd.push_back(mRawPath);
+
+ std::vector<std::string> output;
+ status_t res = ForkExecvp(cmd, output);
+ if (res != OK) {
+ LOG(WARNING) << "chown failed " << mRawPath;
+ return res;
+ }
+
+ RestoreconRecursive(mRawPath);
+
+ LOG(VERBOSE) << "Finished restorecon of " << mRawPath;
+ }
+
+
+ // mount sdcardfs
+ if (getMountFlags() & MountFlags::kPrimary) {
+ sdcardfs::run_sdcardfs(mRawPath, stableName,
+ 1023, 1023, getMountUserId(), false, true);
+ } else {
+ sdcardfs::run_sdcardfs(mRawPath, stableName,
+ 1023, 1023, getMountUserId(), false, false);
+ }
+
+ return OK;
+}
+
+status_t PublicVolume::doUnmount() {
+ // Unmount the storage before we kill the FUSE process. If we kill
+ // the FUSE process first, most file system operations will return
+ // ENOTCONN until the unmount completes. This is an exotic and unusual
+ // error code and might cause broken behaviour in applications.
+ KillProcessesUsingPath(getPath());
+
+#ifdef HAS_VIRTUAL_CDROM
+ std::string stableName = getId();
+ if (!mFsUuid.empty()) {
+ stableName = mFsUuid;
+ }
+
+ VolumeManager *vm = VolumeManager::Instance();
+ vm->unmountLoopIfNeed(stableName.c_str());
+#endif
+
+ ForceUnmount(mFuseDefault);
+ ForceUnmount(mFuseRead);
+ ForceUnmount(mFuseWrite);
+ ForceUnmount(mRawPath);
+
+ rmdir(mFuseDefault.c_str());
+ rmdir(mFuseRead.c_str());
+ rmdir(mFuseWrite.c_str());
+ rmdir(mRawPath.c_str());
+
+ mFuseDefault.clear();
+ mFuseRead.clear();
+ mFuseWrite.clear();
+ mRawPath.clear();
+
+ return OK;
+}
+
+status_t PublicVolume::doFormat(const std::string& fsType) {
+ if (fsType == "vfat" || fsType == "auto") {
+ if (WipeBlockDevice(mDevPath) != OK) {
+ LOG(WARNING) << getId() << " failed to wipe";
+ }
+ if (vfat::Format(mDevPath, 0)) {
+ LOG(ERROR) << getId() << " failed to format";
+ return -errno;
+ }
+ } else {
+ LOG(ERROR) << "Unsupported filesystem " << fsType;
+ return -EINVAL;
+ }
+
+ return OK;
+}
+
+status_t PublicVolume::prepareDir(const std::string& path,
+ mode_t mode, uid_t uid, gid_t gid) {
+ if (fs_prepare_dir(path.c_str(), 0700, AID_ROOT, AID_ROOT)) {
+ if (errno == ENOTCONN) { // Transport endpoint is not connected
+ LOG(ERROR) << getId() << " failed to create mount point";
+ LOG(INFO) << "umount " << path << " and try again";
+ // lazy umount
+ if (!umount2(path.c_str(), MNT_DETACH) || errno == EINVAL || errno == ENOENT) {
+ if (fs_prepare_dir(path.c_str(), 0700, AID_ROOT, AID_ROOT)) {
+ return -1;
+ }
+ return OK;
+ }
+ PLOG(ERROR) << " failed to umount " << path;
+ return -1;
+ }
+ return -1;
+ }
+
+ return OK;
+}
+
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/PublicVolume.h b/system/droidvold/PublicVolume.h
new file mode 100755
index 0000000..b196a4d
--- a/dev/null
+++ b/system/droidvold/PublicVolume.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 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_VOLD_PUBLIC_VOLUME_H
+#define ANDROID_VOLD_PUBLIC_VOLUME_H
+
+#include "VolumeBase.h"
+
+#include <cutils/multiuser.h>
+
+namespace android {
+namespace droidvold {
+
+/*
+ * Shared storage provided by public (vfat) partition.
+ *
+ * Knows how to mount itself and then spawn a FUSE daemon to synthesize
+ * permissions. AsecVolume and ObbVolume can be stacked above it.
+ *
+ * This volume is not inherently multi-user aware, so it has two possible
+ * modes of operation:
+ * 1. If primary storage for the device, it only binds itself to the
+ * owner user.
+ * 2. If secondary storage, it binds itself for all users, but masks
+ * away the Android directory for secondary users.
+ */
+class PublicVolume : public VolumeBase {
+public:
+ explicit PublicVolume(const std::string& physicalDevName, const bool isPhysical);
+ virtual ~PublicVolume();
+
+protected:
+ status_t doCreate() override;
+ status_t doDestroy() override;
+ status_t doMount() override;
+ status_t doUnmount() override;
+ status_t doFormat(const std::string& fsType) override;
+ bool isSrdiskMounted() { return mSrMounted;}
+
+ status_t readMetadata();
+ status_t initAsecStage();
+ status_t prepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid);
+
+private:
+ /* Kernel device representing partition */
+ dev_t mDevice;
+ /* Block device path */
+ std::string mDevPath;
+ /* Mount point of raw partition */
+ std::string mRawPath;
+
+ std::string mFuseDefault;
+ std::string mFuseRead;
+ std::string mFuseWrite;
+
+ /* Filesystem type */
+ std::string mFsType;
+ /* Filesystem UUID */
+ std::string mFsUuid;
+ /* User-visible filesystem label */
+ std::string mFsLabel;
+
+ bool mSrMounted;
+
+ /* Just sd/udisk physical devices are used */
+ bool mJustPhysicalDev;
+
+ DISALLOW_COPY_AND_ASSIGN(PublicVolume);
+};
+
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/ResponseCode.cpp b/system/droidvold/ResponseCode.cpp
new file mode 100755
index 0000000..d7e778d
--- a/dev/null
+++ b/system/droidvold/ResponseCode.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#define LOG_TAG "Vold"
+
+#include <cutils/log.h>
+
+#include "ResponseCode.h"
+
+int ResponseCode::convertFromErrno() {
+ if (errno == ENODEV) {
+ return(ResponseCode::OpFailedNoMedia);
+ } else if (errno == ENODATA) {
+ return(ResponseCode::OpFailedMediaBlank);
+ } else if (errno == EIO) {
+ return(ResponseCode::OpFailedMediaCorrupt);
+ } else if (errno == EBUSY) {
+ return(ResponseCode::OpFailedStorageBusy);
+ } else if (errno == ENOENT) {
+ return(ResponseCode::OpFailedStorageNotFound);
+ }
+
+ SLOGW("Returning OperationFailed - no handler for errno %d", errno);
+ return(ResponseCode::OperationFailed);
+}
diff --git a/system/droidvold/ResponseCode.h b/system/droidvold/ResponseCode.h
new file mode 100755
index 0000000..52faf9a
--- a/dev/null
+++ b/system/droidvold/ResponseCode.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2008 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 _RESPONSECODE_H
+#define _RESPONSECODE_H
+
+class ResponseCode {
+public:
+ // 100 series - Requestion action was initiated; expect another reply
+ // before proceeding with a new command.
+ static const int ActionInitiated = 100;
+
+ static const int VolumeListResult = 110;
+
+ // 200 series - Requested action has been successfully completed
+ static const int CommandOkay = 200;
+ static const int ShareStatusResult = 210;
+
+ // 400 series - The command was accepted but the requested action
+ // did not take place.
+ static const int OperationFailed = 400;
+ static const int OpFailedNoMedia = 401;
+ static const int OpFailedMediaBlank = 402;
+ static const int OpFailedMediaCorrupt = 403;
+ static const int OpFailedVolNotMounted = 404;
+ static const int OpFailedStorageBusy = 405;
+ static const int OpFailedStorageNotFound = 406;
+
+ // 500 series - The command was not accepted and the requested
+ // action did not take place.
+ static const int CommandSyntaxError = 500;
+ static const int CommandParameterError = 501;
+ static const int CommandNoPermission = 502;
+
+ // 600 series - Unsolicited broadcasts
+ static const int UnsolicitedInformational = 600;
+ static const int VolumeStateChange = 605;
+ static const int VolumeMountFailedBlank = 610;
+ static const int VolumeMountFailedDamaged = 611;
+ static const int VolumeMountFailedNoMedia = 612;
+ static const int VolumeUuidChange = 613;
+ static const int VolumeUserLabelChange = 614;
+
+ static const int ShareAvailabilityChange = 620;
+
+ static const int VolumeDiskInserted = 630;
+ static const int VolumeDiskRemoved = 631;
+ static const int VolumeBadRemoval = 632;
+
+ static const int DiskCreated = 640;
+ static const int DiskSizeChanged = 641;
+ static const int DiskLabelChanged = 642;
+ static const int DiskScanned = 643;
+ static const int DiskSysPathChanged = 644;
+ static const int DiskDestroyed = 649;
+
+ static const int VolumeCreated = 650;
+ static const int VolumeStateChanged = 651;
+ static const int VolumeFsTypeChanged = 652;
+ static const int VolumeFsUuidChanged = 653;
+ static const int VolumeFsLabelChanged = 654;
+ static const int VolumePathChanged = 655;
+ static const int VolumeInternalPathChanged = 656;
+ static const int VolumeDestroyed = 659;
+
+ static int convertFromErrno();
+};
+#endif
diff --git a/system/droidvold/Utils.cpp b/system/droidvold/Utils.cpp
new file mode 100755
index 0000000..550a456
--- a/dev/null
+++ b/system/droidvold/Utils.cpp
@@ -0,0 +1,713 @@
+/*
+ * Copyright (C) 2015 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 "Utils.h"
+#include "Process.h"
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+#include <cutils/fs.h>
+#include <cutils/properties.h>
+#include <private/android_filesystem_config.h>
+#include <logwrap/logwrap.h>
+
+#include <mutex>
+#include <dirent.h>
+#include <fcntl.h>
+#include <linux/fs.h>
+#include <stdlib.h>
+#include <sys/mount.h>
+//#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/statvfs.h>
+#include <sys/sysmacros.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+
+#include "ext2fs/ext2fs.h"
+#include "blkid/blkid.h"
+
+#ifndef UMOUNT_NOFOLLOW
+#define UMOUNT_NOFOLLOW 0x00000008 /* Don't follow symlink on umount */
+#endif
+
+using android::base::ReadFileToString;
+using android::base::StringPrintf;
+
+namespace android {
+namespace droidvold {
+
+security_context_t sBlkidUntrustedContext = nullptr;
+
+static const char* kBlkidPath = "/system/bin/blkid";
+static const char* kKeyPath = "/data/misc/vold";
+
+static const char* kProcFilesystems = "/proc/filesystems";
+
+status_t PrepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid) {
+ const char* cpath = path.c_str();
+ int res = fs_prepare_dir(cpath, mode, uid, gid);
+
+ if (res == 0) {
+ return OK;
+ } else {
+ return -errno;
+ }
+}
+
+status_t ForceUnmount(const std::string& path) {
+ const char* cpath = path.c_str();
+ if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) {
+ return OK;
+ }
+ // Apps might still be handling eject request, so wait before
+ // we start sending signals
+ sleep(5);
+
+ Process::killProcessesWithOpenFiles(cpath, SIGINT);
+ sleep(5);
+ if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) {
+ return OK;
+ }
+
+ Process::killProcessesWithOpenFiles(cpath, SIGTERM);
+ sleep(5);
+ if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) {
+ return OK;
+ }
+
+ Process::killProcessesWithOpenFiles(cpath, SIGKILL);
+ sleep(5);
+ if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) {
+ return OK;
+ }
+
+ return -errno;
+}
+
+status_t KillProcessesUsingPath(const std::string& path) {
+ const char* cpath = path.c_str();
+ if (Process::killProcessesWithOpenFiles(cpath, SIGINT) == 0) {
+ return OK;
+ }
+ sleep(5);
+
+ if (Process::killProcessesWithOpenFiles(cpath, SIGTERM) == 0) {
+ return OK;
+ }
+ sleep(5);
+
+ if (Process::killProcessesWithOpenFiles(cpath, SIGKILL) == 0) {
+ return OK;
+ }
+ sleep(5);
+
+ // Send SIGKILL a second time to determine if we've
+ // actually killed everyone with open files
+ if (Process::killProcessesWithOpenFiles(cpath, SIGKILL) == 0) {
+ return OK;
+ }
+ PLOG(ERROR) << "Failed to kill processes using " << path;
+ return -EBUSY;
+}
+
+status_t BindMount(const std::string& source, const std::string& target) {
+ if (::mount(source.c_str(), target.c_str(), "", MS_BIND, NULL)) {
+ PLOG(ERROR) << "Failed to bind mount " << source << " to " << target;
+ return -errno;
+ }
+ return OK;
+}
+
+status_t ReadPartMetadata(const std::string& path, std::string& fsType,
+ std::string& fsUuid, std::string& fsLabel) {
+ blkid_cache cache = NULL;
+ const char *devices = path.c_str();
+
+ if (blkid_get_cache(&cache, "/dev/null") < 0) {
+ PLOG(ERROR) << "blkid get cache failed path=" << path;
+ blkid_put_cache(cache);
+ return -errno;
+ }
+
+ blkid_dev dev = blkid_get_dev(cache, devices, BLKID_DEV_NORMAL);
+ if (dev) {
+ blkid_tag_iterate iter;
+ const char *type, *value;
+
+ iter = blkid_tag_iterate_begin(dev);
+ while (blkid_tag_next(iter, &type, &value) == 0) {
+ LOG(DEBUG) << "type=" << type << " value=" << value;
+
+ if (!strcmp(type, "TYPE")) {
+ fsType = StringPrintf("%s", value);
+ } else if (!strcmp(type, "UUID")) {
+ fsUuid = StringPrintf("%s", value);
+ } else if (!strcmp(type, "LABEL")) {
+ fsLabel = StringPrintf("%s", value);
+ }
+ }
+ blkid_tag_iterate_end(iter);
+ }
+
+ return OK;
+}
+
+
+status_t ForkExecvp(const std::vector<std::string>& args) {
+ return ForkExecvp(args, nullptr);
+}
+
+status_t ForkExecvp(const std::vector<std::string>& args, security_context_t context) {
+ size_t argc = args.size();
+ char** argv = (char**) calloc(argc, sizeof(char*));
+ for (size_t i = 0; i < argc; i++) {
+ argv[i] = (char*) args[i].c_str();
+ if (i == 0) {
+ LOG(VERBOSE) << args[i];
+ } else {
+ LOG(VERBOSE) << " " << args[i];
+ }
+ }
+
+ if (setexeccon(context)) {
+ LOG(ERROR) << "Failed to setexeccon";
+ abort();
+ }
+ status_t res = android_fork_execvp(argc, argv, NULL, false, true);
+ if (setexeccon(nullptr)) {
+ LOG(ERROR) << "Failed to setexeccon";
+ abort();
+ }
+
+ free(argv);
+ return res;
+}
+
+status_t ForkExecvp(const std::vector<std::string>& args,
+ std::vector<std::string>& output) {
+ return ForkExecvp(args, output, nullptr);
+}
+
+status_t ForkExecvp(const std::vector<std::string>& args,
+ std::vector<std::string>& output, security_context_t context) {
+ std::string cmd;
+ for (size_t i = 0; i < args.size(); i++) {
+ cmd += args[i] + " ";
+ if (i == 0) {
+ LOG(VERBOSE) << args[i];
+ } else {
+ LOG(VERBOSE) << " " << args[i];
+ }
+ }
+ output.clear();
+
+ if (setexeccon(context)) {
+ LOG(ERROR) << "Failed to setexeccon";
+ abort();
+ }
+ FILE* fp = popen(cmd.c_str(), "r");
+ if (setexeccon(nullptr)) {
+ LOG(ERROR) << "Failed to setexeccon";
+ abort();
+ }
+
+ if (!fp) {
+ PLOG(ERROR) << "Failed to popen " << cmd;
+ return -errno;
+ }
+ char line[1024];
+ while (fgets(line, sizeof(line), fp) != nullptr) {
+ LOG(VERBOSE) << line;
+ output.push_back(std::string(line));
+ }
+ if (pclose(fp) != 0) {
+ PLOG(ERROR) << "Failed to pclose " << cmd;
+ return -errno;
+ }
+
+ return OK;
+}
+
+pid_t ForkExecvpAsync(const std::vector<std::string>& args) {
+ size_t argc = args.size();
+ char** argv = (char**) calloc(argc + 1, sizeof(char*));
+ for (size_t i = 0; i < argc; i++) {
+ argv[i] = (char*) args[i].c_str();
+ if (i == 0) {
+ LOG(VERBOSE) << args[i];
+ } else {
+ LOG(VERBOSE) << " " << args[i];
+ }
+ }
+
+ pid_t pid = fork();
+ if (pid == 0) {
+ close(STDIN_FILENO);
+ close(STDOUT_FILENO);
+ close(STDERR_FILENO);
+
+ if (execvp(argv[0], argv)) {
+ PLOG(ERROR) << "Failed to exec";
+ }
+
+ _exit(1);
+ }
+
+ if (pid == -1) {
+ PLOG(ERROR) << "Failed to exec";
+ }
+
+ free(argv);
+ return pid;
+}
+
+status_t ReadRandomBytes(size_t bytes, std::string& out) {
+ out.clear();
+
+ int fd = TEMP_FAILURE_RETRY(open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOFOLLOW));
+ if (fd == -1) {
+ return -errno;
+ }
+
+ char buf[BUFSIZ];
+ size_t n;
+ while ((n = TEMP_FAILURE_RETRY(read(fd, &buf[0], std::min(sizeof(buf), bytes)))) > 0) {
+ out.append(buf, n);
+ bytes -= n;
+ }
+ close(fd);
+
+ if (bytes == 0) {
+ return OK;
+ } else {
+ return -EIO;
+ }
+}
+
+status_t HexToStr(const std::string& hex, std::string& str) {
+ str.clear();
+ bool even = true;
+ char cur = 0;
+ for (size_t i = 0; i < hex.size(); i++) {
+ int val = 0;
+ switch (hex[i]) {
+ case ' ': case '-': case ':': continue;
+ case 'f': case 'F': val = 15; break;
+ case 'e': case 'E': val = 14; break;
+ case 'd': case 'D': val = 13; break;
+ case 'c': case 'C': val = 12; break;
+ case 'b': case 'B': val = 11; break;
+ case 'a': case 'A': val = 10; break;
+ case '9': val = 9; break;
+ case '8': val = 8; break;
+ case '7': val = 7; break;
+ case '6': val = 6; break;
+ case '5': val = 5; break;
+ case '4': val = 4; break;
+ case '3': val = 3; break;
+ case '2': val = 2; break;
+ case '1': val = 1; break;
+ case '0': val = 0; break;
+ default: return -EINVAL;
+ }
+
+ if (even) {
+ cur = val << 4;
+ } else {
+ cur += val;
+ str.push_back(cur);
+ cur = 0;
+ }
+ even = !even;
+ }
+ return even ? OK : -EINVAL;
+}
+
+static const char* kLookup = "0123456789abcdef";
+
+status_t StrToHex(const std::string& str, std::string& hex) {
+ hex.clear();
+ for (size_t i = 0; i < str.size(); i++) {
+ hex.push_back(kLookup[(str[i] & 0xF0) >> 4]);
+ hex.push_back(kLookup[str[i] & 0x0F]);
+ }
+ return OK;
+}
+
+status_t NormalizeHex(const std::string& in, std::string& out) {
+ std::string tmp;
+ if (HexToStr(in, tmp)) {
+ return -EINVAL;
+ }
+ return StrToHex(tmp, out);
+}
+
+uint64_t GetFreeBytes(const std::string& path) {
+ struct statvfs sb;
+ if (statvfs(path.c_str(), &sb) == 0) {
+ return (uint64_t)sb.f_bfree * sb.f_bsize;
+ } else {
+ return -1;
+ }
+}
+
+// TODO: borrowed from frameworks/native/libs/diskusage/ which should
+// eventually be migrated into system/
+static int64_t stat_size(struct stat *s) {
+ int64_t blksize = s->st_blksize;
+ // count actual blocks used instead of nominal file size
+ int64_t size = s->st_blocks * 512;
+
+ if (blksize) {
+ /* round up to filesystem block size */
+ size = (size + blksize - 1) & (~(blksize - 1));
+ }
+
+ return size;
+}
+
+// TODO: borrowed from frameworks/native/libs/diskusage/ which should
+// eventually be migrated into system/
+int64_t calculate_dir_size(int dfd) {
+ int64_t size = 0;
+ struct stat s;
+ DIR *d;
+ struct dirent *de;
+
+ d = fdopendir(dfd);
+ if (d == NULL) {
+ close(dfd);
+ return 0;
+ }
+
+ while ((de = readdir(d))) {
+ const char *name = de->d_name;
+ if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) == 0) {
+ size += stat_size(&s);
+ }
+ if (de->d_type == DT_DIR) {
+ int subfd;
+
+ /* always skip "." and ".." */
+ if (name[0] == '.') {
+ if (name[1] == 0)
+ continue;
+ if ((name[1] == '.') && (name[2] == 0))
+ continue;
+ }
+
+ subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY);
+ if (subfd >= 0) {
+ size += calculate_dir_size(subfd);
+ }
+ }
+ }
+ closedir(d);
+ return size;
+}
+
+uint64_t GetTreeBytes(const std::string& path) {
+ int dirfd = open(path.c_str(), O_DIRECTORY, O_RDONLY);
+ if (dirfd < 0) {
+ PLOG(WARNING) << "Failed to open " << path;
+ return -1;
+ } else {
+ uint64_t res = calculate_dir_size(dirfd);
+ close(dirfd);
+ return res;
+ }
+}
+
+bool IsFilesystemSupported(const std::string& fsType) {
+ std::string supported;
+ if (!ReadFileToString(kProcFilesystems, &supported)) {
+ PLOG(ERROR) << "Failed to read supported filesystems";
+ return false;
+ }
+ return supported.find(fsType + "\n") != std::string::npos;
+}
+
+status_t WipeBlockDevice(const std::string& path) {
+ status_t res = -1;
+ const char* c_path = path.c_str();
+ unsigned long nr_sec = 0;
+ unsigned long long range[2];
+
+ int fd = TEMP_FAILURE_RETRY(open(c_path, O_RDWR | O_CLOEXEC));
+ if (fd == -1) {
+ PLOG(ERROR) << "Failed to open " << path;
+ goto done;
+ }
+
+ if ((ioctl(fd, BLKGETSIZE, &nr_sec)) == -1) {
+ PLOG(ERROR) << "Failed to determine size of " << path;
+ goto done;
+ }
+
+ range[0] = 0;
+ range[1] = (unsigned long long) nr_sec * 512;
+
+ LOG(INFO) << "About to discard " << range[1] << " on " << path;
+ if (ioctl(fd, BLKDISCARD, &range) == 0) {
+ LOG(INFO) << "Discard success on " << path;
+ res = 0;
+ } else {
+ PLOG(ERROR) << "Discard failure on " << path;
+ }
+
+done:
+ close(fd);
+ return res;
+}
+
+std::string BuildDataUserDePath(const char* volumeUuid, userid_t userId) {
+ // TODO: unify with installd path generation logic
+ std::string data(BuildDataPath(volumeUuid));
+ return StringPrintf("%s/user_de/%u", data.c_str(), userId);
+}
+
+dev_t GetDevice(const std::string& path) {
+ struct stat sb;
+ if (stat(path.c_str(), &sb)) {
+ PLOG(WARNING) << "Failed to stat " << path;
+ return 0;
+ } else {
+ return sb.st_dev;
+ }
+}
+
+std::string DefaultFstabPath() {
+ char hardware[PROPERTY_VALUE_MAX];
+ property_get("ro.hardware", hardware, "");
+ return StringPrintf("/fstab.%s", hardware);
+}
+
+status_t RestoreconRecursive(const std::string& path) {
+ LOG(VERBOSE) << "Starting restorecon of " << path;
+
+ // TODO: find a cleaner way of waiting for restorecon to finish
+ const char* cpath = path.c_str();
+ property_set("selinux.restorecon_recursive", "");
+ property_set("selinux.restorecon_recursive", cpath);
+
+ char value[PROPERTY_VALUE_MAX];
+ while (true) {
+ property_get("selinux.restorecon_recursive", value, "");
+ if (strcmp(cpath, value) == 0) {
+ break;
+ }
+ usleep(100000); // 100ms
+ }
+
+ LOG(VERBOSE) << "Finished restorecon of " << path;
+ return OK;
+}
+
+status_t SaneReadLinkAt(int dirfd, const char* path, char* buf, size_t bufsiz) {
+ ssize_t len = readlinkat(dirfd, path, buf, bufsiz);
+ if (len < 0) {
+ return -1;
+ } else if (len == (ssize_t) bufsiz) {
+ return -1;
+ } else {
+ buf[len] = '\0';
+ return 0;
+ }
+}
+
+ScopedFd::ScopedFd(int fd) : fd_(fd) {}
+
+ScopedFd::~ScopedFd() {
+ close(fd_);
+}
+
+ScopedDir::ScopedDir(DIR* dir) : dir_(dir) {}
+
+ScopedDir::~ScopedDir() {
+ if (dir_ != nullptr) {
+ closedir(dir_);
+ }
+}
+
+bool IsRunningInEmulator() {
+ return property_get_bool("ro.kernel.qemu", 0);
+}
+
+status_t readBlockDevMajorAndMinor(
+ const std::string& devPath,
+ std::string& major, std::string& minor) {
+ major.clear();
+ minor.clear();
+
+ std::vector<std::string> cmd;
+ cmd.push_back("/system/bin/ls");
+ cmd.push_back("-l");
+ cmd.push_back(devPath);
+
+ std::vector<std::string> output;
+ status_t res = ForkExecvp(cmd, output);
+ if (res != OK) {
+ LOG(WARNING) << "failed to identify ls -l " << devPath;
+ return res;
+ }
+
+ // Extract values from output
+ // brw------- root root 179, 1 2015-01-01 00:00 mmcblk0p1
+ char value[128];
+ for (auto line : output) {
+ int count = sscanf(line.c_str(), "%3s", value);
+ if (count == 1 && !strcmp(value, "brw")) { // block device
+ char f[128], s[128];
+ if (sscanf(line.c_str(), "%[^','],%s", f, s) == 2) { // split ','
+ minor = s;
+ char *cline = strdup(f);
+ char *str = strtok(cline, " ");
+ char buf[25];
+ while (str != nullptr) {
+ if (sscanf(str, "%[1-9]", buf) == 1) {
+ major = buf;
+ }
+ str = strtok(nullptr, " ");
+ }
+ }
+ }
+ }
+
+ return OK;
+}
+
+// Get physical device path (such as /dev/block/sda) by kernel event sys path
+status_t GetPhysicalDevice(
+ const std::string& sysPath, std::string& physicalDev) {
+ int iPos = sysPath.find("/block/");
+ if (iPos < 0) {
+ LOG(WARNING) << "can't find \"/block/\" in " << sysPath;
+ return -1;
+ }
+
+ physicalDev = StringPrintf("/dev/block/%s", sysPath.substr(iPos + 7).c_str());
+ if (access(physicalDev.c_str(), F_OK)) {
+ LOG(INFO) << "physical dev: " << physicalDev + " doesn't exist";
+ return -1;
+ }
+
+ return OK;
+}
+
+// /sys//devices/d0072000.sd/mmc_host/sd/sd:0007/block/mmcblk0
+// /sys//devices/dwc2_b/usb1/1-1/1-1.2/1-1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda
+status_t GetLogicalPartitionDevice(
+ const dev_t device, const std::string& sysPath, std::string& logicalPartitionDev) {
+ std::string physicalDev;
+ const unsigned int kMajorBlockMmc = 179;
+ const unsigned int kMaxNumOfPartition = 31;
+
+ // logical partition dev's major & minor
+ unsigned int devMajor = major(device);
+ unsigned int devMinor = minor(device);
+
+ if (GetPhysicalDevice(sysPath, physicalDev) != OK) {
+ return -1;
+ }
+
+ LOG(INFO) << "physical dev: " << physicalDev <<
+ ", logical partition dev's major: " << devMajor << ", minor: " << devMinor;
+
+ // For now, assume that MMC devices are SD, and that
+ // everything else is USB
+ std::string lpDev;
+ std::string major, minor;
+ for (unsigned int i = 1; i <= kMaxNumOfPartition; i ++) {
+ if (devMajor == kMajorBlockMmc) { // SD
+ lpDev = StringPrintf("%sp%d", physicalDev.c_str(), i);
+ } else { // USB
+ lpDev = StringPrintf("%s%d", physicalDev.c_str(), i);
+ }
+
+ if (!access(lpDev.c_str(), F_OK) &&
+ readBlockDevMajorAndMinor(lpDev, major, minor) == OK &&
+ (int)devMajor == atoi(major.c_str()) &&
+ (int)devMinor == atoi(minor.c_str())) {
+ logicalPartitionDev = lpDev;
+ LOG(INFO) << "find logical partition dev: " << logicalPartitionDev;
+ break;
+ }
+ }
+
+ return OK;
+}
+
+// Such as /dev/block/sda is used, return true,otherwise false
+// just true,saved sda to physicalDevName
+bool IsJustPhysicalDevice(
+ const std::string& sysPath, std::string& physicalDevName) {
+ std::string major, minor;
+ std::string physicalDev;
+ std::string logicalPartitionDev;
+ const unsigned int kMajorBlockMmc = 179;
+
+ if (GetPhysicalDevice(sysPath, physicalDev) == OK) {
+ std::vector<std::string> cmd;
+ cmd.push_back(kBlkidPath);
+ cmd.push_back("-c");
+ cmd.push_back("/dev/null");
+ cmd.push_back("-s");
+ cmd.push_back("TYPE");
+ cmd.push_back("-s");
+ cmd.push_back("UUID");
+ cmd.push_back("-s");
+ cmd.push_back("LABEL");
+ cmd.push_back(physicalDev);
+
+ std::vector<std::string> output;
+ status_t res = ForkExecvp(cmd, output, sBlkidUntrustedContext);
+ if (res != OK) {
+ LOG(WARNING) << "failed to identify blkid " << physicalDev;
+ return false;
+ }
+
+ char value[128];
+ for (auto line : output) {
+ // Extract values from blkid output, if defined
+ const char* cline = line.c_str();
+ if (!strncmp(cline, physicalDev.c_str(), strlen(physicalDev.c_str()))) {
+ if (readBlockDevMajorAndMinor(physicalDev, major, minor) == OK) {
+ logicalPartitionDev = (atoi(major.c_str()) == kMajorBlockMmc) ?
+ StringPrintf("%sp1", physicalDev.c_str()) :
+ StringPrintf("%s1", physicalDev.c_str());
+ if (access(logicalPartitionDev.c_str(), F_OK)) {
+ // And logical partition device doesn't exist,
+ // we're sure physical device is used.
+ // length /dev/block/ = 11,such as sda or mmcblk0,
+ // we get as physical device name.
+ physicalDevName = StringPrintf("%s", physicalDev.substr(11).c_str());
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/Utils.h b/system/droidvold/Utils.h
new file mode 100755
index 0000000..0e5e644
--- a/dev/null
+++ b/system/droidvold/Utils.h
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2015 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_VOLD_UTILS_H
+#define ANDROID_VOLD_UTILS_H
+
+#include <utils/Errors.h>
+#include <cutils/multiuser.h>
+#include <selinux/selinux.h>
+
+#include <vector>
+#include <string>
+
+// DISALLOW_COPY_AND_ASSIGN disallows the copy and operator= functions. It goes in the private:
+// declarations in a class.
+#if !defined(DISALLOW_COPY_AND_ASSIGN)
+#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
+ TypeName(const TypeName&) = delete; \
+ void operator=(const TypeName&) = delete
+#endif
+
+struct DIR;
+
+namespace android {
+namespace droidvold {
+
+/* SELinux contexts used depending on the block device type */
+extern security_context_t sBlkidContext;
+extern security_context_t sBlkidUntrustedContext;
+extern security_context_t sFsckContext;
+extern security_context_t sFsckUntrustedContext;
+
+/* fs_prepare_dir wrapper that creates with SELinux context */
+status_t PrepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid);
+
+/* Really unmounts the path, killing active processes along the way */
+status_t ForceUnmount(const std::string& path);
+
+/* Kills any processes using given path */
+status_t KillProcessesUsingPath(const std::string& path);
+
+/* Creates bind mount from source to target */
+status_t BindMount(const std::string& source, const std::string& target);
+
+/* Reads filesystem metadata from untrusted device at path */
+status_t ReadPartMetadata(const std::string& path, std::string& fsType,
+ std::string& fsUuid, std::string& fsLabel);
+
+/* Returns either WEXITSTATUS() status, or a negative errno */
+status_t ForkExecvp(const std::vector<std::string>& args);
+status_t ForkExecvp(const std::vector<std::string>& args, security_context_t context);
+
+status_t ForkExecvp(const std::vector<std::string>& args,
+ std::vector<std::string>& output);
+status_t ForkExecvp(const std::vector<std::string>& args,
+ std::vector<std::string>& output, security_context_t context);
+
+pid_t ForkExecvpAsync(const std::vector<std::string>& args);
+
+status_t ReadRandomBytes(size_t bytes, std::string& out);
+
+/* Converts hex string to raw bytes, ignoring [ :-] */
+status_t HexToStr(const std::string& hex, std::string& str);
+/* Converts raw bytes to hex string */
+status_t StrToHex(const std::string& str, std::string& hex);
+/* Normalize given hex string into consistent format */
+status_t NormalizeHex(const std::string& in, std::string& out);
+
+uint64_t GetFreeBytes(const std::string& path);
+uint64_t GetTreeBytes(const std::string& path);
+
+bool IsFilesystemSupported(const std::string& fsType);
+
+/* Wipes contents of block device at given path */
+status_t WipeBlockDevice(const std::string& path);
+
+std::string BuildKeyPath(const std::string& partGuid);
+
+std::string BuildDataSystemLegacyPath(userid_t userid);
+std::string BuildDataSystemCePath(userid_t userid);
+std::string BuildDataSystemDePath(userid_t userid);
+std::string BuildDataMiscLegacyPath(userid_t userid);
+std::string BuildDataMiscCePath(userid_t userid);
+std::string BuildDataMiscDePath(userid_t userid);
+std::string BuildDataProfilesDePath(userid_t userid);
+std::string BuildDataProfilesForeignDexDePath(userid_t userid);
+
+std::string BuildDataPath(const char* volumeUuid);
+std::string BuildDataMediaCePath(const char* volumeUuid, userid_t userid);
+std::string BuildDataUserCePath(const char* volumeUuid, userid_t userid);
+std::string BuildDataUserDePath(const char* volumeUuid, userid_t userid);
+
+dev_t GetDevice(const std::string& path);
+
+std::string DefaultFstabPath();
+
+status_t RestoreconRecursive(const std::string& path);
+
+status_t SaneReadLinkAt(int dirfd, const char* path, char* buf, size_t bufsiz);
+
+class ScopedFd {
+ const int fd_;
+public:
+ ScopedFd(int fd);
+ ~ScopedFd();
+ int get() const { return fd_; }
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedFd);
+};
+
+class ScopedDir {
+ DIR* const dir_;
+public:
+ ScopedDir(DIR* dir);
+ ~ScopedDir();
+ DIR* get() const { return dir_; }
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedDir);
+};
+
+/* Checks if Android is running in QEMU */
+bool IsRunningInEmulator();
+
+/* Get physical device,such as /dev/block/mmcblk1 */
+status_t GetPhysicalDevice(
+ const std::string& sysPath,
+ std::string& physicalDev);
+
+/* Get logical partition device,such as /dev/block/mmcblk1p1 */
+status_t GetLogicalPartitionDevice(
+ const dev_t device,
+ const std::string& sysPath,
+ std::string& logicalPartitionDev);
+
+/* Check sd/udisk physical devices whether are used */
+bool IsJustPhysicalDevice(
+ const std::string& sysPath,
+ std::string& physicalDevName);
+
+status_t readBlockDevMajorAndMinor(
+ const std::string& devPath,
+ std::string& major, std::string& minor);
+
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/VolumeBase.cpp b/system/droidvold/VolumeBase.cpp
new file mode 100755
index 0000000..e2e53b9
--- a/dev/null
+++ b/system/droidvold/VolumeBase.cpp
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2015 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 "Utils.h"
+#include "VolumeBase.h"
+#include "VolumeManager.h"
+#include "ResponseCode.h"
+
+#include <android-base/stringprintf.h>
+#include <android-base/logging.h>
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+using android::base::StringPrintf;
+
+namespace android {
+namespace droidvold {
+
+VolumeBase::VolumeBase(Type type) :
+ mType(type), mMountFlags(0), mMountUserId(-1), mCreated(false), mState(
+ State::kUnmounted), mSilent(false), mDiskFlags(0), mPartNo(0) {
+}
+
+VolumeBase::~VolumeBase() {
+ CHECK(!mCreated);
+}
+
+void VolumeBase::setState(State state) {
+ mState = state;
+ notifyEvent(ResponseCode::VolumeStateChanged, StringPrintf("%d", mState));
+}
+
+status_t VolumeBase::setDiskId(const std::string& diskId) {
+ if (mCreated) {
+ LOG(WARNING) << getId() << " diskId change requires destroyed";
+ return -EBUSY;
+ }
+
+ mDiskId = diskId;
+ return OK;
+}
+
+status_t VolumeBase::setPartGuid(const std::string& partGuid) {
+ if (mCreated) {
+ LOG(WARNING) << getId() << " partGuid change requires destroyed";
+ return -EBUSY;
+ }
+
+ mPartGuid = partGuid;
+ return OK;
+}
+
+status_t VolumeBase::setMountFlags(int mountFlags) {
+ if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
+ LOG(WARNING) << getId() << " flags change requires state unmounted or unmountable";
+ return -EBUSY;
+ }
+
+ mMountFlags = mountFlags;
+ return OK;
+}
+
+status_t VolumeBase::setDiskFlags(int diskFlags) {
+ if (mCreated) {
+ LOG(WARNING) << getId() << " Diskflags change requires destroyed";
+ return -EBUSY;
+ }
+
+ mDiskFlags = diskFlags;
+ return OK;
+}
+
+status_t VolumeBase::setPartNo(int part) {
+ if (mCreated) {
+ LOG(WARNING) << getId() << " partNo change requires destroyed";
+ return -EBUSY;
+ }
+
+ mPartNo = part;
+ return OK;
+}
+
+status_t VolumeBase::setMountUserId(userid_t mountUserId) {
+ if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
+ LOG(WARNING) << getId() << " user change requires state unmounted or unmountable";
+ return -EBUSY;
+ }
+
+ mMountUserId = mountUserId;
+ return OK;
+}
+
+status_t VolumeBase::setSilent(bool silent) {
+ if (mCreated) {
+ LOG(WARNING) << getId() << " silence change requires destroyed";
+ return -EBUSY;
+ }
+
+ mSilent = silent;
+ return OK;
+}
+
+status_t VolumeBase::setId(const std::string& id) {
+ if (mCreated) {
+ LOG(WARNING) << getId() << " id change requires not created";
+ return -EBUSY;
+ }
+
+ mId = id;
+ return OK;
+}
+
+status_t VolumeBase::setPath(const std::string& path) {
+ if (mState != State::kChecking) {
+ LOG(WARNING) << getId() << " path change requires state checking";
+ return -EBUSY;
+ }
+
+ mPath = path;
+ notifyEvent(ResponseCode::VolumePathChanged, mPath);
+ return OK;
+}
+
+status_t VolumeBase::setInternalPath(const std::string& internalPath) {
+ if (mState != State::kChecking) {
+ LOG(WARNING) << getId() << " internal path change requires state checking";
+ return -EBUSY;
+ }
+
+ mInternalPath = internalPath;
+ notifyEvent(ResponseCode::VolumeInternalPathChanged, mInternalPath);
+ return OK;
+}
+
+void VolumeBase::notifyEvent(int event) {
+ if (mSilent) return;
+ VolumeManager::Instance()->getBroadcaster()->sendBroadcast(event,
+ getId());
+}
+
+void VolumeBase::notifyEvent(int event, const std::string& value) {
+ if (mSilent) return;
+ VolumeManager::Instance()->getBroadcaster()->sendBroadcast(event,
+ StringPrintf("%s %s", getId().c_str(), value.c_str()));
+}
+
+
+void VolumeBase::addVolume(const std::shared_ptr<VolumeBase>& volume) {
+ mVolumes.push_back(volume);
+}
+
+void VolumeBase::removeVolume(const std::shared_ptr<VolumeBase>& volume) {
+ mVolumes.remove(volume);
+}
+
+std::shared_ptr<VolumeBase> VolumeBase::findVolume(const std::string& id) {
+ for (auto vol : mVolumes) {
+ if (vol->getId() == id) {
+ return vol;
+ }
+ }
+ return nullptr;
+}
+
+status_t VolumeBase::create() {
+ CHECK(!mCreated);
+
+ mCreated = true;
+ status_t res = doCreate();
+ notifyEvent(ResponseCode::VolumeCreated,
+ StringPrintf("%d \"%s\" \"%s\"", mType, mDiskId.c_str(), mPartGuid.c_str()));
+ setState(State::kUnmounted);
+ return res;
+}
+
+status_t VolumeBase::doCreate() {
+ return OK;
+}
+
+status_t VolumeBase::destroy() {
+ CHECK(mCreated);
+
+ if (mState == State::kMounted) {
+ unmount();
+ setState(State::kBadRemoval);
+ } else {
+ setState(State::kRemoved);
+ }
+
+ notifyEvent(ResponseCode::VolumeDestroyed);
+ status_t res = doDestroy();
+ mCreated = false;
+ return res;
+}
+
+status_t VolumeBase::doDestroy() {
+ return OK;
+}
+
+status_t VolumeBase::mount() {
+ if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
+ LOG(WARNING) << getId() << " mount requires state unmounted or unmountable";
+ return -EBUSY;
+ }
+
+ setState(State::kChecking);
+ status_t res = doMount();
+ if (res == OK) {
+ setState(State::kMounted);
+ } else {
+ setState(State::kUnmountable);
+ }
+
+ return res;
+}
+
+status_t VolumeBase::unmount() {
+ if (mState != State::kMounted) {
+ LOG(WARNING) << getId() << " unmount requires state mounted";
+ return -EBUSY;
+ }
+
+ setState(State::kEjecting);
+ for (auto vol : mVolumes) {
+ if (vol->destroy()) {
+ LOG(WARNING) << getId() << " failed to destroy " << vol->getId()
+ << " stacked above";
+ }
+ }
+ mVolumes.clear();
+
+ status_t res = doUnmount();
+ setState(State::kUnmounted);
+ return res;
+}
+
+status_t VolumeBase::format(const std::string& fsType) {
+ if (mState == State::kMounted) {
+ unmount();
+ }
+
+ if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
+ LOG(WARNING) << getId() << " format requires state unmounted or unmountable";
+ return -EBUSY;
+ }
+
+ setState(State::kFormatting);
+ status_t res = doFormat(fsType);
+ setState(State::kUnmounted);
+ return res;
+}
+
+status_t VolumeBase::doFormat(const std::string& fsType) {
+ return -ENOTSUP;
+}
+
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/VolumeBase.h b/system/droidvold/VolumeBase.h
new file mode 100755
index 0000000..28a2cfe
--- a/dev/null
+++ b/system/droidvold/VolumeBase.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2008 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_VOLD_VOLUME_BASE_H
+#define ANDROID_VOLD_VOLUME_BASE_H
+
+#include "Utils.h"
+
+#include <cutils/multiuser.h>
+#include <utils/Errors.h>
+
+#include <sys/types.h>
+#include <list>
+#include <string>
+
+namespace android {
+namespace droidvold {
+
+/*
+ * Representation of a mounted volume ready for presentation.
+ *
+ * Various subclasses handle the different mounting prerequisites, such as
+ * encryption details, etc. Volumes can also be "stacked" above other
+ * volumes to help communicate dependencies. For example, an ASEC volume
+ * can be stacked on a vfat volume.
+ *
+ * Mounted volumes can be asked to manage bind mounts to present themselves
+ * to specific users on the device.
+ *
+ * When an unmount is requested, the volume recursively unmounts any stacked
+ * volumes and removes any bind mounts before finally unmounting itself.
+ */
+class VolumeBase {
+public:
+ virtual ~VolumeBase();
+
+ enum class Type {
+ kPublic = 0,
+ kPrivate,
+ kEmulated,
+ kAsec,
+ kObb,
+ };
+
+ enum MountFlags {
+ /* Flag that volume is primary external storage */
+ kPrimary = 1 << 0,
+ /* Flag that volume is visible to normal apps */
+ kVisible = 1 << 1,
+ };
+
+ enum class State {
+ kUnmounted = 0,
+ kChecking,
+ kMounted,
+ kMountedReadOnly,
+ kFormatting,
+ kEjecting,
+ kUnmountable,
+ kRemoved,
+ kBadRemoval,
+ };
+
+ const std::string& getId() { return mId; }
+ const std::string& getDiskId() { return mDiskId; }
+ const std::string& getPartGuid() { return mPartGuid; }
+ Type getType() { return mType; }
+ int getMountFlags() { return mMountFlags; }
+ userid_t getMountUserId() { return mMountUserId; }
+ State getState() { return mState; }
+ const std::string& getPath() { return mPath; }
+ const std::string& getSysPath() { return mSysPath; }
+ const std::string& getInternalPath() { return mInternalPath; }
+ int getDiskFlags() { return mDiskFlags; }
+ int getPartNo() { return mPartNo; }
+
+ status_t setDiskId(const std::string& diskId);
+ status_t setPartGuid(const std::string& partGuid);
+ status_t setMountFlags(int mountFlags);
+ status_t setMountUserId(userid_t mountUserId);
+ status_t setSilent(bool silent);
+ void setSysPath(const std::string& sysPath) { mSysPath = sysPath; }
+ status_t setDiskFlags(int diskFlags);
+ status_t setPartNo(int part);
+
+ void addVolume(const std::shared_ptr<VolumeBase>& volume);
+ void removeVolume(const std::shared_ptr<VolumeBase>& volume);
+
+ std::shared_ptr<VolumeBase> findVolume(const std::string& id);
+
+ status_t create();
+ status_t destroy();
+ status_t mount();
+ status_t unmount();
+ status_t format(const std::string& fsType);
+ virtual bool isSrdiskMounted() = 0;
+
+protected:
+ explicit VolumeBase(Type type);
+
+ virtual status_t doCreate();
+ virtual status_t doDestroy();
+ virtual status_t doMount() = 0;
+ virtual status_t doUnmount() = 0;
+ virtual status_t doFormat(const std::string& fsType);
+
+ status_t setId(const std::string& id);
+ status_t setPath(const std::string& path);
+ status_t setInternalPath(const std::string& internalPath);
+ void notifyEvent(int msg);
+ void notifyEvent(int msg, const std::string& value);
+
+private:
+ /* ID that uniquely references volume while alive */
+ std::string mId;
+ /* ID that uniquely references parent disk while alive */
+ std::string mDiskId;
+ /* Partition GUID of this volume */
+ std::string mPartGuid;
+ /* Volume type */
+ Type mType;
+ /* Flags used when mounting this volume */
+ int mMountFlags;
+ /* User that owns this volume, otherwise -1 */
+ userid_t mMountUserId;
+ /* Flag indicating object is created */
+ bool mCreated;
+ /* Current state of volume */
+ State mState;
+ /* Path to mounted volume */
+ std::string mPath;
+ /* Device path under sysfs */
+ std::string mSysPath;
+ /* Path to internal backing storage */
+ std::string mInternalPath;
+ /* Flag indicating that volume should emit no events */
+ bool mSilent;
+ int mDiskFlags;
+ int mPartNo;
+
+ /* Volumes stacked on top of this volume */
+ std::list<std::shared_ptr<VolumeBase>> mVolumes;
+
+ void setState(State state);
+
+ DISALLOW_COPY_AND_ASSIGN(VolumeBase);
+};
+
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/VolumeManager.cpp b/system/droidvold/VolumeManager.cpp
new file mode 100755
index 0000000..5b82180
--- a/dev/null
+++ b/system/droidvold/VolumeManager.cpp
@@ -0,0 +1,437 @@
+/*
+ * Copyright (C) 2008 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 <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <fts.h>
+#include <mntent.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <sys/sysmacros.h>
+#include <sys/sysmacros.h>
+
+#include <linux/kdev_t.h>
+#include <linux/loop.h>
+
+#define LOG_TAG "droidVold"
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+#include <cutils/fs.h>
+#include <cutils/log.h>
+
+#include <selinux/android.h>
+
+#include <sysutils/NetlinkEvent.h>
+#include <private/android_filesystem_config.h>
+
+#include "VolumeManager.h"
+#include "NetlinkManager.h"
+#include "DroidVold.h"
+
+#include "fs/Ext4.h"
+#include "fs/Vfat.h"
+#include "Utils.h"
+#include "Process.h"
+#include "fs/Iso9660.h"
+
+#ifdef HAS_VIRTUAL_CDROM
+#define LOOP_DEV "/dev/block/loop0"
+#define LOOP_MOUNTPOINT "/mnt/loop"
+#endif
+
+using android::base::StringPrintf;
+
+static const unsigned int kMajorBlockMmc = 179;
+static const unsigned int kMajorBlockExperimentalMin = 240;
+static const unsigned int kMajorBlockExperimentalMax = 254;
+
+VolumeManager *VolumeManager::sInstance = NULL;
+
+VolumeManager *VolumeManager::Instance() {
+ if (!sInstance)
+ sInstance = new VolumeManager();
+ return sInstance;
+}
+
+VolumeManager::VolumeManager() {
+ mDebug = false;
+ mBroadcaster = NULL;
+#ifdef HAS_VIRTUAL_CDROM
+ mLoopPath = NULL;
+#endif
+}
+
+VolumeManager::~VolumeManager() {
+}
+
+int VolumeManager::setDebug(bool enable) {
+ mDebug = enable;
+ return 0;
+}
+
+int VolumeManager::start() {
+ // Always start from a clean slate by unmounting everything in
+ // directories that we own, in case we crashed.
+ unmountAll();
+
+ return 0;
+}
+
+int VolumeManager::stop() {
+ return 0;
+}
+
+void VolumeManager::handleBlockEvent(NetlinkEvent *evt) {
+ std::lock_guard<std::mutex> lock(mLock);
+
+ if (mDebug) {
+ LOG(VERBOSE) << "----------------";
+ LOG(VERBOSE) << "handleBlockEvent with action " << (int) evt->getAction();
+ evt->dump();
+ }
+
+ std::string devType(evt->findParam("DEVTYPE")?evt->findParam("DEVTYPE"):"");
+
+
+ if (devType == "disk") {
+ std::string eventPath(evt->findParam("DEVPATH")?evt->findParam("DEVPATH"):"");
+ std::string devName(evt->findParam("DEVNAME")?evt->findParam("DEVNAME"):"");
+
+ int major = atoi(evt->findParam("MAJOR"));
+ int minor = atoi(evt->findParam("MINOR"));
+ dev_t device = makedev(major, minor);
+
+ switch (evt->getAction()) {
+ case NetlinkEvent::Action::kAdd: {
+ for (auto source : mDiskSources) {
+ if (source->matches(eventPath)) {
+ // For now, assume that MMC and virtio-blk (the latter is
+ // emulator-specific; see Disk.cpp for details) devices are SD,
+ // and that everything else is USB
+ int flags = source->getFlags();
+ if (major == kMajorBlockMmc
+ || (android::droidvold::IsRunningInEmulator()
+ && major >= (int) kMajorBlockExperimentalMin
+ && major <= (int) kMajorBlockExperimentalMax)) {
+ flags |= android::droidvold::Disk::Flags::kSd;
+ } else {
+ flags |= android::droidvold::Disk::Flags::kUsb;
+ }
+
+ auto disk = new android::droidvold::Disk(eventPath, device,
+ source->getNickname(), devName, flags);
+ disk->create();
+ mDisks.push_back(std::shared_ptr<android::droidvold::Disk>(disk));
+ break;
+ }
+ }
+ break;
+ }
+ case NetlinkEvent::Action::kChange: {
+ LOG(DEBUG) << "Disk at " << major << ":" << minor << " changed";
+ for (auto disk : mDisks) {
+ if (disk->getDevice() == device) {
+ if (disk->isSrdiskMounted()) {
+ LOG(DEBUG) << "srdisk ejected";
+ disk->destroyAllVolumes();
+ break;
+ }
+
+ //disk->readMetadata();
+ //disk->readPartitions();
+ }
+ }
+ break;
+ }
+ case NetlinkEvent::Action::kRemove: {
+ auto i = mDisks.begin();
+ while (i != mDisks.end()) {
+ if ((*i)->getDevice() == device) {
+ (*i)->destroy();
+ i = mDisks.erase(i);
+ } else {
+ ++i;
+ }
+ }
+ break;
+ }
+ default: {
+ LOG(WARNING) << "Unexpected block event action " << (int) evt->getAction();
+ break;
+ }
+ }
+
+ } else {
+ for (auto disk : mDisks) {
+ disk->handleBlockEvent(evt);
+ }
+ }
+
+}
+
+void VolumeManager::addDiskSource(const std::shared_ptr<DiskSource>& diskSource) {
+ mDiskSources.push_back(diskSource);
+}
+
+std::shared_ptr<android::droidvold::VolumeBase> VolumeManager::findVolume(const std::string& id) {
+
+ for (auto disk : mDisks) {
+ auto vol = disk->findVolume(id);
+ if (vol != nullptr) {
+ return vol;
+ }
+ }
+ return nullptr;
+}
+
+void VolumeManager::listVolumes(android::droidvold::VolumeBase::Type type,
+ std::list<std::string>& list) {
+ list.clear();
+ for (auto disk : mDisks) {
+ disk->listVolumes(type, list);
+ }
+}
+
+int VolumeManager::unmountAll() {
+ std::lock_guard<std::mutex> lock(mLock);
+
+ for (auto disk : mDisks) {
+ disk->unmountAll();
+ }
+
+ return 0;
+}
+
+#ifdef HAS_VIRTUAL_CDROM
+int VolumeManager::loopsetfd(const char * path)
+{
+ int fd,file_fd;
+
+ if ((fd = open(LOOP_DEV, O_RDWR)) < 0) {
+ SLOGE("Unable to open loop0 device (%s)",strerror(errno));
+ return -1;
+ }
+
+ if ((file_fd = open(path, O_RDWR)) < 0) {
+ SLOGE("Unable to open %s (%s)", path, strerror(errno));
+ close(fd);
+ return -1;
+ }
+
+ if (ioctl(fd, LOOP_SET_FD, file_fd) < 0) {
+ SLOGE("Error setting up loopback interface (%s)", strerror(errno));
+ close(file_fd);
+ close(fd);
+ return -1;
+ }
+
+ close(fd);
+ close(file_fd);
+
+ SLOGD("loopsetfd (%s) ok\n", path);
+ return 0;
+}
+
+int VolumeManager::loopclrfd()
+{
+ int fd;
+ int rc=0;
+
+ if ((fd = open(LOOP_DEV, O_RDWR)) < 0) {
+ SLOGE("Unable to open loop0 device (%s)",strerror(errno));
+ return -1;
+ }
+
+ if (ioctl(fd, LOOP_CLR_FD, 0) < 0) {
+ SLOGE("Error setting up loopback interface (%s)", strerror(errno));
+ rc = -1;
+ }
+ close(fd);
+
+ SLOGD("loopclrfd ok\n");
+ return rc;
+}
+
+int VolumeManager::mountloop(const char * path) {
+ if (isMountpointMounted(LOOP_MOUNTPOINT)) {
+ SLOGW("loop file already mounted,please umount fist,then mount this file!");
+ errno = EBUSY;
+ return -1;
+ }
+
+ if (loopsetfd(path) < 0) {
+ return -1;
+ }
+
+ if (fs_prepare_dir(LOOP_MOUNTPOINT, 0700, AID_ROOT, AID_SDCARD_R)) {
+ SLOGE("failed to create loop mount points");
+ return -errno;
+ }
+
+ if (android::droidvold::iso9660::Mount(LOOP_DEV, LOOP_MOUNTPOINT, false, false,
+ AID_SDCARD_R, AID_SDCARD_R, 0007, true)) {
+ loopclrfd();
+ SLOGW("%s failed to mount via ISO9660(%s)", LOOP_DEV, strerror(errno));
+ return -1;
+ } else {
+ mLoopPath = strdup(path);
+ SLOGI("Successfully mount %s as ISO9660", LOOP_DEV);
+ }
+
+ return 0;
+}
+
+int VolumeManager::unmountloop(bool unused) {
+ if (!isMountpointMounted(LOOP_MOUNTPOINT)) {
+ SLOGW("no loop file mounted");
+ errno = ENOENT;
+ return -1;
+ }
+
+ android::droidvold::ForceUnmount(LOOP_MOUNTPOINT);
+ loopclrfd();
+ rmdir(LOOP_MOUNTPOINT);
+
+ if (mLoopPath != NULL) {
+ free(mLoopPath);
+ mLoopPath = NULL;
+ }
+
+ return 0;
+}
+
+void VolumeManager::unmountLoopIfNeed(const char *label) {
+ if (mLoopPath != NULL && strstr(mLoopPath, label)) {
+ SLOGD("umount loop");
+ unmountloop(true);
+ }
+}
+
+#endif
+
+bool VolumeManager::isMountpointMounted(const char *mp)
+{
+ FILE *fp = setmntent("/proc/mounts", "r");
+ if (fp == NULL) {
+ SLOGE("Error opening /proc/mounts (%s)", strerror(errno));
+ return false;
+ }
+
+ bool found_mp = false;
+ mntent* mentry;
+ while ((mentry = getmntent(fp)) != NULL) {
+ if (strcmp(mentry->mnt_dir, mp) == 0) {
+ found_mp = true;
+ break;
+ }
+ }
+ endmntent(fp);
+ return found_mp;
+}
+
+int VolumeManager::reset() {
+ // Tear down all existing disks/volumes and start from a blank slate so
+ // newly connected framework hears all events.
+ for (auto disk : mDisks) {
+ disk->destroy();
+ disk->reset();
+ }
+
+ return 0;
+}
+
+int VolumeManager::shutdown() {
+ for (auto disk : mDisks) {
+ disk->destroy();
+ }
+ mDisks.clear();
+ return 0;
+}
+
+int VolumeManager::mkdirs(char* path) {
+ // Only offer to create directories for paths managed by vold
+ if (strncmp(path, "/mnt/media_rw/", 13) == 0) {
+ // fs_mkdirs() does symlink checking and relative path enforcement
+ return fs_mkdirs(path, 0700);
+ } else {
+ SLOGE("Failed to find mounted volume for %s", path);
+ return -EINVAL;
+ }
+}
+
+static void do_coldboot(DIR *d, int lvl) {
+ struct dirent *de;
+ int dfd, fd;
+
+ dfd = dirfd(d);
+
+ fd = openat(dfd, "uevent", O_WRONLY | O_CLOEXEC);
+ if (fd >= 0) {
+ write(fd, "add\n", 4);
+ close(fd);
+ }
+
+ while ((de = readdir(d))) {
+ DIR *d2;
+
+ if (de->d_name[0] == '.')
+ continue;
+
+ if (de->d_type != DT_DIR && lvl > 0)
+ continue;
+
+ fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY);
+ if (fd < 0)
+ continue;
+
+ d2 = fdopendir(fd);
+ if (d2 == 0)
+ close(fd);
+ else {
+ do_coldboot(d2, lvl + 1);
+ closedir(d2);
+ }
+ }
+}
+
+void VolumeManager::coldboot(const char *path) {
+ DIR *d = opendir(path);
+
+ if (d) {
+ do_coldboot(d, 0);
+ closedir(d);
+ }
+}
+int VolumeManager::getDiskFlag(const std::string &path) {
+ if (mDebug)
+ LOG(DEBUG) << "getdisk flag path=" << path;
+ for (auto disk : mDisks) {
+ auto vol = disk->findVolumeByPath(path);
+ if (vol != nullptr) {
+ return disk->getFlags();
+ }
+ }
+ return 0;
+}
diff --git a/system/droidvold/VolumeManager.h b/system/droidvold/VolumeManager.h
new file mode 100755
index 0000000..59b8c69
--- a/dev/null
+++ b/system/droidvold/VolumeManager.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2008 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_DROIDVOLD_VOLUME_MANAGER_H
+#define ANDROID_DROIDVOLD_VOLUME_MANAGER_H
+
+#include <pthread.h>
+#include <fnmatch.h>
+#include <stdlib.h>
+
+#include <list>
+#include <mutex>
+#include <string>
+#include <unordered_map>
+#include <unordered_set>
+
+#include <cutils/multiuser.h>
+#include <utils/List.h>
+#include <utils/Timers.h>
+#include <sysutils/NetlinkEvent.h>
+
+#include "Disk.h"
+#include "VolumeBase.h"
+#include "DroidVold.h"
+
+using namespace android;
+using ::vendor::amlogic::hardware::droidvold::V1_0::implementation::DroidVold;
+
+class VolumeManager {
+public:
+#ifdef HAS_VIRTUAL_CDROM
+ char *mLoopPath;
+#endif
+
+private:
+ static VolumeManager *sInstance;
+
+ DroidVold *mBroadcaster;
+
+ bool mDebug;
+
+public:
+ virtual ~VolumeManager();
+ // TODO: pipe all requests through VM to avoid exposing this lock
+ std::mutex& getLock() { return mLock; }
+
+ int start();
+ int stop();
+
+ void handleBlockEvent(NetlinkEvent *evt);
+
+ class DiskSource {
+ public:
+ DiskSource(const std::string& sysPattern, const std::string& nickname, int flags) :
+ mSysPattern(sysPattern), mNickname(nickname), mFlags(flags) {
+ }
+
+ bool matches(const std::string& sysPath) {
+ return !fnmatch(mSysPattern.c_str(), sysPath.c_str(), 0);
+ }
+
+ const std::string& getNickname() { return mNickname; }
+ int getFlags() { return mFlags; }
+
+ private:
+ std::string mSysPattern;
+ std::string mNickname;
+ int mFlags;
+ };
+
+ void addDiskSource(const std::shared_ptr<DiskSource>& diskSource);
+ std::shared_ptr<android::droidvold::VolumeBase> findVolume(const std::string& id);
+ void listVolumes(android::droidvold::VolumeBase::Type type, std::list<std::string>& list);
+
+ /* Reset all internal state, typically during framework boot */
+ int reset();
+ /* Prepare for device shutdown, safely unmounting all devices */
+ int shutdown();
+
+ /* Unmount all volumes, usually for encryption */
+ int unmountAll();
+
+ /* for iso file mount and umount */
+#ifdef HAS_VIRTUAL_CDROM
+ int loopsetfd(const char * path);
+ int loopclrfd();
+ int mountloop(const char * path);
+ int unmountloop(bool force);
+ void unmountLoopIfNeed(const char *label);
+#endif
+
+ int setDebug(bool enable);
+ bool getDebug() { return mDebug; }
+
+ void setBroadcaster(DroidVold *sl) { mBroadcaster = sl; }
+ DroidVold *getBroadcaster() { return mBroadcaster; }
+
+ static VolumeManager *Instance();
+ bool isMountpointMounted(const char *mp);
+ int mkdirs(char* path);
+ void coldboot(const char *path);
+ int getDiskFlag(const std::string &path);
+
+private:
+ VolumeManager();
+
+ std::mutex mLock;
+ std::list<std::shared_ptr<DiskSource>> mDiskSources;
+ std::list<std::shared_ptr<android::droidvold::Disk>> mDisks;
+};
+
+#endif
diff --git a/system/droidvold/droidvold.rc b/system/droidvold/droidvold.rc
new file mode 100755
index 0000000..d8192a5
--- a/dev/null
+++ b/system/droidvold/droidvold.rc
@@ -0,0 +1,4 @@
+service droidvold /vendor/bin/droidvold
+ class core
+ ioprio be 2
+ writepid /dev/cpuset/foreground/tasks
diff --git a/system/droidvold/fs/Exfat.cpp b/system/droidvold/fs/Exfat.cpp
new file mode 100755
index 0000000..d05afbd
--- a/dev/null
+++ b/system/droidvold/fs/Exfat.cpp
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+#include <linux/kdev_t.h>
+
+#define LOG_TAG "droidVold"
+
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <logwrap/logwrap.h>
+#include <android-base/stringprintf.h>
+#include <android-base/logging.h>
+
+#include "Exfat.h"
+
+#define UNUSED __attribute__((unused))
+
+static char FSCK_EXFAT_PATH[] = "/system/bin/fsck.exfat";
+static char MKEXFAT_PATH[] = "/system/bin/mkfs.exfat";
+static char MOUNT_EXFAT_PATH[] = "/system/bin/mount.exfat";
+
+extern "C" int mount(
+ const char *, const char *, const char *,
+ unsigned long, const void *);
+
+namespace android {
+namespace droidvold {
+namespace exfat {
+
+int Check(const char *fsPath) {
+ bool rw = true;
+ if (access(FSCK_EXFAT_PATH, X_OK)) {
+ LOG(WARNING) << "skipping exfat check";
+ return 0;
+ }
+
+ int pass = 1;
+ int rc = 0;
+ int status;
+ do {
+ const char *args[3];
+ args[0] = FSCK_EXFAT_PATH;
+ args[1] = fsPath;
+ args[2] = NULL;
+
+ rc = android_fork_execvp(2, (char **)args, &status, false, true);
+ if (rc != 0) {
+ LOG(ERROR) << "exfat check failed due to logwrap error";
+ errno = EIO;
+ return -1;
+ }
+
+ if (!WIFEXITED(status)) {
+ LOG(ERROR) << "exfat check did not exit properly";
+ errno = EIO;
+ return -1;
+ }
+
+ status = WEXITSTATUS(status);
+ switch (status) {
+ case 0:
+ LOG(INFO) << "exfat check completed ok";
+ return 0;
+
+ case 2:
+ LOG(ERROR) << "exfat check failed (not exfat filesystem)";
+ errno = ENODATA;
+ return -1;
+
+ default:
+ LOG(ERROR) << "exfat check failed.unknown exit code " << status;
+ //errno = EIO;
+ //We can still mount some disks even if fs check failed.
+ return 0;
+ }
+ } while (0);
+
+ return 0;
+}
+
+int Mount(const char *fsPath, const char *mountPoint,
+ bool ro UNUSED, bool remount UNUSED, int ownerUid UNUSED,
+ int ownerGid UNUSED, int permMask UNUSED, bool createLost UNUSED) {
+#ifdef HAS_EXFAT_FUSE
+ int rc;
+ int status;
+ do {
+ const char *args[4];
+ args[0] = MOUNT_EXFAT_PATH;
+ args[1] = fsPath;
+ args[2] = mountPoint;
+ args[3] = NULL;
+
+ rc = android_fork_execvp(3, (char **)args, &status, false, true);
+ if (rc != 0) {
+ LOG(ERROR) << "exfat mount failed due to logwrap error";
+ errno = EIO;
+ return -1;
+ }
+
+ if (!WIFEXITED(status)) {
+ LOG(ERROR) << "exfat mount did not exit properly";
+ errno = EIO;
+ return -1;
+ }
+
+ status = WEXITSTATUS(status);
+ switch (status) {
+ case 0:
+ return 0; // mount ok
+
+ default:
+ LOG(ERROR) << "exfat mount failed.unknown exit code " << rc;
+ errno = EIO;
+ return -1;
+ }
+ } while (0);
+#else
+ int rc;
+ unsigned long flags;
+ char mountData[255];
+
+ flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC;
+ flags |= (ro ? MS_RDONLY : 0);
+ flags |= (remount ? MS_REMOUNT : 0);
+
+ sprintf(mountData, "uid=%d,gid=%d,fmask=%o,dmask=%o",
+ ownerUid, ownerGid, permMask, permMask);
+
+ rc = mount(fsPath, mountPoint, "exfat", flags, mountData);
+ if (rc && errno == EROFS) {
+ LOG(ERROR) << fsPath <<
+ " appears to be a read only filesystem - retry mount ro";
+ flags |= MS_RDONLY;
+ rc = mount(fsPath, mountPoint, "exfat", flags, mountData);
+ }
+#endif
+ return rc;
+}
+
+int Format(const char *fsPath, unsigned int numSectors) {
+ const char *args[11];
+ int rc;
+ int status;
+ args[0] = MKEXFAT_PATH;
+
+ if (numSectors) {
+ char tmp[32];
+ snprintf(tmp, sizeof(tmp), "%u", numSectors);
+ const char *size = tmp;
+ args[1] = "-s";
+ args[2] = size;
+ args[3] = fsPath;
+ args[4] = NULL;
+ rc = android_fork_execvp(4, (char **)args, &status, false, true);
+ } else {
+ args[7] = fsPath;
+ args[8] = NULL;
+ rc = android_fork_execvp(8, (char **)args, &status, false, true);
+ }
+
+ if (rc != 0) {
+ LOG(ERROR) << "exfat check failed due to logwrap error";
+ errno = EIO;
+ return -1;
+ }
+
+ if (!WIFEXITED(status)) {
+ LOG(ERROR) << "exfat check did not exit properly";
+ errno = EIO;
+ return -1;
+ }
+
+ status = WEXITSTATUS(status);
+ if (status == 0) {
+ LOG(INFO) << "exfat format ok";
+ return 0;
+ } else {
+ LOG(ERROR) << "exfat format failed.unknown exit code " << rc;
+ errno = EIO;
+ return -1;
+ }
+}
+
+} // namespace exfat
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/fs/Exfat.h b/system/droidvold/fs/Exfat.h
new file mode 100755
index 0000000..5b86a4d
--- a/dev/null
+++ b/system/droidvold/fs/Exfat.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 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_VOLD_EXFAT_H
+#define ANDROID_VOLD_EXFAT_H
+
+#include <unistd.h>
+#include <string>
+
+namespace android {
+namespace droidvold {
+namespace exfat {
+
+int Check(const char *fsPath);
+int Mount(const char *fsPath, const char *mountPoint, bool ro,
+ bool remount, int ownerUid, int ownerGid, int permMask,
+ bool createLost);
+int Format(const char *fsPath, unsigned int numSectors);
+
+} // namespace exfat
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/fs/Ext4.cpp b/system/droidvold/fs/Ext4.cpp
new file mode 100755
index 0000000..a0708e2
--- a/dev/null
+++ b/system/droidvold/fs/Ext4.cpp
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2012 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 <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <vector>
+#include <string>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+
+#include <linux/kdev_t.h>
+
+#define LOG_TAG "droidVold"
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <logwrap/logwrap.h>
+#include <selinux/selinux.h>
+
+#include "Ext4.h"
+#include "Utils.h"
+
+using android::base::StringPrintf;
+
+namespace android {
+namespace droidvold {
+namespace ext4 {
+
+static const char* kResizefsPath = "/system/bin/resize2fs";
+static const char* kMkfsPath = "/system/bin/make_ext4fs";
+static const char* kFsckPath = "/system/bin/e2fsck";
+
+bool IsSupported() {
+ return access(kMkfsPath, X_OK) == 0
+ && access(kFsckPath, X_OK) == 0
+ && IsFilesystemSupported("ext4");
+}
+
+status_t Check(const std::string& source, const std::string& target) {
+ // The following is shamelessly borrowed from fs_mgr.c, so it should be
+ // kept in sync with any changes over there.
+
+ const char* c_source = source.c_str();
+ const char* c_target = target.c_str();
+
+ int status;
+ int ret;
+ long tmpmnt_flags = MS_NOATIME | MS_NOEXEC | MS_NOSUID;
+ char *tmpmnt_opts = (char*) "nomblk_io_submit,errors=remount-ro";
+
+ /*
+ * First try to mount and unmount the filesystem. We do this because
+ * the kernel is more efficient than e2fsck in running the journal and
+ * processing orphaned inodes, and on at least one device with a
+ * performance issue in the emmc firmware, it can take e2fsck 2.5 minutes
+ * to do what the kernel does in about a second.
+ *
+ * After mounting and unmounting the filesystem, run e2fsck, and if an
+ * error is recorded in the filesystem superblock, e2fsck will do a full
+ * check. Otherwise, it does nothing. If the kernel cannot mount the
+ * filesytsem due to an error, e2fsck is still run to do a full check
+ * fix the filesystem.
+ */
+ ret = mount(c_source, c_target, "ext4", tmpmnt_flags, tmpmnt_opts);
+ if (!ret) {
+ int i;
+ for (i = 0; i < 5; i++) {
+ // Try to umount 5 times before continuing on.
+ // Should we try rebooting if all attempts fail?
+ int result = umount(c_target);
+ if (result == 0) {
+ break;
+ }
+ ALOGW("%s(): umount(%s)=%d: %s\n", __func__, c_target, result, strerror(errno));
+ sleep(1);
+ }
+ }
+
+ /*
+ * Some system images do not have e2fsck for licensing reasons
+ * (e.g. recent SDK system images). Detect these and skip the check.
+ */
+ if (access(kFsckPath, X_OK)) {
+ ALOGD("Not running %s on %s (executable not in system image)\n",
+ kFsckPath, c_source);
+ } else {
+ ALOGD("Running %s on %s\n", kFsckPath, c_source);
+
+ std::vector<std::string> cmd;
+ cmd.push_back(kFsckPath);
+ cmd.push_back("-y");
+ cmd.push_back(c_source);
+
+ // ext4 devices are currently always trusted
+ return ForkExecvp(cmd, sFsckContext);
+ }
+
+ return 0;
+}
+
+status_t Mount(const std::string& source, const std::string& target, bool ro,
+ bool remount, bool executable, const std::string& type) {
+ int rc;
+ unsigned long flags;
+
+ const char* c_source = source.c_str();
+ const char* c_target = target.c_str();
+
+ flags = MS_NOATIME | MS_NODEV | MS_NOSUID | MS_DIRSYNC;
+
+ flags |= (executable ? 0 : MS_NOEXEC);
+ flags |= (ro ? MS_RDONLY : 0);
+ flags |= (remount ? MS_REMOUNT : 0);
+
+ rc = mount(c_source, c_target, type.c_str(), flags, NULL);
+
+ if (rc && errno == EROFS) {
+ SLOGE("%s appears to be a read only filesystem - retrying mount RO", c_source);
+ flags |= MS_RDONLY;
+ rc = mount(c_source, c_target, type.c_str(), flags, NULL);
+ }
+
+ return rc;
+}
+
+status_t Resize(const std::string& source, unsigned long numSectors) {
+ std::vector<std::string> cmd;
+ cmd.push_back(kResizefsPath);
+ cmd.push_back("-f");
+ cmd.push_back(source);
+ cmd.push_back(StringPrintf("%lu", numSectors));
+
+ return ForkExecvp(cmd);
+}
+
+status_t Format(const std::string& source, unsigned long numSectors,
+ const std::string& target) {
+ std::vector<std::string> cmd;
+ cmd.push_back(kMkfsPath);
+ cmd.push_back("-J");
+
+ cmd.push_back("-a");
+ cmd.push_back(target);
+
+ if (numSectors) {
+ cmd.push_back("-l");
+ cmd.push_back(StringPrintf("%lu", numSectors * 512));
+ }
+
+ // Always generate a real UUID
+ cmd.push_back("-u");
+ cmd.push_back(source);
+
+ return ForkExecvp(cmd);
+}
+
+} // namespace ext4
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/fs/Ext4.h b/system/droidvold/fs/Ext4.h
new file mode 100755
index 0000000..c071066
--- a/dev/null
+++ b/system/droidvold/fs/Ext4.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012 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_VOLD_EXT4_H
+#define ANDROID_VOLD_EXT4_H
+
+#include <utils/Errors.h>
+
+#include <string>
+
+namespace android {
+namespace droidvold {
+namespace ext4 {
+
+bool IsSupported();
+
+status_t Check(const std::string& source, const std::string& target);
+status_t Mount(const std::string& source, const std::string& target, bool ro,
+ bool remount, bool executable, const std::string& type="ext4");
+status_t Format(const std::string& source, unsigned long numSectors,
+ const std::string& target);
+status_t Resize(const std::string& source, unsigned long numSectors);
+
+} // namespace ext4
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/fs/F2fs.cpp b/system/droidvold/fs/F2fs.cpp
new file mode 100755
index 0000000..0fd32fa
--- a/dev/null
+++ b/system/droidvold/fs/F2fs.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015 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 "F2fs.h"
+#include "Utils.h"
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+
+#include <vector>
+#include <string>
+
+#include <sys/mount.h>
+
+using android::base::StringPrintf;
+
+namespace android {
+namespace droidvold {
+namespace f2fs {
+
+static const char* kMkfsPath = "/system/bin/make_f2fs";
+static const char* kFsckPath = "/system/bin/fsck.f2fs";
+
+bool IsSupported() {
+ return access(kMkfsPath, X_OK) == 0
+ && access(kFsckPath, X_OK) == 0
+ && IsFilesystemSupported("f2fs");
+}
+
+status_t Check(const std::string& source) {
+ std::vector<std::string> cmd;
+ cmd.push_back(kFsckPath);
+ cmd.push_back("-a");
+ cmd.push_back(source);
+
+ // f2fs devices are currently always trusted
+ return ForkExecvp(cmd, sFsckContext);
+}
+
+status_t Mount(const std::string& source, const std::string& target) {
+ const char* c_source = source.c_str();
+ const char* c_target = target.c_str();
+ unsigned long flags = MS_NOATIME | MS_NODEV | MS_NOSUID | MS_DIRSYNC;
+
+ int res = mount(c_source, c_target, "f2fs", flags, NULL);
+ if (res != 0) {
+ PLOG(ERROR) << "Failed to mount " << source;
+ if (errno == EROFS) {
+ res = mount(c_source, c_target, "f2fs", flags | MS_RDONLY, NULL);
+ if (res != 0) {
+ PLOG(ERROR) << "Failed to mount read-only " << source;
+ }
+ }
+ }
+
+ return res;
+}
+
+status_t Format(const std::string& source) {
+ std::vector<std::string> cmd;
+ cmd.push_back(kMkfsPath);
+ cmd.push_back(source);
+
+ return ForkExecvp(cmd);
+}
+
+} // namespace f2fs
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/fs/F2fs.h b/system/droidvold/fs/F2fs.h
new file mode 100755
index 0000000..ede9465
--- a/dev/null
+++ b/system/droidvold/fs/F2fs.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2015 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_VOLD_F2FS_H
+#define ANDROID_VOLD_F2FS_H
+
+#include <utils/Errors.h>
+
+#include <string>
+
+namespace android {
+namespace droidvold {
+namespace f2fs {
+
+bool IsSupported();
+
+status_t Check(const std::string& source);
+status_t Mount(const std::string& source, const std::string& target);
+status_t Format(const std::string& source);
+
+} // namespace f2fs
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/fs/Hfsplus.cpp b/system/droidvold/fs/Hfsplus.cpp
new file mode 100755
index 0000000..8a01d03
--- a/dev/null
+++ b/system/droidvold/fs/Hfsplus.cpp
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+
+#include <linux/kdev_t.h>
+
+#define LOG_TAG "droidVold"
+
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <logwrap/logwrap.h>
+#include <android-base/stringprintf.h>
+#include <android-base/logging.h>
+
+#include "Hfsplus.h"
+
+#define UNUSED __attribute__((unused))
+
+static char FSCK_HFSPLUS_PATH[] = "/system/bin/fsck_hfsplus";
+
+extern "C" int mount(
+ const char *, const char *, const char *,
+ unsigned long, const void *);
+
+namespace android {
+namespace droidvold {
+namespace hfsplus {
+
+int Check(const char *fsPath) {
+ bool rw = true;
+ if (access(FSCK_HFSPLUS_PATH, X_OK)) {
+ LOG(WARNING) << "skipping hfsplus check";
+ return 0;
+ }
+
+ int pass = 1;
+ int rc = 0;
+ int status;
+
+ do {
+ const char *args[5];
+ args[0] = FSCK_HFSPLUS_PATH;
+ args[1] = "-p";
+ args[2] = "-f";
+ args[3] = fsPath;
+ args[4] = NULL;
+
+ rc = android_fork_execvp(4, (char **)args, &status, false, true);
+ if (rc != 0) {
+ LOG(ERROR) << "hfsplus check failed due to logwrap error";
+ errno = EIO;
+ return -1;
+ }
+
+ if (!WIFEXITED(status)) {
+ LOG(ERROR) << "hfsplus chedk did not exit properly";
+ errno = EIO;
+ return -1;
+ }
+
+ status = WEXITSTATUS(status);
+ switch (status) {
+ case 0:
+ LOG(INFO) << "hfsplus check completed ok";
+ return 0;
+
+ case 8:
+ LOG(ERROR) << "hfsplus check failed (not hfsplus filesystem)";
+ errno = ENODATA;
+ return -1;
+
+ case 4:
+ if (pass++ <= 3) {
+ LOG(INFO) << "hfsplus modified - rechecking pass " << pass;
+ continue;
+ }
+ LOG(ERROR) << "failed check hfsplus after too many rechecks";
+ errno = EIO;
+ return -1;
+
+ default:
+ LOG(ERROR) << "hfsplus check failed.unknown exit code " << rc;
+ errno = EIO;
+ return -1;
+ }
+ } while (0);
+
+ return 0;
+}
+
+int Mount(const char *fsPath, const char *mountPoint,
+ bool ro, bool remount, int ownerUid, int ownerGid,
+ int permMask UNUSED, bool createLost UNUSED) {
+ int rc;
+ unsigned long flags;
+ char mountData[255];
+
+ flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC;
+ flags |= (ro ? MS_RDONLY : 0);
+ flags |= (remount ? MS_REMOUNT : 0);
+
+ permMask = 0;
+ sprintf(mountData, "nls=utf8,uid=%d,gid=%d", ownerUid, ownerGid);
+
+ rc = mount(fsPath, mountPoint, "hfsplus", flags, mountData);
+ if (rc && errno == EROFS) {
+ LOG(ERROR) << fsPath <<
+ " appears to be a read only filesystem - retrying mount ro";
+ flags |= MS_RDONLY;
+ rc = mount(fsPath, mountPoint, "hfsplus", flags, mountData);
+ }
+
+ return rc;
+}
+
+int Format(const char *fsPath UNUSED, unsigned int numSectors UNUSED) {
+ LOG(WARNING) << "skipping hfsplus format";
+ errno = EIO;
+ return -1;
+}
+
+} // namespace hfsplus
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/fs/Hfsplus.h b/system/droidvold/fs/Hfsplus.h
new file mode 100755
index 0000000..52171c8
--- a/dev/null
+++ b/system/droidvold/fs/Hfsplus.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 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_VOLD_HFSPLUS_H
+#define ANDROID_VOLD_HFSPLUS_H
+
+#include <unistd.h>
+#include <string>
+
+namespace android {
+namespace droidvold {
+namespace hfsplus {
+
+int Check(const char *fsPath);
+int Mount(const char *fsPath, const char *mountPoint, bool ro,
+ bool remount, int ownerUid, int ownerGid, int permMask,
+ bool createLost);
+int Format(const char *fsPath, unsigned int numSectors);
+
+} // namespace hfsplus
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/fs/Iso9660.cpp b/system/droidvold/fs/Iso9660.cpp
new file mode 100755
index 0000000..8918f48
--- a/dev/null
+++ b/system/droidvold/fs/Iso9660.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+
+#include <linux/kdev_t.h>
+
+#define LOG_TAG "droidVold"
+
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <android-base/stringprintf.h>
+#include <android-base/logging.h>
+
+#include "Iso9660.h"
+
+#define UNUSED __attribute__((unused))
+
+extern "C" int mount(
+ const char *, const char *, const char *,
+ unsigned long, const void *);
+
+namespace android {
+namespace droidvold {
+namespace iso9660 {
+
+int Check(const char *fsPath UNUSED) {
+ LOG(WARNING) << "skipping iso9660 check";
+ return 0;
+}
+
+int Mount(const char *fsPath, const char *mountPoint,
+ bool ro UNUSED, bool remount, int ownerUid, int ownerGid,
+ int permMask UNUSED, bool createLost UNUSED) {
+ int rc;
+ unsigned long flags;
+ char mountData[255];
+
+ flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC;
+ flags |= MS_RDONLY;
+ flags |= (remount ? MS_REMOUNT : 0);
+
+ sprintf(mountData, "utf8,uid=%d,gid=%d",ownerUid, ownerGid);
+
+ rc = mount(fsPath, mountPoint, "iso9660", flags, mountData);
+ if (rc !=0) {
+ rc = mount(fsPath, mountPoint, "udf", flags, mountData);
+ }
+
+ return rc;
+}
+
+int Format(const char *fsPath UNUSED, unsigned int numSectors UNUSED) {
+ LOG(WARNING) << "skipping iso9660 format";
+ errno = EIO;
+ return -1;
+}
+
+} // namespace iso9660
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/fs/Iso9660.h b/system/droidvold/fs/Iso9660.h
new file mode 100755
index 0000000..1606621
--- a/dev/null
+++ b/system/droidvold/fs/Iso9660.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 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_VOLD_ISO9660_H
+#define ANDROID_VOLD_ISO9660_H
+
+#include <unistd.h>
+#include <string>
+
+namespace android {
+namespace droidvold {
+namespace iso9660 {
+
+int Check(const char *fsPath);
+int Mount(const char *fsPath, const char *mountPoint, bool ro,
+ bool remount, int ownerUid, int ownerGid, int permMask,
+ bool createLost);
+int format(const char *fsPath, unsigned int numSectors);
+
+} // namespace iso9660
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/fs/Ntfs.cpp b/system/droidvold/fs/Ntfs.cpp
new file mode 100755
index 0000000..7571e34
--- a/dev/null
+++ b/system/droidvold/fs/Ntfs.cpp
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+
+#include <linux/kdev_t.h>
+
+#define LOG_TAG "droidVold"
+
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <logwrap/logwrap.h>
+#include <android-base/stringprintf.h>
+#include <android-base/logging.h>
+
+#include "Ntfs.h"
+
+#define UNUSED __attribute__((unused))
+
+#ifdef HAS_NTFS_3G
+static char NTFS_3G_PATH[] = "/vendor/bin/ntfs-3g";
+static char NTFSFIX_3G_PATH[] = "/vendor/bin/ntfsfix";
+static char MKNTFS_3G_PATH[] = "/vendor/bin/mkntfs";
+#endif /* HAS_NTFS_3G */
+
+extern "C" int mount(
+ const char *, const char *, const char *,
+ unsigned long, const void *);
+
+namespace android {
+namespace droidvold {
+namespace ntfs {
+
+int Check(const char *fsPath UNUSED) {
+#ifndef HAS_NTFS_3G
+ LOG(WARNING) << "skipping ntfs check";
+ return 0;
+#else
+ bool rw = true;
+ if (access(NTFSFIX_3G_PATH, X_OK)) {
+ LOG(WARNING) << "skipping ntfs check";
+ return 0;
+ }
+
+ int pass = 1;
+ int rc = 0;
+ int status;
+ do {
+ const char *args[4];
+ args[0] = NTFSFIX_3G_PATH;
+ args[1] = "-n";
+ args[2] = fsPath;
+ args[3] = NULL;
+
+ rc = android_fork_execvp(3, (char **)args, &status, false, true);
+ if (rc != 0) {
+ LOG(ERROR) << "ntfs check failed due to logwrap error";
+ errno = EIO;
+ return -1;
+ }
+
+ if (!WIFEXITED(status)) {
+ LOG(ERROR) << "ntfs check did not exit properly";
+ errno = EIO;
+ return -1;
+ }
+
+ status = WEXITSTATUS(status);
+
+ switch (status) {
+ case 0:
+ LOG(INFO) << "ntfs check completed ok";
+ return 0;
+ case 1:
+ LOG(ERROR) << "ntfs check failed (not a ntfs filesystem)";
+ errno = ENODATA;
+ return -1;
+ default:
+ LOG(ERROR) << "ntfs check failed.unknown exit code " << rc;
+ errno = EIO;
+ return -1;
+ }
+ } while (0);
+
+ return 0;
+#endif
+}
+
+int Mount(const char *fsPath, const char *mountPoint,
+ bool ro UNUSED, bool remount UNUSED, int ownerUid,
+ int ownerGid, int permMask, bool createLost UNUSED) {
+#ifndef HAS_NTFS_3G
+ int rc;
+ unsigned long flags;
+ char mountData[255];
+
+ flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC;
+ flags |= (ro ? MS_RDONLY : 0);
+ flags |= (remount ? MS_REMOUNT : 0);
+
+ permMask = 0;
+ sprintf(mountData, "uid=%d,gid=%d,fmask=%o,dmask=%o",
+ ownerUid, ownerGid, permMask, permMask);
+
+ rc = mount(fsPath, mountPoint, "ntfs", flags, mountData);
+ if (rc && errno == EROFS) {
+ LOG(ERROR) << fsPath <<
+ " appears to be a read only filesystem - retry mount ro";
+ flags |= MS_RDONLY;
+ rc = mount(fsPath, mountPoint, "ntfs", flags, mountData);
+ }
+
+ return rc;
+#else
+ int rc;
+ int status;
+ const char *args[11];
+ char mountData[255];
+
+ sprintf(mountData, "locale=utf8,uid=%d,gid=%d,fmask=%o,dmask=%o",
+ ownerUid, ownerGid, permMask, permMask);
+
+ args[0] = NTFS_3G_PATH;
+ args[1] = fsPath;
+ args[2] = mountPoint;
+ args[3] = "-o";
+ args[4] = mountData;
+ args[5] = NULL;
+
+ rc = android_fork_execvp(5, (char **)args, &status, false, true);
+ if (rc != 0) {
+ LOG(ERROR) << "ntfs check failed due to logwrap error";
+ errno = EIO;
+ return -1;
+ }
+
+ if (!WIFEXITED(status)) {
+ LOG(ERROR) << "ntfs check did not exit properly";
+ errno = EIO;
+ return -1;
+ }
+
+ status = WEXITSTATUS(status);
+ return status;
+#endif /* HAS_NTFS_3G */
+}
+
+int Format(const char *fsPath UNUSED, unsigned int numSectors UNUSED) {
+#ifndef HAS_NTFS_3G
+ LOG(WARNING) << "skipping ntfs format";
+ errno = EIO;
+ return -1;
+#else
+ char * label = NULL;
+ int fd;
+ int argc;
+ const char *args[10];
+ int rc;
+ int status;
+
+ args[0] = MKNTFS_3G_PATH;
+ args[1] = "-f";
+
+ if (numSectors) {
+ char tmp[32];
+ snprintf(tmp, sizeof(tmp), "%u", numSectors);
+ const char *size = tmp;
+ args[2] = "-s";
+ args[3] = size;
+ if (label == NULL) {
+ args[4] = fsPath;
+ args[5] = NULL;
+ argc = 6;
+ } else {
+ args[4] = "-L";
+ args[5] = label;
+ args[6] = fsPath;
+ args[7] = NULL;
+ argc = 7;
+ }
+ } else {
+ if (label == NULL) {
+ args[2] = fsPath;
+ args[3] = NULL;
+ argc = 3;
+ } else {
+ args[2] = "-L";
+ args[3] = label;
+ args[4] = fsPath;
+ args[5] = NULL;
+ argc = 5;
+ }
+ }
+
+ rc = android_fork_execvp(argc, (char **)args, &status, false, true);
+ if (rc != 0) {
+ LOG(ERROR) << "ntfs format failed due to logwrap error";
+ errno = EIO;
+ return -1;
+ }
+
+ if (!WIFEXITED(status)) {
+ LOG(ERROR) << "ntfs format did not exit properly";
+ errno = EIO;
+ return -1;
+ }
+
+ status = WEXITSTATUS(status);
+ if (status == 0) {
+ LOG(INFO) << "ntfs formatted ok";
+ } else {
+ LOG(ERROR) << "ntfs Format failed.unknown exit code " << rc;
+ errno = EIO;
+ return -1;
+ }
+ return 0;
+#endif
+}
+
+} // namespace ntfs
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/fs/Ntfs.h b/system/droidvold/fs/Ntfs.h
new file mode 100755
index 0000000..f68080f
--- a/dev/null
+++ b/system/droidvold/fs/Ntfs.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2008 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_VOLD_NTFS_H
+#define ANDROID_VOLD_NTFS_H
+
+#include <utils/Errors.h>
+#include <unistd.h>
+#include <string>
+
+namespace android {
+namespace droidvold {
+namespace ntfs {
+
+int Check(const char *fsPath);
+int Mount(const char *fsPath, const char *mountPoint, bool ro,
+ bool remount, int ownerUid, int ownerGid, int permMask,
+ bool createLost);
+int Format(const char *fsPath, unsigned int numSectors);
+
+} // namespace ntfs
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/fs/Sdcardfs.cpp b/system/droidvold/fs/Sdcardfs.cpp
new file mode 100755
index 0000000..faaa883
--- a/dev/null
+++ b/system/droidvold/fs/Sdcardfs.cpp
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+#include <linux/fs.h>
+#include <sys/ioctl.h>
+
+#include <linux/kdev_t.h>
+
+#define LOG_TAG "droidVold"
+
+#include <android-base/logging.h>
+#include <android-base/strings.h>
+#include <android-base/file.h>
+#include <android-base/macros.h>
+#include <android-base/stringprintf.h>
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <cutils/multiuser.h>
+
+#include <private/android_filesystem_config.h>
+
+#include "Utils.h"
+
+#define PROP_SDCARDFS_DEVICE "ro.sys.sdcardfs"
+#define PROP_SDCARDFS_USER "persist.sys.sdcardfs"
+
+using android::base::StringPrintf;
+
+namespace android {
+namespace droidvold {
+namespace sdcardfs {
+
+static bool supports_sdcardfs(void) {
+ std::string filesystems;
+ if (!android::base::ReadFileToString("/proc/filesystems", &filesystems)) {
+ PLOG(ERROR) << "Could not read /proc/filesystems";
+ return false;
+ }
+ for (const auto& fs : android::base::Split(filesystems, "\n")) {
+ if (fs.find("sdcardfs") != std::string::npos) return true;
+ }
+ return false;
+}
+
+static bool should_use_sdcardfs(void) {
+ char property[PROPERTY_VALUE_MAX];
+
+ // Allow user to have a strong opinion about state
+ property_get(PROP_SDCARDFS_USER, property, "");
+ if (!strcmp(property, "force_on")) {
+ LOG(WARNING) << "User explicitly enabled sdcardfs";
+ return supports_sdcardfs();
+ } else if (!strcmp(property, "force_off")) {
+ LOG(WARNING) << "User explicitly disabled sdcardfs";
+ return false;
+ }
+
+ // Fall back to device opinion about state
+ if (property_get_bool(PROP_SDCARDFS_DEVICE, true)) {
+ LOG(WARNING) << "Device explicitly enabled sdcardfs";
+ return supports_sdcardfs();
+ } else {
+ LOG(WARNING) << "Device explicitly disabled sdcardfs";
+ return false;
+ }
+}
+
+
+static bool sdcardfs_setup(const std::string& source_path, const std::string& dest_path, uid_t fsuid,
+ gid_t fsgid, bool multi_user, userid_t userid, gid_t gid, mode_t mask) {
+ std::string opts = android::base::StringPrintf("fsuid=%d,fsgid=%d,%smask=%d,userid=%d,gid=%d",
+ fsuid, fsgid, multi_user?"multiuser,":"", mask, userid, gid);
+
+ if (mount(source_path.c_str(), dest_path.c_str(), "sdcardfs",
+ MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_NOATIME, opts.c_str()) == -1) {
+ PLOG(ERROR) << "failed to mount sdcardfs filesystem";
+ return false;
+ }
+
+ return true;
+}
+
+static bool sdcardfs_setup_bind_remount(const std::string& source_path, const std::string& dest_path,
+ gid_t gid, mode_t mask) {
+ std::string opts = android::base::StringPrintf("mask=%d,gid=%d", mask, gid);
+
+ if (mount(source_path.c_str(), dest_path.c_str(), nullptr,
+ MS_BIND, nullptr) != 0) {
+ PLOG(ERROR) << "failed to bind mount sdcardfs filesystem";
+ return false;
+ }
+
+ if (mount(source_path.c_str(), dest_path.c_str(), "none",
+ MS_REMOUNT | MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_NOATIME, opts.c_str()) != 0) {
+ PLOG(ERROR) << "failed to mount sdcardfs filesystem";
+ if (umount2(dest_path.c_str(), MNT_DETACH))
+ PLOG(WARNING) << "Failed to unmount bind";
+ return false;
+ }
+
+ return true;
+}
+
+
+int run_sdcardfs(const std::string& source_path, const std::string& label, uid_t uid,
+ gid_t gid, userid_t userid, bool multi_user, bool full_write) {
+ std::string dest_path_default = "/mnt/runtime/default/" + label;
+ std::string dest_path_read = "/mnt/runtime/read/" + label;
+ std::string dest_path_write = "/mnt/runtime/write/" + label;
+
+ umask(0);
+ if (multi_user) {
+ // Multi-user storage is fully isolated per user, so "other"
+ // permissions are completely masked off.
+ if (!sdcardfs_setup(source_path, dest_path_default, uid, gid, multi_user, userid,
+ AID_SDCARD_RW, 0006)
+ || !sdcardfs_setup_bind_remount(dest_path_default, dest_path_read, AID_EVERYBODY, 0027)
+ || !sdcardfs_setup_bind_remount(dest_path_default, dest_path_write,
+ AID_EVERYBODY, full_write ? 0007 : 0027)) {
+ PLOG(ERROR) << "failed to sdcardfs_setup";
+ }
+ } else {
+ // Physical storage is readable by all users on device, but
+ // the Android directories are masked off to a single user
+ // deep inside attr_from_stat().
+ if (!sdcardfs_setup(source_path, dest_path_default, uid, gid, multi_user, userid,
+ AID_SDCARD_RW, 0006)
+ || !sdcardfs_setup_bind_remount(dest_path_default, dest_path_read,
+ AID_EVERYBODY, full_write ? 0027 : 0022)
+ || !sdcardfs_setup_bind_remount(dest_path_default, dest_path_write,
+ AID_EVERYBODY, full_write ? 0007 : 0022)) {
+ PLOG(ERROR) << "failed to sdcardfs_setup";
+ }
+ }
+
+ return 0;
+}
+
+
+} // namespace sdcardfs
+} // namespace droidvold
+} // namespace android
diff --git a/system/droidvold/fs/Sdcardfs.h b/system/droidvold/fs/Sdcardfs.h
new file mode 100755
index 0000000..c43dd0d
--- a/dev/null
+++ b/system/droidvold/fs/Sdcardfs.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2008 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_VOLD_SDCARD_H
+#define ANDROID_VOLD_SDCARD_H
+
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <string>
+#include <cutils/multiuser.h>
+
+namespace android {
+namespace droidvold {
+namespace sdcardfs {
+
+int run_sdcardfs(const std::string& source_path, const std::string& label, uid_t uid,
+ gid_t gid, userid_t userid, bool multi_user, bool full_write);
+
+} // namespace sdcardfs
+} // namespace droidvold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/fs/Vfat.cpp b/system/droidvold/fs/Vfat.cpp
new file mode 100755
index 0000000..6b9d53c
--- a/dev/null
+++ b/system/droidvold/fs/Vfat.cpp
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2008 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 <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+#include <linux/fs.h>
+#include <sys/ioctl.h>
+
+#include <linux/kdev_t.h>
+
+#define LOG_TAG "droidVold"
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <selinux/selinux.h>
+
+#include <logwrap/logwrap.h>
+
+#include "Vfat.h"
+#include "Utils.h"
+
+using android::base::StringPrintf;
+
+namespace android {
+namespace droidvold {
+namespace vfat {
+
+static const char* kMkfsPath = "/system/bin/newfs_msdos";
+static const char* kFsckPath = "/system/bin/fsck_msdos";
+
+bool IsSupported() {
+ return access(kMkfsPath, X_OK) == 0
+ && access(kFsckPath, X_OK) == 0
+ && IsFilesystemSupported("vfat");
+}
+
+status_t Check(const std::string& source) {
+ if (access(kFsckPath, X_OK)) {
+ SLOGW("Skipping fs checks\n");
+ return 0;
+ }
+
+ int pass = 1;
+ int rc = 0;
+ do {
+ std::vector<std::string> cmd;
+ cmd.push_back(kFsckPath);
+ cmd.push_back("-p");
+ cmd.push_back("-f");
+ cmd.push_back(source);
+
+ // Fat devices are currently always untrusted
+ rc = ForkExecvp(cmd, sFsckUntrustedContext);
+
+ if (rc < 0) {
+ SLOGE("Filesystem check failed due to logwrap error");
+ errno = EIO;
+ return -1;
+ }
+
+ switch (rc) {
+ case 0:
+ SLOGI("Filesystem check completed OK");
+ return 0;
+
+ case 2:
+ SLOGE("Filesystem check failed (not a FAT filesystem)");
+ errno = ENODATA;
+ return -1;
+
+ case 4:
+ if (pass++ <= 3) {
+ SLOGW("Filesystem modified - rechecking (pass %d)",
+ pass);
+ continue;
+ }
+ SLOGE("Failing check after too many rechecks");
+ errno = EIO;
+ return -1;
+
+ case 8:
+ SLOGE("Filesystem check failed (no filesystem)");
+ errno = ENODATA;
+ return -1;
+
+ default:
+ SLOGE("Filesystem check failed (unknown exit code %d)", rc);
+ errno = EIO;
+ return -1;
+ }
+ } while (0);
+
+ return 0;
+}
+
+status_t Mount(const std::string& source, const std::string& target, bool ro,
+ bool remount, bool executable, int ownerUid, int ownerGid, int permMask,
+ bool createLost) {
+ int rc;
+ unsigned long flags;
+ char mountData[255];
+
+ const char* c_source = source.c_str();
+ const char* c_target = target.c_str();
+
+ flags = MS_NODEV | MS_NOSUID | MS_DIRSYNC;
+
+ flags |= (executable ? 0 : MS_NOEXEC);
+ flags |= (ro ? MS_RDONLY : 0);
+ flags |= (remount ? MS_REMOUNT : 0);
+
+ sprintf(mountData,
+ "utf8,uid=%d,gid=%d,fmask=%o,dmask=%o,shortname=mixed",
+ ownerUid, ownerGid, permMask, permMask);
+
+ rc = mount(c_source, c_target, "vfat", flags, mountData);
+
+ if (rc && errno == EROFS) {
+ SLOGE("%s appears to be a read only filesystem - retrying mount RO", c_source);
+ flags |= MS_RDONLY;
+ rc = mount(c_source, c_target, "vfat", flags, mountData);
+ }
+
+ if (rc == 0 && createLost) {
+ char *lost_path;
+ asprintf(&lost_path, "%s/LOST.DIR", c_target);
+ if (access(lost_path, F_OK)) {
+ /*
+ * Create a LOST.DIR in the root so we have somewhere to put
+ * lost cluster chains (fsck_msdos doesn't currently do this)
+ */
+ if (mkdir(lost_path, 0755)) {
+ SLOGE("Unable to create LOST.DIR (%s)", strerror(errno));
+ }
+ }
+ free(lost_path);
+ }
+
+ return rc;
+}
+
+status_t Format(const std::string& source, unsigned long numSectors) {
+ std::vector<std::string> cmd;
+ cmd.push_back(kMkfsPath);
+ cmd.push_back("-F");
+ cmd.push_back("32");
+ cmd.push_back("-O");
+ cmd.push_back("android");
+ cmd.push_back("-c");
+ cmd.push_back("64");
+ cmd.push_back("-A");
+
+ if (numSectors) {
+ cmd.push_back("-s");
+ cmd.push_back(StringPrintf("%lu", numSectors));
+ }
+
+ cmd.push_back(source);
+
+ int rc = ForkExecvp(cmd);
+ if (rc < 0) {
+ SLOGE("Filesystem format failed due to logwrap error");
+ errno = EIO;
+ return -1;
+ }
+
+ if (rc == 0) {
+ SLOGI("Filesystem formatted OK");
+ return 0;
+ } else {
+ SLOGE("Format failed (unknown exit code %d)", rc);
+ errno = EIO;
+ return -1;
+ }
+ return 0;
+}
+
+} // namespace vfat
+} // namespace vold
+} // namespace android
diff --git a/system/droidvold/fs/Vfat.h b/system/droidvold/fs/Vfat.h
new file mode 100755
index 0000000..383ec74
--- a/dev/null
+++ b/system/droidvold/fs/Vfat.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2008 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_VOLD_VFAT_H
+#define ANDROID_VOLD_VFAT_H
+
+#include <utils/Errors.h>
+
+#include <string>
+
+namespace android {
+namespace droidvold {
+namespace vfat {
+
+bool IsSupported();
+
+status_t Check(const std::string& source);
+status_t Mount(const std::string& source, const std::string& target, bool ro,
+ bool remount, bool executable, int ownerUid, int ownerGid, int permMask,
+ bool createLost);
+status_t Format(const std::string& source, unsigned long numSectors);
+
+} // namespace vfat
+} // namespace vold
+} // namespace android
+
+#endif
diff --git a/system/droidvold/main.cpp b/system/droidvold/main.cpp
new file mode 100755
index 0000000..6d4abae
--- a/dev/null
+++ b/system/droidvold/main.cpp
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2008 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 "Disk.h"
+#include "VolumeManager.h"
+#include "NetlinkManager.h"
+#include "DroidVold.h"
+
+#define LOG_TAG "droidVold"
+
+#include <android-base/logging.h>
+#include <android-base/stringprintf.h>
+#include <cutils/klog.h>
+#include <cutils/properties.h>
+#include <cutils/sockets.h>
+
+#include <binder/IPCThreadState.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
+#include <HidlTransportSupport.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <fs_mgr.h>
+
+#include "cutils/klog.h"
+#include "cutils/log.h"
+#include "cutils/properties.h"
+
+static int process_config(VolumeManager *vm, bool* has_adoptable);
+
+static void set_media_poll_time(void);
+
+struct fstab *fstab;
+
+using namespace android;
+using ::android::base::StringPrintf;
+using ::android::hardware::configureRpcThreadpool;
+using ::android::hardware::joinRpcThreadpool;
+using ::vendor::amlogic::hardware::droidvold::V1_0::implementation::DroidVold;
+using ::vendor::amlogic::hardware::droidvold::V1_0::IDroidVold;
+using ::vendor::amlogic::hardware::droidvold::V1_0::Result;
+
+int main(int argc, char** argv) {
+ setenv("ANDROID_LOG_TAGS", "*:v", 1);
+ android::base::InitLogging(argv, android::base::LogdLogger(android::base::SYSTEM));
+
+ LOG(INFO) << "doildVold 1.0 firing up";
+
+ //android::ProcessState::initWithDriver("/dev/hwbinder");
+ configureRpcThreadpool(4, true);
+
+ VolumeManager *vm;
+ NetlinkManager *nm;
+ DroidVold *dv;
+
+ /* Create our singleton managers */
+ if (!(vm = VolumeManager::Instance())) {
+ LOG(ERROR) << "Unable to create VolumeManager";
+ exit(1);
+ }
+
+ if (!(nm = NetlinkManager::Instance())) {
+ LOG(ERROR) << "Unable to create NetlinkManager";
+ exit(1);
+ }
+
+ if (property_get_bool("droidvold.debug", false)) {
+ vm->setDebug(true);
+ }
+
+ if (!(dv= DroidVold::Instance())) {
+ LOG(ERROR) << "Unable to create DroidVold";
+ exit(1);
+ }
+
+ vm->setBroadcaster(dv);
+ nm->setBroadcaster(dv);
+
+ if (vm->start()) {
+ PLOG(ERROR) << "Unable to start VolumeManager";
+ exit(1);
+ }
+
+ bool has_adoptable;
+
+ if (process_config(vm, &has_adoptable)) {
+ PLOG(ERROR) << "Error reading configuration... continuing anyways";
+ }
+
+ if (nm->start()) {
+ PLOG(ERROR) << "Unable to start NetlinkManager";
+ exit(1);
+ }
+
+ sp<IDroidVold> idv = DroidVold::Instance();
+ if (idv == nullptr)
+ ALOGE("Cannot create IDroidVold service");
+ else if (idv->registerAsService() != OK)
+ ALOGE("Cannot register IDroidVold service.");
+ else
+ ALOGI("IDroidVold service created.");
+
+ set_media_poll_time();
+ vm->coldboot("/sys/block");
+
+ /*
+ * This thread is just going to process Binder transactions.
+ */
+ joinRpcThreadpool();
+
+ LOG(ERROR) << "droidVold exiting";
+ exit(0);
+}
+
+static void set_media_poll_time(void) {
+ int fd;
+
+ fd = open ("/sys/module/block/parameters/events_dfl_poll_msecs", O_WRONLY);
+ if (fd >= 0) {
+ write(fd, "2000", 4);
+ close (fd);
+ } else {
+ LOG(ERROR) << "kernel not support media poll uevent!";
+ }
+}
+
+static int process_config(VolumeManager *vm, bool* has_adoptable) {
+ std::string path(android::droidvold::DefaultFstabPath());
+ fstab = fs_mgr_read_fstab(path.c_str());
+ if (!fstab) {
+ PLOG(ERROR) << "Failed to open default fstab " << path;
+ return -1;
+ }
+
+ /* Loop through entries looking for ones that vold manages */
+ *has_adoptable = false;
+ for (int i = 0; i < fstab->num_entries; i++) {
+ if (fs_mgr_is_voldmanaged(&fstab->recs[i])) {
+ if (fs_mgr_is_nonremovable(&fstab->recs[i])) {
+ LOG(WARNING) << "nonremovable no longer supported; ignoring volume";
+ continue;
+ }
+
+ std::string sysPattern(fstab->recs[i].blk_device);
+ std::string nickname(fstab->recs[i].label);
+ int flags = 0;
+
+ if (fs_mgr_is_encryptable(&fstab->recs[i])) {
+ flags |= android::droidvold::Disk::Flags::kAdoptable;
+ *has_adoptable = true;
+ }
+ if (fs_mgr_is_noemulatedsd(&fstab->recs[i])
+ || property_get_bool("vold.debug.default_primary", false)) {
+ flags |= android::droidvold::Disk::Flags::kDefaultPrimary;
+ }
+
+ vm->addDiskSource(std::shared_ptr<VolumeManager::DiskSource>(
+ new VolumeManager::DiskSource(sysPattern, nickname, flags)));
+ }
+ }
+ return 0;
+}
diff --git a/tdk/.gitignore b/tdk/.gitignore
index b2d4d3d..3965bf2 100644
--- a/tdk/.gitignore
+++ b/tdk/.gitignore
@@ -8,7 +8,6 @@
.*
*.o
*.o.*
-*.a
*.s
*.su
*.mod.c
@@ -17,7 +16,6 @@
*.order
*.elf
*.swp
-*.bin
*.patch
*.cfgtmp
*.diff
diff --git a/tdk/ta_export/keys/root_aes_key.bin b/tdk/ta_export/keys/root_aes_key.bin
new file mode 100755
index 0000000..8ce85b6
--- a/dev/null
+++ b/tdk/ta_export/keys/root_aes_key.bin
@@ -0,0 +1 @@
+3x⌦ʣ_П0Y&;C~yh \ No newline at end of file
diff --git a/tdk/ta_export/keys/ta_aes_iv.bin b/tdk/ta_export/keys/ta_aes_iv.bin
new file mode 100755
index 0000000..8bc1bb6
--- a/dev/null
+++ b/tdk/ta_export/keys/ta_aes_iv.bin
@@ -0,0 +1 @@
+b5!݁r>W \ No newline at end of file
diff --git a/tdk/ta_export/keys/ta_aes_key.bin b/tdk/ta_export/keys/ta_aes_key.bin
new file mode 100755
index 0000000..e5cff83
--- a/dev/null
+++ b/tdk/ta_export/keys/ta_aes_key.bin
@@ -0,0 +1 @@
+΋'^ C785V=# \ No newline at end of file
diff --git a/tdk/ta_export/lib/libmpa.a b/tdk/ta_export/lib/libmpa.a
new file mode 100755
index 0000000..3f7f282
--- a/dev/null
+++ b/tdk/ta_export/lib/libmpa.a
@@ -0,0 +1,1286 @@
+!<arch>
+/ 1512712347 0 0 0 1608 `
+
+
+
+
+
+__mpa_set_unused_digits_to_zero
+mpa_montgomery.o/
+mpa_mem_static.o/
+mpa_misc.o/ 1512712346 7593 7000 100666 39120 `
+ELF
+Jh01
+
+
+
+
+
+
+B 
+B
+
+B 
+
+B
+
+
+
+
+
+
+
+
+
+
+7
+
+
+
+
+
+
+. #[!)2/V# Y`"D
+A 
+*D
+
+
+
+
+F
+I
+H
+
+ELF
+F
+  B FAF h
+
+
+K
+.
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"
+
+
+G
+-
+
+
+
+
+
+f#>
+A 
+*D
+ 
+
+
+H
+E
+E
+I
+K
+L
+M
+N
+O
+O
+P
+Q
+
+R
+S
+S
+O
+G
+W
+S
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+8A0F_z1F O  #F {O O
+
+!F
+ 7OE
+
+!F !F !F
+ SiJJ)
+A @ @ 4!R
+"A  !@h@2l
+ !!IP&  DA
+B`! E
+ @ ) 0
+@B
+
+
+
+
+$
+d
+
+
+
+
+
+o/Dyeڜ
+
+
+@
+#
+
+a
+
+O!Pv
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+"
+
+
+
+
+
+
+9
+H
+
+
+
+
+
+
+
+
+thKhi!K=2%!/].t/hKKKLK~X4.$F%uK!< <
+A 
+*D
+
+
+
+K
+L
+M
+N
+N
+O
+N
+N
+N
+N
+P
+Q
+R
+S
+K
+T
+P
+Q
+U
+V
+V
+W
+M
+P
+W
+X
+X
+X
+
+X
+X
+X
+N
+Y
+M
+X
+
+
+
+
+
+
+ELF
+
+
+7
+
+
+
+B 
+
+B 
+
+B
+
+
+
+
+$
+
+
+
+
+
+
+(
+
+-
+X
+A 
+*D
+
+
+
+ELF
+D ;
+O
+   GYh
+O
+
+
+
+
+
+
+
+
+: ?
+E ;
+O
+DEмB
+
+
+V
+9
+
+
+
+
+f
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+ 
+ 
+
+
+D
+G
+E
+G
+H
+G
+C
+J
+G
+G
+K
+K
+H
+K
+H
+L
+L
+M
+N
+O
+C
+P
+P
+Q
+Q
+R
+S
+O
+T
+U
+H
+V
+V
+V
+F
+G
+H
+K
+K
+I
+H
+V
+H
+V
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+*Fch
+
+
+@
+#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+8
+
+
+
+
+
+
+
+
+
+
+A
+
+=
+
+XgggLggdf!J!K!KZKKKKKKKC..r../KKL1!/9PzX f;j;[hg/[0r<JYKKK..4z 5$ggMZ//? !-!W
+A 
+*D
+
+
+E
+E
+F
+G
+F
+G
+F
+H
+G
+F
+F
+G
+E
+G
+E
+G
+E
+G
+E
+H
+H
+I
+J
+H
+H
+H
+I
+J
+H
+H
+K
+J
+J
+J
+J
+J
+F
+F
+L
+M
+M
+M
+M
+M
+M
+M
+G
+F
+G
+F
+H
+G
+H
+H
+H
+J
+K
+F
+L
+M
+M
+M
+K
+F
+N
+K
+F
+E
+E
+F
+M
+G
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+FHhFhR<R `R,FhS` i` HiG
+
+
+
+a
+D
+
+$
+
+
+
+
+B 
+
+B 
+
+
+B
+
+B 
+
+
+
+
+
+
+
+
+
+@
+6
+
+1
+
+
+
+
+
+A 
+*D
+
+
+N
+
+ELF
+R#F
+O 
+
+K
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+5
+
+
+
+A 
+*D
+ 
+
+
+F
+F
+D
+I
+J
+G
+K
+L
+I
+J
+E
+K
+L
+
+
+
+ELF
+ch"
+
+<
+
+
+
+B 
+
+
+B
+
+
+"
+
+
+T
+
+
+`
+
+
+
+
+
+!
+)
+.$
+A 
+*D
+ 
+
+
+
+
+R
+S
+T
+R
+
+ELF
+T!8
+B
+T!
+   Bت
+
+ gE5  T%
+9
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4
+.!; .x ; J!!!Yh!G<9.G:tF.;J0/DJ>.
+A 
+*D
+ 
+
+
+C
+G
+H
+C
+G
+H
+
+ELF
+F
+Y%:F5PFshB
+Y'
+&v
+OD
+ *F6MFW
+
+K
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+<
+
+2
+
+
+
+
+
+6
+
+
+
+
+
+
+fm !! 
+<0!N/-!OgL\OgPK=NX5<
+<Rx  w (MdM[
+<//-!NNg]gk1Ir"@0NK=LX7< < !/
+J<P!@=!3KMY=Z#0!
+ =
+A 
+*D
+ 
+ 
+ 
+
+
+G
+I
+E
+E
+D
+D
+G
+F
+L
+J
+L
+J
+M
+N
+O
+L
+L
+J
+J
+F
+F
+M
+N
+O
+M
+M
+O
+F
+J
+M
+N
+M
+O
+J
+F
+M
+N
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+@BF
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+< y 5Y
+A 
+*D
+
+
+
+
+
+
+B
+B
+B
+
+ELF
+FKFFF;F
+:/FF
+
+@
+#
+
+
+
+
+
+
+
+
+
+B
+
+
+I
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+A 
+*D
+
+
+
+
+D
+D
+D
+D
+E
+F
+G
+G
+H
+I
+E
+E
+E
+E
+F
+J
+J
+J
+J
+ELF
+
+f
+Q2$9 Q0Pu
+
+
+
+B 
+
+B
+
+
+
+
+
+
+
+,
+
+&
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+D
+
+ELF
+74
+
+50_(
+ (
+( (а HBHApG pGA
+@6KD FF
+{h[B{`O6 JzDx0F
+
+B
+   0\>HFQ2F1)
+1
+
+
+
+
+4
+
+
+
+
+
+C
+b
+
+
+
+
+
+
+
+
+
+
+0
+
+
+
+
+
+
+|
+
+
+
+
+
+
+
+B
+
+B 
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+E
+
+
+
+
+
+
+9
+2
+
+0
+
+./w.
+.
+A 
+*D
+ 
+ 
+ 
+
+
+
+
+
+
+_
+`
+_
+
+b
+c
+
+_
+_
+f
+g
+
+
+
+
+
+ELF
+FFF!F9FBF#F1F
+FFF!F9FBF#F1F
+FFF!F9FBF#F1F
+
+@
+#
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+H
+
+
+
+ .M#>gvK
+..M#>gvK
+..M#>gvK .Pz &z 4K\Y=Z"LZ=gMP)L
+A 
+*D
+ 
+ 
+ 
+
+
+
+C
+E
+F
+C
+G
+E
+I
+C
+G
+E
+K
+C
+G
+M
+N
+E
+E
+O
+M
+P
+G
+G
+F
+M
+
diff --git a/tdk/ta_export/lib/libpng.a b/tdk/ta_export/lib/libpng.a
new file mode 100755
index 0000000..0ecf789
--- a/dev/null
+++ b/tdk/ta_export/lib/libpng.a
@@ -0,0 +1,5440 @@
+!<arch>
+/ 1512712347 0 0 0 8436 `
+
+ELF
+CiHiBۀB̿
+ TT
+KF!hF{D FiF
+
+(F!ih
+BsB
+y*vJy;*s؊y<*p "hF
+
+iF0
+ K{D K{D K{D K{D0pG
+ЊhO3"R"`"hA
+
+FF,
+cFwL|D
+0 c  #`JB "ZC2EkJzDA0@ cC B #OrBbJzD+`J0F
+#JzD
+0F9F*FC 
+J
+jx6O LDx
+*#yfyy&#z lzDz , 8F
+FFF,YIyDO
+"BRI% FyD2ENI% FyD
++)I% FyD0d2#$I FyD
+ո@0..I% FyD0I FyD
+--^0-[E- e-V% %%Ou %
+. 
+.5/ .!.0<, (tD,CE@tDD@tD<DDH7B`
+0F
+!f/0T
+,I"yD,IyD,
+Z ձH B'J'KzD{D
+IyD
+IyDJ0"oCCoSCJ08@8
+F
+h FKB Mh
++h#`
+
+
+*F#F
++h#`M ((
+HJ08FIoCCyDoSCJ0
+oCCI0FoSCyDJ0 Ё&
+FFK 
+KBB
+
+R@\5- uP
+*+A& X!6! VE
+
+Jan
+r;
+z]ʅxTvt諌roipӞnl8j*hfdcR0a(O_onp][0YW,f V}:T/iRPrNM=KquxI'GE4DexB*@Xa?M=; 895864/3+1y"/9.Ȳ,C*U)+'.&$M"ǤR!~@*M D +{^cbSSBo
+%I`qPE ɼG
+BNPU^z؁s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+xx4yy[zz~{||-}}G~~_t'/58973-$ vdېQƑ;$
+}aҕC$rN)nڛEYž+cˠ2eˢ1_ä'Qyۧ<_ ߪ?[uӭ0FZlDZ!|ֲ0<FNUY\]\YTNF=2%vg÷WĦEŔ2ƀkǹUȢ=Ɋ#pʼ Uˡ8̄fͱGΑ&pϺNИ*tѽOҗ(qӹIԑ hկ=քYן,rظDىZڟ)n۳<܀ Mݑ\ޠ'j߭3v>G OUY\^^\YUO
+H@~6t+h\N?{.jX
+E1lV?y'aH-fK.fH
+y
+
+2 U ^<!
+@AB#C0D?EQFeG|HIJKLN9OaPQRSUPVWXY=[~\] _R`ab>def@hij[lm$opqfstJvw9yz2|}7Fу_P5ܓ2☔Iy9¦V%ʯ{W7Ҿ¥ĜƕȒʑ̔ΙСҭԻ.NqM3tPotential overflow in png_zalloc()
+libpng version 1.6.21 - January 15, 2016
+Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+Copyright (c) 1996-1997 Andreas Dilger
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
+
+
+
+
+/
+
+
+
+
+
+
+
+
+
+
+
+ k
+wz
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+PS
+Q~
+Uf
+Vf
+W
+X$
+Zq
+[
+\$
+^e
+_
+aH
+bs
+c<
+e)
+f$
+g$
+
+)
+h
+j
+
+
+#Py
+
+
+
+
+
+
+$#Py
+$#Qy#Pu
+$#Q0#Py
+
+ 
+ #Q0#Pt
+
+
+
+
+
+
+ #Pu
+ #Q0
+
+
+
+
+
+
+
+
+#Qt
+ #Qu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+)
+Y
+
+z
+
+)
+
+
+
+)
+)
+Y
+
+)
+
+
+
+
+
+
+&
+
+
+
+
+
+
+
+
+
+
+
+$
+
+
+
+
+
+
+
+
+
+@$
+
+|)
+!$
+
+
+&
+
+
+
+
+
+B 
+B
+
+
+
+
+B 
+
+
+
+
+B 
+B 
+B
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+QQQ0-(
+"@$
+w
+RRR0-(
+w
+QQQ0-(
+"@$
+QQQ0-(
+"@$
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+R$
+
+
+ ;
+
+
++
+
+
+
+
+
+'
+
+.
+
+
+;
+
+
+
+
+
+.v.=>+=>6u. u.0
+ !%.YKf
+.(.O M9<s!M#j`q%11/G% f !/h1,%1##>xX .%J "
++ #Zm< Jh<!<B6x D!Kg?-/
+ v 
+ v 
+< J)% x t ! x ( <i/XZ.""%*2L[A w<$z 'y !'y 
+. .%!5M=[3. !$#>0/Z"$=-C#
+. %M
+X!1u4z P!R fjj  f(Jc.
+<i=A=A < t
+<D
+<mk73?<`y .g  n."=!,Y!,K4/y7
+."
+ K#{. #+?.
+ v.K ft %) 1E < ...
+A 
+*D
+ 
+ 
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+!
+"
+$
+$
+
+
+
+
+
+(
+)
+*
++
+&
+
+!
+/
+(
+1
+/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3
+(
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+8
+
+"
+?
+!
+"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+K
+
+
+N
+N
+N
+
+N
+N
+N
+N
+N
+N
+N
+N
+N
+
+
+
+
+R
+R
+$
+$
+
+G
+H
+I
+Q
+N
+
+N
+N
+N
+N
+N
+N
+N
+N
+N
+V
+V
+V
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+N
+
+
+
+
+N
+V
+N
+\
+[
+
+N
+^
+\
+
+]
+
+[
+
+
+
+
+
+
+
+
+
+
+`
+Z
+V
+V
+N
+^
+\
+]
+
+Z
+V
+V
+d
+
+c
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/
+<
+S
+W
+
+
+
+ELF
+!QHF
+!QDf
+|,4F&HF
+!"F&"<HF
+!HFY |
+!FdF " OY |<O
+#\ *3+G
+FF
+FF
+F@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+i
+ 3
+v
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{
+
+
+
+
+
+
+
+
+
+
+P
+
+Q/
+U
+V
+W
+X
+Z"
+[
+\
+^n
+_E
+a
+b$
+c
+e)
+f
+g
+
+E
+)
+hF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+F
+
+
+%
+
+
+%
+
+&
+
+
+&
+
+
+
+
+
+
+
+
+B 
+B
+
+
+
+B 
+B 
+
+
+
+
+
+
+
+
+
+
+
+ r
+
+
+
+
+_
+
+
+
+
+;
+zk
+
+L
+R
+
+
+
+
+ 1s./
+ z 0#
+.J v.
+ q , Y  l.#*+  j.j  h<%
+<vJ
+.L0
+.5z4~. !-![
+A 
+*D
+
+
+
+
+
+
+w
+w
+x
+w
+x
+y
+{
+y
+{
+z
+z
+
+
+
+
+
+
+z
+
+
+
+
+
+
+
+v
+
+v
+v
+
+v
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+J0FF
+@FOrF# F@FOrF# F@
+F%u? HpGFpG 
+
+l`
+m
+ H!r
+Hl`
+k`Kk;`k3` k+`, l#`F hIr
+#h`
+
+
+
+
+U
+
+
+
+
+
+
+
+B
+
+
+
+
+ 
+Lw
+
+
+
+
+
+
+
+
+
+
+$
+RPt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Pt
+
+
+
+Pt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+$
+%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+)
+
+
++-
+
+&
+
+
+
+
+
+B
+
+B 
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+/
+
+
+
+
+i
+N
+'
+=
+H
++:
+4
+
+
+
+
+.Z5YA
+A 
+*D
+ 
+
+
+
+
+
+c
+c
+p
+n
+o
+r
+s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"
+#
+(
+*
+
+
+
+ELF
+GF@FpFF
+I(FyDO0FB(Fp@
+
+,
+
+
+
+
+
+
+
+
+l
+ 6
+>s
+
+
+
+
+
+
+
+
+
+
+r
+
+
+
+
+
+
+
+
+
+
+
+
+$Qt
+$Q0Pt
+
+9
+
+
+#
+&
+
+
+
+
+B
+
+
+
+B 
+B 
+
+B 
+
+
+ON
+
+
+
+
+
+
+
+
+
+
+
+
+|h
+
+
+ Q
+5
+d
+
+
+
+J!001i!J
+<#/
+A 
+*D
+B
+
+
+
+
+
+
+
+
+
+
+
+q
+o
+q
+o
+m
+s
+t
+
+m
+q
+u
+t
+m
+q
+m
+y
+s
+t
+|
+~
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+-!*-!* ؝-=$-
+UIB
+ 2B?t F)FOIB
+ 2B?f F)FIIBF
+ 2B?W F)FBIB  "B?I F)FF<KB
+ 2B?: F)F6KB
+ 2B?, F)F0K!B
+ 2B? F)F)KB
+ 2B? F)F#KB
+ 2B?
+ 2B? F)FzKB5 2B? F)Fl
+ 2B? F)F3KBF
+ 2B? F)F$IB  "B? F)FFKB 2љB? F)FB?w F)F
+ҚI FyDBЗI FyDh1
+@ F1 F=єi1+:%i1+ F
+
+
+.
+
+
+
+
+
+
+
+T
+ 
+x
+
+
+
+
+
+
+
+
+Q
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+^r)
+
+
+
+
+
+Y*
+~*
+O*
+
+*
+
++
+
+\)
+
+Rb+
+
++
+
++
+
+(+
+
+
+
+79,
+
+d,
+
+2,
+
+F,
+
+,
+
+
+-
+
+#;-
+
+f-
+
+-
+
+--
+
+A-
+
+<.
+
+K=.
+
+h.
+
+.
+e.
+.
+
+D/
+)
+}/
+
+&
+
+
+
+
+
+B
+
+
+
+B 
+
+
+
+
+B 
+B 
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Z
+
+
+
+
+
+
+l
+
+
+0
+%m
+}
+N
+>;
+
+
+
+
+
+
+fi,!!=YZ
+fgYY}fz &?/X !-$,5@F>0:>>
+t,<-?M0-/M"K[YK0>u>K|!A!.u./3K% --0!-/ /i.. !/$M- n /Xs ^<" /gK0/>?0!!!?+3?=!!:3!=3!=y. t.  .3YKg=Y//k>0=^KL
+X
+XK9
+ ?
+JM##6z.KA
+A 
+*D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"
+
+
+
+ELF
+
+O
+ԧBѻ#
+zJ]CXCX 
+\]CWCfJ
+s0%F
+34$GF
+ OOk1]Դd!Ѹ2iI FyDFUx Ւ
+
+EْI FyD
+1d1
+k O{ ZF"Os
+"#0F9F
+7DWE
+ I FyD
+ !
+s0#F
+
+ 
+ 000
+
+MD-D<
+sDDMFOz
+O "!09F:F;F0F7O F0FO Fk1+дd1
+
+[QFOL EL OH H
+QFO
+O
+7i
++DI FyD0F8F0F+F
+ O,3
+
+ ɲ
+!RFF
+
+R" # 0FIYF #0FOK "=
+K
+C
+,O
+NL
+( \i(OzE
+
+F0C@0 F
+
+
+D)++
+,DO)O(qEDї Fs!0Jr!s1B #I FyDvB!I FyDph1ñ0Քi!*@1% F)F" F1F
+ F F F F
+
+ F
+ F(% . F( % 
+C
+~* CHC. C  .C -I FyDCE+I FyD{h
+ih1+A-I9
+: DK F
+X
+isZ+i
+Oj
+-
+
+
+
+Dƿ[#@05eEtj[
+@- O jRL
+
+   
+>
+
+O
+h
+4 h1+@,I9
+x](4WD1
+0("O A IX10
+IXO: 
+ IX1;+3B
+BND,SDBv 
+
+#
+;o1$JBѳi+"I(FyDch
+
+ O 4
+O , * 0
+*
+
+0 
+
+
+@
+
+
+Ѵ\!`1BݎI FyD444DD F8QFEE F1FnK FB1F2)FfKFౝB
+0 FQF;F F1F]KB@0C0B0 FIF FFOKB F1FLKB F1FIKB F1FzFKB F1FrCKB F1Fj@KB F1Fb=KB F1FZ:KB F1FR7KB F1FJ4KB F1FB1KB F1F:.KB F1F2+KB F1F*(KB F1F"%KB F1F"KB F1FKB F1F
+K F1FB
+FI FyDIyD
+#3SCB2Ӹ
+IyDF
+
+.
+
+
+
+
+
+
+
+
+
+
+ 
+{
+
+
+
+
+
+
+
+
+
+
+%
+
+9
+
+
+
+
+
+
+
+
+9
+U
+P
+Q
+U
+V
+Wg
+Xs
+Z
+[g
+\s
+^
+_
+a
+b
+c
+e4
+fs
+gs
+
+4
+h
+j 
+
+
+
+
+
+
+
+
+
+
+
+
+" $ %z
+"?%1$"
+" $ %#RUx
+" $ %{
+"?%1$"
+" $ %#Q1#Pv
+" $ %"<%1$"
+" $ %
+x
+
+
+
+F
+
+
+
+
+F
+5
+i
+
+F
+
+
+
+
+
+
+z
+8
+
+*
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+U
+U
+
+
+
+
+U
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4
+
+
+
+
+
+
+&
+
+
+
+
+
+B 
+
+B
+
+
+
+
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+z
+
+p
+qs
+"
+
+8
+Pw
+$
+$
+$
+$
+$
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+=
+
+M
+):
+
+
+
+
+106=0=>!?." ^J" 2[+X !"!"!"!"
+J? 3!z #"#t
+J!"/C=S6QQ
+<{
+J
+>2T$n6yf{J. Js 6<
+.=
+ l.<p =-B0/L
+.x (
+JiY# .a5$v. #0L1 .u.61+ f"Ry21
+.//?ZL/` J
+ v !6YL/ZY[ZL XxJ\ J t#! .M
+<5//<KtJ X
+J0
+< /
+<0
+<0 <0=^0B0B0C0C0B0
+<BNg<Y#+B+o.[+?
+A 
+*D
+ 
+ 
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+ 
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+!
+
+"
+
+#
+
+$
+
+%
+&
+'
+(
+
+
+)
+*
++
+)
+*
++
+,
+
+
+-
+
+
+
+
+
+
+(
+
+
+)
+*
++
+,
+
+
+
+
+
+
+(
+
+0
+(
+
+
+2
+3
+
+
+
+
+3
+
+3
+4
+
+
+
+
+
+
+
+
+
+ 
+
+
+ 
+ 
+ 
+
+
+
+
+
+6
+6
+7
+,
+,
+,
+,
+,
+8
+,
+9
+,
+,
+,
+
+
+
+=
+#
+
+>
+
+?
+@
+%
+*
+&
+'
+A
+ 
+"
+(
+
+B
+/
+*
+*
+
+D
+E
+F
+D
+6
+5
+G
++
+G
+
+D
++
++
++
+K
+G
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+C
+D
+H
+
+
+
+ELF
+
+
+
+
+
+
+$
+
+
+
+
+
+M
+ 
+r
+
+
+
+
+
+
+
+
+
+
+
+
+
+&
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+U
+
++
+
+/
+7
+
+I
+
+&
+
+A 
+*D
+
+
+
+
+d
+f
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+Eђ
+IyD
+
+0#@sC
+"'
+"p 2x1Ov1"s0 I FyDC0p
+\:JE|2]JE =Z]JE"6
+" CxIF0 2U 2U6B
+
+
+
+E71O
+\*
+
+EO
+
+EDDD
+KB
+
+Քk! B
+" Քl F0>0 
+AC
+
+
+
+
+**
+
+
+
+
+
+**
+
+Ap
+p23B0#S!++ +a\MFxFxFSI FyD0FF(FF
+
+
+ &6pa^x
+
+6
+f&6^pax
+
+6
+ f&6p23B0#0PA+@+Wєk(Sє%\!PK+ٔK+
+#
+"2b#~+kD##vhD##vic~Ccvc~#cvj c~++2##~+#cv#~+c~+##vh#~+##vc~+
++
+ D@@OyD0@*z1dq*@Հ X+hiظ)иDи\: CDo 
+2D
+. 9
+
+NE^V
+
+NE"k`jrrjz*gї^:O iB`VpNxFxpNxFvxlNxF]l:AEћ
+
+ lO<kxk0;FFFXE
+*L(IEaE
+H\(p7B!
+_
+qIQ(p 7p ϲ!GqW" 2"
+App7ypy3p6F
+^xF&xH (G ,fEFE"
+pyp01FSFFFXE)zz!)r;iz۲rKC۲+r  
+
+
+
+,СE)
+,  EѴ~q?
+
+pqpq?
+qq&I[)9O)
+p~Xp
+pp
+qXq13
+
+
+q\
+ 
+
+ 
+**
+
+ 
+
+ 
+**
+
+ 
+ 
+!!p30EћxQ~
+yOxy&FE^x|A[&`6`7
+
+^ypyA[&`6`7
+qඹ~a6
+
+papa6
+qa^qG7 HW(
+
+30E0nyy!~
+
+pp
+qYqLAEJx ,_y +~
+*G7  
+
+_qq630B MK@
+
+
+0
+
+
+O
+KK
+ K
+O)K 
+K K )? IO I I IO0J
+OH H H  O J
+EӦ~x3
+
+
+xAy8
+0+hҲ
+;.
+
+
+
+
+
+
+
+ 
+w
+
+
+
+
+
+
+
+
+
+
+2
+
+
+
+
+
+
+
+z
+w
+w
+
+
+
+ &Pt
+
+0
+
+
+
+
+
+ 
+
+
+:
+ 
+ 
+
+ 
+ 
+
+ 
+ 
+
+ 
+ 
+
+ 0
+o>
+ 
+ 
+
+
+
+
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+D
+$
+$
+E
+7
+:
+
+
+
+
+
+
+
+
+S
+d-P
+
+
+
+
+
+
+
+
+^Q
+
+0
+0
+
+.
+*
+WR
+2wR
+R
+R
+R
+R
+
+S
+ 
+&
+
+
+
+
+
+
+B
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+p
+"8&
+tr
+"8&
+tr
+"8&
+
+z
+"8&
+
+qt"tr
+"8&<
+z
+"8&@
+tr
+"8&
+
+
+
+
+
+
+
+
+
+
+8%1$w
+1$w
+1$w
+1$s
+1$s
+1$z
+1$s8$s!@$@&r
+1$s8$s!@$@&r
+1$s8$s!@$@&t&2$t""
+1$x
+1$s8$s!@$@&r
+1$s8$s!@$@&r
+1$s8$s!@$@&t&2$t""
+7q
+q
+7q
+q
+??6q
+q
+??6q
+q
+??6q
+q
+??6q
+q
+4q
+q
+4q
+q
+4q
+q
+4q
+q
+$
+
+$
+$
+"#
+s8$s"
+x
+s8$s"
+x
+p|8$s"
+"#
+y
+y
+y
+
+
+
+y
+y
+q
+"#r&
+s
+"#
+y
+q
+"#r&
+s
+"#
+s
+"#
+w
+'
+w
+'
+w
+s
+"#
+'
+'
+x
+|
+px8$s"
+t
+w
+px8$s"
+t
+w
+w
+s8$s"
+"t
+w
+s8$s"
+"#@%"#@%)
+s8$s"
+t
+s8$s"
+s8$s"
+"
+s8$s"
+t
+s8$s"
+s8$s"
+"#@%"#@%)
+{
+w
+px8$s"
+t
+w
+px8$s"
+
+s8$s"
+t
+"#
+s8$s"
+"#)
+w
+s8$s"
+"#)
+s8$s"
+t
+s8$s"
+s8$s"
+"#
+s8$s"
+|
+s8$s"
+|
+z
+v
+@"y
+v
+@"#@%"#@%$(
+v
+@"y
+v
+@"#@%"#@%(
+|
+|
+@"# (
+v
+@"#>(
+v
+@"#(
+px1$sq
+t
+@"#
+@"#h(
+v
+@"#(
+v
+@"#(
+s1$sq
+t
+@"#
+|
+
+
+
+
+
+
+0
+0
+1
+1
+2
+
+
+8%2
+8%2
+8%3
+
+
+
+
+
+
+.
+
+
+
+(
+
+
+
+
+
+.
+_
+
+L
+9
+F
+W
+@
+
+
+ w.&)=~.<"
+26tuO<jgSf. $1Kd%$g^gd##_?-/N3#i,2/KL!M%t<[1[h
+.zXL0
+.6J.6 /-l0wJz.
+2kt_
+X/L/_-0-{X##?##?##?z##?
+##?##@=| %AMi\\g#[L f
+!?"J
+t,h JDZgnY<OK~t.>
+Xi)'#YAYv#[KL=!
+
+./ t?@!@!</O=O0
+.Y01/cJz<4)<"/0Pb$0/mJS<-.< "--!/H//,!/00>Y/s
+<;#,#*3*"1zJ5733+Mu!-#!-#0/WXzJB9J",!/H/!-1/^h/-!""!-!h<FJ:..!;#10" "=vhv(X
+<uJL,0MZBY=m.fhZZvJf? .v<iK=A==q<f[==x<X Jv<+O,1-)0$0zfPcY=L>LA6x.KK02*h1+1KKZ 1fL/"6,"zJ4U2[K=L>Lj<N<2  <[<w<Xw<0/L#`e//Kk.X0!>/xX<x.F<fwX9i2\#ZRe=-K-0#!;!-0K^.,i"Z?2gKm fi<x<XxJ"0Y=?#K=De0K1-0K1/-/Y\ .t""K=M0L#nf<y.<fxJ#+M2="v##g@#Y=L>LRI/-/-Y/!1/1I/-K-0!/1*2IK-Z!/-A 
+.x..x  .u<x .x ]"0><z.#<$v22v22vJz <]"1?<z.#"v22v22vJz <y,": X,"v-G XrY//4I/Ihv5y.5yt"/1- <J{.HC],"v-GJv/0y
+X}J }. X } !0e1=/<
+.+"//KKz.<*"///KKK0,/Lu.<1>%y. .,#K*<*"////-0y.<kL>
+f="="[#
+A 
+*D
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+&
+6
+<
+
+
+
+ELF
+K "{D FiF
+ 0-PF*F"F2
+AF Fo
+(ooo@F
+xcxx#IyDF
+0F)FI FyDI FyD-0CS0
+
+
+IyDC)F05I FyD8@8
+F F F FF 3л?к? й?и?{i0I FyD"3 oCC F1FoSC"3I FyDC6q"3 F
+# F1F
+
+6q F F1F|z
+
+
+
+PE0
+3N+
+BE 0
+KD0 t
+0
+N~DN~DN~DN~D F"3 F)FoCCoSC"3V F1F F)F
+DO
+ O PFIFF9I FyDPFIF/JFB4I FyD
+!YC F(
++qE FB}AFjF# F
+ 1 0# 1 0#1%*ћմ\1Bص
+D"RB"
+0[)FfI FyD Fi"F F6)F_I FyD1F*F F
+JyD
+*
+*
+# z
+0[)F@I FyDh- F)F<I FyD^i"F FF7IyD F)FZ1F*F
+00#"=0
+IyD IyD IyD
+
+
+;2 F9F'r#% F
+
+l۲& 3C<<B@р-#FgtIFyD4`CeC
+
+
+
+v
+
+
+
+
+
+
+
+
+IF2FO
+M}D
+M}DR4P$@FFFGp
+.l1+@
+k!*( @ (* *0
+
+q
+
+
+V
+
+
+
+
+
+
+
+ 
+h
+T{
+
+
+
+
+
+
+
+
+
+
+
+)
+)
+
+
+
+
+
+
+
+
+)
+%(
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+T
+I
+I
+
+
+ 
+
+)
+
+
+
+
+
+
+
+K
+)
+ 0
+
+
+WX
+
+x
+
+
+
+
+ Y
+SY
+
+
+
+
+Z
+
+;Z
+
+
+
+
+)
+
+)
+
+)
+
+=[
+
+
+
+)
+
+)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+)
+
+
+
+
+<)
+
+
+^g^
+
+
+
+^
+n^
+
+
+&
+
+
+
+
+
+
+
+
+B
+
+
+
+B 
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+c
+"
+"
+$
+
+7p
+??6p
+4p
++
++
+
+
+
+
+/
+
+
+
+
+
+e
+
+
+
+j9
+
+
+
+
+
+<
+</?1![rJLJf@*.@2#/ .0=3!. .u.(1$%>w<Xw< .bf ?!2-4/Z![
+X!-?
+<q. i  . J@"/1L>",>:0j$ {1L"1>$"?>!i10<S
+.OvmWDMAMN X-Mzt
+b<!=M'X!1% <?!/3!%!35 $*$55*2M>h
+ z.%],"
+v.<
+."0NZ=PKZ u. <u  <>""\L\
+<
+ /,&B#
+.v.
+J003!(0L3$##=(0v1!!!
+.Q>@*2/wX J
+.Y0/+C(-4=
+J22"0#>gh
+ r.!/M/JKLf@"//6YZ
+A 
+*D
+
+
+
+
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+ 
+ 
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+"
+
+
+
+
+
+
+
+$
+%
+
+&
+
+
+'
+(
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+)
+
++
+,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+.
+
+
+
+
+
+
+
+0
+
+
+
+
+
+
+
+2
+
+
+
+
+
+
+
+4
+
+
+
+
+
+
+
+
+6
+
+
+
+
+
+
+
+
+8
+
+
+
+
+
+
+
+
+
+:
+:
+
+;
+
+
+
+
+
+
+=
+
+
+
+
+
+
+?
+@
++
+
+
+
+
+
+
+
+@
+
+
+
+
+
+
+
+@
+
+D
+
+
+E
+
+
+
+ 
+
+H
+
+F
+
+)
+
+
+
+
+
+
+G
+
+
+
+
+
+
+
+*
+L
+O
+)
+)
+Q
+)
+
+
+
+R
+S
+S
+O
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+$
+2
+S
+
+
+
+ELF
+"hC `0 FF jF#
+, 
+(FQF
+~!Or
+(FQFFI(FyD9FRF(F1FFX(FIFI(FyDGAF2F
+
+`S 0
+2* rBܲBB I8FyD
+"MhC`0C
+ Ƞ`C 0D0U U<#8FQF4 <3q
+"F`08F1h
+DDIyDFTbXB
+3?=I(FyDO
+zF C'F 8FIF"
+IyD8@0B
+F)
+74 .5F5F'FkN,,<;
+
+.
+
+&
+
+
+
+&
+
+
+
+
+
+ 
+&
+1x
+
+
+
+
+
+
+
+
+
+
+O
+5
+
+
+
+5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+^4
+
+
+5
+)
+
+c5
+
+
+)
+
+5
+
+
+
+
+
+6
+
+)
+
+&7
+
+
+)
+
+)
+
+d7
+
+
+n8
+
+x
+
+
+
+
+
+
+^9
+8-9
+CW9
+Gv9
+
+&
+
+
+
+
+B
+
+
+
+B 
+
+
+
+B 
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+v
+l
+
+B
+<:
+
+
+
+
+XA
+ x !/////0LhK+. #
+<v<v.
+Xz[?!\,/0,"0 #
+<.Qy '
+<?;!/
+A 
+*D
+ 
+
+ 
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+)
+
+
+
+ELF
+xC+B@B Bh
+x<Sx2<B+F"r"rz*<
+
+xpUx]px2p3B"+" F xpUx]pxpxpyqUy2]q3B0"r"rz*"r[C`0zHh@z(+ # xxpp1B+4
+x3 yq pHxLyHqLp1
+x3 yq pHxLyHqLp1
+hz@A[BSCJhi)f<eVeeeb% x:AO
+P@IyD0@ 00
+J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_?
+JZ*j:zN^.n>~CS#c3sGW'g7w K[+k;{O_/o?
+*:JZjz +;K[k{ ,<L\l| -=M]m}.>N^n~/?O_opng_set_filler is invalid for low bit depth gray output
+
+,
+
+
+
+
+
+
+
+
+
+T
+ 5
+t
+
+
+
+
+
+
+
+
+
+
+
+t
+
+
+
+
+
+
+
+
+
+d
+
+&
+
+
+
+
+B 
+
+B
+
+B 
+B 
+
+
+
+B 
+
+
+
+
+
+
+
+
+
+
+m
+
+
+
+
+
+
+
+,
+(
+
+38
+
+M
+
+
+^
+
+
+J#K{##/K`
+X0
+->-
+A 
+*D
+
+
+s
+u
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+
+
+
+
+
+
+
+
+
+M
+ 
+r
+
+
+
+
+
+
+
+
+
+
+
+
+
+&
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+O
+
+
+
+
+
+
+
+
++
+
+;
+7
+
+
+
+A 
+*D
+
+
+
+
+d
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+b~(F
+(F0C
+B(F6
+3 0Y
+F8O
+FC
+D)++
+F
+
+
+F* F F( Fi F F F1Fp@p
+,
+
+
+
+
+
+
+
+
+
+
+ 
+Lx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+
+
+(
+)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+v+
++
+^+
+
+ +
++
+ ,
+@,
+p,
+
+,
+!,
+& -
+A3-
+Fq-
+W-
+L-
+R-
+.
+69.
+1c.
+,.
+
+.
+
+
+`D/
+\_/
+/
+i/
+/
+/
+H0
+c0
+^0
+
+
+0
+
+dA1
+
+&
+
+
+
+
+
+B
+
+
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+C
+
+
+
+
+
+O
+
+l
+:
+>L
+8
+
+
+W
+
+T
+l
+
+. .c.PJ///!O/L`fe&.X #
+<=j=j==&==>YkX.r.
+<
+
+<=P
+X /
+A 
+*D
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+%
+
+
+
+ELF
+!iz6C,C jz*4ؔ1ih+* *+
+
+Q ,Q
+
+Q Q , ,
+QB
+<,7E00TX*z@1*(jz)h*O
+~
+
+
+
+
+
+
+"
+
+
+
+
+H
+
+ )
+
+s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+;
+
+
+
+
+
+
+
+
+
+
+
+!
+
+&
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+I
+
+
+
+D
+
+
+
+
+
+
+
+(,
+h
+
+7
+/
+
+
+.!=!Kk}X }.AL
+.v !#*%$*$!50!%0h-BC,"Q*K+ .} .}<9.} 2$91z.&z< .o.X$*&?Q1d ~ >!?z.&z<v..m.<~ >N11c/"+.~.!?z.&z<6!n..o<.O~X ~. ~."Cy.
+."!!/! ~ <#!!!///"!" ~ <0Cy. .,#/-+X#!!!!!
+.+#9Xy '/ <k 
+A 
+*D
+
+
+`
+a
+b
+^
+^
+c
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+,m=
+ +
+
+   ƿ')
+vx4.`ȿvB@aaB   v1Ix ɲ)9Uȿq@B4BӽD11$p#@QDa<q
+_ȿz4PDLE
+ w _ȿx2CDbE@AJB<DD 
+0
+ 
+
+@! :" "    
+SK
+"{D F0BMKo{D0
+k" {[=E0#1KE 1CE 1B1SE1B
+ ObF ``ƹ#
+ppGs FF"#F2hF0F)FiF" F F8Q F1F"B#2|
+ApppG"IFhFyDq!#2
+%)p-hI FyD
+`hF(F#F
+0//Ѹ@ и
+0jF #I p
+j1ck1+Дl1+#
+B + FIyDIyDI FyD(&\!VC FI52F< F"0<0<50B F0C0|ETLPp
+I FiF2F F F m
+''F 6I0FyD2IBD0Fb0FO
+0F)"h
+4A+y+4
+<э04<04<04<04< 0
+ 
+0 4<0
+ 4< 0
+ 4< 0
+
+ 4< 0
+
+40F:Fh
+h3B0F
+y
+0I#
+ 
+l!P0*)CC
+IyDI FjF#IyD
+
+
+lP ),CCIyDF IjF#l1
+!B
+IyD 
+I jF
+ "B(FTSIh:
+I FiF:F% F1F*F F
+9K{D4
+ o
+ F I3FXp Fo
+
+
+"P0:F F&
+I0#
+3$113 1$11(1p41$!-AF3B41]Ӑh1
+F#A
+F{DD$pD
+QE@FRF+0DOEK{D3h+$ ;Xz0`+XCXC0p`
+ FIF:F+FDa!ou FIF:F+FB H1DaD1HaF  F9F*FDa  F9F*FB H1DaD1HaF@ FIF:F+FDa @ FIF:F+FB H1DaD1HaF FIF:F+F
+Da FIF:F+FBH1DaD1Ha
+
+
+,
+
+
+
+
+
+
+
+ 
+v
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+$
+(
+)
+
+
+
+F
+F
+ 
+
+ 
+
+
+cI
+ 0
+
+WJ
+x
+
+.K
+IK
+nK
+
+
+
+
+^VL
+
+
+&
+
+
+
+
+
+
+
+B
+
+B 
+
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+2
+
+B
+
+F
+
+
+
+
+
+
+
+
+,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+m
+,
+K
+7
+
+
+
+
+
+Jv.#/4"/-5
+.u.
+.11u -
+ !u /-!-
+ u.
+J
+ !u /-!-
+ u.
+J
+ v 
+</>>/Z1>,N,04z (
+.v
+A 
+*D
+ 
+ 
+
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+&
+)
+6
+
+
+
diff --git a/tdk/ta_export/lib/libutee.a b/tdk/ta_export/lib/libutee.a
new file mode 100755
index 0000000..8240df8
--- a/dev/null
+++ b/tdk/ta_export/lib/libutee.a
@@ -0,0 +1,2937 @@
+!<arch>
+/ 1512712347 0 0 0 7602 `
+
+tee_api_property.o/
+tee_api_objects.o/
+tee_api_operations.o/
+tee_tcpudp_socket.o/
+tee_socket_pta.o/
+tee_api_watermark.o/
+utee_syscalls_a32.o/
+default_regular.o/
+
+/0 1512712346 7593 7000 100666 80592 `
+ELF
+##
+
+H
+K"
+H@{DxD
+S
+}
+l
+
+
+
+
+0
+m
+-}t
+
+7
+L}u
+Y
+
+
+
+
+g}u
+
+
+
+
+
+}u
+
+
+
+}u
+
+}u
+}t
+B
+}u
+B}u
+%)
+
+
+
+B 
+
+B
+
+
+
+
+
+
+B 
+
+
+B 
+
+
+
+
+
+
+H*
+
+
+
+
+
+T
+
+
+R
+
+
+.##"3KL"2
+A 
+*D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+H xD
+
+len
+
+WP4}
+B}u
+Pw
+Pw
+Qw
+}u
+
+
+
+
+
+
+
+
+
+
+
+Qu
+
+
+"#
+!
+
+
+
+
+
+B
+
+
+
+B
+
+
+dG
+
+
+
+
+
+
+
+
+p
+
+
+
+E
+
+
+$K~.K=!.#m !-/J
+A 
+*D
+
+
+
+
+
+|
+|
+|
+}
+|
+
+
+|
+|
+}
+
+|
+~
+
+
+|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+
+
+B
+
+
+
+
+
+
+
+
+
+T
+
+u
+
+
+
+A 
+*D
+
+
+
+
+C
+D
+
+
+ELF
+
+
+
+>
+
+
+N
+
+\
+
+p
+
+4
+1
+B
+
+B
+
+
+
+
+
+
+
+
+
+M
+
+
+
+
+i
+
++
+
+A 
+*D
+
+
+
+
+
+B
+F
+A
+F
+H
+E
+I
+J
+E
+
+ELF
+kF
+B
+
+.? : ; ' < 
+
+
+
+!
+
+Y
+
+
+*
+
+T
+
+
+G
+
+
+
+A 
+*D
+
+
+
+
+K
+M
+
+ELF
+
+
+ 
+4
+B
+
+
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+
+.$#o  !/<!@J.i .>ef.n f!K!"!Z!0b  :#!"!Z!0X ) :#!"!Y!X
+A 
+*D
+
+
+
+
+
+
+
+
+)
+*
+
+ELF
+K"
+H!{DxD
+F{D
+FpF FF!F
+H LxD K" HA!{D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+I
+
+B
+
+B 
+
+
+B 
+B 
+B 
+
+
+
+
+
+B 
+
+
+
+
+
+
+
+a
+&
+
+
+
+7
+>
+J/4= .%
+<."?/$N"
+.$
+.
+565#/P#/ ./R/Q6/Q=` .
+f'{<.>
+A 
+*D
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+O
+K"
+H!{DxD
+K"
+H!{DxD
+FpGK{D`pG
+K"
+H@{DxD
+KB K" H@{DxD
+K"
+HOq{DxD
+a
+b
+buf
+x
+
+
+
+
+}t
+
+
+}t
+$}t
+
+2}t
+<}t
+O
+
+
+
+
+
+
+B
+
+
+B 
+
+B 
+B
+B 
+B 
+
+B
+
+
+
+
+
+
+
+8
+
+
+
+(
+
+
+o ./K"/pJJ20B+!"
+l  q<J! <.37%/"P!0"01!!0/:0m<O7%/#Z!"1
+A 
+*D
+
+
+
+
+
+
+v
+y
+w
+{
+|
+v
+
+w
+|
+}
+
+
+|
+}
+
+|
+}
+
+
+|
+
+|
+}
+
+|
+}
+
+|
+}
+
+|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+K"
+H\!{DxD
+K"
+H@_{DxD
+
+KB
+K"
+H@
+!{DxD
+K"
+H@S!{DxD
+K"
+HOq{DxD
+
+i
+
+
+ R
+
+
+
+
+
+
+
+}t
+}t
+}t
+}t
+$}u
+(}u
+,}u
+1}t
+9}t
+;}v
+E}t
+G}v
+r}t
+u}t
+x}t
+}t
+
+_}t
+
+
+
+
+
+
+}t
+
+}t
+
+}t
+
+}t
+
+
+}t
+
+
+
+
+
+
+-}t
+
+
+
+
+
+D}t
+
+
+
+
+S}t
+`}t
+
+p}t
+}t
+}t
+}t
+}t
+}t
+ : ; 
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"+
+
+
+
+
+O
+
+
+
+
+4
+&
+
+.
+ #0/K/!!!!"w#0
+ 1
+.
+A 
+*D
+
+
+
+a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+FFk˱gk1FjB4B(/F:Fkak8c
+BDckk<[B D 
+1[BD1F
+KB
+lKB
+أSB
+=FFO" #:F
+k)F*F
+
+bib
+FFxK"H@!{DxD(
+BC #iCE> j`ji9F j##aFP`j1FFKB&iC#a KB3B3BK"HO4q{DxD(
+A{DxD
+sB;BsBѨkik 
+
+
+zD
+ kjkF
+,J(FX#F
+H
+;BKB3BK"H@a{DxD
+H
+;BKB3BK"HOa{DxD
+ 9`{`l{ala
+H
+;BK"H@Oq{DxD
+LH"@aq{DxD
+2H"Oa{DxD
+(H"@jq{DxD
+
+K"
+H@q{DxD
+K"
+H@q{DxD
+
+k
+o
+
+"
+z$}v
+$}w
+$}y
+
+
+
+
+$}u
+
+
+
+z$}t
+e$}u
+
+
+
+
+$}u
+$}t
+
+
+
+$}u
+
+
+
+
+
+
+
+$}u
+
+$}t
+
+$}u
+
+
+
+
+
+
+
+S$}u
+
+$}u
+$}v
+$}v
+
+$}v
+$}v
+$}w
+$}t
+$}u
+#$}t
+C$}t
+P$}t
+S$}u
+W$}u
+`$}u
+
+$}u
+A$}t
+
+$}t
+$}t
+$}u
+$}u
+$}w
+$}w
+$}w
+$}w
+
+$}t
+$}t
+
+
+)$}t
+
+`$}t
+
+l$}w
+o$}w
+r$}w
+y$}t
+$}t
+$}t
+<$}t
+$}t
+$}{
+$}x
+$}{
+$}{
+$}{
+$}t
+$}{
+$}x
+.
+$}{
+$}{
+$}{
+$}t
+$}y
+$}v
+$}y
+$}y
+$}y
+$}t
+
+p
+$}x
+$}v
+$}x
+$}x
+$}x
++$}t
+=$}{
+?$}v
+A$}{
+D$}{
+F$}{
+O$}t
+a$}z
+c$}v
+e$}z
+h$}z
+j$}z
+$
+q$}t
+$}y
+$}v
+$}y
+$}y
+$}y
+$}y
+$}y
+$}y
+$}y
+$}y
+$}t
+$}t
+$}t
+$}t
+n
+k
+g
+j
+o
+q
+t
+u
+w
+
+
+
+
+
+
+.
+
+{
+
+
+
+ : ; 
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+X
+.Z=!!#=%"1
+<!!/"'Y0#=?1/=/-!!/#/""PJ7 J
+<!!/!!#=-/42;K2!L/"",A
+A 
+*D
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@
+
+ELF
+3#  p$K"$HY!{DxD
+h{"K
+h{"K
+FFF'K"'H@{DxD
+
+E
+]K
+
+
+j
+
+
+
+
+
+
+
+
+
+
+q{
+
+Z
+l
+
+
+
+
+
+
+}u
+}t
+
+}t
+}u
+}t
+#}t
+
+#}t
+
+
+
+.? : ; ' I@B 
+
+
+B
+
+
+
+
+
+
+
+
+
+
+J8
+
+
+!
+
+
+=
+
+
+
+z
+
+
+
+
+A 
+*D
+ 
+
+
+
+
+
+
+x
+y
+z
+x
+y
+|
+x
+x
+y
+x
+y
+~
+x
+y
+x
+y
+
+x
+y
+x
+y
+x
+y
+
+x
+y
+x
+y
+x
+y
+
+x
+y
+x
+y
+
+x
+x
+y
+x
+y
+
+x
+y
+x
+y
+
+x
+y
+x
+y
+
+x
+x
+y
+x
+y
+
+x
+y
+x
+y
+x
+y
+
+x
+y
+x
+y
+
+x
+y
+x
+y
+x
+y
+
+x
+y
+x
+y
+x
+y
+
+x
+y
+x
+y
+
+x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+B
+PP
+PP
+
+B
+
+
+
+
+
+
+
+H
+
+
+
+
+]
+6
+,
+
+
+
+
+A 
+*D
+
+
+:
+:
+
+
+ELF
+
+p
+3
+_
+
+u
+
+
+
+x
+
+
+
+
+
+
+
+
+
+O
+z
+~@
+
+
+
+B
+
+
+
+
+
+
+-=
+|
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+
+
+n
+o
+n
+o
+p
+q
+r
+n
+o
+p
+q
+r
+n
+o
+s
+n
+o
+t
+u
+r
+n
+o
+v
+n
+o
+n
+o
+v
+n
+o
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+F
+a
+b
+Q!P1
+QP3
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+.0#!0,"" zJ&/!E'[.'[;!/2. <w< 4"E1#/03.Dx<(4"71#/02.R^"z<$"#/0
+A 
+*D
+
+
+R
+S
+U
+V
+U
+U
+U
+U
+
+
+ELF
+pa
+pa
+va
+pa
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+Z
+
+
+A 
+*D
+
+
+
+C
+C
+C
+C
+C
+
+
+ELF
+Y
+D
+Q
+v|
+Y
+D
+Q
+
+
+
+
+
+
+B
+
+,
+
+
+p
+
+
+
+l
+
+z
+
+
++
+
+;
+
+
+
+A 
+*D
+
+
+C
+C
+
+
+ELF
+g@
+V
+`
+g@
+V
+`
+g@
+V
+`
+AJ
+:W
+
+
+
+
+B
+
+
+
+
+
+_,
+
+4
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+C
+C
+C
+C
+
+
+ELF
+
+res
+res
+
+4
+
+
+B
+
+
+
++
+
+
+
+
+
+s
+
+
+
+
+
+4
+
+3
+
+
+A 
+*D
+
+
+
+C
+C
+
+
+ELF
+"
+t
+
+
+
+
+
+
+!
+B
+B 
+
+B
+
+
+
+
+ *'
+ %
+!JW
+#BJ
+
+!
+;
+
+
+
+
+]
+&
+
+
+
+
+
+A 
+*D
+
+
+E
+
+
+ELF
+
+
+9-
+I
+
+
+
+
+B
+
+
+
++
+
+
+Y
+
+
+`
+
+
+
+
+M
+
+_
+
+
+
+
+A 
+*D
+
+
+
+C
+
+
+
+ELF
+'
+'
+'
+'
+'
+M
+'
+'
+
+
+
+
+
+B
+
+
+B 
+
+
+D
+
+
+
+
+
+
+
+
+
+#
+
+
+
+A 
+*D
+
+
+
+
+F
+F
+F
+F
+F
+F
+
+
+
+ELF
+
+
+
+
+
+
+
+!
+
+
+B
+
+
+
+I-
+
+
+
+(
+
+
+
+b
+
+
+
+
+
+
+A 
+*D
+
+
+
+I
+J
+I
+J
+
+
+ELF
+h
+'
+
+
+
+4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/
+
+A 
+*D
+
+
+
+ELF
+hBhB
+(
+G
+
+
+
+B
+
+
+
+
+'
+
+
+
+
+
+
+
+
+
+
+
+1
+>
+
+
+A 
+*D
+
+
+8
+8
+9
+9
+;
+<
+<
+<
+<
+
+
+
+ELF
+K"(F3!{D
+
+}6
+
+
+
+
+
+
+
+
+
+O
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+&
+
+
+B 
+
+B
+
+
+
+
+
+
+
+r
+
+
+
+
+
+
+
+
+
+9
+
+
+_
+
+
+
+
+
+&
+
+A 
+*D
+
+
+
+
+g
+h
+i
+
+j
+k
+j
+l
+m
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+{
+|
+}
+~
+
+
+
+
+
+
+
+
+s
+
+
+
+
+
+
+
+
+
+
+
+ELF
+H"IKxDyD{D\B bF@F  
+ hB4 B0FJ
+
+`5=`3`
+hIh h
+SXFF
+!F0 B
+
+b
+
+=
+W
+h
+
+)
+#p
+
+
+&
+B 
+
+
+
+B
+
+B 
+
+
+
+B
+
+
+
+
+
+
+
+6
+
+
+
+
+
+
+E
+<L//+$<<@!'x !]0kK-!""/$3!&0u"/
+ u  J
+A 
+*D
+ 
+
+
+
+^
+_
+`
+
+c
+e
+c
+e
+
+ELF
+` HxDA`hF
+` JzDh;`3@h
+
+_
+-
+
+
+
+
+[92/
+E
+
+
+
+
+
+
+
+
+
+B 
+
+B 
+B
+
+
+
+
+
+
+"
+
+
+
+
+
+
+l
+
+
+
+
+
+
+
+J>1< /.?fi#xX #/~.f<(.=
+A 
+*D
+
+
+
+h
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+r
+v
+t
+w
+x
+y
+
+
+
+
+ELF
+PP
+QQ
+PP
+QP
+PQ
+PP
+QQ
+PP
+B
+B 
+
+B
+
+B 
+$
+
+
+!
+
+
+
+@
+
+
+'
+
+
+
+A 
+*D
+
+
+
+
+
+
+ELF
+p
+A 
+*D
+gprof_a32.o/ 1512712346 7593 7000 100666 618 `
+ELF
+A 
+*D
+ELF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"
+,
+6
+@
+J
+
+
+
+
+*
+*
+^
+,
+
+
+
+
+
+(
+
+
+
+2
+
+
+
+
+
+
+
+
+
+4
+
+
+
+
+
+
+
+
+
+>
+
+
+
+
+A 
+*D
+
+
+
+
+
+
+
+
+ELF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+%
+/
+9
+C
+M
+W
+a
+k
+(
+2
+
+
+*
+*
+
+,
+
+
+
+
+
+(
+
+
+
+2
+
+
+
+
+
+4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+,
+9
+
+A 
+*D
+
+
+
+
+
+
+
diff --git a/tdk/ta_export/lib/libutils.a b/tdk/ta_export/lib/libutils.a
new file mode 100755
index 0000000..80d7b0f
--- a/dev/null
+++ b/tdk/ta_export/lib/libutils.a
@@ -0,0 +1,3935 @@
+!<arch>
+/ 1512712347 0 0 0 3136 `
+
+r(
+r(
+t
+t
+t
+t
+t
+t
+
+
+4
+4
+arm32_aeabi_divmod_a32.o/
+arm32_aeabi_divmod.o/
+arm32_aeabi_ldivmod_a32.o/
+arm32_aeabi_ldivmod.o/
+arm32_aeabi_shift.o/
+arm32_aeabi_softfloat.o/
+f32_to_i32_r_minMag.o/
+f32_to_i64_r_minMag.o/
+f32_to_ui32_r_minMag.o/
+f32_to_ui64_r_minMag.o/
+f64_to_i32_r_minMag.o/
+f64_to_i64_r_minMag.o/
+f64_to_ui32_r_minMag.o/
+f64_to_ui64_r_minMag.o/
+s_normSubnormalF64Sig.o/
+s_normSubnormalF32Sig.o/
+s_roundPackToF32.o/
+s_roundPackToF64.o/
+s_shortShiftRightJam64.o/
+s_shiftRightJam32.o/
+s_normRoundPackToF32.o/
+s_normRoundPackToF64.o/
+s_shiftRightJam64.o/
+s_countLeadingZeros8.o/
+s_countLeadingZeros32.o/
+s_countLeadingZeros64.o/
+softfloat_state.o/
+softfloat_raiseFlags.o/
+s_propagateNaNF32UI.o/
+s_f32UIToCommonNaN.o/
+s_commonNaNToF64UI.o/
+s_f64UIToCommonNaN.o/
+s_propagateNaNF64UI.o/
+s_commonNaNToF32UI.o/
+buf_compare_ct.o/
+
+bget_malloc.o/ 1512712347 7593 7000 100666 67032 `
+ELF
+[h
+l2
+d@VH@E2UIVKxDyD{D P,
+
+BIKxDyD{D`O
+B lH@kIlKxDyD{DB3&.gHOrfIgKxDyD{DS,8S<AhB`H@`I`KxDyD{DC`D<D,1FD,9WK{Dh
+"*I*KxDyD{DN3A F)FF
+V5p
+تBؑBبB3B
+
+
+
+
+@0
+
+])
+4
+ 
+
+
+
+
+
+
+
+2
+5
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ : ;
+
+
+
+
+
+
+B
+
+
+
+B 
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"K
+
+
+A
+K
+-
+0
+
+
+J
+
+
+
+
+
+
+
+
+ 
+ /=
+.=
+X#",0!=//=!
+   <<n.{.J=f y  /v. .10
+. 
+A 
+*D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+D
+"F8F
+Pv
+Rx
+Pw
+
+B
+
+
+
+1
+
+
+
+
+
+
+
+:
+
+A 
+*D
+
+
+7
+8
+9
+
+ELF
+
+( ( (а XBXApG pGa+A8(
+
+B 
+.? : ; ' I@B 
+B
+
+B 
+B
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+ELF
+^
+
+^
+4
+
+
+
+
+B
+
+
+
+&
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+"
+"
+
+ELF
+
+B
+
+
+
+$
+
+
+
+
+
+
+
+
+A 
+*D
+
+ELF
+ڰG
+Z6:h
+8X'O (F OI  
+8 X_F
+h `:`9F"F3F""?GE
+6:h
+ JZEZF
+ BEBF
+3FE !FXF"FF(FE@F!F
+F
+
+ t
+ i
+ t
+ 
+
+B
+
+
+
+
+
+
+
+
+
+
+
+*
+
+
+
+
+
+
+
+
+
+
+
+
+6
+
+
+
+A 
+*D
+
+
+
+3
+4
+3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+Pv
+Pt
+Rt
+Qv
+Pu
+
+
+B
+
+'
+
+3
+
+
+
+
+
+
+
+
+
+,
+
+
+
+
+A 
+*D
+
+
+
+4
+5
+6
+
+ELF
+
+
+B
+
+1
+
+'
+
+
+,
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+4
+5
+6
+
+
+ELF
+ 
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+E
+E
+
+
+
+ELF
+ 
+
+&
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+1
+
+
+ELF
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+ELF
+
+
+
+
+
+
+
+
+
+
+
+/
+
+
+
+
+
+ v  .!
+A 
+*D
+
+
+
+ELF
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+'
+
+
+
+A 
+*D
+
+
+
+
+ELF
+Fx1Bx
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+
+ELF
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+ELF
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+
+ELF
+
+
+
+
+!
+
+
+
+
+
+
+
+/
+
+A 
+*D
+
+
+ELF
+B
+h(
+
+
+5
+
+
+-
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+
+ELF
+B 
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+0
+A 
+*D
+
+
+
+
+ELF
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+
+ELF
+
+
+&
+"
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+ELF
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+
+ELF
+JO O;K?
+
+&PF
+v
+L
+&
+
+B
+
+
+S
+
+
+
+
+
+
+
+(
+
+
+A 
+*D
+ 
+
+
+6
+3
+4
+7
+8
+9
+
+ELF
+A 
+*D
+/26 1512712347 7593 7000 100666 24996 `
+ELF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+#
+
+
+
+
+
+
+
+
+
+
+
+.! /=/N./Z[?./Z[?./ZZK1./Z
+A 
+*D
+
+
+
+
+
+
+
+
+
+
+
+
+!
+
+ELF
+A 
+*D
+ELF
+
+i
+q
+
+4
+
+
+B
+
+
+
+
+
+
+
+
+(
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<=0#/>
+./u//tKK
+A 
+*D
+
+
+
+
+
+
+
+
+
+
+ELF
+
+Z*
+Z*
+4
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+ELF
+A 
+*D
+/119 1512712347 7593 7000 100666 41560 `
+ELF
+y
+y
+y
+y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+&
+
+
+
+
+*
+
+
+
+
+
+A 
+*D
+
+
+
+
+
+
+
+
+
+0
+
+
+
+
+
+
+
+
+
+%
+'
+)
++
++
+.
+0
+2
+2
+0
+6
+8
+:
+<
+<
+?
+A
+C
+C
+A
+G
+I
+K
+M
+O
+Q
+S
+U
+W
+Y
+[
+]
+_
+a
+c
+e
+g
+i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+a
+b
+
+
+/
+
+
+
+-
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+ELF
+~ SED <]RF F)F
+
+EE 2FFXF  HO{ @Op
+Oe
+
+
+ : ; 
+
+
+B
+
+&,=
+
++
+
+
+
+
+
+;
+
+
+<
+
+.u  .Y  2//1!//A/A!!/="x!/{/,2@!//00!
+A 
+*D
+
+
+
+-
+.
+.
++
+/
+0
+-
+ELF
+D
+
+
+
+%
+e6
+
+(
+B
+
+
+
+
+
+
+
+
+-
+
+
+
+
+
+
+A 
+*D
+
+,
+
+ELF
+
+
+q
+%
+3
+
+(
+
+B
+
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+(
+
+ELF
+
+
+
+
+%
+ 3
+
+(
+B
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+(
+
+ELF
+Oe
+
+
+
+ : ; 
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+>
+,
+,
+-
+.
+/
+0
+ELF
+
+a
+b
+
+
+/
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+ELF
+FI
+FhF
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+,
+-
+.
+ELF
+
+#
+
+%
+N3
+
+(
+
+
+B
+
+
+
+
+
+
+
+
+8
+
+
+
+
+
+A 
+*D
+
+
+)
+ELF
+
+ KXxBpg@BaA
+
+5
+S
+
+A
+a3
+
+
+
+
+(
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+*
+(
+ELF
+
+
+ 
+
+
+
++3
+
+(
+
+
+
+B
+
+
+
+
+)
+
+
+
+
+
+
+
+ v. :u. !
+A 
+*D
+
+)
+ELF
+KXxBp O0O1
+
+
+0
+
+
+
+3
+
+(
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+ 0t  .,0s  !
+A 
+*D
+
+(
+*
+ELF
+yDO
+
+a
+
+
+
+
+B
+
+/
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+ELF
+
+ #O
+#e OyOxIi
+#i O sOrCc
+OZ
+
+
+ : ; 
+
+
+
+
+
+B
+
+
+&1=
+
+
+"
+9
+
+
+
+
+
+
+
+
+
+A 
+*D
+-
+.
+.
++
+/
+0
+-
+ELF
+
+:
+a
+
+A
+)6
+
+(
+B
+
+
+
+
+
+
+
+
+
+
+
+
+.
+A 
+*D
+
+,
+
+ELF
+
+T
+:
+
+A
+2
+
+(
+B
+
+
+1
+
+
+
+
+)
+,
+
+
+
+
+
+A 
+*D
+
+
+)
+ELF
+
+=
+:
+
+A
+2
+
+(
+B
+
+
+
+
+
+
+
+
+'
+
+
+
+
+A 
+*D
+
+
+)
+ELF
+
+
+C #
+CO
+:C
+I
+IOs
+Ow
+
+
+ : ; 
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+,
+,
+-
+.
+/
+0
+ELF
+yDO
+
+,
+a
+
+
+
+
+B
+
+/
+
+
+$
+
+
+
+
+
+
+
+
+A 
+*D
+
+ELF
+
+9
+
+
+
+
+
+
+B
+
+
+%
+
+
+
+
+
+
+
+
+;
+A 
+*D
+
+,
+-
+.
+/
+
+ELF
+
+O4D;@4
+KY0xBp6
+
+
+2
+
+&
+
+
+(
+B
+
+
+
+6
+
+
+
+
+
+
+
+3
+
+A 
+*D
+ 
+
++
+(
+)
+ELF
+ @t
+4K
+dBeEO4o
+
+M
+g
+
+
+A
+03
+
+(
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+.
+A 
+*D
+ 
+
++
+(
+)
+(
+ELF
+ K[0xBpTF
+
+ 
+
+
+
+!3
+
+(
+B
+
+
+
+
+3
+
+
+
+6
+
+
+
+
+.!-vJ
+.!/I0s. .+/0!
+
+A 
+*D
+ 
+
++
+(
+)
+ELF
+ @t
+
+ 
+x
+
+ 3
+
+(
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ht. .,#,>s. L!
+A 
+*D
+
+(
+)
+(
++
+ELF
+
+a
+
+
+B
+
+
+
+
+/
+
+
+
+
+(
+
+
+
+
+
+
+A 
+*D
+
+(
+
+ELF
+
+
+a
+
+
+
+B
+
+/o
+
+
+1
+
+
+
+
+
+
+
+
+.0
+A 
+*D
+
+)
+'
+
+ELF
+
+
+a
+
+
+B
+
+/
+
+
+3
+
+
+9
+
+
+
+
+
+
+A 
+*D
+
+(
+)
+*
+
+ELF
+K"F+F
+RBcC
+
+a
+<Pv
+
+
+B
+
+/G
+
+
+
+)
+
+
+
+
+
+
+
+
+A 
+*D
+
+)
+ELF
+
+a
+
+
+B
+
+
+/
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+(
+)
+
+ELF
+
+
+
+5
+a
+
+
+B
+
+/
+
+
+
+
+
+9
+
+
+
+
+
+
+A 
+*D
+
+)
+'
+
+ELF
+TМ@
+
+a
+
+
+
+B
+
+/
+
+
+1
+
+
+
+
+
+
+
+
+A 
+*D
+
+(
+)
+*
+
+ELF
+
+a
+= Q0 Pt
+< Q0 }
+
+
+B
+
+
+/o
+
+
+
+1
+
+'
+
+
+
+
+8
+
+A 
+*D
+
+(
+)
+*
+
+ELF
+
+
+(
+&
+w'
+
+
+
+
+
+"
+Pu
+
+(
+
+
+
+B
+
+
+
+
+#
+
+
+
+
+
+
+
+
+A 
+*D
+,
+-
+-
+.
+/
+ELF
+
+  TOPO:@ 
+
+E T @
+
+e F"BZ %.
+F FK k2
+1
+
+
+(
+&
+v'
+
+
+
+
+u
+"
+@$@&
+@$@&
+
+(
+
+
+
+B
+
+)"F
+
+
+
+H
+
+
+
+
+
+
+
+\
+
+
+
+
+
+
++
+
+2
+%
+
+
+
+
+
+A 
+*D
+,
+-
+-
+.
+/
+ELF
+uiA
+uiB
+Pv
+0)(
+
+
+
+
+
+B
+
+
+
+0)(
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+
+
+
+/
+
+A 
+*D
+
++
++
+,
+-
+
+ELF
+0 \oGWOV 
+O8Pf
+
+E @ @Oq
+A o
+C S
+PFYF#FF
+uiA
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+,
+,
+-
+.
+ELF
+
+
+z
+
+4
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+)
+'
+
+ELF
+
+z
+
+4
+B
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+(
+
+ELF
+8O
+
++
+dCOx!FDD`
+
+.
+t
+
+
+
+
+$
+%
+
+L
+
+A
+
+Pt
+
+(
+
+
+
+B
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+)
+*
+*
+ELF
+
+@P_
+
+ 
+
+U
+
+
+~$
+X%
+
+L
+?
+A
+
+
+(
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+ 
+
+)
+*
+*
+ELF
+
+
+0
+
+
+
+"
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+ELF
+KB @
+
+B
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+ELF
+
+
+H
+
+
+B
+
+
+
+
++
+
+
+
+
+
+
+
+A 
+*D
+N
+
+
+(
+)
+
+ELF
+:
+
+
+C
+
+
+
+B
+
+*
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+ 
+
+
+)
+'
+'
+*
+
+ELF
+%
+
+
+
+
+-
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+ELF
+
+
+
+
+
+
+
+
+
+
+!
+
+
+A 
+*D
+
+
+
+
+ELF
+
+3+
+B 
+4
+
+
+
+*
+
+
+
+
+
+
+(
+
+
+
+
+
+
+A 
+*D
+
+
+ELF
+
+
+
+B 
+!
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+ELF
+5DO
+D EE
+
+a32
+a0
+z
+mid
+
+
+4
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+ 
+
+ELF
+
+& 
+
+
+
+
+
+
+
+
+
+
+
+!
+
+A 
+*D
+
+
+
+
+
+
+ELF
+B 
+
+
+
+
+
+#
+
+
+
+
+
+A 
+*D
+
+
+
+ELF
+
+
+6
+
+1
+B
+
+&9
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+,
+ELF
+"
+
+
+.? : ; ' @B 
+B
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+&
+
+ELF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+ELF
+ IO0 @)@P 
+x
+
+
+.? : ; ' @B 
+B
+
+
+
+
+
+(
+
+
+
+
+
+
+
+
+A 
+*D
+
+&
+ELF
+O
+O
+FO
+
+
+
+
+
+1
+B
+
+&
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+ 
+,
+ELF
+@p@@@
+
+
+
+B 
+
+
+
+
+
+
+
+
+"
+
+2
+
+
+A 
+*D
+
+
+
+ELF
+; 
+ܸ#fи*fи @X.jи0и-@_U
+3h6C{j
+ 
+
+`H`"
+
+AEq0
+"
+" F<F F "
+#x( ! AqF FT  XF
+;<
+E
+պ
+
+o0$
+K9
+8
+
+ 1YE{ #
+;:
+m!
+
+@
+
+
+
+
+
+
+
+4
+
+
+
+
+
+
+
+
+
+
+
+B
+
+
+
+
+
+
+
+"
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+2
+3
+4
+0
+0
+
+
+
+1
+5
+
+
+ELF
+F
+
+
+PQ
+
+B
+
+
+!
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+.
+
+ELF
+
+'
+
+
+&
+!
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+
+ELF
+ 
+
+&
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+ELF
+q1JzD
+ȿ$,($+U
++,
+5
+
+
+ 
+
+ 
+
+  }
+
+ 
+
+4
+B 
+
+.
+B
+
+
+
+
+B
+
+
+
+
+
+
+
+#
+2
+
+
+
+
+
+A 
+*D
+
+
+P
+Q
+P
+P
+P
+P
+R
+S
+ELF
+A 
+*D
diff --git a/tdk/ta_export/lib/libzlib.a b/tdk/ta_export/lib/libzlib.a
new file mode 100755
index 0000000..011e7f5
--- a/dev/null
+++ b/tdk/ta_export/lib/libzlib.a
@@ -0,0 +1,1004 @@
+!<arch>
+/ 1512712347 0 0 0 1050 `
+
+
+ELF
+DD{DwDD8wDA8A3B FOqF(F FOq FARB;F
+
+rem
+
+
+4
+B 
+B
+
+B
+
+
+
+
+q
+4
+"
+
+[
+*
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+'
+(
+(
+(
+(
+(
+(
+
+
+ELF
+5lBɻ@l2u\E Y=ѫ0&:
+| <qPA' %hWo fa^)"а=Y .;\l ұt9Gwҝ&s c;d>jm Zjz  '
+}Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L
+J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju
+m ?6grW
+ TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-
+
+
+
+
+
+B 
+.: ;' @B 
+B
+
+
+
+B
+B 
+
+
+
+
+
+&
+
+
+
+
+
+
+
+
+(
+A 
+*D
+
+
+ELF
+T\h3UCa-Opnjko|oeE
+< Pi T
+ l `l 0o9g
+@>d .0Ij[rB F_ f"nn*@!o:Ҳ[Qh+h#3hT0`3tI+X\%nJX \
+ ."n:"f
+Fl
+
+C:d Fo
+
+#iܱ#ici3
+ h
+TXh
+Th
+Th
+Taa 
+3PTcaq#ojh
+ ihIhTXihIh
+TihɈTihyTba )
+
+ibaiXIihT
+Tcaij+(khbi(c
+0+++##
+T
+
+  cot
+yB3BыBYqE`!f!nS)4hO
+0 !JJ FzD#1FhG+( (i
+F F.l
+ThhPT3
+ThhPTz3hPTca F F)(Fi`i
+O c `!ZbBce d:Be
+
+
+{
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++Q1
+
++Q1
++Qv
+' 
+
+
+
+
+
+B
+
+
+B 
+
+
+
+
+
+
+
+
+
+
+6
+
+2
+
+
+
+1D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2
+
+
+
+
+
+
+
+1
+
+
+ !
+.B)3
+f?5w/?O#[KBy. ""=!K"Y=====!<. <.b   <;v.=
+f XuJ=
+<A=
+."hE!$
+J-/wJ=Y0A==!-!"$FYKYKYKh>^[$>L/=@//>=!/u
+
+<M02"-V...
+A 
+*D
+ 
+ 
+
+ 
+ 
+
+
+?
+?
+@
+A
+B
+B
+C
+?
+D
+D
+D
+D
+D
+D
+D
+D
+D
+
+D
+
+D
+
+@
+
+B
+A
+@
+
+J
+I
+B
+C
+A
+A
+Q
+@
+A
+A
+A
+A
+A
+A
+A
+D
+D
+D
+D
+S
+T
+B
+R
+X
+W
+Y
+?
+?
+W
+?
+?
+?
+?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+C3f(82$nmB C
+" d5{DIfcmO l ;;@[E5GF
+lL
+bD"0JxI
+
+@!dù
+#l8;# #ZՐK{Dd5GF
+bD" KxI
+
+@SRK{D.add=GFj=+@6lB!bl@99@@RbdjjblB4AF
+
+
+
+
+
+
+
+
+&
+
+ #
+{
+
+
+
+
+
+
+!Q1
+
+t
+' 
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+. < o .
+<!!+/0v!@":!/!A2
+A 
+*D
+
+?
+@
+@
+@
+A
+
+
+
+ELF
+&hmj 
+8>P*
+`xx4@2 
+>D
+
+
+
+
+w#
+
+
+
+
+
+
+
+' 
+
+
+
+
+
+
+
+
+
+
+
+2
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+
+ELF
+@-c0o
+cbB:={D
+"
+ՍD`6
+i"E`a
+
+D`iE03 6"F0G`a
+
+`#i
+ՍD`6
+i"E`a
+
+i"E`
+
+bCF&
+#a0`
+
+cm9
+
+
+
+
+
+
+
+
+
+
+aCB#
+DOs+
++ 
++0Fy*FQ
+#o
+ck+ F
+
+
+
+
+
+
+
+
+
+(
+
+ V$
+$
+
+
+
+
+
+
+$Q1
+
+
+
+$Q1
+
+$Qu
+
+' 
+
+
+
+
+
+
+B
+
+B 
+
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $!!!u/#:#
+ w "!!!*&=/Lo .$
+.4 //-5#
+X0KK>!/K<>-2/?!M!\=
+< .%
+A 
+*D
+
+I
+I
+I
+L
+R
+R
+P
+S
+R
+R
+R
+R
+I
+R
+R
+R
+R
+S
+I
+T
+T
+T
+U
+R
+S
+R
+S
+I
+I
+S
+S
+K
+I
+I
+I
+
+
+
+
+
+ELF
+<O6
+\FFO 
+N7 
+E p6` 
+ q7YE8 E,
+
+
+
+
+
+.? : ; ' I@B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+ELF
+,ܰJ4JJ4J}BO
+
+GahL
+)dܰhGE$ݳ
+
+ Gah H
+
+ Gah H
+=GiL h
+
+Gah F 
+UEai
+.
+Կ3F
+`RF F)FO
+Z
+
+p
+ 0?
+BihTT2h
+ U
+ UBa
+i:a0
+J$zD +(2,8+
+TcacihT3caBk
+VUiDa :!A@2 Ca
+ UBa
+2`
+6B(FV
+CairTN1h?
+Uiaa :A@2Ca FhJzDAl&i. *h
+CaizTO1hO.iaa :A@21CaSi
+
+
+gai ?H
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+   
+
+
+
+
+
+
+
+
+|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+' 
+
+
+
+
+
+
+
+
+B
+
+
+B 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+V
+p
+x
+n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3%
+
+
+
+
+
+
+
+
+:
+
+
+
+
+
+.G600n .!
+.@ `XCy '\JX!
+ q.!=g=
+ t.= t."#, 3"!n..!Ym.<l< )
+X!@
+X>!'y<5
+<-!Kg"v"&x C=e/;=-/XO
+
+A 
+*D
+ 
+
+
+
+G
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+
+
+
+
+' 
+
+
+
+
+B
+
+
+
+
+
+
+
+
+
+
+
+A 
+*D
+
+
+"
+#
+$
+$
+
+
+ELF
+err
+len
+s1
+len
+B
+B 
+
+
+B 
+
+
+
+
+
+
+
+
+
++
+
+
+
+A 
+*D
+
+