[PATCH 3/3] i386/virtualpok BSP, virtual BSP to be used with POK, build with enable-paravirt
Philipp Eppelt
philipp.eppelt at mailbox.tu-dresden.de
Sat Nov 30 09:13:37 UTC 2013
---
c/src/lib/libbsp/i386/acinclude.m4 | 2 +
c/src/lib/libbsp/i386/virtualpok/Makefile.am | 87 ++++++++
c/src/lib/libbsp/i386/virtualpok/README.virt | 15 ++
c/src/lib/libbsp/i386/virtualpok/bsp_specs | 14 ++
c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c | 139 ++++++++++++
c/src/lib/libbsp/i386/virtualpok/configure.ac | 23 ++
c/src/lib/libbsp/i386/virtualpok/console/console.c | 184 ++++++++++++++++
c/src/lib/libbsp/i386/virtualpok/include/bsp.h | 53 +++++
.../virtualpok/include/virtualizationlayerbsp.h | 58 +++++
c/src/lib/libbsp/i386/virtualpok/irq/irq.c | 85 +++++++
c/src/lib/libbsp/i386/virtualpok/irq/irq.h | 79 +++++++
c/src/lib/libbsp/i386/virtualpok/libpart.a | Bin 0 -> 130636 bytes
.../i386/virtualpok/make/custom/virtualpok.cfg | 17 ++
c/src/lib/libbsp/i386/virtualpok/preinstall.am | 79 +++++++
c/src/lib/libbsp/i386/virtualpok/start/_start.S | 37 ++++
.../libbsp/i386/virtualpok/start/bspgetworkarea.c | 102 +++++++++
.../lib/libbsp/i386/virtualpok/startup/bspstart.c | 41 ++++
c/src/lib/libbsp/i386/virtualpok/startup/linkcmds | 244 +++++++++++++++++++++
18 files changed, 1259 insertions(+)
create mode 100644 c/src/lib/libbsp/i386/virtualpok/Makefile.am
create mode 100644 c/src/lib/libbsp/i386/virtualpok/README.virt
create mode 100644 c/src/lib/libbsp/i386/virtualpok/bsp_specs
create mode 100644 c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c
create mode 100644 c/src/lib/libbsp/i386/virtualpok/configure.ac
create mode 100644 c/src/lib/libbsp/i386/virtualpok/console/console.c
create mode 100644 c/src/lib/libbsp/i386/virtualpok/include/bsp.h
create mode 100644 c/src/lib/libbsp/i386/virtualpok/include/virtualizationlayerbsp.h
create mode 100644 c/src/lib/libbsp/i386/virtualpok/irq/irq.c
create mode 100644 c/src/lib/libbsp/i386/virtualpok/irq/irq.h
create mode 100644 c/src/lib/libbsp/i386/virtualpok/libpart.a
create mode 100644 c/src/lib/libbsp/i386/virtualpok/make/custom/virtualpok.cfg
create mode 100644 c/src/lib/libbsp/i386/virtualpok/preinstall.am
create mode 100644 c/src/lib/libbsp/i386/virtualpok/start/_start.S
create mode 100644 c/src/lib/libbsp/i386/virtualpok/start/bspgetworkarea.c
create mode 100644 c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c
create mode 100644 c/src/lib/libbsp/i386/virtualpok/startup/linkcmds
diff --git a/c/src/lib/libbsp/i386/acinclude.m4 b/c/src/lib/libbsp/i386/acinclude.m4
index a2f2384..2d60714 100644
--- a/c/src/lib/libbsp/i386/acinclude.m4
+++ b/c/src/lib/libbsp/i386/acinclude.m4
@@ -4,6 +4,8 @@ AC_DEFUN([RTEMS_CHECK_BSPDIR],
case "$1" in
pc386 )
AC_CONFIG_SUBDIRS([pc386]);;
+ virtualpok )
+ AC_CONFIG_SUBDIRS([virtualpok]);;
*)
AC_MSG_ERROR([Invalid BSP]);;
esac
diff --git a/c/src/lib/libbsp/i386/virtualpok/Makefile.am b/c/src/lib/libbsp/i386/virtualpok/Makefile.am
new file mode 100644
index 0000000..d62eb50
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/Makefile.am
@@ -0,0 +1,87 @@
+##
+
+ACLOCAL_AMFLAGS = -I ../../../../aclocal
+
+include $(top_srcdir)/../../../../automake/compile.am
+include $(top_srcdir)/../../bsp.am
+
+include_bspdir = $(includedir)/bsp
+
+dist_project_lib_DATA = bsp_specs
+
+include_HEADERS = include/bsp.h
+include_HEADERS += ../../shared/include/tm27.h
+include_HEADERS += include/virtualizationlayerbsp.h
+#include_HEADERS += include/virtualizationlayercpu.h
+
+nodist_include_HEADERS = include/bspopts.h
+nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h
+DISTCLEANFILES = include/bspopts.h
+noinst_PROGRAMS =
+
+include_bsp_HEADERS = irq/irq.h
+include_bsp_HEADERS += ../../shared/include/irq-generic.h
+#include_bsp_HEADERS +=
+
+nodist_include_HEADERS += ../../shared/include/coverhd.h
+
+#noinst_LIBRARIES = libbspstart.a
+#libbspstart_a_SOURCES = start/_start.S
+
+dist_project_lib_DATA += startup/linkcmds
+
+noinst_LIBRARIES = libbsp.a
+libbsp_a_SOURCES =
+
+# startup
+libbsp_a_SOURCES += start/_start.S
+project_lib_DATA = _start.$(OBJEXT)
+libbsp_a_SOURCES += ../../shared/bspclean.c
+libbsp_a_SOURCES += ../../shared/bsplibc.c
+libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c
+libbsp_a_SOURCES += ../../shared/bsppredriverhook.c
+libbsp_a_SOURCES += start/bspgetworkarea.c
+libbsp_a_SOURCES += ../../shared/bsppost.c
+libbsp_a_SOURCES += startup/bspstart.c
+libbsp_a_SOURCES += ../../shared/bootcard.c
+libbsp_a_SOURCES += ../../shared/sbrk.c
+libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c
+libbsp_a_SOURCES += ../../shared/bspreset_loop.c
+libbsp_a_SOURCES += irq/irq.c
+libbsp_a_SOURCES += ../../shared/src/irq-generic.c
+# TODO I don't really need an IDT, don't I?
+libbsp_a_SOURCES += ../../i386/shared/irq/idt.c
+
+# clock
+libbsp_a_SOURCES += clock/ckinit.c
+# console
+libbsp_a_SOURCES += console/console.c
+# timer
+#libbsp_a_SOURCES += timer/timer.c timer/timerisr.c
+
+libbsp_a_LIBADD = ../../../libcpu/@RTEMS_CPU@/cache.rel
+libbsp_a_LIBADD += ../../../libcpu/@RTEMS_CPU@/page.rel
+libbsp_a_LIBADD += ../../../libcpu/@RTEMS_CPU@/score.rel
+
+noinst_LIBRARIES += libpokpart.a
+
+libpokpart.a :
+ cp -u $(top_srcdir)/libpart.a .
+ ar t libpart.a > libpart.list
+ sed -e "s/\.lo/\.o/g" libpart.list > libpart.o.list
+ ar x libpart.a
+ rename .lo .o `cat libpart.list`
+ ar q libbsp.a `cat libpart.o.list`
+# ar cru libpokpart.a `cat libpart.o.list`
+# rm `cat libpart.o.list` is optional as all files get overwritten with new
+# ones by 'ar x'. But I think it's bad style to remove object files during
+# compilation.
+
+
+#libpokpart_a_LIBADD = libpart.a
+
+
+EXTRA_DIST = times
+
+include $(srcdir)/preinstall.am
+include $(top_srcdir)/../../../../automake/local.am
diff --git a/c/src/lib/libbsp/i386/virtualpok/README.virt b/c/src/lib/libbsp/i386/virtualpok/README.virt
new file mode 100644
index 0000000..77ce319
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/README.virt
@@ -0,0 +1,15 @@
+Author: Philipp Eppelt
+ philipp.eppelt at mailbox.tu-dresden.de
+
+This BSP is intended to be used with POK. Other hosts are currently not
+supported.
+
+The BSP uses functions from the virtualization layer. The host system has to
+provide a library implementing the function specified in the virtualization
+layer. Otherwise the compilation process will fail.
+
+Further information on the project can be obtained in the RTEMS Wiki:
+wiki.rtems.org/wiki/index.php/GSOC_2013_-_Paravirtualization_of_RTEMS
+
+With the provided libpart.a, which is compiled by POK, the testsuite compiles
+up to the tmtests, because this BSP has no timer, yet.
diff --git a/c/src/lib/libbsp/i386/virtualpok/bsp_specs b/c/src/lib/libbsp/i386/virtualpok/bsp_specs
new file mode 100644
index 0000000..861b21e
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/bsp_specs
@@ -0,0 +1,14 @@
+%rename lib old_lib
+
+*endfile:
+crtend.o%s crtn.o%s
+
+*startfile:
+%{!qrtems: %(old_startfile)} \
+%{!nostdlib: %{qrtems: crti.o%s crtbegin.o%s }}
+
+*lib:
+%{!qrtems: %(old_lib)} \
+%{!nostdlib: %{qrtems: --start-group -lrtemsbsp -lrtemscpu -lc -lgcc --end-group \
+%{!qnolinkcmds: -T linkcmds%s}}}
+
diff --git a/c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c b/c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c
new file mode 100644
index 0000000..d36eb3d
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c
@@ -0,0 +1,139 @@
+/* ckinit.c
+ *
+ * This file provides a clock device driver to be used with the
+ * virtualizationlayer.
+ *
+ * COPYRIGHT (c) 2013.
+ * Philipp Eppelt.
+ *
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <bsp.h>
+#include <bsp/irq.h>
+
+#include <rtems.h>
+#include <rtems/config.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/timestamp.h>
+#include <assert.h>
+#include <rtems/score/virtualizationlayercpu.h>
+#include <virtualizationlayerbsp.h>
+
+
+void Clock_isr(void *param);
+static void Clock_isr_handler(void *param);
+/*
+ * The interrupt vector number associated with the clock tick device
+ * driver.
+ */
+
+#define CLOCK_VECTOR 0x0
+
+/*
+ * Clock_driver_ticks is a monotonically increasing counter of the
+ * number of clock ticks since the driver was initialized.
+ */
+
+volatile uint32_t pc386_microseconds_per_isr;
+volatile uint32_t pc386_isrs_per_tick;
+volatile uint32_t Clock_driver_ticks;
+
+void (*Clock_driver_support_at_tick)(void) = NULL;
+
+#define Clock_driver_support_install_isr( _new, _old ) \
+ do { \
+ _old = NULL; \
+ } while(0)
+
+bool Clock_isr_enabled = false;
+
+static void Clock_isr_handler(void *param)
+{
+ if ( Clock_isr_enabled )
+ Clock_isr( param );
+} // Clock_isr_handler
+
+static void Clock_driver_support_at_tick_empty(void)
+{
+}
+
+/**
+ * @brief Enable clock device; start receiving clock interrupts.
+ */
+static void clockOn(void)
+{
+ pc386_isrs_per_tick = 1;
+ pc386_microseconds_per_isr = rtems_configuration_get_microseconds_per_tick();
+
+ _CPU_Virtual_Irq_request( CLOCK_VECTOR );
+} // clockOn
+
+/**
+ * @brief Disable clock device; stop receiving clock interrupts.
+ */
+static void clockOff(void)
+{
+ _CPU_Virtual_Irq_detach( CLOCK_VECTOR );
+} // clockOff
+
+/**
+ * @brief Install the clock ISR in the RTEMS interrupt table.
+ */
+void Clock_driver_install_handler(void);
+void Clock_driver_install_handler(void)
+{
+ rtems_status_code status;
+
+ status = rtems_interrupt_handler_install(
+ BSP_PERIODIC_TIMER,
+ "ckinit",
+ RTEMS_INTERRUPT_UNIQUE,
+ Clock_isr_handler,
+ NULL
+ );
+ if(status != RTEMS_SUCCESSFUL)
+ printf( "ERROR: During clock interrupt handler install: %i\n", status);
+ else
+ printf( "CLOCK DRIVER installed successfully\n");
+
+ clockOn();
+} // Clock_driver_install_handler
+
+uint32_t (*Clock_driver_nanoseconds_since_last_tick)(void) = NULL;
+
+/**
+ * @brief Setup the clock driver.
+ */
+void Clock_driver_support_initialize_hardware(void);
+void Clock_driver_support_initialize_hardware(void)
+{
+ Clock_driver_support_at_tick = Clock_driver_support_at_tick_empty;
+
+ Clock_isr_enabled = true;
+} // Clock_driver_support_initialize_hardware
+
+#define Clock_driver_support_shutdown_hardware() \
+ do { \
+ rtems_status_code status; \
+ clockOff(); \
+ status = rtems_interrupt_handler_remove( \
+ BSP_PERIODIC_TIMER, \
+ Clock_isr_handler, \
+ NULL \
+ ); \
+ assert(status == RTEMS_SUCCESSFUL); \
+ } while (0)
+
+
+#include "../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/i386/virtualpok/configure.ac b/c/src/lib/libbsp/i386/virtualpok/configure.ac
new file mode 100644
index 0000000..eca01cc
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/configure.ac
@@ -0,0 +1,23 @@
+## Process this file with autoconf to produce a configure script.
+##
+
+AC_PREREQ([2.68])
+AC_INIT([rtems-c-src-lib-libbsp-i386-virtualpok],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla])
+AC_CONFIG_SRCDIR([bsp_specs])
+RTEMS_TOP(../../../../../..)
+
+RTEMS_CANONICAL_TARGET_CPU
+AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.12.2])
+RTEMS_BSP_CONFIGURE
+
+RTEMS_PROG_CC_FOR_TARGET
+RTEMS_CANONICALIZE_TOOLS
+RTEMS_PROG_CCAS
+
+AC_SUBST([RTEMS_ROOT],[${rtems_updir}'$(top_builddir)'])
+
+RTEMS_BSP_CLEANUP_OPTIONS(0, 0)
+
+# Explicitly list all Makefiles here
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff --git a/c/src/lib/libbsp/i386/virtualpok/console/console.c b/c/src/lib/libbsp/i386/virtualpok/console/console.c
new file mode 100644
index 0000000..51ff319
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/console/console.c
@@ -0,0 +1,184 @@
+/*
+ * This file contains the template for a console IO package.
+ *
+ * COPYRIGHT (c) 2013 Philipp Eppelt.
+ *
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ */
+
+#define NO_BSP_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <virtualizationlayerbsp.h>
+
+/**
+ * @brief Initializes the console.
+ */
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_fatal_error_occurred(status);
+ }
+
+// Virtual console init
+ status = _BSP_Virtual_Console_init();
+
+ if( status != 0 )
+ {
+ rtems_fatal_error_occurred(status);
+ }
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/**
+ * @brief Read a char from the virtual console (if supported).
+ */
+char inbyte( void )
+{
+ return _BSP_Virtual_Char_read();
+}
+
+
+/**
+ * @brief Write a char to the virtual console.
+ */
+void outbyte(
+ char ch
+)
+{
+ _BSP_Virtual_Char_write(&ch);
+}
+
+/* printk support */
+BSP_output_char_function_type BSP_output_char = outbyte;
+BSP_polling_getchar_function_type BSP_poll_char = inbyte;
+
+
+/* Console support */
+
+/*
+ * It is mostly a translation of termios intended calls to the char by char
+ * printk interface.
+ */
+
+/**
+ * @brief Does nothing.
+ */
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/**
+ * @brief Does nothing.
+ */
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+/**
+ * @brief Looks like termios, but reads through inbyte() function.
+ */
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/**
+ * @brief Looks like termios, but writes through outbyte() function.
+ */
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/**
+ * @brief Does nothing!
+ */
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/i386/virtualpok/include/bsp.h b/c/src/lib/libbsp/i386/virtualpok/include/bsp.h
new file mode 100644
index 0000000..1d781ba
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/include/bsp.h
@@ -0,0 +1,53 @@
+/* bsp.h
+ *
+ * This include file contains all board IO definitions.
+ *
+ * COPYRIGHT (c) 2013 Philipp Eppelt.
+ *
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ */
+
+#ifndef _BSP_H
+#define _BSP_H
+
+#include <bspopts.h>
+
+#include <rtems.h>
+#include <rtems/console.h>
+#include <rtems/clockdrv.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define rtems_bsp_delay( microseconds ) \
+ { \
+ }
+
+
+
+#define BSP_DEFAULT_UNIFIED_WORK_AREAS 1
+/* functions */
+
+rtems_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/lib/libbsp/i386/virtualpok/include/virtualizationlayerbsp.h b/c/src/lib/libbsp/i386/virtualpok/include/virtualizationlayerbsp.h
new file mode 100644
index 0000000..4b0a0e6
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/include/virtualizationlayerbsp.h
@@ -0,0 +1,58 @@
+/* Author: Philipp Eppelt - philipp.eppelt at mailbox.tu-dresden.de
+ *
+ * COPYRIGHT (c) 2013 Philipp Eppelt.
+ *
+ * Purpose: BSP part of the virtualization layer.
+ * Licencse: see RTEMS License.
+ */
+
+#ifndef RTEMS_VIRT_LAYER_BSP_H
+#define RTEMS_VIRT_LAYER_BSP_H
+
+/**
+ * \brief Initializes the console.
+ *
+ */
+int
+_BSP_Virtual_Console_init(void);
+
+/**
+ * \brief Reads a character from the console.
+ */
+char
+_BSP_Virtual_Char_read(void);
+
+/**
+ * \brief Writes a character to the console.
+ */
+void
+_BSP_Virtual_Char_write(char* c);
+
+/**
+ * \brief Initializes the clock.
+ */
+int
+_BSP_Virtual_Clock_init(void);
+
+/**
+ * \brief Reads the clock.
+ */
+int
+_BSP_Virtual_Clock_read(void);
+
+/**
+ * \brief Handles faults delivered by the host system.
+ *
+ * POK will forward occuring faults to this handler.
+ */
+int
+_BSP_Virtual_faulthandler(void);
+
+
+/* Startup functions
+ */
+
+int
+_BSP_Virtual_getworkspacearea( void );
+
+#endif /* RTEMS_VIRT_LAYER_BSP_H */
diff --git a/c/src/lib/libbsp/i386/virtualpok/irq/irq.c b/c/src/lib/libbsp/i386/virtualpok/irq/irq.c
new file mode 100644
index 0000000..a095e26
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/irq/irq.c
@@ -0,0 +1,85 @@
+#include <bsp/irq-generic.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h> /* PRIu32 */
+#include <virtualizationlayerbsp.h>
+
+uint32_t irq_count[BSP_IRQ_LINES_NUMBER] = {0};
+
+uint32_t
+BSP_irq_count_dump(FILE *f)
+{
+ uint32_t tot = 0;
+ int i;
+ if ( !f )
+ f = stdout;
+ for ( i=0; i<BSP_IRQ_LINES_NUMBER; i++ ) {
+ tot += irq_count[i];
+ fprintf(f,"IRQ %2u: %9"PRIu32"\n", i, irq_count[i]);
+ }
+ return tot;
+}
+
+/**
+ * @brief Enable vector line at interrupt source. See description!
+ *
+ * Currently this is only a dummy function, as registering the vector on POK
+ * will deliver interrupts before the handler is installed. So the driver
+ * needing the interrupt needs to call _CPU_Virtual_Irq_attach().
+ */
+rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
+{
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/**
+ * @brief Disabling vector line at interrupt source.
+ */
+rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
+{
+ _CPU_Virtual_Irq_detach( vector );
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/**
+ * @brief Dummy function; necessary for a normal startup.
+ */
+rtems_status_code bsp_interrupt_facility_initialize(void)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/**
+ * @brief If no interrupt handler is installed for a specified vector number,
+ * this is called and will output a warning.
+ */
+void bsp_interrupt_handler_default(rtems_vector_number vector)
+{
+ printk( "WARNING: Somebody forgot to register a handler for this interrupt: %x \n", vector );
+}
+
+/**
+ * @brief Forwards the interrupt to bsp_interrupt_handler_dispatch to look for
+ * the right handler.
+ */
+void C_dispatch_isr(int vector)
+{
+ irq_count[vector]++;
+ bsp_interrupt_handler_dispatch(vector);
+}
+
+/**
+ * @brief Initializes interrupts management.
+ *
+ * Called by bsp_start(), does all necessary IRQ initialization.
+ */
+void rtems_irq_mngt_init(void)
+{
+ /*
+ * Init initial Interrupt management config
+ */
+ bsp_interrupt_initialize();
+ printf("bsp_interrupt_initialize successful\n");
+}
diff --git a/c/src/lib/libbsp/i386/virtualpok/irq/irq.h b/c/src/lib/libbsp/i386/virtualpok/irq/irq.h
new file mode 100644
index 0000000..83aa109
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/irq/irq.h
@@ -0,0 +1,79 @@
+/* irq.h
+ *
+ * This include file describe the data structure and the functions implemented
+ * by rtems to write interrupt handlers.
+ *
+ * CopyRight (C) 1998 valette at crf.canon.fr
+ *
+ * This code is heavilly inspired by the public specification of STREAM V2
+ * that can be found at :
+ *
+ * <http://www.chorus.com/Documentation/index.html> by following
+ * the STREAM API Specification Document link.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+/*
+ * The code here is to accomodate some drivers from the i386 shared directory,
+ * for the POK BSP they are useless but removing will break compilation.
+ *
+ * Leaving this to be here is harmless, this code can be thrown when the POK
+ * BSP gets its own architecture directory.
+ */
+#ifndef _IRQ_H_
+#define _IRQ_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Include some preprocessor value also used by assember code
+ */
+
+#include <rtems.h>
+#define BSP_SHARED_HANDLER_SUPPORT 1
+#include <rtems/irq.h>
+#include <rtems/irq-extension.h>
+
+/*-------------------------------------------------------------------------+
+| Constants
++--------------------------------------------------------------------------*/
+
+ /* Base vector for our IRQ handlers. */
+#define BSP_IRQ_LINES_NUMBER 16
+#define BSP_LOWEST_OFFSET 0
+#define BSP_MAX_OFFSET (BSP_IRQ_LINES_NUMBER - 1)
+ /*
+ * Interrupt offset in comparison to BSP_ASM_IRQ_VECTOR_BASE
+ * NB : 1) Interrupt vector number in IDT = offset + BSP_ASM_IRQ_VECTOR_BASE
+ * 2) The same name should be defined on all architecture
+ * so that handler connection can be unchanged.
+ */
+#define BSP_PERIODIC_TIMER 0
+#define BSP_KEYBOARD 1 /* can't be used, as POK doesn't support keyboards */
+#define BSP_UART_COM2_IRQ 3
+#define BSP_UART_COM1_IRQ 4
+#define BSP_UART_COM3_IRQ 5
+#define BSP_UART_COM4_IRQ 6
+#define BSP_RT_TIMER1 8
+#define BSP_RT_TIMER3 10
+#define BSP_SMP_IPI 16
+
+#define BSP_INTERRUPT_VECTOR_MIN BSP_LOWEST_OFFSET
+#define BSP_INTERRUPT_VECTOR_MAX BSP_MAX_OFFSET
+
+/*-------------------------------------------------------------------------+
+| Function Prototypes.
++--------------------------------------------------------------------------*/
+
+void C_dispatch_isr(int vector);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IRQ_H_ */
diff --git a/c/src/lib/libbsp/i386/virtualpok/libpart.a b/c/src/lib/libbsp/i386/virtualpok/libpart.a
new file mode 100644
index 0000000000000000000000000000000000000000..c3bff5ecc5d179716e00ce302d5f88ff08af489e
GIT binary patch
literal 130636
zcmeEv31C&l_5QtYnY^q72ulQN5RgS#62iU)2oMPgCP6`q at sT_r5|Ws_C}_1<Kt;rA
zU8**9Z;Nf+>b}&XplEBWb*)P+R&3qHwc7eC|L>c7=H2^VURd1ipPRh<&73)NX1R0b
z&Ye5=Oy7y&=9*=b(}w58ANeE4jv8HvztMSlBXp4WoR^oMKL#N at j!m;HtH82?L!94$
zEX(3=)N#(Q=mX38Jiq04SeEy9{btMhoIkrX!%F)5VB(5!U4zxsxV$>LtT_^{ZLxs)
z)yFk1rlUYRR;*eUsjqLWu5N9KG*@f46{FQPL?g}3txeJD=El}&T|>ljDJ$w~YwIH`
z!VOmSw90waN7OY(Tf_C$(;FLF8tWs~bq#gVgpg(7=4xgm3Hik4x at g4mWFb!G(n$2g
z#^&WMP2rkI7!s`N>GS5tQY>jc9%7GgjkF-a#DLmJG+eVRfo at 9GQXOdsFRqVt7+hP|
zvfJ<__2HI|g*P at uP&siqa#OCUZ*1u}VU)PKK5{~&K0baOYFw^md_ZJnq^7zh+SpW$
z>($t-uX$}_b<3)jns9x+_SQ8l)`$xUM@=2-Y-wE!uCJzotFa~=ZEUVy5m})t+JdBp
zMjhz1p6YNk+U#6cHYqp8lIBRHosj0Gk!nYd+y0PbOX~`US7bItn(G>Cy{XjT0;4T>
zVzorW(bkrP6wp>`odgm?Bx8wL(wT91CGFZseRvh6M8nO|1o3RXb>aHDlOj&$+|nXe
zBx=f5UCn$pAwJj}8$6;UjTT(UCKM6vdzA%8Lv)FS8m?(tWv$RMEnc9;8tViJ)RlQ+
zxGq|~1Q#QwZk9DXu~Tz8tPaolV@=SpX)!U?QE17q#^Gt~8Gwc*&)Y-hj~IdOF?Jq3
zx-c(qZ2kzGc^sSe{o>M at wr!)MbPn6{TdvQtLfssCp at u<L4=cx-zy6gqJ9ciorvDZ1
z?Ao;^qrU}bcD7}0oY6mfeW3rVpYGbVYu)B(-nJS2Gjb3Q7-IDGGx`U%1^Uyec|d0{
z!}DJCYt(`8_Y{9`2_IpB0Q#U>hyPI0b$X7>0K9SO_Hy`=rkgCEdAs5F=JNwo4*aov
zioabxdFugRVm_IlxO@)WeY#_PPWVJr59Lh-5N8O^7Az&ATw|q<FF-bRI=Dqy*27!S
zK+#5OaKEdpEUu_3DKE>LSyWP5Jmb*3=16qXfZ9XzmekcpCJksgG_M}_22j$h1wqSV
z#o}xaL<Z~+m1Ql~Rccu`ODplc3x}`U2ypp*DK8+3?`WQSOd}<bQVWki5FCQ2zF&dl
z%RQO_p_Ca6 at C9$tzTh8G&_E!F#?45df;$-S=Y}C$El2^2nuW8it^=D-Wu+pjDu95X
zx&(Bkt^;F=`VQzJl?O_ydJ6eWQx_rs=_&$BzPcDZ1*#8X?XcAGfQM|g7_{qrY8aTW
z_o*&O=mwv<6RF?mQ>OuL@~Pv&a<fl8kCbomsU;A2t51Cb;_W`Q3dGxd;IpiM+v;A(
z{Ew}U2Jr*Gx)zCk=vOZRKJu#o!v5t~zd-b71L|HxKhJOZ-au6U%u^9P7zp&7i->A7
zIMUQwFyyFPkgZ(xHmd#rRRni0RSnkO>J2dVQD;Hq5H%Z|1?q8}N2-GnTBuqfVU!vK
z%4pRcvBs!>fIe0o0{S at h4q}a0o#CFKcHlfw{TZ2<q=uvJCaVm at nxe9h;$};|g~<0=
z>R!aYz^|@E#0&lEj|jWSuTDU*e(YC4#J$+BW&<wqtJA=Fsb3urA4)z2K9qbG5_vXY
z`8I(X2-hQll%9c_Yf*&Ip%58}i~*k&x*CMQ61oGSO>{4%I}~~qnFuVSJ0rA(^g6n;
zLl4n?9NjsV&rhc13qVR46wK?4EQaPGBzVvOoUPEg$U?9m$$`*=I0ySPG!%LWSqcuI
zJ3I6=c at Cz#XXs-TE;x{~^FqgxK8WuAR%*a^5u*&g1u6M$l}cFwbwCABZABzo^+SkH
zt!KCz4oW~xg*&K1I4dh{I*M;+H9;B=>X6;`Yow6A5MH};R|xV&vooNRmfeM|pGRhY
zoSp>NPZ6Bui;~64oDJeTAU+_(AW#Q~Vy+B(hLza{YBnl*M~n}VC?=rAY=(zoGVr79
zSY)r5IacN);A0;83ZIU=Qz9R>o5;RUo|QQRMPVlDVvM+AZYGu?n3?!dEEu5-_GH2r
z8fbO;H5eyA4s+^HyTEpeF&4skh3-N0&OG_piTo9mF1(r9nXF=`U|mP at 0*+<Xz6N3r
zPgb`8E57URa7xML#R(#b9G<!(EFIY6J7maWyBNy2L&%^{Bj5rPlkXN7O;#=Ik8lN|
zWSvh|s&)=tU}Dq9wYCRjbxrqY^~&mOcd at g3Ak*C~f7bZ)3F#$W(R%t@>FJXZ4l&|H
zjRgaCdOBHbu&6=c at 12P}clA(1nK3D2)6o%jf*kZH!|W-!j`V at KC0&{1)Sf?{mP<M5
zg|QgEo at fa0hMa8pkgLq~Kd_P6{H|opI_n3v<?DIgH1KsY0jPZ2F45tg`&uPkha<f%
zuFNU9l-e~u0~2-1IYF?aN|;AFx`WZ`aj+&r-7ISsYs#9(Cj2|c$!7SD<7As!iXRw2
z&<AhBtX))^KJ#R5RCJ#YcAr(uNcMlSGI6%y)@@|?vc?sW;Z4ixnpz^mm$o$44994Y
zBP`<ZXme}B^5OM$i|MIrsHtzQjST1W>F||fM_c<I_cKHpUenkd`7H5}>l!OI0I;m+
zs-{TGuw^W at ek_0!btaD&@SvqT1761+8xT9*mS}BVBb>T|gSxW)S$1gU-Igz4tHV_2
zl{N3bzvlhWB;$Xz;}GAB9=;S at gn8w2s*5Ws%F3&&O6C at q&#$sv%8ZhV;^`c)Xj<jM
z%IQU=rPWolD~gL|R9BW37tf0eK;&s0n>&MaJZwap<HAcS4zHe9gb@%$R?jG at ESgqY
z9LM2?&MK~|uB-xc_4M+x89Ij5iV at 1_!s at 8ivaGQ=n#b`9^J?<tMy^EUx#cs8trk3Y
zu*&23B>(e at D@w{|c%F}1l5x#IQA<n8;<G6dDvEUu_2o?#cRK2+%8BXJ at VxR0Z}rm4
zOvlAV!K+H9&(SowF1o&ps;VkH#Nq`dl~t7<Lag+0(!AHIdVX0|NvW>Iv8Y7%GS8e}
zTB^M<8M^jR|K;=M70*Z(R8m$_RefYp#oT0pre53>O3SCuDW7&2a!_;xhQ6`u?i7&C
zX<;%!W#tufi%P9<^U{2t3N()s$14dzg$y5M)i*XQ&C at 5-I2`Wcx$~-=6ij1 at Z;M5!
z at ET03=mZRlsk<s(#93wY^QPw&4jVJ9Ag^FVenEczh;ey?Dk8Ocv%^t`K6LEhyrC;b
z7T^?Z#V~$pqyZ1*HSn^tnp8J>?C89qOZ9(w-q0ltjYAi=*41M+$noImxn}v$rsl?I
zqz3Z`Ao39w)P~wRlxpY_hoNR!q-Ob~mZnHe-IBT*^C&Ej|H;*Xx+JaL%fKp_Ush2(
z3oWU*qIz~w*^JU+r;R14g85EkYZp>JuM&^3aTPajdP%hrYa!Q|g>aj~oRTu9MI}m_
zUpcQBL6L at N^C}O2 at yw$6rEyvl>p`@NdrO3_qVmX!5?rom-HJ$cO&AkhoG<Y5n5)V<
zK?eYCr(rk^#Wd7;<)tOly#eeTtp+qQr<ZWJtIEsg7L_gZG`rS at mb#@4XccUK?5{=^
zK-J=?ZdJJI7E^9hDJ5l9)n)VNPD{8RZVX=25~m`ayy(i{B#LLc%IPQDrEU_Dst_ at T
z8lMI$q`I{Dh~iSGlq?rhk!cxsD$85P at gmC6_KK=X%4RuzvX`->Y?|j%<Bl-BWS;JA
z6O(WfmHT9MU2R<dRatUWu~mx+Q9eB<yV&TE=Hv2FC`R{)D^KLQr--W_Pr5RH=3cJi
z8Rbd4yAr64rxe8{Wk;aXa^sb^@66*e8DCp7=CiWomMgs%D$q$ezLA!dS9RER>JEB(
zd8xOFn8vMDQ1>R)yg}-EF;&YJE|qH<gwYt>4Lqen;xo(VC+Ko~uUcHDJNmsDp+#1P
zS2Wc}T81}AF>N|@DJP+a>kbsXNA1v>Mhy9Cnp%f*K$IU>drZ=FHgSEJQ&+R+&nm9w
z^+3T!#zmB3%_uG{T3C$X3<n#Y^5Lo!c`F at lxNMelof9j@>A9*Q09uKG^YrQC^9JFD
zF?f&n3p|)`XpF-?slu|q7qWY01OjJbbjZ;(e?0Ukx+p8O&NnSH=)b{!06f;PmQ^dF
z;l;pcvxCcwt2t6XEE-uEwT9J(qhV{<;+7U`SaTyi<jx<KAMY)M7g1^>i(8jsrgTXo
zB5HSd@#5yl3C73SRS#phIoz-`LdmhXTK^<260(NXG_F{I4&55ofV<i-RLM}??3_4}
zWz|cX!<fe2+v7km@{s{gk at _ga+53cHo;x`Ih#8gGapnP*wFy2>r!qeI_y{~e{1|lW
z<5dQF4kPan(8#|hz7gP|2)y>v2j$_ZHFhwJKTghg`F6siCo6 at M=`y at RP{>wqjQGFH
z=U6$&!=ns8Z+S<c0v13B%ggjld5?kH#DUXViNJ$A1mmnv;JXxsXI-1a at SO~TaWm{s
z;LD>!4ik1F{NDVXi3^zx8uN$e)mZ+{f!oA^(|Q~7e(WI_=UE8z%DWiyczq}jkK{3V
zm%`0Bye>S}VPg1jPeg|C_cKAm_cR`dhk|Af!*@LhbeqF(lvfBQ?0)#^)(>dF0QklV
z55cr6PVRZKV_o4X2d6{Lb?XebX?t*56Csb!;^r{vdedas6?mjy4Ptk=S>KdLWSU-i
zdC-q#pqazSGk$|!dcb;jm!T8m-(1k|O at V$>YA2T8 at -$=}-)OZ7_i7H~duxh*&hop5
zU$-Q$pDn>X{8lH|1DD at ot-6OF(^cNXkD6ke;=w+KlUZJgtjB|NsB at x!aDt!x085>L
zUuWyRU6T{S=Oy?#4`~j{GsBdGx6j`9ht7*I491+d(eCgi?ggC;Wx(dVt0tRgn3#v8
ze5elUxQ)v)g^0^BgLG6&DgDri^NDDC7n2TU`!)UGznuvFdq at ZWLqy1XLBjtj;crU#
z2lS&+PC&g<-c%svRnZT5)kMgvB^~lM5iuRc7GmR~us&^^cm;{ndtxpTO4moQFA*Kg
z!4f`Fkh)0zV!=|u!v%FeiSUT{>jh5|JVS7!pspA2Un2g?1%D>^E5Vxtb$x;Vx8mO-
z_^{xkf=>zRdIbN=;(uN6UBQn9sgNv}V*LR#1#<*@39`>;_+Y^if at 1_H3+lN#@Rf?c
zQt&9j#e%JZCkvh?c!uCc!Se+#5xiXRXM(>Hyh-qO!QTpQ5qwziQNgDKpBH>d at SlQj
z3BE7L7f38WJ7{8xV3uGvLEdi}&i4w$A%gjWd_hS16v3H-WrAVB6 at q+YMgDby=L!B)
z at Rx$W6?|CmDZ!Tn-xB;pkhANQn<Lm)aF}4B;CR8Qf-?n61uF#?5g|J)STFRoM0CUJ
zg?^dfjYKHtT}0?FU-K~jUx?7}SH%A>BKT}{isZ{Ag6|-~LL$N^OZXh2FCs$DapM0T
z5qzf;A?JLd|Bi at y*eduK5%Hc9|4zZqh(o at Kf)HidxZSYNWqvByK7e^_BEWD>wC)7V
zBbfL6dwR!Tm|q}k2KM}pf1cdd3Xzs&4Z`z4XTIadTm4t#U-0WU%KG%i2YY0&tY=UL
z6c<OpE at XLfak>H*fX6fkP`H#UQ9fTFrCvjj at 78>wl=%c-umo(rP_Pn!x5#|*2j_nf
z7QpLacG|(A6d3Hy>l*Zf;0yBgs6RLz=U{LS=qkv&MM{u;ZYY=uN^0;uoYR77;7Jd%
zP38yJAhaM at 2+9sCNHuxL4u(Oy&KKMWhU<O7{_x%43qFpp8+}1)$W6Xr6Non>3 at P8@
z3;qXit1tK<h`0NK?*nf0;R^HhaPUWn at E<$K9`yr%@My^V&>uVj at R2{*3t|8A2eVLJ
z&jy0mf(5UK)k~oIXD)&-B at og*b=n*xz at smIcH3I`QuWKiOx8sj22s}CbQ}oB{cxbX
zY;ZjotuMUO at Uz><;zT<@N1FiZ6QHF{g+oV6XTRmk%)p(`3XCHY!!xb)M at a9K^!1hd
z#>%|B!hJH}ePb0gZ>*H}Rac7hiYgTUhA8e8RjT_=3c19KCyQ^SaP5X!?rW`yxc6qb
zLQ1+iFPSoXq73>u7PX1PX_0iXGR(0Z4xe=k&R at Wrq0jP`M!(&0)x3roYiV7Kx!9$6
zK;`=y9OiuuE<)@TjV_hEh)KiSxqyv#-#9Nk$>Z+eHH$k|tM<&^I<pq>FJ5F8$eDm}
z-+gp6*}c2B42~#g>LWJkDDpdgqYxWkx|3S5cLq*mGqvQMmUo%mSt^Iy%N6TfYdn)L
z&V2nhb<TY^%Q|C0o+X%WJ;dg|rN$GdwoNT2pM7 at a>}lTFI|=Q^a_1QnuDtWAOuti$
zn+#3zBE>UB>k8KMuWZiF<f<Fs%%QcPWpz1XbE;A!dpmb3?0YjY>ad!sO}GTHS<EkI
zlF~^#HU}Ad0COwAy(s!B?9=2ShBo?0oI7NvYvvC7lEcg$!pSh+i%Cxm+xI!e*vwzD
zSwnYT at T;FHw0ILnPaQW`=)LEdJ5l0X;Z8i{=OG?%zKl;k+)Awh;>VCdA1eh77<q|v
zg&py6yhr)wARnJ!%we1(K#(D#4$8)&6wWI$e;nMH{7r at 1#DUYQ#I1?Xo8~ZK6(ATl
z!vZK!9vyO+u*5mVk1>71 at iEh7eVBA3aGN-ATKyq!2OV;lurU1Ia)cm^awv~8IY!>`
za5E0e%_D?>fee&`Vf=kh(C`h1u%W_3FnsI8ZGyhbL_G)jc<5($puVF6$v2Mya+oY!
z2*0-+TziXuT at KDLnR0Z7+q4xptzSdl)pW>V(j}TS8PtU5k~|PGz>3XfQa;o4$~zbB
zv>G&X7<tBT&`bZ~=j;;a=;AB4{Tv+%=Q;cq8nfqUKS!6T=X%J}7eCIyajwT4te3&Y
z1EinBY4RHW8E~6};oebRY*>@*uHAlk7VEuZ?06)?sL=aahn{Qop;+u!Fjlw55YZSW
zieEo#;>4QZvozZYk>w&Lox?)44wCTUf};f|39_7wKSyw(;1a=l!Dd1BH{?H6aIN53
zg69feB-kc+mEb19>jm}b9rErL|NVjw3qB_JjNprcuL!;=$j3J3>)(Pl8ZiAK!A^qR
z1^Wo{8IXL32o?yA6D$%e6I?)q;(b at JS@2}RbwtSfq4 at RO75J|e|8E5E5k5UP1^y?+
zudg#YXtp_~bDv-ykaG&UJpjFr8T^c3Pjd?eBgYiv>0{4x3m;2|!F$b~=N2B`(($yy
z!&@34fqfg!wx0i71?NCba9?it*lTen#TkFtZETf(J{Z at K<{QGw$?6T~Sp4iZQvGbn
z$KhuM4rH*>sn}Q_m}Hfv`-C|#H|`<T?>?6X5}!+xK7TR;=HR@%Pp^4w_xu at meRLsk
z+r?#rqJ~Nr7T|}AY1>J at Gl_K)o+p7Xevs*HJ~iLiMM|D3h*e9HzH?t*oOd+#W#i(H
zhek8 at U7+8ZYuZE!OBVjWJ_h!-dq<z0dlkB_*s&J(8}?fqn?WUGW10ctmu|)4J;i$%
zd5L4-j`$MCz~tlo$sA0Z#|Zqq`MUu5I}<eK4_$05e^cQ$ap1Igk2#DEIZRju{Kn0o
zLGa|!A%_VogWsEOZ+J|-APcc{BXFBI6fql~X>`b8!ou)-<sAwS<**#P8v~yO0elx@
z4m$b!o*?Uo$D`<&_GS$HsqVm>I6NECiDO{$EpXYS|Hqdopn1zt=&6_8je)DsaIW^q
zGwBk&S?Y;9NH&Oj8UqhP<$X7aJP%1bO*-^^8^^$`Qy%QEI0o*gea?yPaTtCKGvOsp
zkUld!;U*UAf<4``#~BN5-$N(4&EYk!#qn+d5s7`)@$JEg&+*owL^KArX(Gq-#9|58
z<6HR4g?^M^t%NTZOdNmZ3tt|P<FBcLOPv+ at u`f9HH2xYB`y6!7<1dbhd6 at B68du}&
z%S~=~H=}k7yqqOl&JwJS)?GRI*_$(;U#K^%M;=ZY95>IVukQ;t`OH0`BR&ol+1Krf
zPhWrVnIlo2(Pce=1QXi{5Ar4J`-(s}amW|u$#a;n#OHPL9iD`b{AfP0V+K5{;bVVj
z?g`X6`b}Bkw6=neeY`nLy2fwNOW$)}<;@Ax^QK6 at xk`?7ywx(vXw++PL;-3nZL+|;
z;=~iio-`qU#AvK_=dou^IFro at hjTRt;VHQ*-*O&NiT9kF<KJ_x- at ayZU_;N-{`1IR
z-`>^wK0PDW7djs{Z!6x;60dLFv90)3%G*}_rUN at 2_<*pnc)NUw+Xp`V%Cw!((E6?6
zEgKenyrK2e^=~ecC!d}1Ik|(vIts&Q*1JsDU*h9!C=MllZEc>d5;*ZeHm{iXV`1kR
zY<D at iBR(~$6DC@`m({{K2Aw886z_^WaPGm$155QrP#4@}`ST~o=RYm}ixbJ_^aYFL
z&C?ahhWYFGir%m&w5^z5zFO-SJ+iI%F*wlvo^;?Z4!l6vSp1M&|5!Fn!(FtOS16X5
zHCtyKZJJr~E3vJ3hm-c+C`2qnyT25W$$n_>lq{B4BXf6+HzDke|2pkGK`&elV)rgr
zWk8EHn-*5`@bV-NW=!g9`=(jb8(ZsZ8wN)4CB0*WBX1eLm#L35r&)db_RTA5$ipj`
z@`}91nwr+;NbUH%0d;BCk?01Uo)KToK>_XQAXKvV#xX+rOrNc~gN!8-Z{ZokzX&H^
z4?R;5NLfNpAUK}kp_G~QVQB&)W3|LhXd&`3JyuJ61Qvcw&m|>lE at wv6M4WBKwLd=f
z4+Q(wPzVUBb3j*$YoAioFTfa5Ay87)gUDE#x(3-wS4V-8uiC&<pn4(}KBjL0;A8qF
zpy6ZssbI#(^z8WXG5yUDkB{j$0`M_CmucZ+`rjdCd`y1?1ma`*3Gm@#`V#@}$Mi2k
zCO)QL2qHeFzYK}ulkz(O_ at sOn;^AX at j`{I1Jr^uswS at l#7G!24lI6$rlMzwf3dS^b
zCKz(m&ycNL^&;x}0JQ=!d#R(r+FS97rH?ur$qi9lWmce`#(AXTXsu91AYqis2W7O%
zhJ-QdKcJ6Q{0w at W;>~QlN`ZTV`UB1r)%~DMQs+SaWYrC^rYNqI+H9$=AmL+rY9~IX
zzYodbWBT7BH~5%-If{jk>3ab1F?|(8;A8qzz=@CPPk|35=QAWqJ_(87V|xEppa#N=
zkN`iXzZ6M?20~;YG7@}N=nN17OXv=S&ZZmR9e^C#i4p{s(VY?c1?hEkXNP`G_i=RR
zSpK(>jll8}kW$}3a&{ib*4g;kZQYRHG%k^`^Vke|r0bPbc?|KL7s%k+NV_nMfLFnm
zX=Ukzk=y at +x04UccTPZp^$5=ekpz1#&H>+f3osEK=)!*AK9=#B;wJjqx;#svbpwR3
zRTESB<Yl+e^R^~@A35k+0}>s+^Q>&%mT`%6B3z!PT><}jyl6QAO6$g_Ub~d3QHGw+
zZMzw)*_`4nf`b_h`gLTh%hjl1`xJ7MQ_t?Ub$b}s)jpj>60XG0ZX1SbOV`z;1CW{S
zdXdhVR6)KK%vu8nD<Bt~x)MrEC1i7!*Uh%`t|3(~b332XKfup!<9GB<3g?F*kHvit
z0kJwg%!sp6dm$P7az>lQ3)iN#_@{_(Uv8onBOn%ajvI9@%k~RKV+*s}{>D^w)L)pW
z7ki_Yx=}ym)wzk$4nghNZKF_kPSl$uYSx<)l@>V=(Xu7wsaEy?#EE6dBXu>ieK#fY
zBHL|?5jFc1FS952kD(pgTgmu at X8s|W|LkRUC3ow>0{)&^Bl9~t!tJp<>i|@;)#FB1
z$+HaSB(dF=`k at VYnI87qc3TM5ojwII?Uzj*u{pR`l(!SslhY7A3c~_tT0IX#P6AQ3
z6q+i?Wj~fn7uqbVv*&F{JD5w^<qYR36Jhg#2Mho;>7=!1ZI*ZG)#o!U(BVvYTF|v9
zfHl)FpkNFeXafUoytp-5S;n9M*LipHSQ^MS0q7x|wPIbo^XndS2Iv8hma$&Y6Ln at x
z3v_c6ZD#<XySuuKOT2q{g~w+2QS<R4oYiHyjtPSU#ApHQpHq)M>pYET at _JZDkj#T>
z|0DchvfxsHUVQAn;^im?R~QExj2vbtKriphK1;8pOtfAwY}j!9|5;X^eXGnEI8TV^
z=3P4ms4}xI4yxhWF+e36V+Bx0D2=XLf1VvW&fh6CajkD$jz253z~Ae#Q0d8`xhIF_
zgogW%92T1MTmR4~NppM?yO!R4B3`l3<xfKpuuz{zht~MUb;bV*cqerorOySSx&Dl(
zKP|MxrZD|l#$9G(Y#Vsyx!l0`)pm(r_a!%Tz}SW}{;S7*w`<_$L_RW%Gujtt2+&>q
z=gok-h$v?Hz#A-IIwtu9JoXLbo{bzN5%|rtZxClFFwvf0TwsZLecw{;+6g>Ce|_&+
zi>OyRCVVmDUNN(-%)6w~4Rsbi;?vWwz<xoJ3xsc4zrm&p;;#jaPl}C6G2rJdkK4fa
z&6a`leW_QHw0PFcXSHbHUf$SZLemo%>0-+uzJzXTa|~KKb}3zH9!m#Co@>w`SsA=0
z4BW|j*Pf^=+O*Q-3rjmPYali--F3!st3$sS>jrUMT|4`v-crZ60Wn(OEU at fo0joE<
zTpGmFhCVvFG-Aj!w)EB9+=rW+pI2slmOiVU1M}&9GOGsO)T9LMj2V!}sR!f-->mP|
zdRx=N;)}p`BGw*Usb7;p1E)x)<!V*y=%P6`VA)5Tx)d`8)2m^5wkaH~Syo-w(t&js
zST%@igwttW*RiAP*1?y&PS{+Hy)|agKEv7`u(ol~Q6)Jxc9S%y-B>^nQ%zdGI+AN_
z`+6nEkBGz$gqI<{qco-y;*#jlMz7aS at xHxI>(JUle+*Ii1i*uHAF&nFRj2#c1bi(I
zZpjQ3J&+Y3&kW(w{7F`q)FONnejSCcMc7vShTs=VXNkKy<r<JVBQnSvUh9T4F6Tfx
zlD`At1qkP4Tui=ixfZ}U0fccfqcSeMJQmKCbeys1D0~LOI4zMZJP$H!5zdEYJh8j!
zSFZ8<R&6O_BFqD41v!&Y<>m3si{)Vx!Z~@+QTRg$=UhRuI>3{sULnnS0z6T=d4N-w
zA9>@HL9+Va-3!;fvZ}G$1 at ZER_UksIfqF=`I^O%Vi|Ww_-xpxgC3fsQ$ocv^2NYZa
z{j7}1rgp32YmESjX}pOmgF52lJPqY at RRIt3aTeAb4C8OQprKz6zN0x`BL{hSOu^4v
zjx+ng;sG8^Sq`!@e=LVyRRA<cYC2Zg7$G1U=OT}ryz4SB^Gt^vhOZue<7UwP;LD>!
z4imNvesBJELiw{nWB$_cGx_^I+$Ij3*54uTRu92APezzmo;BDhALSuROx^~#8He at F
z<HuOZ at pn%|hVgfipy68uB}?|U{c_<0=;P;9M$cjLcQa^oLlyP034D3R0}9K_;|BaZ
z*|9<>$7;}6j?Va*dZ8QY9y=bwJICL~d~Th2(`4|+-*M9AOm8RrD3A5dG`;eA_QhAk
zCi4jMIN@^-FMZE%@4YE7JyU8&-kvRFu*JH^o-JhX%DYGV)%Ps9d$hNZ(J6K<&ITJ-
zBK2|Eb-f*$;GY0LdD-uhe?D-N$6pWkR{Yo(Gkh)39Lx>dr at 0q0obAxu`{=&~esiy*
z|BvvSdmH_)z;Etl^z+_l?p^frUT5xA^iPA|+?VL5B?@yNqW={5&3%V{P9mE74E=Y&
zZ|*Jh%c6>!q}x3t3{DfK7~+R`pJOu!d7Sple8q`w_skVH2=k7$+6DZ7x+etM)NuT`
z+Kv4-zwUS$NJ|8-(vQwW;nLHe4)me3I+A{LFyE&i{9Mt=aDH7t{<no*gg%hr7YOn_
z9{qjMRS;JR(hxZP1JGqq&JdtZm-)b}mkc8AU0~73{*8XF{NQRj>MgM^5jU7Y63%jw
zuTZc^aJFE%ASczyw at 7fg;7Y+$1*y;EJ4^6fL47{~y-oaA32qX+UXc3D_;(3z7JN{U
z`p)nt1)mrEyWnerI|ctG_+P;w>Yed31iK0zAlO%Mkl=8^(Snl%IVPqYe(F!G6y#fZ
z`s)Ro1y>55D!5iqw+rx}EB=cF`Np4et`g+<nEvYpZxOspaI at fpg0vh!{>KIXBKV@<
z4#C$2-xd5=aF?J$o1vUc!5l%FP$2yv!NGzf1jh(!ODW*15dSfP#|fSw_yfUn1b-s<
zb3wi{XZyWT at NS_$Knz*d at 5TQY!PkiR{a3Ij^hf8H2-?Adv}Zy381YXKoF??y;@1{a
z5U)o3#}lE4rwiY?Lcc)pa>46};Jby0bnX at U{elk*UB5Ji{AYyzccK5Ai1O_c`T^8`
z at C}lFU^o$SM+tqL;0&Qxh+kV$0bi5&qk`WTzK!DlnfQMt{u>1E68b~p-!A at ti2rrL
z4~6bWnVHY;2#zKqeQkjS^r=FhBUmHhb>d$kxKi+33BOeQmkC}g^g9H(D+JTMU+`g}
zKPvtw1i9da`FT_P|0d#>iiZQz4-n*vANm1U!{dw<DZhyN0n7uPtBcuR5|;^{DY!}S
zA;DJ#Lx at j)_A@%Z;4;Cp1%E9_eJ0<Vg52SNe!fl|Rv%l;yyrEXqehL}+clioGT`UE
z0Xf~>8qQ9)w_>f_c4Wxvbo+yQy)Kcj^Yvn{^;_0$Ue%-1?H{d=_HVbAa{XW8)@>$R
zL)tF=PPZ3ltS^3b56eYA+Fkk_!aA9YPag{flP}EMmlc^@X(h|t&c%v2u0BjyDF<mA
z7G?Z#$ol)&KZX^794ulZs_}Vv`wCmp+(V{`Hqi&HOw;CExj9wRK<C+sS1{3PK!4C!
zNFJ+sGILwb9N1Db2S&ab_^p;-M|?R5=aHBW)6nUlwv){vbrdg8;#DEu0Jvl6Vs2@!
zGqtpjtLyh^DgKwn%(|eaxKF)sqKxKn!hL~QxT!Z`aKi84!ZA&W)sKY#7xxM$Bw%wP
znEfPJ>r4WIzCH+v?IgsdJ-+VxGy+n5|3Z9UkGXJSYY%>M<-3!op4FNXyb&I3DzqJ3
z*i`625<|hOA<*4aXc;<7u7j*cdg at YkpK3kMwpzn<)dINv>Q4|5RL{e$)U#krQMZCI
zq)q}QRecZHPE!lPldgUNO1|0(o&t3zC|CyxPOgJI3N);PoDF8IgFFO8tb@!$DAqx;
zSI0WYpMnMJAh}Qz>mYf{#5%|U at L?Tf9RTYfIZno=LY0Vsb&zvF#5zcB7=+b;3Zk(Z
z at CwAkI>=k$!#YR~oUjhkR|X#c%=L)Qb&%W?NAX^prfvj7jyf9Lxq9W{0qRA#d#O6G
z_Ez_Sv5z_s$qi9c!C9dGi}OgmjZdMXJ+x7304Sr?2*etr-a)Lfilc#Xsui)utL<=4
zP^-Z?Q57N+lhiJ7PFAUiHAU@!{LPlS03 at t~d<?O%4w5%vtb=SrOss>v1Cg)}as!B1
z2YDX=>mWCP6YC&fhYuxR03S-;9f>@PO@%rkMj(7565u+>TaZME<AFeA8u+Xb&3FZt
z&>aY!O7~K_L!loc6M<!PXM`>xy^ike&}DQVM>jSV>O-dGH6UTDpT7Z8X;RGY!S=&r
zHGXy*cjihPj%?UH#(;oDV(EIVUv3qAJTi{NX*0NT at yo<IH-FlPHc&5l%!(qA^~L~a
zk)jT2AtA)Il2&RaN^bXKs;l9pTH0-t=cL+CQce34vTOGn01m9fbn-BOc^Hge#xpoE
z4tEe at QvS4$+&p}MKsOK6<-|O6;$p@?lzDg#60+H-vgyK-O;&oR3*ipta?0-`hV#?~
zVV?rKa<Q-V8 at K}2$8ZJg{usT$fHWSxQsIY8KB}-eVWIQdOjP$+oP6C`6#qeV>b=CU
zlKBvN0>S4Ap_FujFUU2mSo8cK9wFT|&%eebB6a-;NLK%Z$5Kz at Y^$Gx&8OPn_Nz~j
zg`gVL34tmD^c3|pWQEi=gr=&8K~Gbsf+t;l07}047qVNRc7Ot1?+aGw`bN;8>lcC<
zx?Tz*biEGj(Dl&(==x(|fv*1*DL~h&5FNTc4?gJn*#PMJc*KLQx1vPQ^#%~3>ti7k
zExr<f7XJstgRb+5AG+QLEL`*aBP8LU*@E&>*QcST)epg#rd~#(IcgK)=BmG=z7J5n
z5VMy$3n}$hZy|agRfOb*s1{wSd{9QJV-Z at YY9L{hS^)ZJbqXYmQ3t_2RvifXIQ3)1
z8n1$IPf$O at d7@g0OiWS}A%C)(2+k>rTMliu)JupAUH><vLf01{B6R&eghAJX2!pQQ
z1|oEwCU2nYv`_+F&xJsgd=-2s`2-{aUH2~lH4qNtic;69s-gE0WHu0MLkY|VVpq~F
z8;HGtgv<tF_mD0dh}}oGY#`=8j!etvLT1W{VDBMltf`B!O=a*qhoWk&)LK{|4<1Oj
zFLg<4gB8r9I}myjGJ<{SR-u0)x50zx4u$STR)hWMP77U!q6PcYosqgY+>8y!C_X!M
z59%R!FtvA3Xa{))a>4PTRvJm;;Y{Z#hz6gMi%QK1_~%gSplgxI%)xNl-PpQ~{@86l
z1bY^9YIma(JyEB_!9dl_)+)cy2Q(|Kr-R(3nspGRm>b~j%J$QhE~qZ+*V=_sz}kuM
zfIYS=(puWxvhKu;4sY<Q at Z-ZjwDu}Y?)VSE$>(%}fs{ge0>PbxP)ZKL7wnFhP}P^Q
z?Ale;pFt#5mGc(r8F(!9AkMbh0ybzC+-UX?5L7*TAW#hkJw*i}E2M5mXsWss^fa|G
zhpM^*lzf!~o&xn2C{WcRM24#V5;35v>%a_EJsHgvs=5H|P}KqeRP`;eKvmyGY^Z7t
zqC-_zzz0>m764VPLp-SJ`H%@!-2fs~br58t!A=LD!9Iz2P}NW2gQ|`P3srRklJL)5
zhVoHWIUAua17n&(PYG4M7~Hw)T~zV`svBNK^ip>srQV8*Vf(0~klYY;F0xmk%D_KT
z{Scvrsu>bSsaDWOs}+ziMoocxtQrRTICU#xjaNBvPf)kuJW(BwOiWUvA%C)32+k?$
zK*-;0spk<Hs+tEHRP_WzgsMJ<FsSN>hy+#r1Bg)7PXJKW=aD{C^&o_y<eT6_$qz#!
zRMlCa2EuGtRMqoQ*3hR23Ph*|R_IQYAh3k)K<Hk&m(m>yJ%UUGmT6T9Jxh8W-PxfR
z={}Bbe4cO=nU=GurhX4}yBiyhX^(arKNwFt2HCN at v5uhyX~!eSb~gsZ?u^<Xrd^To
zX9%-<QZj?;YArk0 at j%A{%y-h&)ZQi3es^j07q^<)v!t2V- at Bd~myR2 at nKjPHe}-8e
zP1a1$y6M=0YTTfctzE{3eB5<Suc at Y^3uIeeWhHYm(<g3G{oX40eC5V|by67aSC?kC
zl1n#R$z?c8zBA)X5L=hcLTAM<`u6Tj=cx|2objTZh1^&;&N at hXy}y)l$7dq0JiEEx
zxI`Ja{IX9Vm(ypOCGOT6Y{u3DEJR1^!-sdchh1!uSptXEQGl}_U5BC0u5)#boDygm
zR)b9K&Bk+P!8XS5=qIUvmcNG`y4*Lp`<zhSZ;iu;UDEBl5$Ln7#QCc$E;rlW>%x#%
zZ?mV1f?mqs4eP>v6T4xW%(idS*>C%5vu{?%@9p(q&e^vz=g0a}FY^VFb9YIayK*nV
zoTpjq?y`R47Px;4ma*@RttQ!%GWHRNTjSrTt^E?-EX&-XXNkL6Wcl?kV%KYPlPwhd
zMz3W50#~eeQ1&l>t-9NGKi4{RSBz;?`?ltMpB9_5C3B`*@3facI$__k&$x%)m$Ydf
z7U=7}0KFI3?ZWw4!<VssoFf3O=w^lS7rKbtS)%>TSs%{!kgx*WTis^S at m_9Z_a*Hr
z=Ur2MLb$#)Vz~n~Z*D*18fsSo-PZN(8z5jRrLHD|XTrT6DeT2ozuwxFwy-zb`zDE&
z{L8m*<B-8^E??hwZYM+<YO!Z at t!G5CHyidQxh~)A58lGHwejDexEi`|pS5*R@^8%`
z!FiB#o8DJ2RN&WYU-<~3uCZEgk{Ndgj=$(EdgA`Nb@&!i%-HNE<{pL%sAKHM;26d6
zD3)gfhn8ycI6ZCL9<X2DhiEKWY?EFYJ(yi}_YWpM!xpvP!GyP0_>6-GGkA*Yi}%kb
zcx%=jK*u%=P8eJ79~?}J+Yo#INAPtGOY?><(OVx6tyvbSSw5+yDN<9nq|Vv%$h4pM
zJ3|t44b<xSWl5h)jEvYb&R6k$yL$)!_RJZ$d3LKi_IzY&(KB_xFNt?^7ycaIp?iB3
zH!mCsCL0uV%)N(!fLmbCz2Ez!oa}b*&Q*KUb^E^gbBpzm;j7#6$y}QFnwl}cqNu8*
zyv#GgDgKO`LV2r1J|9m~_R24M@<1om?#Uqbc-rCS^k49ue<9w5wD5h1HIJ}LJ1YsR
zwR0ZM`gj)S_wfTG;S=qwBycqZsC4OLuXd<U+?F06(8l(K_ikU`kws(A?(<1 at ncDrf
zRPDB_cR$cIW!MWm5IiWkg=J{^D8!k|Gt8l1r at _+;KddE*9m@)^SO7k}o7eHlhh;2!
zZ7ZWASRdEHGfvzDhVjR^ME#-;_$oXv0L@|2Wq!QrUID>*pfO$Ym~^MXO?g~`!h;rz
zy@!!E8${-FPkeL1LwO_c<3V}1I8J?L7=K3yY9dZ6jbI^=hsSaF88`jpJC+VPOxP0m
zz2)7E at -h!BFP7ZI%6kgjCJvl>x7xeOAcqNC1;1C`PRQF10_A1kXX<Y~+$Ij3*7;Z_
z^eaytny{ZF at J+_Dk7Y^tehfZux{pnCc5h?4STPk#_ZK41)br1~!fHR>O`C)1^7k7-
zL;vp~_zuT-JYmRA?AkJT9u{T%mJT^gIf$NYTdR=)ez$}LAF;NT4L8f+y`<TwKVEZl
z7<tB at 4E=F6OL<<2^qbb{#BOit8VfW%hhMi~m+<+&o#hpAkM`fr>aRg#4E#2jI%E#|
zyBH6Ue$OS;eot^x|3MxG*85=m%vx}!&i;bOYW(P*DsJO1fuGe}3DCLKACutI)z~ru
zXWGUc8pvxe-Z(wG$<vEZ6Jnns at U^`=6XD3`lCtGY4h^UY$ZsT{AcD at 76r}GI`ds9R
z^gR0EX8%JxQ*g5&`(N%Lz_Qy2KUn-D#6MH~^Te<Dq3_gT?gq_vPh|Tg<_e$wRuc01
z(w{DJ5k6A*bUzILbn$EX at Xr_jV!=AWCczU0*9rbe at M6Ks1g{bNrQnT%T*JV8-XnOw
z;6s9c5`0qdIl=9M{}g;%@I%2*1^p;9<);aD7VIf_py0uRLj?;3CkXPJYRV}QoF}Ni
zi3R-_ at kaz#2(A`9UGQwd9|>M8c$wfeg1;2xihHJeo8Ucy_X|EG_$R?91)me#F8B|@
zHwE7l)Za!zK3D29odDV_F<nqwHHAM{{CR={1&0Za5}YWg7rG-JZIM#m;ez}|i2i!P
zm4a&p&lPMF+$4Cb;QfNz1piD#-k%cOF7%IySQD$i6+!p`=xWI~h={OBMC4<Z(B}vq
zA at o|o?-3#AGzr&cbRp;0^h3^l!uOIOcY5Tv$XP_l?<&|suon^W4;1W2ggy?DaQ*Eg
z;*A&oEWt9t`GVgStPwn3 at KnLIf@cYyD|nG$o8VP~n*?clg!#TjP=6x{|7P(&DENrr
z6N1kPz9jgn;5&jJ3I3m8An2q6%dR at TE`qRzs{MI_v`NkU3=^akVEWCj_tV9HnBd`p
z3kB;1n+5f^mxzC=_}2=aC8)p2MEFJGZxg&qaFgKmg0~3XCAeAeLBU4^9~b<Kp#D}9
z>Ff~y>w-H4|0Vce!5}(%mODeRtDyd-6ZF2~A0(*1Cjou5_$LV#3-Vhf%BvM at 68xUv
znSvJxUMct&!5xA-1wR$c;Ws3Zn<qF$aHinlg8YVvdQdI6Qt)C4zn2I-+A98s1^+1c
zXCmT1CHO26dbC}_UlDvy at Do7}nV7#6!7Rbvf`bLQ6D#>f2~H3!5}YMCSCEGH$-hvr
zS}-EGT=00o69rEdTqk(8;Q4}=3SKF=N$>{2+XR0rxK;2Ef{zPo1L(-#cJcFD1LpT_
zL2Ydt{!hgpz!-$#Jp}s*_7fZ|I9za)-~_=U!C8XZ5IE#jihrSCwO~YWx#01FCkmb-
zxJGcj;12~a6#R+cRf5+FYOC8w|90`;EBJumBZ5x|J}3B+;H!c=1^sB7te;MTy#xme
zjuf0CSSom=V3>&Z8xd?0`l*7K2tLkn4EXrDAMr at u*MQ;Xx`vw3qehzVr1!YbO=01f
zJbmnWpPMMs;8Cd0gYdiw<@wUS9NjND9L*~nHfC7C(6NKRG4;HgX|HyBc6B(b<=M<j
zH>JHeaefKSJ8mAz8x6w;ee}hdd>D4=!)dGH0T{l4aHC7xBj2Imp}Z0J at u0kSNRWe0
z{zeH3+3F{{V*Dmb at m}&J&Qnm{;YOH82IYE_3ZQ@^Kty+>cNk=Ov+<+f)CrtcA;u3a
zbjV at yXZ*>q{XB&?Wy<%aK)<PNM_MwQU*2>%FMwNh>_|3mz;<8`h7U3xApLx9H3$8Z
zjR#2oVF`ZkTn)pINeEw(;P-g7Jgcd>u_n^O?+~JOD<Xi!txJ|fn(3$y*DPP$7;dhG
z=lIr0YXon~;A{!6Xu{;Ic1Bi&o0c^;GhS1;Ia(L3Yixj9+dUv+ at lX_~d-c|6T|LuD
zt6_wFu!AvjTw(s++QGP38incOWiPWMwIPZ`s||}nYbNOmX+81|;$1i5f^XB5ZBzBN
z-!_#>X06$rG48R}SGJ+iIqKrL=-U?59NML$OeKvWY#JNzh=u5%Ebes1O>nGxxYJtB
z5Zu8yG at E3t8EbV~cN!cUnm!%(V)IGkUTi&ZW1!-`?Y?cR$)ts>hQr#pmS^jYl^cuf
ztLaK)+n7;u-%Gx2r<we0xP$o_{I~V|2H#qLG0%R^Us&re;d#Sqo{iYPYwovM%-?rf
zw+#D?>H2sh!vSZ{v7?WvHk(}~R%CH#&Brw-4%#?ls()jELq6-ytw?S|_WF4rY?$}y
z`guDy%=>u#yf>M^L#?l_8OoGxEzP+yTjO{0x{~3rOtR)<yVF`0cHQPqYdJNmEADQF
zZkQk1SXgo2KYSAwg`&|lW9?|;hI4elypK1m{B->(+wEt at ebRd9#=y}V=7u)rlx)bk
zP}jix?dx;a=^Dv!_N`mr+rc*`ZMc_o`;&3MZ#{_e0~P*Lwy&S)a0^$AyVII2tgs1-
zc63^|5;eAF>!GHGbYt5dUnFc$_N6yAcH-8$kD?X2{^ZJz+tQl<Mwbm~8_#ARYOT3H
zW8AZ?gJmDNjX6`d1uir#W_>_vqVruC0$Tdwui0#m+u6E#&DQLrk6E;Z_D^8`<kk4H
zY2zrG`{6B1&J~{B*<IPNHwIrY6K%|{ED at RQ+Z{H^o3vz`HN=Wn*lkl;01$ca0OUB(
z(}CUu)3m8!rd=n`^FD3jHWuQ<Sd3Fw$z?kBXZETdCb$w!J$!DNMPGtUya6#K-<y2y
z-Trm#pQSqWdkc8m*{tChM_*E4DKDq7jWhoY|LK7>LH`JQOVNWx+q8jW;Vl*3GGL6~
zcbK+uJP4$E{4Ry8C%xe!&v%C_u0O&r#;*ZGiNAVz9lJbR$Vs8P0V2F3dpopQ*4G<<
zk<LnoWoCK#YeKvVZ#-X_j<~1vwj$oKaq+&pSMmCzhpdW==h%hbQ+g{A at 3Z8S^KqXg
z9_QIUOS~xJRmPRivAw<jY3`f&G`IiZ{Tuj*z5k- at zbN_nBgW+os)*F)&Hn$Y-{39T
znN+}iOAfw*GY4;zK8uD^-Ef9UJa9Vn*l<81I^pNU!eh7nxbQ<UpXtPp-QMHE3-AQs
zgvV~<apC<iXm-M5x9hm at yJ-tZQ)0K}xbS~=G2yY>Z(KMHq&V?ow^<24D^?>gr-NY^
zUwK%MOQ5MhA18)lX7H9H)HfdS93xn;eV2h?e;~+Lv at m#=OP?>umzgklM~ii?!MlZw
zOX+ at XBrKR=Py7{p3N}M5d$OKFP#ophQ|JyTu4u5QM&J%vzG}p at i%x|nMO)OL-vyyO
zIQGPztT=~e!)wo%xd<zD8odj~;Cu*vseDGT7t+h=o3vp#os3`lA91peBpolr0-1Vk
z!)27pk*M7^3+F5?>N4`sj8Sw&lVx8)-%3Wx%wyheBs&MBcH19fQErqdsm!?j8~V=1
zFZ)37<$#OEt~=8h5_f^k=4)^!$Jh3x`cRZ?8i69~ogQMB`NC<qtjtnS?7uO6{qni3
zFI-)lqRk+(ZdlPyg}ls6JdIxtEeOAgUl078T6l?JR=0e#c;>^>HqQ#k!qcuPv~~Cx
z0($C&7BiTJV<fIS<sSuaE*WdAp8Ab{G2hoa3_bseX!cCX7s5I??OD9K4#8 at GGoa0a
z2khR+f&DmQ^9?>%QNXB^A2k2F at Y_9xgB5nD*1!X!PX8u^Ql2CDg0v$HqfV{xxkjBf
z!x!w%kgomR6wlHr{siI!_H3w#U4+wL!NrbX1%BE#xi2LXWF$w+#7J&CeW4V-V at Gm%
z+7}F91Pd*|7ggl^12_Y3Bg8(i9BCMFcH3$uz67CkSn4&h^dSrSkV_c}GMO9wLh&VZ
z49_5d-43lG-^F@>u}N1OH{!jHk1va2+Snf+<l}kL_;%Qrdo-j&F#`<n1z%!5L%|=g
z&vLShOL}EGas`uDVI-iQfX7nz<7}(NOiY~zw_m-7ZY-#BkSC=!<Na)knuck%kh&S6
zscI+aX{r%C>1sPD`RZ5TDNug}1tza(&J8B7T0w)!tFyrjlUIY07nr=74|bTm>H~nu
ztF>T($*XgbGE81gL3EhB%770huV}#%Ca-!R9!y^G<rYj{4FM4*ulhqK3_nc)!0^*n
z#DmGJ!N?&@Ui}#|X^HX-B;lV)Riw!)DwbLe#x(U~FyyGsh?}dnVP56{bvfL<^e)`J
z)fGsgk2(y=4N=@lr9i!c^GG!b`6yInkT6P31!c5~BGwoM6Iw8N#dn_L)D?&|UcC;P
z6Vx at JOjIk7iAkywIh(BdgL8`F+v&})*ai|zUcCXSFnPsSdN6tQbHs$nt9KEJ*6Bcm
z$*Uazn7rbu0hqkXL>Nkb1birY9ulD?${C;r!u7bKG<iiMZJ{?2WUSLIK$^xn-6Fch
zI-MVxFxKh#7Ts8<JB4nsPUj1wn1SUqx|lL3nAaIiGju#s4<0lCRcnRnkWR24$$`-2
z$bYc^Jd#7T$Wm|s-Pxgw$a65=Jwr!8TyP+}hP==?(g)Gq-%1Vm3K(TDO**EXgcNMu
zM2$Y!ZS_baeW?zhlg2Lf(vRF`?F(dV268`U+L-i(3bY+b?(CfvU=mpYE|~4q6{qZ8
zEMSxx at MCy8vvG8$3rws$s5-)}7kRc{&q7wl;&c~&yy^4C{yhZwMt~5zSB5bS=Ih5(
zk7<wqMLQH8XlInP8&K0R?aW|+FL(!N&`z3zbhUFU!eZL_5j>W91!r5G&cxI$jH>>P
zK?1ZBFMyOv2R%hy0e46}jnGsTg*#2%44!o5hdW<=gp>- at 8=yct$AJmj`6Ou2&M+9D
zooB-b?fenKpq-}xpq(#+2<`kOQh;_|hUn1F68NB<Cjg+GCxHdpS%C=9P8vz1c0wk#
z6M#1QIO0J&&wvlw*&8g>&R-&iqn#;(0(lSPN`$U}tbnwt>kui>kK{n;2XsrTx)RX>
z(yF$SZdw(j2c%V9OF3?<x}V;`)Qz<Dh++5SWjEK+Zlh)YblSeOd(z3peHa+<rf$8Z
zTfq--$piK|7*^W1^u%gCIM at O>e4B_M+^aaI at n6s#ZexJ(r}PAZRS3Y%<2d?!!6ppd
zaIZ>*0QX+C3oJ1Mg!zzfsXUx*^;%bOt9K|`+X)P+X3&)?2R%hqLsm$21|?N>!a_~h
z+{C~yT}=ihUyTP(ftrqFalL;D!1WG*hU@)27;wFxLVe+S-vjZu-WLIIy}N=1*SiNY
zi0geP1mb$14<fGjqX1m*n-CAz`(KcW>wOc5xZXd2OkD4u0&u;DAPm=gHgbjQeJogT
zz5TDSATyVtd@%!rA0UA=bubum)Z2)gt7d_6fC?jKFVz(#?5zeOFMZS&h#aC`2c<wo
z!9P;HhI|yNhrmBdJqr40wFMH!s7v4;tJZ=(PURxW@#;9ZC#W<?n5g~$$|Usz$e*lk
z2Imx24EdWaH4r59#wUS>-uO8%qc=VnG0_{BLoj;d;fRagco6`- at hEVjH$ELcl-vg&
zN`3_*&;a4DKus_}SOJm70O8+I0%L%12i;<T at E~Nu7$Dq5x)>nj#AeI@;b|1)7$Dq&
zI<R}v0HJA*cH3iUvS}xvY0{Cd`@yjQ$L?mvRg at ZKjMovINfU*cbfMeR<_5W2L%`y=
zC}3ZW=OO#`UU&rz2OInE at q3RAel3WxZf_XA{_x%N9h^+J_W(TT_P)n}1=xlv*6sa_
z0lr`uG<194fmpZOo0jM4_M-4uss?9U{g;WU0=WI^d<Y1tTj5q}D(ETd$-Y#BDo|3@
z58zHy>EKCMr-72M4gpVrIu#VC!Q%j^!G}m4YA_VcP=mWs<xqo<kXNX|y#S~|0MVcZ
zha!VegXi&x05!M_M5w`Y0I0#WhzB(|5D}mT_kajBcmRo_F>D8*F+`9a)ZlI;1T{Du
zEbR6MAuwT3(i at Cvss|WyR2ba3ss>3Opr*pzOJyLxz12kIrH^_8oI}*}pcJSG_(!To
zk&i<4I`~Ja&7hA~-4JVxIt%Wx>I%@usUl=@ygD83391+pCaNrCVv>3VoRifx;GCk4
zf_$jKr655KmV*X0 at F619U>agV4Ss}3P=g~ugc_^^Kn;e06KZfhd?@*=$PG$<4<c|-
z@(QR4gOZI%-wa9$=w33$!a4K_N at E5k7a|j8P?Ez&A|`Wl={AEBADQ9 at C4S_^3`&BK
zZ3ZP1kR3B938D~YP%?%*a{Krf>2mvciu~^F;|Y{P1|?@Bm(HNX=z|POK0(3lTr()S
zM*EJZs+<?dcnE59BHYfPWP&>=VaYoM^l;=l7GDoX&_-l9LKnjIaD*$50~W2L2kf`{
zBdwu>@JR|BoFn)S$Xs%Z8&TOnw5}HphTGhTUZE!tY-7NK2f>{?4`OjodVm4G;G?94
zg3BPwy(d*bx<3^R{$a)7Mu+V at EUX3HQY|>!YBpl{)HHIco531X55TR|_5G-q?+vD2
z)`F6%&VV~jO$JZ8IuDe5bqRP1)McPRFW&<|FKa-9UKW5EdRc&MK`#SfhhDyj+(R#$
z!2-QJ0VzW-a}W=D`5uVS%V8iwFH;Z?dN~CVpqJSoLNA|!6tqrmDTvm&4)LIun~@Oo
z@^^@in)a_7fC`v-sxEENc~~e1W13nAh8(p7+_~yTFdd+Z;qIkQLQ1{W=}4iEN=I at -
zR0%i>)Dt+5R5KA;sQN*|C^Za}(dq!i8lyf2eXM#5a>l7JVvSc%z&$}lz&TNMMGhw^
z{}AeB7sQ&Pu7P~$<>iPBy?hq2p_d0CBJ}cyhzY&C3X!0fCxQsQ{22gx*#=JN<)7d~
z$*bW*$#Vg`J-rWVP#zY7&cniWNIxj{aVI0qpxDQqPPg2iE=4ASVjuSy(&hG4L$|Sy
zn?fe7m#NRf>1c~-rFNU`N1ZkyA9gOC9Kx??fk$aiAftB>tpsjIS&Cd`ITTkWs|BY{
zHj~r3G60Nv!X%q6SdG at Yk_C4F&5^p&XDCvdH3B0!#OHh&mvWzsA9Uph!_joJaf<0m
zE<J(ZV}wx3C&S1V+=Z(F1-TdkTm at -{$k?Fm8h9*qKF+pU2{xZv47XqX69R(j6}Xjp
z at epdo+mIDfYe7j>m*ul{HG?Nz-2_U$dKf$f>Tyt at 6$c{|(2DaxgH{{|W at yFXh!3q8
z3wCHl7XY;4DzHE+evXu(6|)f?T0u+T(28RK(24<w2d!v<OlZYa5TO+xB0AbeHbkRs
z+=+P5if7=1R=fk5)QSb*Nf at -P0b`oF6%0A*6maLNr%}lVsGV^4Qdc3R-s(1_&__){
zazoTAa26;(C?iz_p at r&5NEoG#0e!TpK&&xp5Zq%`SJ20)3lVF)`UEm3s7pYZsKy}H
zB-OcqS}_frQ`D1?2CcXak)ai-pg}8+KtyQ8t%wP&xF0!(R{RP?XvMPtXvJ1Yf>!vP
zlAj76N<JKkP%8$4nlNa42|;Gi)_^q4psj^&(Tbap2{ULrhjh`3^XWEPF_28oplv*y
zwl+6z+N0g}rVn-cLuAL!r4w3_c8SLqNN+-u<y=^X9?(q$I0L#&Bw}UdGbuf)qv~|x
zsIC)TR<<*$!y-Fq#0y#@4j6 at 0nsDoRy$~jGA(rc?Mj{9raSq7-Oq^mG(Vd<^@C8CB
z<)hJL3%-sk0gbp20$hzaW2{Fb?u5run{dV?5ZHX`M7S}N0RchvZ at 86ucqBFAS;z{h
zOF&6gKN-iC)d-$+^&lwu>K5=6s7FD8MsOAx8gVLU(1 at jAhDH=4J~Uzm*r5^M0YD=*
zf(06JHByE~6eBt`;z0PI5k~`{5hD=~8u5L|ghosP5gL&Onb3#<0JMwS5DyyhBz(|_
z=OB|Bu>wgXXvAtTrl~8ykfTllcdmK at m3)AD3+`TOBU0+EZbk}y)I=mVMAd?`K)sFg
zNVO25g{le?MyV1|Myqnf8l$?xJyvCdK2BYUSmV`4kU2qJ1j<BJiA+pVS>ve at L%}&k
z{TcG15jP_;G~xqDg+^2&A~fPRhzX5&29cl<w}S|ccm)8BxB;Bdh%AJm<jwG*<cA^=
zYQ#uT6ExyQ1R0H3jx>!%G|?>@aXm6&G-3nkq7moPZ8TycnH-JC1l`dH(;n?M&b*|p
zL3Zq1I(eUX01fr!m<~)z(1BqTu62N4Z8<tXm(hV_2F1Nr#Qm<7ZLdM`u6BC*`1A?s
zwDYZCD_ksJ(^h!OZcJ#0U=rLI$?k!+?Xj5+Z(2HX!)bb&QWrMpb`neDadx at 0JVJY-
zjEL;9!=CN6!`|6rc)W`Vz#9UOrE=sW$H at oF)(uQnXFDIx?#2ds4{ZY-wcgXs=9F9-
z{mwPk(JfE4W<#RSt;G&)v?mJl%3ygD<%q}-uCH6;2`1`;ZuXUzX<{y}6Eci;)Y%@8
z)ivFp)hjEO$X;CkfcN?j!qw`X35niTfq7hW4cRJEovWDU=3-!OLT2&Vnu)>6j2Y0!
zsK;~JvW#K%PL4_Z?0AWe+4#=8F&qC4C>>gaZq;9xY5RnVPjfXP-BZ&U$!Zqc9x>Ok
ztMDysKu){qWZKa_H=w=H<$YI=__~hk-xBv7 at N`zYQ4=X;yj({+5_gzLdJVtsQo3z2
z!_y`+onmDrD^@3`X=a-X`@dSO!MH>EtQG9MlW!=Iuvf(Jm=$_wTZn{UeD_vg-&hll
zHuA#@9MM%xkrro*1mom@!EF5Sl!cuip2YCie-usu6}n9Muu+dMVEZ$6sE5=dI at P)A
zgz}HyT>Jh9&n&yof8-8-{?q>1QUBQJ!ec at w`&TXikI$d>9$_I*OL;o`@Yej$iE!DW
z9uVYDTi{=LF1^?V at Yqm!=)5&+3V-+hnl=7ohxz;MI6ZV;yIfr1>z}>onbZ9zMEzaw
z@};1H%8+rNwhXbamF2Amd{ffU=+uriMoYw8So`X?R)p*L35q^~KECkwABbuR9d?w?
z%)L75HOZnTy)=8ea>*m{6Bk^?WzCUrZ4FLQej$UyTud|{r##E}mfaZbSjMLzClanb
z+`Qm?$LP=H_81eK?J at 2F*=JpX^S)MR(!9zxCJ8Ol*~3IK6OKmlS!Nx-<iU}=42jw1
zODum+JJedfu=SZ|{^CC|ingS;_xO#@|HWTn{+lArb&dRrsl(jIT>;iQ-&!#Hb9|G!
z>Rf;I?FJSJqpf?tK}_NW;52YtyV;`a{o1dv-fJWE;Z>1Z6r{O*+cC`u?Y|>c;DzA)
zTwF13(Z#s*D=Y>q>A(PXbk#mJAkLt~<@>8|_RW!&R{cpI>dMsiZaN;;HlK2xTu;o=
z&0gExt2-%z-5b2OD1Aw_5uq3rwu<W`(MWYmQ at AE#HAGGnm+?nxBem7E18?b*-b$ji
zp`~tV16GN0wNjF;9dz7+gml;w)rIRJsWu@*@)AiPuZXO0G7)WzHd^~&2VVE$Mrf at S
zm)qTJg)tVDHLGlX-gM{l=e&Xu`31=r#O4iMF|q)sXlp}c($Yu+`l%XtIarufH+t;o
zyrD2nivMyLC~asQy12EjK3dn{cpQVJ_<S=Oslm7b#3jv<2&fIUyRm2*GsN%apLNg6
z>|V*%7G5e|#}<!?|9Bn=jwh~&G%qzRfHuALo*Fu(_K7gJ3F&H?sJ!^R#Z~*hUOg=;
zPJ$UnxQWCCx6gKxcBy52bFVSJ$c<{1iYr<Bs at T`cOi~l>4iFvGrwqrwsrsOE&Bn=m
zTGiET&#^C=tDSDnEg2a(81fi2{bKBIJ2&s at I`n9Av(c&{WM>2!XXiHFgg9)+78$e7
z$xX3h?}du0>gnZWGfK2YRyOm|h0rzk0($MKx^`SEi>s>Vmd_}TOI-}0CNY8>GmTm_
zqqL+fX{?H3otb0;lN;xDZRCEFH|}zCX*Nvw`Zw(IUQ)R-&L$lDs`=kk^>s$}aZSl>
zx?k(I9q2lu5uGt->x4NaWi#UPX|Bio%6Y{If}w=wRUZD`+U%yOhU%Iy?$8*PCY1`U
zomWv(UQtrD&?D5e%r9}*FINrR3$Z&3-rgqa#^9y<78~!Dew()nbg{gr$O9&Nco5t=
zsw_FG*s8 at OL2Ta*(|t?xKxg?sXw6%XU7d#kZ{>V`!`^NSDlThxN8~-Toq2xeQpM(I
z+)Fci{;cBaBZ^94ykzOfWI8sZc(2WW%kC)^MP;*+-V!UFPM{h$X|()(8DhkS3r>HN
z<hITVj&F}{8F at eTw8psGtCMG^8O9V?3bLT2vZ~S>5rYeNT*2obCq>W1k(;RA%F6Yc
zK52J%OPAZr6+bR>d7SO3{>N@{iI<U2!JaFiZ!aC(L)zahoXcoxKKb3it<S3R^0`H2
z3q6lzanBX8C#E>68{O5(gl43Nl}Vl{Vq<bwhG%mGml)r9vVy+44G%;SKI3i%p8n4*
zPFZ=?%<}m%N^s=I`XHCft<Bh|T=L at fE)KywnRr@`XSn3>?B9DBcZ6@*<A~c9zP?QX
z-8_7*y#W7L`e;^%8MwI$`n5iPxL0UTPaZDkZl5{4Wi-z&U%^ubdoMG1mhs_dxZ#+K
z<JmgMTb}r9_AP$!Fg2CzF~eKn|LLa-XY3h!>6fJ3U-&*jNz&Md$Aehw!~=@k6q7u`
z7`^+<j|)liSy at _KJTLC~rhI<YG#S9h%}9D9 at 1K8+b@=G!t4gNN at eIcI^`XgIvE~x<
zs$e_0s*+N at e>$J3JOepC?X@~PpE(1$&p#A!w8jyPH=XEf3p_>gK6fFgkl~{|PXwG9
zXE9_fI(MGTJ0)-0MN(ZR)D*g^sH%9MU(oHJn_O5qy{NRbI#!G2^D2u=XU6IDyy+#e
zxev>kD{wE at o<;~AJXd;~E#53t9*Nn;Vm6F?ZA*6l1f@}mgk~<|3qy5#d=41-P at cHu
zu(zV)xj*afg7FhV-Z56Pk;DE8%2h2jcs*W?w%sE0x8~}3l+M!u#y!g$*7$p7lG}UI
z2})N at W3vIs##cNe>1M*rD#W!(Z|CB&ewN7vX_$Bs>P;ZN=Jvns{4z%y?)CfpV+wsQ
zz-j+T;&Uz9VgKw-ZJO>R{!WnOT|Bks3)_%b4?g+Y(L2uD)4;)POW(w)h5hpg?)C9Z
zu<vO!;O&^@?k8_4oz6R9)u)>V8f?*A=b52{R|Um0%IA9SqQxa;d;#Z5C~yCi6?dPA
zSBY=z_QP&AzrI0$)@QvwoeMX)OjlMrxwT#FzELoJjv4L5Pe8a)l8p}H+lb5i`GyCv
z7oQYpviEt%32x at 3?E6<oIh%Kz3O3i at Gdtnd+5YiDQmeOL{UTqlO1OQ^{?`$uCDXmD
zq1ahj4Sc5a++x1?m)%Bp{(pY=;EW7RpN;9o_#v$`Yxuu4KJeUNTO!eFQ}(#=is??P
z%AFZ_rye?-JZQIg$?bc;$hm=7gZ*r;Biu}RM*~jLKHojx+pq1v)w5 at hYfWGJiwIAX
zcD^n0^qc!{{`+tKo{@Om`v$j1*gs)V5vQ{8qcgl1aBh^bFZbM<>u9l at w@;MY$v5Er
z!v1v#SjWfi(o_UTnV;{?!MEe)k55glgSByl^EA?Uzim|#xRHU+I*%OsI1A at C{Cw7k
z%ZU>-YsEAG*-6%XI6aEr>-gE$;RGfC3mkC8j#`jb=~!+8Ti}0D(?(oQT!K%Hkrxw(
zI}~U`{Kyk=27U-8%)!r_Rqjm?(6kYk6UlB{^9a3!JQ6rb+(bv(Jd+r4A%2ufJO)2V
zARLRIH!*8Bd(<{Z>W4Y|)Y27MR=uP-ydq)^s|`oP*09AbE!MCOcdca%XXn~*bGTtC
zzU>_5lIj|kG(t>daqH6R at Z!bIkrTY3`s)M<ZNcYno`^78f&B0F0fVI|Hw;!u44B4}
z?J^w#zV_A!jE?F(U&U+PbE;+i1rc*VV0`ky?2-jLj at pk4q>oSW0W<BNo5RQ(079xE
z0xwwYR6OP3YQ^M at gq!k7<FS&7cn%|P9B2&k at _AVe-(>Jm9t`;DgYpKN!h^yv{$>dR
z^l^EXaXCmH9!KM6-1L)=8>X1UIFAIuTiy>=!?YS`EHCM%{u<ymap1I`>10{|2a`7D
zFk#1m;FWjwX|TNoKFWh>shGTz;5KpKw4NLUdv_^xIfn^58(!mP$Qh`h*AnW5^fU4E
zrh5(SUd#rK>9UGUIkY(m_)R_2jNk|up)&{5;_nxNhJMBImNngz5#ziX4Bm9#M7p?i
zI^E7dlP=w+4Zvx=+-zC=(%&3L9?{b*E!bGGrb0+J(DU)5ylniKrdQtVlkx4ohhXG^
zt;3`JKF1ybh?Q&~W3Mnj_W<!6eqC~x;E$^r%3}*~55EONWS+yXuaryh>ymo?o#Wa9
z_c8WLpueBXj=Fkx7mQ}c4*F>k#vJq)8xN5FSg$Ys>V$Bb at -YYb(cQ!j`q#&Nj=T#J
z{8uLUZ%gq1A;JIm1pm$i|E>hT@?3c4hx_oDgZ_RA{^1G!NeTXv1poX5KldRp2jwqM
z at Sl|6-;m(v7DVP?{7nh|+Y|hcB>106 at V}biH?oP8|1X5+(X$%HcCGhzWkK1fQ~c4N
z1OHa2!LjgnL2DZfKL-GR75_xIndc|Pe+2wylPdBrgP%5GswDg*_{}C<3_lxwT3o4+
z at XO$L(^u9V at blmxi2RSjp9ep8oM!%ZNH}@e54 at J({}}#9Jn}n>N;8elxSJjVKV_G}
zPx&+H$FHyWzY8}_l9>F(S at YlrLKrqQwMJp2!}%5wQ*?UsZrt9N(=EoAG_AG4P`SN#
z?9(|Nc4AnY3DR!b_6XM-NsF5sVGAkTLQ60Z*VtU&$SuURb7>?-Z4TG9&{&eDFM~0Q
z`be{z1mg+u#Kz|3dY^JHCuZ7ca*3u|G#NQ?b|=@qn#P7Db<HafC{_tppu{U<(zOp?
z;Y#VW*XxdzyCt$B776ZHIq5b=d*GJ3a31Mm5gf1Q%Q%@EH8zSIZ%ch7(u9nP&q#H=
z32#^(VjT?}IZiXz7$d}<C;3R?+WCkXMnUZ~G<w&U>MvLICuZ?6k{Ipq+WcrgLFA#x
z$44HDQzzbZWnF80qF!?(@gc at Gix%OQOKg*9lMakf+i0G{ylKV1_KX+Yv5gtTa;@AX
zw--TC&V{IsoB7rD%BETt$D;N`nA;VcL&R8RzW8}>VtAck3vnv84<dr^e4*bVc)#Go
zL<}aLAcF62LVri_6G0pO1m&j)W(sx{<j#2v&m%%!llWT&&nH6u&4TQ^$^W`wD*7t=
zy9)LK`id;89}xzB4-tBiV2OkuF5zd9KGm{*B;h|6WFN|O?-&0gf=>%>Cn6qq4I$tA
zLg%h*EJrH(Kw at 7a@;4O7{1l3RG5wP)>mDKo?#<|2iCYDGqW`47UhqD_Jk%?92%IO_
zB-keSf*|kN<YPZgTq}5w;0J<-BEJl;738qk#^96p1zx*@#gD9LI>*DLA0z%{;y+dV
zXNvza at oy6Uz2bjJ{4a|CRq_8<{2|Du{O=G$mNiKHI$s#DW{?j<z|Mjk)6$<y1g~!Q
zz`pdSN&XQ&QuxLS77LaNRtg>^7#3_4j0&D1sPzJJFBku>1#cI;kBEFcAo!TjpCh6W
zT3-<VHSxbK;UA0t|A>fhejJmroZSR_N!WpcLxet!2>G+cUnb!df{TRCF&5=%Jp(_-
zSWN3&!Ji4<C8+fd{Ev(OX~8#$h`*DF at PCV+TS!r!pZWmIAR at e{_(zF<yx>eC^yO&r
zFC{{6>czj32t7MR{OgHR at oY^*ySP;7mkVAk_zNQ1!S&+5S#Y!9Ho-p$J|*~qpw at 5X
z`yKKBhgg6)1?n-|BN5>oBN4j^<`PlvK7zU*Kt8yG3HgQ#juzxJ4(WO-2gq3=`WFfw
zBe;wRx%GnFQHB1~B%C`J>G}}=<$_lW{(=bpUkTnoM80m3 at cRTG6nsMPIl;dPzA5;=
z;J*b!=)ZJ52=)@}D>zVasNhJ!ae`9>iv{Nh9xiyK;3B~q!Q%vv7v%Vu`S`xz>4F;t
zFA)5R;8lXx3UaK>__qt*EBJsQ$HxqRLhw1kmjquG+$rcs|4sf>K^U*q{%(T31p5jO
z6dWozQgEE$6v1M_If91^9x1p;utu;>uu-s8keh)pf2RqaA$X49g at SE@R}219 at Fu}K
z1b-*^px_?`pA>vS at EyVb2&SN;XFj?L9w>N-;8?*qf=3G02sR3yEO>_C`GQvoUMF}v
z5&Ceq;DbVcQt<CW=U$x5R{;@vKUVyc1d9ZViI7(!IF|_hs*vz%!CJxN1-a`a<#WeL
z;#q>{30^Gtb3x8?k?&5y-w8e-_y at s13vx$Q^8Z!vWx>}3-x2&!@IQjQ2Qywsu#;eS
z!9Ifh1rHG{5F95sRdAMInc#fE?+Vrk9w&IbAm=ifkM9efE_jaMm4ep^-YNKi;GYHm
zD)^e<$AW%bQ_9aI;`((K>@D<ziMY>=CE_<(=+gyf3C<xRez{;J5!e4H39lBc7i<wc
zN$@nmGX=S0DD!o-;I)D`2;M4qx8Qw(+XVk8_=MoIf`1cyMeq&5cLhHd+$E?`23<db
zIfC4Vm-K at K2Mdl693wbcuvoBEuu||S!LZ;m!A8Lo1iAe!(>qV_$AUi<yjt*D!5ai`
z6}(&UKEZ8*e-wN|@L9pX3BDruhTyw`{}TK^K|k`w{G|$Z66_|}Td<$t5W##w?w!E+
zQv_!U&K0Z at JX&zE;BkVd2(A~rQ1D8@>jdu<d{FSug3lAte*Y%;x}YCzpZOY0M4K2c
z{zAdAf)j~|KUHuB5p`1{;oS9>a*h^UCfF#*y at VNln&6p&KNS3_;4cMl6ueFF9>Mzs
z9}@hN;FE&S32qnshv1un?+Jb^xJwY5pXmH$3g!s*5<EzddoZ&cBLv3?P8KW{EEVL=
z$mBmtFf6!Cuu<>?!BYg+30^FCncy{ozZASt at HWAF1i2|J(|t(rPlDVPm-OcZw+sG5
z at J+$@1V0x1uV4T#Oc*~+Fk7&@Ah*9|ct61*g871D1*Ztk6r3wqC3v*pV!=AW;|13W
zo-4>rhMDfB|JUA^09H|*ZO`0gGLS%!u!Kbn7$B%*VFyJ8i3Oz)QIx6}lAD_aLK2gE
zBPuFovBVSwKUytDv3}IrPpQ at wwM7sVacOa>;)0^0jm51lEw1^W=gfQVojVBv+J3eF
zmjiR3^StLh?^))|nKP3!=Lp^{xJmFS!QF!I3homO;BQupk6i~8_7%($94$Cea4Hek
zLxJEqBCim<K;+j6-%P~ywN3bwf;$ACBf{QJ!B>d5zTTAZX2DMdzZ5j_K+k-47VIwA
zSMVso9Knf#lLe;<o*{U);2gnH!Aike!3Bbs3N97ALU5(vHG($?{z~vR!Mg+>5Zo;I
znBboTx$`s2xl3 at 5;9kLx1V0nxiv;Q?33e9jE_k?LuHY!a;{+!PP8OUdc!uEFf^!5*
z1uF$>1s4cjD!5ee3c;0vKNoBgyh-pD!QTqrE%>0|!-CrdcL=^9_^RMrg6|4`Ecm&g
z+10794uX9Jvjj&7o+vm~aF$?Lkb6M0-nr8-+w-M at 4I*DBe4Ft1h`2637QRpLOF<*e
zvBTY+Y0oC&x=1A=oo<5t1+xTm1V;&u7d%yPmf(4UC4zGWYXs{B7YZ>rPN};A+7&
zf;S4 at EVy3qZovly9~Rs$xI^#-!B+*}5`0(iW5Le_&2CP8*n+8oJp>OI%oIFYaJb;f
zf>Q-&2+k7ZuHdZi62ZBGHG=hm3k4SoE*DhWizEJO;cEnM6uepRHo-duHwbPN+$#9E
z;M0OT1z!_<Tkt)>PXxaZ^x*{~%hN%yi(pT|BLs&D9xr%`;F*HOf>nYS3tld`l8AP@
zT5zq%*9$%<@)w1-5OF;OdpP;yzTV7dXTh#S*y|zKn~3Y7zl0AG94<IcaDw1u!Rdmt
z1?LLZ2-XWO6kII0T<}Uk?h4QRtr5IY at Mgi=1n(5wAo!5rqk>NfJ}3CH;2VPP2!1HY
z4ceLR*Mh;G4o?wG6YMS6UocCMyPY%sD8cc9`GT_q&l4;WoGVx(STDFxaIxTW!7Bw<
z3$78oQSfHL+XU|v+#tA7aI4_sf;$AC7kowVO~Jnk{!MV7V2hxY?v%fiU^l@&f&&DH
z2<8b+5-borSFl_#BDhF!h2XV<Hxbc(Zx;NW$R85EOZY|dp8Pk^rT#p=p9K!!`$*vH
zg8$9;aNu+Ko{8b|UT3FZCGFt-a!GAPeYmzRyRtebgD!9Qn31DK;NK|tb8~ZDzoSNt
z$jBHye5BIL$e7ddGAx8*nlLWTG!kdW+%57E3bTxkocr>FlTI3!k%e_-h8%DQ2jiP&
z>p3&^4rXqiGx1JMv(q^}FmjF at ONQ!F&MAWs0IFBH{`jRHs$IGL=?z9GUcDSp?-=ON
zUM>zg+8e5T&JV+Qj1+XF*yBoj1gS%pk3;*(_os*9PAqR)?=*VEX&Xc|xtN;-vJwnk
zvpQHW7;3hfYxNxT(5=Lrwigq$;Yn;w%%3}Da$W0AWPj|eXpYA3a(<jmce<S0;tED=
z at Y+b_nA~Aw@#p=Hl at -OI*oAQr*T%4sqs9(XSI2>`jpI&rQr6c-FQbPsv*E4NSFFqY
z{Rb^AOHwioc)Oq~8 at 6oA-_3$I<nL)*v`BfHx8=Xf_}lV7bl?-hiu~OTlQIL_0-3n+
z8O>j|w6ttnvWOvYOSX<UXZDuHD;B}OJkW8)1hZi={p0x)JsfExy=G6+JDSU3Wc$Zk
z5Pa5|%-k98CuVM2!}AR*O1^GsX`F4}4@<_fP0_T5mp0_W+k7P=Z(xn at ozbxG0fzqL
z9_lu%UQrHMve|6d2K_geykj~>7GyU3sd4Ea7?`>-U^Tqdd at 4*V`M_M#(h_~UaTz1;
zwH*BM)+U%f=e)w%%pJ0}Gcogx`6&&7%*G#fd4PRgW4_&JG>>FyMBP(XD5P#Q8fT_7
z??fUh*GkhV_8yPzOHybsH}zg?>842E2U)b#jhh-iZ@!M at +G3{O8|b%mQ*`g%pbBf)
zxnygK&Z=YaZjZ%$dzbOzC2yqOm;c7yDWwhhyI-8Y`{mg?UY!31^3>2R^M0OFDawxK
zN+i?pC_*-5L)<(N^dWXteBEcfoWEn&>>a!EcOZ|iWHrp*^K$;4SGRkOzjnz^8qeR^
zuzAB%Pd at qNKVIMbSO1E@)#j!ln;RbUCffY at S1m2(qbvGeXTFT{5&dPuhfB5|r;DVT
z#%@oEX4{Qv%btmLV=h&5xC|zo<}itW9ygX;(#03eSoX|?-KoM}uK8T3{G(6lM$_1v
z)R3mMob%`^zQ4JOdHJw$_P)mGmksZ#^WS!*Mr~X>Oln(j5dlt}vec#9;C+bvxPht5
zRx0^<=F*o_m-a`aTJ*)h)TLdNr!?9F8CbH(ZpeQQx!mR3HGB6vtDvu>0Y}>C!}(hD
zMM?DHcNQaP$)=QXvp!5+x`_UV%|?6K_UPVst_4%qz=nbFHP_<uOx?IeNt(kTjrq?t
z<fm{RhGA~o+Xc<Z37dkjCELtJ#}7<hy(#tHO)DZ6nitw#>ar8jocGqLV(hKl&_yS(
z_lo=PgBcZlMPNo_U>WZ`=o;*8=pNuTR?OUuCe`wE<ILw8W~S`DiUnR)2y3nkKK(^3
zPpApwoiYToRm^;D at 9GUS(mWL!4f|Zpp!G$#0v93DL_@^2sCuOBTUO$7RSo7tPlLe~
z6-{ZJ-DTO!ku;T&)O%BUEKlizIvo2_^rLgmo2}v^6;I3xyo581`O_Yq at Z-&6(bO6g
zf52=pS{fev#~TehHaFW14{v_MHg~XX&)!nXJhaYjLN>pXPD<+S?jkdLiLL~cCyA%K
z6vrOaG4Ey-E_qb^to}M2SJML*!ci{%YWT;(&ojJ0{A>trhb^*(j~F>>^q8?l#i5cg
zlT&l8iRMK!40EAv_DKl at mcvd4WPKR`$8?Mdo$Y15iJgL{FY)_M-7?`3=rR0691I_W
z!#G=X&Soh7<`2;v9M|Ev0Y}Wn%%Au#4=f4#7H^sG=!9)CTR(*g%aG&No#)tMTDRd~
zd5?03m&Vh25^~nf40pJsRUc1E<!c{wSl7?Cq3gRZuAGVROz80(Eq3dkak+m<z*q6;
zmQH~Qk8}<kgD}oH8tccc59lqczru_gMKH^=5PJOk`VjbI`eCO$-6(_eo)_kaart-l
zW2vCei^@+C(@+NX7oTx?WMW8kvOB(S;z7mZysQE4c;|g{esy{)zh%6;5pR$?y<#Ul
zR<Ux2^c>Ny9C4nuhK at m_Yp;!OTN`ZE=n&v=8H)Q$+^c$3pV1o+IxZpfoOm at cdF(0{
z8 at y_LMrn#So+Ibq_!8|o@~*hewI%1@(Atu3+>g8){??PI at 8oxGOdjhsB)?AhXR+{D
z?~oAQgulf&c4NIjLilXlsGRWF)h^*ZVl@>o)eJID_gIL7PFJ|km-HTb3IBBb_<D{;
zh%b;dizE=7Y60w|F=W2ra}2YCoa+_{1i5l3G)KUkpI;gJk7Oqv3<P?eiQdJ!lgU_W
z{*HAIV)(37YFeD(AGG$uZ&|#9Bv~BV+tw^dI#|EL4Y;GV2E|FXdLZ#U>rc=bW(5&z
zk70!YkD1oRkgfMw#ZdmO&tm^}yU%(B>Ua38>jA&>S+_vtE}!)#Qoh?~mBQdXK5Hh}
zeLiay;9j4F%E7!t>s8qN!nEoj{KRi at 0?Vg<i}O_e?zi4Wynpzux4>QuSf9e?Dm*O*
zp%XZnLy2G at m_88^ty`hk(RvUH-K?e1?q$7)D(P*d<AJ`9#nDAyi*tPsw=P9;M_EPC
z9A+H`$#82NLPuCpSQu%Y4EZSQ6j&H-aqi|AD-ZIq7GI!@v%0{4thEil$60$J8E;L5
z{o^gp;yl5+3cs5SYbzpeHmp}+b+zBR1Ihi&Z#{|J{M>InhMZsHxA=A6wSKD*@C(1i
zVfY%qwHyp3KOGDu{~;22F<|(gfHYXd>?WlLL;PgK?hTW{Fi*B&-wHvnl>UHy2mNLA
z+xA1qM6jIx6#EIvE9mcH at 1TD!{oM at zP%6#)Aw>QtyjIrT at OB8Cj7)BX&u3bk9_i;?
zZL9P*`0dyqe5pC;Q~2$(kux)kUL(1ty3R0%l*7BoNMYO{6g%<fGPY69itW4^C9=(9
z3Ls2X({{3%jnr#tCP#T^(wloWrCaFDqi&ZPd`xN%I}2Vk{=f!g^ss<m%@-b70%6y{
zT>Pdn))IKSsh<Y=C_*r&dUg%4;2p=}Y^9i^AA%$~RBo7KnN=gXG+Kq1h at 7$+u!o^?
z&0`tWHoE^3!RADo3E?oCzJN*(Ubp5%ra;$|=j$^(uBQ7UFoNHJZ`CYJD2<>N%>u^b
z_|a at S9?^P*AYz&<u4AZxhRy};c`bgJvvjk-|FMZdVDBq%*3CK0i+KTJ_dzb_FlOIP
zP;&zMlvI?#%izN+46|6uOz3wf>u^53%mGKHX44!LuNUmhr=3f1^iZ~{DE|%V*Qj5!
znvwoYstQ}fJbns##8E7J?K~*^SM6SyffVbgngQEKOlM_9NX>%&EbS}ss_zLd<}Ano
z#SjhPJkTSj;fH-xrq&oZACk);!C;BWvYw|Q4ywXu=cb!8{Ht&Q_DqKcgR}srwG>)|
zS)(aTn6n{Ot1C46(U|!Jr7Ste-DcD42+vY&?+G>&-zp<Z74Qib(6=g(rOv*J<XdI;
zEJdVCkTawg^jE at Cx_O#^m2L4<`&R`}z5Pm<%4Vj*6gYY}n@&Q2lgj3VR5mB1q9P%c
z477<YEWsZTxhKDoixp9&uo4+C?_~<K&K}!rx+j*xy^?}+qV8o1&p^c~h>C?IhNx4s
zfi}KEU<R($`;`f#+Ve3;5>o6MU~c-Igdg*I#$lR#elVMEN1Jv^c6~z0u1_eLiiBj3
z=!WVx*V2S<)#M?$G;t%_9Y37Q!1qRm`AY^~3p(UPw!521pCavoE7kmO(#|N-pd83}
zChCv at ULUI_Tkeyht~=+H3_2dFEYFpWs?W|=%>{MYlb5sie7d3<{n(DpB}|p&<+G64
zGz%H)q1wz6mU#>gr_n4)D71>j(^-dpWf at I`pgD-&>@hceVa3&&k()tD5Ho1B4jLNE
zD8D-Sri}JJf}P7`X26Uf`r)cFPhlTt^e$uAF6O|z9btV+=c8lV#dF$M6=N5R(O0$m
zU9`Y{<29-qN3G!rJImaLXpX{JR4|TylE%KG4(mkCsct$IeO`|aJWXG*^H_s`9%{Dn
zSC1g6`$3OUX|&M9P^@iXn3#zPKf1?k)gVoi7L#yVb6CmeAS{f-w9FYWo2hwjIRber
zq03`&HwrQPn11Bq$Tg6ShnXX<f`|9<BRK^4Jv_r0XCMbPZ-EW^8zQpGZ-aexHU_Fz
zL?vU;*AmF7mk6}#jLDgk2gMbJ^IM;02IBHZA=uSRwt8NTAR6`>MbUT;{s+N#<1jN#
zPOKd9AY}X!0pFqYq+GgvUC5rjW9HEDPz^(qN8mBDRF&}rsJd-h4{M{;NysvJ7SN-O
z9;zC{QA*P+$X4g%Xp<*}lhb>$B6xzGPRw9uhC3F7>c0I47*suI7wPPK{1FnT_Z!UA
zQm#Ti-qc#Qam2AOZ0`6(X)&XNITdpZze@^6*vY41nAeSCv~KjF%f11A^^PN8{2kta
z`6=qud<H+YIM^LwMEnN47&vg6D2BnD{fc2QC(B|Oyn;eISOVsc4TCws*7yiV0L`3M
z=OHz76n^f6Iv-SyMCsphtj~hj	WR at ph*akU(%UWp+{u!58G at NhGum2IAxG&%ylf
z at W&Z%p9WpCH;3jr5wnTRQd31$!0AXisje0seedTHQVVLa!pz>~px1-i=nMPq0 at +7W
zVwi`205SpHJjP=k1H4ZrcMQA<NNL88&$P3UY{vkJ)a3?M>h;L7$;p>lI5?z6U9Mp<
z0!h>H*n}dkBD0guC-{P#&xj)S28-8aA(&WwRayN2TIRF(nTunkWAzor3?!|>!xOAN
zPG%?FMeqfGLZKZz7c6e|mtbO*Z`T559-gbr6#U!<_4SU`exR`Wtb$;7f}Qj!&G~}c
z6${<~7PtB)m{{fDBw*IzY0TubxA&p`xMP*G-C&iI!;sgr$n2!i1Ya<jLOZw{+HtD`
z5hhj(l-1jyWlrmgKWM`97su)^l)0ocA%#`W^n%q33BKSY3hm$ku(;JSFtJ*%to|KZ
z<}LU+A4dRHjkEP8V+NA0O(O(fBD0gW5PU(-MuOE4SlsIGz>G#50i#J-Jrj at B<~vYL
zf`^a1{Np)C?y!D5ME(zHMn7rZ<s|f(GM)4c!54fVYDnl;VDXl}2`uQN@!ssXwPmx(
zI*r2gV<437YOTu7=PEnD?T)}R at Kb_=PuTo6g*OFc=Q at Z`*j@^P=Me0q at dRJ+WK8`)
z9`-TEvCI5ugaroS$4u9z%%=Zh!s;<0onCZ;)=!bf&)`o|Lp46V*?|rg4G-=}9SpZ{
z1dJun3z!+4HPI74oTkEu{5x at c;AAlXvHwBlMc3GQB!S>omA|C51YeL7I*{7}uy~EF
z0Q1k|kJDE?%yiP%BW0b4*+gdD3mr3^y#X?x#An9a;kRR%M<>7;JAn*pCsWT^@F;)>
zS{6V}x9FFS`Kmbh7UCrwx1jn_$3KC{e>{F-1$cpZ4FrEcnVmG4;0qp)Pccz|?Ffq(
zAcb-FKqLiN3vTw}UutwBW)qq90ZZ0P3Sg~KY7Pq|?L=NSLy5&n!mt^q2cvTo=~Jea
z!T3 at n^DuK@=d@&h=RTbeGrO8y5bnz~l9P{z2zlsX_&bkFJ~nv at 8e%}?HcoxOOirfU
zgxt!4QeSj6Nog*r-6<B8Gxa;9!l=J9?Q~2t{hi~{lc8ukX;3l6G^eD|Y^VOll(Za3
zI`>S_PmLSKqiQ at d9#WYG?so(xl-AuG+{-bBaWN&`vtf#94erI#o|t~k#9mCR2iC2U
za{5pMJsTFAsF*y2q+hYvG<@l+CZc|OK}&K<t=@5CQ_?b2Rp8q+t%31e+$e^8BU~Z<
z+%Xd}as<?LMv!7gJQh>ze>n0){aMLBQt1r{8q6f_vw3M$$V^7IyW);JaD+$(>7uZh
zg9oWv$cksoheU?B(u9qp;+b;_b#%6QLN8ryQ&jq~iaRDA7eh|TZE#8&?Pg0DDeUIB
zG9P4aa#bFon8%PA=FFZbmI at h`41)JWPTr|ILX{A at BV(Bf^4um=-Y6-Tq(2(!#+aBs
z&iRzI<J9RkT&>>Q;^U3nt;KY_n)|yp5>rgbq2;Q16fg<Y)u3#tKQvxen7U+ex#;Gc
zJP74UaZaH-Z{B>hU4s8?twXARLpN7f`#?7pZ>nsa?iy^%db}0`?h~4DI`N7&cK%?}
z($^Z!tgG9woo=av+stw3`a3#((t$Ga9h({Ql@!mH?aG&KU+#SI3c<bMd!Mtde5x>B
z=V>&*=-dgvCM0;?HO%bn9Or)yW?^B`kDQ9CP-V0voKsXAD$iLkW|Xl%jr|7Xgs at zV
zkrS<}rOlkOP>6O4M~%RPUrBjUWGJQxMi=Ca$R3?NOecp0I%@Ivf>KNegNs~P6Ryj~
zdy2RhBU-h<3#9PMij*K21Jy-J at bnHph7%kB^4I^cVcJpOv1x1l$)#y_|62QpQGeg#
zd;@!4{h)t-#2!EXD1Z7Xw_=px%j1vT at A4P?PZ+n^r`l0}B- at _8(_a;_Z#<`lfwTE@
z{nkQ%;SF}wUT3ee51- at 9OS5zAveW$?XZcUN!TzuE?bU_lQ at 7{L^;c*6yUntf`1cq$
z*z5d{T^jK}VBYYX*-JNGeU6=Wj(@7%)jrdo`utz)T>qe1)3*CdkF!_!&wIe%!S3qM
zvuF9Im)`U<d#b<J4gM!CUF?6#yy2JjwDEuO`Eb_I*id?O at U71yzU)<jHEjj%?-U-y
zNj9*)PN;@!5y7>6URdXRwDk8j?dGeS3VeYBW%V1&@$U#MQFV99x2rn?D^YUYqQnYf
zt?&tiwKCP0lcr8!@wZ4vT}=iTEppO`EfM5gAWVl(8vb<CKJ|8$$~`KT>+$=)ce!IV
zs!FUg)v6kFlfhN#&NwbxW}HtMD&y<_eHjmZn~d}6!ru!u{+7zP>bwezi|WFz)x`D6
z at sUEj;pCri;tL^vn<eC(G(zP?wF#>)|I^oyuXlQ4<Dj>VsjIjs%+s8ZEm_7{cJy-c
zzMrimC*@C=G<C|f{I=pB^2YX99<9DDL#L~4S>tD*VET+R{soKA*B2F5R at 6D$i|H*0
z^acs8{bsP at Z75Pvjg{q$((2mzMUgt^{#RI9SzQz{Le<fPt!Tgdy7coeEG#XpjN;ut
zZk2ie`i*f_Gvyj$Y#fCVqpq;DqB3lJU$?ncSFW^s_hRIUOPl{Qwx`3NLo0B$-HGV-
zfekdidCS{)>pjpC^v?ChRgU9v@=u;Hb86yd3-Jwaquds>&0OW5QCKiz%5-dt`y)f0
z!?;Cm^E!RvDTM{o+uD={O}V;uzgyFkRu+}jx%OU8*i7x8v#A|QRA+=LtLwsr#nIBz
zFh-w+)zJu6h)gJG;yIRe=Vc3M at 7`^PzJR at B$T`K|kZfB!=GL*lWX``K-U0T`Wkssk
zdgqeUPnuGo`dV}ds*zL`*E;vD`jYBsF)mSc(aKh_ZSAAmM$46*^B6O}!=sZTDi_=3
zaV5f5=b*B>sw^Ynv=>6BqB2rZRp{<U<y3H2y}FuksG_K{Q1vb>K{OINl&!Y;p-B!N
z7b>b<m4f~FoGTw=7kA+j+r__jAHJGe6s!(6goGTpItEvMV>{~<7M4{-LkV at IZ#f(k
z9L!q#a?Ww3e3!j=Lq)YEMtxCbG%R;BqXfmlfH0vni31hcG!XX%b^lAy)a6dxpii|I
z^}|M;Q(iqkoKsU?QBxPrDXXgv<)HaR!gUd1PNX(kHBUd$%2~(rWmy{=H^$8-w8e@@
zbrBjwEIns5l%Vo`y_v-aZVB0q7xX*SpXwc)Te>qyQC9bpPJ*}u=f;RhoGVyATE_bO
zSamy3oiYZE#bU<)FV^}&S27pFRm%{^Dzd%Z9@=#ut2nm6`CPrYy#^1h1~KY%DlS%)
z?KODlHK<;>wb!7!iF3?$Xf^nsU2!OF_<Zy{3HLo!q*%GW<?siVE5lWKT(ckht;M|W
z{{MCnw=QLCiK^}dvApVSJz!zLw-}U`U~t-2)mDWU{3i@`5*sB4hq0Hu*wrZ<PHe(T
z(z;ILMiQ!8-gv9fZ#QDyU*&%Phmi3qVaXG!#Wey?tZ%9L at WDUh@ZFrzx+x!e-?G1o
zj{QyG`(NWuR$VWozNzA!N1ubP{@7m_;- at v?l>RGEfjY-d2L1yco%mOwEF9QXj!>k$
zrxW<+wSe)lS-_cl%285{1G<E3a0HE7<9uTPz5Jr2wLU{kV}@H{M$90i>`)2?1kPzS
zjk5^+KqJu at b)QfQGYF%gU>au<v~Hr^N0jbq1S<HARj(|BUpd;!f{^>?5wme%4?hBR
z-P`JY2GuWd_>J=~TT2f=0mFuZ1V%-E;}%XsxN<DQr#KKwaN-oi6$_LWeyB*Ru&9kA
zC3CGdpTuliN1AJOTotNgUxEzqiy#z^^BEn-Z$kcz1EmNMU&4WW5ct^!#aeYeI2NRU
zEO#xD>Zk`D%e|N4ouZ05*P515kB|2UtkvoW(uRBDkB`%E(87hlOK}8^8e`nyYw5j0
z(ep{^y%C3HtSYd;-4^m7rv>6z9B6k0ev*c?2<jUYwS$I==T4T%--07(jJm++yOv({
zWt=gZlwN)UDWUFEoqUg5OS~BeDuj{Mb_4NkAenM1{-(;dLUi_aJe|M~BHT^rX{dHk
zvfQ;qCtBWG9gRg~yc`^^I;5E>4w at o9h||_~aNtG+ug8H3x|f=cm(U53U|{NKAV0u@
zKS1On`IPH|p8;JbvD~#p>Z8%bqvft;G=8-Jv5v*BE|`La76_+QXjyYkH)Ryfz46d)
zXQ at d1*h>+5&c}f+gFs_St}Q9zHG?yx%fyp~I8HuKcPl=IEV8DFf5Cwi80icg6kh~f
zjss$CfMRXoc?9iJ!3BgpIDAGVK;&l^$W|bx%Q&NP at Wc_1#ep+}-<Xr&0C6l1oL2%h
zd4>QnmjNGSHgO0JTqw4c*LN-bxj1a}z!?w?SW7k>M+a)u8hwZLT}#R|;z}UOW#E at 4
zn4C6+&L)6}36_)q{g1X3(@|FNlYv7FDP%67WOxlJL82i?2l~pfF?B%EPr<?S9&-o1
zv1x6!vuN7)X_Hgg{#3S3jg{#Do+A*B4i_ieaU%enzpb6Fo<0zC&_dvsX!5rJd*Wbx
z>R~#xIx*zviImHLVSehVU50oD0^Ro3onaU!LPmQyJu!PD;dk4+5%$#jK9JMt{N=&#
zwzmiN7C=UOERN3K3GmY%)1aG$NZJOu_UFUT@@Ty|&|69caT$VYUJ?9kjC9ni*M$dX
zT0Br)3IWPJkLlTNM;*E{9NJG#y>gd8dqW6wm-pP6&i<(^FHP(6UIf361Fylg#Q7PC
zb~>yc0=K<SU at rsn-f0g}V)ibFU&n#hsKRV|?uVhB4!aft?Pu6PobV!^2yr at WHMl$7
zZY54#GTkmXbUD_+&p5iCFF(pKCUZKOIEL}KOHjndA5X#{ppE?T69;#?laMYZh^q3Y
z0d=|?;n#VE*O-M9PCe~(7^_sb6^7M7?@6r$)Oti$^Dr`}8^$6;q|F>0Oqb<m-rV-q
z%|P1P2*O-mu(n<6wg21}Y2S51VB*mCRqdFN at PYSPP4(!rq;coR&X8{BSJNTm5<hmM
zb(foK4eA_(poVFbYV{EM#|ZBW<RJV8;X{EOd9$vmPrXVUJbzq!ll=p)x1)dz$7zhM
zi$soYMGbDBmGC)0j?fkhp9`d0io-+?Qm2 at c2JO2Y^MA2RKu$Z_kvD1rB<J;_9XV$L
zYDa#vCP4DrJ^VfocTuIk$t7TX7ggczHqCI>10CC~iQDl`#hf38zvki19`2&bzL)<E
z0#3C&8OZwoJ8&Zs8v^7$qF(`<!8xEA03N`(<IKYW5}xd8Fl=r8z&XKhkc1Be=lGZF
zPSM^_kNzYNKOLM?GPV8q{DSy2EIoUn)jSMm>P|7I63Sd5N8-$=!fWtIA>QI9Oc!$$
z_`(8T)@JABjvN-7RVIJNj!oi?{edw4=Pmu`8d!BE`s&xuv6sb#h0&6V`jU#_cyTN*
zK-K$6c|#X_%M*Lgp<aeMlPYBXuuKp2>~X1H2+GR|J?(HmZ&fIEZGov`PRIH2jdJ=t
z(}xdxa1i;uK2fdJ3!IH}XX1RkDfp at 2VQ3SStG&UXr}hNHxjUP3a4rhN at TG!W!-brC
zars7|J;86nulC3SE(iAw!{?$z3`(98L=a};I(;^g{S7fo5T+DAQIO9;44);K0pwna
zlLSiyR|?)CxI>W7?$qZ~I<Y`-ks#NGq<o(s7d{{_7rarBw?q>+8D10253dLE;{_*+
z{5;_tA29q%!J7ru{Sor#g}*Pjj|jV+aWEd2&mdPXK)}ZcpC;k6gsXg^Q%_-h{HT5z
z*j+ep`LuJmV1FV8JgUB-$Nru1#tBXkRONx3?TX=N3bMY*D+Ct`E*4xasLBmJ_P^9$
zBY2~rst?F-6Mm=Q20>L%2;VCFalxkr*>BP=`%B{6g6|1_BKU<M&nfjf2y&%O@}7e1
z=g8T=5swiZE;vqbg5YGq>4Iko&K0Z?tQX|^d$hY)aJk@>f~y7B2;L}ov*2xleA`1i
z8wB~vhn%0a5FZ!ZA^5!DD}rwbHVeKl_^IHRf_}7n+UqFD)tAWA1&<IMBsf%XgrHh!
z0QzcW5+IimVf<pjD#42cFBepM#6nN)F$w%1k>4x0S at 2OozQUp1U4l0IGw@D=y#zA_
z)vFwYj}v~n;MsyJ1 at 98vB&hakMBO}24*avo)n1Jl at b3}%mm>EC96d|07ZG~>h)6$6
z_)rN~{VwFQB>YlA_2vWV{Z#bU5 at BbZg#T9fUBdq${9)m04 at KxdEu8m$#(z)v*F at O&
zvHu3*J5&{(A)I3g%GDl;h=<Q973TtIlrJPA-<J!&LQt(_0lC`45UBPp1gbp?5${Rr
z;heo8@!yqr9}0dU@($?WXuqf6P$Kd%j0iiEL_SUU48hqVpC=e4BHl&9xquh#UM=#q
zg6oK|`+EsjdliB|F7iK%{7u2X3APA!;({*BFA?bt5<FVuBZZF>K1sOV%dm(X^`cg!
zLb_Lx1DiyC2NCuk5cx*I?IM4ch;(-fe_QY?k^5}Np4w9ocE<?MCnDV+5n-Qej1gA~
zUMF~m;O_+=6MTjUd(R8LF7mxZ<mW at -p9^mh-V66Orjtp8-cTa!<Oz-!oFF)rh_-Q-
z at N<ZG?w&_P{D|Nsf{P`*QTR$C?EjhwJL`o%Cj5`W-xU6i at GphixYsg%ieNt?>~Q&W
zm2cr=gsZ*y5U%#(Lpje9`8k56M97y4UPVMXR!jIskv~qv`Pn1<L*ZQEgz+<QPv_nv
zgNWcq3-U8~^5H}r<AhHT<RU5zpDuW&;A}y)G7G}%$zgw?$bT%jOi=BGhk98-4qQdV
zajk at 3FZe%#zZ2Xb_>iF5D-Y>CC;UahJ%aBOVgDn+uSA}NIIOoGf_;cM1_~c0c!HqX
z8xQ_Ua+Ir<h~ommiv=$uB8|(1uMk`<c%9%)g1-^GPw-(P?5jQU;D1WwPYeE;2>Y)H
ze^c<Uf`1cKd*s2d_Q(UOz43tQC^PN%BZ40(I9Tv#BJ2+nK34EV!5;`t6Pzg+609P^
zenj|%f@*I(r1xWT*k3O4s|0^8c)g(7D-Zg&3cp`)D-rg&CJpodCqXV?L;eC0_FonL
zmY~`j58)pR|6GuL0pq0#_9ntU-_21zP;iLgP$KM)5Pq!SM8PS71%hV at h6QVguwO6y
zV!_J<mk`ljxylZ)k%;uJmhfu?*9qP#c&Fg~f@<$P<o}PtpB3Cigx%K#n??Q!5%=~M
zBJvkZ1tLDy1W?#n5KCUD_&o%B6Oq6E60Y{#L%bZ}qXfqbP7<6Uc$VO7BJx!vc#+^$
z5`GgA`MO2;dcofb-a|zE`vw0%M8394IM)|qd7c;CCAdd$ui!_5d~l<FP>{P^koP7c
zoqmEtM9u|=D4!}kL_~fogjWfwJ@{a!o*eoY3F^K0mWiI)iw}Bg4?dvUgAb_o-~*~X
z_<(8;KHz4F_o(30f-e)1&TE2y75P3v3lD${KY|E5 at ALTwT#dVd3uK(STksb${+oe&
z6!j*P!>`7nz;fZ3n>GJX_9e;78$H_DwdcV5k}Tj$060GT^U3tk_v~q3UHaRuF5SK`
zcTs!Q<>lp$&B&S&F3FhOUK_*OYvW+HNo((N+xw07E2aHP8PdMDNBd1Pul=TZP<xBE
z-!$8An(a5u_M2w=O|$(;6FVffcLnWTL3>xw-W9ZW1^6hoy(?(%3fjAZ|I1y$H+)VO
z;TjOx&PQa$b#+E|sCxeVFlKpYS5-&C+2}ro)<ud!^Pm$hj+SBJ(W<ceYvRHD^nnuo
z^qKHYmpdN*1gczr{8A5pI#tg3d!-P7)*B2zrZ*i>?-=ONUM>zg+WVN95yvndm_Dsg
z#KvIxd#UEsq07gi{p9=8;~ZgK2Ca7*J>s+tBBmV0oZS!K>ELhR9U%EN4we^xc5e0U
z&4Mh<cfj9{wbS-AZwp(0d*e=-`E}=*T-UZ^t at XD#Rzh9y+X|i&?Z}yT?a0$L0h0Ik
zaP-eH$8bz<k2!MAq1KN4Bu#+ir+D}b4?o+(LmocY!)rbKLJ$A3hcEZ=l^%Ybhw~h3
z$NaC?1W10jhd=1yTRi-64}ZqPIj37Y+CR{@Fdu1UAoV%dUpw+7SHmOcoNw*OdwY1M
zhv#@Wzk||_@!j9LkpIvV&N<=QF}%>j%RT&j59iLk+A%)AxzUb%rH5bR;cGpdbIG-1
z{NH-`Js!?YF14dR=ay?nzSF~Zd-z{HoO8^zWBji at +;&~^4CkD4?Z|t1_y7;*#*^An
zf4qmE>fvX5IQPNRj`6EKe1V5A_V7jz|Cxth at 8Mj-Ks%<#g$%SK-|XSrJ^UFDf6c?W
z^_h0G_o0V#M?dWt{*{O8?F^~IaPID at 9eH;TKitCyd3dgeb9+whXm5gtPxf%`FsvQ*
z`7M)n<Y5o5^6+{Ozs$qA&zW|#x7x#-Jp5N4eusy1mp|=jZ?lJQ_wZ*t`~?r+<>7C5
zc(aGU=iwiFI5)x6j`<6?ZmHxQJ)GZ&X~*z%56|%MEDz7~@NphK$-}36_&FXP^6*Lz
z=e~W~F~661_%aV)<>5DYIKR2jj`sKsoOa~*dH7Zjf5O9`_3)QHe2<6on+@%l-lrbU
zZ#lGMxa}H)k$3fQe&eAX!*e`*q=z5p;U{@Gzx~sW_Bf|dJMyzVe2#~gd3cqF*Lyg3
zhu4nwwV$YXQK-5O-)R!Kn+~yDqY_|QaU~!sL8QnL5VZzlKtYEOBS-i!Ef7u`Dz1$P
zC>pM)Bn2p1U2|bwMH$x|42jnfGn0}>$s&PaCAH!C0;J&uT!j_CiWExu!pajDu}F?g
z*?<?>cVtoyh*$zgrpw|8C9<x7aG~VL at i>V{HVR`IDV<-<U0=f3-J`n1(J8;MrkZsT
zE>u28I5$^G=H?2`b7-DWCzEqkRfh{J%ZldDFDk56Iu0q-th&sRR+r^DCM)T4%)slE
zjGmat at zhjbpdtbt0qVD~rlQ)3ph+yKsG_PQ>|_984s!zQ at TqRGGNpVXbedBbJ3Tnf
z2fp)Fi*P*Dn#T&&=m>PON~(zy<eWHe9ib`(9-J6#@x<DmR|vmGm4RCMRj{CDzN%g#
z1*JvBOqZZ27oz7jI;F~^MBJr-5~30~r&XWS(wb0ZQC(d{DYrnvSI4R`Dx|VHTN+~m
zb;4ATbMADrh&2inj2WQG3Y;+3sX|()sH;*XR7inpKThkJ%fii7C7a7ya9T}eiIXdZ
zi~*C*uMnPS-7bK6yq*-Qa9svzZ48SyLU$8n6gE7CjEa3r%CRXIea;m?U;w`kFDi|w
zRuuCyz-fxo5M!+i0Wm+d_>sGSqSy_E=f0LmL9F%Z2C0x0;&_w}`WzI4GWaS=D?-jD
zO)loBsc241V+&RhoQ5pTm_Svh;o(;ZRl!tu!}aF5_mM(|cbs2QQc at Ydpr|(N%plJj
zK4#>o5%@PMBO@<2H`nz$YSf5~jA0{3jmc2%z;nkp$vv-q?s)rO6WjlUFsA)a2;b#T
z2>-4Z&={|NpWZ=_aXm-y6%7yXJ81W_7J_5%TJv3g%J-+|eFsgwgLwyCfbXpNQkw6e
zGjK4gZM}moz{_5)k)WN+t3|Ewf8!l=H&?2BMj7Pc-gn4TJmKeh_<Rq))WaJ+{O2D2
zD-XZZ!yoqWr#<{_5C6==JGm;J<sIPRV?6v+5BI(^UEm4lx*6Kh{;eLa!-(pcu(%R`
zCMvGR5IR&FE>a_4m#8va#4%i4Qc_V at Q(45(X<Syp5m=mJNFIrDXdM at EM4KQ$QYw<#
zdrOBpBrcB|QXzF=HPmzV>%yi;;fi{W*Bu_qd`)$2q^@Xw4gTU))}~OBcI#bG>kR!V
zJ3ktZhP`pMFrKPgRWe3VeMM~~T2z^ku*kT{O+{4^xAsG>UCLF(t{~Q%E37OWDXXk5
zF5+V|7I3Poj at E{-juUiht0UE+>dHF#2=Rbp$kAgkuB1Eg7_wR3Bj_<?7p~yfK2`VI
zPSs@>=e$XF-A5pE<XlK7Q9dIk37G7T%qINkKZE*wNe!UBKoUM=1_T!o?4$~UFE}2T
zyU%&g<qrh8>=!i8LYU!LW%n8|--edSo`TCNb0s8L<w85qov9$$NU)P41YeLVA;anq
zz~WYm!Q4A;f9Gw{xir&$cQF3O!1&tfEOEm6>4&gjee9CT35AR5u$8JZn_w-TP-`)h
zZet at 1#}=;G at BcdY@zS-b#zU_P^l2z`8x``c&Iqji2UMW(PZ=<CQDA4*Mv*MWn;jS7
zZA7)6)KOGiTpO;}Oil5Sh+GBm;NACWtbHtd6>+MAf!{mUu6F5ARa1@)wV!h8<<cWg
zhjC2aK?{LgyM|+C_NW|AvpeS82#zgv9C!`>{rEO|#ObhE;BI?;VQ&*;v`0JIUOD_a
z4!j2c{yLQ&aXPFXT>BYx4fNdOU>&wt^mG}y_SbS8+EI^(_u1k{xWBK^N}@wbT~~CY
z9GRa3A(o6Vdf;F=+IqI&T0s*LrXB4Z$o(sxE!=7PRn5mGeypP4cCFW%O-ZP8H8yrd
zAa`3J=Q_XIk at HTfU0d<9bRdx7*&aT|!(CMAx8kvTOL1voSiNL~r*2- at 8J^>neuet`
zj?)$6SCp^~V4<Vrw09G0VPPthL1g<kao(|1hFaf)ZHMc8sPz+pybp6d#te}U7Gznd
zr><4tal%g$<g+Zp)inkC#lp)3=LuF5VP9PX(7#0FO9lD-Mmtvv{zCBAf;lqEb;i1Q
zlX}2+t9f|qN_XIK at g2MX;Pkk-J63$1+3?nib(uRqXlYrJl4-!pg;W~z?S at I2fo*|I
zsyBbx($cbhi(yQu!fWr^XiX%eIuwf5V$b1m83Pw&bTqDomSa1>HJc2Rz06xU=#Fv#
zt8iMo;q^a?A5;CMnjvOWC4K`hDj~hTRYs5vjSB}`zKG#WT7WO$S6gpjjE4{-i6cv2
zuLk_`uvg-zgVE6$GbRUq4w^C$KkgCUVP;p;JIc#8Pw3_EJTCdz<iWideq#DH6MLDs
zG6F%vkxxnUrDL6$hQ+3Nn3;zV>k2IT=u2NU5#l6w{3&V2si+vgPJvzrgc}_*jpXFx
zll^Ei$*J%%AZ3sWS8Js@{gs>;=<C{I)~~?fQx##FUv%z-^;}GLO*qW#>>Ty~P`2f&
zs0vj^OTyebHiU(5^vNvb&axQlz^vLnIJ?~GM1v}8-R)ED93NI5HWNmS-`ByQEX=E`
zC#O{@FDSxx&DfW>FcxCeheHwU=B*YXKA6E>cmW^J!*w~e5o}31v at FV<dCS68;aa?Y
zC>a{6MjeN0qB%81wUN9-eDG8cRXq3RMKcU at p>6g_2?V&dXkW;9(5W^up|icrH?dQ&
z^bu%4_zgohj=ow=xOKL0$i_%3FFVgTzz8iqersb$=N-81e=aZ0gv+seTG9NlD#^k9
z904^peD>{h?7!UCiN1O`4n)@*b6kUv_j_D&Dn9ja9UANxXis%Qz&SYFPTM;gLh2t#
zFBdwrHw*{e92~sQXvZ)fCkbl#h43_K;tD$fes?)WfGmQH<zOA?a!iMxcD3sca-AkX
z9aiM>Gx!b!WY8l{>&*str+c at n{wUY!M&Q?RXo73gUP+HQ9aaPGwzn08^~rK1<IwgN
z!Ou9XN4oRS^NiL;!0F|o?wvrb_cNTBq2StSz10x7q8ktE6DW#0>=w~;`e3X at 2E8%b
z7?Am+TZhA4jwfB^=z=g^4(~XXYscP61LAbLM4cvs_VJDeVK)HB+_Xo#Ow*n9eW<)+
zAk$9U(_Eul?j6Uq9=EzvV0yaLj<vStVe52=t;ebEnqoN5blmyXZW?aR(RtkYRmt7F
zb8J at xUh`a|UftJ4h4s|>Ue-o0FLwsjmjtoCC!+a~v>Gp>{!_rsj<Vi1Fk!rilf|(y
z*X!(0L=m$@pY4zFhD-Qp!HFU-5PlvJ>8kM|^wl*4RO#b~<)HmVf*C;Ec8&iBieC5(
literal 0
HcmV?d00001
diff --git a/c/src/lib/libbsp/i386/virtualpok/make/custom/virtualpok.cfg b/c/src/lib/libbsp/i386/virtualpok/make/custom/virtualpok.cfg
new file mode 100644
index 0000000..a280b9d
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/make/custom/virtualpok.cfg
@@ -0,0 +1,17 @@
+#
+# Configuration file for the "virtualpok" board
+#
+
+include $(RTEMS_ROOT)/make/custom/default.cfg
+
+RTEMS_CPU=i386
+RTEMS_CPU_MODEL=pentium
+
+#CPU_CFLAGS =
+
+# debug info
+CFLAGS_OPTIMIZE_V = -g
+
+# Miscellaneous additions go here
+
+#see pc386/make/custom/ for more information
diff --git a/c/src/lib/libbsp/i386/virtualpok/preinstall.am b/c/src/lib/libbsp/i386/virtualpok/preinstall.am
new file mode 100644
index 0000000..cec113e
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/preinstall.am
@@ -0,0 +1,79 @@
+## Automatically generated by ampolish3 - Do not edit
+
+if AMPOLISH3
+$(srcdir)/preinstall.am: Makefile.am
+ $(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am
+endif
+
+PREINSTALL_DIRS =
+DISTCLEANFILES += $(PREINSTALL_DIRS)
+
+all-local: $(TMPINSTALL_FILES)
+
+TMPINSTALL_FILES =
+CLEANFILES = $(TMPINSTALL_FILES)
+
+all-am: $(PREINSTALL_FILES)
+
+PREINSTALL_FILES =
+CLEANFILES += $(PREINSTALL_FILES)
+
+$(PROJECT_LIB)/$(dirstamp):
+ @$(MKDIR_P) $(PROJECT_LIB)
+ @: > $(PROJECT_LIB)/$(dirstamp)
+PREINSTALL_DIRS += $(PROJECT_LIB)/$(dirstamp)
+
+$(PROJECT_INCLUDE)/$(dirstamp):
+ @$(MKDIR_P) $(PROJECT_INCLUDE)
+ @: > $(PROJECT_INCLUDE)/$(dirstamp)
+PREINSTALL_DIRS += $(PROJECT_INCLUDE)/$(dirstamp)
+
+$(PROJECT_INCLUDE)/bsp/$(dirstamp):
+ @$(MKDIR_P) $(PROJECT_INCLUDE)/bsp
+ @: > $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+PREINSTALL_DIRS += $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+
+$(PROJECT_LIB)/bsp_specs: bsp_specs $(PROJECT_LIB)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_LIB)/bsp_specs
+PREINSTALL_FILES += $(PROJECT_LIB)/bsp_specs
+
+$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h
+
+$(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h
+
+$(PROJECT_INCLUDE)/virtualizationlayerbsp.h: include/virtualizationlayerbsp.h $(PROJECT_INCLUDE)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/virtualizationlayerbsp.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/virtualizationlayerbsp.h
+
+$(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h $(PROJECT_INCLUDE)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h
+
+$(PROJECT_INCLUDE)/bsp/bootcard.h: ../../shared/include/bootcard.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/bootcard.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/bootcard.h
+
+$(PROJECT_INCLUDE)/bsp/irq.h: irq/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h
+
+$(PROJECT_INCLUDE)/bsp/irq-generic.h: ../../shared/include/irq-generic.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-generic.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-generic.h
+
+$(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h
+
+$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
+PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds
+
+$(PROJECT_LIB)/_start.$(OBJEXT): _start.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_LIB)/_start.$(OBJEXT)
+TMPINSTALL_FILES += $(PROJECT_LIB)/_start.$(OBJEXT)
+
diff --git a/c/src/lib/libbsp/i386/virtualpok/start/_start.S b/c/src/lib/libbsp/i386/virtualpok/start/_start.S
new file mode 100644
index 0000000..5048586
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/start/_start.S
@@ -0,0 +1,37 @@
+/*
+ * COPYRIGHT (c) 2013/
+ * Philipp Eppelt.
+ *
+ * Contact: philipp.eppelt at mailbox.tu-dresden.de
+ *
+ * Purpose: Provides GNU entry point and directly go to bootcard.
+ */
+
+#include <rtems/asm.h>
+#include <rtems/score/cpu.h>
+
+
+#ifndef CPU_STACK_ALIGNMENT
+#error "Missing header ? CPU_STACK_ALIGNMENT NOT DEFINED"
+#endif
+
+.set STACK_SIZE, 0x1000
+
+/*----------------------------------------------------------------------------+
+| CODE section
++----------------------------------------------------------------------------*/
+
+BEGIN_CODE
+
+ PUBLIC (start) # GNU default entry point
+
+ EXTERN (boot_card)
+ EXTERN (bsp_reset)
+
+
+SYM (start):
+
+ call SYM (boot_card)
+
+ # TODO when this returns there should be some shut down handling
+ call SYM (bsp_reset)
diff --git a/c/src/lib/libbsp/i386/virtualpok/start/bspgetworkarea.c b/c/src/lib/libbsp/i386/virtualpok/start/bspgetworkarea.c
new file mode 100644
index 0000000..562a8e9
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/start/bspgetworkarea.c
@@ -0,0 +1,102 @@
+/*
+ * This routine is an implementation of the bsp_get_work_area()
+ * that can be used by all BSPs following linkcmds conventions
+ * regarding heap, stack, and workspace allocation.
+ *
+ * COPYRIGHT (c) 1989-2008.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * Copyright (c) 2011 embedded brains GmbH.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+/* #define BSP_GET_WORK_AREA_DEBUG */
+
+#include <bsp.h>
+#include <bsp/bootcard.h>
+#ifdef BSP_GET_WORK_AREA_DEBUG
+ #include <rtems/bspIo.h>
+#endif
+
+
+/*
+ * These are provided by the linkcmds for ALL of the BSPs which use this file.
+ */
+extern char WorkAreaBase[];
+extern char HeapSize[];
+
+extern char ELFBase[];
+extern char textBase[];
+extern char rodataBase[];
+extern char dataBase[];
+
+unsigned long _Global_descriptor_table = 0;
+
+/*
+ * This method returns the base address and size of the area which
+ * is to be allocated between the RTEMS Workspace and the C Program
+ * Heap.
+ */
+void bsp_work_area_initialize( void )
+{
+/* uintptr_t ELF_Base = (uintptr_t) ELFBase;
+ uintptr_t text_Base = (uintptr_t) textBase;
+ uintptr_t rodata_Base = (uintptr_t) rodataBase;
+ uintptr_t data_Base = (uintptr_t) dataBase;
+*/
+ uintptr_t work_base = (uintptr_t) WorkAreaBase;
+ uint32_t work_size = 0x100000 * 4;
+// uint32_t base_addr = 0;
+// uint32_t pok_stack_size = 0;
+
+ // TODO add call to virtlayer to get space
+ bsp_work_area_initialize_default( work_base, work_size );
+/*
+ *work_area_start = (void *) work_base + pok_stack_size;
+ *work_area_size = size - work_base - pok_stack_size;
+ *heap_start = 0;
+ *heap_size = (uintptr_t) HeapSize;
+*/
+ /*
+ * The following may be helpful in debugging what goes wrong when
+ * you are allocating the Work Area in a new BSP.
+ */
+ #ifdef BSP_GET_WORK_AREA_DEBUG
+ {
+ void *sp = __builtin_frame_address(0);
+ void *end = *work_area_start + *work_area_size;
+ printk(
+ "ELFBase = 0x%p\n"
+ "textBase = 0x%p\n"
+ "rodataBase = 0x%p\n"
+ "dataBase = 0x%p\n"
+ "work_area_start (base_addr) = 0x%p\n"
+ "WorkAreaBase = 0x%p\n"
+ "work_area_size = %d 0x%08x\n"
+ "end = 0x%p\n"
+ "heap_start = 0x%p\n"
+ "heap_size = %d\n"
+ "pok stack size = 0x%p\n"
+ "current stack pointer = 0x%p%s\n",
+ ELF_Base,
+ text_Base,
+ rodata_Base,
+ data_Base,
+ *work_area_start,
+ work_base,
+ *work_area_size, /* decimal */
+ *work_area_size, /* hexadecimal */
+ end,
+ *heap_start,
+ *heap_size,
+ pok_stack_size,
+ sp,
+ ((sp >= *work_area_start && sp <= end) ? " OVERLAPS!" : "")
+ );
+ }
+ #endif
+
+}
diff --git a/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c b/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c
new file mode 100644
index 0000000..e787f96
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c
@@ -0,0 +1,41 @@
+/*
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ */
+
+#include <string.h>
+
+#include <bsp.h>
+#include <rtems.h>
+#include <rtems/bspIo.h>
+#include <virtualizationlayerbsp.h>
+
+
+extern void rtems_irq_mngt_init(void);
+
+/*
+ * bsp_start
+ *
+ * This routine does the bulk of the system initialization.
+ */
+void bsp_start( void )
+{
+
+ _BSP_Virtual_Char_write( "Hello RTEMS World\n" );
+
+ // Initialize IRQ management
+ rtems_irq_mngt_init();
+
+ // Register clock driver
+ Clock_driver_install_handler();
+}
diff --git a/c/src/lib/libbsp/i386/virtualpok/startup/linkcmds b/c/src/lib/libbsp/i386/virtualpok/startup/linkcmds
new file mode 100644
index 0000000..88fca23
--- /dev/null
+++ b/c/src/lib/libbsp/i386/virtualpok/startup/linkcmds
@@ -0,0 +1,244 @@
+/*
+ * Copy of default "default linker script, for normal executables"
+ * provided with binutils 2.18 with minor modifications for use
+ * as pc386 linkcmds. These changes include:
+ *
+ * + sections commented out marked with "XXX commented out --joel"
+ * + addition of m_hdr section
+ * + addition of FreeBSD sysctl sections
+ */
+
+/*
+ * XXX commented out --joel
+OUTPUT_FORMAT("elf32-i386", "elf32-i386",
+ "elf32-i386")
+OUTPUT_ARCH(i386)
+*/
+ENTRY(start)
+HeapSize = DEFINED(HeapSize) ? HeapSize :
+ DEFINED(_HeapSize) ? _HeapSize : 0x0;
+RamBase = DEFINED(_RamBase) ? RamBase : 0x0;
+RamSize = DEFINED(RamSize) ? RamSize :
+ DEFINED(_RamSize) ? _RamSize : 0xFFFFFFFF;
+
+SECTIONS
+{
+ . = 0x1000;
+ /* Read-only sections, merged into text segment: */
+/*
+ * XXX commented out --joel
+ PROVIDE (__executable_start = 0x08048000); . = 0x08048000 + SIZEOF_HEADERS;
+*/
+ .interp : { *(.interp) }
+ .note.gnu.build-id : { *(.note.gnu.build-id) }
+ .hash : { *(.hash) }
+ .gnu.hash : { *(.gnu.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .gnu.version : { *(.gnu.version) }
+ .gnu.version_d : { *(.gnu.version_d) }
+ .gnu.version_r : { *(.gnu.version_r) }
+ .rel.init : { *(.rel.init) }
+ .rela.init : { *(.rela.init) }
+ .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
+ .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
+ .rel.fini : { *(.rel.fini) }
+ .rela.fini : { *(.rela.fini) }
+ .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
+ .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
+ .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
+ .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
+ .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
+ .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
+ .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
+ .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
+ .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
+ .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
+ .rel.ctors : { *(.rel.ctors) }
+ .rela.ctors : { *(.rela.ctors) }
+ .rel.dtors : { *(.rel.dtors) }
+ .rela.dtors : { *(.rela.dtors) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
+ .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
+ .rel.plt : { *(.rel.plt) }
+ .rela.plt : { *(.rela.plt) }
+ .plt : { *(.plt) }
+ .text :
+ {
+ *(.m_hdr)
+ *(.text .stub .text.* .gnu.linkonce.t.*)
+ KEEP (*(.text.*personality*))
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ /*
+ * Special FreeBSD sysctl sections.
+ */
+ . = ALIGN (16);
+ __start_set_sysctl_set = .;
+ *(set_sysctl_*);
+ __stop_set_sysctl_set = ABSOLUTE(.);
+ *(set_domain_*);
+ *(set_pseudo_*);
+ _bsd__start_set_modmetadata_set = .;
+ *(_bsd_set_modmetadata_set);
+ _bsd__stop_set_modmetadata_set = .;
+ _bsd__start_set_sysctl_set = .;
+ *(_bsd_set_sysctl_set);
+ _bsd__stop_set_sysctl_set = .;
+ _bsd__start_set_sysinit_set = .;
+ *(_bsd_set_sysinit_*);
+ _bsd__stop_set_sysinit_set = .;
+
+ bsp_section_rodata_end = .;
+
+ } =0x90909090
+
+ .init :
+ {
+ KEEP (*(.init))
+ } =0x90909090
+ .fini :
+ {
+ KEEP (*(.fini))
+ } =0x90909090
+ PROVIDE (__etext = .);
+ PROVIDE (_etext = .);
+ PROVIDE (etext = .);
+ .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
+ .rodata1 : { *(.rodata1) }
+ .eh_frame_hdr : { *(.eh_frame_hdr) }
+ .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
+ .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
+ /* Adjust the address for the data segment. We want to adjust up to
+ the same address within the page on the next page up. */
+ . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
+ /* Exception handling */
+ .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }
+ .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
+ /* Thread Local Storage sections */
+ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
+ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ }
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ }
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(.fini_array))
+ KEEP (*(SORT(.fini_array.*)))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ }
+ .ctors :
+ {
+ /* gcc uses crtbegin.o to find the start of
+ the constructors, so we make sure it is
+ first. Because this is a wildcard, it
+ doesn't matter if the user does not
+ actually link against crtbegin.o; the
+ linker won't look for a file to match a
+ wildcard. The wildcard also means that it
+ doesn't matter which directory crtbegin.o
+ is in. */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*crtbegin?.o(.ctors))
+ /* We don't want to include the .ctor section from
+ the crtend.o file until after the sorted ctors.
+ The .ctor section from the crtend file contains the
+ end of ctors marker and it must be last */
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ }
+ .dtors :
+ {
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*crtbegin?.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ }
+ .jcr : { KEEP (*(.jcr)) }
+ .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
+ .dynamic : { *(.dynamic) }
+ .got : { *(.got) }
+ . = DATA_SEGMENT_RELRO_END (12, .);
+ .got.plt : { *(.got.plt) }
+ .data :
+ {
+ *(.data .data.* .gnu.linkonce.d.*)
+ KEEP (*(.gnu.linkonce.d.*personality*))
+ SORT(CONSTRUCTORS)
+ }
+ .data1 : { *(.data1) }
+ _edata = .; PROVIDE (edata = .);
+ __bss_start = .;
+ .bss :
+ {
+ *(.dynbss)
+ *(.bss .bss.* .gnu.linkonce.b.*)
+ *(COMMON)
+ /* Align here to ensure that the .bss section occupies space up to
+ _end. Align after .bss to ensure correct alignment even if the
+ .bss section disappears because there are no input sections.
+ FIXME: Why do we need it? When there is no .bss section, we don't
+ pad the .data section. */
+ . = ALIGN(. != 0 ? 32 / 8 : 1);
+ }
+ . = ALIGN(32 / 8);
+ . = ALIGN(32 / 8);
+ _end = .; PROVIDE (end = .);
+ . = ALIGN(0x10);
+ WorkAreaBase = .;
+ . = DATA_SEGMENT_END (.);
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3 */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+ /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
+}
--
1.8.1.4
More information about the devel
mailing list