From c6c9823ce80ea51579f20b8aaa76a2e440e956fe Mon Sep 17 00:00:00 2001 From: "Frankie.Chang" Date: Wed, 11 Nov 2020 11:02:42 +0800 Subject: [PATCH 01/28] BACKPORT: binder: move structs from core file to header file Moving all structs to header file makes module more extendable, and makes all these structs to be defined in the same file. Signed-off-by: Frankie.Chang Acked-by: Todd Kjos Link: https://lore.kernel.org/r/1605063764-12930-2-git-send-email-Frankie.Chang@mediatek.com Signed-off-by: Greg Kroah-Hartman Bug: 182234755 Change-Id: Ifd9c159195011e9311a5dda6e15f102b584d4b5a (cherry picked from commit 1987f112f1425cba2671d878f6952087e9456a0a) Signed-off-by: Frankie Chang (cherry picked from commit a9c29b897d9ed7cec7f11c59f1035c96c09f4b96) --- drivers/android/binder.c | 431 ------------------------------ drivers/android/binder_internal.h | 431 ++++++++++++++++++++++++++++++ 2 files changed, 431 insertions(+), 431 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 24a041c9cc39..7ac1816d45c8 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -69,11 +69,9 @@ #include #include -#include #include -#include "binder_alloc.h" #include "binder_internal.h" #include "binder_trace.h" #include @@ -167,24 +165,6 @@ module_param_call(stop_on_user_error, binder_set_stop_on_user_error, #define to_binder_fd_array_object(hdr) \ container_of(hdr, struct binder_fd_array_object, hdr) -enum binder_stat_types { - BINDER_STAT_PROC, - BINDER_STAT_THREAD, - BINDER_STAT_NODE, - BINDER_STAT_REF, - BINDER_STAT_DEATH, - BINDER_STAT_TRANSACTION, - BINDER_STAT_TRANSACTION_COMPLETE, - BINDER_STAT_COUNT -}; - -struct binder_stats { - atomic_t br[_IOC_NR(BR_FAILED_REPLY) + 1]; - atomic_t bc[_IOC_NR(BC_REPLY_SG) + 1]; - atomic_t obj_created[BINDER_STAT_COUNT]; - atomic_t obj_deleted[BINDER_STAT_COUNT]; -}; - static struct binder_stats binder_stats; static inline void binder_stats_deleted(enum binder_stat_types type) @@ -220,299 +200,11 @@ static struct binder_transaction_log_entry *binder_transaction_log_add( return e; } -/** - * struct binder_work - work enqueued on a worklist - * @entry: node enqueued on list - * @type: type of work to be performed - * - * There are separate work lists for proc, thread, and node (async). - */ -struct binder_work { - struct list_head entry; - - enum binder_work_type { - BINDER_WORK_TRANSACTION = 1, - BINDER_WORK_TRANSACTION_COMPLETE, - BINDER_WORK_RETURN_ERROR, - BINDER_WORK_NODE, - BINDER_WORK_DEAD_BINDER, - BINDER_WORK_DEAD_BINDER_AND_CLEAR, - BINDER_WORK_CLEAR_DEATH_NOTIFICATION, - } type; -}; - -struct binder_error { - struct binder_work work; - uint32_t cmd; -}; - -/** - * struct binder_node - binder node bookkeeping - * @debug_id: unique ID for debugging - * (invariant after initialized) - * @lock: lock for node fields - * @work: worklist element for node work - * (protected by @proc->inner_lock) - * @rb_node: element for proc->nodes tree - * (protected by @proc->inner_lock) - * @dead_node: element for binder_dead_nodes list - * (protected by binder_dead_nodes_lock) - * @proc: binder_proc that owns this node - * (invariant after initialized) - * @refs: list of references on this node - * (protected by @lock) - * @internal_strong_refs: used to take strong references when - * initiating a transaction - * (protected by @proc->inner_lock if @proc - * and by @lock) - * @local_weak_refs: weak user refs from local process - * (protected by @proc->inner_lock if @proc - * and by @lock) - * @local_strong_refs: strong user refs from local process - * (protected by @proc->inner_lock if @proc - * and by @lock) - * @tmp_refs: temporary kernel refs - * (protected by @proc->inner_lock while @proc - * is valid, and by binder_dead_nodes_lock - * if @proc is NULL. During inc/dec and node release - * it is also protected by @lock to provide safety - * as the node dies and @proc becomes NULL) - * @ptr: userspace pointer for node - * (invariant, no lock needed) - * @cookie: userspace cookie for node - * (invariant, no lock needed) - * @has_strong_ref: userspace notified of strong ref - * (protected by @proc->inner_lock if @proc - * and by @lock) - * @pending_strong_ref: userspace has acked notification of strong ref - * (protected by @proc->inner_lock if @proc - * and by @lock) - * @has_weak_ref: userspace notified of weak ref - * (protected by @proc->inner_lock if @proc - * and by @lock) - * @pending_weak_ref: userspace has acked notification of weak ref - * (protected by @proc->inner_lock if @proc - * and by @lock) - * @has_async_transaction: async transaction to node in progress - * (protected by @lock) - * @sched_policy: minimum scheduling policy for node - * (invariant after initialized) - * @accept_fds: file descriptor operations supported for node - * (invariant after initialized) - * @min_priority: minimum scheduling priority - * (invariant after initialized) - * @inherit_rt: inherit RT scheduling policy from caller - * @txn_security_ctx: require sender's security context - * (invariant after initialized) - * @async_todo: list of async work items - * (protected by @proc->inner_lock) - * - * Bookkeeping structure for binder nodes. - */ -struct binder_node { - int debug_id; - spinlock_t lock; - struct binder_work work; - union { - struct rb_node rb_node; - struct hlist_node dead_node; - }; - struct binder_proc *proc; - struct hlist_head refs; - int internal_strong_refs; - int local_weak_refs; - int local_strong_refs; - int tmp_refs; - binder_uintptr_t ptr; - binder_uintptr_t cookie; - struct { - /* - * bitfield elements protected by - * proc inner_lock - */ - u8 has_strong_ref:1; - u8 pending_strong_ref:1; - u8 has_weak_ref:1; - u8 pending_weak_ref:1; - }; - struct { - /* - * invariant after initialization - */ - u8 sched_policy:2; - u8 inherit_rt:1; - u8 accept_fds:1; - u8 txn_security_ctx:1; - u8 min_priority; - }; - bool has_async_transaction; - struct list_head async_todo; -}; - -struct binder_ref_death { - /** - * @work: worklist element for death notifications - * (protected by inner_lock of the proc that - * this ref belongs to) - */ - struct binder_work work; - binder_uintptr_t cookie; -}; - -/** - * struct binder_ref_data - binder_ref counts and id - * @debug_id: unique ID for the ref - * @desc: unique userspace handle for ref - * @strong: strong ref count (debugging only if not locked) - * @weak: weak ref count (debugging only if not locked) - * - * Structure to hold ref count and ref id information. Since - * the actual ref can only be accessed with a lock, this structure - * is used to return information about the ref to callers of - * ref inc/dec functions. - */ -struct binder_ref_data { - int debug_id; - uint32_t desc; - int strong; - int weak; -}; - -/** - * struct binder_ref - struct to track references on nodes - * @data: binder_ref_data containing id, handle, and current refcounts - * @rb_node_desc: node for lookup by @data.desc in proc's rb_tree - * @rb_node_node: node for lookup by @node in proc's rb_tree - * @node_entry: list entry for node->refs list in target node - * (protected by @node->lock) - * @proc: binder_proc containing ref - * @node: binder_node of target node. When cleaning up a - * ref for deletion in binder_cleanup_ref, a non-NULL - * @node indicates the node must be freed - * @death: pointer to death notification (ref_death) if requested - * (protected by @node->lock) - * - * Structure to track references from procA to target node (on procB). This - * structure is unsafe to access without holding @proc->outer_lock. - */ -struct binder_ref { - /* Lookups needed: */ - /* node + proc => ref (transaction) */ - /* desc + proc => ref (transaction, inc/dec ref) */ - /* node => refs + procs (proc exit) */ - struct binder_ref_data data; - struct rb_node rb_node_desc; - struct rb_node rb_node_node; - struct hlist_node node_entry; - struct binder_proc *proc; - struct binder_node *node; - struct binder_ref_death *death; -}; - enum binder_deferred_state { BINDER_DEFERRED_FLUSH = 0x01, BINDER_DEFERRED_RELEASE = 0x02, }; -/** - * struct binder_priority - scheduler policy and priority - * @sched_policy scheduler policy - * @prio [100..139] for SCHED_NORMAL, [0..99] for FIFO/RT - * - * The binder driver supports inheriting the following scheduler policies: - * SCHED_NORMAL - * SCHED_BATCH - * SCHED_FIFO - * SCHED_RR - */ -struct binder_priority { - unsigned int sched_policy; - int prio; -}; - -/** - * struct binder_proc - binder process bookkeeping - * @proc_node: element for binder_procs list - * @threads: rbtree of binder_threads in this proc - * (protected by @inner_lock) - * @nodes: rbtree of binder nodes associated with - * this proc ordered by node->ptr - * (protected by @inner_lock) - * @refs_by_desc: rbtree of refs ordered by ref->desc - * (protected by @outer_lock) - * @refs_by_node: rbtree of refs ordered by ref->node - * (protected by @outer_lock) - * @waiting_threads: threads currently waiting for proc work - * (protected by @inner_lock) - * @pid PID of group_leader of process - * (invariant after initialized) - * @tsk task_struct for group_leader of process - * (invariant after initialized) - * @deferred_work_node: element for binder_deferred_list - * (protected by binder_deferred_lock) - * @deferred_work: bitmap of deferred work to perform - * (protected by binder_deferred_lock) - * @is_dead: process is dead and awaiting free - * when outstanding transactions are cleaned up - * (protected by @inner_lock) - * @todo: list of work for this process - * (protected by @inner_lock) - * @stats: per-process binder statistics - * (atomics, no lock needed) - * @delivered_death: list of delivered death notification - * (protected by @inner_lock) - * @max_threads: cap on number of binder threads - * (protected by @inner_lock) - * @requested_threads: number of binder threads requested but not - * yet started. In current implementation, can - * only be 0 or 1. - * (protected by @inner_lock) - * @requested_threads_started: number binder threads started - * (protected by @inner_lock) - * @tmp_ref: temporary reference to indicate proc is in use - * (protected by @inner_lock) - * @default_priority: default scheduler priority - * (invariant after initialized) - * @debugfs_entry: debugfs node - * @alloc: binder allocator bookkeeping - * @context: binder_context for this proc - * (invariant after initialized) - * @inner_lock: can nest under outer_lock and/or node lock - * @outer_lock: no nesting under innor or node lock - * Lock order: 1) outer, 2) node, 3) inner - * @binderfs_entry: process-specific binderfs log file - * - * Bookkeeping structure for binder processes - */ -struct binder_proc { - struct hlist_node proc_node; - struct rb_root threads; - struct rb_root nodes; - struct rb_root refs_by_desc; - struct rb_root refs_by_node; - struct list_head waiting_threads; - int pid; - struct task_struct *tsk; - struct hlist_node deferred_work_node; - int deferred_work; - bool is_dead; - - struct list_head todo; - struct binder_stats stats; - struct list_head delivered_death; - int max_threads; - int requested_threads; - int requested_threads_started; - int tmp_ref; - struct binder_priority default_priority; - struct dentry *debugfs_entry; - struct binder_alloc alloc; - struct binder_context *context; - spinlock_t inner_lock; - spinlock_t outer_lock; - struct dentry *binderfs_entry; -}; - enum { BINDER_LOOPER_STATE_REGISTERED = 0x01, BINDER_LOOPER_STATE_ENTERED = 0x02, @@ -522,129 +214,6 @@ enum { BINDER_LOOPER_STATE_POLL = 0x20, }; -/** - * struct binder_thread - binder thread bookkeeping - * @proc: binder process for this thread - * (invariant after initialization) - * @rb_node: element for proc->threads rbtree - * (protected by @proc->inner_lock) - * @waiting_thread_node: element for @proc->waiting_threads list - * (protected by @proc->inner_lock) - * @pid: PID for this thread - * (invariant after initialization) - * @looper: bitmap of looping state - * (only accessed by this thread) - * @looper_needs_return: looping thread needs to exit driver - * (no lock needed) - * @transaction_stack: stack of in-progress transactions for this thread - * (protected by @proc->inner_lock) - * @todo: list of work to do for this thread - * (protected by @proc->inner_lock) - * @process_todo: whether work in @todo should be processed - * (protected by @proc->inner_lock) - * @return_error: transaction errors reported by this thread - * (only accessed by this thread) - * @reply_error: transaction errors reported by target thread - * (protected by @proc->inner_lock) - * @wait: wait queue for thread work - * @stats: per-thread statistics - * (atomics, no lock needed) - * @tmp_ref: temporary reference to indicate thread is in use - * (atomic since @proc->inner_lock cannot - * always be acquired) - * @is_dead: thread is dead and awaiting free - * when outstanding transactions are cleaned up - * (protected by @proc->inner_lock) - * @task: struct task_struct for this thread - * - * Bookkeeping structure for binder threads. - */ -struct binder_thread { - struct binder_proc *proc; - struct rb_node rb_node; - struct list_head waiting_thread_node; - int pid; - int looper; /* only modified by this thread */ - bool looper_need_return; /* can be written by other thread */ - struct binder_transaction *transaction_stack; - struct list_head todo; - bool process_todo; - struct binder_error return_error; - struct binder_error reply_error; - wait_queue_head_t wait; - struct binder_stats stats; - atomic_t tmp_ref; - bool is_dead; - struct task_struct *task; -}; - -/** - * struct binder_txn_fd_fixup - transaction fd fixup list element - * @fixup_entry: list entry - * @file: struct file to be associated with new fd - * @offset: offset in buffer data to this fixup - * - * List element for fd fixups in a transaction. Since file - * descriptors need to be allocated in the context of the - * target process, we pass each fd to be processed in this - * struct. - */ -struct binder_txn_fd_fixup { - struct list_head fixup_entry; - struct file *file; - size_t offset; -}; - -struct binder_transaction { - int debug_id; - struct binder_work work; - struct binder_thread *from; - struct binder_transaction *from_parent; - struct binder_proc *to_proc; - struct binder_thread *to_thread; - struct binder_transaction *to_parent; - unsigned need_reply:1; - /* unsigned is_dead:1; */ /* not used at the moment */ - - struct binder_buffer *buffer; - unsigned int code; - unsigned int flags; - struct binder_priority priority; - struct binder_priority saved_priority; - bool set_priority_called; - kuid_t sender_euid; - struct list_head fd_fixups; - binder_uintptr_t security_ctx; - /** - * @lock: protects @from, @to_proc, and @to_thread - * - * @from, @to_proc, and @to_thread can be set to NULL - * during thread teardown - */ - spinlock_t lock; - ANDROID_VENDOR_DATA(1); -}; - -/** - * struct binder_object - union of flat binder object types - * @hdr: generic object header - * @fbo: binder object (nodes and refs) - * @fdo: file descriptor object - * @bbo: binder buffer pointer - * @fdao: file descriptor array - * - * Used for type-independent object copies - */ -struct binder_object { - union { - struct binder_object_header hdr; - struct flat_binder_object fbo; - struct binder_fd_object fdo; - struct binder_buffer_object bbo; - struct binder_fd_array_object fdao; - }; -}; - /** * binder_proc_lock() - Acquire outer lock for given binder_proc * @proc: struct binder_proc to acquire diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h index 283d3cb9c16e..9765fde875a5 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -12,6 +12,8 @@ #include #include #include +#include +#include "binder_alloc.h" struct binder_context { struct binder_node *binder_context_mgr_node; @@ -141,6 +143,435 @@ struct binder_transaction_log { struct binder_transaction_log_entry entry[32]; }; +enum binder_stat_types { + BINDER_STAT_PROC, + BINDER_STAT_THREAD, + BINDER_STAT_NODE, + BINDER_STAT_REF, + BINDER_STAT_DEATH, + BINDER_STAT_TRANSACTION, + BINDER_STAT_TRANSACTION_COMPLETE, + BINDER_STAT_COUNT +}; + +struct binder_stats { + atomic_t br[_IOC_NR(BR_FAILED_REPLY) + 1]; + atomic_t bc[_IOC_NR(BC_REPLY_SG) + 1]; + atomic_t obj_created[BINDER_STAT_COUNT]; + atomic_t obj_deleted[BINDER_STAT_COUNT]; +}; + +/** + * struct binder_work - work enqueued on a worklist + * @entry: node enqueued on list + * @type: type of work to be performed + * + * There are separate work lists for proc, thread, and node (async). + */ +struct binder_work { + struct list_head entry; + + enum binder_work_type { + BINDER_WORK_TRANSACTION = 1, + BINDER_WORK_TRANSACTION_COMPLETE, + BINDER_WORK_RETURN_ERROR, + BINDER_WORK_NODE, + BINDER_WORK_DEAD_BINDER, + BINDER_WORK_DEAD_BINDER_AND_CLEAR, + BINDER_WORK_CLEAR_DEATH_NOTIFICATION, + } type; +}; + +struct binder_error { + struct binder_work work; + uint32_t cmd; +}; + +/** + * struct binder_node - binder node bookkeeping + * @debug_id: unique ID for debugging + * (invariant after initialized) + * @lock: lock for node fields + * @work: worklist element for node work + * (protected by @proc->inner_lock) + * @rb_node: element for proc->nodes tree + * (protected by @proc->inner_lock) + * @dead_node: element for binder_dead_nodes list + * (protected by binder_dead_nodes_lock) + * @proc: binder_proc that owns this node + * (invariant after initialized) + * @refs: list of references on this node + * (protected by @lock) + * @internal_strong_refs: used to take strong references when + * initiating a transaction + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @local_weak_refs: weak user refs from local process + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @local_strong_refs: strong user refs from local process + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @tmp_refs: temporary kernel refs + * (protected by @proc->inner_lock while @proc + * is valid, and by binder_dead_nodes_lock + * if @proc is NULL. During inc/dec and node release + * it is also protected by @lock to provide safety + * as the node dies and @proc becomes NULL) + * @ptr: userspace pointer for node + * (invariant, no lock needed) + * @cookie: userspace cookie for node + * (invariant, no lock needed) + * @has_strong_ref: userspace notified of strong ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @pending_strong_ref: userspace has acked notification of strong ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @has_weak_ref: userspace notified of weak ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @pending_weak_ref: userspace has acked notification of weak ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @has_async_transaction: async transaction to node in progress + * (protected by @lock) + * @sched_policy: minimum scheduling policy for node + * (invariant after initialized) + * @accept_fds: file descriptor operations supported for node + * (invariant after initialized) + * @min_priority: minimum scheduling priority + * (invariant after initialized) + * @inherit_rt: inherit RT scheduling policy from caller + * @txn_security_ctx: require sender's security context + * (invariant after initialized) + * @async_todo: list of async work items + * (protected by @proc->inner_lock) + * + * Bookkeeping structure for binder nodes. + */ +struct binder_node { + int debug_id; + spinlock_t lock; + struct binder_work work; + union { + struct rb_node rb_node; + struct hlist_node dead_node; + }; + struct binder_proc *proc; + struct hlist_head refs; + int internal_strong_refs; + int local_weak_refs; + int local_strong_refs; + int tmp_refs; + binder_uintptr_t ptr; + binder_uintptr_t cookie; + struct { + /* + * bitfield elements protected by + * proc inner_lock + */ + u8 has_strong_ref:1; + u8 pending_strong_ref:1; + u8 has_weak_ref:1; + u8 pending_weak_ref:1; + }; + struct { + /* + * invariant after initialization + */ + u8 sched_policy:2; + u8 inherit_rt:1; + u8 accept_fds:1; + u8 txn_security_ctx:1; + u8 min_priority; + }; + bool has_async_transaction; + struct list_head async_todo; +}; + +struct binder_ref_death { + /** + * @work: worklist element for death notifications + * (protected by inner_lock of the proc that + * this ref belongs to) + */ + struct binder_work work; + binder_uintptr_t cookie; +}; + +/** + * struct binder_ref_data - binder_ref counts and id + * @debug_id: unique ID for the ref + * @desc: unique userspace handle for ref + * @strong: strong ref count (debugging only if not locked) + * @weak: weak ref count (debugging only if not locked) + * + * Structure to hold ref count and ref id information. Since + * the actual ref can only be accessed with a lock, this structure + * is used to return information about the ref to callers of + * ref inc/dec functions. + */ +struct binder_ref_data { + int debug_id; + uint32_t desc; + int strong; + int weak; +}; + +/** + * struct binder_ref - struct to track references on nodes + * @data: binder_ref_data containing id, handle, and current refcounts + * @rb_node_desc: node for lookup by @data.desc in proc's rb_tree + * @rb_node_node: node for lookup by @node in proc's rb_tree + * @node_entry: list entry for node->refs list in target node + * (protected by @node->lock) + * @proc: binder_proc containing ref + * @node: binder_node of target node. When cleaning up a + * ref for deletion in binder_cleanup_ref, a non-NULL + * @node indicates the node must be freed + * @death: pointer to death notification (ref_death) if requested + * (protected by @node->lock) + * + * Structure to track references from procA to target node (on procB). This + * structure is unsafe to access without holding @proc->outer_lock. + */ +struct binder_ref { + /* Lookups needed: */ + /* node + proc => ref (transaction) */ + /* desc + proc => ref (transaction, inc/dec ref) */ + /* node => refs + procs (proc exit) */ + struct binder_ref_data data; + struct rb_node rb_node_desc; + struct rb_node rb_node_node; + struct hlist_node node_entry; + struct binder_proc *proc; + struct binder_node *node; + struct binder_ref_death *death; +}; + +/** + * struct binder_priority - scheduler policy and priority + * @sched_policy scheduler policy + * @prio [100..139] for SCHED_NORMAL, [0..99] for FIFO/RT + * + * The binder driver supports inheriting the following scheduler policies: + * SCHED_NORMAL + * SCHED_BATCH + * SCHED_FIFO + * SCHED_RR + */ +struct binder_priority { + unsigned int sched_policy; + int prio; +}; + +/** + * struct binder_proc - binder process bookkeeping + * @proc_node: element for binder_procs list + * @threads: rbtree of binder_threads in this proc + * (protected by @inner_lock) + * @nodes: rbtree of binder nodes associated with + * this proc ordered by node->ptr + * (protected by @inner_lock) + * @refs_by_desc: rbtree of refs ordered by ref->desc + * (protected by @outer_lock) + * @refs_by_node: rbtree of refs ordered by ref->node + * (protected by @outer_lock) + * @waiting_threads: threads currently waiting for proc work + * (protected by @inner_lock) + * @pid PID of group_leader of process + * (invariant after initialized) + * @tsk task_struct for group_leader of process + * (invariant after initialized) + * @deferred_work_node: element for binder_deferred_list + * (protected by binder_deferred_lock) + * @deferred_work: bitmap of deferred work to perform + * (protected by binder_deferred_lock) + * @is_dead: process is dead and awaiting free + * when outstanding transactions are cleaned up + * (protected by @inner_lock) + * @todo: list of work for this process + * (protected by @inner_lock) + * @stats: per-process binder statistics + * (atomics, no lock needed) + * @delivered_death: list of delivered death notification + * (protected by @inner_lock) + * @max_threads: cap on number of binder threads + * (protected by @inner_lock) + * @requested_threads: number of binder threads requested but not + * yet started. In current implementation, can + * only be 0 or 1. + * (protected by @inner_lock) + * @requested_threads_started: number binder threads started + * (protected by @inner_lock) + * @tmp_ref: temporary reference to indicate proc is in use + * (protected by @inner_lock) + * @default_priority: default scheduler priority + * (invariant after initialized) + * @debugfs_entry: debugfs node + * @alloc: binder allocator bookkeeping + * @context: binder_context for this proc + * (invariant after initialized) + * @inner_lock: can nest under outer_lock and/or node lock + * @outer_lock: no nesting under innor or node lock + * Lock order: 1) outer, 2) node, 3) inner + * @binderfs_entry: process-specific binderfs log file + * + * Bookkeeping structure for binder processes + */ +struct binder_proc { + struct hlist_node proc_node; + struct rb_root threads; + struct rb_root nodes; + struct rb_root refs_by_desc; + struct rb_root refs_by_node; + struct list_head waiting_threads; + int pid; + struct task_struct *tsk; + struct hlist_node deferred_work_node; + int deferred_work; + bool is_dead; + + struct list_head todo; + struct binder_stats stats; + struct list_head delivered_death; + int max_threads; + int requested_threads; + int requested_threads_started; + int tmp_ref; + struct binder_priority default_priority; + struct dentry *debugfs_entry; + struct binder_alloc alloc; + struct binder_context *context; + spinlock_t inner_lock; + spinlock_t outer_lock; + struct dentry *binderfs_entry; +}; + +/** + * struct binder_thread - binder thread bookkeeping + * @proc: binder process for this thread + * (invariant after initialization) + * @rb_node: element for proc->threads rbtree + * (protected by @proc->inner_lock) + * @waiting_thread_node: element for @proc->waiting_threads list + * (protected by @proc->inner_lock) + * @pid: PID for this thread + * (invariant after initialization) + * @looper: bitmap of looping state + * (only accessed by this thread) + * @looper_needs_return: looping thread needs to exit driver + * (no lock needed) + * @transaction_stack: stack of in-progress transactions for this thread + * (protected by @proc->inner_lock) + * @todo: list of work to do for this thread + * (protected by @proc->inner_lock) + * @process_todo: whether work in @todo should be processed + * (protected by @proc->inner_lock) + * @return_error: transaction errors reported by this thread + * (only accessed by this thread) + * @reply_error: transaction errors reported by target thread + * (protected by @proc->inner_lock) + * @wait: wait queue for thread work + * @stats: per-thread statistics + * (atomics, no lock needed) + * @tmp_ref: temporary reference to indicate thread is in use + * (atomic since @proc->inner_lock cannot + * always be acquired) + * @is_dead: thread is dead and awaiting free + * when outstanding transactions are cleaned up + * (protected by @proc->inner_lock) + * @task: struct task_struct for this thread + * + * Bookkeeping structure for binder threads. + */ +struct binder_thread { + struct binder_proc *proc; + struct rb_node rb_node; + struct list_head waiting_thread_node; + int pid; + int looper; /* only modified by this thread */ + bool looper_need_return; /* can be written by other thread */ + struct binder_transaction *transaction_stack; + struct list_head todo; + bool process_todo; + struct binder_error return_error; + struct binder_error reply_error; + wait_queue_head_t wait; + struct binder_stats stats; + atomic_t tmp_ref; + bool is_dead; + struct task_struct *task; +}; + +/** + * struct binder_txn_fd_fixup - transaction fd fixup list element + * @fixup_entry: list entry + * @file: struct file to be associated with new fd + * @offset: offset in buffer data to this fixup + * + * List element for fd fixups in a transaction. Since file + * descriptors need to be allocated in the context of the + * target process, we pass each fd to be processed in this + * struct. + */ +struct binder_txn_fd_fixup { + struct list_head fixup_entry; + struct file *file; + size_t offset; +}; + +struct binder_transaction { + int debug_id; + struct binder_work work; + struct binder_thread *from; + struct binder_transaction *from_parent; + struct binder_proc *to_proc; + struct binder_thread *to_thread; + struct binder_transaction *to_parent; + unsigned need_reply:1; + /* unsigned is_dead:1; */ /* not used at the moment */ + + struct binder_buffer *buffer; + unsigned int code; + unsigned int flags; + struct binder_priority priority; + struct binder_priority saved_priority; + bool set_priority_called; + kuid_t sender_euid; + struct list_head fd_fixups; + binder_uintptr_t security_ctx; + /** + * @lock: protects @from, @to_proc, and @to_thread + * + * @from, @to_proc, and @to_thread can be set to NULL + * during thread teardown + */ + spinlock_t lock; + ANDROID_VENDOR_DATA(1); +}; + +/** + * struct binder_object - union of flat binder object types + * @hdr: generic object header + * @fbo: binder object (nodes and refs) + * @fdo: file descriptor object + * @bbo: binder buffer pointer + * @fdao: file descriptor array + * + * Used for type-independent object copies + */ +struct binder_object { + union { + struct binder_object_header hdr; + struct flat_binder_object fbo; + struct binder_fd_object fdo; + struct binder_buffer_object bbo; + struct binder_fd_array_object fdao; + }; +}; + extern struct binder_transaction_log binder_transaction_log; extern struct binder_transaction_log binder_transaction_log_failed; #endif /* _LINUX_BINDER_INTERNAL_H */ From ce582b29606388a15e565c162d2ef2f567f54710 Mon Sep 17 00:00:00 2001 From: Jindong Yue Date: Wed, 10 Mar 2021 21:21:44 +0800 Subject: [PATCH 02/28] ANDROID: GKI: Add IMX KMI symbol list Add initial IMX KMI symbol file: abi_gki_aarch64_imx. Leaf changes summary: 170 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 165 Added functions Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 5 Added variables 165 Added functions: [A] 'function int __device_reset(device*, bool)' [A] 'function void* __v4l2_find_nearest_size(void*, size_t, size_t, size_t, size_t, s32, s32)' [A] 'function int _vb2_fop_release(file*, mutex*)' [A] 'function void cec_fill_conn_info_from_drm(cec_connector_info*, const drm_connector*)' [A] 'function cec_notifier* cec_notifier_cec_adap_register(device*, const char*, cec_adapter*)' [A] 'function void cec_notifier_cec_adap_unregister(cec_notifier*)' [A] 'function cec_notifier* cec_notifier_conn_register(device*, const char*, const cec_connector_info*)' [A] 'function void cec_notifier_conn_unregister(cec_notifier*)' [A] 'function void cec_notifier_set_phys_addr(cec_notifier*, u16)' [A] 'function void cec_notifier_set_phys_addr_from_edid(cec_notifier*, const edid*)' [A] 'function void cfg80211_cac_event(net_device*, const cfg80211_chan_def*, nl80211_radar_event, gfp_t)' [A] 'function void cfg80211_radar_event(wiphy*, cfg80211_chan_def*, gfp_t)' [A] 'function void cfg80211_report_wowlan_wakeup(wireless_dev*, cfg80211_wowlan_wakeup*, gfp_t)' [A] 'function clk_hw* clk_hw_register_composite(device*, const char*, const char* const*, int, clk_hw*, const clk_ops*, clk_hw*, const clk_ops*, clk_hw*, const clk_ops*, unsigned long int)' [A] 'function bool clk_is_match(const clk*, const clk*)' [A] 'function clk* clk_register_mux(device*, const char*, const char* const*, u8, unsigned long int, void*, u8, u8, u8, spinlock_t*)' [A] 'function device* dev_pm_domain_attach_by_id(device*, unsigned int)' [A] 'function drm_bridge* devm_drm_panel_bridge_add(device*, drm_panel*, u32)' [A] 'function irq_chip_generic* devm_irq_alloc_generic_chip(device*, const char*, int, unsigned int, void*, irq_flow_handler_t)' [A] 'function int devm_irq_setup_generic_chip(device*, irq_chip_generic*, u32, irq_gc_flags, unsigned int, unsigned int)' [A] 'function phy* devm_of_phy_get(device*, device_node*, const char*)' [A] 'function phy* devm_phy_optional_get(device*, const char*)' [A] 'function int devm_pinctrl_register_and_init(device*, pinctrl_desc*, void*, pinctrl_dev**)' [A] 'function void devm_remove_action(device*, void (void*)*, void*)' [A] 'function int driver_create_file(device_driver*, const driver_attribute*)' [A] 'function void driver_remove_file(device_driver*, const driver_attribute*)' [A] 'function int drm_connector_init_with_ddc(drm_device*, drm_connector*, const drm_connector_funcs*, int, i2c_adapter*)' [A] 'function hdmi_quantization_range drm_default_rgb_quant_range(const drm_display_mode*)' [A] 'function int drm_display_info_set_bus_formats(drm_display_info*, const u32*, unsigned int)' [A] 'function int drm_gem_cma_dumb_create(drm_file*, drm_device*, drm_mode_create_dumb*)' [A] 'function void drm_hdmi_avi_infoframe_colorspace(hdmi_avi_infoframe*, const drm_connector_state*)' [A] 'function void drm_hdmi_avi_infoframe_quant_range(hdmi_avi_infoframe*, drm_connector*, const drm_display_mode*, hdmi_quantization_range)' [A] 'function int drm_hdmi_infoframe_set_hdr_metadata(hdmi_drm_infoframe*, const drm_connector_state*)' [A] 'function int drm_hdmi_vendor_infoframe_from_display_mode(hdmi_vendor_infoframe*, drm_connector*, const drm_display_mode*)' [A] 'function int drm_mode_create_hdmi_colorspace_property(drm_connector*)' [A] 'function drm_display_mode* drm_mode_find_dmt(drm_device*, int, int, int, bool)' [A] 'function bool drm_mode_is_420_also(const drm_display_info*, const drm_display_mode*)' [A] 'function bool drm_mode_is_420_only(const drm_display_info*, const drm_display_mode*)' [A] 'function int drm_of_encoder_active_endpoint(device_node*, drm_encoder*, of_endpoint*)' [A] 'function int drm_of_find_panel_or_bridge(const device_node*, int, int, drm_panel**, drm_bridge**)' [A] 'function ssize_t drm_scdc_read(i2c_adapter*, u8, void*, size_t)' [A] 'function bool drm_scdc_set_high_tmds_clock_ratio(i2c_adapter*, bool)' [A] 'function bool drm_scdc_set_scrambling(i2c_adapter*, bool)' [A] 'function ssize_t drm_scdc_write(i2c_adapter*, u8, void*, size_t)' [A] 'function int dw_pcie_ep_raise_legacy_irq(dw_pcie_ep*, unsigned char)' [A] 'function int dw_pcie_ep_raise_msi_irq(dw_pcie_ep*, unsigned char, unsigned char)' [A] 'function int dw_pcie_ep_raise_msix_irq(dw_pcie_ep*, unsigned char, unsigned short int)' [A] 'function void dw_pcie_ep_reset_bar(dw_pcie*, pci_barno)' [A] 'function int dw_pcie_link_up(dw_pcie*)' [A] 'function bool fwnode_device_is_available(const fwnode_handle*)' [A] 'function fwnode_handle* fwnode_get_next_parent(fwnode_handle*)' [A] 'function fwnode_handle* fwnode_graph_get_next_endpoint(const fwnode_handle*, fwnode_handle*)' [A] 'function fwnode_handle* fwnode_graph_get_port_parent(const fwnode_handle*)' [A] 'function fwnode_handle* fwnode_graph_get_remote_endpoint(const fwnode_handle*)' [A] 'function fwnode_handle* fwnode_graph_get_remote_port_parent(const fwnode_handle*)' [A] 'function int fwnode_graph_parse_endpoint(const fwnode_handle*, fwnode_endpoint*)' [A] 'function int fwnode_property_read_u64_array(const fwnode_handle*, const char*, u64*, size_t)' [A] 'function void* gen_pool_dma_alloc(gen_pool*, size_t, dma_addr_t*)' [A] 'function int hdmi_avi_infoframe_check(hdmi_avi_infoframe*)' [A] 'function ssize_t hdmi_drm_infoframe_pack(hdmi_drm_infoframe*, void*, size_t)' [A] 'function ssize_t hdmi_vendor_infoframe_pack(hdmi_vendor_infoframe*, void*, size_t)' [A] 'function irq_domain* irq_domain_add_legacy(device_node*, unsigned int, unsigned int, irq_hw_number_t, const irq_domain_ops*, void*)' [A] 'function int iw_handler_get_spy(net_device*, iw_request_info*, iwreq_data*, char*)' [A] 'function int iw_handler_get_thrspy(net_device*, iw_request_info*, iwreq_data*, char*)' [A] 'function int iw_handler_set_spy(net_device*, iw_request_info*, iwreq_data*, char*)' [A] 'function int iw_handler_set_thrspy(net_device*, iw_request_info*, iwreq_data*, char*)' [A] 'function char* iwe_stream_add_event(iw_request_info*, char*, char*, iw_event*, int)' [A] 'function char* iwe_stream_add_point(iw_request_info*, char*, char*, iw_event*, char*)' [A] 'function char* iwe_stream_add_value(iw_request_info*, char*, char*, char*, iw_event*, int)' [A] 'function dentry* kern_path_create(int, const char*, path*, unsigned int)' [A] 'function void ktime_get_snapshot(system_time_snapshot*)' [A] 'function void mctrl_gpio_disable_ms(mctrl_gpios*)' [A] 'function void mctrl_gpio_enable_ms(mctrl_gpios*)' [A] 'function unsigned int mctrl_gpio_get(mctrl_gpios*, unsigned int*)' [A] 'function mctrl_gpios* mctrl_gpio_init(uart_port*, unsigned int)' [A] 'function void mctrl_gpio_set(mctrl_gpios*, unsigned int)' [A] 'function bool mdiobus_is_registered_device(mii_bus*, int)' [A] 'function void media_graph_walk_cleanup(media_graph*)' [A] 'function int mipi_dsi_dcs_enter_sleep_mode(mipi_dsi_device*)' [A] 'function int mipi_dsi_dcs_exit_sleep_mode(mipi_dsi_device*)' [A] 'function int mipi_dsi_dcs_get_display_brightness(mipi_dsi_device*, u16*)' [A] 'function int mipi_dsi_dcs_set_display_off(mipi_dsi_device*)' [A] 'function int mipi_dsi_dcs_set_display_on(mipi_dsi_device*)' [A] 'function int mipi_dsi_dcs_set_pixel_format(mipi_dsi_device*, u8)' [A] 'function int mipi_dsi_dcs_set_tear_on(mipi_dsi_device*, mipi_dsi_dcs_tear_mode)' [A] 'function int mipi_dsi_dcs_set_tear_scanline(mipi_dsi_device*, u16)' [A] 'function int mipi_dsi_dcs_soft_reset(mipi_dsi_device*)' [A] 'function void mmc_retune_timer_stop(mmc_host*)' [A] 'function gen_pool* of_gen_pool_get(device_node*, const char*, int)' [A] 'function int of_get_display_timing(const device_node*, const char*, display_timing*)' [A] 'function i2c_adapter* of_get_i2c_adapter_by_node(device_node*)' [A] 'function phy_device* of_phy_connect(net_device*, device_node*, void (net_device*)*, u32, phy_interface_t)' [A] 'function phy_device* of_phy_find_device(device_node*)' [A] 'function int of_regulator_match(device*, device_node*, of_regulator_match*, unsigned int)' [A] 'function int of_usb_update_otg_caps(device_node*, usb_otg_caps*)' [A] 'function pci_power_t pci_choose_state(pci_dev*, pm_message_t)' [A] 'function int pci_msi_enabled()' [A] 'function int phy_reset_after_clk_enable(phy_device*)' [A] 'function int phy_set_max_speed(phy_device*, u32)' [A] 'function void phy_set_sym_pause(phy_device*, bool, bool, bool)' [A] 'function void phy_support_sym_pause(phy_device*)' [A] 'function int pinctrl_enable(pinctrl_dev*)' [A] 'function group_desc* pinctrl_generic_get_group(pinctrl_dev*, unsigned int)' [A] 'function int pinctrl_generic_get_group_count(pinctrl_dev*)' [A] 'function const char* pinctrl_generic_get_group_name(pinctrl_dev*, unsigned int)' [A] 'function int pinctrl_generic_get_group_pins(pinctrl_dev*, unsigned int, const unsigned int**, unsigned int*)' [A] 'function function_desc* pinmux_generic_get_function(pinctrl_dev*, unsigned int)' [A] 'function int pinmux_generic_get_function_count(pinctrl_dev*)' [A] 'function int pinmux_generic_get_function_groups(pinctrl_dev*, unsigned int, const char* const**, unsigned int* const)' [A] 'function const char* pinmux_generic_get_function_name(pinctrl_dev*, unsigned int)' [A] 'function int posix_clock_register(posix_clock*, device*)' [A] 'function void posix_clock_unregister(posix_clock*)' [A] 'function power_supply* power_supply_get_by_phandle(device_node*, const char*)' [A] 'function int regmap_attach_dev(device*, regmap*, const regmap_config*)' [A] 'function int regulator_map_voltage_iterate(regulator_dev*, int, int)' [A] 'function int reset_control_status(reset_control*)' [A] 'function device* rpmsg_find_device(device*, rpmsg_channel_info*)' [A] 'function int rpmsg_sendto(rpmsg_endpoint*, void*, int, u32)' [A] 'function void rproc_add_carveout(rproc*, rproc_mem_entry*)' [A] 'function void* rproc_da_to_va(rproc*, u64, int)' [A] 'function resource_table* rproc_elf_find_loaded_rsc_table(rproc*, const firmware*)' [A] 'function int rproc_elf_load_rsc_table(rproc*, const firmware*)' [A] 'function int rproc_elf_load_segments(rproc*, const firmware*)' [A] 'function int rproc_elf_sanity_check(rproc*, const firmware*)' [A] 'function rproc_mem_entry* rproc_mem_entry_init(device*, void*, dma_addr_t, int, u32, int (rproc*, rproc_mem_entry*)*, int (rproc*, rproc_mem_entry*)*, const char*, ...)' [A] 'function rproc_mem_entry* rproc_of_resm_mem_entry_init(device*, u32, int, u32, const char*, ...)' [A] 'function irqreturn_t rproc_vq_interrupt(rproc*, int)' [A] 'function int schedule_hrtimeout(ktime_t*, const hrtimer_mode)' [A] 'function int sdhci_execute_tuning(mmc_host*, u32)' [A] 'function int sdhci_resume_host(sdhci_host*)' [A] 'function int sdhci_suspend_host(sdhci_host*)' [A] 'function void snd_dmaengine_pcm_set_config_from_dai_data(const snd_pcm_substream*, const snd_dmaengine_dai_dma_data*, dma_slave_config*)' [A] 'function int snd_pcm_format_big_endian(snd_pcm_format_t)' [A] 'function int snd_pcm_format_linear(snd_pcm_format_t)' [A] 'function int snd_pcm_format_unsigned(snd_pcm_format_t)' [A] 'function snd_pcm_substream* snd_soc_dpcm_get_substream(snd_soc_pcm_runtime*, int)' [A] 'function regmap* syscon_regmap_lookup_by_compatible(const char*)' [A] 'function int thermal_zone_bind_cooling_device(thermal_zone_device*, int, thermal_cooling_device*, unsigned long int, unsigned long int, unsigned int)' [A] 'function u64 timecounter_cyc2time(timecounter*, u64)' [A] 'function void tso_build_data(sk_buff*, tso_t*, int)' [A] 'function void tso_build_hdr(sk_buff*, char*, tso_t*, int, bool)' [A] 'function int tso_count_descs(sk_buff*)' [A] 'function void tso_start(sk_buff*, tso_t*)' [A] 'function int tty_port_install(tty_port*, tty_driver*, tty_struct*)' [A] 'function int tty_prepare_flip_string(tty_port*, unsigned char**, size_t)' [A] 'function void* typec_switch_get_drvdata(typec_switch*)' [A] 'function typec_switch* typec_switch_register(device*, const typec_switch_desc*)' [A] 'function void typec_switch_unregister(typec_switch*)' [A] 'function void uart_get_rs485_mode(device*, serial_rs485*)' [A] 'function v4l2_async_subdev* v4l2_async_notifier_add_fwnode_subdev(v4l2_async_notifier*, fwnode_handle*, unsigned int)' [A] 'function int v4l2_async_notifier_add_subdev(v4l2_async_notifier*, v4l2_async_subdev*)' [A] 'function void v4l2_async_notifier_cleanup(v4l2_async_notifier*)' [A] 'function void v4l2_async_notifier_init(v4l2_async_notifier*)' [A] 'function int v4l2_async_notifier_register(v4l2_device*, v4l2_async_notifier*)' [A] 'function void v4l2_async_notifier_unregister(v4l2_async_notifier*)' [A] 'function int v4l2_async_register_subdev(v4l2_subdev*)' [A] 'function int v4l2_async_subdev_notifier_register(v4l2_subdev*, v4l2_async_notifier*)' [A] 'function void v4l2_async_unregister_subdev(v4l2_subdev*)' [A] 'function void v4l2_ctrl_auto_cluster(unsigned int, v4l2_ctrl**, u8, bool)' [A] 'function v4l2_ctrl* v4l2_ctrl_new_std_menu_items(v4l2_ctrl_handler*, const v4l2_ctrl_ops*, u32, u8, u64, u8, const char* const*)' [A] 'function __poll_t v4l2_ctrl_poll(file*, poll_table_struct*)' [A] 'function int v4l2_ctrl_subdev_log_status(v4l2_subdev*)' [A] 'function int v4l2_g_parm_cap(video_device*, v4l2_subdev*, v4l2_streamparm*)' [A] 'function int v4l2_s_parm_cap(video_device*, v4l2_subdev*, v4l2_streamparm*)' [A] 'function int vm_munmap(unsigned long int, unsigned long int)' 5 Added variables: [A] 'const clk_ops clk_divider_ops' [A] 'const clk_ops clk_fractional_divider_ops' [A] 'const clk_ops clk_gate_ops' [A] 'const clk_ops clk_mux_ops' [A] 'unsigned int hrtimer_resolution' Bug: 159736148 Signed-off-by: Jindong Yue Change-Id: Icf5ee355ae27eef5f3bf32cc5bbfed3a33ce7152 --- android/abi_gki_aarch64.xml | 5630 +++++++++++++++++++++++------------ android/abi_gki_aarch64_imx | 1882 ++++++++++++ build.config.gki.aarch64 | 1 + 3 files changed, 5562 insertions(+), 1951 deletions(-) create mode 100644 android/abi_gki_aarch64_imx diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 1989997c9623..12c59540a10b 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -63,6 +63,7 @@ + @@ -265,6 +266,7 @@ + @@ -315,6 +317,7 @@ + @@ -553,6 +556,13 @@ + + + + + + + @@ -562,6 +572,7 @@ + @@ -588,9 +599,11 @@ + + @@ -645,6 +658,7 @@ + @@ -656,6 +670,7 @@ + @@ -665,6 +680,7 @@ + @@ -860,6 +876,7 @@ + @@ -994,6 +1011,7 @@ + @@ -1021,6 +1039,8 @@ + + @@ -1040,15 +1060,18 @@ + + + @@ -1064,6 +1087,7 @@ + @@ -1195,9 +1219,11 @@ + + @@ -1282,6 +1308,7 @@ + @@ -1308,6 +1335,7 @@ + @@ -1317,6 +1345,7 @@ + @@ -1380,6 +1409,7 @@ + @@ -1420,7 +1450,11 @@ + + + + @@ -1451,13 +1485,17 @@ + + + + @@ -1481,6 +1519,8 @@ + + @@ -1527,6 +1567,10 @@ + + + + @@ -1545,7 +1589,12 @@ + + + + + @@ -1652,15 +1701,23 @@ + + + + + + + + @@ -1669,6 +1726,7 @@ + @@ -1837,9 +1895,12 @@ + + + @@ -2178,6 +2239,7 @@ + @@ -2222,6 +2284,13 @@ + + + + + + + @@ -2229,6 +2298,7 @@ + @@ -2350,6 +2420,7 @@ + @@ -2416,9 +2487,15 @@ + + + + + + @@ -2436,6 +2513,7 @@ + @@ -2473,9 +2551,18 @@ + + + + + + + + + @@ -2536,6 +2623,7 @@ + @@ -2700,6 +2788,7 @@ + @@ -2708,9 +2797,11 @@ + + @@ -2756,7 +2847,9 @@ + + @@ -2779,6 +2872,7 @@ + @@ -2789,6 +2883,7 @@ + @@ -2816,6 +2911,7 @@ + @@ -2860,6 +2956,7 @@ + @@ -2956,17 +3053,21 @@ + + + + @@ -2977,8 +3078,13 @@ + + + + + @@ -2997,6 +3103,10 @@ + + + + @@ -3056,10 +3166,13 @@ + + + @@ -3201,6 +3314,7 @@ + @@ -3247,6 +3361,7 @@ + @@ -3284,6 +3399,7 @@ + @@ -3318,24 +3434,35 @@ + + + + + + + + + + + @@ -3382,6 +3509,7 @@ + @@ -3427,6 +3555,7 @@ + @@ -3434,10 +3563,12 @@ + + @@ -3651,6 +3782,7 @@ + @@ -3666,7 +3798,10 @@ + + + @@ -3744,6 +3879,7 @@ + @@ -3913,6 +4049,7 @@ + @@ -3958,6 +4095,7 @@ + @@ -3966,6 +4104,7 @@ + @@ -3999,6 +4138,10 @@ + + + + @@ -4032,6 +4175,7 @@ + @@ -4039,6 +4183,7 @@ + @@ -4071,6 +4216,9 @@ + + + @@ -4079,6 +4227,7 @@ + @@ -4363,6 +4512,16 @@ + + + + + + + + + + @@ -4376,7 +4535,10 @@ + + + @@ -4402,12 +4564,14 @@ + + @@ -4510,6 +4674,7 @@ + @@ -4651,8 +4816,12 @@ + + + + @@ -4685,6 +4854,7 @@ + @@ -4852,7 +5022,7 @@ - + @@ -10207,7 +10377,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10959,6 +11166,20 @@ + + + + + + + + + + + + + + @@ -12337,6 +12558,7 @@ + @@ -13379,7 +13601,7 @@ - + @@ -13855,7 +14077,7 @@ - + @@ -13871,7 +14093,7 @@ - + @@ -13898,9 +14120,9 @@ - + - + @@ -13979,6 +14201,7 @@ + @@ -15188,6 +15411,7 @@ + @@ -17772,7 +17996,7 @@ - + @@ -17967,6 +18191,7 @@ + @@ -18414,6 +18639,7 @@ + @@ -21190,7 +21416,7 @@ - + @@ -26489,7 +26715,7 @@ - + @@ -30027,7 +30253,6 @@ - @@ -30044,7 +30269,6 @@ - @@ -32266,6 +32490,7 @@ + @@ -44547,6 +44772,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -44562,6 +44830,17 @@ + + + + + + + + + + + @@ -44764,61 +45043,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -44826,9 +45050,6 @@ - - - @@ -45039,6 +45260,7 @@ + @@ -45091,6 +45313,12 @@ + + + + + + @@ -45496,6 +45724,11 @@ + + + + + @@ -46529,6 +46762,13 @@ + + + + + + + @@ -46545,10 +46785,18 @@ + + + + + + + + @@ -46573,14 +46821,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -49524,6 +49806,12 @@ + + + + + + @@ -53391,7 +53679,7 @@ - + @@ -53446,6 +53734,24 @@ + + + + + + + + + + + + + + + + + + @@ -53494,6 +53800,7 @@ + @@ -53589,7 +53896,11 @@ + + + + @@ -53618,6 +53929,20 @@ + + + + + + + + + + + + + + @@ -54114,6 +54439,11 @@ + + + + + @@ -55140,7 +55470,7 @@ - + @@ -55184,6 +55514,7 @@ + @@ -58365,6 +58696,12 @@ + + + + + + @@ -62707,10 +63044,19 @@ + + + + + + + + + @@ -62737,12 +63083,18 @@ + + + + + + - + @@ -62750,7 +63102,7 @@ - + @@ -62758,19 +63110,23 @@ - + - + - + + + + + @@ -63234,7 +63590,7 @@ - + @@ -66172,6 +66528,7 @@ + @@ -67124,7 +67481,6 @@ - @@ -68635,22 +68991,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -68659,6 +69057,8 @@ + + @@ -68721,6 +69121,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -68759,6 +69232,13 @@ + + + + + + + @@ -68778,6 +69258,10 @@ + + + + @@ -68785,13 +69269,6 @@ - - - - - - - @@ -68804,6 +69281,14 @@ + + + + + + + + @@ -69183,6 +69668,12 @@ + + + + + + @@ -69688,6 +70179,11 @@ + + + + + @@ -69799,15 +70295,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -69905,6 +70441,8 @@ + + @@ -69955,6 +70493,16 @@ + + + + + + + + + + @@ -70051,6 +70599,8 @@ + + @@ -70088,11 +70638,25 @@ + + + + + + + + + + + + + + @@ -70699,6 +71263,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -72500,7 +73090,6 @@ - @@ -73759,6 +74348,10 @@ + + + + @@ -79979,6 +80572,7 @@ + @@ -80598,6 +81192,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80622,6 +81256,7 @@ + @@ -80639,6 +81274,7 @@ + @@ -81285,6 +81921,16 @@ + + + + + + + + + + @@ -81314,6 +81960,14 @@ + + + + + + + + @@ -81486,20 +82140,23 @@ + + + + + + + + + + + - - - - - - - - @@ -81523,6 +82180,14 @@ + + + + + + + + @@ -81642,7 +82307,35 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -81808,17 +82501,6 @@ - - - - - - - - - - - @@ -81903,14 +82585,6 @@ - - - - - - - - @@ -81945,6 +82619,7 @@ + @@ -82023,7 +82698,35 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -82832,6 +83535,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -83870,6 +84613,11 @@ + + + + + @@ -84888,18 +85636,6 @@ - - - - - - - - - - - - @@ -84920,6 +85656,10 @@ + + + + @@ -84978,6 +85718,1193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -85023,6 +86950,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -85078,7 +87095,7 @@ - + @@ -85089,22 +87106,22 @@ - + - + - + - + @@ -85114,7 +87131,7 @@ - + @@ -85122,8 +87139,18 @@ + + + + + + + + + + - + @@ -85136,8 +87163,19 @@ + + + + + + + + + + + - + @@ -85183,6 +87221,11 @@ + + + + + @@ -85206,11 +87249,10 @@ - + - @@ -85224,7 +87266,7 @@ - + @@ -85329,7 +87371,7 @@ - + @@ -85418,7 +87460,7 @@ - + @@ -85445,76 +87487,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -85648,59 +87623,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -85727,38 +87655,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -85837,100 +87733,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -85944,36 +87746,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -86345,55 +88117,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -86402,27 +88125,8 @@ - - - - - - - - - - - - - - - - - - - @@ -86434,33 +88138,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -86623,27 +88300,9 @@ - - - - - - - - - - - - - - - - - - @@ -86661,57 +88320,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -86732,422 +88340,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -87162,254 +88357,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -87417,58 +88364,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -87524,7 +88419,7 @@ - + @@ -87590,7 +88485,7 @@ - + @@ -87696,7 +88591,7 @@ - + @@ -87734,7 +88629,7 @@ - + @@ -87862,7 +88757,7 @@ - + @@ -90439,7 +91334,7 @@ - + @@ -90976,6 +91871,12 @@ + + + + + + @@ -91468,7 +92369,7 @@ - + @@ -91546,7 +92447,7 @@ - + @@ -92842,7 +93743,7 @@ - + @@ -92874,13 +93775,13 @@ - + - + @@ -93180,6 +94081,17 @@ + + + + + + + + + + + @@ -93233,17 +94145,6 @@ - - - - - - - - - - - @@ -93781,6 +94682,10 @@ + + + + @@ -94722,6 +95627,19 @@ + + + + + + + + + + + + + @@ -95539,6 +96457,11 @@ + + + + + @@ -95566,6 +96489,11 @@ + + + + + @@ -96395,6 +97323,10 @@ + + + + @@ -96434,6 +97366,17 @@ + + + + + + + + + + + @@ -96777,7 +97720,6 @@ - @@ -107215,8 +108157,6 @@ - - @@ -107310,6 +108250,18 @@ + + + + + + + + + + + + @@ -107681,6 +108633,9 @@ + + + @@ -107925,149 +108880,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -108100,7 +108912,6 @@ - @@ -108163,10 +108974,10 @@ - + - + @@ -108193,36 +109004,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -108249,16 +109030,281 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108273,6 +109319,10 @@ + + + + @@ -108369,9 +109419,11 @@ - - - + + + + + @@ -108540,11 +109592,6 @@ - - - - - @@ -108553,124 +109600,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -108690,96 +109619,21 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -108791,6 +109645,11 @@ + + + + + @@ -108907,50 +109766,14 @@ + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -108973,34 +109796,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -109089,6 +109884,9 @@ + + + @@ -109217,6 +110015,11 @@ + + + + + @@ -109710,6 +110513,12 @@ + + + + + + @@ -109734,6 +110543,20 @@ + + + + + + + + + + + + + + @@ -109791,6 +110614,8 @@ + + @@ -109806,6 +110631,20 @@ + + + + + + + + + + + + + + @@ -109869,6 +110708,13 @@ + + + + + + + @@ -110183,6 +111029,15 @@ + + + + + + + + + @@ -110854,11 +111709,6 @@ - - - - - @@ -110911,10 +111761,6 @@ - - - - @@ -111029,7 +111875,22 @@ + + + + + + + + + + + + + + + @@ -111048,6 +111909,10 @@ + + + + @@ -111093,6 +111958,18 @@ + + + + + + + + + + + + @@ -111172,6 +112049,25 @@ + + + + + + + + + + + + + + + + + + + @@ -111266,6 +112162,11 @@ + + + + + @@ -111988,6 +112889,12 @@ + + + + + + @@ -113471,6 +114378,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -113613,6 +114547,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -113660,12 +114632,14 @@ + + @@ -113682,11 +114656,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -113736,6 +114742,11 @@ + + + + + @@ -113786,19 +114797,50 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -113817,6 +114859,11 @@ + + + + + @@ -114646,6 +115693,13 @@ + + + + + + + @@ -114656,6 +115710,11 @@ + + + + + @@ -116295,7 +117354,6 @@ - @@ -116558,6 +117616,7 @@ + @@ -117459,6 +118518,22 @@ + + + + + + + + + + + + + + + + @@ -117964,22 +119039,6 @@ - - - - - - - - - - - - - - - - @@ -121459,6 +122518,15 @@ + + + + + + + + + @@ -123638,12 +124706,15 @@ - - - - + + + + + + + @@ -124065,6 +125136,12 @@ + + + + + + @@ -125488,6 +126565,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -125836,6 +126933,11 @@ + + + + + @@ -125883,6 +126985,7 @@ + @@ -125893,6 +126996,12 @@ + + + + + + @@ -126036,6 +127145,12 @@ + + + + + + @@ -126253,6 +127368,11 @@ + + + + + @@ -126270,6 +127390,21 @@ + + + + + + + + + + + + + + + @@ -127604,7 +128739,6 @@ - @@ -127704,20 +128838,6 @@ - - - - - - - - - - - - - - @@ -133042,6 +134162,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -135123,96 +136271,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -135294,7 +136352,7 @@ - + @@ -135302,13 +136360,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -135325,6 +136479,18 @@ + + + + + + + + + + + + @@ -135333,6 +136499,12 @@ + + + + + + @@ -135872,6 +137044,11 @@ + + + + + @@ -137553,6 +138730,13 @@ + + + + + + + @@ -137746,7 +138930,7 @@ - + @@ -141140,7 +142324,7 @@ - + @@ -141472,6 +142656,24 @@ + + + + + + + + + + + + + + + + + + @@ -141568,6 +142770,15 @@ + + + + + + + + + @@ -144500,7 +145711,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -155101,8 +156349,8 @@ - - + + @@ -155477,8 +156725,11 @@ + + + @@ -155495,12 +156746,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -155644,12 +157084,34 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -155730,23 +157192,6 @@ - - - - - - - - - - - - - - - - - @@ -155761,7 +157206,6 @@ - @@ -155777,6 +157221,10 @@ + + + + @@ -156854,6 +158302,12 @@ + + + + + + @@ -156896,6 +158350,12 @@ + + + + + + @@ -159630,6 +161090,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -168778,7 +170284,7 @@ - + @@ -172058,6 +173564,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -172114,32 +173646,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -175386,7 +176892,7 @@ - + @@ -176856,6 +178362,15 @@ + + + + + + + + + @@ -176906,8 +178421,26 @@ + + + + + + + + + + + + + + + + + + @@ -177363,6 +178896,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -177381,6 +178980,9 @@ + + + @@ -177493,6 +179095,12 @@ + + + + + + @@ -178454,6 +180062,18 @@ + + + + + + + + + + + + @@ -178461,6 +180081,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -180399,6 +182074,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -180413,6 +182116,12 @@ + + + + + + @@ -180585,6 +182294,18 @@ + + + + + + + + + + + + @@ -185212,6 +186933,13 @@ + + + + + + + diff --git a/android/abi_gki_aarch64_imx b/android/abi_gki_aarch64_imx new file mode 100644 index 000000000000..ce8c8cb823f1 --- /dev/null +++ b/android/abi_gki_aarch64_imx @@ -0,0 +1,1882 @@ +[abi_symbol_list] +# commonly used symbols + add_wait_queue + alloc_chrdev_region + alloc_etherdev_mqs + alloc_pages_exact + __alloc_pages_nodemask + __alloc_percpu + alloc_workqueue + __arch_copy_from_user + __arch_copy_to_user + arm64_const_caps_ready + __arm_smccc_smc + atomic_notifier_chain_register + atomic_notifier_chain_unregister + bcmp + bpf_trace_run1 + bpf_trace_run2 + bpf_trace_run3 + cancel_delayed_work + cancel_delayed_work_sync + cancel_work_sync + capable + cdev_add + cdev_del + cdev_init + cec_allocate_adapter + cec_delete_adapter + cec_received_msg_ts + cec_register_adapter + cec_transmit_attempt_done_ts + cec_unregister_adapter + __cfi_slowpath + __check_object_size + __class_create + class_destroy + clk_bulk_disable + clk_bulk_enable + clk_bulk_prepare + clk_bulk_unprepare + clk_disable + clk_enable + clk_gate_ops + clk_get + __clk_get_name + clk_get_parent + clk_get_rate + clk_is_match + clk_prepare + clk_put + clk_register + clk_register_fixed_rate + clk_register_gate + clk_register_mux + clk_round_rate + clk_set_parent + clk_set_rate + clk_unprepare + complete + component_add + component_del + __const_udelay + consume_skb + cpu_hwcap_keys + cpu_hwcaps + cpumask_next + cpu_number + __cpu_online_mask + __cpu_possible_mask + crc32_le + delayed_work_timer_fn + del_timer + del_timer_sync + destroy_workqueue + dev_driver_string + _dev_err + dev_fwnode + device_create + device_create_file + device_destroy + device_for_each_child + device_get_match_data + device_init_wakeup + device_link_add + device_link_del + device_property_present + device_property_read_u32_array + device_remove_file + __device_reset + device_set_wakeup_capable + device_set_wakeup_enable + _dev_info + __dev_kfree_skb_any + devm_add_action + devm_clk_bulk_get + devm_clk_get + devm_clk_get_optional + devm_extcon_dev_allocate + devm_extcon_dev_register + devm_free_irq + devm_gpiod_get + devm_gpiod_get_optional + devm_gpio_request_one + devm_ioremap + devm_ioremap_resource + devm_kfree + devm_kmalloc + __devm_of_phy_provider_register + devm_phy_create + devm_phy_get + devm_pinctrl_get + devm_platform_ioremap_resource + __devm_regmap_init + __devm_regmap_init_i2c + __devm_regmap_init_mmio_clk + devm_regulator_bulk_get + devm_regulator_get + devm_regulator_get_optional + devm_request_threaded_irq + devm_reset_control_array_get + __devm_reset_control_get + devm_reset_controller_register + devm_snd_dmaengine_pcm_register + devm_snd_soc_register_card + devm_snd_soc_register_component + devm_usb_get_phy_by_phandle + dev_pm_domain_attach_by_name + dev_pm_domain_detach + dev_pm_set_wake_irq + dev_set_name + _dev_warn + disable_irq + disable_irq_nosync + dma_alloc_attrs + dma_direct_map_page + dma_direct_map_sg + dma_direct_sync_sg_for_cpu + dma_direct_sync_sg_for_device + dma_direct_sync_single_for_cpu + dma_direct_sync_single_for_device + dma_direct_unmap_page + dma_direct_unmap_sg + dma_free_attrs + dma_get_slave_caps + dmam_alloc_attrs + dma_mmap_attrs + dma_release_channel + __dma_request_channel + dma_request_slave_channel + dma_set_coherent_mask + dma_set_mask + down_interruptible + down_write + drm_add_edid_modes + drm_atomic_helper_check + drm_atomic_helper_check_plane_state + drm_atomic_helper_cleanup_planes + drm_atomic_helper_commit + drm_atomic_helper_commit_hw_done + drm_atomic_helper_commit_modeset_disables + drm_atomic_helper_commit_modeset_enables + drm_atomic_helper_commit_planes + drm_atomic_helper_connector_destroy_state + drm_atomic_helper_connector_duplicate_state + drm_atomic_helper_connector_reset + __drm_atomic_helper_crtc_destroy_state + __drm_atomic_helper_crtc_duplicate_state + drm_atomic_helper_disable_plane + drm_atomic_helper_page_flip + drm_atomic_helper_plane_destroy_state + drm_atomic_helper_plane_duplicate_state + drm_atomic_helper_plane_reset + drm_atomic_helper_set_config + drm_atomic_helper_update_plane + drm_atomic_helper_wait_for_vblanks + drm_bridge_add + drm_bridge_attach + drm_bridge_remove + drm_compat_ioctl + drm_connector_attach_encoder + drm_connector_cleanup + drm_connector_init + drm_connector_update_edid_property + drm_crtc_arm_vblank_event + drm_crtc_cleanup + drm_crtc_handle_vblank + drm_crtc_init_with_planes + drm_crtc_send_vblank_event + drm_crtc_vblank_get + drm_crtc_vblank_off + drm_crtc_vblank_on + drm_detect_hdmi_monitor + drm_dev_alloc + drm_dev_dbg + drm_dev_printk + drm_dev_put + drm_dev_register + drm_dev_unregister + drm_display_info_set_bus_formats + drm_display_mode_from_videomode + drm_display_mode_to_videomode + drm_do_get_edid + drm_encoder_cleanup + drm_encoder_init + drm_err + drm_fb_cma_get_gem_obj + drm_gem_fb_create + drm_gem_prime_fd_to_handle + drm_gem_prime_handle_to_fd + drm_get_edid + drm_get_format_name + drm_hdmi_avi_infoframe_from_display_mode + drm_hdmi_vendor_infoframe_from_display_mode + drm_helper_hpd_irq_event + drm_helper_probe_single_connector_modes + drm_ioctl + drm_match_cea_mode + drm_mode_duplicate + drm_mode_probed_add + drm_mode_set_name + drm_mode_vrefresh + drm_of_find_possible_crtcs + drm_open + drm_panel_add + drm_panel_init + drm_panel_remove + drm_plane_cleanup + drm_plane_create_zpos_immutable_property + drm_poll + drm_read + drm_release + drm_universal_plane_init + dump_stack + enable_irq + eth_type_trans + eth_validate_addr + event_triggers_call + extcon_get_edev_by_phandle + extcon_get_state + extcon_set_state_sync + fd_install + filp_close + filp_open + find_next_bit + finish_wait + flush_work + flush_workqueue + fput + free_irq + free_netdev + __free_pages + free_pages + free_pages_exact + free_percpu + fwnode_graph_get_next_endpoint + fwnode_handle_put + fwnode_property_read_u32_array + generic_handle_irq + get_cpu_device + __get_free_pages + get_random_bytes + get_unused_fd_flags + gpiod_direction_output_raw + gpiod_set_raw_value_cansleep + gpiod_set_value_cansleep + gpio_request + gpio_to_desc + handle_level_irq + hdmi_audio_infoframe_init + hdmi_avi_infoframe_pack + hdmi_vendor_infoframe_pack + i2c_add_adapter + i2c_del_adapter + i2c_del_driver + i2c_register_driver + i2c_transfer + i2c_transfer_buffer_flags + i2c_unregister_device + idr_alloc + idr_destroy + idr_find + idr_remove + init_timer_key + init_wait_entry + __init_waitqueue_head + input_event + input_register_device + input_set_capability + iomem_resource + __ioremap + iounmap + irq_domain_remove + irq_find_mapping + irq_modify_status + irq_set_chained_handler_and_data + irq_set_irq_wake + jiffies + jiffies_to_usecs + kasprintf + kernel_read + kernel_write + kfree + kimage_vaddr + kimage_voffset + __kmalloc + kmalloc_caches + kmalloc_order_trace + kmem_cache_alloc_trace + kmemdup + kobject_create_and_add + kobject_put + kthread_create_on_node + kthread_should_stop + ktime_get + ktime_get_mono_fast_ns + ktime_get_real_ts64 + ktime_get_with_offset + kzfree + __list_add_valid + __list_del_entry_valid + media_create_pad_link + media_entity_pads_init + media_entity_remote_pad + memcpy + memset + mipi_dsi_attach + mipi_dsi_detach + mipi_dsi_driver_register_full + mipi_dsi_driver_unregister + misc_deregister + misc_register + mod_delayed_work_on + mod_timer + module_layout + module_put + __msecs_to_jiffies + msleep + __mutex_init + mutex_lock + mutex_lock_interruptible + mutex_unlock + napi_complete_done + napi_disable + __napi_schedule + napi_schedule_prep + __netdev_alloc_skb + netif_carrier_off + netif_device_attach + netif_device_detach + netif_napi_add + netif_tx_wake_queue + no_llseek + noop_llseek + nr_cpu_ids + ns_to_timespec64 + of_address_to_resource + of_alias_get_id + of_clk_add_provider + of_clk_get + of_clk_get_by_name + of_clk_src_onecell_get + of_count_phandle_with_args + of_device_get_match_data + of_device_is_available + of_device_is_compatible + of_find_compatible_node + of_find_device_by_node + of_find_i2c_device_by_node + of_find_matching_node_and_match + of_find_node_by_name + of_find_property + of_fwnode_ops + of_get_child_by_name + of_get_named_gpio_flags + of_get_next_available_child + of_get_next_child + of_get_parent + of_get_property + of_graph_get_next_endpoint + of_graph_get_port_by_id + of_graph_get_remote_node + of_graph_get_remote_port_parent + of_iomap + of_machine_is_compatible + of_match_device + of_match_node + of_node_name_eq + of_parse_phandle + of_parse_phandle_with_args + of_phy_simple_xlate + of_platform_depopulate + of_platform_populate + of_property_count_elems_of_size + of_property_read_string + of_property_read_u32_index + of_property_read_variable_u32_array + of_reset_control_array_get + param_array_ops + param_ops_bool + param_ops_int + param_ops_uint + param_ops_ullong + __pci_register_driver + pci_set_master + pci_set_power_state + pci_unregister_driver + __per_cpu_offset + perf_trace_buf_alloc + perf_trace_run_bpf_submit + pfn_valid + phy_exit + phy_init + phy_power_off + phy_power_on + physvirt_offset + pinctrl_lookup_state + pinctrl_pm_select_default_state + pinctrl_pm_select_sleep_state + pinctrl_select_state + platform_device_add + platform_device_add_data + platform_device_add_properties + platform_device_add_resources + platform_device_alloc + platform_device_put + platform_device_register_full + platform_device_unregister + __platform_driver_register + platform_driver_unregister + platform_get_irq + platform_get_irq_byname + platform_get_irq_byname_optional + platform_get_irq_optional + platform_get_resource + platform_get_resource_byname + platform_irq_count + pm_qos_add_request + pm_qos_remove_request + __pm_relax + pm_runtime_allow + __pm_runtime_disable + pm_runtime_enable + pm_runtime_forbid + pm_runtime_force_resume + pm_runtime_force_suspend + __pm_runtime_idle + __pm_runtime_resume + pm_runtime_set_autosuspend_delay + __pm_runtime_set_status + __pm_runtime_suspend + __pm_runtime_use_autosuspend + preempt_schedule + preempt_schedule_notrace + prepare_to_wait_event + printk + put_device + __put_page + __put_task_struct + queue_delayed_work_on + queue_work_on + radix_tree_insert + ___ratelimit + _raw_spin_lock + _raw_spin_lock_bh + _raw_spin_lock_irq + _raw_spin_lock_irqsave + _raw_spin_unlock + _raw_spin_unlock_bh + _raw_spin_unlock_irq + _raw_spin_unlock_irqrestore + __rcu_read_lock + __rcu_read_unlock + refcount_dec_and_test_checked + refcount_inc_checked + regcache_cache_only + regcache_mark_dirty + regcache_sync + __register_chrdev + register_netdev + __register_rpmsg_driver + register_virtio_driver + regmap_attach_dev + regmap_read + regmap_update_bits_base + regmap_write + regulator_bulk_disable + regulator_bulk_enable + regulator_disable + regulator_enable + regulator_is_enabled + regulator_set_voltage + release_firmware + __release_region + remap_pfn_range + remove_wait_queue + request_firmware + request_firmware_nowait + __request_region + request_threaded_irq + reset_control_assert + reset_control_deassert + reset_control_put + reset_control_reset + rpmsg_send + rpmsg_sendto + rtnl_lock + rtnl_unlock + schedule + schedule_timeout + scnprintf + seq_printf + seq_puts + sg_alloc_table + sg_free_table + sg_init_one + sg_init_table + sg_next + skb_pull + skb_put + snd_ctl_boolean_mono_info + snd_dma_alloc_pages + snd_dmaengine_pcm_prepare_slave_config + snd_dma_free_pages + snd_pcm_format_physical_width + snd_pcm_format_width + snd_pcm_hw_constraint_integer + snd_pcm_hw_constraint_list + snd_pcm_lib_ioctl + snd_pcm_period_elapsed + snd_soc_add_component_controls + snd_soc_card_jack_new + snd_soc_component_read32 + snd_soc_component_read + snd_soc_component_update_bits + snd_soc_component_write + snd_soc_dai_set_fmt + snd_soc_dai_set_sysclk + snd_soc_dai_set_tdm_slot + snd_soc_dapm_add_routes + snd_soc_dapm_get_volsw + snd_soc_dapm_ignore_suspend + snd_soc_dapm_new_controls + snd_soc_dapm_put_volsw + snd_soc_get_enum_double + snd_soc_get_volsw + snd_soc_info_enum_double + snd_soc_info_volsw + snd_soc_jack_add_gpios + snd_soc_of_parse_audio_routing + snd_soc_of_parse_card_name + snd_soc_params_to_bclk + snd_soc_pm_ops + snd_soc_put_enum_double + snd_soc_put_volsw + snd_soc_rtdcom_lookup + snd_soc_set_runtime_hwparams + snprintf + sprintf + sscanf + __stack_chk_fail + __stack_chk_guard + strcasecmp + strcmp + strcpy + strlcpy + strlen + strncmp + strncpy + strsep + strstr + synchronize_irq + syscon_node_to_regmap + syscon_regmap_lookup_by_compatible + syscon_regmap_lookup_by_phandle + sysfs_create_file_ns + sysfs_create_group + sysfs_remove_file_ns + sysfs_remove_group + system_wq + tasklet_kill + __tasklet_schedule + trace_define_field + trace_event_buffer_commit + trace_event_buffer_reserve + trace_event_ignore_this_pid + trace_event_raw_init + trace_event_reg + trace_handle_return + trace_raw_output_prep + trace_seq_printf + try_module_get + tty_flip_buffer_push + __unregister_chrdev + unregister_chrdev_region + unregister_netdev + unregister_rpmsg_driver + unregister_virtio_driver + up + up_write + usb_add_hcd + usb_disabled + usb_get_dr_mode + usb_hcd_is_primary_hcd + usb_put_hcd + usb_remove_hcd + usleep_range + v4l2_async_notifier_add_subdev + v4l2_async_notifier_init + v4l2_async_notifier_unregister + v4l2_async_register_subdev + v4l2_async_unregister_subdev + v4l2_ctrl_handler_free + v4l2_ctrl_handler_init_class + v4l2_ctrl_new_custom + v4l2_ctrl_new_std + v4l2_ctrl_subdev_subscribe_event + v4l2_device_disconnect + v4l2_device_put + v4l2_device_register + v4l2_device_register_subdev + v4l2_device_register_subdev_nodes + v4l2_device_unregister + v4l2_device_unregister_subdev + v4l2_event_pending + v4l2_event_subdev_unsubscribe + v4l2_event_subscribe + v4l2_event_unsubscribe + v4l2_fh_add + v4l2_fh_del + v4l2_fh_exit + v4l2_fh_init + v4l2_i2c_subdev_init + v4l2_subdev_call_wrappers + v4l2_subdev_init + vabits_actual + vb2_buffer_done + vb2_dma_contig_memops + vb2_dqbuf + vb2_expbuf + vb2_mmap + vb2_ops_wait_finish + vb2_ops_wait_prepare + vb2_plane_cookie + vb2_qbuf + vb2_querybuf + vb2_queue_init + vb2_queue_release + vb2_reqbufs + vb2_streamoff + vb2_streamon + vfree + vfs_mkdir + video_devdata + video_device_release_empty + video_ioctl2 + __video_register_device + video_unregister_device + virtqueue_add_inbuf + virtqueue_add_outbuf + virtqueue_get_buf + virtqueue_get_vring_size + virtqueue_kick + virtqueue_kick_prepare + virtqueue_notify + vmalloc + vmalloc_to_page + vmemmap + vsnprintf + wait_for_completion_interruptible_timeout + wait_for_completion_timeout + __wake_up + wake_up_process + __warn_printk + +# required by adv7511.ko + cec_s_phys_addr + cec_s_phys_addr_from_edid + cec_transmit_done_ts + drm_get_connector_status_name + drm_kms_helper_hotplug_event + drm_mode_copy + hdmi_avi_infoframe_init + i2c_new_ancillary_device + mipi_dsi_device_register_full + mipi_dsi_device_unregister + of_find_mipi_dsi_host_by_node + regmap_bulk_write + regmap_register_patch + +# required by busfreq-imx8mq.ko + register_pm_notifier + register_reboot_notifier + +# required by cdns_mhdp_drmcore.ko + drm_atomic_get_crtc_state + drm_dbg + drm_default_rgb_quant_range + drm_dp_aux_register + drm_dp_aux_unregister + drm_dp_bw_code_to_link_rate + drm_dp_dpcd_read + drm_dp_link_rate_to_bw_code + drm_hdmi_avi_infoframe_colorspace + drm_hdmi_avi_infoframe_quant_range + drm_hdmi_infoframe_set_hdr_metadata + drm_mode_create_hdmi_colorspace_property + drm_mode_is_420_also + drm_mode_is_420_only + drm_object_attach_property + hdmi_audio_infoframe_pack + hdmi_avi_infoframe_check + hdmi_drm_infoframe_pack + +# required by clk-imx8mp.ko + clk_hw_register_divider + clk_hw_register_fixed_factor + clk_hw_register_gate + clk_hw_register_mux + +# required by cpufreq-dt.ko + arch_set_freq_scale + cpufreq_enable_boost_support + cpufreq_freq_attr_scaling_available_freqs + cpufreq_freq_attr_scaling_boost_freqs + cpufreq_generic_frequency_table_verify + cpufreq_generic_get + cpufreq_generic_suspend + cpufreq_register_driver + cpufreq_unregister_driver + dev_pm_opp_free_cpufreq_table + dev_pm_opp_get_max_transition_latency + dev_pm_opp_get_opp_count + dev_pm_opp_get_sharing_cpus + dev_pm_opp_get_suspend_opp_freq + dev_pm_opp_init_cpufreq_table + dev_pm_opp_of_cpumask_add_table + dev_pm_opp_of_cpumask_remove_table + dev_pm_opp_of_get_sharing_cpus + dev_pm_opp_of_register_em + dev_pm_opp_put_regulators + dev_pm_opp_set_rate + dev_pm_opp_set_regulators + dev_pm_opp_set_sharing_cpus + policy_has_boost_freq + regulator_get_optional + regulator_put + +# required by cqhci.ko + dmam_free_coherent + mmc_cqe_request_done + +# required by device_cooling.ko + blocking_notifier_call_chain + blocking_notifier_chain_register + blocking_notifier_chain_unregister + thermal_cooling_device_unregister + thermal_of_cooling_device_register + +# required by dummy_battery.ko + power_supply_register + power_supply_unregister + +# required by dw-hdmi-cec.ko + cec_notifier_cec_adap_register + cec_notifier_cec_adap_unregister + devm_remove_action + +# required by dw-hdmi.ko + cec_fill_conn_info_from_drm + cec_notifier_conn_register + cec_notifier_conn_unregister + cec_notifier_set_phys_addr + cec_notifier_set_phys_addr_from_edid + drm_connector_init_with_ddc + drm_detect_monitor_audio + drm_scdc_read + drm_scdc_set_high_tmds_clock_ratio + drm_scdc_set_scrambling + drm_scdc_write + i2c_put_adapter + of_get_i2c_adapter_by_node + +# required by dw_hdmi-imx.ko + devm_kmemdup + devm_phy_optional_get + drm_of_encoder_active_endpoint + +# required by dwc3-haps.ko + pcim_enable_device + +# required by dwc3-of-simple.ko + clk_bulk_get_all + clk_bulk_put_all + +# required by dwc3-qcom.ko + devm_extcon_register_notifier + of_clk_get_parent_count + +# required by dwc3.ko + bpf_trace_run4 + device_property_read_string + device_property_read_u8_array + devm_clk_bulk_get_all + devm_usb_get_phy + extcon_find_edev_by_node + extcon_get_extcon_dev + extcon_register_notifier + extcon_unregister_notifier + of_usb_get_phy_mode + of_usb_update_otg_caps + phy_pm_runtime_get_sync + phy_pm_runtime_put_sync + phy_set_mode_ext + system_freezable_wq + usb_add_gadget_udc + usb_decode_ctrl + usb_del_gadget_udc + usb_ep_set_maxpacket_limit + usb_gadget_giveback_request + usb_gadget_map_request_by_dev + usb_gadget_set_state + usb_gadget_udc_reset + usb_gadget_unmap_request_by_dev + usb_get_maximum_speed + usb_role_switch_register + usb_role_switch_unregister + +# required by fec.ko + ethtool_op_get_link + ethtool_op_get_ts_info + __local_bh_enable_ip + mdiobus_alloc_size + mdiobus_free + mdiobus_is_registered_device + mdiobus_unregister + napi_gro_receive + netdev_err + netdev_info + netdev_pick_tx + netif_schedule_queue + net_ratelimit + of_find_node_by_phandle + of_get_mac_address + of_get_phy_mode + of_mdiobus_register + of_phy_connect + of_phy_deregister_fixed_link + of_phy_find_device + of_phy_is_fixed_link + of_phy_register_fixed_link + param_ops_byte + phy_attached_info + phy_connect + phy_disconnect + phy_ethtool_get_eee + phy_ethtool_get_link_ksettings + phy_ethtool_nway_reset + phy_ethtool_set_eee + phy_ethtool_set_link_ksettings + phy_init_eee + phy_mii_ioctl + phy_print_status + phy_remove_link_mode + phy_reset_after_clk_enable + phy_set_max_speed + phy_set_sym_pause + phy_start + phy_start_aneg + phy_stop + phy_support_sym_pause + pskb_expand_head + skb_tstamp_tx + timecounter_cyc2time + timecounter_init + timecounter_read + tso_build_data + tso_build_hdr + tso_count_descs + tso_start + +# required by fsl-imx-ldb.ko + devm_drm_panel_bridge_add + drm_of_find_panel_or_bridge + +# required by galcore.ko + anon_inode_getfd + cache_line_size + dev_pm_opp_add + dev_pm_opp_remove + dma_buf_attach + dma_buf_detach + dma_buf_export + dma_buf_fd + dma_buf_get + dma_buf_map_attachment + dma_buf_put + dma_buf_unmap_attachment + dma_fence_array_ops + dma_fence_context_alloc + dma_fence_default_wait + dma_fence_init + dma_fence_release + dma_fence_signal + dma_fence_signal_locked + dma_fence_wait_timeout + down + down_read + down_trylock + driver_create_file + driver_remove_file + drm_gem_handle_create + drm_gem_object_lookup + drm_gem_object_put_unlocked + drm_gem_object_release + drm_gem_private_object_init + find_vma + find_vpid + get_user_pages + hrtimer_resolution + idr_preload + iommu_attach_device + iommu_domain_alloc + iommu_domain_free + iommu_map + iommu_set_fault_handler + iommu_unmap + jiffies_to_msecs + kstrtoint_from_user + kthread_stop + ktime_get_ts64 + mutex_trylock + param_ops_ulong + pid_task + platform_bus_type + schedule_hrtimeout + set_user_nice + sg_alloc_table_from_pages + si_meminfo + sync_file_create + sync_file_get_fence + __task_pid_nr_ns + _totalram_pages + up_read + vmap + vm_mmap + vm_munmap + vunmap + +# required by gmsl-max9286.ko + i2c_smbus_read_byte_data + i2c_smbus_write_byte_data + +# required by gpio-mxc.ko + devm_gpiochip_add_data + __devm_irq_alloc_descs + devm_irq_alloc_generic_chip + devm_irq_setup_generic_chip + gpiochip_generic_free + gpiochip_generic_request + gpiochip_get_data + gpiochip_lock_as_irq + gpiochip_unlock_as_irq + irq_domain_add_legacy + irq_domain_simple_ops + irq_gc_ack_set_bit + irq_gc_mask_clr_bit + irq_gc_mask_set_bit + __irq_set_handler + register_syscore_ops + +# required by gpio-switch.ko + typec_switch_get_drvdata + typec_switch_register + typec_switch_unregister + +# required by i2c-imx.ko + clk_notifier_register + clk_notifier_unregister + dma_request_chan + gpiod_set_raw_value + i2c_add_numbered_adapter + i2c_generic_scl_recovery + i2c_recover_bus + __udelay + +# required by imx-audiomix.ko + devm_of_platform_populate + +# required by imx-cpufreq-dt.ko + dev_pm_opp_put_supported_hw + dev_pm_opp_set_supported_hw + nvmem_cell_read_u32 + +# required by imx-lcdif-crtc.ko + drm_property_destroy + +# required by imx-lcdifv3-crtc.ko + drm_mode_equal + drm_mode_find_dmt + +# required by imx-mailbox.ko + devm_mbox_controller_register + mbox_chan_received_data + mbox_chan_txdone + tasklet_init + +# required by imx-pcm-dma-common.ko + snd_dmaengine_pcm_close_release_chan + snd_dmaengine_pcm_get_chan + snd_dmaengine_pcm_open + snd_dmaengine_pcm_open_request_chan + snd_dmaengine_pcm_pointer + snd_dmaengine_pcm_set_config_from_dai_data + snd_dmaengine_pcm_trigger + snd_hwparams_to_dma_slave_config + +# required by imx-pcm-rpmsg.ko + snd_soc_lookup_component + +# required by imx-sdma.ko + dma_async_device_register + dma_async_device_unregister + dma_async_tx_descriptor_init + gen_pool_dma_alloc + gen_pool_free_owner + of_dma_controller_register + of_gen_pool_get + vchan_dma_desc_free_list + vchan_find_desc + vchan_init + vchan_tx_desc_free + vchan_tx_submit + +# required by imx.ko + do_SAK + handle_sysrq + mctrl_gpio_disable_ms + mctrl_gpio_enable_ms + mctrl_gpio_get + mctrl_gpio_init + mctrl_gpio_set + oops_in_progress + rational_best_approximation + _raw_spin_trylock + __tty_insert_flip_char + tty_insert_flip_string_fixed_flag + tty_termios_encode_baud_rate + uart_add_one_port + uart_console_device + uart_console_write + uart_get_baud_rate + uart_get_divisor + uart_get_rs485_mode + uart_handle_cts_change + uart_handle_dcd_change + uart_parse_options + uart_register_driver + uart_remove_one_port + uart_resume_port + uart_set_options + uart_suspend_port + uart_unregister_driver + uart_update_timeout + uart_write_wakeup + +# required by imx2_wdt.ko + _dev_crit + __platform_driver_probe + watchdog_init_timeout + watchdog_register_device + watchdog_set_restart_priority + watchdog_unregister_device + +# required by imx8-capture.ko + soc_device_match + +# required by imx8-isi-cap.ko + media_graph_walk_cleanup + media_graph_walk_init + media_graph_walk_next + media_graph_walk_start + v4l2_fh_open + v4l2_g_parm_cap + v4l2_s_parm_cap + vb2_fop_mmap + vb2_fop_poll + _vb2_fop_release + vb2_ioctl_create_bufs + vb2_ioctl_dqbuf + vb2_ioctl_expbuf + vb2_ioctl_prepare_buf + vb2_ioctl_qbuf + vb2_ioctl_querybuf + vb2_ioctl_reqbufs + vb2_ioctl_streamoff + vb2_ioctl_streamon + +# required by imx8-media-dev.ko + media_device_cleanup + media_device_init + __media_device_register + media_device_unregister + v4l2_async_notifier_register + +# required by imx8m_pm_domains.ko + of_genpd_add_provider_simple + of_genpd_add_subdomain + of_genpd_del_provider + pm_genpd_init + pm_genpd_remove + +# required by imx8mm_thermal.ko + devm_thermal_zone_of_sensor_register + of_thermal_get_trip_points + thermal_zone_bind_cooling_device + +# required by imx8mp-ldb.ko + devm_of_phy_get + +# required by imx_rpmsg_tty.ko + print_hex_dump + put_tty_driver + __tty_alloc_driver + tty_port_close + tty_port_destroy + tty_port_init + tty_port_install + tty_port_open + tty_prepare_flip_string + tty_register_driver + tty_set_operations + tty_std_termios + tty_unregister_driver + +# required by imx_rproc.ko + mbox_free_channel + mbox_request_channel_byname + mbox_send_message + of_phandle_iterator_init + of_phandle_iterator_next + of_reserved_mem_lookup + reset_control_status + rproc_add + rproc_add_carveout + rproc_alloc + rproc_coredump_add_segment + rproc_da_to_va + rproc_del + rproc_elf_find_loaded_rsc_table + rproc_elf_get_boot_addr + rproc_elf_load_rsc_table + rproc_elf_load_segments + rproc_elf_sanity_check + rproc_free + rproc_mem_entry_init + rproc_of_resm_mem_entry_init + rproc_vq_interrupt + +# required by imxdrm.ko + component_bind_all + component_master_add_with_match + component_master_del + component_match_add_release + component_unbind_all + drm_connector_unregister + drm_gem_cma_dumb_create + drm_gem_cma_free_object + drm_gem_cma_mmap + drm_gem_cma_prime_get_sg_table + drm_gem_cma_prime_import_sg_table + drm_gem_cma_prime_mmap + drm_gem_cma_prime_vmap + drm_gem_cma_prime_vunmap + drm_gem_cma_vm_ops + drm_kms_helper_poll_fini + drm_kms_helper_poll_init + drm_mode_config_cleanup + drm_mode_config_helper_resume + drm_mode_config_helper_suspend + drm_mode_config_init + drm_mode_config_reset + drm_of_component_match_add + drm_vblank_init + +# required by incrementalfs.ko + bin2hex + __break_lease + clear_inode + __close_fd + crypto_alloc_shash + crypto_destroy_tfm + crypto_shash_digest + d_add + d_drop + deactivate_locked_super + dentry_open + dget_parent + d_instantiate + d_make_root + dput + fget + flush_dcache_page + flush_delayed_work + fs_kobj + fsstack_copy_attr_all + generic_file_llseek + generic_file_mmap + generic_file_read_iter + generic_file_splice_read + generic_read_dir + generic_shutdown_super + get_zeroed_page + iget5_locked + ihold + inode_init_once + inode_init_owner + iput + iterate_dir + kern_path + lockref_get + lock_rename + lookup_one_len + LZ4_decompress_safe + match_int + match_token + mutex_is_locked + notify_change + override_creds + pagecache_get_page + path_get + path_put + __put_cred + register_filesystem + revert_creds + set_anon_super + sget + simple_getattr + simple_setattr + simple_statfs + strndup_user + sync_filesystem + truncate_inode_pages + unlock_new_inode + unlock_page + unlock_rename + unregister_filesystem + user_path_at_empty + vfs_create + vfs_fallocate + vfs_getattr + vfs_getxattr + vfs_link + vfs_listxattr + vfs_rename + vfs_rmdir + vfs_setxattr + vfs_unlink + +# required by ion_cma_heap.ko + cma_alloc + cma_for_each_area + cma_get_name + cma_release + ion_buffer_prep_noncached + __ion_device_add_heap + ion_device_remove_heap + +# required by irq-imx-irqsteer.ko + __irq_domain_add + irq_domain_xlate_onecell + irq_of_parse_and_map + irq_set_chip_and_handler_name + irq_set_chip_data + +# required by it6263.ko + i2c_new_dummy + regmap_bulk_read + +# required by moal.ko + alloc_netdev_mqs + __alloc_skb + __cfg80211_alloc_event_skb + __cfg80211_alloc_reply_skb + cfg80211_cac_event + cfg80211_ch_switch_notify + cfg80211_connect_done + cfg80211_cqm_rssi_notify + cfg80211_del_sta_sinfo + cfg80211_disconnected + cfg80211_find_elem_match + cfg80211_ft_event + cfg80211_get_bss + cfg80211_inform_bss_data + cfg80211_mgmt_tx_status + cfg80211_michael_mic_failure + cfg80211_new_sta + cfg80211_pmksa_candidate_notify + cfg80211_put_bss + cfg80211_radar_event + cfg80211_ready_on_channel + cfg80211_remain_on_channel_expired + cfg80211_report_wowlan_wakeup + cfg80211_roamed + cfg80211_rx_assoc_resp + cfg80211_rx_mgmt + cfg80211_rx_mlme_mgmt + cfg80211_scan_done + cfg80211_sched_scan_results + cfg80211_sched_scan_stopped + __cfg80211_send_event_skb + cfg80211_unlink_bss + cfg80211_vendor_cmd_reply + _ctype + default_wake_function + dev_alloc_name + dev_close + ether_setup + hex_dump_to_buffer + ieee80211_bss_get_elem + ieee80211_channel_to_freq_khz + ieee80211_freq_khz_to_channel + ieee80211_get_channel_khz + in4_pton + init_dummy_netdev + init_net + iwe_stream_add_event + iwe_stream_add_point + iwe_stream_add_value + iw_handler_get_spy + iw_handler_get_thrspy + iw_handler_set_spy + iw_handler_set_thrspy + kern_path_create + kfree_skb + ktime_get_raw + ktime_get_raw_ts64 + memcmp + memmove + mmc_set_data_timeout + mmc_wait_for_req + netif_carrier_on + netif_napi_del + netif_rx + netif_rx_ni + netif_tx_stop_all_queues + netlink_broadcast + __netlink_kernel_create + netlink_kernel_release + __nla_parse + nla_put + panic + param_ops_charp + param_ops_ushort + pci_choose_state + pci_disable_device + pci_disable_msi + pci_disable_msix + pci_enable_device + pci_enable_msi + pci_enable_msix_range + pci_enable_wake + pci_iomap + pci_read_config_dword + pci_release_region + pci_request_region + pci_reset_function + pci_restore_state + pci_save_state + PDE_DATA + prandom_u32 + proc_create_data + proc_mkdir + register_netdevice + regulatory_hint + regulatory_set_wiphy_regd + remove_proc_entry + rtnl_is_locked + sdio_claim_host + sdio_claim_irq + sdio_disable_func + sdio_enable_func + sdio_f0_readb + sdio_f0_writeb + sdio_get_host_pm_caps + sdio_readb + sdio_readsb + sdio_register_driver + sdio_release_host + sdio_release_irq + sdio_set_block_size + sdio_set_host_pm_flags + sdio_unregister_driver + sdio_writeb + sdio_writesb + seq_lseek + seq_read + single_open + single_release + skb_realloc_headroom + sort + strcat + strchr + strim + strncasecmp + strrchr + __sw_hweight64 + unregister_netdevice_queue + vprintk + wiphy_apply_custom_regulatory + wiphy_free + wiphy_new_nm + wiphy_register + wiphy_unregister + wireless_send_event + +# required by mxc-clk.ko + __clk_determine_rate + clk_divider_ops + clk_fractional_divider_ops + __clk_get_hw + clk_hw_get_name + clk_hw_get_parent_by_index + clk_hw_is_enabled + clk_hw_register + clk_hw_register_composite + clk_mux_ops + clk_unregister + divider_get_val + divider_recalc_rate + of_clk_get_from_provider + of_find_node_opts_by_path + +# required by nvmem-imx-ocotp.ko + devm_nvmem_register + +# required by os08a20.ko + devm_pinctrl_put + +# required by ov5640.ko + v4l2_ctrl_auto_cluster + v4l2_ctrl_handler_setup + v4l2_ctrl_new_std_menu + v4l2_ctrl_new_std_menu_items + v4l2_ctrl_subdev_log_status + __v4l2_find_nearest_size + +# required by panel-raydium-rm67191.ko + devm_backlight_device_register + mipi_dsi_dcs_enter_sleep_mode + mipi_dsi_dcs_exit_sleep_mode + mipi_dsi_dcs_get_display_brightness + mipi_dsi_dcs_set_display_brightness + mipi_dsi_dcs_set_display_off + mipi_dsi_dcs_set_display_on + mipi_dsi_dcs_set_pixel_format + mipi_dsi_dcs_set_tear_on + mipi_dsi_dcs_set_tear_scanline + mipi_dsi_dcs_soft_reset + mipi_dsi_generic_write + +# required by panel-simple.ko + drm_mode_create + of_find_backlight_by_node + of_find_i2c_adapter_by_node + of_get_display_timing + videomode_from_timing + +# required by pca9450-regulator.ko + of_regulator_match + rdev_get_drvdata + regulator_disable_regmap + regulator_enable_regmap + regulator_get_voltage_sel_regmap + regulator_is_enabled_regmap + regulator_list_voltage_linear + regulator_list_voltage_linear_range + regulator_map_voltage_iterate + regulator_register + regulator_set_voltage_sel_regmap + regulator_set_voltage_time_sel + regulator_unregister + +# required by pca9450.ko + gpiod_to_irq + mfd_add_devices + mfd_remove_devices + regmap_add_irq_chip + regmap_del_irq_chip + regmap_irq_get_domain + +# required by pci-imx6.ko + dw_pcie_ep_init + dw_pcie_ep_raise_legacy_irq + dw_pcie_ep_raise_msi_irq + dw_pcie_ep_raise_msix_irq + dw_pcie_ep_reset_bar + dw_pcie_host_init + dw_pcie_link_up + dw_pcie_msi_init + dw_pcie_read_dbi + dw_pcie_setup_rc + dw_pcie_wait_for_link + dw_pcie_write_dbi + pci_msi_enabled + phy_calibrate + +# required by phy-fsl-imx8mq-usb.ko + power_supply_get_by_phandle + power_supply_get_property + power_supply_put + power_supply_reg_notifier + power_supply_set_property + power_supply_unreg_notifier + +# required by phy-fsl-samsung-hdmi.ko + devm_clk_register + of_clk_del_provider + of_clk_src_simple_get + +# required by pinctrl-imx.ko + devm_pinctrl_register_and_init + pinconf_generic_parse_dt_config + pinctrl_dev_get_drvdata + pinctrl_enable + pinctrl_force_default + pinctrl_force_sleep + pinctrl_generic_get_group + pinctrl_generic_get_group_count + pinctrl_generic_get_group_name + pinctrl_generic_get_group_pins + pin_get_name + pinmux_generic_get_function + pinmux_generic_get_function_count + pinmux_generic_get_function_groups + pinmux_generic_get_function_name + +# required by pps_core.ko + fasync_helper + idr_get_next + kill_fasync + kobject_get + +# required by ptp.ko + device_initialize + ida_alloc_range + ida_destroy + ida_free + kthread_cancel_delayed_work_sync + kthread_create_worker + kthread_delayed_work_timer_fn + kthread_destroy_worker + kthread_mod_delayed_work + kthread_queue_delayed_work + ktime_get_snapshot + memdup_user + posix_clock_register + posix_clock_unregister + +# required by pwm-imx27.ko + of_pwm_xlate_with_flags + pwmchip_add + pwmchip_remove + +# required by pwm_bl.ko + backlight_device_register + backlight_device_unregister + devm_pwm_get + gpiod_direction_output + gpiod_get_direction + gpiod_get_value_cansleep + int_pow + pwm_apply_state + pwm_free + pwm_request + +# required by rtc-snvs.ko + devm_rtc_allocate_device + __rtc_register_device + rtc_time64_to_tm + rtc_tm_to_time64 + rtc_update_irq + +# required by sdhci-esdhc-imx.ko + mmc_gpiod_request_cd + mmc_gpiod_request_ro + mmc_gpio_get_cd + mmc_gpio_get_ro + mmc_of_parse + mmc_of_parse_voltage + mmc_retune_timer_stop + mmc_send_tuning + sdhci_add_host + sdhci_cqe_disable + sdhci_cqe_enable + sdhci_cqe_irq + sdhci_dumpregs + sdhci_execute_tuning + sdhci_pltfm_free + sdhci_pltfm_init + sdhci_remove_host + sdhci_reset + sdhci_resume_host + sdhci_runtime_resume_host + sdhci_runtime_suspend_host + sdhci_suspend_host + +# required by sec-dsim.ko + bsearch + drm_panel_attach + drm_panel_detach + drm_panel_disable + drm_panel_enable + drm_panel_get_modes + drm_panel_prepare + drm_panel_unprepare + mipi_dsi_create_packet + mipi_dsi_host_register + mipi_dsi_host_unregister + of_drm_find_bridge + of_drm_find_panel + +# required by snd-soc-fsl-dsp-cpu.ko + snd_soc_new_compress + snd_soc_register_component + snd_soc_unregister_component + +# required by snd-soc-fsl-dsp.ko + dev_pm_domain_attach_by_id + __memset_io + of_irq_get + pm_system_wakeup + sysfs_streq + vfs_llseek + +# required by snd-soc-fsl-easrc.ko + completion_done + gcd + snd_pcm_format_big_endian + snd_pcm_format_linear + snd_pcm_format_unsigned + snd_soc_dpcm_get_substream + snd_soc_info_xr_sx + +# required by snd-soc-fsl-micfil.ko + kobject_uevent_env + kstrtoull + snd_soc_get_volsw_sx + snd_soc_info_volsw_sx + snd_soc_put_volsw_sx + +# required by snd-soc-fsl-rpmsg-i2s.ko + __pm_stay_awake + wakeup_source_register + wakeup_source_unregister + +# required by snd-soc-fsl-sai.ko + kstrtouint + snd_pcm_hw_constraint_step + __sw_hweight8 + +# required by snd-soc-hdmi-codec.ko + snd_ctl_add + snd_ctl_new1 + snd_pcm_add_chmap_ctls + snd_pcm_create_iec958_consumer_hw_params + snd_pcm_hw_constraint_eld + snd_soc_jack_report + +# required by snd-soc-imx-rpmsg.ko + of_reserved_mem_device_init_by_idx + +# required by snd-soc-imx-wm8960.ko + gpiod_get_raw_value_cansleep + of_parse_phandle_with_fixed_args + snd_soc_dai_set_pll + snd_soc_dapm_disable_pin + snd_soc_dapm_enable_pin + +# required by snd-soc-rpmsg-ak4497.ko + gpio_free + snd_soc_dapm_get_enum_double + snd_soc_dapm_put_enum_double + +# required by snd-soc-rpmsg-cs42xx8.ko + regcache_cache_bypass + +# required by snd-soc-simple-card-utils.ko + devm_get_clk_from_child + devm_kasprintf + devm_kvasprintf + of_property_read_string_helper + snd_soc_dapm_get_pin_switch + snd_soc_dapm_info_pin_switch + snd_soc_dapm_put_pin_switch + snd_soc_of_parse_audio_simple_widgets + snd_soc_of_parse_daifmt + +# required by snd-soc-simple-card.ko + snd_soc_of_get_dai_name + snd_soc_of_parse_node_prefix + snd_soc_of_parse_tdm_slot + +# required by snvs_pwrkey.ko + devm_input_allocate_device + pm_relax + pm_wakeup_dev_event + +# required by soc-imx8m.ko + of_root + soc_device_register + +# required by synaptics_dsx_i2c.ko + input_allocate_device + input_free_device + input_mt_init_slots + input_mt_report_slot_state + input_set_abs_params + input_unregister_device + +# required by tcpci.ko + device_get_named_child_node + regmap_raw_read + regmap_raw_write + tcpm_cc_change + tcpm_pd_hard_reset + tcpm_pd_receive + tcpm_pd_transmit_complete + tcpm_register_port + tcpm_tcpc_reset + tcpm_unregister_port + tcpm_vbus_change + +# required by timer-imx-sysctr.ko + clockevents_config_and_register + cpu_bit_bitmap + timer_of_init + +# required by trusty-arm64-fiq.ko + smp_call_function + smp_call_function_single + +# required by trusty-ipc.ko + _copy_from_iter + _copy_to_iter + idr_for_each + strncpy_from_user + virtqueue_detach_unused_buf + wait_woken + woken_wake_function + +# required by trusty-irq.ko + __cpuhp_remove_state + __cpuhp_setup_state + __cpuhp_state_add_instance + __cpuhp_state_remove_instance + disable_percpu_irq + enable_percpu_irq + free_percpu_irq + irq_create_of_mapping + __request_percpu_irq + +# required by trusty-log.ko + panic_notifier_list + +# required by trusty-virtio.ko + register_virtio_device + unregister_virtio_device + vring_del_virtqueue + vring_interrupt + vring_new_virtqueue + +# required by trusty.ko + atomic_notifier_call_chain + +# required by v4l2-fwnode.ko + fwnode_device_is_available + fwnode_get_next_parent + fwnode_get_parent + fwnode_graph_get_port_parent + fwnode_graph_get_remote_endpoint + fwnode_graph_get_remote_port_parent + fwnode_graph_parse_endpoint + fwnode_property_get_reference_args + fwnode_property_present + fwnode_property_read_u64_array + v4l2_async_notifier_add_fwnode_subdev + v4l2_async_notifier_cleanup + v4l2_async_subdev_notifier_register + +# required by v4l2-mem2mem.ko + media_create_intf_link + media_device_register_entity + media_device_unregister_entity + media_devnode_create + media_devnode_remove + media_entity_remove_links + media_remove_intf_links + vb2_create_bufs + vb2_prepare_buf + vb2_request_object_is_buffer + +# required by virtio_rpmsg_bus.ko + device_unregister + rpmsg_find_device + rpmsg_register_device + rpmsg_unregister_device + virtio_check_driver_offered_feature + virtqueue_disable_cb + virtqueue_enable_cb + +# required by vvcam-csis.ko + of_clk_set_defaults + +# required by vvcam-video.ko + platform_device_register + v4l2_ctrl_poll + v4l2_ctrl_subscribe_event + v4l2_event_queue + v4l_bound_align_image + vb2_poll + video_device_alloc + video_device_release + +# required by xhci-hcd.ko + add_timer + complete_all + dma_pool_alloc + dma_pool_create + dma_pool_destroy + dma_pool_free + __num_online_cpus + pci_alloc_irq_vectors_affinity + pci_free_irq_vectors + pci_irq_vector + radix_tree_delete + radix_tree_lookup + radix_tree_maybe_preload + schedule_timeout_uninterruptible + sg_pcopy_from_buffer + sg_pcopy_to_buffer + __sw_hweight32 + trace_print_symbols_seq + usb_amd_dev_put + usb_amd_pt_check_port + usb_amd_quirk_pll_disable + usb_amd_quirk_pll_enable + usb_asmedia_modifyflowcontrol + usb_disable_xhci_ports + usb_hcd_check_unlink_urb + usb_hcd_end_port_resume + usb_hcd_giveback_urb + usb_hc_died + usb_hcd_irq + usb_hcd_link_urb_to_ep + usb_hcd_map_urb_for_dma + usb_hcd_poll_rh_status + usb_hcd_resume_root_hub + usb_hcd_start_port_resume + usb_hcd_unlink_urb_from_ep + usb_hub_clear_tt_buffer + usb_root_hub_lost_power + usb_wakeup_notification + wait_for_completion + +# required by xhci-pci.ko + pci_d3cold_disable + pci_read_config_byte + pci_set_mwi + usb_amd_quirk_pll_check + usb_create_shared_hcd + usb_enable_intel_xhci_ports + usb_hcd_pci_pm_ops + usb_hcd_pci_probe + usb_hcd_pci_remove + usb_hcd_pci_shutdown + +# required by xhci-plat-hcd.ko + device_wakeup_enable + of_usb_host_tpl_support + pci_bus_type + __usb_create_hcd + usb_hcd_platform_shutdown diff --git a/build.config.gki.aarch64 b/build.config.gki.aarch64 index 2c8a87684413..210264370e9b 100644 --- a/build.config.gki.aarch64 +++ b/build.config.gki.aarch64 @@ -12,6 +12,7 @@ android/abi_gki_aarch64_exynosauto android/abi_gki_aarch64_galaxy android/abi_gki_aarch64_goldfish android/abi_gki_aarch64_hikey960 +android/abi_gki_aarch64_imx android/abi_gki_aarch64_oneplus android/abi_gki_aarch64_oplus android/abi_gki_aarch64_qcom From e694a1fc9003634f2ca0136ad8b78c29e9bb26ba Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:48:56 -0800 Subject: [PATCH 03/28] UPSTREAM: HID: playstation: initial DualSense USB support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement support for PlayStation DualSense gamepad in USB mode. Support features include buttons and sticks, which adhere to the Linux gamepad spec. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I7cf496f9b6f721cdd3e79387caa86b2ccc6378fb (cherry picked from commit bc2e15a9a0228b10fece576d4f6a974c002ff07b) Signed-off-by: Farid Chahla --- MAINTAINERS | 6 + drivers/hid/Kconfig | 8 + drivers/hid/Makefile | 1 + drivers/hid/hid-ids.h | 1 + drivers/hid/hid-playstation.c | 328 ++++++++++++++++++++++++++++++++++ 5 files changed, 344 insertions(+) create mode 100644 drivers/hid/hid-playstation.c diff --git a/MAINTAINERS b/MAINTAINERS index 99a57f8118ec..9aa953f4b470 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7320,6 +7320,12 @@ F: drivers/hid/ F: include/linux/hid* F: include/uapi/linux/hid* +HID PLAYSTATION DRIVER +M: Roderick Colenbrander +L: linux-input@vger.kernel.org +S: Supported +F: drivers/hid/hid-playstation.c + HID SENSOR HUB DRIVERS M: Jiri Kosina M: Jonathan Cameron diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 018fb7220d71..c8c64526430b 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -846,6 +846,14 @@ config HID_PLANTRONICS Say M here if you may ever plug in a Plantronics USB audio device. +config HID_PLAYSTATION + tristate "PlayStation HID Driver" + depends on HID + help + Provides support for Sony PS5 controllers including support for + its special functionalities e.g. touchpad, lights and motion + sensors. + config HID_PRIMAX tristate "Primax non-fully HID-compliant devices" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index eee74c36617a..27595a35cc70 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -91,6 +91,7 @@ hid-picolcd-$(CONFIG_HID_PICOLCD_CIR) += hid-picolcd_cir.o hid-picolcd-$(CONFIG_DEBUG_FS) += hid-picolcd_debugfs.o obj-$(CONFIG_HID_PLANTRONICS) += hid-plantronics.o +obj-$(CONFIG_HID_PLAYSTATION) += hid-playstation.o obj-$(CONFIG_HID_PRIMAX) += hid-primax.o obj-$(CONFIG_HID_REDRAGON) += hid-redragon.o obj-$(CONFIG_HID_RETRODE) += hid-retrode.o diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 039d51f422c6..a1bc3c2f748f 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -1066,6 +1066,7 @@ #define USB_DEVICE_ID_SONY_PS4_CONTROLLER 0x05c4 #define USB_DEVICE_ID_SONY_PS4_CONTROLLER_2 0x09cc #define USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE 0x0ba0 +#define USB_DEVICE_ID_SONY_PS5_CONTROLLER 0x0ce6 #define USB_DEVICE_ID_SONY_MOTION_CONTROLLER 0x03d5 #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f #define USB_DEVICE_ID_SONY_BUZZ_CONTROLLER 0x0002 diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c new file mode 100644 index 000000000000..7d4171a89322 --- /dev/null +++ b/drivers/hid/hid-playstation.c @@ -0,0 +1,328 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * HID driver for Sony DualSense(TM) controller. + * + * Copyright (c) 2020 Sony Interactive Entertainment + */ + +#include +#include +#include +#include +#include + +#include + +#include "hid-ids.h" + +#define HID_PLAYSTATION_VERSION_PATCH 0x8000 + +/* Base class for playstation devices. */ +struct ps_device { + struct hid_device *hdev; + + int (*parse_report)(struct ps_device *dev, struct hid_report *report, u8 *data, int size); +}; + +#define DS_INPUT_REPORT_USB 0x01 +#define DS_INPUT_REPORT_USB_SIZE 64 + +/* Button masks for DualSense input report. */ +#define DS_BUTTONS0_HAT_SWITCH GENMASK(3, 0) +#define DS_BUTTONS0_SQUARE BIT(4) +#define DS_BUTTONS0_CROSS BIT(5) +#define DS_BUTTONS0_CIRCLE BIT(6) +#define DS_BUTTONS0_TRIANGLE BIT(7) +#define DS_BUTTONS1_L1 BIT(0) +#define DS_BUTTONS1_R1 BIT(1) +#define DS_BUTTONS1_L2 BIT(2) +#define DS_BUTTONS1_R2 BIT(3) +#define DS_BUTTONS1_CREATE BIT(4) +#define DS_BUTTONS1_OPTIONS BIT(5) +#define DS_BUTTONS1_L3 BIT(6) +#define DS_BUTTONS1_R3 BIT(7) +#define DS_BUTTONS2_PS_HOME BIT(0) +#define DS_BUTTONS2_TOUCHPAD BIT(1) + +struct dualsense { + struct ps_device base; + struct input_dev *gamepad; +}; + +struct dualsense_touch_point { + uint8_t contact; + uint8_t x_lo; + uint8_t x_hi:4, y_lo:4; + uint8_t y_hi; +} __packed; +static_assert(sizeof(struct dualsense_touch_point) == 4); + +/* Main DualSense input report excluding any BT/USB specific headers. */ +struct dualsense_input_report { + uint8_t x, y; + uint8_t rx, ry; + uint8_t z, rz; + uint8_t seq_number; + uint8_t buttons[4]; + uint8_t reserved[4]; + + /* Motion sensors */ + __le16 gyro[3]; /* x, y, z */ + __le16 accel[3]; /* x, y, z */ + __le32 sensor_timestamp; + uint8_t reserved2; + + /* Touchpad */ + struct dualsense_touch_point points[2]; + + uint8_t reserved3[12]; + uint8_t status; + uint8_t reserved4[10]; +} __packed; +/* Common input report size shared equals the size of the USB report minus 1 byte for ReportID. */ +static_assert(sizeof(struct dualsense_input_report) == DS_INPUT_REPORT_USB_SIZE - 1); + +/* + * Common gamepad buttons across DualShock 3 / 4 and DualSense. + * Note: for device with a touchpad, touchpad button is not included + * as it will be part of the touchpad device. + */ +static const int ps_gamepad_buttons[] = { + BTN_WEST, /* Square */ + BTN_NORTH, /* Triangle */ + BTN_EAST, /* Circle */ + BTN_SOUTH, /* Cross */ + BTN_TL, /* L1 */ + BTN_TR, /* R1 */ + BTN_TL2, /* L2 */ + BTN_TR2, /* R2 */ + BTN_SELECT, /* Create (PS5) / Share (PS4) */ + BTN_START, /* Option */ + BTN_THUMBL, /* L3 */ + BTN_THUMBR, /* R3 */ + BTN_MODE, /* PS Home */ +}; + +static const struct {int x; int y; } ps_gamepad_hat_mapping[] = { + {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, + {0, 0}, +}; + +static struct input_dev *ps_allocate_input_dev(struct hid_device *hdev, const char *name_suffix) +{ + struct input_dev *input_dev; + + input_dev = devm_input_allocate_device(&hdev->dev); + if (!input_dev) + return ERR_PTR(-ENOMEM); + + input_dev->id.bustype = hdev->bus; + input_dev->id.vendor = hdev->vendor; + input_dev->id.product = hdev->product; + input_dev->id.version = hdev->version; + input_dev->uniq = hdev->uniq; + + if (name_suffix) { + input_dev->name = devm_kasprintf(&hdev->dev, GFP_KERNEL, "%s %s", hdev->name, + name_suffix); + if (!input_dev->name) + return ERR_PTR(-ENOMEM); + } else { + input_dev->name = hdev->name; + } + + input_set_drvdata(input_dev, hdev); + + return input_dev; +} + +static struct input_dev *ps_gamepad_create(struct hid_device *hdev) +{ + struct input_dev *gamepad; + unsigned int i; + int ret; + + gamepad = ps_allocate_input_dev(hdev, NULL); + if (IS_ERR(gamepad)) + return ERR_CAST(gamepad); + + input_set_abs_params(gamepad, ABS_X, 0, 255, 0, 0); + input_set_abs_params(gamepad, ABS_Y, 0, 255, 0, 0); + input_set_abs_params(gamepad, ABS_Z, 0, 255, 0, 0); + input_set_abs_params(gamepad, ABS_RX, 0, 255, 0, 0); + input_set_abs_params(gamepad, ABS_RY, 0, 255, 0, 0); + input_set_abs_params(gamepad, ABS_RZ, 0, 255, 0, 0); + + input_set_abs_params(gamepad, ABS_HAT0X, -1, 1, 0, 0); + input_set_abs_params(gamepad, ABS_HAT0Y, -1, 1, 0, 0); + + for (i = 0; i < ARRAY_SIZE(ps_gamepad_buttons); i++) + input_set_capability(gamepad, EV_KEY, ps_gamepad_buttons[i]); + + ret = input_register_device(gamepad); + if (ret) + return ERR_PTR(ret); + + return gamepad; +} + +static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *report, + u8 *data, int size) +{ + struct hid_device *hdev = ps_dev->hdev; + struct dualsense *ds = container_of(ps_dev, struct dualsense, base); + struct dualsense_input_report *ds_report; + uint8_t value; + + /* + * DualSense in USB uses the full HID report for reportID 1, but + * Bluetooth uses a minimal HID report for reportID 1 and reports + * the full report using reportID 49. + */ + if (hdev->bus == BUS_USB && report->id == DS_INPUT_REPORT_USB && + size == DS_INPUT_REPORT_USB_SIZE) { + ds_report = (struct dualsense_input_report *)&data[1]; + } else { + hid_err(hdev, "Unhandled reportID=%d\n", report->id); + return -1; + } + + input_report_abs(ds->gamepad, ABS_X, ds_report->x); + input_report_abs(ds->gamepad, ABS_Y, ds_report->y); + input_report_abs(ds->gamepad, ABS_RX, ds_report->rx); + input_report_abs(ds->gamepad, ABS_RY, ds_report->ry); + input_report_abs(ds->gamepad, ABS_Z, ds_report->z); + input_report_abs(ds->gamepad, ABS_RZ, ds_report->rz); + + value = ds_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH; + if (value > ARRAY_SIZE(ps_gamepad_hat_mapping)) + value = 8; /* center */ + input_report_abs(ds->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x); + input_report_abs(ds->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y); + + input_report_key(ds->gamepad, BTN_WEST, ds_report->buttons[0] & DS_BUTTONS0_SQUARE); + input_report_key(ds->gamepad, BTN_SOUTH, ds_report->buttons[0] & DS_BUTTONS0_CROSS); + input_report_key(ds->gamepad, BTN_EAST, ds_report->buttons[0] & DS_BUTTONS0_CIRCLE); + input_report_key(ds->gamepad, BTN_NORTH, ds_report->buttons[0] & DS_BUTTONS0_TRIANGLE); + input_report_key(ds->gamepad, BTN_TL, ds_report->buttons[1] & DS_BUTTONS1_L1); + input_report_key(ds->gamepad, BTN_TR, ds_report->buttons[1] & DS_BUTTONS1_R1); + input_report_key(ds->gamepad, BTN_TL2, ds_report->buttons[1] & DS_BUTTONS1_L2); + input_report_key(ds->gamepad, BTN_TR2, ds_report->buttons[1] & DS_BUTTONS1_R2); + input_report_key(ds->gamepad, BTN_SELECT, ds_report->buttons[1] & DS_BUTTONS1_CREATE); + input_report_key(ds->gamepad, BTN_START, ds_report->buttons[1] & DS_BUTTONS1_OPTIONS); + input_report_key(ds->gamepad, BTN_THUMBL, ds_report->buttons[1] & DS_BUTTONS1_L3); + input_report_key(ds->gamepad, BTN_THUMBR, ds_report->buttons[1] & DS_BUTTONS1_R3); + input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME); + input_sync(ds->gamepad); + + return 0; +} + +static struct ps_device *dualsense_create(struct hid_device *hdev) +{ + struct dualsense *ds; + int ret; + + ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL); + if (!ds) + return ERR_PTR(-ENOMEM); + + /* + * Patch version to allow userspace to distinguish between + * hid-generic vs hid-playstation axis and button mapping. + */ + hdev->version |= HID_PLAYSTATION_VERSION_PATCH; + + ds->base.hdev = hdev; + ds->base.parse_report = dualsense_parse_report; + hid_set_drvdata(hdev, ds); + + ds->gamepad = ps_gamepad_create(hdev); + if (IS_ERR(ds->gamepad)) { + ret = PTR_ERR(ds->gamepad); + goto err; + } + + return &ds->base; + +err: + return ERR_PTR(ret); +} + +static int ps_raw_event(struct hid_device *hdev, struct hid_report *report, + u8 *data, int size) +{ + struct ps_device *dev = hid_get_drvdata(hdev); + + if (dev && dev->parse_report) + return dev->parse_report(dev, report, data, size); + + return 0; +} + +static int ps_probe(struct hid_device *hdev, const struct hid_device_id *id) +{ + struct ps_device *dev; + int ret; + + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "Parse failed\n"); + return ret; + } + + ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW); + if (ret) { + hid_err(hdev, "Failed to start HID device\n"); + return ret; + } + + ret = hid_hw_open(hdev); + if (ret) { + hid_err(hdev, "Failed to open HID device\n"); + goto err_stop; + } + + if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER) { + dev = dualsense_create(hdev); + if (IS_ERR(dev)) { + hid_err(hdev, "Failed to create dualsense.\n"); + ret = PTR_ERR(dev); + goto err_close; + } + } + + return ret; + +err_close: + hid_hw_close(hdev); +err_stop: + hid_hw_stop(hdev); + return ret; +} + +static void ps_remove(struct hid_device *hdev) +{ + hid_hw_close(hdev); + hid_hw_stop(hdev); +} + +static const struct hid_device_id ps_devices[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) }, + { } +}; +MODULE_DEVICE_TABLE(hid, ps_devices); + +static struct hid_driver ps_driver = { + .name = "playstation", + .id_table = ps_devices, + .probe = ps_probe, + .remove = ps_remove, + .raw_event = ps_raw_event, +}; + +module_hid_driver(ps_driver); + +MODULE_AUTHOR("Sony Interactive Entertainment"); +MODULE_DESCRIPTION("HID Driver for PlayStation peripherals."); +MODULE_LICENSE("GPL"); From 69844f8c10606c77eb2db54739d015049cb2bc32 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:48:57 -0800 Subject: [PATCH 04/28] UPSTREAM: HID: playstation: use DualSense MAC address as unique identifier. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the DualSense MAC address as a unique identifier for the HID device. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: If1c5a6ab0f8ebb1bdaf2528d85f5431a306aca6d (cherry picked from commit b99dcefd78ff13349ce5c8641605d1de3d638ea0) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 58 +++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 7d4171a89322..aca49637ef2f 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -20,6 +20,7 @@ /* Base class for playstation devices. */ struct ps_device { struct hid_device *hdev; + uint8_t mac_address[6]; /* Note: stored in little endian order. */ int (*parse_report)(struct ps_device *dev, struct hid_report *report, u8 *data, int size); }; @@ -27,6 +28,9 @@ struct ps_device { #define DS_INPUT_REPORT_USB 0x01 #define DS_INPUT_REPORT_USB_SIZE 64 +#define DS_FEATURE_REPORT_PAIRING_INFO 0x09 +#define DS_FEATURE_REPORT_PAIRING_INFO_SIZE 20 + /* Button masks for DualSense input report. */ #define DS_BUTTONS0_HAT_SWITCH GENMASK(3, 0) #define DS_BUTTONS0_SQUARE BIT(4) @@ -166,6 +170,53 @@ static struct input_dev *ps_gamepad_create(struct hid_device *hdev) return gamepad; } +static int ps_get_report(struct hid_device *hdev, uint8_t report_id, uint8_t *buf, size_t size) +{ + int ret; + + ret = hid_hw_raw_request(hdev, report_id, buf, size, HID_FEATURE_REPORT, + HID_REQ_GET_REPORT); + if (ret < 0) { + hid_err(hdev, "Failed to retrieve feature with reportID %d: %d\n", report_id, ret); + return ret; + } + + if (ret != size) { + hid_err(hdev, "Invalid byte count transferred, expected %zu got %d\n", size, ret); + return -EINVAL; + } + + if (buf[0] != report_id) { + hid_err(hdev, "Invalid reportID received, expected %d got %d\n", report_id, buf[0]); + return -EINVAL; + } + + return 0; +} + +static int dualsense_get_mac_address(struct dualsense *ds) +{ + uint8_t *buf; + int ret = 0; + + buf = kzalloc(DS_FEATURE_REPORT_PAIRING_INFO_SIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_PAIRING_INFO, buf, + DS_FEATURE_REPORT_PAIRING_INFO_SIZE); + if (ret) { + hid_err(ds->base.hdev, "Failed to retrieve DualSense pairing info: %d\n", ret); + goto err_free; + } + + memcpy(ds->base.mac_address, &buf[1], sizeof(ds->base.mac_address)); + +err_free: + kfree(buf); + return ret; +} + static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *report, u8 *data, int size) { @@ -237,6 +288,13 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) ds->base.parse_report = dualsense_parse_report; hid_set_drvdata(hdev, ds); + ret = dualsense_get_mac_address(ds); + if (ret) { + hid_err(hdev, "Failed to get MAC address from DualSense\n"); + return ERR_PTR(ret); + } + snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address); + ds->gamepad = ps_gamepad_create(hdev); if (IS_ERR(ds->gamepad)) { ret = PTR_ERR(ds->gamepad); From f8e26f21e9a1d806ba522e5ff889203ee7b89601 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:48:58 -0800 Subject: [PATCH 05/28] UPSTREAM: HID: playstation: add DualSense battery support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Report DualSense battery status information through power_supply class. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I161c0ebbb47c4a58bfed75748e23ca8fd214af53 (cherry picked from commit d30bca44809eb1d2937e59d3d09694f40613070d) Signed-off-by: Farid Chahla --- drivers/hid/Kconfig | 1 + drivers/hid/hid-playstation.c | 140 +++++++++++++++++++++++++++++++++- 2 files changed, 138 insertions(+), 3 deletions(-) diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index c8c64526430b..15e62813ad73 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -849,6 +849,7 @@ config HID_PLANTRONICS config HID_PLAYSTATION tristate "PlayStation HID Driver" depends on HID + select POWER_SUPPLY help Provides support for Sony PS5 controllers including support for its special functionalities e.g. touchpad, lights and motion diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index aca49637ef2f..3bb5091be308 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -20,6 +20,13 @@ /* Base class for playstation devices. */ struct ps_device { struct hid_device *hdev; + spinlock_t lock; + + struct power_supply_desc battery_desc; + struct power_supply *battery; + uint8_t battery_capacity; + int battery_status; + uint8_t mac_address[6]; /* Note: stored in little endian order. */ int (*parse_report)(struct ps_device *dev, struct hid_report *report, u8 *data, int size); @@ -48,6 +55,11 @@ struct ps_device { #define DS_BUTTONS2_PS_HOME BIT(0) #define DS_BUTTONS2_TOUCHPAD BIT(1) +/* Status field of DualSense input report. */ +#define DS_STATUS_BATTERY_CAPACITY GENMASK(3, 0) +#define DS_STATUS_CHARGING GENMASK(7, 4) +#define DS_STATUS_CHARGING_SHIFT 4 + struct dualsense { struct ps_device base; struct input_dev *gamepad; @@ -140,6 +152,81 @@ static struct input_dev *ps_allocate_input_dev(struct hid_device *hdev, const ch return input_dev; } +static enum power_supply_property ps_power_supply_props[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_SCOPE, +}; + +static int ps_battery_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + struct ps_device *dev = power_supply_get_drvdata(psy); + uint8_t battery_capacity; + int battery_status; + unsigned long flags; + int ret; + + spin_lock_irqsave(&dev->lock, flags); + battery_capacity = dev->battery_capacity; + battery_status = dev->battery_status; + spin_unlock_irqrestore(&dev->lock, flags); + + switch (psp) { + case POWER_SUPPLY_PROP_STATUS: + val->intval = battery_status; + break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval = 1; + break; + case POWER_SUPPLY_PROP_CAPACITY: + val->intval = battery_capacity; + break; + case POWER_SUPPLY_PROP_SCOPE: + val->intval = POWER_SUPPLY_SCOPE_DEVICE; + break; + default: + ret = -EINVAL; + break; + } + + return 0; +} + +static int ps_device_register_battery(struct ps_device *dev) +{ + struct power_supply *battery; + struct power_supply_config battery_cfg = { .drv_data = dev }; + int ret; + + dev->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; + dev->battery_desc.properties = ps_power_supply_props; + dev->battery_desc.num_properties = ARRAY_SIZE(ps_power_supply_props); + dev->battery_desc.get_property = ps_battery_get_property; + dev->battery_desc.name = devm_kasprintf(&dev->hdev->dev, GFP_KERNEL, + "ps-controller-battery-%pMR", dev->mac_address); + if (!dev->battery_desc.name) + return -ENOMEM; + + battery = devm_power_supply_register(&dev->hdev->dev, &dev->battery_desc, &battery_cfg); + if (IS_ERR(battery)) { + ret = PTR_ERR(battery); + hid_err(dev->hdev, "Unable to register battery device: %d\n", ret); + return ret; + } + dev->battery = battery; + + ret = power_supply_powers(dev->battery, &dev->hdev->dev); + if (ret) { + hid_err(dev->hdev, "Unable to activate battery device: %d\n", ret); + return ret; + } + + return 0; +} + static struct input_dev *ps_gamepad_create(struct hid_device *hdev) { struct input_dev *gamepad; @@ -223,7 +310,9 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r struct hid_device *hdev = ps_dev->hdev; struct dualsense *ds = container_of(ps_dev, struct dualsense, base); struct dualsense_input_report *ds_report; - uint8_t value; + uint8_t battery_data, battery_capacity, charging_status, value; + int battery_status; + unsigned long flags; /* * DualSense in USB uses the full HID report for reportID 1, but @@ -266,12 +355,49 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME); input_sync(ds->gamepad); + battery_data = ds_report->status & DS_STATUS_BATTERY_CAPACITY; + charging_status = (ds_report->status & DS_STATUS_CHARGING) >> DS_STATUS_CHARGING_SHIFT; + + switch (charging_status) { + case 0x0: + /* + * Each unit of battery data corresponds to 10% + * 0 = 0-9%, 1 = 10-19%, .. and 10 = 100% + */ + battery_capacity = min(battery_data * 10 + 5, 100); + battery_status = POWER_SUPPLY_STATUS_DISCHARGING; + break; + case 0x1: + battery_capacity = min(battery_data * 10 + 5, 100); + battery_status = POWER_SUPPLY_STATUS_CHARGING; + break; + case 0x2: + battery_capacity = 100; + battery_status = POWER_SUPPLY_STATUS_FULL; + break; + case 0xa: /* voltage or temperature out of range */ + case 0xb: /* temperature error */ + battery_capacity = 0; + battery_status = POWER_SUPPLY_STATUS_NOT_CHARGING; + break; + case 0xf: /* charging error */ + default: + battery_capacity = 0; + battery_status = POWER_SUPPLY_STATUS_UNKNOWN; + } + + spin_lock_irqsave(&ps_dev->lock, flags); + ps_dev->battery_capacity = battery_capacity; + ps_dev->battery_status = battery_status; + spin_unlock_irqrestore(&ps_dev->lock, flags); + return 0; } static struct ps_device *dualsense_create(struct hid_device *hdev) { struct dualsense *ds; + struct ps_device *ps_dev; int ret; ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL); @@ -284,8 +410,12 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) */ hdev->version |= HID_PLAYSTATION_VERSION_PATCH; - ds->base.hdev = hdev; - ds->base.parse_report = dualsense_parse_report; + ps_dev = &ds->base; + ps_dev->hdev = hdev; + spin_lock_init(&ps_dev->lock); + ps_dev->battery_capacity = 100; /* initial value until parse_report. */ + ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN; + ps_dev->parse_report = dualsense_parse_report; hid_set_drvdata(hdev, ds); ret = dualsense_get_mac_address(ds); @@ -301,6 +431,10 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) goto err; } + ret = ps_device_register_battery(ps_dev); + if (ret) + goto err; + return &ds->base; err: From bd87612ff73be500dd6755248e3d1cde6990d668 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:48:59 -0800 Subject: [PATCH 06/28] UPSTREAM: HID: playstation: add DualSense touchpad support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement support for DualSense touchpad as a separate input device. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I59b1d77b1d778366d05f5a929bbb205127914304 (cherry picked from commit f6bb05fcb2a10ff26ac5af1c29066d42019dc464) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 66 +++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 3bb5091be308..30ae9434240c 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -60,9 +60,21 @@ struct ps_device { #define DS_STATUS_CHARGING GENMASK(7, 4) #define DS_STATUS_CHARGING_SHIFT 4 +/* + * Status of a DualSense touch point contact. + * Contact IDs, with highest bit set are 'inactive' + * and any associated data is then invalid. + */ +#define DS_TOUCH_POINT_INACTIVE BIT(7) + +/* DualSense hardware limits */ +#define DS_TOUCHPAD_WIDTH 1920 +#define DS_TOUCHPAD_HEIGHT 1080 + struct dualsense { struct ps_device base; struct input_dev *gamepad; + struct input_dev *touchpad; }; struct dualsense_touch_point { @@ -281,6 +293,34 @@ static int ps_get_report(struct hid_device *hdev, uint8_t report_id, uint8_t *bu return 0; } +static struct input_dev *ps_touchpad_create(struct hid_device *hdev, int width, int height, + unsigned int num_contacts) +{ + struct input_dev *touchpad; + int ret; + + touchpad = ps_allocate_input_dev(hdev, "Touchpad"); + if (IS_ERR(touchpad)) + return ERR_CAST(touchpad); + + /* Map button underneath touchpad to BTN_LEFT. */ + input_set_capability(touchpad, EV_KEY, BTN_LEFT); + __set_bit(INPUT_PROP_BUTTONPAD, touchpad->propbit); + + input_set_abs_params(touchpad, ABS_MT_POSITION_X, 0, width - 1, 0, 0); + input_set_abs_params(touchpad, ABS_MT_POSITION_Y, 0, height - 1, 0, 0); + + ret = input_mt_init_slots(touchpad, num_contacts, INPUT_MT_POINTER); + if (ret) + return ERR_PTR(ret); + + ret = input_register_device(touchpad); + if (ret) + return ERR_PTR(ret); + + return touchpad; +} + static int dualsense_get_mac_address(struct dualsense *ds) { uint8_t *buf; @@ -313,6 +353,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r uint8_t battery_data, battery_capacity, charging_status, value; int battery_status; unsigned long flags; + int i; /* * DualSense in USB uses the full HID report for reportID 1, but @@ -355,6 +396,25 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME); input_sync(ds->gamepad); + for (i = 0; i < ARRAY_SIZE(ds_report->points); i++) { + struct dualsense_touch_point *point = &ds_report->points[i]; + bool active = (point->contact & DS_TOUCH_POINT_INACTIVE) ? false : true; + + input_mt_slot(ds->touchpad, i); + input_mt_report_slot_state(ds->touchpad, MT_TOOL_FINGER, active); + + if (active) { + int x = (point->x_hi << 8) | point->x_lo; + int y = (point->y_hi << 4) | point->y_lo; + + input_report_abs(ds->touchpad, ABS_MT_POSITION_X, x); + input_report_abs(ds->touchpad, ABS_MT_POSITION_Y, y); + } + } + input_mt_sync_frame(ds->touchpad); + input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD); + input_sync(ds->touchpad); + battery_data = ds_report->status & DS_STATUS_BATTERY_CAPACITY; charging_status = (ds_report->status & DS_STATUS_CHARGING) >> DS_STATUS_CHARGING_SHIFT; @@ -431,6 +491,12 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) goto err; } + ds->touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2); + if (IS_ERR(ds->touchpad)) { + ret = PTR_ERR(ds->touchpad); + goto err; + } + ret = ps_device_register_battery(ps_dev); if (ret) goto err; From a4a27b5d2a2950b50bbba44f4f96d0858abcfb6f Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:49:00 -0800 Subject: [PATCH 07/28] UPSTREAM: HID: playstation: add DualSense accelerometer and gyroscope support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DualSense features an accelerometer and gyroscope. The data is embedded into the main HID input reports. Expose both sensors through through a separate evdev node. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I27909fb116a56be52cc12336dc34ca8b4189423e (cherry picked from commit 402987c5d98a9dd0d611cfe3af5e5bdc13d122d0) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 203 ++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 30ae9434240c..b09ec604cd27 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -32,9 +32,19 @@ struct ps_device { int (*parse_report)(struct ps_device *dev, struct hid_report *report, u8 *data, int size); }; +/* Calibration data for playstation motion sensors. */ +struct ps_calibration_data { + int abs_code; + short bias; + int sens_numer; + int sens_denom; +}; + #define DS_INPUT_REPORT_USB 0x01 #define DS_INPUT_REPORT_USB_SIZE 64 +#define DS_FEATURE_REPORT_CALIBRATION 0x05 +#define DS_FEATURE_REPORT_CALIBRATION_SIZE 41 #define DS_FEATURE_REPORT_PAIRING_INFO 0x09 #define DS_FEATURE_REPORT_PAIRING_INFO_SIZE 20 @@ -68,13 +78,27 @@ struct ps_device { #define DS_TOUCH_POINT_INACTIVE BIT(7) /* DualSense hardware limits */ +#define DS_ACC_RES_PER_G 8192 +#define DS_ACC_RANGE (4*DS_ACC_RES_PER_G) +#define DS_GYRO_RES_PER_DEG_S 1024 +#define DS_GYRO_RANGE (2048*DS_GYRO_RES_PER_DEG_S) #define DS_TOUCHPAD_WIDTH 1920 #define DS_TOUCHPAD_HEIGHT 1080 struct dualsense { struct ps_device base; struct input_dev *gamepad; + struct input_dev *sensors; struct input_dev *touchpad; + + /* Calibration data for accelerometer and gyroscope. */ + struct ps_calibration_data accel_calib_data[3]; + struct ps_calibration_data gyro_calib_data[3]; + + /* Timestamp for sensor data */ + bool sensor_timestamp_initialized; + uint32_t prev_sensor_timestamp; + uint32_t sensor_timestamp_us; }; struct dualsense_touch_point { @@ -293,6 +317,43 @@ static int ps_get_report(struct hid_device *hdev, uint8_t report_id, uint8_t *bu return 0; } +static struct input_dev *ps_sensors_create(struct hid_device *hdev, int accel_range, int accel_res, + int gyro_range, int gyro_res) +{ + struct input_dev *sensors; + int ret; + + sensors = ps_allocate_input_dev(hdev, "Motion Sensors"); + if (IS_ERR(sensors)) + return ERR_CAST(sensors); + + __set_bit(INPUT_PROP_ACCELEROMETER, sensors->propbit); + __set_bit(EV_MSC, sensors->evbit); + __set_bit(MSC_TIMESTAMP, sensors->mscbit); + + /* Accelerometer */ + input_set_abs_params(sensors, ABS_X, -accel_range, accel_range, 16, 0); + input_set_abs_params(sensors, ABS_Y, -accel_range, accel_range, 16, 0); + input_set_abs_params(sensors, ABS_Z, -accel_range, accel_range, 16, 0); + input_abs_set_res(sensors, ABS_X, accel_res); + input_abs_set_res(sensors, ABS_Y, accel_res); + input_abs_set_res(sensors, ABS_Z, accel_res); + + /* Gyroscope */ + input_set_abs_params(sensors, ABS_RX, -gyro_range, gyro_range, 16, 0); + input_set_abs_params(sensors, ABS_RY, -gyro_range, gyro_range, 16, 0); + input_set_abs_params(sensors, ABS_RZ, -gyro_range, gyro_range, 16, 0); + input_abs_set_res(sensors, ABS_RX, gyro_res); + input_abs_set_res(sensors, ABS_RY, gyro_res); + input_abs_set_res(sensors, ABS_RZ, gyro_res); + + ret = input_register_device(sensors); + if (ret) + return ERR_PTR(ret); + + return sensors; +} + static struct input_dev *ps_touchpad_create(struct hid_device *hdev, int width, int height, unsigned int num_contacts) { @@ -321,6 +382,96 @@ static struct input_dev *ps_touchpad_create(struct hid_device *hdev, int width, return touchpad; } +static int dualsense_get_calibration_data(struct dualsense *ds) +{ + short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus; + short gyro_yaw_bias, gyro_yaw_plus, gyro_yaw_minus; + short gyro_roll_bias, gyro_roll_plus, gyro_roll_minus; + short gyro_speed_plus, gyro_speed_minus; + short acc_x_plus, acc_x_minus; + short acc_y_plus, acc_y_minus; + short acc_z_plus, acc_z_minus; + int speed_2x; + int range_2g; + int ret = 0; + uint8_t *buf; + + buf = kzalloc(DS_FEATURE_REPORT_CALIBRATION_SIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_CALIBRATION, buf, + DS_FEATURE_REPORT_CALIBRATION_SIZE); + if (ret) { + hid_err(ds->base.hdev, "Failed to retrieve DualSense calibration info: %d\n", ret); + goto err_free; + } + + gyro_pitch_bias = get_unaligned_le16(&buf[1]); + gyro_yaw_bias = get_unaligned_le16(&buf[3]); + gyro_roll_bias = get_unaligned_le16(&buf[5]); + gyro_pitch_plus = get_unaligned_le16(&buf[7]); + gyro_pitch_minus = get_unaligned_le16(&buf[9]); + gyro_yaw_plus = get_unaligned_le16(&buf[11]); + gyro_yaw_minus = get_unaligned_le16(&buf[13]); + gyro_roll_plus = get_unaligned_le16(&buf[15]); + gyro_roll_minus = get_unaligned_le16(&buf[17]); + gyro_speed_plus = get_unaligned_le16(&buf[19]); + gyro_speed_minus = get_unaligned_le16(&buf[21]); + acc_x_plus = get_unaligned_le16(&buf[23]); + acc_x_minus = get_unaligned_le16(&buf[25]); + acc_y_plus = get_unaligned_le16(&buf[27]); + acc_y_minus = get_unaligned_le16(&buf[29]); + acc_z_plus = get_unaligned_le16(&buf[31]); + acc_z_minus = get_unaligned_le16(&buf[33]); + + /* + * Set gyroscope calibration and normalization parameters. + * Data values will be normalized to 1/DS_GYRO_RES_PER_DEG_S degree/s. + */ + speed_2x = (gyro_speed_plus + gyro_speed_minus); + ds->gyro_calib_data[0].abs_code = ABS_RX; + ds->gyro_calib_data[0].bias = gyro_pitch_bias; + ds->gyro_calib_data[0].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; + ds->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus; + + ds->gyro_calib_data[1].abs_code = ABS_RY; + ds->gyro_calib_data[1].bias = gyro_yaw_bias; + ds->gyro_calib_data[1].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; + ds->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus; + + ds->gyro_calib_data[2].abs_code = ABS_RZ; + ds->gyro_calib_data[2].bias = gyro_roll_bias; + ds->gyro_calib_data[2].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; + ds->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus; + + /* + * Set accelerometer calibration and normalization parameters. + * Data values will be normalized to 1/DS_ACC_RES_PER_G g. + */ + range_2g = acc_x_plus - acc_x_minus; + ds->accel_calib_data[0].abs_code = ABS_X; + ds->accel_calib_data[0].bias = acc_x_plus - range_2g / 2; + ds->accel_calib_data[0].sens_numer = 2*DS_ACC_RES_PER_G; + ds->accel_calib_data[0].sens_denom = range_2g; + + range_2g = acc_y_plus - acc_y_minus; + ds->accel_calib_data[1].abs_code = ABS_Y; + ds->accel_calib_data[1].bias = acc_y_plus - range_2g / 2; + ds->accel_calib_data[1].sens_numer = 2*DS_ACC_RES_PER_G; + ds->accel_calib_data[1].sens_denom = range_2g; + + range_2g = acc_z_plus - acc_z_minus; + ds->accel_calib_data[2].abs_code = ABS_Z; + ds->accel_calib_data[2].bias = acc_z_plus - range_2g / 2; + ds->accel_calib_data[2].sens_numer = 2*DS_ACC_RES_PER_G; + ds->accel_calib_data[2].sens_denom = range_2g; + +err_free: + kfree(buf); + return ret; +} + static int dualsense_get_mac_address(struct dualsense *ds) { uint8_t *buf; @@ -352,6 +503,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r struct dualsense_input_report *ds_report; uint8_t battery_data, battery_capacity, charging_status, value; int battery_status; + uint32_t sensor_timestamp; unsigned long flags; int i; @@ -396,6 +548,44 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME); input_sync(ds->gamepad); + /* Parse and calibrate gyroscope data. */ + for (i = 0; i < ARRAY_SIZE(ds_report->gyro); i++) { + int raw_data = (short)le16_to_cpu(ds_report->gyro[i]); + int calib_data = mult_frac(ds->gyro_calib_data[i].sens_numer, + raw_data - ds->gyro_calib_data[i].bias, + ds->gyro_calib_data[i].sens_denom); + + input_report_abs(ds->sensors, ds->gyro_calib_data[i].abs_code, calib_data); + } + + /* Parse and calibrate accelerometer data. */ + for (i = 0; i < ARRAY_SIZE(ds_report->accel); i++) { + int raw_data = (short)le16_to_cpu(ds_report->accel[i]); + int calib_data = mult_frac(ds->accel_calib_data[i].sens_numer, + raw_data - ds->accel_calib_data[i].bias, + ds->accel_calib_data[i].sens_denom); + + input_report_abs(ds->sensors, ds->accel_calib_data[i].abs_code, calib_data); + } + + /* Convert timestamp (in 0.33us unit) to timestamp_us */ + sensor_timestamp = le32_to_cpu(ds_report->sensor_timestamp); + if (!ds->sensor_timestamp_initialized) { + ds->sensor_timestamp_us = DIV_ROUND_CLOSEST(sensor_timestamp, 3); + ds->sensor_timestamp_initialized = true; + } else { + uint32_t delta; + + if (ds->prev_sensor_timestamp > sensor_timestamp) + delta = (U32_MAX - ds->prev_sensor_timestamp + sensor_timestamp + 1); + else + delta = sensor_timestamp - ds->prev_sensor_timestamp; + ds->sensor_timestamp_us += DIV_ROUND_CLOSEST(delta, 3); + } + ds->prev_sensor_timestamp = sensor_timestamp; + input_event(ds->sensors, EV_MSC, MSC_TIMESTAMP, ds->sensor_timestamp_us); + input_sync(ds->sensors); + for (i = 0; i < ARRAY_SIZE(ds_report->points); i++) { struct dualsense_touch_point *point = &ds_report->points[i]; bool active = (point->contact & DS_TOUCH_POINT_INACTIVE) ? false : true; @@ -485,12 +675,25 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) } snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address); + ret = dualsense_get_calibration_data(ds); + if (ret) { + hid_err(hdev, "Failed to get calibration data from DualSense\n"); + goto err; + } + ds->gamepad = ps_gamepad_create(hdev); if (IS_ERR(ds->gamepad)) { ret = PTR_ERR(ds->gamepad); goto err; } + ds->sensors = ps_sensors_create(hdev, DS_ACC_RANGE, DS_ACC_RES_PER_G, + DS_GYRO_RANGE, DS_GYRO_RES_PER_DEG_S); + if (IS_ERR(ds->sensors)) { + ret = PTR_ERR(ds->sensors); + goto err; + } + ds->touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2); if (IS_ERR(ds->touchpad)) { ret = PTR_ERR(ds->touchpad); From 3dd150cf1641b5a7cf0db6859bcbd9ca3e2a2237 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:49:01 -0800 Subject: [PATCH 08/28] UPSTREAM: HID: playstation: track devices in list. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Track devices in a list, so we can detect when a device is connected twice when using Bluetooth and USB. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: Ibfa0e5b3821891240545f484f1ceb59b211cb6fb (cherry picked from commit 53f04e83577c5e146eeee1a671efeb58db14afd1) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 46 +++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index b09ec604cd27..20fe29fc61c0 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -15,10 +15,15 @@ #include "hid-ids.h" +/* List of connected playstation devices. */ +static DEFINE_MUTEX(ps_devices_lock); +static LIST_HEAD(ps_devices_list); + #define HID_PLAYSTATION_VERSION_PATCH 0x8000 /* Base class for playstation devices. */ struct ps_device { + struct list_head list; struct hid_device *hdev; spinlock_t lock; @@ -160,6 +165,38 @@ static const struct {int x; int y; } ps_gamepad_hat_mapping[] = { {0, 0}, }; +/* + * Add a new ps_device to ps_devices if it doesn't exist. + * Return error on duplicate device, which can happen if the same + * device is connected using both Bluetooth and USB. + */ +static int ps_devices_list_add(struct ps_device *dev) +{ + struct ps_device *entry; + + mutex_lock(&ps_devices_lock); + list_for_each_entry(entry, &ps_devices_list, list) { + if (!memcmp(entry->mac_address, dev->mac_address, sizeof(dev->mac_address))) { + hid_err(dev->hdev, "Duplicate device found for MAC address %pMR.\n", + dev->mac_address); + mutex_unlock(&ps_devices_lock); + return -EEXIST; + } + } + + list_add_tail(&dev->list, &ps_devices_list); + mutex_unlock(&ps_devices_lock); + return 0; +} + +static int ps_devices_list_remove(struct ps_device *dev) +{ + mutex_lock(&ps_devices_lock); + list_del(&dev->list); + mutex_unlock(&ps_devices_lock); + return 0; +} + static struct input_dev *ps_allocate_input_dev(struct hid_device *hdev, const char *name_suffix) { struct input_dev *input_dev; @@ -675,6 +712,10 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) } snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address); + ret = ps_devices_list_add(ps_dev); + if (ret) + return ERR_PTR(ret); + ret = dualsense_get_calibration_data(ds); if (ret) { hid_err(hdev, "Failed to get calibration data from DualSense\n"); @@ -707,6 +748,7 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) return &ds->base; err: + ps_devices_list_remove(ps_dev); return ERR_PTR(ret); } @@ -764,6 +806,10 @@ err_stop: static void ps_remove(struct hid_device *hdev) { + struct ps_device *dev = hid_get_drvdata(hdev); + + ps_devices_list_remove(dev); + hid_hw_close(hdev); hid_hw_stop(hdev); } From ea8ed83665e023d437ab803df6beb436a9f70c50 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:49:02 -0800 Subject: [PATCH 09/28] UPSTREAM: HID: playstation: add DualSense Bluetooth support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds support for the DualSense when operating in Bluetooth mode. The device has the same behavior as the DualShock 4 in that by default it sends a limited input report (0x1), but after requesting calibration data, it switches to an extended input report (report 49), which adds data for touchpad, motion sensors, battery and more. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I6ba3eb018f9938b71bb63cb70b26e4acdcfb788a (cherry picked from commit 799b2b533a299ba5b64ddd22639836c2a5eaee31) Signed-off-by: Farid Chahla --- drivers/hid/Kconfig | 1 + drivers/hid/hid-playstation.c | 41 +++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 15e62813ad73..206661d27c1a 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -849,6 +849,7 @@ config HID_PLANTRONICS config HID_PLAYSTATION tristate "PlayStation HID Driver" depends on HID + select CRC32 select POWER_SUPPLY help Provides support for Sony PS5 controllers including support for diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 20fe29fc61c0..a4ef9fae7a36 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -6,6 +6,7 @@ */ #include +#include #include #include #include @@ -45,8 +46,14 @@ struct ps_calibration_data { int sens_denom; }; +/* Seed values for DualShock4 / DualSense CRC32 for different report types. */ +#define PS_INPUT_CRC32_SEED 0xA1 +#define PS_FEATURE_CRC32_SEED 0xA3 + #define DS_INPUT_REPORT_USB 0x01 #define DS_INPUT_REPORT_USB_SIZE 64 +#define DS_INPUT_REPORT_BT 0x31 +#define DS_INPUT_REPORT_BT_SIZE 78 #define DS_FEATURE_REPORT_CALIBRATION 0x05 #define DS_FEATURE_REPORT_CALIBRATION_SIZE 41 @@ -300,6 +307,17 @@ static int ps_device_register_battery(struct ps_device *dev) return 0; } +/* Compute crc32 of HID data and compare against expected CRC. */ +static bool ps_check_crc32(uint8_t seed, uint8_t *data, size_t len, uint32_t report_crc) +{ + uint32_t crc; + + crc = crc32_le(0xFFFFFFFF, &seed, 1); + crc = ~crc32_le(crc, data, len); + + return crc == report_crc; +} + static struct input_dev *ps_gamepad_create(struct hid_device *hdev) { struct input_dev *gamepad; @@ -351,6 +369,17 @@ static int ps_get_report(struct hid_device *hdev, uint8_t report_id, uint8_t *bu return -EINVAL; } + if (hdev->bus == BUS_BLUETOOTH) { + /* Last 4 bytes contains crc32. */ + uint8_t crc_offset = size - 4; + uint32_t report_crc = get_unaligned_le32(&buf[crc_offset]); + + if (!ps_check_crc32(PS_FEATURE_CRC32_SEED, buf, crc_offset, report_crc)) { + hid_err(hdev, "CRC check failed for reportID=%d\n", report_id); + return -EILSEQ; + } + } + return 0; } @@ -552,6 +581,17 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r if (hdev->bus == BUS_USB && report->id == DS_INPUT_REPORT_USB && size == DS_INPUT_REPORT_USB_SIZE) { ds_report = (struct dualsense_input_report *)&data[1]; + } else if (hdev->bus == BUS_BLUETOOTH && report->id == DS_INPUT_REPORT_BT && + size == DS_INPUT_REPORT_BT_SIZE) { + /* Last 4 bytes of input report contain crc32 */ + uint32_t report_crc = get_unaligned_le32(&data[size - 4]); + + if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) { + hid_err(hdev, "DualSense input CRC's check failed\n"); + return -EILSEQ; + } + + ds_report = (struct dualsense_input_report *)&data[2]; } else { hid_err(hdev, "Unhandled reportID=%d\n", report->id); return -1; @@ -815,6 +855,7 @@ static void ps_remove(struct hid_device *hdev) } static const struct hid_device_id ps_devices[] = { + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) }, { } }; From 8d5f8d63af2d4ca384db51123423940209de4f61 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:49:03 -0800 Subject: [PATCH 10/28] UPSTREAM: HID: playstation: add DualSense classic rumble support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DualSense features a haptics system based on voicecoil motors, which requires PCM data (or special HID packets using Bluetooth). There is no appropriate API yet in the Linux kernel to expose these. The controller also provides a classic rumble feature for backwards compatibility. Expose this classic rumble feature using the FF framework. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: Ia4d664c4a1dedbadce6baf54962595616265eb4f (cherry picked from commit 51151098d7ab832f2a8b8f5c51fe224a9c98fdd5) Signed-off-by: Farid Chahla --- drivers/hid/Kconfig | 8 ++ drivers/hid/hid-playstation.c | 208 +++++++++++++++++++++++++++++++++- 2 files changed, 214 insertions(+), 2 deletions(-) diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 206661d27c1a..542158d9feb8 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -856,6 +856,14 @@ config HID_PLAYSTATION its special functionalities e.g. touchpad, lights and motion sensors. +config PLAYSTATION_FF + bool "PlayStation force feedback support" + depends on HID_PLAYSTATION + select INPUT_FF_MEMLESS + help + Say Y here if you would like to enable force feedback support for + PlayStation game controllers. + config HID_PRIMAX tristate "Primax non-fully HID-compliant devices" depends on HID diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index a4ef9fae7a36..64193fdeaa0d 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -48,12 +48,17 @@ struct ps_calibration_data { /* Seed values for DualShock4 / DualSense CRC32 for different report types. */ #define PS_INPUT_CRC32_SEED 0xA1 +#define PS_OUTPUT_CRC32_SEED 0xA2 #define PS_FEATURE_CRC32_SEED 0xA3 #define DS_INPUT_REPORT_USB 0x01 #define DS_INPUT_REPORT_USB_SIZE 64 #define DS_INPUT_REPORT_BT 0x31 #define DS_INPUT_REPORT_BT_SIZE 78 +#define DS_OUTPUT_REPORT_USB 0x02 +#define DS_OUTPUT_REPORT_USB_SIZE 63 +#define DS_OUTPUT_REPORT_BT 0x31 +#define DS_OUTPUT_REPORT_BT_SIZE 78 #define DS_FEATURE_REPORT_CALIBRATION 0x05 #define DS_FEATURE_REPORT_CALIBRATION_SIZE 41 @@ -89,6 +94,12 @@ struct ps_calibration_data { */ #define DS_TOUCH_POINT_INACTIVE BIT(7) + /* Magic value required in tag field of Bluetooth output report. */ +#define DS_OUTPUT_TAG 0x10 +/* Flags for DualSense output report. */ +#define DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION BIT(0) +#define DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT BIT(1) + /* DualSense hardware limits */ #define DS_ACC_RES_PER_G 8192 #define DS_ACC_RANGE (4*DS_ACC_RES_PER_G) @@ -111,6 +122,15 @@ struct dualsense { bool sensor_timestamp_initialized; uint32_t prev_sensor_timestamp; uint32_t sensor_timestamp_us; + + /* Compatible rumble state */ + bool update_rumble; + uint8_t motor_left; + uint8_t motor_right; + + struct work_struct output_worker; + void *output_report_dmabuf; + uint8_t output_seq; /* Sequence number for output report. */ }; struct dualsense_touch_point { @@ -146,6 +166,68 @@ struct dualsense_input_report { /* Common input report size shared equals the size of the USB report minus 1 byte for ReportID. */ static_assert(sizeof(struct dualsense_input_report) == DS_INPUT_REPORT_USB_SIZE - 1); +/* Common data between DualSense BT/USB main output report. */ +struct dualsense_output_report_common { + uint8_t valid_flag0; + uint8_t valid_flag1; + + /* For DualShock 4 compatibility mode. */ + uint8_t motor_right; + uint8_t motor_left; + + /* Audio controls */ + uint8_t reserved[4]; + uint8_t mute_button_led; + + uint8_t power_save_control; + uint8_t reserved2[28]; + + /* LEDs and lightbar */ + uint8_t valid_flag2; + uint8_t reserved3[2]; + uint8_t lightbar_setup; + uint8_t led_brightness; + uint8_t player_leds; + uint8_t lightbar_red; + uint8_t lightbar_green; + uint8_t lightbar_blue; +} __packed; +static_assert(sizeof(struct dualsense_output_report_common) == 47); + +struct dualsense_output_report_bt { + uint8_t report_id; /* 0x31 */ + uint8_t seq_tag; + uint8_t tag; + struct dualsense_output_report_common common; + uint8_t reserved[24]; + __le32 crc32; +} __packed; +static_assert(sizeof(struct dualsense_output_report_bt) == DS_OUTPUT_REPORT_BT_SIZE); + +struct dualsense_output_report_usb { + uint8_t report_id; /* 0x02 */ + struct dualsense_output_report_common common; + uint8_t reserved[15]; +} __packed; +static_assert(sizeof(struct dualsense_output_report_usb) == DS_OUTPUT_REPORT_USB_SIZE); + +/* + * The DualSense has a main output report used to control most features. It is + * largely the same between Bluetooth and USB except for different headers and CRC. + * This structure hide the differences between the two to simplify sending output reports. + */ +struct dualsense_output_report { + uint8_t *data; /* Start of data */ + uint8_t len; /* Size of output report */ + + /* Points to Bluetooth data payload in case for a Bluetooth report else NULL. */ + struct dualsense_output_report_bt *bt; + /* Points to USB data payload in case for a USB report else NULL. */ + struct dualsense_output_report_usb *usb; + /* Points to common section of report, so past any headers. */ + struct dualsense_output_report_common *common; +}; + /* * Common gamepad buttons across DualShock 3 / 4 and DualSense. * Note: for device with a touchpad, touchpad button is not included @@ -318,7 +400,8 @@ static bool ps_check_crc32(uint8_t seed, uint8_t *data, size_t len, uint32_t rep return crc == report_crc; } -static struct input_dev *ps_gamepad_create(struct hid_device *hdev) +static struct input_dev *ps_gamepad_create(struct hid_device *hdev, + int (*play_effect)(struct input_dev *, void *, struct ff_effect *)) { struct input_dev *gamepad; unsigned int i; @@ -341,6 +424,13 @@ static struct input_dev *ps_gamepad_create(struct hid_device *hdev) for (i = 0; i < ARRAY_SIZE(ps_gamepad_buttons); i++) input_set_capability(gamepad, EV_KEY, ps_gamepad_buttons[i]); +#if IS_ENABLED(CONFIG_PLAYSTATION_FF) + if (play_effect) { + input_set_capability(gamepad, EV_FF, FF_RUMBLE); + input_ff_create_memless(gamepad, NULL, play_effect); + } +#endif + ret = input_register_device(gamepad); if (ret) return ERR_PTR(ret); @@ -561,6 +651,94 @@ err_free: return ret; } +static void dualsense_init_output_report(struct dualsense *ds, struct dualsense_output_report *rp, + void *buf) +{ + struct hid_device *hdev = ds->base.hdev; + + if (hdev->bus == BUS_BLUETOOTH) { + struct dualsense_output_report_bt *bt = buf; + + memset(bt, 0, sizeof(*bt)); + bt->report_id = DS_OUTPUT_REPORT_BT; + bt->tag = DS_OUTPUT_TAG; /* Tag must be set. Exact meaning is unclear. */ + + /* + * Highest 4-bit is a sequence number, which needs to be increased + * every report. Lowest 4-bit is tag and can be zero for now. + */ + bt->seq_tag = (ds->output_seq << 4) | 0x0; + if (++ds->output_seq == 16) + ds->output_seq = 0; + + rp->data = buf; + rp->len = sizeof(*bt); + rp->bt = bt; + rp->usb = NULL; + rp->common = &bt->common; + } else { /* USB */ + struct dualsense_output_report_usb *usb = buf; + + memset(usb, 0, sizeof(*usb)); + usb->report_id = DS_OUTPUT_REPORT_USB; + + rp->data = buf; + rp->len = sizeof(*usb); + rp->bt = NULL; + rp->usb = usb; + rp->common = &usb->common; + } +} + +/* + * Helper function to send DualSense output reports. Applies a CRC at the end of a report + * for Bluetooth reports. + */ +static void dualsense_send_output_report(struct dualsense *ds, + struct dualsense_output_report *report) +{ + struct hid_device *hdev = ds->base.hdev; + + /* Bluetooth packets need to be signed with a CRC in the last 4 bytes. */ + if (report->bt) { + uint32_t crc; + uint8_t seed = PS_OUTPUT_CRC32_SEED; + + crc = crc32_le(0xFFFFFFFF, &seed, 1); + crc = ~crc32_le(crc, report->data, report->len - 4); + + report->bt->crc32 = cpu_to_le32(crc); + } + + hid_hw_output_report(hdev, report->data, report->len); +} + +static void dualsense_output_worker(struct work_struct *work) +{ + struct dualsense *ds = container_of(work, struct dualsense, output_worker); + struct dualsense_output_report report; + struct dualsense_output_report_common *common; + unsigned long flags; + + dualsense_init_output_report(ds, &report, ds->output_report_dmabuf); + common = report.common; + + spin_lock_irqsave(&ds->base.lock, flags); + + if (ds->update_rumble) { + /* Select classic rumble style haptics and enable it. */ + common->valid_flag0 |= DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT; + common->valid_flag0 |= DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION; + common->motor_left = ds->motor_left; + common->motor_right = ds->motor_right; + ds->update_rumble = false; + } + + spin_unlock_irqrestore(&ds->base.lock, flags); + + dualsense_send_output_report(ds, &report); +} + static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *report, u8 *data, int size) { @@ -721,10 +899,30 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r return 0; } +static int dualsense_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect) +{ + struct hid_device *hdev = input_get_drvdata(dev); + struct dualsense *ds = hid_get_drvdata(hdev); + unsigned long flags; + + if (effect->type != FF_RUMBLE) + return 0; + + spin_lock_irqsave(&ds->base.lock, flags); + ds->update_rumble = true; + ds->motor_left = effect->u.rumble.strong_magnitude / 256; + ds->motor_right = effect->u.rumble.weak_magnitude / 256; + spin_unlock_irqrestore(&ds->base.lock, flags); + + schedule_work(&ds->output_worker); + return 0; +} + static struct ps_device *dualsense_create(struct hid_device *hdev) { struct dualsense *ds; struct ps_device *ps_dev; + uint8_t max_output_report_size; int ret; ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL); @@ -743,8 +941,14 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) ps_dev->battery_capacity = 100; /* initial value until parse_report. */ ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN; ps_dev->parse_report = dualsense_parse_report; + INIT_WORK(&ds->output_worker, dualsense_output_worker); hid_set_drvdata(hdev, ds); + max_output_report_size = sizeof(struct dualsense_output_report_bt); + ds->output_report_dmabuf = devm_kzalloc(&hdev->dev, max_output_report_size, GFP_KERNEL); + if (!ds->output_report_dmabuf) + return ERR_PTR(-ENOMEM); + ret = dualsense_get_mac_address(ds); if (ret) { hid_err(hdev, "Failed to get MAC address from DualSense\n"); @@ -762,7 +966,7 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) goto err; } - ds->gamepad = ps_gamepad_create(hdev); + ds->gamepad = ps_gamepad_create(hdev, dualsense_play_effect); if (IS_ERR(ds->gamepad)) { ret = PTR_ERR(ds->gamepad); goto err; From 6c0bf9e6afb5e27a14d5a76401247d75cee9b67c Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 7 Feb 2021 13:49:08 -0800 Subject: [PATCH 11/28] BACKPORT: HID: playstation: report DualSense hardware and firmware version. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Retrieve DualSense hardware and firmware information using a vendor specific feature report. Report the data through sysfs and also report using hid_info as there can be signficant differences between versions. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I9a8e338d1a9726510194a4d41911dda8bb6371fc (cherry picked from commit 0b25b55d34f554b43a679e7e1303beb973b63e27) [roderick: Modified "show" calls to use snprintf instead of sysfs_emit] Signed-off-by: Roderick Colenbrander Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 81 +++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 64193fdeaa0d..967c56bf4f24 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -34,6 +34,8 @@ struct ps_device { int battery_status; uint8_t mac_address[6]; /* Note: stored in little endian order. */ + uint32_t hw_version; + uint32_t fw_version; int (*parse_report)(struct ps_device *dev, struct hid_report *report, u8 *data, int size); }; @@ -64,6 +66,8 @@ struct ps_calibration_data { #define DS_FEATURE_REPORT_CALIBRATION_SIZE 41 #define DS_FEATURE_REPORT_PAIRING_INFO 0x09 #define DS_FEATURE_REPORT_PAIRING_INFO_SIZE 20 +#define DS_FEATURE_REPORT_FIRMWARE_INFO 0x20 +#define DS_FEATURE_REPORT_FIRMWARE_INFO_SIZE 64 /* Button masks for DualSense input report. */ #define DS_BUTTONS0_HAT_SWITCH GENMASK(3, 0) @@ -538,6 +542,40 @@ static struct input_dev *ps_touchpad_create(struct hid_device *hdev, int width, return touchpad; } +static ssize_t firmware_version_show(struct device *dev, + struct device_attribute + *attr, char *buf) +{ + struct hid_device *hdev = to_hid_device(dev); + struct ps_device *ps_dev = hid_get_drvdata(hdev); + + return snprintf(buf, PAGE_SIZE, "0x%08x\n", ps_dev->fw_version); +} + +static DEVICE_ATTR_RO(firmware_version); + +static ssize_t hardware_version_show(struct device *dev, + struct device_attribute + *attr, char *buf) +{ + struct hid_device *hdev = to_hid_device(dev); + struct ps_device *ps_dev = hid_get_drvdata(hdev); + + return snprintf(buf, PAGE_SIZE, "0x%08x\n", ps_dev->hw_version); +} + +static DEVICE_ATTR_RO(hardware_version); + +static struct attribute *ps_device_attributes[] = { + &dev_attr_firmware_version.attr, + &dev_attr_hardware_version.attr, + NULL +}; + +static const struct attribute_group ps_device_attribute_group = { + .attrs = ps_device_attributes, +}; + static int dualsense_get_calibration_data(struct dualsense *ds) { short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus; @@ -628,6 +666,30 @@ err_free: return ret; } +static int dualsense_get_firmware_info(struct dualsense *ds) +{ + uint8_t *buf; + int ret; + + buf = kzalloc(DS_FEATURE_REPORT_FIRMWARE_INFO_SIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_FIRMWARE_INFO, buf, + DS_FEATURE_REPORT_FIRMWARE_INFO_SIZE); + if (ret) { + hid_err(ds->base.hdev, "Failed to retrieve DualSense firmware info: %d\n", ret); + goto err_free; + } + + ds->base.hw_version = get_unaligned_le32(&buf[24]); + ds->base.fw_version = get_unaligned_le32(&buf[28]); + +err_free: + kfree(buf); + return ret; +} + static int dualsense_get_mac_address(struct dualsense *ds) { uint8_t *buf; @@ -956,6 +1018,12 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) } snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address); + ret = dualsense_get_firmware_info(ds); + if (ret) { + hid_err(hdev, "Failed to get firmware info from DualSense\n"); + return ERR_PTR(ret); + } + ret = ps_devices_list_add(ps_dev); if (ret) return ERR_PTR(ret); @@ -989,6 +1057,13 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) if (ret) goto err; + /* + * Reporting hardware and firmware is important as there are frequent updates, which + * can change behavior. + */ + hid_info(hdev, "Registered DualSense controller hw_version=0x%08x fw_version=0x%08x\n", + ds->base.hw_version, ds->base.fw_version); + return &ds->base; err: @@ -1039,6 +1114,12 @@ static int ps_probe(struct hid_device *hdev, const struct hid_device_id *id) } } + ret = devm_device_add_group(&hdev->dev, &ps_device_attribute_group); + if (ret) { + hid_err(hdev, "Failed to register sysfs nodes.\n"); + goto err_close; + } + return ret; err_close: From 8e0061c2c387a7e5f65c1f66365c521eeb82b68f Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Thu, 11 Feb 2021 22:41:00 -0800 Subject: [PATCH 12/28] UPSTREAM: HID: playstation: fix unused variable in ps_battery_get_property. The ret variable in ps_battery_get_property is set in an error path, but never actually returned. Change the function to return ret. Reported-by: kernel test robot Signed-off-by: Roderick Colenbrander Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: Ieeaff4d249a6ee6d02eb4746f9fe502c91c6f40a (cherry picked from commit 5fb52551248f54ddc8f72bc252661468b603cfcc) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 967c56bf4f24..1582db878b71 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -333,7 +333,7 @@ static int ps_battery_get_property(struct power_supply *psy, uint8_t battery_capacity; int battery_status; unsigned long flags; - int ret; + int ret = 0; spin_lock_irqsave(&dev->lock, flags); battery_capacity = dev->battery_capacity; @@ -358,7 +358,7 @@ static int ps_battery_get_property(struct power_supply *psy, break; } - return 0; + return ret; } static int ps_device_register_battery(struct ps_device *dev) From 6f239ba20788d0ceb792cb1a99a420ed7df9d75f Mon Sep 17 00:00:00 2001 From: Colin Ian King Date: Mon, 15 Feb 2021 16:39:21 +0000 Subject: [PATCH 13/28] UPSTREAM: HID: playstation: fix array size comparison (off-by-one) The comparison of value with the array size ps_gamepad_hat_mapping appears to be off-by-one. Fix this by using >= rather than > for the size comparison. Addresses-Coverity: ("Out-of-bounds read") Fixes: bc2e15a9a022 ("HID: playstation: initial DualSense USB support.") Signed-off-by: Colin Ian King Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I24f4c7f8d48ab8ff1d117d33c7914b8d2e4292f8 (cherry picked from commit 50ab1ffd7c41c5c7759b62fb42d3006b751bb12b) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 1582db878b71..dbd5b90571d3 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -845,7 +845,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r input_report_abs(ds->gamepad, ABS_RZ, ds_report->rz); value = ds_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH; - if (value > ARRAY_SIZE(ps_gamepad_hat_mapping)) + if (value >= ARRAY_SIZE(ps_gamepad_hat_mapping)) value = 8; /* center */ input_report_abs(ds->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x); input_report_abs(ds->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y); From 669066bd53ebab16ba25ce94b1c803393d083411 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Tue, 16 Feb 2021 14:26:35 -0800 Subject: [PATCH 14/28] UPSTREAM: HID: playstation: add initial DualSense lightbar support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provide initial support for the DualSense lightbar and configure it with a default PlayStation blue color. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I4f5a78e20b2e11c68e67c539b9c21197e42a722f (cherry picked from commit 8e5198a12d6416f0a1e9393bdb3a533854ed577b) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index dbd5b90571d3..18813f954f83 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -103,6 +103,10 @@ struct ps_calibration_data { /* Flags for DualSense output report. */ #define DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION BIT(0) #define DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT BIT(1) +#define DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE BIT(2) +#define DS_OUTPUT_VALID_FLAG1_RELEASE_LEDS BIT(3) +#define DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE BIT(1) +#define DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT BIT(1) /* DualSense hardware limits */ #define DS_ACC_RES_PER_G 8192 @@ -132,6 +136,12 @@ struct dualsense { uint8_t motor_left; uint8_t motor_right; + /* RGB lightbar */ + bool update_lightbar; + uint8_t lightbar_red; + uint8_t lightbar_green; + uint8_t lightbar_blue; + struct work_struct output_worker; void *output_report_dmabuf; uint8_t output_seq; /* Sequence number for output report. */ @@ -796,6 +806,15 @@ static void dualsense_output_worker(struct work_struct *work) ds->update_rumble = false; } + if (ds->update_lightbar) { + common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE; + common->lightbar_red = ds->lightbar_red; + common->lightbar_green = ds->lightbar_green; + common->lightbar_blue = ds->lightbar_blue; + + ds->update_lightbar = false; + } + spin_unlock_irqrestore(&ds->base.lock, flags); dualsense_send_output_report(ds, &report); @@ -980,6 +999,41 @@ static int dualsense_play_effect(struct input_dev *dev, void *data, struct ff_ef return 0; } +static int dualsense_reset_leds(struct dualsense *ds) +{ + struct dualsense_output_report report; + uint8_t *buf; + + buf = kzalloc(sizeof(struct dualsense_output_report_bt), GFP_KERNEL); + if (!buf) + return -ENOMEM; + + dualsense_init_output_report(ds, &report, buf); + /* + * On Bluetooth the DualSense outputs an animation on the lightbar + * during startup and maintains a color afterwards. We need to explicitly + * reconfigure the lightbar before we can do any programming later on. + * In USB the lightbar is not on by default, but redoing the setup there + * doesn't hurt. + */ + report.common->valid_flag2 = DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE; + report.common->lightbar_setup = DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT; /* Fade light out. */ + dualsense_send_output_report(ds, &report); + + kfree(buf); + return 0; +} + +static void dualsense_set_lightbar(struct dualsense *ds, uint8_t red, uint8_t green, uint8_t blue) +{ + ds->update_lightbar = true; + ds->lightbar_red = red; + ds->lightbar_green = green; + ds->lightbar_blue = blue; + + schedule_work(&ds->output_worker); +} + static struct ps_device *dualsense_create(struct hid_device *hdev) { struct dualsense *ds; @@ -1057,6 +1111,17 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) if (ret) goto err; + /* + * The hardware may have control over the LEDs (e.g. in Bluetooth on startup). + * Reset the LEDs (lightbar, mute, player leds), so we can control them + * from software. + */ + ret = dualsense_reset_leds(ds); + if (ret) + goto err; + + dualsense_set_lightbar(ds, 0, 0, 128); /* blue */ + /* * Reporting hardware and firmware is important as there are frequent updates, which * can change behavior. From faff2c6cd879b6878ae2998eeb10f570e91dc597 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Tue, 16 Feb 2021 16:50:07 -0800 Subject: [PATCH 15/28] UPSTREAM: HID: playstation: add microphone mute support for DualSense. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DualSense controller has a built-in microphone exposed as an audio device over USB (or HID using Bluetooth). A dedicated button on the controller handles mute, but software has to configure the device to mute the audio stream. This patch captures the mute button and schedules an output report to mute/unmute the audio stream as well as toggle the mute LED. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I6fce08b0b28c1cf41c682a2ff5655f00d7a52843 (cherry picked from commit c26e48b150fccb07c4b7f0f419f2b0a2c42e57d2) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 18813f954f83..3e49b93bf1e5 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -85,6 +85,7 @@ struct ps_calibration_data { #define DS_BUTTONS1_R3 BIT(7) #define DS_BUTTONS2_PS_HOME BIT(0) #define DS_BUTTONS2_TOUCHPAD BIT(1) +#define DS_BUTTONS2_MIC_MUTE BIT(2) /* Status field of DualSense input report. */ #define DS_STATUS_BATTERY_CAPACITY GENMASK(3, 0) @@ -103,9 +104,12 @@ struct ps_calibration_data { /* Flags for DualSense output report. */ #define DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION BIT(0) #define DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT BIT(1) +#define DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE BIT(0) +#define DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE BIT(1) #define DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE BIT(2) #define DS_OUTPUT_VALID_FLAG1_RELEASE_LEDS BIT(3) #define DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE BIT(1) +#define DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE BIT(4) #define DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT BIT(1) /* DualSense hardware limits */ @@ -142,6 +146,11 @@ struct dualsense { uint8_t lightbar_green; uint8_t lightbar_blue; + /* Microphone */ + bool update_mic_mute; + bool mic_muted; + bool last_btn_mic_state; + struct work_struct output_worker; void *output_report_dmabuf; uint8_t output_seq; /* Sequence number for output report. */ @@ -815,6 +824,23 @@ static void dualsense_output_worker(struct work_struct *work) ds->update_lightbar = false; } + if (ds->update_mic_mute) { + common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE; + common->mute_button_led = ds->mic_muted; + + if (ds->mic_muted) { + /* Disable microphone */ + common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE; + common->power_save_control |= DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE; + } else { + /* Enable microphone */ + common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE; + common->power_save_control &= ~DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE; + } + + ds->update_mic_mute = false; + } + spin_unlock_irqrestore(&ds->base.lock, flags); dualsense_send_output_report(ds, &report); @@ -829,6 +855,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r uint8_t battery_data, battery_capacity, charging_status, value; int battery_status; uint32_t sensor_timestamp; + bool btn_mic_state; unsigned long flags; int i; @@ -884,6 +911,23 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME); input_sync(ds->gamepad); + /* + * The DualSense has an internal microphone, which can be muted through a mute button + * on the device. The driver is expected to read the button state and program the device + * to mute/unmute audio at the hardware level. + */ + btn_mic_state = !!(ds_report->buttons[2] & DS_BUTTONS2_MIC_MUTE); + if (btn_mic_state && !ds->last_btn_mic_state) { + spin_lock_irqsave(&ps_dev->lock, flags); + ds->update_mic_mute = true; + ds->mic_muted = !ds->mic_muted; /* toggle */ + spin_unlock_irqrestore(&ps_dev->lock, flags); + + /* Schedule updating of microphone state at hardware level. */ + schedule_work(&ds->output_worker); + } + ds->last_btn_mic_state = btn_mic_state; + /* Parse and calibrate gyroscope data. */ for (i = 0; i < ARRAY_SIZE(ds_report->gyro); i++) { int raw_data = (short)le16_to_cpu(ds_report->gyro[i]); From fb66b3f219cc76fd3f28837886c34151c34761c9 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Tue, 16 Feb 2021 16:56:09 -0800 Subject: [PATCH 16/28] UPSTREAM: HID: playstation: add DualSense player LED support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DualSense features 5 player LEDs below its touchpad, which are meant as player id indications. The LEDs are configured with a player ID determined by an ID allocator, which assign player ids to ps_device instances. This patch is a combination of the following original patches minus use of LED framework APIs: - HID: playstation: add DualSense player LEDs support. - HID: playstation: DualSense set LEDs to default player id. Signed-off-by: Roderick Colenbrander Reviewed-by: Barnabás Pőcze Signed-off-by: Benjamin Tissoires Bug: 167947264 Change-Id: I2a9ef9949bb82df18247a14e64cb8c54e9b3924c (cherry picked from commit 949aaccda019723050a2cd98d7b4492b06423f27) Signed-off-by: Farid Chahla --- drivers/hid/hid-playstation.c | 83 ++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c index 3e49b93bf1e5..1c9216436768 100644 --- a/drivers/hid/hid-playstation.c +++ b/drivers/hid/hid-playstation.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -20,6 +21,8 @@ static DEFINE_MUTEX(ps_devices_lock); static LIST_HEAD(ps_devices_list); +static DEFINE_IDA(ps_player_id_allocator); + #define HID_PLAYSTATION_VERSION_PATCH 0x8000 /* Base class for playstation devices. */ @@ -28,6 +31,8 @@ struct ps_device { struct hid_device *hdev; spinlock_t lock; + uint32_t player_id; + struct power_supply_desc battery_desc; struct power_supply *battery; uint8_t battery_capacity; @@ -108,6 +113,7 @@ struct ps_calibration_data { #define DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE BIT(1) #define DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE BIT(2) #define DS_OUTPUT_VALID_FLAG1_RELEASE_LEDS BIT(3) +#define DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE BIT(4) #define DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE BIT(1) #define DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE BIT(4) #define DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT BIT(1) @@ -151,6 +157,11 @@ struct dualsense { bool mic_muted; bool last_btn_mic_state; + /* Player leds */ + bool update_player_leds; + uint8_t player_leds_state; + struct led_classdev player_leds[5]; + struct work_struct output_worker; void *output_report_dmabuf; uint8_t output_seq; /* Sequence number for output report. */ @@ -309,6 +320,24 @@ static int ps_devices_list_remove(struct ps_device *dev) return 0; } +static int ps_device_set_player_id(struct ps_device *dev) +{ + int ret = ida_alloc(&ps_player_id_allocator, GFP_KERNEL); + + if (ret < 0) + return ret; + + dev->player_id = ret; + return 0; +} + +static void ps_device_release_player_id(struct ps_device *dev) +{ + ida_free(&ps_player_id_allocator, dev->player_id); + + dev->player_id = U32_MAX; +} + static struct input_dev *ps_allocate_input_dev(struct hid_device *hdev, const char *name_suffix) { struct input_dev *input_dev; @@ -824,6 +853,13 @@ static void dualsense_output_worker(struct work_struct *work) ds->update_lightbar = false; } + if (ds->update_player_leds) { + common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE; + common->player_leds = ds->player_leds_state; + + ds->update_player_leds = false; + } + if (ds->update_mic_mute) { common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE; common->mute_button_led = ds->mic_muted; @@ -1078,6 +1114,29 @@ static void dualsense_set_lightbar(struct dualsense *ds, uint8_t red, uint8_t gr schedule_work(&ds->output_worker); } +static void dualsense_set_player_leds(struct dualsense *ds) +{ + /* + * The DualSense controller has a row of 5 LEDs used for player ids. + * Behavior on the PlayStation 5 console is to center the player id + * across the LEDs, so e.g. player 1 would be "--x--" with x being 'on'. + * Follow a similar mapping here. + */ + static const int player_ids[5] = { + BIT(2), + BIT(3) | BIT(1), + BIT(4) | BIT(2) | BIT(0), + BIT(4) | BIT(3) | BIT(1) | BIT(0), + BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0) + }; + + uint8_t player_id = ds->base.player_id % ARRAY_SIZE(player_ids); + + ds->update_player_leds = true; + ds->player_leds_state = player_ids[player_id]; + schedule_work(&ds->output_worker); +} + static struct ps_device *dualsense_create(struct hid_device *hdev) { struct dualsense *ds; @@ -1166,6 +1225,15 @@ static struct ps_device *dualsense_create(struct hid_device *hdev) dualsense_set_lightbar(ds, 0, 0, 128); /* blue */ + ret = ps_device_set_player_id(ps_dev); + if (ret) { + hid_err(hdev, "Failed to assign player id for DualSense: %d\n", ret); + goto err; + } + + /* Set player LEDs to our player id. */ + dualsense_set_player_leds(ds); + /* * Reporting hardware and firmware is important as there are frequent updates, which * can change behavior. @@ -1243,6 +1311,7 @@ static void ps_remove(struct hid_device *hdev) struct ps_device *dev = hid_get_drvdata(hdev); ps_devices_list_remove(dev); + ps_device_release_player_id(dev); hid_hw_close(hdev); hid_hw_stop(hdev); @@ -1263,7 +1332,19 @@ static struct hid_driver ps_driver = { .raw_event = ps_raw_event, }; -module_hid_driver(ps_driver); +static int __init ps_init(void) +{ + return hid_register_driver(&ps_driver); +} + +static void __exit ps_exit(void) +{ + hid_unregister_driver(&ps_driver); + ida_destroy(&ps_player_id_allocator); +} + +module_init(ps_init); +module_exit(ps_exit); MODULE_AUTHOR("Sony Interactive Entertainment"); MODULE_DESCRIPTION("HID Driver for PlayStation peripherals."); From b0cd259c163330e8ec862e9176f3ee10a95feb44 Mon Sep 17 00:00:00 2001 From: Farid Chahla Date: Tue, 2 Mar 2021 15:48:12 -0800 Subject: [PATCH 17/28] ANDROID: GKI: enable hid-playstation driver/rumble To enable DualSense driver, i.e. hid-playstation, we need to set CONFIG_HID_PLAYSTATION to "y". To enable Dualsense rumble, we need to set CONFIG_PLAYSTATION_FF to "y". Bug: 167947264 Change-Id: Ic2e31a6f53bfdef113eeee07277ef6b2a28dce2d Signed-off-by: Farid Chahla --- arch/arm64/configs/gki_defconfig | 2 ++ arch/x86/configs/gki_defconfig | 2 ++ 2 files changed, 4 insertions(+) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index 3078e6744bda..cb50be2fb341 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -395,6 +395,8 @@ CONFIG_HID_MULTITOUCH=y CONFIG_HID_NINTENDO=y CONFIG_HID_PICOLCD=y CONFIG_HID_PLANTRONICS=y +CONFIG_HID_PLAYSTATION=y +CONFIG_PLAYSTATION_FF=y CONFIG_HID_ROCCAT=y CONFIG_HID_SONY=y CONFIG_HID_STEAM=y diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig index 8d50179d79c6..b7bb38a515b8 100644 --- a/arch/x86/configs/gki_defconfig +++ b/arch/x86/configs/gki_defconfig @@ -344,6 +344,8 @@ CONFIG_HID_MULTITOUCH=y CONFIG_HID_NINTENDO=y CONFIG_HID_PICOLCD=y CONFIG_HID_PLANTRONICS=y +CONFIG_HID_PLAYSTATION=y +CONFIG_PLAYSTATION_FF=y CONFIG_HID_ROCCAT=y CONFIG_HID_SONY=y CONFIG_HID_STEAM=y From 3c6774301dd7e3a86650088d51373bc53f298a48 Mon Sep 17 00:00:00 2001 From: Daiyue Zhang Date: Mon, 1 Mar 2021 14:10:53 +0800 Subject: [PATCH 18/28] FROMGIT: configfs: fix a use-after-free in __configfs_open_file Commit b0841eefd969 ("configfs: provide exclusion between IO and removals") uses ->frag_dead to mark the fragment state, thus no bothering with extra refcount on config_item when opening a file. The configfs_get_config_item was removed in __configfs_open_file, but not with config_item_put. So the refcount on config_item will lost its balance, causing use-after-free issues in some occasions like this: Test: 1. Mount configfs on /config with read-only items: drwxrwx--- 289 root root 0 2021-04-01 11:55 /config drwxr-xr-x 2 root root 0 2021-04-01 11:54 /config/a --w--w--w- 1 root root 4096 2021-04-01 11:53 /config/a/1.txt ...... 2. Then run: for file in /config do echo $file grep -R 'key' $file done 3. __configfs_open_file will be called in parallel, the first one got called will do: if (file->f_mode & FMODE_READ) { if (!(inode->i_mode & S_IRUGO)) goto out_put_module; config_item_put(buffer->item); kref_put() package_details_release() kfree() the other one will run into use-after-free issues like this: BUG: KASAN: use-after-free in __configfs_open_file+0x1bc/0x3b0 Read of size 8 at addr fffffff155f02480 by task grep/13096 CPU: 0 PID: 13096 Comm: grep VIP: 00 Tainted: G W 4.14.116-kasan #1 TGID: 13096 Comm: grep Call trace: dump_stack+0x118/0x160 kasan_report+0x22c/0x294 __asan_load8+0x80/0x88 __configfs_open_file+0x1bc/0x3b0 configfs_open_file+0x28/0x34 do_dentry_open+0x2cc/0x5c0 vfs_open+0x80/0xe0 path_openat+0xd8c/0x2988 do_filp_open+0x1c4/0x2fc do_sys_open+0x23c/0x404 SyS_openat+0x38/0x48 Allocated by task 2138: kasan_kmalloc+0xe0/0x1ac kmem_cache_alloc_trace+0x334/0x394 packages_make_item+0x4c/0x180 configfs_mkdir+0x358/0x740 vfs_mkdir2+0x1bc/0x2e8 SyS_mkdirat+0x154/0x23c el0_svc_naked+0x34/0x38 Freed by task 13096: kasan_slab_free+0xb8/0x194 kfree+0x13c/0x910 package_details_release+0x524/0x56c kref_put+0xc4/0x104 config_item_put+0x24/0x34 __configfs_open_file+0x35c/0x3b0 configfs_open_file+0x28/0x34 do_dentry_open+0x2cc/0x5c0 vfs_open+0x80/0xe0 path_openat+0xd8c/0x2988 do_filp_open+0x1c4/0x2fc do_sys_open+0x23c/0x404 SyS_openat+0x38/0x48 el0_svc_naked+0x34/0x38 To fix this issue, remove the config_item_put in __configfs_open_file to balance the refcount of config_item. Fixes: b0841eefd969 ("configfs: provide exclusion between IO and removals") Signed-off-by: Daiyue Zhang Signed-off-by: Yi Chen Signed-off-by: Ge Qiu Reviewed-by: Chao Yu Acked-by: Al Viro Signed-off-by: Christoph Hellwig Bug: 174049066 (cherry picked from commit 14fbbc8297728e880070f7b077b3301a8c698ef9 git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master) Cc: Daniel Rosenberg Signed-off-by: Greg Kroah-Hartman Change-Id: I745711ed546c1be97360670b77aedfb929bffcec --- fs/configfs/file.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/configfs/file.c b/fs/configfs/file.c index fb65b706cc0d..84b4d58fc65f 100644 --- a/fs/configfs/file.c +++ b/fs/configfs/file.c @@ -378,7 +378,7 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type attr = to_attr(dentry); if (!attr) - goto out_put_item; + goto out_free_buffer; if (type & CONFIGFS_ITEM_BIN_ATTR) { buffer->bin_attr = to_bin_attr(dentry); @@ -391,7 +391,7 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type /* Grab the module reference for this attribute if we have one */ error = -ENODEV; if (!try_module_get(buffer->owner)) - goto out_put_item; + goto out_free_buffer; error = -EACCES; if (!buffer->item->ci_type) @@ -435,8 +435,6 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type out_put_module: module_put(buffer->owner); -out_put_item: - config_item_put(buffer->item); out_free_buffer: up_read(&frag->frag_sem); kfree(buffer); From 4a669f5150e1d659372a19870396097718570402 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Fri, 19 Mar 2021 13:17:21 -0700 Subject: [PATCH 19/28] ANDROID: clang: update to 12.0.4 Bug: 183031914 Signed-off-by: Nick Desaulniers Change-Id: Ib32ee605e010362c855f11f551755755bbb1e967 --- build.config.common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.config.common b/build.config.common index a3f1b303f2d1..778e5a7d540a 100644 --- a/build.config.common +++ b/build.config.common @@ -6,7 +6,7 @@ LD=ld.lld NM=llvm-nm OBJCOPY=llvm-objcopy DEPMOD=depmod -CLANG_PREBUILT_BIN=prebuilts-master/clang/host/linux-x86/clang-r383902/bin +CLANG_PREBUILT_BIN=prebuilts-master/clang/host/linux-x86/clang-r416183/bin BUILDTOOLS_PREBUILT_BIN=build/build-tools/path/linux-x86 EXTRA_CMDS='' From a7c0b02b68a9189fbd6e2b00253adbcc82e7bdf3 Mon Sep 17 00:00:00 2001 From: Ashish Chavan Date: Fri, 19 Mar 2021 15:38:37 +0530 Subject: [PATCH 20/28] ANDROID: GKI: Update abi_gki_aarch64_qcom Add alarm_expires_remaining symbol in abi_gki_aarch64_qcom to be used in smb5 driver. Bug: 183182450 Change-Id: Ifba9354ed4249c2408782ffef577d965bd4ef206 Signed-off-by: Ashish Chavan --- android/abi_gki_aarch64_qcom | 1 + 1 file changed, 1 insertion(+) diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 7c49fc3ae224..90b7c75f5f00 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -8,6 +8,7 @@ alarm_cancel alarm_init alarm_start_relative + alarm_expires_remaining alloc_chrdev_region __alloc_disk_node alarmtimer_get_rtcdev From 408366e170bd8f518ca023fb690be991fe0a208a Mon Sep 17 00:00:00 2001 From: Xiaowen Wu Date: Fri, 19 Mar 2021 16:21:36 -0400 Subject: [PATCH 21/28] ANDROID: GKI: Enable DRM_GEM_SHMEM_HELPER DRM_GEM_SHMEM_HELPER is needed by DRM driver to support large shared memory allocation. Bug: 183221396 Change-Id: I76d58abc357f1685e65fc8dd5e2568e1d307cc38 Signed-off-by: Xiaowen Wu --- init/Kconfig.gki | 1 + 1 file changed, 1 insertion(+) diff --git a/init/Kconfig.gki b/init/Kconfig.gki index 48c0cc4aa970..7e37f0040804 100644 --- a/init/Kconfig.gki +++ b/init/Kconfig.gki @@ -3,6 +3,7 @@ config GKI_HIDDEN_DRM_CONFIGS select DRM_KMS_HELPER if (HAS_IOMEM && DRM) select DRM_GEM_CMA_HELPER select DRM_KMS_CMA_HELPER + select DRM_GEM_SHMEM_HELPER select DRM_MIPI_DSI select DRM_TTM if (HAS_IOMEM && DRM) select VIDEOMODE_HELPERS From c9c1aa8cfec797298732e67751d0455f62f4ce3a Mon Sep 17 00:00:00 2001 From: Xiaowen Wu Date: Fri, 19 Mar 2021 16:26:48 -0400 Subject: [PATCH 22/28] ANDROID: ABI: Update allowed list for QCOM Leaf changes summary: 5 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 5 Added functions Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable 5 Added functions: [A] 'function int drm_gem_shmem_dumb_create(drm_file*, drm_device*, drm_mode_create_dumb*)' [A] 'function sg_table* drm_gem_shmem_get_pages_sgt(drm_gem_object*)' [A] 'function int drm_gem_shmem_mmap(file*, vm_area_struct*)' [A] 'function drm_gem_object* drm_gem_shmem_prime_import_sg_table(drm_device*, dma_buf_attachment*, sg_table*)' [A] 'function drm_plane* drm_plane_from_index(drm_device*, int)' Bug: 183217899 Change-Id: Ifac20381e983ed9030026f232838120df424e9b3 Signed-off-by: Xiaowen Wu --- android/abi_gki_aarch64.xml | 315 +++++++++++++++++------------------ android/abi_gki_aarch64_qcom | 10 ++ 2 files changed, 167 insertions(+), 158 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 12c59540a10b..b514dcf24ad0 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -1441,6 +1441,10 @@ + + + + @@ -1544,6 +1548,7 @@ + @@ -10377,44 +10382,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -11166,20 +11134,6 @@ - - - - - - - - - - - - - - @@ -12558,7 +12512,6 @@ - @@ -15955,7 +15908,14 @@ - + + + + + + + + @@ -19599,7 +19559,14 @@ - + + + + + + + + @@ -44772,23 +44739,6 @@ - - - - - - - - - - - - - - - - - @@ -44802,7 +44752,6 @@ - @@ -45043,6 +44992,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45050,6 +45054,9 @@ + + + @@ -45089,11 +45096,6 @@ - - - - - @@ -45260,7 +45262,6 @@ - @@ -68217,19 +68218,19 @@ - + - + - + @@ -68272,7 +68273,7 @@ - + @@ -69997,6 +69998,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -70702,6 +70726,13 @@ + + + + + + + @@ -73767,6 +73798,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -73893,23 +73948,6 @@ - - - - - - - - - - - - - - - - - @@ -110760,7 +110798,7 @@ - + @@ -110804,7 +110842,7 @@ - + @@ -137966,6 +138004,10 @@ + + + + @@ -137975,12 +138017,6 @@ - - - - - - @@ -145711,44 +145747,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -161509,18 +161508,6 @@ - - - - - - - - - - - - @@ -164764,6 +164751,18 @@ + + + + + + + + + + + + diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 90b7c75f5f00..af413ee22491 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -618,19 +618,24 @@ drm_atomic_helper_crtc_destroy_state __drm_atomic_helper_crtc_duplicate_state drm_atomic_helper_crtc_duplicate_state + __drm_atomic_helper_crtc_reset drm_atomic_helper_crtc_reset drm_atomic_helper_dirtyfb drm_atomic_helper_disable_plane drm_atomic_helper_duplicate_state drm_atomic_helper_page_flip + __drm_atomic_helper_plane_destroy_state drm_atomic_helper_plane_destroy_state __drm_atomic_helper_plane_duplicate_state drm_atomic_helper_plane_duplicate_state + __drm_atomic_helper_plane_reset drm_atomic_helper_plane_reset drm_atomic_helper_prepare_planes __drm_atomic_helper_private_obj_duplicate_state + drm_atomic_helper_resume drm_atomic_helper_set_config drm_atomic_helper_shutdown + drm_atomic_helper_suspend drm_atomic_helper_swap_state drm_atomic_helper_update_legacy_modeset_state drm_atomic_helper_update_plane @@ -769,6 +774,10 @@ drm_gem_prime_mmap drm_gem_private_object_init drm_gem_put_pages + drm_gem_shmem_dumb_create + drm_gem_shmem_get_pages_sgt + drm_gem_shmem_mmap + drm_gem_shmem_prime_import_sg_table drm_gem_vm_close drm_gem_vm_open drm_get_connector_status_name @@ -836,6 +845,7 @@ drm_panel_remove drm_plane_cleanup drm_plane_create_rotation_property + drm_plane_from_index drm_poll drm_prime_gem_destroy drm_prime_pages_to_sg From e01b338f5e01797e94e7c7fdb97c5b6421c053c5 Mon Sep 17 00:00:00 2001 From: Jian Gong Date: Mon, 22 Mar 2021 11:06:38 +0800 Subject: [PATCH 23/28] ANDROID: ABI: update symbols to unisoc whitelist to android11-k5.4 Update whitelist for the symbols used by the unisoc device and update the ABI representation accordingly. Leaf changes summary: 1 artifact changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 1 Added function Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable 1 Added function: [A] 'function void clear_nlink(inode*)' Bug: 183260329 Change-Id: Ia406458f6f80abf9a34528c77a8184513f3cfc11 Signed-off-by: Jian Gong --- android/abi_gki_aarch64.xml | 1915 ++++++++++++++++++-------------- android/abi_gki_aarch64_unisoc | 7 + 2 files changed, 1107 insertions(+), 815 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index b514dcf24ad0..763decbcc936 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -634,6 +634,7 @@ + @@ -4871,7 +4872,8 @@ - + + @@ -38788,10 +38790,6 @@ - - - - @@ -38804,6 +38802,10 @@ + + + + @@ -45154,7 +45156,7 @@ - + @@ -58686,7 +58688,6 @@ - @@ -58739,6 +58740,7 @@ + @@ -59081,6 +59083,7 @@ + @@ -59772,7 +59775,185 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -59879,7 +60060,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + @@ -59948,7 +60151,53 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -59990,12 +60239,17 @@ + + + + + @@ -60012,7 +60266,72 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60134,6 +60453,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60231,16 +60666,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60370,7 +60865,32 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60610,6 +61130,7 @@ + @@ -60617,6 +61138,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60646,122 +61235,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -60825,7 +61298,103 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61133,7 +61702,6 @@ - @@ -61152,49 +61720,18 @@ + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + @@ -61296,13 +61833,27 @@ - + - + + + + + + + + + + + + + + + @@ -61383,6 +61934,17 @@ + + + + + + + + + + + @@ -61537,6 +62099,7 @@ + @@ -61548,10 +62111,6 @@ - - - - @@ -61740,121 +62299,29 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - - - - - + + - @@ -61926,10 +62393,153 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61945,28 +62555,13 @@ + - - - - - - - - - - - - - - - - - + @@ -62031,20 +62626,6 @@ - - - - - - - - - - - - - - @@ -62053,101 +62634,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -62156,6 +62642,10 @@ + + + + @@ -62165,16 +62655,16 @@ - + - + - + @@ -62275,7 +62765,7 @@ - + @@ -62307,27 +62797,27 @@ - + - + - + - + - + @@ -62346,12 +62836,12 @@ - + - + @@ -62363,7 +62853,7 @@ - + @@ -62371,69 +62861,69 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -62458,10 +62948,10 @@ - + - + @@ -62476,7 +62966,7 @@ - + @@ -62490,7 +62980,7 @@ - + @@ -62506,20 +62996,20 @@ - + - + - + - + @@ -62529,7 +63019,7 @@ - + @@ -62544,219 +63034,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -62900,7 +63177,7 @@ - + @@ -62914,7 +63191,7 @@ - + @@ -63232,7 +63509,7 @@ - + @@ -63490,7 +63767,7 @@ - + @@ -63507,16 +63784,16 @@ - + - + - + @@ -63570,7 +63847,7 @@ - + @@ -63618,7 +63895,7 @@ - + @@ -63797,7 +64074,7 @@ - + @@ -63832,7 +64109,7 @@ - + @@ -63881,7 +64158,7 @@ - + @@ -64119,7 +64396,7 @@ - + @@ -64471,7 +64748,7 @@ - + @@ -64729,7 +65006,7 @@ - + @@ -64770,7 +65047,7 @@ - + @@ -65056,7 +65333,7 @@ - + @@ -65084,7 +65361,7 @@ - + @@ -65217,13 +65494,13 @@ - + - + - + @@ -65246,7 +65523,7 @@ - + @@ -65266,7 +65543,7 @@ - + @@ -65477,10 +65754,10 @@ - + - + @@ -65553,7 +65830,7 @@ - + @@ -65593,10 +65870,10 @@ - + - + @@ -65907,7 +66184,7 @@ - + @@ -65994,7 +66271,7 @@ - + @@ -66403,7 +66680,7 @@ - + @@ -66416,20 +66693,20 @@ - + - + - + @@ -66437,15 +66714,15 @@ - + - - + + @@ -66457,7 +66734,7 @@ - + @@ -66649,7 +66926,7 @@ - + @@ -66674,7 +66951,7 @@ - + @@ -66758,7 +67035,7 @@ - + @@ -66836,7 +67113,7 @@ - + @@ -66844,7 +67121,7 @@ - + @@ -66855,7 +67132,7 @@ - + @@ -66863,7 +67140,7 @@ - + @@ -66911,36 +67188,36 @@ - + - + - + - + - + - + @@ -66982,19 +67259,19 @@ - + - + - + @@ -67002,13 +67279,13 @@ - + - + @@ -67021,7 +67298,7 @@ - + @@ -67035,7 +67312,7 @@ - + @@ -67158,7 +67435,7 @@ - + @@ -67173,7 +67450,7 @@ - + @@ -67209,7 +67486,7 @@ - + @@ -67228,7 +67505,7 @@ - + @@ -67258,7 +67535,7 @@ - + @@ -67337,7 +67614,7 @@ - + @@ -67349,7 +67626,7 @@ - + @@ -67357,6 +67634,8 @@ + + @@ -67384,9 +67663,9 @@ - - - + + + @@ -67475,12 +67754,12 @@ - - + + - + @@ -68646,7 +68925,7 @@ - + @@ -69442,7 +69721,7 @@ - + @@ -69664,13 +69943,13 @@ - + - + @@ -69946,18 +70225,18 @@ - + - + - + @@ -69976,7 +70255,7 @@ - + @@ -70040,7 +70319,6 @@ - @@ -70458,7 +70736,7 @@ - + @@ -70624,7 +70902,7 @@ - + @@ -70687,40 +70965,42 @@ + + - + - + - + - + - + - + - + - + @@ -70780,7 +71060,7 @@ - + @@ -70796,7 +71076,7 @@ - + @@ -70870,10 +71150,10 @@ - - - - + + + + @@ -71191,10 +71471,10 @@ - - - - + + + + @@ -71480,7 +71760,7 @@ - + @@ -80324,6 +80604,10 @@ + + + + @@ -80336,10 +80620,6 @@ - - - - @@ -80363,10 +80643,6 @@ - - - - @@ -80384,6 +80660,10 @@ + + + + @@ -81902,11 +82182,6 @@ - - - - - @@ -81924,6 +82199,11 @@ + + + + + @@ -81963,6 +82243,7 @@ + @@ -99662,10 +99943,6 @@ - - - - @@ -99677,6 +99954,10 @@ + + + + @@ -102421,6 +102702,10 @@ + + + + @@ -102429,10 +102714,6 @@ - - - - @@ -107117,14 +107398,14 @@ - - - - + + + + @@ -107215,13 +107496,6 @@ - - - - - - - @@ -107232,6 +107506,13 @@ + + + + + + + @@ -111947,16 +112228,16 @@ - - - - + + + + @@ -137471,6 +137752,10 @@ + + + + @@ -137485,10 +137770,6 @@ - - - - @@ -138264,11 +138545,6 @@ - - - - - @@ -138278,6 +138554,15 @@ + + + + + + + + + @@ -143591,7 +143876,7 @@ - + @@ -161325,6 +161610,13 @@ + + + + + + + @@ -161333,13 +161625,6 @@ - - - - - - - @@ -170283,7 +170568,7 @@ - + @@ -176891,7 +177176,7 @@ - + @@ -187665,6 +187950,6 @@ diff --git a/android/abi_gki_aarch64_unisoc b/android/abi_gki_aarch64_unisoc index 0ca6e1b25e0f..6fbaf2fa4896 100644 --- a/android/abi_gki_aarch64_unisoc +++ b/android/abi_gki_aarch64_unisoc @@ -46,6 +46,7 @@ __class_create class_destroy class_find_device + clear_nlink clk_bulk_disable clk_bulk_enable clk_bulk_prepare @@ -94,6 +95,7 @@ __crypto_xor csum_ipv6_magic csum_partial + d_splice_alias default_llseek delayed_work_timer_fn del_timer @@ -271,6 +273,7 @@ ieee80211_freq_khz_to_channel ieee80211_get_channel_khz ignore_console_lock_warning + igrab inet_proto_csum_replace4 init_net __init_rwsem @@ -571,8 +574,10 @@ seq_putc seq_puts seq_read + set_nlink set_normalized_timespec64 set_user_nice + setattr_prepare sg_init_table sg_miter_next sg_miter_start @@ -679,6 +684,7 @@ trace_handle_return trace_raw_output_prep trace_seq_printf + truncate_setsize try_module_get __tty_alloc_driver tty_flip_buffer_push @@ -1558,6 +1564,7 @@ dev_pm_opp_init_cpufreq_table # required by sprd-drm.ko + adjust_managed_page_count component_add component_bind_all component_del From a5dc6e5d9ea492763730201b2c28f7f015d9e74d Mon Sep 17 00:00:00 2001 From: Steve Muckle Date: Mon, 21 Sep 2020 12:05:36 -0700 Subject: [PATCH 24/28] ANDROID: GKI: enable CONFIG_SONY_FF Bug: 168719305 Signed-off-by: Steve Muckle Change-Id: Id9ebb1937b669b999ccc5daccaadb04f88449497 --- arch/arm64/configs/gki_defconfig | 1 + arch/x86/configs/gki_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index cb50be2fb341..d72ec6f4ee8d 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -399,6 +399,7 @@ CONFIG_HID_PLAYSTATION=y CONFIG_PLAYSTATION_FF=y CONFIG_HID_ROCCAT=y CONFIG_HID_SONY=y +CONFIG_SONY_FF=y CONFIG_HID_STEAM=y CONFIG_HID_WACOM=y CONFIG_HID_WIIMOTE=y diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig index b7bb38a515b8..1fb1554bd5dc 100644 --- a/arch/x86/configs/gki_defconfig +++ b/arch/x86/configs/gki_defconfig @@ -348,6 +348,7 @@ CONFIG_HID_PLAYSTATION=y CONFIG_PLAYSTATION_FF=y CONFIG_HID_ROCCAT=y CONFIG_HID_SONY=y +CONFIG_SONY_FF=y CONFIG_HID_STEAM=y CONFIG_HID_WACOM=y CONFIG_HID_WIIMOTE=y From d71d55b76b3d0d0d585fb3e9e7f48a71b9ddd422 Mon Sep 17 00:00:00 2001 From: Howard Chen Date: Wed, 24 Mar 2021 11:25:05 +0800 Subject: [PATCH 25/28] ANDROID: ABI: Update symbol list for cuttlefish The cuttlefish symbol list is out-of-date. Add init_user_ns and ns_capable_noaudit required by vsock.ko This update is required by the merge to 5.4.86 which saw the vsock.ko module add a dependency. Leaf changes summary: 2 artifacts changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 1 Added function Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 1 Added variable 1 Added function: [A] 'function bool ns_capable_noaudit(user_namespace*, int)' 1 Added variable: [A] 'user_namespace init_user_ns' Bug: 183086563 Signed-off-by: Howard Chen Change-Id: I7c175da4ab2fa7220408e6b8d69b3c2803915ce3 Signed-off-by: Greg Kroah-Hartman --- android/abi_gki_aarch64.xml | 2439 ++++++++++++---------------- android/abi_gki_aarch64_cuttlefish | 23 +- 2 files changed, 1099 insertions(+), 1363 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 763decbcc936..1323098836fb 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -2729,6 +2729,7 @@ + @@ -4867,6 +4868,7 @@ + @@ -15910,14 +15912,7 @@ - - - - - - - - + @@ -19561,14 +19556,7 @@ - - - - - - - - + @@ -58688,6 +58676,7 @@ + @@ -58740,7 +58729,6 @@ - @@ -59083,7 +59071,6 @@ - @@ -59775,185 +59762,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -60060,29 +59869,7 @@ - - - - - - - - - - - - - - - - - - - - - - - + @@ -60151,53 +59938,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -60239,17 +59980,12 @@ - - - - - @@ -60266,72 +60002,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -60453,122 +60124,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -60666,76 +60221,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -60865,32 +60360,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -61130,7 +60600,6 @@ - @@ -61138,74 +60607,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -61235,6 +60636,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61298,103 +60815,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -61702,6 +61123,7 @@ + @@ -61720,18 +61142,49 @@ - - - - - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -61833,27 +61286,13 @@ - + - + - - - - - - - - - - - - - - @@ -61934,17 +61373,6 @@ - - - - - - - - - - - @@ -62099,7 +61527,6 @@ - @@ -62111,6 +61538,10 @@ + + + + @@ -62299,29 +61730,121 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -62393,153 +61916,10 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -62555,13 +61935,28 @@ - - + + + + + + + + + + + + + + + + + @@ -62626,6 +62021,20 @@ + + + + + + + + + + + + + + @@ -62634,6 +62043,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -62642,10 +62146,6 @@ - - - - @@ -62655,16 +62155,16 @@ - + - + - + @@ -62765,7 +62265,7 @@ - + @@ -62797,27 +62297,27 @@ - + - + - + - + - + @@ -62836,12 +62336,12 @@ - + - + @@ -62853,7 +62353,7 @@ - + @@ -62861,69 +62361,69 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -62948,10 +62448,10 @@ - + - + @@ -62966,7 +62466,7 @@ - + @@ -62980,7 +62480,7 @@ - + @@ -62996,20 +62496,20 @@ - + - + - + - + @@ -63019,7 +62519,7 @@ - + @@ -63034,6 +62534,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -63177,7 +62890,7 @@ - + @@ -63191,7 +62904,7 @@ - + @@ -63509,7 +63222,7 @@ - + @@ -63767,7 +63480,7 @@ - + @@ -63784,16 +63497,16 @@ - + - + - + @@ -63847,7 +63560,7 @@ - + @@ -63895,7 +63608,7 @@ - + @@ -64074,7 +63787,7 @@ - + @@ -64109,7 +63822,7 @@ - + @@ -64158,7 +63871,7 @@ - + @@ -64396,7 +64109,7 @@ - + @@ -64748,7 +64461,7 @@ - + @@ -65006,7 +64719,7 @@ - + @@ -65047,7 +64760,7 @@ - + @@ -65333,7 +65046,7 @@ - + @@ -65361,7 +65074,7 @@ - + @@ -65494,13 +65207,13 @@ - + - + - + @@ -65523,7 +65236,7 @@ - + @@ -65543,7 +65256,7 @@ - + @@ -65754,10 +65467,10 @@ - + - + @@ -65830,7 +65543,7 @@ - + @@ -65870,10 +65583,10 @@ - + - + @@ -66184,7 +65897,7 @@ - + @@ -66271,7 +65984,7 @@ - + @@ -66680,7 +66393,7 @@ - + @@ -66693,20 +66406,20 @@ - + - + - + @@ -66714,15 +66427,15 @@ - + - - + + @@ -66734,7 +66447,7 @@ - + @@ -66926,7 +66639,7 @@ - + @@ -66951,7 +66664,7 @@ - + @@ -67035,7 +66748,7 @@ - + @@ -67113,7 +66826,7 @@ - + @@ -67121,7 +66834,7 @@ - + @@ -67132,7 +66845,7 @@ - + @@ -67140,7 +66853,7 @@ - + @@ -67188,36 +66901,36 @@ - + - + - + - + - + - + @@ -67259,19 +66972,19 @@ - + - + - + @@ -67279,13 +66992,13 @@ - + - + @@ -67298,7 +67011,7 @@ - + @@ -67312,7 +67025,7 @@ - + @@ -67435,7 +67148,7 @@ - + @@ -67450,7 +67163,7 @@ - + @@ -67486,7 +67199,7 @@ - + @@ -67505,7 +67218,7 @@ - + @@ -67535,7 +67248,7 @@ - + @@ -67614,7 +67327,7 @@ - + @@ -67626,7 +67339,7 @@ - + @@ -67634,8 +67347,6 @@ - - @@ -67663,9 +67374,9 @@ - - - + + + @@ -67754,12 +67465,12 @@ - - + + - + @@ -68497,19 +68208,19 @@ - + - + - + @@ -68552,7 +68263,7 @@ - + @@ -68925,7 +68636,7 @@ - + @@ -69721,7 +69432,7 @@ - + @@ -69943,13 +69654,13 @@ - + - + @@ -70225,18 +69936,18 @@ - + - + - + @@ -70255,7 +69966,7 @@ - + @@ -70319,6 +70030,7 @@ + @@ -70736,7 +70448,7 @@ - + @@ -70902,7 +70614,7 @@ - + @@ -70965,42 +70677,40 @@ - - - + - + - + - + - + - + - + - + @@ -71060,7 +70770,7 @@ - + @@ -71076,7 +70786,7 @@ - + @@ -71150,10 +70860,10 @@ - - - - + + + + @@ -71471,10 +71181,10 @@ - - - - + + + + @@ -71760,7 +71470,7 @@ - + @@ -73401,7 +73111,6 @@ - @@ -73476,6 +73185,7 @@ + @@ -73622,6 +73332,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -73650,6 +73463,10 @@ + + + + @@ -73767,6 +73584,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -73778,8 +73705,21 @@ + + + + + + + + + + + + + @@ -73855,6 +73795,23 @@ + + + + + + + + + + + + + + + + + @@ -82243,7 +82200,6 @@ - @@ -111079,7 +111035,7 @@ - + @@ -111123,7 +111079,7 @@ - + @@ -112544,7 +112500,7 @@ - + @@ -112556,260 +112512,8 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -115863,7 +115567,7 @@ - + @@ -115887,7 +115591,7 @@ - + @@ -122308,14 +122012,14 @@ - + - + - + @@ -122325,7 +122029,7 @@ - + @@ -122370,7 +122074,7 @@ - + @@ -122379,7 +122083,7 @@ - + @@ -122388,12 +122092,12 @@ - + - + @@ -122733,7 +122437,7 @@ - + @@ -122743,20 +122447,20 @@ - + - + - + @@ -122772,73 +122476,77 @@ - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + @@ -122869,7 +122577,7 @@ - + @@ -122978,7 +122686,7 @@ - + @@ -123022,7 +122730,7 @@ - + @@ -131641,7 +131349,7 @@ - + @@ -135145,6 +134853,7 @@ + @@ -139025,7 +138734,7 @@ - + @@ -141752,6 +141461,13 @@ + + + + + + + @@ -158079,6 +157795,9 @@ + + + @@ -161793,6 +161512,18 @@ + + + + + + + + + + + + @@ -165036,18 +164767,6 @@ - - - - - - - - - - - - @@ -170568,7 +170287,7 @@ - + @@ -177176,7 +176895,7 @@ - + diff --git a/android/abi_gki_aarch64_cuttlefish b/android/abi_gki_aarch64_cuttlefish index df6a9c3c7eb0..ed9d96a0557b 100644 --- a/android/abi_gki_aarch64_cuttlefish +++ b/android/abi_gki_aarch64_cuttlefish @@ -20,6 +20,7 @@ complete __const_udelay consume_skb + _copy_from_iter_full cpu_hwcap_keys cpu_hwcaps cpu_number @@ -63,7 +64,6 @@ kfree_skb __kmalloc kmalloc_caches - kmalloc_order_trace kmem_cache_alloc kmem_cache_alloc_trace kmem_cache_create @@ -159,6 +159,7 @@ sg_init_one sg_init_table skb_clone + skb_dequeue skb_put sk_free snd_device_new @@ -261,6 +262,19 @@ serdev_device_write serdev_device_write_wakeup +# required by hci_vhci.ko + bt_err + hci_alloc_dev + hci_free_dev + hci_recv_frame + hci_register_dev + hci_unregister_dev + skb_pull + skb_push + skb_queue_head + skb_queue_purge + skb_queue_tail + # required by incrementalfs.ko bin2hex __break_lease @@ -312,10 +326,12 @@ __msecs_to_jiffies mutex_is_locked notify_change + override_creds pagecache_get_page path_get path_put register_filesystem + revert_creds seq_puts set_anon_super sget @@ -595,6 +611,7 @@ drm_set_preferred_mode drm_universal_plane_init __get_task_comm + kmalloc_order_trace kvfree kvmalloc_node memdup_user @@ -825,12 +842,13 @@ bpf_trace_run10 bpf_trace_run8 cancel_delayed_work - _copy_from_iter_full _copy_to_iter trace_print_symbols_seq # required by vsock.ko autoremove_wake_function + init_user_ns + ns_capable_noaudit prandom_u32 prepare_to_wait proto_register @@ -839,7 +857,6 @@ _raw_write_unlock_bh security_sock_graft sk_alloc - skb_dequeue sock_init_data sock_no_accept sock_no_getsockopt From 35b7fe6c12bb80d23c59ae0de2c3d654fc5c37ae Mon Sep 17 00:00:00 2001 From: Giuliano Procida Date: Wed, 24 Mar 2021 23:59:59 +0000 Subject: [PATCH 26/28] ANDROID: Refresh GKI ABI XML There are no actually ABI differences. This is just a refresh before switching to a new version of libabigail and an incompatible ABI XML version. Bug: 183612421 Change-Id: I62e7eb766df62dd8b4b459f16fc321d40eb75772 Signed-off-by: Giuliano Procida --- android/abi_gki_aarch64.xml | 3468 +++++++++++++---------------------- 1 file changed, 1254 insertions(+), 2214 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 1323098836fb..8f3bb806fab7 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -13558,7 +13558,7 @@ - + @@ -35168,26 +35168,77 @@ - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -38700,7 +38751,7 @@ - + @@ -38802,9 +38853,6 @@ - - - @@ -39161,7 +39209,7 @@ - + @@ -39489,6 +39537,7 @@ + @@ -39500,13 +39549,27 @@ + + + + + + + + + + + + + + @@ -39528,8 +39591,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -39551,6 +39671,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -39772,18 +39930,15 @@ - - - - - - - - + + + + + @@ -40904,6 +41059,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -41133,11 +41380,15 @@ + + + + @@ -41150,29 +41401,7 @@ - - - - - - - - - - - - - - - - - - - - - - - + @@ -41324,17 +41553,6 @@ - - - - - - - - - - - @@ -41682,6 +41900,9 @@ + + + @@ -41697,6 +41918,7 @@ + @@ -41709,44 +41931,13 @@ - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -41792,6 +41983,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -41941,9 +42184,10 @@ + + + - - @@ -41952,6 +42196,7 @@ + @@ -41987,6 +42232,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -42055,6 +42320,7 @@ + @@ -42081,80 +42347,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -42190,6 +42382,9 @@ + + + @@ -42210,1384 +42405,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -43596,7 +42418,7 @@ - + @@ -43668,9 +42490,20 @@ + + + + + + + + + + + @@ -53402,6 +52235,9 @@ + + + @@ -60221,6 +59057,9 @@ + + + @@ -62155,16 +60994,16 @@ - + - + - + @@ -70031,7 +68870,6 @@ - @@ -70744,7 +69582,7 @@ - + @@ -73111,6 +71949,7 @@ + @@ -73185,7 +72024,6 @@ - @@ -73332,109 +72170,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -73463,10 +72198,6 @@ - - - - @@ -73584,116 +72315,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -73705,21 +72326,8 @@ - - - - - - - - - - - - - @@ -73795,23 +72403,6 @@ - - - - - - - - - - - - - - - - - @@ -82201,6 +80792,7 @@ + @@ -98766,6 +97358,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -99037,7 +97688,9 @@ + + @@ -99046,6 +97699,7 @@ + @@ -99189,6 +97843,7 @@ + @@ -99253,6 +97908,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -99299,6 +97980,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -99318,7 +98047,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -99412,6 +98181,23 @@ + + + + + + + + + + + + + + + + + @@ -99447,6 +98233,7 @@ + @@ -99578,7 +98365,29 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -99697,7 +98506,7 @@ - + @@ -99821,7 +98630,7 @@ - + @@ -99994,6 +98803,7 @@ + @@ -100049,6 +98859,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -100103,6 +98954,15 @@ + + + + + + + + + @@ -100151,6 +99011,14 @@ + + + + + + + + @@ -103035,7 +101903,7 @@ - + @@ -104639,7 +103507,7 @@ - + @@ -104684,7 +103552,7 @@ - + @@ -104752,7 +103620,7 @@ - + @@ -105703,7 +104571,7 @@ - + @@ -105775,6 +104643,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -106092,7 +104983,7 @@ - + @@ -107144,6 +106035,7 @@ + @@ -107240,7 +106132,7 @@ - + @@ -107342,7 +106234,7 @@ - + @@ -107878,34 +106770,34 @@ - + - + - + - + - + - + @@ -108137,21 +107029,21 @@ - + - + - + - + @@ -111595,7 +110487,7 @@ - + @@ -112500,7 +111392,7 @@ - + @@ -112512,8 +111404,260 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -115567,7 +114711,7 @@ - + @@ -115591,7 +114735,7 @@ - + @@ -122012,14 +121156,14 @@ - + - + - + @@ -122029,7 +121173,7 @@ - + @@ -122074,7 +121218,7 @@ - + @@ -122083,7 +121227,7 @@ - + @@ -122092,12 +121236,12 @@ - + - + @@ -122437,7 +121581,7 @@ - + @@ -122447,20 +121591,20 @@ - + - + - + @@ -122476,77 +121620,73 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + @@ -122577,7 +121717,7 @@ - + @@ -122686,7 +121826,7 @@ - + @@ -122730,7 +121870,7 @@ - + @@ -131349,7 +130489,7 @@ - + @@ -134853,7 +133993,6 @@ - @@ -138734,7 +137873,7 @@ - + @@ -142361,7 +141500,7 @@ - + @@ -145169,29 +144308,7 @@ - - - - - - - - - - - - - - - - - - - - - - - + @@ -160303,20 +159420,9 @@ - - - - - - - - - - - @@ -160340,10 +159446,10 @@ - + - + @@ -160393,7 +159499,7 @@ - + @@ -160439,16 +159545,31 @@ + + + + + + + + + + + + + + + @@ -161320,7 +160441,7 @@ - + @@ -161512,18 +160633,6 @@ - - - - - - - - - - - - @@ -164609,19 +163718,19 @@ - + - + - + - + @@ -164793,7 +163902,7 @@ - + @@ -172247,74 +171356,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -172323,7 +171364,7 @@ - + @@ -172429,7 +171470,6 @@ - @@ -173449,218 +172489,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -173744,17 +172573,6 @@ - - - - - - - - - - - @@ -173844,6 +172662,7 @@ + @@ -173856,6 +172675,9 @@ + + + @@ -173887,6 +172709,13 @@ + + + + + + + @@ -174142,6 +172971,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -174500,6 +173385,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -177540,6 +176558,10 @@ + + + + @@ -177564,6 +176586,7 @@ + @@ -177651,7 +176674,13 @@ + + + + + + @@ -177708,6 +176737,13 @@ + + + + + + + @@ -178285,6 +177321,10 @@ + + + + @@ -178416,7 +177456,7 @@ - + @@ -180271,23 +179311,23 @@ - + - + - + - + From ae37e86392ba5e33dc178c5ca16096029a2a3fe1 Mon Sep 17 00:00:00 2001 From: Giuliano Procida Date: Thu, 25 Mar 2021 00:08:36 +0000 Subject: [PATCH 27/28] ANDROID: refresh ABI XML to new version This is an incompatible ABI XML version change. Bitfield offsets are now correct. Bug: 183612421 Change-Id: Id1c656ffb78535b999cae5e395deaf32656b58b2 Signed-off-by: Giuliano Procida --- android/abi_gki_aarch64.xml | 65939 ++++++++++++++++++---------------- 1 file changed, 35125 insertions(+), 30814 deletions(-) diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 8f3bb806fab7..6aa47db183ed 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -1,5 +1,5 @@ - - + + @@ -4954,7 +4954,7 @@ - + @@ -5018,9 +5018,6 @@ - - - @@ -5029,6 +5026,9 @@ + + + @@ -5050,8 +5050,6 @@ - - @@ -5319,6 +5317,8 @@ + + @@ -5326,33 +5326,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5464,6 +5437,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5477,15 +5477,6 @@ - - - - - - - - - @@ -5586,19 +5577,19 @@ - + - + - + - + - + @@ -5685,6 +5676,15 @@ + + + + + + + + + @@ -5700,17 +5700,6 @@ - - - - - - - - - - - @@ -5843,7 +5832,58 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5869,19 +5909,7 @@ - - - - - - - - - - - - - + @@ -6052,6 +6080,20 @@ + + + + + + + + + + + + + + @@ -6074,6 +6116,23 @@ + + + + + + + + + + + + + + + + + @@ -6083,6 +6142,14 @@ + + + + + + + + @@ -6090,16 +6157,35 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6225,6 +6311,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6250,6 +6362,17 @@ + + + + + + + + + + + @@ -6283,12 +6406,9 @@ - - - - - - + + + @@ -6297,14 +6417,6 @@ - - - - - - - - @@ -6384,6 +6496,20 @@ + + + + + + + + + + + + + + @@ -6468,6 +6594,18 @@ + + + + + + + + + + + + @@ -6498,18 +6636,14 @@ - - - - - - - - - - - - + + + + + + + + @@ -6521,6 +6655,7 @@ + @@ -6539,8 +6674,19 @@ + + + + + + + + + + + @@ -6548,11 +6694,11 @@ + + + + - - - - @@ -6709,6 +6855,11 @@ + + + + + @@ -6723,13 +6874,69 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6845,19 +7052,19 @@ - + - + - + - + - + @@ -6956,6 +7163,13 @@ + + + + + + + @@ -6968,30 +7182,28 @@ + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -7033,34 +7245,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -7078,19 +7290,19 @@ - + - + - + - + - + @@ -7114,37 +7326,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -7373,37 +7585,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -7861,10 +8073,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7874,75 +8178,123 @@ + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8110,7 +8462,23 @@ - + + + + + + + + + + + + + + + + + @@ -8245,7 +8613,35 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8304,7 +8700,26 @@ - + + + + + + + + + + + + + + + + + + + + @@ -8348,7 +8763,68 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8442,19 +8918,19 @@ - + - + - + - + - + @@ -8579,6 +9055,14 @@ + + + + + + + + @@ -8679,6 +9163,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8704,6 +9256,14 @@ + + + + + + + + @@ -8718,47 +9278,104 @@ + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8781,6 +9398,24 @@ + + + + + + + + + + + + + + + + + + @@ -9108,14 +9743,65 @@ - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9207,6 +9893,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9216,7 +9927,161 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9361,7 +10226,206 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9535,10 +10599,10 @@ - + - + @@ -9686,6 +10750,20 @@ + + + + + + + + + + + + + + @@ -9730,16 +10808,16 @@ - + - + - + - + @@ -9858,10 +10936,10 @@ - + - + @@ -9905,12 +10983,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9930,10 +11068,22 @@ + + + + + + + + + + + + @@ -9941,68 +11091,271 @@ + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10126,7 +11479,54 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10172,7 +11572,7 @@ - + @@ -10204,11 +11604,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10226,7 +11667,189 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10288,6 +11911,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10386,7 +12089,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10406,6 +12146,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10414,6 +12195,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10634,9 +12461,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10650,6 +12559,17 @@ + + + + + + + + + + + @@ -10674,14 +12594,6 @@ - - - - - - - - @@ -10701,7 +12613,6 @@ - @@ -10710,6 +12621,7 @@ + @@ -10717,35 +12629,15 @@ + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -10760,6 +12652,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10879,7 +13148,23 @@ - + + + + + + + + + + + + + + + + + @@ -10976,6 +13261,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -10996,6 +13301,28 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -11074,8 +13401,149 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11138,6 +13606,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11158,13 +13670,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11190,27 +13875,12 @@ - + - + - - - - - - - - - - - - - - - - + @@ -11302,6 +13972,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -11313,6 +14006,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11341,6 +14129,20 @@ + + + + + + + + + + + + + + @@ -11495,7 +14297,150 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11544,48 +14489,23 @@ - + - + - + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - @@ -11725,15 +14645,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11767,14 +14761,6 @@ - - - - - - - - @@ -11801,12 +14787,29 @@ + + + + + + + + + + + + + + + + + @@ -11825,59 +14828,31 @@ + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11898,6 +14873,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11923,17 +15102,6 @@ - - - - - - - - - - - @@ -12003,19 +15171,19 @@ - + - + - + - + - + @@ -12057,6 +15225,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12152,16 +15384,16 @@ - + - + - + - + @@ -12197,7 +15429,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12218,6 +15590,1293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12229,7 +16888,339 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12300,29 +17291,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -12337,8 +17305,131 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12377,6 +17468,14 @@ + + + + + + + + @@ -12433,20 +17532,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12470,6 +17710,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12497,25 +17777,47 @@ - + - + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + @@ -12524,48 +17826,44 @@ + - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -12608,6 +17906,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12668,60 +18053,135 @@ - + - + - - + + - - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - + + + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12775,6 +18235,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12945,114 +18598,77 @@ - + - + - + - + - + - + - + - + + + + - + + + + - + + + + - + + + + - + - + - + - + - - - - + - + - - + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -13131,90 +18747,23 @@ - + - + - - - - + - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -13225,6 +18774,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13233,12 +19043,175 @@ - + - + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13249,6 +19222,427 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13260,12 +19654,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -13277,6 +19829,15 @@ + + + + + + + + + @@ -13291,7 +19852,26 @@ - + + + + + + + + + + + + + + + + + + + + @@ -13461,6 +20041,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13487,6 +20094,17 @@ + + + + + + + + + + + @@ -13495,6 +20113,17 @@ + + + + + + + + + + + @@ -13514,13 +20143,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + @@ -13531,9 +20362,29 @@ - - + + + + + + + + + + + + + + + + + + + + + + @@ -13566,6 +20417,20 @@ + + + + + + + + + + + + + + @@ -13578,15 +20443,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13596,76 +20494,106 @@ + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13726,12 +20654,126 @@ - + - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13796,6 +20838,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -13822,17 +20884,781 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13869,17 +21695,393 @@ - + - + - + - + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13896,6 +22098,11 @@ + + + + + @@ -13916,693 +22123,468 @@ - + - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14811,132 +22793,721 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14947,6 +23518,22 @@ + + + + + + + + + + + + + + + + @@ -14963,195 +23550,263 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + - + + + + + + + + + + + + + + + - - - - + - + + + + - + - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + - + - + + + + + + + + + + + + + - - + - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -15210,15 +23865,597 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -15226,6 +24463,2496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -15303,57 +27030,248 @@ - + + - + - + - - - - - - - - - - - - - - - - - - + - + - - + + - - - - + + + + + + + + + + + + + + - + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -15368,124 +27286,1208 @@ - - + - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - + - + + + + - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -15493,8 +28495,29 @@ - - + + + + + + + + + + + + + + + + + + + + + + + @@ -15503,6 +28526,14 @@ + + + + + + + + @@ -15511,89 +28542,159 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - - - + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -15671,7 +28772,4629 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -15748,302 +33471,245 @@ - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + - - + - - - - - - - - - + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + - + - + - + - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -16075,8 +33741,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -16109,7 +33932,7 @@ - + @@ -16210,21 +34033,163 @@ - + + + + - + - + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -16379,102 +34344,939 @@ - + + - + - + - + - - + + + + + - - - - + - - - - - - - + - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + - + + + + - + + + + - - - - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -16512,7 +35314,7 @@ - + @@ -16674,2589 +35476,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -19338,9 +35557,338 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -19536,15 +36084,197 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -19592,9 +36322,111 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -19660,7 +36492,71 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -20197,22 +37093,22 @@ - + - + - + - + - + - + @@ -20224,79 +37120,79 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -20810,19 +37706,19 @@ - + - + - + - + - + @@ -21319,7 +38215,7 @@ - + @@ -21373,7 +38269,7 @@ - + @@ -22658,13 +39554,13 @@ - + - + - + @@ -23321,37 +40217,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -24005,19 +40901,19 @@ - + - + - + - + - + @@ -24108,16 +41004,16 @@ - + - + - + - + @@ -24156,16 +41052,16 @@ - + - + - + - + @@ -24848,10 +41744,10 @@ - + - + @@ -25739,10 +42635,10 @@ - + - + @@ -26047,7 +42943,7 @@ - + @@ -26056,7 +42952,7 @@ - + @@ -26672,7 +43568,7 @@ - + @@ -27024,10 +43920,10 @@ - + - + @@ -27786,14 +44682,13 @@ - + - @@ -27950,9 +44845,9 @@ - + - + @@ -28413,6 +45308,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -28973,6 +45892,12 @@ + + + + + + @@ -29019,12 +45944,6 @@ - - - - - - @@ -29554,8 +46473,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -29609,8 +46574,12 @@ + + + + - + @@ -29618,7 +46587,7 @@ - + @@ -29630,7 +46599,7 @@ - + @@ -29663,7 +46632,7 @@ - + @@ -29681,7 +46650,7 @@ - + @@ -29698,13 +46667,13 @@ - + - + @@ -29728,7 +46697,7 @@ - + @@ -29811,7 +46780,7 @@ - + @@ -29830,14 +46799,13 @@ - - + @@ -29910,7 +46878,7 @@ - + @@ -29937,55 +46905,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -29997,10 +46965,10 @@ - + - + @@ -30021,112 +46989,112 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -30201,7 +47169,6 @@ - @@ -30319,31 +47286,31 @@ - + - + - + - + - + - + - + - + - + @@ -30362,13 +47329,6 @@ - - - - - - - @@ -30399,9 +47359,14 @@ + + + + + + + - - @@ -30419,7 +47384,8 @@ - + + @@ -30463,6 +47429,7 @@ + @@ -30501,7 +47468,7 @@ - + @@ -30511,7 +47478,7 @@ - + @@ -30524,10 +47491,10 @@ - + - + @@ -30536,7 +47503,7 @@ - + @@ -30544,1235 +47511,28 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + @@ -31798,7 +47558,7 @@ - + @@ -31812,7 +47572,7 @@ - + @@ -31826,7 +47586,7 @@ - + @@ -31840,7 +47600,7 @@ - + @@ -31851,123 +47611,13 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -31979,7 +47629,7 @@ - + @@ -32163,26 +47813,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -32198,8 +47828,6 @@ - - @@ -32218,7 +47846,6 @@ - @@ -32241,7 +47868,7 @@ - + @@ -32401,14 +48028,14 @@ - + - + @@ -32434,7 +48061,7 @@ - + @@ -32446,69 +48073,39 @@ - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -32521,33 +48118,33 @@ - + - + - + - + - + - + - + @@ -32567,9 +48164,9 @@ - + - + @@ -32577,24 +48174,24 @@ - + - + - + - + @@ -32602,7 +48199,7 @@ - + @@ -32623,7 +48220,7 @@ - + @@ -32646,7 +48243,7 @@ - + @@ -32658,7 +48255,7 @@ - + @@ -32667,7 +48264,7 @@ - + @@ -32677,21 +48274,21 @@ - + - + - + - + @@ -32706,28 +48303,17 @@ - - - - - - - - - - - - + - + - + @@ -32738,13 +48324,13 @@ - + - + @@ -32765,155 +48351,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -33263,43 +48708,41 @@ - - - + - + - + - + - + - + - + - + @@ -33328,7 +48771,7 @@ - + @@ -33342,27 +48785,27 @@ - + - + - - + + - + - + - + @@ -33378,7 +48821,7 @@ - + @@ -33386,248 +48829,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -33641,10 +48846,10 @@ - + - + @@ -33653,64 +48858,64 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -33778,7 +48983,7 @@ - + @@ -33787,7 +48992,7 @@ - + @@ -33803,22 +49008,8 @@ - + - - - - - - - - - - - - - - @@ -33862,56 +49053,55 @@ - - + - + - + - + - + - + - + - + - + - + @@ -33995,13 +49185,13 @@ - + - + @@ -34023,7 +49213,7 @@ - + @@ -34101,7 +49291,7 @@ - + @@ -34176,7 +49366,7 @@ - + @@ -34202,14 +49392,13 @@ - - + + - @@ -34225,38 +49414,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -34265,110 +49422,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -34380,41 +49433,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -34524,7 +49542,7 @@ - + @@ -34550,50 +49568,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -34609,17 +49583,11 @@ - - - + - - - - @@ -34650,7 +49618,7 @@ - + @@ -34659,7 +49627,7 @@ - + @@ -34694,7 +49662,7 @@ - + @@ -34703,7 +49671,7 @@ - + @@ -34712,7 +49680,7 @@ - + @@ -34721,7 +49689,7 @@ - + @@ -34735,21 +49703,21 @@ - + - + - + - + @@ -34767,29 +49735,29 @@ - + - + - + - + - + - + @@ -34804,7 +49772,7 @@ - + @@ -34817,7 +49785,7 @@ - + @@ -34835,7 +49803,7 @@ - + @@ -34846,11 +49814,8 @@ - - - - + @@ -34863,10 +49828,10 @@ - + - + @@ -34944,7 +49909,7 @@ - + @@ -35051,7 +50016,7 @@ - + @@ -35059,7 +50024,7 @@ - + @@ -35128,7 +50093,7 @@ - + @@ -35137,7 +50102,7 @@ - + @@ -35165,15 +50130,96 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + @@ -35239,7 +50285,107 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -35271,7 +50417,20 @@ - + + + + + + + + + + + + + + @@ -35292,7 +50451,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -35304,7 +50500,137 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -35382,7 +50708,131 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -35394,13 +50844,13 @@ - + - + @@ -35495,7 +50945,7 @@ - + @@ -35546,413 +50996,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -36272,36 +51315,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -36877,7 +51890,7 @@ - + @@ -37315,10 +52328,10 @@ - + - + @@ -37405,7 +52418,7 @@ - + @@ -38325,7 +53338,7 @@ - + @@ -38381,7 +53394,7 @@ - + @@ -38404,7 +53417,7 @@ - + @@ -38422,7 +53435,7 @@ - + @@ -38527,7 +53540,7 @@ - + @@ -38535,7 +53548,7 @@ - + @@ -38621,7 +53634,7 @@ - + @@ -38635,7 +53648,6 @@ - @@ -38751,8 +53763,7 @@ - - + @@ -38853,23 +53864,16 @@ - - - - - - - - + @@ -38961,7 +53965,7 @@ - + @@ -38969,7 +53973,7 @@ - + @@ -38977,42 +53981,42 @@ - + - + - + - + - + - + - + @@ -39021,160 +54025,160 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -39182,127 +54186,127 @@ - + - + - + - + - - + + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -39310,7 +54314,7 @@ - + @@ -39320,7 +54324,7 @@ - + @@ -39335,15 +54339,15 @@ - - + + - + @@ -39355,13 +54359,13 @@ - + - + @@ -39379,19 +54383,19 @@ - + - + - + @@ -39399,9 +54403,9 @@ - + - + @@ -39410,7 +54414,7 @@ - + @@ -39429,7 +54433,7 @@ - + @@ -39439,85 +54443,85 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -39533,2997 +54537,14 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -42601,7 +54622,7 @@ - + @@ -42754,7 +54775,7 @@ - + @@ -42781,7 +54802,7 @@ - + @@ -42851,7 +54872,7 @@ - + @@ -42859,7 +54880,7 @@ - + @@ -42869,7 +54890,7 @@ - + @@ -42983,13 +55004,13 @@ - + - + @@ -43097,13 +55118,13 @@ - + - + @@ -43119,14 +55140,14 @@ - + - + @@ -43223,7 +55244,7 @@ - + @@ -43243,13 +55264,13 @@ - + - + @@ -43262,7 +55283,7 @@ - + @@ -43275,7 +55296,7 @@ - + @@ -43283,7 +55304,7 @@ - + @@ -43293,7 +55314,7 @@ - + @@ -43347,7 +55368,7 @@ - + @@ -43362,7 +55383,7 @@ - + @@ -43384,7 +55405,7 @@ - + @@ -43392,7 +55413,7 @@ - + @@ -43436,93 +55457,20 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - + - + @@ -43561,7 +55509,7 @@ - + @@ -43614,7 +55562,7 @@ - + @@ -43630,9 +55578,8 @@ - - + @@ -43764,7 +55711,6 @@ - @@ -43776,6 +55722,7 @@ + @@ -43785,91 +55732,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -43877,9 +55740,6 @@ - - - @@ -43978,8 +55838,6 @@ - - @@ -44038,16 +55896,9 @@ + + - - - - - - - - - @@ -44065,6 +55916,15 @@ + + + + + + + + + @@ -44081,10 +55941,10 @@ - + - + @@ -44094,7 +55954,7 @@ - + @@ -44136,7 +55996,7 @@ - + @@ -44157,7 +56017,7 @@ - + @@ -44171,7 +56031,7 @@ - + @@ -44232,10 +56092,10 @@ - + - + @@ -44303,8 +56163,6 @@ - - @@ -44366,9 +56224,8 @@ - - - + + @@ -44387,17 +56244,10 @@ + + + - - - - - - - - - - @@ -44454,6 +56304,16 @@ + + + + + + + + + + @@ -44463,8 +56323,6 @@ - - @@ -44473,6 +56331,8 @@ + + @@ -44513,7 +56373,6 @@ - @@ -44522,9 +56381,10 @@ + - + @@ -44547,7 +56407,7 @@ - + @@ -44559,7 +56419,7 @@ - + @@ -45025,8 +56885,6 @@ - - @@ -45117,9 +56975,8 @@ - - - + + @@ -45128,7 +56985,50 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45244,9 +57144,10 @@ - - - + + + + @@ -45255,7 +57156,94 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45284,8 +57272,33 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45366,374 +57379,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -45925,22 +57570,121 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45970,9 +57714,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45981,9 +57971,32 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46022,10 +58035,23 @@ + + + + + + + + + + + + + + - @@ -46113,17 +58139,11 @@ - - - - - - - - - - - + + + + + @@ -46141,6 +58161,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46150,16 +58297,40 @@ + + + + + + + + + + + + + + + + + + + + + + + - + + @@ -46168,6 +58339,7 @@ + @@ -46182,7 +58354,320 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46235,8 +58720,6 @@ - - @@ -46263,6 +58746,8 @@ + + @@ -46321,7 +58806,7 @@ - + @@ -46455,13 +58940,6 @@ - - - - - - - @@ -46473,11 +58951,12 @@ - - - - - + + + + + + @@ -46510,85 +58989,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + @@ -46663,578 +59068,16 @@ - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -47272,34 +59115,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -47386,7 +59229,7 @@ - + @@ -47424,7 +59267,7 @@ - + @@ -47472,10 +59315,10 @@ - + - + @@ -47490,8 +59333,7 @@ - - + @@ -47769,13 +59611,13 @@ - + - + - + @@ -47813,7 +59655,7 @@ - + @@ -47884,7 +59726,6 @@ - @@ -47907,7 +59748,19 @@ + + + + + + + + + + + + @@ -47971,23 +59824,272 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -47999,197 +60101,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -48607,7 +60518,6 @@ - @@ -48819,7 +60729,7 @@ - + @@ -48865,7 +60775,7 @@ - + @@ -48886,7 +60796,7 @@ - + @@ -48908,9 +60818,8 @@ - - + @@ -48940,7 +60849,7 @@ - + @@ -48967,50 +60876,50 @@ - + - + - + - + - + - + - + - + - + - + @@ -49073,7 +60982,7 @@ - + @@ -49081,7 +60990,7 @@ - + @@ -49097,7 +61006,6 @@ - @@ -49673,6 +61581,7 @@ + @@ -49695,11 +61604,6 @@ - - - - - @@ -49722,7 +61626,7 @@ - + @@ -49831,6 +61735,11 @@ + + + + + @@ -49838,14 +61747,6 @@ - - - - - - - - @@ -49907,24 +61808,18 @@ + + + + + + + + - - - - - - - - - - - - - - @@ -49948,6 +61843,20 @@ + + + + + + + + + + + + + + @@ -49965,7 +61874,7 @@ - + @@ -50023,7 +61932,20 @@ - + + + + + + + + + + + + + + @@ -50395,34 +62317,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -50892,19 +62814,19 @@ - + - + - + - + - + @@ -51190,22 +63112,22 @@ - + - + - + - + - + - + @@ -51858,7 +63780,7 @@ - + @@ -51915,7 +63837,7 @@ - + @@ -52113,6 +64035,7 @@ + @@ -52235,11 +64158,23 @@ - - - + + + + + + + + + + + + + + + - + @@ -52251,7 +64186,7 @@ - + @@ -52356,14 +64291,14 @@ - + - + @@ -52429,7 +64364,7 @@ - + @@ -52505,24 +64440,7 @@ - - - - - - - - - - - - - - - - - - + @@ -52537,9 +64455,8 @@ - - + @@ -52561,9 +64478,9 @@ - + - + @@ -52576,10 +64493,8 @@ - - - + @@ -52604,18 +64519,17 @@ - + - + - - + @@ -52626,7 +64540,6 @@ - @@ -52667,7 +64580,7 @@ - + @@ -52683,7 +64596,7 @@ - + @@ -52712,7 +64625,7 @@ - + @@ -52723,13 +64636,13 @@ - + - + - + @@ -52740,7 +64653,7 @@ - + @@ -52755,10 +64668,10 @@ - + - + @@ -52771,7 +64684,7 @@ - + @@ -52788,7 +64701,7 @@ - + @@ -52890,7 +64803,6 @@ - @@ -53058,7 +64970,6 @@ - @@ -53163,11 +65074,11 @@ - + - + @@ -53348,7 +65259,7 @@ - + @@ -53361,7 +65272,7 @@ - + @@ -53374,10 +65285,162 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -53408,7 +65471,7 @@ - + @@ -53436,10 +65499,8 @@ - - - + @@ -53461,7 +65522,7 @@ - + @@ -53515,7 +65576,7 @@ - + @@ -53622,7 +65683,7 @@ - + @@ -53724,7 +65785,7 @@ - + @@ -53924,16 +65985,6 @@ - - - - - - - - - - @@ -53945,6 +65996,16 @@ + + + + + + + + + + @@ -54060,7 +66121,7 @@ - + @@ -54108,7 +66169,7 @@ - + @@ -54137,12 +66198,11 @@ - + - + - @@ -54297,7 +66357,7 @@ - + @@ -54341,7 +66401,6 @@ - @@ -54371,7 +66430,7 @@ - + @@ -54391,8 +66450,6 @@ - - @@ -54404,6 +66461,8 @@ + + @@ -54423,7 +66482,7 @@ - + @@ -54612,15 +66671,14 @@ - - + - + @@ -54639,7 +66697,7 @@ - + @@ -54647,7 +66705,7 @@ - + @@ -54789,10 +66847,6 @@ - - - - @@ -54818,6 +66872,10 @@ + + + + @@ -54839,7 +66897,7 @@ - + @@ -54901,13 +66959,13 @@ - + - + @@ -54934,7 +66992,7 @@ - + @@ -55048,8 +67106,6 @@ - - @@ -55061,7 +67117,8 @@ - + + @@ -55084,8 +67141,7 @@ - - + @@ -55139,22 +67195,9 @@ - - - - - - - - + + - - - - - - - @@ -55195,6 +67238,13 @@ + + + + + + + @@ -55203,28 +67253,10 @@ - - - - - - - - - - - - - - - - - - @@ -55272,7 +67304,7 @@ - + @@ -55310,7 +67342,7 @@ - + @@ -55336,7 +67368,7 @@ - + @@ -55359,7 +67391,7 @@ - + @@ -55367,24 +67399,24 @@ - - + + - + - + - + @@ -55396,15 +67428,11 @@ - + - - - - @@ -55416,7 +67444,7 @@ - + @@ -55437,172 +67465,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -55629,25 +67491,9 @@ - - - - - - - - - - - - - - - - @@ -55659,88 +67505,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -55777,12 +67548,12 @@ - + - + @@ -55790,7 +67561,7 @@ - + @@ -55804,7 +67575,7 @@ - + @@ -55860,10 +67631,6 @@ - - - - @@ -55889,6 +67656,10 @@ + + + + @@ -55899,7 +67670,7 @@ - + @@ -55969,13 +67740,13 @@ - - + + @@ -56038,7 +67809,7 @@ - + @@ -56051,53 +67822,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -56148,7 +67872,6 @@ - @@ -56201,7 +67924,7 @@ - + @@ -56214,7 +67937,7 @@ - + @@ -56224,7 +67947,7 @@ - + @@ -56236,7 +67959,7 @@ - + @@ -56901,7 +68624,7 @@ - + @@ -56938,7 +68661,7 @@ - + @@ -56956,16 +68679,16 @@ - + - + - + @@ -56985,7 +68708,7 @@ - + @@ -57080,20 +68803,6 @@ - - - - - - - - - - - - - - @@ -57111,8 +68820,22 @@ + + + + + + + + + + + + + + - + @@ -57220,7 +68943,7 @@ - + @@ -57280,7 +69003,7 @@ - + @@ -57304,7 +69027,7 @@ - + @@ -57320,7 +69043,7 @@ - + @@ -57456,7 +69179,6 @@ - @@ -57468,28 +69190,9 @@ + - - - - - - - - - - - - - - - - - - - - - + @@ -57512,7 +69215,6 @@ - @@ -57565,6 +69267,7 @@ + @@ -57575,8 +69278,6 @@ - - @@ -57880,7 +69581,7 @@ - + @@ -57907,52 +69608,31 @@ + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -58476,6 +70156,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58483,50 +70205,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -58598,7 +70276,185 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58704,8 +70560,67 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58774,7 +70689,53 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58784,12 +70745,6 @@ - - - - - - @@ -58801,6 +70756,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58813,32 +70812,53 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58960,521 +70980,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -59591,6 +71096,720 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -59654,7 +71873,103 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -59809,7 +72124,7 @@ - + @@ -59952,6 +72267,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -59962,73 +72301,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -60039,7 +72318,7 @@ - + @@ -60061,25 +72340,25 @@ - + - + - + - + - + - + - + @@ -60125,13 +72404,64 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -60212,7 +72542,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60252,7 +72622,7 @@ - + @@ -60365,7 +72735,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60375,28 +72771,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -60569,121 +72943,29 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - - - - - + + - @@ -60755,34 +73037,180 @@ - + - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60796,6 +73224,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60860,18 +73362,14 @@ - + + + - - - - + - - - - + @@ -60882,113 +73380,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -61022,7 +73421,6 @@ - @@ -61037,74 +73435,21 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + @@ -61136,27 +73481,27 @@ - + - + - + - + - + @@ -61175,12 +73520,12 @@ - + - + @@ -61192,7 +73537,7 @@ - + @@ -61200,69 +73545,69 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -61287,10 +73632,10 @@ - + - + @@ -61305,7 +73650,7 @@ - + @@ -61319,7 +73664,7 @@ - + @@ -61335,20 +73680,20 @@ - + - + - + - + @@ -61358,7 +73703,7 @@ - + @@ -61373,221 +73718,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -61675,46 +73807,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -61725,16 +73818,14 @@ - - - + - + - - + + @@ -61743,11 +73834,11 @@ - + - + @@ -61800,7 +73891,7 @@ - + @@ -61822,14 +73913,14 @@ - + - + @@ -61842,13 +73933,13 @@ - + - + @@ -61863,7 +73954,7 @@ - + @@ -61976,8 +74067,7 @@ - - + @@ -62032,7 +74122,6 @@ - @@ -62061,7 +74150,7 @@ - + @@ -62085,17 +74174,52 @@ - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -62110,8 +74234,64 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -62122,9 +74302,58 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -62319,7 +74548,7 @@ - + @@ -62336,16 +74565,16 @@ - + - + - + @@ -62399,7 +74628,7 @@ - + @@ -62420,7 +74649,7 @@ - + @@ -62447,7 +74676,7 @@ - + @@ -62626,7 +74855,7 @@ - + @@ -62661,7 +74890,7 @@ - + @@ -62710,7 +74939,7 @@ - + @@ -62948,7 +75177,7 @@ - + @@ -63300,7 +75529,7 @@ - + @@ -63558,23 +75787,23 @@ - + - + - + - + - + @@ -63599,7 +75828,7 @@ - + @@ -63885,7 +76114,7 @@ - + @@ -63913,7 +76142,7 @@ - + @@ -63985,25 +76214,25 @@ - + - + - + - + - + - + - + @@ -64046,13 +76275,13 @@ - + - + - + @@ -64075,7 +76304,7 @@ - + @@ -64095,7 +76324,7 @@ - + @@ -64306,10 +76535,10 @@ - + - + @@ -64382,7 +76611,7 @@ - + @@ -64422,10 +76651,10 @@ - + - + @@ -64736,7 +76965,7 @@ - + @@ -64823,7 +77052,7 @@ - + @@ -64834,7 +77063,7 @@ - + @@ -65228,11 +77457,9 @@ - - - + @@ -65245,20 +77472,20 @@ - + - + - + @@ -65266,15 +77493,15 @@ - + - - + + @@ -65286,10 +77513,10 @@ - + - + @@ -65358,7 +77585,6 @@ - @@ -65474,11 +77700,11 @@ - + - + @@ -65503,13 +77729,13 @@ - + - + @@ -65587,7 +77813,7 @@ - + @@ -65665,7 +77891,7 @@ - + @@ -65673,7 +77899,7 @@ - + @@ -65684,7 +77910,7 @@ - + @@ -65692,7 +77918,7 @@ - + @@ -65740,36 +77966,36 @@ - + - + - + - + - + - + @@ -65811,19 +78037,19 @@ - + - + - + @@ -65831,13 +78057,13 @@ - + - + @@ -65850,7 +78076,7 @@ - + @@ -65864,7 +78090,7 @@ - + @@ -65922,7 +78148,7 @@ - + @@ -65987,7 +78213,7 @@ - + @@ -66002,7 +78228,7 @@ - + @@ -66038,7 +78264,7 @@ - + @@ -66057,7 +78283,7 @@ - + @@ -66087,7 +78313,7 @@ - + @@ -66141,7 +78367,7 @@ - + @@ -66150,10 +78376,9 @@ - - + @@ -66178,7 +78403,7 @@ - + @@ -66187,7 +78412,7 @@ - + @@ -66211,12 +78436,135 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -66304,13 +78652,9 @@ - - - - @@ -66423,13 +78767,1188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -67047,19 +80566,19 @@ - + - + - + @@ -67091,7 +80610,7 @@ - + @@ -67102,7 +80621,7 @@ - + @@ -67124,18 +80643,6 @@ - - - - - - - - - - - - @@ -67222,13 +80729,18 @@ - - - - - - - + + + + + + + + + + + + @@ -67240,6 +80752,13 @@ + + + + + + + @@ -67348,12 +80867,6 @@ - - - - - - @@ -67396,6 +80909,12 @@ + + + + + + @@ -67456,7 +80975,7 @@ - + @@ -67475,7 +80994,7 @@ - + @@ -67485,7 +81004,7 @@ - + @@ -67794,7 +81313,7 @@ - + @@ -68012,6 +81531,14 @@ + + + + + + + + @@ -68111,32 +81638,23 @@ - - - - - - - - - + - + - - + - + @@ -68148,104 +81666,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -68271,7 +81699,7 @@ - + @@ -68286,7 +81714,7 @@ - + @@ -68336,13 +81764,13 @@ - + - + @@ -68352,7 +81780,7 @@ - + @@ -68366,7 +81794,7 @@ - + @@ -68376,7 +81804,7 @@ - + @@ -68387,7 +81815,7 @@ - + @@ -68395,7 +81823,7 @@ - + @@ -68404,11 +81832,11 @@ - + - + @@ -68422,7 +81850,7 @@ - + @@ -68430,7 +81858,7 @@ - + @@ -68442,7 +81870,7 @@ - + @@ -68478,13 +81906,12 @@ - - + - + @@ -68493,13 +81920,13 @@ - + - + @@ -68510,26 +81937,26 @@ - + - + - + - + - + - + @@ -68537,73 +81964,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -68661,10 +82026,10 @@ - + - + @@ -68678,22 +82043,8 @@ - - - - - - - - - - - - - - - + @@ -68745,28 +82096,24 @@ - - - - - + - + @@ -68781,14 +82128,14 @@ - + - + @@ -68827,9 +82174,9 @@ - + - + @@ -68840,19 +82187,17 @@ - + - + - + - - - + @@ -68869,7 +82214,6 @@ - @@ -68891,7 +82235,7 @@ - + @@ -68899,7 +82243,7 @@ - + @@ -68907,7 +82251,7 @@ - + @@ -68918,7 +82262,7 @@ - + @@ -69224,7 +82568,7 @@ - + @@ -69273,7 +82617,7 @@ - + @@ -69283,16 +82627,16 @@ - + - + - + @@ -69389,7 +82733,7 @@ - + @@ -69410,13 +82754,13 @@ - + - + @@ -69516,7 +82860,7 @@ - + @@ -69554,14 +82898,14 @@ - + - + @@ -69576,7 +82920,7 @@ - + @@ -69608,7 +82952,7 @@ - + @@ -69620,11 +82964,11 @@ - + - + @@ -69636,7 +82980,7 @@ - + @@ -69646,29 +82990,29 @@ - + - + - + - + - + @@ -69679,13 +83023,13 @@ - + - + @@ -69697,11 +83041,7 @@ - - - - - + @@ -70019,10 +83359,6 @@ - - - - @@ -70111,7 +83447,7 @@ - + @@ -70122,7 +83458,7 @@ - + @@ -70148,7 +83484,7 @@ - + @@ -70194,7 +83530,7 @@ - + @@ -70237,7 +83573,7 @@ - + @@ -70288,7 +83624,7 @@ - + @@ -70308,7 +83644,7 @@ - + @@ -70343,13 +83679,13 @@ - + - + @@ -70486,7 +83822,6 @@ - @@ -70577,7 +83912,7 @@ - + @@ -70674,14 +84009,7 @@ - - - - - - - - + @@ -70719,6 +84047,14 @@ + + + + + + + + @@ -70856,11 +84192,11 @@ - + - + @@ -70874,7 +84210,6 @@ - @@ -70918,8 +84253,7 @@ - - + @@ -70937,21 +84271,23 @@ + + + - - + - + @@ -70960,13 +84296,13 @@ - + - + @@ -70986,7 +84322,7 @@ - + @@ -70994,7 +84330,7 @@ - + @@ -71015,7 +84351,7 @@ - + @@ -71049,7 +84385,7 @@ - + @@ -71197,7 +84533,7 @@ - + @@ -71447,7 +84783,7 @@ - + @@ -71640,16 +84976,16 @@ - + - + - + @@ -71667,8 +85003,7 @@ - - + @@ -71686,7 +85021,7 @@ - + @@ -71719,7 +85054,7 @@ - + @@ -71918,7 +85253,7 @@ - + @@ -71949,7 +85284,6 @@ - @@ -72023,589 +85357,263 @@ - - + + - + - - - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - + - + - + - + + + + - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + - + @@ -72620,13 +85628,13 @@ - + - + @@ -72650,7 +85658,7 @@ - + @@ -72766,16 +85774,109 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -72875,7 +85976,7 @@ - + @@ -72895,14 +85996,12 @@ - - - + @@ -72919,7 +86018,7 @@ - + @@ -73000,19 +86099,19 @@ - + - + - + @@ -73146,14 +86245,6 @@ - - - - - - - - @@ -73189,6 +86280,14 @@ + + + + + + + + @@ -73205,7 +86304,7 @@ - + @@ -73219,7 +86318,7 @@ - + @@ -73240,7 +86339,7 @@ - + @@ -73315,7 +86414,7 @@ - + @@ -73396,7 +86495,7 @@ - + @@ -73420,12 +86519,6 @@ - - - - - - @@ -73494,11 +86587,11 @@ - - - - - + + + + + @@ -73609,16 +86702,16 @@ - + - + - + - + @@ -73675,6 +86768,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -73737,42 +86860,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -73784,9 +86874,14 @@ - - - + + + + + + + + @@ -73824,6 +86919,9 @@ + + + @@ -73851,7 +86949,7 @@ - + @@ -74009,7 +87107,7 @@ - + @@ -74167,16 +87265,16 @@ - + - + - + - + @@ -74629,7 +87727,7 @@ - + @@ -74728,8 +87826,7 @@ - - + @@ -74783,8 +87880,6 @@ - - @@ -74846,7 +87941,7 @@ - + @@ -74863,17 +87958,17 @@ - + - + - + @@ -74909,7 +88004,7 @@ - + @@ -75584,7 +88679,7 @@ - + @@ -75803,7 +88898,7 @@ - + @@ -75814,7 +88909,7 @@ - + @@ -75919,43 +89014,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -75988,13 +89083,13 @@ - + - + - + @@ -76034,34 +89129,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -76160,6 +89227,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -76168,7 +89263,6 @@ - @@ -76188,16 +89282,16 @@ - + - + - + - + @@ -76391,6 +89485,7 @@ + @@ -76572,28 +89667,28 @@ - + - + - + - + - + - + - + - + @@ -76713,7 +89808,7 @@ - + @@ -76818,9 +89913,6 @@ - - - @@ -76835,6 +89927,9 @@ + + + @@ -76876,7 +89971,7 @@ - + @@ -77005,7 +90100,7 @@ - + @@ -77096,14 +90191,14 @@ - + - + @@ -77282,7 +90377,7 @@ - + @@ -77311,7 +90406,7 @@ - + @@ -77480,7 +90575,7 @@ - + @@ -77505,7 +90600,7 @@ - + @@ -77696,7 +90791,7 @@ - + @@ -77725,7 +90820,7 @@ - + @@ -77735,13 +90830,13 @@ - + - + @@ -77858,7 +90953,7 @@ - + @@ -77937,7 +91032,7 @@ - + @@ -77952,7 +91047,7 @@ - + @@ -77993,31 +91088,31 @@ - + - + - + - + - + - + - + - + - + @@ -78108,7 +91203,7 @@ - + @@ -78138,22 +91233,22 @@ - + - + - + - + - + - + @@ -78273,7 +91368,7 @@ - + @@ -78341,7 +91436,7 @@ - + @@ -78368,55 +91463,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -78428,10 +91523,10 @@ - + - + @@ -78452,112 +91547,112 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -78771,7 +91866,7 @@ - + @@ -78839,8 +91934,8 @@ - - + + @@ -78869,26 +91964,26 @@ - + - + - + - + @@ -78967,7 +92062,7 @@ - + @@ -79025,7 +92120,7 @@ - + @@ -79066,7 +92161,6 @@ - @@ -79078,6 +92172,7 @@ + @@ -79096,7 +92191,7 @@ - + @@ -79126,7 +92221,7 @@ - + @@ -79137,14 +92232,14 @@ - + - + @@ -79169,7 +92264,7 @@ - + @@ -79213,12 +92308,12 @@ - + - + @@ -79337,7 +92432,7 @@ - + @@ -79405,7 +92500,7 @@ - + @@ -79429,7 +92524,7 @@ - + @@ -79437,11 +92532,7 @@ - - - - - + @@ -79485,8 +92576,6 @@ - - @@ -79626,7 +92715,7 @@ - + @@ -79652,68 +92741,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -79852,7 +92879,7 @@ - + @@ -80002,7 +93029,7 @@ - + @@ -80058,46 +93085,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -80122,9 +93109,6 @@ - - - @@ -80140,23 +93124,18 @@ - - - - - @@ -80223,7 +93202,7 @@ - + @@ -80232,38 +93211,38 @@ - + - + - + - + - + - + @@ -80316,17 +93295,17 @@ - + - + - + @@ -80341,14 +93320,14 @@ - + - + @@ -80365,7 +93344,7 @@ - + @@ -80374,7 +93353,7 @@ - + @@ -80383,7 +93362,7 @@ - + @@ -80452,9 +93431,6 @@ - - - @@ -80476,21 +93452,21 @@ - + - + - + @@ -80499,7 +93475,7 @@ - + @@ -80525,7 +93501,7 @@ - + @@ -80537,7 +93513,7 @@ - + @@ -80581,44 +93557,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -80632,50 +93575,50 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -80686,7 +93629,7 @@ - + @@ -80786,20 +93729,17 @@ - - + - - - + @@ -80809,752 +93749,25 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -81585,7 +93798,7 @@ - + @@ -81608,140 +93821,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -82007,7 +94092,7 @@ - + @@ -82083,7 +94168,7 @@ - + @@ -82253,7 +94338,6 @@ - @@ -82289,49 +94373,49 @@ - + - + - + - + - + - + - - + + - + - + - + @@ -82379,17 +94463,17 @@ - + - + - - + + @@ -82402,7 +94486,7 @@ - + @@ -82419,7 +94503,7 @@ - + @@ -82437,12 +94521,12 @@ - + - + @@ -82456,7 +94540,7 @@ - + @@ -82555,13 +94639,13 @@ - + - + - + @@ -82587,31 +94671,31 @@ - + - + - + - + - + - + - + - + - + @@ -82680,31 +94764,31 @@ - + - + - + - + - + - + - + - + - + @@ -82730,10 +94814,6 @@ - - - - @@ -82791,10 +94871,10 @@ - + - + @@ -82838,20 +94918,13 @@ + + + + - - - - - - - - - - - @@ -82971,6 +95044,17 @@ + + + + + + + + + + + @@ -82982,13 +95066,6 @@ - - - - - - - @@ -83063,6 +95140,13 @@ + + + + + + + @@ -83073,9 +95157,6 @@ - - - @@ -83087,11 +95168,13 @@ + + + - @@ -83103,7 +95186,7 @@ - + @@ -83126,7 +95209,7 @@ - + @@ -83152,6 +95235,7 @@ + @@ -83211,7 +95295,7 @@ - + @@ -83235,15 +95319,6 @@ - - - - - - - - - @@ -83255,12 +95330,20 @@ + + + + + + + + + - @@ -83294,13 +95377,7 @@ - - - - - - - + @@ -83312,11 +95389,18 @@ + + + + + + + - + @@ -83328,7 +95412,7 @@ - + @@ -83358,7 +95442,7 @@ - + @@ -83986,10 +96070,10 @@ - + - + @@ -84084,7 +96168,7 @@ - + @@ -84101,7 +96185,7 @@ - + @@ -84445,7 +96529,7 @@ - + @@ -84504,7 +96588,7 @@ - + @@ -84585,7 +96669,7 @@ - + @@ -84771,6 +96855,11 @@ + + + + + @@ -84781,11 +96870,6 @@ - - - - - @@ -84808,10 +96892,50 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -84843,7 +96967,7 @@ - + @@ -84855,7 +96979,7 @@ - + @@ -84922,25 +97046,9 @@ - - - - - - - - - - - - - - - - - - - + + + @@ -84995,11 +97103,69 @@ + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -85014,28 +97180,9 @@ - - - - - - - - - - - - + - - - - - - - - @@ -85427,57 +97574,180 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -85725,882 +97995,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -86610,9 +98056,6 @@ - - - @@ -86967,33 +98410,92 @@ - + - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + + + + + + + + @@ -87005,7 +98507,6 @@ - @@ -87017,7 +98518,6 @@ - @@ -87167,6 +98667,9 @@ + + + @@ -87187,6 +98690,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -87207,6 +98735,7 @@ + @@ -87224,6 +98753,11 @@ + + + + + @@ -87232,7 +98766,553 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -87286,7 +99366,50 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -87313,7 +99436,146 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -87343,7 +99605,7 @@ - + @@ -87355,7 +99617,7 @@ - + @@ -90257,7 +102519,7 @@ - + @@ -90905,7 +103167,7 @@ - + @@ -90939,7 +103201,7 @@ - + @@ -90957,9 +103219,7 @@ - - - + @@ -91031,8 +103291,6 @@ - - @@ -91064,7 +103322,7 @@ - + @@ -91089,9 +103347,7 @@ - - - + @@ -91118,7 +103374,7 @@ - + @@ -91134,7 +103390,7 @@ - + @@ -91197,10 +103453,10 @@ - + - + @@ -91236,50 +103492,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -91314,7 +103526,7 @@ - + @@ -91322,40 +103534,40 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -92117,146 +104329,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -92323,13 +104395,13 @@ - + - + - + @@ -92610,7 +104682,6 @@ - @@ -92622,7 +104693,6 @@ - @@ -92642,13 +104712,13 @@ - + - + @@ -92771,7 +104841,7 @@ - + @@ -92809,7 +104879,7 @@ - + @@ -92817,11 +104887,10 @@ - + - @@ -92945,7 +105014,7 @@ - + @@ -93154,7 +105223,6 @@ - @@ -93171,7 +105239,7 @@ - + @@ -93253,7 +105321,7 @@ - + @@ -93261,7 +105329,7 @@ - + @@ -93269,13 +105337,13 @@ - + - + @@ -93283,7 +105351,7 @@ - + @@ -93318,22 +105386,7 @@ - - - - - - - - - - - - - - - - + @@ -93352,8 +105405,6 @@ - - @@ -93474,7 +105525,7 @@ - + @@ -93526,7 +105577,7 @@ - + @@ -93534,8 +105585,8 @@ - - + + @@ -93563,7 +105614,7 @@ - + @@ -93571,7 +105622,7 @@ - + @@ -93592,7 +105643,7 @@ - + @@ -93613,7 +105664,7 @@ - + @@ -93643,7 +105694,7 @@ - + @@ -93660,21 +105711,21 @@ - + - + - + @@ -93743,13 +105794,13 @@ - + - + @@ -93763,7 +105814,7 @@ - + @@ -93793,7 +105844,6 @@ - @@ -93897,7 +105947,7 @@ - + @@ -94015,9 +106065,7 @@ - - - + @@ -94104,6 +106152,9 @@ + + + @@ -94124,7 +106175,7 @@ - + @@ -94231,7 +106282,7 @@ - + @@ -94649,7 +106700,7 @@ - + @@ -94714,7 +106765,7 @@ - + @@ -94727,11 +106778,11 @@ - + - + @@ -94747,14 +106798,14 @@ - + - + - + @@ -94763,23 +106814,23 @@ - - + + - - + + - + @@ -94811,7 +106862,7 @@ - + @@ -94831,24 +106882,23 @@ - + - + - + - + - @@ -94866,459 +106916,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -95355,49 +106954,49 @@ - + - + - + - + - + - + - + - + - + @@ -95405,7 +107004,7 @@ - + @@ -95413,137 +107012,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -95611,7 +107079,7 @@ - + @@ -95635,7 +107103,7 @@ - + @@ -95798,8 +107266,8 @@ - - + + @@ -95858,7 +107326,6 @@ - @@ -95870,7 +107337,7 @@ - + @@ -95882,18 +107349,18 @@ - + - + - + @@ -95904,17 +107371,17 @@ - + - + - + @@ -95933,83 +107400,83 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -96030,66 +107497,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -96099,39 +107566,39 @@ - + - + - + - + - + - + - + @@ -96146,106 +107613,106 @@ - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -96262,7 +107729,7 @@ - + @@ -96288,7 +107755,7 @@ - + @@ -96438,7 +107905,7 @@ - + @@ -96544,34 +108011,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -96654,12 +108121,11 @@ - - + - + @@ -96690,6 +108156,7 @@ + @@ -96727,7 +108194,7 @@ - + @@ -96763,7 +108230,7 @@ - + @@ -96776,1737 +108243,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -98579,10 +108317,10 @@ - + - + @@ -98629,8 +108367,6 @@ - - @@ -98668,20 +108404,20 @@ - + - + - + - + @@ -98696,7 +108432,7 @@ - + @@ -98704,7 +108440,7 @@ - + @@ -98720,26 +108456,26 @@ - + - + - + - + - + @@ -98754,7 +108490,7 @@ - + @@ -98767,8 +108503,8 @@ - - + + @@ -98779,10 +108515,24 @@ + + + + + + + + + + + + + + - + @@ -98803,22 +108553,6 @@ - - - - - - - - - - - - - - - - @@ -98859,47 +108593,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -98954,15 +108648,6 @@ - - - - - - - - - @@ -99011,16 +108696,8 @@ - - - - - - - - - + @@ -99043,17 +108720,17 @@ - + - + - + @@ -99062,14 +108739,14 @@ - + - + - + @@ -99110,7 +108787,7 @@ - + @@ -99132,7 +108809,7 @@ - + @@ -99402,6 +109079,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -99448,55 +109174,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -99624,7 +109301,7 @@ - + @@ -99656,7 +109333,7 @@ - + @@ -100059,16 +109736,16 @@ - + - + - + - + @@ -100084,11 +109761,6 @@ - - - - - @@ -100105,6 +109777,11 @@ + + + + + @@ -100149,7 +109826,7 @@ - + @@ -100248,16 +109925,16 @@ - + - + - + - + @@ -100292,28 +109969,28 @@ - + - + - + - + - + - + - + - + @@ -100639,43 +110316,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -100708,13 +110385,13 @@ - + - + - + @@ -100795,16 +110472,16 @@ - + - + - + - + @@ -101261,7 +110938,7 @@ - + @@ -101293,17 +110970,17 @@ - + - + - + - + @@ -101372,7 +111049,7 @@ - + @@ -101388,7 +111065,7 @@ - + @@ -101413,7 +111090,7 @@ - + @@ -101425,7 +111102,7 @@ - + @@ -101440,7 +111117,7 @@ - + @@ -101464,7 +111141,7 @@ - + @@ -101577,7 +111254,7 @@ - + @@ -101597,7 +111274,7 @@ - + @@ -101611,7 +111288,7 @@ - + @@ -101621,56 +111298,56 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -101744,7 +111421,7 @@ - + @@ -101783,7 +111460,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -101794,7 +111508,35 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -101895,86 +111637,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -102013,7 +111675,7 @@ - + @@ -102075,7 +111737,7 @@ - + @@ -102087,296 +111749,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -102393,16 +111765,16 @@ - + - + - + - + @@ -102688,14 +112060,6 @@ - - - - - - - - @@ -102739,10 +112103,10 @@ - + - + @@ -102755,7 +112119,7 @@ - + @@ -102811,7 +112175,7 @@ - + @@ -102881,69 +112245,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -103055,7 +112357,7 @@ - + @@ -103110,10 +112412,10 @@ - + - + @@ -103493,66 +112795,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -103620,7 +112863,7 @@ - + @@ -103898,7 +113141,7 @@ - + @@ -104152,7 +113395,7 @@ - + @@ -104309,13 +113552,13 @@ - + - + - + @@ -104328,96 +113571,14 @@ - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -104462,7 +113623,7 @@ - + @@ -104569,103 +113730,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -104677,7 +113741,7 @@ - + @@ -104689,7 +113753,7 @@ - + @@ -104735,7 +113799,7 @@ - + @@ -104810,10 +113874,10 @@ - + - + @@ -104871,148 +113935,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -105079,7 +114007,7 @@ - + @@ -105103,44 +114031,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -105242,20 +114132,6 @@ - - - - - - - - - - - - - - @@ -105467,10 +114343,10 @@ - + - + @@ -105506,89 +114382,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -105862,20 +114655,6 @@ - - - - - - - - - - - - - - @@ -105893,7 +114672,7 @@ - + @@ -105977,16 +114756,14 @@ - - + - - + @@ -105999,7 +114776,7 @@ - + @@ -106009,8 +114786,6 @@ - - @@ -106019,7 +114794,7 @@ - + @@ -106031,16 +114806,12 @@ - - - - @@ -106052,7 +114823,6 @@ - @@ -106123,20 +114893,16 @@ - - - - - + @@ -106152,16 +114918,13 @@ - - + - - @@ -106234,7 +114997,7 @@ - + @@ -106242,7 +115005,7 @@ - + @@ -106259,11 +115022,11 @@ - + - + @@ -106272,7 +115035,7 @@ - + @@ -106306,7 +115069,7 @@ - + @@ -106341,13 +115104,13 @@ - + - + - + @@ -106373,28 +115136,28 @@ - + - + - + - + - + - + @@ -106403,38 +115166,38 @@ - + - + - + - + - + - + - + @@ -106448,7 +115211,7 @@ - + @@ -106513,21 +115276,21 @@ - + - + - + - + @@ -106540,7 +115303,7 @@ - + @@ -106565,7 +115328,7 @@ - + @@ -106577,21 +115340,21 @@ - + - + - + - + @@ -106599,7 +115362,7 @@ - + @@ -106607,19 +115370,19 @@ - + - + - + @@ -106628,7 +115391,7 @@ - + @@ -106636,36 +115399,36 @@ - + - + - - + + - + - + - + @@ -106770,56 +115533,56 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -106837,7 +115600,7 @@ - + @@ -106885,11 +115648,11 @@ - + - + @@ -106898,38 +115661,38 @@ - + - + - + - + - + - + - + @@ -106958,19 +115721,19 @@ - + - + - - + + - + @@ -106990,16 +115753,16 @@ - + - + - + @@ -107029,26 +115792,26 @@ - + - + - + - + - + @@ -107061,7 +115824,7 @@ - + @@ -107213,55 +115976,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -107280,13 +115995,13 @@ - + - + @@ -107315,17 +116030,17 @@ - + - + - + @@ -107358,7 +116073,7 @@ - + @@ -107367,7 +116082,7 @@ - + @@ -107380,7 +116095,7 @@ - + @@ -107390,7 +116105,7 @@ - + @@ -107399,7 +116114,7 @@ - + @@ -107411,7 +116126,7 @@ - + @@ -107419,15 +116134,15 @@ - + - + - + @@ -107438,18 +116153,18 @@ - + - + - + @@ -107459,7 +116174,7 @@ - + @@ -107521,7 +116236,7 @@ - + @@ -107532,7 +116247,7 @@ - + @@ -107573,7 +116288,7 @@ - + @@ -107702,14 +116417,14 @@ - + - + @@ -107732,7 +116447,7 @@ - + @@ -107773,11 +116488,9 @@ - - + - @@ -107788,7 +116501,7 @@ - + @@ -107798,8 +116511,24 @@ - - + + + + + + + + + + + + + + + + + + @@ -107920,7 +116649,7 @@ - + @@ -107994,13 +116723,13 @@ - + - + - + @@ -108141,10 +116870,10 @@ - + - + @@ -108305,6 +117034,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108457,8 +117213,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -108473,8 +117335,198 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108485,10 +117537,10 @@ - + - + @@ -108498,13 +117550,13 @@ - + - + @@ -108541,7 +117593,7 @@ - + @@ -108556,7 +117608,47 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -108658,7 +117750,7 @@ - + @@ -108968,14 +118060,14 @@ - + - + @@ -109003,7 +118095,7 @@ - + @@ -109018,7 +118110,7 @@ - + @@ -109041,7 +118133,7 @@ - + @@ -109070,7 +118162,7 @@ - + @@ -109093,7 +118185,7 @@ - + @@ -109116,7 +118208,7 @@ - + @@ -109125,7 +118217,7 @@ - + @@ -109295,7 +118387,7 @@ - + @@ -109326,7 +118418,7 @@ - + @@ -109342,7 +118434,7 @@ - + @@ -109380,28 +118472,28 @@ - + - + - + - + - + - + - + - + @@ -109571,20 +118663,20 @@ - + - + - + @@ -109596,7 +118688,7 @@ - + @@ -109709,7 +118801,7 @@ - + @@ -109882,31 +118974,9 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -109927,7 +118997,7 @@ - + @@ -109971,7 +119041,7 @@ - + @@ -110015,17 +119085,6 @@ - - - - - - - - - - - @@ -110206,13 +119265,13 @@ - + - + @@ -110227,7 +119286,7 @@ - + @@ -110236,7 +119295,7 @@ - + @@ -110301,23 +119360,6 @@ - - - - - - - - - - - - - - - - - @@ -110678,7 +119720,7 @@ - + @@ -110687,7 +119729,7 @@ - + @@ -110770,7 +119812,6 @@ - @@ -110998,24 +120039,23 @@ - + - + - + - - + @@ -111039,7 +120079,7 @@ - + @@ -111058,7 +120098,6 @@ - @@ -111101,7 +120140,7 @@ - + @@ -111180,7 +120219,7 @@ - + @@ -111216,7 +120255,7 @@ - + @@ -111235,13 +120274,13 @@ - + - + @@ -111251,7 +120290,7 @@ - + @@ -111392,7 +120431,7 @@ - + @@ -111404,262 +120443,10 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -111676,7 +120463,7 @@ - + @@ -111929,7 +120716,7 @@ - + @@ -111937,51 +120724,10 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -111992,7 +120738,6 @@ - @@ -112009,51 +120754,51 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -112069,7 +120814,7 @@ - + @@ -112081,36 +120826,36 @@ - + - + - + - + - + - + - + @@ -112123,7 +120868,7 @@ - + @@ -112137,7 +120882,7 @@ - + @@ -112145,7 +120890,6 @@ - @@ -112157,104 +120901,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -112269,335 +120916,14 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -112618,133 +120944,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -112754,34 +120954,34 @@ - + - + - + - + - + - + - + @@ -112903,25 +121103,25 @@ - + - + - + - + - + - + - + @@ -112973,7 +121173,7 @@ - + @@ -113135,7 +121335,7 @@ - + @@ -113295,7 +121495,7 @@ - + @@ -113309,10 +121509,10 @@ - + - + @@ -113501,7 +121701,7 @@ - + @@ -113545,7 +121745,7 @@ - + @@ -113572,7 +121772,7 @@ - + @@ -113963,7 +122163,7 @@ - + @@ -113990,16 +122190,14 @@ - - - + - + @@ -114032,7 +122230,7 @@ - + @@ -114083,7 +122281,7 @@ - + @@ -114100,7 +122298,7 @@ - + @@ -114539,7 +122737,7 @@ - + @@ -114711,7 +122909,7 @@ - + @@ -114735,7 +122933,7 @@ - + @@ -114773,11 +122971,6 @@ - - - - - @@ -114858,7 +123051,7 @@ - + @@ -114897,7 +123090,7 @@ - + @@ -114912,7 +123105,6 @@ - @@ -114930,7 +123122,7 @@ - + @@ -115002,6 +123194,7 @@ + @@ -115062,7 +123255,7 @@ - + @@ -115072,7 +123265,7 @@ - + @@ -115107,7 +123300,7 @@ - + @@ -115169,7 +123362,7 @@ - + @@ -115273,7 +123466,7 @@ - + @@ -115291,7 +123484,7 @@ - + @@ -115511,7 +123704,7 @@ - + @@ -115526,7 +123719,7 @@ - + @@ -115564,21 +123757,21 @@ - + - + - + @@ -115599,7 +123792,7 @@ - + @@ -115706,145 +123899,145 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -115942,19 +124135,19 @@ - + - + - + - + - + @@ -115983,6 +124176,11 @@ + + + + + @@ -116005,11 +124203,6 @@ - - - - - @@ -116049,7 +124242,7 @@ - + @@ -116117,37 +124310,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -116202,7 +124395,38 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -116224,8 +124448,14 @@ + + + + + + @@ -116347,25 +124577,25 @@ - + - + - + - + - + - + - + @@ -116405,57 +124635,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -116483,7 +124663,7 @@ - + @@ -116498,6 +124678,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -116521,38 +124781,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -116595,10 +124823,8 @@ - - @@ -116632,6 +124858,14 @@ + + + + + + + + @@ -116671,14 +124905,6 @@ - - - - - - - - @@ -116784,7 +125010,6 @@ - @@ -116843,10 +125068,11 @@ + - + @@ -116864,7 +125090,7 @@ - + @@ -116881,7 +125107,7 @@ - + @@ -116891,9 +125117,7 @@ - - - + @@ -116912,13 +125136,13 @@ - + - + @@ -116932,7 +125156,7 @@ - + @@ -116973,7 +125197,7 @@ - + @@ -117008,9 +125232,74 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -117363,7 +125652,7 @@ - + @@ -117532,7 +125821,7 @@ - + @@ -117600,37 +125889,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -117822,25 +126111,25 @@ - + - + - + - + - + - + - + @@ -117885,7 +126174,7 @@ - + @@ -117992,145 +126281,145 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -118239,19 +126528,19 @@ - + - + - + - + - + @@ -119511,7 +127800,7 @@ - + @@ -119624,11 +127913,11 @@ - + - + @@ -119680,7 +127969,7 @@ - + @@ -119696,7 +127985,7 @@ - + @@ -119745,7 +128034,7 @@ - + @@ -119771,7 +128060,7 @@ - + @@ -119931,7 +128220,7 @@ - + @@ -119990,7 +128279,7 @@ - + @@ -120015,7 +128304,7 @@ - + @@ -120270,7 +128559,7 @@ - + @@ -120414,7 +128703,7 @@ - + @@ -120443,8 +128732,21 @@ - - + + + + + + + + + + + + + + + @@ -120654,7 +128956,7 @@ - + @@ -120752,7 +129054,7 @@ - + @@ -120781,10 +129083,10 @@ - + - + @@ -120840,7 +129142,7 @@ - + @@ -120894,7 +129196,7 @@ - + @@ -120908,7 +129210,7 @@ - + @@ -120923,7 +129225,7 @@ - + @@ -120957,7 +129259,7 @@ - + @@ -121000,14 +129302,14 @@ - + - + @@ -121015,14 +129317,14 @@ - + - + @@ -121047,7 +129349,7 @@ - + @@ -121111,7 +129413,7 @@ - + @@ -121156,14 +129458,14 @@ - + - + - + @@ -121173,7 +129475,7 @@ - + @@ -121216,9 +129518,9 @@ - + - + @@ -121227,7 +129529,7 @@ - + @@ -121236,16 +129538,16 @@ - + - + - + @@ -121301,7 +129603,7 @@ - + @@ -121581,7 +129883,7 @@ - + @@ -121591,20 +129893,20 @@ - + - + - + @@ -121620,73 +129922,77 @@ - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + @@ -121717,7 +130023,7 @@ - + @@ -121817,7 +130123,7 @@ - + @@ -121826,7 +130132,7 @@ - + @@ -121870,13 +130176,13 @@ - + - + @@ -121896,7 +130202,7 @@ - + @@ -122049,684 +130355,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - @@ -122846,149 +130482,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -123057,26 +130550,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -123111,10 +130584,10 @@ - + - + @@ -123143,10 +130616,10 @@ - + - + @@ -123413,18 +130886,16 @@ - + - - + - @@ -123454,9 +130925,8 @@ - - + @@ -123486,7 +130956,7 @@ - + @@ -123502,82 +130972,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -123586,23 +131056,23 @@ - + - + - + - + @@ -123610,7 +131080,7 @@ - + @@ -123623,61 +131093,61 @@ - + - + - + - + - + - + - - + + - + - + - + - + - + @@ -123873,7 +131343,7 @@ - + @@ -124055,11 +131525,6 @@ - - - - - @@ -124129,6 +131594,11 @@ + + + + + @@ -124145,7 +131615,6 @@ - @@ -124204,15 +131673,7 @@ - - - - - - - - - + @@ -124295,6 +131756,15 @@ + + + + + + + + + @@ -124303,13 +131773,13 @@ - + - + @@ -124825,10 +132295,10 @@ - + - + @@ -124867,7 +132337,7 @@ - + @@ -125084,7 +132554,7 @@ - + @@ -125286,7 +132756,7 @@ - + @@ -125361,7 +132831,7 @@ - + @@ -125460,7 +132930,7 @@ - + @@ -125471,7 +132941,7 @@ - + @@ -125481,7 +132951,7 @@ - + @@ -125490,13 +132960,13 @@ - + - + @@ -125505,7 +132975,7 @@ - + @@ -125513,7 +132983,7 @@ - + @@ -125522,7 +132992,7 @@ - + @@ -125530,7 +133000,7 @@ - + @@ -125538,7 +133008,7 @@ - + @@ -125547,19 +133017,19 @@ - + - + - + @@ -125587,11 +133057,11 @@ - + - + @@ -125630,7 +133100,7 @@ - + @@ -125665,7 +133135,7 @@ - + @@ -125732,7 +133202,7 @@ - + @@ -125752,7 +133222,7 @@ - + @@ -125823,7 +133293,7 @@ - + @@ -125955,15 +133425,15 @@ - + - + - + @@ -125991,7 +133461,7 @@ - + @@ -126023,7 +133493,7 @@ - + @@ -126058,10 +133528,10 @@ - + - + @@ -126089,7 +133559,7 @@ - + @@ -126119,7 +133589,7 @@ - + @@ -126136,22 +133606,22 @@ - + - + - + - + @@ -126170,35 +133640,35 @@ - + - + - + - + - + - + - + - + @@ -126240,7 +133710,7 @@ - + @@ -126254,20 +133724,20 @@ - + - + - + @@ -126308,24 +133778,24 @@ - + - + - + - + @@ -126502,7 +133972,7 @@ - + @@ -126573,7 +134043,7 @@ - + @@ -126585,7 +134055,7 @@ - + @@ -126615,7 +134085,7 @@ - + @@ -126642,14 +134112,14 @@ - + - + @@ -126702,7 +134172,6 @@ - @@ -126746,40 +134215,40 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -126840,16 +134309,7 @@ - - - - - - - - - - + @@ -127019,25 +134479,18 @@ + + + + + + + + + + - - - - - - - - - - - - - - - - - @@ -127087,10 +134540,10 @@ - + - + @@ -127154,6 +134607,23 @@ + + + + + + + + + + + + + + + + + @@ -127161,41 +134631,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -127248,11 +134683,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -127304,9 +134772,348 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -127345,7 +135152,7 @@ - + @@ -127415,7 +135222,7 @@ - + @@ -127425,7 +135232,7 @@ - + @@ -127439,7 +135246,7 @@ - + @@ -127500,19 +135307,19 @@ - + - + - + @@ -127531,11 +135338,9 @@ - - - + @@ -127555,10 +135360,10 @@ - + - + @@ -127588,10 +135393,10 @@ - + - + @@ -127635,16 +135440,16 @@ - + - + - + - + @@ -127727,167 +135532,12 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -127895,26 +135545,18 @@ - - - - - - - - @@ -127928,7 +135570,7 @@ - + @@ -127950,53 +135592,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -128024,19 +135619,19 @@ - + - + - + - + - + @@ -128058,31 +135653,10 @@ - - - - - - - - - - - - - - - - - + + - - - - - - @@ -128091,29 +135665,9 @@ - - - - - - - - - - - - - - - - - - - - - + @@ -128131,44 +135685,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -128177,35 +135693,11 @@ + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -128223,80 +135715,17 @@ - + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -128322,130 +135751,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -128472,7 +135787,7 @@ - + @@ -128490,23 +135805,6 @@ - - - - - - - - - - - - - - - - - @@ -128524,7 +135822,7 @@ - + @@ -128614,7 +135912,7 @@ - + @@ -128696,7 +135994,7 @@ - + @@ -128764,16 +136062,16 @@ - + - + - + - + @@ -128782,7 +136080,7 @@ - + @@ -128802,10 +136100,10 @@ - + - + @@ -128835,10 +136133,10 @@ - + - + @@ -128855,7 +136153,7 @@ - + @@ -128902,7 +136200,7 @@ - + @@ -128948,7 +136246,6 @@ - @@ -129019,7 +136316,7 @@ - + @@ -129036,7 +136333,7 @@ - + @@ -129072,7 +136369,7 @@ - + @@ -129109,12 +136406,12 @@ - + - + - + @@ -129207,7 +136504,7 @@ - + @@ -129265,7 +136562,7 @@ - + @@ -129301,7 +136598,6 @@ - @@ -129433,7 +136729,7 @@ - + @@ -129466,10 +136762,10 @@ - + - + @@ -129598,36 +136894,36 @@ - + - + - + - + - + - + - + - + - + @@ -129713,7 +137009,7 @@ - + @@ -129963,7 +137259,6 @@ - @@ -129991,6 +137286,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -130071,37 +137397,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -130111,7 +137407,6 @@ - @@ -130120,6 +137415,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -130127,8 +137491,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -130158,12 +137561,56 @@ + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -130392,7 +137839,7 @@ - + @@ -130467,33 +137914,33 @@ - + - + - + - + - - + + - + @@ -130527,7 +137974,7 @@ - + @@ -130541,13 +137988,13 @@ - + - + @@ -130557,29 +138004,29 @@ - + - + - + - + - + @@ -130599,7 +138046,7 @@ - + @@ -130629,7 +138076,7 @@ - + @@ -130673,7 +138120,7 @@ - + @@ -130705,32 +138152,32 @@ - + - + - + - + - + - + @@ -130748,23 +138195,23 @@ - + - + - + - + - + @@ -130783,7 +138230,7 @@ - + @@ -130803,7 +138250,7 @@ - + @@ -130837,19 +138284,19 @@ - + - + - + - + - + @@ -130916,19 +138363,19 @@ - + - + - + - + - + @@ -130951,138 +138398,25 @@ - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -131172,7 +138506,7 @@ - + @@ -131220,7 +138554,6 @@ - @@ -131286,7 +138619,7 @@ - + @@ -131312,11 +138645,11 @@ - + - + @@ -131368,37 +138701,37 @@ - + - + - + - + - + - + - + @@ -131418,28 +138751,28 @@ - + - + - + - + - + @@ -131489,7 +138822,101 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -131678,7 +139105,7 @@ - + @@ -131689,40 +139116,40 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -131853,7 +139280,7 @@ - + @@ -132075,102 +139502,165 @@ - - - - + + - + - + - - - - + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - - + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -132321,7 +139811,7 @@ - + @@ -132335,7 +139825,6 @@ - @@ -132470,7 +139959,7 @@ - + @@ -132506,7 +139995,7 @@ - + @@ -132521,9 +140010,7 @@ - - - + @@ -132554,11 +140041,11 @@ - + - + @@ -132572,12 +140059,12 @@ - + - + @@ -132670,7 +140157,7 @@ - + @@ -132814,7 +140301,7 @@ - + @@ -132835,7 +140322,7 @@ - + @@ -132873,7 +140360,7 @@ - + @@ -132930,7 +140417,7 @@ - + @@ -133105,7 +140592,7 @@ - + @@ -133139,7 +140626,7 @@ - + @@ -133178,7 +140665,7 @@ - + @@ -133329,7 +140816,7 @@ - + @@ -133357,7 +140844,7 @@ - + @@ -134105,7 +141592,7 @@ - + @@ -134141,8 +141628,6 @@ - - @@ -134172,6 +141657,8 @@ + + @@ -134221,7 +141708,7 @@ - + @@ -134613,7 +142100,7 @@ - + @@ -135116,7 +142603,7 @@ - + @@ -135195,7 +142682,7 @@ - + @@ -135665,7 +143152,7 @@ - + @@ -135677,7 +143164,7 @@ - + @@ -135685,7 +143172,7 @@ - + @@ -135735,7 +143222,7 @@ - + @@ -135816,7 +143303,7 @@ - + @@ -135973,7 +143460,7 @@ - + @@ -136141,7 +143628,7 @@ - + @@ -136154,14 +143641,14 @@ - + - + @@ -136171,7 +143658,7 @@ - + @@ -136222,7 +143709,7 @@ - + @@ -136230,71 +143717,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -136319,7 +143741,7 @@ - + @@ -136373,32 +143795,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -136456,7 +143852,6 @@ - @@ -136464,8 +143859,7 @@ - - + @@ -136476,7 +143870,7 @@ - + @@ -136655,27 +144049,27 @@ - - + + - + - + - + - + @@ -136696,13 +144090,13 @@ - + - + - + @@ -136756,7 +144150,7 @@ - + @@ -136764,7 +144158,7 @@ - + @@ -136864,7 +144258,7 @@ - + @@ -137007,7 +144401,7 @@ - + @@ -137028,79 +144422,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -137122,7 +144445,7 @@ - + @@ -137132,7 +144455,7 @@ - + @@ -137146,25 +144469,25 @@ - + - + - + - + - + - + @@ -137178,7 +144501,7 @@ - + @@ -137201,7 +144524,7 @@ - + @@ -137222,7 +144545,7 @@ - + @@ -137252,7 +144575,7 @@ - + @@ -137265,14 +144588,14 @@ - + - + @@ -137287,7 +144610,7 @@ - + @@ -137295,7 +144618,7 @@ - + @@ -137304,7 +144627,7 @@ - + @@ -137320,7 +144643,7 @@ - + @@ -137460,89 +144783,28 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -137563,7 +144825,7 @@ - + @@ -137571,7 +144833,7 @@ - + @@ -137638,13 +144900,13 @@ - + - + @@ -137659,7 +144921,7 @@ - + @@ -137667,7 +144929,7 @@ - + @@ -137675,7 +144937,7 @@ - + @@ -137857,7 +145119,7 @@ - + @@ -137865,7 +145127,7 @@ - + @@ -137873,12 +145135,12 @@ - + - + @@ -137945,10 +145207,10 @@ - + - + @@ -137982,7 +145244,7 @@ - + @@ -138035,14 +145297,14 @@ - + - + @@ -138059,7 +145321,7 @@ - + @@ -138099,23 +145361,6 @@ - - - - - - - - - - - - - - - - - @@ -138340,7 +145585,7 @@ - + @@ -138350,7 +145595,7 @@ - + @@ -138366,13 +145611,7 @@ - - - - - - - + @@ -138382,17 +145621,17 @@ - + - + - + @@ -138400,114 +145639,28 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -138564,103 +145717,29 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -138672,12 +145751,11 @@ - - + - + @@ -138686,7 +145764,7 @@ - + @@ -138705,7 +145783,7 @@ - + @@ -138722,7 +145800,7 @@ - + @@ -139049,7 +146127,7 @@ - + @@ -139068,21 +146146,7 @@ - - - - - - - - - - - - - - - + @@ -139115,18 +146179,15 @@ - - - - + - + @@ -139135,7 +146196,7 @@ - + @@ -139153,7 +146214,7 @@ - + @@ -139174,7 +146235,7 @@ - + @@ -139252,14 +146313,14 @@ - + - + @@ -139268,7 +146329,7 @@ - + @@ -139351,14 +146412,14 @@ - + - + @@ -139384,7 +146445,7 @@ - + @@ -139397,7 +146458,7 @@ - + @@ -139412,7 +146473,7 @@ - + @@ -139426,10 +146487,10 @@ - + - + @@ -139660,7 +146721,7 @@ - + @@ -139709,7 +146770,7 @@ - + @@ -139736,28 +146797,11 @@ - - - - - - - - - - - - - - - - - - + - + @@ -139829,7 +146873,7 @@ - + @@ -139837,7 +146881,7 @@ - + @@ -139893,6 +146937,17 @@ + + + + + + + + + + + @@ -139916,24 +146971,13 @@ - + - - - - - - - - - - - @@ -140145,7 +147189,6 @@ - @@ -140163,6 +147206,7 @@ + @@ -140176,7 +147220,6 @@ - @@ -140306,14 +147349,11 @@ + - - - - @@ -140365,6 +147405,10 @@ + + + + @@ -140410,50 +147454,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + @@ -140469,7 +147473,7 @@ - + @@ -140477,7 +147481,7 @@ - + @@ -140486,18 +147490,18 @@ - + - + - + @@ -140511,7 +147515,7 @@ - + @@ -140520,14 +147524,14 @@ - + - + - + - + @@ -140543,7 +147547,7 @@ - + @@ -140579,7 +147583,7 @@ - + @@ -140588,26 +147592,26 @@ - + - + - + - + - + - + - + @@ -140615,7 +147619,7 @@ - + @@ -140623,7 +147627,7 @@ - + @@ -140689,13 +147693,13 @@ - + - + @@ -140723,7 +147727,7 @@ - + @@ -141028,13 +148032,13 @@ - + - + @@ -141048,7 +148052,7 @@ - + @@ -141062,7 +148066,7 @@ - + @@ -141079,7 +148083,7 @@ - + @@ -141103,7 +148107,7 @@ - + @@ -141192,7 +148196,7 @@ - + @@ -141256,12 +148260,12 @@ - + - + @@ -141345,36 +148349,36 @@ - + - + - + - + - + - + - + - + - + @@ -141384,14 +148388,14 @@ - + - + @@ -141594,7 +148598,7 @@ - + @@ -141621,7 +148625,7 @@ - + @@ -141703,14 +148707,14 @@ - + - + @@ -141723,13 +148727,13 @@ - + - + @@ -141821,7 +148825,7 @@ - + @@ -141853,7 +148857,7 @@ - + @@ -141883,7 +148887,7 @@ - + @@ -141898,13 +148902,13 @@ - + - + @@ -141920,7 +148924,7 @@ - + @@ -141934,7 +148938,7 @@ - + @@ -141943,7 +148947,7 @@ - + @@ -141953,10 +148957,10 @@ - + - + @@ -141965,7 +148969,7 @@ - + @@ -141974,7 +148978,7 @@ - + @@ -141983,7 +148987,7 @@ - + @@ -141992,35 +148996,35 @@ - + - + - + - + - + - + @@ -142096,21 +149100,21 @@ - + - + - + @@ -142124,7 +149128,7 @@ - + @@ -142132,7 +149136,7 @@ - + @@ -142140,7 +149144,7 @@ - + @@ -142234,7 +149238,7 @@ - + @@ -142267,7 +149271,7 @@ - + @@ -142282,7 +149286,7 @@ - + @@ -142294,7 +149298,7 @@ - + @@ -142309,7 +149313,7 @@ - + @@ -142343,7 +149347,7 @@ - + @@ -142393,7 +149397,7 @@ - + @@ -142464,7 +149468,7 @@ - + @@ -142511,7 +149515,7 @@ - + @@ -142603,7 +149607,7 @@ - + @@ -142627,7 +149631,7 @@ - + @@ -142637,7 +149641,7 @@ - + @@ -142648,7 +149652,7 @@ - + @@ -142714,10 +149718,10 @@ - + - + @@ -142730,7 +149734,7 @@ - + @@ -142824,14 +149828,14 @@ - + - + @@ -142840,7 +149844,7 @@ - + @@ -142859,7 +149863,7 @@ - + @@ -142875,7 +149879,7 @@ - + @@ -142910,7 +149914,7 @@ - + @@ -142979,7 +149983,7 @@ - + @@ -143008,7 +150012,7 @@ - + @@ -143115,7 +150119,6 @@ - @@ -143304,10 +150307,7 @@ - - - - + @@ -143442,12 +150442,14 @@ + + + + - - @@ -143736,15 +150738,9 @@ + + - - - - - - - - @@ -143790,6 +150786,14 @@ + + + + + + + + @@ -143801,10 +150805,6 @@ - - - - @@ -143848,15 +150848,17 @@ - + - + - - + + + + @@ -143876,6 +150878,8 @@ + + @@ -143926,7 +150930,7 @@ - + @@ -143951,7 +150955,7 @@ - + @@ -143990,7 +150994,7 @@ - + @@ -144005,7 +151009,7 @@ - + @@ -144014,7 +151018,7 @@ - + @@ -144027,7 +151031,7 @@ - + @@ -144118,11 +151122,207 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144170,7 +151370,50 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144212,7 +151455,68 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144264,8 +151568,52 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144296,8 +151644,82 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144307,8 +151729,103 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144329,7 +151846,74 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144407,7 +151991,26 @@ - + + + + + + + + + + + + + + + + + + + + @@ -144443,7 +152046,116 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144452,7 +152164,20 @@ - + + + + + + + + + + + + + + @@ -144631,7 +152356,68 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144676,7 +152462,86 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144734,7 +152599,80 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144839,8 +152777,55 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -144865,7 +152850,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -145392,222 +153414,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -145724,19 +153530,19 @@ - + - + - + - + - + @@ -146009,47 +153815,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -146293,212 +154058,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -146614,10 +154173,10 @@ - + - + @@ -146647,86 +154206,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -146932,10 +154411,10 @@ - + - + @@ -147105,167 +154584,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -147282,13 +154600,13 @@ - + - + - + @@ -147337,68 +154655,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -148080,16 +155336,16 @@ - + - + - + - + @@ -148156,7 +155412,7 @@ - + @@ -148638,19 +155894,19 @@ - + - + - + - + - + @@ -148756,23 +156012,6 @@ - - - - - - - - - - - - - - - - - @@ -148793,152 +156032,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -149475,7 +156568,7 @@ - + @@ -150438,31 +157531,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -150540,83 +157608,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -150631,62 +157622,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -150768,209 +157703,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -151142,7 +157877,7 @@ - + @@ -151310,7 +158045,7 @@ - + @@ -151346,7 +158081,7 @@ - + @@ -151415,7 +158150,7 @@ - + @@ -151534,7 +158269,7 @@ - + @@ -151672,7 +158407,7 @@ - + @@ -151823,161 +158558,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -152204,7 +158784,7 @@ - + @@ -152501,7 +159081,7 @@ - + @@ -152549,100 +159129,100 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -152871,19 +159451,19 @@ - + - + - + - + - + @@ -153032,25 +159612,25 @@ - + - + - + - + - + - + - + @@ -153063,31 +159643,31 @@ - + - + - + - + - + - + - + - + - + @@ -153207,34 +159787,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -153252,19 +159832,19 @@ - + - + - + - + - + @@ -153288,37 +159868,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -153413,10 +159993,10 @@ - + - + @@ -153956,14 +160536,11 @@ - - - @@ -153989,7 +160566,6 @@ - @@ -154022,7 +160598,7 @@ - + @@ -154083,7 +160659,7 @@ - + @@ -154109,9 +160685,7 @@ - - @@ -154197,7 +160771,6 @@ - @@ -154206,7 +160779,6 @@ - @@ -154221,8 +160793,6 @@ - - @@ -154240,7 +160810,6 @@ - @@ -154261,7 +160830,6 @@ - @@ -154275,13 +160843,11 @@ - - - + @@ -154308,11 +160874,9 @@ - - - + - + @@ -154393,7 +160957,7 @@ - + @@ -154424,13 +160988,13 @@ - - + + - + - + @@ -154656,7 +161220,7 @@ - + @@ -154668,16 +161232,16 @@ - + - + - + @@ -154701,12 +161265,12 @@ - + - + @@ -154723,7 +161287,7 @@ - + @@ -154743,18 +161307,18 @@ - + - + - - + + @@ -154762,7 +161326,7 @@ - + @@ -154776,7 +161340,7 @@ - + @@ -154787,14 +161351,10 @@ - + - - - - @@ -154811,7 +161371,7 @@ - + @@ -154878,7 +161438,7 @@ - + @@ -154911,21 +161471,12 @@ - - - - - - - - - @@ -155026,23 +161577,23 @@ - + - + - + - + @@ -155094,27 +161645,27 @@ - + - + - + - + - + @@ -155143,13 +161694,13 @@ - + - + @@ -155212,7 +161763,7 @@ - + @@ -155224,13 +161775,13 @@ - + - + @@ -155286,7 +161837,7 @@ - + @@ -155320,7 +161871,7 @@ - + @@ -155365,7 +161916,7 @@ - + @@ -155385,7 +161936,7 @@ - + @@ -155395,7 +161946,7 @@ - + @@ -155433,7 +161984,7 @@ - + @@ -155441,31 +161992,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -155474,13 +162001,13 @@ - + - + @@ -155531,7 +162058,7 @@ - + @@ -155648,7 +162175,7 @@ - + @@ -155749,7 +162276,7 @@ - + @@ -155816,12 +162343,12 @@ - + @@ -155833,7 +162360,7 @@ - + @@ -155869,13 +162396,13 @@ - + - + @@ -156059,7 +162586,7 @@ - + @@ -156120,7 +162647,7 @@ - + @@ -156155,7 +162682,7 @@ - + @@ -156211,7 +162738,7 @@ - + @@ -156380,7 +162907,7 @@ - + @@ -156400,17 +162927,17 @@ - + - + - + - + @@ -156420,7 +162947,7 @@ - + @@ -156431,7 +162958,7 @@ - + @@ -156443,7 +162970,7 @@ - + @@ -156456,7 +162983,7 @@ - + @@ -156470,7 +162997,7 @@ - + @@ -156485,7 +163012,7 @@ - + @@ -156501,19 +163028,19 @@ - + - + - + @@ -156550,13 +163077,13 @@ - + - + - + @@ -156577,7 +163104,7 @@ - + @@ -156585,7 +163112,7 @@ - + @@ -156771,13 +163298,13 @@ - + - + @@ -156789,7 +163316,7 @@ - + @@ -156797,7 +163324,7 @@ - + @@ -156816,51 +163343,16 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -156883,7 +163375,6 @@ - @@ -156912,10 +163403,10 @@ - - + + - + @@ -157184,7 +163675,7 @@ - + @@ -157244,7 +163735,7 @@ - + @@ -157259,13 +163750,13 @@ - + - + @@ -157279,13 +163770,13 @@ - + - + @@ -157316,7 +163807,7 @@ - + @@ -157330,10 +163821,10 @@ - + - + @@ -157375,7 +163866,7 @@ - + @@ -157387,7 +163878,7 @@ - + @@ -157395,7 +163886,7 @@ - + @@ -157413,7 +163904,7 @@ - + @@ -157421,7 +163912,7 @@ - + @@ -157487,7 +163978,7 @@ - + @@ -157505,7 +163996,7 @@ - + @@ -157545,7 +164036,7 @@ - + @@ -157559,7 +164050,7 @@ - + @@ -157567,7 +164058,7 @@ - + @@ -157672,14 +164163,14 @@ - + - + @@ -157716,7 +164207,7 @@ - + @@ -157728,21 +164219,21 @@ - + - + - + @@ -157753,14 +164244,14 @@ - + - + @@ -157778,7 +164269,7 @@ - + @@ -157797,7 +164288,7 @@ - + @@ -157812,7 +164303,7 @@ - + @@ -157893,7 +164384,7 @@ - + @@ -157901,7 +164392,7 @@ - + @@ -157912,13 +164403,13 @@ - + - + @@ -157991,7 +164482,7 @@ - + @@ -158077,7 +164568,7 @@ - + @@ -158103,7 +164594,7 @@ - + @@ -158112,7 +164603,7 @@ - + @@ -158152,7 +164643,7 @@ - + @@ -158182,7 +164673,7 @@ - + @@ -158190,7 +164681,7 @@ - + @@ -158266,7 +164757,7 @@ - + @@ -158285,14 +164776,14 @@ - + - + @@ -158326,7 +164817,7 @@ - + @@ -158507,7 +164998,7 @@ - + @@ -158554,7 +165045,7 @@ - + @@ -158564,7 +165055,7 @@ - + @@ -158573,10 +165064,10 @@ - + - + @@ -158621,7 +165112,7 @@ - + @@ -158664,7 +165155,7 @@ - + @@ -158677,13 +165168,13 @@ - + - + @@ -158693,7 +165184,7 @@ - + @@ -158703,78 +165194,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - @@ -158786,7 +165211,7 @@ - + @@ -158800,7 +165225,7 @@ - + @@ -158831,7 +165256,7 @@ - + @@ -158850,13 +165275,13 @@ - + - + @@ -158873,24 +165298,7 @@ - - - - - - - - - - - - - - - - - - + @@ -158903,7 +165311,7 @@ - + @@ -158914,7 +165322,7 @@ - + @@ -158961,7 +165369,7 @@ - + @@ -159031,7 +165439,7 @@ - + @@ -159097,7 +165505,7 @@ - + @@ -159114,7 +165522,7 @@ - + @@ -159133,7 +165541,7 @@ - + @@ -159158,7 +165566,7 @@ - + @@ -159191,7 +165599,7 @@ - + @@ -159199,7 +165607,7 @@ - + @@ -159207,7 +165615,7 @@ - + @@ -159263,13 +165671,13 @@ - + - + @@ -159314,7 +165722,7 @@ - + @@ -159386,7 +165794,7 @@ - + @@ -159405,13 +165813,13 @@ - + - + @@ -159419,7 +165827,7 @@ - + @@ -159449,7 +165857,7 @@ - + @@ -159515,7 +165923,7 @@ - + @@ -159561,27 +165969,24 @@ - - - - + - - + + - + @@ -159596,9 +166001,9 @@ - + - + @@ -159607,45 +166012,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -159669,7 +166074,7 @@ - + @@ -159678,9 +166083,9 @@ - + - + @@ -159688,7 +166093,7 @@ - + @@ -159711,35 +166116,35 @@ - - + + - - + + - + - + - + - + @@ -159756,24 +166161,24 @@ - + - + - + - + - + @@ -159792,27 +166197,27 @@ - - + + - - + + - - + + - - + + - + @@ -159840,12 +166245,12 @@ - + - + @@ -159855,7 +166260,7 @@ - + @@ -159867,13 +166272,6 @@ - - - - - - - @@ -159893,9 +166291,9 @@ - + - + @@ -159917,15 +166315,15 @@ - + - + - + - + @@ -159935,7 +166333,7 @@ - + @@ -159967,7 +166365,7 @@ - + @@ -159976,7 +166374,7 @@ - + @@ -160084,12 +166482,12 @@ - + - + @@ -160097,9 +166495,9 @@ - + - + @@ -160118,7 +166516,7 @@ - + @@ -160214,7 +166612,7 @@ - + @@ -160260,7 +166658,7 @@ - + @@ -160282,31 +166680,31 @@ - + - + - + - + - + - + - + @@ -160316,22 +166714,22 @@ - + - + - + - + @@ -160398,7 +166796,7 @@ - + @@ -160435,13 +166833,13 @@ - + - + @@ -160451,14 +166849,14 @@ - + - + @@ -160491,7 +166889,7 @@ - + @@ -160519,14 +166917,14 @@ - + - + @@ -160567,13 +166965,13 @@ - + - + @@ -160613,49 +167011,49 @@ - + - + - + - + - + - - + + - + - + - + - + - + @@ -160669,23 +167067,23 @@ - + - + - + - + - + @@ -160804,10 +167202,10 @@ - + - + @@ -160816,64 +167214,64 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -161124,13 +167522,13 @@ - + - + - + @@ -161160,28 +167558,28 @@ - + - + - + - + - + - + - + - + @@ -161298,7 +167696,7 @@ - + @@ -161334,26 +167732,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -161400,13 +167778,13 @@ - + - + - + @@ -161440,12 +167818,29 @@ - - - + + + + + + + + + + + + + + + + + + + + - + @@ -161483,34 +167878,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -161607,15 +168002,13 @@ + + + - - - - - @@ -161682,6 +168075,11 @@ + + + + + @@ -161795,19 +168193,19 @@ - + - + - + - + - + @@ -161819,37 +168217,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -161915,13 +168313,6 @@ - - - - - - - @@ -161960,22 +168351,22 @@ - + - + - + - + - + - + @@ -161991,6 +168382,13 @@ + + + + + + + @@ -162077,49 +168475,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -162162,7 +168560,7 @@ - + @@ -162210,7 +168608,7 @@ - + @@ -162325,7 +168723,7 @@ - + @@ -162345,13 +168743,13 @@ - + - + @@ -162363,13 +168761,13 @@ - + - + @@ -162487,13 +168885,13 @@ - + - + - + @@ -162529,7 +168927,7 @@ - + @@ -162567,34 +168965,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -162635,19 +169033,19 @@ - + - + - + - + - + @@ -162659,37 +169057,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -162746,49 +169144,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -162883,7 +169281,7 @@ - + @@ -162983,22 +169381,22 @@ - + - + - + - + - + - + @@ -163232,11 +169630,11 @@ - + - + @@ -163246,11 +169644,11 @@ - + - + @@ -163262,36 +169660,36 @@ - + - + - + - + - + - + - + @@ -163462,7 +169860,7 @@ - + @@ -163470,16 +169868,15 @@ - + - + - @@ -163539,15 +169936,15 @@ - + - + - + @@ -163557,7 +169954,7 @@ - + @@ -163586,24 +169983,24 @@ - + - + - + - + @@ -163611,7 +170008,7 @@ - + @@ -163620,7 +170017,7 @@ - + @@ -163628,7 +170025,7 @@ - + @@ -163654,18 +170051,18 @@ - + - + - + @@ -163675,62 +170072,62 @@ - + - + - + - - + + - + - + - + - + - + - + - - + + - + - + @@ -163739,10 +170136,10 @@ - + - + @@ -163855,7 +170252,7 @@ - + @@ -163863,7 +170260,7 @@ - + @@ -163875,40 +170272,40 @@ - + - - + + - + - + - + - + - + - + - + @@ -163916,10 +170313,10 @@ - + - + @@ -164012,7 +170409,7 @@ - + @@ -164029,7 +170426,7 @@ - + @@ -164043,7 +170440,7 @@ - + @@ -164053,14 +170450,14 @@ - + - + @@ -164134,13 +170531,13 @@ - + - + - + @@ -164221,7 +170618,7 @@ - + @@ -164230,7 +170627,7 @@ - + @@ -164288,13 +170685,13 @@ - + - + - + @@ -164347,17 +170744,17 @@ - + - + - + - + @@ -164395,7 +170792,7 @@ - + @@ -164421,7 +170818,7 @@ - + @@ -164432,7 +170829,7 @@ - + @@ -164442,7 +170839,7 @@ - + @@ -164452,7 +170849,7 @@ - + @@ -164464,6 +170861,11 @@ + + + + + @@ -164479,13 +170881,8 @@ - - - - - - + @@ -164546,26 +170943,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -164745,34 +171122,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -164851,33 +171202,13 @@ - - - - + - - - - - - - - + + + - - - - - - - - - - - - - + @@ -164892,82 +171223,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -165059,6 +171318,14 @@ + + + + + + + + @@ -165074,116 +171341,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -165192,32 +171353,9 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -165236,7 +171374,7 @@ - + @@ -165250,13 +171388,13 @@ - + - + @@ -165372,7 +171510,6 @@ - @@ -165413,273 +171550,8 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -165709,684 +171581,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -167808,6 +173004,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -168179,7 +173511,7 @@ - + @@ -168258,157 +173590,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -168420,9 +173606,17 @@ + + + + + + + + + + - - @@ -168677,159 +173871,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - @@ -168883,92 +173929,18 @@ + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -168976,7 +173948,7 @@ - + @@ -169003,181 +173975,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -169185,16 +173982,16 @@ - + - + - + - + @@ -169262,32 +174059,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -169301,128 +174072,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -169460,7 +174111,7 @@ - + @@ -169470,7 +174121,7 @@ - + @@ -169484,15 +174135,15 @@ - + - + - + @@ -169504,7 +174155,7 @@ - + @@ -169526,7 +174177,7 @@ - + @@ -169539,7 +174190,7 @@ - + @@ -169629,16 +174280,16 @@ - + - + - + - + @@ -169646,10 +174297,10 @@ - + - + @@ -169738,7 +174389,7 @@ - + @@ -169756,7 +174407,7 @@ - + @@ -169844,7 +174495,7 @@ - + @@ -169911,7 +174562,7 @@ - + @@ -169919,7 +174570,6 @@ - @@ -169928,6 +174578,7 @@ + @@ -170041,7 +174692,7 @@ - + @@ -170641,13 +175292,13 @@ - + - + @@ -170659,7 +175310,7 @@ - + @@ -170730,12 +175381,12 @@ - + - + @@ -170743,7 +175394,7 @@ - + @@ -170751,7 +175402,7 @@ - + @@ -170763,7 +175414,7 @@ - + @@ -170823,16 +175474,16 @@ - + - + - + - + @@ -170926,44 +175577,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -170977,7 +175590,7 @@ - + @@ -171028,7 +175641,7 @@ - + @@ -171073,7 +175686,7 @@ - + @@ -171101,7 +175714,7 @@ - + @@ -171113,7 +175726,7 @@ - + @@ -171145,7 +175758,6 @@ - @@ -171223,7 +175835,7 @@ - + @@ -171232,14 +175844,14 @@ - + - + @@ -171247,45 +175859,45 @@ - + - + - + - + - + - + - + - + - + @@ -171303,7 +175915,7 @@ - + @@ -171323,12 +175935,12 @@ - + - + @@ -171345,7 +175957,7 @@ - + @@ -171353,7 +175965,7 @@ - + @@ -171409,35 +176021,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -171476,7 +176059,6 @@ - @@ -171486,17 +176068,17 @@ - + - + - + @@ -171565,7 +176147,7 @@ - + @@ -171581,7 +176163,7 @@ - + @@ -171654,7 +176236,7 @@ - + @@ -171678,7 +176260,7 @@ - + @@ -171812,7 +176394,7 @@ - + @@ -171838,7 +176420,7 @@ - + @@ -171860,7 +176442,7 @@ - + @@ -171886,7 +176468,7 @@ - + @@ -171957,7 +176539,7 @@ - + @@ -172007,11 +176589,11 @@ - + - + @@ -172023,29 +176605,29 @@ - + - + - - + + - + - + @@ -172067,7 +176649,7 @@ - + @@ -172089,18 +176671,18 @@ - + - + - + @@ -172242,7 +176824,7 @@ - + @@ -172281,7 +176863,7 @@ - + @@ -172371,7 +176953,7 @@ - + @@ -172386,7 +176968,7 @@ - + @@ -172398,7 +176980,7 @@ - + @@ -172407,7 +176989,7 @@ - + @@ -172434,7 +177016,7 @@ - + @@ -172458,9 +177040,9 @@ - + - + @@ -172488,7 +177070,7 @@ - + @@ -172506,19 +177088,19 @@ - + - + - + @@ -172532,7 +177114,7 @@ - + @@ -172574,7 +177156,7 @@ - + @@ -172598,7 +177180,7 @@ - + @@ -172613,11 +177195,11 @@ - + - + @@ -172641,7 +177223,7 @@ - + @@ -172942,10 +177524,10 @@ - + - + @@ -173309,7 +177891,7 @@ - + @@ -173518,131 +178100,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -174322,10 +178779,10 @@ - + - + @@ -174345,19 +178802,19 @@ - + - + - + - + - + @@ -175000,7 +179457,7 @@ - + @@ -175641,7 +180098,7 @@ - + @@ -176396,7 +180853,7 @@ - + @@ -176410,16 +180867,16 @@ - + - + - + - + @@ -176702,7 +181159,6 @@ - @@ -176728,17 +181184,17 @@ - + - + - + @@ -176770,219 +181226,219 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -176992,14 +181448,14 @@ - + - + @@ -177007,7 +181463,7 @@ - + @@ -177020,46 +181476,46 @@ - + - + - + - + - + - + - + @@ -177067,7 +181523,7 @@ - + @@ -177076,59 +181532,59 @@ - + - + - + - + - + - + - + - + - + @@ -177136,26 +181592,26 @@ - + - + - + - + @@ -177164,7 +181620,7 @@ - + @@ -177172,7 +181628,7 @@ - + @@ -177181,7 +181637,7 @@ - + @@ -177191,7 +181647,7 @@ - + @@ -177199,7 +181655,7 @@ - + @@ -177224,70 +181680,70 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -177295,13 +181751,13 @@ - + - + @@ -177310,19 +181766,19 @@ - + - + - + @@ -177336,12 +181792,12 @@ - + - + @@ -177357,25 +181813,25 @@ - + - + - + - + @@ -177385,19 +181841,19 @@ - + - + - + - + @@ -177415,7 +181871,7 @@ - + @@ -177425,29 +181881,29 @@ - + - + - + - + - + @@ -177471,7 +181927,7 @@ - + @@ -177480,7 +181936,7 @@ - + @@ -178028,7 +182484,7 @@ - + @@ -178054,13 +182510,13 @@ - + - + @@ -178068,35 +182524,35 @@ - + - + - + - + - + @@ -178105,28 +182561,28 @@ - + - + - + - + @@ -178134,18 +182590,18 @@ - + - + - + @@ -178153,30 +182609,30 @@ - + - + - + - + - + @@ -178258,10 +182714,10 @@ - + - + @@ -178286,7 +182742,7 @@ - + @@ -178334,7 +182790,7 @@ - + @@ -178888,8 +183344,8 @@ - - + + @@ -178992,25 +183448,25 @@ - + - + - + - + @@ -179019,7 +183475,7 @@ - + @@ -179104,7 +183560,7 @@ - + @@ -179118,7 +183574,7 @@ - + @@ -179150,44 +183606,44 @@ - + - + - + - + - + - + - + @@ -179266,7 +183722,7 @@ - + @@ -179274,7 +183730,7 @@ - + @@ -179282,7 +183738,7 @@ - + @@ -179291,7 +183747,7 @@ - + @@ -179309,30 +183765,30 @@ - + - + - + - + - + - + - + @@ -179351,7 +183807,7 @@ - + @@ -179383,7 +183839,7 @@ - + @@ -179391,7 +183847,7 @@ - + @@ -179446,7 +183902,7 @@ - + @@ -179578,7 +184034,7 @@ - + @@ -179594,7 +184050,7 @@ - + @@ -179610,36 +184066,34 @@ - - - + - + - + - + - + - + - + @@ -180090,7 +184544,7 @@ - + @@ -180245,7 +184699,7 @@ - + @@ -180487,7 +184941,7 @@ - + @@ -180499,8 +184953,8 @@ - - + + @@ -180609,40 +185063,40 @@ - + - + - + - + - + - + - + - + @@ -180686,7 +185140,7 @@ - + @@ -180843,9 +185297,9 @@ - + - + @@ -180857,14 +185311,14 @@ - - + + - - + + @@ -180875,8 +185329,6 @@ - - @@ -180897,101 +185349,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -181072,7 +185431,7 @@ - + @@ -181095,7 +185454,7 @@ - + @@ -181116,7 +185475,7 @@ - + @@ -181151,7 +185510,7 @@ - + @@ -181176,7 +185535,7 @@ - + @@ -181190,16 +185549,14 @@ - - - + - + @@ -181207,7 +185564,7 @@ - + @@ -181306,7 +185663,7 @@ - + @@ -181336,7 +185693,7 @@ - + @@ -181367,7 +185724,7 @@ - + @@ -181427,48 +185784,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -181536,7 +185852,6 @@ - @@ -181545,23 +185860,23 @@ - + - + - + - + @@ -181569,7 +185884,7 @@ - + @@ -181577,14 +185892,14 @@ - + - + @@ -181592,7 +185907,7 @@ - + @@ -181601,7 +185916,7 @@ - + @@ -181610,16 +185925,16 @@ - + - + - + @@ -181656,9 +185971,7 @@ - - - + @@ -181689,7 +186002,7 @@ - + @@ -181711,7 +186024,7 @@ - + @@ -181729,17 +186042,14 @@ - - - - + - + @@ -181764,14 +186074,9 @@ - - - - - - - - + + + @@ -181965,21 +186270,14 @@ - - - + + - - + + + + - - - - - - - - @@ -182062,22 +186360,22 @@ - + - + - + - + - + - + @@ -182107,20 +186405,22 @@ + + + + + + + + + + + + + + + - - - - - - - - - - - - - @@ -182195,52 +186495,52 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -182316,34 +186616,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -182392,9 +186692,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -182449,54 +186810,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -182711,7 +187024,7 @@ - + @@ -182770,13 +187083,13 @@ - + - + - + @@ -182804,7 +187117,7 @@ - + @@ -182933,16 +187246,16 @@ - + - + - + - + @@ -183076,7 +187389,7 @@ - + @@ -183086,7 +187399,6 @@ - @@ -183311,10 +187623,10 @@ - + - + @@ -183365,7 +187677,7 @@ - + @@ -183387,7 +187699,7 @@ - + @@ -183487,22 +187799,22 @@ - + - + - + - + - + - + @@ -183561,34 +187873,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -184001,16 +188313,16 @@ - + - + - + - + @@ -184039,7 +188351,7 @@ - + @@ -184131,13 +188443,13 @@ - + - + - + @@ -184196,52 +188508,52 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -184902,7 +189214,6 @@ - @@ -185065,7 +189376,7 @@ - + @@ -185480,7 +189791,7 @@ - + @@ -185553,7 +189864,7 @@ - + @@ -185576,7 +189887,7 @@ - + @@ -185720,7 +190031,7 @@ - + @@ -185766,7 +190077,7 @@ - + @@ -185776,7 +190087,7 @@ - + @@ -185784,7 +190095,7 @@ - + @@ -185804,7 +190115,7 @@ - + @@ -185887,7 +190198,7 @@ - + @@ -185976,14 +190287,14 @@ - + - + @@ -186009,7 +190320,7 @@ - + @@ -186029,7 +190340,7 @@ - + @@ -186190,13 +190501,13 @@ - + - + - + @@ -186303,10 +190614,10 @@ - + - + @@ -186315,7 +190626,7 @@ - + @@ -186507,10 +190818,10 @@ - + - + @@ -186697,7 +191008,7 @@ - + @@ -186709,6 +191020,6 @@ From 884688fe0cd414bf8c4b7de77cf64407c9d44111 Mon Sep 17 00:00:00 2001 From: Ram Muthiah Date: Tue, 26 Jan 2021 20:27:32 -0800 Subject: [PATCH 28/28] ANDROID: Make vsock virtio packet buff size configurable When the android virtual device stays up for long periods of time, the SLAB sustains everincreasing fragmentation. Contributing to this fragmentation are the virtio packet buffer allocations which are a drain on 64Kb compound pages. Eventually these can't be allocated due to fragmentation. To enable successful allocations for this packet buffer, the packet buffer's size needs to be reduced. To enable a reduction without impacting other partners, this var is being exposed as a command line param. Bug: 149494272 Test: atest ManagedProfileLifecycleStressTest#testCreateStartDelete on local cuttlefish device Signed-off-by: Ram Muthiah Change-Id: Ia4f9180025b64d61d9e2b882daa84460b8f08fd2 --- include/linux/virtio_vsock.h | 3 ++- net/vmw_vsock/virtio_transport_common.c | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index b139f76060a6..7a22e5b8c9c9 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -12,7 +12,8 @@ #define VIRTIO_VSOCK_DEFAULT_MAX_BUF_SIZE (1024 * 256) #define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE (1024 * 4) #define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL -#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE (1024 * 64) +#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE virtio_transport_max_vsock_pkt_buf_size +extern uint virtio_transport_max_vsock_pkt_buf_size; enum { VSOCK_VQ_RX = 0, /* for host to guest data */ diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index efbb521bff13..d07d1e1c190a 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -29,6 +29,10 @@ /* Threshold for detecting small packets to copy */ #define GOOD_COPY_LEN 128 +uint virtio_transport_max_vsock_pkt_buf_size = 64 * 1024; +module_param(virtio_transport_max_vsock_pkt_buf_size, uint, 0444); +EXPORT_SYMBOL_GPL(virtio_transport_max_vsock_pkt_buf_size); + static const struct virtio_transport *virtio_transport_get_ops(void) { const struct vsock_transport *t = vsock_core_get_transport();