[syscalls] Move headers so they can be reused

The syscall headers contain user_out_handle and SafeSyscallArgument
definitions, as well as the syscall declarations. Move these to an
include directory where they can be reused by other parts of the kernel.

Bug: 95763
Change-Id: Ie2997553cb27fff2cfacd306a68d551b6c47dfe7
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/694122
Reviewed-by: Nick Maniscalco <maniscalco@google.com>
Fuchsia-Auto-Submit: Abdulla Kamar <abdulla@google.com>
Commit-Queue: Auto-Submit <auto-submit@fuchsia-infra.iam.gserviceaccount.com>
diff --git a/zircon/kernel/lib/syscalls/channel.cc b/zircon/kernel/lib/syscalls/channel.cc
index 7f699fb..cd684d9 100644
--- a/zircon/kernel/lib/syscalls/channel.cc
+++ b/zircon/kernel/lib/syscalls/channel.cc
@@ -8,6 +8,7 @@
 #include <lib/counters.h>
 #include <lib/fit/defer.h>
 #include <lib/ktrace.h>
+#include <lib/syscalls/forward.h>
 #include <trace.h>
 #include <zircon/errors.h>
 #include <zircon/syscalls/policy.h>
@@ -22,8 +23,6 @@
 #include <object/process_dispatcher.h>
 #include <object/user_handles.h>
 
-#include "priv.h"
-
 #include <ktl/enforce.h>
 
 #define LOCAL_TRACE 0
diff --git a/zircon/kernel/lib/syscalls/clock.cc b/zircon/kernel/lib/syscalls/clock.cc
index f71e29f..731c6f9 100644
--- a/zircon/kernel/lib/syscalls/clock.cc
+++ b/zircon/kernel/lib/syscalls/clock.cc
@@ -4,9 +4,9 @@
 // license that can be found in the LICENSE file or at
 // https://opensource.org/licenses/MIT
 
-#include <object/clock_dispatcher.h>
+#include <lib/syscalls/forward.h>
 
-#include "priv.h"
+#include <object/clock_dispatcher.h>
 
 namespace {
 constexpr uint64_t GetArgsVersion(uint64_t options) {
diff --git a/zircon/kernel/lib/syscalls/ddk.cc b/zircon/kernel/lib/syscalls/ddk.cc
index 3d5ebf3..9dcd392 100644
--- a/zircon/kernel/lib/syscalls/ddk.cc
+++ b/zircon/kernel/lib/syscalls/ddk.cc
@@ -47,8 +47,9 @@
 #include <platform/pc/smbios.h>
 #endif
 
+#include <lib/syscalls/forward.h>
+
 #include "ddk_priv.h"
-#include "priv.h"
 
 #define LOCAL_TRACE 0
 
diff --git a/zircon/kernel/lib/syscalls/ddk_pci.cc b/zircon/kernel/lib/syscalls/ddk_pci.cc
index ed1c361..1eaa377 100644
--- a/zircon/kernel/lib/syscalls/ddk_pci.cc
+++ b/zircon/kernel/lib/syscalls/ddk_pci.cc
@@ -39,7 +39,7 @@
 #include <object/pci_device_dispatcher.h>
 #endif
 
-#include "priv.h"
+#include <lib/syscalls/forward.h>
 
 #include <ktl/enforce.h>
 
diff --git a/zircon/kernel/lib/syscalls/debug.cc b/zircon/kernel/lib/syscalls/debug.cc
index 7f8e046..3aee693 100644
--- a/zircon/kernel/lib/syscalls/debug.cc
+++ b/zircon/kernel/lib/syscalls/debug.cc
@@ -12,6 +12,7 @@
 #include <lib/ktrace.h>
 #include <lib/mtrace.h>
 #include <lib/persistent-debuglog.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_ptr.h>
 #include <platform.h>
 #include <stdint.h>
@@ -28,8 +29,6 @@
 #include <object/resource.h>
 #include <platform/debug.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 constexpr uint32_t kMaxDebugWriteSize = 256u;
diff --git a/zircon/kernel/lib/syscalls/exceptions.cc b/zircon/kernel/lib/syscalls/exceptions.cc
index 7f2b5b5..9bdf831 100644
--- a/zircon/kernel/lib/syscalls/exceptions.cc
+++ b/zircon/kernel/lib/syscalls/exceptions.cc
@@ -4,6 +4,7 @@
 // license that can be found in the LICENSE file or at
 // https://opensource.org/licenses/MIT
 
+#include <lib/syscalls/forward.h>
 #include <platform.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -18,8 +19,6 @@
 #include <object/process_dispatcher.h>
 #include <object/thread_dispatcher.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 // zx_status_t zx_task_create_exception_channel
diff --git a/zircon/kernel/lib/syscalls/fifo.cc b/zircon/kernel/lib/syscalls/fifo.cc
index c23f008..d2701d9 100644
--- a/zircon/kernel/lib/syscalls/fifo.cc
+++ b/zircon/kernel/lib/syscalls/fifo.cc
@@ -5,6 +5,7 @@
 // https://opensource.org/licenses/MIT
 
 #include <inttypes.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_ptr.h>
 #include <platform.h>
 #include <stdint.h>
@@ -19,8 +20,6 @@
 #include <object/handle.h>
 #include <object/process_dispatcher.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 // zx_status_t zx_fifo_create
diff --git a/zircon/kernel/lib/syscalls/futex.cc b/zircon/kernel/lib/syscalls/futex.cc
index 693fbcf..b29d890 100644
--- a/zircon/kernel/lib/syscalls/futex.cc
+++ b/zircon/kernel/lib/syscalls/futex.cc
@@ -5,14 +5,13 @@
 // https://opensource.org/licenses/MIT
 
 #include <inttypes.h>
+#include <lib/syscalls/forward.h>
 #include <trace.h>
 #include <zircon/types.h>
 
 #include <object/futex_context.h>
 #include <object/process_dispatcher.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 // zx_status_t zx_futex_wait
diff --git a/zircon/kernel/lib/syscalls/handle_ops.cc b/zircon/kernel/lib/syscalls/handle_ops.cc
index f999b5d..f371811 100644
--- a/zircon/kernel/lib/syscalls/handle_ops.cc
+++ b/zircon/kernel/lib/syscalls/handle_ops.cc
@@ -5,6 +5,7 @@
 // https://opensource.org/licenses/MIT
 
 #include <inttypes.h>
+#include <lib/syscalls/forward.h>
 #include <trace.h>
 #include <zircon/errors.h>
 #include <zircon/types.h>
@@ -13,8 +14,6 @@
 #include <object/process_dispatcher.h>
 #include <object/user_handles.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 // zx_status_t zx_handle_close
diff --git a/zircon/kernel/lib/syscalls/hypervisor.cc b/zircon/kernel/lib/syscalls/hypervisor.cc
index d12138c..d2ea4e4 100644
--- a/zircon/kernel/lib/syscalls/hypervisor.cc
+++ b/zircon/kernel/lib/syscalls/hypervisor.cc
@@ -4,6 +4,7 @@
 // license that can be found in the LICENSE file or at
 // https://opensource.org/licenses/MIT
 
+#include <lib/syscalls/forward.h>
 #include <zircon/syscalls/hypervisor.h>
 
 #include <fbl/ref_ptr.h>
@@ -16,8 +17,6 @@
 #include <object/vm_address_region_dispatcher.h>
 #include <object/vm_object_dispatcher.h>
 
-#include "priv.h"
-
 zx_status_t sys_guest_create(zx_handle_t resource, uint32_t options, user_out_handle* guest_handle,
                              user_out_handle* vmar_handle) {
   if (options != 0u) {
diff --git a/zircon/kernel/lib/syscalls/priv.h b/zircon/kernel/lib/syscalls/include/lib/syscalls/forward.h
similarity index 90%
rename from zircon/kernel/lib/syscalls/priv.h
rename to zircon/kernel/lib/syscalls/include/lib/syscalls/forward.h
index f426000..794896b 100644
--- a/zircon/kernel/lib/syscalls/priv.h
+++ b/zircon/kernel/lib/syscalls/include/lib/syscalls/forward.h
@@ -4,10 +4,9 @@
 // license that can be found in the LICENSE file or at
 // https://opensource.org/licenses/MIT
 
-#ifndef ZIRCON_KERNEL_LIB_SYSCALLS_PRIV_H_
-#define ZIRCON_KERNEL_LIB_SYSCALLS_PRIV_H_
+#ifndef ZIRCON_KERNEL_LIB_SYSCALLS_INCLUDE_LIB_SYSCALLS_FORWARD_H_
+#define ZIRCON_KERNEL_LIB_SYSCALLS_INCLUDE_LIB_SYSCALLS_FORWARD_H_
 
-#include <lib/boot-options/types.h>
 #include <lib/user_copy/user_ptr.h>
 #include <zircon/syscalls/types.h>
 #include <zircon/types.h>
@@ -46,7 +45,7 @@
   }
 
   // These methods are called by the kazoo-generated wrapper_* functions
-  // (syscall-kernel-wrappers.inc).  See KernelWrapperGenerator::syscall.
+  // (syscall-kernel-wrappers.inc).  See KernelWrappersOutput.
 
   zx_status_t begin_copyout(ProcessDispatcher* current_process,
                             user_out_ptr<zx_handle_t> out) const {
@@ -92,4 +91,4 @@
 #undef BLOCKING_SYSCALL
 #undef _ZX_SYSCALL_ANNO
 
-#endif  // ZIRCON_KERNEL_LIB_SYSCALLS_PRIV_H_
+#endif  // ZIRCON_KERNEL_LIB_SYSCALLS_INCLUDE_LIB_SYSCALLS_FORWARD_H_
diff --git a/zircon/kernel/lib/syscalls/safe-syscall-argument.h b/zircon/kernel/lib/syscalls/include/lib/syscalls/safe-syscall-argument.h
similarity index 93%
rename from zircon/kernel/lib/syscalls/safe-syscall-argument.h
rename to zircon/kernel/lib/syscalls/include/lib/syscalls/safe-syscall-argument.h
index 803b7f2..aa049bc 100644
--- a/zircon/kernel/lib/syscalls/safe-syscall-argument.h
+++ b/zircon/kernel/lib/syscalls/include/lib/syscalls/safe-syscall-argument.h
@@ -4,8 +4,8 @@
 // license that can be found in the LICENSE file or at
 // https://opensource.org/licenses/MIT
 
-#ifndef ZIRCON_KERNEL_LIB_SYSCALLS_SAFE_SYSCALL_ARGUMENT_H_
-#define ZIRCON_KERNEL_LIB_SYSCALLS_SAFE_SYSCALL_ARGUMENT_H_
+#ifndef ZIRCON_KERNEL_LIB_SYSCALLS_INCLUDE_LIB_SYSCALLS_SAFE_SYSCALL_ARGUMENT_H_
+#define ZIRCON_KERNEL_LIB_SYSCALLS_INCLUDE_LIB_SYSCALLS_SAFE_SYSCALL_ARGUMENT_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -91,4 +91,4 @@
   static constexpr T Sanitize(RawType value) { return value; }
 };
 
-#endif  // ZIRCON_KERNEL_LIB_SYSCALLS_SAFE_SYSCALL_ARGUMENT_H_
+#endif  // ZIRCON_KERNEL_LIB_SYSCALLS_INCLUDE_LIB_SYSCALLS_SAFE_SYSCALL_ARGUMENT_H_
diff --git a/zircon/kernel/lib/syscalls/object.cc b/zircon/kernel/lib/syscalls/object.cc
index 3d66e5a..9c501a6 100644
--- a/zircon/kernel/lib/syscalls/object.cc
+++ b/zircon/kernel/lib/syscalls/object.cc
@@ -7,6 +7,7 @@
 #include <inttypes.h>
 #include <lib/boot-options/boot-options.h>
 #include <lib/heap.h>
+#include <lib/syscalls/forward.h>
 #include <lib/zircon-internal/macros.h>
 #include <platform.h>
 #include <trace.h>
@@ -40,8 +41,6 @@
 #include <vm/pmm.h>
 #include <vm/vm.h>
 
-#include "priv.h"
-
 #include <ktl/enforce.h>
 
 #define LOCAL_TRACE 0
diff --git a/zircon/kernel/lib/syscalls/object_wait.cc b/zircon/kernel/lib/syscalls/object_wait.cc
index 6688494..9b4483b 100644
--- a/zircon/kernel/lib/syscalls/object_wait.cc
+++ b/zircon/kernel/lib/syscalls/object_wait.cc
@@ -6,6 +6,7 @@
 
 #include <inttypes.h>
 #include <lib/ktrace.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_ptr.h>
 #include <platform.h>
 #include <trace.h>
@@ -23,8 +24,6 @@
 #include <object/process_dispatcher.h>
 #include <object/wait_signal_observer.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 constexpr uint32_t kMaxWaitHandleCount = ZX_WAIT_MANY_MAX_ITEMS;
diff --git a/zircon/kernel/lib/syscalls/pager.cc b/zircon/kernel/lib/syscalls/pager.cc
index 84a41a8..842626c 100644
--- a/zircon/kernel/lib/syscalls/pager.cc
+++ b/zircon/kernel/lib/syscalls/pager.cc
@@ -5,6 +5,7 @@
 // https://opensource.org/licenses/MIT
 
 #include <align.h>
+#include <lib/syscalls/forward.h>
 #include <zircon/syscalls-next.h>
 
 #include <fbl/ref_ptr.h>
@@ -13,8 +14,6 @@
 #include <object/vm_object_dispatcher.h>
 #include <vm/vm_object_paged.h>
 
-#include "priv.h"
-
 #include <ktl/enforce.h>
 
 namespace {
diff --git a/zircon/kernel/lib/syscalls/port.cc b/zircon/kernel/lib/syscalls/port.cc
index 265336d..74f7ab9 100644
--- a/zircon/kernel/lib/syscalls/port.cc
+++ b/zircon/kernel/lib/syscalls/port.cc
@@ -6,6 +6,7 @@
 
 #include <inttypes.h>
 #include <lib/ktrace.h>
+#include <lib/syscalls/forward.h>
 #include <trace.h>
 #include <zircon/errors.h>
 #include <zircon/syscalls/policy.h>
@@ -17,8 +18,6 @@
 #include <object/port_dispatcher.h>
 #include <object/process_dispatcher.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 // zx_status_t zx_port_create
diff --git a/zircon/kernel/lib/syscalls/profile.cc b/zircon/kernel/lib/syscalls/profile.cc
index 93634f2..6a67632e 100644
--- a/zircon/kernel/lib/syscalls/profile.cc
+++ b/zircon/kernel/lib/syscalls/profile.cc
@@ -7,6 +7,7 @@
 #include <inttypes.h>
 #include <lib/counters.h>
 #include <lib/ktrace.h>
+#include <lib/syscalls/forward.h>
 #include <zircon/errors.h>
 #include <zircon/types.h>
 
@@ -15,8 +16,6 @@
 #include <object/job_dispatcher.h>
 #include <object/profile_dispatcher.h>
 
-#include "priv.h"
-
 KCOUNTER(profile_create, "profile.create")
 KCOUNTER(profile_set, "profile.set")
 
diff --git a/zircon/kernel/lib/syscalls/resource.cc b/zircon/kernel/lib/syscalls/resource.cc
index 243097095..f95fe69 100644
--- a/zircon/kernel/lib/syscalls/resource.cc
+++ b/zircon/kernel/lib/syscalls/resource.cc
@@ -5,6 +5,7 @@
 // https://opensource.org/licenses/MIT
 
 #include <inttypes.h>
+#include <lib/syscalls/forward.h>
 #include <zircon/errors.h>
 #include <zircon/types.h>
 
@@ -16,8 +17,6 @@
 #include <object/resource.h>
 #include <object/resource_dispatcher.h>
 
-#include "priv.h"
-
 #include <ktl/enforce.h>
 
 // Create a new resource, child of the provided resource.
diff --git a/zircon/kernel/lib/syscalls/socket.cc b/zircon/kernel/lib/syscalls/socket.cc
index 234328d..b90b1dd 100644
--- a/zircon/kernel/lib/syscalls/socket.cc
+++ b/zircon/kernel/lib/syscalls/socket.cc
@@ -5,6 +5,7 @@
 // https://opensource.org/licenses/MIT
 
 #include <inttypes.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_ptr.h>
 #include <platform.h>
 #include <stdint.h>
@@ -21,8 +22,6 @@
 #include <object/process_dispatcher.h>
 #include <object/socket_dispatcher.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 // zx_status_t zx_socket_create
diff --git a/zircon/kernel/lib/syscalls/stream.cc b/zircon/kernel/lib/syscalls/stream.cc
index fe2d8fc..851b304 100644
--- a/zircon/kernel/lib/syscalls/stream.cc
+++ b/zircon/kernel/lib/syscalls/stream.cc
@@ -5,6 +5,7 @@
 // https://opensource.org/licenses/MIT
 
 #include <inttypes.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_iovec.h>
 #include <lib/user_copy/user_ptr.h>
 #include <platform.h>
@@ -21,8 +22,6 @@
 #include <object/stream_dispatcher.h>
 #include <vm/vm_aspace.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 // zx_status_t zx_stream_create
diff --git a/zircon/kernel/lib/syscalls/syscalls.cc b/zircon/kernel/lib/syscalls/syscalls.cc
index 8581826..8285ec1 100644
--- a/zircon/kernel/lib/syscalls/syscalls.cc
+++ b/zircon/kernel/lib/syscalls/syscalls.cc
@@ -6,6 +6,8 @@
 
 #include <inttypes.h>
 #include <lib/ktrace.h>
+#include <lib/syscalls/forward.h>
+#include <lib/syscalls/safe-syscall-argument.h>
 #include <lib/syscalls/zx-syscall-numbers.h>
 #include <lib/userabi/vdso.h>
 #include <platform.h>
@@ -19,8 +21,6 @@
 #include <object/process_dispatcher.h>
 #include <syscalls/syscalls.h>
 
-#include "priv.h"
-#include "safe-syscall-argument.h"
 #include "vdso-valid-sysret.h"
 
 #define LOCAL_TRACE 0
diff --git a/zircon/kernel/lib/syscalls/system.cc b/zircon/kernel/lib/syscalls/system.cc
index 97232c7..7fbdcc2 100644
--- a/zircon/kernel/lib/syscalls/system.cc
+++ b/zircon/kernel/lib/syscalls/system.cc
@@ -10,6 +10,7 @@
 #include <lib/debuglog.h>
 #include <lib/fit/defer.h>
 #include <lib/instrumentation/asan.h>
+#include <lib/syscalls/forward.h>
 #include <lib/zircon-internal/macros.h>
 #include <mexec.h>
 #include <platform.h>
@@ -51,7 +52,6 @@
 #include <vm/vm.h>
 #include <vm/vm_aspace.h>
 
-#include "priv.h"
 #include "system_priv.h"
 
 #include <ktl/enforce.h>
diff --git a/zircon/kernel/lib/syscalls/task.cc b/zircon/kernel/lib/syscalls/task.cc
index 9764f17..e87bc99 100644
--- a/zircon/kernel/lib/syscalls/task.cc
+++ b/zircon/kernel/lib/syscalls/task.cc
@@ -8,6 +8,7 @@
 #include <lib/boot-options/boot-options.h>
 #include <lib/counters.h>
 #include <lib/ktrace.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_ptr.h>
 #include <lib/userabi/vdso.h>
 #include <platform.h>
@@ -34,8 +35,6 @@
 #include <object/thread_dispatcher.h>
 #include <object/vm_address_region_dispatcher.h>
 
-#include "priv.h"
-
 #include <ktl/enforce.h>
 
 #define LOCAL_TRACE 0
diff --git a/zircon/kernel/lib/syscalls/test.cc b/zircon/kernel/lib/syscalls/test.cc
index 85cd9a56..ecd5462 100644
--- a/zircon/kernel/lib/syscalls/test.cc
+++ b/zircon/kernel/lib/syscalls/test.cc
@@ -4,7 +4,7 @@
 // license that can be found in the LICENSE file or at
 // https://opensource.org/licenses/MIT
 
-#include "priv.h"
+#include <lib/syscalls/forward.h>
 
 // zx_status_t zx_syscall_test_0
 zx_status_t sys_syscall_test_0(void) { return 0; }
diff --git a/zircon/kernel/lib/syscalls/timer.cc b/zircon/kernel/lib/syscalls/timer.cc
index 5335497..6bdb5a9 100644
--- a/zircon/kernel/lib/syscalls/timer.cc
+++ b/zircon/kernel/lib/syscalls/timer.cc
@@ -6,6 +6,7 @@
 
 #include <inttypes.h>
 #include <lib/ktrace.h>
+#include <lib/syscalls/forward.h>
 #include <trace.h>
 #include <zircon/errors.h>
 #include <zircon/types.h>
@@ -17,8 +18,6 @@
 #include <object/process_dispatcher.h>
 #include <object/timer_dispatcher.h>
 
-#include "priv.h"
-
 #include <ktl/enforce.h>
 
 // zx_status_t zx_timer_create
diff --git a/zircon/kernel/lib/syscalls/vmar.cc b/zircon/kernel/lib/syscalls/vmar.cc
index 7447b80..a6b0b9b 100644
--- a/zircon/kernel/lib/syscalls/vmar.cc
+++ b/zircon/kernel/lib/syscalls/vmar.cc
@@ -6,6 +6,7 @@
 
 #include <inttypes.h>
 #include <lib/fit/defer.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_ptr.h>
 #include <trace.h>
 #include <zircon/errors.h>
@@ -21,8 +22,6 @@
 #include <vm/vm_address_region.h>
 #include <vm/vm_object.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 // zx_status_t zx_vmar_allocate
diff --git a/zircon/kernel/lib/syscalls/vmo.cc b/zircon/kernel/lib/syscalls/vmo.cc
index 0f333d4..5485050 100644
--- a/zircon/kernel/lib/syscalls/vmo.cc
+++ b/zircon/kernel/lib/syscalls/vmo.cc
@@ -6,6 +6,7 @@
 
 #include <inttypes.h>
 #include <lib/fit/defer.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_ptr.h>
 #include <lib/zircon-internal/thread_annotations.h>
 #include <trace.h>
@@ -20,8 +21,6 @@
 #include <vm/vm_object.h>
 #include <vm/vm_object_paged.h>
 
-#include "priv.h"
-
 #define LOCAL_TRACE 0
 
 static_assert(ZX_CACHE_POLICY_CACHED == ARCH_MMU_FLAG_CACHED,
diff --git a/zircon/kernel/lib/syscalls/zircon.cc b/zircon/kernel/lib/syscalls/zircon.cc
index eb94befc..81a4576 100644
--- a/zircon/kernel/lib/syscalls/zircon.cc
+++ b/zircon/kernel/lib/syscalls/zircon.cc
@@ -7,6 +7,7 @@
 #include <inttypes.h>
 #include <lib/counters.h>
 #include <lib/crypto/global_prng.h>
+#include <lib/syscalls/forward.h>
 #include <lib/user_copy/user_ptr.h>
 #include <platform.h>
 #include <stdint.h>
@@ -34,8 +35,6 @@
 #include <object/resource.h>
 #include <object/thread_dispatcher.h>
 
-#include "priv.h"
-
 #include <ktl/enforce.h>
 
 #define LOCAL_TRACE 0