dbstreams004077500017500000000000000000001077620525600125315ustar00jklowdenwheeldbstreams/CVS004077500017500000000000000000001077620526000131575ustar00jklowdenwheeldbstreams/CVS/Repository010066400017500000000000000000341073552746400153420ustar00jklowdenwheelprojects/database/dbstreams dbstreams/CVS/Root010066400017500000000000000000321073552746400141040ustar00jklowdenwheel/usr/local/cvs.repository dbstreams/CVS/Entries010066400017500000000000000002211077620526000145620ustar00jklowdenwheelD/doc//// D/include//// D/src//// D/unittest//// D/app//// /.cvsignore/1.5/Wed Apr 2 03:57:26 2008// /Makefile/1.5/Wed Apr 2 03:57:26 2008// D dbstreams/doc004077500017500000000000000000001077600006700132675ustar00jklowdenwheeldbstreams/doc/CVS004077500017500000000000000000001077600007000137145ustar00jklowdenwheeldbstreams/doc/CVS/Repository010066400017500000000000000000401073552746400161040ustar00jklowdenwheelprojects/database/dbstreams/doc dbstreams/doc/CVS/Root010066400017500000000000000000321073552746400146510ustar00jklowdenwheel/usr/local/cvs.repository dbstreams/doc/CVS/Entries010066400017500000000000000012521077600007000153240ustar00jklowdenwheel/classes.txt/1.1.1.1/Fri Nov 9 04:19:20 2007// /provider_guide.txt/1.2/Mon Nov 19 04:17:15 2007// /states.txt/1.1.1.1/Fri Nov 9 04:19:20 2007// /sgml.gen/1.2/Mon Feb 11 07:54:51 2008// /userguide.dsl/1.1/Mon Feb 11 07:50:12 2008// /.cvsignore/1.6/Sun Feb 24 04:10:49 2008// /userguide.css/1.1/Thu Feb 14 06:00:48 2008// /www.css/1.1/Thu Feb 14 06:00:48 2008// D/htdoc//// /user_guide.txt/1.4/Sat Apr 5 22:21:42 2008// /Makefile/1.8/Sat Apr 5 22:41:59 2008// /absvirt.methods.sgml/1.2/Sat Apr 5 22:41:59 2008// /dbstatus.methods.sgml/1.2/Sat Apr 5 22:41:59 2008// /provider_data.methods.sgml/1.2/Sat Apr 5 22:41:59 2008// /provider_guide.sgml/1.5/Sat Apr 5 22:42:00 2008// D dbstreams/doc/provider_guide.txt010066400017500000000000000317411072020711300171070ustar00jklowdenwheel$Id: provider_guide.txt,v 1.2 2007/11/19 04:17:15 jklowden Exp $ Classes provider/provider_data provider/provider_base provider/sqlite3 provider/dblib This document is intended to help you write a provider for a dbstream. It does not describe any particular provider. Rather, it describes -- prescribes, really -- what a provider must do and be. A provider offers a generic interface to a native database C library. It is a template argument to a dbstream. The stream requires of the provider some typedefs and some functions. State and Error Philosophy The application programmer is better off getting the native library's errors verbatim. He knows what those mean. Attempts to classify them or be otherwise helpful will only tend to obfuscate them. The only non-native errors produced by the provider stem from services it provides (as distinct from those it merely wraps). The main service provided by dbstreams is, if you will, streamification: the representation of the database connection as a stream. The stream has a state and, because the native library of course is unaware of it, it naturally falls to the stream (via the provider) to manage it. Most errors seen by the application will therefore come from the native library. Very few are caught by the dbstream or provider layer. The primary exception is stream state management. The provider supplies status information to the stream via a dbstatus object, or something that has the same interface as dbstatus has. To make that easier to do, the provider itself has a template argument for the status class. That allows the application programmer to extend dbstatus without changing dbstream or any provider. The dbstream object is relatively lightweight, in that it doesn't track the state of the connection, doesn't require that functions be called in a certain order. It just translates the stream operations into calls to the provider. For this reason, the provider may call on the native library to do something stupid, such as fetching rows before opening a connection. If that happens, the least the provider should do, of course, is return the native error. But if the provider is clever enough to detect such logical sequence errors (perhaps with the aid of the native library), it may throw an error. That will help the application programmer find his mistake. Class: provider_data The provider_data class, strictly speaking, is optional. It's handy to derive a provider from it privately, because its contructor initializes the data and most providers need provider_data's members. std::ostream * log( std::ostream *pos ); The log() method sets a log stream for debugging purposes. It returns the prior log stream in case the caller wants to restore it later. It's up to the provider to decide what to put in the log. Class: provider_base The provider_base class is used only by the db-lib provider (for Sybase and Microsoft database servers), known as dblib::provider. It does two things. 1. calls the library's initialization and cleanup functions. 2. routes error messages to the provider. To receive error messages (from the server or the native library), db-lib requires applications to register callback functions. These naturally have C-linkage and know nothing of objects, instances, or "this" pointers. dblib::provider uses static data and functions to register the handlers at construction time. The effect is to route the messages to the STATUS member of a provider instance. When a connection is opened to the server, dblib::provider registers the instance+handle pair in a static map accessible to the callbacks. When the callback is invoked, it looks up the associated instance based on the connection handle. It then invokes the instance's "message" or "error" method. Class: PROVIDER "PROVIDER" here stands for the name of the provider, which may be anything. [It might be worthwhile to have all providers called "provider" in their own namespaces, but we're not there yet.] Typedefs Every native database C library has some kind of connection handle. A provider offers that to the stream as a public HANDLE e.g.: public: typedef ::sqlite3* HANDLE; The stream tests the HANDLE for NULL to determine if it's valid. The provider should iniitialize its HANDLE to NULL and reset it whenever the connection is abandoned. This allows the stream to provide the handle to the application, which can then invoke native library calls not supported by the provider. Return Errors Every native database C library has some way to return an error number and an associated message. The provider puts these in its STATUS object, which both can be queried by the status() method, and is returned (as a const reference) by many functions. When an error occurs, the provider calls STATUS::notify(). The application can override that method (by deriving from dbstatus) and use it to report errors to the user. Set the State It is the provider's responsibility to set the iostate of the stream. The stream's overall state is communicated to the application via the bitmask in dbstatus::state. To the application, the only important question is if the stream is useable and whether results are pending. The application learns the answer by examining the stream's state: goodbit -> OK, no data pending eofbit -> last row of current results read, more pending failbit -> current operation failed, no data pending badbit -> stream is unuseable The end-of-file marker handling differs somewhat from the std::iostream model and bears explication. Recall that when reading a file with std::istream, ios::eofbit is set when the end of the file has been read. Because the operation failed (almost always), failbit is set as well. If tested if() or while(), the ifstream returns false. A query may contain more than one SELECT statement. Some kind of result-separator is required to indicate to the application that the stream has reached the end of one result, and whether or not more are pending. The eofbit status serves this purpose. On reaching the end of one resultset, the provider sets eofbit. It then determines if more data are pending (from a subsequent SELECT statement). If there are pending data, *only* eofbit is set. The combination eofbit + failbit indicates the last row-reading operation failed. It is how the application knows it has reached the end of the data sent by the server. To be precise, there may be no data pending: the next resultset may be empty. Consider this query: select 1 as 'one' select 'a' as 'A' where 0=1 The state sequence will be: goodbit -> got row 1 from resultset 1 eofbit -> end of resultset 1 eofbit+failbit -> end of resultset 2 Queries that return no results (no columns or an empty set) leave the stream in goodbit state. If the query fails, failbit is set and no attempt is made to fetch rows. The application sees this as: if( !db && !db.eof() ) or if( db.error() ) Getting state right is one of the challenges of writing a provider. The consolation is that the challenge, now answered by the provider, is no longer left to the application. Construction and Destruction PROVIDER(); PROVIDER( const std::string& username, const std::string& password ); PROVIDER( const PROVIDER& ); The default constructor does very little, because provider_data initializes most data members. Most providers require a username and password to open a connection to the database. Those that don't can ignore the parameters, but must provide the constructor anyway, in case the application insists on passing them. The copy constructor copies only the authentication information. ~PROVIDER(); The destructor frees any resources and closes the connection. Throws an exception if the native library returns an error. Open and Close const STATUS& open( const std::string& server, const std::string& dbname ); const STATUS& open( const std::string& tablename ); The first form opens a connection to the database. Failure is indicated through the returned object. The second form initiates insertion into a table. void close(); The provider should make every attempt to close the connection successfully. If that is not possible -- say, because a user-defined transaction is uncommitted -- the native libary will almost certainly return an error. If it does, the provider throws its STATUS object. Low-level Access HANDLE handle() const {return pdb;} const std::string& SQL() const { return sql.str(); } The provider offers its native handle for use by the application as a last resort. It can also be very handy to inspect the SQL associated with a particular error, especially when the provider has constructed the SQL from higher-level operations. Execute Queries const STATUS& execute( const dbstreams::query& sql ); The dbstream calls its provider's execute() method whenever a query is inserted. The execute() method may call upon the native library more than once. It stops when it finds that either: 1) the SQL has been completely processed, or 2) the server has returned a resultset. If a resultset is returned, execute() returns the result of next_row(). Fetch Results const STATUS& next_row(); The job of next_row() is simply to make the native library ready to provide data for the next row. The next_row() function need not necessarily read those data. next_row() is called by execute(), to set up the first row. Subsquent calls are generated by the dbstream when the application increments it. After the last row has been fetched, eof is returned. If further data are pending, the next call to next_row returns the first row of the next resultset. On success, next_row() sets the state to goodbit. After the last row is fetched, the state is set to eofbit. If no data are pending -- that was the last row from the last SELECT statement -- failbit is also set. User-recoverable errors are indicated by setting the state to failbit alone. Logical sequence errors -- e.g. calling next_row before execute() -- throw an error. The application should never ask for functions out of order. Metadata int ncolumns() const { return sqlite3_column_count(pstm); } const metadata& meta(int c) const; The provider_data class this member: mutable std::vector row; and cell is: struct cell : public metadata Each element of the row, then, has both data and metadata. The row should be resized, and its metadata set, as soon as the number of columns is known and metadata are available. Insert and Extract const query& insert( metadata::nullitude datum ); const query& insert( const std::string& datum ); const query& insert( const int& datum ); const query& insert( const float& datum ); const query& insert( const double& datum ); const STATUS& send(); The provider defines insert methods for all datatypes it supports. These must include metadata::nullitude because the dbstream uses that to insert NULLs. Each insert operation records the inserted data and increments the "current column" until send() is called. At that point, the provider adds the row to the table by whatever means the native library offers. It updates the STATUS object, increments (on success) the STATUS row counter, and resets the current column to 0. For providers that insert rows via an INSERT statement, the dbquery object has methods that make contructing the SQL and quoting the data easier. Row count is maintained by the provider in the STATUS object. Nonconverting functions const cell& col(const std::string&) const; const cell& col(int c) const; The col() methods populate the row element. The datatype of the cell is determined by the datatype of the column; no conversion is done. Converting functions bool extract(int c, std::string&, size_t& len) const; bool extract(int c, int&, size_t& len) const; bool extract(int c, double&, size_t& len) const; bool extract(int c, char*&, size_t& len) const; bool extract(int c, void*&, size_t& len) const; The extract() methods modify their second argument. Here, the datatype is provided by the function's signature, and data conversion is done, using functions provided by the native library. The len argument and the return code are related. For normal fetches, the len will hold the length of the variable-length string or, for fixed-length datatypes (e.g. int), the value returned by the sizeof() operator. The return code of extract() indicates whether or not the value is NULL: extract returns true -> value is NOT NULL extract returns false -> value is NULL As of this writing, the dbstream discards the return code of extract(), because the only way for an application to discover a column is NULL is through the cell interface (the col() method, invoked via operator[]): bool is_null = db[colname].is_null; Experience suggests that applications seldom request NULL data and anyway can't represent it using built-in types. Only general-purpose tools, such as interactive SQL tools, need to distinguish between zero data and NULL data. Such tools will likely use the cell interface anyway. dbstreams/doc/.cvsignore010066400017500000000000000001461076016711100153410ustar00jklowdenwheel*.bck *.ok *.db .depend lib bin .gdbinit dbcat asof.sgml entities ideas manual.prototyp revision.sgml dbstreams/doc/classes.txt010066400017500000000000000036741071475771000155610ustar00jklowdenwheelCommon Classes ============== These are database-independent classes used by a provider class status : public std::runtime_error operator void*() // for good/bad status void notify() // tell user when error occurs bool is_ok() error code error severity error string os errno servername procedure name line number class login username password class query SQL text result status // return code from stored procedure enum rowtype { NO_ROW, NORMAL_ROW, COMPUTE_ROW, STATUS_ROW }; enum datatype { BINARY, CHAR, DATETIME, FLOAT, INT, NUMERIC, REAL }; struct cell // does not convert, does not allocate ordinal // ith location in row type size is_null union { int, double, char*, void* } Provider Class ============== template // the database's native connection handle // and the status object class provider provider() provider( const provider& ) provider( username, password ) ~provider(): closes const status& open( server, database, tablename ) const status& table( tablename ) cancels any pending query, closes any open table void close(): disconnects from server const status& query( const query& ): submits query to server, closes any open table template const status& insert( T datum ) const status& send() // sends a bcp row rowtype next() // goes to next row /* * get information */ const login& login() const const status& status() const HANDLE handle() const const std::string& tablename() const const query& query() const const cell& cell(datatype t, int c) const // throw on error datatype meta(int c) const int irow() const // row number in current query, or sent int icol() const // col number in current row, fetched or sent int ncol() const // columns in row int iresult() const // resultset counter private: login STATUS status query tablename rowtype bool convert( const cell& input, cell& output ) dbstreams/doc/user_guide.txt010066400017500000000000000631511077577556600162730ustar00jklowdenwheel$Id: user_guide.txt,v 1.4 2008/04/05 22:21:42 jklowden Exp $ This document describes the classes that comprise dbstreams. It is intended to show: * how to use them * how they interact * the role and features of a Provider INTRODUCTION Database as Stream dbstreams is C++ class library modelled on std::iostreams in the C++ standard library. It treats a database connection as a source or sink for data. The basic operations are the same as for iostreams: open, close, read, and write (but not seek). State information similarly borrows from std::ios: a stream has a state word with enumerated values: goodbit, badbit, failbit, eofbit. And the notation is largely the same, with operator<<() and operator>>() serving the purpose of sending data to and reading data from the database. In general, the design mimics iostreams, permitting the same kind of terse, economical code. Databases are similar to but not the same as files. 1. They are not uniform. They vary both by feature set and library API. 2. They are record- rather than byte-oriented. 3. Their output is self-describing, and applications need access to the metadata. 4. They have much more complex error states. Database application programmers who use C will recogize many of these characteristics in the design of ODBC. For example: * ODBC localizes database features in the driver, and seeks to provide a generic interface through the Driver Manager (and ODBC API specification). * ODBC has a nontrivial part of its API devoted to error messages. * ODBC has recordset and cursor operations Similar to a driver, dbstreams has a "provider", where the native C library (usually) API is localized The provider offers a consistent interface to the dbstream layer. It is a template argument to the dbstream class. The stream has record semantics. Manipulators and operators allow the programmer to extract from the stream by column name or number, and to advance to the next record. There are also read() and write() functions designed to interact with any STL container, provided the container's value_type defines read() and write() functions for a dbstream. This pattern is both easy to program and efficient, because only one copy need be made of your data en route to your application. To help the provider handle errors in a consistent way, dbstreams has a dbstatus class, which is a template argument to the provider. (Normally, dbstatus is sufficient, but functionality can be added by extending it.) In addition to the native message and error code, dbstatus holds the file and line number where the error arose. The overall state of the connection can be determined in the same way as for a std::iostream, using methods (e.g. rdstate()) of the same names. Simplicity, not Portability dbstreams do not seek to conceal or homogenize servers. There are no catalog operations. There is no transaction method. No attempt is made to unify various error numbers and messages. (In this way, dbstreams is also like iostreams: I/O is the same, but the content of the I/O differs.) That was a design choice and perhaps merits some explanation. From the programmer's point of view, less is more. The more done to make all servers look alike, the thicker the layer of mediation needed, the less transparent that layer will be. If you depend on the mediation layer to unify error codes and whatnot, you will frequently be disappointed, because the devil is in the details. ODBC is perhaps the best-known database programming API. It is, however, not the only template, nor even the most appropriate one. Besides being defined for a different language, ODBC was designed for closed-source, proprietary drivers. The interface had to be all-encompassing because it was opaque and closed. Later experiences with database interfaces based on source code, especially the Perl DBI/DBD model, require less of the driver than does ODBC. The reader may note that choice hasn't hurt their popularity. If you know your database, abstraction layers interfere with getting at the real information. The dbstreams philosophy is that you know your database, its catalog, its flavor of SQL. In fact, more likely than not, it's the only database you know. Instead of hiding it, then, dbstreams exposes the server's features for you to exploit. Lastly, "it's not portable until it's ported." True portability is hard, and in most environments changing database vendors is extremely hard. dbstreams's goal isn't portability so much as simplicity, because the real problem most programmers face isn't the next database. It's the current one. RATIONALE Many database client libraries -- SQLite, Postgres, MySQL, to name three -- already offer a C++ interface. And some cross-database libraries also exist, notably libodbc++. Why another? Your humble author has looked at a dozen C++ libraries in some detail. None of them embodies the philosophies alluded to above. They are not terse; they do not simplify the programmer's work; they do not hide the complexity of the underlying API. They are verbose and idiosyncratic. They offer C-holdover features, e.g. recordsets, that are better replaced by standard containers. They are too hard to use. At least, they are harder than they need to be. In writing dbstreams, the intention is to make it the last database API you'll ever need to learn. That might not save you from learning another server, but at least you won't have to learn another API. Or, if you're confronted with a database for which there isn't yet a provider, you'll be able to write a provider, because the provider is just an API localization layer, something you'd likely write yourself anyway. Then you can get on with your application. HOW TO USE dbstreams Small Example Let's begin with an example of working code: int main( int argc, char *argv[] ) { DbStream db; // sqlite3 does not accept a "servername" db.open("", "test.db"); query q( "create table T( t int, r real, s varchar(30) );" ); db << q; db.open( "T" ); db << 1 << 1.1 << "one" << endl; db << 2 << 2.2 << "two" << endl; db << null << 3.3 << "three" << endl; db << 4 << 4.4 << "four" << endl; q = "select * from T;"; db << q; for( int r=1; db; r++, db++ ) { clog << r << "\t" << db["t"] << "\t" << db["r"] << "\t" << db["s"] << '\n'; } db.close(); return 0; } Just like a file: open, read/write, close. Queries are executed by inserting a query object into the stream. Data are inserted by inserting data into the stream. Data are extracted by extracting data from the stream. All datatype conversions are handled by the dbstream (via the native library's functions). Errors and end-of-query markers are signalled through the stream status, which can be tested by treating the stream as a boolean. Columns can be accessed by name via operator[], and rows advanced by operator++. A lot happens behind the scenes. Each operator<<, for instance, is a function call that results in a call to the provider. Each time the provider interacts with the database, it checks the return code. Any error information is placed in an error object (dbstatus or derivative), and triggers a call to dbstatus::notify(), whose default behavior is to write the message to std::cerr. The stream's status is set according to the error's severity. Errors, in other words, are made obvious; it takes work to hide them. WHEN TO USE METADATA Unlike a file, tables are of course record-oriented. Each row is a set of columns and each column has both a name and ordinal position. The application is free to access the row in sequential column order, or by name. One of example of fetch-by-name is illustrated above, but truth be told that use of operator[] is special: it works only when writing a dbstream to an iostream (more on which later). The more typical way to access a row by column name is with a manipulator: dbstream::c (for "column"). With a dbstream, you read into your variables this way: db >> c("col1") >> var1 >> c("col2") >> var2; db++; // go to next row and write them this way: db << c("col1") << var1 << c("col2") << var2 << endl; Inserts and extractions are somewhat asymetrical. An application is usually more tightly tied to tables into which it inserts row. After all, it's *providing* the data. And although there may be NULLs and defaults, insertions typically require that each column has a value. In practice, your author finds it is normally simpler to make insertions into the stream in column order, according to the table being populated. Extractions from the stream typically use a column name. The manipulator is *always* optional. It simply sets the "next" column to be extracted/inserted. You can extract from the stream just as you would a file: db >> i >> r >> s; and that works. You'll just need to be sure you control the table. COMPLETE EXAMPLE Below is a complete program. It first creates a table and inserts some rows. Then it reads those rows into a std::deque and writes them out again. To make stream<->container operations easy, some small work is required: the structure that represents a row must have functions defined that read (and write) the structure from (and to) the stream. dbstream::read calls example_row::read until the stream sets failbit. dbstream::write calls example_row::write for each element in the container. #define SQLITE_STREAM #include #include #include #include #include using namespace std; using namespace dbstreams; class example_row { int i; double d; std::string s; public: template OS& read( OS& os ) { os >> c("t") >> i >> c("r") >> d >> c("s") >> s; return os; } template OS& write( OS& os ) const { os << i << d << s << endl; return os; } }; int main( int argc, char *argv[] ) { DbStream db; try { // sqlite3 does not accept a "servername" db.open("", "test.db"); query q( "create table T( t int, r real, s varchar(30) );" ); db << q; if( !db ) { throw db.status(); } db.open( "T" ); db << 1 << 1.1 << "one" << endl; db << 2 << 2.2 << "two" << endl; db << null << 3.3 << "three" << endl; db << 4 << 4.4 << "four" << endl; // filling a container std::deque rowset; q = "select * from T;"; db << q; if( !db ) { throw db.status(); } db.read( rowset ); // writing container db.open("T"); db.write( rowset ); if( !db ) { throw db.status(); } db.close(); } catch( const dbstatus& oops ) { cerr << argv[0] << ": " << oops << endl; return 1; } catch( const std::exception& oops ) { cerr << "exception: " << argv[0] << ": " << oops.what() << endl; return 2; } return 0; } Container Philosophy C libraries and those closely related typically define a recordset object of some kind, a container-of-containers, where is row is represented by a container of "typeless" elements that can then be converted to something useful. That was necessary (or helpful, anyway) in C, where there is no standard container class. C++ has standard containers. By defining the container<->stream interaction directly, we obviate any need for a recordset. Poof! One aspect of library (and application) complexity disappears. Exception Philosophy As of this writing, exceptions are thrown when 1. the underlying library is used in an invalid way, or 2. the underlying connection becomes unusable. An example of "in an invalid way" would be trying to insert data before opening the connection. A connection is "unusable" when the library says so, as in when the remote server is no longer listening to it. The first kind of error is in the "shouldn't happen" category. The dbstream<->provider interface is well defined, and a correctly designed provider should never use the underlying libary in an invalid way, no matter what the application requests. By making such cases noisy, one hopes the error can be found and fixed. The second kind of error is "unrecoverable". The stream must be closed; nothing good can come from trying to continue using it. By putting the interaction in a try/catch block, control naturally returns to the top level, where it belongs. "Normal" errors -- using the wrong table or column name, say -- do not throw exceptions. The operation fails and dbstatus::notify() is called, but the stream is still valid. It can accept a new query; in some cases, it can continue with the next logical insert/extract operation. The application can monitor the stream's status, and can override dbstatus::notify() as desired. CLASS PROSE This section describes the dbstream classes. It's meant as an introduction, not a reference manual, more of a what-and-why than a how-to. Detailed descriptions can be found in the reference manual. (TODO: write reference manual.) We begin with the helper classes because they're part of a dbstream, end with dbstream itself. Class: query The fundamental reason for the existence of the query object is to allow the dbstream to distinquish an inserted query from ordinary data. A query object is basically a std::string. You can assign a std::string to it. The operator<<(const std::string&) is also supported because it makes query building easier. The query class provides some primitive portability assistance features. Some dialects of SQL require a semicolon as a statement terminator; others don't. You can tell the query object to remove or add a terminator when the SQL is inserted into it. The catch is that the terminator must be at the end of the inserted string, plus optional whitespace. dbstreams has as of this writing no direct support for parameterized queries, also known as placeholders. If they were added, the query object would be the place to begin. The same could be said for asynchronous executions. Class: login A login object holds user credentials, whatever that might mean. When one dbstream is copied to another, its credentials are what's actually copied. Class: metadata As soon as the query is executed -- that is, after the query object is inserted into the dbstream -- the first row of results is available. The provider gathers the metadata of each column: name, number, type, size, and nullability. Class: cell A cell is an intermediate object, seldom used by applications. It is used when there's a need to hold a typeless value, normally something returned from the database whose destination (and hence type) is not yet known. Operators are defined to assign/extract the value to/from built-in types. Because the cell class is derived from the metadata class, a cell knows its name, ordinal position in the row, and datatype. A cell does not convert from one type to another. If an integer is assigned to it and a string is read, the result is an exception. [TODO: throw exceptions.] Class: dbstatus dbstatus is quite complicated. It's rarely examined directly, but it's returned by many dbstream operations. Because lots of status information orginates within the provider, the provider's status object -- typically dbstatus or a derivative -- is a template argument to the provider. For example, for the SQLite provider: template class SQLite : private provider_data dbstatus is actually what's tested in contructs such as if( db ) which amounts to something like if( dbstream< P >::P::dbstatus::operator void*() ) although it's quite a bit less typing. Stream State enum iostate { goodbit, badbit, eofbit, failbit = 4 }; bool good() const; bool bad() const; bool fail() const; bool eof() const; iostate rdstate(); iostate setstate( iostate state ); iostate clear( iostate state = goodbit ); dbstatus defines the state status bits and the functions that get/set them. It is modelled on std::ios and uses the same names for the status bits and functions. If you know those, you're good to go. If you don't they're good to know. One of the challenges of the library writer is to make things as simple as possible, but no simpler. It's one thing to say "a database is like a file"; it's something else to reduce a connection's states to those of a stream. It's not easy but it *is* possible. It's also one of the reasons dbstreams is easy to use. Besides state, dbstatus holds the native error number and message when an error occurs. The provider may also choose to include the file and line number where the error occurred, especially helpful for exceptions. Oh, and dbstatus is sometimes thrown, as you can see from the above example. The dbstatus class has two functions for managing messages from the server. 1. notify(). This is called whenever a server delivers an error message, before any associated data are delivered. The default action is to write the message to std::cerr. It can of course be overridden by deriving a new class. 2. quit(). Nominally, this is called by the provider to determine whether or not to proceed with the current operation. So far, it hasn't been needed. Class: dbstream template class dbstream : private dbstream_data Construction and Destruction dbstream(); dbstream( const dbstream& that ); dbstream( const std::string& username, const std::string& password ); Like a std::iostream, there's a default constructor. It's initialized to dbstatus::goodbit because that's how iostreams work. There are differences, too. One constructor accepts a username and password that will be used when opening connections.And the copy constructor has defined behavior: the login credentials are copied, and a new connection is formed to the same server and database. There is no constructor that takes a servername because it's too confusing. Forming a connection can take up to four strings: username, password, servername, database. There's no logical order to them and no way for the contructor to distinquish among them by type. So we limit construction to authentication and relegate database information to the open() methods. ~dbstream(); The destructor frees any resources and closes the connection. May throw an exception if the provider detects an error from the native library. Open and Close const dbstatus& open( const std::string& server, const std::string& dbname, const std::string& tablename = std::string() ); const dbstatus& open( const std::string& tablename ); In the first form, a connection is formed to the database. The returned dbstatus object should be tested before proceeding; it will not throw an error. The optional tablename argument opens a table by calling the second form. The second form "opens a table", meaning it readies the stream to write data to the table via the operator<<() and write() methods. void close(); As with an iostream, no error is returned. If the provider detects a "can't happen" condition, it may throw an exception. This guards against silently discarding data in an open transaction, and encourages discovery of such impossible situations. Stream Status const dbstatus& status() const; operator const void*() const; bool eof() const; bool error() const; If desired, the stream's provider's status object -- normally dbstatus or a derivation -- can be retrieved and dealt with explicitly. Normally, that's not necessary except to handle errors. For go/no-go decisions, the question is whether or not the stream has more data available for extraction. For that purpose, if( db ) and if( db.eof() ) normally suffice. The eof() test departs slightly from iostreams to support record-oriented operations. A query may produce several result sets, and an application wants to distinguish between them. A dbstream signals the end of a resultset with dbstatus::eofbit but *not* failbit. failbit is set only if there are no data pending, no further results to be read. As with std::iostream, the void* operator (a fancy boolean) tests failbit. An iostream will set both eofbit and failbit whenever end-of-file is reached. A dbstream, in contrast, will exhibit "transient" eof status as each resultset is read. failbit is not set until the last row of the last resultset has been read. The loop pattern changes slightly for dbstreams. For an iostream, one might say: iostream Pattern ifstream is("f"); while( is ) { int i; is >> i; cout << i << endl; } whereas a dbstream needs two loops and checks for eof: dbstream Pattern db.open("server", "database"); query sql("select * from A; select * from B;"); for ( db << sql; db; db++ ) { for( ; ! db.eof(); db++ ) { int i; db >> i; cout << i << endl; } } In the real world, there would obviously be different things to do depending on which resultset was being read. Note that operator++ is called at the end of each loop. This is a deliberate choice, to simplify the caller's life. The sequence is: next, row N-1, good next, row N, good next, row N+1, eof // next results pending next, row 1, good // start of next result ... next, row N, good next, row N+1, eof + fail // no more results If the stream were not incremented in the outer loop, something else would have to clear the eof condition, else the inner loop would never fetch the second resultset. Incrementing seemed the most natural way. std::ostream* log( std::ostream * pos ); For debugging purposes, the application may open a std::iostream and pass it to the dbstream for logging. What appears in the log is up to the provider. Normally the log output is not interesting to the application programmer, but it can be very helpful to the provider author. Execute Queries The query object was discussed above. Execution is simply a matter of inserting the query into the stream. Metadata const metadata& meta(int c) const; int columns() const; int rows() const; Metadata are available immediately after executing a query. If a resultset was produced, the column count is also immediately available. (For most providers, this is true even if the resultset has no rows). As each row is fetched (or sent) the row counter is updated by the provider. The application can keep count itself, of course, and it can also interrogate the counter with the row() method. Insert and Extract template dbstream& operator<<( const D& datum ); Insertion, as described earlier, directly mimics iostreams. There is even a dbstream manipulator, dbstreams::endl, to signal end-of-row . Different providers have different capabilities. Some providers build an INSERT statement from the insertion sequence. Others have ways to accept data other than via SQL, ways that can be faster. Sybase, for example, has a bulk-copy mode that lets the client send the server data in much the same way the server sends the client data. For providers with such a feature, there is another manipulator, eob, to signify end-of-batch. struct c { std::string colname; c( const std::string& colname ); }; dbstream& operator>>( const dbstreams::c& c ); template dbstream& operator>>( D& datum ); Data can be read from a row in column order, just as with any stream. The c structure, when "extracted" to, simply sets the streams's current column number according to the struct's colname. In that way: db >> c("phone") >> phone; sets the "curent" column (db::icol) to N, where N is the column whose name is "phone". That operation returns a reference to the stream. Next the stream is extracted into the variable 'phone'. The stream uses its current column number, still N. N is incremented after the extraction. const cell& operator[]( const std::string& name ) { return provider.col(name); } const cell& operator[]( int icol ) { return provider.col(icol); } Once upon a time, dbstreams permitted a now-discarded pattern: int i = db["value"]; // no longer valid It turns out that this isn't such a great idea. Overloading operator= is impossible for built-in types. The only alternative is user-defined conversions. If you dig, or dig into, the type-matching rules for function calls, you'll understand that a user-defined conversion a to built-in type has a lot of drawbacks. Basically, it can be sneaky. So that pattern was discarded. The operator[] was kept because it can be handy for non-built-in types, in particular for use with iostreams. The operator[] returns a cell, and operations are defined for inserting a cell into a std::istream. This is convenient and safe, so it was kept as a feature. Read and Write class a_container { public: template OS& read( OS& os ); template OS& write( OS& os ); }; template dbstream& read( CONTAINER& container ); To read a value requires an operator, but to read a whole resultset requires a function. And a place to put the data. dbstream::read requires a standard STL container (or something very similar). It calls the elements's read() method repeatedly, incrementing the stream each time, until eof. It is up to the container's element class to define what is to be done with the stream, i.e. which columns to assign to which member variables. template dbstream& write( CONTAINER& container ); dbstream::write has the same standard STL container requirements. It iterates over the container, calling the element's write() method for each one. If dbstream::write encounters a stream error, it throws a std::runtime_error exception. Observe: the loops are already written for you. You don't declare iterators, worry about off-by-one errors, dereference pointers, nothing. Just define how your container elements read and write themselves to a dbstream, and call the appropriate dbstream function. What could be easier? dbstreams/doc/states.txt010066400017500000000000000021021071475771000154100ustar00jklowdenwheelnormal success -> dbstatus::goodbit normal error -> dbstatus::failbit connection unusable -> dbstatus::badbit query + results -> dbstatus::goodbit query + no results -> dbstatus::goodbit fetched row success -> dbstatus::goodbit fetched row failure -> dbstatus::failbit fetched row N of N -> dbstatus::goodbit fetched row N+1 of N, more results follow -> dbstatus::eofbit fetched row N+1 of N, no results follow -> dbstatus::eofbit | dbstatus::failbit Like a std::iostream, the default contructor has dbstatus::goodbit set. A dbstream with eofbit and/or failbit set is nevertheless prepared to accept a query as input. Rationale: the fact that we have extracted the last value from the stream doesn't impede a stream's ability to accept data. Execution of a query resets the stream's status to goodbit. Subsequent row retrieval can set eofbit and failbit. Queries that produce no results leave the stream in goodbit state. open() resets the status if successful. It's possible to open a stream with badbit state, but not to send it queries. (TODO: not implemented.) dbstreams/doc/user_guide.txt.bck010060000017500000000000000631541073660567400170070ustar00jklowdenwheel$Id: user_guide.txt,v 1.3 2007/12/29 20:20:47 jklowden Exp $ This document describes the classes that comprise dbstreams. It is intended to show: * how to use them * how they interact * the role and features of a Provider INTRODUCTION Database as Stream dbstreams is C++ class library modelled on std::iostreams in the C++ standard library. It treats a database connection as a source or sink for data. The basic operations are the same as for iostreams: open, close, read, and write (but not seek). State information similarly borrows from std::ios: a stream has a state word with enumerated values: goodbit, badbit, failbit, eofbit. And the notation is largely the same, with operator<<() and operator>>() serving the purpose of sending data to and reading data from the database. In general, the design mimics iostreams, permitting the same kind of terse, economical code. Databases are similar to but not the same as files. 1. They are not uniform. They vary both by feature set and library API. 2. They are record- rather than byte-oriented. 3. Their output is self-describing, and applications need access to the metadata. 4. They have much more complex error states. Database application programmers who use C will recogize many of these characteristics in the design of ODBC. For example: * ODBC localizes database features in the driver, and seeks to provide a generic interface through the Driver Manager (and ODBC API specification). * ODBC has a nontrivial part of its API devoted to error messages. * ODBC has recordset and cursor operations Similar to a driver, dbstreams has a "provider", where the native C library (usually) API is localized The provider offers a consistent interface to the dbstream layer. It is a template argument to the dbstream class. The stream has record semantics. Manipulators and operators allow the programmer to extract from the stream by column name or number, and to advance to the next record. There are also read() and write() functions designed to interact with any STL container, provided the container's value_type defines read() and write() functions for a dbstream. This pattern is both easy to program and efficient, because only one copy need be made of your data en route to your application. To help the provider handle errors in a consistent way, dbstreams has a dbstatus class, which is a template argument to the provider. (Normally, dbstatus is sufficient, but functionality can be added by extending it.) In addition to the native message and error code, dbstatus holds the file and line number where the error arose. The overall state of the connection can be determined in the same way as for a std::iostream, using methods (e.g. rdstate()) of the same names. Simplicity, not Portability dbstreams do not seek to conceal or homogenize servers. There are no catalog operations. There is no transaction method. No attempt is made to unify various error numbers and messages. (In this way, dbstreams is also like iostreams: I/O is the same, but the content of the I/O differs.) That was a design choice and perhaps merits some explanation. From the programmer's point of view, less is more. The more done to make all servers look alike, the thicker the layer of mediation needed, the less transparent that layer will be. If you depend on the mediation layer to unify error codes and whatnot, you will frequently be disappointed, because the devil is in the details. ODBC is perhaps the best-known database programming API. It is, however, not the only template, nor even the most appropriate one. Besides being defined for a different language, ODBC was designed for closed-source, proprietary drivers. The interface had to be all-encompassing because it was opaque and closed. Later experiences with database interfaces based on source code, especially the Perl DBI/DBD model, require less of the driver than does ODBC. The reader may note that choice hasn't hurt their popularity. If you know your database, abstraction layers interfere with getting at the real information. The dbstreams philosophy is that you know your database, its catalog, its flavor of SQL. In fact, more likely than not, it's the only database you know. Instead of hiding it, then, dbstreams exposes the server's features for you to exploit. Lastly, "it's not portable until it's ported." True portability is hard, and in most environments changing database vendors is extremely hard. dbstreams's goal isn't portability so much as simplicity, because the real problem most programmers face isn't the next database. It's the current one. RATIONALE Many database client libraries -- SQLite, Postgres, MySQL, to name three -- already offer a C++ interface. And some cross-database libraries also exist, notably libodbc++. Why another? Your humble author has looked at a dozen C++ libraries in some detail. None of them embodies the philosophies alluded to above. They are not terse; they do not simplify the programmer's work; they do not hide the complexity of the underlying API. They are verbose and idiosyncratic. They offer C-holdover features, e.g. recordsets, that are better replaced by standard containers. They are too hard to use. At least, they are harder than they need to be. In writing dbstreams, the intention is to make it the last database API you'll ever need to learn. That might not save you from learning another server, but at least you won't have to learn another API. Or, if you're confronted with a database for which there isn't yet a provider, you'll be able to write a provider, because the provider is just an API localization layer, something you'd likely write yourself anyway. Then you can get on with your application. HOW TO USE dbstreams Small Example Let's begin with an example of working code: int main( int argc, char *argv[] ) { DbStream db; // sqlite3 does not accept a "servername" db.open("", "test.db"); query q( "create table T( t int, r real, s varchar(30) );" ); db << q; db.open( "T" ); db << 1 << 1.1 << "one" << endl; db << 2 << 2.2 << "two" << endl; db << null << 3.3 << "three" << endl; db << 4 << 4.4 << "four" << endl; q = "select * from T;"; db << q; for( int r=1; db; r++, db++ ) { clog << r << "\t" << db["t"] << "\t" << db["r"] << "\t" << db["s"] << '\n'; } db.close(); return 0; } Just like a file: open, read/write, close. Queries are executed by inserting a query object into the stream. Data are inserted by inserting data into the stream. Data are extracted by extracting data from the stream. All datatype conversions are handled by the dbstream (via the native library's functions). Errors and end-of-query markers are signalled through the stream status, which can be tested by treating the stream as a boolean. Columns can be accessed by name via operator[], and rows advanced by operator++. A lot happens behind the scenes. Each operator<<, for instance, is a function call that results in a call to the provider. Each time the provider interacts with the database, it checks the return code. Any error information is placed in an error object (dbstatus or derivative), and triggers a call to dbstatus::notify(), whose default behavior is to write the message to std::cerr. The stream's status is set according to the error's severity. Errors, in other words, are made obvious; it takes work to hide them. WHEN TO USE METADATA Unlike a file, tables are of course record-oriented. Each row is a set of columns and each column has both a name and ordinal position. The application is free to access the row in sequential column order, or by name. One of example of fetch-by-name is illustrated above, but truth be told that use of operator[] is special: it works only when writing a dbstream to an iostream (more on which later). The more typical way to access a row by column name is with a manipulator: dbstream::c (for "column"). With a dbstream, you read into your variables this way: db >> c("col1") >> var1 >> c("col2") >> var2; db++; // go to next row and write them this way: db << c("col1") << var1 << c("col2") << var2 << endl; Inserts and extractions are somewhat asymetrical. An application is usually more tightly tied to tables into which it inserts row. After all, it's *providing* the data. And although there may be NULLs and defaults, insertions typically require that each column has a value. In practice, your author finds it is normally simpler to make insertions into the stream in column order, according to the table being populated. Extractions from the stream typically use a column name. The manipulator is *always* optional. It simply sets the "next" column to be extracted/inserted. You can extract from the stream just as you would a file: db >> i >> r >> s; and that works. You'll just need to be sure you control the table. COMPLETE EXAMPLE Below is a complete program. It first creates a table and inserts some rows. Then it reads those rows into a std::deque and writes them out again. To make stream<->container operations easy, some small work is required: the structure that represents a row must have functions defined that read (and write) the structure from (and to) the stream. dbstream::read calls example_row::read until the stream sets failbit. dbstream::write calls example_row::write for each element in the container. #define SQLITE_STREAM #include #include #include #include #include using namespace std; using namespace dbstreams; class example_row { int i; double d; std::string s; public: template OS& read( OS& os ) { os >> c("t") >> i >> c("r") >> d >> c("s") >> s; return os; } template OS& write( OS& os ) const { os << i << d << s << endl; return os; } }; int main( int argc, char *argv[] ) { DbStream db; try { // sqlite3 does not accept a "servername" db.open("", "test.db"); query q( "create table T( t int, r real, s varchar(30) );" ); db << q; if( !db ) { throw db.status(); } db.open( "T" ); db << 1 << 1.1 << "one" << endl; db << 2 << 2.2 << "two" << endl; db << null << 3.3 << "three" << endl; db << 4 << 4.4 << "four" << endl; // filling a container std::deque rowset; q = "select * from T;"; db << q; if( !db ) { throw db.status(); } db.read( rowset ); // writing container db.open("T"); db.write( rowset ); if( !db ) { throw db.status(); } db.close(); } catch( const dbstatus& oops ) { cerr << argv[0] << ": " << oops << endl; return 1; } catch( const std::exception& oops ) { cerr << "exception: " << argv[0] << ": " << oops.what() << endl; return 2; } return 0; } Container Philosophy C libraries and those closely related typically define a recordset object of some kind, a container-of-containers, where is row is represented by a container of "typeless" elements that can then be converted to something useful. That was necessary (or helpful, anyway) in C, where there is no standard container class. C++ has standard containers. By defining the container<->stream interaction directly, we obviate any need for a recordset. Poof! One aspect of library (and application) complexity disappears. Exception Philosophy As of this writing, exceptions are thrown when 1. the underlying library is used in an invalid way, or 2. the underlying connection becomes unusable. An example of "in an invalid way" would be trying to insert data before opening the connection. A connection is "unusable" when the library says so, as in when the remote server is no longer listening to it. The first kind of error is in the "shouldn't happen" category. The dbstream<->provider interface is well defined, and a correctly designed provider should never use the underlying libary in an invalid way, no matter what the application requests. By making such cases noisy, one hopes the error can be found and fixed. The second kind of error is "unrecoverable". The stream must be closed; nothing good can come from trying to continue using it. By putting the interaction in a try/catch block, control naturally returns to the top level, where it belongs. "Normal" errors -- using the wrong table or column name, say -- do not throw exceptions. The operation fails and dbstatus::notify() is called, but the stream is still valid. It can accept a new query; in some cases, it can continue with the next logical insert/extract operation. The application can monitor the stream's status, and can override dbstatus::notify() as desired. CLASS PROSE This section describes the dbstream classes. It's meant as an in introduction, not a reference manual, more of a what-and-why than a how-to. Detailed descriptions can be found in the reference manual. (TODO: write reference manual.) We begin with the helper classes because they're part of a dbstream, end with dbstream itself. Class: query The fundamental reason for the existence of the query object is to allow the dbstream to distinquish an inserted query from ordinary data. A query object is basically a std::string. You can assign a std::string to it. The operator<<(const std::string&) is also supported because it makes query building easier. The query class provides some primitive portability assistance features. Some dialects of SQL require a semicolon as a statement terminator; others don't. You can tell the query object to remove or add a terminator when the SQL is inserted into it. The catch is that the terminator must be at the end of the inserted string, plus optional whitespace. dbstreams has as of this writing no direct support for parameterized queries, also known as placeholders. If they were added, the query object would be the place to begin. The same could be said for asynchronous executions. Class: login A login object holds user credentials, whatever that might mean. When one dbstream is copied to another, its credentials are what's actually copied. Class: metadata As soon as the query is executed -- that is, after the query object is inserted into the dbstream -- the first row of results is available. The provider gathers the metadata of each column: name, number, type, size, and nullability. Class: cell A cell is an intermediate object, seldom used by applications. It is used when there's a need to hold a typeless value, normally something returned from the database whose destination (and hence type) is not yet known. Operators are defined to assign/extract the value to/from built-in types. Because the cell class is derived from the metadata class, a cell knows its name, ordinal position in the row, and datatype. A cell does not convert from one type to another. If an integer is assigned to it and a string is read, the result is an exception. [TODO: throw exceptions.] Class: dbstatus dbstatus is quite complicated. It's rarely examined directly, but it's returned by many dbstream operations. Because lots of status information orginates within the provider, the provider's status object -- typically dbstatus or a derivative -- is a template argument to the provider. For example, for the SQLite provider: template class SQLite : private provider_data dbstatus is actually what's tested in contructs such as if( db ) which amounts to something like if( dbstream< P >::P::dbstatus::operator void*() ) although it's quite a bit less typing. Stream State enum iostate { goodbit, badbit, eofbit, failbit = 4 }; bool good() const; bool bad() const; bool fail() const; bool eof() const; iostate rdstate(); iostate setstate( iostate state ); iostate clear( iostate state = goodbit ); dbstatus defines the state status bits and the functions that get/set them. It is modelled on std::ios and uses the same names for the status bits and functions. If you know those, you're good to go. If you don't they're good to know. One of the challenges of the library writer is to make things as simple as possible, but no simpler. It's one thing to say "a database is like a file"; it's something else to reduce a connection's states to those of a stream. It's not easy but it *is* possible. It's also one of the reasons dbstreams is easy to use. Besides state, dbstatus holds the native error number and message when an error occurs. The provider may also choose to include the file and line number where the error occurred, especially helpful for exceptions. Oh, and dbstatus is sometimes thrown, as you can see from the above example. The dbstatus class has two functions for managing messages from the server. 1. notify(). This is called whenever a server delivers an error message, before any associated data are delivered. The default action is to write the message to std::cerr. It can of course be overridden by deriving a new class. 2. quit(). Nominally, this is called by the provider to determine whether or not to proceed with the current operation. So far, it hasn't been needed. Class: dbstream template class dbstream : private dbstream_data Construction and Destruction dbstream(); dbstream( const dbstream& that ); dbstream( const std::string& username, const std::string& password ); Like a std::iostream, there's a default constructor. It's initialized to dbstatus::goodbit because that's how iostreams work. There are differences, too. One constructor accepts a username and password that will be used when opening connections.And the copy constructor has defined behavior: the login credentials are copied, and a new connection is formed to the same server and database. There is no constructor that takes a servername because it's too confusing. Forming a connection can take up to four strings: username, password, servername, database. There's no logical order to them and no way for the contructor to distinquish among them by type. So we limit construction to authentication and relegate database information to the open() methods. ~dbstream(); The destructor frees any resources and closes the connection. May throw an exception if the provider detects an error from the native library. Open and Close const dbstatus& open( const std::string& server, const std::string& dbname, const std::string& tablename = std::string() ); const dbstatus& open( const std::string& tablename ); In the first form, a connection is formed to the database. The returned dbstatus object should be tested before proceeding; it will not throw an error. The optional tablename argument opens a table by calling the second form. The second form "opens a table", meaning it readies the stream to write data to the table via the operator<<() and write() methods. void close(); As with an iostream, no error is returned. If the provider detects a "can't happen" condition, it may throw an exception. This guards against silently discarding data in an open transaction, and encourages discovery of such impossible situations. Stream Status const dbstatus& status() const; operator const void*() const; bool eof() const; bool error() const; If desired, the stream's provider's status object -- normally dbstatus or a derivation -- can be retrieved and dealt with explicitly. Normally, that's not necessary except to handle errors. For go/no-go decisions, the question is whether or not the stream has more data available for extraction. For that purpose, if( db ) and if( db.eof() ) normally suffice. The eof() test departs slightly from iostreams to support record-oriented operations. A query may produce several result sets, and an application wants to distinguish between them. A dbstream signals the end of a resultset with dbstatus::eofbit but *not* failbit. failbit is set only if there are no data pending, no further results to be read. As with std::iostream, the void* operator (a fancy boolean) tests failbit. An iostream will set both eofbit and failbit whenever end-of-file is reached. A dbstream, in contrast, will exhibit "transient" eof status as each resultset is read. failbit is not set until the last row of the last resultset has been read. The loop pattern changes slightly for dbstreams. For an iostream, one might say: iostream Pattern ifstream is("f"); while( is ) { int i; is >> i; cout << i << endl; } whereas a dbstream needs two loops and checks for eof: dbstream Pattern db.open("server", "database"); query sql("select * from A; select * from B;"); for ( db << sql; db; db++ ) { for( ; ! db.eof(); db++ ) { int i; db >> i; cout << i << endl; } } In the real world, there would obviously be different things to do depending on which resultset was being read. Note that operator++ is called at the end of each loop. This is a deliberate choice, to simplify the caller's life. The sequence is: next, row N-1, good next, row N, good next, row N+1, eof // next results pending next, row 1, good // start of next result ... next, row N, good next, row N+1, eof + fail // no more results If the stream were not incremented in the outer loop, something else would have to clear the eof condition, else the inner loop would never fetch the second resultset. Incrementing seemed the most natural way. std::ostream* log( std::ostream * pos ); For debugging purposes, the application may open a std::iostream and pass it to the dbstream for logging. What appears in the log is up to the provider. Normally the log output is not interesting to the application programmer, but it can be very helpful to the provider author. Execute Queries The query object was discussed above. Execution is simply a matter of inserting the query into the stream. Metadata const metadata& meta(int c) const; int columns() const; int rows() const; Metadata are available immediately after executing a query. If a resultset was produced, the column count is also immediately available. (For most providers, this is true even if the resultset has no rows). As each row is fetched (or sent) the row counter is updated by the provider. The application can keep count itself, of course, and it can also interrogate the counter with the row() method. Insert and Extract template dbstream& operator<<( const D& datum ); Insertion, as described earlier, directly mimics iostreams. There is even a dbstream manipulator, dbstreams::endl, to signal end-of-row . Different providers have different capabilities. Some providers build an INSERT statement from the insertion sequence. Others have ways to accept data other than via SQL, ways that can be faster. Sybase, for example, has a bulk-copy mode that lets the client send the server data in much the same way the server sends the client data. For providers with such a feature, there is another manipulator, eob, to signify end-of-batch. struct c { std::string colname; c( const std::string& colname ); }; dbstream& operator>>( const dbstreams::c& c ); template dbstream& operator>>( D& datum ); Data can be read from a row in column order, just as with any stream. The c structure, when "extracted" to, simply sets the streams's current column number according to the struct's colname. In that way: db >> c("phone") >> phone; sets the "curent" column (db::icol) to N, where N is the column whose name is "phone". That operation returns a reference to the stream. Next the stream is extracted into the variable 'phone'. The stream uses its current column number, still N. N is incremented after the extraction. const cell& operator[]( const std::string& name ) { return provider.col(name); } const cell& operator[]( int icol ) { return provider.col(icol); } Once upon a time, dbstreams permitted a now-discarded pattern: int i = db["value"]; // no longer valid It turns out that this isn't such a great idea. Overloading operator= is impossible for built-in types. The only alternative is user-defined conversions. If you dig, or dig into, the type-matching rules for function calls, you'll understand that a user-defined conversion a to built-in type has a lot of drawbacks. Basically, it can be sneaky. So that pattern was discarded. The operator[] was kept because it can be handy for non-built-in types, in particular for use with iostreams. The operator[] returns a cell, and operations are defined for inserting a cell into a std::istream. This is convenient and safe, so it was kept as a feature. Read and Write class a_container { public: template OS& read( OS& os ); template OS& write( OS& os ); }; template dbstream& read( CONTAINER& container ); To read a value requires an operator, but to read a whole resultset requires a function. And a place to put the data. dbstream::read requires a standard STL container (or something very similar). It calls the elements's read() method repeatedly, incrementing the stream each time, until eof. It is up to the container's element class to define what is to be done with the stream, i.e. which columns to assign to which member variables. template dbstream& write( CONTAINER& container ); dbstream::write has the same standard STL container requirements. It iterates over the container, calling the element's write() method for each one. If dbstream::write encounters a stream error, it throws a std::runtime_error exception. Observe: the loops are already written for you. You don't declare iterators, worry about off-by-one errors, dereference pointers, nothing. Just define how your container elements read and write themselves to a dbstream, and call the appropriate dbstream function. What could be easier? dbstreams/doc/dbstreams.pdf010064400017500000144000002237141074303563000160750ustar00jklowdenusers%PDF-1.3 % 2 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xڭXoF ~_vSQ ذaPZ;Dr=oN9q99Jw<;E:7KM/.[9 Uf'jYjiџ) 9*i\5ǟa+c W9Zd{)hQr|P=i+tԁ :\AGq$y㕬TLPaa+Kuj]Ղ,SykSv8n`vy`xu)'_Dᰄ5je2uNX/c+:BJW!s3A|=Jg¦]a+w2\G^\ X?VӅdjC:UD[E)z}-~f% uf G 365^qż;='9㬧-?W=bUls Wo? QO*޲\97IV7ۦJ@Pn=5$XT^F82QtߑԡWw>9F,8}ZzI@Atcu?ȗI endstream endobj 4 0 obj 1331 endobj 1 0 obj << /Type /Page /Parent 22 0 R /Resources 3 0 R /Contents 2 0 R /MediaBox [0 0 612 792] >> endobj 3 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs2 18 0 R /Cs1 5 0 R >> /Font << /F3.0 21 0 R /F1.0 19 0 R /F2.0 20 0 R >> /XObject << /Im3 10 0 R /Im1 6 0 R /Im5 14 0 R /Im6 16 0 R /Im2 8 0 R /Im4 12 0 R >> >> endobj 10 0 obj << /Length 11 0 R /Type /XObject /Subtype /Image /Width 465 /Height 1122 /ColorSpace 23 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x܋Wȅd!C e!O_q"k@۲qǏ-RWoG]_7ߊ b{ `N,{$O-;#xoK??oHuv*m}?`;w bu/۩eS^'>O5U)S{e[}`;zzu^Srv*m>O~؎jW/pꞝC1zƾys/g*U NխPuxv?UJO~؂Vw t}.v~m)m>_-JuM_g$wĭ=!q;>I63L%\7;]С{Fr{;vl+E ` pڛ;[wzV=;'nM'ϐb_]]={RjU~ބ7nn, Ө-%Ӥ6yGuKihڡyRɝV:q3)dOHoMl+vnU7s;Wo SrZqlo}{uKz{ܭ[wot/͡-Ԝ{vrW'&[<%Vio[խ!Wz;'O5j T {Ӷpֳ>wu]'8&FXo[ͮ[^m X͹ۇzW!͉ezuꎦiZJn{.>;(*Ԫ'.v~ > TW -佅fuzvV?]B?q{oP{{u[B%w?A[|OɝeͪP+aXꎚEw.s &wuۇZĭ1!_kUMۓ9{䥅ϗܬ ~`}Cm&^WCnM[`+՝mE,H. g$Ꞓz)!VɭggLoMTMOzrG\\& +J.J. +J.J. +J.J. +J.J. +J.J. + HH+ HH+ HH+ HH+ HH+ +J.J. +J.J. +J.J. +J.J. +J.J. +J.J. ~M@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@rJ.H++J.H++J.H++J.H++J.H++J.HH.J. HH.J. HH.J. HH.J. HH.J. HH.J.H++J.H++J.H++J.H++J.H++J.H++J.5ɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\k+ HH+ HH+ HH+ HH+ HH+ +J.J. +J.J. +J.J. +J.J. +J.J. + HH+ HH+ HH+ HH+ HH+ HH+$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$ׯ HH.J. HH.J. HH.J. HH.J. HH.J. HH.J.H++J.H++J.H++J.H++J.H++J.HH.J. HH.J. HH.J. HH.J. HH.J. HH.J. HH_\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\& +J.J. +J.J. +J.J. +J.J. +J.J. + HH+ HH+ HH+ HH+ HH+ +J.J. +J.J. +J.J. +J.J. +J.J. +J.J. ~M@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%\\$Wr$@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@r$Wrɕ\ɕ\@r%@rJ.H++J.H++J.H++J.H++J.H++J.HH.J. HH.J. HH.J. HH.J. HH.J. HH.J.H++J.H++J.H++J.H++J.H++J.H++J.5ɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\@r%@r%\\ɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\\$Wr$Wrɕ\k+ HH+ HH+ HWOWgϞ'I{* Ѯ$wl?{I(ݓJ. wO$ɓ'IÇ|ŋ$ӧ=$ ZU'w/ ;:y}͛7Isn?t{uV6'nrGFFFQK%w}]JnO;]RMSun/؎Mwt )ӜٯyW›Yb֤Vgg%w=̹ӶC7Bu4`ͪy^L 9qUg SroF𫺵0ԹV~V+Jr֞PUX\.rn`T)mz['pvrZtk^! u[X$+؎eO ˉ{h=/խyaܺMxoE`mzD,eKoGYM ']hu0ک&)pE`+v=!O g$Pukԭy[PJRmmMGN{h[Bu{x{{-/g*UUݏm>)*?tn›V~PJʒ$nz^vwIMxlBW6=%N#C[ؐ*X5-ce{ۓ{kulQլJ[=#ǫ;w=vLJ;X ooo/vUz{{vrTw oo~6gjTKvSx{([q(kSBn ؜C|=[ 8RO>~m~@](ʆ" endstream endobj 11 0 obj 5839 endobj 6 0 obj << /Length 7 0 R /Type /XObject /Subtype /Image /Width 855 /Height 1112 /ColorSpace 24 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xsUTV# B L"Hh&A$d 4 0@$$˜@Ha箬-޻;9j_w򫵞'?O2y;_ft;?Ka nK{LEEeg5[ g/%ߝn]]]s A&R8<`&ݩL/^GG͛7oܸq۵\ 2}u'Q_72&B{<343953SE1@LuʕZZZ/m""Z[[tqFL ޿Ww`t9cȿ4I.^x… )EtE}566F zj`۷3GLgZ+)R1ؙ3gN>][[{ɚ'N {Nv;uTW4Xdaa`ssskRvuu=~Lǀ.hȿhѣG8|!'ر(TMMM/_zj{{{<0u`af.޽ё)γgƦ~1LyyyYY۷۞n"RbFnEw|ذaC  @ :_ 7n;3:pk֬ٴiӎ;8pZ`6Ç6ӧ7nhmmLwQl73gN2% 01bD7hРW^yeȆ^}ըÇ5jر&Mz̙}KvttܹsE۷W!.\8uTTo^PPr.'''t„ cƌ2d_~^zO>/ }W^y^ѣG?~ʔ)0p[nݻwCkŤ~#0}'O 6lXb… cөS7.rtСQ1[Y{;`1⭷zws]hMMM7oxڵhm۶}˖-?3&M4f̘ÇG?5gy駟 zq)د_:4N6-''gɒ%W.,,,))着Μ9["9ipD֭[69]o1lذ&矏Q|? O|̘1&M9sG}WPPxcǎlmmmooO9"@@(D"@@(D "@ D"@@(D"@@(D"@@y@D ""@@(D"@@(D"@@(D@D " E "P@ E "P@ E "P@ @D " E "P@ E "P@ E "P@D "@@ E "P@ E "P@ E "@ "P@ E "P@ E "P@ E D "@@ E "P@ E "P@ E "P@D ""@@(D"@@(D"@@(D@D ""@@(D"@@(D"@@(D "@ D"@@(D"@@(D"@@@ @(D"@@(D"@@(D"@z^"@ D"@@(D"@@(D"@@(D "@@ E "P@ E "P@ E "P@D "@@ E "P@ E "P@ E "@ "P@ E "P@ E "P@ E @ @D "P@ E "P@ E "P@ =/@ "P@ E "P@ E "P@ E "@ D"@@(D"@@(D"@@(D "@ D"@@(D"@@(D"@@@ @(D"@@(D"@@(D"@ @D "@@(D"@@(D"@@(D@ @(D"@@(D"@@(D"@@@ "P@ E "P@ E "P@ E "@ "P@ E "P@ E "P@ E @ @D "P@ E "P@ E "P@ @D " E "P@ E "P@ E "P@ @ @D "P@ E "P@ E "P@ E @ @(D"@@(D"@@(D"@@@ @(D"@@(D"@@(D"@ @D "@@(D"@@(D"@@(D@D ""@@(D"@@(D"@@(D @D "@@(D"@@(D"@@(D"@ @D "P@ E "P@ E "P@ E @ @D "P@ E "P@ E "P@ @D " E "P@ E "P@ E "P@D "@@ E "P@ E "P@ E "@D " E "P@ E "P@ E "P@ @D "@@(D"@@(D"@@(D"@ @D "@@(D"@@(D"@@(D@D ""@@(D"@@(D"@@(D "@ D"@@(D"@@(D"@@y@D ""@@(D"@@(D"@@(D@D " E "P@ E "P@ E "P@ @D " E "P@ E "P@ E "P@D "@@ E "P@ E "P@ E "@ "P@ E "P@ E "P@ E D "@@ E "P@ E "P@ E "P@D ""@@(D"@@(D"@@(D@D ""@@(D"@@(D"@@(D "@ D"@@(D"@@(D"@@@ @(D"@@(D"@@(D"@z^"@ D"@@(D"@@(D"@@(D "@@ E "P@ E "P@ E "P@D "@@ E "P@ E "P@ E "@ "P@ E "P@ E "P@ E @ @D "P@ E "P@ E "P@ =/@ "P@ E "P@ E "P@ E "@ D"@@(D"@@(D"@@(D "@ D"@@(D"@@(D"@@@ @(D"@@(D"@@(D"@ @D "@@(D"@@(D"ڵkϟ?qÇٳe˖u-]tΜ9ӦM5jثW'x"i=2G`~R[fZhʕ+7nXVVVYY"͛wܹ~#޽{oߎlnnI0O>{~ct@V<zzg38bĈɓ'0>|鿊{nݺ5???77wܹӧO0aѣ 6p}TO=T@~(~w}߿?;vԩ~ŋ?M6ڵ+[RWWWSS"p۶mׯ_lټyf̘1q7|s z_|Ř-:0| lիWճ> /W^:tѣǏ?mڴ%K^o着Μ9xʕ_ׯ_?y#GJKK7lذbŊ Μ9sʔ)ƍ9rdL2p~E>s1 zK/ 0^K_L0ߟ;wҥK׮]y撒g655R^|9"ѣ߾}{AAʕ+/^ٙn|#F <8u`n/ /bUTVA 6jԨ~{ʔ)3g\`enݺwC?~ܹs.]uyƍ֋/>}lΝW7o|?>u!C^}/ QVWQY~ףǎ;qӧ,^8//oÆ _}UiiiEEEMMM]]]DիW;::"ǞD"Ξ=[]]]^^^RRRTT|EžޤIR92:thLe5dȐaÆ1bQ&L6mڬY,Xz7رGoiivڭ[޽K#͛W\ijj:w\@o-../WZ;ƾgώ x˗_~{I޿Ν;d^ ܹs+//oҥс9993f̈aR lo8!***kҤISN}f͚x˗Yx޽ƶ~'ѣ韆oCΜ9SUUU^^W7n\n]t`nnEbٳg1U;,>}3"̙`%KD^/(**J!ѣ'OL/BEJLz-f: omjժO>ycdCNG~i^^ڵkSn߾oM9s&s yf>tL7---Z+>|x߾}Qсu"c%dUTֲeVXgE}7nܲeˎ;{cǎf]p*63%&qFן>}*:p{ٹsg͛7m5f͚6kE\[n6l((((,,ܺu_]RRRZZZ^^.ϝ;А9?|ѣG=t#cLVWW]`g5cD|1ݻKȪhG;vN:|*Epz0soӥx…HHh7#GbCmQYݢ*++O8wtxƍ[nuuuݻw/>|'/f"0sFuuukkk#kjjw {RbEpҥT޽1"舼-R ƎQua̐#".^ܜ_`Nǀ4ց`,#];F ^0i {2%=yΝ{3Ep ?t/E:M#w1v@ĺ-uW4XXXTYʿt| F,cث+ar[ZtK)2Y>qj”~RzHo:U s f0G~O?do<5xdKGV +s endstream endobj 7 0 obj 9966 endobj 14 0 obj << /Length 15 0 R /Type /XObject /Subtype /Image /Width 213 /Height 114 /ColorSpace 25 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xKn0@I?i7ہCOLJ&ub1~$IkuCOU $u&u]9{|MCM+/&[.SR`C{x"s{ͽߚ[+؋?/\a'%9/7r>4~Iؖ_^~jV l/޼|W}~h W/9a p_,u~W]o_a,pm/vb 09]ެc[[U^k7"\ݿ]n2r7x?O`n&=/7_~{~okKyO ?O ?O ??~'?~ ?O ?O ?O ??~'?ge.Ϗj_NU/b?oM~N!!0Gdro1׿@ +oc~ ^Ws#pVxI{@%W޼]B 4c{ۛ_r9]]ގߋ 7IEI(Ρn /w"C W ^~#-7W9v+ !Dq2uKxe{](jЂZ^_n.jjXFVuWXp9^+~5i[^+{;84%O -@>~5Wjnuwuےi-Wa,{\xtuL.IF$]}m endstream endobj 15 0 obj 847 endobj 16 0 obj << /Length 17 0 R /Type /XObject /Subtype /Image /Width 213 /Height 766 /ColorSpace 26 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x[r0@џ<ĉgTMQz!@8wfS-C$IFK74ݓKz74Q MAvgx_Mqm!G&S# V٭4^ihVV lhϼnB1'+YA*i ; d/ vX#%+`[~9{OZE* 䭴g9L <_a* \xޣnVU~ʫ ޾2X9䱋|؏_>fE zʯߛc_~?'~?'~?'?~ ?O~?~?'~?'~?'?~ ?O~?~?'~?'~?'?~ ?O~?~?'~?'~?'~?~ᇟ?~' ?O ?O ?O ?O~?~ᇟ?O ?O ?O ?O~?~ᇟ?O ?O ?O ?O~?~ᇟ?O ?O ?O ??~'?~ ??'~?'~?'~?~ᇟ?~'?'~?'~?'~?~ᇟ?~'?'~?'~?'~?~ᇟ?~'?'~?'~?'~?'?~ ?O~O ?O ?O ??~'?~ ?O ?O ?O ??~'?~ ?O ?O ?O ??~'?~ ?O ?O ?O ?O ?O~?~ᇟ38~?'~?'~?'?~ ?O~?~?'~?'~?'?~ ?O~?~?'~?'~?'?~ ?O~?~?'~?'~?'~?~ᇟ?~' ?O ?O ?O ?O~?~ᇟ?O ?O ?O ?O~?~ᇟ?O ?O ?O ?O~?~ᇟ?O ?O ?O ??~'?~ ??'~?'~?'~?~ᇟ?~'?'~?'~?'~?~ᇟ?~'?'~?'~?'~?~ᇟ?~'?'~?'~?'~?'?~ ?O~O ?O ?O ??~'?~ ?O ?O ?O ??~'?~ ?O ?O ?O ??~'?~ ?O ?O ?O ?O ?O~?~ᇟ38~?MϏ{{8/F~OK{N?Ŧ-˝O~{◼9T]%0W>s5\G~j /io 0r'oW~_,0Pfl|\@GWw_w`FcѪ*`R s[ ]ȯ 0Pë׃_n.5A*Wn~e9(Nn l+E Z0EmR`Ρ) ^=Je(NIn^W~exܕZHrZ!ơ)92rQJx\E뱫-x H#lmhAkq1$I$>8 endstream endobj 17 0 obj 2438 endobj 8 0 obj << /Length 9 0 R /Type /XObject /Subtype /Image /Width 331 /Height 294 /ColorSpace 27 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xr[H$&E(_Uk9gfw]T͖snn$I$I$=>J:9%I끱/ԭ?]7IG_=ҽ?n|=~рegh|N{p]OIG7|6~ zڟv(Pc?vh}/iұb^|)\c뽤JJ;ZKw]wғz*y7w gL\䷻VKz2otૺg kX|/]-KRjW2))32>SZs3O9auΏfukE"ҋ0~:Yw5vrOISԧ5s9ӁwksLߗ&. {1/㹫!'yK? !'[z? [r>ΏlOғٮ<עO1|+ad>n-i<xYv<~^xYgZs[zY/|B7^yZQҪⵥẏ!>o/x]x^ f5Cp=_Kg7hK []-m ///UAGQ%\\p p%\p pIK.8K..8K.8K.8KK\p p%\p p p%\p p%%.8K.8K.8KK.8K.. p p%\p p%%\p p% \p p%\\p p%\p p%%\p p%8K.8K.8K..8K.$%\p p%\p p%\\K.8KK.8K.8K.8\p p%\\p p%\p pP p p%\p p%%\p p%\\p p%\p pIK.8K..8K.8K.8KK\p p%\p p p%\p p%%.8Kx)-Ļb.hYH{;/igKORwu+P oRC|0;sIU(9Cw?}~OcxCntIUri] m)cEs%U/vS_9-=׮^<vIYH#E;|]{[k+I;Ry~~+:_$^z]=.:^s3O:o{6_5^z9ϓ<^'^FKrv式;|uKnr~T{z/sLLPW)a_JFZ $k3ux[[z_y3kW'TbIEӁ1>ܹOwKڮ${^o?h<һwI:Uݧ#zI/]ҞK|} k] /SAYz,Vi> UżK%oVfgѽKKSS{}UYyIm 0uv3?]L}\Ik X$I$IT˨/ endstream endobj 9 0 obj 2572 endobj 12 0 obj << /Length 13 0 R /Type /XObject /Subtype /Image /Width 213 /Height 114 /ColorSpace 28 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xKn0@I?i6j;0`II@l=F?$I4R_A,=dS)=I%p:!ozdW~߄W>¶q~S# V9[i!p[uX)I+Ux?4T㗜{0/>+WF ܴK]L~rx7+XV~ڍ7]+}M *7/{ `pOoK1{ ,oK??/?'~?'~?'~?~ᇟ?~'?'~?'~?'~?~ᇟ?9??;;T=tSS`̏6c=%@UW޼7'P+ǯGV9/9(J.gy]b9iʛ7 r87o<5bV5W9QC^`D~9^rp)0F Zo`rWCd+ ,PԠ'\ 94%ثW))ɭʯ,PswVj8VvqiJ~L[~9([%}j"}זx H#lm#P7.SgكPPcRI$IPxo endstream endobj 13 0 obj 844 endobj 29 0 obj << /Length 30 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xڭy<_Ϙ1c}g-d͒}n0XbVDZDEEdMCy|>s׹ss ̢'H QFzXG'g,j `*@;keu۶6 `,ՖO]CӲsPec 3rLbPkmA!Q 1ːm!pvxQlA> P!zC~}|BgCz`>bǛDb6e3e, ;B [u/dsz?k UTzNnm}l3gkkKh#^/y 9LE"5Qtmkzt~)k*VN^^$@Ş)),.Qt̋rFG(+ +۫oQ}wB#QAkNGPL/BؠehnnzlœBȊt8ͺݚK̑ n/!o%o8>˯p׿?`6SM07I4DjJ 'DGRND:w6tBfbz)b'>JLsKw0?%-Ýw G:Fj¹]EkK K3ʢ/^4t/^y^Q]{5u*5jnzXp1b*}{=mU=Htz?txdѥۭڣXSo{[s}؏yQ7cd ܂/xLzx=nƕ" D@M\P0 >̓BQ:Zk"#GB{$9&>61h<)!$1( O=u;+ "dĜ\3|YR|tP/*q+u.p%˪WTV]E]ݺv}jzT`틛uo5ݮpRSIsY˹ւ;9weeO}ڑٙԣܮ=E˞T>^<\~1f 75>YR#"#bć$'z$9'ۤX38~IT4t xS2fr~xQރ o._VU[aĥoʗW®2_.R%U|àƦ&.VKU mCMbUgFhZΡP|= ?yV7|AסᚑLc&&Xf2g{ L-Iװ V?\\UelMj=[&G/"5;ڐ*C91d %GU4#`35$t&"@k14]`Ì`lX#lFOG;\LSD*֌6v)BV#7Qƨ<]&kzu pFc7Z,\̂fIdYxaYviaWcoPi˙k;Wϝ+@ QCI ^e/B+rCGCQ EU{2cedd_ﭖK?OE0x_Z9SMRMG]ဨ&JN^AW@ꠚ0cfy̻-f-sYmݲ(d2*^e]HO $ՓCΆQEDNDUM؝x=Y88݉iOeg䌝6>Ӟ}ޢ_ME򹊚I Eo|r;ɴeƻ_x𰩫IUž{CG^ΎIiY繈~Z~pt57sC=IE_7ž u+¶hhh.мsm!/ qLJLۏ"ȇ(TKE7LLc`Xf3Ρ=sLxePMnLk':{>> .:nGSȇkL2F w@gybnb$Zv,)'n9'M@^v\OU:657ӸYUݢsO[K`ц )!-s /KU֭6öRN~.UG\E<<zO}u~#$ERXJtjT~JyxĖdcK',Oa3V2}(^=Õ pkQ_Qi՗ +X+s'Wo"nbјܒҺzwoxm#ǮdzOI__ 8~W}: f~;eƕV`}$4@0@H `p `lз+44hp7BxLKK@")~ j΍^QqDTά< E^3ʚȶm=Cg7?(O ; ^5¹X]"E!.V%{%sI@#SQҔO쿮zOO}^)emЛ7>heemBkJg~|p! \b\2 wQ9-+$&JyWCS(ΑQD>gNpIIrX'R3Ҧ3O@߳jNF3r t +΃"RtYKҗSg+VV_cNWs&c]ܭz&b(Di3oo~ ߹Ȳ1h¾/jC÷F_:9'pw139yB"m{倕|HϾHMYtg 5;vc &cn#]hdN_5tj%0ea ٠ć =he| &c "Qcy uւ{ZfJP8gp؂`3/4;4#O3 ӷ }` B@#OɧQ@$$ !eq/Bd(o׏=۶5փ IdboxApu%֎_8h,xcjmCn[ ~1:N}FָcІ MܮoIQdޏ%qX`")#`M`啩za%a endstream endobj 30 0 obj 3844 endobj 26 0 obj [ /ICCBased 29 0 R ] endobj 31 0 obj << /Length 32 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xڭy<_Ϙ1c}g-d͒}n0XbVDZDEEdMCy|>s׹ss ̢'H QFzXG'g,j `*@;keu۶6 `,ՖO]CӲsPec 3rLbPkmA!Q 1ːm!pvxQlA> P!zC~}|BgCz`>bǛDb6e3e, ;B [u/dsz?k UTzNnm}l3gkkKh#^/y 9LE"5Qtmkzt~)k*VN^^$@Ş)),.Qt̋rFG(+ +۫oQ}wB#QAkNGPL/BؠehnnzlœBȊt8ͺݚK̑ n/!o%o8>˯p׿?`6SM07I4DjJ 'DGRND:w6tBfbz)b'>JLsKw0?%-Ýw G:Fj¹]EkK K3ʢ/^4t/^y^Q]{5u*5jnzXp1b*}{=mU=Htz?txdѥۭڣXSo{[s}؏yQ7cd ܂/xLzx=nƕ" D@M\P0 >̓BQ:Zk"#GB{$9&>61h<)!$1( O=u;+ "dĜ\3|YR|tP/*q+u.p%˪WTV]E]ݺv}jzT`틛uo5ݮpRSIsY˹ւ;9weeO}ڑٙԣܮ=E˞T>^<\~1f 75>YR#"#bć$'z$9'ۤX38~IT4t xS2fr~xQރ o._VU[aĥoʗW®2_.R%U|àƦ&.VKU mCMbUgFhZΡP|= ?yV7|AסᚑLc&&Xf2g{ L-Iװ V?\\UelMj=[&G/"5;ڐ*C91d %GU4#`35$t&"@k14]`Ì`lX#lFOG;\LSD*֌6v)BV#7Qƨ<]&kzu pFc7Z,\̂fIdYxaYviaWcoPi˙k;Wϝ+@ QCI ^e/B+rCGCQ EU{2cedd_ﭖK?OE0x_Z9SMRMG]ဨ&JN^AW@ꠚ0cfy̻-f-sYmݲ(d2*^e]HO $ՓCΆQEDNDUM؝x=Y88݉iOeg䌝6>Ӟ}ޢ_ME򹊚I Eo|r;ɴeƻ_x𰩫IUž{CG^ΎIiY繈~Z~pt57sC=IE_7ž u+¶hhh.мsm!/ qLJLۏ"ȇ(TKE7LLc`Xf3Ρ=sLxePMnLk':{>> .:nGSȇkL2F w@gybnb$Zv,)'n9'M@^v\OU:657ӸYUݢsO[K`ц )!-s /KU֭6öRN~.UG\E<<zO}u~#$ERXJtjT~JyxĖdcK',Oa3V2}(^=Õ pkQ_Qi՗ +X+s'Wo"nbјܒҺzwoxm#ǮdzOI__ 8~W}: f~;eƕV`}$4@0@H `p `lз+44hp7BxLKK@")~ j΍^QqDTά< E^3ʚȶm=Cg7?(O ; ^5¹X]"E!.V%{%sI@#SQҔO쿮zOO}^)emЛ7>heemBkJg~|p! \b\2 wQ9-+$&JyWCS(ΑQD>gNpIIrX'R3Ҧ3O@߳jNF3r t +΃"RtYKҗSg+VV_cNWs&c]ܭz&b(Di3oo~ ߹Ȳ1h¾/jC÷F_:9'pw139yB"m{倕|HϾHMYtg 5;vc &cn#]hdN_5tj%0ea ٠ć =he| &c "Qcy uւ{ZfJP8gp؂`3/4;4#O3 ӷ }` B@#OɧQ@$$ !eq/Bd(o׏=۶5փ IdboxApu%֎_8h,xcjmCn[ ~1:N}FָcІ MܮoIQdޏ%qX`")#`M`啩za%a endstream endobj 32 0 obj 3844 endobj 23 0 obj [ /ICCBased 31 0 R ] endobj 33 0 obj << /Length 34 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xڭy<_Ϙ1c}g-d͒}n0XbVDZDEEdMCy|>s׹ss ̢'H QFzXG'g,j `*@;keu۶6 `,ՖO]CӲsPec 3rLbPkmA!Q 1ːm!pvxQlA> P!zC~}|BgCz`>bǛDb6e3e, ;B [u/dsz?k UTzNnm}l3gkkKh#^/y 9LE"5Qtmkzt~)k*VN^^$@Ş)),.Qt̋rFG(+ +۫oQ}wB#QAkNGPL/BؠehnnzlœBȊt8ͺݚK̑ n/!o%o8>˯p׿?`6SM07I4DjJ 'DGRND:w6tBfbz)b'>JLsKw0?%-Ýw G:Fj¹]EkK K3ʢ/^4t/^y^Q]{5u*5jnzXp1b*}{=mU=Htz?txdѥۭڣXSo{[s}؏yQ7cd ܂/xLzx=nƕ" D@M\P0 >̓BQ:Zk"#GB{$9&>61h<)!$1( O=u;+ "dĜ\3|YR|tP/*q+u.p%˪WTV]E]ݺv}jzT`틛uo5ݮpRSIsY˹ւ;9weeO}ڑٙԣܮ=E˞T>^<\~1f 75>YR#"#bć$'z$9'ۤX38~IT4t xS2fr~xQރ o._VU[aĥoʗW®2_.R%U|àƦ&.VKU mCMbUgFhZΡP|= ?yV7|AסᚑLc&&Xf2g{ L-Iװ V?\\UelMj=[&G/"5;ڐ*C91d %GU4#`35$t&"@k14]`Ì`lX#lFOG;\LSD*֌6v)BV#7Qƨ<]&kzu pFc7Z,\̂fIdYxaYviaWcoPi˙k;Wϝ+@ QCI ^e/B+rCGCQ EU{2cedd_ﭖK?OE0x_Z9SMRMG]ဨ&JN^AW@ꠚ0cfy̻-f-sYmݲ(d2*^e]HO $ՓCΆQEDNDUM؝x=Y88݉iOeg䌝6>Ӟ}ޢ_ME򹊚I Eo|r;ɴeƻ_x𰩫IUž{CG^ΎIiY繈~Z~pt57sC=IE_7ž u+¶hhh.мsm!/ qLJLۏ"ȇ(TKE7LLc`Xf3Ρ=sLxePMnLk':{>> .:nGSȇkL2F w@gybnb$Zv,)'n9'M@^v\OU:657ӸYUݢsO[K`ц )!-s /KU֭6öRN~.UG\E<<zO}u~#$ERXJtjT~JyxĖdcK',Oa3V2}(^=Õ pkQ_Qi՗ +X+s'Wo"nbјܒҺzwoxm#ǮdzOI__ 8~W}: f~;eƕV`}$4@0@H `p `lз+44hp7BxLKK@")~ j΍^QqDTά< E^3ʚȶm=Cg7?(O ; ^5¹X]"E!.V%{%sI@#SQҔO쿮zOO}^)emЛ7>heemBkJg~|p! \b\2 wQ9-+$&JyWCS(ΑQD>gNpIIrX'R3Ҧ3O@߳jNF3r t +΃"RtYKҗSg+VV_cNWs&c]ܭz&b(Di3oo~ ߹Ȳ1h¾/jC÷F_:9'pw139yB"m{倕|HϾHMYtg 5;vc &cn#]hdN_5tj%0ea ٠ć =he| &c "Qcy uւ{ZfJP8gp؂`3/4;4#O3 ӷ }` B@#OɧQ@$$ !eq/Bd(o׏=۶5փ IdboxApu%֎_8h,xcjmCn[ ~1:N}FָcІ MܮoIQdޏ%qX`")#`M`啩za%a endstream endobj 34 0 obj 3844 endobj 27 0 obj [ /ICCBased 33 0 R ] endobj 35 0 obj << /Length 36 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xڕSMkQ3V܄*tE0~,icAǙd$U7nDn@.pQFQ(_~(t)*ޙνuuMY/ Lj;dTs3Bmtޒ۩ ֹ|]HROk,px\sEf?!:t|04VjU0̸ֿзaK#kIzE~uܞ0-9R쌢eLc VtBr=MQqN`<9't_aX 1/ofy!%)_N/V}*8')3 oծf-G~;$Nmb4G* "ء *,A/fET္06uLIe]z*n_/<`UQf ǝOcˤ&p BJQpxG {mj {Xu>9}+uC=C2nGjZ٘W{~};o6z8lÕ33rlۉjQ endstream endobj 36 0 obj 631 endobj 5 0 obj [ /ICCBased 35 0 R ] endobj 37 0 obj << /Length 38 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xڭy<_Ϙ1c}g-d͒}n0XbVDZDEEdMCy|>s׹ss ̢'H QFzXG'g,j `*@;keu۶6 `,ՖO]CӲsPec 3rLbPkmA!Q 1ːm!pvxQlA> P!zC~}|BgCz`>bǛDb6e3e, ;B [u/dsz?k UTzNnm}l3gkkKh#^/y 9LE"5Qtmkzt~)k*VN^^$@Ş)),.Qt̋rFG(+ +۫oQ}wB#QAkNGPL/BؠehnnzlœBȊt8ͺݚK̑ n/!o%o8>˯p׿?`6SM07I4DjJ 'DGRND:w6tBfbz)b'>JLsKw0?%-Ýw G:Fj¹]EkK K3ʢ/^4t/^y^Q]{5u*5jnzXp1b*}{=mU=Htz?txdѥۭڣXSo{[s}؏yQ7cd ܂/xLzx=nƕ" D@M\P0 >̓BQ:Zk"#GB{$9&>61h<)!$1( O=u;+ "dĜ\3|YR|tP/*q+u.p%˪WTV]E]ݺv}jzT`틛uo5ݮpRSIsY˹ւ;9weeO}ڑٙԣܮ=E˞T>^<\~1f 75>YR#"#bć$'z$9'ۤX38~IT4t xS2fr~xQރ o._VU[aĥoʗW®2_.R%U|àƦ&.VKU mCMbUgFhZΡP|= ?yV7|AסᚑLc&&Xf2g{ L-Iװ V?\\UelMj=[&G/"5;ڐ*C91d %GU4#`35$t&"@k14]`Ì`lX#lFOG;\LSD*֌6v)BV#7Qƨ<]&kzu pFc7Z,\̂fIdYxaYviaWcoPi˙k;Wϝ+@ QCI ^e/B+rCGCQ EU{2cedd_ﭖK?OE0x_Z9SMRMG]ဨ&JN^AW@ꠚ0cfy̻-f-sYmݲ(d2*^e]HO $ՓCΆQEDNDUM؝x=Y88݉iOeg䌝6>Ӟ}ޢ_ME򹊚I Eo|r;ɴeƻ_x𰩫IUž{CG^ΎIiY繈~Z~pt57sC=IE_7ž u+¶hhh.мsm!/ qLJLۏ"ȇ(TKE7LLc`Xf3Ρ=sLxePMnLk':{>> .:nGSȇkL2F w@gybnb$Zv,)'n9'M@^v\OU:657ӸYUݢsO[K`ц )!-s /KU֭6öRN~.UG\E<<zO}u~#$ERXJtjT~JyxĖdcK',Oa3V2}(^=Õ pkQ_Qi՗ +X+s'Wo"nbјܒҺzwoxm#ǮdzOI__ 8~W}: f~;eƕV`}$4@0@H `p `lз+44hp7BxLKK@")~ j΍^QqDTά< E^3ʚȶm=Cg7?(O ; ^5¹X]"E!.V%{%sI@#SQҔO쿮zOO}^)emЛ7>heemBkJg~|p! \b\2 wQ9-+$&JyWCS(ΑQD>gNpIIrX'R3Ҧ3O@߳jNF3r t +΃"RtYKҗSg+VV_cNWs&c]ܭz&b(Di3oo~ ߹Ȳ1h¾/jC÷F_:9'pw139yB"m{倕|HϾHMYtg 5;vc &cn#]hdN_5tj%0ea ٠ć =he| &c "Qcy uւ{ZfJP8gp؂`3/4;4#O3 ӷ }` B@#OɧQ@$$ !eq/Bd(o׏=۶5փ IdboxApu%֎_8h,xcjmCn[ ~1:N}FָcІ MܮoIQdޏ%qX`")#`M`啩za%a endstream endobj 38 0 obj 3844 endobj 25 0 obj [ /ICCBased 37 0 R ] endobj 39 0 obj << /Length 40 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xڭy<_Ϙ1c}g-d͒}n0XbVDZDEEdMCy|>s׹ss ̢'H QFzXG'g,j `*@;keu۶6 `,ՖO]CӲsPec 3rLbPkmA!Q 1ːm!pvxQlA> P!zC~}|BgCz`>bǛDb6e3e, ;B [u/dsz?k UTzNnm}l3gkkKh#^/y 9LE"5Qtmkzt~)k*VN^^$@Ş)),.Qt̋rFG(+ +۫oQ}wB#QAkNGPL/BؠehnnzlœBȊt8ͺݚK̑ n/!o%o8>˯p׿?`6SM07I4DjJ 'DGRND:w6tBfbz)b'>JLsKw0?%-Ýw G:Fj¹]EkK K3ʢ/^4t/^y^Q]{5u*5jnzXp1b*}{=mU=Htz?txdѥۭڣXSo{[s}؏yQ7cd ܂/xLzx=nƕ" D@M\P0 >̓BQ:Zk"#GB{$9&>61h<)!$1( O=u;+ "dĜ\3|YR|tP/*q+u.p%˪WTV]E]ݺv}jzT`틛uo5ݮpRSIsY˹ւ;9weeO}ڑٙԣܮ=E˞T>^<\~1f 75>YR#"#bć$'z$9'ۤX38~IT4t xS2fr~xQރ o._VU[aĥoʗW®2_.R%U|àƦ&.VKU mCMbUgFhZΡP|= ?yV7|AסᚑLc&&Xf2g{ L-Iװ V?\\UelMj=[&G/"5;ڐ*C91d %GU4#`35$t&"@k14]`Ì`lX#lFOG;\LSD*֌6v)BV#7Qƨ<]&kzu pFc7Z,\̂fIdYxaYviaWcoPi˙k;Wϝ+@ QCI ^e/B+rCGCQ EU{2cedd_ﭖK?OE0x_Z9SMRMG]ဨ&JN^AW@ꠚ0cfy̻-f-sYmݲ(d2*^e]HO $ՓCΆQEDNDUM؝x=Y88݉iOeg䌝6>Ӟ}ޢ_ME򹊚I Eo|r;ɴeƻ_x𰩫IUž{CG^ΎIiY繈~Z~pt57sC=IE_7ž u+¶hhh.мsm!/ qLJLۏ"ȇ(TKE7LLc`Xf3Ρ=sLxePMnLk':{>> .:nGSȇkL2F w@gybnb$Zv,)'n9'M@^v\OU:657ӸYUݢsO[K`ц )!-s /KU֭6öRN~.UG\E<<zO}u~#$ERXJtjT~JyxĖdcK',Oa3V2}(^=Õ pkQ_Qi՗ +X+s'Wo"nbјܒҺzwoxm#ǮdzOI__ 8~W}: f~;eƕV`}$4@0@H `p `lз+44hp7BxLKK@")~ j΍^QqDTά< E^3ʚȶm=Cg7?(O ; ^5¹X]"E!.V%{%sI@#SQҔO쿮zOO}^)emЛ7>heemBkJg~|p! \b\2 wQ9-+$&JyWCS(ΑQD>gNpIIrX'R3Ҧ3O@߳jNF3r t +΃"RtYKҗSg+VV_cNWs&c]ܭz&b(Di3oo~ ߹Ȳ1h¾/jC÷F_:9'pw139yB"m{倕|HϾHMYtg 5;vc &cn#]hdN_5tj%0ea ٠ć =he| &c "Qcy uւ{ZfJP8gp؂`3/4;4#O3 ӷ }` B@#OɧQ@$$ !eq/Bd(o׏=۶5փ IdboxApu%֎_8h,xcjmCn[ ~1:N}FָcІ MܮoIQdޏ%qX`")#`M`啩za%a endstream endobj 40 0 obj 3844 endobj 24 0 obj [ /ICCBased 39 0 R ] endobj 41 0 obj << /Length 42 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xڭy<_Ϙ1c}g-d͒}n0XbVDZDEEdMCy|>s׹ss ̢'H QFzXG'g,j `*@;keu۶6 `,ՖO]CӲsPec 3rLbPkmA!Q 1ːm!pvxQlA> P!zC~}|BgCz`>bǛDb6e3e, ;B [u/dsz?k UTzNnm}l3gkkKh#^/y 9LE"5Qtmkzt~)k*VN^^$@Ş)),.Qt̋rFG(+ +۫oQ}wB#QAkNGPL/BؠehnnzlœBȊt8ͺݚK̑ n/!o%o8>˯p׿?`6SM07I4DjJ 'DGRND:w6tBfbz)b'>JLsKw0?%-Ýw G:Fj¹]EkK K3ʢ/^4t/^y^Q]{5u*5jnzXp1b*}{=mU=Htz?txdѥۭڣXSo{[s}؏yQ7cd ܂/xLzx=nƕ" D@M\P0 >̓BQ:Zk"#GB{$9&>61h<)!$1( O=u;+ "dĜ\3|YR|tP/*q+u.p%˪WTV]E]ݺv}jzT`틛uo5ݮpRSIsY˹ւ;9weeO}ڑٙԣܮ=E˞T>^<\~1f 75>YR#"#bć$'z$9'ۤX38~IT4t xS2fr~xQރ o._VU[aĥoʗW®2_.R%U|àƦ&.VKU mCMbUgFhZΡP|= ?yV7|AסᚑLc&&Xf2g{ L-Iװ V?\\UelMj=[&G/"5;ڐ*C91d %GU4#`35$t&"@k14]`Ì`lX#lFOG;\LSD*֌6v)BV#7Qƨ<]&kzu pFc7Z,\̂fIdYxaYviaWcoPi˙k;Wϝ+@ QCI ^e/B+rCGCQ EU{2cedd_ﭖK?OE0x_Z9SMRMG]ဨ&JN^AW@ꠚ0cfy̻-f-sYmݲ(d2*^e]HO $ՓCΆQEDNDUM؝x=Y88݉iOeg䌝6>Ӟ}ޢ_ME򹊚I Eo|r;ɴeƻ_x𰩫IUž{CG^ΎIiY繈~Z~pt57sC=IE_7ž u+¶hhh.мsm!/ qLJLۏ"ȇ(TKE7LLc`Xf3Ρ=sLxePMnLk':{>> .:nGSȇkL2F w@gybnb$Zv,)'n9'M@^v\OU:657ӸYUݢsO[K`ц )!-s /KU֭6öRN~.UG\E<<zO}u~#$ERXJtjT~JyxĖdcK',Oa3V2}(^=Õ pkQ_Qi՗ +X+s'Wo"nbјܒҺzwoxm#ǮdzOI__ 8~W}: f~;eƕV`}$4@0@H `p `lз+44hp7BxLKK@")~ j΍^QqDTά< E^3ʚȶm=Cg7?(O ; ^5¹X]"E!.V%{%sI@#SQҔO쿮zOO}^)emЛ7>heemBkJg~|p! \b\2 wQ9-+$&JyWCS(ΑQD>gNpIIrX'R3Ҧ3O@߳jNF3r t +΃"RtYKҗSg+VV_cNWs&c]ܭz&b(Di3oo~ ߹Ȳ1h¾/jC÷F_:9'pw139yB"m{倕|HϾHMYtg 5;vc &cn#]hdN_5tj%0ea ٠ć =he| &c "Qcy uւ{ZfJP8gp؂`3/4;4#O3 ӷ }` B@#OɧQ@$$ !eq/Bd(o׏=۶5փ IdboxApu%֎_8h,xcjmCn[ ~1:N}FָcІ MܮoIQdޏ%qX`")#`M`啩za%a endstream endobj 42 0 obj 3844 endobj 28 0 obj [ /ICCBased 41 0 R ] endobj 43 0 obj << /Length 44 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x}OHQǿ%Be&RNW`oʶkξn%B.A1XI:b]"(73ڃ73{@](mzy(;>7PA+Xf$vlqd}䜛] UƬxiO:bM1Wg>q[ 2M'"()Y'ld4䗉2'&Sg^}8&w֚, \V:kݤ;iR;;\u?V\\C9u(JI]BSs_ QP5Fz׋G%t{3qWD0vz \}\$um+٬C;X9:Y^gB,\ACioci]g(L;z9AnI ꭰ4Iݠx#{zwAj}΅Q=8m (o{1cd5Ugҷtlaȱi"\.5汔^8tph0k!~D Thd6챖:>f&mxA4L&%kiĔ?Cqոm&/By#Ց%i'W:XlErr'=_ܗ)i7Ҭ,F|Nٮͯ6rm^ UHW5;?Ͱh endstream endobj 44 0 obj 706 endobj 18 0 obj [ /ICCBased 43 0 R ] endobj 22 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 1 0 R ] >> endobj 45 0 obj << /Type /Catalog /Pages 22 0 R >> endobj 46 0 obj << /Length 47 0 R /Length1 11984 /Filter /FlateDecode >> stream xڽzy|Ts>K&3̾LfdI dYD &@BPAC4* EUQ !A/(hm+֕Z[kM};!/oO9lsssjX 4-n]BQnly[܏qByl_`joLJWuu0@0_ԁ Kb}>;wݳ1Gy kvZ\z{a.nkzڒ;?bXo_rg!bai?Ҏ88#\hL8'r~$`RTHAh òR !L` `;8 .p_k= Zؕ`erc:'c7Ϟmlq/t)>&%*V^'Q XN8Fnx8!y@$? S!XN a,υUg pJp 0?3&uI(~sžLiغ ^$^\(EꞀ` xG;Fcqr2@>2ǟ!U[`3<$Nf SRjFPW-kc0/)3vxk8H.D1ʠn{ t+.]nTo#wp +pw  sى 2d'u"Ǩi$y#%/%Ԕ Q]fj?uB?NR.S:67.xiQn3Ѐߊ]c?p:\Ua(+'x5H;YH$/L2RP:D٩\j1zZI z2=>}a0uYk7g~ɖfv%]Ocϲp+ \?%|G2kNCґ|#d.lEn"Ћ5E@ Lk\>ѷ®{tZ { pې;B.JQp0#4r:6lJ5R:mZT<24E SZ"S[%=zUCKčM׎[akGqdF#ã#]eY*;J;JfOo򣕞&wdH.$,"]etGH*R[RCU ʬLIqA%MI;xFTEʪS)ުi*m؄m4\( {? zkcnmP-\P䩌MJjU[[X/M:*,HREB-x@`'3ki^$]dMY柼eb/ssd*%oŗbolx β-ƀ,v6roWOZo3_#9{s~W)k|s}jNW.5&/դJ͸4%rrBqRRJKOsrsufN.9u#0_H}aH_!x"ؠ.h^u.(r^΄de76CG+69D,fń@WWE1sؙāVlЖŲ+x?ՔZ_\T8!>pLzA>c`ѓ T4h`$̻)S9Dd[Ev.}[b޹ɹ  ߛYxWb.w椕.G̨$,zcV9ARp,sRlT}|q6:N,d^^/L/lg~eac8"NM5(jx iq˒HfVY33@+iyJt> IWYӯo{u$宧;>0)zӱl}MH2]"=sW 5mI5e2A+mm@~ P %Jʦ j ZDЫ-OW8jGi-J3z- v%m;UPUƗ |0cou-hk?'d2 ׈+(H"ی"{({HR(*6fdNnH4(D:L"2 3Y3$1!2㉆$猤HLCT PgA4OR%i(E)DsgmM[Ŏsf FC>Z**{D2Wed3RſˉrvfF;I, Ls֭3f|egmm4^*<\ 9/RwC˞Z%v:MHv"`yP ~fkIt{xa8~DIЂ23^7HYJ0 ѓI>Kk9{c~n}G;9ŞSPB,)ԯ[ً>aPxͤ tVoQ\͙)*)=7 %'op :o^QMwK@9JMA3pl?PT$aI!Y^ &xRQ 6tP{'ݴ!A"ѿeg"{hw}_&'V2E CW8p~F3KgcJvhAp8%0lmPT~Z#YqlW( f ,6GFK'RMd<ҶpM}}wfϔ?/?$}?{ר1)-I,!suKm=.Pɬ' au d}B'x3gii=u;R%ϧ;t6Q<75kg-J5~O;!,o ˞4 u& z,/ùekS-éit#N@eHcL0\%i1]# OF(6K"$Y7I$# .DnEz/l{\!=gA;R&/Kݒ{ ^*>]>$Û7:Utq|bSiDH֨4ۂxzSxEgKZX ypb_0LZ9]B|U9SPlI_h&?˰.ھGKT>/V{7YbgҚwZ٦3c߈$خVQYrl An* gt s ~Ɵ_&)IT@xZT7!m}pŹWZ.On QVhȣtUYqf1gޚ%GP~0],yԳō;>?>R:(l?ehcZ OKQm7  7׮:&;彯l#V_ \]ت}<^av_jT8#|A=Nf^Ы,bVo0Jh&u&*ETGo%ALHE#Mk8_H'T4 Gxg_ڔB/a?Z;n;y9..{.?O}npG$tdc71^ܺҠ+Ocۮp#ivUJ`Zœ~]KVcOk1>T̈Ečߕ^T83"#1zeU^c·w$vkGόҁ_CnІ@Y쏸gV96 a%5 FS$:`M!}JTJ`Ã'$^(KY١in£rh'EHS.f ڦXvvqv .bMzYuORӕvL$YLv X6l2dU KyӒL(ݑ3!Uh)r˜j&|?`Ӹ ϶BD%E$"k)JTJ"J(CiQAEѴ4zl"q' iR$>Bѵ\3.J8QKPFo$_::cj|)x+>M>c}o_XhT?4Oisgͺ*=d5 K#'?PL/);Ì'e+OjHLj4JUzK 5dESTzY\07 XBM$!yxHX@x$Z>c^_1{FvvUcSTڠX@Y+y޿51P`Ih(KRٌ̼A2VY$(;s9e%+zS%kKZsIwYәY 3\2cLIi.}r|ƍXGgΧ LgW  pkK 5PKU1هui + HO;Q.=thL>)B(,pREJ ng *)Š N%IҠԷff*iR !BjM<,Gv ( A%SJ9^!(Ԯ`QqOv\X\;8"=~^t)!6&aB8@~u<3tz]s,=K~EOM /q:>u,v0954k)= A$DђN ' NʠhFeՐ &:IS=lW6;({Xi9*ݟC[a!6K/KOovwIba]eټ%kBzse@~FDj n^ekHN2s\&XkJme_N/b7X)e?!޹`,(owӰ*AdЀOA#%fp2w\ Lr 8 L @)b4*rZN>X%1Ic>X+p WbY;'9=FG.Ri^3v3Fɿ" B;e@=UIʒnMz!g+.5LFN)yR 8⦊١ڶEm] ~f ڮf&X!)/b P UP-7Y~HMp3̂Fhp :Q ES!PhVLOca!yz08&f1H?#_ =`%*u2+U7=xĂt~L,I$O`>KEd"W v%Vb圐}|׋$ P"\E):2xkdIǓr,pi/~ϱȵ%;] ߵ1q[q-nuϓnR]%sX*+ ]9@+!sްewlv.?qGvBzu[õ&4ZP G.8'62Q(C4р$s"J%,%']Tb-%TB)"P(Lhթr]Iu\8"[l9"R!h >]0k%c6L-G;̑sCKFލ̝!["K> endobj 49 0 obj [ 278 722 722 722 722 722 722 722 722 722 389 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 278 722 584 722 584 722 722 667 722 722 722 722 722 722 722 722 722 722 556 722 722 722 722 778 722 667 611 722 722 722 722 722 722 722 722 722 722 556 722 556 556 500 556 556 722 556 556 222 722 722 222 833 556 556 556 722 333 500 278 556 500 722 500 722 722 722 722 722 584 ] endobj 21 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XCBUBZ+Helvetica /FontDescriptor 48 0 R /Widths 49 0 R /FirstChar 32 /LastChar 126 /Encoding /MacRomanEncoding >> endobj 50 0 obj << /Length 51 0 R /Length1 9172 /Filter /FlateDecode >> stream xy{|ו3#H,Y4#z!ٖ-[FǶdÀ;` H $m1%Bh~,!$i/!iȆm4%Ano@K{fdz3{th[ I1r{j᱆( ؗ]jŋX.[qm=Ư _>2 Ss/z wu?UkyXz;֪_bA 57~Mko_yw97G@4#%Jm χBtP2;AU h! A(E;8ҏ@6@wT"ԏN>&T!^fx *~G~ g0nS/0! IA}xkP.ȋ  [yO!\NNpj|-ЊĹmڐߣ 8,X wQc~A8R(~ZpvC$m“;:=^sq+=8{wb$oi{X:}dAxiLa&h7]֧+WQ߀ pQ 3O"dYK!rjV1=}n^eǑ爼Fj+u6"3S1;}$z\t{mUwvxǻÛ _`#1rHk!A悢^-tbzYzoW8{ -˃+_h0a bRpb 0)yV&r D~HN3Eq}mNRght9G?A?l&[wAL8cNW{,KLKY)7DID/l`d/s9\de9J2T><ʮd_bbO8ŰG Pq\(yz yL"rLL"E)t\sN:Fb $-Bۛd)SJ}71zZ^')jk4ŌxCpB b%B-$ߏQr.,\&we=].@HXB dP7͝0Mi "NBs+I#d;.hOoIcfW"ru$IbIp7% K : .-Y.v薸^Է+Iu'^cq'->~]^JQ_I(; ?ݣ$}('-D_2q+dTT"[u%CB0 xdNgvr;\I;F)av-[Q!vtJn'x7Bs+yQF#EyubAsiBVfcDPv%O I S% q1 rh*dk,vK auDZ24+.XF|" (+ځa[i(Vlj%J OexشtJl7xYyY2u)GMGOy/N?@8FF{K%s>yN5O+;>_vKXabsx ZDK Pr6XѪ봍lciCEb@HU4JiML\psS̥K+=/xbƤd4Y X`!J0+/k(NopuRW5yIq\Ksց2(TN0r+&_!zUs,HUauSU $znV.VUFǍjRf2Pw|eMS$;`e8x̎Ҳy3QG詑n!"o{b{[te_lٜf[~HU'ߒnjMm/+җk"{LʦcjXbXtYG:r@O*rvۭhJW_l:Y%j|2sL̸}^\"c |ĥ:RmJM/U:^pEnfkцO QSBg+Z,5~ꑿ}sw 6͘bZT\9{wK~WrD ww PbW ]sG5YtVi1v)X:vWEyY0B+*kSTKzϥ-`B&h!c" $ɼÞKnX$N 1 Q?fJ/ dl$kK([U]O$,bs&6d`JS(KS:'?3Jo) o´$o&XIq]]qIlLk(>꾔MWo y&ϊ:tjZt"JYuMG*(vK^XCaͮ&GS0t@͑ Skm"G~#;6Fz:xWC`w t3B.n2 R=ٰ l%h*J'Tq~1!f3zqS|y'#i## DZoZWx&GuٓY YzAxͪxjNk8wR]ADLyjZKQn]Q?4W(M}+U:E$vn)ya:jrʎHP &O-F;yG,y[=Ľ{Yȅb*k8bMa6*7 Z JK&i^SxsGNƭ0\@7aP}ZVbyۦԛ Þ6۴HqJhe?\#MkR Ϳ89z|~IJ=2JZ'4Oj&OgIeI߫F1n vq)'. |H1nYrZigW;f9la2|Vg C ;/  iό#xě@$=MQuO8qV]1OeabibX,x店v]9 ƕSζj'5-b͔+ǨwʡТ+I.Gڍ:M@Uf/ܖ(Q,  EV{޿vK2%Yˤ G0 >\ab"mFlK([|WY0JSpp@ZInCk1CllT:F5~}پ.}C41e^p1,d\IcX .=0;k 'l8'_&+\_˶y kphc*|NAZ:أY:Fą>\6wq,ݎnj̸2۹w8nwĢbUjuԄlp\"˦dݔ/O&μ3xj1F/ [et[bc\1M:|5r!%8^tMUb1œ@3FRSWF9>~5%gT'Ȭ H;OGNd+f _ s~[пNv dzJΉաCܡov_%VGϟدR?~= m(~F6_mצԦ_ڦwo |~l9ncm5ٍGC|#z|qI%t H |B]FR&;H,H(>u#+F[3ҹoTDWIt!7ăBb7e 4%dOm854es98B(!DoOa ou^_)?x.:*}>Wf:+|Qg9_]]a*:IũT:t *RŨnU9_QrQ2Rer*?(дdg`ToĿ!ȋq$J>NVH=Y%s| _H.,ww[ۓS;F(Xޗ%H}О+dO@D*4و@F-Z\"Ej!ꢬ6="e튠gF^ƇC!YK$e4I!P8*aIe" YZ\ʈg_=M;Z;яoor5VA籉ۼ.h_1w ]|qcwK]_kohl: NHR_ 徤%nZ φo}k [_ endstream endobj 51 0 obj 6754 endobj 52 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 669 /Descent -250 /Flags 32 /FontBBox [ -204 -429 1701 1272 ] /FontName /LCQUGY+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1721 /XHeight 454 /FontFile2 50 0 R >> endobj 53 0 obj [ 250 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 444 500 444 500 444 722 722 722 278 722 722 722 778 500 500 500 722 333 389 278 722 500 ] endobj 19 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQUGY+Times-Roman /FontDescriptor 52 0 R /Widths 53 0 R /FirstChar 32 /LastChar 118 /Encoding /MacRomanEncoding >> endobj 54 0 obj << /Length 55 0 R /Length1 8036 /Filter /FlateDecode >> stream xڽY{xTյ__;7v?Sϳul3>2KcۺgyI埰mgwR;݌횾;}Jl#?u# G\O"͆&ј`@6'J(Tn$A2A|v0`H 웠Ebct ..C\&)_%0F=b!gW0~8K.I6)S>t غ+B5 1"#:b´ vjAl[ëp26/O0 ,x`3I.%)QN VspV4:I#iz,6{6ڠrvnxF¦"؃gK4z&PT2bP6 {8HYH39;r*zh.E`셗6\aP餉#JuQV$u.O32f R:C.TB-́vbZ+nl$2#;("RK[50G^$'39jxNPPzj3 5Jh OGE&b`u^6'1wl[lE9AFfl7샧YecG#_Ŧ`b2492@ K%8AN˘``;%|hMz5zd3+u0Naobof}AuOvpC>9m\V"! J298^݇m$Ѫ 1=\@ &<}/xajv~Vȫ%%!7'ۙgج|eJd4SStZ:9)1ATe^m eu,{][l{皎jvKӬp)g 3eۭ>5Li|khL6u }C5}tP]p@83{3!>i, 5il+Df^JΛx\|ΊS[Q۵D$,/`AXl=![ 쾐aoWk ̚p B.[=[UjE!@G\ I*vӽRث틇v#>j~{#-&$5ܮC*m! Vڌ y>DZ2 %g!kUkG]Ep Ni %DgY= 5z&[U;p~|:ec2_X?B8~JFg/ͷ?Ѷt`;}0àhn!0=.mppK|(.vڰRkOabt)&S8(@Zn i`GG0tR2W=*}N{hЗ|:zSG*Esa.V\ZБaqa!LtAb`44hI6TCt*:U CɿGZPR iaϷBW"ᛮCxGZԶJBxwpAxBwcODC:=³Ex6j;KB;B V7&ԹQDCx5oPGCY~,4(YBӔY,Lr~21/qxu UވWES56.+٣ςFIA㤳ԫ!jH1d]ḬKbͩ)ڪ_T7^ x<'PUUTH*bd&Š=˙UڵvߖVk}7=T] #o{"rKQT' S".`0k:"tqQ> H:K&ręU@Mwoi׾CT˅_F}/vB2rO|sW,Dr(kQW텂BM-'A0'f1[*!*-[C6$?=cOJdIg{(+v0i4*UbU.Yf9JMؠ< cch'O?-*4qFk@0qL{FViIyY:V^(wVϩ|~)㦮tetLQlBSD_KTҕmOQZM"Amp̚ ds̩řUun}4d\[E.}Ww>.1ߙ`j!SaU%iTJUn^':U&[[sc'" ccU\}AB3YT?u.A??1R~N\xE?`G_*-6ofD>߰GV݃|-C-RJu 0~Q9 @FD xj)%.@A  ks-Dj|( v 9_]׋q+07:M7nd++Պ[Kd۲zBM~m=GipIyE/D?5ᏼ^[3+~X2ӉC@Tr"&I'KV(Z<$30Yxּ/?Ľ#n7 "/*]Zn+mяy$$z6Df/ϞձL M 5eJMWR|ֺܒaMP2!Ku3qq jj-Tq'W6­].Ο)ޠJ-k07J gfҫH/}hnovv4vas]Mmsq%\& VOqqtS7_Rnp Ӳ紬iujW2ҼHVC: :948pN0I:`w\_X[QTNMkwTkӤ 摑-IC.N o92FȻ,P#{,ӆg cOԛiy3˔#EeNT:Fy )3Ҧ zw$=*tg%iR:qcWT-;qes[@3Ց; ZW K9bu^׳/Q[;3s3SB-XdrPgm߀dׁ0}Vu΍0gbn K]P&*˓Ȳd6Y,M"$y\)99# O >D_L"dS0<_UeNxj|7('ʼo~kz=*+1KGw VcQ߲@˚sqAݡ-C ֑sk&սwH{5/t̻> endobj 57 0 obj [ 333 333 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 556 722 556 611 722 611 556 722 722 722 278 722 722 278 889 722 611 611 722 389 556 333 611 556 ] endobj 20 0 obj << /Type /Font /Subtype /TrueType /BaseFont /JRNFUV+Helvetica-Bold /FontDescriptor 56 0 R /Widths 57 0 R /FirstChar 40 /LastChar 118 /Encoding /MacRomanEncoding >> endobj 58 0 obj << /Author (James Lowden) /Creator (OmniGraffle) /CreationDate (D:20080114235233-05'00') /ModDate (D:20080114235233-05'00') /Producer (Mac OS X 10.4.11 Quartz PDFContext) /Title (dbstreams.graffle) >> endobj xref 0 59 0000000000 00000 n 0000001447 00000 n 0000000022 00000 n 0000001552 00000 n 0000001427 00000 n 0000038208 00000 n 0000007828 00000 n 0000017962 00000 n 0000021646 00000 n 0000024385 00000 n 0000001798 00000 n 0000007807 00000 n 0000024405 00000 n 0000025418 00000 n 0000017982 00000 n 0000018998 00000 n 0000019018 00000 n 0000021625 00000 n 0000051088 00000 n 0000067849 00000 n 0000073988 00000 n 0000060212 00000 n 0000051125 00000 n 0000033411 00000 n 0000046217 00000 n 0000042212 00000 n 0000029406 00000 n 0000037416 00000 n 0000050222 00000 n 0000025438 00000 n 0000029385 00000 n 0000029443 00000 n 0000033390 00000 n 0000033448 00000 n 0000037395 00000 n 0000037453 00000 n 0000038188 00000 n 0000038244 00000 n 0000042191 00000 n 0000042249 00000 n 0000046196 00000 n 0000046254 00000 n 0000050201 00000 n 0000050259 00000 n 0000051068 00000 n 0000051209 00000 n 0000051260 00000 n 0000059564 00000 n 0000059585 00000 n 0000059812 00000 n 0000060387 00000 n 0000067231 00000 n 0000067252 00000 n 0000067481 00000 n 0000068026 00000 n 0000073399 00000 n 0000073420 00000 n 0000073652 00000 n 0000074168 00000 n trailer << /Size 59 /Root 45 0 R /Info 58 0 R /ID [ <94547604220f0556e1b3b99064e63e00> <94547604220f0556e1b3b99064e63e00> ] >> startxref 74385 %%EOF dbstreams/doc/Makefile010066400017500000000000000042671077600006700150140ustar00jklowdenwheel## $Id: Makefile,v 1.8 2008/04/05 22:52:05 jklowden Exp $ ENTITIES = absvirt.methods.sgml \ dbstatus.methods.sgml \ provider_data.methods.sgml \ revision.sgml asof.sgml METHODS = provider.method.execute.sgml \ provider.method.extract.sgml \ provider.method.ignore.sgml \ provider.method.insert.sgml \ provider.method.lookup.sgml \ provider.method.meta.sgml \ provider.method.open.sgml ENTITY.METHODS = $(METHODS:S/^/entities\//g) HTDOCS = index.html rationale.html classes.desc.html html/index.htm: provider_guide.sgml html/userguide.css \ $(ENTITIES) $(ENTITY.METHODS) if [ "${DOCBOOK_DSL}" ]; then \ cd $(@:H) && \ openjade -d ../userguide.dsl \ -t sgml \ ../provider_guide.sgml; \ fi ln -f $(@:H)/index.htm $(@:H)/index.html clean: rm -rf $(ENTITIES) $(ENTITY.METHODS) html/* html/userguide.css: userguide.css cp $(.ALLSRC) $@ www/index.html: htdoc/index.html cp $(.ALLSRC) $@ www/rationale.html: htdoc/rationale.html cp $(.ALLSRC) $@ www/classes.desc.html: htdoc/classes.desc.html cp $(.ALLSRC) $@ publish: www/doc/index.htm $(HTDOCS:S/^/www\//g) www/doc/index.htm: html/index.htm cd html && pax -rw * ../www/doc absvirt.methods.sgml: ../include/provider/absvirt.h sgml.gen @rm -f entities/* ./sgml.gen ../include/provider/absvirt.h > .$@ mv .$@ $@ provider_data.methods.sgml: ../include/provider/data.h sgml.gen ./sgml.gen ../include/provider/data.h > .$@ mv .$@ $@ dbstatus.methods.sgml: ../include/dbstatus.h sgml.gen ./sgml.gen ../include/dbstatus.h > .$@ mv .$@ $@ asof.sgml: provider_guide.sgml sed -nEe 's/^.+Date: ([[:digit:]/]+).+$$/\1/p' \ -e'/\/bookinfo/q' \ $(.ALLSRC) \ | xargs printf "%s" >.$@ mv .$@ $@ revision.sgml: provider_guide.sgml sed -nEe 's/^.+Revision: ([[:digit:].]+).+$$/\1/p' \ -e'/\/bookinfo/q' \ $(.ALLSRC) \ | xargs printf "%s" >.$@ mv .$@ $@ PROVIDER.ENTITIES != ls entities Entities: for F in $(PROVIDER.ENTITIES); do \ printf "\n" \ $$(echo $$F | sed -E 's/method|[._]|\.sgml//g'); \ done $Date: 2008/04/05 22:52:05 $ $Revision: 1.8 $ <classname>dbstreams</classname> Provider Reference dbstreams/doc/absvirt.methods.sgml010066400017500000000000000222651077600006700173520ustar00jklowdenwheel protected urhandle _handle protected mutable STATUS state public virtual ~provider publicvirtual const STATUS& open const std::string& server const std::string& dbname publicvirtual const STATUS& open const std::string& tablename publicvirtual void close = 0; publicvirtual const query& insert int icol metadata::nullitude datum publicvirtual const query& insert int icol const char * data streamsize n publicvirtual const query& insert int icol const std::string& datum publicvirtual const query& insert int icol const int& datum publicvirtual const query& insert int icol const float& datum publicvirtual const query& insert int icol const double& datum publicvirtual const STATUS& send = 0; publicvirtual const STATUS& execute const dbstreams::query& sql publicvirtual const STATUS& execute const parameter_list_type& parameters public std::stringstream msg public << ": " << __func__ << " not implemented by provider" public throw std::logic_error public } virtual bool extract int icol std::string& datum size_t& len const publicvirtual bool extract int icol int& datum size_t& len const publicvirtual bool extract int icol double& datum size_t& len const publicvirtual bool extract int icol const char*& datum size_t& len const publicvirtual bool extract int icol const void*& datum size_t& len const publicvirtual const cell& extract int icol const publicvirtual const metadata& meta int icol const publicvirtual int ncolumns const = 0; publicvirtual const STATUS& next_row = 0; publicvirtual const std::string& SQL const = 0; publicvirtual const std::string& query_separator const = 0; public const urhandle& handle public const STATUS& status public void ignore int msgno public const metadata& meta const std::string& colname const public const cell& extract const std::string& colname const protected const cell& lookup const std::string& colname const dbstreams/doc/dbstatus.methods.sgml010066400017500000000000000174361077600006700175350ustar00jklowdenwheel public enum iostate public typedef std::deque<int> ignore_list private iostate resetbits private iostate state private ignore_list ignoring private int nmissing_parameters public int srcline public const char *srcfile public const char *driver_function public int msgno public int msgstate public int severity public int os_error public std::string servername public std::string procedure_name public int line_number public std::string msg public unsigned long nrows public dbstatus const std::string& msg = std::string public dbstatus const char *srcfile int srcline const std::string& msg public ~dbstatus public void fetched iostate state int nrows = 1 bool fail = false public bool good public bool bad public bool fail public bool eof public iostate rdstate public iostate setstate iostate state public iostate clear iostate state = goodbit public dbstatus& operator= int msgno public dbstatus& operator= const std::string& public operator void* public bool operator ! public bool operator== iostate state const public bool operator!= iostate state const public bool operator== const public bool operator!= const public std::ostream& notify std::ostream& os = std::cerr const public void ignore int msgno public const ignore_list& ignore const ignore_list& public const ignore_list& ignore public bool quit public const char* what const throw public const dbstatus& make_ready const dbstatus& reset public int missing_parameters public int missing_parameters int nmissing public dbstatus& assemble_error HANDLE db const char *srcfile int srcline dbstreams/doc/provider_data.methods.sgml010066400017500000000000000054071077600006700205220ustar00jklowdenwheel public typedef dbstreams::parameter_list_type parameter_list_type protected std::ostream *plog protected query sql protected parameter_list_type parameters protected typedef std::vector<cell> row_type protected mutable row_type row protected bool eoq public provider_data : plog public std::ostream * log public std::ostream * log std::ostream *pos public std::swap public return pos public const metadata& meta int icol const public return row[c] protected template <typename T> const dbstreams::query& insert_quoted int icol T datum protected template <typename T> const dbstreams::query& insert_unquoted int icol T datum dbstreams/doc/provider_guide.sgml010066400017500000000000000557151077600007000172450ustar00jklowdenwheel dbstream"> dbstatus"> dbquery"> provider"> provider_data"> next_row"> execute"> insert"> extract"> send"> goodbit"> failbit"> badbit"> eofbit"> ]> $Date: 2008/04/05 22:52:05 $ $Revision: 1.5 $ <classname>dbstreams</classname> Provider Reference Reference Manual for a dbstreams Provider class James K. Lowden 2008 James K. Lowden About this Manual So you'd like to write or modify a dbstreams::provider class. Wonderful! This manual is meant for you. It describes the purpose and role of the &provider; class, and defines its interface. It does not describe any particular provider. Rather, it describes — prescribes, really — what a provider must do and be. This is a normative document. That is, it defines how a &provider; is supposed to behave, what a &dbstream; expects of it, and what information about the underlying native library it is allowed or required to expose. While the source code of other providers — and of dbstreams — will tell you how something works, it won't tell you much about requirements and expectations. Thus this manual. The manual is divided into two parts. Part 1 describes the provider's design in terms of dbstreams: what it does, why it exists, how it's used. Part 2 describes each &provider; functions. A provider that implements the whole interface can be substituted for any other provider. You are reading revision &revision;, current as of &asof;. The latest revision can be found at . And now, on with the show. Design and Implementation</> <subtitle>Why the &provider; exists, and what it does</> <section id="design.layers"> <title>Independent and Dependent Layers</> <abstract><para> The <classname>dbstreams</> library is really two layers: the database-independent part, and the database-dependent part. </para> </abstract> <para>The independent part is the stream layer. It defines the public interface used by applications. It has no knowledge of what kind of server or native library is used to communicate with the server. The stream layer concentrates instead on implementing the stream metaphor. </para> <para>The &provider; layer is database-dependent. It <quote>generifies</> the native database library, <emphasis>providing</> a uniform interface for use by <classname>dbstreams</>. </para> <para> What does <quote>generify</> mean? It means to create a uniform way to: <itemizedlist> <title><quote>Generification</> features Describe a user or account Connect to a server Send a query Insert and Extract data Handle errors Manage the stream state Easier said than done. Server implementations and native client libraries vary in the way the define users, databases, datatypes, and errors. Certainly the primary challenge in the design of the provider interface is define all those things uniformly, such that no information is lost and no idiosyncrasies are passed. Before a &dbstream; can be used (and normally at construction) the application passes a token (of type provider_type) designating the provider to be used. This is unfortunately necessary because there is no way to interrogate the server about its implementation, no way to know from the outside whether we're talking to, say, an Oracle or Postgres server. The &dbstream; class instantiates the appropriate provider, storing its address in &provider; *pprovider. All providers are derived from &provider;, which defines storage for some member variables and defines the calling interface as a set of pure virtual functions.
Terminology</> <variablelist><title>Terms used in this document</> <varlistentry> <term>Stream Layer</term> <listitem><para> The public, database-independent classes, used by the application. </para></listitem> </varlistentry> <varlistentry> <term>Provider</term> <listitem><para> The abstract &provider; class or one of its concrete implementations.</para></listitem> </varlistentry> <varlistentry> <term>Driver</term> <term>Native Library</term> <listitem><para> The C-callable library that is used to communicate with the database server.</para></listitem> </varlistentry> </variablelist> </section> </section> <section id="design.classes"> <title>Provider Classes
&provider; Class All providers are derived from one abstract base class: &provider;. This &provider; class defines a set of pure virtual functions that constitute the provider interface to the &dbstream; class. The stream requires of the provider some typedefs and some functions. provider public provider_data protected urhandle _handle protected mutable STATUS state public virtual ~provider &absvirtmethods;
&dbstatus; Class
Purpose </> <para>&dbstatus; holds all the status information produced by the native library. It is populated by the provider and read by the stream (and by the application). Because no driver produces information for every field in &dbstatus;, at any one time some are inevitably not used. (It's up to the provider documentation to tell the application programmer what to expect.) </para> <para> In addition to native status information, &dbstatus; holds the stream's state word. Precisely analogous to <classname>std::ios_base::iostate</>, <classname>dbstreams::dbstatus::state</> reduces the state of the connection to good, bad, fail, and eof. </para> <para> The main service provided by dbstreams is, if you will, <firstterm>streamification</>: the representation of the database connection as a stream. Being the layer closest to the connection, it is the provider's job to set the stream status. </para> </section> <section id="design.classes.dbstatus.philosophy"> <title>State and Error Philosophy </> <para> The application programmer is better off getting the native library's errors verbatim. He knows what those mean. Attempts to classify them or be otherwise helpful will only tend to obfuscate them. </para> <para> Most errors seen by the application will therefore come from the native library. Very few are caught by the dbstream or provider layer. The primary exception is stream state management. </para> </section> <section id="design.classes.dbstatus.management"> <title>Managing a &dbstream; State </> <para> The provider supplies status information to the stream via a &dbstatus; object, or something that has the same interface as &dbstatus; has. To make that easier to do, the provider has a template argument for the status class. The application programmer may extend &dbstatus; without changing &dbstream; or any provider. </para> <para> The &dbstream; object is relatively lightweight, in that it doesn't track the state of the connection, doesn't require that functions be called in a certain order. It just translates the stream operations into calls to the provider. <footnote><para> This is not optimal. The sooner and higher an error is caught, the better. Certainly it's better, at the very least, for &dbstream; to insist on rational use of the <emphasis>stream</>. </para></footnote> </para> <para> For this reason, the provider may call on the native library to do something stupid, such as fetching rows before opening a connection. If that happens, the least the provider should do, of course, is return the native error. But if the provider is clever enough to detect such logical sequence errors (perhaps with the aid of the native library), it may throw an error. That will help the application programmer find his mistake. </para> </section> <section id="design.classes.dbstatus.interface"> <title>&dbstatus;</> <para> <classsynopsis language = "c++"> <ooclass> <classname>dbstatus : public std::runtime_error</classname> </ooclass> &dbstatusmethods; </classsynopsis> </para> </section> <!-- design.classes.dbstatus.interface --> <section id="design.classes.dbstatus.errors"> <title>Return Errors</> <para> Every native database C library has some way to return an error number and an associated message. The provider puts these in its STATUS object, which both can be queried by the status() method, and is returned (as a const reference) by many functions. </para> <para> When an error occurs, the provider calls STATUS::notify(). The application can override that method (by deriving from dbstatus) and use it to report errors to the user. </para> </section> <!-- design.classes.dbstatus.errors --> <section id="design.classes.dbstatus.state"> <title>Manage State</> <para> It is the provider's responsibility to set the iostate of the stream. </para> <para> The stream's overall state is communicated to the application via the bitmask in dbstatus::state. To the application, the only important question is if the stream is usable and whether results are pending. The application learns the answer by examining the stream's state: <variablelist><title>Stream States</> <varlistentry> <term>goodbit</term> <listitem><para>OK, no data pending</para></listitem> </varlistentry> <varlistentry> <term>eofbit</term> <listitem><para>last row of current results read, more pending</para></listitem> </varlistentry> <varlistentry> <term>failbit</term> <listitem><para>current operation failed, no data pending</para></listitem> </varlistentry> <varlistentry> <term>badbit</term> <listitem><para>stream is unusable</para></listitem> </varlistentry> </variablelist> </para> <para> The end-of-file marker handling differs somewhat from the std::iostream model and bears explication. </para> <para> Recall that when reading a file with std::istream, ios::eofbit is set when the end of the file has been read. Because the operation failed (almost always), failbit is set as well. If tested if() or while(), the ifstream returns false. A query may contain more than one SELECT statement. Some kind of result-separator is required to indicate to the application that the stream has reached the end of one result, and whether or not more are pending. The eofbit status serves this purpose. </para> <para> On reaching the end of one resultset, the provider sets eofbit. It then determines if more data are pending (from a subsequent SELECT statement). If there are pending data, *only* eofbit is set. </para> <para> The combination eofbit + failbit indicates the last row-reading operation failed. It is how the application knows it has reached the end of the data sent by the server. </para> <para> To be precise, there may be no data pending: the next resultset may be empty. Consider this query: <userinput> select 1 as 'one' select 'a' as 'A' where 0=1 </userinput> The state sequence will be: <informaltable><tgroup cols="2"> <thead> <row> <entry><emphasis>State</></entry> <entry><emphasis>Meaning</></entry> </row> </thead> <tbody> <row> <entry>goodbit</entry> <entry>got row 1 from resultset 1</entry> </row> <row> <entry>eofbit</entry> <entry>end of resultset 1</entry> </row> <row> <entry>eofbit | failbit</entry> <entry>end of resultset 2</entry> </row> <!--row> <entry></entry> <entry></entry> </row --> </tbody> </tgroup> </informaltable> Queries that return no results (no columns or an empty set) leave the stream in goodbit state. </para> <para> If the query fails, failbit is set and no attempt is made to fetch rows. The application sees this as:</para> <para> if( !db && !db.eof() )</para> <para> or</para> <para> if( db.error() ) </para> <para> Getting state right is one of the challenges of writing a provider. The consolation is that the challenge, now answered by the provider, is no longer left to the application. </para> </section> <!-- design.classes.dbstatus.state --> </section> <!-- design.classes.dbstatus --> <section id="design.classes.provider_data"> <title>&providerdata; Class The provider_data class, strictly speaking, is optional. It's handy to derive a provider from it privately, because its constructor initializes the data and most providers need &providerdata;'s members. provider_data &providerdatamethods; The log method sets a log stream for debugging purposes. It returns the prior log stream in case the caller wants to restore it later. It's up to the provider to decide what to put in the log.
&provider; Methods</> <section id="methods.construction"> <title>Construction and Destruction</> <simplelist type="vert"> <!-- grep -E 'public|odbc\(' ../include/provider/odbc.h \ | ./sgml.gen | sed 's/methodsynopsis/constructorsynopsis/g' --> <member> <constructorsynopsis><modifier>public</> <methodname>odbc</methodname> <void> </constructorsynopsis></member> <member> <constructorsynopsis><modifier>public</> <methodname>odbc</methodname> <methodparam> <parameter>const odbc&</parameter> </methodparam> </constructorsynopsis></member> <member> <constructorsynopsis><modifier>public</> <methodname>odbc</methodname> <methodparam> <type>const std::string&</type> <parameter>username</parameter> </methodparam> <methodparam> <type>const std::string&</type> <parameter>password</parameter> </methodparam> </constructorsynopsis></member> <member> <destructorsynopsis><modifier>public</> <methodname>~odbc</methodname> <void> </destructorsynopsis></member> </simplelist> <para> The default constructor does very little, because &providerdata; initializes most data members. </para> <para> Most providers require a username and password to open a connection to the database. Those that don't can ignore the parameters, but must provide the constructor anyway, in case the application insists on passing them. </para> <para>The copy constructor copies only the authentication information. </para> <para> The destructor frees any resources and closes the connection. Throws an exception if the native library returns an error. </para> </section> <!-- methods.construction --> <section id="methods.open"> <title>Open and Close</> <simplelist type="vert"> &provideropen; </simplelist> <para> The first form opens a connection to the database. Failure is indicated through the returned object.</para> <para> The second form initiates insertion into a table. </para> <para> The provider should make every attempt to close the connection successfully. If that is not possible — say, because a user-defined transaction is uncommitted — the native library will almost certainly return an error. If it does, the provider throws its &dbstatus; object. </para> </section> <!-- methods.open --> <section id="methods.low"> <title>Low-level Access</> <simplelist type="vert"> &providerhandle; &providerSQL; </simplelist> <para> The provider offers its native handle for use by the application as a last resort. It can also be very handy to inspect the SQL associated with a particular error, especially when the provider has constructed the SQL from higher-level operations. </para> </section> <!-- methods.low --> <section id="methods.exec"> <title>Execute Queries</> <simplelist type="vert"> &providerexecute; </simplelist> <para> The <classname>dbstream</> calls its provider's <methodname>execute</> method whenever a query is inserted. </para> <para> <methodname>execute</> may call upon the native library more than once. It stops when it finds that either: 1) the SQL has been completely processed, or 2) the server has returned a resultset. </para> <para> If a resultset is returned, <methodname>execute</> returns the result of <methodname>next_row</>. </para> </section> <!-- methods.exec --> <section id="methods.fetch"> <title>Fetch Results</> <simplelist type="vert"> &providernextrow; </simplelist> <para> The job of &nextrow; is simply to make the native library ready to provide data for the next row. The &nextrow; function need not necessarily read those data.</para> <para> &nextrow; is called by &execute;, to set up the first row. Subsequent calls are generated by the &dbstream; when the application increments it. After the last row has been fetched, &eofbit; is returned. If further data are pending, the next call to &nextrow; returns the first row of the next resultset. </para> <para> On success, &nextrow; sets the state to &goodbit;. After the last row is fetched, the state is set to &eofbit;. If no data are pending — that was the last row from the last SELECT statement — &failbit; is also set. </para> <para> User-recoverable errors are indicated by setting the state to &failbit; alone. </para> <para> Logical sequence errors — e.g. calling &nextrow; before &execute; — throw an error. The application should never ask for functions out of order. </para> </section> <!-- methods.fetch --> <section id="methods.meta"> <title>Metadata</> <simplelist type="vert"> &providermeta; &providerncolumns; </simplelist> <para> &providerdata; has this member:</para> <para> <fieldsynopsis><modifier>public</><modifier>mutable</> <type>std::vector<cell> </type> <varname>row</varname> </fieldsynopsis> </para> <para> and <classname>cell</> is:</para> <para> <structname>struct cell : public metadata</></para> <para> Each element of the row has both data and metadata. The row should be resized, and its metadata set, as soon as the number of columns is known and metadata are available. </para> </section> <!-- methods.meta --> <section id="methods.insert"> <title>Inserting data</> <simplelist type="vert"> &providerinsert; &providersend; </simplelist> <para> The provider defines &insert; methods for all datatypes it supports. These must include <classname>metadata::nullitude</> because &dbstream; uses that to insert NULLs. </para> <para> Each insert operation records the inserted data and increments the "current column" until &send; is called. At that point, the provider adds the row to the table by whatever means the native library offers. It updates the STATUS object, increments (on success) the STATUS row counter, and resets the current column to 0. </para> <para> For providers that insert rows via an INSERT statement, &dbquery; has methods that make constructing the SQL and quoting the data easier. </para> <para> Row count is maintained by the provider in the STATUS object. </para> </section> <!-- methods.insert --> <section id="methods.extract"> <title>Extracting data</> <simplelist type="vert"> &providerextract; </simplelist> <para> The &extract; methods modify their second argument. The datatype is provided by the function's signature, and data conversion is done using functions provided by the native library. </para> <para> The <varname>len</> argument and the return code are related. For normal fetches, <varname>len</> will hold the length of the variable-length string or, for fixed-length datatypes (e.g. int), the value returned by the sizeof() operator. The return code of &extract; indicates whether or not the value is NULL; a TRUE value indicates data are present, i.e. not NULL.</para> <para> As of this writing, &dbstream; discards the return code of &extract; because the only way for an application to discover a column is NULL is through the cell interface (invoked via operator[])</para> <para> Experience suggests that applications seldom request NULL data and anyway can't represent it using built-in types. Only general-purpose tools, such as interactive SQL tools, need to distinguish between zero data and NULL data. Such tools will likely use the cell interface anyway. </para> </section> <!-- methods.extract --> </chapter> <!-- methods --> </book> ���������������������������������������������������dbstreams/doc/sgml.gen������������������������������������������������������������������������������0100775�0001750�0000000�00000006521�10753777513�0015023�0����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl # $Id: sgml.gen,v 1.2 2008/02/11 07:54:51 jklowden Exp $ $methodsynopsis=<<'METHOD'; <methodsynopsis>%s <type>%s</type> <methodname>%s</methodname> %s </methodsynopsis> METHOD $modifier = '<modifier>%s</>'; $methodparam=<<'METHODPARAM'; <methodparam> <type>%s</type> <parameter>%s</parameter> </methodparam> METHODPARAM sub make_entities($) { my ($name) = @_; $name =~ s/\&/\&/g; $name =~ s/\</\</g; $name =~ s/\>/\>/g; return $name; } $destructorsynopsis=<<'DESTRUCTOR'; <destructorsynopsis>%s <methodname>%s</methodname> <void> </destructorsynopsis> DESTRUCTOR sub destructor_synopsis($) { my ($scope) = @_; s/\(\).+$//; s/^\s*//g; printf $destructorsynopsis, sprintf($modifier, $scope), $_; } $fieldsynopsis=<<'FIELDSYNOPSIS'; <fieldsynopsis>%s <type>%s</type> <varname>%s</varname> </fieldsynopsis> FIELDSYNOPSIS sub field_synopsis { my ($scope) = @_; $scope = sprintf($modifier, $scope); chomp; s/[{;].*$//; $_ = make_entities($_); @name = split; my $name = pop @name; my $type = join ' ', @name; printf $fieldsynopsis, $scope, $type, $name if $type; } sub get_line { my $inbrace; my $line = ''; while(<>) { if( /^(public|protected|private)/ ) { $scope = $1; print qq(<!-- scope now $scope -->\n); next; } next unless $scope; if( $inbrace ) { $inbrace-- if /}/ ; next; } s://.+$::; next if /^\s*$/; return undef if /^};/; # end of class if( s/{[^}]+}// ) { return $line . $_ if $line . $_ } # end of inline return $line . $_ if /\([^)]+\)/; # function declaration # skip definitions if( /{/ ) { return $line . $_ unless s/^\s*{//; # return declaration $inbrace++; next; } return $line . $_ if /;\s*$/; # end of declaration chomp; $line = $_; } } for( $_ = get_line(); $_; $_ = get_line() ) { if( /[~]/ ) { destructor_synopsis($scope); next; } if( ! /\([^)]*\)/ ) { field_synopsis($scope); next; } chomp; ($name, $args, $const ) = split /[()]+/; $const = $const =~ /const/? sprintf($modifier, 'const') : ''; # modifiers, type, name $name = make_entities($name); @names = split ' ', $name; $name = pop @names; $modifiers = sprintf($modifier, $scope); if( $names[0] eq 'virtual' ) { my $n = shift @names; $modifiers .= sprintf($modifier, $n); } my $type = join ' ', @names; if( $names[-1] eq 'const' ) { my $const = pop @names } @args = split /[,]/, $args; @params = (); foreach my $a (@args) { if( $a =~ /\&$/ ) { $a .= ' datum'; } my @arg = split ' ', make_entities($a); my $name = pop @arg; $name = 'icol' if $name eq 'c'; my $type = join ' ', @arg; if( $type ) { my $param = sprintf( $methodparam, $type, $name ) if $type; push @params, $param; } } push @params, "\t\t\t<void>\n" unless @params; push @params, "\t\t$const" if $const; printf $methodsynopsis, $modifiers, $type, $name, join('', @params) unless $type =~ /return/; # generate member lists of methods if( $ARGV =~ /absvirt.h/ ) { my $fname = "entities/provider.method.$name.sgml"; open OUT, ">>$fname" or die qq(could not open "$fname"\n); my $member = qq(<member>\t$methodsynopsis); chomp $member; $member .= "</member>\n"; printf OUT $member, $modifiers, $type, $name, join('', @params); } last if $name eq 'lookup'; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/userguide.dsl�������������������������������������������������������������������������0100664�0001750�0000000�00000004316�10753777064�0016064�0����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [ <!ENTITY dbstyle SYSTEM "/usr/pkg/share/sgml/docbook/dsssl/modular/html/docbook.dsl" CDATA DSSSL> ]> <style-sheet> <style-specification use="docbook"> <style-specification-body> ;; Instructions can be found in ;; The Modular DocBook Stylesheets ;; by Norman Walsh ;; See Chapter 3, "Customizing the Stylesheets" ;; http://docbook.sourceforge.net/release/dsssl/current/doc/custom.html ;; $Id: userguide.dsl,v 1.1 2008/02/11 07:50:12 jklowden Exp $ ;; For note, tip, and warning: include little ;; gifs of a hand pointing a finger, or a yield sign, and so on. ;; Much prettier to look at than text. (define %admon-graphics% #t) ;;(define %admon-graphics-path% "../images/") ;; In generating names of HTML pages, use the ;; section's "id" attribute, if present, to form the name. (define %use-id-as-filename% #t) ;; The filename of the root HTML document (excluding the extension). (define %root-filename% "index") (define %graphic-extensions% ;; graphic extensions allowed '("gif" "png" "jpg" "jpeg" "tif" "tiff" "eps" "epsf" )) (define %graphic-default-extension% "gif") ;; Indent "screen" sections. ;; http://docbook.sourceforge.net/release/dsssl/current/doc/html/indent-screen-lines.html (define %indent-screen-lines% ;; Indent lines in a 'Screen'? #f) ;; If %html40% is true then the output more closely resembles HTML ;; 4.0. In particular, the HTML table module includes COL, THEAD, ;; TBODY, and TFOOT elements, and the output documents have a proper ;; doctype declaration. (define %html40% ;; Generate HTML 4.0 #t) ;; Should the role attribute of emphasis be propagated to HTML as a ;; class attribute value? Source Code (define %emphasis-propagates-style% ;; Support propagating emphasis role attributes to HTML #t) ;; Generate links to the FreeTDS HTML stylesheet to control the ;; browswer's rendering of certain classes of elements e.g. < userinput >. ;; The stylesheets (version 1.57) wrapped userinput in < b >< /b >, but ;; version 1.79 doesn't. (define %stylesheet% "userguide.css") </style-specification-body> </style-specification> <external-specification id="docbook" document="dbstyle"> </style-sheet> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/userguide.css�������������������������������������������������������������������������0100664�0001750�0000000�00000000447�10754754420�0016063�0����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * $Id: userguide.css,v 1.1 2008/02/14 06:00:48 jklowden Exp $ */ /* Set the screen background to gray */ .SCREEN { background-color: #F0F0F0; } /* Render user input as boldface */ .USERINPUT { font-weight: bold; } /* Make filenames green (why not?) */ .FILENAME { color: #007a00; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/www.css�������������������������������������������������������������������������������0100664�0001750�0000000�00000001301�10754754420�0014701�0����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SPAN.BOOK, SPAN.HOLDER, SPAN.YEAR, SPAN.COPYRIGHT, SPAN.AUTHOR, SPAN.STRUCTNAME, SPAN.CONSTRUCTORSYNOPSIS, SPAN.MEMBER, SPAN.CHAPTER, SPAN.SECTION, SPAN.TBODY, SPAN.USERINPUT, SPAN.FIRSTTERM, SPAN.METHODPARAM, SPAN.PARAMETER, SPAN.METHODSYNOPSIS, SPAN.METHODNAME, SPAN.DESTRUCTORSYNOPSIS, SPAN.TYPE, SPAN.FIELDSYNOPSIS, SPAN.CLASSSYNOPSIS, SPAN.MODIFIER, SPAN.OOCLASS, SPAN.TERM, SPAN.VARNAME, SPAN.FOOTNOTE, SPAN.EMPHASIS, SPAN.QUOTE, SPAN.SUBTITLE, SPAN.TITLE, SPAN.PREFACE, SPAN.CLASSNAME, SPAN.PARA { font-family: Times New Roman,serif; font-weight: 500; font-style: normal; font-size: 10pt; color: #000000; } DIV { margin-top: 0pt; margin-bottom: 0pt; margin-left: 0pt; margin-right: 0pt } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/htdoc���������������������������������������������������������������������������������0040775�0001750�0000000�00000000000�10776000070�0014362�5����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/htdoc/CVS�����������������������������������������������������������������������������0040775�0001750�0000000�00000000000�10776000070�0015015�5����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/htdoc/CVS/Root������������������������������������������������������������������������0100664�0001750�0000000�00000000032�10760167111�0015735�0����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/usr/local/cvs.repository ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/htdoc/CVS/Repository������������������������������������������������������������������0100664�0001750�0000000�00000000046�10760167111�0017176�0����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������projects/database/dbstreams/doc/htdoc ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/htdoc/CVS/Entries���������������������������������������������������������������������0100664�0001750�0000000�00000000216�10776000070�0016424�0����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/index.html/1.7/Sat Feb 16 15:32:42 2008// /rationale.html/1.5/Sat Feb 16 15:32:42 2008// /classes.desc.html/1.7/Sat Apr 5 22:42:00 2008// D ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dbstreams/doc/htdoc/classes.desc.html���������������������������������������������������������������0100664�0001750�0000000�00000044153�10776000070�0017705�0����������������������������������������������������������������������������������������������������ustar�00jklowden������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>dbstreams Classes

dbstreams: Classes

This section describes the dbstream classes. It's meant as an in introduction, not a reference manual, more of a what-and-why than a how-to. Detailed descriptions can be found in the reference manual. (TODO: write reference manual.) We begin with the helper classes because they're part of a dbstream, end with dbstream itself.

Primary Classes

  • Applications interact primarily with a dbstream, which behaves largely like a std::iostream.
  • SQL text is kept in a query object. Inserting a query into the stream prepares the query, and, unless is contains parameters (placeholders), executes it.
  • A provider class (there are several) wraps a native database client library e.g., ODBC, in a uniform API for use by dbstream. It implements a set of pure virtual functions.

Other Classes (abbreviated)

  • login holders user authentication information.
  • metadata describes a column or parameter.
  • cell describes a fetched value or parameter.
  • dbstatus holds stream state information and library/server messages.

All classes live in the dbstreams namespace. Among other things, this avoids conflict with the std namespace while permitting use of some of the same names.

provider

provider is an abstract class. It defines, through pure virtual functions, how dbstreams will access a native library. Each native library (and hence server) supported by dbstreams has its own provider.

The application never uses the provider directly. Understanding that it exists and the role it plays helps in understanding the design and use of dbstreams.

query

The fundamental reason for the existence of the query object is to allow the dbstream to distinquish an inserted query from ordinary data.

A query object is basically a std::string. You can assign a std::string to it. The operator<<(const std::string&) is also supported because it makes query building easier.

login

A login object holds user credentials, whatever that might mean. When one dbstream is copied to another, its credentials are what's actually copied.

metadata

As soon as the query is executed — that is, after the query object is inserted into the dbstream — the first row of results is available. The provider gathers the metadata of each column: name, number, type, size, and nullability. .

cell

A cell is an intermediate object, seldom used by applications. It is used when there's a need to hold a typeless value, normally something returned from the database whose destination (and hence type) is not yet known. Operators are defined to assign/extract the value to/from built-in types.

Because cell is derived from metadata, a cell knows its name, ordinal position in the row, and datatype.

A cell does not convert from one type to another. If an integer is assigned to it and a string is read, the result is an exception. [TODO: throw exceptions.]

dbstatus

dbstatus is quite complicated. It's rarely examined directly, but it's returned by many dbstream operations. Because lots of status information orginates within the provider, the provider's status object — typically dbstatus or a derivative — is a template argument to the provider. For example, for the SQLite provider:

	template <typename STATUS>
		class SQLite : private provider_data

dbstatus is actually what's tested in contructs such as

	if( db ) 

which amounts to something like

	if( dbstream<dbstatus>::dbstatus::operator void*() )

although it's quite a bit less typing.

Stream State

	enum iostate { goodbit, badbit, eofbit, failbit = 4  };
	bool good() const;
	bool bad() const;
	bool fail() const;
	bool eof() const;
	iostate rdstate();
	iostate setstate( iostate state );
	iostate clear( iostate state = goodbit );

dbstatus defines the state status bits and the functions that get/set them. It is modelled on std::ios and uses the same names for the status bits and functions. If you know those, you're good to go. If you don't they're good to know.

One of the challenges of the library writer is to make things as simple as possible, but no simpler. It's one thing to say “a database is like a file”; it's something else to reduce a connection's states to those of a stream. It's not easy but it is possible. It's also one of the reasons dbstreams is easy to use.

Besides state, dbstatus holds the native error number and message when an error occurs. The provider may also choose to include the file and line number where the error occurred, especially helpful for exceptions. Oh, and dbstatus is sometimes thrown, as you can see from the above example.

dbstatus has two functions for managing messages from the server.

notify
This is called whenever a server delivers an error message, before any associated data are delivered. The default action is to write the message to std::cerr. It can of course be overridden by deriving a new class.
quit
Nominally, this is called by the provider to determine whether or not to proceed with the current operation. So far, it hasn't been needed.

dbstream

	template <typename PROVIDER, typename STATUS>
	class dbstream : private dbstream_data

Construction and Destruction

	dbstream();
	dbstream( const dbstream& that );
	dbstream( const std::string& username, const std::string& password ); 

Like a std::iostream, there's a default constructor. It's initialized to dbstatus::goodbit because that's how iostreams work.

There are differences, too. One constructor accepts a username and password that will be used when opening connections. And the copy constructor has defined behavior: the login credentials are copied, and a new connection is formed to the same server and database.

There is no constructor that takes a servername because it's too confusing. Forming a connection can require up to four (and sometimes more) strings: username, password, servername, database. There's no logical order to them and no way for the constructor to distinquish among them by type. So we limit construction to authentication and relegate database information to the open methods.

	~dbstream(); 

The destructor frees any resources and closes the connection. May throw an exception if the provider detects an error from the native library.

Open and Close

	const dbstatus& open( const std::string& server, 
			      const std::string& dbname, 
			      const std::string& tablename = std::string() );
	const dbstatus& open( const std::string& tablename );

In the first form, a connection is formed to the database. The returned dbstatus object should be tested before proceeding; it will not throw an error. The optional tablename argument opens a table by calling the second form.

The second form “opens a table”, meaning it readies the stream to write data to the table via the operator<< and write methods.

	void close();

As with an iostream, no error is returned. If the provider detects a “can't happen” condition, it throws an exception. This guards against silently discarding data in an open transaction, and encourages discovery of such impossible situations.

Stream Status

	const dbstatus& status() const;
	operator const void*() const;
	bool eof() const;
	bool error() const;

If desired, the stream's provider's status object — normally dbstatus or a derivation — can be retrieved and dealt with explicitly.

Normally, that's not necessary except to handle errors. For go/no-go decisions, the question is whether or not the stream has more data available for extraction. For that purpose,

	if( db )

and

	if( db.eof() )

normally suffice.

The eof test departs slightly from iostreams to support record-oriented operations. A query may produce several result sets, and an application wants to distinguish between them. A dbstream signals the end of a resultset with dbstatus::eofbit but not failbit. failbit is set only if there are no data pending, no further results to be read.

The void* operator (a fancy boolean) tests for failbit and not for eofbit. In an iostream, that's fine, because the stream will set eofbit and failbit whenever end-of-file is reached. A dbstream, in contrast, will exhibit transient eof status as each resultset is read.

The use pattern changes slightly from iostream for dbstreams. In iostreams, one might say:

iostream pattern

	ifstream is("f");
	while( is ) {
		int i;
		is >> i;
		cout << i << endl;
	}

whereas a dbstream has two loops and checks for eof:

dbstream pattern

	db.open("server", "database");
	query sql("select * from A; select * from B;");
	// while any results are pending
	for ( db << sql; db; db++ ) {
		// process each resultset
		for( ; ! db.eof(); db++ ) {
			int i;
			db >> i;
			cout << i << endl;
		}
	}

In the real world, there would obviously be different things to do depending on which resultset was being read.

The dbstream has record semantics: operator>> extracts a column value to a variable and advances to the next column. operator++ advances to the next row. Attempts to extract beyond end-of-row result in an exception being thrown.

Note that operator++ is called at the end of each loop. This is a deliberate choice, to simplify the caller's life. The sequence is:

	next, row N-1, good
	next, row N, good
	next, row N+1, eof	// next results pending
	next, row 1, good	// start of next result
	...
	next, row N, good
	next, row N+1, eof + fail // no more results

If the stream were not incremented in the outer loop, something else would have to clear the eof condition, else the inner loop would never fetch the second resultset. Incrementing seemed the most natural way.

Logging

	std::ostream* log( std::ostream * pos );

For debugging purposes, the application may open a std::iostream and pass it to the dbstream for logging. What appears in the log is up to the provider. Normally the log output is not interesting to the application programmer, but it can be very helpful to the provider author.

Execute Queries

The query object was discussed above. For simple queries, execution is simply a matter of inserting the query into the stream.

	dbstream<dbstatus> db(provider, username, password);
	db.open( servername, database );	

	query q = "select * from T";

	db << q;

Parameterized queries are beyond the scope of this document. Briefly, the application constructs a parameter_type for each parameter and inserts that into the stream after the query. End-of-parameter-data is indicated by inserting dbstreams::endl into the stream.

Metadata

	const metadata& meta(int c) const;
	int columns() const;
	int rows() const;

Metadata are available immediately after executing a query. If a resultset was produced, the column count is also immediately available. (For most providers, this is true even if the resultset has no rows).

As each row is fetched (or sent) the row counter is updated by the provider. The application can keep count itself, of course, and it can also interrogate the counter with the row method.

Insert and Extract

	template <typename D>
		dbstream<PROVIDER>& 
			operator<<( const D& datum );

Insertion, as described earlier, directly mimics iostreams. There is even a dbstream manipulator, dbstreams::endl, to signal end-of-row.

		db.table( "T", bcpmode );
		db << 4    << 4.4  << "four"  << endl
		   << null << 5.5  << "five"  << endl
		   << 6    << null << "six"   << endl;

Different providers have different capabilities. Some providers build an INSERT statement from the insertion sequence. Others have ways to accept data other than via SQL, ways that can be faster. Sybase, for example, has a bulk-copy mode that lets the client send the server data in much the same way the server sends the client data. For providers with such a feature, there is another manipulator, eob, to signify end-of-batch.

	struct c
	{
		std::string colname;
		c( const std::string& colname );
	};

	dbstream<PROVIDER>&  operator>>( const dbstreams::c& c );

	template <typename D>
		dbstream<PROVIDER>& 
			operator>>( D& datum );

Data can be read from a row in column order, just as with any stream. The c structure, when “extracted” to, simply sets the streams's current column number according to the struct's colname. In that way:

	db >> c("phone") >> phone;

sets db:icol to N, where N is the column whose name is "phone". That operation returns a reference to the stream. Next the data are extracted from the stream into the variable phone. The stream uses its current column number, still N. N is incremented after the extraction.

Read and Write

	class a_container
	{
	public:
		template <typename OS>
			OS& read( OS& os );
		template <typename OS>
			OS& write( OS& os );
	};
	
	template <typename CONTAINER>
		dbstream<PROVIDER>& 
			read( CONTAINER& container ); 

To read a value requires an operator, but to read a whole resultset requires a function. And a place to put the data.

dbstream::read requires a standard STL container (or something very similar). It calls the elements's read method repeatedly, incrementing the stream each time, until eof. It is up to the container's element class to define what is to be done with the stream, i.e. which columns to assign to which member variables.

	template <typename CONTAINER>
		dbstream<PROVIDER>& 
			write( CONTAINER& container ); 

dbstream::write has the same standard STL container requirements. It iterates over the container, calling the element's write method for each one. If dbstream::write encounters a stream error, it throws a std::runtime_error exception.

Observe: the loops are already written for you. You don't declare iterators, worry about off-by-one errors, dereference pointers, nothing. Just define how your container elements read and write themselves to a dbstream, and call the appropriate dbstream function. What could be easier?


$Id: classes.desc.html,v 1.7 2008/04/05 22:56:44 jklowden Exp $

Comments, questions, and encouraging words are welcome. Please email the author, James K. Lowden.

Valid HTML 4.01 Strict

dbstreams/doc/htdoc/index.html010066400017500000000000000033721075560103200164420ustar00jklowdenwheel dbstreams

dbstreams: the C++ database library

dbstreams is a C++ library for database access, modelled on std::iostreams. It is currently under active development.

Prose

  • Rationale Why dbstreams was written, and why you should use it.
  • Classes A brief description of the classes in the dbstreams library.

Resources

Status

  • Development began October 2007.
  • Basic query processing works. No parameterized query or cursor support yet.
  • One working sample application.
  • Works with ODBC, SQLite, and Sybase/Microsoft DB-Library.

$Id: index.html,v 1.7 2008/02/16 15:32:42 jklowden Exp $

Comments, questions, and encouraging words are welcome. Please email the author, James K. Lowden.

Valid HTML 4.01 Strict

dbstreams/doc/htdoc/rationale.html010066400017500000000000000244571075560103200173200ustar00jklowdenwheel dbstreams Rationale and Philosophy

dbstreams: Rationale and Philosophy

Database as Stream

dbstreams is C++ class library modelled on std::iostreams in the C++ standard library. It treats a database connection as a source or sink for data. The basic operations are the same as for iostreams: open, close, read, and write (but not seek). State information similarly borrows from std::ios: a stream has a state word with enumerated values: goodbit, badbit, failbit, eofbit. And the notation is largely the same, with operator<< and operator>> serving the purpose of sending data to and reading data from the database. In general, the design mimics iostreams, permitting the same kind of terse, economical code.

Databases are similar to but not the same as files

  1. They are not uniform. They vary both by feature set and library API.
  2. They are record- rather than byte-oriented.
  3. Their output is self-describing, and applications need access to the metadata.
  4. They have much more complex error states.

A dbstream has record semantics. Manipulators and operators allow the programmer to extract from the stream by column name or number, and to advance to the next record. There are also read and write functions designed to interact with any STL container, provided the container's value_type defines read and write functions for a dbstream. This pattern is both easy to program and efficient, because only one copy need be made of your data en route to your application.

To handle errors in a consistent way, dbstreams has a dbstatus class. (Functionality can be added by extending it.) In addition to the native message and error code, dbstatus holds the file and line number where the error arose. The overall state of the connection can be determined in the same way as for a std::iostream, using methods (e.g. rdstate) of the same names.

Simplicity, not Portability

The dbstreams library does not seek to conceal or homogenize servers. There are no catalog operations. There is no transaction method. No attempt is made to unify various error numbers and messages. (In this way, dbstreams is also like iostreams: I/O is the same, but the content of the I/O differs.) That was a design choice and perhaps merits some explanation.

From the programmer's point of view, less is more. The more done to make all servers look alike, the thicker the layer of mediation needed, the less transparent that layer will be. If you depend on the mediation layer to unify error codes and whatnot, you will frequently be disappointed, because the devil is in the details.

If you know your database, abstraction layers interfere with getting at the real information. The dbstreams philosophy is that you know your database, its catalog, its flavor of SQL. In fact, more likely than not, it's the only database you know. Instead of hiding it, then, dbstreams exposes the server's features for you to exploit.

Lastly, “it's not portable until it's ported.” True portability is hard, and in most environments changing database vendors is extremely hard. dbstreams's goal isn't portability so much as simplicity, because the real problem most programmers face isn't the next database. It's the current one.

Containers

C libraries and those closely related typically define a recordset object of some kind, a container-of-containers, where is row is represented by a container of “typeless” elements that can then be converted to something useful. That was necessary (or helpful, anyway) in C, where there is no standard container class.

C++ has standard containers. By defining the container<->stream interaction directly, we obviate any need for a recordset. Poof! One aspect of library (and application) complexity disappears.

Errors and Exceptions

Exceptions are thrown when

  • the underlying library is used in an invalid way
  • the underlying connection becomes unusable

An example of in an invalid way would be trying to insert data before opening the connection. A connection is unusable when the library says so, as in when the remote server is no longer listening to it.

The first kind of error is in the “shouldn't happen” category. The dbstream interface is well defined, and a correctly designed application uses it such that the underlying libary is used rationally. The stream itself ensures the native library is given valid buffers and so on, and manages the stream state. Failure to do so is a serious error. By making such cases noisy, one hopes the error can be found and fixed.

The second kind of error is “unrecoverable”. The stream must be closed; nothing good can come from trying to continue using it. By putting the interaction in a try/catch block, control naturally returns to the top level, where it belongs.

“Normal” errors — invalid SQL, say, or requesting data for a nonexistent column name — do not throw exceptions. The operation fails and dbstatus::notify is called, but the stream is still valid. It can accept a new query; in some cases, it can continue with the next logical insert/extract operation. The application can monitor the stream's status, and can override dbstatus::notify as desired.

Library as Language: Good design is invisible®

A good library provides the application programmer with nouns and verbs suited to the problem domain. The programmer is freed to focus on the needs of the application. The application winds up being written in terms of the library more than the base language.

Every database programmer knows how far short database libraries fall of that description.

Properties of a good library

  • Terse, to get out of the way.
  • Expressive: basic functionality should be discernable on first reading.
  • Powerful, requiring minimum input to accomplish the task.
  • Flexible, allowing different levels of access.
  • Extensible, permitting uses not foreseen by the library author.

It would be too much to claim to have achieved all that. However, those are properties of the std::iostream library, and by adhering to that model as closely as possible, one might at least hope to stand on the shoulders of giants without falling off. This for sure: hewing closely to the std::iostream example was sometimes difficult, but in every case made dbstreams a better library.

Beneficial surprise

To illustrate, consider operator>> and operator<< to read and write data, and the role of a manipulator. In a dbstream, as in iostream, there are data and manipulators. Data sent to the stream are stored, whereas manipulators change the stream's state. The same is true of extraction: variables hold and manipulators do.

Like all good designs, this turns out to be more important and useful than seems on first reading. Manipulators can be of arbitrary complexity, which is good because sometimes databases seem to be arbitrarily complex. And for data the story is the same: any object, no matter how complex, can be inserted into the stream if it can be expressed in datatypes recognized by the database.

Now ask yourself: Is SQL data? Clearly not. Ergo, SQL is never inserted into the stream. Can't be; it's not data. How to send SQL to the server? Put it in a query object, and send that. A query object — unlike straight SQL — is distinct from character data. When the stream (and programmer) sees character data being sent, they both know for certain that those data will be stored. They likewise know what to expect when a query object is inserted into the stream.

Rationale

Many database client libraries — SQLite, Postgres, MySQL, to name but three — already offer a C++ interface. And quite a few cross-database libraries also exist. Why another?

In short: for the same reason you're reading this. They're not good enough.

Your humble author has looked at a dozen C++ libraries in some detail. None of them adheres to the principles described above. They are not terse; they do not simplify the programmer's work; they do not hide the complexity of the underlying API. They are verbose and idiosyncratic. The offer C-holdover features, e.g. recordsets, that are better replaced by standard containers. They are too hard to use. At least harder than need be.

In writing dbstreams, the intention is to make it the last database API you'll ever need to learn. That might not save you from learning another server, but at least you won't have to learn another API. Or, if you're confronted with a database for which there isn't yet a provider, you'll be able to write a provider, because the provider is just an API localization layer, something you'd likely write yourself anyway. Then you can get on with your application.


$Id: rationale.html,v 1.5 2008/02/16 15:32:42 jklowden Exp $

Comments, questions, and encouraging words are welcome. Please email the author, James K. Lowden.

Valid HTML 4.01 Strict

dbstreams/doc/htdoc/classes.desc.html~010066400017500000000000000435271077577275300201360ustar00jklowdenwheel dbstreams Classes

dbstreams: Classes

This section describes the dbstream classes. It's meant as an in introduction, not a reference manual, more of a what-and-why than a how-to. Detailed descriptions can be found in the reference manual. (TODO: write reference manual.) We begin with the helper classes because they're part of a dbstream, end with dbstream itself.

Primary Classes

  • Applications interact primarily with a dbstream, which behaves largely like a std::iostream.
  • SQL text is kept in a query object. Inserting a query into the stream prepares the query, and, unless is contains parameters (placeholders), executes it.
  • A provider class (there are several) wraps a native database client library e.g., ODBC, in a uniform API for use by dbstream. It implements a set of pure virtual functions.

Other Classes (abbreviated)

  • login holders user authentication information.
  • metadata describes a column or parameter.
  • cell describes a fetched value or parameter.
  • dbstatus holds stream state information and library/server messages.

All classes live in the dbstreams namespace. Among other things, this avoids conflict with the std namespace while permitting use of some of the same names.

provider

provider is an abstract class. It defines, through pure virtual functions, how dbstreams will access a native library. Each native library (and hence server) supported by dbstreams has its own provider.

The application never uses the provider directly. Understanding that it exists and the role it plays helps in understanding the design and use of dbstreams.

query

The fundamental reason for the existence of the query object is to allow the dbstream to distinquish an inserted query from ordinary data.

A query object is basically a std::string. You can assign a std::string to it. The operator<<(const std::string&) is also supported because it makes query building easier.

login

A login object holds user credentials, whatever that might mean. When one dbstream is copied to another, its credentials are what's actually copied.

metadata

As soon as the query is executed — that is, after the query object is inserted into the dbstream — the first row of results is available. The provider gathers the metadata of each column: name, number, type, size, and nullability. .

cell

A cell is an intermediate object, seldom used by applications. It is used when there's a need to hold a typeless value, normally something returned from the database whose destination (and hence type) is not yet known. Operators are defined to assign/extract the value to/from built-in types.

Because cell is derived from metadata, a cell knows its name, ordinal position in the row, and datatype.

A cell does not convert from one type to another. If an integer is assigned to it and a string is read, the result is an exception. [TODO: throw exceptions.]

dbstatus

dbstatus is quite complicated. It's rarely examined directly, but it's returned by many dbstream operations. Because lots of status information orginates within the provider, the provider's status object — typically dbstatus or a derivative — is a template argument to the provider. For example, for the SQLite provider:

	template <typename STATUS>
		class SQLite : private provider_data

dbstatus is actually what's tested in contructs such as

	if( db ) 

which amounts to something like

	if( dbstream<dbstatus>::dbstatus::operator void*() )

although it's quite a bit less typing.

Stream State

	enum iostate { goodbit, badbit, eofbit, failbit = 4  };
	bool good() const;
	bool bad() const;
	bool fail() const;
	bool eof() const;
	iostate rdstate();
	iostate setstate( iostate state );
	iostate clear( iostate state = goodbit );

dbstatus defines the state status bits and the functions that get/set them. It is modelled on std::ios and uses the same names for the status bits and functions. If you know those, you're good to go. If you don't they're good to know.

One of the challenges of the library writer is to make things as simple as possible, but no simpler. It's one thing to say “a database is like a file”; it's something else to reduce a connection's states to those of a stream. It's not easy but it is possible. It's also one of the reasons dbstreams is easy to use.

Besides state, dbstatus holds the native error number and message when an error occurs. The provider may also choose to include the file and line number where the error occurred, especially helpful for exceptions. Oh, and dbstatus is sometimes thrown, as you can see from the above example.

dbstatus has two functions for managing messages from the server.

notify
This is called whenever a server delivers an error message, before any associated data are delivered. The default action is to write the message to std::cerr. It can of course be overridden by deriving a new class.
quit
Nominally, this is called by the provider to determine whether or not to proceed with the current operation. So far, it hasn't been needed.

dbstream

	template <typename PROVIDER, typename STATUS>
	class dbstream : private dbstream_data

Construction and Destruction

	dbstream();
	dbstream( const dbstream& that );
	dbstream( const std::string& username, const std::string& password ); 

Like a std::iostream, there's a default constructor. It's initialized to dbstatus::goodbit because that's how iostreams work.

There are differences, too. One constructor accepts a username and password that will be used when opening connections. And the copy constructor has defined behavior: the login credentials are copied, and a new connection is formed to the same server and database.

There is no constructor that takes a servername because it's too confusing. Forming a connection can require up to four (and sometimes more) strings: username, password, servername, database. There's no logical order to them and no way for the constructor to distinquish among them by type. So we limit construction to authentication and relegate database information to the open methods.

	~dbstream(); 

The destructor frees any resources and closes the connection. May throw an exception if the provider detects an error from the native library.

Open and Close

	const dbstatus& open( const std::string& server, 
			      const std::string& dbname, 
			      const std::string& tablename = std::string() );
	const dbstatus& open( const std::string& tablename );

In the first form, a connection is formed to the database. The returned dbstatus object should be tested before proceeding; it will not throw an error. The optional tablename argument opens a table by calling the second form.

The second form “opens a table”, meaning it readies the stream to write data to the table via the operator<< and write methods.

	void close();

As with an iostream, no error is returned. If the provider detects a “can't happen” condition, it throws an exception. This guards against silently discarding data in an open transaction, and encourages discovery of such impossible situations.

Stream Status

	const dbstatus& status() const;
	operator const void*() const;
	bool eof() const;
	bool error() const;

If desired, the stream's provider's status object — normally dbstatus or a derivation — can be retrieved and dealt with explicitly.

Normally, that's not necessary except to handle errors. For go/no-go decisions, the question is whether or not the stream has more data available for extraction. For that purpose,

	if( db )

and

	if( db.eof() )

normally suffice.

The eof test departs slightly from iostreams to support record-oriented operations. A query may produce several result sets, and an application wants to distinguish between them. A dbstream signals the end of a resultset with dbstatus::eofbit but not failbit. failbit is set only if there are no data pending, no further results to be read.

The void* operator (a fancy boolean) tests for failbit and not for eofbit. In an iostream, that's fine, because the stream will set eofbit and failbit whenever end-of-file is reached. A dbstream, in contrast, will exhibit transient eof status as each resultset is read.

The use pattern changes slightly from iostream for dbstreams. In iostreams, one might say:

iostream pattern

	ifstream is("f");
	while( is ) {
		int i;
		is >> i;
		cout << i << endl;
	}

whereas a dbstream has two loops and checks for eof:

dbstream pattern

	db.open("server", "database");
	query sql("select * from A; select * from B;");
	// while any results are pending
	for ( db << sql; db; db++ ) {
		// process each resultset
		for( ; ! db.eof(); db++ ) {
			int i;
			db >> i;
			cout << i << endl;
		}
	}

In the real world, there would obviously be different things to do depending on which resultset was being read.

Note that operator++ is called at the end of each loop. This is a deliberate choice, to simplify the caller's life. The sequence is:

	next, row N-1, good
	next, row N, good
	next, row N+1, eof	// next results pending
	next, row 1, good	// start of next result
	...
	next, row N, good
	next, row N+1, eof + fail // no more results

If the stream were not incremented in the outer loop, something else would have to clear the eof condition, else the inner loop would never fetch the second resultset. Incrementing seemed the most natural way.

Logging

	std::ostream* log( std::ostream * pos );

For debugging purposes, the application may open a std::iostream and pass it to the dbstream for logging. What appears in the log is up to the provider. Normally the log output is not interesting to the application programmer, but it can be very helpful to the provider author.

Execute Queries

The query object was discussed above. For simple queries, execution is simply a matter of inserting the query into the stream.

	dbstream<dbstatus> db(provider, username, password);
	db.open( servername, database );	

	query q = "select * from T";

	db << q;

Parameterized queries are beyond the scope of this document. Briefly, the application constructs a parameter_type for each parameter and inserts that into the stream after the query. End-of-parameter-data is indicated by inserting dbstreams::endl into the stream.

Metadata

	const metadata& meta(int c) const;
	int columns() const;
	int rows() const;

Metadata are available immediately after executing a query. If a resultset was produced, the column count is also immediately available. (For most providers, this is true even if the resultset has no rows).

As each row is fetched (or sent) the row counter is updated by the provider. The application can keep count itself, of course, and it can also interrogate the counter with the row method.

Insert and Extract

	template <typename D>
		dbstream<PROVIDER>& 
			operator<<( const D& datum );

Insertion, as described earlier, directly mimics iostreams. There is even a dbstream manipulator, dbstreams::endl, to signal end-of-row .

		db.table( "T", bcpmode );
		db << 4    << 4.4  << "four"  << endl
		   << null << 5.5  << "five"  << endl
		   << 6    << null << "six"   << endl

Different providers have different capabilities. Some providers build an INSERT statement from the insertion sequence. Others have ways to accept data other than via SQL, ways that can be faster. Sybase, for example, has a bulk-copy mode that lets the client send the server data in much the same way the server sends the client data. For providers with such a feature, there is another manipulator, eob, to signify end-of-batch.

	struct c
	{
		std::string colname;
		c( const std::string& colname );
	};

	dbstream<PROVIDER>&  operator>>( const dbstreams::c& c );

	template <typename D>
		dbstream<PROVIDER>& 
			operator>>( D& datum );

Data can be read from a row in column order, just as with any stream. The c structure, when “extracted” to, simply sets the streams's current column number according to the struct's colname. In that way:

	db >> c("phone") >> phone;

sets db:icol to N, where N is the column whose name is "phone". That operation returns a reference to the stream. Next the data are extracted from the stream into the variable phone. The stream uses its current column number, still N. N is incremented after the extraction.

Read and Write

	class a_container
	{
	public:
		template <typename OS>
			OS& read( OS& os );
		template <typename OS>
			OS& write( OS& os );
	};
	
	template <typename CONTAINER>
		dbstream<PROVIDER>& 
			read( CONTAINER& container ); 

To read a value requires an operator, but to read a whole resultset requires a function. And a place to put the data.

dbstream::read requires a standard STL container (or something very similar). It calls the elements's read method repeatedly, incrementing the stream each time, until eof. It is up to the container's element class to define what is to be done with the stream, i.e. which columns to assign to which member variables.

	template <typename CONTAINER>
		dbstream<PROVIDER>& 
			write( CONTAINER& container ); 

dbstream::write has the same standard STL container requirements. It iterates over the container, calling the element's write method for each one. If dbstream::write encounters a stream error, it throws a std::runtime_error exception.

Observe: the loops are already written for you. You don't declare iterators, worry about off-by-one errors, dereference pointers, nothing. Just define how your container elements read and write themselves to a dbstream, and call the appropriate dbstream function. What could be easier?


$Id: classes.desc.html,v 1.3 2008/02/16 15:32:42 jklowden Exp $

Comments, questions, and encouraging words are welcome. Please email the author, James K. Lowden.

Valid HTML 4.01 Strict dbstreams/doc/htdoc/classes.desc.html.orig010066400017500000000000000414661077576474300206770ustar00jklowdenwheel dbstreams Classes

dbstreams: Classes

This section describes the dbstream classes. It's meant as an in introduction, not a reference manual, more of a what-and-why than a how-to. Detailed descriptions can be found in the reference manual. (TODO: write reference manual.) We begin with the helper classes because they're part of a dbstream, end with dbstream itself.

provider

provider is an abstract class. It defines, through pure virtual functions, how dbstreams will access a native library. Each native library (and hence server) supported by dbstreams has its own provider.

The application never uses the provider directly. Understanding that it exists and the role it plays helps in understanding the design and use of dbstreams.

query

The fundamental reason for the existence of the query object is to allow the dbstream to distinquish an inserted query from ordinary data.

A query object is basically a std::string. You can assign a std::string to it. The operator<<(const std::string&) is also supported because it makes query building easier.

dbstreams has as of this writing no direct support for parameterized queries, also known as placeholders. The query object will be the place to add them. The same could be said for asynchronous executions.

login

A login object holds user credentials, whatever that might mean. When one dbstream is copied to another, its credentials are what's actually copied.

metadata

As soon as the query is executed — that is, after the query object is inserted into the dbstream — the first row of results is available. The provider gathers the metadata of each column: name, number, type, size, and nullability. .

cell

A cell is an intermediate object, seldom used by applications. It is used when there's a need to hold a typeless value, normally something returned from the database whose destination (and hence type) is not yet known. Operators are defined to assign/extract the value to/from built-in types.

Because cell is derived from metadata, a cell knows its name, ordinal position in the row, and datatype.

A cell does not convert from one type to another. If an integer is assigned to it and a string is read, the result is an exception. [TODO: throw exceptions.]

dbstatus

dbstatus is quite complicated. It's rarely examined directly, but it's returned by many dbstream operations. Because lots of status information orginates within the provider, the provider's status object — typically dbstatus or a derivative — is a template argument to the provider. For example, for the SQLite provider:

	template <typename STATUS>
		class SQLite : private provider_data

dbstatus is actually what's tested in contructs such as

	if( db ) 

which amounts to something like

	if( dbstream<dbstatus>::dbstatus::operator void*() )

although it's quite a bit less typing.

Stream State

	enum iostate { goodbit, badbit, eofbit, failbit = 4  };
	bool good() const;
	bool bad() const;
	bool fail() const;
	bool eof() const;
	iostate rdstate();
	iostate setstate( iostate state );
	iostate clear( iostate state = goodbit );

dbstatus defines the state status bits and the functions that get/set them. It is modelled on std::ios and uses the same names for the status bits and functions. If you know those, you're good to go. If you don't they're good to know.

One of the challenges of the library writer is to make things as simple as possible, but no simpler. It's one thing to say “a database is like a file”; it's something else to reduce a connection's states to those of a stream. It's not easy but it is possible. It's also one of the reasons dbstreams is easy to use.

Besides state, dbstatus holds the native error number and message when an error occurs. The provider may also choose to include the file and line number where the error occurred, especially helpful for exceptions. Oh, and dbstatus is sometimes thrown, as you can see from the above example.

dbstatus has two functions for managing messages from the server.

notify
This is called whenever a server delivers an error message, before any associated data are delivered. The default action is to write the message to std::cerr. It can of course be overridden by deriving a new class.
quit
Nominally, this is called by the provider to determine whether or not to proceed with the current operation. So far, it hasn't been needed.

dbstream

	template <typename PROVIDER, typename STATUS>
	class dbstream : private dbstream_data

Construction and Destruction

	dbstream();
	dbstream( const dbstream& that );
	dbstream( const std::string& username, const std::string& password ); 

Like a std::iostream, there's a default constructor. It's initialized to dbstatus::goodbit because that's how iostreams work.

There are differences, too. One constructor accepts a username and password that will be used when opening connections. And the copy constructor has defined behavior: the login credentials are copied, and a new connection is formed to the same server and database.

There is no constructor that takes a servername because it's too confusing. Forming a connection can require up to four (and sometimes more) strings: username, password, servername, database. There's no logical order to them and no way for the constructor to distinquish among them by type. So we limit construction to authentication and relegate database information to the open methods.

	~dbstream(); 

The destructor frees any resources and closes the connection. May throw an exception if the provider detects an error from the native library.

Open and Close

	const dbstatus& open( const std::string& server, 
			      const std::string& dbname, 
			      const std::string& tablename = std::string() );
	const dbstatus& open( const std::string& tablename );

In the first form, a connection is formed to the database. The returned dbstatus object should be tested before proceeding; it will not throw an error. The optional tablename argument opens a table by calling the second form.

The second form “opens a table”, meaning it readies the stream to write data to the table via the operator<< and write methods.

	void close();

As with an iostream, no error is returned. If the provider detects a “can't happen” condition, it throws an exception. This guards against silently discarding data in an open transaction, and encourages discovery of such impossible situations.

Stream Status

	const dbstatus& status() const;
	operator const void*() const;
	bool eof() const;
	bool error() const;

If desired, the stream's provider's status object — normally dbstatus or a derivation — can be retrieved and dealt with explicitly.

Normally, that's not necessary except to handle errors. For go/no-go decisions, the question is whether or not the stream has more data available for extraction. For that purpose,

	if( db )

and

	if( db.eof() )

normally suffice.

The eof test departs slightly from iostreams to support record-oriented operations. A query may produce several result sets, and an application wants to distinguish between them. A dbstream signals the end of a resultset with dbstatus::eofbit but not failbit. failbit is set only if there are no data pending, no further results to be read.

The void* operator (a fancy boolean) tests for failbit and not for eofbit. In an iostream, that's fine, because the stream will set eofbit and failbit whenever end-of-file is reached. A dbstream, in contrast, will exhibit transient eof status as each resultset is read.

The use pattern changes slightly from iostream for dbstreams. In iostreams, one might say:

iostream pattern

	ifstream is("f");
	while( is ) {
		int i;
		is >> i;
		cout << i << endl;
	}

whereas a dbstream has two loops and checks for eof:

dbstream pattern

	db.open("server", "database");
	query sql("select * from A; select * from B;");
	for ( db << sql; db; db++ ) {
		for( ; ! db.eof(); db++ ) {
			int i;
			db >> i;
			cout << i << endl;
		}
	}

In the real world, there would obviously be different things to do depending on which resultset was being read.

Note that operator++ is called at the end of each loop. This is a deliberate choice, to simplify the caller's life. The sequence is:

	next, row N-1, good
	next, row N, good
	next, row N+1, eof	// next results pending
	next, row 1, good	// start of next result
	...
	next, row N, good
	next, row N+1, eof + fail // no more results

If the stream were not incremented in the outer loop, something else would have to clear the eof condition, else the inner loop would never fetch the second resultset. Incrementing seemed the most natural way.

	std::ostream* log( std::ostream * pos );

For debugging purposes, the application may open a std::iostream and pass it to the dbstream for logging. What appears in the log is up to the provider. Normally the log output is not interesting to the application programmer, but it can be very helpful to the provider author.

Execute Queries

The query object was discussed above. Execution is simply a matter of inserting the query into the stream.

Metadata

	const metadata& meta(int c) const;
	int columns() const;
	int rows() const;

Metadata are available immediately after executing a query. If a resultset was produced, the column count is also immediately available. (For most providers, this is true even if the resultset has no rows).

As each row is fetched (or sent) the row counter is updated by the provider. The application can keep count itself, of course, and it can also interrogate the counter with the row method.

Insert and Extract

	template <typename D>
		dbstream<PROVIDER>& 
			operator<<( const D& datum );

Insertion, as described earlier, directly mimics iostreams. There is even a dbstream manipulator, dbstreams::endl, to signal end-of-row .

Different providers have different capabilities. Some providers build an INSERT statement from the insertion sequence. Others have ways to accept data other than via SQL, ways that can be faster. Sybase, for example, has a bulk-copy mode that lets the client send the server data in much the same way the server sends the client data. For providers with such a feature, there is another manipulator, eob, to signify end-of-batch.

	struct c
	{
		std::string colname;
		c( const std::string& colname );
	};

	dbstream<PROVIDER>&  operator>>( const dbstreams::c& c );

	template <typename D>
		dbstream<PROVIDER>& 
			operator>>( D& datum );

Data can be read from a row in column order, just as with any stream. The c structure, when “extracted” to, simply sets the streams's current column number according to the struct's colname. In that way:

	db >> c("phone") >> phone;

sets db:icol to N, where N is the column whose name is "phone". That operation returns a reference to the stream. Next the data are extracted from the stream into the variable phone. The stream uses its current column number, still N. N is incremented after the extraction.

Read and Write

	class a_container
	{
	public:
		template <typename OS>
			OS& read( OS& os );
		template <typename OS>
			OS& write( OS& os );
	};
	
	template <typename CONTAINER>
		dbstream<PROVIDER>& 
			read( CONTAINER& container ); 

To read a value requires an operator, but to read a whole resultset requires a function. And a place to put the data.

dbstream::read requires a standard STL container (or something very similar). It calls the elements's read method repeatedly, incrementing the stream each time, until eof. It is up to the container's element class to define what is to be done with the stream, i.e. which columns to assign to which member variables.

	template <typename CONTAINER>
		dbstream<PROVIDER>& 
			write( CONTAINER& container ); 

dbstream::write has the same standard STL container requirements. It iterates over the container, calling the element's write method for each one. If dbstream::write encounters a stream error, it throws a std::runtime_error exception.

Observe: the loops are already written for you. You don't declare iterators, worry about off-by-one errors, dereference pointers, nothing. Just define how your container elements read and write themselves to a dbstream, and call the appropriate dbstream function. What could be easier?


$Id: classes.desc.html,v 1.3 2008/02/16 15:32:42 jklowden Exp $

Comments, questions, and encouraging words are welcome. Please email the author, James K. Lowden.

Valid HTML 4.01 Strict dbstreams/include004077500017500000000000000000001077620525600141545ustar00jklowdenwheeldbstreams/include/CVS004077500017500000000000000000001077620525700146105ustar00jklowdenwheeldbstreams/include/CVS/Repository010066400017500000000000000000441073552746400167660ustar00jklowdenwheelprojects/database/dbstreams/include dbstreams/include/CVS/Root010066400017500000000000000000321073552746400155270ustar00jklowdenwheel/usr/local/cvs.repository dbstreams/include/CVS/Entries010066400017500000000000000005601077620525700162210ustar00jklowdenwheelD/provider//// D/sys//// /.cvsignore/1.6/Wed Apr 2 03:57:27 2008// /cell.h/1.12/Sun Apr 6 17:38:54 2008// /dbstatus.h/1.8/Sun Apr 6 17:38:54 2008// /dbstream.enum.h/1.4/Sun Apr 6 17:38:54 2008// /dbstream.h/1.17/Sun Apr 6 17:38:54 2008// /login.h/1.3/Sun Apr 6 17:38:54 2008// /provider.h/1.4/Sun Apr 6 17:38:54 2008// /query.h/1.8/Sun Apr 6 17:38:54 2008// D dbstreams/include/dbstream.enum.h010066400017500000000000000017251077620525600171520ustar00jklowdenwheel/* $Id: dbstream.enum.h,v 1.4 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_ENUM_H #define DBSTREAMS_ENUM_H namespace dbstreams { enum insertmode { sqlmode, bcpmode }; enum provider_type {NONE, DBLIB, SQLITE, ODBC}; typedef long long streamsize; } // end namespace #endif dbstreams/include/.cvsignore010066400017500000000000000001461077460204700162260ustar00jklowdenwheel*.bck *.ok *.db .depend lib bin .gdbinit dbcat asof.sgml entities ideas manual.prototyp revision.sgml dbstreams/include/cell.h010066400017500000000000000131431077620525600153220ustar00jklowdenwheel/* $Id: cell.h,v 1.12 2008/04/06 17:48:30 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_CELL_H #define DBSTREAMS_CELL_H /* * A cell holds one column from one row. * It is convertible to any datatype, but it itself * neither converts nor allocates memory. * * October 2007 jkl */ #include #include namespace dbstreams { struct metadata; namespace providers { int native_type( metadata& meta, int type ); int native_type( const metadata& meta ); } struct metadata { friend int providers::native_type( metadata& meta, int type ); friend int providers::native_type( const metadata& meta ); private: /* * The native datatype is cached here because it can be * expensive/inconvenient to get it from some drivers. * It's private because unlike the rest of the metadata information, * it's driver-specific, and we don't want anything like that to * "leak out" to the dbstreams or application layers. */ int native_datatype; protected: int native_type() const { return native_datatype; } int native_type( int type ) { return native_datatype = type; } public: enum datatype { UNKNOWN, BINARY, CHAR, DATETIME, FLOAT, INT, NUMERIC, REAL, nTYPES }; enum nullitude { null, notnull }; std::string name; datatype type; int ordinal; // ith location in row, zero offset int size; bool is_nullable; metadata() : type(UNKNOWN) , native_datatype(-1) , ordinal(-1) , size(0) , is_nullable(true) {} bool operator<( const std::string ) const; bool operator==( const std::string ) const; static bool varylen( datatype ); /* * The bindery structure is used for bcp inserts. * Its size member is initialized to the allocated size * from metadata::size, but varies with each row's data. */ struct bindery { int type, size; char * buffer; bindery() : buffer(0), type(0), size(0) {} bindery(const bindery& that) : buffer(0) { copy(that); } bindery& operator=(const bindery& that) { return copy(that); } ~bindery() { delete[] buffer; } char * allocate( int size ) { delete[] buffer; this->size = size; if( 0 == size ) return buffer = 0; return buffer = new char[size]; } bool allocated() const { return buffer != 0; } private: bindery& copy(const bindery& that) { type = that.type; if( 0 != allocate( that.size ) ) memcpy( buffer, that.buffer, size ); return *this; } } bound; }; struct cell : public metadata { template void sizeup(T) { size = sizeof(T); is_null = false; } long indicator_data; public: bool is_null, is_output_parameter; int size; union _data { int i; float f; double d; const char* s; const void* pv; _data() : d(0) {} } data; cell(); cell(const cell&); cell& operator=(const cell& that); explicit cell( int, int ordinal = -1 ); explicit cell( float, int ordinal = -1 ); explicit cell( double, int ordinal = -1 ); explicit cell( const char *s, int len, int ordinal = -1 ); explicit cell( const void *pv, int len, int ordinal = -1 ); explicit cell( int, const std::string& name ); explicit cell( float, const std::string& name ); explicit cell( double, const std::string& name ); explicit cell( const char *s, int len, const std::string& name ); explicit cell( const void *pv, int len, const std::string& name ); cell& operator=(int); cell& operator=(float); cell& operator=(double); cell& operator=(const char *s); cell& operator=(const unsigned char *s); cell& operator()(const char *s, int len); cell& operator()(const void *pv, int len); cell& operator=(const std::string& ) { throw std::logic_error("unsupported"); } bool valid() const; cell& copy_value(const cell&); cell& make_bindable(); cell& assign(void * data, int len); int colsize() const { return metadata::size; } long indicator(long value) { return indicator_data = value; } long* indicator_buffer() { return &indicator_data; } long indicator() const { return indicator_data; } void* buffer() { switch(type) { case CHAR: return const_cast(data.s); case BINARY: return const_cast(data.pv); default: break; } return &data; } const cell& operator>>(std::string&) const; const cell& operator>>(int&) const; const cell& operator>>(float&) const; const cell& operator>>(double&) const; const cell& operator>>(const char *& s) const; const cell& operator>>(const unsigned char *& s) const; const cell& operator>>(const void *& pv) const; }; typedef cell parameter_type; typedef std::deque parameter_list_type; template struct parameter_value { int ordinal; std::string name; T data; parameter_value( int ord, T data = T() ) : ordinal(ord), data(data) {} parameter_value( const std::string& name, T data = T() ) : ordinal(-1), name(name), data(data) {} }; } // end namespace std::ostream& operator<<( std::ostream& os, const dbstreams::cell& ); std::ostream& operator<<( std::ostream& os, const dbstreams::metadata::datatype ); #endif // include guard dbstreams/include/dbstatus.h010066400017500000000000000101551077620525600162340ustar00jklowdenwheel/* $Id: dbstatus.h,v 1.8 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_STATUS_H #define DBSTREAMS_STATUS_H /* * Record dbstatus messages coming from the server and library. * Operate as boolean good/bad dbstatus; caller uses to decide if * OK to use. * notify() method called by provider when error occurs. User can * derive from this class to override notify() to do something useful. * * October 2007 jkl */ #include #include #include #include #include namespace dbstreams { class dbstatus : public std::runtime_error { public: enum iostate { goodbit, badbit, eofbit, failbit = 4 }; typedef std::deque ignore_list; private: iostate resetbits() const { return iostate( ~(eofbit | failbit) ); } iostate state; ignore_list ignoring; int nmissing_parameters; public: int srcline; const char *srcfile; const char *driver_function; int msgno; int msgstate; int severity; int os_error; std::string servername; std::string procedure_name; int line_number; std::string msg; unsigned long nrows; dbstatus( const std::string& msg = std::string() ); dbstatus( const char *srcfile, int srcline, const std::string& msg ); ~dbstatus() throw() {} void fetched( iostate state, int nrows = 1, bool fail = false ); bool good() const { return state == goodbit; } bool bad() const { return state & badbit; } bool fail() const { return (state & (badbit | failbit)) != 0; } bool eof() const { return state & eofbit; } iostate rdstate() const { return state; } iostate setstate( iostate state ) { return clear( iostate(this->state | state ) ); } iostate clear( iostate state = goodbit ) { return this->state = state; } dbstatus& operator=( int msgno ) { this->msgno = msgno; return *this; } dbstatus& operator=( const std::string& ); operator void*() const { return fail()? NULL : const_cast(this); } bool operator !() const { return fail(); } bool operator==(iostate state) const { return this->state == state; } bool operator!=(iostate state) const { return this->state != state; } bool operator==(int) const; bool operator!=(int) const; std::ostream& notify( std::ostream& os = std::cerr ) const; void ignore( int msgno ) { ignoring.push_back(msgno); } const ignore_list& ignore(const ignore_list& ); const ignore_list& ignore() const { return ignoring; } bool quit() { return fail(); } const char* what() const throw(); // reset a stream that just finished processing a query. const dbstatus& make_ready() { clear( iostate(state & resetbits()) ); nrows = 0; return *this; } const dbstatus& reset( iostate state = goodbit ); // clears whole status object, not just state int missing_parameters() const { return nmissing_parameters; } int missing_parameters( int nmissing ) { return nmissing_parameters = nmissing; } template dbstatus& assemble_error( HANDLE db, const char *srcfile, int srcline ); }; template dbstatus& dbstatus:: assemble_error( HANDLE db, const char *srcfile, int srcline ) { this->srcfile = srcfile; this->srcline = srcline; msg = sqlite3_errmsg(db); setstate(dbstatus::failbit); os_error = errno; notify(); return *this; } } // end namespace std::ostream& operator<<( std::ostream& os, const dbstreams::dbstatus& dbstatus ); std::ostream& operator<<( std::ostream& os, const dbstreams::dbstatus::iostate& state ); #endif // include guard dbstreams/include/provider004077500017500000000000000000001077620525700160075ustar00jklowdenwheeldbstreams/include/provider/CVS004077500017500000000000000000001077620525700164425ustar00jklowdenwheeldbstreams/include/provider/CVS/Repository010066400017500000000000000000551073552746400206220ustar00jklowdenwheelprojects/database/dbstreams/include/provider dbstreams/include/provider/CVS/Root010066400017500000000000000000321073552746400173610ustar00jklowdenwheel/usr/local/cvs.repository dbstreams/include/provider/CVS/Entries010066400017500000000000000003711077620525700200530ustar00jklowdenwheel/.cvsignore/1.6/Wed Apr 2 03:57:28 2008// /absvirt.h/1.6/Sun Apr 6 17:38:54 2008// /data.h/1.12/Sun Apr 6 17:38:54 2008// /dblib.h/1.9/Sun Apr 6 17:38:55 2008// /odbc.h/1.7/Sun Apr 6 17:38:55 2008// /sqlite3.h/1.11/Sun Apr 6 17:38:55 2008// D dbstreams/include/provider/.cvsignore010066400017500000000000000001461077460205000200520ustar00jklowdenwheel*.bck *.ok *.db .depend lib bin .gdbinit dbcat asof.sgml entities ideas manual.prototyp revision.sgml dbstreams/include/provider/absvirt.h010066400017500000000000000073641077620525600177170ustar00jklowdenwheel/* $Id: absvirt.h,v 1.6 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_ABSOLUTE_VIRTUAL_PROVIDER_H #define DBSTREAMS_ABSOLUTE_VIRTUAL_PROVIDER_H /* * Define the mother of all providers. * * January 2008 jkl * $Id: absvirt.h,v 1.6 2008/04/06 16:23:41 jklowden Exp $ */ #include #include #include "data.h" #include #include #include #include namespace dbstreams { namespace providers { class urhandle; template class provider : public provider_data { protected: urhandle _handle; mutable STATUS state; public: virtual ~provider() {}; virtual const STATUS& open( const std::string& server, const std::string& dbname ) = 0; virtual const STATUS& open( const std::string& tablename, insertmode ) = 0; virtual void close() = 0; virtual const query& insert( int c, metadata::nullitude datum ) = 0; virtual const query& insert( int c, const char * data, streamsize n ) = 0; virtual const query& insert( int c, const std::string& datum ) = 0; virtual const query& insert( int c, const int& datum ) = 0; virtual const query& insert( int c, const float& datum ) = 0; virtual const query& insert( int c, const double& datum ) = 0; virtual const STATUS& send() = 0; virtual const STATUS& execute( const dbstreams::query& sql ) = 0; virtual const STATUS& execute( const parameter_list_type& parameters ) { std::stringstream msg; msg << __FILE__ << ":" << __LINE__ << ": " << __func__ << " not implemented by provider"; throw std::logic_error( msg.str() ); } virtual bool extract(int c, std::string&, size_t& len) const = 0; virtual bool extract(int c, int&, size_t& len) const = 0; virtual bool extract(int c, double&, size_t& len) const = 0; virtual bool extract(int c, const char*&, size_t& len) const = 0; virtual bool extract(int c, const void*&, size_t& len) const = 0; virtual const cell& extract( int c ) const = 0; virtual const metadata& meta(int c) const = 0; virtual int ncolumns() const = 0; virtual const STATUS& next_row() = 0; virtual const std::string& SQL() const = 0; virtual const std::string& query_separator() const = 0; // concrete functions // TODO: move concrete functions to provider_data const urhandle& handle() { return _handle; } const STATUS& status() const { return state; } void ignore( int msgno ) { state.ignore(msgno); } const metadata& meta( const std::string& colname ) const { return meta( lookup(colname).ordinal ); } const cell& extract( const std::string& colname ) const { return extract( lookup(colname).ordinal ); } protected: const cell& lookup( const std::string& colname ) const { std::vector::const_iterator pc = std::find( row.begin(), row.end(), colname ); if( pc == row.end() ) { std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": no such column: \"" << colname << '"'; throw std::runtime_error( oops.str().c_str() ); } return *pc; } }; }} // end namespace #endif // DBSTREAMS_ABSOLUTE_VIRTUAL_PROVIDER_H dbstreams/include/provider/data.h010066400017500000000000000041721077620525600171500ustar00jklowdenwheel/* $Id: data.h,v 1.12 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef PROVIDER_DATA_H #define PROVIDER_DATA_H #include #include #include #include #include #include namespace dbstreams { class provider_data { public: typedef dbstreams::parameter_list_type parameter_list_type; protected: std::ostream *plog; query sql; parameter_list_type parameters; typedef std::vector row_type; mutable row_type row; bool eoq; public: provider_data() : plog(NULL), eoq(false) {} std::ostream * log() const { return plog; } std::ostream * log( std::ostream *pos ) { std::swap( plog, pos ); return pos; } const metadata& meta(int c) const { if( ! (c < row.size()) ) { std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": column out of range: " << c; throw std::domain_error( oops.str().c_str() ); } return row[c]; } protected: template const dbstreams::query& insert_quoted( int c, T datum ); template const dbstreams::query& insert_unquoted( int c, T datum ); }; template const query& provider_data:: insert_unquoted( int icol, T datum ) { sql.prepare_insert_element(icol); return sql << datum; } template const query& provider_data:: insert_quoted( int icol, T datum ) { sql.prepare_insert_element(icol); return sql << query::enquote(datum); } } // end namespace #endif dbstreams/include/provider/dblib.h010066400017500000000000000436061077620525700173210ustar00jklowdenwheel/* $Id: dblib.h,v 1.9 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef PROVIDER_DBLIB_H #define PROVIDER_DBLIB_H #include #include #include #include #include #include #include #include #include #include "data.h" #include #include #include #include #include "absvirt.h" namespace dbstreams{ namespace providers { namespace dblib_impl { /* * Error and message handlers. * These are connection-independent callback functions that * are provided to db-lib, which will call them when messages * arrive from the server or the library has something to say. */ int MessageHandler( DBPROCESS *dbproc , DBINT msgno , int msgstate , int severity , char *msgtext , char *srvname , char *procname , int line ); int ErrorHandler( DBPROCESS *dbproc , int severity , int dberr , int oserr , char *dberrstr , char *oserrstr ); metadata::datatype datatype( int type ); int desttype( int i ); int desttype( float f ); int desttype( double d ); int desttype( const char* s ); int desttype( const void* pv ); const char * retcode( RETCODE ret ); class provider_base { struct initializer { initializer() { if( SUCCEED != dbinit() ) throw std::runtime_error( "dblib not initialized" ); } ~initializer() { dbexit(); } }; static initializer hello; public: virtual int message( const dbstatus& status ) { throw "don't call this"; } virtual int error( const dbstatus& status ) = 0; }; /* * The file-scope message handlers package their arguments * into a dbstatus object. Then they call the switchboard * to direct the call to the correct object. * * The switchboard has NO instance data. * * It maintains a static map of DBPROCESS pointers -- * i.e. open connection handles -- to the provider instance that owns * that handle. * * Because the provider is templatized, we can't maintain a single * map of them, but we can have a map of a non-templatized base class. * The switchboard invokes the base class's error() or message() method, * which is defined as pure virtual and is actually implemented by the * provider. That's good, because only the provider knows what its * template argument was i.e. the type of its STATUS object. * * As always, the provider should call its STATUS object's notify function, * because that's how the application learns of the error/message. */ class switchboard { typedef std::map< ::DBPROCESS*, provider_base* > connection_map; struct prior_procs_t { MHANDLEFUNC msg; EHANDLEFUNC err; }; static prior_procs_t prior_procs; public: switchboard() { RETCODE fOK = dbinit(); if( fOK != SUCCEED ) { throw dbstatus( __FILE__, __LINE__, "error" ); } prior_procs.msg = dbmsghandle( MessageHandler ); prior_procs.err = dberrhandle( ErrorHandler ); } ~switchboard() { dbmsghandle( prior_procs.msg ); dberrhandle( prior_procs.err ); } static connection_map connections; static dbstatus err, msg; static int message( DBPROCESS* dbproc, const dbstatus& status ); static int error( DBPROCESS* dbproc, const dbstatus& status ); static DBPROCESS* open( provider_base* base, LOGINREC * auth, const std::string& server ); static void close( DBPROCESS *dbproc ); }; } // end namespace dblib_impl template class dblib : public provider, private dblib_impl::provider_base { public: typedef DBPROCESS* HANDLE; typedef STATUS status_type; typedef dbstreams::parameter_list_type parameter_list_type; private: HANDLE dbproc; LOGINREC *auth; bool is_bcp; dblib_impl::switchboard manager; bool prepare_for_bcp(); bool insert_bcp( int c, int type, const void *src, int size ); RETCODE next_results(); void quiesce(); const STATUS& assemble_error( const char *srcfile, int srcline ); static char *c_str( const std::string& s ) { return const_cast( s.c_str() ); } template const query& insert_quoted( int c, T datum ); template const query& insert_unquoted( int c, T datum ); template bool Extract(int c, T& datum, size_t& len) const; public: dblib() : dbproc(NULL), auth(NULL), is_bcp(false) {} dblib( const dblib& that ) : dbproc(NULL), auth(that.auth), is_bcp(false) {} dblib( const std::string& username, const std::string& password ) : dbproc(NULL) , auth( dblogin() ) , is_bcp(false) { if( !auth ) { throw std::runtime_error( "login could not be allocated" ); } if( SUCCEED != DBSETLUSER(auth, c_str(username)) ) { throw std::runtime_error( "DBSETLUSER should have worked" ); } if( SUCCEED != DBSETLPWD(auth, c_str(password)) ) { throw std::runtime_error( "DBSETLPWD should have worked" ); } if( SUCCEED != BCP_SETL(auth, TRUE) ) { throw std::runtime_error( "BCP_SETL should have worked" ); } } ~dblib(){ close(); } const STATUS& open( const std::string& server, const std::string& dbname ) { if( !auth ) { throw std::runtime_error( "login credentials not allocated" ); } try { dbproc = manager.open( this, auth, server ); _handle.handle(dbproc); } catch( const dbstatus& status ) { state = status; state.notify(); return state; } if( !dbname.empty() ) dbuse( dbproc, c_str(dbname) ); return state; } const STATUS& open( const std::string& tablename, insertmode mode ) { sql.table( tablename ); if( mode == bcpmode ) { is_bcp = prepare_for_bcp(); } return state; } void close() { if( dbproc ) manager.close(dbproc); dbproc = NULL; } std::ostream* log( std::ostream * pos ) { return provider_data::log(pos); } int message( const STATUS& status ) { dbstatus::ignore_list ignoring( state.ignore() ); state = status; state.ignore(ignoring); state.notify(); if( plog ) *plog << "sql is: [" << sql.str() << "]\n"; return 0; } int error( const STATUS& status ) { state = status; state.notify(); return INT_CANCEL; } HANDLE handle() const {return dbproc;} const std::string& SQL() const { return sql.str(); } void ignore( int msgno ) { state.ignore(msgno); } // send queries const STATUS& status() const { return state; } const STATUS& execute( const dbstreams::query& sql ); const STATUS& execute( const parameter_list_type& parameters ); const STATUS& next_row(); const std::string& query_separator() const { static const std::string sep(" "); return sep; } // read results int ncolumns() const { return dbnumcols(dbproc); } const metadata& meta(int c) const { return provider_data::meta(c); } const cell& extract(int c) const; bool extract(int c, std::string&, size_t& len) const; bool extract(int c, int& datum, size_t& len) const { return Extract( c, datum, len ); } bool extract(int c, double& datum, size_t& len) const { return Extract( c, datum, len ); } bool extract(int c, const char*& datum, size_t& len) const { return Extract( c, datum, len ); } bool extract(int c, const void*& datum, size_t& len) const { return Extract( c, datum, len ); } // insert data const query& insert( int c, metadata::nullitude datum ); const query& insert( int c, const char * data, streamsize n ); const query& insert( int c, const std::string& datum ); const query& insert( int c, const int& datum ); const query& insert( int c, const float& datum ); const query& insert( int c, const double& datum ); const STATUS& send(); protected: // get metadata via a functor template class metadata_init : protected cell { H dbproc; public: metadata_init( H dbproc ) : dbproc(dbproc) {} // caution: initializes metadata portion only; does NOT copy data. const cell& operator()( const cell& ) { metadata& my(*this); ++ordinal; my.name = dbcolname(dbproc, 1+ordinal); my.size = dbcollen(dbproc, 1+ordinal); my.type = dblib_impl::datatype( dbcoltype(dbproc, 1+ordinal) ); my.is_nullable = dbvarylen(dbproc, 1+ordinal); return *this; } }; struct extractor { enum { minalloc = 64 }; int srctype; BYTE * src; int srclen; int destlen; char *dest; extractor( HANDLE dbproc, int c ) : srctype( dbcoltype(dbproc, 1+c) ) , src( dbdata(dbproc, 1+c) ) , srclen( dbdatlen(dbproc, 1+c) ) , dest(NULL) { assert(srctype >= 0); assert(src || srclen >= 0); destlen = (srclen > minalloc)? srclen : minalloc; if( !src ) { destlen = 0; } dest = new char[destlen]; } ~extractor() { delete[] dest; } DBINT convert( HANDLE dbproc, int desttype ) { assert(src); return dbconvert(dbproc, srctype, src, srclen, desttype, reinterpret_cast(dest), destlen); } }; }; /* * Execute queries * */ template RETCODE dblib:: next_results() { RETCODE fOK(dbresults(dbproc)); if( plog ) *plog << basename(__FILE__) << ": dbresults " << dblib_impl::retcode(fOK) << "\n"; switch( fOK ) { case SUCCEED: row.resize( ncolumns() ); std::transform( row.begin(), row.end(), row.begin(), metadata_init(dbproc) ); if( DBROWS(dbproc) != SUCCEED ) { state.fetched( dbstatus::eofbit, 0, false ); } else { state.clear(dbstatus::goodbit); } break; case FAIL: state.setstate(dbstatus::failbit); break; case NO_MORE_RESULTS: state.fetched( dbstatus::eofbit, 0, false ); break; default: throw std::logic_error(__func__); } return fOK; } template const STATUS& dblib:: execute( const parameter_list_type& parameters ) { if( plog ) *plog << "SQLite::reexecute\n"; return execute( sql ); } template const STATUS& dblib:: execute( const dbstreams::query& sql ) { if( is_bcp ) { bcp_done(dbproc); is_bcp = false; } state.msgno = 0; // reset so we can tell if anything goes wrong in send() this->sql = sql; if( SUCCEED != dbcmd( dbproc, c_str(sql.str()) ) ) { state.setstate(dbstatus::failbit); return state; } if( SUCCEED != dbsqlexec(dbproc) ) { state.setstate(dbstatus::failbit); return state; } if( SUCCEED == next_results() ) { return next_row(); } return state; } template const STATUS& dblib:: next_row() { RETCODE fOK( dbnextrow(dbproc) ); if( plog ) *plog << basename(__FILE__) << ": dbnextrow " << dblib_impl::retcode(fOK) << "\n"; switch( fOK ) { case REG_ROW: state.fetched( dbstatus::goodbit ); break; case NO_MORE_ROWS: fOK = next_results(); state.fetched( dbstatus::eofbit, 0, row.size() && NO_MORE_RESULTS == fOK ); break; case BUF_FULL: throw std::runtime_error(__func__); break; case FAIL: state.setstate(dbstatus::failbit); break; default: throw std::logic_error(__func__); } if( plog ) *plog << basename(__FILE__) << __LINE__ << ": next_row " << state.rdstate() << "\n"; return state; } /* * Read results */ template const dbstreams::cell& dblib:: extract(int c) const { if( ! (c < row.size()) ) { std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": column out of range: " << c; throw std::domain_error( oops.str().c_str() ); } BYTE * pdata = dbdata(dbproc, 1+c); int len = dbdatlen(dbproc, 1+c); assert(len >= 0 ); row[c].is_null = 0 == len; if( row[c].is_null ) { return row[c]; } switch( meta(c).type ) { case metadata::UNKNOWN: case metadata::BINARY: { void *pv = static_cast(pdata); row[c]( static_cast(pdata), len ); } break; case metadata::CHAR: row[c]( reinterpret_cast(pdata), len ); break; case metadata::INT: row[c] = *reinterpret_cast(pdata); break; case metadata::REAL: row[c] = *reinterpret_cast(pdata); break; case metadata::FLOAT: row[c] = *reinterpret_cast(pdata); break; } if( row[c].valid() ) return row[c]; std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": bad data retrieved column: " << c; throw std::runtime_error( oops.str().c_str() ); return row[c]; } /* * Extract data * Convert using dbconvert() */ template bool dblib:: extract(int c, std::string& datum, size_t& len) const { extractor ex(dbproc, c); len = ex.destlen; if( !len ) { return false; } DBINT out = ex.convert(dbproc, SYBCHAR); if( out == -1 || out == FAIL ) { return false; } datum.assign( ex.dest, len=out ); return true; } template template bool dblib:: Extract(int c, T& datum, size_t& len) const { extractor ex(dbproc, c); len = ex.destlen; if( !len ) { return false; } DBINT out = ex.convert(dbproc,dblib_impl::desttype(datum)); if( out == -1 || out == FAIL ) { return false; } len = out; datum = *reinterpret_cast(ex.dest); return true; } /* * Insert data * protected functions */ template bool dblib:: prepare_for_bcp() { sql << "select * from " << sql.table() << " where 0=1"; execute(sql); if( row.size() == 0 ) throw std::logic_error("meta data row size cannot be zero"); RETCODE fOK = bcp_init( dbproc, sql.table().c_str(), NULL, NULL, DB_IN ); if( fOK != SUCCEED ) return false; for( row_type::iterator p = row.begin(); p != row.end(); p++ ) { metadata& m(*p); assert(m.size); m.bound.type = dbcoltype( dbproc, 1 + m.ordinal ); assert(m.bound.type); char *buffer = m.bound.allocate(m.size); int size = m.varylen(m.type)? m.size : -1; fOK = bcp_bind ( dbproc , reinterpret_cast(buffer) , 0 // prefixlen , size , NULL // terminator , 0 // termlen , m.bound.type , 1 + m.ordinal ); if( fOK != SUCCEED ) break; } return SUCCEED == fOK; } template bool dblib:: insert_bcp( int icol, int type, const void *src, int size ) { if( !is_bcp ) return false; // NULLs have zero length, period if( size == 0 ) { return SUCCEED == bcp_collen(dbproc, size, 1+icol); } metadata& m(row[icol]); if( plog ) *plog << basename(__FILE__) << ": converting type " << type << " to " << m.bound.type << std::endl; if( m.bound.type == type ) { assert(size <= m.size); memcpy( m.bound.buffer, src, size ); } else { size = dbconvert ( dbproc , type , reinterpret_cast((void*)src) , size , m.bound.type , reinterpret_cast(m.bound.buffer) , m.size // original allocation ); if( size == -1 || size == FAIL || size > m.size ) { return false; } } if( ! m.varylen(m.type) ) size = -1; return SUCCEED == bcp_collen(dbproc, size, 1+icol); } template template const dbstreams::query& dblib:: insert_unquoted( int icol, T datum ) { sql.prepare_insert_element(icol); return sql << datum; } template template const dbstreams::query& dblib:: insert_quoted( int icol, T datum ) { sql.prepare_insert_element(icol); return sql << query::enquote(datum); } /* * Insert data * public functions */ template const dbstreams::query& dblib:: insert( int icol, metadata::nullitude datum ) { if( insert_bcp( icol, SYBCHAR, NULL, 0 ) ) return sql; return insert_unquoted( icol, "NULL" ); } template const dbstreams::query& dblib:: insert( int icol, const char * data, streamsize len ) { if( insert_bcp( icol, SYBCHAR, data, len ) ) return sql; return insert( icol, std::string( data, len ) ); } template const dbstreams::query& dblib:: insert( int icol, const std::string& datum ) { if( insert_bcp( icol, SYBCHAR, datum.c_str(), datum.size() ) ) return sql; return insert_quoted( icol, datum ); } template const dbstreams::query& dblib:: insert( int icol, const int& datum ) { if( insert_bcp( icol, SYBINT4, &datum, sizeof(datum) ) ) return sql; return insert_unquoted( icol, datum ); } template const dbstreams::query& dblib:: insert( int icol, const float& datum ) { if( insert_bcp( icol, SYBREAL, &datum, sizeof(datum) ) ) return sql; return insert_unquoted( icol, datum ); } template const dbstreams::query& dblib:: insert( int icol, const double& datum ) { if( insert_bcp( icol, SYBFLT8, &datum, sizeof(datum) ) ) return sql; return insert_unquoted( icol, datum ); } // Send a row to the server template const STATUS& dblib:: send() { if( is_bcp ) { RETCODE fOK = bcp_sendrow(dbproc); } else { sql.end_insert_statement(); execute(sql); } state.nrows++; if( state.msgno == 0 ) state.clear(); return state; } #if 0 /* * Utility */ template void dblib:: quiesce() { finalize(); state.reset(); sql.reset(); } template const STATUS& dblib:: assemble_error( const char *srcfile, int srcline ) { state.srcfile = srcfile; state.srcline = srcline; state.msg = sql3lite_errmsg(pdb); state.setstate(STATUS::failbit); #if 0 switch( state.msgno ) { case SQLITE_NOTADB: state.msg = "File opened that is not a database file"; break; case SQLITE_MISUSE: state.msg = "Library used incorrectly"; break; } #endif state.os_error = errno; state.notify(); return this->state; } #endif // NOCODE }} // end namespace #endif // PROVIDER_DBLIB_H dbstreams/include/provider/sqlite3.h010066400017500000000000000416461077620525700176330ustar00jklowdenwheel/* $Id: sqlite3.h,v 1.11 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef PROVIDER_SQLITE3_H #define PROVIDER_SQLITE3_H #include #include #include #include #include #include #include #include #include "data.h" #include #include #include #define ASSEMBLE_ERROR assemble_error( __func__, __LINE__ ) #define ASSEMBLE_ERROR1() assemble_error( __func__, __LINE__ ) #include "absvirt.h" namespace dbstreams{ namespace providers { namespace sqlite { metadata::datatype datatype( int ); class parameter_binder { sqlite3_stmt* stm; public: parameter_binder( sqlite3_stmt* stm ) : stm(stm) {} const dbstreams::parameter_type& operator()( const dbstreams::parameter_type& param ) { return bind(param); } private: const dbstreams::parameter_type& bind( const dbstreams::parameter_type& param ) { int fOK(SQLITE_ERROR); dbstreams::parameter_type& p = const_cast(param); int iparam = param.ordinal + 1; // If name is nonempty, use it to look up the parameter, // else rely on the ordinal position. if( ! param.name.empty() ) iparam = sqlite3_bind_parameter_index(stm, param.name.c_str()); if( iparam <= 0 ) { std::stringstream msg; msg << "dbstreams::sqlite::parameter_binder: " << "could not bind parameter named \"" << param.name << "\""; throw std::domain_error(msg.str()); } switch( param.type ) { case metadata::REAL: p.data.d = p.data.f; case metadata::FLOAT: fOK = sqlite3_bind_double(stm, iparam, param.data.d); break; case metadata::INT: fOK = sqlite3_bind_int(stm, iparam, param.data.i); break; case metadata::BINARY: fOK = sqlite3_bind_blob(stm, iparam, param.data.pv, param.size, SQLITE_STATIC); break; case metadata::CHAR: fOK = sqlite3_bind_text(stm, iparam, param.data.s, param.size, SQLITE_STATIC); break; case metadata::UNKNOWN: case metadata::DATETIME: case metadata::NUMERIC: default: throw std::runtime_error("unsupported parameter type"); } if( fOK != SQLITE_OK ) { throw param; } return param; } }; } // end namespace sqlite template class SQLite : public provider { public: typedef ::sqlite3* HANDLE; typedef dbstreams::parameter_list_type parameter_list_type; private: typedef ::sqlite3_stmt* STATEMENT; HANDLE pdb; STATEMENT pstm; // statement handle const char * pending_sql; bool bind_parameters( const parameter_list_type& params = parameters ); const STATUS& prepare( const std::string& sqlstring ); const STATUS& assemble_error( const char *srcfile, int srcline ); void finalize(); void quiesce(); template const dbstreams::query& insert_quoted( int c, T datum ); template const dbstreams::query& insert_unquoted( int c, T datum ); public: SQLite() : pdb(NULL), pstm(NULL) {} SQLite( const SQLite& ) : pdb(NULL), pstm(NULL) {} SQLite( const std::string& username, const std::string& password ) : pdb(NULL), pstm(NULL) {} ~SQLite(){ if( pdb ) close(); } const STATUS& open( const std::string& server, const std::string& dbname ) { state.msgno = sqlite3_open( dbname.c_str(), &pdb ); if( state.msgno != SQLITE_OK ) { ASSEMBLE_ERROR; } _handle.handle(pdb); return state; } const STATUS& open( const std::string& tablename, insertmode ) { quiesce(); // cancels any pending query, // closes any open table sql.table(tablename); return state; } void close() { if( pending_sql && plog ) { *plog << "pending sql: \"" << pending_sql << "\"\n"; } finalize(); if( (state.msgno = sqlite3_close(pdb)) != SQLITE_OK ) { throw ASSEMBLE_ERROR; } _handle.reset(); pdb = NULL; state.reset(); } std::ostream* log( std::ostream * pos ) { return provider_data::log(pos); } HANDLE handle() const {return pdb;} const std::string& SQL() const { return sql.str(); } #if DEBUGGING STATEMENT statement() const {return pstm;} #endif // send queries const STATUS& status() const { return state; } const std::string& query_separator() const { static const std::string sep("; "); return sep; } const STATUS& execute( const dbstreams::query& sql ); const STATUS& execute( const parameter_list_type& parameters ); const STATUS& next_row(); // read results int ncolumns() const { return sqlite3_column_count(pstm); } const metadata& meta(int c) const; const cell& extract(int c) const; bool extract(int c, std::string&, size_t& len) const; bool extract(int c, int&, size_t& len) const; bool extract(int c, double&, size_t& len) const; bool extract(int c, const char*&, size_t& len) const; bool extract(int c, const void*&, size_t& len) const; // insert data const query& insert( int c, metadata::nullitude datum ); const query& insert( int c, const char * data, streamsize len ); const query& insert( int c, const std::string& datum ); const query& insert( int c, const int& datum ); const query& insert( int c, const float& datum ); const query& insert( int c, const double& datum ); const STATUS& send(); protected: // get metadata via a functor template class metadata_init : protected cell { H pstm; public: metadata_init( H pstm ) : pstm(pstm) { ordinal = -1; } // caution: initializes metadata portion only; does NOT copy data. const cell& operator()( const cell& ) { metadata& my(*this); my.name = sqlite3_column_name(pstm, ++ordinal); int type = sqlite3_column_type(pstm, ordinal); my.type = sqlite::datatype( type ); is_null = type == SQLITE_NULL; // set is_nullable true if NULL discovered among rows if( !my.is_nullable ) my.is_nullable = is_null; return *this; } }; }; /* * Execute queries * * SQLite executes one SQL command at a time. The dbstreams::provider * interface doesn't know or care about that; the user just calls * execute() and next_row(). We execute all statements until * a resultset is created. Then we return rows until the last one is fetched. * Upon fetching the last row, we set eoq and eof to true. * eoq (end of query) indicates finalization is needed before the next fetch. * eof indicates the query will return no more rows. * * After returning eof, when next_row() is again called, we have two options. * If there's no pending SQL, we set failbit and return, else we clear the * eofbit and execute the SQL. * * From the user perspective, it's always valid to execute a new query, * irrespective of the eofbit or failbit. execute() always clears these * bits and accepts the SQL. * * Scenarios * INSERT INTO T VALUES (1) * if eoq, finalize * clear eofbit, failbit, eoq * execute, prepare, next_row, eoq is true * no results, no pending SQL: RETURN * INSERT INTO T VALUES (2); INSERT INTO T VALUES (3) * clear eofbit and failbit * execute, prepare, next_row, eoq is true * no results, execute pending SQL * clear eofbit, failbit, eoq * execute, prepare, next_row, eoq is true * no results, no pending SQL: RETURN * SELECT * FROM T * clear eofbit, failbit, eoq * execute, prepare, next_row, eoq is false * some results RETURN * next_row, eoq is false, some results RETURN * next_row, set eoq true, some results RETURN * next_row, eoq is true, set eofbit, some results RETURN * next_row, eof is true, set failbit, RETURN */ template bool SQLite:: bind_parameters( const parameter_list_type& parameters ) { if( plog ) *plog << "SQLite::bind_parameters ... "; if( plog ) *plog << parameters.size() << " parameters\n"; if( parameters.size() == 0 ) return true; int nrequired = sqlite3_bind_parameter_count(pstm); if( parameters.size() != nrequired ) { if( plog ) *plog << nrequired << " parameters needed\n"; state.missing_parameters( nrequired - parameters.size() ); return false; } sqlite::parameter_binder binder(pstm); try { std::for_each( parameters.begin(), parameters.end(), binder ); } catch( const parameter_type& param ) { ASSEMBLE_ERROR; return false; } catch( const std::exception& oops ) { if( plog ) *plog << "\terror: " << oops.what(); return false; } return true; } template const STATUS& SQLite :: prepare( const std::string& sqlstring ) { if( eoq ) { finalize(); } if( plog ) *plog << " preparing [" << sqlstring << "]\n"; // prepare the statement state= sqlite3_prepare(pdb, sqlstring.c_str(), -1, &pstm, &pending_sql); if( state != SQLITE_OK ) { state.clear(STATUS::failbit); return ASSEMBLE_ERROR; } if( ! bind_parameters() ) { return state; } if( pending_sql ) { std::string pending( pending_sql ); if( pending.find_first_not_of(' ') == std::string::npos ) { pending_sql = NULL; } } if( pending_sql ) { if( plog ) *plog << " pending [" << pending_sql << "]\n"; } if( plog ) *plog << sqlite3_column_count(pstm) << " columns\n"; return state.reset(); } /* * The stream's parameter list owns the buffers. */ template const STATUS& SQLite :: execute( const parameter_list_type& parameters ) { if( plog ) *plog << "SQLite::reexecute [" << sql.str() << "]\n"; if( (state.msgno = sqlite3_reset(pstm)) != SQLITE_OK ) throw ASSEMBLE_ERROR; if( ! bind_parameters(parameters) ) { return state; } do { if( state.bad() ) throw ASSEMBLE_ERROR; if( pending_sql ) { std::stringstream msg; msg << __FILE__ << ":" << __LINE__ << ": pending sql [" << pending_sql << "] cannot coexist with parameterized query" ; throw std::runtime_error( msg.str() ); } if( (state.msgno = sqlite3_reset(pstm)) != SQLITE_OK ) throw ASSEMBLE_ERROR; // execute the query, returning the first row (if any) eoq = false; next_row(); } while( state == SQLITE_DONE && pending_sql); return state; } template const STATUS& SQLite :: execute( const dbstreams::query& sql ) { if( plog ) *plog << "SQLite::execute\n"; state.make_ready(); this->sql = sql; std::string next_query( sql.str() ); do { if( state.fail() ) throw ASSEMBLE_ERROR; if( ! prepare( next_query ).good() ) return state; row.resize( ncolumns() ); if( pending_sql ) next_query = pending_sql; else next_query.erase(); // execute the query, returning the first row (if any) next_row(); } while( state == SQLITE_DONE && pending_sql); return state; } template const STATUS& SQLite :: next_row() { if( plog ) *plog << "SQLite::next_row ... "; if( eoq ) { if( pending_sql ) { sql = pending_sql; return execute( sql ); } else { /// finalize(); state.fetched( STATUS::eofbit, 0, pending_sql == NULL ); return state; } } // get data switch( state.msgno = sqlite3_step(pstm) ) { case SQLITE_BUSY: case SQLITE_ERROR: return ASSEMBLE_ERROR; break; case SQLITE_DONE: if( row.size() > 0 ) state.fetched( STATUS::eofbit, 0, pending_sql == NULL ); eoq = true; if( plog ) *plog << "eoq\n"; break; case SQLITE_ROW: std::transform( row.begin(), row.end(), row.begin(), metadata_init(pstm) ); // get metadata state.fetched( STATUS::goodbit ); break; case SQLITE_MISUSE: default: throw ASSEMBLE_ERROR; } if( plog ) *plog << "(sqlite3_step returned " << state.msgno << ")\n"; return state; } template void SQLite :: finalize() { if( !pstm ) return; if( (state.msgno = sqlite3_finalize(pstm)) != SQLITE_OK ) { throw ASSEMBLE_ERROR; } if( plog ) *plog << "finalized\n"; pstm = false; eoq = false; } /* * Read results */ template const metadata& SQLite :: meta(int c) const { if( ! (c < row.size()) ) { std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": column out of range: " << c; throw std::domain_error( oops.str().c_str() ); } return row[c]; } template const dbstreams::cell& SQLite :: extract(int c) const { if( ! (c < row.size()) ) { std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": column out of range: " << c; throw std::domain_error( oops.str().c_str() ); } switch( meta(c).type ) { case metadata::UNKNOWN: case metadata::BINARY: row[c]( sqlite3_column_blob(pstm, c), sqlite3_column_bytes(pstm, c) ); break; case metadata::CHAR: row[c] = sqlite3_column_text(pstm, c); break; case metadata::INT: row[c] = sqlite3_column_int(pstm, c); break; case metadata::REAL: case metadata::FLOAT: row[c] = sqlite3_column_double(pstm, c); break; } if( row[c].valid() ) return row[c]; std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": bad data retrieved column: " << c; throw std::runtime_error( oops.str().c_str() ); return row[c]; } /* * Extract data * Convert using functions provided by SQLite3 */ template bool SQLite :: extract(int c, std::string& datum, size_t& len) const { if( sqlite3_column_type(pstm, c) == SQLITE_NULL ) { datum = std::string(); return false; } datum = reinterpret_cast( sqlite3_column_text(pstm, c) ); len = datum.size(); return true; } template bool SQLite :: extract(int c, int& datum, size_t& len) const { datum = sqlite3_column_int(pstm, c); len = sizeof(datum); return sqlite3_column_type(pstm, c) != SQLITE_NULL; } template bool SQLite :: extract(int c, double& datum, size_t& len) const { datum = sqlite3_column_double(pstm, c); len = sizeof(datum); return sqlite3_column_type(pstm, c) != SQLITE_NULL; } template bool SQLite :: extract(int c, const char*& datum, size_t& len) const { datum = reinterpret_cast( sqlite3_column_text(pstm, c) ); len = sqlite3_column_bytes(pstm, c); return sqlite3_column_type(pstm, c) != SQLITE_NULL; } template bool SQLite :: extract(int c, const void*& datum, size_t& len) const { datum = sqlite3_column_blob(pstm, c); len = sqlite3_column_bytes(pstm, c); return sqlite3_column_type(pstm, c) != SQLITE_NULL; } /* * Insert data * protected functions */ template template const dbstreams::query& SQLite :: insert_unquoted( int icol, T datum ) { sql.prepare_insert_element(icol); return sql << datum; } template template const dbstreams::query& SQLite :: insert_quoted( int icol, T datum ) { sql.prepare_insert_element(icol); return sql << query::enquote(datum); } /* * Insert data * public functions */ template const dbstreams::query& SQLite :: insert( int c, metadata::nullitude datum ) { return insert_unquoted(c, "NULL"); } template const dbstreams::query& SQLite:: insert( int c, const char * data, streamsize len ) { return insert( c, std::string( data, len ) ); } template const dbstreams::query& SQLite :: insert( int c, const std::string& datum ) { return insert_quoted(c, datum); } template const dbstreams::query& SQLite :: insert( int c, const int& datum ) { return insert_unquoted(c, datum); } template const dbstreams::query& SQLite :: insert( int c, const float& datum ) { return insert_unquoted(c, datum); } template const dbstreams::query& SQLite :: insert( int c, const double& datum ) { return insert_unquoted(c, datum); } // Send a row to the server template const STATUS& SQLite :: send() { sql.end_insert_statement(); execute(sql); state.nrows++; return state; } /* * Utility */ template void SQLite :: quiesce() { finalize(); state.reset(); sql.reset(); } template const STATUS& SQLite :: assemble_error( const char *srcfile, int srcline ) { state.srcfile = srcfile; state.srcline = srcline; state.msg = sqlite3_errmsg(pdb); state.setstate(STATUS::failbit); #if 0 switch( state.msgno ) { case SQLITE_NOTADB: state.msg = "File opened that is not a database file"; break; case SQLITE_MISUSE: state.msg = "Library used incorrectly"; break; } #endif state.os_error = errno; state.notify(); return this->state; } }} // end namespace #endif // PROVIDER_SQLITE3_H dbstreams/include/provider/odbc.h010066400017500000000000000510771077620525700171550ustar00jklowdenwheel/* $Id: odbc.h,v 1.7 2008/04/06 17:48:30 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef PROVIDER_ODBC_H #define PROVIDER_ODBC_H namespace dbstreams{ namespace drivers { namespace odbc { #include #include }}} #include #include #include #include #include #include #include #include "data.h" #include #include #include #define ODBC_ERROR(HT, H, F) odbc_error( (HT), (H), __func__, __LINE__, (F) ) #include "absvirt.h" namespace DBS_ODBC = dbstreams::drivers::odbc; namespace dbstreams{ namespace providers { namespace odbc_impl { metadata::datatype datatype( int ); const char * prret(DBS_ODBC::SQLRETURN erc); int sql_c_type( metadata::datatype datatype ); int sql_data_type( metadata::datatype datatype ); int desttype( metadata::datatype datatype ); int desttype( int i ); int desttype( float f ); int desttype( double d ); int desttype( const char* s ); int desttype( const void* pv ); class parameter_binder { DBS_ODBC::SQLHANDLE hstm; std::ostream *plog; public: parameter_binder( DBS_ODBC::SQLHANDLE hstm, std::ostream *plog = NULL) : hstm(hstm) , plog(plog) {} const dbstreams::parameter_type& operator()( const dbstreams::parameter_type& param ) { return bind(param); } private: const dbstreams::parameter_type& bind( const dbstreams::parameter_type& param ) { using namespace DBS_ODBC; dbstreams::parameter_type& p = const_cast(param); int iparam = param.ordinal + 1; if( param.ordinal < 0 ) { std::stringstream msg; msg << "dbstreams::odbc::parameter_binder: " << "could not bind parameter " << param.ordinal; throw std::domain_error(msg.str()); } SQLSMALLINT io(SQL_PARAM_INPUT); if( param.is_output_parameter ) { if( param.is_null ) io = SQL_PARAM_OUTPUT; else io = SQL_PARAM_INPUT_OUTPUT; } p.indicator(p.size); if( p.is_null ) p.indicator(SQL_NULL_DATA); SQLRETURN erc; erc = SQLBindParameter( hstm, iparam, io, sql_c_type(p.type), sql_data_type(p.type), p.size, 0, p.buffer(), p.size, p.indicator_buffer() ); if( erc != SQL_SUCCESS ) { if( plog ) *plog << "failed to bind ordinal " << param.ordinal << " (" << __func__ << ")\n"; throw param; } return param; } }; } // close namespace odbc_impl template class odbc : public provider { public: typedef DBS_ODBC::SQLHANDLE HANDLE; typedef dbstreams::parameter_list_type parameter_list_type; private: typedef DBS_ODBC::SQLHANDLE STATEMENT; mutable DBS_ODBC::SQLRETURN erc; HANDLE hdbc; STATEMENT hstm; // statement handle DBS_ODBC::SQLHENV henv; login auth; bool is_bcp; static char *c_str( const std::string& s ) { return const_cast( s.c_str() ); } static char *c_str( DBS_ODBC::SQLCHAR *s ) { return reinterpret_cast(s); } static DBS_ODBC::SQLCHAR* sql_str( const std::string& s ){ return reinterpret_cast(c_str(s)); } static bool ok( DBS_ODBC::SQLRETURN erc ); const STATUS& prepare( const std::string& sqlstring ); const STATUS& close_cursor(); bool bind_parameters( const parameter_list_type& parameters ); bool next_results(); const STATUS& odbc_error( DBS_ODBC::SQLSMALLINT htype, DBS_ODBC::SQLHANDLE handle, const char *srcfile, int srcline, const char *function ) const; template bool Extract(int c, T& datum, size_t& len) const; cell& Extract(int c) const; const STATUS& construct(); odbc( const odbc& ) : hdbc(NULL), hstm(NULL), auth(NULL), is_bcp(false) {} public: odbc() : hdbc(NULL), hstm(NULL), auth(NULL), is_bcp(false) { construct(); } odbc( const std::string& username, const std::string& password ) : hdbc(NULL) , hstm(NULL) , auth(username, password) , is_bcp(false) { construct(); } ~odbc(){ if( hdbc ) close(); } const STATUS& open( const std::string& server, const std::string& catalog ); const STATUS& open( const std::string& tablename, insertmode ) { sql.table(tablename); return state; } void close() { erc = DBS_ODBC::SQLDisconnect( hdbc ); hdbc = NULL; } std::ostream* log( std::ostream * pos ) { return provider_data::log(pos); } HANDLE handle() const {return hdbc;} const std::string& SQL() const { return sql.str(); } #if DEBUGGING STATEMENT statement() const {return hstm;} #endif // send queries const STATUS& status() const { if( plog ) *plog << "state:" << state << '\n'; return state; } const STATUS& execute( const dbstreams::query& sql ); const STATUS& execute( const parameter_list_type& parameters ); const STATUS& next_row(); const std::string& query_separator() const { static const std::string sep("; "); return sep; } // read results int ncolumns() const; const metadata& meta(int c) const; const cell& extract(int c) const { return Extract(c); } bool extract(int c, std::string&, size_t& len) const; bool extract(int c, int& datum, size_t& len) const { return Extract( c, datum, len ); } bool extract(int c, double& datum, size_t& len) const { return Extract( c, datum, len ); } bool extract(int c, const char*& datum, size_t& len) const { return Extract( c, datum, len ); } bool extract(int c, const void*& datum, size_t& len) const { return Extract( c, datum, len ); } // insert data const query& insert( int c, metadata::nullitude datum ); const query& insert( int c, const char * data, streamsize len ); const query& insert( int c, const std::string& datum ); const query& insert( int c, const int& datum ); const query& insert( int c, const float& datum ); const query& insert( int c, const double& datum ); const STATUS& send(); protected: // get metadata via a functor template class metadata_init : protected cell { H hstm; P *pprovider; public: metadata_init( H hstm, P *pprovider) : hstm(hstm) , pprovider(pprovider) { ordinal = -1; } // initializes metadata portion only; does NOT copy data. const cell& operator()( const cell& ) { using namespace DBS_ODBC; using dbstreams::providers::native_type; metadata& my(*this); SQLRETURN erc; SQLCHAR name[512]; SQLSMALLINT namelen, ndigits, fnullable; SQLSMALLINT type; SQLULEN size, width; if( (erc = SQLDescribeCol(hstm, ++ordinal+1, name, sizeof(name), &namelen, &type, &size, &ndigits, &fnullable)) != SQL_SUCCESS ) { pprovider->ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLDescribeCol"); } my.name = std::string( c_str(name), namelen ); native_type(my, type); my.type = odbc_impl::datatype( type ); my.size = size; my.is_nullable = SQL_NULLABLE == fnullable; return *this; } }; typedef metadata_init< HANDLE, odbc > row_init; }; template const STATUS& odbc:: construct() { using namespace DBS_ODBC; if ((erc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv)) != SQL_SUCCESS) { throw ODBC_ERROR(SQL_HANDLE_ENV, henv, "SQLAllocHandle"); } assert(henv); if ((erc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER)) != SQL_SUCCESS) { throw ODBC_ERROR(SQL_HANDLE_ENV, henv, "SQLSetEnvAttr"); } if ((erc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc)) != SQL_SUCCESS) { throw ODBC_ERROR(SQL_HANDLE_ENV, henv, "SQLAllocHandle"); } assert(hdbc); } template const STATUS& odbc:: open( const std::string& servername, const std::string& catalog ) { using namespace DBS_ODBC; if( ! catalog.empty() ) { char *cat = const_cast(catalog.c_str()); if( (erc = SQLSetConnectAttr( hdbc, SQL_ATTR_CURRENT_CATALOG, reinterpret_cast(cat), catalog.size() )) != SQL_SUCCESS ) { throw ODBC_ERROR(SQL_HANDLE_DBC, hdbc, "SQLConnect"); } } if( (erc = SQLConnect( hdbc, sql_str(servername), SQL_NTS, sql_str(auth.username), SQL_NTS, sql_str(auth.password), SQL_NTS) ) != SQL_SUCCESS) { throw ODBC_ERROR(SQL_HANDLE_DBC, hdbc, "SQLConnect"); } return state; } /* * Execute queries */ template int odbc :: ncolumns() const { using namespace DBS_ODBC; SQLSMALLINT ncols(0); if( plog ) *plog << "odbc::ncolumns ... "; if( (erc = SQLNumResultCols(hstm, &ncols)) != SQL_SUCCESS) { ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLNumResultCols"); } if( plog ) *plog << ncols << "\n"; return ncols; } template bool odbc :: bind_parameters( const parameter_list_type& parameters ) { using namespace DBS_ODBC; if( plog ) *plog << "odbc::bind_parameters ... "; if( plog ) *plog << parameters.size() << " parameters\n"; SQLSMALLINT nrequired; switch( (erc = SQLNumParams(hstm, &nrequired)) ) { case SQL_SUCCESS_WITH_INFO: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLNumParams"); case SQL_SUCCESS: break; case SQL_STILL_EXECUTING: case SQL_ERROR: case SQL_INVALID_HANDLE: default: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLNumParams"); break; } if( parameters.size() != nrequired ) { if( plog ) *plog << nrequired << " parameters needed\n"; state.missing_parameters( nrequired - parameters.size() ); state.setstate( dbstatus::failbit ); return false; } odbc_impl::parameter_binder binder(hstm, plog); try { std::for_each( parameters.begin(), parameters.end(), binder ); } catch( const parameter_type& param ) { ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLBindParameter"); return false; } catch( const std::exception& oops ) { if( plog ) *plog << "\terror: " << oops.what(); return false; } return true; } template const STATUS& odbc :: prepare( const std::string& sqlstring ) { using namespace DBS_ODBC; if( plog ) *plog << " preparing [" << sql.str() << "]\n"; if( hstm ) { if( (erc = SQLFreeHandle(SQL_HANDLE_STMT, hstm)) != SQL_SUCCESS ) { ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLFreeHandle"); } hstm = NULL; } if ((erc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstm)) != SQL_SUCCESS) { return ODBC_ERROR(SQL_HANDLE_DBC, hdbc, "SQLAllocHandle"); } if( (erc = SQLPrepare(hstm, sql_str(sqlstring), SQL_NTS)) != SQL_SUCCESS) { ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLPrepare"); } if( ! bind_parameters(parameters) ) { return state; } return state.reset(); } template const STATUS& odbc :: execute( const parameter_list_type& parameters ) { using namespace DBS_ODBC; using odbc_impl::prret; if( plog ) *plog << "odbc::re-execute ... "; if( ! bind_parameters(parameters) ) { return state; } erc = SQLExecute(hstm); if( plog ) *plog << prret(erc) << "\n"; switch(erc) { case SQL_SUCCESS_WITH_INFO: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLExecute"); // fall through case SQL_SUCCESS: state.clear(dbstatus::goodbit); row.resize( ncolumns() ); std::transform( row.begin(), row.end(), row.begin(), row_init(hstm, this) ); if( row.size() > 0 ) return next_row(); break; case SQL_NEED_DATA: throw std::runtime_error("SQL_NEED_DATA not supported"); break; case SQL_NO_DATA: state.clear(dbstatus::goodbit); break; case SQL_STILL_EXECUTING: case SQL_ERROR: case SQL_INVALID_HANDLE: default: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLExecute"); break; } return state; } template const STATUS& odbc :: execute( const dbstreams::query& sql ) { using namespace DBS_ODBC; using odbc_impl::prret; if( plog ) *plog << "odbc::execute ... "; this->sql = sql; if( ! prepare( sql.str() ) ) return state; erc = SQLExecute(hstm); if( plog ) *plog << prret(erc) << "\n"; switch(erc) { case SQL_SUCCESS_WITH_INFO: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLExecute"); // fall through case SQL_SUCCESS: row.resize( ncolumns() ); std::transform( row.begin(), row.end(), row.begin(), row_init(hstm, this) ); if( row.size() > 0 ) return next_row(); case SQL_NEED_DATA: break; case SQL_NO_DATA: state.clear(dbstatus::goodbit); break; case SQL_STILL_EXECUTING: case SQL_ERROR: case SQL_INVALID_HANDLE: default: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLExecute"); break; } return state; } template const STATUS& odbc:: close_cursor() { using namespace DBS_ODBC; switch( (erc = SQLCloseCursor( hstm )) ) { case SQL_SUCCESS_WITH_INFO: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLCloseCursor"); // fall through case SQL_SUCCESS: state.fetched( dbstatus::eofbit, 0, false ); break; case SQL_ERROR: case SQL_INVALID_HANDLE: state.fetched( dbstatus::eofbit, 0, true ); break; } hstm = NULL; return state; } template bool odbc:: next_results() { using namespace DBS_ODBC; if( plog ) *plog << "odbc::next_results SQLMoreResults ... "; erc = SQLMoreResults(hstm); if( plog ) *plog << odbc_impl::prret(erc) << "\n"; switch(erc) { case SQL_SUCCESS_WITH_INFO: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLMoreResults"); // fall through case SQL_SUCCESS: // fetch metadata row.resize( ncolumns() ); std::transform( row.begin(), row.end(), row.begin(), row_init(hstm, this) ); state.clear(dbstatus::goodbit); return row.size() > 0; case SQL_NO_DATA: break; case SQL_STILL_EXECUTING: case SQL_ERROR: case SQL_INVALID_HANDLE: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLMoreResults"); break; } /// close_cursor(); state.fetched( dbstatus::eofbit, 0, true ); return false; } template const STATUS& odbc :: next_row() { using namespace DBS_ODBC; if( plog ) *plog << "odbc::next_row ... "; if( state.eof() ) { if( plog ) *plog << "eof\n"; if( state.fail() ) return state; } erc = SQLFetch( hstm ); if( plog ) *plog << odbc_impl::prret(erc) << "\n"; switch(erc) { case SQL_SUCCESS_WITH_INFO: ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLFetch"); // fall through case SQL_SUCCESS: state.clear(dbstatus::goodbit); break; case SQL_NO_DATA: state.fetched( dbstatus::eofbit, 0, !next_results() ); break; case SQL_STILL_EXECUTING: case SQL_ERROR: case SQL_INVALID_HANDLE: state.fetched( dbstatus::eofbit, 0, true ); ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLFetch"); break; } return state; } /* * Read results */ template const metadata& odbc :: meta(int c) const { if( ! (c < row.size()) ) { std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": column out of range: " << c; throw std::domain_error( oops.str().c_str() ); } return row[c]; } /* * Extract data * Convert using functions provided by odbc */ template dbstreams::cell& odbc :: Extract(int c) const { using namespace DBS_ODBC; const static bool detailed_logging(false); if( ! (c < row.size()) ) { std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": column out of range: " << c; throw std::domain_error( oops.str() ); } cell& col(row[c]); if( !col.bound.allocated() ) col.bound.allocate( 1 + col.colsize() ); // allow for '\0' SQLLEN length; if( plog && detailed_logging) *plog << "odbc::extract column "<< (c+1) << " to a cell, SQLGetData... "; if( plog && detailed_logging) *plog << "\nSQLGetData(" << hstm << ", " << (c+1) << ", " << native_type(col) << ", " << (void*) col.bound.buffer << ", " << col.bound.size << ", " << &length << ");" << std::endl; erc = SQLGetData( hstm, c+1, odbc_impl::sql_c_type(col.type), col.bound.buffer, col.bound.size, &length ); if( plog && detailed_logging ) *plog << odbc_impl::prret(erc) << "\n"; if( SQL_SUCCESS != erc ) { state.msgno = erc; ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLGetData"); if( !ok(erc) ) return col; } assert( SQL_NO_TOTAL != length ); if( SQL_NULL_DATA == length ) { col.is_null = true; length = 0; } col.assign(col.bound.buffer, length); return col; } template bool odbc :: extract(int c, std::string& datum, size_t& len) const { using namespace DBS_ODBC; cell& col( Extract(c) ); len = col.size; col >> datum; return !col.is_null; } template template bool odbc:: Extract(int c, T& datum, size_t& len) const { using namespace DBS_ODBC; cell& col(row[c]); SQLLEN length; if( plog ) *plog << "odbc::Extract column "<< (c+1) << " SQLGetData... "; erc = SQLGetData( hstm, c+1, odbc_impl::desttype(datum), &datum, sizeof(datum), &length ); if( plog ) *plog << odbc_impl::prret(erc) << "\n" << "datum: " << datum << "; length: " << length << ".\n"; if( SQL_SUCCESS != erc ) { ODBC_ERROR(SQL_HANDLE_STMT, hstm, "SQLGetData"); if( !ok(erc) ) return false; } assert( SQL_NO_TOTAL != length ); col.is_null = SQL_NULL_DATA == length; len = col.is_null? 0 : length; return !col.is_null; } #define READY 1 #if READY /* * Insert data * public functions */ template const dbstreams::query& odbc :: insert( int c, metadata::nullitude datum ) { return insert_unquoted(c, "NULL"); } template const dbstreams::query& odbc:: insert( int c, const char * data, streamsize len ) { return insert( c, std::string( data, len ) ); } template const dbstreams::query& odbc :: insert( int c, const std::string& datum ) { return insert_quoted(c, datum); } template const dbstreams::query& odbc :: insert( int c, const int& datum ) { return insert_unquoted(c, datum); } template const dbstreams::query& odbc :: insert( int c, const float& datum ) { return insert_unquoted(c, datum); } template const dbstreams::query& odbc :: insert( int c, const double& datum ) { return insert_unquoted(c, datum); } // Send a row to the server template const STATUS& odbc :: send() { sql.end_insert_statement(); execute(sql); state.nrows++; return state; } #endif // READY /* * Utility */ template bool odbc :: ok( DBS_ODBC::SQLRETURN erc ) { using namespace DBS_ODBC; switch( erc ) { case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: return true; case SQL_NO_DATA: case SQL_STILL_EXECUTING: case SQL_ERROR: case SQL_INVALID_HANDLE: break; default: throw std::domain_error("unhandled"); } return false; } template const STATUS& odbc :: odbc_error( DBS_ODBC::SQLSMALLINT htype, DBS_ODBC::SQLHANDLE handle, const char *srcfile, int srcline, const char *function ) const { using namespace DBS_ODBC; using odbc_impl::prret; SQLINTEGER ndiag=0; SQLRETURN erc; SQLCHAR odbc_state[6]; SQLINTEGER error; SQLCHAR text[1024]; SQLSMALLINT len; state.srcfile = srcfile; state.srcline = srcline; state.driver_function = function; state.setstate(STATUS::failbit); erc = SQLGetDiagField(htype, handle, 0, SQL_DIAG_NUMBER, &ndiag, sizeof(ndiag), &len); std::stringstream oops; oops << "SQLGetDiagField returned " << prret(erc); switch(erc) { case SQL_SUCCESS: break; case SQL_SUCCESS_WITH_INFO: oops << ": buffer too small: " << sizeof(text) << " allocated, " << len << " needed.\n"; state.msg = oops.str(); break; case SQL_ERROR: case SQL_INVALID_HANDLE: case SQL_NO_DATA: oops << "\n"; state.msg = oops.str(); break; default: assert(erc == SQL_SUCCESS); } for( int i=1; i <= ndiag; i++ ) { std::stringstream msg; memset(text, '\0', sizeof(text)); erc = SQLGetDiagRec(htype, handle, i, odbc_state, &error, text, sizeof(text), &len); assert(erc == SQL_SUCCESS); msg << (i>0? "\n" : "") << "[" << i << "] " // std::string(c_str(odbc_state), sizeof(odbc_state)) << odbc_state << ": " << error << ": " << std::string(c_str(text), len) << "."; state.msg += msg.str(); } state.os_error = error; state.notify(); return this->state; } }} // end namespace #endif // PROVIDER_ODBC_H dbstreams/include/dbstream.h010066400017500000000000000277511077620525600162160ustar00jklowdenwheel/* $Id: dbstream.h,v 1.17 2008/04/06 17:48:30 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_DBSTREAM_H #define DBSTREAMS_DBSTREAM_H /* * Define a dbstream. * * January 2008 jkl * $Id: dbstream.h,v 1.17 2008/04/06 17:48:30 jklowden Exp $ */ #include #include #include #include #include #include #include namespace dbstreams { struct c { std::string colname; c( const std::string& colname ) : colname(colname) {} }; struct p { std::string name; int ordinal; explicit p( const std::string& name ) : name(name), ordinal(-1) {} explicit p( int ordinal ) : ordinal(ordinal) {} template bool operator()( const P& p ) const { if( !name.empty() ) return name == p.name; return ordinal == p.ordinal; } }; struct dbstream_data { int icol; parameter_list_type parameters; dbstream_data() : icol(0) {} static void nullify( std::string& datum ) { datum.erase(); } template static void nullify( T& datum ) { datum = 0; } }; } // close namespace std::ostream& operator<<( std::ostream& os, const dbstreams::p& desc ); namespace dbstreams { #define CHECK_PROVIDER() check_provider(__FILE__, __LINE__) provider_type parse_provider_name( const std::string& name, std::pair* where =NULL ); template class dbstream; template dbstream& endl( dbstream& os ); template class dbstream : private dbstream_data { private: typedef providers::provider PROVIDER; typedef dbstream DBstream; login user; PROVIDER *pprovider; dbstream( const dbstream& that ); parameter_list_type parameters; parameter_list_type::iterator pparam; class param_finder { std::string name; int ordinal; public: param_finder( const std::string& name ) : name(name), ordinal(-1) {} param_finder( int ordinal ) : ordinal(ordinal) {} bool operator()( const parameter_type& p ) const { if( !name.empty() ) return name == p.name; return ordinal == p.ordinal; } }; friend dbstream& endl<>( dbstream& os ); public: dbstream() : pprovider(NULL), pparam( parameters.end() ) {} dbstream( provider_type type, const std::string& username = std::string(), const std::string& password = std::string() ) : user( username, password ) , pprovider( new_provider(type, user) ) , pparam( parameters.end() ) {} ~dbstream() { delete pprovider; } // [re]set the provider dbstream& configure( provider_type type, const std::string& username = std::string(), const std::string& password = std::string() ) { user = login(username, password); delete pprovider; pprovider = new_provider(type, user); } const STATUS& open( const std::string& server = std::string(), const std::string& catalog = std::string(), const std::string& tablename = std::string() ) { CHECK_PROVIDER(); pprovider->open( server, catalog ); if( pprovider->status().good() && !tablename.empty() ) this->open( tablename ); return pprovider->status(); } const STATUS& table( const std::string& tablename, insertmode mode = sqlmode ) { CHECK_PROVIDER(); if( 0 && ! handle() ) { std::stringstream oops; oops << "error: database not open " << '(' << __FILE__ << ':' << __LINE__ << ")"; throw std::logic_error(oops.str().c_str()); } icol = 0; return pprovider->open( tablename, mode ); } void close() { if( pprovider ) pprovider->close(); } const providers::urhandle& handle() const { CHECK_PROVIDER(); return pprovider->handle(); } void ignore( int msgno ) { CHECK_PROVIDER(); pprovider->ignore(msgno); } /* * Get status */ std::ostream* log( std::ostream * pos ) { CHECK_PROVIDER(); return pprovider->log(pos); } std::ostream* log() const { CHECK_PROVIDER(); return pprovider->log(); } const STATUS& status() const { CHECK_PROVIDER(); return pprovider->status(); } operator const void*() const { if( pprovider ) return pprovider->status(); return NULL; } bool is_open() const { return pprovider != NULL; } bool eof() const { CHECK_PROVIDER(); return pprovider->status() == dbstatus::eofbit; } bool error() const { CHECK_PROVIDER(); return pprovider->bad() || pprovider->fail() && ! pprovider->eof(); } #define DEBUGGING 1 #if DEBUGGING const std::string& SQL() const { CHECK_PROVIDER(); return pprovider->SQL(); } #endif const parameter_list_type& parameter_list() const { return parameters; } /* * Send queries */ DBstream& operator<<( const dbstreams::query& sql ) { CHECK_PROVIDER(); if( sql.str() != pprovider->SQL() ) { pprovider->execute(sql); } return *this; } DBstream& operator++(int) { CHECK_PROVIDER(); pprovider->next_row(); return *this; } const std::string& query_separator() const { CHECK_PROVIDER(); return pprovider->query_separator(); } /* * Read results -- primitives */ const metadata& meta(int c) const { CHECK_PROVIDER(); return pprovider->meta(c); } int columns() const { CHECK_PROVIDER(); return pprovider->ncolumns(); } int rows() const { CHECK_PROVIDER(); return pprovider->state.nrows; } /* * Insert data */ DBstream& operator<<( const dbstreams::c& c ) { CHECK_PROVIDER(); icol = pprovider->meta(c.colname).ordinal; return *this; } DBstream& operator<<( char c ) { CHECK_PROVIDER(); if( pparam != parameters.end() ) { *pparam = datum; pparam->make_bindable(); pparam = parameters.end(); } else { pprovider->insert( icol++, std::string(1, c) ); } return *this; } DBstream& operator<<( const parameter_type& param ); DBstream& operator<<( const p& manip ) { return set_current_parameter(manip); } template DBstream& operator<<( const D& datum ) { CHECK_PROVIDER(); if( pparam != parameters.end() ) { *pparam = datum; pparam->make_bindable(); pparam = parameters.end(); } else { pprovider->insert( icol++, datum ); } return *this; } DBstream& operator<<( DBstream& (*m)(DBstream&) ) { return (*m)(*this); } // accept manipulators DBstream& write( const char* data, streamsize len ) { CHECK_PROVIDER(); pprovider->insert( icol++, data, len ); return *this; } DBstream& send() { CHECK_PROVIDER(); pprovider->send(); icol = 0; return *this; } /* * Extract data */ DBstream& operator>>( const dbstreams::c& c ) { CHECK_PROVIDER(); icol = pprovider->meta(c.colname).ordinal; return *this; } DBstream& operator>>( const p& manip ) { return set_current_parameter(manip); } template DBstream& operator>>( parameter_value& param ); template DBstream& operator>>( D& datum ) { size_t len; CHECK_PROVIDER(); if( pparam != parameters.end() ) { *pparam >> datum; pparam = parameters.end(); } else { if( !pprovider->extract(icol++, datum, len) ) nullify(datum); } return *this; } DBstream& operator>>( DBstream& (*m)(DBstream&) ) { return (*m)(*this); } // accept manipulators const cell& operator[]( const std::string& name ) { CHECK_PROVIDER(); return pprovider->extract(name); } const cell& operator[]( int icol ) { CHECK_PROVIDER(); return pprovider->extract(icol); } /* * Extract to a container */ template DBstream& read( CONTAINER& container ) { while( status() && !status().eof() ) { CHECK_PROVIDER(); typename CONTAINER::value_type element; element.read( *this ); container.push_back( element ); pprovider->next_row(); } return *this; } /* * Write a container to a dbstream */ template DBstream& write( CONTAINER& container ) { std::for_each( container.begin(), container.end(), container_writer(this) ); return *this; } /* * Write a container to a std::ostream */ template std::ostream& write( std::ostream& os, CONTAINER& container ) { std::for_each( container.begin(), container.end(), container_writer(&os) ); return os; } protected: DBstream& set_current_parameter( const p& manip ); PROVIDER* new_provider( provider_type type, const login& user ) { switch( type ) { case DBLIB: return new providers::dblib(user.username, user.password); case ODBC: return new providers::odbc(user.username, user.password); case SQLITE: return new providers::SQLite(user.username, user.password); default: throw std::runtime_error("no such provider type"); } } void check_provider( std::string func, int line ) const { if( !pprovider ) { std::stringstream oops; oops << "error: provider not set " << '(' << func << ':' << line << ")"; throw std::logic_error( oops.str() ); } } template struct container_writer { DBstream *pdb; std::ostream *pstd; container_writer(DBstream *p) : pdb(p) , pstd(NULL) {} container_writer(std::ostream *p) : pdb(NULL) , pstd(p) {} void operator()( typename C::const_reference element ) const { if( pstd ) { element.write(*pstd); return; } element.write(*pdb); if( !*pdb ) { std::stringstream oops; oops << pdb->status() << '\n'; oops << "error: failure writing std container " "to dbstream " << '(' << __FILE__ << ':' << __LINE__ << ")" << "\n\t SQL is [" << pdb->SQL() << "]"; pdb->status().notify(oops); throw std::runtime_error(oops.str().c_str()); } } }; }; /* * Insert a new parameter or overwrite the value of an existing one. */ template dbstream& dbstream:: operator<<( const parameter_type& param ) { parameters.push_back( param ); parameter_type& storage( parameters.back() ); storage.ordinal = parameters.size() - 1; storage.make_bindable(); return *this; } template dbstream& dbstream:: set_current_parameter( const p& manip ) { pparam = std::find_if( parameters.begin(), parameters.end(), manip ); if( pparam == parameters.end() ) { std::stringstream msg; msg << "dbstreams::query: parameter " << manip << " out of range, " << parameters.size() << " parameter" << (parameters.size() == 1? "" : "s") << " defined" ; throw std::range_error(msg.str()); } return *this; } /* * Extract an output parameter or prepare to. */ template template dbstream& dbstream:: operator>>( parameter_value& param ) { if( !param.name.empty() ) set_current_parameter( p(param.name) ); else set_current_parameter( p(param.ordinal) ); return *this >> param.data; } // manipulator to send a row or execute parameterized query template dbstream& endl( dbstream& os ) { if( os.SQL().size() && os.parameters.size() ) { if( 0 && os.log() ) *os.log() << "endl: [" << os.SQL() << "] " << os.parameters.size() << " parameters\n"; os.pprovider->execute(os.parameters); return os; } return os.send(); } // manipulator to send a NULL template dbstream& null( dbstream& os ) { return os << metadata::null; } } // end namespace #endif dbstreams/include/login.h010066400017500000000000000025471077620525600155210ustar00jklowdenwheel/* $Id: login.h,v 1.3 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_LOGIN_H #define DBSTREAMS_LOGIN_H /* * Keep authentication information. * * October 2007 jkl */ #include namespace dbstreams { struct login { public: std::string username, password; login( const std::string& username = std::string(), const std::string& password = std::string() ) : username(username) , password(password) {} login( const login& that ) : username(that.username) , password(that.password) {} login& operator=( const login& that ) { username = that.username; password = that.password; return *this; } }; } // end namespace #endif // include guard dbstreams/include/query.h010066400017500000000000000065031077620525600155520ustar00jklowdenwheel/* $Id: query.h,v 1.8 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_QUERY_H #define DBSTREAMS_QUERY_H /* * Keep a query and its return status. * * October 2007 jkl */ #include #include #include #include #include namespace dbstreams { class query : protected std::string { public: enum sepmode { pass_through, eat_separator, add_separator }; struct mode_status { std::string separator; sepmode mode; mode_status() : mode(pass_through) {} }; private: struct check_ws { bool fOK; check_ws() : fOK(true) {} void operator()(char c); }; std::ostream *plog; std::string tablename; int result_status; mode_status mode_state; void fiddle(); public: query( const std::string& sql = std::string() ) : std::string(sql) , plog(NULL) { fiddle(); } query( sepmode mode, const std::string sep = std::string() ) : plog(NULL) { this->mode( mode, sep); } const std::string& table() const { return tablename; } const std::string& table( const std::string& name ) { reset(); return tablename = name; } const std::string& str() const { return *this; } std::ostream* log( std::ostream * pos ) { std::swap( plog, pos ); return pos; } const mode_status& mode() const { return mode_state; } bool mode( sepmode, const std::string = std::string() ); int status( int status ) { result_status = status; return result_status; } int status() const { return result_status; } void reset() { erase(); tablename.erase(); result_status = 0; } query& operator=( const std::string& ); query& operator<<( query& (*m)(query&) ) { return (*m)(*this); } // accept manipulators template query& operator<<( const INPUT& datum) { std::stringstream os; os << datum; append( os.str() ); fiddle(); return *this; } static cell& copy_cell_value( const cell& input, cell& output ); static std::string enquote( const std::string& ); /* * Utility functions for providers that don't support bcp operations */ query& prepare_insert_element( int icol ) { if( icol == 0 ) { std::string t(this->tablename); reset(); tablename = t; (*this) << "INSERT INTO " << tablename << " VALUES ("; } else { append( ", " ); } return *this; } query& end_insert_statement() { append( ")" ); append( mode_state.separator ); fiddle(); return *this; } }; #if 0 template<> query& query:: operator<<( const query::parameter_type& param ); template<> query& query:: operator<<( const p& manip ); #endif // manipulator to send a separator query& endl( query& q ); } // end namespace #endif // include guard dbstreams/include/sys004077500017500000000000000000001077620525700147735ustar00jklowdenwheeldbstreams/include/sys/CVS004077500017500000000000000000001077620525700154265ustar00jklowdenwheeldbstreams/include/sys/CVS/Repository010066400017500000000000000000501073552746400176010ustar00jklowdenwheelprojects/database/dbstreams/include/sys dbstreams/include/sys/CVS/Root010066400017500000000000000000321073552746400163450ustar00jklowdenwheel/usr/local/cvs.repository dbstreams/include/sys/CVS/Entries010066400017500000000000000001411077620525700170320ustar00jklowdenwheel/.cvsignore/1.6/Wed Apr 2 03:57:29 2008// /sqlite3.statement.h/1.2/Sun Apr 6 17:38:55 2008// D dbstreams/include/sys/sqlite3.statement.h010066400017500000000000000033061077620525700206110ustar00jklowdenwheel/* $Id: sqlite3.statement.h,v 1.2 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_SQLITE_STATEMENT_H #define DBSTREAMS_SQLITE_STATEMENT_H /* * Keep a statement handle and finalize as needed. * * October 2007 jkl */ #include <../dbstatus.h> namespace dbstreams { template class provider_data_sqlite : public provider_data { bool eoq; HANDLE pdb; STATEMENT pstm; public: provider_data_sqlite() : pdb(NULL), pstm(NULL), eoq(false) {} ~provider_data_sqlite() { reset(); } provider_data_sqlite& set_statement( STATEMENT pstm ) { reset(); this->pstm = pstm; return *this; } provider_data_sqlite& operator=( bool eoq ) { this->eoq = eoq; return *this; } int reset() { if( !pstm ) return; if( !eoq ) return; dbstatus state; if( (state.msgno = sqlite3_finalize(pstm)) != SQLITE_OK ) { throw state.assemble_error( __FILE__, __LINE__ ); } eoq = false; pstm = NULL; return state.msgno; } }; } // end namespace #endif // include guard dbstreams/include/sys/.cvsignore010066400017500000000000000001461077460205100170370ustar00jklowdenwheel*.bck *.ok *.db .depend lib bin .gdbinit dbcat asof.sgml entities ideas manual.prototyp revision.sgml dbstreams/include/provider.h010066400017500000000000000035271077620525600162420ustar00jklowdenwheel/* $Id: provider.h,v 1.4 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef DBSTREAMS_PROVIDER_H #define DBSTREAMS_PROVIDER_H /* * Define all providers. * * January 2008 jkl * $Id: provider.h,v 1.4 2008/04/06 16:23:41 jklowden Exp $ */ #include "provider/absvirt.h" #include "provider/sqlite3.h" #include "provider/dblib.h" #include "provider/odbc.h" namespace dbstreams { namespace providers { int native_type( metadata& meta, int type ); int native_type( const metadata& meta ); class urhandle { provider_type _type; union handle_t { ::DBPROCESS* dbproc; ::sqlite3* sqlite_handle; handle_t() { memset( this, 0, sizeof(handle_t) );} } _handle; public: urhandle() : _type(NONE) {} urhandle& handle( DBPROCESS* dbproc ); urhandle& handle( ::sqlite3* sqlite_handle ); void reset() { _type = NONE; memset(&_handle, 0, sizeof(_handle)); } // read const handle_t& handle() const { return _handle; } const provider_type type() const { return _type; } DBPROCESS* dbproc() const; ::sqlite3* sqlite3() const; // user-defined conversions operator const void*() const { return _type == NONE? NULL : this; } }; }} // end namespace #endif // DBSTREAMS_PROVIDER_H dbstreams/.cvsignore010066400017500000000000000001461077460204600146020ustar00jklowdenwheel*.bck *.ok *.db .depend lib bin .gdbinit dbcat asof.sgml entities ideas manual.prototyp revision.sgml dbstreams/Makefile010066400017500000000000000011751077460204600142450ustar00jklowdenwheel#PAXES != cd .. && ls dbstreams.pax* | sort -r all: (cd src && $(MAKE)) (cd unittest && $(MAKE)) clean: (cd src && $(MAKE) clean) (cd unittest && $(MAKE) clean) backup: cd .. && \ ls dbstreams.pax.[0-9][0-9] 2>/dev/null && exit; \ for P in $(PAXES); do \ EXT=$$(echo $$P | sed -E 's/[^0-9]+//'); \ VER=$$(( 1 + $${EXT:-0} )); \ mv $$P $$(basename $$P ".$$EXT").$$VER; \ done cd .. && \ pax -wf dbstreams.pax dbstreams ls -ltr ../*pax* DIRS != find . -type d | grep -Ev 'CVS|/entities|/lib$$|/ht[docml]+$$|/ideas' edit: .for D in $(DIRS) cd $D && Nc $$(ls Makefile *.[Ch] *.txt 2> /dev/null) 2> /dev/null .endfor dbstreams/src004077500017500000000000000000001077620526000133135ustar00jklowdenwheeldbstreams/src/CVS004077500017500000000000000000001077620526000137465ustar00jklowdenwheeldbstreams/src/CVS/Repository010066400017500000000000000000401073552746400161260ustar00jklowdenwheelprojects/database/dbstreams/src dbstreams/src/CVS/Root010066400017500000000000000000321073552746400146730ustar00jklowdenwheel/usr/local/cvs.repository dbstreams/src/CVS/Entries010066400017500000000000000006721077620526000153630ustar00jklowdenwheel/Makefile/1.4/Mon Nov 19 04:17:15 2007// /.cvsignore/1.6/Wed Apr 2 03:57:29 2008// /cell.C/1.9/Sun Apr 6 17:38:55 2008// /dbstatus.C/1.5/Sun Apr 6 17:38:55 2008// /dbstream.C/1.5/Sun Apr 6 17:38:56 2008// /provider.C/1.3/Sun Apr 6 17:38:56 2008// /provider.dblib.C/1.3/Sun Apr 6 17:38:56 2008// /provider.odbc.C/1.3/Sun Apr 6 17:38:56 2008// /provider.sqlite3.C/1.4/Sun Apr 6 17:38:56 2008// /query.C/1.7/Sun Apr 6 17:38:56 2008// D dbstreams/src/provider.dblib.C010066400017500000000000000103031077620526000163750ustar00jklowdenwheel/* $Id: provider.dblib.C,v 1.3 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include "provider/dblib.h" namespace dbstreams{ namespace providers { namespace dblib_impl { switchboard::connection_map switchboard::connections; switchboard::prior_procs_t switchboard::prior_procs; dbstatus switchboard::err; dbstatus switchboard::msg; int MessageHandler( ::DBPROCESS *dbproc , DBINT msgno , int msgstate , int severity , char *msgtext , char *srvname , char *procname , int line ) { dbstatus status( __FILE__, __LINE__, msgtext ? msgtext : "" ); status.msgno = msgno; status.msgstate = msgstate; status.severity = severity; status.servername = srvname ? srvname : ""; status.procedure_name = procname ? procname : ""; status.line_number = line; return switchboard::message(dbproc, status); } int ErrorHandler( ::DBPROCESS *dbproc , int severity , int dberr , int oserr , char *dberrstr , char *oserrstr ) { dbstatus status( __FILE__, __LINE__, dberrstr ? dberrstr : ""); status.severity = severity; status.msgno = dberr; status.os_error = oserr; if( oserrstr ) status.msg += std::string(" (") + oserrstr + ")"; return switchboard::error(dbproc, status); } int switchboard:: message( ::DBPROCESS* dbproc, const dbstatus& status ) { connection_map::const_iterator p = connections.find(dbproc); if( p == connections.end() ) { msg = status; return 0; } provider_base& base(*p->second); return base.message(status); } int switchboard:: error( ::DBPROCESS* dbproc, const dbstatus& status ) { connection_map::const_iterator p = connections.find(dbproc); #if 0 if( dbproc == NULL || DBDEAD(dbproc) ) return(INT_EXIT); #endif if( p == connections.end() ) { err = status; return 0; } provider_base& base(*p->second); return base.error(status); } ::DBPROCESS* switchboard:: open( provider_base* base, LOGINREC *auth, const std::string& server ) { ::DBPROCESS *dbproc = dbopen( auth, const_cast(server.c_str()) ); if( !dbproc ) { throw err; } connections[dbproc] = base; return dbproc; } void switchboard:: close( ::DBPROCESS *dbproc ) { connection_map::const_iterator p = connections.find(dbproc); if( p == connections.end() ) { throw std::logic_error( "dbproc not found to close" ); } connections.erase(dbproc); dbclose(dbproc); } metadata::datatype datatype( int type ) { switch(type) { case SYBDATETIME: case SYBDATETIME4: return metadata::DATETIME; case SYBMONEY4: case SYBMONEY: case SYBDECIMAL: case SYBNUMERIC: return metadata::NUMERIC; case SYBFLT8: return metadata::FLOAT; case SYBREAL: return metadata::REAL; case SYBINT4: case SYBINT2: case SYBINT1: case SYBBIT: return metadata::INT; case SYBIMAGE: case SYBBINARY: //// SYBBOUNDARY: //// SYBSENSITIVITY: return metadata::BINARY; case SYBTEXT: case SYBCHAR: return metadata::CHAR; default: break; } throw std::logic_error(__func__); } int desttype( int i ) { return SYBINT4; } int desttype( float f ) { return SYBREAL; } int desttype( double d ) { return SYBFLT8; } int desttype( const char* s ) { return SYBCHAR; } int desttype( const void* pv ) { return SYBBINARY; } const char * retcode( RETCODE ret ) { switch(ret) { case REG_ROW: return "REG_ROW"; //// MORE_ROWS: return "MORE_ROWS"; case NO_MORE_ROWS: return "NO_MORE_ROWS"; case BUF_FULL: return "BUF_FULL"; case NO_MORE_RESULTS: return "NO_MORE_RESULTS"; case SUCCEED: return "SUCCEED"; case FAIL: return "FAIL"; default: break; } return "[unrecognized RETCODE]"; } }}} // end namespaces dbstreams/src/.cvsignore010066400017500000000000000001461077460205100153650ustar00jklowdenwheel*.bck *.ok *.db .depend lib bin .gdbinit dbcat asof.sgml entities ideas manual.prototyp revision.sgml dbstreams/src/Makefile010066400017500000000000000006101072020711300150100ustar00jklowdenwheelSOURCES != ls *.C OBJ = $(SOURCES:S/C$/o/g) CFLAGS += -ggdb -I../include \ -I/usr/local/include \ -I/usr/pkg/include \ -fmessage-length=230 ../lib/libdbstreams.so: libdbstreams.so @$(MAKE) ../lib ln -f $(.ALLSRC) $(@:H)/ libdbstreams.so: .depend $(OBJ) $(CC) -shared -o $@ $(OBJ) ../lib: mkdir $@ .depend: $(SOURCES) mkdep ${CFLAGS} ${SOURCES} clean: rm -f *.o *.so* *.a dbstreams/src/cell.C010066400017500000000000000222411077620525700144210ustar00jklowdenwheel/* $Id: cell.C,v 1.9 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ /* * A cell holds one column from one row. * It is convertible to any datatype, but it itself * neither converts nor allocates memory. * * October 2007 jkl */ #include #include #include namespace dbstreams { bool metadata:: operator<( const std::string name ) const { return this->name < name; } bool metadata:: operator==( const std::string name ) const { return this->name == name; } bool metadata:: varylen( datatype type ) { switch( type ) { case CHAR: case BINARY: return true; } return false; } cell& cell:: make_bindable() { if( varylen(type) ) { bound.allocate(size); memcpy( bound.buffer, data.pv, size ); switch( type ) { case CHAR: data.s = bound.buffer; break; case BINARY: data.pv = bound.buffer; break; default: throw std::logic_error("unbindable type"); break; } } return *this; } bool cell:: valid() const { return type == CHAR && data.s || type == BINARY && data.pv || is_null && size == 0 || size > 0 && !metadata::varylen(type); } cell& cell:: assign(void * pdata, int len) { switch( type ) { case UNKNOWN: case BINARY: (*this)( static_cast(pdata), len ); break; case CHAR: (*this)( reinterpret_cast(pdata), len ); break; case INT: (*this) = *reinterpret_cast(pdata); break; case REAL: (*this) = *reinterpret_cast(pdata); break; case FLOAT: (*this) = *reinterpret_cast(pdata); break; default: throw std::logic_error("unknown metadata type"); } return *this; } cell::cell() : is_null(false) , is_output_parameter(false) , indicator_data(0) , size(0) {} cell::cell(const cell& that) : metadata(that) , is_null(that.is_null) , is_output_parameter(that.is_output_parameter) , size(that.size) , indicator_data(that.indicator_data) , data(that.data) {} cell& cell:: operator=(const cell& that) { metadata& me(*this); me = that; is_null = that.is_null; is_output_parameter = that.is_output_parameter; indicator_data = that.indicator_data; size = that.size; data = that.data; } cell::cell( int i, int ordinal ) : is_null(false) , is_output_parameter(false) { (*this) = i; this->ordinal = ordinal; } cell& cell:: operator=( int i ) { type = INT; sizeup(i); data.i = i; } cell::cell( float f, int ordinal ) : is_null(false) , is_output_parameter(false) { (*this) = f; this->ordinal = ordinal; } cell& cell:: operator=( float f ) { type = REAL; sizeup(f); data.f = f; } cell::cell( double d, int ordinal ) : is_null(false) , is_output_parameter(false) { (*this) = d; this->ordinal = ordinal; } cell& cell:: operator=( double d ) { type = FLOAT; sizeup(d); data.d = d; } cell::cell( const char *s, int len, int ordinal ) : is_null(false) , is_output_parameter(false) { type = CHAR; size = (len == -1)? strlen(s) : len; this->ordinal = ordinal; data.s = s; } cell& cell:: operator()( const char *s, int len ) { type = CHAR; is_null = false; size = len; data.s = s; if( len < 0 ) { std::stringstream oops; oops << __func__ << ':' << __LINE__ << ":\n\t" << "length (" << len << ") must be at least zero"; throw std::domain_error(oops.str().c_str()); } } cell& cell:: operator=( const char *s ) { type = CHAR; is_null = false; size = strlen(s); data.s = s; } cell& cell:: operator=( const unsigned char *s ) { type = CHAR; is_null = s == NULL; data.s = reinterpret_cast(s); size = is_null? 0 : strlen(data.s); } cell::cell( const void *pv, int len, int ordinal ) : is_null(pv == NULL) , is_output_parameter(false) { type = BINARY; size = is_null? 0 : len; data.pv = pv; this->ordinal = ordinal; if( len < 0 ) { std::stringstream oops; oops << __func__ << ':' << __LINE__ << ":\n\t" << "length (" << len << ") must be at least zero"; throw std::domain_error(oops.str().c_str()); } } cell& cell:: operator()( const void *pv, int len ) { type = BINARY; is_null = pv == NULL; size = is_null? 0 : len; data.pv = pv; if( len < 0 ) { std::stringstream oops; oops << __func__ << ':' << __LINE__ << ":\n\t" << "length (" << len << ") must be at least zero"; throw std::domain_error(oops.str().c_str()); } } /* * Construction with names */ cell::cell( int i, const std::string& name ) : is_null(false) , is_output_parameter(false) { (*this) = i; this->name = name; } cell::cell( float f, const std::string& name ) : is_null(false) , is_output_parameter(false) { (*this) = f; this->name = name; } cell::cell( double d, const std::string& name ) : is_null(false) , is_output_parameter(false) { (*this) = d; this->name = name; } cell::cell( const char *s, int len, const std::string& name ) : is_null(false) , is_output_parameter(false) { type = CHAR; size = (len == -1)? strlen(s) : len; this->name = name; data.s = s; } cell::cell( const void *pv, int len, const std::string& name ) : is_null(pv == NULL) , is_output_parameter(false) { type = BINARY; size = is_null? 0 : len; data.pv = pv; this->name = name; if( len < 0 ) { std::stringstream oops; oops << __func__ << ':' << __LINE__ << ":\n\t" << "length (" << len << ") must be at least zero"; throw std::domain_error(oops.str().c_str()); } } cell& cell:: copy_value( const cell& that ) { if( type != that.type ) { throw std::runtime_error("type mismatch"); } if( size != that.size && bound.size < that.size) { std::stringstream msg; msg << "size mismatch:" << " input = " << size << " output = " << that.size << " allocated = " << bound.size ; throw std::runtime_error( msg.str() ); } if( colsize() < that.colsize() ) { std::stringstream msg; msg << "colsize mismatch:" << " input = " << colsize() << " output = " << that.colsize() << " allocated = " << bound.size ; throw std::runtime_error( msg.str() ); } if( ordinal != that.ordinal ) { throw std::runtime_error("ordinal mismatch"); } switch( type ) { case UNKNOWN: case BINARY: memcpy( const_cast(data.pv), that.data.pv, size ); break; case CHAR: memcpy( const_cast(data.s), that.data.s, size ); break; case INT: case REAL: case FLOAT: data = that.data; break; default: throw std::logic_error("unknown metadata type"); } return *this; } /* * Extraction */ const cell& cell:: operator>>(std::string& datum ) const { datum = data.s; return *this; } const cell& cell:: operator>>(int& datum) const { datum = data.i; return *this; } const cell& cell:: operator>>(float& datum ) const { datum = data.f; return *this; } const cell& cell:: operator>>(double& datum ) const { datum = data.d; return *this; } const cell& cell:: operator>>(const char *& s) const { s = data.s; return *this; } const cell& cell:: operator>>(const unsigned char *& s) const { s = reinterpret_cast(data.s); return *this; } const cell& cell:: operator>>(const void *& pv) const { pv = data.pv; return *this; } parameter_list_type::iterator find( parameter_list_type& parameters, const std::string& name ) { return std::find( parameters.begin(), parameters.end(), name ); } } // end namespace std::ostream& operator<<( std::ostream& os, const dbstreams::cell& col ) { if( col.is_null ) { return os << "NULL"; } switch( col.type ) { case dbstreams::metadata::UNKNOWN: { std::stringstream oops; oops << __func__ << ':' << __LINE__ << ":\n\t" << "unknown type in column " << col.ordinal; throw std::runtime_error(oops.str().c_str()); } case dbstreams::metadata::BINARY: os << "[binary]"; break; case dbstreams::metadata::CHAR: { std::string s( col.data.s, col.size ); os << s; } break; case dbstreams::metadata::INT: os << col.data.i; break; case dbstreams::metadata::REAL: os << col.data.f; break; case dbstreams::metadata::FLOAT: os << col.data.d; break; } return os; } std::ostream& operator<<( std::ostream& os, const dbstreams::metadata::datatype type) { using dbstreams::metadata; const char *name; switch(type) { case metadata::UNKNOWN: name = "UNKNOWN"; break; case metadata::BINARY: name = "BINARY"; break; case metadata::CHAR: name = "CHAR"; break; case metadata::DATETIME: name = "DATETIME"; break; case metadata::FLOAT: name = "FLOAT"; break; case metadata::INT: name = "INT"; break; case metadata::NUMERIC: name = "NUMERIC"; break; case metadata::REAL: name = "REAL"; break; case metadata::nTYPES: name = "nTYPES"; break; default: name = __func__; } return os << name; } dbstreams/src/dbstatus.C010066400017500000000000000102311077620525700153270ustar00jklowdenwheel/* $Id: dbstatus.C,v 1.5 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ /* * Record dbstatus messages coming from the server and library. * Operate as boolean good/bad dbstatus; caller uses to decide if * OK to use. * notify() method called by provider when error occurs. User can * derive from this class to override notify() to do something useful. * * October 2007 jkl */ #include #include namespace dbstreams { dbstatus::dbstatus( const std::string& msg ) : std::runtime_error(msg) , srcfile("unknown") , srcline(0) , driver_function(0) , nrows(0) , state(goodbit) , msgno(0) , msgstate(0) , severity(0) , os_error(0) , line_number(0) , msg(msg) , nmissing_parameters(0) {} dbstatus::dbstatus( const char *srcfile, int srcline, const std::string& msg ) : std::runtime_error(msg) , srcfile(srcfile) , srcline(srcline) , driver_function(0) , nrows(0) , state(goodbit) , msgno(0) , msgstate(0) , severity(0) , os_error(0) , line_number(0) , msg(msg) , nmissing_parameters(0) {} const dbstatus::ignore_list& dbstatus:: ignore(const ignore_list& that) { ignoring = that; return ignoring; } void dbstatus:: fetched( iostate state, int nrows, bool fail ) { clear(state); this->nrows += nrows; // set failbit if no more data and no more SQL to process if( state == eofbit && fail ) setstate(failbit); } const char* dbstatus:: what() const throw() { return msg.size()? msg.c_str() : NULL; } const dbstatus& dbstatus:: reset( iostate state ) { this->state = state; /// srcfile = "none"; causes segfault srcline = 0; msgno = 0; severity = 0; os_error = 0; line_number = 0; nrows = 0; msg.erase(); servername.erase(); procedure_name.erase(); return *this; } dbstatus& dbstatus:: operator=( const std::string& msg ) { this->msg = msg; return *this; } bool dbstatus:: operator==( int msgno) const { return this->msgno == msgno; } bool dbstatus:: operator!=( int msgno) const { return this->msgno != msgno; } std::ostream& dbstatus:: notify( std::ostream& os ) const { if( ignoring.end() != std::find( ignoring.begin(), ignoring.end(), msgno ) ) { return os; } #if 0 os << "(ignore list is " << ignoring.size() << " messages)\n"; std::deque::const_iterator p; for( p=ignoring.begin(); p != ignoring.end(); p++ ) { os << "(ignoring " << *p << ")\n"; } #endif if( srcfile ) os << srcfile << ":" << srcline << ":\n\t"; if( driver_function ) os << "[" << driver_function << "]" ":\n\t"; os << "error " << msgno << ": \"" << msg << "\" "; if( os_error ) os << " (os_error " << this->os_error << ") "; if( servername.size() ) os << " from " << servername; if( procedure_name.size() ) os << ", '" << procedure_name; if( line_number ) os << ", line " << line_number; os << " (state is " << state << "), " << nrows << " rows\n"; } } // end namespace std::ostream& operator<<( std::ostream& os, const dbstreams::dbstatus& dbstatus ) { return dbstatus.notify( os ); } std::ostream& operator<<( std::ostream& os, const dbstreams::dbstatus::iostate& state ) { switch (state) { case dbstreams::dbstatus::goodbit: os << "goodbit"; break; case dbstreams::dbstatus::badbit: os << "badbit"; break; case dbstreams::dbstatus::eofbit: os << "eofbit"; break; case dbstreams::dbstatus::failbit: os << "failbit"; break; case dbstreams::dbstatus::eofbit | dbstreams::dbstatus::failbit: os << "eofbit+failbit"; break; default: os << static_cast(state); break; } return os; } dbstreams/src/dbstream.C010066400017500000000000000033201077620526000152720ustar00jklowdenwheel/* $Id: dbstream.C,v 1.5 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ /* * Define non-template functions in dbstreams namespace. * * January 2008 jkl * $Id: dbstream.C,v 1.5 2008/04/06 16:23:41 jklowden Exp $ */ #include namespace dbstreams { provider_type parse_provider_name( const std::string& name, std::pair* where ) { struct prov_t { const char *name; provider_type type; }; static const prov_t provs[] = { { "sqlite", SQLITE } , { "dblib", DBLIB } , { "odbc", ODBC } }, *eoprovs = provs + sizeof(provs)/sizeof(provs[0]); for( const prov_t *p = provs; p < eoprovs; p++ ) { const char *begin; const char *input = name.c_str(); if( (begin = strcasestr( input, p->name )) != 0 ) { if( where ) { where->first = begin - input; where->second = where->first + strlen(p->name); } return p->type; } } return NONE; } } // end namespace std::ostream& operator<<( std::ostream& os, const dbstreams::p& manip ) { os << "{" << manip.name << " (" << manip.ordinal << ")}"; } dbstreams/src/provider.sqlite3.C010066400017500000000000000040611077620526000167110ustar00jklowdenwheel/* $Id: provider.sqlite3.C,v 1.4 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include #include #include #include #include #include "provider/sqlite3.h" namespace dbstreams{ namespace providers { namespace sqlite { static std::map< int, cell::datatype > datatypes; /* * Given a dbstreams::cell::datatype, what does this provider call it? */ int sqlite_type( cell::datatype type ) { switch( type ) { case metadata::UNKNOWN: case metadata::CHAR: return SQLITE3_TEXT; case metadata::BINARY: return SQLITE_BLOB; case metadata::REAL: case metadata::FLOAT: return SQLITE_FLOAT; case metadata::INT: return SQLITE_INTEGER; } std::stringstream oops; oops << __func__ << ":" << __LINE__ << ": unknown type: " << type; throw std::domain_error( oops.str().c_str() ); } metadata::datatype datatype( int type ) { if( datatypes.size() == 0 ) { const static metadata::datatype types[] = { metadata::BINARY , metadata::CHAR , metadata::FLOAT , metadata::INT , metadata::REAL }; for( int i=0; i < sizeof(types)/sizeof(types[0]); i++ ) { metadata::datatype t = metadata::datatype(types[i]); datatypes[ sqlite_type( t ) ] = t; } } std::map< int, cell::datatype >:: const_iterator p = datatypes.find( type ); if( p == datatypes.end() ) return metadata::UNKNOWN; return p->second; } }}} // end namespace dbstreams/src/query.C010066400017500000000000000050431077620526000146420ustar00jklowdenwheel/* $Id: query.C,v 1.7 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ /* * Keep a query and its return status. * * October 2007 jkl */ #include #include #include #include namespace dbstreams { void query::check_ws:: operator()(char c) { fOK = fOK && isspace(c); } bool query:: mode( sepmode mode, const std::string sep ) { switch(mode) { case pass_through: mode_state.mode = mode; mode_state.separator.erase(); break; case eat_separator: case add_separator: if( sep.size() == 0 ) return false; mode_state.mode = mode; mode_state.separator = sep; break; default: throw std::logic_error("stupid mode"); break; } return true; } void query:: fiddle() { return; using std::string; size_t endpos; switch(mode_state.mode) { case pass_through: return; case eat_separator: endpos = rfind(mode_state.separator); if( endpos != string::npos ) { string remainder( *this, endpos ); remainder.erase(0); if( std::for_each( remainder.begin(), remainder.end(), check_ws() ).fOK ) { size_t size(mode_state.separator.size()); replace( endpos, size, " " ); } } break; case add_separator: append(mode_state.separator); break; default: throw std::logic_error("impossible mode"); break; } } query& query:: operator=( const std::string& input ) { std::string::operator=(input); fiddle(); return *this; } class quoted_string : public std::string { public: void operator()( const char c ) { int n = ( c == '\'' )? 2 : 1; append( n, c ); } }; std::string query:: enquote( const std::string& input ) { static const std::string quote("'"); return quote + std::for_each( input.begin(), input.end(), quoted_string() ) + quote ; } // manipulator to send a separator query& endl( query& q ) { return q << q.mode().separator; } } // end namespace dbstreams/src/.depend010066400017500000000000001035451077553405300146430ustar00jklowdenwheelcell.o: cell.C /usr/include/g++/stdexcept /usr/include/g++/exception \ /usr/include/g++/string /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/bits/stringfwd.h \ /usr/include/g++/bits/char_traits.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/null.h \ /usr/include/string.h /usr/include/sys/featuretest.h \ /usr/include/strings.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/sys/ansi.h \ /usr/include/g++/bits/gthr.h /usr/include/g++/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/time.h /usr/include/sys/time.h \ /usr/include/sys/types.h /usr/include/machine/types.h \ /usr/include/machine/endian.h /usr/include/sys/endian.h \ /usr/include/machine/endian_machdep.h /usr/include/machine/byte_swap.h \ /usr/include/machine/bswap.h /usr/include/sys/bswap.h \ /usr/include/pthread_types.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/g++/cwchar \ /usr/include/g++/ctime /usr/include/wchar.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/climits \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/sys/syslimits.h /usr/include/g++/cstdlib \ /usr/include/stdlib.h /usr/include/g++/new /usr/include/g++/iosfwd \ /usr/include/g++/bits/c++locale.h /usr/include/g++/clocale \ /usr/include/locale.h /usr/include/g++/cctype /usr/include/ctype.h \ /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/sstream \ /usr/include/g++/istream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/limits \ /usr/include/g++/bits/istream.tcc /usr/include/g++/locale \ /usr/include/g++/bits/locale_facets.tcc /usr/include/g++/cerrno \ /usr/include/errno.h /usr/include/sys/errno.h /usr/include/g++/cmath \ /usr/include/math.h /usr/include/machine/math.h /usr/include/x86/math.h \ /usr/include/g++/bits/cmath.tcc /usr/include/g++/typeinfo \ /usr/include/g++/ostream /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/bits/sstream.tcc ../include/cell.h dbstatus.o: dbstatus.C /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/null.h \ /usr/include/string.h /usr/include/sys/featuretest.h \ /usr/include/strings.h /usr/include/g++/climits /usr/include/limits.h \ /usr/include/machine/limits.h /usr/include/sys/syslimits.h \ /usr/include/g++/cstdlib /usr/include/stdlib.h /usr/include/sys/types.h \ /usr/include/machine/types.h /usr/include/sys/ansi.h \ /usr/include/machine/endian.h /usr/include/sys/endian.h \ /usr/include/machine/endian_machdep.h /usr/include/machine/byte_swap.h \ /usr/include/machine/bswap.h /usr/include/sys/bswap.h \ /usr/include/pthread_types.h /usr/include/g++/new \ /usr/include/g++/exception /usr/include/g++/iosfwd \ /usr/include/g++/bits/c++locale.h /usr/include/g++/clocale \ /usr/include/locale.h /usr/include/g++/cctype /usr/include/ctype.h \ /usr/include/g++/bits/stringfwd.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/g++/cwchar \ /usr/include/g++/ctime /usr/include/wchar.h \ /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h ../include/dbstatus.h \ /usr/include/g++/stdexcept /usr/include/g++/string \ /usr/include/g++/bits/char_traits.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_alloc.h /usr/include/g++/bits/stl_threads.h \ /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ /usr/include/g++/iostream /usr/include/g++/ostream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/locale /usr/include/g++/bits/locale_facets.tcc \ /usr/include/g++/cerrno /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/g++/cmath /usr/include/math.h /usr/include/machine/math.h \ /usr/include/x86/math.h /usr/include/g++/bits/cmath.tcc \ /usr/include/g++/limits /usr/include/g++/typeinfo \ /usr/include/g++/istream /usr/include/g++/bits/istream.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc dbstream.o: dbstream.C ../include/dbstream.h /usr/include/unistd.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/featuretest.h \ /usr/include/sys/types.h /usr/include/machine/types.h \ /usr/include/sys/ansi.h /usr/include/machine/endian.h \ /usr/include/sys/endian.h /usr/include/machine/endian_machdep.h \ /usr/include/machine/byte_swap.h /usr/include/machine/bswap.h \ /usr/include/sys/bswap.h /usr/include/pthread_types.h \ /usr/include/sys/unistd.h /usr/include/sys/null.h \ /usr/include/g++/string /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/bits/stringfwd.h \ /usr/include/g++/bits/char_traits.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h /usr/include/string.h \ /usr/include/strings.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/g++/cwchar /usr/include/g++/ctime \ /usr/include/wchar.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/climits \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/sys/syslimits.h /usr/include/g++/cstdlib \ /usr/include/stdlib.h /usr/include/g++/new /usr/include/g++/exception \ /usr/include/g++/iosfwd /usr/include/g++/bits/c++locale.h \ /usr/include/g++/clocale /usr/include/locale.h /usr/include/g++/cctype \ /usr/include/ctype.h /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/iostream \ /usr/include/g++/ostream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/locale /usr/include/g++/bits/locale_facets.tcc \ /usr/include/g++/cerrno /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/g++/cmath /usr/include/math.h /usr/include/machine/math.h \ /usr/include/x86/math.h /usr/include/g++/bits/cmath.tcc \ /usr/include/g++/limits /usr/include/g++/typeinfo \ /usr/include/g++/istream /usr/include/g++/bits/istream.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc ../include/dbstatus.h \ /usr/include/g++/stdexcept /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ ../include/dbstream.enum.h ../include/provider.h \ ../include/provider/absvirt.h ../include/provider/data.h \ /usr/include/g++/vector /usr/include/g++/bits/stl_vector.h \ /usr/include/g++/bits/stl_bvector.h /usr/include/g++/bits/vector.tcc \ ../include/query.h /usr/include/g++/sstream \ /usr/include/g++/bits/sstream.tcc ../include/cell.h ../include/login.h \ ../include/provider/sqlite3.h /usr/pkg/include/sqlite3.h \ /usr/include/stdarg.h /usr/include/g++/cassert /usr/include/assert.h \ ../include/provider/dblib.h /usr/include/libgen.h \ /usr/local/include/sybdb.h /usr/local/include/tds_sysdep_public.h \ /usr/include/g++/map /usr/include/g++/bits/stl_tree.h \ /usr/include/g++/bits/stl_map.h /usr/include/g++/bits/stl_multimap.h \ ../include/provider/odbc.h /usr/local/include/sql.h \ /usr/local/include/sqltypes.h /usr/local/include/sqlext.h \ /usr/local/include/sqlucode.h provider.o: provider.C ../include/provider.h \ ../include/provider/absvirt.h /usr/include/g++/string \ /usr/include/g++/bits/c++config.h /usr/include/g++/bits/os_defines.h \ /usr/include/g++/bits/stringfwd.h /usr/include/g++/bits/char_traits.h \ /usr/include/g++/cstring /usr/include/g++/cstddef /usr/include/stddef.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/null.h \ /usr/include/string.h /usr/include/sys/featuretest.h \ /usr/include/strings.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/sys/ansi.h \ /usr/include/g++/bits/gthr.h /usr/include/g++/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/time.h /usr/include/sys/time.h \ /usr/include/sys/types.h /usr/include/machine/types.h \ /usr/include/machine/endian.h /usr/include/sys/endian.h \ /usr/include/machine/endian_machdep.h /usr/include/machine/byte_swap.h \ /usr/include/machine/bswap.h /usr/include/sys/bswap.h \ /usr/include/pthread_types.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/g++/cwchar \ /usr/include/g++/ctime /usr/include/wchar.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/climits \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/sys/syslimits.h /usr/include/g++/cstdlib \ /usr/include/stdlib.h /usr/include/g++/new /usr/include/g++/exception \ /usr/include/g++/iosfwd /usr/include/g++/bits/c++locale.h \ /usr/include/g++/clocale /usr/include/locale.h /usr/include/g++/cctype \ /usr/include/ctype.h /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/iostream \ /usr/include/g++/ostream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/locale /usr/include/g++/bits/locale_facets.tcc \ /usr/include/g++/cerrno /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/g++/cmath /usr/include/math.h /usr/include/machine/math.h \ /usr/include/x86/math.h /usr/include/g++/bits/cmath.tcc \ /usr/include/g++/limits /usr/include/g++/typeinfo \ /usr/include/g++/istream /usr/include/g++/bits/istream.tcc \ ../include/provider/data.h /usr/include/g++/vector \ /usr/include/g++/bits/stl_vector.h /usr/include/g++/bits/stl_bvector.h \ /usr/include/g++/bits/vector.tcc /usr/include/g++/stdexcept \ ../include/dbstatus.h /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc ../include/query.h \ /usr/include/g++/sstream /usr/include/g++/bits/sstream.tcc \ ../include/cell.h ../include/login.h ../include/dbstream.enum.h \ ../include/provider/sqlite3.h /usr/pkg/include/sqlite3.h \ /usr/include/stdarg.h /usr/include/g++/cassert /usr/include/assert.h \ ../include/provider/dblib.h /usr/include/libgen.h \ /usr/local/include/sybdb.h /usr/local/include/tds_sysdep_public.h \ /usr/include/g++/map /usr/include/g++/bits/stl_tree.h \ /usr/include/g++/bits/stl_map.h /usr/include/g++/bits/stl_multimap.h \ ../include/provider/odbc.h /usr/local/include/sql.h \ /usr/local/include/sqltypes.h /usr/local/include/sqlext.h \ /usr/local/include/sqlucode.h provider.dblib.o: provider.dblib.C ../include/provider/dblib.h \ /usr/include/libgen.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/local/include/sybdb.h /usr/local/include/tds_sysdep_public.h \ /usr/include/g++/cassert /usr/include/assert.h \ /usr/include/sys/featuretest.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h \ /usr/include/machine/ansi.h /usr/include/machine/int_types.h \ /usr/include/sys/null.h /usr/include/string.h /usr/include/strings.h \ /usr/include/g++/climits /usr/include/limits.h \ /usr/include/machine/limits.h /usr/include/sys/syslimits.h \ /usr/include/g++/cstdlib /usr/include/stdlib.h /usr/include/sys/types.h \ /usr/include/machine/types.h /usr/include/sys/ansi.h \ /usr/include/machine/endian.h /usr/include/sys/endian.h \ /usr/include/machine/endian_machdep.h /usr/include/machine/byte_swap.h \ /usr/include/machine/bswap.h /usr/include/sys/bswap.h \ /usr/include/pthread_types.h /usr/include/g++/new \ /usr/include/g++/exception /usr/include/g++/iosfwd \ /usr/include/g++/bits/c++locale.h /usr/include/g++/clocale \ /usr/include/locale.h /usr/include/g++/cctype /usr/include/ctype.h \ /usr/include/g++/bits/stringfwd.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/g++/cwchar \ /usr/include/g++/ctime /usr/include/wchar.h \ /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h /usr/include/g++/string \ /usr/include/g++/bits/char_traits.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_alloc.h /usr/include/g++/bits/stl_threads.h \ /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/vector \ /usr/include/g++/bits/stl_vector.h /usr/include/g++/bits/stl_bvector.h \ /usr/include/g++/bits/vector.tcc /usr/include/g++/map \ /usr/include/g++/bits/stl_tree.h /usr/include/g++/bits/stl_map.h \ /usr/include/g++/bits/stl_multimap.h /usr/include/g++/sstream \ /usr/include/g++/istream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/limits \ /usr/include/g++/bits/istream.tcc /usr/include/g++/locale \ /usr/include/g++/bits/locale_facets.tcc /usr/include/g++/cerrno \ /usr/include/errno.h /usr/include/sys/errno.h /usr/include/g++/cmath \ /usr/include/math.h /usr/include/machine/math.h /usr/include/x86/math.h \ /usr/include/g++/bits/cmath.tcc /usr/include/g++/typeinfo \ /usr/include/g++/ostream /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/bits/sstream.tcc /usr/include/g++/stdexcept \ ../include/provider/data.h /usr/include/g++/iostream \ ../include/dbstatus.h /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc ../include/query.h ../include/cell.h \ ../include/login.h ../include/dbstream.enum.h \ ../include/provider/absvirt.h provider.odbc.o: provider.odbc.C ../include/provider/odbc.h \ /usr/local/include/sql.h /usr/local/include/sqltypes.h \ /usr/local/include/sqlext.h /usr/local/include/sqlucode.h \ /usr/include/g++/cassert /usr/include/assert.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/sys/featuretest.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h \ /usr/include/machine/ansi.h /usr/include/machine/int_types.h \ /usr/include/sys/null.h /usr/include/string.h /usr/include/strings.h \ /usr/include/g++/climits /usr/include/limits.h \ /usr/include/machine/limits.h /usr/include/sys/syslimits.h \ /usr/include/g++/cstdlib /usr/include/stdlib.h /usr/include/sys/types.h \ /usr/include/machine/types.h /usr/include/sys/ansi.h \ /usr/include/machine/endian.h /usr/include/sys/endian.h \ /usr/include/machine/endian_machdep.h /usr/include/machine/byte_swap.h \ /usr/include/machine/bswap.h /usr/include/sys/bswap.h \ /usr/include/pthread_types.h /usr/include/g++/new \ /usr/include/g++/exception /usr/include/g++/iosfwd \ /usr/include/g++/bits/c++locale.h /usr/include/g++/clocale \ /usr/include/locale.h /usr/include/g++/cctype /usr/include/ctype.h \ /usr/include/g++/bits/stringfwd.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/g++/cwchar \ /usr/include/g++/ctime /usr/include/wchar.h \ /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h /usr/include/g++/string \ /usr/include/g++/bits/char_traits.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_alloc.h /usr/include/g++/bits/stl_threads.h \ /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/vector \ /usr/include/g++/bits/stl_vector.h /usr/include/g++/bits/stl_bvector.h \ /usr/include/g++/bits/vector.tcc /usr/include/g++/sstream \ /usr/include/g++/istream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/limits \ /usr/include/g++/bits/istream.tcc /usr/include/g++/locale \ /usr/include/g++/bits/locale_facets.tcc /usr/include/g++/cerrno \ /usr/include/errno.h /usr/include/sys/errno.h /usr/include/g++/cmath \ /usr/include/math.h /usr/include/machine/math.h /usr/include/x86/math.h \ /usr/include/g++/bits/cmath.tcc /usr/include/g++/typeinfo \ /usr/include/g++/ostream /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/bits/sstream.tcc /usr/include/g++/stdexcept \ ../include/dbstream.enum.h ../include/provider/data.h \ /usr/include/g++/iostream ../include/dbstatus.h /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc ../include/query.h ../include/cell.h \ ../include/login.h ../include/provider/absvirt.h provider.sqlite3.o: provider.sqlite3.C /usr/include/g++/string \ /usr/include/g++/bits/c++config.h /usr/include/g++/bits/os_defines.h \ /usr/include/g++/bits/stringfwd.h /usr/include/g++/bits/char_traits.h \ /usr/include/g++/cstring /usr/include/g++/cstddef /usr/include/stddef.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/null.h \ /usr/include/string.h /usr/include/sys/featuretest.h \ /usr/include/strings.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/sys/ansi.h \ /usr/include/g++/bits/gthr.h /usr/include/g++/bits/gthr-default.h \ /usr/include/pthread.h /usr/include/time.h /usr/include/sys/time.h \ /usr/include/sys/types.h /usr/include/machine/types.h \ /usr/include/machine/endian.h /usr/include/sys/endian.h \ /usr/include/machine/endian_machdep.h /usr/include/machine/byte_swap.h \ /usr/include/machine/bswap.h /usr/include/sys/bswap.h \ /usr/include/pthread_types.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/g++/cwchar \ /usr/include/g++/ctime /usr/include/wchar.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/climits \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/sys/syslimits.h /usr/include/g++/cstdlib \ /usr/include/stdlib.h /usr/include/g++/new /usr/include/g++/exception \ /usr/include/g++/iosfwd /usr/include/g++/bits/c++locale.h \ /usr/include/g++/clocale /usr/include/locale.h /usr/include/g++/cctype \ /usr/include/ctype.h /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/vector \ /usr/include/g++/bits/stl_vector.h /usr/include/g++/bits/stl_bvector.h \ /usr/include/g++/bits/vector.tcc /usr/include/g++/map \ /usr/include/g++/bits/stl_tree.h /usr/include/g++/bits/stl_map.h \ /usr/include/g++/bits/stl_multimap.h /usr/include/g++/sstream \ /usr/include/g++/istream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/limits \ /usr/include/g++/bits/istream.tcc /usr/include/g++/locale \ /usr/include/g++/bits/locale_facets.tcc /usr/include/g++/cerrno \ /usr/include/errno.h /usr/include/sys/errno.h /usr/include/g++/cmath \ /usr/include/math.h /usr/include/machine/math.h /usr/include/x86/math.h \ /usr/include/g++/bits/cmath.tcc /usr/include/g++/typeinfo \ /usr/include/g++/ostream /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/bits/sstream.tcc /usr/include/g++/stdexcept \ ../include/provider/sqlite3.h /usr/pkg/include/sqlite3.h \ /usr/include/stdarg.h /usr/include/g++/cassert /usr/include/assert.h \ ../include/dbstream.enum.h ../include/provider/data.h \ /usr/include/g++/iostream ../include/dbstatus.h /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc ../include/query.h ../include/cell.h \ ../include/login.h ../include/provider/absvirt.h query.o: query.C /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/null.h \ /usr/include/string.h /usr/include/sys/featuretest.h \ /usr/include/strings.h /usr/include/g++/climits /usr/include/limits.h \ /usr/include/machine/limits.h /usr/include/sys/syslimits.h \ /usr/include/g++/cstdlib /usr/include/stdlib.h /usr/include/sys/types.h \ /usr/include/machine/types.h /usr/include/sys/ansi.h \ /usr/include/machine/endian.h /usr/include/sys/endian.h \ /usr/include/machine/endian_machdep.h /usr/include/machine/byte_swap.h \ /usr/include/machine/bswap.h /usr/include/sys/bswap.h \ /usr/include/pthread_types.h /usr/include/g++/new \ /usr/include/g++/exception /usr/include/g++/iosfwd \ /usr/include/g++/bits/c++locale.h /usr/include/g++/clocale \ /usr/include/locale.h /usr/include/g++/cctype /usr/include/ctype.h \ /usr/include/g++/bits/stringfwd.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/unistd.h \ /usr/include/sys/unistd.h /usr/include/g++/cwchar \ /usr/include/g++/ctime /usr/include/wchar.h \ /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h /usr/include/g++/stdexcept \ /usr/include/g++/string /usr/include/g++/bits/char_traits.h \ /usr/include/g++/memory /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h \ /usr/include/g++/bits/basic_string.tcc ../include/query.h \ /usr/include/g++/limits /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ /usr/include/g++/sstream /usr/include/g++/istream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/bits/istream.tcc \ /usr/include/g++/locale /usr/include/g++/bits/locale_facets.tcc \ /usr/include/g++/cerrno /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/g++/cmath /usr/include/math.h /usr/include/machine/math.h \ /usr/include/x86/math.h /usr/include/g++/bits/cmath.tcc \ /usr/include/g++/typeinfo /usr/include/g++/ostream \ /usr/include/g++/bits/ostream.tcc /usr/include/g++/bits/sstream.tcc \ ../include/cell.h dbstreams/src/provider.C010066400017500000000000000030571077620526000153320ustar00jklowdenwheel/* $Id: provider.C,v 1.3 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ /* * Define all providers. * * January 2008 jkl * $Id: provider.C,v 1.3 2008/04/06 16:23:41 jklowden Exp $ */ #include namespace dbstreams { namespace providers { int native_type( metadata& meta, int type ) { return meta.native_type(type); } int native_type( const metadata& meta ) { return meta.native_type(); } urhandle& urhandle:: handle( DBPROCESS* dbproc ) { _type = DBLIB; _handle.dbproc = dbproc; return *this; } urhandle& urhandle:: handle( ::sqlite3* sqlite_handle ) { _type = SQLITE; _handle.sqlite_handle = sqlite_handle; return *this; } ::sqlite3* urhandle:: sqlite3() const { if( _type != SQLITE ) throw *this; return _handle.sqlite_handle; } DBPROCESS* urhandle:: dbproc() const { if( _type != DBLIB ) throw *this; return _handle.dbproc; } }} // end namespaces dbstreams/src/provider.odbc.C010066400017500000000000000072771077620526000162500ustar00jklowdenwheel/* $Id: provider.odbc.C,v 1.3 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include "provider/odbc.h" using dbstreams::drivers::odbc; namespace dbstreams{ namespace providers { namespace odbc_impl { metadata::datatype datatype( int type ) { switch(type) { case SQL_TYPE_DATE: case SQL_TYPE_TIME: case SQL_TYPE_TIMESTAMP: #if 0 case SQL_TYPE_UTCDATETIME: case SQL_TYPE_UTCTIME: #endif return metadata::DATETIME; case SQL_DECIMAL: case SQL_NUMERIC: return metadata::NUMERIC; case SQL_FLOAT: case SQL_DOUBLE: return metadata::FLOAT; case SQL_REAL: return metadata::REAL; case SQL_BIT: case SQL_INTEGER: case SQL_SMALLINT: case SQL_TINYINT: return metadata::INT; case SQL_BIGINT: case SQL_GUID: case SQL_BINARY: case SQL_LONGVARBINARY: case SQL_LONGVARCHAR: case SQL_VARBINARY: case SQL_WCHAR: case SQL_WLONGVARCHAR: case SQL_WVARCHAR: return metadata::BINARY; case SQL_CHAR: case SQL_VARCHAR: return metadata::CHAR; #if 1 case SQL_INTERVAL_DAY: case SQL_INTERVAL_DAY_TO_HOUR: case SQL_INTERVAL_DAY_TO_MINUTE: case SQL_INTERVAL_DAY_TO_SECOND: case SQL_INTERVAL_HOUR: case SQL_INTERVAL_HOUR_TO_MINUTE: case SQL_INTERVAL_HOUR_TO_SECOND: case SQL_INTERVAL_MINUTE: case SQL_INTERVAL_MINUTE_TO_SECOND: case SQL_INTERVAL_MONTH: case SQL_INTERVAL_SECOND: case SQL_INTERVAL_YEAR: case SQL_INTERVAL_YEAR_TO_MONTH: #endif default: break; } std::stringstream oops; oops << __func__ << ":\n\tunknown native type: " << type; throw std::domain_error( oops.str() ); } int sql_data_type( metadata::datatype datatype ) { switch(datatype) { case metadata::BINARY: return SQL_BINARY; case metadata::CHAR: return SQL_CHAR; case metadata::FLOAT: return SQL_DOUBLE; case metadata::INT: return SQL_INTEGER; case metadata::REAL: return SQL_FLOAT; case metadata::DATETIME: case metadata::NUMERIC: default: break; } throw std::domain_error(__func__); } int sql_c_type( metadata::datatype datatype ) { return desttype(datatype); } int desttype( metadata::datatype datatype ) { switch(datatype) { case metadata::BINARY: return SQL_C_BINARY; case metadata::CHAR: return SQL_C_CHAR; case metadata::FLOAT: return SQL_C_DOUBLE; case metadata::INT: return SQL_C_SLONG; case metadata::REAL: return SQL_C_FLOAT; case metadata::DATETIME: case metadata::NUMERIC: default: break; } throw std::domain_error(__func__); } int desttype( int i ) { return SQL_C_SLONG; } int desttype( float f ) { return SQL_C_FLOAT; } int desttype( double d ) { return SQL_C_DOUBLE; } int desttype( const char* s ) { return SQL_C_CHAR; } int desttype( const void* pv ) { return SQL_C_BINARY; } const char * prret(DBS_ODBC::SQLRETURN erc) { switch(erc) { case SQL_SUCCESS: return "SQL_SUCCESS"; case SQL_SUCCESS_WITH_INFO: return "SQL_SUCCESS_WITH_INFO"; case SQL_ERROR: return "SQL_ERROR"; case SQL_STILL_EXECUTING: return "SQL_STILL_EXECUTING"; case SQL_INVALID_HANDLE: return "SQL_INVALID_HANDLE"; case SQL_NO_DATA: return "SQL_NO_DATA"; } return "unknown"; } }}} // end namespaces dbstreams/unittest004077500017500000000000000000001077620526000144035ustar00jklowdenwheeldbstreams/unittest/CVS004077500017500000000000000000001077620526000150365ustar00jklowdenwheeldbstreams/unittest/CVS/Repository010066400017500000000000000000451073552746400172230ustar00jklowdenwheelprojects/database/dbstreams/unittest dbstreams/unittest/CVS/Root010066400017500000000000000000321073552746400157630ustar00jklowdenwheel/usr/local/cvs.repository dbstreams/unittest/CVS/Entries010066400017500000000000000004631077620526000164510ustar00jklowdenwheel/.cvsignore/1.4/Wed Feb 6 05:29:18 2008// /Makefile/1.5/Wed Apr 2 03:57:29 2008// /astream.C/1.10/Sun Apr 6 17:38:56 2008// /openclose.C/1.8/Sun Apr 6 17:38:56 2008// /param.C/1.6/Sun Apr 6 17:38:56 2008// /read_options.C/1.2/Sun Apr 6 17:38:56 2008// /read_options.h/1.2/Sun Apr 6 17:38:56 2008// D dbstreams/unittest/Makefile010066400017500000000000000017511077460205100161200ustar00jklowdenwheelHEADERS != ls ../include/*.h ../include/provider/*.h SOURCES != ls *.C BIN = astream openclose param DBSTREAMS_PROVIDER ?= DBLIB_PROVIDER CFLAGS += -O0 -ggdb3 \ -I../include \ -I/usr/local/include \ -I/usr/pkg/include \ -fmessage-length=230 LIBS = sqlite3 sybdb tdsodbc LOCLIB=/usr/local/lib PKGLIB=/usr/pkg/lib DBSLIB=$(PWD:H)/lib OBJ = $(DBSLIB)/libdbstreams.* LDFLAGS = -Wl,--rpath -Wl,$(LOCLIB) -L$(LOCLIB) \ -Wl,--rpath -Wl,$(PKGLIB) -L$(PKGLIB) $(LIBS:C/^/-l/g) \ -Wl,--rpath -Wl,$(DBSLIB) -L$(DBSLIB) -ldbstreams all: .depend $(BIN) check: $(BIN) .for F in $(BIN) ./$F -T ODBC -f PWD .endfor openclose: openclose.C $(OBJ) .depend $(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $@.C read_options.C astream: astream.C $(OBJ) .depend $(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $@.C read_options.C param: param.C $(OBJ) .depend $(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $@.C read_options.C .depend: $(SOURCES) $(HEADERS) mkdep ${CFLAGS} $(SOURCES) clean: rm -f $(BIN) *.core *.bck dbstreams/unittest/.cvsignore010066400017500000000000000001061075224265600164600ustar00jklowdenwheel*.bck *.db astream openclose .depend .gdbinit *.dat PWD* dump nohup* dbstreams/unittest/astream.C010066400017500000000000000135311077620526000162220ustar00jklowdenwheel/* $Id: astream.C,v 1.10 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include "read_options.h" #include #include #include #include #include #include options opt; extern char * malloc_options; using namespace std; using namespace dbstreams; class example_row { int i; double d; std::string s; public: template OS& read( OS& os ) { os >> c("t") >> i >> c("r") >> d >> c("s") >> s; return os; } template OS& write( OS& os ) const { os << i << d << s << endl; return os; } }; #include int main( int argc, char *argv[] ) { malloc_options = "X"; read_options( argc, argv, opt ); assert( ! opt.provider.empty() ); provider_type provider = parse_provider_name( opt.provider ); assert( provider != NONE ); try { dbstream db(provider, opt.username, opt.password); unlink( "test.db" ); clog << "opening... "; db.ignore(5701); db.open( opt.servername, opt.database ); #define LOG 1 #if LOG db.log(&clog); #endif if( !db ) { throw db.status(); } clog << "ok" << endl; clog << "creating T... "; query q( query::add_separator, db.query_separator() ); if( provider != SQLITE ) { q = "if exists (select 1 from sysobjects " "where type = 'U' and name = 'T') " "drop table T"; db << q; if( !db ) { clog << argv[0] << ":" << __LINE__ << ":\n\t" << "SQL was [" << q.str() << "]\n"; throw db.status(); } } q = "create table T ( t int NULL" " , r real NULL, s varchar(30) NULL)"; db << q; if( !db ) { clog << argv[0] << ":" << __LINE__ << ":\n\t" << "SQL was [" << q.str() << "]\n"; throw db.status(); } assert(db); clog << "ok" << endl; clog << "inserting into T... "; q = "insert into T values (1, 1.1, 'one')"; q << endl << "insert into T values (2, 2.2, 'two')" << endl; db << q; assert(db); clog << "ok" << endl; clog << "inserting into T again... "; q = "insert into T values (NULL, 3.3, 'three')"; db << q; assert(db); clog << "ok" << endl; clog << "opening T... "; db.table( "T", bcpmode ); clog << " streaming in four rows (with NULLs) ... "; db << 4 << 4.4 << "four" << endl << null << 5.5 << "five" << endl << 6 << null << "six" << endl << 7 << 7.7 << null << endl << 8 << 8.8 << "eight" << endl; assert(db); clog << "ok" << endl; clog << "extracting with operator[]\n"; q = "select * from T"; clog << q.str() << endl; db << q; if( !db ) { throw db.status(); } clog << "row \tt \tr \ts\n"; for( int r=0; db && r < 16; r++, db++ ) { clog << r << "\t" << db["t"] << "\t" << db["r"] << "\t" << db["s"] << '\n'; } clog << "ok" << endl; clog << "extracting with c() manipulator\n"; clog << q.str() << endl; db << q; if( !db ) { throw db.status(); } for( int r=0; db && r < 16; r++, db++ ) { clog << "row \tt \tr \ts\n"; for( int R=0; db && !db.eof() && R < 6; R++, db++ ) { int i; double r; std::string s; const c C("t"); db >> C >> i; db >> c("r") >> r >> c("s") >> s; clog << R << "\t" << i << "\t" << r << "\t" << s << '\n'; } } clog << "ok" << endl; q = "select * from T where t = 2 "; q << endl << "select * from T where t = 0 " << endl; q << "select 1 as 'last result' " << endl; clog << q.str() << endl; db << q; if( !db ) { throw db.status(); } //// << "state is " << db.status().rdstate() << endl; for( int r=0; db && r < 6; r++, db++ ) { clog << "row \tt \tr \ts\n"; for( int r=0; db && !db.eof() && r < 6; r++, db++ ) { if( db.columns() == 3 ) { clog << r << "\t" << db["t"] << "\t" << db["r"] << "\t" << db["s"] << '\n'; } else { clog << r << "\t" << db[0] << endl; } } //// << "state is " << db.status() << "\n"; } clog << "ok" << endl; q = "select * from T where t < 4 "; clog << q.str() << endl; db << q; if( !db ) { throw db.status(); } for( int r=0; db && r < 6; r++, db++ ) { clog << "row \tt \tr \ts\n"; for( int R=0; db && !db.eof() && R < 6; R++, db++ ) { int i; double r; std::string s; const c C("t"); db >> C >> i; db >> c("r") >> r >> c("s") >> s; clog << R << "\t" << i << "\t" << r << "\t" << s << '\n'; } //// << "state is " << db.status() << "\n"; } clog << "ok" << endl; clog << "filling a container ..." << endl; std::deque rowset; q = "select * from T "; clog << q.str() << endl; db << q; if( !db ) { throw db.status(); } db.read( rowset ); clog << "ok" << endl; db.write( clog, rowset ); clog << "writing container\n"; db.table("T"); db.write( rowset ); if( !db ) { throw db.status(); } clog << "ok" << endl; clog << "closing... "; db.close(); clog << "ok" << endl; } catch( const dbstatus& oops ) { cerr << basename(argv[0]) << ": " << oops << endl; return 1; } catch( const std::exception& oops ) { cerr << "exception: " << basename(argv[0]) << ": " << oops.what() << endl; return 2; } return 0; } dbstreams/unittest/openclose.C010066400017500000000000000100621077620526000165510ustar00jklowdenwheel/* $Id: openclose.C,v 1.8 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include #include #include #include #include #include #include #include extern char *malloc_options; using namespace std; using namespace dbstreams; #include "read_options.h" options opt; /* * Test any provider. * This program exercises the features of the provider, * without the dbstreams layer. If a provider passes this * grueling test, it's expected to work with dbstreams. */ int main( int argc, char *argv[] ) { malloc_options = "X"; read_options( argc, argv, opt ); assert( ! opt.provider.empty() ); provider_type provider = parse_provider_name( opt.provider ); assert( provider != NONE ); providers::SQLite sqlite_p; providers::dblib dblib_p( opt.username, opt.password ); providers::odbc odbc_p( opt.username, opt.password ); providers::provider *pprovider; switch( provider ) { case SQLITE: pprovider = &sqlite_p; break; case DBLIB: pprovider = &dblib_p; break; case ODBC: pprovider = &odbc_p; break; default: assert(0); break; } providers::provider& db(*pprovider); try { int erc, icol; unlink( "test.db" ); clog << "opening... "; db.ignore(5701); clog << "ignoring " << db.status().ignore().size() << " messages\n"; db.open( opt.servername, opt.database ); clog << "ok" << endl; clog << "creating T... "; dbstreams::query q; if( provider != SQLITE ) { q.mode( query::eat_separator, ";" ); q = "if exists (select 1 from sysobjects " "where type = 'U' " "and name = 'T') drop table T"; db.execute(q); } q = "create table T( t int NULL, r real NULL, s varchar(30) )"; db.execute(q); clog << "ok" << endl; clog << "inserting into T... "; q = "insert into T values (1, 1.1, 'one')"; q << "insert into T values (2, 2.2, 'two')"; db.execute(q); clog << "ok" << endl; clog << "inserting into T again... "; q = "insert into T values (NULL, 3.3, 'three')"; db.execute(q); clog << "ok" << endl; #if 1 clog << "opening T... "; db.open( "T", dbstreams::sqlmode ); clog << " streaming 3 in a row ... "; icol = 0; db.insert(icol++, 4); db.insert(icol++, 4.4); db.insert(icol++, "four"); //// << "icol is " << db.icol << " sending ... "; db.send(); icol = 0; clog << "ok" << endl; #endif string sql = "select * from T"; clog << sql << endl; q = sql; db.log(&clog); db.execute(q); clog << "[1,1]: " << db.extract("t") << endl; clog << "row \tcol \tvalue\ttype\tsize\tisnull\n"; for( int r=0; db.status() && r < 6; r++ ) { /// << db.status() << endl; clog << db.ncolumns() << " columns\n"; for( int c=0; c < db.ncolumns(); c++ ) { clog << r << "\t" << c << "\t" << db.extract(c) << "\t" << db.extract(c).type << "\t" << db.extract(c).size << "\t" << db.extract(c).is_null << '\n'; } db.next_row(); } clog << "ok" << endl; clog << "closing... "; db.close(); clog << "ok" << endl; #if 0 if( (erc = unlink( "test.db" )) != 0) { perror(NULL); } #endif } catch( const dbstreams::dbstatus& oops ) { cerr << argv[0] << ": " << oops.what() << endl; return 1; } catch( const std::exception& oops ) { cerr << "exception: " << argv[0] << ": " << oops.what() << endl; return 2; } return 0; } dbstreams/unittest/read_options.C010066400017500000000000000052361077620526000172570ustar00jklowdenwheel/* $Id: read_options.C,v 1.2 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include #include #include #include "read_options.h" extern char *optarg; extern int optind; using namespace std; const options& read_options( int& argc, char **& argv, options& opt ) { options overrides( opt.input ); int ch; while( (ch = getopt(argc, argv, "T:U:P:S:D:f:v")) != -1 ) { /// warnx("found option %c", ch); switch (ch) { case 'T': overrides.provider = optarg; break; case 'U': overrides.username = optarg; break; case 'P': overrides.password = optarg; break; case 'S': overrides.servername = optarg; break; case 'D': overrides.database = optarg; break; case 'f': /* override default PWD file */ overrides.input = optarg; break; case 'v': overrides.fverbose = 1; break; case '?': default: errx( 1, "unknown option -%c", ch); } } argc -= optind; argv += optind; if( !overrides.input.empty() ) { ifstream input(overrides.input.c_str()); if( !input ) warnx( "unable to open %s", overrides.input.c_str()); char line[512]; while( input.getline( line, sizeof(line) ) ) { char *s1 = strtok(line, "="); char *s2 = strtok(NULL, "\n"); if (!s1 || !s2) continue; if (!strcmp(s1, "UID")) { opt.username = s2; } else if (!strcmp(s1, "SRV")) { opt.servername = s2; } else if (!strcmp(s1, "PWD")) { opt.password = s2; } else if (!strcmp(s1, "DB")) { opt.database = s2; } else if (!strcmp(s1, "PROVIDER")) { opt.database = s2; } } } /* apply command-line overrides */ if( !overrides.provider.empty() ) { opt.provider = overrides.provider; } if( !overrides.username.empty() ) { opt.username = overrides.username; } if( !overrides.password.empty() ) { opt.password = overrides.password; } if( !overrides.servername.empty() ) { opt.servername = overrides.servername; } if( !overrides.database.empty() ) { opt.database = overrides.database; } return opt; } dbstreams/unittest/read_options.h010066400017500000000000000021331077620526000173150ustar00jklowdenwheel/* $Id: read_options.h,v 1.2 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include #include struct options { std::string provider; std::string username, password; std::string servername, database; std::string input; bool fverbose; options( const std::string& input = "PWD" ) : input(input) , fverbose(false) {} }; const options& read_options( int& argc, char **& argv, options& opt ); dbstreams/unittest/param.C010066400017500000000000000105401077620526000156630ustar00jklowdenwheel/* $Id: param.C,v 1.6 2008/04/06 17:48:30 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ /* * Test dbstreams parameter functionality * * jkl March 2008 */ #include "read_options.h" #include #include #include #include #include #include options opt; extern char * malloc_options; using namespace std; using namespace dbstreams; class parameter_writer { std::ostream& os; int i; public: parameter_writer( std::ostream& os ) : os(os), i(0) {} typedef dbstreams::parameter_type parameter; const parameter_writer& operator()( const parameter& param ) { if( i++ ) os << ", "; os << param; return *this; } }; int main( int argc, char *argv[] ) { malloc_options = "X"; read_options( argc, argv, opt ); assert( ! opt.provider.empty() ); provider_type provider = parse_provider_name( opt.provider ); assert( provider != NONE ); try { dbstream db(provider, opt.username, opt.password); unlink( "test.db" ); clog << "opening... "; db.ignore(5701); db.open( opt.servername, opt.database ); #define LOG 1 #if LOG db.log(&clog); #endif if( !db ) { throw db.status(); } clog << "ok" << endl; /* * create a table */ clog << "creating T... "; query q( query::pass_through, db.query_separator() ); if( provider != SQLITE ) { q = "if exists (select 1 from sysobjects " "where type = 'U' and name = 'T') " "drop table T"; db << q; if( !db ) { clog << argv[0] << ":" << __LINE__ << ":\n\t" << "SQL was [" << q.str() << "]\n"; throw db.status(); } } q = "create table T ( t int NULL" " , r real NULL, s varchar(30) NULL)"; db << q; if( !db ) { clog << argv[0] << ":" << __LINE__ << ":\n\t" << "SQL was [" << q.str() << "]\n"; throw db.status(); } assert(db); clog << "ok" << endl; /* * Insert a few rows */ db.table( "T", bcpmode ); clog << " streaming in data (with NULLs) ... "; db << 4 << 4.4 << "four" << endl << 4 << 4.4 << "four" << endl << null << 5.5 << "five" << endl << 6 << null << "six" << endl << 7 << 7.7 << null << endl << 8 << 8.8 << "eight" << endl; assert(db); clog << "ok" << endl; /* * Select a few rows */ typedef struct { char *name; int value; } nvp; static const nvp values[] = { { "four", 4 } , { "six", 6 } }; q = "select * from T where s = ? and t = ?"; for( int i=0; i < sizeof(values)/sizeof(values[0]); i++ ){ db << q; // ... prepare ... if( i == 0 ) { parameter_type p0(values[i].name, -1, 0); parameter_type p1(values[i].value, 1); // describe the parameters and their values db << p0 << p1 << endl; // (make sure the list is right) cout << "parameter list: "; std::for_each( db.parameter_list().begin(), db.parameter_list().end(), parameter_writer(cout) ); cout << '\n'; } else { // reuse the parameters db << p(0) << values[i].name << p(1) << values[i].value << endl; } // read the last parameter, just for fun parameter_value param(1); db >> param; cout << "last parameter value: " << param.data << "\n"; if( !db ) { cout << "no rows\n"; } else { cout << "t\tr\ts\n------\t------\t------\n"; while( db ) { cout << db["t"] << '\t' << db["r"] << '\t' << db["s"] << '\n'; db++; } } } } catch( const dbstatus& oops ) { cerr << basename(argv[0]) << ": " << oops << endl; return 1; } catch( const std::exception& oops ) { cerr << "exception: " << basename(argv[0]) << ": " << oops.what() << endl; return 2; } return 0; } dbstreams/unittest/.depend010066400017500000000000000436101077553430700157310ustar00jklowdenwheelastream.o: astream.C read_options.h /usr/include/unistd.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/featuretest.h \ /usr/include/sys/types.h /usr/include/machine/types.h \ /usr/include/sys/ansi.h /usr/include/machine/endian.h \ /usr/include/sys/endian.h /usr/include/machine/endian_machdep.h \ /usr/include/machine/byte_swap.h /usr/include/machine/bswap.h \ /usr/include/sys/bswap.h /usr/include/pthread_types.h \ /usr/include/sys/unistd.h /usr/include/sys/null.h \ /usr/include/g++/string /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/bits/stringfwd.h \ /usr/include/g++/bits/char_traits.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h /usr/include/string.h \ /usr/include/strings.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/g++/cwchar /usr/include/g++/ctime \ /usr/include/wchar.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/climits \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/sys/syslimits.h /usr/include/g++/cstdlib \ /usr/include/stdlib.h /usr/include/g++/new /usr/include/g++/exception \ /usr/include/g++/iosfwd /usr/include/g++/bits/c++locale.h \ /usr/include/g++/clocale /usr/include/locale.h /usr/include/g++/cctype \ /usr/include/ctype.h /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/iostream \ /usr/include/g++/ostream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/locale /usr/include/g++/bits/locale_facets.tcc \ /usr/include/g++/cerrno /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/g++/cmath /usr/include/math.h /usr/include/machine/math.h \ /usr/include/x86/math.h /usr/include/g++/bits/cmath.tcc \ /usr/include/g++/limits /usr/include/g++/typeinfo \ /usr/include/g++/istream /usr/include/g++/bits/istream.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ /usr/include/g++/cassert /usr/include/assert.h ../include/dbstream.h \ ../include/dbstatus.h /usr/include/g++/stdexcept \ ../include/dbstream.enum.h ../include/provider.h \ ../include/provider/absvirt.h ../include/provider/data.h \ /usr/include/g++/vector /usr/include/g++/bits/stl_vector.h \ /usr/include/g++/bits/stl_bvector.h /usr/include/g++/bits/vector.tcc \ ../include/query.h /usr/include/g++/sstream \ /usr/include/g++/bits/sstream.tcc ../include/cell.h ../include/login.h \ ../include/provider/sqlite3.h /usr/pkg/include/sqlite3.h \ /usr/include/stdarg.h ../include/provider/dblib.h /usr/include/libgen.h \ /usr/local/include/sybdb.h /usr/local/include/tds_sysdep_public.h \ /usr/include/g++/map /usr/include/g++/bits/stl_tree.h \ /usr/include/g++/bits/stl_map.h /usr/include/g++/bits/stl_multimap.h \ ../include/provider/odbc.h /usr/local/include/sql.h \ /usr/local/include/sqltypes.h /usr/local/include/sqlext.h \ /usr/local/include/sqlucode.h openclose.o: openclose.C /usr/include/unistd.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/featuretest.h \ /usr/include/sys/types.h /usr/include/machine/types.h \ /usr/include/sys/ansi.h /usr/include/machine/endian.h \ /usr/include/sys/endian.h /usr/include/machine/endian_machdep.h \ /usr/include/machine/byte_swap.h /usr/include/machine/bswap.h \ /usr/include/sys/bswap.h /usr/include/pthread_types.h \ /usr/include/sys/unistd.h /usr/include/sys/null.h /usr/include/err.h \ /usr/include/g++/string /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/bits/stringfwd.h \ /usr/include/g++/bits/char_traits.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h /usr/include/string.h \ /usr/include/strings.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/g++/cwchar /usr/include/g++/ctime \ /usr/include/wchar.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/climits \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/sys/syslimits.h /usr/include/g++/cstdlib \ /usr/include/stdlib.h /usr/include/g++/new /usr/include/g++/exception \ /usr/include/g++/iosfwd /usr/include/g++/bits/c++locale.h \ /usr/include/g++/clocale /usr/include/locale.h /usr/include/g++/cctype \ /usr/include/ctype.h /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/iostream \ /usr/include/g++/ostream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/locale /usr/include/g++/bits/locale_facets.tcc \ /usr/include/g++/cerrno /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/g++/cmath /usr/include/math.h /usr/include/machine/math.h \ /usr/include/x86/math.h /usr/include/g++/bits/cmath.tcc \ /usr/include/g++/limits /usr/include/g++/typeinfo \ /usr/include/g++/istream /usr/include/g++/bits/istream.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc ../include/provider.h \ ../include/provider/absvirt.h ../include/provider/data.h \ /usr/include/g++/vector /usr/include/g++/bits/stl_vector.h \ /usr/include/g++/bits/stl_bvector.h /usr/include/g++/bits/vector.tcc \ /usr/include/g++/stdexcept ../include/dbstatus.h /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ ../include/query.h /usr/include/g++/sstream \ /usr/include/g++/bits/sstream.tcc ../include/cell.h ../include/login.h \ ../include/dbstream.enum.h ../include/provider/sqlite3.h \ /usr/pkg/include/sqlite3.h /usr/include/stdarg.h \ /usr/include/g++/cassert /usr/include/assert.h \ ../include/provider/dblib.h /usr/include/libgen.h \ /usr/local/include/sybdb.h /usr/local/include/tds_sysdep_public.h \ /usr/include/g++/map /usr/include/g++/bits/stl_tree.h \ /usr/include/g++/bits/stl_map.h /usr/include/g++/bits/stl_multimap.h \ ../include/provider/odbc.h /usr/local/include/sql.h \ /usr/local/include/sqltypes.h /usr/local/include/sqlext.h \ /usr/local/include/sqlucode.h ../include/dbstream.h read_options.h param.o: param.C read_options.h /usr/include/unistd.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/featuretest.h \ /usr/include/sys/types.h /usr/include/machine/types.h \ /usr/include/sys/ansi.h /usr/include/machine/endian.h \ /usr/include/sys/endian.h /usr/include/machine/endian_machdep.h \ /usr/include/machine/byte_swap.h /usr/include/machine/bswap.h \ /usr/include/sys/bswap.h /usr/include/pthread_types.h \ /usr/include/sys/unistd.h /usr/include/sys/null.h \ /usr/include/g++/string /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/bits/stringfwd.h \ /usr/include/g++/bits/char_traits.h /usr/include/g++/cstring \ /usr/include/g++/cstddef /usr/include/stddef.h /usr/include/string.h \ /usr/include/strings.h /usr/include/g++/bits/fpos.h \ /usr/include/g++/bits/c++io.h /usr/include/g++/cstdio \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/g++/cwchar /usr/include/g++/ctime \ /usr/include/wchar.h /usr/include/g++/memory \ /usr/include/g++/bits/stl_algobase.h /usr/include/g++/climits \ /usr/include/limits.h /usr/include/machine/limits.h \ /usr/include/sys/syslimits.h /usr/include/g++/cstdlib \ /usr/include/stdlib.h /usr/include/g++/new /usr/include/g++/exception \ /usr/include/g++/iosfwd /usr/include/g++/bits/c++locale.h \ /usr/include/g++/clocale /usr/include/locale.h /usr/include/g++/cctype \ /usr/include/ctype.h /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/bits/stl_pair.h \ /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/iostream \ /usr/include/g++/ostream /usr/include/g++/ios \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/locale /usr/include/g++/bits/locale_facets.tcc \ /usr/include/g++/cerrno /usr/include/errno.h /usr/include/sys/errno.h \ /usr/include/g++/cmath /usr/include/math.h /usr/include/machine/math.h \ /usr/include/x86/math.h /usr/include/g++/bits/cmath.tcc \ /usr/include/g++/limits /usr/include/g++/typeinfo \ /usr/include/g++/istream /usr/include/g++/bits/istream.tcc \ /usr/include/g++/fstream /usr/include/g++/bits/basic_file.h \ /usr/include/g++/bits/fstream.tcc /usr/include/g++/deque \ /usr/include/g++/bits/stl_deque.h /usr/include/g++/bits/deque.tcc \ /usr/include/g++/cassert /usr/include/assert.h ../include/dbstream.h \ ../include/dbstatus.h /usr/include/g++/stdexcept \ ../include/dbstream.enum.h ../include/provider.h \ ../include/provider/absvirt.h ../include/provider/data.h \ /usr/include/g++/vector /usr/include/g++/bits/stl_vector.h \ /usr/include/g++/bits/stl_bvector.h /usr/include/g++/bits/vector.tcc \ ../include/query.h /usr/include/g++/sstream \ /usr/include/g++/bits/sstream.tcc ../include/cell.h ../include/login.h \ ../include/provider/sqlite3.h /usr/pkg/include/sqlite3.h \ /usr/include/stdarg.h ../include/provider/dblib.h /usr/include/libgen.h \ /usr/local/include/sybdb.h /usr/local/include/tds_sysdep_public.h \ /usr/include/g++/map /usr/include/g++/bits/stl_tree.h \ /usr/include/g++/bits/stl_map.h /usr/include/g++/bits/stl_multimap.h \ ../include/provider/odbc.h /usr/local/include/sql.h \ /usr/local/include/sqltypes.h /usr/local/include/sqlext.h \ /usr/local/include/sqlucode.h read_options.o: read_options.C /usr/include/unistd.h \ /usr/include/machine/ansi.h /usr/include/sys/cdefs.h \ /usr/include/machine/cdefs.h /usr/include/sys/cdefs_elf.h \ /usr/include/machine/int_types.h /usr/include/sys/featuretest.h \ /usr/include/sys/types.h /usr/include/machine/types.h \ /usr/include/sys/ansi.h /usr/include/machine/endian.h \ /usr/include/sys/endian.h /usr/include/machine/endian_machdep.h \ /usr/include/machine/byte_swap.h /usr/include/machine/bswap.h \ /usr/include/sys/bswap.h /usr/include/pthread_types.h \ /usr/include/sys/unistd.h /usr/include/sys/null.h /usr/include/err.h \ /usr/include/g++/fstream /usr/include/g++/istream /usr/include/g++/ios \ /usr/include/g++/iosfwd /usr/include/g++/bits/c++config.h \ /usr/include/g++/bits/os_defines.h /usr/include/g++/bits/c++locale.h \ /usr/include/g++/clocale /usr/include/locale.h /usr/include/g++/cctype \ /usr/include/ctype.h /usr/include/g++/bits/stringfwd.h \ /usr/include/g++/bits/fpos.h /usr/include/g++/bits/c++io.h \ /usr/include/g++/cstdio /usr/include/g++/cstddef /usr/include/stddef.h \ /usr/include/stdio.h /usr/include/g++/bits/gthr.h \ /usr/include/g++/bits/gthr-default.h /usr/include/pthread.h \ /usr/include/time.h /usr/include/sys/time.h /usr/include/sched.h \ /usr/include/sys/sched.h /usr/include/g++/cwchar /usr/include/g++/ctime \ /usr/include/wchar.h /usr/include/g++/bits/functexcept.h \ /usr/include/g++/exception_defines.h /usr/include/g++/exception \ /usr/include/g++/bits/char_traits.h /usr/include/g++/cstring \ /usr/include/string.h /usr/include/strings.h \ /usr/include/g++/bits/localefwd.h /usr/include/g++/bits/ios_base.h \ /usr/include/g++/bits/atomicity.h \ /usr/include/g++/bits/locale_classes.h /usr/include/g++/string \ /usr/include/g++/memory /usr/include/g++/bits/stl_algobase.h \ /usr/include/g++/climits /usr/include/limits.h \ /usr/include/machine/limits.h /usr/include/sys/syslimits.h \ /usr/include/g++/cstdlib /usr/include/stdlib.h /usr/include/g++/new \ /usr/include/g++/bits/stl_pair.h /usr/include/g++/bits/type_traits.h \ /usr/include/g++/bits/stl_iterator_base_types.h \ /usr/include/g++/bits/stl_iterator_base_funcs.h \ /usr/include/g++/bits/concept_check.h \ /usr/include/g++/bits/stl_iterator.h /usr/include/g++/bits/stl_alloc.h \ /usr/include/g++/bits/stl_threads.h \ /usr/include/g++/bits/stl_construct.h \ /usr/include/g++/bits/stl_uninitialized.h \ /usr/include/g++/bits/stl_raw_storage_iter.h \ /usr/include/g++/bits/stl_function.h \ /usr/include/g++/bits/basic_string.h /usr/include/g++/algorithm \ /usr/include/g++/bits/stl_algo.h /usr/include/g++/bits/stl_heap.h \ /usr/include/g++/bits/stl_tempbuf.h \ /usr/include/g++/bits/basic_string.tcc /usr/include/g++/streambuf \ /usr/include/g++/bits/streambuf.tcc /usr/include/g++/bits/basic_ios.h \ /usr/include/g++/bits/streambuf_iterator.h \ /usr/include/g++/bits/locale_facets.h /usr/include/g++/cwctype \ /usr/include/wctype.h /usr/include/g++/bits/ctype_base.h \ /usr/include/g++/bits/ctype_inline.h /usr/include/g++/bits/codecvt.h \ /usr/include/g++/bits/time_members.h \ /usr/include/g++/bits/messages_members.h \ /usr/include/g++/bits/basic_ios.tcc /usr/include/g++/limits \ /usr/include/g++/bits/istream.tcc /usr/include/g++/locale \ /usr/include/g++/bits/locale_facets.tcc /usr/include/g++/cerrno \ /usr/include/errno.h /usr/include/sys/errno.h /usr/include/g++/cmath \ /usr/include/math.h /usr/include/machine/math.h /usr/include/x86/math.h \ /usr/include/g++/bits/cmath.tcc /usr/include/g++/typeinfo \ /usr/include/g++/ostream /usr/include/g++/bits/ostream.tcc \ /usr/include/g++/bits/basic_file.h /usr/include/g++/bits/fstream.tcc \ read_options.h dbstreams/app004077500017500000000000000000001077620525600133115ustar00jklowdenwheeldbstreams/app/CVS004077500017500000000000000000001077620525600137445ustar00jklowdenwheeldbstreams/app/CVS/Root010066400017500000000000000000321074224014000146410ustar00jklowdenwheel/usr/local/cvs.repository dbstreams/app/CVS/Repository010066400017500000000000000000401074224014000160740ustar00jklowdenwheelprojects/database/dbstreams/app dbstreams/app/CVS/Entries010066400017500000000000000005561077620525600153620ustar00jklowdenwheel/dbcat.1/1.4/Thu Jan 24 03:18:48 2008// /parse_url.c/1.2/Thu Jan 24 03:18:48 2008// /Makefile/1.4/Tue Feb 12 03:34:48 2008// /.cvsignore/1.3/Wed Apr 2 03:57:27 2008// /copy.C/1.3/Sun Apr 6 17:38:53 2008// /copy.h/1.4/Sun Apr 6 17:38:53 2008// /dbcat.C/1.6/Sun Apr 6 17:38:54 2008// /url.h/1.4/Sun Apr 6 17:38:54 2008// /url_t.C/1.2/Sun Apr 6 17:38:54 2008// D dbstreams/app/dbcat.1010066400017500000000000000113711074600163000145120ustar00jklowdenwheel.\" $Id: dbcat.1,v 1.4 2008/01/24 03:14:46 jklowden Exp $ .Dd January 1, 2008 .Os DBSTREAMS 0.1 .Dt DBCAT 1 .Sh NAME .Nm dbcat .Nd load/unload database tables .Sh SYNOPSIS .Nm .Op Fl t Ar field_term .Op Fl r Ar row_term .Op Fl m Ar max_errors .Op Fl b Ar batch .Op Fl i Ar URI .Op Fl o Ar URI .Op Ar . .Sh DESCRIPTION .Nm copies data between a table and a file, or between two tables, or between two files. It can be used to load a table from a file, to write the contents of a table (or output of a query) to a file, or to reformat a file with different delimiters. The source of data is specified by the .Fl i Ar URI or .Ar or standard input. Data are written to the .Fl o Ar URI or, if not specified, to standard output. Errors are written to standard error. .Pp Multiple inputs may be provided, either as .Fl i options or as filenames. . .Ss Options .Bl -tag -width 12345678 .It Fl b Ar batch the number of rows to be committed at a time. If .Fl b is omitted, the entire file is sent as one transaction. .It Fl i Ar URI a source of data or a query for the server to execute. If it appears more than once, each is processed in left-to-right order. .It Fl m Ar max_errors the maximum number of errors .Nm will permit before terminating. Errors are written to standard error. .It Fl o Ar URI an output, a data sink. .It Fl r Ar row_term a record separator in .Ar file . It may be of any length. Some nonprinting characters are recognized, see .Sx Escapes below. .It Fl t Ar field_term a field separator in .Ar file . It may be of any length. Some nonprinting characters are recognized, see .Sx Escapes below. The field separator is .Em not looked for after the last field. .El . .Ss Escapes The .Fl t No and .Fl r No terminators may include the following sequences: .Pp .Bl -tag -width 1234 -offset indent -compact .It Em \e0 No indicates a NULL character (ASCII NUL, 0x00) .It Em \en No indicates a newline character (ASCII NL, 0x0a) .It Em \et No indicates a tab character (ASCII TAB, 0x09) .It Em \e\e No indicates a backslash character (0x5c) .El .Pp A backslash followed by any other character is taken literally. . .Sh URI FORMAT The URI specifiers adheres to RFC 2396 URI syntax plus a prefix, which might be stated briefly as: .Pp .Sm off .Oo .Oo Ar provider Li :: Oc .Ar scheme Li :// .Oo .Op Ar user Op Li : Op Ar password .Li \&@ Oc .Ar server Li \&/ .Oc .Pa name .Sm on .Pp where .Bl -tag -width "scheme " -compact .It Ar provider is the server type, one of .Dq SQLite or .Dq DBLIB . .Ar provider is required for the .Dq table and .Dq sql schemes . Otherwise it is ignored. .It Ar scheme is a literal, one of .Dq file , .Dq table , or .Dq sql . .Dq sql is valid only with .Fl i . .It Ar user Li and Ar password is a username+password pair, used for authenticaation with the database server .It Ar server is the name of the server .It Ar name is the name of a table or file, according to .Ar scheme . The table may be qualified with a catalog and/or schema name, according to the server's SQL implementation. When .Ar scheme is .Dq sql , .Ar name may be literal SQL or the name of a file containing SQL. .El .Pp .Ar provider and .Ar scheme are case insensitive. Case sensitivity in other parts of the URI is a function of the underlying database connection library and host operating system. . .Ss Shortcuts .Ar URI may be a simple filename without a .Ar file : qualifier. Also, .Ar name in .Ar URI can be abbreviated as .Sq % . The name in that case is derived from the name of the file or table in the .Qq other .Ar URI . . .Sh EXIT STATUS .Nm No returns the number of errors encountered, up to 255. .Sh EXAMPLES Load a table .Dq names from some files: .D1 Nm Li -o table://mary:contrary@server/names input1 input2 Load a table .Dq names from an inferred filename: .D1 Nm Li -o table://mary:contrary@server/names -i file:%.dat Load a table .Dq names whose name is inferred from the filename: .D1 Nm Li -o table://mary:contrary@server/% names.dat Extract a table .Dq names to a file .Pa output.dat : .D1 Nm Li -i table://mary:contrary@server/names -o output.dat Redirect the results of a query in .Pa query.sql to .Pa output.dat : .D1 Nm Li -i sql://mary:contrary@server/query.sql > output.dat Copy the .Dq animals table from one server to another, using the same tablename: .D1 Nm Li -i table://oldserver/animals -o table://newserver/% .Sh HISTORY .Nm first appeared in 2008 as a demonstration application for the .Sy dbstreams project. .Sh AUTHORS .Nm was written by James K. Lowden (jklowden@freetds.org) and is available under a BSD license. .Sh BUGS .Bl -enum -compact .It Clever .Sq % notation not yet supported. .It No mechanism is provided for reading a password from the terminal or .Pa .netrc file. .It CSV files are not supported. .It Data files are assumed to be encoded according to the locale. .El dbstreams/app/parse_url.c010066400017500000000000000233741074600163000155210ustar00jklowdenwheel/* * Copyright (c) 1997-2007 The NetBSD Foundation, Inc. * All rights reserved. * * Modified by James K. Lowden, found in tnftp distribution. * * This code is derived from software contributed to The NetBSD Foundation * by Luke Mewburn. * * This code is derived from software contributed to The NetBSD Foundation * by Scott Aaron Bamford. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the NetBSD * Foundation, Inc. and its contributors. * 4. Neither the name of The NetBSD Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "url.h" /* * Bogus declarations */ static int anonftp; static int ftp_debug; static FILE *ttyout = stderr; #define GLOBAL static GLOBAL char *ftpport; /* port number to use for FTP connections */ GLOBAL char *httpport; /* port number to use for HTTP connections */ /* end bogus */ /* * malloc() with inbuilt error checking */ void * ftp_malloc(size_t size) { void *p; p = malloc(size); if (p == NULL) err(1, "Unable to allocate %ld bytes of memory", (long)size); return (p); } #if 0 /* * sl_init() with inbuilt error checking */ StringList * ftp_sl_init(void) { StringList *p; p = sl_init(); if (p == NULL) err(1, "Unable to allocate memory for stringlist"); return (p); } /* * sl_add() with inbuilt error checking */ void ftp_sl_add(StringList *sl, char *i) { if (sl_add(sl, i) == -1) err(1, "Unable to add `%s' to stringlist", i); } #endif /* * strdup() with inbuilt error checking */ char * ftp_strdup(const char *str) { char *s; if (str == NULL) errx(1, "ftp_strdup: called with NULL argument"); s = strdup(str); if (s == NULL) err(1, "Unable to allocate memory for string copy"); return (s); } #define EMPTYSTRING(x) ((x) == NULL || (*(x) == '\0')) /* * Decode %xx escapes in given string, `in-place'. */ static void url_decode(char *url) { unsigned char *p, *q; if (EMPTYSTRING(url)) return; p = q = (unsigned char *)url; #define HEXTOINT(x) (x - (isdigit(x) ? '0' : (islower(x) ? 'a' : 'A') - 10)) while (*p) { if (p[0] == '%' && p[1] && isxdigit((unsigned char)p[1]) && p[2] && isxdigit((unsigned char)p[2])) { *q++ = HEXTOINT(p[1]) * 16 + HEXTOINT(p[2]); p+=3; } else *q++ = *p++; } *q = '\0'; } #define MAX_IN_PORT_T 0xffffU /* * Parse `port' into a TCP port number, defaulting to `defport' if `port' is * an unknown service name. If defport != -1, print a warning upon bad parse. */ int parseport(const char *port, int defport) { int rv; long nport; char *p, *ep; p = ftp_strdup(port); nport = strtol(p, &ep, 10); if (*ep != '\0' && ep == p) { struct servent *svp; svp = getservbyname(port, "tcp"); if (svp == NULL) { badparseport: if (defport != -1) warnx("Unknown port `%s', using port %d", port, defport); rv = defport; } else rv = ntohs(svp->s_port); } else if (nport < 1 || nport > MAX_IN_PORT_T || *ep != '\0') goto badparseport; else rv = nport; free(p); return (rv); } #define STRNEQUAL(a,b) (strncasecmp((a), (b), sizeof((b))-1) == 0) #define FREEPTR(x) if ((x) != NULL) { free(x); (x) = NULL; } #ifdef NO_DEBUG #define DPRINTF(...) #define DWARN(...) #else #define DPRINTF(...) if (ftp_debug) (void)fprintf(ttyout, __VA_ARGS__) #define DWARN(...) if (ftp_debug) warn(__VA_ARGS__) #endif /* * Parse URL of form (per RFC3986): * ://[[:]@][:][/] * Returns -1 if a parse error occurred, otherwise 0. * It's the caller's responsibility to url_decode() the returned * user, pass and path. * * Sets type to url_t, each of the given char ** pointers to a * malloc(3)ed strings of the relevant section, and port to * the number given, or ftpport if ftp://, or httpport if http://. * * XXX: this is not totally RFC3986 compliant; will have the * leading `/' unless it's an ftp:// URL, as this makes things easier * for file:// and http:// URLs. ftp:// URLs have the `/' between the * host and the URL-path removed, but any additional leading slashes * in the URL-path are retained (because they imply that we should * later do "CWD" with a null argument). * * Examples: * input URL output path * --------- ----------- * "http://host" "/" * "http://host/" "/" * "http://host/path" "/path" * "file://host/dir/file" "dir/file" * "ftp://host" "" * "ftp://host/" "" * "ftp://host//" "/" * "ftp://host/dir/file" "dir/file" * "ftp://host//dir/file" "/dir/file" */ int parse_url(const char *url, const char *desc, URL_ENT *parts) { const char *origurl; char *cp, *ep, *thost, *tport = NULL; size_t len; if (url == NULL || desc == NULL || parts == NULL) errx(1, "parse_url: invoked with NULL argument!"); origurl = url; memset(parts, '\0', sizeof(URL_ENT)); if (STRNEQUAL(url, HTTP_URL)) { url += sizeof(HTTP_URL) - 1; parts->type = HTTP_URL_T; parts->portnum = HTTP_PORT; tport = httpport; } else if (STRNEQUAL(url, FTP_URL)) { url += sizeof(FTP_URL) - 1; parts->type = FTP_URL_T; parts->portnum = FTP_PORT; tport = ftpport; } else if (STRNEQUAL(url, FILE_URL)) { url += sizeof(FILE_URL) - 1; parts->type = FILE_URL_T; } else if (STRNEQUAL(url, TABLE_URL)) { url += sizeof(TABLE_URL) - 1; parts->type = TABLE_URL_T; } else if (STRNEQUAL(url, SQL_URL)) { url += sizeof(SQL_URL) - 1; parts->type = SQL_URL_T; } else { warnx("Invalid %s `%s'", desc, url); cleanup_parse_url: FREEPTR(parts->user); if (parts->pass != NULL) memset(parts->pass, 0, strlen(parts->pass)); FREEPTR(parts->pass); FREEPTR(parts->host); FREEPTR(parts->port); FREEPTR(parts->path); return (-1); } if (*url == '\0') return (0); /* find [user[:pass]@]host[:port] */ ep = strchr(url, '/'); if (ep == NULL) thost = ftp_strdup(url); else { len = ep - url; thost = (char *)ftp_malloc(len + 1); (void)strlcpy(thost, url, len + 1); if (parts->type == FTP_URL_T) /* skip first / for ftp URLs */ ep++; parts->path = ftp_strdup(ep); } cp = strchr(thost, '@'); /* look for user[:pass]@ in URLs */ if (cp != NULL) { if (parts->type == FTP_URL_T) anonftp = 0; /* disable anonftp */ parts->user = thost; *cp = '\0'; thost = ftp_strdup(cp + 1); cp = strchr(parts->user, ':'); if (cp != NULL) { *cp = '\0'; parts->pass = ftp_strdup(cp + 1); } url_decode(parts->user); if (parts->pass) url_decode(parts->pass); } #ifdef INET6 /* * Check if thost is an encoded IPv6 address, as per * RFC3986: * `[' ipv6-address ']' */ if (*thost == '[') { cp = thost + 1; if ((ep = strchr(cp, ']')) == NULL || (ep[1] != '\0' && ep[1] != ':')) { warnx("Invalid address `%s' in %s `%s'", thost, desc, origurl); goto cleanup_parse_url; } len = ep - cp; /* change `[xyz]' -> `xyz' */ memmove(thost, thost + 1, len); thost[len] = '\0'; if (! isipv6addr(thost)) { warnx("Invalid IPv6 address `%s' in %s `%s'", thost, desc, origurl); goto cleanup_parse_url; } cp = ep + 1; if (*cp == ':') cp++; else cp = NULL; } else #endif /* INET6 */ if ((cp = strchr(thost, ':')) != NULL) *cp++ = '\0'; parts->host = thost; /* look for [:port] */ if (cp != NULL) { long nport; nport = parseport(cp, -1); if (nport == -1) { warnx("Unknown port `%s' in %s `%s'", cp, desc, origurl); goto cleanup_parse_url; } parts->portnum = nport; tport = cp; } if (tport != NULL) parts->port = ftp_strdup(tport); if (parts->path == NULL) { const char *emptypath = "/"; if (parts->type == FTP_URL_T) /* skip first / for ftp URLs */ emptypath++; parts->path = ftp_strdup(emptypath); } DPRINTF("parse_url: user `%s' pass `%s' host %s port %s(%d) " "path `%s'\n", parts->user ? parts->user : "", parts->pass ? parts->pass : "", parts->host ? parts->host : "", parts->port ? parts->port : "", parts->portnum ? parts->portnum : -1, parts->path ? parts->path : ""); return (0); } dbstreams/app/dbcat.C010066400017500000000000000216411077620525600145520ustar00jklowdenwheel/* $Id: dbcat.C,v 1.6 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include #include #include #include #include #include #include #include #include #include #include "url.h" #include "copy.h" using std::stringstream; using std::string; using std::cerr; using std::cout; using std::endl; extern char *optarg; extern int optind; std::string options_t:: escaped_terminator( const std::string& term ) { static const struct translation { const char *in, *out; } escapes[] = { { "\\0", "\0" } , { "\\n", "\n" } , { "\\t", "\t" } , { "\\\\", "\\" } }; const translation *p = escapes; string output(term); for( ; p < escapes + sizeof(escapes); p++ ) { size_t pos; while( (pos = output.find (p->in) < std::string::npos) ) { output.replace( pos, strlen(p->in), p->out ); } } return output; } options_t options; string appl; const string& app(appl); void usage() { cerr << app << " [-t field_term] [-r row_term] [-m max_errors] " " [-b batch] [-i URL] [-o URL] [file ...]" << endl; } std::ostream& operator<<( std::ostream& os, const url_ent& url ) { os << "valid: " << url.valid() << "\n" << "type: " << url.url_t_name() << "\n" << "portnum: " << url.portnum << "\n" << "user: " << (url.user? url.user : "") << "\n" << "pass: " << (url.pass? url.pass : "") << "\n" << "host: " << (url.host? url.host : "") << "\n" << "path: " << (url.path? url.path : "") << "\n" << "port: " << (url.port? url.port : "") // "\n" ; return os; } const char * remove_prefix( const char * url, dbstreams::provider_type& provider ) { std::pair where; provider = dbstreams::parse_provider_name( url, &where ); if( provider != dbstreams::NONE ) { const char * colons = url + where.second; if( colons == strstr(colons, "::") ) return colons + 2; } return url; } int main(int argc, char *argv[]) { int bflag, ch, fd; appl = basename(argv[0]); bflag = 0; while( (ch = getopt(argc, argv, "b:i:m:o:r:t:")) != -1 ) { provider_ent ent, *pent(0); dbstreams::provider_type *pprov(0); string terminator; const char *url; struct stat sb; if( ch == 'r' || ch == 't' ) { terminator = options.escaped_terminator(optarg); } switch (ch) { case 'b': stringstream(optarg) >> options.batch; break; case 'i': options.input.url.push_back(ent); pent = &options.input.url.back(); pprov = &pent->provider; // fall through to parse URL case 'o': if( !pent ) { if( options.output.url.path ) { cerr << "too many outputs\n"; exit(1); } pent = &options.output.url; pprov = &pent->provider; } if( 0 == stat(optarg, &sb) ) { // it's a filename pent->type = FILE_URL_T; pent->path = strdup(optarg); break; } // parse out the provider, if any, first url = remove_prefix( optarg, pent->provider ); if( url != optarg ) { *pprov = pent->provider; // set the default input provider if( pent == &options.input.url.back() && options.input_provider == dbstreams::NONE ){ options.input_provider = pent->provider; } } if( -1 == parse_url( url, "", pent ) ) { if( ch == 'i' ) { cerr << "could not parse \"" << optarg << '"' << endl; return 1; } else { // must be a filename pent->type = FILE_URL_T; pent->path = strdup(optarg); break; } } while( pent->path && '/' == *pent->path ) pent->path++; break; case 'm': stringstream(optarg) >> options.max_errors; break; case 'r': if( options.input.row_term.empty() ) options.input.row_term = terminator; else options.output.row_term = terminator; break; case 't': if( options.input.field_term.empty() ) options.input.field_term = terminator; else options.output.field_term = terminator; break; case '?': default: usage(); } } argc -= optind; argv += optind; /* work out what to do with the files */ for( int i=1; i < argc; i++) { options.input.url.push_back( provider_ent(argv[i]) ); } if( options.output.url.type == UNKNOWN_URL_T ) { options.output.url = provider_ent("/dev/stdout"); } #if 1 for( std::deque::const_iterator p(options.input.url.begin()); p != options.input.url.end(); p++ ) { static int i(0); cout << "input[" << i++ << "]:\n" << *p << "\n"; } cout << "\noutput:\n" << options.output.url << "\n"; cout << "file arguments (" << argc << ")"; if( argc > 0 ) cout << ": " << argv[0]; for( int i=1; i < argc; i++) { cout << ", " << argv[i]; } cout << "\n"; #endif dbstreams::dbstream table_out; if( options.output.url.provider != dbstreams::NONE ) { table_out.configure(options.output.url.provider, options.output.url.user, options.output.url.pass ); } std::ofstream file_out; std::ostream *pfile_out(NULL); /* * Any input URL may mention a provider prefix. The first one * mentioned is used until a subsequent one overrides it. */ long nerrors(0); for( std::deque::const_iterator p(options.input.url.begin()); p != options.input.url.end(); p++ ) { const provider_ent& out_ent( options.output.url ); const dbstreams::provider_type provider( p->provider == dbstreams::NONE? options.input_provider : p->provider ); if( provider != options.input_provider ) options.input_provider = provider; dbstreams::dbstream table_in; std::ifstream file_in, *pfile_in(&file_in); std::string query; provider_ent input_ent(*p); switch (p->type) { case FILE_URL_T: if( ! open( *p, file_in ) ) { cerr << app << ": could not open: " << p->path << "\n"; nerrors++; continue; } break; case TABLE_URL_T: case SQL_URL_T: { std::ifstream isql(p->path); if( isql.is_open() ) { while( isql ) { std::string line; std::getline( isql, line ); query += line + "\n"; } input_ent.path = const_cast(query.c_str()); } } table_in.configure(provider, p->user, p->pass); if( ! open( input_ent, table_in ) ) { cerr << app << ": could not connect to: " << p->host << "\n"; nerrors++; continue; } break; default: cerr << "unsupported URL scheme: " << p->url_t_name() << "\n"; nerrors++; continue; } // After input is open // it's OK to open output if( !table_out.is_open() && !pfile_out ) { switch (out_ent.type) { case FILE_URL_T: if( out_ent.path == strcasestr(out_ent.path, "/dev/stdout") ) { pfile_out = &cout; break; } if( ! open( out_ent, file_out ) ) { cerr << app << ": could not open: " << out_ent.path << "\n"; nerrors++; return 1; } pfile_out = &file_out; break; case TABLE_URL_T: if( ! open( out_ent, table_out ) ) { cerr << app << ": could not connect to: " << out_ent.host << "\n"; nerrors++; return 1; } break; case SQL_URL_T: cerr << app << "an SQL query is invalid as output: " << out_ent.url_t_name() << "\n"; nerrors++; return 1; default: cerr << app << "unsupported URL scheme: " << out_ent.url_t_name() << "\n"; nerrors++; return 1; } } assert( file_in.is_open() || table_in.is_open() ); assert( pfile_out == &cout || file_out.is_open() || table_out.is_open() ); if( table_in.is_open() ) { dbstreams::query query( p->type == TABLE_URL_T? "select * from " : "" ); query << p->path; table_in << query; if( !table_in ) { cerr << app << ": unable to execute query: [" << query.str() << "]\n"; nerrors++; continue; } } if( file_in.is_open() ) { if( pfile_out ) { nerrors += copy_data( options, file_in, *pfile_out ); } else { nerrors += copy_data( options, file_in, table_out ); } } else { if( pfile_out ) { nerrors += copy_data( options, table_in, *pfile_out ); } else { nerrors += copy_data( options, table_in, table_out ); } } if( 0 > nerrors || nerrors > options.max_errors ) { errx( 2, "way too many errors: %ld", nerrors ); } } return nerrors == 0; } dbstreams/app/url.h.bck010060000017500000000000000013521074247364600150700ustar00jklowdenwheel#ifndef __URL_H__ #define __URL_H__ #ifdef __cplusplus extern "C" { #endif typedef enum { UNKNOWN_URL_T=-1, HTTP_URL_T, FTP_URL_T, FILE_URL_T, CLASSIC_URL_T } url_t; const char ABOUT_URL[] = "about:" ; /* propaganda */ const char FILE_URL[] = "file://" ; /* file URL prefix */ const char FTP_URL[] = "ftp://" ; /* ftp URL prefix */ const char HTTP_URL[] = "http://" ; /* http URL prefix */ #define HTTP_PORT 80 /* default if ! getservbyname("http/tcp") */ #define FTP_PORT 21 /* default if ! getservbyname("ftp/tcp") */ int parse_url(const char *url, const char *desc, url_t *type, char **user, char **pass, char **host, char **port, in_port_t *portnum, char **path); #ifdef __cplusplus } #endif #endif dbstreams/app/url.h010066400017500000000000000047441077620525600143510ustar00jklowdenwheel/* $Id: url.h,v 1.4 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef __URL_H__ #define __URL_H__ #ifdef __cplusplus #include #include #endif typedef enum { UNKNOWN_URL_T=-1, HTTP_URL_T, FTP_URL_T, FILE_URL_T, CLASSIC_URL_T, TABLE_URL_T, SQL_URL_T } url_t; struct url_ent { url_t type; int portnum; char *user, *pass, *host, *path, *port; #ifdef __cplusplus url_ent() : type(UNKNOWN_URL_T) , portnum(0) , user(0) , pass(0) , host(0) , path(0) , port(0) {} url_ent( const char path[] ) : type(FILE_URL_T) , portnum(0) , user(0) , pass(0) , host(0) , path(strdup(path)) , port(0) {} static const char * url_t_name( url_t type ) { switch(type) { case UNKNOWN_URL_T: return "UNKNOWN_URL_T"; case HTTP_URL_T: return "HTTP_URL_T"; case FTP_URL_T: return "FTP_URL_T"; case FILE_URL_T: return "FILE_URL_T"; case CLASSIC_URL_T: return "CLASSIC_URL_T"; case TABLE_URL_T: return "TABLE_URL_T"; case SQL_URL_T: return "SQL_URL_T"; default: throw std::logic_error("unknown url_t type"); break; } } const char * url_t_name() const { return url_t_name(type); } bool valid() const; #endif }; #ifdef __cplusplus std::ostream& operator<<( std::ostream& os, const url_ent& url ); #endif #ifdef __cplusplus extern "C" { #endif typedef struct url_ent URL_ENT; const char ABOUT_URL[] = "about:"; const char FILE_URL[] = "file://"; const char FTP_URL[] = "ftp://"; const char HTTP_URL[] = "http://"; const char TABLE_URL[] = "table://"; const char SQL_URL[] = "sql://"; #define HTTP_PORT 80 /* default if ! getservbyname("http/tcp") */ #define FTP_PORT 21 /* default if ! getservbyname("ftp/tcp") */ int parse_url(const char *url, const char *desc, URL_ENT *parts); #ifdef __cplusplus } #endif #endif dbstreams/app/parse_url.c.bck010060000017500000000000000255141074247300000162430ustar00jklowdenwheel/* * Copyright (c) 1997-2007 The NetBSD Foundation, Inc. * All rights reserved. * * Modified by James K. Lowden, found in tnftp distribution. * * This code is derived from software contributed to The NetBSD Foundation * by Luke Mewburn. * * This code is derived from software contributed to The NetBSD Foundation * by Scott Aaron Bamford. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the NetBSD * Foundation, Inc. and its contributors. * 4. Neither the name of The NetBSD Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * Parse URL of form (per RFC3986): * ://[[:]@][:][/] * Returns -1 if a parse error occurred, otherwise 0. * It's the caller's responsibility to url_decode() the returned * user, pass and path. * * Sets type to url_t, each of the given char ** pointers to a * malloc(3)ed strings of the relevant section, and port to * the number given, or ftpport if ftp://, or httpport if http://. * * XXX: this is not totally RFC3986 compliant; will have the * leading `/' unless it's an ftp:// URL, as this makes things easier * for file:// and http:// URLs. ftp:// URLs have the `/' between the * host and the URL-path removed, but any additional leading slashes * in the URL-path are retained (because they imply that we should * later do "CWD" with a null argument). * * Examples: * input URL output path * --------- ----------- * "http://host" "/" * "http://host/" "/" * "http://host/path" "/path" * "file://host/dir/file" "dir/file" * "ftp://host" "" * "ftp://host/" "" * "ftp://host//" "/" * "ftp://host/dir/file" "dir/file" * "ftp://host//dir/file" "/dir/file" */ int parse_url(const char *url, const char *desc, url_t *type, char **user, char **pass, char **host, char **port, in_port_t *portnum, char **path) { const char *origurl; char *cp, *ep, *thost, *tport; size_t len; if (url == NULL || desc == NULL || type == NULL || user == NULL || pass == NULL || host == NULL || port == NULL || portnum == NULL || path == NULL) errx(1, "parse_url: invoked with NULL argument!"); origurl = url; *type = UNKNOWN_URL_T; *user = *pass = *host = *port = *path = NULL; *portnum = 0; tport = NULL; if (STRNEQUAL(url, HTTP_URL)) { url += sizeof(HTTP_URL) - 1; *type = HTTP_URL_T; *portnum = HTTP_PORT; tport = httpport; } else if (STRNEQUAL(url, FTP_URL)) { url += sizeof(FTP_URL) - 1; *type = FTP_URL_T; *portnum = FTP_PORT; tport = ftpport; } else if (STRNEQUAL(url, FILE_URL)) { url += sizeof(FILE_URL) - 1; *type = FILE_URL_T; } else { warnx("Invalid %s `%s'", desc, url); cleanup_parse_url: FREEPTR(*user); if (*pass != NULL) memset(*pass, 0, strlen(*pass)); FREEPTR(*pass); FREEPTR(*host); FREEPTR(*port); FREEPTR(*path); return (-1); } if (*url == '\0') return (0); /* find [user[:pass]@]host[:port] */ ep = strchr(url, '/'); if (ep == NULL) thost = ftp_strdup(url); else { len = ep - url; thost = (char *)ftp_malloc(len + 1); (void)strlcpy(thost, url, len + 1); if (*type == FTP_URL_T) /* skip first / for ftp URLs */ ep++; *path = ftp_strdup(ep); } cp = strchr(thost, '@'); /* look for user[:pass]@ in URLs */ if (cp != NULL) { if (*type == FTP_URL_T) anonftp = 0; /* disable anonftp */ *user = thost; *cp = '\0'; thost = ftp_strdup(cp + 1); cp = strchr(*user, ':'); if (cp != NULL) { *cp = '\0'; *pass = ftp_strdup(cp + 1); } url_decode(*user); if (*pass) url_decode(*pass); } #ifdef INET6 /* * Check if thost is an encoded IPv6 address, as per * RFC3986: * `[' ipv6-address ']' */ if (*thost == '[') { cp = thost + 1; if ((ep = strchr(cp, ']')) == NULL || (ep[1] != '\0' && ep[1] != ':')) { warnx("Invalid address `%s' in %s `%s'", thost, desc, origurl); goto cleanup_parse_url; } len = ep - cp; /* change `[xyz]' -> `xyz' */ memmove(thost, thost + 1, len); thost[len] = '\0'; if (! isipv6addr(thost)) { warnx("Invalid IPv6 address `%s' in %s `%s'", thost, desc, origurl); goto cleanup_parse_url; } cp = ep + 1; if (*cp == ':') cp++; else cp = NULL; } else #endif /* INET6 */ if ((cp = strchr(thost, ':')) != NULL) *cp++ = '\0'; *host = thost; /* look for [:port] */ if (cp != NULL) { long nport; nport = parseport(cp, -1); if (nport == -1) { warnx("Unknown port `%s' in %s `%s'", cp, desc, origurl); goto cleanup_parse_url; } *portnum = nport; tport = cp; } if (tport != NULL) *port = ftp_strdup(tport); if (*path == NULL) { const char *emptypath = "/"; if (*type == FTP_URL_T) /* skip first / for ftp URLs */ emptypath++; *path = ftp_strdup(emptypath); } DPRINTF("parse_url: user `%s' pass `%s' host %s port %s(%d) " "path `%s'\n", *user ? *user : "", *pass ? *pass : "", *host ? *host : "", *port ? *port : "", *portnum ? *portnum : -1, *path ? *path : ""); return (0); } * (urltype is FTP_URL_T), then RFC3986 says we need to * send a separate CWD command for each unescaped "/" * in the path, and we have to interpret %hex escaping * *after* we find the slashes. It's possible to get * empty components here, (from multiple adjacent * slashes in the path) and RFC3986 says that we should * still do `CWD ' (with a null argument) in such cases. * * Many ftp servers don't support `CWD ', so if there's an * error performing that command, bail out with a descriptive * message. * * Examples: * * host: dir="", urltype=CLASSIC_URL_T * logged in (to default directory) * host:file dir=NULL, urltype=CLASSIC_URL_T * "RETR file" * host:dir/ dir="dir", urltype=CLASSIC_URL_T * "CWD dir", logged in * ftp://host/ dir="", urltype=FTP_URL_T * logged in (to default directory) * ftp://host/dir/ dir="dir", urltype=FTP_URL_T * "CWD dir", logged in * ftp://host/file dir=NULL, urltype=FTP_URL_T * "RETR file" * ftp://host//file dir="", urltype=FTP_URL_T * "CWD ", "RETR file" * host:/file dir="/", urltype=CLASSIC_URL_T * "CWD /", "RETR file" * ftp://host///file dir="/", urltype=FTP_URL_T * "CWD ", "CWD ", "RETR file" * ftp://host/%2F/file dir="%2F", urltype=FTP_URL_T * "CWD /", "RETR file" * ftp://host/foo/file dir="foo", urltype=FTP_URL_T * "CWD foo", "RETR file" * ftp://host/foo/bar/file dir="foo/bar" * "CWD foo", "CWD bar", "RETR file" * ftp://host//foo/bar/file dir="/foo/bar" * "CWD ", "CWD foo", "CWD bar", "RETR file" * ftp://host/foo//bar/file dir="foo//bar" * "CWD foo", "CWD ", "CWD bar", "RETR file" * ftp://host/%2F/foo/bar/file dir="%2F/foo/bar" * "CWD /", "CWD foo", "CWD bar", "RETR file" * ftp://host/%2Ffoo/bar/file dir="%2Ffoo/bar" * "CWD /foo", "CWD bar", "RETR file" * ftp://host/%2Ffoo%2Fbar/file dir="%2Ffoo%2Fbar" * "CWD /foo/bar", "RETR file" * ftp://host/%2Ffoo%2Fbar%2Ffile dir=NULL * "RETR /foo/bar/file" * * Note that we don't need `dir' after this point. */ do { if (urltype == FTP_URL_T) { nextpart = strchr(dir, '/'); if (nextpart) { *nextpart = '\0'; nextpart++; } url_decode(dir); } else nextpart = NULL; DPRINTF("dir `%s', nextpart `%s'\n", dir ? dir : "", nextpart ? nextpart : ""); if (urltype == FTP_URL_T || *dir != '\0') { xargv[0] = "cd"; xargv[1] = dir; xargv[2] = NULL; dirchange = 0; cd(2, xargv); if (! dirchange) { if (*dir == '\0' && code == 500) fprintf(stderr, "\n" "ftp: The `CWD ' command (without a directory), which is required by\n" " RFC3986 to support the empty directory in the URL pathname (`//'),\n" " conflicts with the server's conformance to RFC0959.\n" " Try the same URL without the `//' in the URL pathname.\n" "\n"); goto cleanup_fetch_ftp; } } dir = nextpart; } while (dir != NULL); } if (EMPTYSTRING(file)) { rval = -1; goto cleanup_fetch_ftp; } if (dirhasglob) { (void)strlcpy(rempath, dir, sizeof(rempath)); (void)strlcat(rempath, "/", sizeof(rempath)); (void)strlcat(rempath, file, sizeof(rempath)); file = rempath; } /* Fetch the file(s). */ xargc = 2; xargv[0] = "get"; xargv[1] = file; xargv[2] = NULL; if (dirhasglob || filehasglob) { int ointeractive; ointeractive = interactive; interactive = 0; if (restartautofetch) xargv[0] = "mreget"; else xargv[0] = "mget"; mget(xargc, xargv); interactive = ointeractive; } else { if (outfile == NULL) { cp = strrchr(file, '/'); /* find savefile */ if (cp != NULL) outfile = cp + 1; else outfile = file; } xargv[2] = (char *)outfile; xargv[3] = NULL; xargc++; if (restartautofetch) reget(xargc, xargv); else get(xargc, xargv); } if ((code / 100) == COMPLETE) rval = 0; cleanup_fetch_ftp: FREEPTR(port); FREEPTR(host); FREEPTR(path); FREEPTR(user); if (pass) memset(pass, 0, strlen(pass)); FREEPTR(pass); return (rval); } dbstreams/app/.cvsignore010066400017500000000000000001461077460204700153630ustar00jklowdenwheel*.bck *.ok *.db .depend lib bin .gdbinit dbcat asof.sgml entities ideas manual.prototyp revision.sgml dbstreams/app/Makefile010066400017500000000000000012041075421173000150100ustar00jklowdenwheelSRC != ls *.[Cc] HDR != ls *.h OBJ = $(SRC:C/[Cc]$/o/g) CFLAGS += -ggdb -O0 \ -I../include \ -I/usr/local/include \ -I/usr/pkg/include \ -fmessage-length=230 \ -DDBLIB_PROVIDER LIBS = sqlite3 sybdb tdsodbc LOCLIB=/usr/local/lib PKGLIB=/usr/pkg/lib DBSLIB=$(PWD:H)/lib OBJ = $(DBSLIB)/libdbstreams.* LDFLAGS = -Wl,--rpath -Wl,$(LOCLIB) -L$(LOCLIB) \ -Wl,--rpath -Wl,$(PKGLIB) -L$(PKGLIB) $(LIBS:C/^/-l/g) \ -Wl,--rpath -Wl,$(DBSLIB) -L$(DBSLIB) -ldbstreams BIN = dbcat all: $(BIN) dbcat: $(SRC) $(HDR) ../lib/libdbstreams.so $(CXX) -o $@ ${CFLAGS} $(LDFLAGS) $(SRC) $(SRC) : $(HDR) clean: rm -f *.o *.bck $(BIN) dbstreams/app/copy.C010066400017500000000000000103601077620525500144420ustar00jklowdenwheel/* $Id: copy.C,v 1.3 2008/04/06 16:23:40 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include "copy.h" #include #include #include using namespace dbstreams; using std::cerr; using std::getline; extern const std::string app; template bool open( const url_ent& url, STD_STREAM& stream ) { stream.open( url.path ); return stream.is_open(); } template bool open( const url_ent& url, dbstream& stream ) { stream.open( url.host ); if( !stream ) return false; switch( url.type ) { case TABLE_URL_T: stream.table(url.path); return stream; break; case SQL_URL_T: stream << query(url.path); return stream; break; default: throw std::logic_error("no such url type"); } return true; } static void sanity_check( const options_t& options ) { if( options.input.field_term.empty() ) { cerr << app << ": error: no input field separator defined\n"; throw options; } if( options.input.row_term.empty() ) { cerr << app << ": error: no input row separator defined\n"; throw options; } } int copy_data( const options_t& options, std::istream& in, std::ostream& out ) { sanity_check( options ); const std::string& field_term( options.input.field_term ); const std::string& row_term( options.input.row_term ); std::string buffer; for( int c=0; in && out; c++ ) { // FIXME honors only single-byte terminators. getline( in, buffer, field_term.c_str()[0] ); if( c > 0 && ! options.output.field_term.empty() ) out << options.output.field_term; size_t pos(0); if( (pos = buffer.find( row_term )) != std::string::npos ) { out << buffer.substr( 0, pos ); if( ! options.output.row_term.empty() ) out << options.output.row_term; if( pos < buffer.size() ) out << buffer.substr( pos ); c = 0; continue; } out << buffer; } return (in.eof() && out) ? 0 : 1; } template int copy_data( const options_t& options, std::istream& in, dbstream& out ) { sanity_check( options ); const std::string& field_term( options.input.field_term ); const std::string& row_term( options.input.row_term ); std::string buffer; while( in && out ) { // FIXME honors only single-byte terminators. getline( in, buffer, field_term.c_str()[0] ); size_t pos(0); if( (pos = buffer.find( row_term )) != std::string::npos ) { out << buffer.substr( 0, pos ); out << endl; if( pos < buffer.size() ) out << buffer.substr( pos ); continue; } out << buffer; } return (in.eof() && out) ? 0 : 1; } template int copy_data( const options_t& options, dbstream& in, std::ostream& out ) { for ( ; in && out; in++ ) { for( int c=0; c < in.columns(); c++ ) { if( c > 0 && ! options.output.field_term.empty() ) out << options.output.field_term; out << in[c]; } if( ! options.output.row_term.empty() ) out << options.output.row_term; } return 0; // should count errors } template int copy_data( const options_t& options, dbstream& in, dbstream& out ) { for ( ; in && out; in++ ) { for( int c=0; c < in.columns(); c++ ) { out << in[c]; } out << endl; } return 0; // should count errors } void export_copy_data(const options_t& options) { dbstream db; std::fstream io; std::ifstream is; std::ofstream os; url_ent url; assert(0); // this function is nonfunctional except to export functions open( url, is ); open( url, os ); open( url, db ); copy_data( options, io, io ); copy_data( options, db, io ); copy_data( options, io, db ); copy_data( options, db, db ); } dbstreams/app/copy.h010066400017500000000000000041221077620525500145060ustar00jklowdenwheel/* $Id: copy.h,v 1.4 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #ifndef __COPY_H__ #define __COPY_H__ #include #include #include "url.h" struct provider_ent : public url_ent { dbstreams::provider_type provider; provider_ent() : provider(dbstreams::NONE) {} provider_ent( const char path[] ) : url_ent(path) , provider(dbstreams::NONE) {} }; struct options_t { int max_errors, batch; dbstreams::provider_type input_provider; template struct io { std::string field_term, row_term; E url; io() : field_term("\t") , row_term("\n") {} }; io < std::deque > input; io< provider_ent > output; options_t() : max_errors(0) , batch(0) , input_provider(dbstreams::NONE) {} static std::string escaped_terminator( const std::string& term ); }; template bool open( const url_ent& url, STD_STREAM& stream ); template bool open( const url_ent& url, dbstreams::dbstream& stream ); int copy_data( const options_t& options, std::istream& in, std::ostream& out ); template int copy_data( const options_t& options, std::istream& in, dbstreams::dbstream& out ); template int copy_data( const options_t& options, dbstreams::dbstream& in, std::ostream& out ); template int copy_data( const options_t& options, dbstreams::dbstream& in, dbstreams::dbstream& out ); #endif dbstreams/app/url_t.C010066400017500000000000000021371077620525600146210ustar00jklowdenwheel/* $Id: url_t.C,v 1.2 2008/04/06 16:23:41 jklowden Exp $ */ /* * Copyright (c) 2008 James K. Lowden. "Good Design Is Invisible." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED "AS IS" AND DISCLAIMS ANY AND ALL WARRANTIES, * EXPRESS OR IMPLIED. */ #include "url.h" bool url_ent::valid() const { switch (type) { case UNKNOWN_URL_T: return false; case HTTP_URL_T: return false; case FTP_URL_T: return false; case FILE_URL_T: return path != 0; case CLASSIC_URL_T: return false; case SQL_URL_T: case TABLE_URL_T: return host && path; default: throw std::runtime_error("unknown url type"); } } dbstreams/lib004077500017500000000000000000001077553430600132775ustar00jklowdenwheeldbstreams/lib/libdbstreams.so010077500017500000000000040175001077553430600164030ustar00jklowdenwheelELFh4$4 (!L0 0 0 lll]eR*t8I7J#bNf>CO3G;D,"SV!(s/1T\)yLD '+ud=%![7MUc5FAY *m WR3o9E-"=HQ:{@|P?J% 0.2<X;9A@LXSU0TVEQ-HF')_2l}+^z C:NZv~xO?1W>kq\Y,.har8Pnj]I# 6`wK&B[$ip$&654(/g <GK4BMZL  4U̳h@  l   t0   `k1!  I x(!  lv$  6 <! h8,"L J -`hz Q"X/"3x>1"T! # !  +^"'&0  ',"p! }^&(L%H>" ! z9z+8"2,]0)"))"bw"$ D @(! K c"h ! y"3 $ 4(! %DEty, 4p3U"- 43% PT/w(Ԟ5" dHp-5"e#"1{,  (! !E "T<! n  "@ ["// 8" Tf|&N 2v  4Tj0"}$ l4g "?(! ! &" |X +\ jV "?D`O3k,T1|Z", WztLx" d; 9TD !" <! i@ ! 4-"q $2t" \" lN,t #" " i ?X/04K+H"4 I",(! } P" w{W Y"8!0"^%8 O 2p7"X4! <"2"4! r$ !  ?"cL8"(#HCж"\h "5L1q"=\!  .! !,h "" "S"l1@:4%" 0 XcF-x  ,  &@ t ! ]H "i$.Y p" 1De! "xz 42  ! 2w.Y" " _ #"'4"'Ԝ"+УH"`!a ".>"3Tw"nl-d"J4c"+`DD!  `(! -%, j d!C"  "X7,2 T4Lt 5"T5"el "!b" ) "-"\!`/"! 84ic"q$$ %"|P-  @*Ġ"fj&A`dK! U pj"L q'`( a~ S /0~ _ d " wq"  Dg * "1t&НY"K`t)N"z9 ym"  "~ < _DYNAMIC_GLOBAL_OFFSET_TABLE__init_fini__cxa_finalize__deregister_frame_info_Jv_RegisterClasses__register_frame_info_ZNK9dbstreams8metadataltESs_ZNK9dbstreams8metadataeqESs_ZN9dbstreams8metadata7varylenENS0_8datatypeE_Unwind_Resume_ZN9dbstreams4cell13make_bindableEvmemcpy_ZNSsC1EPKcRKSaIcE__cxa_allocate_exception_ZNSt11logic_errorC1ERKSs_ZN16__Atomicity_lockILi0EE17_S_atomicity_lockE_ZNSt11logic_errorD1Ev_ZTISt11logic_error__cxa_throw_ZNSs4_Rep10_M_destroyERKSaIcE_Znaj_ZdaPv_ZNK9dbstreams4cell5validEv_ZN9dbstreams4cell6assignEPvi_ZN9dbstreams4cellclEPKvi_ZN9dbstreams4cellclEPKci_ZN9dbstreams4cellaSEd_ZN9dbstreams4cellaSEi_ZN9dbstreams4cellaSEf_ZN9dbstreams4cellC2Ev_ZNSs20_S_empty_rep_storageE_ZN9dbstreams4cellC1Ev_ZN9dbstreams4cellC2ERKS0__ZNSsC1ERKSs_ZN9dbstreams4cellC1ERKS0__ZN9dbstreams4cellaSERKS0__ZNSs6assignERKSs_ZN9dbstreams4cellC2Eii_ZN9dbstreams4cellC1Eii_ZN9dbstreams4cellC2Efi_ZN9dbstreams4cellC1Efi_ZN9dbstreams4cellC2Edi_ZN9dbstreams4cellC1Edi_ZN9dbstreams4cellC2EPKcii_ZN9dbstreams4cellC1EPKcii_ZNSt8ios_baseC2Ev_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZTVSt9basic_iosIcSt11char_traitsIcEE_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c_ZNSolsEm_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv_ZNSs4_Rep11_S_terminalE_ZNSt12domain_errorC1ERKSs_ZNSt12domain_errorD1Ev_ZTISt12domain_error_ZNSolsEl_ZNSt8ios_baseD2Ev_ZNSs4_Rep10_M_disposeERKSaIcE_ZNSaIcED1Ev_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev_ZNSiD2Ev_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev_ZN9dbstreams4cellaSEPKc_ZN9dbstreams4cellaSEPKh_ZN9dbstreams4cellC2EPKvii_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode_ZN9dbstreams4cellC1EPKvii_ZN9dbstreams4cellC2EiRKSs_ZN9dbstreams4cellC1EiRKSs_ZN9dbstreams4cellC2EfRKSs_ZN9dbstreams4cellC1EfRKSs_ZN9dbstreams4cellC2EdRKSs_ZN9dbstreams4cellC1EdRKSs_ZN9dbstreams4cellC2EPKciRKSs_ZN9dbstreams4cellC1EPKciRKSs_ZN9dbstreams4cellC2EPKviRKSs_ZN9dbstreams4cellC1EPKviRKSs_ZN9dbstreams4cell10copy_valueERKS0__ZNSt13runtime_errorC1ERKSs_ZNSt13runtime_errorD1Ev_ZTISt13runtime_error_ZNK9dbstreams4cellrsERSs_ZNSs6assignEPKcj_ZNK9dbstreams4cellrsERi_ZNK9dbstreams4cellrsERf_ZNK9dbstreams4cellrsERd_ZNK9dbstreams4cellrsERPKc_ZNK9dbstreams4cellrsERPKh_ZNK9dbstreams4cellrsERPKv_ZlsRSoRKN9dbstreams4cellE_ZNSsC1EPKcjRKSaIcE_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E_ZNSolsEd_ZlsRSoN9dbstreams8metadata8datatypeE_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev_ZTCSt18basic_stringstreamIcSt11char_traitsIcESaIcEE0_Sd_ZTCSt18basic_stringstreamIcSt11char_traitsIcESaIcEE0_Si_ZTCSt18basic_stringstreamIcSt11char_traitsIcESaIcEE8_So_ZTISd_ZNSdD1Ev_ZNSdD0Ev_ZThn8_NSdD1Ev_ZThn8_NSdD0Ev_ZTv0_n12_NSdD1Ev_ZTv0_n12_NSdD0Ev_ZTISi_ZNSiD1Ev_ZNSiD0Ev_ZTv0_n12_NSiD1Ev_ZTv0_n12_NSiD0Ev_ZTISo_ZNSoD1Ev_ZNSoD0Ev_ZTv0_n12_NSoD1Ev_ZTv0_n12_NSoD0Ev_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE14_M_really_syncEjj_ZTVSt12domain_error_ZNSt11logic_errorD2Ev_ZTVSt15basic_streambufIcSt11char_traitsIcEE_ZNSt6localeD1Ev_ZdlPv_ZTVSd_ZTTSd_ZNSsC1IPcEET_S1_RKSaIcE_ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag_ZTVN10__cxxabiv120__si_class_type_infoE_ZTSSt12domain_error_ZTVN10__cxxabiv121__vmi_class_type_infoE_ZTSSd_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE_ZTISt15basic_streambufIcSt11char_traitsIcEE_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_cur_moveEl_ZNSs4_Rep11_S_max_sizeE_ZNSs7reserveEj_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc_ZTCSd0_Si_ZTCSd8_So_ZNSt12domain_errorD0Ev_ZNKSt11logic_error4whatEv_ZNSs4_Rep9_S_createEjRKSaIcE_ZSt19__throw_logic_errorPKc__gxx_personality_v0_ZN9dbstreams8dbstatusC2ERKSs_ZNSt13runtime_errorC2ERKSs_ZTVN9dbstreams8dbstatusE_ZNSt11_Deque_baseIiSaIiEE17_M_initialize_mapEj_ZNSt13runtime_errorD2Ev_ZNSt11_Deque_baseIiSaIiEED2Ev_ZN9dbstreams8dbstatusC1ERKSs_ZN9dbstreams8dbstatusC2EPKciRKSs_ZN9dbstreams8dbstatusC1EPKciRKSs_ZN9dbstreams8dbstatus6ignoreERKSt5dequeIiSaIiEE_ZNSt5dequeIiSaIiEEaSERKS1__ZN9dbstreams8dbstatus7fetchedENS0_7iostateEib_ZNK9dbstreams8dbstatus4whatEv_ZN9dbstreams8dbstatus5resetENS0_7iostateE_ZNSs7replaceEjjPKcj_ZN9dbstreams8dbstatusaSERKSs_ZNK9dbstreams8dbstatuseqEi_ZNK9dbstreams8dbstatusneEi_ZNK9dbstreams8dbstatus6notifyERSo_ZSt4findISt15_Deque_iteratorIiRKiPS1_EiET_S5_S5_RKT0_St26random_access_iterator_tag_ZlsRSoRKN9dbstreams8dbstatus7iostateE_ZlsRSoRKN9dbstreams8dbstatusE_ZTIN9dbstreams8dbstatusE_ZN9dbstreams8dbstatusD1Ev_ZN9dbstreams8dbstatusD0Ev_ZNSt8ios_base4InitD1Ev_ZNSt8ios_base4InitC1Ev__cxa_call_unexpected_ZNSt11_Deque_baseIiSaIiEE15_M_create_nodesEPPiS3__ZNSt24__default_alloc_templateILb1ELi0EE8allocateEj__cxa_begin_catch_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvj__cxa_rethrow__cxa_end_catch_ZNSt11_Deque_baseIiSaIiEE16_M_destroy_nodesEPPiS3__ZNSt5dequeIiSaIiEE5eraseESt15_Deque_iteratorIiRiPiES5__ZNSt5dequeIiSaIiEE19_M_range_insert_auxISt15_Deque_iteratorIiRKiPS4_EEEvS3_IiRiPiET_SB_St20forward_iterator_tag_ZNSt5dequeIiSaIiEE13_M_insert_auxISt15_Deque_iteratorIiRKiPS4_EEEvS3_IiRiPiET_SB_j_ZNSt15_Deque_iteratorIiRiPiEpLEi_ZNSt5dequeIiSaIiEE23_M_new_elements_at_backEj_ZNSt5dequeIiSaIiEE24_M_new_elements_at_frontEj_ZNSt5dequeIiSaIiEE17_M_reallocate_mapEjb_ZSt6__copyISt15_Deque_iteratorIiRiPiES3_ET0_T_S5_S4_St26random_access_iterator_tag_ZSt25__uninitialized_copy_copyISt15_Deque_iteratorIiRiPiES0_IiRKiPS4_ES3_ET1_T_S9_T0_SA_S8__ZSt25__uninitialized_copy_copyISt15_Deque_iteratorIiRKiPS1_ES0_IiRiPiES7_ET1_T_S9_T0_SA_S8__ZTSN9dbstreams8dbstatusEmemmove_ZNSt5dequeIiSaIiEE5clearEv_ZN9dbstreams19parse_provider_nameERKSsPSt4pairIjjEstrcasestr_ZN9dbstreams9providers11native_typeERNS_8metadataEi_ZN9dbstreams9providers11native_typeERKNS_8metadataE_ZN9dbstreams9providers8urhandle6handleEP19tds_dblib_dbprocess_ZN9dbstreams9providers8urhandle6handleEP7sqlite3_ZNK9dbstreams9providers8urhandle7sqlite3Ev_ZTIN9dbstreams9providers8urhandleE_ZNK9dbstreams9providers8urhandle6dbprocEv_ZTVN10__cxxabiv117__class_type_infoE_ZTSN9dbstreams9providers8urhandleE_ZN9dbstreams9providers10dblib_impl11switchboard11connectionsE_ZN9dbstreams9providers10dblib_impl11switchboard11prior_procsE_ZN9dbstreams9providers10dblib_impl11switchboard3errE_ZN9dbstreams9providers10dblib_impl11switchboard3msgE_ZN9dbstreams9providers10dblib_impl14MessageHandlerEP19tds_dblib_dbprocessiiiPcS4_S4_i_ZN9dbstreams9providers10dblib_impl11switchboard7messageEP19tds_dblib_dbprocessRKNS_8dbstatusE_ZN9dbstreams9providers10dblib_impl12ErrorHandlerEP19tds_dblib_dbprocessiiiPcS4__ZNSs6appendEPKcj_ZNSs6appendERKSs_ZN9dbstreams9providers10dblib_impl11switchboard5errorEP19tds_dblib_dbprocessRKNS_8dbstatusE_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE4findERS3__ZN9dbstreams9providers10dblib_impl11switchboard4openEPNS1_13provider_baseEP18tds_dblib_loginrecRKSstdsdbopen_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11lower_boundERS3__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE13insert_uniqueESt17_Rb_tree_iteratorIS9_RS9_PS9_ERKS9__ZN9dbstreams8dbstatusC1ERKS0__ZN9dbstreams9providers10dblib_impl11switchboard5closeEP19tds_dblib_dbprocess_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5eraseERS3_dbclose_ZN9dbstreams9providers10dblib_impl8datatypeEi_ZN9dbstreams9providers10dblib_impl8desttypeEi_ZN9dbstreams9providers10dblib_impl8desttypeEf_ZN9dbstreams9providers10dblib_impl8desttypeEd_ZN9dbstreams9providers10dblib_impl8desttypeEPKc_ZN9dbstreams9providers10dblib_impl8desttypeEPKv_ZN9dbstreams9providers10dblib_impl7retcodeEi_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_M_eraseEPSt13_Rb_tree_nodeIS9_E_ZTVSt13runtime_error_ZSt6__copyISt15_Deque_iteratorIiRKiPS1_ES0_IiRiPiEET0_T_S9_S8_St26random_access_iterator_tag_ZNSt9exceptionD2Ev_ZNSt22_Rb_tree_base_iterator12_M_decrementEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE9_M_insertEPSt18_Rb_tree_node_baseSH_RKS9__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE13insert_uniqueERKS9__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11upper_boundERS3__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5eraseESt17_Rb_tree_iteratorIS9_RS9_PS9_ESJ__ZNSt22_Rb_tree_base_iterator12_M_incrementEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE14_M_create_nodeERKS9__ZSt18_Rb_tree_rebalancePSt18_Rb_tree_node_baseRS0__ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS0_S1_S1__ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0__ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0__ZN9dbstreams9providers9odbc_impl10sql_c_typeENS_8metadata8datatypeE_ZN9dbstreams9providers9odbc_impl8datatypeEi_ZN9dbstreams9providers9odbc_impl8desttypeEi_ZN9dbstreams9providers9odbc_impl8desttypeEf_ZN9dbstreams9providers9odbc_impl8desttypeEd_ZN9dbstreams9providers9odbc_impl8desttypeEPKc_ZN9dbstreams9providers9odbc_impl8desttypeEPKv_ZN9dbstreams9providers9odbc_impl5prretEs_ZN9dbstreams9providers6sqlite11sqlite_typeENS_8metadata8datatypeE_ZN9dbstreams9providers6sqlite8datatypeEi_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11lower_boundERS1__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE13insert_uniqueESt17_Rb_tree_iteratorIS5_RS5_PS5_ERKS5__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE4findERS1__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_M_eraseEPSt13_Rb_tree_nodeIS5_E_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE9_M_insertEPSt18_Rb_tree_node_baseSD_RKS5__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE13insert_uniqueERKS5__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE14_M_create_nodeERKS5__ZN9dbstreams4findERSt5dequeINS_4cellESaIS1_EERKSs_ZSt4findISt15_Deque_iteratorIN9dbstreams4cellERS2_PS2_ESsET_S6_S6_RKT0_St26random_access_iterator_tag_ZN9dbstreams5query8check_wsclEcisspace_ZN9dbstreams5querylsINS_4cellEEERS0_RKT__ZNSt5dequeIN9dbstreams4cellESaIS1_EE16_M_push_back_auxERKS1__ZN9dbstreams5querylsINS_1pEEERS0_RKT__ZSt7find_ifISt15_Deque_iteratorIN9dbstreams4cellERS2_PS2_ENS1_1pEET_S7_S7_T0_St26random_access_iterator_tag_ZlsRSoRKN9dbstreams1pE_ZNSt11range_errorC1ERKSs_ZNSt11range_errorD1Ev_ZTISt11range_error_ZN9dbstreams5query4modeENS0_7sepmodeESs_ZN9dbstreams5query6fiddleEv_ZN9dbstreams5queryaSERKSs_ZN9dbstreams5query7enquoteERKSs_ZSt8for_eachIN9__gnu_cxx17__normal_iteratorIPKcSsEEN9dbstreams13quoted_stringEET0_T_S8_S7__ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_atexit_ZN9dbstreams4endlERNS_5queryE_ZN9dbstreams5querylsISsEERS0_RKT__ZNSt5dequeIN9dbstreams4cellESaIS1_EE17_M_reallocate_mapEjb_ZNSs6appendEjc_ZNSsC2ERKSs_ZTVSt11range_error_ZTSSt11range_error_ZNSt11range_errorD0Ev_ZNKSt13runtime_error4whatEv_edata__bss_start_end;un ?&3gr0u [5Bh t\%Oh@tAIdnx~yyyz)zH{Y{{n~}~~"ׁф{;vQZ_gnu|tRĩϩݩ!wūͫ&zǰ*<DMo}ʽ7C! hlptx|048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|ptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|048<@DHL0X HpHx HpH Hl,T|<`(T8h4d 0Lh Hp,X4\ <d$T0X 4T(P        <!Y YYYY YDǸ=A\t~{aӽ *P Ӹ I   M h     _   z { "     m 4 ߽ 6 [R޸R RRRRARv n*=1:dڽ>h޾bf.A6Iz :ni|^8K:#`sIrXk0<H*T:dJtZ)~:M7bzOz  &9Bmz1WjbuBU2 E     Re.QNn .ANaRe"5Vi{ |||}}6}I}~~>QrJ],M`ւ >Q J]~…Յ *=̇߇#6ɋŌ6Ii|PcɏבCfy1_ŘZ>Qf¬լ$7Reݸ Yl)zҾ>QrNa*=^qj]p VifyFY"{z9LEՋь%}Jڋ֌*,$?4'Mz{D܌ h0H.HVHJHH H.H2HZHbHHHHH'H<HHHHOHdHHHHHHHHHHHHHHBHfHH HHbHwHH$HHzHH>HYHH4HHHWHfH HH,HHH/HHH H HH(HjH|HHHH$HoHHH H& H8 H,~HD~H\~H~H~HHHǀH4HLHdH|HHHĄH'HH3HKHcH{HHHH H"H7HLHaHvHHHAHH˙HHxH#HHHH-HHHHHHWH-H:HҿHHHHHHHHVHHHH HHHH.HbHHH$HZHHeHɷ""""ݷ<@hp ,PtdML@$(PXC?8\s 73^ `!-H8[y~u1_dm8q5L~+u??ѿ????w|!CHNTGLRXkpv|otz$jpu$D*05C  &,',2838>DCHNTSX^dchntCIN\[aftNTYg    7<EKW\bh&,1=chntotz۾v|J|JJJfJJJJҁJJJ.JGJͶJJeJ:JJJJ}JJUJpwwwwwwwww-wEwqw w>w߈w?wOwgwωw/w?wWwwwKr[KcQfNX.6>Iy ]kxhp|&&4`uFPP^!/<QY$,8Fhv9GTiq<DP^EYow !,4EM 4JRcmu} (1;'/è˨֨ߨ2:BMª#kuɭڭîή׮NV^i ;R{ͼټ<DP^#GQp#1#######1#i#O##g## #####=##U####̪#M###{# ###5#$$b$$$$$$$$$f$$$$$$$$$$7$j$$$E$$ץ$ $$$$$4$v$:$$$$xxx@xJxTx!x+x5xxx#xIxSx]x7xAxKxxxx/x9xCxxxxxxxxx&xxxxxxxxxxQx[xexxxx^xexoxxxxGxQxXxxxx#x-x4xbxlxvx/x9x@x]xgxqxxxxQx[xex/x6x@x4x>xHx*x4x>xxxxV:VbVVV+V'VV}V<VHVVNV^M-uU M&>1o2FR{̸oXRHz&&&&&&&E&&,&9&m&~&&&&&&&&&&&6&&&&&!&*&a&&&;&H&&n&&d&&&-&?&U&p&&&&F&&&&&&&R&ͦ&֦&٫&&&&&& &&K&]&&[[[[[[[hhh8hh`hhhhhh)hhhFhThhh.hrh@hhHhh9hhhh hhhZ]ZZZ6ZNZXZZZ ZZ;Z-ZZ(DnDD,DGD_DD DDyDDLDTXsƤ$x/] 4b--K-^-s-----.-3-F----C-R-b-u--O--X-f- ---#--77TlF] S;GDGlG}GG GGGGGGŻG{GLt(ӻX`44ۻ~&&&&e&}&&S&$&5&&$&&}2h<^H7Rkv\\j\\\)=.!B#[|#|#hGGGGTGG60, 0 2 g||l|A ||5|}}}(((|(((\(p(t( !,^WjW,W,W>>0>0>~4 4 4 W  m   kIkkk =O===:==|=3=ɂ===E==c(( (_((/___+_Z___O _ ~__{___t__f_v___&_UQ}m ZB   ^!=6%S!zQ{.z^{&Ug UUUU !-7jxŒ%I!!-8[[x:!!+8mjjx'yKyѐq̰vճO!)-)88)[)\)x))W!-?8[x !-[\Sp v%s*->//J3J)9JpJJL3[7J72x2=RNR_RhRIFW*i<IIFdFLFL:חi?QPQQ|QA/A l,TTOQQOBO8M    Ȣ c١$ m.o ȳ J/[/p2P}P,6hqBAA`AZ:O?x0},33 d'#6%=^ ^G)bZss(V<VPV|V(V<VPV@I@IDzDzTTXXhW|WPWWWlp;;KKX,,++LLX0H Y{u $yhytyy y(@ Dlp5x`!d!hl4<9B $488b@DEHN(b,0E4NUS[#ZP]Ðt& hhhhUWVS [æYt% C0CCC C,P$e[^_ÃWVUWVS]pH}ظuH҉~6 C0CCC C,Pe[^_ÃWVUS]C  ǃ4C PPCCPDP Cǃ$]ÐD$AD$D$UE @ 4@  PJTJ@@ PÐD$AD$D$US] C 4C CPDPCCC P]]D$AD$D$USPMU XQ,YA tPSjQP8]PjUWVS ]K,΃EzSt6E ЉEEECESCutut tK,}t(C, S$S K(ut tC,EC$ [^1_US]C  ǃ4C PPCCPDP Cǃ$]]D$AD$D$UWVS,M A,]tGpQ A(9Љuv)9Eԍ}r}ԋEЍEPURq Se[^_PS PU fjuuu UÐUWVSu PPP_ZhJPvhQu ‹EHX@D@utQRbQRvR hYu P$vR h]u Pvhdu ‹EHL@D@utQR_ZhpP}QR߉QR&hs q< hxu PPh p8u P‹EH4@D@utQR_ZhtPEQRߐUU EE UUSSE ]wB$hzvS؃]Ãhh܃h҉@D@ut RS붃RS몃h뚉USP} ]t]ÉtuE] hڐUhjÐUhjÐUWVS|E@\XHuظuH҉UBTXHuH҉UBPXHuH҉E EUERXp xUUEUR$$]}uHUUP@ EԉEEE EMU]}uĉEȉM̉UuXue[^_ÃVS`VSVS uFt W WUWVS|E@\XHuظuH҉#UBTXHuH҉UBPXHuH҉E EUERXp xUUEUR$$]}uHUUP@ EԉEEE EMU]}uĉEȉM̉UuXuXue[^_ÃVSWVSVS uFt W WUWVS E p}EEUwU1҅GudG)4PVSWWBBZ FWB FBBe G GU GGe[^_Ð Pƒ뉐 PGtPRG SUSQ]u]ÐPC$PsSCt݃PRːUWVSEUr H Uȉz)I)vDM+Q9M lu u V @ )HM @QN)‰E H)9YA}ȉEЋE @EŰvuU}ԋ} GEUMOM}_UW]U}}x}}lt`dHPT|hp\L8IՋEMȋFUEF QRuuV}E Ee[^_ÍvV BF BFV뤉BB‰h~nvFV) ًi]_OG NMNv | }tvuxv uĉu|$t@(ux,0uċ4Hu| 8DLPTh;EE tFE 9t,;EE uUBEBEVF놉EGEGE녋UBEBEVF뛋UBEBEVFgE,]U, eUBEBEVFUBEBEVFxUBEBEVF:UBEBEVFUWVS } ]9߉s h9re[^_à P VWu SUWVSEUM]} tplhE؋E(u,U܉Mtp]䉽dl}ȉ`}$EЋhUM]}̉uԉEĉd+hU)D+t`}Mu\] U B9EX9xM A|A0\A \$(d`tD$|$L$ \$xplh]t$$|$ D$L$T$$0e[^_Ív‹@ )H9\}GGG \RxP|P@ EMUE$]U M(E,MIwDO T}}M}M$}(DTM}M}M$}( DT8@M}DM}$M$}(,0DThpM}tHM} (4LP2EEEEEEEċM EUEAEAEĉA E09 GUREG OEĉ)]0ÉUM  M0UEEEEUEEĉEGWM M\EEu]؉`UdU}M}M܉EE}ux|UEh\l`pdtUXU\UP8\<`@dDU(U`dHLT,04U \ `dUUU\`dUU$U\`dUUU|MExhlxfjQXhRXPMQptE؋UBE܉B EBEBM}hU ulEM IptxE U @R |Mȉ|UU|ỦUUẺ]ЉEԋ|ỦUU |ỦU(U$,0 48<@H|M̉L)T+u|M)D8҉PHA9(G9؉HhJ~0(HXL\TdEHELEPETE 8E$عƋ)|TATALPHgv4A4A,0($P>~2عƋEčE)EMR͍vMEUplhpU0++lMd2&pE؉hE܉lEU pE䉅txB|BB UBGGG 0D$hD$ L$,D$$pD$(lXxL$ D$hdT$L$\$D$4$E؋UBE܉B EBEBE `U$E(}ȋű]ԉUЉE,\phlt`U$U(\ `U$U( $x|\(,4`8U$عƋ)vE]EM)ȉx |?ȻƋ)MABBB UBBBB U BBB 0D$,E L$(\$$D$E$D$E(D$E,D$ D$D$D$ xD$$XMA\A`A dA$EUEM0U :rR,U Z UUU0,UUU0 ,UUU$0(,0,U8UعƋ)M0)QREH P MquQ S Pd PMA$PQUWVSZE ]ȋXU]̋X@ EԋM4]ЉE1ZBR ]EUĉuYQA MMMMMMMMhlp]UEx|UEtX\`d8<@D(,04HLPT $ fjQRP]SM M,pM؉M䉍MEXMUx\E(M ]u܋}|lU$E0dM(ht`HLM,PM؉M䉍M8Mȉ֙Ë)ٍÐBBxBBǍu vUZH‹@R  $,48HLPT (<@DX\0`dhx|uuuupuEEult}MUE]u+)T)<|HuA9؉EF;|EO~]M̋EE|EBB Z) ډFGF G Wȋ@ YIPM A$PRQu FFF F$B~2ȻËF F )ٍFV͋UBEBEUE|UBEBEUEU| RM uABFBFB F u E8UWVSM1+AU x |1~9؉יƋA A )AQ[^_ÍvȐUWVSM} Q +W +ATG+ۋu~% ;WtR;Ft*K݋UFBFBF B [^_vV BF BFV뺋W BG BGWUWVS Uu B+9w79w&EX )hG9vڍe[^_QjVR뺐 P9s&EP)h2C9r SUVSuVZF$9s"vh3F$9rV9thvFFF FFF FF$e[^ÐUWVS ;5}s/v@6Su;5r1e[^_ËU t!)ڋE >1эL E HFːUSQ} ]t]ÉtuE] hڐUhjÐUhjÐUE UÐUEÉUEU PUEU PUSP];uC]à jK HjhPUSR];uC]à jK HjhPUSQ} ]t]ÉtuE] hڐUhjÐUhjÐUWVS XPE}PhSSjh`xPhXHvuH҉oE EEEEE@1ۋIWQEP} ỦISQRE$ZYEЍxPuEԍXHDžxvuH҉aE̍XHvuH҉EȍXHvuH҉xx }p Pxx$, 0 HP]@ } $(48<@Dx<$e[^_ÃHPSHWSHRSDžqDžqHRSyqËhpHHvuH҉~ SWVà xPFuEԍXHDžxuH҉\E̍XHvuH҉EȍXHvuH҉xx }p Pxx$, 0 HP]@ } $(48<@Dx$X]HPS$HWSHRSփ xR( SUWVS XPEPhVVj*h`xRhXHuH҉ME E]EEۋEEHQPh(SXZS8S1}у IQuSY_SVr1у IQhrVXZV}WhXHuH҉f8XHuH҉(XHuH҉xPuEԍXHDžxuH҉aE̍XHvuH҉EȍXHvuH҉xx }p Pxx$  HP]@ } $x$e[^_ÃHPSHWSHRSXWSXPSXRSHWSq4ËhpHHvuH҉~ SWVË8pHuH҉(pHuH҉EԉHXDžxvuH҉\E̍XHvuH҉EȍXHvuH҉xx }p Pxx$HP @ ]$E  x$X HPS$HWSHRSXRV0XPVËhpHuH҉~@8pHuH҉~XW뀃XRV뫉ËhpHuH҉uXP볉b :à xPF xÉW߃ SUSUREhP] U 9‰ECPhYXCC Ph XC44C88C<<C@@CDDCHHCLZLCPPhPYXCTPhTXCXZXC\Ph\C``1]ÍvBSPUSUREhP] U 9‰ECPhYXCC Ph XC44C88C<<C@@CDDCHHCLZLCPPhPYXCTPhTXCXZXC\Ph\C``1]ÍvBSPRUShM@j1u EtoRUREhP] 9ÉEtC9Es4EEEPURMhQ]]EEȃ EËEC]Eà jdYXhS hhSUWVSP]SEhPUء 9‰EuEQPht]S$XZSVEȍXH}uH҉~PhhVWSShXue[^_É PUWVSÉU/ÉU-ÉUUw $øېUWVS|} ut e[^_ÐuJuՃuą9\XHuH҉ITXHuH҉PXHuH҉x|E E,EEEE $(0Eh ,M]UM]EU$w9\XHuH҉TXHuH҉uPXHuH҉-x E$E(E,EE E$E ( 0Eh ,|]UM]EU$*u[ t>ph@@@ j5 hvEPSEPSvEPS.EPS2EPSEPSUȸu R@hEȍXHuH҉EPSvUȸu R@hEȍXHvuH҉?EPS* h j@@@ à SËEȍpH}uH҉ăWV뵉ËEȍpH}u뽃 ÉhF{ Éh Sj5딐UhjÐUhjÐUWVSEE PEPYM AU[ΉB$ ] } Q +S G$+ATC+G‹E@ $GGG AAA@@@ R Q^]FPUHM@ EĉlFvuxX]dX]hp @utpWOTEG xMUE}t}p}l}hxd|ThxXt\p`ldhHdLT]lptP8uTM ;AMs1J u VRjWSe[^_ VuuRVEWPE؃ ҉R 9Bs봋GtՋB9s΃ VRR륐UWVS u }t#v WXZ^jVۉuލe[^_ÐUWVS`] SEuP^_SEuPUȋE 19‰U؉E܉UEȍ]U}Eu!QWESEuE؉Ee[^_à SF9uʐUE(+EU+U DU+U W VSu,~vE ;EE tPC9t'IދUFBF B z[^_vV BF BFV뻉UBEB‰EEU 둋~UWVSph@@@ j5{s h^ hX j@@@ à Sj5UhjÐUhjÐUE SQҋ]tE9B|ыRu [R 퐐UWVS<} M;P]u9tr EPUUȋ9B}>M ;AM}1J u VRjWSe[^_ VuuRVEWPE؃ ҉R 9B}봋GtՋB9}΃ VRR륐UWVS,E Bu}t9H|/‹@u9ډU؉]tB9},[^_v@ ѐUWVS}؍uȍ]Mu@ E PQRPSYXShVXZhVuEȍXHvuH҉EXHvuH҉~LEXHvuH҉~ Ee[^_WSWS륃WSc}PWh[h$Ív SËEȍpHvuH҉EpHvuH҉~FEpHvuH҉]WVKWV뫃WVi`댐UUBPRÐUS ] h S huPP‹@D@Kut#QRE E]vQRUVSXHuuH҉~e[^ÃVSꐐUWVSdu }uW^$+F)ЃwQjjV^$ hCFt WPN$VAB ABBFFEȅuHEXHuuH҉~e[^_ÃVS P몃 PXZF$hpEȅuHEpH}uH҉~ SWV P몉럐UWVSĀUӋB M +A +SiNk ID] +iNE#EPxtUvuM EEC@EM9MESErE:9ɋx(uE+EoC4M ;t6] x]X MA@EU9]E]ErE:9ɋx(u+EE4M ;tI] x]XMA@EU9]E܉]ErE:9ɋx(u+EE4M ;t] x]XSMA@EU9]Eԉ]؍ErE؋:9ɋx(u+EE4M ;tM]EMp U R )ЉUI)iNk DU |Ut+|iNЃ~t$EHUMBAq E[^_M YۉxM|A@E|9]Ẻ]ЍErEЋ:9ɋu(u+Et%M]U BAtEYA ]E4tU 9ȉ|xX|A@E|9]Eĉ]ȍErEȋ:9ɋx(u+E|4tU 9ȉ|xZ|A@E|9]E]ErE:9ɋx(u+Et%M|U BtAYB |4U ;ttUr JM Q BA BAQ]؋s H|C U9Bh] S BC BCS|t|C U9BE]B CBM Q|t|C U9B]xExVQ BA BAQtDMU ] CBtBC B ]C U9BQ BA BAQt[M랉]C U9BQ BA BAQtEUM ]ACtCA C v]C U9B1Q BA BAQtUM ABtA ZC U9BV] [t UWVS ] u9}t!1'QR@PWC9u߃WuEe[^_UWVS$]u S^_uSe[^_ƋXH}ظuH҉~ VWSUEPÐUWVS]S0K0BM؉E܋BE9K@B EESPh]S$ZYSPEȍXH}vuH҉~PhhVWS P8P8Y _Dž28Pj2PXZFN4FP jFHQP2F  F dž40$F u j@0Y_0PY_u @PXZD}PW<$SEȍxHuH҉ S xHDž8 Dž4Dž@ DžDuH҉~q DPP2FPD2P 2Fdž$e[^_ÃMQWzMQWvǃ Wǃ džP։ǡP 2Fŋ0]Nj SP$X0XZP2FP4 hVS 0뮉NjEȍXHuH҉ XHDž8 Dž4Dž@ DžDvuH҉~; DRP2FPD2EPS볃URSCv9뢐UWVSAB FR.$AB FK.(ԜAB FQ. a.$4,AB FY.$\ AB Fv.)AB E.AB J.̓AB J.$` AB FE., 8"} AB IV.2.I.$<CAB Ah.M.d0AB J.HAB J.,`T AB Iz.2.I.$xAB F^.$D;E AB EF.,$AB Fg.q. f.(TAB FQ. a.$>AB FR.$AB FY.)AB E.AB J.AB J.$0AB Fb. $X|7 AB F.4t# AB IL.m. ..R.,p9 AB Fx.. S. %AB DG.$ k AB FW.4AB K.(T,AB DW.R.|.M.,q AB FJ..I.$UAB F_.$Two AB FG.$W AB Iu.$(x AB FL.$PcAB FP. sS%8n.      E>z  O   H     L    H     L    FJ  O          H#     L    H#     L    (   @      @  Z9u }   B   V   Kpg7@Sn} } }K 8I T_Bla1'F#?GFF GGG GAh])!)@Q  }ME&=  } e ;B Z*=4   )    }"#     }K 8I T_Bla1'8"888 889 8Ah] N*9bJ$Kpg7@Sn}EFL  <  N>Kpg7@Sn}JXm          AbF`n~!5_  ,cEA$  J  PUb       Kpg7@Sn} @ L 5  ̳4U^oI8zh{0Pz{̓H0 .>N^GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)K8cpj?<y !0Ih  #@ [  %H P) K,l d!C!a +^l-d- 7L8# \b4icj0jV wqwLxym9xty˜hz/4̾{Ka CYT5H>V ԜdqNНYc0,Ԟ5 m Ġ)УHHMz`cjy!I#[%^`Ocjy!5Y>I#[Y% )HH = qtUTwcj?y!cI#[%b P)ܮdbstreams::metadata::operator<dbstreams::metadata::operator==>dbstreams::metadata::varylenbdbstreams::cell::make_bindableʳdbstreams::cell::validdbstreams::cell::assignDdbstreams::cell::cell@dbstreams::cell::cellHdbstreams::cell::cell dbstreams::cell::celldbstreams::cell::operator=dbstreams::cell::cellgdbstreams::cell::celldbstreams::cell::operator=dbstreams::cell::cell7dbstreams::cell::celldbstreams::cell::operator=fdbstreams::cell::celldbstreams::cell::celldbstreams::cell::operator=?dbstreams::cell::cell5dbstreams::cell::celldbstreams::cell::operator()*dbstreams::cell::operator=Wdbstreams::cell::operator=dbstreams::cell::celldbstreams::cell::celldbstreams::cell::operator()dbstreams::cell::celldbstreams::cell::celldbstreams::cell::cellddbstreams::cell::cellYdbstreams::cell::celldbstreams::cell::celldbstreams::cell::celldbstreams::cell::celldbstreams::cell::cell?dbstreams::cell::cell}dbstreams::cell::copy_value. dbstreams::cell::operator>> dbstreams::cell::operator>>> dbstreams::cell::operator>>v dbstreams::cell::operator>> dbstreams::cell::operator>> dbstreams::cell::operator>> dbstreams::cell::operator>>\ operator<<operator<<std::domain_error::~domain_errorstd::basic_stringbuf, std::allocator >::~basic_stringbufstd::basic_stringbuf, std::allocator >::~basic_stringbuf+std::basic_stringstream, std::allocator >::~basic_stringstreamvstd::basic_iostream >::~basic_iostreamstd::basic_iostream >::~basic_iostreamstd::basic_stringbuf, std::allocator >::_M_stringbuf_init std::basic_stringbuf, std::allocator >::_M_really_syncIstd::basic_stringstream, std::allocator >::~basic_stringstreamOstd::basic_stringbuf, std::allocator >::str std::basic_string, std::allocator >::basic_stringcstd::basic_stringbuf, std::allocator >::setbufstd::basic_stringbuf, std::allocator >::seekoffbstd::basic_stringbuf, std::allocator >::seekpos std::basic_stringbuf, std::allocator >::underflow std::basic_stringbuf, std::allocator >::pbackfail!std::basic_stringbuf, std::allocator >::overflow"std::domain_error::~domain_error"std::basic_string, std::allocator >::_S_construct$_ZTISt12domain_error]%_ZTISdt%_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE%_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE%_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE%_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE%_ZTSSd&_ZTSSt12domain_error'std::_Swap_lock_struct<0>::_S_swap_lock'__Atomicity_lock<0>::_S_atomicity_lock(std::basic_streambuf >::_S_pback_size-P)Ndbstreams::dbstatus::dbstatusadbstreams::dbstatus::dbstatusdbstreams::dbstatus::dbstatushdbstreams::dbstatus::dbstatusYdbstreams::dbstatus::ignoredbstreams::dbstatus::fetchedkdbstreams::dbstatus::whatdbstreams::dbstatus::reset/dbstreams::dbstatus::operator=dbstreams::dbstatus::operator==dbstreams::dbstatus::operator!=dbstreams::dbstatus::notifyoperator<<Ooperator<<]dbstreams::dbstatus::~dbstatusdbstreams::dbstatus::~dbstatusstd::_Deque_base >::_M_initialize_mapstd::_Deque_base >::~_Deque_base%std::deque >::operator=find, int>std::_Deque_base >::_M_create_nodes3std::deque >::_M_range_insert_aux >fstd::deque >::_M_new_elements_at_backstd::deque >::_M_insert_aux >'__uninitialized_copy_copy, std::_Deque_iterator, std::_Deque_iterator >1__uninitialized_copy_copy, std::_Deque_iterator, std::_Deque_iterator >6std::deque >::_M_reallocate_map<std::_Deque_base >::_M_destroy_nodesB=std::deque >::erase8Hstd::_Deque_iterator::operator+=H__copy, std::_Deque_iterator >Istd::deque >::_M_new_elements_at_frontJstd::deque >::clearK_ZTIN9dbstreams8dbstatusEK_ZTSN9dbstreams8dbstatusELstd::_Swap_lock_struct<0>::_S_swap_lockL__Atomicity_lock<0>::_S_atomicity_lockNstd::basic_streambuf >::_S_pback_size9x$parse_provider_nameU"std::_Swap_lock_struct<0>::_S_swap_lock["__Atomicity_lock<0>::_S_atomicity_lock#$std::basic_streambuf >::_S_pback_size˜"native_typeenative_typedbstreams::providers::urhandle::handledbstreams::providers::urhandle::handle*dbstreams::providers::urhandle::sqlite3Sdbstreams::providers::urhandle::dbproc_ZTIN9dbstreams9providers8urhandleE_ZTSN9dbstreams9providers8urhandleEstd::_Swap_lock_struct<0>::_S_swap_lock__Atomicity_lock<0>::_S_atomicity_lock!std::basic_streambuf >::_S_pback_size̾$MessageHandler(ErrorHandler-dbstreams::providers::dblib_impl::switchboard::messageW0dbstreams::providers::dblib_impl::switchboard::error2dbstreams::providers::dblib_impl::switchboard::open6dbstreams::providers::dblib_impl::switchboard::closes7datatype7desttype7desttype7desttype$8desttypeP8desttype}8retcode@?std::deque >::operator=(Rdbstreams::dbstatus::dbstatusXdbstreams::dbstatus::~dbstatus`Ystd::_Deque_base >::~_Deque_base Zstd::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::find;[std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::lower_bound[std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::insert_unique\]std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_erase^std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::erase`std::_Deque_base >::_M_initialize_mapb__copy, std::_Deque_iterator >cstd::deque >::eraserstd::deque >::_M_range_insert_aux >xstd::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::insert_uniquezstd::_Deque_base >::_M_create_nodes{std::_Deque_iterator::operator+='|std::deque >::_M_new_elements_at_backv}std::deque >::_M_insert_aux >__uninitialized_copy_copy, std::_Deque_iterator, std::_Deque_iterator >;__uninitialized_copy_copy, std::_Deque_iterator, std::_Deque_iterator >std::_Rb_tree_base_iterator::_M_incrementcstd::_Rb_tree_base_iterator::_M_decrementstd::deque >::_M_reallocate_mapstd::_Deque_base >::_M_destroy_nodesKstd::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_insert0std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::upper_boundstd::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::erasestd::deque >::clearstd::deque >::_M_new_elements_at_front__copy, std::_Deque_iterator >_Rb_tree_rebalance|_Rb_tree_rebalance_for_erasestd::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_create_nodeĶ_Rb_tree_rotate_left*_Rb_tree_rotate_right std::_Swap_lock_struct<0>::_S_swap_lock__Atomicity_lock<0>::_S_atomicity_lockںstd::basic_streambuf >::_S_pback_sizeAdbstreams::providers::dblib_impl::switchboard::prior_procsOdbstreams::providers::dblib_impl::switchboard::connections]dbstreams::providers::dblib_impl::switchboard::errkdbstreams::providers::dblib_impl::switchboard::msgMz-sql_c_typedatatypesdesttypedesttypedesttypedesttype#desttypePprret[std::domain_error::~domain_errorwstd::basic_stringbuf, std::allocator >::~basic_stringbufstd::basic_stringbuf, std::allocator >::~basic_stringbufstd::basic_stringstream, std::allocator >::~basic_stringstreamstd::basic_iostream >::~basic_iostream5std::basic_iostream >::~basic_iostreambstd::basic_stringbuf, std::allocator >::_M_really_syncstd::basic_stringstream, std::allocator >::~basic_stringstreamstd::basic_stringbuf, std::allocator >::strostd::basic_string, std::allocator >::basic_stringstd::basic_stringbuf, std::allocator >::setbuf8std::basic_stringbuf, std::allocator >::seekoff!std::basic_stringbuf, std::allocator >::seekposN$std::basic_stringbuf, std::allocator >::underflowj$std::basic_stringbuf, std::allocator >::pbackfail6%std::basic_stringbuf, std::allocator >::overflow5&std::domain_error::~domain_errorQ&std::basic_string, std::allocator >::_S_construct(_ZTISt12domain_error)_ZTISd)_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE.)_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEEP)_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEEw)_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE)_ZTSSd)_ZTSSt12domain_error*std::_Swap_lock_struct<0>::_S_swap_lock*__Atomicity_lock<0>::_S_atomicity_lock,std::basic_streambuf >::_S_pback_size^Tssqlite_type&datatype3std::domain_error::~domain_error3std::basic_stringbuf, std::allocator >::~basic_stringbufO4std::basic_stringbuf, std::allocator >::~basic_stringbuf4std::basic_stringstream, std::allocator >::~basic_stringstream:5std::basic_iostream >::~basic_iostreamn5std::basic_iostream >::~basic_iostream7std::basic_stringbuf, std::allocator >::_M_really_sync8std::basic_stringstream, std::allocator >::~basic_stringstream9std::basic_stringbuf, std::allocator >::str:std::basic_string, std::allocator >::basic_string;std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::lower_bound,<std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::insert_unique=std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::find ?std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::insert_unique6Astd::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_eraseOBstd::basic_stringbuf, std::allocator >::setbufBstd::basic_stringbuf, std::allocator >::seekoffFEstd::basic_stringbuf, std::allocator >::seekposGstd::basic_stringbuf, std::allocator >::underflowGstd::basic_stringbuf, std::allocator >::pbackfailHstd::basic_stringbuf, std::allocator >::overflowIstd::_Rb_tree_base_iterator::_M_decrementJstd::domain_error::~domain_error+Jstd::basic_string, std::allocator >::_S_constructALstd::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_insert~M_Rb_tree_rebalanceNstd::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_create_nodeDO_Rb_tree_rotate_leftO_Rb_tree_rotate_rightUP_ZTISt12domain_error}P_ZTISdP_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEEP_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEEP_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEEP_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE#Q_ZTSSdJQ_ZTSSt12domain_errorcRstd::_Swap_lock_struct<0>::_S_swap_lockiR__Atomicity_lock<0>::_S_atomicity_lock?Tstd::basic_streambuf >::_S_pback_size  U#mfinddbstreams::query::check_ws::operator()#dbstreams::query::operator<< dbstreams::query::operator<< dbstreams::query::modedbstreams::query::fiddledbstreams::query::operator=dbstreams::query::enquoteendloperator<<std::deque >::_M_push_back_auxfind_if, dbstreams::p>for_each<__gnu_cxx::__normal_iterator, std::allocator > >, dbstreams::quoted_string>operator+, std::allocator >]std::range_error::~range_errorNdbstreams::query::operator<< Bfind, std::basic_string, std::allocator > >std::basic_stringbuf, std::allocator >::~basic_stringbuf"std::basic_stringbuf, std::allocator >::~basic_stringbufstd::basic_stringstream, std::allocator >::~basic_stringstream std::basic_iostream >::~basic_iostreamAstd::basic_iostream >::~basic_iostreamustd::basic_stringbuf, std::allocator >::_M_stringbuf_init std::basic_stringbuf, std::allocator >::_M_really_sync std::basic_stringstream, std::allocator >::~basic_stringstream std::basic_stringbuf, std::allocator >::strm std::basic_string, std::allocator >::basic_stringstd::deque >::_M_reallocate_mapZstd::basic_stringbuf, std::allocator >::setbufstd::basic_stringbuf, std::allocator >::seekoff\std::basic_stringbuf, std::allocator >::seekposstd::basic_stringbuf, std::allocator >::underflowstd::basic_stringbuf, std::allocator >::pbackfailstd::basic_stringbuf, std::allocator >::overflowstd::range_error::~range_errorstd::basic_string, std::allocator >::_S_construct_ZTISt11range_errorJ_ZTISda_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEEs_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE_ZTSSd _ZTSSt11range_error!std::_Swap_lock_struct<0>::_S_swap_lock!__Atomicity_lock<0>::_S_atomicity_lock3#std::basic_streambuf >::_S_pback_sizeL)Bp1&+,@,> \-P%qD.b/tint,0E6O:8;3?t+R@_>\ ]> ^._0$\ b h /._0 b h ._0 b NUNEn't*ĺ,U-{!.{\/Wk0{*12iP33/4t5{;xKQLx#-Mt#P$~  h   >5Xj_pkx#_rlt#_wmt#nP# oP#_bfp#qt#;t#u# ]3v.#$wM#(xw#,{#0_up~x#8_urt#<p}#@p#C_lb#Dϛt#L#P$  5  5 t .t   tM  t4lt  l trUS >N >N5,X@1@6$#@tqEttm,KrLt#Mt#fsNt#'EOt# *&Pt#8rQt#8|Rt#_St#Tt# @U#$'V#($  tm  tm <1i2lR3:4 e7t89tS;_tC 6!B ;3D @ED EW!, Ji , O{R: TQ: YP ]3x ^WS _{ `# R\ W| e>. fbZ6 gFP h<7 j>ˮ kb l_Q m^ oN, rP, sW tlP P @|  {ƺ WD h {@ { e {aj { m 8 { 4 ie lWu i$+ it  iQ t5 t 5  "i = 5 6 #$*Z     =    =    N$ = 7 .T  9J 9 # 9 # $,       !q  @ @  @  G  H m UL V#~ Xt#N Y#E $@B H N]   H N  H] Ix   \u ]# f5 #/ i5 #R j #  k@ # l# $CVY _ e  _ e _R J+  *W {88 |#~d }#s $ p v | *W v |*W v K @  y # 5 # @ #DK # E # $`  0    ? LK   ev #a # $u      F M 6 ώ  m #- t# ${  & ώ  ώ  NA  ?  #3 5 #  t# $k   ?  ?  O y$  # 5 # @ #: @ # # # # X$F  py  y $ P? z ҆#B #$QU  ?  ? B Q+  چ# 5 #b @ #') # #ĭ #I #$&  #+  #+ ] R7ns B #uw #$7. 4 :'ns 4 :ns 4 St  T x x kx + + + m    K K K    A A A    )@ 1 2#4 3#$$     EEE<,{ 9 :#& ;#$< B H,,{ B H,{ BNm KV} Lt# Mt#$V  m  m SSSJt c E#K E#"$J P V:t P Vt P\5 c #K #$  5  5 aaa\ hz t#>4 t#g t# t#  t#Y$  q\  \ > U4 Vt#$eW  >  >  " o p#A q#Y$  q"  " "lwp ~ # #$CE  &   & , <H  E#I| _#n # D # #8LN t#< t#@l t#D$x7   <   <  N111~x~pad~#V$  nx  x  N.R+7, .-m 8#@;UH#y<[#N= Z#>g#7V?#@r #t~A5@#(nBK$#eC$eD]$EN^$FF'$ 'GV$H  $<IC8@#RJ#JKqJ$zL&#3O#P#Q#T X#VU#`V%#W#Xv#6Yk 9P$[# ) / ) / )P5Q EVtFv%W0PXwUe=xtTyOxzW*Ж{:$  W0  W0 &U  '8eq7L  'WltL   (|m7Jt l l (d5~ l(Jl l ("K  l (6/   l (+  U(FU\U (att (b=P  )eof8t*4t Ȝ9+W?#+@:#%Ζ<:$o o o  o o(<ζD[: o&YζG o ,mK o,N o  (WP_ o(S^o o (Vͯo o ( 2PZVl o (+#rem?#._2w$   ._2   ._2 wwwJ } Ee@G#remI#._3 W $}   n ._3  ._3     biQ !biNe@Ol#remPl#._4  $! ! ! !._4 ! ! ._4 !  #! |! >T!$s|! ! !l!  ! !  !(!(!!(!7#*8%&#|'#U(#J)# *#+#|,#Q-#.# /#$i<0U#(m<1U#)22U#*33U#+4U#,mi5U#-gC6U#.z7U#/28U#09U#13:U#2ii;U#3cC+$Mf+ l+ r+V+ l+ r+ l+**x+*,1&%}+ɏN#X N#SN#hN#vN#+$:, , ,, , , ,}+}+#,}+,:g%(,ɏN#X N#SN#hN#vN#,$, , ,, , , ,(,(,,(,g-P@%,ɏN#X N#SN#hN#vN#?-$Cg- m- s-W- m- s- m-,,y-,.g%~-ɏN#X N#SN#hN#vN#-$K. . .. . . .~-~-$.~-.%).ɏN#X N#SN#hN#vN#.$. . .. . . .).)..).>/k %>.e N#/$>/ D/ J/./> D/ J/> D/..P/./%>U/eN#/$Pk/ / //> / /> /U/U//U/@0 %>/eN#0$2@0 F0 L000> F0 L0> F0//R0/0d%>W0eN#0$&0 0 00> 0 0> 0W0W00W0B1k%>0eN#1$[B1 H1 N121> H1 N1> H100T101. %>Y1e!N#1${1 1 11> 1 1> 1Y1Y11Y1D25)$%>1e%N#2$D2 J2 P242> J2 P2> J211V212X<(%>[2e)N#2$p.2 2 22> 2 2> 2[2[22[2F3`,%>2e-N#3$F3 L3 R363> L3 R3> L322X323ۖ0%>]3e1N#3$m3 3 33> 3 3> 3]3]33]3H4d4%>3e5N# 4$AH4 N4 T484> N4 T4> N433Z434' 8%>_4e9N#4$4 4 44> 4 4> 4_4_44_4J5D<%>4e=N#"5$JGJ5 P5 V5:5> P5 V5> P544\545MP5$|i5 5 55M 5 5M 5a5a55a5 6R5${~ 6 &6 ,66 &6 ,6 &6552656T.a5#l6$f6 6 66 6 6 676766767G`V.76#6$97 7 76G` 7 7G` 76676|7lX.6#T7$z%|7 7 7l7l 7 7l 777778ei%7_k5/{m/Yo/\q//s7$&8 8 #88 8 #8 877)878S =5oB8#~RE# 3?~8$08 8 88S 8 8,8SG 8 &8U 8*]~ 8~.8.88.8m9o0 wsv%0~8E9$ m9 s9 y9]90~ s9 y90~ s98898.:^i#9$.: 4: ::9^ 4: ::9^ 4:&:*Z 4:&: ěH 4:-&'m  4:99@:9:ci:#,x:c : .:,:c : t1:$ : :2c : :.:E::E:?!tV; %0ј*lkV;%S:.;$!l[; a; g;F;S a; g;S a;:::m;:;h;$[; < <; < <; <(;!l  -!p%S  r;r;<r;=чN34g=4]\4O`*4c~4dZ994}o:%<<!<$= = =<< = =<< =5=ze~ 5-=ida~ 5J=P$ 5l=  =6=! s 7=!  8ɔHx'  ==N!<=<<=<t>'L%>~Ys\V>9{n>$-> > >> > > >>:>>>>|@k1%>M~<~Ys\Vl/|@@{UI?$@ @ @;^? @;x? @ @;? @ t6?.#k @ 6?.#6'l @ 6?! @ >7!@!_' @  6>@um,~ @7a@ƣ( @  <am @ >>@>@lB0}%@M~<~Ys\lBVyB/BB{rB9A$)B B B;NA B;hA B B;A B t6A.#blB B B6A.#YyB B B6A!RlB B >7B!3  B lB 6.Bu~ B7QBƣ  B lB B<a B lBrBBrBBrBBB@@B@B=)C<xB$")C /C 5CB /C 5C;Cy /C>z /C tBB;CB?C!<U@_V=@WCC$iC = CC = C = CUN@CC@CwY?8iDN.>#c#D$vwY }Y Y5DN }Y YNDN }Y tAN }Y  @~F{ 0r3/Z08tra~#~#&:#>D$mZ Z ZE{ Z ZE{ Z(3E6#r +Z(OEa +Z&gEAn Z&EiT Z(E> Z(Ez} Z (E{ Z @ @6FiZ @& F% Z @7>F-ux Z @(ZF6 Z8/E6 Z @ BlZ+BoC#CxC1Z%nNC3qP{rU!>s>t~Yus/vAZwFZ\xVylzKZY'|\D}^J~^DnGV ^DGI ^ 5GdQZ ^5Gf KZ ^5Gy KZ ^EH\ \ ^5'H`KZ ^ 5OHh >KZ ^ ErHd/i  KZ KZEHd3`(  \ \EHd7   EHd;  l lEIi ^ EI}% ^F AE gZ;FInN^ ^,_InN ^ @,xInN ^ ^,InN ^ ^ ,InN ^ ^ @,InN ^ l @,JnN ^ l @,'JnN ^ U @;BJmNc ^ t6dJ$fP^ ^ ^6J$i^ ^ l6J$l5^ ^ U6JfqXnKZ ^6Jfx\ ^GJend|'KZ ^GKend\ ^69Kse^ ^6VKse;^ ^6sK*n^ ^6K*^ ^6K-(d~ ^6Kdry~ ^6Ku&a~ ^7 LZ%o ^ U7(L ^ 6EL~ ^7cL:m ^ 7|L ^6LK ^6Lz} ^ 6Lz} ^ GLatk ^ GMatL0 ^ 6AM^ ^ ^6cM4^ ^ l6M^ ^ U6M;"^ ^ ^6M;#^ ^ ^ 6M;n^ ^ l 6N;(^ ^ l6CN;o^ ^ U7aNwp*Q ^ U(N^ ^ ^6NB^ ^ ^ 6N^ ^ l 6N;^ ^ l6O^ ^ U7FO [; ^ KZ U6mOc^ ^ ^6O,O^ ^ ^ 6O9 ^ ^ l 6O_^ ^ l6P!™^ ^ U6DP(Q KZ ^ KZ U6kP1^ ^ 6P8]KZ ^ KZ6PAKZ ^ KZ KZ6P8J^ ^ ^6Q8^ ^ ^ 6GQ8^lc^ ^ l 6sQ8Vq^ ^ l6Q8Zb^ ^ U6Q8^/^ ^ KZ KZ ^6R8c]^ ^ KZ KZ l 6-R8g^ ^ KZ KZ l6^R8Z^ ^ KZ KZ U6R8wPY^ ^ KZ KZ  6R8|K^ ^ KZ KZ l l6R8ĕ^ ^ KZ KZ KZ KZ6"S89f^ ^ KZ KZ \ \DHSã U @6tS6+~ ^  7S M ^ ^6Sul ^6Sql ^6S> ^6TJб~ ^ l 6~ ^ ^ 6V-j8~ ^ l 6FV-x~ ^ l 6mV-~ ^ U 6Vg~ ^ ^ 6Vg~~ ^ l 6Vg~ ^ l 6Wg2~ ^ U 65Wz%~ ^ ^ 6aWz~ ^ l 6Wz,n~ ^ l 6Wz<~ ^ U 6WM3WC ^ 6Wm;dt ^ ^6$XmF*t ^ ^6ZXmt ^ ^ 6|Xmt ^ l6XmLt ^ l6Xmpvt ^ l ,XvL ^   @5#Y   @5OYI   @ #Hl   @ 76CCYCYA%zY>Y$)Y Y ZYz Y Zz YYY ZY~iDiD&ZiD&Z AZ~N\.D.#I.F#%lKZY.Js/.K\.LZ$  Zl  ;Zl.N ;[l.Q  6"[.Z  6?[8E.]! 6\[.` 6~[.cKZ  t6[~.g 6[~.jCKZ  t6[z}.o  6\.s_  6#\2P.wKZ  6E\.{  6g\ b b(^a9 :: b b(ya ^ bMC _bNa}  b aO@ tDacZ gj P_  b b b |_ blN^b^bQd|_$ +& :#+ d#+Z ~#+ d# Cy gdCM eCO ܴ1eCo} ݬ%eC =5eC D EeC] K`e1c% ˆ a1cz/ Ie aNj|e a R &T a |e td_ dN ddSd)`d edSd edS e %edSe 5edS*e EedS:e UeUeS[edJeke%bke!}ve=f)` IF ~#4 ~q:Ee$ L f fTeid  f fUeid  f8} B~ dedV;fE!7WڪVQfPh!VW1Vgfk!uW@V}fy!WTn8Rl!Xf7!ZYYaY7gVy!| !~n# P! o# F!t# \!:# g$&o n o*gVy n o;NgVy! n o t n7gg%!A n8z/!t ng|! @!# F$!#g$$o *o 0og| *o 0o>|! *ohw!4El!t4}!;Ih$o;o Ao Goahw Ao Go;vhw! Ao;hw! Ao t7hP ! ZZ![A!L0@!kRo\dec!tKRo0Q!qRo\hex!gTRo0:V!r*Ro0R!㬲Ro\oct!&Ro0R!̸Ro0&e!Ro0e!4Ro0!+Ro0F!0kRo0'!;Ro0!ݑRo0<!a[Ro0U!cRo0M!Ro0}!fRo]3!'4Wo]!7,Wo]!̃Wo]!NWo^app!*F\o^ate!,z\o]u!1Զ\o^in!3 \o^out!5o\o]6!70\o^beg!Erao^cur!G _ao^end!Igaod+sI1e!rj#Ip !sj#Irm!t%f#Iey!uQf# I!vQf#IU!n#IB!g#_!IC7!fo# Id!t#`IQ!*o#dIf~!^#h!Q!%f! Qf* !(;fi!CgfP!c o7l!i vo o tE7lf! vo fEQll!: vo5tlw+!#$o vo tEl'!x vo6lE!@1%f |o6lE! %f vo %f6l+ !A%f vo %f6m+ !.%f vo %f %f74m) !E vo %f6Qm4e!%j |o6sm4e!'>j vo t6ms !4j |o6ms !=j vo t6m!Oc3 6mj.![}^ vo b6 nM!f{^ |o6*nJ!pa?b |o[s!wt6^nI$!~zo vo t6n@!Do vo t;n7R! vo t`n8R! vo`n8R! vo oa$!T.o vo ofbo f o t}fnfofgg6ogggMog%fQf;fgf vogN}fo}foooe}"+"0ph#(#&#/^hp#+#0p#@#13p#Y#2lp#X#3npD#vi#4cp##5p##6p#u#7p #]Z#8p#p9#9kp߹#*q #.>p$q q qph q qh q>pooqoq$0VNqG$3cokYYl*Y nq$q q qq q q qqqqqwr&%]_%,&`l4%1Plq$<wr }r rr& }r r*r& }rERr)%? o  U tR%C o  U UqqrqsR%@Xr%BY)cdmycmdycymdcydmr$-s s srR s sR srr!srCtQF%X_s. %YVYviYYYHs΄% 4%Ct#s$YSt Yt _ts΄ Yt _t΄ Yt]%Dets$0jt pt vt tQF pt vt tQF pt8%_s U U U StUN_s_set_s&s&s|t&stf%2%tt$ot t ttf t tf tttttV$uZb&dtY]YBYW,Y;HVCuL'&dY.YRwo&0MP&!w#r<&Y\#&|0&uw0>e&#w0e&Z:w#}W&5#&`#b&O#K& #&T0e&4(w00&Ww0&w0FU&w0L&w0&w0]&°mw0)&w0@&wHw0 &ƊJw0`b&fwv$=[#w )w /wwo )w /wo )w$utCuCu5wCuyj&0MP&w#r<&s#&G0&w0>e&_Dw0e&9w#}W&Ү#&\F#b&##K&#&?0e&w00&qow0&Yw0FU&T/w0L&8Cw]&66w]]&w])&`6w]@& w] & :w]`b& w%Q:wx$y y y yQ y yyQ y)min&{T)max&MHk&M5{&:iMLH&M0&#M &_u[& :w:wy:wC|e{&]MP&^wer<& e&W]&w]>e&}w]e& we}W&e&#Jmeb&$مeK&%e&&]e&(3w]0&)Ew]&*-Aw]FU&+Zw]L&,S2w]&7,w]]&8w])&9κw]@&;3w] &<z{w]`b&=4;w%Qy{$EC| I| O|{Q I| O|{Q I|fmin&Ufmax&/U[Hk&e&Mw]e&NuUwe}W&Oije&U0 eb&VeK&W}e&XN]e&Zsw]0&[w]&\ww]FU&]Mw]L&^ARw]&iyZw]]&j;-w])&kcw]@&m w] &n>w]`b&oQ7w%QZ|#~$e&2<w]e&bwe}W&e&8peb&"eK&e&*]e&6w]0&w]&Fw]FU&4bw]L&w]&w]]&Aw])&Ww]@&w] &U)w]`b&<w%Q~$r{  ׀Q  Q fmin&x>fmax&zp>[Hk&8>[5{&f>[LH&>[0&>[ &<>[&HS>~~~&]MP&Wwer<&ȷe&No ]&w]>e&w]e&ĵwe}W&Qe&zeb&*%eK&e&]e&j@w]0&w]&y w]FU&Cw]L&bw]&3w]]&Rw])&4w]@&7w] &w]`b&cw%Q[$6  #sQ  #Q fmin&#rBfmax&FvrB[Hk&ZArB[5{&qrB[LH&ܞrB[0&rB[ &rB[&JrB)(&]MP&wer<&$e&L]&Ƌw]>e&xw]e& we}W&Ce&ڜeb&=]eK& ;e&;]e&Ӓw]0&Gw]&w]FU&Yw]L&w]& w]]&Gw])& w]@&xw] &/w]`b&{[w%Q.$_  Q  "Q fmin&Pfmax&`gP[Hk&P[5{&P[LH&sP[0&[P[ &y<P[&P..ņ.O)& ]MP& |wer<&5ye&D]&hw]>e&O_w]e&{we}W&u_e&p eb&oOeK&tle& |]e&":w]0&#.w]&$w]FU&%w]L&&Ów]&1w]]&2؛w])&3Gw]@&5Ptw] &6w]`b&7w%Qʆ$5O U [Q U [Q Ufmin&4bfmax&ib[Hk&Vb[5{&)b[LH&)Nb[0&+^b[ &-*/b[&/Dbʆʆaʆ&<]MP&=6dwer<&De&ES ]&F|w]>e&G)w]e&H֚we}W&IOe&OZeb&PڔeK&Q}5e&R]e&Tv w]0&U5w]&Vqw]FU&WNKw]L&Xw]&c{w]]&d*w])&ew]@&gw] &hoSw]`b&iGw%Qf/$   GQ  ZQ fmin&@Q>tfmax&B¢t[Hk&K(t[5{&M_t[LH&[at[0&]0t[ &_t[&atfff&n]MP&oUwer<&v0> e&ws ]&xAWw]>e&yw]e&z:we}W&{e&eb&"eK&[e&]e&w]0&w]&!Bw]FU&2w]L&+}w]&Ϧw]]&&Nw])&w]@&w] &B w]`b&#w%Qˍ$\  Q  Q fmin&r4fmax&t[Hk&}^[5{&"[LH&n=[0&'[ &v[&#&]MP&e8wer<&e&? ]&Hw]>e&aw]e&Zwe}W&e&@Meb&8eK&e&Tq]e&w]0&&w]&w]FU&w]L&Zw]&Gw]]&,w])&8w]@&w] &2w]`b&uw%Qg$H# ) /Q ) /Q )fmin&fmax&~[Hk&[5{&fn[LH&[0&n[ &[&d45`&]MP&Awer<&b` e&sx ]&w]>e&13w]e&{we}W&ye&teb&eK&e&,+]e&9w]0&ww]&nw]FU&tw]L&7w]&jw]]&w])&w$w]@&w] &ow]`b&c0w%Q:$" œ ˓Q œ ˓.Q œfmin&WLfmax&)[Hk&-[5{&{N[LH&ō[0&[ &{[&?s::ѓ:[&]MP&Jwer<& 6D?e& ]&w]>e&]#w]e&)0we}W&Ne&eb&1eK&>e&~]e&Ew]0&_w]&-w]FU&rw]L& {w]&+ w]]&,ΰw])&-aw]@&/Vw] &0hw]`b&1w%Q֓$Ҋ[ a gQ a gʕQ afmin&Cfmax& U[Hk&y[5{&p>[LH&#{[0&%[ &'"[&)X֓֓m֓&6]MP&7Uwer<&>h@e&?"]&@pw]>e&Aw]e&Bwe}W&C,e&Ieb&JeK&Kzee&Lo]e&Nuw]0&Ow]&PTw]FU&Q *w]L&RfBw]&]A{w]]&^%w])&_w]@&a]w] &bw]`b&cgw%Qr;$#  SQ  fQ fmin&:$fmax&<E[Hk&EH[5{&G~[LH&UbV[0&WF[ &Y[&[Drr rB&h]MP&iwer<&pIe&qj]&r+w]>e&sT%w]e&twe}W&ug&{O$gb&|/eK&}e&~&]e&]w]0&Vzw]&Dw]FU&w]L&w]&Hcw]]&w])&cw]@&Ow] &;Iw]`b&џw%Qݚ$V+  Q  Q fmin&l)cfmax&n [Hk&wwh[5{&y([LH&[0&eQ[ &N[&]3D`p&]MP&1wer<&X5e&K]&ptw]>e&<w]e&@we}W&g&$gb&xhK&2h&b4]e&Yw]0&]w]&Уw]FU&w]L&h"w]&w]]&.w])&٫w]@&Lw] &6w]`b&w%Q$WD J PQ J PQ Jfmin&[fmax&b[[Hk&FO[[5{&W[[LH&Y[[0& [[ &V[[&N&[V'&]MP&^wer<&\P@e&2]&lw]>e&ww]e&Ҍwe}W&P9g&gb&,hK&ٗ@h&D]e&Àw]0&fGw]&*uw]FU&w]L&4w]&w]]& +w])& Jw]@& Iw] & Ɖw]`b&?w%Qb3$  KQ  ^Q fmin&әfmax&H[Hk&u[5{&[LH&Y5[0&[ &I[&քbbb w'6'wW3'O$XN  g    >N   ='6'W3'[$5  $=  $=  >N*P '"6'#W3'$q$+  P  P  >N ///V7'dY1[YYנL):X(k (m# 3f(n)#:$ 4 : @RX : @,kX), : .;W( : t8s(Bq :,ţ3(j 5 t  (L(E. 5 ti 2(r 5 t *L(. 5 .FL@8aX*BI*m#3*EPG*F@*GKF2*H_*ItΤ$le k qX k q,X+- k | 8s*j< kA*i  t  L_Es3s~    EP3O   5v 3Z"z 5ӥu 3]n 5)3}A 5(3= 5-3W@ 5KB3; K3Z!UUwUKE-$,VѦA,'YsY$Y- Y=Y^cINTYY:YnVu&,(YFYl^ ,AI,Bt#-,Bt#' ,C#,4^,E E,M^,F E K(n$,GWV E K,],H E t(!,J, E t(ŧJ.,Q | \H6,SӥV E K+:,"t#E,*`#I,+#5,,t# -,-t#L,.#U,Y#g$-b h n- h n- h tD,$1nt yDר,%t h t,-,0 h( P,7}? y C(-,8t y C*n,: QQttyv4,^,hji,itjf,jjd,k[js,lljpv,m>$)y    A,o .#F,e#$-,ft#(,q#,Zu  t(v ,ss (:,tP  (^,um (٪,v   t(~9,wwt , v,y ,"v,z  (C$,{|  ,av,}  t t,v,~  t,v,  [ t,v,  l t t,v,  > t t,v,  t ,v,  ,=v,  [ ,`v,  l t ,v,  > t ($,,  t(Ŭ$,d  ($,M  [($,X1  l(($,q1  q(N ,V  l t(t ,̐  > t($,T  (!,z  (׭!,[  =(!,Z  (!,y  Į(:!,4_  ʮ([!,  Ю*!,C  ֮``[lq>kLVUl4LPmEwnQPocRponMppqpqlqQqʰPrpn pn  prӯpnpn pr p1p<nX+?pbpmpxr" +-pn-/pn -/pys|t|t^^uװWv4װtԔ;ܰwd<~wv9=~w->~x__r@t^^uKv4װu Gv4װu QGv4װyH p-Hz__a-Nz__b-SZHHuW{kl{klz__n~uSv4װk XUl4LPmEwn doRp'ngppqpqlqQqʰPrSgspngjpn gjprv{pnvxpn vxpr {~p1p<nXpbpmpxr߲ pnpn ps4jt4t9^^kb-ζUmIk*жUl4SnoWoVuųv4ų{-,JtEkZ@UUl4Pk-JXQUl4Sm JR|lenJtQ}Dev4~%-T޹Uo9Qr%]p/r?coIRnYfpcpmpxnfpnfppnѵfppqPqPnoPn&p0u:רv4:huT1Iv4T^uNDv4{z__a䉵}Y@u>Fv4Z˵̅G{lG˵{W3GtV;lb1:{l1˵{W31tG2:062:u& v4ųu;v4;~!-jUo9Qr %:p/r?oIRnYpcpmpxnpnppnѵppqPqPnoPn&:<p0}C jv4{jC~X!l_Uo-Wo7VrԷX{ʺpdpnnoSoTnppnpoPnɸ_pӸn_poWr)pn prGѵoQpqRqP}zgnv4:{8,znu4v4ų{,FKuĸŧv4ų{,SĸKu'Jv4TvuFv4z__a@~!`SUo-Wo7VrXopdpnnoSoTnppnpoPnɸ SpӸn SpoWr pn pr ѵoQpqRqPkߺ"rTUl4WmrߺVmesncpprgtoRo$Pn6o@poJlnppnpoSb} Gtv4:{8, nu1BJv4TtԔf1^uVMv4ų{,GVK}C|v4zi|t{5|t~'[UogVoq ozPrb%([p/rL?.XoIRnY1Xpcpmpxn1Rpn1Rppnѵ1RppqPqPnX[oSry&^bp0n'p3rHǽpRnɸǽpӸnǽpoVrǽͽpn ǽʽprѵͽнoQpqRqP}Hgv4:vugnv4ųv~[ !UogVoq ozPrC%,_p/r-?2\oIRnY5\pcpmpxn5Vpn5Vppnѵ5VppqPqPn\_oSrZ&bfp0n'ľ!p3rHľ˾pRnɸ˾pӸn˾poVrؾ˾Ѿpn ˾ξprѵѾԾoQpqRqPkM$DUl4P|itRnM4?p[pek ,`v4 t}av4zf{5t~7kDEUowVo oPrr%Pp/r\?VoIRnYYpcpmpxnYzpnYzppnѵYzppqPqPnoSr&p0n'Ep3rHpRnɸ7pӸn7poVrpn pr%ѵoQpqRqP~kHIUowVo oPr%Tp/r?ZoIRnY]pcpmpxn]~pn]~ppnѵ]~ppqPqPnoSr*&p0n'Ip3rSHpRnɸ;pӸn;poVrpn prѵoQpqRqPkLlUl4P|fRn\gp+p5; ,`v4 }fv4zd[{5t~;lqUoGVoQ[oZPrA%{p/r+?oIRnYpcpmpxnpnppnѵppqPqPnoSrX&p0n'qp3rHpRnɸcpӸncpoVr!pn prѵ!$oQpqRqP~;tyUoGVoQ[oZPr%p/r?oIRnYpcpmpxnpnppnѵppqPqPnoSr&p0n'yp3r!H#pRnɸ#kpӸn#kpoVrv#)pn #&prѵ),oQpqRqPkŬ|Ul4P|d[Rnpp d,`v4 [}?v4zslzlent{5t~5 VUoSoVo(Qo3Pr!%p/r ?oIRnYpcpmpxnpnppnѵppqPqPnoPn&p0~+ X UoSoVo(Qo3Pr%jp/r?poIRnYspcpmpxnspnsppnѵsppqPqPnoPn&p0+%>+e #m$4  >  > +++@D}%ۂ_7{UYs\/@$qE K Q0ۂ K Qۂ KW'}%ۂ\_7{UYs\l/$=  ۂ  ۂ \\\@ri% _k7{mUYos\ql/sx$[        \\\ls4xi%_k7{mUYos\q/s`$ӭ  x   KZKZKZk5( VUl4R|slP|lentS@V15}r@hoWp"rc~@PprPUpppnPUpppr;oE|pYpcr:oDVpNrk?(oIRnY(pcpmpxnpnppnѵppqPqPn_(8pipsn(1pn(.pn (.pr[hoRpr)hoRpnppnpnppnprpnp#r"pn"pn "pr3#.p=r%^"hphr "MpnMhpprOɸhpӸn}prkpprppr (4pnɸ(4pӸn(4ppr(1pn (.pnѵ14oQpqRqPn=Vpp0`1SK.#Iu0'y# %5X0U30P!>0>e=0tT000Cx0ys0$    t  ;?09  t  ;f;j0L  t  ^ ;f~0V5  t 6\0a4 Gstr0itC str0s.  ^5:u0v40vvt5__m09;fLx~\`Z// x// : x t:uDv4x1CK.K#.#%BX*Ue=*tT**3*P*K*8$K  \B  t  ;B*  t  B*  t @u\v4vvtt{m*Ku+v4+vvt0{{m*iuov4ovvtt{{m(j54P1G@.@#+0^C#%%yX0BU30CP!>0F>e=0HtT0I0JG0R@0SC0T~/$F 4 G% 4 f$y 4 t,%0k 4 ;f,%0y 4 ^ ;f'str0C str0p^ 4 ^10 4 ;fU0wt y 4FQ20ot y 4 tq2R.t y 4 t?$0sCy 4  t2zSy 4  gf ;f2gy 4  ;fBF0ty 4 yuZfv4Z{B0k;f4uv4Z{B0;fuţv4oz__n(t!L(%fyO!;%fz__a!;%fz__b!;%fulv4|ouSv4װx__n~5u.v4.uT{:9T{?9Yujv40vvtuZv4vuv4vvtuv4ovvt*G0:v4ZvkWXUl4R|slSk̈Ul4S|sqR}v4zpvԖ>zlent{5t~UoVoQoSoPr%p/n?oIRnYpcpmpxnpnppnѵppqPqPr oWr&',p0Eq|rgpp"r~gxprFxpppnxppprk;oE|pYpcr:oD|pNn?QfoIRnYWfpcpmpxnWfpnWfppnѵWfppqPqPr>oRpr{oRpnppnpn#ppn#prQXpnQXp#rbhpnbhpn bhpr13itp=n^tphro'p3nHpRrɸpӸnpprpn pnѵoQpqRqPrɸ,QpӸn>Apr6\vpprRw|ppr pnɸ pӸn pprpn pnѵ oQpqRqP~UoVoQoSoPr%!p/n?!oIRnY!pcpmpxn!pn!ppnѵ!ppqPqPr58oWr&OTp0bq|r,pp"r%~prcpppnpppr;oE|pYpcr:7CoD|pNn?yoIRnYpcpmpxnpnppnѵppqPqPrfoRpr%oRpnppnpn?Kppn?Kprypnyp#r7pnpn prN3p=n^phr'p3nHpRr ɸpӸnpprpn pnѵoQpqRqPr7ɸTypӸnfiprSpproppr%1pnɸ%1pӸn%1ppr%.pn %+pnѵ.1oQpqRqPkNUl4P|pv>Q|lentSP}rPloVp"r~P_pr_mpppn_mpppr;oE|pYpcr:oD|pNn?&oIRnY&pcpmpxn&pn&ppnѵ&ppqPqPr1loRprloRpnppnpnppnpr[ pn p#r &pn &pn &pr3'2p=r^"fphrɸfpӸnwzprppr.ppr)pnɸ)pӸn)ppr&pn #pnѵ&)oQpqRqP}v4zit{E~UoSo or%$p/n?$oIRnY$pcpmpxnpnppnѵppqPqPr&')p0r),oVr{oPp$n'p3r/HpRnɸpӸnpoVrpn prѵoQpqRqP~tUoSo orx%0p/n?0oIRnY 0pcpmpxn *pn *ppnѵ *ppqPqPr36oVr&6:p0roPp$n'p3rHpRnɸpӸnpoVrDpn prbѵoQpqRqP}v4zf{E~dt UoSo orh% <p/n?<oIRnY<pcpmpxn6pn6ppnѵ6ppqPqPr&?Ap0rADoVroPp$n' p3rHpRnɸpӸnpoVr4pn prRѵoQpqRqP~$t UoSo or(%Hp/n?HoIRnY!Hpcpmpxn!Bpn!Bppnѵ!BppqPqPrAKNoVrX&NRp0rvoPp$n'p3rHpRnɸpӸnpoVrpn prѵoQpqRqPTv4d[tET~$%Uo2So<[oGr%'Xp/n?-XoIRnY0Xpcpmpxn0Rpn0Rppnѵ0RppqPqPr3&[]p0rL]`oVrjoPp$n'%p3rHpRnɸpӸnpoVrpn prѵoQpqRqP~$(5Uo2So<[oGr%7hp/n?=hoIRnY@hpcpmpxn@bpn@bppnѵ@bppqPqPrknoVr &nrp0r)oPp$n'5p3rRHpRnɸ'pӸn'poVrpn prѵoQpqRqP= v4s llen ttE ~8YUoSo oQor%Gxp/ry?GJoIRnYPxpcpmpxnPrpnPrppnѵPrppqPqPr&xzp0rz}oVr6oPp$n'Yp3r_HpRnɸKpӸnKpoVr pn prѵ oQpqRqP~\}UoSo oQor%kp/rD?knoIRnYtpcpmpxntpntppnѵtppqPqPr&p0roVroPp$n' }p3r*H 'pRnɸ'opӸn'opoVr'-pn '*prѵ-0oQpqRqP`v4pv>lenttEw~?UoVoQoSor%p/n?oIRnYpcpmpxnpnppnѵppqPqPro|roPp$r& p00q|rg@pp"r`~@OprObpppnObpppr;oE|pYpcr:oD|pNn?*?oIRnY0?pcpmpxn0?pn0?ppnѵ0?ppqPqProRproRpnppnpnppnpr/*1pn*1p#rr;Apn;Apn ;Apr3BMp=n^@aphr'afp3nHafpRrHɸjpӸnjpprjppn jmpnѵpoQpqRqPrrɸpӸnpr :ppr;@ppr0pnɸpӸnpprpn pnѵoQpqRqP~}UoVoQoSor %p/n?oIRnYpcpmpxnpnppnѵppqPqPr$o|rBoPp$rY&"p0Hq|rXpp"r~Xgprgzpppngzpppr;oE|pYpcr!: oD|pNn?BWoIRnYHWpcpmpxnHWpnHWppnѵHWppqPqPrC/oRproRpnppnpnppnprmBIpnBIp#rSYpnSYpn SYpr3Zep=n^Xyphr'y~p3nHy~pRrɸpӸnppr\pn pnѵoQpqRqPrɸ -pӸnpr8RpprSXpprnpnɸpӸnpprQpn pnѵoQpqRqP v'Ul4S' Vr [^p# Q`msg5|ruoWp"r~uprSpppnppprx;oE|pYpcr:oD|pNn?5JoIRnY;Jpcpmpxn;Jpn;Jppnѵ;JppqPqPr=RoRoQr oRoQroRoQrppnpn p# rppnpn p# n".ppn".pnR\p#Vmsg,|r oWp"r~prpppnpppr;DnoE|pYpcr#:~oD|pNn?oIRnYpcpmpxnpnppnѵppqPqPr oRoQrh oRoQr6 ZoRoQn0<ppn0<pngsppngspnppnprp#r^yphrypnppr!ɸpӸnpr=ppnpprr&ppr?Kpnɸ?KpӸn?Kppr?Hpn ?EpnѵHKoQpqRqPr0 ^phnprL pprv ɸpӸnpr 3Lppr ɸp|pӸnp|ppr pypn pvpnѵy|oQpqRqPu. ٪v4 [-Ul4S6[  n 'p o Rn 'p p n p u dJv4T__silu Nv4T__slu |z__sl9 c0@Ul4P6c9 R=q ׭l@PUl4P6lq R tPjUl4P6t SĮ |l|Ul4Ps| Rʮ :|Ul4Ps RЮL [Ul4PpvL R֮B1kLkUosqScolvV}r oWp"r ~pr& pppnppprK ;IoE|pYpcrk :Y\oD|pNn?oIRnYpcpmpxnpnppnѵppqPqPr~oRoQr]4oRpn ppn pnNZppnNZpr~pn~p#rpnpn pn3p=*s`|ry#XpoRn#/ppn#/pr{Xdppr^yphrypnpprɸpӸnpr!ppr=pprxpnɸxpӸnxpprxpn x~pnѵoQpqRqPr ppnɸMpӸnMppr@MVpn MSpnѵVooQpqRqPQ ku v4oz__f(۰L kUosqQIPElR5yy 4K"."#[$$="  "s   "!  tA 4M  !}sv4v~UoP~UoSr~ɸ$0pӸn$0poWrb$-pn $*pnѵ-0oQpqRqP~+8UoSrɸpӸnpoWrpn pnѵoQpqRqP~v^8UohSnbppn|pp~OUoPn pp~pUoSnpp~7_;UoiQosRnpn pn  puQv4Z__i0~__o0~w C0wn0wG0w-0~pppbpmpbpmppp pppppbpmpppppBpbpmppyyO!Z;fz__a!Z;fz__b!Z;fuJv4t}P3stD3stB3sytR!^;fz__a!^;fz__b!^;fu sv4t*3t!.3~I7<UoASoK oXPeqq}sqWrnQHMobQpmrV\pn V\prbeprymppoholnppnppoQr/QobPpmnpp~^pUohSnBppn0ppuv4pbpm-0~pppppp? y+D9-Hz__a-+z__b-0HHuJI?v4J@~ UoQqPrpnpn pnppuXv4T{g{ Az__a@~ -UoRo oonY-pcpmpxn&pppn&pppp uXtgt A__ae#@u#Ytgt A__a #!7@ucqv4Zz__s0z__n0jpp$p?~#0Uo-o7QoBRnTuoVp$e Ul4Z m{ 2zm2zgfmB2z;fSR2{n2|PG2}R2~}rR"Xppo~rQX`pbpmnQX`pbomRrQehpbpmnQehpbpmg2Su2P2Wz2V2}f 2R2}rC prZ#p-rq8 pBrM )pWnoppo~noRpo~umv4{{ N{dN:o@uv4u8v4uMӥv4ubv4; h  Ul4Z mn2mB2;fR2srt  ppo~iO2Vg2} A2Pn2PG2R2}W2}2RrQ  pbpmnQ  pbomRrQ  pbpmnQ  pbpmr;   pE rU 7 @ p_ r#E H p-r j q  pt n  oRpo~uP v4P ouj v4u -v4u v4Z p pu Fz__c ~   ? Uo Rj!@  Ul4ZVz__c20tR21tP;22S@G23rV!j!K N pt!p!n!~  p!u!a{:9!{?9!u!z__c!"F  Ul4ZVz__c2RtR2StW;2TQ2USG2Vr-"j!  pt!p!b"-2^~Pn  oQoPr"  oWp$n!  p!! !"!!hy~" E UoS $OYH  Umgm AS|__a $76}~__rZWre#$e h p"$p-$n9$e h pJ$pU$p`$r#f$t | pp$p}$p$r#$t u p$p$p$n$u x p$n  pn  ppnѵ  ppqPqP@y9$5ps{5p{5pyf$5[s{5[{5[ 7u$H__p7tQ7tt7u${k{klz__n~u$Ev4Q $$$$\*$.0'%% 17gB%,%cB%!(%o%@T%~2$h$t %UN0%% %UN-f%% %UNE&% &UN١/& &%7 I@[m @J);M_q  9:'<:<M<`<s<<~FuDDF^_"_4_F_X_ ___mbbbbbbbfI6/'t` (UN`ehhhhii0iAiRicitiiiiiiiiij j2jDjVjzjjjj`khKqs$ϜDVzN& &/p1&+,@,> \-P%qD.b/tint,0E6O:8;3?t+R@_>\ ]> ^._0$\ b h /._0 b h ._0 b NUNEn't*<1@i2lR3:4 e7t89tS;tĺ,U-{!.{\/Wk0{*12iP33/4t5{C6!B;3D@EDEW!,Ji ,O{R:TQ:YP]3x^WS_{`#R \W|e>.fbZ6gFPh<7j>ˮkbl_Qm^ oN,rP,sWtiPP@|{ƺWDh{@{e{aj{  $m8{,*54ieiWui$+itVi@Qt #tq t5t 5 "i@= 56@#$*ZP V \0= V \= V PNb=7 . 9J 9# 9#$,     q~~~ G H- UL V#~ Xt#N Y #$@        ] I^ \u ]# fs#/ is#R j#  k~# l #6$CV   N   R Ji*W {88 |#~d } #$    *W  *W  K~ y # s# ~#DK # E #V$`   n   ? L ev #a #$u      F M t ώ  #- t#L ${     d ώ    ώ   N  ?  #3 s#  t# $k      ?    ?   O  y$  # s# ~#: ~# # # € #  $F)  /  5  y /  5 y / $ P 9 ? z ҆#B Ӏ # $QU@  F  L ) ? F  L ? F B QD  +  چ# s#b ~#') # #ĭ #I # $&W  ]  c  + ]  c + ] ] R u ns B #uw #M $7n  t  z e ns t  z ns t  St-- - ii i        $    ;    R  D D i D      ;  8e@ 9t#rem :t#._1  $   ._1   ._1     @$ =e@ > #rem ? #._2$p$   ._2   ._2 $$$ J* Ee@ G#rem I#._3$* 0 6 ._3 0 6 ._3 0<bi QLbi Ne@ Oi#rem Pi#._4L$   ._4   ._4 LLL)  >$s) / 5  / 5  /;*8 % &#| '#U (#J )#  *# +#| ,#Q -# .#  /#$i< 0U#(m< 1U#)2 2U#*3 3U#+ 4U#,mi 5U#-gC 6U#.z 7U#/2 8U#0 9U#13 :U#2ii ;U#3cC 5X j_p kv#_r lt#_w mt# nP#  oP#_bf p# qt#; t # u # ]3 v*#$ wI#( xs#, {#0_up ~v#8_ur t#<p y#@p #C_lb #Dϛ t#L #P$  5  5  t *t  tI t0ht h tnUO >N >N5 tm,KrLt#Mt#fsNt#'EOt# *&Pt#8rQt#8|Rt#_St#Tt# @U #$'V#($   tm  !tm -1 2 #43 #$$- 3 9 3 9 3?,{9 :#&; #$  ,{  ,{ DDD;mKV}Lt#Mt#$V; A G+m A Gm AMtc#K#$  t  t RRRI5cD#KD#!$I O U95 O U5 O[\hzt#>4t#gt# t# t#$  \  \ `` `r>U4Vt#J$eWr x ~b> x ~> x"op#Aq#$   "  " "lwp~##j$CE     """m <H#I|#n# Dm##8LNt#< t#@l t#DE$x7}  ] <   <  }Nx~pad#$  x  x   N.R+u ,.-8#@;UH#y<[#N= Z#>g#7V?#@r #t~A5@#(nBK$#eC$eD]$EN^$FF'$ 'GV$H  $<IC8@#RJ#JKqJ$zL&#3O#P#Q#T X#VU#`V%#W#Xv#6Yk 9Pn$[     PIIIQ EVtŇZ$} " ( Ň " (Ň ".I[_$X  wI  I 3332 9{%ɏ|X }S~hv $^2  8  > "  8  >  8 D  R%I ɏX Shv $       I I  I !+O% ɏX Shv`!$ ! ! !x! ! ! !  ! 3"3 %!ɏX Shv "$J"3" 9" ?"#" 9" ?" 9"!!E"!"k%J"ɏX Shv"$" " "" " " "J"J""J"#S%"ɏX Shva#$# # #y# # # #""#"4$-%#ɏX Shv $$`d4$ :$ @$$$ :$ @$ :$##F$#$S%K$ɏX Shv$$Ww$ $ $$ $ $ $K$K$$K$%~%$ɏX Shvb%$C% % %z% % % %$$%$5&8%%ɏX Shv &$b5& ;& A&%& ;& A& ;&%%G&%&C4%L&ɏX Shv&$M& & && & & &L&L&&L&'1&%&ɏX Shvc'$:' ' '{' ' ' '&&'&6(:g%'ɏX Shv($6( <( B(&( <( B( <(''H('(P@%M(ɏX Shv($C( ( (( ( ( (M(M((M()g%(ɏX Shvd)$K) ) )|) ) ) )(()(7*%)ɏX Shv*$7* =* C*'* =* C* =*))I*)*k %>N*e *$* * **> * *> *N*N**N*9+%>*e+$Pk9+ ?+ E+)+> ?+ E+> ?+**K+*+ %>P+e+$2+ + ++> + +> +P+P++P+;,d%>+e,$&;, A, G,+,> A, G,> A,++M,+,k%>R,e,$[, , ,,> , ,> ,R,R,,R,=-. %>,e!-${=- C- I---> C- I-> C-,,O-,-5)$%>T-e%-$- - --> - -> -T-T--T-?.X<(%>-e).$p.?. E. K./.> E. K.> E.--Q.-.`,%>V.e-.$. . ..> . .> .V.V..V.A/ۖ0%>.e1/$mA/ G/ M/1/> G/ M/> G/..S/./d4%>X/e5/$A/ / //> / /> /X/X//X/C0' 8%>/e90$C0 I0 O030> I0 O0> I0//U0/0D<%>Z0e=0$JG0 0 00> 0 0> 0Z0Z00Z0/1MP1$|i/1 51 ;11M 51 ;1M 5100A101Rr1${~1 1 11 1 1 1F1F11F12T&0#1$f2 2 21 2 2 211 212G`V&1#Z2$92 2 2r2G` 2 2G` 2%2%22%22lX&%2#2$z%2 2 32l 2 3l 222323ei% 3_kF1'{m'Yo'\q'/si3$&3 3 33 3 3 3 3 33 36Fv%W03XwUe=xtTy3Ox6z3W* Ж{*4$7 8 8B4W0 8 8U4W0 8(q4U 8 8)4eq7L8 8 8)4ltL 8 8 8*4m7Jt h h *4d5~ h*5Jh h 8*95"K  h *^56/   h *5  U*5U\U %8*5tt 8*5b=P8 %8 %8+eof8t,4t %87Ȝ9-W?3#-@#%6Ζ<`6$n o ox6 o o*6ζD[ o(6ζG o .6K o.6N o  *6WP_3 o* 7S^n o *A7Vͯn o *b72PZVl6 o *7# 3?~8$08 8 88S 8 8.8SG 8 (8U 8,]~ 8~0808808o9o0 wsv>%0~9G9$ o9 u9 {9_90~ u9 {90~ u999990:^i>#9$0: 6: <:9^ 6: <:9^ 6:(:*Z 6:(: ěH 6:/&'m  6:99B:9:ci:#.z:c : 0:.:c : t1:$ : :2c : :0:G::G:?!tX; %0ј*lkX;%S:0;$!l]; c; i;H;S c; i;S c;:::o;:;h;$[; < <; < <; <*;!l  /!p%S t;t;<t;=чN34g=4]\4O`*4c~4dZ994}o:%<<<$= = =<< = =<< =5=ze~ 5/=ida~ 5L=P$  5n=  =6=! s  7=! 8ɔHx'  ==N#<=<<=<t>'L%>~Ys\ V>9{p>$-> > >> > > >>:>>>>~@k1%>M~<~Ys\Vh/~@@{UK?$@ @ @;`? @;z? @ @;? @ t6?.#k @ 86?.#6'h @ 86@! @ >7#@!_' @  6@@um,~ @7c@ƣ( @  8<am @ 88>>@>@nB0}%@M~<~Ys\nBV{B/BB{tB;A$)B B B;PA B;jA B B;A B t6A.#bnB B B6A.#Y{B B B6A!RnB B >7B!3  B nB 60Bu~ B7SBƣ  B nB B<a B nBtBBtBBtBBB@@B@B=+C<xB$"+C 1C 7CB 1C 7C;Cy 1C>z 1C tBB=CB?C#<U@_V=@WCC$iC = CC = C = CUNBCCBCX?8kDN&>#c#D$vX X X7DN X XPDN X tAN X  @F{ 0r3/pY08tna~#~#&:#>D$muY {Y YE{ {Y YE{ {Y*5E6#r8 Y*QEa8 Y(iEAn {Y(EiT {Y*E> {Y*Ez}8 {Y *E{ {Y @ @6Fi{Y @("F% {Y @7@F-ux {Y @*\F6 {Y8/E6 {Y @ BlpY-BoC#CxCY%nNC3q3{rU!>s>t~Yus/vYwY\xVyhzYY'|[D}^J~^DpGV $^DGI /^ 5GdQ{Y $^5Gf Y $^5Gy Y $^EH\ \ /^5)H`Y $^ 5QHh >Y $^ EtHd/i  Y YEHd3`(  [ [EHd7   EHd;  h hEIi /^ E I}% /^F AE guY;HInN^ /^.aInN /^ @.zInN /^ 5^.InN /^ 5^ .InN /^ 5^ @.InN /^ h @.JnN /^ h @.)JnN /^ U @;DJmNc /^ t6fJ$fP;^ /^ 5^6J$i;^ /^ h6J$l5;^ /^ U6JfqXnY /^6Jfx[ $^GKend|'Y /^GKend[ $^6;Kse^ /^6XKse;^ $^6uK*n^ /^6K*^ $^6K-(d~ $^6Kdry~ $^6Ku&a~ $^7 LZ%o /^ U7*L /^ 6GL~ $^7eL:m /^ 7~L /^6LK8 $^6Lz}8 $^ 6Lz}8 /^ GMatk8 $^ G!MatL08 /^ 6CM;^ /^ 5^6eM4;^ /^ h6M;^ /^ U6M;";^ /^ 5^6M;#;^ /^ 5^ 6M;n;^ /^ h 6N;(;^ /^ h6EN;o;^ /^ U7cNwp*Q /^ U*N;^ /^ 5^6NB;^ /^ 5^ 6N;^ /^ h 6N;;^ /^ h6 O;^ /^ U7HO [; /^ Y U6oOc;^ /^ 5^6O,O;^ /^ 5^ 6O9 ;^ /^ h 6O_;^ /^ h6P!™;^ /^ U6FP(Q Y /^ Y U6mP1;^ /^ 6P8]Y /^ Y6PAY /^ Y Y6P8J;^ /^ 5^6Q8;^ /^ 5^ 6IQ8^lc;^ /^ h 6uQ8Vq;^ /^ h6Q8Zb;^ /^ U6Q8^/;^ /^ Y Y 5^6R8c];^ /^ Y Y h 6/R8g;^ /^ Y Y h6`R8Z;^ /^ Y Y U6R8wPY;^ /^ Y Y  6R8|K;^ /^ Y Y h h6R8ĕ;^ /^ Y Y Y Y6$S89f;^ /^ Y Y [ [DJSã U @6vS6+~ $^  7S M /^ ;^6Suh $^6Sqh $^6S> $^6TJб~ $^ h 6>TJ(~ $^ 5^ 6eTJ:~ $^ h 6TJ"D~ $^ U 6TIL~ $^ 5^ 6TI5~ $^ h 6UI4U~ $^ h 6-UIIR~ $^ U 6TUJC~ $^ 5^ 6UJ\~ $^ h 6UJ&~ $^ h 6UJ1"~ $^ U 6U->~ $^ 5^ 6!V-j8~ $^ h 6HV-x~ $^ h 6oV-~ $^ U 6Vg~ $^ 5^ 6Vg~~ $^ h 6Vg~ $^ h 6Wg2~ $^ U 67Wz%~ $^ 5^ 6cWz~ $^ h 6Wz,n~ $^ h 6Wz<~ $^ U 6WM3WC $^ 6Wm;dt $^ 5^6&XmF*t $^ 5^6\Xmt $^ 5^ 6~Xmt $^ h6XmLt $^ h8mpvt $^ h CCXCYYA%zX>1Y$)YY _Y eYIYz _Y eYz _YXXkYX~kDkDYkDY Y~N88[2D&!#H2F#%lYY2Js/2K\2LZ$  7Zl  ;LZl2N ;fZl2Q  6Z2Z 8 6Z8E2]! 6Z2` 6Z2cY  t6Z~2g 6[~2jCY  t6@[z}2o8  6b[2s_  6[2P2wY  6[2{  6[8 a ua*`9 ::8 a ua*` A^ uaLC _uaMa}  oa YaN@ tD/acZ gj O_  oa ua ua ^ oahNA^{aA^{aP$d^$ -& :#- $d#-Z ~#- 0d# Cy gVdCM fdCO ܴ1vdCo} ݬdC =dC D dC] Kd1eb% ˆ Ya1~bz/ Ie YaMb2  Ya d Mb2  Ya h Mb2  Ya $d 8Mb1  Ya tMc2  Ya d13c$ e Ya dDPc/q L8 YaEtcy  Ya d Ec i Ya d dEc * Ya d KdEc d Ya Kd *d5d * >jd Ya Q &T Ya d t*dY_ @dN KdKdRQd_@d fdKdR[d vdKdRkd dKdR{d dKdRd dKdRd ddRdKdddad}d=ze_ HF ~#4 ~q:E2e$ L ze eSLeid  ze eT`eid  ze8} B~ KddQdUeE!7VڪUePh!VV1Uek!uV@Uey!VTMn8Rl!W f7!ZXXaX7fVy!|!~Mn#P!nn#F!t#\!:# sf$&tn Mn znfVy Mn zn;fVy! Mn nn t Mn7f%!A Mn8z/!t MnWg|!@! #F$! #-g$n n nEg| n n>|! n+hw!4El!t4}!;8g$on n ngw n n;gw! n;gw! n t7 hP ! 8YZ!ZA!L80@!kn[dec!tKn0Q!qn[hex!gTn0:V!r*n0R!㬲n[oct!&n0R!̸n0&e!n0e!4n0!+n0F!0kn0'!;n0!ݑn0<!a[n0U!cn0M!n0}!fn\3!'4n\!7,n\!̃n\!Nn]app!*Fn]ate!,zn\u!1Զn]in!3 n]out!5on\6!70n]beg!Ern]cur!G _n]end!Ignd+sH1e!rFj#Hp !sFj#Hrm!te#Hey!ue# H!ve#HU!Mn#HB!f#^!+8HC7!n# Hd!t#`HQ!n#dHf~!A^#hQ!Ԇe! e* !(ei!CeP!cnn7yk!i n nn tEkf! n eEkl!: n5kw+!#n n tEk'!x n6 lE!@1e n6.lE! e n e6Pl+ !Ae n e6wl+ !.e n e e7l) !E n e6l4e!%Fj n6l4e!'>Fj n t6ls !4Fj n6ms !=Fj n t6/m!Oc38 86Qmj.![}A^ n ua6nmM!f{A^ n6mJ!pa?ua nZs!wt6mI$!~zn n t6m@!Dn n t;m7R! n t_n8R! n_-n8R! n n`$!T.hn n n fahn e hn teSn fn fffnfWgWgnWgeeee nfNene  n66 o6 oe}"+ "0 ]ph#(#&#/^h]p#+#0]p#@#13]p#Y#2l]p#X#3n]pD#vi#4c]p##5]p##6]p#u#7]p #]Z#8]p#p9#9k]p߹#*bp #.>5p$hp np tpMph np tph np>]p-o-ozp-op$0UpG$3bokXXl*X p$p p qp p q ppp qpq&%\_%,&`h4%1Ph`q$<q q qxq& q qq& qEq)%? n  U tQ%C n  U UqqqqprR%@W(r%BX)bdmybmdybymdbydmHr$-pr vr |r`rR vr |rR vrqqrqsQF%Wr. %XVXviXXXH$s΄%4%s#r$Ys s ss΄ s s΄ s\%DsVs$0s s snsQF s ssQF s8%r U U U sUNrrsrrrsrCtf%2%tt$oCt It Ot3tf It Otf ItssUtst&6&tW3&tt$XNt t tt t t t t>N3ZtZttZt\u=&6&\uW3&lu4u$5su yu uLu= yu u= yu lu>NttutuP &"6&#uW3&$vu$+ v v vuP v vP v v>N  uuvuUGv7&cX1[XXנUrvZb'ctX]XBXW,X;HUvL''cX.XRbxo'0MP'!bx#r<'Y\+8#'|+80'ubx0>e'#bx0e'Z:bx#}W'5+8#'`+8#b'O+8#K' +8#'T+80e'4(bx00'Wbx0'bx0FU'gx0L'bx0'bx0]'°mbx0)'bx0@'wHbx0 'ƊJbx0`b'flx:x$=[qx wx }xRxo wx }xo wx8rvGvvvxvzj'0MP'bx#r<'s+8#'G+80'bx0>e'_Dbx0e'9bx#}W'Ү+8#'\F+8#b'#+8#K'+8#'?+80e'bx00'qobx0'Ybx0FU'T/gx0L'8Cbx\'66bx\]'bx\)'`6bx\@' bx\ ' :bx\`b' lx%Qx@z$z z {XzQ z {kzQ z+min'{T8+max'8LHk'8L5{':i8LLH'8L0'#8L '_u8Z' 8xx{x}e{'\MP'^bxdr<' +8d'W+8\'bx\>e'}bx\e' bxd}W'+8d'#Jm+8db'$م+8dK'%+8d'&+8\e'(3bx\0')Ebx\'*-Abx\FU'+Zgx\L',S2bx\'7,bx\]'8bx\)'9κbx\@';3bx\ '<z{bx\`b'=4;lx%Q {|$E} } }|Q } }}Q }emin'Uemax'/UZHk'e'Mbx\e'NuUbxd}W'Oij+8d'U0 +8db'V+8dK'W}+8d'XN+8\e'Zsbx\0'[bx\'\wbx\FU']Mgx\L'^ARbx\'iyZbx\]'j;-bx\)'kcbx\@'m bx\ 'n>bx\`b'oQ7lx%Q}q$e'2<bx\e'bbxd}W'+8d'8p+8db'"+8dK'+8d'*+8\e'6bx\0'bx\'Fbx\FU'4bgx\L'bx\'bx\]'Abx\)'Wbx\@'bx\ 'U)bx\`b'<lx%QD $rɂ ς Ղ%Q ς Ղ8Q ςemin'x>emax'zp>ZHk'8>Z5{'f>ZLH'>Z0'>Z '<>Z'HS>DDۂDe'\MP'Wbxdr<'ȷ+8d'No+8 \'bx\>e'bx\e'ĵbxd}W'Q+8d'z+8db'*%+8dK'+8d'+8\e'j@bx\0'bx\'y bx\FU'Cgx\L'bbx\'3bx\]'Rbx\)'4bx\@'7bx\ 'bx\`b'clx%Q$6e k qQ k qԄQ kemin'#tBemax'FvtBZHk'ZAtBZ5{'qtBZLH'ܞtBZ0'tBZ 'tBZ'JtBw('\MP'bxdr<'$+8d'L+8\'Ƌbx\>e'xbx\e' bxd}W'C+8d'ڜ+8db'=]+8dK' ;+8d';+8\e'Ӓbx\0'Gbx\'bx\FU'Ygx\L'bx\' bx\]'Gbx\)' bx\@'xbx\ '/bx\`b'{[lx%Q|E$_  ]Q  pQ emin'Pemax'`gPZHk'PZ5{'PZLH'sPZ0'[PZ 'y<PZ'P|||)' \MP' |bxdr<'5y+8d'D+8\'hbx\>e'O_bx\e'{bxd}W'u_+8d'p +8db'oO+8dK'tl+8d' |+8\e'":bx\0'#.bx\'$bx\FU'%gx\L'&Óbx\'1bx\]'2؛bx\)'3Gbx\@'5Ptbx\ '6bx\`b'7lx%Q$5  Q   Q emin'4bemax'ibZHk'VbZ5{')bZLH')NbZ0'+^bZ '-*/bZ'/Db9'<\MP'=6dbxdr<'D+8d'ES+8 \'F|bx\>e'G)bx\e'H֚bxd}W'IO+8d'OZ+8db'Pڔ+8dK'Q}5+8d'R+8\e'Tv bx\0'U5bx\'Vqbx\FU'WNKgx\L'Xbx\'c{bx\]'d*bx\)'ebx\@'gbx\ 'hoSbx\`b'iGlx%Q}$ 9 ? EQ ? EQ ?emin'@Q>temax'B¢tZHk'K(tZ5{'M_tZLH'[atZ0']0tZ '_tZ'atKՏ'n\MP'oUbxdr<'v0>+8 d'ws+8 \'xAWbx\>e'ybx\e'z:bxd}W'{+8d'+8db'"+8dK'[+8d'+8\e'bx\0'bx\'!Bbx\FU'2gx\L'+}bx\'Ϧbx\]'&Nbx\)'bx\@'bx\ 'B bx\`b'#lx%QP$\Տ ۏ 1Q ۏ DQ ۏemin'r4emax'tZHk'}^Z5{'"ZLH'n=Z0''Z 'vZ'PPPq'\MP'e8bxdr<'+8d'?+8 \'Hbx\>e'abx\e'Zbxd}W'+8d'@M+8db'8+8dK'+8d'Tq+8\e'bx\0'&bx\'bx\FU'gx\L'Zbx\'Gbx\]',bx\)'8bx\@'bx\ '2bx\`b'ulx%Q$Hq w }͑Q w }Q wemin' emax'~ ZHk' Z5{'fn ZLH' Z0'n Z ' Z'd4  `'\MP'Abxdr<'b`+8 d'sx+8 \'bx\>e'13bx\e'{bxd}W'y+8d't+8db'+8dK'+8d',++8\e'9bx\0'wbx\'nbx\FU'tgx\L'7bx\'jbx\]'bx\)'w$bx\@'bx\ 'obx\`b'c0lx%QQ$"   iQ  |Q emin'WLemax')ZHk'-Z5{'{NZLH'ōZ0'Z '{Z'?s'\MP'Jbxdr<' 6D+8?d' +8\'bx\>e']#bx\e')0bxd}W'N+8d'+8db'1+8dK'>+8d'~+8\e'Ebx\0'_bx\'-bx\FU'rgx\L' {bx\'+ bx\]',ΰbx\)'-abx\@'/Vbx\ '0hbx\`b'1lx%Q$$Ҋ  Q  Q emin'Cemax' UZHk'yZ5{'p>ZLH'#{Z0'%Z ''"Z')X$$$E'6\MP'7Ubxdr<'>h+8@d'?"+8\'@pbx\>e'Abx\e'Bbxd}W'C,+8d'I+8db'J+8dK'Kze+8d'Lo+8\e'Nubx\0'Obx\'PTbx\FU'Q *gx\L'RfBbx\']A{bx\]'^%bx\)'_bx\@'a]bx\ 'bbx\`b'cglx%Q$#E K QQ K QQ Kemin':$emax'<EZHk'EHZ5{'G~ZLH'UbVZ0'WFZ 'YZ'[DWB'h\MP'ibxdr<'pI+8d'qj+8\'r+bx\>e'sT%bx\e'tbxd}W'u+8f'{O$+8fb'|/+8dK'}+8d'~+8&\e']bx\0'Vzbx\'Dbx\FU'gx\L'bx\'Hcbx\]'bx\)'cbx\@'Obx\ ';Ibx\`b'џlx%Q\+$V+  CQ  VQ emin'l)ctemax'n tZHk'wwhtZ5{'y(tZLH'tZ0'eQtZ 'NtZ']t\\\`p'\MP'1bxdr<'X+85d'K+8\'ptbx\>e'<bx\e'@bxd}W'+8f'$+8fb'x+8gK'2+8g'b+84\e'Ybx\0']bx\'Уbx\FU'gx\L'h"bx\'bx\]'.bx\)'٫bx\@'Lbx\ '6bx\`b'lx%QϞ$W  Q  Q emin'luemax'bluZHk'FOluZ5{'WluZLH'YluZ0' luZ 'VluZ'N&lu/''\MP'^bxdr<'\P+8@d'2+8\'lbx\>e'wbx\e'Ҍbxd}W'P9+8f'+8fb',+8gK'ٗ+8@g'+8D\e'Àbx\0'fGbx\'*ubx\FU'gx\L'4bx\'bx\]' +bx\)' Jbx\@' Ibx\ ' Ɖbx\`b'?lx%Qs$/ 5 ;Q 5 ;Q 5emin'әvemax'HvZHk'uvZ5{'vZLH'Y5vZ0'vZ 'IvZ'քvAK:X(k(m8#3f(n#$ * 0 6X 0 6.̢X), 0 $;W( 0 t8s(Bq8 0,L(E$  t$FPP<PK8ahX*BH*m8#3*E3G*F*GAF2*H/*It$l5 ; AأX ; A.X+- ; L 88s*j<8 ;K/J9pYKKGKA,84-X,:#-,<8#%R$7  "Ȥ  ".,?  -1>(,C2  e = = *C,F  h e t*i;,I   e*;,Lv  t e 8*>,Ot *ѥ ,Rt  t*,UD * k,X8 3)$fd,[$t .>,]  t*d+,`Fj  h t*,cFj   t*,g3   e e*ۦ,k3   e*LF,nt ,,qFj ^RR(R(i)d-Un-XX3XX&#-ζ-I#--# -t#4 - h#8-!h#<-#t#@-$t#D/-%t#H'-&t#L-(V`#P:-)V`#T-*t#Xmsg-,V`#\8-.#`N-h$) J ) J D#-8I `.) J P.٨)  J h t Pj(-29 J t(7l J I t 8*;-6x8 `)Wbad-78 `*sQ-88 `)eof-9u8 `*2-:I `*̩@-<I J I*-=I J I*$-?+) J t*/$[) J P*K-B  `*g-C8 `*-D8 ` I*9-E8 ` I*ʪb8 ` t*9h8 ` t* n  ` ()-K J t*J0V J *f-M# `*-Oy8 Jk]Ah9 `*«-U J,G J Ihƿv\bx%h!>$@$  X   $3%h$/    Ȭ *! L!{(!V /!M G}%$M~<~Ys\V/gl{t$?q w ر;ϭ w; w ر; w t6&.# } =6H.# } %86o!p w >7!r w 6u~ }7Үƣ w %8<a) w v\bx%!>Hd$N T Z| T Z TH,%$ P V \ٯ V \ V*! L!(4!I /!? `Y.^Hi.#H.~#%e!>.$.hi.߰$  DZ  DZ6.Z$ ұ;..  ر5Lo. EkJ.  5.߻  Q.  teeͱeͱޱ$r.eT.s#+.t#.u#.v# %).fY'.g_.j2{.kt\.l/.mK.n~Y.os.p.q$[P V \L0.h~.).y V .).{ V.).} V \*6.= g*R8E. g*n.yP V*. V t*~.)P V*̳~.G V t*.P V t*2P.b g t*/. P V t*P.$.Y'.$̸ Ҹ ظm Ҹ ظ;3m. Ҹ ر ;Mm. Ҹ ر;hl. Ҹ tE. Ҹ EF. Ҹ Q." Ҹ mm޸m(.~&m#%\.m{.t\.V..Y'.D.J./...~Y.s!>.$.F0.~;׹.  ر;.  %8 ر;.  ;/.  ;J.  t*k$/F  7. z  %86."$ 6Ⱥf.* 6f.1 Gend.8 Gend.?? 6<se.Fb 6Yse.M 6v*.U 6*.]P 6-.bK~ 6ͻu.f~ 7.t9  %87.  6+K.V8 6Mz}.F=  6oz}.;%8  E.,  Gat.=  Gмat.%8  6.= 6 .R%8 6'.= 6D.%8 7b&.  %87wp.'  %87.S{ 7c.f *ؽ/ZM  %87.A  %8*!/o  *G/  7e.u  (}/ 1/   %8E.]5  %8E޾/:  %8Ec/g  %8E/ E1(/? 1Y/  %859/  %8E9/)  %85Ϳ.  5.  E}/  E./  EM-.D  El.1  Q4/  8+8/=%80_@%}A3$0 6 < } 6 <} 6B}%ۂG_2{Ys\/$  ۂ  ۂ GGGp^%ɏX Shvk$     .0%$. 4 : 4 :  4860 E E @Kb=%8$$ޱhhh.}%ۂ_~2{tYs\/.$`3 9 ?ۂ 9 ?ۂ 9=E9VV`l{m4{nmsgJPo[ 4UpeWpoSq prq3 jrr#r/qF pPVq`rjrtsFpPqpRsrrrsrsrrsr&r1t<PtGPqApRsrrrsrsrrsr&r1t<PtGPqSAsr]srAsr|rqAGrsADrsG_p&Qr1t<RtGPqCSsr]srsr|rqsyrssvrsyp&Qr1t<RtGPqrqqr)r3sr)r3sDr[sr)r3sr)r3lm4u__a. رl<m4<u__a.Av.~Ҹرl[m4[Vlzm4z رl3Im4/^lPDm4wn__aX@l@Fm4{Yx̅GwlGwW3GtX;ySlb1:wl1wW31tzG2:z062:lr)Jm4m+8lFm4n__a͒@lGm4$^lSGm4l/m4m+8{1w1w131t1l?m4[n__x.}?\{a21s o[4UpeWpoSq[^prqbrr#r/q`birjrtqFilpPVsFlopPq"pRs"rrrsrsrrsr&r1t<PtGPq"ApRs%Arrrs%Ars%Arrs%Ar&r1t<PtGPqSr]srr|rqtrsrsp&Qr1t<RtGPqSr]srr|rqrsrsp&Qr1t<RtGPq<rq{0qbr)r3sr)r3sD39r[s39r)r3sKTr)r3lm4{w  hw tnmsg PohUpWpPpPpSqJprqrr#r/qFpPVq`rjrtsFpPq>AvpRsDvrrrsDfrsDfrrsDfr&r1t<PtGPqvpRsyrrrsyrsyrrsyr&r1t<PtGPqFSr]srr|rqrsrsp&Qr1t<RtGPqSNr]srNr|rq!rsrs!;p&Qr1t<RtGPqONrq#Nq Nir)r3silr)r3sDr[sr)r3sr)r3o0UpWpPpPpSqprq$ frr#r/q` rjrtq FpPVsFpPqpRsrrrsrsrrsr&r1t<PtGPq2pRsrrrsrsrrsr&r1t<PtGPqS=or]sr=or|rq=Crs=@rsC[p&Qr1t<RtGPq4Sor]sror|rq oursorrsup&Qr1t<RtGPqrqqwr)r3sr)r3sDr[sr)r3sr)r3%8aA@%}A39$pa g mQ} g m} gs1@%}xA3$h  }  } xxx}%ۂ_~2{tYs\/e$  }ۂ  ۂ %8=}%ۂ_2{tYs\/=$(B H N-ۂ H Nۂ H=T|)0MU}4{~0 | P}U}4{Q~ζ7IR~87tP~Q78Sq fir*r4s@t}rJrTs t}r*r4l@̩m4{wζ-=Il`m4{wζ-e 3$  >  > d*hy>U~y-tS~-t l]٨m4{m+8o>,UpHsS>vr]sr>vr|pVq>Drs>ArqDGp&Qr1t<RtGPo>k UpHsSr]srr|pVqlrsrqp&Qr1t<RtGP|hl d!U}4<W.~ .~V^.S.Vq~  rrqI  rrs  r)t4Rqg@  pJRrTq@  pJRpTPq`%!(!rjptRpPs+!-!rrD90n__a0n__b0pYlkm4zu__n.~l@n__n~zR毱l`qm4[wm.Ưlm4zu__p.u__n.~ln__pn__n~lMm4<m+8o%d!!UpSq `!!rjptRpPs!!rr|^J! +U}4__x/F z-/GpYq^!"rhss!"p}p}q^1""rhss1""p}pVq""r)r3q6""pps""rs""r%r/qe"#r s"#r%r/q###r)r3q3G#%p~p ~r$q}##r)r3q6##pI~pU~rmq $$r)r3qt$$p~p~rqNU$m$r)r3ss$$p}p}r(t Qs$$r.r:q$$p)Vr3qQD%J%r[qkL%O%ruqO%Q%rqa%j%rso%%p)Rr3qQ@%%rJpTPqo%%rpP& +/N}q&&rrq&&rs&&r%r/t~s"&$&pWrtQq&)p}p~qP&&rs&&r%r/ql&@'r)r3s@')p~p ~r$qm''r)r3q6''pI~pU~rmq'(r)r3q2(Z(p~prs?(Z(r)r3q[l(o(pp}r`t Qs{((r.r:q((p)Wr3qQ((r[qk((ruq((rs((rq3)*rBpX}pd}qA)S)r)r3qpn))r sn))r%r/s})*rp~p~rq))r)r3s+*I*r)r3q@**rJpTPq **rpP* +t&SqA**s**rs**rpPlsm4o.Asu__x.Au__y.A\\0Vv0Vv0VvG0V0\360Av0Av0AvG0A 30B3`0*v0*v0*vG0* 30,t0.70 v0 v0 vG0  0w0틴w0틴wG0 280s__n0sG.Asu__x.AGu__y.ALlfڵm4flm4;lm4glRm4[l1m4;wm.Ưlm4fn__n.sz06.l3m4;n__n.sz.sz.s}.m4viO.v.v.e.3.m4viO.v.v. 3.2~O.T~wd.T~}.3 +j-U~3ˋ ~3ˋ~W33},203sSqp+7+r.p:VqQL+O+r[qkW+f+ruqQf+i+r[qkq++ruqQ++r[qk++ruqQ++r[q(k++ruq?Q,,r[qVk$,/,ruqmQ/,2,r[qk6,A,ruqQA,D,r[qkH,t,rusS,n,rpPq,,rpPq,,rpPq&,,rpPqD--rpPqb$-?-rpPsH-c-rpP%8|l--U}4<^.W.S.Vs--rs--rt'Pl.m4zl3Ȭn__n~zR浱ܼ/\-7U}4iO/ // 10__n/~q-.pXpHqB.K.ppr s\.b.r.r:q%..p)Rr3fR/e3/|qR//rr%t1Ps?j//pIWrSt^}qm/p/p)Rr3sp/s/r)p3Pqj//p|}p}q0J0r)r3qJ0d2p}p}rqF}00r)r3qj00p}p}q0 1r)r3q 11p~p ~r$qC1[1r)r3s6[1g1pI~pU~rmq 11r)r3qM11pprs11r)r3s2d2pHpXrt Qs$2*2r.r:sN2Q2p)Wr3qQ22r[qk22ruq22rq22rq-22r)r3qK@2 3rJpTPs3.3rpPe37,/qe33rr sz33p%Rr/t:q}33p)Qr3s33r)r3sF33rPrZq7j33p|pqS33r)r3q64o6pHpXrqK4x4r)r3qx44p~p~q44r)r3s4o6p~p ~r$q5;5r)r3q>6;5M5pI}pU}rmqZ55r)r3q56p}p}rq56r)r3s66p}p}rt QsL6Q6r.r:q66r)r3qQ66r[q6k66ruqM66rqd66rq66r)r3q@ 707rJpTPs<7b7rpP6psw6pw6p6[sw6[w6[ 2l?Ϳm4u__n.~Z.~ljm4n__n.sz06.7mw7mw7mwG7m7nta7o 7Lw7Lw7LwG7L lm4u__n.~Z.~lF/m4n__n.sz06.lfm4[n__n.s|J7L8U}4S/~ /~__i/~VqJ77rTr^q77rs77rt'P__j/~Ssk8/8rurs88rrlk.m4v.~lLm4zu__p.ln__pn__n~/rTL8 \U}4iO/r /r/r __n/r~0/sg/t~qPs[88rpWq^88rhss88p{r(,/wX/xHq<8D9rr s9D9r%r/t:Hq 99p)Sr3s9!9r)r3sF9!9rPrZqXD9J9r)r3q?P9S9rIrSt^sP9S9r)r3qa9c9r)r3sa9c9rrtS@tV X^/~q?9D:rIrSt^q=99r)r3qx9:r)r3s9:rrtSptVq=D:=qD:_:r)r3q_:b:r)r3qb:k:r)r3s :=rL q::r)r3q6::r)r3qR::r)r3qR :(;q:;r)r3s;(;r)r3qX;m;r)r3qf m;;r qm;;r)r3q;;r)r3q;;r)r3s ;;r!qL;;r)r3s;;r)r3q!<-<r)r3q4!-<f<rk!q-<Z<r)r3sZ<c<r)r3qx<<r)r3q<<r)r3q!<<r)r3s<<p)Pr3qe R 2=?qj2=A=r)r3qA=C=r)r3q==r)r3q8  = >r q==r)r3q==r)r3q ==r)r3s = >r!s= >r)r3qT >>r)r3qp x>>r)r3q 4!>>rk!q >>r)r3q >>r)r3q >>r)r3sq!>>r!s>>r)r3q" ?;?r)r3q> ;?R?r)r3t!RssR?T?rrq| ??rq ??rq ??rq ?@r)r3qx @}@p|p|sT@}@r%r/t:|q% T@u@r)r3su@}@r)r3sFu@}@rPrZsu@}@rpRtS tVs@?Cp|p |r$q A#Ar)r3q 6YAeApI|pU{rmq AAr)r3q8 ABp{p{rqT +B1Br)r3s[B?Cp{p{rq BBr)r3 t QsBBr.r:q Q CCr[q kCCruq CCrs-C:Cr/{s?CtCp{p{s?CtCp{p {r$s6?CtCpI|pU|rms?CtCp|p|rs?CtCp|p{rs?CtCr)r3q@tCCrJpTPq=CCrpPqb!CCsCCrq@CCrJpTPq@0DTDrJpTPq@dDDrJpTPq!DDsDDrq@DDrJpTPqY!E Er!p!Rs!E Er"r "r"sE ErrtQk t&Vq]EEp)Qr3qEEp)Sr3qEEr)r3qFFr)r3q4G@Gr)r3qGGr)r3q3H Hr)r3qO~HHr)r3y8t QsHHr.r:qQHHr[qkHHruqHHrqIIrq@IWp)Qr3q2>W[Wp)Sr3qWEZp{p{qqXXXr)r3qXYp{p {r$qXXr)r3s6XYpI{pU|rmq8YAYr)r3qaAYYp|p|rq;YYr)r3sYYp|p|rq} ZZr)r3t QsZZr.r:qQhZpZr[qkpZsZruqsZyZrqZZrqZZr)r3q:@ZZrJpTPsZ[rpPqz!J[O[sJ[O[rs@T[_[rJpTPl̳m4[n__n.sz.sz.s 7mw7mw7mwG7m7nta7oR 7Lw7Lw7LwG7L  0Vv0Vv0VvG0V0\3 ,0Av0Av0AvG0A 30B34!40*v0*v0*vG0* 30,t0.q!0 v0 v0 vG0  !20w0w0wG0 280s__n0s{!j6n__i6!n__n6t{"h6n__i6"n__n6t 2f"0v0v0vG003"0v0v0vG0 303"0v0v0vG0 30#0v0v0vG00l_#Fv0v0vG0#0sv0sv0svG0s 2__n0tsl#m4['I7w7wW7wG7苴w7苴wG7z7%)$r)r3:$r)r3K$r)r3rL c$r)r3t$r)r3$r)r3$r)r3$r)r3$r)r3r $r)r3$r)r3$r)r3r! %r)r3%r)r3.%r)r3rk!F%r)r3W%r)r3h%r)r3t%r'%r)r3%r)r3r)r35'r|r%r)r3rrr%r)r3rr &r)r3rr r$+&r)r3rIrUrmM&r)r3rrro&r)r3rrr&r)r3&r'!' &r.r:r&r&r['rurrrrrJrTrr)r3H'r)r3Y'r)r3r[q'r)r3r)r3'2 '\'g2 'o\-# \bUp#pp#rp#p#$p#qt$Xq*\ _q+(\D\r)r3qG(D\O\r)r3qc([\]\r)r3q( \\rL q(\\r)r3q(\\r)r3sR \\s\\r)r3q(]]r)r3q)&]V]r)r3q[) V]]r qB)V]]r)r3s]]r)r3qw)]]r)r3q)]]r)r3s ] _r!q)]^r)r3q)^F^r)r3q(*4!F^^rk!q*F^v^r)r3sv^^r)r3qD*^^r)r3qb*^^p)Qr3q~*^^r)r3q*^^p)Rr3s^^p)Pr3q,j _ap||p|q*_3_r)r3q +3_?_p|p|rq<+__r)r3q+_`p|p|q{+_`r)r3s``p|p |r$q+e`w`r)r3q',6w``pI{pU{rmq,``r)r3s``p{p{rqC,a+ar)r3q,+aaap{p{rsXaaar)r3 t Qsaar.r:q,Qaar[q,kaaruq,aarq-aarq#-b"br)r3qA-@,bPbrJpTPs\bbrpP17w7苴wW7苴wG7w7wG7z7s[kkrp}qC>^klrhssklrrGB,/}q/A""l oq>l)lr)r3q>)l2lr)r3q>GlSlr)r3q ?f"hllr"q>hlqlr)r3sqllr)r3q)?llr)r3q?"l"mr"q[?llr)r3qw?llr)r3q?lmr)r3s"m"msm"mr)r3q?[mmr)r3q?mmr)r3q@0#mmq@mmr)r3q;@mmr)r3qW@mmr)r3s_#mmr#smmr)r3q@?nWnr)r3q@Wncnr)r3t#Vq@nnrs#nnr#qAnnrs#nnr#sn or)r3qlA? oorIrSt^}s oor)r3qA4oAor)r3s4oAorrtQAtSqAoosoor)r3qAoor)r3q.BDoor[soor)r3s+p7pr)r3qB?pprIrSt^}qBppr)r3sppr)r3spprrtQtSqB!q qsq qrqC@qqrJpTPq6C!PqYqsPqYqrqTC@^qiqrJpTPqrC@qqrJpTPqC@qqrJpTPGrv/}q9FR rtqCrrr)r3qCr;rr)r3qDPr\rr)r3qBD rrr srrr)r3q^Drrr)r3qzDr sr)r3qD  s]sr!qD s!sr)r3qD!s-sr)r3s-s]sr)r3qE4!ssrk!sssr)r3q,Essr)r3qHEssr)r3qwEq!ssr!sssr)r3qEstr)r3qEt#tr)r3Ft!WqEsAtetrrqE~ttrq Fttrsttrsttp)Wr3qFtur%r/t:}q{Ft up)Vr3s uur)r3sF uurPrZs uurpRtQq^GiuuqFiuur)r3qGuur)r3qEGDuur[suur)r3suur)r3G9v|vtSqG!?vDvs?vDvrs@IvQvrJpTPqG@|vvrJpTPs@vvrJpTPsvvr)r3.Hs.8n__x..Hn__y.3H\\oH wwUpQpRtStVqH!KwTwsKwTwrs@YwawrJpTPoIq!wLxUp!wp!qp!vp!gIt!SqIswwrrq%Iwwrq5 8 >5 8x y x y  x y xx y  xY "BR 2BR,,D,5 ,?tm, Kr Lx# Mx#fs Nx#'E Ox# *& Px#8r Qx#8| Rx#_ Sx# Tx# @ U#$' V#($? E K 0tm E K!tm ETTQT 1 2#4 3#$$     VVVM,{ 9 :#& ;#%$M S Y=,{ S Y,{ S_m KV} Lx# Mx#$V  m  m ddd[t c V#K V#3$[ a gKt a gt am5 c #K #$  5  5 rrr\ hz x#>4 x#g x# x#  x#j$  \  \  >U4Vx#$eW   >  > "op#Aq#j$  "  " "lwp"""+~##$CE+ 1 7 1 7 1= <HV#I|#n# D##8LNx#< x#@l x#D$x7  " <  " <  RBB(Bx~pad#g$  x  x  y R---+n ,.-$8#@;UH$#y<[$#N= Z$#>g$#7V?$#@r$ #t~A5$@#(nBK$$#eC$$eD]$$EN^$$FF'$$ 'GV$$H $ $<IC8$@#RJ$#JKq$J$zL&$#3O$#P$#Q$#T X$#VU$#`V%$#W$#Xv$#6Yk$ 9T$[) / 5 / 5 /T;Q EVxFv%W0VXwYe=xxTyOxzW*Ж{@$  W0  W0 &U  '>eq7L  ']ltL   (m7Jx   (d5w (J  ("K   ( 6/    (1  Y(LU\Y (gtx (b=P  )eof8x*4x Ȝ9+W?#+@@#%Ζ<@$n o o& o o(BζD[@ o&_ζG o ,sK o,N o  (WP_ o(S^n o (Vͯn o (2PZVl o (1#rem?#._2}$   ._2   ._2 }} }J  Ee@G#remI#._3 ] $   t ._3  ._3     biQ !biNe@OW#remPW#._4  $! ! #! !._4 ! #! ._4 !  )! ! >Z!$s! ! !r!  ! !  !.!.!!.!=#*8%&#|'#U(#J)# *#+#|,#Q-#.# /#$i<0Y#(m<1Y#)22Y#*33Y#+4Y#,mi5Y#-gC6Y#.z7Y#/28Y#09Y#13:Y#2ii;Y#3cC.e T#/$D/ J/ P/4/> J/ P/> J/..V/./%>[/eT#/$Pk/ / //> / /> /[/[//[/F0 %>/eT#0$2F0 L0 R060> L0 R0> L0//X0/0d%>]0eT#0$&0 0 00> 0 0> 0]0]00]0H1k%>0eT# 1$[H1 N1 T181> N1 T1> N100Z101. %>_1e!T#1${1 1 11> 1 1> 1_1_11_1J25)$%>1e%T#"2$J2 P2 V2:2> P2 V2> P211\212X<(%>a2e)T#2$p.2 2 22> 2 2> 2a2a22a2L3`,%>2e-T#$3$L3 R3 X3<3> R3 X3> R322^323ۖ0%>c3e1T#3$m3 3 33> 3 3> 3c3c33c3N4d4%>3e5T#&4$AN4 T4 Z4>4> T4 Z4> T433`434' 8%>e4e9T#4$4 4 44> 4 4> 4e4e44e4P5D<%>4e=T#(5$JGP5 V5 \5@5> V5 \5> V544b545MP5$|i5 5 55M 5 5M 5g5g55g5&6R5${~&6 ,6 266 ,6 26 ,6558656T.g5#r6$f6 6 66 6 6 6=6=66=67G`V.=6#6$97 7 76G` 7 7G` 766 767lX.6#Z7$z%7 7 7r7l 7 7l 7%7%77%78ei%7_k5/{m/Yo/\q//s7$&8 #8 )8 8 #8 )8 #877/878S =5oB8#~RE# 3?w8$08 8 88S 8 8,8SG 8 &8U 8*]w 8w4848948s9o0 wsv%0~9K9$ s9 y9 9c90~ y9 90~ y999994:^i#9$4: :: @:9^ :: @:9^ ::&:*Z ::&: ěH ::-&'m  ::99F:9:ci:#,~:c : 4:,:c : x1:$ : :2c : :4:K::K:?!x\; %0ј*lk\;%S:4;$!la; g; m;L;S g; m;S g;:::s;:<h;$[< < <; < <; <(;!l y  -!p%S y x;x;<x;=чN34g=4]\4O`*4cw4dZ994}o:%<<<$= = =<< = =<< =5=zew 53=idaw 5P=P$y  5r=  >6=! sy  7=! y 8ɔHx'y  y ==R'<=<<=<x>'L%>wY \y V>9{t>$-> > >> > > >>:>>>>@k1%>M~<wY \V/@@{YO?$@ @ @;d? @;~? @ @;? @ x6?.#k @ 6?.#6' @ 6@! @ >7'@!_' @  6D@um,w @7g@ƣ( @  <am @ >>@>@rB0}%@M~<wY \rBVB/BB{xB?A$)B B B;TA B;nA B B;A B x6A.#brB B B6A.#YB B B6A!RrB B >7B!3  B rB 64Buw B7WBƣ  B rB B<a B rBxBBxBBxBBB@@B@B=/C<xB$"/C 5C ;CC 5C ;C;Cy 5C>z 5C xBBACB?C'<U@_V=@WCC$iC = CC = C = CYRFCCFCX?8oDN.>#c##D$vX X X;DN X XTDN X xAN X  @F{ 0r3/tY08taw#w#&:#>D$myY Y Y E{ Y YE{ Y(9E6#r Y(UEa Y&mEAn Y&EiT Y(E> Y(Ez} Y (E{ Y @ @6 FiY @&&F% Y @7DF-ux Y @(`F6 Y8/E6 Y @ BltY+BoC#CxCY%nNC3qV{rY!>s>twYu /vYwY\xVyzYY'|[D}^J~"^DtGV (^DGI 3^ 5GdQY (^5Gf Y (^5Gy Y (^E H\ \ 3^5-H`Y (^ 5UHh >Y (^ ExHd/i  Y YEHd3`(  [ [EHd7   EHd;   E Ii 3^ E$I}% 3^F AE gyY;LInN^ 3^,eInN 3^ @,~InN 3^ 9^,InN 3^ 9^ ,InN 3^ 9^ @,InN 3^  @, JnN 3^  @,-JnN 3^ Y @;HJmNc 3^ x6jJ$fP?^ 3^ 9^6J$i?^ 3^ 6J$l5?^ 3^ Y6JfqXnY 3^6Jfx[ (^GKend|'Y 3^G"Kend[ (^6?Kse"^ 3^6\Kse;^ (^6yK*n"^ 3^6K*^ (^6K-(dw (^6Kdryw (^6Ku&aw (^7LZ%o 3^ Y7.L 3^ 6KLw (^7iL:m 3^ 7L 3^6LK (^6Lz} (^ 6Lz} 3^ GMatk (^ G%MatL0 3^ 6GM?^ 3^ 9^6iM4?^ 3^ 6M?^ 3^ Y6M;"?^ 3^ 9^6M;#?^ 3^ 9^ 6N;n?^ 3^  6"N;(?^ 3^ 6IN;o?^ 3^ Y7gNwp*Q 3^ Y(N?^ 3^ 9^6NB?^ 3^ 9^ 6N?^ 3^  6N;?^ 3^ 6$O?^ 3^ Y7LO [; 3^ Y Y6sOc?^ 3^ 9^6O,O?^ 3^ 9^ 6O9 ?^ 3^  6O_?^ 3^ 6#P!™?^ 3^ Y6JP(Q Y 3^ Y Y6qP1?^ 3^ 6P8]Y 3^ Y6PAY 3^ Y Y6P8J?^ 3^ 9^6Q8?^ 3^ 9^ 6MQ8^lc?^ 3^  6yQ8Vq?^ 3^ 6Q8Zb?^ 3^ Y6Q8^/?^ 3^ Y Y 9^6R8c]?^ 3^ Y Y  63R8g?^ 3^ Y Y 6dR8Z?^ 3^ Y Y Y6R8wPY?^ 3^ Y Y  6R8|K?^ 3^ Y Y  6R8ĕ?^ 3^ Y Y Y Y6(S89f?^ 3^ Y Y [ [DNSã Y @6zS6+w (^  7S M 3^ ?^6Su (^6Sq (^6S> (^6TJбw (^  6BTJ(w (^ 9^ 6iTJ:w (^  6TJ"Dw (^ Y 6TILw (^ 9^ 6TI5w (^  6 UI4Uw (^  61UIIRw (^ Y 6XUJCw (^ 9^ 6UJ\w (^  6UJ&w (^  6UJ1"w (^ Y 6U->w (^ 9^ 6%V-j8w (^  6LV-xw (^  6sV-w (^ Y 6Vgw (^ 9^ 6Vg~w (^  6Vgw (^  6Wg2w (^ Y 6;Wz%w (^ 9^ 6gWzw (^  6Wz,nw (^  6Wz<w (^ Y 6WM3WC (^ 6Wm;dx (^ 9^6*XmF*x (^ 9^6`Xmx (^ 9^ 6Xmx (^ 6XmLx (^ 8mpvx (^  CCXC]YA%zX>5Y$)]Y cY iYMYz cY iYz cYXXoYXwoDoDYoDY YwR[6D.#H6F#%lYY6J /6K5\6L#Z$: @ F;Zl @ F;PZl6N @;jZl6Q @ Q6Z6Z  \6Z8E6]! \6Z6`: @6Z6cY @ x6[~6g: @6"[~6jCY @ x6D[z}6o \ b6f[6s_: @ b6[2P6wY \ b6[6{: @ b6[ a ya(`9 :: a ya(` E^ yaLC _yaM a}  sa ]aN@ tD3acZ gj O_  sa ya ya ^ saRE^aE^aP(d^$ +& :#+ (d#+Z w#+ 4d# Cy gZdCM jdCO ܴ1zdCo} ݬdC =dC D dC] Kd1ib% ˆ ]a1bz/ Ie ]aMb2  ]a d Mb2  ]a  Mb2  ]a (d Mb1  ]a xMc2  ]a d17c$ e ]a dDTc/q L ]aExcy  ]a d Ec i ]a d dEc * ]a d OdEc d ]a Od .d5d * >jd ]a Q &T ]a d x.d]_ DdR OdOdRUd_Dd jdOdR_d zdOdRod dOdRd dOdRd dOdRd ddRdOdddad}d=~e_ HF w#4 ~q:E6e$ L ~e eSPeid  ~e eTdeid  ~e8} Bw OddUdUeE!7VڪUePh!VV1Uek!uV@Uey!VTQn8Rl!Wf7!ZXXaX7fVy!|!~Qn#P!rn#F!x#\!:# wf$&xn Qn ~nfVy Qn ~n;fVy! Qn rn x Qn7f%!A Qn8z/!x Qn[g|!@!y #F$!#1g$n n nIg| n n>|! n/hw!4El!x4}!;g$on n ngw n n;gw! n;gw! n x7hP ! YZ!ZA!L0@!kn[dec!tKn0Q!qn[hex!gTn0:V!r*n0R!㬲n[oct!&n0R!̸n0&e!n0e!4n0!+n0F!0kn0'!;n0!ݑn0<!a[n0U!cn0M!n0}!fn\3!'4n\!7,n\!̃n\!Nn]app!*Fn]ate!,zn\u!1Զn]in!3 n]out!5on\6!70n]beg!Ern]cur!G _n]end!Ignd+ H1e!rJj#Hp !sJj#Hrm!te#Hey!ue# H!ve#HU!Qn#HB!f#^!HC7!n# Hd!x#`HQ!n#dHf~!E^#hQ!Ԋe! e* !(ei!CeP!crn7}k!i n rn xEkf! n eEkl!: n5kw+!#n n xEk'!x n6lE!@1e n62lE! e n e6Tl+ !Ae n e6{l+ !.e n e e7l) !E n e6l4e!%Jj n6l4e!'>Jj n x6ls !4Jj n6ms !=Jj n x63m!Oc3 6Umj.![}E^ n ya6rmM!f{E^ n6mJ!pa?ya nZs!wx6mI$!~zn n x6m@!Dn n x;n7R! n x_n8R! n_1n8R! n n`$!T.ln n nfaln e ln xeWnfnfffnf[g[gn[geeee nfReney nooe}"+y "0y aph#(#&#/^hap#+#0ap#@#13ap#Y#2lap#X#3napD#vi#4cap##5ap##6ap#u#7ap #]Z#8ap#p9#9kap߹#*fp #.B9p$lp rp xpQph rp xph rpBap1o1o~p1op$0UpG$3bokXXl*X p$p q qp q q qpp qpq&%\_%,&`4%1Pdq$<q q q|q& q qq& qEq)%? n  Y xQ%C n  Y YqqqqtrR%@W,r%BX)bdmybmdybymdbydmLr$-tr zr rdrR zr rR zrqqrqsQF%Wr. %XVXviXXXH(s΄%4%s#s$Ys s ss΄ s s΄ s\%DsZs$0s s srsQF s ssQF s8%r Y Y Y sYRrrsrrrsrGtf%2%xt$oGt Mt St7tf Mt Stf MtssYtst&6&tW3&tt$XNt t tt t t t tBR3^t^tt^t`u=&6&`uW3&pu8u$5wu }u uPu= }u u= }u puBRttutuP &"6&#uW3&$vu$+v v vuP v vP v vBR  uu!vuUKv7&cX1[XXנUvvZb'ctX]XBXW,X;HUvL''cX.XRfxo'0MP'!fx#r<'Y\#'|0'ufx0>e'#fx0e'Z:fx#}W'5#'`#b'O#K' #'T0e'4(fx00'Wfx0'fx0FU'kx0L'fx0'fx0]'°mfx0)'fx0@'wHfx0 'ƊJfx0`b'fpx>x$=[ux {x xVxo {x xo {xvvKvvvxvzj'0MP'fx#r<'s#'G0'fx0>e'_Dfx0e'9fx#}W'Ү#'\F#b'##K'#'?0e'fx00'qofx0'Yfx0FU'T/kx0L'8Cfx\'66fx\]'fx\)'`6fx\@' fx\ ' :fx\`b' px%QxDz$z z {\zQ z {ozQ z)min'{T)max'LHk'L5{':iLLH'L0'#L '_uZ' xx {x}e{'\MP'^fxdr<' d'W\'fx\>e'}fx\e' fxd}W'd'#Jmdb'$مdK'%d'&\e'(3fx\0')Efx\'*-Afx\FU'+Zkx\L',S2fx\'7,fx\]'8fx\)'9κfx\@';3fx\ '<z{fx\`b'=4;px%Q{|$E} } }|Q } }}Q }emin'Yemax'/YZHk'e'Mfx\e'NuUfxd}W'Oijd'U0 db'VdK'W}d'XN\e'Zsfx\0'[fx\'\wfx\FU']Mkx\L'^ARfx\'iyZfx\]'j;-fx\)'kcfx\@'m fx\ 'n>fx\`b'oQ7px%Q}u$e'2<fx\e'bfxd}W'd'8pdb'"dK'd'*\e'6fx\0'fx\'Ffx\FU'4bkx\L'fx\'fx\]'Afx\)'Wfx\@'fx\ 'U)fx\`b'<px%QH$r͂ ӂ ق)Q ӂ ق<Q ӂemin'xBemax'zpBZHk'8BZ5{'fBZLH'BZ0'BZ '<BZ'HSBHH߂Hi'\MP'Wfxdr<'ȷd'No \'fx\>e'fx\e'ĵfxd}W'Qd'zdb'*%dK'd'\e'j@fx\0'fx\'y fx\FU'Ckx\L'bfx\'3fx\]'Rfx\)'4fx\@'7fx\ 'fx\`b'cpx%Q$6i o uńQ o u؄Q oemin'#xBemax'FvxBZHk'ZAxBZ5{'qxBZLH'ܞxBZ0'xBZ 'xBZ'JxB{('\MP'fxdr<'$d'L\'Ƌfx\>e'xfx\e' fxd}W'Cd'ڜdb'=]dK' ;d';\e'Ӓfx\0'Gfx\'fx\FU'Ykx\L'fx\' fx\]'Gfx\)' fx\@'xfx\ '/fx\`b'{[px%QI$_  aQ  tQ emin'Temax'`gTZHk'TZ5{'TZLH'sTZ0'[TZ 'y<TZ'T)' \MP' |fxdr<'5yd'D\'hfx\>e'O_fx\e'{fxd}W'u_d'p db'oOdK'tld' |\e'":fx\0'#.fx\'$fx\FU'%kx\L'&Ófx\'1fx\]'2؛fx\)'3Gfx\@'5Ptfx\ '6fx\`b'7px%Q$5  Q  Q emin'4femax'ifZHk'VfZ5{')fZLH')NfZ0'+^fZ '-*/fZ'/Df='<\MP'=6dfxdr<'Dd'ES \'F|fx\>e'G)fx\e'H֚fxd}W'IOd'OZdb'PڔdK'Q}5d'R\e'Tv fx\0'U5fx\'Vqfx\FU'WNKkx\L'Xfx\'c{fx\]'d*fx\)'efx\@'gfx\ 'hoSfx\`b'iGpx%Q$ = C IQ C IQ Cemin'@Q>xemax'B¢xZHk'K(xZ5{'M_xZLH'[axZ0']0xZ '_xZ'axOُ'n\MP'oUfxdr<'v0> d'ws \'xAWfx\>e'yfx\e'z:fxd}W'{d'db'"dK'[d'\e'fx\0'fx\'!Bfx\FU'2kx\L'+}fx\'Ϧfx\]'&Nfx\)'fx\@'fx\ 'B fx\`b'#px%QT$\ُ ߏ 5Q ߏ HQ ߏemin'r4emax'tZHk'}^Z5{'"ZLH'n=Z0''Z 'vZ'TTTu'\MP'e8fxdr<'d'? \'Hfx\>e'afx\e'Zfxd}W'd'@Mdb'8dK'd'Tq\e'fx\0'&fx\'fx\FU'kx\L'Zfx\'Gfx\]',fx\)'8fx\@'fx\ '2fx\`b'upx%Q$Hu { ёQ { Q {emin'emax'~ZHk'Z5{'fnZLH'Z0'nZ 'Z'd4`'\MP'Afxdr<'b` d'sx \'fx\>e'13fx\e'{fxd}W'yd'tdb'dK'd',+\e'9fx\0'wfx\'nfx\FU'tkx\L'7fx\'jfx\]'fx\)'w$fx\@'fx\ 'ofx\`b'c0px%QU$"  mQ  Q emin'WLemax')ZHk'-Z5{'{NZLH'ōZ0'Z '{Z'?s#'\MP'Jfxdr<' 6D?d' \'fx\>e']#fx\e')0fxd}W'Nd'db'1dK'>d'~\e'Efx\0'_fx\'-fx\FU'rkx\L' {fx\'+ fx\]',ΰfx\)'-afx\@'/Vfx\ '0hfx\`b'1px%Q($Ҋ   Q  Q emin'Cemax' UZHk'yZ5{'p>ZLH'#{Z0'%Z ''"Z')X(((I'6\MP'7Ufxdr<'>h@d'?"\'@pfx\>e'Afx\e'Bfxd}W'C,d'Idb'JdK'Kzed'Lo\e'Nufx\0'Ofx\'PTfx\FU'Q *kx\L'RfBfx\']A{fx\]'^%fx\)'_fx\@'a]fx\ 'bfx\`b'cgpx%Qė$#I O UQ O UQ Oemin':$emax'<EZHk'EHZ5{'G~ZLH'UbVZ0'WFZ 'YZ'[Dėė[ėB'h\MP'ifxdr<'pId'qj\'r+fx\>e'sT%fx\e'tfxd}W'uf'{O$fb'|/dK'}d'~&\e']fx\0'Vzfx\'Dfx\FU'kx\L'fx\'Hcfx\]'fx\)'cfx\@'Ofx\ ';Ifx\`b'џpx%Q`/$V+  GQ  ZQ emin'l)ctemax'n tZHk'wwhtZ5{'y(tZLH'tZ0'eQtZ 'NtZ']t````p'\MP'1fxdr<'X5d'K\'ptfx\>e'<fx\e'@fxd}W'f'$fb'xgK'2g'b4\e'Yfx\0']fx\'Уfx\FU'kx\L'h"fx\'fx\]'.fx\)'٫fx\@'Lfx\ '6fx\`b'px%QӞ$W  Q  Q emin'puemax'bpuZHk'FOpuZ5{'WpuZLH'YpuZ0' puZ 'VpuZ'N&pu3''\MP'^fxdr<'\P@d'2\'lfx\>e'wfx\e'Ҍfxd}W'P9f'fb',gK'ٗ@g'D\e'Àfx\0'fGfx\'*ufx\FU'kx\L'4fx\'fx\]' +fx\)' Jfx\@' Ifx\ ' Ɖfx\`b'?px%Qw$3 9 ?Q 9 ?Q 9emin'әvemax'HvZHk'uvZ5{'vZLH'Y5vZ0'vZ 'IvZ'քvEK:hX(k(m#3f(n#$   X  ,̢X),  ;W(  x8s(Bq JTTTK8ahX*BH*m#3*EVG*F*G$F2*H*Ix$l  $X  $,٣X+-  / 8s*j< KJItY..*.$,84I+X,:#+,<#%5$7    ,Ϥ,?  1&,C2  e > > (&,F   e x(L;,I  e(w;,Lv  x e (>,Ox ( ,Rx  x(Х,UD (k,X 'fd,[$x ,!,]  x(G+,`Jj   x(m,cJj   x(,g   e e(,k   e(ڦLF,nx *,qJj A55 5ä KH)i-XX3XXЧƿv\fx%HЧ!>$U [ a [ a [3%Ч$/Q W ] W ]0 W(K! L!{&x!V  -!M UG}%M~<wY \V/C H {x"$?M  S  @;7 S ;Q S  @;l S  x6.# Y  >6.# Y  6ש!p S  >7!r S   6uw Y 7:ƣ S   <a) S  HHgHv\fx%l!>̪$  «  « ,%)$   ľA  ľT (o! L!&!I  -!? llȫlY.^Hi.#H.w#%ͫ!>..Чi.G$# ) /_ ) /6|.Z :;. ) @5o. )EӬJ. ) 5.߻ ) Q. )  xͫͫ5ͫ5Fr.eT.s#+.t#.u#.v# %)K.fKY'.g_.j%7{.kx\.l/.m.nwY.o .p.qK&$[  IJL0.hw,U).y   ,i).{ ,).}  IJ(.> ϲ(8E. ϲ(֮.y (.K  x(~.) (4~.GK  x(U.  x(v2P.bK ϲ x(.   x( ϲ x-B.K  %.eT.s#+.t#.u#.v# %).fKY'.g_.j%7{.kx\.l/.m.nwY.o .p.qΰ$  )  L0.hw,).y   ,)).{ ,B).}  IJ(^. (z8E.= (. (.  x(ӱ~.` (~.  x(.-  x(62P.  x(W.  x(xKKʲKʲ4s(..ͫ#H.K#HD.K#%mղ\.ͫ!>..KY'.d$4 : @|m : @;m. : @ ;m. : @;гl. : xE. : EF. :  Q." :  ղղFղ(.~.ղ#%K\.ղ{.x\.V..KY'.D.J./.. .wY. !>..F0.w;?.  @;c.   @;}.  ;.  ;.  x(ӵ$/F"  7. z  6." (60f.*K 6Mf.1 (Gjend.8K Gend.?? (6se.Fb 6se.M (6޶*.U 6*.]P (6-.bKw (65u.fw (7X.t9  7v.  6K.V (6z}.F>  6׷z}.; ( E., ( Gat.>  G8at. ( 6U.> 6r.R (6.> 6. (7ʸ&.  7wp.'  7.S{ 7c.f (@/ZMK  K 7h.A  K (/oK  K(/K  K K7͹.u  "&/ 1/   E'.]5  EF/:  Eec/g  E/ E(/? 1/  K 59/K  K E9/)  K 55.K  5X.K  Ew}/  E/  E-.D  EԻ.1  Q4/  />KKK_@%}.A#p$  }  } ...C}%ۂ_%7{Y \/C$N T Z3ۂ T Zۂ TH`p^%eɏT#X T#ST#hT#vT#ӽ$     ee e0%H$  `  s 860 ʾU1XXU 51XX1XX?2ED2Bc2G?#52H#X E K,v2J E ? ,2M E(s2N V(ǿ$2Pg\ E ($2V!\ E K( 2XV V K(*P2ZF> V K-z2[b E Q Q 7i%b_k%7{mYo \q/s$)     bbbb2_.b#c2`?#2a#o$d@  b  ,b2d  ? &N2f &U62l* &2s<  x(2~w   (4P26  (U92  (v~2  (+2v  *Q2  2.#/2 \2E2($1  @  ,T2 ,r2  ? (23  (2> (2  x(~2= (~2<  x()2  x(J2u  x(k2P21  x(I$)  a  A3o .#F3e#$-3fx#(3q#,u  x( 3ss (:3tP  (^3um (=3v  y x(Y~93wwx ,mv3y ,v3z  ($3{|  ,v3}  x x,v3~  t x,v3  pu x,$v3   x x,Gv3  > x x,ev3  x ,v3  t ,v3  pu ,v3   x ,v3  > x ($3,  x()$3d  t(J$3M  pu(k$3X1  ($3q1  fp( 3V   x( 3̐  > x($3T  (!3z   (;!3[   >(\!3Z   "(}!3y   ((!34_   .(!3   4*!3C   :Z`Z`tpufp>p4E4Z`#54x#$5  p  ~p  xlp4  mp4  x@@@#P4,U!4.XXR8X,n#4/040Z`#Yh41#i$2  n#  m#  xAn#42 + 747fOK48#$8<  " 7  ", 749 - 4:Y  YH 4H+E4IZ`#+54Jx#u$0M S YH  S YG  S x,H 4M S ,H 4N S x* 4P  d .C#B5J+@4=j#+o4>Z`#+z#4?x# +)4@!#+ 4Dp#+;4E*#@4445p$,p v |# v |# v x14B  v,#4Y v ,#4_ v  C(7/4c (X/4d66 v 'tstr4i+1 'log4kzj v j(Yh4m6  (Yh4n( v  C(#4p4x v x(#4q0x &,4s5 v(M$4{;p v (nL4~L p v (>4  ( 4$6 ([:4{=Z` ('4Q/p v x*4p v!!!(o!v\)fx%-!>q$: @ F @ F @q%$X7     (0! L!K&]!B? -!  :}%qM~<wY \V/{$  ; ;6  ;Q  x6s.#  6.#  6!  >7!%  6uTw 7ƣ  <a=  --L-[v\T)fx%Q!>$     %$`  &  9 (T!* L!Y5&!H -!# w>QQQ.^Hi.#H.w#%!>.q.i.,$Q  D  6a.;q ;{.  5o.- EJ.Z  5.  Q.:  %q*.eT.s#+.t#.u#.v# %)*.f*Y'.g_.j%7{.k\.l/.m.nwY.o .p.q*$T  L0.h+!w,4).y  ,H).{ ,a).}  (}. (8E., (. (.*  x(~.F3 (~.B*  x(4.:  x(U2P.<*  x(v.  x(.q.*Y'.$oY _ em _ e;m. _  ;m. _ ;l. _ xE.? _ E8F. _ Q."6 _ k0(.~.#%p\.{.\.V..*Y'.D.J. /.&.+.wY. !>.q.F0. "w;d. 0 ;. 0 ;. 0 ;. 0 6;. 0 x($/F?#A 0 67.  0 68."Qq G6Uf.*#* 06rf.18 GGend.8* 0Gend.?N= G6se.F>  06se.Mm G6*.Ug  06 *.]  G6=-.b2w G6Zu.fw G7}.t  0 7.8 0 6K.h4 G6z}.j& 0 6z}.!   G E. G G<at.n8 0 G]at.  G 6z. 06.   G6.$ 06.]<  G7&. 0 7 wp.'E 0 7&.S 07?c.fq 0(e/Zb* 0 * 7. 0 * (/o&* 0 *(/* 0 * *7. 0 A& /  01(/ 0 EL.]7 0 Ek/: 0 Ec/gF1 0 E/ 0E(// 01/η 0 * 59/* 0 * E79/) 0 * 5Z.7* 0 5}.:* 0 E}/- 0 E/V" 0 E-.D 0 E.9 0 Q4/: 0 M9 p<pp<++_+_p p qq%iD}%ۂ_%7{YY \/iA$qn t zYۂ t zۂ t4xi%_k%7{mYYo \q/s$ӭ $ *  $ * $0YYLYWLh '}%ۂm_%7{YY \/$=  ۂ  ۂ mmm@ri%_k%7{mYYo \q/s$[     [[[E* 7N+7x#+D7y#++7z#%b6!>7nq7|r$  b6  (7qq ,b67t  DM27X   O!7&  " 7.#%8\7!>7qr$,  8  ,87  ,87  A87  x  7.#%\77{7\7V77Y'7 D7@J7F/7L7Q7wY7͉ !>7q,7 V ,7 V ,7 V ;7  V \;17) V x(R$8g V \7u7B V 67[q m6f7c V6f7k.  mGend7s$ VGend7z   m6#se72F V6@se7D$@ m6]*7tF V6z*7A @ m6-7w m6u7%w m77m  V 77# V 67w m6/K73 m&L8F  V 6nz}79 V 6z}7  m E7  m Gat7C V Gat7)5  m 670Q V6+77g  m6H7>: V6e7Ed  m7wp7T V 7c7h V(8Yh V 77  V ( 8i,, V (18u V 7O71 V g7h7 V18. V E85  V O98ߗ4 V  6D.#H6F#%lY6J /6K\6LG$  _l  ;tl6N ;l6Q  66Z  68E6]` 66`h' 66c  x6$~6g6 6F~6j  x6hz}6o  b66s  b62P6wQ0  b66{   b69$u {  , { "+ { x,6,9 {'Wlog9Zj { j* 9%!  xsss= }%ۂ_%7{Y \/=$(B H N-ۂ H Nۂ H TSi%Y_k%7{mYo \q/s$ 4      YYY     + :x:Z`#d>:Z`#w  x,:   ,:  *$:  6666;(Y @ D > D,= > 2( =֬   > jz=Y  > PJ >Hx0??qx/?s/?t/#;?u/~6?v#?wy %!?xT$!?yf%??zx y o?{px ?| y 0?} a y ?~??x?x?B8?Y>?B(?BW?TY+?x"?B:?t?pu?f' ?q2' ?len?}#str?2#%_+ $B H Nr#_+ H Ns_+ H BYRT ?d #?4e?B#3?B#=?#%d$  r  s  BR ddd ?d?!?J8?}#?#%w !m$  rw   sw  !!!???}#%$  %r   %s +=?<=?<?}#?}#%,<$  r,  s, <<<W(? IW(?<?#?#%#$I O Ur: O Us O[5?lTq?B?4e?}#3?}#$#     ~~~{?~ ?X?#?}#?#n$?     r?!?&W?&X 1Xu$X=?9t-$?):?*}#?+-#?,-#m>?--#?.# |3?/}# X?0}# >?1r# ?2r# m ?3;#  ?4r# | ?5r# /?6r# !?7;# %$> D Jr D Js D >QuRP?pabR(?su6?}#^?}#(?}#?}# <?}#6?}#3?}#=?}##?}# ?}#$*$R X ^B X ^ Xggdg!?g*?x  x x x  UN?x  x x x    xU@]XSXQ@`J@c#@d# @e#@f# 8?@a$y  Q  Q (3@j *@q# @@#8?@_@6Y@ Q$  i  | &.@ -#@/; K6 vAC$U6 < B  < B,AE <AAK < xH 5AlApmsgAq#errAru#$)        CAt1Y0 A[ [errA>[msgA=Am 9 $     ! Q 5   ! ,e 5Aw  , 5A   x( Ax  , ( l*Ax  , ( A 7  =  -A( YY Y,MM' M2 `>F 2 B=BTBl #8Bf)B #wdayB # $U      2    2  _ _  _  c:B&6B' #3B( #(B) #h $    c:  c:     p GB1B2l #)B3 #wdayB4 #6B5 #3B6 #(B7 # BvB8 # H $%p  v  | ` G v  | G v      y%BVBW #)BX # $2     y%   y%      B\wdayB] #6B^ #3B_ #(B` # vBa # $           BeBf#HBgl #xmBh BY @"Bi 6Bb @BjG$  & ,r^O' & ,sO' &g8Bk #$/7 = C = C =W 1BBXXX\XX0X,+XA"XX X  X X X.   2   I 6>BBx#B#$%5  6>  6> NNNK#BB#B##$%K Q W;# Q W# Q]CB B|B4eBo#_4Bb4B03B#Bo#wvalB#$$$ * 0C * 0C * $oRbb6b2BbBa BH#cB_f Bb# Bb#qBeB B#$%  2  2  R;;;7CyC >#!C H#xC Bjf@C- BHY@C$  r  s wu1C?#x'C@C@C$  r2  s2 wu2C# 0?BT7#C5#p$Y2  7  7 H_???D` Dp D6D7$9  O   A D +ID#+6D#$d+    ,D (6DI  ( 6D?  &$D!8 (@6D$  (\ID%Q (xp D' ( @D( *<D+ > fcEEZ`#$$r:f l r :c l r R~c l xmcE l x<8,EE x# E!p#$g $ *<8 $ *;8 $ x, <8E# $-E9E%H }}0}FEFIw#(FJw#%5<FFw!FGw$(    ,FO AFT   555tYy~6?tyyUzE~Wz `8E#I#|$  r`8  s`8 {{|0}pV|H{fP~fyyPyyyy yy#yy. yy999 9RS4__nw(^K4 G4#WG4G:9G?9LЧЧcЧ}%ۂh_%7{Y \/$F%  ۂ  ۂ hhh<^%_T#ɏq#X r#Ss#ht#vu#$&     b.}%ۂ_~%7{Y \/b:$g m sRۂ m sۂ my+%>~e #$4  >  > ~~~i%_k%7{mYo \q/sk$     }%ۂ_~%7{xY \/j$`  ۂ  ۂ >A@%}A#$p  $}  $} *1@%}/A#q$h  }  } ///D }%ۂ_~%7{xY \/D  $I  O  U 4 ۂ O  U ۂ O [  y7zUzy4DxSz4Dx 4D8zOzU?4DPzgzUQ    \*  L  !YR6?,$!'! 9!>R~>?-D!)!/_!I!{GM[g+= O@as @ J/ASew 9:-<@<S<f<y<<F{DDFc^u^^^^^ ^_-_aaabb,b>bfIH/g_ P#YRz_e/h@hQhbhshhhhhhhhh ii.i?iPiaisiiiiiiijhg1q(s@RvU:!7W{hz@p1&+0@,B \-T%qD.f/xint,0E6O:8;3?x+R@_B\ ]B ^._0$` f l 3._0 f l ._0 f RYREr'x*ĺ,Y-!.\/[k0*12mP37/4t5;|KQL|#-Mx#T$  l   B   5Xj_pk|#_rlx#_wmx#nT# oT#_bfp #qx#;t#u# ]3v2#$wQ#(x{#,{ #0_up~|#8_urx#<p#@p#C_lb #Dϛx#L#P$  5  5 x 2x   xQ  x8px  p xvYW BR BR5,X@1@6$#@xqExtm,KrLx#Mx#fsNx#'EOx# *&Px#8rQx#8|Rx#_Sx#Tx# @U#$'V#($  tm  tm    <1i2lR3:4 e7x89xS;cxC 6%B ;7D @ID E[!, Jm , OR: TQ: YP ]7x ^[S _ `# R\ W| eB. ffZ6 gFP h<7 jBˮ kf l_Q m^ o#N, rP, sW tpP P @|  ƺ WD h @  e aj  m 8  4 me pWu m$+ mt  mQ x5 x 5  "m = 5 6 #$*Z    " =   " =    R( = 7 .X  9J 9 # 9 # $,       !q  D D  D  G  H q UL V#~ Xx#N Y#I $@F L Ra   L R  L] I| $  \u ]# f9 #/ i9 #R j #  kD # l# $CV] c i  c i cR J/  *W {88 |#~d }#w $ t z  *W z *W z K D  y # 9 # D #DK # E # $`  4    ? LO   ev #a # $u      F M : ώ  q #- x# ${  * ώ  ώ  NE  ?  #3 9 #  x# $k   ?  ?  O y$  # 9 # D #: D # # # # \$F  ty  y $ P? z Ҋ#B #$QU  ?  ? B Q +  ڊ# 9 #b D #') # #ĭ #I #$& ! '+ ! '+ !] R;ns B #uw #$72 8 >+ns 8 >ns 8 Sx  X | | o| / / / q    O O O    E E E      - D 1 2#4 3#$$     III@,{ 9 :#& ;#$@ F L0,{ F L,{ FRm KV} Lx# Mx#$V  m  m WWWNt c I#K I#&$N T Z>t T Zt T`5 c #K #$  5  5 eee\ hz x#>4 x#g x# x#  x#]$  u\  \ > U4 Vx#$eW  >  > " o p#A q#]$  u"  " "lwp ~ # #$CE $ * $ * $0 <H  I#I| c#n # D # #8LN x#< x#@l x#D$x7    <   <  R555x~pad#Z$  rx  x  R   .R+;, .-q "8#@;UH"#y<["#N= Z"#>g"#7V?"#@r" #t~A5"@#(nBK"$#eC"$eD]"$EN^"$FF'"$ 'GV"$H " $<IC8"@#RJ"#JKq"J$zL&"#3O"#P"#Q"#T X"#VU"#`V%"#W"#Xv"#6Yk" 9T$[' - 3 - 3 -T9Q EVxFv%W0TXwYe=xxTyOxzW*Ж{>$  W0  W0 &U  '<eq7L  '[ltL   (m7Jx p p (d5 p(Jp p ("K  p ( 6/   p (/  Y(JU\Y (etx (b=P  )eof8x*4x Ȝ9+W?#+@>#%Ζ<> $n o o$ o o(@ζD[> o&]ζG o ,qK o,N o  (WP_ o(S^n o (Vͯn o (2PZVl o (/#rem?#._2{$   ._2   ._2 {{{J  Ee@G#remI#._3 [ $   r ._3  ._3     biQ !biNe@Op#remPp#._4  $! ! !! !._4 ! !! ._4 !  '! ! >X!$s! ! !p!  ! !  !,!,!!,!;#*8%&#|'#U(#J)# *#+#|,#Q-#.# /#$i<0Y#(m<1Y#)22Y#*33Y#+4Y#,mi5Y#-gC6Y#.z7Y#/28Y#09Y#13:Y#2ii;Y#3cC.e R#/$B/ H/ N/2/> H/ N/> H/..T/./%>Y/eR#/$Pk/ / //> / /> /Y/Y//Y/D0 %>/eR#0$2D0 J0 P040> J0 P0> J0//V0/0d%>[0eR#0$&0 0 00> 0 0> 0[0[00[0F1k%>0eR#1$[F1 L1 R161> L1 R1> L100X101. %>]1e!R#1${1 1 11> 1 1> 1]1]11]1H25)$%>1e%R# 2$H2 N2 T282> N2 T2> N211Z212X<(%>_2e)R#2$p.2 2 22> 2 2> 2_2_22_2J3`,%>2e-R#"3$J3 P3 V3:3> P3 V3> P322\323ۖ0%>a3e1R#3$m3 3 33> 3 3> 3a3a33a3L4d4%>3e5R#$4$AL4 R4 X4<4> R4 X4> R433^434' 8%>c4e9R#4$4 4 44> 4 4> 4c4c44c4N5D<%>4e=R#&5$JGN5 T5 Z5>5> T5 Z5> T544`545MP5$|i5 5 55M 5 5M 5e5e55e5$6R5${~$6 *6 066 *6 06 *6556656T.e5#p6$f6 6 66 6 6 6;6;66;6 7G`V.;6#6$9 7 7 76G` 7 7G` 766767lX.6#X7$z%7 7 7p7l 7 7l 7#7#77#78ei%7_k5/{m/Yo/\q//s7$&8 !8 '8 8 !8 '8 !877-878S =5oB8#~RE# 3?8$08 8 88S 8 8,8SG 8 &8U 8*] 82828828q9o0 wsv%0~9I9$ q9 w9 }9a90~ w9 }90~ w999992:^i#9$2: 8: >:9^ 8: >:9^ 8:&:*Z 8:&: ěH 8:-&'m  8:99D:9:ci:#,|:c : 2:,:c : x1:$ : :2c : :2:I::I:?!xZ; %0ј*lkZ;%S:2;$!l_; e; k;J;S e; k;S e;:::q;:<h;$[< < <; < <; <(;!l  -!p%S  v;v;<v;=чN34g=4]\4O`*4c4dZ994}o:%<<!<$= = =<< = =<< =5=ze 51=ida 5N=P$ 5p=  =6=! s 7=!  8ɔHx'  ==R%<=<<=<x>'L%>Yw\V>9{r>$-> > >> > > >>:>>>>@k1%>M~<Yw\Vp/@@{YM?$@ @ @;b? @;|? @ @;? @ x6?.#k @ 6?.#6'p @ 6@! @ >7%@!_' @  6B@um, @7e@ƣ( @  <am @ >>@>@pB0}%@M~<Yw\pBV}B/BB{vB=A$)B B B;RA B;lA B B;A B x6A.#bpB B B6A.#Y}B B B6A!RpB B >7B!3  B pB 62Bu B7UBƣ  B pB B<a B pBvBBvBBvBBB@@B@B=-C<xB$"-C 3C 9CC 3C 9C;Cy 3C>z 3C xBB?CB?C%<U@_V=@WCC$iC = CC = C = CYRDCCDCX?8mDN.>#c#!D$vX X X9DN X XRDN X xAN X  @F{ 0r3/rY08tva##&:#>D$mwY }Y YE{ }Y YE{ }Y(7E6#r Y(SEa Y&kEAn }Y&EiT }Y(E> }Y(Ez} }Y (E{ }Y @ @6Fi}Y @&$F% }Y @7BF-ux }Y @(^F6 }Y8/E6 }Y @ BlrY+BoC#CxCY%nNC3qT{rY!>s>tYuw/vYwY\xVypzYY'|[D}^J~ ^DrGV &^DGI 1^ 5GdQ}Y &^5Gf Y &^5Gy Y &^EH\ \ 1^5+H`Y &^ 5SHh >Y &^ EvHd/i  Y YEHd3`(  [ [EHd7   EHd;  p pEIi 1^ E"I}% 1^F AE gwY;JInN^ 1^,cInN 1^ @,|InN 1^ 7^,InN 1^ 7^ ,InN 1^ 7^ @,InN 1^ p @,JnN 1^ p @,+JnN 1^ Y @;FJmNc 1^ x6hJ$fP=^ 1^ 7^6J$i=^ 1^ p6J$l5=^ 1^ Y6JfqXnY 1^6Jfx[ &^GKend|'Y 1^G Kend[ &^6=Kse ^ 1^6ZKse;^ &^6wK*n ^ 1^6K*^ &^6K-(d &^6Kdry &^6Ku&a &^7LZ%o 1^ Y7,L 1^ 6IL &^7gL:m 1^ 7L 1^6LK &^6Lz} &^ 6Lz} 1^ GMatk &^ G#MatL0 1^ 6EM=^ 1^ 7^6gM4=^ 1^ p6M=^ 1^ Y6M;"=^ 1^ 7^6M;#=^ 1^ 7^ 6M;n=^ 1^ p 6 N;(=^ 1^ p6GN;o=^ 1^ Y7eNwp*Q 1^ Y(N=^ 1^ 7^6NB=^ 1^ 7^ 6N=^ 1^ p 6N;=^ 1^ p6"O=^ 1^ Y7JO [; 1^ Y Y6qOc=^ 1^ 7^6O,O=^ 1^ 7^ 6O9 =^ 1^ p 6O_=^ 1^ p6!P!™=^ 1^ Y6HP(Q Y 1^ Y Y6oP1=^ 1^ 6P8]Y 1^ Y6PAY 1^ Y Y6P8J=^ 1^ 7^6Q8=^ 1^ 7^ 6KQ8^lc=^ 1^ p 6wQ8Vq=^ 1^ p6Q8Zb=^ 1^ Y6Q8^/=^ 1^ Y Y 7^6R8c]=^ 1^ Y Y p 61R8g=^ 1^ Y Y p6bR8Z=^ 1^ Y Y Y6R8wPY=^ 1^ Y Y  6R8|K=^ 1^ Y Y p p6R8ĕ=^ 1^ Y Y Y Y6&S89f=^ 1^ Y Y [ [DLSã Y @6xS6+ &^  7S M 1^ =^6Sup &^6Sqp &^6S> &^6TJб &^ p 6@TJ( &^ 7^ 6gTJ: &^ p 6TJ"D &^ Y 6TIL &^ 7^ 6TI5 &^ p 6UI4U &^ p 6/UIIR &^ Y 6VUJC &^ 7^ 6UJ\ &^ p 6UJ& &^ p 6UJ1" &^ Y 6U-> &^ 7^ 6#V-j8 &^ p 6JV-x &^ p 6qV- &^ Y 6Vg &^ 7^ 6Vg~ &^ p 6Vg &^ p 6Wg2 &^ Y 69Wz% &^ 7^ 6eWz &^ p 6Wz,n &^ p 6Wz< &^ Y 6WM3WC &^ 6Wm;dx &^ 7^6(XmF*x &^ 7^6^Xmx &^ 7^ 6Xmx &^ p6XmLx &^ p8mpvx &^ p CCXC[YA%zX>3Y$)[Y aY gYKYz aY gYz aYXXmYXmDmDYmDY YR[5D.E#H5F#%lYY5Jw/5K\5L!Z$  9Zl  ;NZl5N ;hZl5Q  6Z5Z  6Z8E5]! 6Z5` 6Z5cY  x6Z~5g 6 [~5jCY  x6B[z}5o  "6d[5s_  "6[2P5wY  "6[5{  "6[ a wa(`9 :: a wa(` C^ waLC _waMa}  qa [aN@ tD1acZ gj O_  qa wa wa ^ qapRC^}aC^}aP&d^$ +& :#+ &d#+Z ւ#+ 2d# Cy gXdCM hdCO ܴ1xdCo} ݬdC =dC D dC] Kd1gb% ˆ [a1bz/ Ie [aMb2  [a d Mb2  [a p Mb2  [a &d Mb1  [a xMc2  [a d15c$ e [a dDRc/q L [aEvcy  [a d Ec i [a d dEc * [a d MdEc d [a Md ,d5d * >jd [a Q &T [a d x,d[_ BdR MdMdRSd_Bd hdMdR]d xdMdRmd dMdR}d dMdRd dMdRd ddRdMdddad!}d=|e_ HF #4 ~q:E4e$ L |e eSNeid  |e eTbeid  |e8} B MddSdUeE!7VڪUePh!VV1Uek!uV@Uey!VTOn8Rl!W f7!ZXXaX7fVy!| !~On# P!pn# F!x# \!:# uf$&vn On |nfVy On |n;fVy! On pn x On7f%!A On8z/!x OnYg|! @!# F$!#/g$n n nGg| n n>|! n-hw!4El!x4}!;g$on n ngw n n;gw! n;gw! n x7 hP ! YZ!ZA!L0@!kn[dec!tKn0Q!qn[hex!gTn0:V!r*n0R!㬲n[oct!&n0R!̸n0&e!n0e!4n0!+n0F!0kn0'!;n0!ݑn0<!a[n0U!cn0M!n0}!fn\3!'4n\!7,n\!̃n\!Nn]app!*Fn]ate!,zn\u!1Զn]in!3 n]out!5on\6!70n]beg!Ern]cur!G _n]end!Ignd+wH1e!rHj#Hp !sHj#Hrm!te#Hey!ue# H!ve#HU!On#HB!f#^!HC7!n# Hd!x#`HQ!n#dHf~!C^#h!Q!Ԉe! e* !(ei!CeP!cpn7{k!i n pn xEkf! n eEkl!: n5kw+!#n n xEk'!x n6lE!@1e n60lE! e n e6Rl+ !Ae n e6yl+ !.e n e e7l) !E n e6l4e!%Hj n6l4e!'>Hj n x6ls !4Hj n6ms !=Hj n x61m!Oc3 6Smj.![}C^ n wa6pmM!f{C^ n6mJ!pa?wa nZs!wx6mI$!~zn n x6m@!Dn n x;m7R! n x_n8R! n_/n8R! n n`$!T.jn n n fajn e jn xeUn fn fffnfYgYgnYgeeee nfRenenooe}"+"0_ph#(#&#/^h_p#+#0_p#@#13_p#Y#2l_p#X#3n_pD#vi#4c_p##5_p##6_p#u#7_p #]Z#8_p#p9#9k_p߹#*dp #.B7p$jp pp vpOph pp vph ppB_p/o/o|p/op$0UpG$3bokXXl*X p$p p qp p q ppp qpq&%\_%,&`p4%1Ppbq$<q q qzq& q qq& qEq)%? n  Y xQ%C n  Y YqqqqrrR%@W*r%BX)bdmybmdybymdbydmJr$-rr xr ~rbrR xr ~rR xrqqrqsQF%Wr. %XVXviXXXH&s΄% 4%s#r$Ys s ss΄ s s΄ s\%DsXs$0s s spsQF s ssQF s8%r Y Y Y sYRrrsrrrsrEtf%2%xt$oEt Kt Qt5tf Kt Qtf KtssWtst&6&tW3&tt$XNt t tt t t t tBR3\t\tt\t^u=&6&^uW3&nu6u$5uu {u uNu= {u u= {u nuBRttutuP &"6&#uW3&$vu$+ v v vuP v vP v vBR  uuvuUIv7&cX1[XXנUtvZb'ctX]XBXW,X;HUvL''cX.XRdxo'0MP'!dx#r<'Y\#'|0'udx0>e'#dx0e'Z:dx#}W'5#'`#b'O#K' #'T0e'4(dx00'Wdx0'dx0FU'ix0L'dx0'dx0]'°mdx0)'dx0@'wHdx0 'ƊJdx0`b'fnxe'_Ddx0e'9dx#}W'Ү#'\F#b'##K'#'?0e'dx00'qodx0'Ydx0FU'T/ix0L'8Cdx\'66dx\]'dx\)'`6dx\@' dx\ ' :dx\`b' nx%QxBz$z z {ZzQ z {mzQ z)min'{T)max'LHk'L5{':iLLH'L0'#L '_uZ' xx {x}e{'\MP'^dxdr<' d'W\'dx\>e'}dx\e' dxd}W'd'#Jmdb'$مdK'%d'&\e'(3dx\0')Edx\'*-Adx\FU'+Zix\L',S2dx\'7,dx\]'8dx\)'9κdx\@';3dx\ '<z{dx\`b'=4;nx%Q{|$E} } }|Q } }}Q }emin'Yemax'/YZHk'e'Mdx\e'NuUdxd}W'Oijd'U0 db'VdK'W}d'XN\e'Zsdx\0'[dx\'\wdx\FU']Mix\L'^ARdx\'iyZdx\]'j;-dx\)'kcdx\@'m dx\ 'n>dx\`b'oQ7nx%Q}s$e'2<dx\e'bdxd}W'd'8pdb'"dK'd'*\e'6dx\0'dx\'Fdx\FU'4bix\L'dx\'dx\]'Adx\)'Wdx\@'dx\ 'U)dx\`b'<nx%QF$r˂ т ׂ'Q т ׂ:Q тemin'xBemax'zpBZHk'8BZ5{'fBZLH'BZ0'BZ '<BZ'HSBFF݂Fg'\MP'Wdxdr<'ȷd'No \'dx\>e'dx\e'ĵdxd}W'Qd'zdb'*%dK'd'\e'j@dx\0'dx\'y dx\FU'Cix\L'bdx\'3dx\]'Rdx\)'4dx\@'7dx\ 'dx\`b'cnx%Q$6g m sÄQ m sքQ memin'#vBemax'FvvBZHk'ZAvBZ5{'qvBZLH'ܞvBZ0'vBZ 'vBZ'JvBy('\MP'dxdr<'$d'L\'Ƌdx\>e'xdx\e' dxd}W'Cd'ڜdb'=]dK' ;d';\e'Ӓdx\0'Gdx\'dx\FU'Yix\L'dx\' dx\]'Gdx\)' dx\@'xdx\ '/dx\`b'{[nx%Q~G$_  _Q  rQ emin'Temax'`gTZHk'TZ5{'TZLH'sTZ0'[TZ 'y<TZ'T~~~)' \MP' |dxdr<'5yd'D\'hdx\>e'O_dx\e'{dxd}W'u_d'p db'oOdK'tld' |\e'":dx\0'#.dx\'$dx\FU'%ix\L'&Ódx\'1dx\]'2؛dx\)'3Gdx\@'5Ptdx\ '6dx\`b'7nx%Q$5  Q  Q emin'4femax'ifZHk'VfZ5{')fZLH')NfZ0'+^fZ '-*/fZ'/Df;'<\MP'=6ddxdr<'Dd'ES \'F|dx\>e'G)dx\e'H֚dxd}W'IOd'OZdb'PڔdK'Q}5d'R\e'Tv dx\0'U5dx\'Vqdx\FU'WNKix\L'Xdx\'c{dx\]'d*dx\)'edx\@'gdx\ 'hoSdx\`b'iGnx%Q$ ; A GQ A GQ Aemin'@Q>xemax'B¢xZHk'K(xZ5{'M_xZLH'[axZ0']0xZ '_xZ'axM׏'n\MP'oUdxdr<'v0> d'ws \'xAWdx\>e'ydx\e'z:dxd}W'{d'db'"dK'[d'\e'dx\0'dx\'!Bdx\FU'2ix\L'+}dx\'Ϧdx\]'&Ndx\)'dx\@'dx\ 'B dx\`b'#nx%QR$\׏ ݏ 3Q ݏ FQ ݏemin'r4emax'tZHk'}^Z5{'"ZLH'n=Z0''Z 'vZ'RRRs'\MP'e8dxdr<'d'? \'Hdx\>e'adx\e'Zdxd}W'd'@Mdb'8dK'd'Tq\e'dx\0'&dx\'dx\FU'ix\L'Zdx\'Gdx\]',dx\)'8dx\@'dx\ '2dx\`b'unx%Q$Hs y ϑQ y Q yemin'emax'~ZHk'Z5{'fnZLH'Z0'nZ 'Z'd4`'\MP'Adxdr<'b` d'sx \'dx\>e'13dx\e'{dxd}W'yd'tdb'dK'd',+\e'9dx\0'wdx\'ndx\FU'tix\L'7dx\'jdx\]'dx\)'w$dx\@'dx\ 'odx\`b'c0nx%QS$"  kQ  ~Q emin'WLemax')ZHk'-Z5{'{NZLH'ōZ0'Z '{Z'?s!'\MP'Jdxdr<' 6D?d' \'dx\>e']#dx\e')0dxd}W'Nd'db'1dK'>d'~\e'Edx\0'_dx\'-dx\FU'rix\L' {dx\'+ dx\]',ΰdx\)'-adx\@'/Vdx\ '0hdx\`b'1nx%Q&$Ҋ  Q  Q emin'Cemax' UZHk'yZ5{'p>ZLH'#{Z0'%Z ''"Z')X&&&G'6\MP'7Udxdr<'>h@d'?"\'@pdx\>e'Adx\e'Bdxd}W'C,d'Idb'JdK'Kzed'Lo\e'Nudx\0'Odx\'PTdx\FU'Q *ix\L'RfBdx\']A{dx\]'^%dx\)'_dx\@'a]dx\ 'bdx\`b'cgnx%Q—$#G M SQ M SQ Memin':$emax'<EZHk'EHZ5{'G~ZLH'UbVZ0'WFZ 'YZ'[D——Y—B'h\MP'idxdr<'pId'qj\'r+dx\>e'sT%dx\e'tdxd}W'uf'{O$fb'|/dK'}d'~&\e']dx\0'Vzdx\'Ddx\FU'ix\L'dx\'Hcdx\]'dx\)'cdx\@'Odx\ ';Idx\`b'џnx%Q^-$V+  EQ  XQ emin'l)ctemax'n tZHk'wwhtZ5{'y(tZLH'tZ0'eQtZ 'NtZ']t^^^`p'\MP'1dxdr<'X5d'K\'ptdx\>e'<dx\e'@dxd}W'f'$fb'xgK'2g'b4\e'Ydx\0']dx\'Уdx\FU'ix\L'h"dx\'dx\]'.dx\)'٫dx\@'Ldx\ '6dx\`b'nx%Qў$W  Q  Q emin'nuemax'bnuZHk'FOnuZ5{'WnuZLH'YnuZ0' nuZ 'VnuZ'N&nu1''\MP'^dxdr<'\P@d'2\'ldx\>e'wdx\e'Ҍdxd}W'P9f'fb',gK'ٗ@g'D\e'Àdx\0'fGdx\'*udx\FU'ix\L'4dx\'dx\]' +dx\)' Jdx\@' Idx\ ' Ɖdx\`b'?nx%Qu$1 7 =Q 7 =Q 7emin'әvemax'HvZHk'uvZ5{'vZLH'Y5vZ0'vZ 'IvZ'քvCK:hX(k (m# 3f(n#$   X  ,ʢX),  ;W(  x8s(Bq HRRRK8ahX*BH*m#3*ETG*F*G"F2*H*Ix$l  "X  ",ףX+-  - 8s*j< KJGrY!,,(,"e,ED,Bc,Ge#5,H?#~ k q,,J k e ,,M k(̤s,N |($,Pg k ($,V! k q(/,XV | q(PP,ZF> | q-z,[b k?3w3w37i%_k#7{mYow\q/s"$)- 3 9  3 9 3'?ۧb,_.#c,`e#,a#$d@ۧ  b  ,˦b,d  e &N,f &U6,l* &,s<  x(9,~w   (ZP,6  ({9,  (~,  (+,v  *Q,  DDDЩ,.D#/,3\,k,N$1Щ ֩ ܩf ֩ ܩ,z, ֩,, ֩ e (,33 (Ш,>Щ ֩(, ֩ x( ~,=Щ ֩(.~,< ֩ x(O,Щ ֩ x(p,uЩ ֩ x(2P,1  x(-Ox ֮( -Rx ֮ x(-UD֮ ֮(ík-X 'ޭfd-[$x ֮,-] ֮ x(+-`Hj ֮ p x(D-cHj ֮  x(o-g ֮  e e(-k ֮  e(LF-nx ֮*-qHj ֮   K)i.XX3XXƿv\dx%!>c$, 2 8 2 8 2c3%ܯ$/w }  }  }("! L!{&O!V -!M ,G}%cM~<Yw\V/A F {x$?K  Q  ; Q ;( Q  ;C Q  x6e.# W  =6.# W  6!p Q  >7ѱ!r Q  6u W 7ƣ Q  <a) Q  >˲v\dx%C˲!>$     ,%˲$     + (F! L!&s!I -!? !CCCY/^Hi/#H/#%!>/c/i/˲$  6  6S/Zc ;m/  5o/ EJ/  5ʹ/߻  Q/  x  cʷr/eT/s#+/t#/u#/v# %)"/f"Y'/gʷ_/j#7{/kx\/l//m/nY/ow/p/q"$[  L0/h,,)/y  ,@)/{ ,Y)/}  (u/= (8E/ (/y (ζ/"  x(~/) ( ~/G"  x(,/  x(M2P/b"  x(n/   x(/c/"Y'/ʷ;$   Sm  ;rm/   ;m/  ;l/  xEƻ/  EF/  Q/"  (/~.#%"\/{/x\/V//"Y'/ʷD/J/////Y/w!>/c/F0/;/  ;:/   ;T/  ;n/  ;/  x($0F  7ͽ/ z  6/"c 6f/*" 6$f/1ʷ GAend/8" G^end/??ʷ 6{se/Fb 6se/M 6*/U 6Ҿ*/]P 6-/bK 6 u/f 7//t9  7M/  6jK/V 6z}/F=  6z}/;  EͿ/,  Gat/=  Gat/  6,/= 6I/R 6f/= 6/ 7&/  7wp/'  7/S{ 7c/f (0ZM"  " 7?/A  " (`0o"  "(0"  " "7/u  &0 10   E/]5  E0:  E<c0g  EV0 Ep(0? 10  " 590"  " E90)  " 5 /"  5//"  EN}0  Em0  E-/D  E/1  Q40  !!/="""o_@%}A#G$o u {_} u {} u}%ۂ_#7{Yw\/$% + 1 ۂ + 1ۂ +7p^%<ɏR#X R#SR#hR#vR#$     <<<m1%$m s y7 s yJ s861 ˲˲˲i-$2UA2'XsX$X- X=X^bINTXX:XnUu&2(XFXl^ 2AI2Bx#-2Bx#' 2C#,X^2E i,q^2F i o($2GWz i o,]2H i x(!2J, i x(J.2Q | j62Sӥz i o+:2"x#E2*X`#I2+#52,x# -2-x#L2.#U2Y#$-  -  -  xD2$1nx D2%x  x,-20 (0P27}?  C(Q28t  C*n2: uuv42^22hki2ixkf2jtkd2knuks2lpkpv2m> $)  !  A2o .#F2e#$-2fx#(2q#,~u  x( 2ss (:2tP  (^2um (2v   x(~92wwx ,-v2y ,Fv2z  (g$2{|  ,v2}  x x,v2~  t x,v2  nu x,v2  p x x,v2  > x x,%v2  x ,Cv2  t ,av2  nu ,v2  p x ,v2  > x ($2,  x($2d  t( $2M  nu(+$2X1  p(L$2q1  dp(r 2V  p x( 2̐  > x($2T  (!2z  (!2[  =(!2Z  (=!2y  (^!24_  (!2  *!2C  X`X`tnupdp>p3E3X`#53x#F$5  \p  t~p  xlp3  mp3  x#P3,U3.XXR8X,kn#3/030X`#Yh31#)$2  An#  Zm#  xAn#32  737fOK38#$8<   7  , 739 - 3:Y  YH 3H+E3IX`#+53Jx#5$0   MH   fG   x,H 3M  ,H 3N  x* 3P  $ .C#B4H+@3=*#+o3>X`#+z#3?x# +)3@#+ 3D0#+;3E#@34350Z$,0 6 <r# 6 <# 6 x13B  6,#3Y 6 ,#3_ 6 C(/3c G(/3d66 6 '4str3i+1 G'Ulog3kz* 6 *(qYh3m6 G(Yh3n( 6 C(#3p4x 6 x(#3q0x G&3s5 6( $3{;0 6 (.L3~L 0 6 M(N>3  (j 3$ G([:3{=X` ('3Q/0 6 x*30 6kkkuo!v\)dx%u!>1M$  e   1%u$X7R X ^ X ^ X(! L!K&!B? -!  }%1M~<Yw\V/bg{$l r ; r; r ; r x63.# x 6U.# x 6|! r >7!% r 6uT x7ƣ r <a= r  [v\T)dx%!>Uq$[ a g a g aU%$`~     (!* L!Y5&A!H -!# !w>m/^Hi/#H/#%r!>/1/ui/$Q    6!/;1 ;;/  5Yo/- ExJ/Z  5/  Q/:  rrr1*/eT/s#+/t#/u#/v# %)/fY'/g_/j#7{/k\/l//m/nY/ow/p/q$T  L0/h+!,)/y  ,)/{ ,!)/}  (=/ (Y8E/, (u/ (/  x(~/F3 (~/B  x(/:  x(2P/<  x(6/  x(W/1/Y'/I$o  %am  %;m/  ;m/  ;l/  xE/?  EF/  Q/"6  +0(/~.#%0\/{/\/V//Y'/D/J/////Y/w!>/1/F0/ ";$/  ;H/  ;b/  ;|/  ;/  x($0F?#  7/   6/"Q1 6f/*# 62f/18 GOend/8 Glend/?N= 6se/F> 6se/Mm 6*/Ug 6*/]  6-/b2 6u/f 7=/t   7[/8  6xK/h4 6z}/j&  6z}/!   E/  Gat/n8  Gat/  6:/ 6W/  6t/$ 6/]< 7&/  7wp/'E  7/S 7c/fq (%0Zb  7M/  (n0o&  (0  7/  &0  10  E /]7  E+0:  EJc0gF1  Ed0 E~(0/ 10η  590  E90)  5/7  5=/:  E\}0-  E{0V"  E-/D  E/9  Q40:  !!M9000BBSb0 011)D}%ۂ_#7{YYw\/)$q. 4 :ۂ 4 :ۂ 4@4xi%E_k#7{mYYow\q/s$ӭ     EEEYY Y (w'}%ۂ-_#7{YYw\p/$=  ۂ  ۂ ---q@ri%_k#7{mYYow\qp/sqI$[v | a |  |[[[pE* 6N+6x#+D6y#++6z#%b6!>6n16|u2$  Jb6  (f6q1 ,b66t  DM26X   O!6&  " 6.#%8\6!>612$,  J8  ,c86  ,86  A86  x  6.#%\66{6£\6ôV6ĺ6ŔY'6D6J6/6 66̂Y6w!>61,6  ,6  ,6  ;6   ;6)  x($7'  756B  6R6[1 -6of6c 6f6k. -Gend6s$ Gend6z  -6se62 6se6D$ -6*6t 6:*6A  -6W-6 -6tu6% -76m   76#  66 -6K63 -& 7F   6.z}69  6Pz}6 - Eo6  - Gat6C  Gat6)5 - 660Q 667g -66>: 6%6Ed -7Cwp6T  7\c6h (7Yh  76   (7i,,  (7u  761  '7(6 1K7.  Et75   O97ߗ4  5D.%#H5F#%lY5Jw/5K\5L$  l  ;4l5N ;Nl5Q  6k5Z  68E5]` 65`h' 65c  x6~5g6 6~5j  x6(z}5o  "6J5s  "6l2P5wQ0  "65{   "68$5 ; A, ; A+ ; x,,8 ;'log8Z* ; ** 8%! L x33G3Guudu }%ۂi_#7{Yw\/$(  ۂ  ۂ iiiSi%_k#7{mYow\q/s$ 4     9x9X`#d>9X`#7  x,U9  ,n9  *$9  U:XXU5:XX1XX6;(Y @Hx0??qx/?s/?t/#;?u/~6?v#?w%!?xT$!?yf%??zx o?{px ?| 0?}a ?~??x?x?B8?Y>?B(?BW?TY+?x"?B:?t?nu?f' ?q0' ?len?{#str?0#%_+ $@ F Lr!_+ F Ls_+ F @YRR ?b #?4e?B#3?B#=?#%b$  r  s  BR bbb ?b??J8?{#?#%w k$  rw   sw  ???{#%$  #r  #s )=?:=? <?{# ?{#%,:$  r,  s, :::W(? GW(? <?# ?#%!$G M Sr8 M Ss MY5?j!Tq?B? 4e?{# 3?{#$#     |||{?| ? X?# ?{# ?#l$?     p?!?&W?&X 1Xu$X=?9t+$?) :?*{# ?++# ?,+# m>?-+# ?.# |3?/{# X?0{# >?1p# ?2p# m ?39# ?4p# | ?5p# /?6p# !?79# %$< B Hr B Hs B <OuRN?p_!bP(?s u6?{# ^?{# (?{# ?{# <?{# 6?{# 3?{# =?{# #?{# ?{#$($P V \@ V \ Veebe!?e*?x  x x x  SN?x  x x x    xU@]XSXQ@`J@c#@d# @e#@f# 8?@a$y  Q  Q (3@j *@q# @@#8?@_@6Y@wO$  g  z &.@ -#@/; K4 vAC$U4 : @ : @,AE :AAK : xF 5AlApmsgAq#errArs#$)        CAt1W0 A[ [errA>[msgA=Am 7 $      O 5    ,c 5Aw  ,} 5A   x( Ax  * ( l*Ax  * ( A 5  ;  -A( WW W!,KK% K0 ^=cc 2 B=BT Bj #8Bf )B #wdayB # $U      2    2  ] ]  ]  c:B& 6B' # 3B( # (B) #f $   ~ c:  c:     n GB1 B2j # )B3 #wdayB4 # 6B5 # 3B6 # (B7 # B vB8 # F $%n  t  z ^ G t  z G t      y%BV BW # )BX # $2     y%   y%      B\wdayB] # 6B^ # 3B_ # (B` # vBa # $           Be Bf# HBgj #xkBh BY @"Bi 6Bb @BjE$ $ *r\O' $ *sO' $ g8Bk #$/5 ; A ; A ;W1BBXXX\XX0X,+XA"XX X  X X X.   0   G 6>B Bx# B#$%5  6>  6> LLLI#B B# B#!$%I O U9# O U# O[CB B|B 4eBm#_4Bb4B0 3B# Bm#wvalB#$$" ( .C ( .C ( "mR``4`2BbBa BF#cB_f B`# B`#qBeB B#$%  2  2  R99 97C yC ># !C F#xC Bjf@C- BHY@C$  r  s wu1C=#x%C@C@C$  r2  s2 wu2C# 0?BT 7#C3#n$Y2  7  7 F]===D^ Dp D6D5$9  M   A D +ID#+6D#$d+    ,D (6DI  ( 6D?  &"D!8 (>6D$  (ZID%Q (vp D' ( @D( *<D+ > y;@xhzuzUz ;RzIxP{@qzuz|J|T}`~4`I2%xy]AxxzzUz P{~zz|}~4zzU4Pzp R*"zzU4Pz6"RNv*zzU4NSwZ2z!{U4NS"}%ۂ_#7{Yw\/"$F%' - 3ۂ - 3ۂ -9<^%>_R#ɏq#X r#Ss#ht#vu#$&     >>>.}%ۂ_~#7{Yw\/`$  xۂ  ۂ +%>e #$4  >  >  i%%_k#7{mYow\q/s$     %%%ʷʷʷ}%ۂ$_~#7{xYw\/$`  ۂ  ۂ =$$$>A@%}A#$p> D J.} D J} DP1@%}UA#$h  }  } UUUj}%ۂ_~#7{xYw\/jB$o u {Zۂ u {ۂ u${g{Uzy3DxSz3Dx @3Dh{{U@3D{{UQ \*L :YR6?,J'* _>R>?-kO/p.9A  YR@@EMYg); M@_q @J-?Qcu 9:+<><Q<d<w<<FyDDFa^s^^^^^ ^_+_aaabb*bhOh`hqhhhhhhhhh ii,i=iNi_iqiiiiiiijfg/q&s>Pt,}$\(Bp1 H,int0?q,st#;u~6v#we%!xr%q$!y%?z, e { , | e0}  e~#, e,,O8a>O(OWrY+,"O:3'  L' len#strL#._1&$ci o=._1i o._1i\a\Eu  #4eO#3O#=#._2$ !._2 !._2O\ ' BJ8##._3B$ ._3 ._3EBBBA#._4$AG M2._4G M._4GS=d=<##._5d$ ._5 ._5dddW( qW(<##._6K$qw }b._6w }._6w5TqO4e#3#$# %  % +{ X###$?   <<<!<&!&" 1"u$"=9#U$):*#+U#,U#m>-U#.g# |3/# X0# >1# 2# m 39#  4# | 5# /6# !79# ._9/$fl rF._9l r._9lfV$\xpbz (su6#^#(## <#6#3#=### #$R $z   j     !*   , , , , }aN  ' , , , , ,&+2 @,O \-rD./,,06{ O:8 ;3?,+R@_ %! \& ]! & ^p 'vx  $1 7  = ( vx7  = )vx7 1 a\  C  ',*<1i @i2i lR3i :4i  e7,8 9,S; *,ĺ, -e !.e \/O k0e *1p 2Z P39 /4t5e C 6' B ;9 D @D D EO !, JZ  , Oe R: Tp Q: Y P ]9 x ^O S _e  ` # R \ W | eO. fZ6 gFP hi <7 jOˮ k l_Q mi ^ o N, r P, sp W tN 8 P p P @| p  e ƺ WD p h e @ e  e e aj e  $m 8 e ,   4 Z e 8 Wu Z $+ Z t %  Z @ i Q ,  # ,q ,5 , 5  "Z = 5 6#$*Z% +=% + =%\1= 7 .  9J 9# 9#$,   qMMM G Hz UL V#~ X,#N Ye#R$@OU [j U [  U] I- \u ]# fB#/ iB#R j#  kM# le#$CVfl rl r lR J8*W {88 |#~d }e#$ } *W  *W KM y # B# M#DK # E e#%$` =  ? LX ev #a e#$u   F MCώ  z#- ,#${ 3ώ  ώ NN?  #3 B#  ,#$k ?  ? Oy$  # B# M#: M# # # e# e$F }y  y$ P? z Ҵ#B e#$QU  ?  ?B Q+  ڴ# B#b M#') # #ĭ #I e#$&$* 0+* 0 +*] RDns B #uw e#$7;A G4nsA G nsA S,ax888zXXXNNN6M ;] 8e@ 9,#rem :,#'{x]$ ({x ){x]]] @c =e@ > #rem ? #'x=$ci o(Txi o)xiu J Ee@ G{ #rem I{ #'x$ (x )x bi Qbi Ne@ O8 #rem P8 #'xe$ (|x )x  >$s     *8%& #|' #U( #J) # * #+ #|, #Q- #. # / #$i<0a#(m<1a#)22a#*33a#+4a#,mi5a#-gC6a#.z7a#/28a#09a#13:a#2ii;a#3cC4,#g,# ,# ,#"$"" ""\" " \"""""*#>U4V,##$eW*#0# 6##>0# 6# >0#""<#"#"op##Aq###$## ##"# # "#.lwp##A#A##A#J$~####"$$CEJ$P$ V$:$P$ V$ P$##\$#%% <Hu#I| #n # D%%# #8LN,#< ,#@l ,#D$$x75%;% A%% <;% A%  <;%5% \a$a$G%a$%x~pad%#%$%% %%x% % x%%e\L%L%%L%.R +D,.-zN(8/@;UHN(/y<[N(/N= ZN(/>gN(/7V?N(/@rN( /t~A5N(@/(nBKN(0#eCN(0eD]N(0EN^N(0FF'N(0 'GVN(0H N( 0<IC8N(@/RJN(/JKqN(J0zL&N(/3ON(/PN(/QN(/T XN(/VUN(/`V%N(/WN(/XvN(/6YkN( 9r&($[S(Y( _(>(Y( _( Y(r&&e(&Q  EV,(ŇZ($}(( ((Ň( ( Ň(((((?)I[)$X?)E) K)/)IE) K) IE)((Q)()9{'V)ɏ|(X }(S~(h(v()$^)) ))) ) )V)V))V)*R'*ɏ(X (S(h(v(m*$** *** * *****@++O'*ɏ(X (S(h(v(+$ @+F+ L+0+F+ L+ F+**R+*+3 'W+ɏ(X (S(h(v(+$J"++ +++ + +W+W++W+,k',ɏ(X (S(h(v(n,$,, ,,, , ,,,,,A-S',ɏ(X (S(h(v(-$A-G- M-1-G- M- G-,,S-,--'X-ɏ(X (S(h(v(-$`d-- --- - -X-X--X-.S'.ɏ(X (S(h(v(o.$Ww.. ... . .....B/~'.ɏ(X (S(h(v(/$CB/H/ N/2/H/ N/ H/..T/./8'Y/ɏĀ(X ŀ(Sƀ(hǀ(vȀ(/$b// /// / /Y/Y//Y/0C4'0ɏ̀(X ̀(S΀(hπ(vЀ(p0$M00 000 0 00000C11&'0ɏԀ(X Հ(Sր(h׀(v؀(1$:C1I1 O131I1 O1 I100U101:g'Z1ɏ܀(X ݀(Sހ(h߀(v(1$11 111 1 1Z1Z12Z12P@'2ɏ(X (S(h(v(q2$C22 222 2 22222D3g'2ɏ(X (S(h(v(3$KD3J3 P343J3 P3 J322V323'[3ɏ(X (S(h(v(3$33 333 3 3[3[34[3p4k '>4e (H4$p4v4 |4`4>v4 |4 >v444444'>4e(4$Pk44 44>4 4 >44454r5 '>5e(J5$2r5x5 ~5b5>x5 ~5 >x555555d'>5e(5$&55 55>5 5 >55565t6k'> 6e(L6$[t6z6 6d6>z6 6 >z6 6 66 66. '>6e!(6${66 76>6 7 >66676v75)$'> 7e%(N7$v7|7 7f7>|7 7 >|7 7 77 77X<('>7e)(7$p.77 87>7 8 >777 87x8`,'>8e-(P8$x8~8 8h8>~8 8 >~888888ۖ0'>8e1(8$m88 98>8 9 >888 98z9d4'>9e5(R9$Az99 9j9>9 9 >999999' 8'>9e9(9$9: :9>: : >:99 :9|:D<'>:e=(T:$JG|:: :l:>: : >::::::MP:$|i:: ::M: : M:::::R;R*;${~R;X; ^;B;X; ^; X;::d;:;T1:#;$f;; ;;; ; ;i;i;;i;:<G`V1i;#<$9:<@< F<*<G`@< F< G`@<;;L<;<lX1;#<$z%<< <<l< < l<Q<Q<<Q<I=ei'<_k:{mYo\q/s!=$&I=O= U=9=O= U= O=<<[=<?Fv'W0`=Xwae=x,Ty=Ox?z=W* Ж{j(=$AA A=W0A A >W0A2)>U A A3H>eq7LA A A3g>ltL A A A4>m7J,   4>d5S  4>J    A4>"K   4?6/   4;?   a4V?U\a A4q?t, A4?b=PA A A5eof8,64, AAȜ97W?=#7@j(#'?ΖC>CC>CDciD#82DcD C8LDcD,;jD$D D<cD DCCDC?!,E %:ј*lkE'SDD$!lEE !EESE !E SE*DDD'EDEhXE$[EE EpEE EEE4E!l e 9!p%S e ,E,EE,EGчN=>gG>]\ >O`* >cS >dZ9>C>}oD'<EF$GG GF<G GF<G?FzeS  ?FidaS  ?GP$e ?&G   G@BG! se A_G! e BɔHx'e e  GG\E*GEEGE,PH'L'GS YH \eVPHC{(H$-WH]H cH@H]H cH ]HVHDGGiHG6Jk1'nHM~ES YH \ V /6J;J{aI$@JFJ LJEIFJE2IFJ LJEMIFJ,@oI.#k WJ A@I.#6' WJ A@I! FJ  PHAI!_'FJ @Ium,S WJAJƣ(FJ AFamFJ AAnHnHRJnHRJ&L0}']JM~ES YH \&LV3L/>LIL{,LJ$)TLZL `LEKZLE"KZL `LE=KZL,@_K.#b&LkL CL@K.#Y3LkL NL@K!R&LZL  PHAK!3 ZL &L @KuS kLA Lƣ ZL &L NLFaZL &L,L9L,LCL,LNL9L]J]JfL]JfLGL\FxL$"LL LLL LELyLHzL,qLqLLqLIgMEUJ_VGJWgM?M$iwMG }MWMG }M GwMa\LMLb?8#NN 1nH#c #M$vbb bMNb bNNb,KN b LJ8P{ :r!3/(c:!8t&a S # S #& D# nHN$m-c3c 9cN{3c 9cN{3c4N6# rADc4 O aADc2!OA n3c29Oi T3c4UO > 3c4vOz} A3c 4O { 3c LJ LJ@Oi!3c  LJ2O% 3c LJAO-!ux3c LJ4P6 3cB/E!6 3c LJ Ll (c7Bo M#Mx!CJc'nNM3 q`={ ra!> snH tS Y uH / vZc w_c\ x V y  zdcY' |eD }gJ ~gN(Q V gNJQ I g ?hQd Q3cg?Qf  dcg?Qy dcgOQ\ \g?Q` dcg ? Rh >dcg  O,Rd /i dc dcOORd 3`( e eOrRd 7 ORd ;  ORi!g   OR!}%gP A E g-cESnN ^g8SnN!g LJ82SnN!g g8USnN!g g  8}SnN!g g   LJ8SnN!g   LJ8SnN!g  LJ8SnN!g  a LJESmN cg,@T$ fPgg g@@T$ igg @bT$ l5gg a@Tf qXndcg@Tf xegQTend |'dcgQTend eg@Tse gg@Use ;gg@-U* ngg@JU* gg@gU- (dS g@Ud ryS g@Uu &aS gAU!Z%og  aAU g @U S gAV!:mg A6V g@SVK Ag@uVz} Ag @Vz} Ag QVat kAg QVat L0Ag @V gg g@W 4gg @?W gg a@aW;!"gg g@W;!#gg g  @W;!ngg  @W; (gg @W;!ogg  aAXwp *Qg a4S g g @_-!j8S g   @`- xS g  @'`- S g a @N`g S g g @z`g!~S g   @`g S g  @`g!2S g a @`z %S g g @az!S g   @Baz ,nS g  @iaz!<S g a @aM 3WMg  @am ;d,g g@am!F*,g   g@bm!,g   g  @6bm!,g @bbm!L,g   Bm!pv,g    MMbMcA'zbnHb$)cc cczc c zcbb#cbS #N#N?c#N?cZcS \AAe8D1 #R8F #'ldcY8JH /8K\8L c$ cl Edl8NEdl8Q @;d8Z A@Xd8E8]! @ud8`@d8cdc ,@d~8g@d~8jCdc ,@dz}8oA @e8s_ @ABi 7i9z"[b1ihg=ig=igi7i'Ni_kQ<{mAYoH \qi/sii$)ii iii i iAiANiNijNikb"_1Ni#c"`+i#"a#[j$d@kk ksjbk k8jb"dk +i 2jN"fk2jU6"l*k2j"s<k ,4j"~w Ak k4 kP"6Ak k4Ak9"Ak k4bk~"Ak k4k+"vAk k6Q"Ak k j jk jkm"1 j#/"g\"1i"kl$1mm m,lm m8@l"m8^l"m +i 4zl"3gm4l">mm4l"km ,4l~"=mm4l~"<km ,4m"mm ,46m"umm ,4Wm2P"1km ,4xmO$Z-^>$]$.id8s}$_t8s}$at t82s}$dt 8Us}$ft t  8xs}$ht t t 8s\$mt,4s$$pJtt twAt t4t9$::At t47t$q tWC$_tXbt}$t tY@$tNtcZ$gj Z_$t t t :rt \qtqt[w:r$$7&$ԗD#7$Ձw#7Z$S #7$ٍw# My$gwMM$ wMO$ܴ1wMo}$ݬwM $=wM$D xM]$Kx;u%$ˆt;uz/$IetXu2$t #x Xv2$t  X=v2$t w  AXXv1$t,Xrv2$t #x;v$$et #xNv/q$LAtOvy$ t .x Ov$ it .x xOw$*t .x wO=w$dt w w?`w *$>j:xt \ $&Tt :x ,wrw \ww]wrwww]www]www]www]wxw]wxx]xwx)xt)x}4xGxr$RF$S #>$~qDOx$$Lx x^xid$x x_xid$xB}$BS w@xwSxE%7`ڪSyPh%V`1S%yk%u`@S;yy%`T8Rl%!gy7%Z""a"7?zVy%|%~#P%ˁ#F%,#\%D# y$&с ׁyVy ׁE zVy% ˁ , A%z%%ABz/%,z|%@%e#F$% #z$ z| H|%{w%>El%,>}%;A{$o {w E4{w%EO{w%,Ag{P % AaZ%bA%LA:@%kcdec%tK:Q%qchex%gT::V%r*:R%㬲coct%&:R%̸:&e%:e%4:%+:F%0k:'%;:%ݑ:<%a[:U%c:M%:}%fd3%'4d%7,d%̃d%Neapp%*Feate%,zdu%1Զein%3 eout%5od6%70ebeg%Erecur%G _eend%Igd+H R1e%r}#Rp %s}#Rrm%tx#Rey%uy# R%vy#RU%#RB%?z#f%ARC7%$# Rd%,#`RQ%#dRf~%q#hQ%x% y* %(xi%C%yP%cˁA~%i4 ˁ ,O~f%4 GyOl%:4?2w+%#4 ,OL'%x4@iE%@1x:@E% x4 x@+ %Ax4 x@+ %.x4 x xA) %E4 x@4e%%}:@14e%'>}4 ,@Ns %4}:@ps %=}4 ,@%Oc3A A@j.%[}q4 t@ˀM%f{q:@J%pa?t:bs%w,@I$%~zE4 ,@>@%DK4 ,EY7R%4,go8R%4g8R%4 Qh$%T.Ł4 Qgy Ł Gy Ł ,;ygy݁gy?z?z?zzz zxyx%y4?z\;y@;y e@??i?ie}&+e&0eh'(/&'/^h/+'0/@'13/Y'2l/X'3nD/vi'4c/'5/'6/u'7 /]Z'8/p9'9k߹'* '.O$Ń˃ уh˃ у h˃O׃T(0S G(3iok""l*" ,$TZ `DZ ` Z܃܃f܃5&)d_),&` >)1P $<5; AՄ&; A&;O))? Q a ,\)C Q a akkGkͅR)@!)B")idmyimdyiymdiydm$-ͅӅ مRӅ م RӅLL߅LQF)!. )"V"vi"""H΄)4)#Y$Y q΄  ΄d)D#$0(. 4ˆQF. 4ކQF.B) a a aa\#:f)2),x$o f f???SZb*jt"]"B"W,";HSL'*j"."R҉o*:MP*!o/r<*Y\A/*|A:*uo:>e*#o:e*Z:o/}W*5A/*`A/b*OA/K* A/*TA:e*4(o:0*Wo:*o:FU*҉:L*o:*o:]*°mo:)*o:@*wHo: *ƊJo:`b*f׉$=[܉ ‰o o`j*:MP*o/r<*sA/*GA:*o:>e*_Do:e*9o/}W*ҮA/*\FA/b*#A/K*A/*?A:e*o:0*qoo:*Yo:FU*T/҉:L*8Cod*66od]*od)*`6od@* od * :od`b* ׉'Q$`f lËQf l֋Qf5min*{TA5max*AWHk*AW5{*:iAWLH*AW0*#AW *_uAb* Are{*dMP*^okr<* Ak*WAd*od>e*}ode* ok}W*Ak*#JmAkb*$مAkK*%Ak*&Ade*(3od0*)Eod**-AodFU*+Z҉dL*,S2od*7,od]*8od)*9κod@*;3od *<z{od`b*=4;׉'Qw@$E XQ kQlmin*almax*/abHk*e*Mode*NuUok}W*OijAk*U0 Akb*VAkK*W}Ak*XNAde*Zsod0*[od*\wodFU*]M҉dL*^ARod*iyZod]*j;-od)*kcod@*m od *n>od`b*oQ7׉'Qܐ$e*2<ode*bok}W*Ak*8pAkb*"AkK*Ak**Ade*6od0*od*FodFU*4b҉dL*od*od]*Aod)*Wod@*od *U)od`b*<׉'Qx$r4: @Q: @Q:lmin*xOlmax*zpObHk*8Ob5{*fObLH*Ob0*Ob *<Ob*HSOFЖ*dMP*Wokr<*ȷAk*NoA d*od>e*ode*ĵok}W*QAk*zAkb**%AkK*Ak*Ade*j@od0*od*y odFU*C҉dL*bod*3od]*Rod)*4od@*7od *od`b*c׉'QK$6Ж֖ ܖ,Q֖ ܖ?Q֖lmin*#,Llmax*Fv,LbHk*ZA,Lb5{*q,LbLH*ܞ,Lb0*,Lb *,Lb*J,LKKKl(*dMP*okr<*$Ak*LAd*Ƌod>e*xode* ok}W*CAk*ڜAkb*=]AkK* ;Ak*;Ade*Ӓod0*God*odFU*Y҉dL*od* od]*God)* od@*xod */od`b*{[׉'Q$_lr xȘQr xۘQrlmin*rlmax*`grbHk*rb5{*rbLH*srb0*[rb *y<rb*r~)* dMP* |okr<*5yAk*DAd*hod>e*O_ode*{ok}W*u_Ak*p Akb*oOAkK*tlAk* |Ade*":od0*#.od*$odFU*%҉dL*&Óod*1od]*2؛od)*3God@*5Ptod *6od`b*7׉'QL$5 dQ wQlmin*4lmax*ibHk*Vb5{*)bLH*)Nb0*+^b *-*/b*/D*<dMP*=6dokr<*DAk*ESA d*F|od>e*G)ode*H֚ok}W*IOAk*OZAkb*PڔAkK*Q}5Ak*RAde*Tv od0*U5od*VqodFU*WNK҉dL*Xod*c{od]*d*od)*eod@*god *hoSod`b*iG׉'Q$  Q Qlmin*@Q>,lmax*B¢,bHk*K(,b5{*M_,bLH*[a,b0*]0,b *_,b*a,@*ndMP*oUokr<*v0>A k*wsA d*xAWod>e*yode*z:ok}W*{Ak*Akb*"AkK*[Ak*Ade*od0*od*!BodFU*2҉dL*+}od*Ϧod]*&Nod)*od@*od *B od`b*#׉'Q$\@F LQF LQFlmin*r4lmax*tbHk*}^b5{*"bLH*n=b0*'b *vb*Rܣ*dMP*e8okr<*Ak*?A d*Hod>e*aode*Zok}W*Ak*@MAkb*8AkK*Ak*TqAde*od0*&od*odFU*҉dL*Zod*God]*,od)*8od@*od *2od`b*u׉'QW $Hܣ 8Q KQlmin* lmax*~ bHk* b5{*fn bLH* b0*n b * b*d4 WWWx`*dMP*Aokr<*b`A k*sxA d*od>e*13ode*{ok}W*yAk*tAkb*AkK*Ak*,+Ade*9od0*wod*nodFU*t҉dL*7od*jod]*od)*w$od@*od *ood`b*c0׉'Q$"x~ ԥQ~ Q~lmin*WLi lmax*)i bHk*-i b5{*{Ni bLH*ōi b0*i b *{i b*?si *dMP*Jokr<* 6DA?k* Ad*od>e*]#ode*)0ok}W*NAk*Akb*1AkK*>Ak*~Ade*Eod0*_od*-odFU*r҉dL* {od*+ od]*,ΰod)*-aod@*/Vod *0hod`b*1׉'QX$Ҋ pQ Qlmin*C{ lmax* U{ bHk*y{ b5{*p>{ bLH*#{{ b0*%{ b *'"{ b*)X{ &*6dMP*7Uokr<*>hA@k*?"Ad*@pod>e*Aode*Bok}W*C,Ak*IAkb*JAkK*KzeAk*LoAde*Nuod0*Ood*PTodFU*Q *҉dL*RfBod*]A{od]*^%od)*_od@*a]od *bod`b*cg׉'Q+$#  Q Qlmin*:$ lmax*<E bHk*EH b5{*G~ bLH*UbV b0*WF b *Y b*[D ++«+RB*hdMP*iokr<*pIAk*qjAd*r+od>e*sT%ode*tok}W*uAm*{O$Amb*|/AkK*}Ak*~A&de*]od0*Vzod*DodFU*҉dL*od*Hcod]*od)*cod@*Ood *;Iod`b*џ׉'Qǫ$V+RX ^QX ^QXlmin*l)clmax*n bHk*wwhb5{*y(bLH*b0*eQb *Nb*]ǫǫdǫ`p*dMP*1okr<*XA5k*KAd*ptod>e*<ode*@ok}W*Am*$Amb*xAnK*2An*bA4de*Yod0*]od*УodFU*҉dL*h"od*od]*.od)*٫od@*Lod *6od`b*׉'Qi:$W RQ eQlmin*lmax*bbHk*FOb5{*WbLH*Yb0* b *Vb*N&iii'*dMP*^okr<*\PA@k*2Ad*lod>e*wode*Ҍok}W*P9Am*Amb*,AnK*ٗA@n*ADde*Àod0*fGod**uodFU*҉dL*4od*od]* +od)* Jod@* Iod * Ɖod`b*?׉'Q ޲$ Q  Qlmin*әlmax*HbHk*ub5{*bLH*Y5b0*b *Ib*ք    %"+&6+"&W3+$XN28 >8 > 82O\D%=+&6+&W3+$5ôɴ ϴ=ɴ ϴ =ɴôO\IIմI%DP +"&6+#D&W3+$$+TZ `4PZ ` PZTO\ ڴڴfڴS7+j"1[""נVH:oX,k,mA#3f,nH#$ SY _XY _8X-,Y ME-W,Y,Bs,BqAYMeV:8aoX.BR.mA#3.E`=G.F:.GjF2.HX.I,$l^d jXd j8X/-d u ABs.j<AdVXUH(cttptj9084h7X0:9#700O,E4 0R,E ,40UDEE42k0XA\3Mfd0[$,E8g0]E,4+0`}E  ,40c}E ,4޹0g=E %y x40k=E x4 LF0n,E60q}E{{Q{ QV)S1""3""p(12b',к$z/' 1 )' 1mƿvdo'm!>)E$ ] )3'm$/&$,$ 2$,$ 2$ͻ,$4! W!{2!V 9!M G}')M~ES YH \V/HM{,$?RX EԼXEX E X,@+.#^ G@M.#^ A@t!pX  PHA!rX @uS ^A׽ƣX AFa)X vdo' !>Mi$SY _Y _ YM,'ƾ$ U[ a޾[ a[4 ! W!29!I 9!?   e Y2^Ri2#R2S #'j!>2)2mi2$  @2Z)E32 ?Qo2OpJ2 ?2߻ \2 ,jjj)r2eT2s#+2t#2u#2v# ')2fY'2g_2jQ<{2k,\2l/2mP2nS Y2oH 2p2q$[U[ aW02hS 8)2y[ 8)2{[8)2}[ a4;2Gl4W8E2l4s2yU[42[ ,4~2)U[4~2G[ ,42U[ ,42P2bl ,442 U[ ,4U2)2Y'2$ m E8m2 ERm2 Eml2,O2 OF2 \2" rrr(2~1r#'\2r{2,\2V22Y'2D2J2/222S Y2H !>2)2P02S E2 E2  A E2 E42 EO2,4p$3F A2 z  A@2")@f2*@f21Qend28Q$end2??@Ase2Fb@^se2M@{*2U@*2]P@-2bKS @u2fS A2t9  AA2 @0K2VA@Rz}2FG @tz}2;A O2, Qat2G Qat2A @2G@2RA@,2G@I2AAg&2 AAwp2' AA2S{Ac2f43ZM AA2A  A4&3o 4L3 Aj2u 23;3  AO2]5  AO3: AOc3g AO3O6(3?;^3  A?93 AO93)  A?2 ?2 O}3 O33 OR-2D Oq21 \43  AA/GA5_@'}A( $5; A%}; A };G}'ۂL_Q<{YH \/$ ۂ ۂLLLp^'ɏ(X (S(h(v(p$  34'$39 ?9 ?9B64 J J EPg/-$5SA5'"s"$"- "="^iINT"":"nSu&5("F"l^ 5AI5B,#-5B,#' 5C #8^5E/87^5F/ 54X$5GW@/ 58r]5H/,4!5J, / ,4J.5Q |AFq65Sӥ@/ 57:5",#E5*s#I5+x#55,,# -5-,#L5.A#U5Y#Q$-LR Xi-R X-R,N5$1n,cN5%,R ,8-50R4P57}?Ac M458tAc M6n5:A x;;ll^l^cv45^%5hri5i,rf5jrd5krs5l rpv5mPH$)ci oi oK5oi1l#F5eA#$-5f,#(5qu#,Duz,4` 5ssA4:5tPz 4^5umz45vz e ,4~95ww,8v5yz8 v5zz 4-$5{|z 8Kv5}z , ,8iv5~z  ,8v5z  ,8v5z  , ,8v5z PH , ,8v5z , 8 v5z  8'v5z  8Jv5z  , 8mv5z PH , 4$5,z ,4$5dz 4$5Mz 4$5X1z 4$5q1z 48 5Vz  ,4^ 5̐z PH ,4$5Tz 4!5z 4!5[ G4!5Z 4!5y 4$!54_ 4E!5 6!5C uuuuiiiss PH+ep6E6s#56,# $5ek q,"pk q,:~pk,sQp6k tp6k ,w#P6,S6.""R8",1n#6/060s#Yh61#$2 n#  m#,Kn#62 767fOK68A#k$8<  7 8 7699 6:Y a|H 6H7E6Is#756J,#$0 H  ,G ,8EH 6M 8^H 6N ,6 6P A 1M#B77@6=#7o6>s#7z#6?,# 7)6@#7 6D#7;6E#@64i65 $, 8# Q#,;j6B 8#6Y 8#6_ M4/6c 4/6d66 3str6i+1 3log6kz 47Yh6m6 4]Yh6n(A M4~#6p4, ,4#6q0, 26s54$6{; 4L6~L  4>6  40 6$ 4K[:6{=s 4l'6Q/ ,66111;o!vd)o';!>$ + ';p$X7 $ $4!z W!Kz2!B? z 9!  z}'M~ES YH \zV/(-{i$28 E8E8 E8,@.#z> @.#> @B!z8  PHAe!%8 z @uTS >Aƣ8 z Fa=8 z_[vdT)o'_!>7$!' -O' - ''_$`DJ PJ PJ4!* W!Y52!H 9!# w>32^Ri2#R2S #'8!>22;i2_$Q  @2;E2 ?o2-zO>J2Z z?a2 \2: z888X*2eT2sz#+2tz#2uz#2v# ')2fY'2gX_2jQ<{2ki\2lz/2m^2nS Y2oH 2p2q$Tci oW02h+!S 8)2yi z 8)2{i8)2}i o42z48E2,zz4;2ci4\2i ,4x~2F3ci4~2Bi ,42:ci ,42P2<z ,42ci ,4z}20z ,9B2Ni uu(218#R2#RD2#'m\28!>22Y'2X$o 'm EFm2 E`m2 E{l2,O2? OF2 \2"6 0(2~1#'\2{2i\2zV22Y'2XD2J2/222S Y2H !>22P02 "S E2 E2  E(2 EB2 E]2,4~$3F?# A2   @2"Q@f2*#@f218XQend28Q2end2?N=X@Ose2F>@lse2Mm@*2Ug@*2] @-2b2S @u2fS A2t   A!28 @>K2h4A@`z}2j& @z}2!  O2 Qat2n8 Qat2 @2@2 @:2$@W2]<Au&2 Awp2'E A2SAc2fq43Zb A2  443o& 4Z3 Ax2 23 ;3 O2]7  O3: Oc3gF1 O*3OD(3/;l3η  ?93 O93)  ?27 ?2: O"}3- OA3V" O`-2D O29 \43:  AM9|||( __V_D}'ۂ[_Q<{aYH \ /$q ۂ ۂA[[[4xi' _kQ<{maYoH \q /sw$ӭ  A   Adcdcdc H '}'ۂ_Q<{aYH \ /_$= wۂ ۂA7@ri'_kQ<{maYoH \q /s7$[<B H'B H BANAeejeu jE* 9N79xz#7D9yz#7+9zz#'b6!>9n9|;$ b6 4,9q8Eb69t NgM29X z Z!9& z ^" 91#'8\9!>9$,^d j8d j8)89d 8G89d  K89d,pZ  91#'u\99u{9i\9zV9Ā9ZY'9ǐD9J9/999S Y9H !>98F9 8i9  89 E9  E9),4$: A9B  @9[@5f9cZ@Rf9k.Qoend9s$ZQend9z @se92@se9D$@*9t@*9A @-9S @:u9%S A]9m   A{9# @9S @K93A2:F  @z}99 @z}9 O59  QVat9C Qwat9)5 @90Q@97g@9>:@9EdA wp9T A"c9h4H:YhZ Z Ap9  Z  4:i,,Z Z4:uZ Z ZA91 A9;:.  O::5  Z  Z9:ߗ4 Z 8D1B;#R8Fz#'lZY8JH /8K;\8Lz$;; <l; <El8N;El8Q; <@18Z <@N8E8]`z<@k8`h';;@8cZ; ,@~8g6;;@~8jZ; ,@z}8o< @8s;; @22P8wQ0Z< @T8{ ;; @v;uw$ , +,8,;3log;Z 6 ;%!X ,  ;;*; }'ۂ/_Q<{iYH \/$( ۂ  ۂ///sSi'_kQ<{miYoH \q/ssK$ 4x~ c~  ~R<x<s#d><s#R,8<R 84<R X6$<cR X^S=""S5=""1""V v>C$U# )# )8>E#K>K#,/5>l>pmsg>q #err>r #$)   M>t1@: >[cerr>>bcmsg>=b>m $   &85  &8L5>w 8f5> ,4>, 14l*>, 14>  < B 9>( @@@, @\7y@x#map,@b Ԡ@c<{@dom@ez!y@v!>@}/@~#@#@DY'@ @S Y@H \@V@#J@b"D@\" $,s map@$s map@$  s4 map@$ $4U $@V$$ $4q @S$4 f@5D$4 f@V $3 end@ID$3 end@N $@ se@gwb"$@ se@ ^\"$@8 *@bkb"$@U *@ͥ\"$@r K@r_A$@ -@#۞S $@ u@'[S $@ z}@8 $$ @ @T"$ >@ @luD$ D >A5 @Bm$ D@W @>S $ Az @$ D DA @u$ $A @CR$@ @Qv$@ @]F $@ J@CD$ @/ J@z $ @Q Kv@zSS $ @s U@6D$ @ U@ j $ @ +y@(ZD$ @ +y@ a $ @ 'D@33E#$ B'D@Fw#$ 44,47bGA))vd|bo'd!>$1[   n}'M~ES YH \V#/A<F<{o$_K<Q< EQ<EQ< EQ<,@.#NW< 3@.#C#W< >@=!;Q<  PHA`!Q<  @}ulS W<AƣMQ<  >FaOQ< dddZvdOo'Z!>2$CF" (J" ( "h'Z$11 11 114!ߡ W!2! H  9!x S. # R#.#'3!>#(#1Z$  @#)]E#+ ?R#4\Ƞ#7F mO#y1o#+#{o#'#zq$+ + + 333h#=13#'8y\#?3!>#@$cjhn t68yn tEP8y#Cn H7y#Dn,z>B?o'%fb?p ?q B?rA$e %f  %f(v?1#'R$~W j }6 ?A   o #K1#RCv#S #Rm##':\#L8?#Op#P,#S {#To\#UV#V#/#W.#X9#Y#ZS Y#[H !>#]#DY'# D#\"J#b"@#^,Ih"?Y#g_s" >?6&X#us" OU5f#:s" ?s #"My"h"?3#y"h"?#Dy"h"?#MJy" ?(n#y" ?̂#1y" ?#ˉ#{3 ?@#op ?]N#" ?z#vLy" p?(n#Ey" p?̂#jPy" p?ˉ#W3 p?#y p? N#a|" p?(3# ?E#b ?r {#Ds" p p >?ʞ#fs"  OI#LDs" E:#s"E:#s" E:#s"  E!:#s" "E<9#s",@^$#s\"s" "Oxى#;s"@#Sh"@f#fDs"@f# h"Qend#xDs"Q end# ~B h"@&se# b"s"@Cse##d\"h"@`*#Qb"s"@}*#\"h"@K#4XAh"@-#US h"@u#YS h"A##vs" "@%# M"s" >@6.#qDs" >@]%#&ޣDs" D >@.#PgDs" D >A#*Us" D@#SS s" A#Xs" D DA #ds" ?# ?#A##Lus"@EJ#^KDs" @gJ#Se h" @Kv#QS h" @U#&Ds" @U#8Bf h" @+y#J{Ds" @+y#\} h" @3'D#p,E#s" @U'D#yht#h" BV#mGAh"JBEBI#(BJ<#'o<BF!BG<$3 > >8BOKBT  +o)o3o>) #1p#'mD{#o/#+\##DY'# #D#$W++ ~+8m#+8m#+ 8 m#+ ~+41 #K3+4M 8E#+4i #Vl++4 #kD+ ,4 ~#?++6~# D+ ,\"#1p#'m {#o/#b+\###DY'# # #O!$bg+m+ s+g!mm+ s+8{!m#m+8!m#m+ 8!m#m+ ~+4!#+>+4!8E#is#+4"#΢Ag+m+4""#ձ m+ ,4>"~#lg+m+6~#Z m+ ,~n"on"?#BEBID#(BJA#'"<BFD!BGA"$My11 1#1 18$#BO1KBT1 ~+ 1#qBEBID#(BJD#'E#<BFD!BGD#$s55 5#5 58#BO5KBT5 ~+ ~+n3>$$<mm8$m$}'ۂ=$_~Q<{,YH \/$$$`$$ $$ۂ$ $ ۂ$G=$=$$=$w&ւ0^,{Uxp  xPx,Px/,PxnL xl Wx([  x,Py#b~z%&#|(|{&|&}z%&7|e|{&{&}'7|N|{'z!&&e|||&R|&}}&x||{&{&}'x||{'z8&"'{,'z&H'$-{R'}i'$-{s'{~'z&'$*{'}'$'{'}'*-|'Q{'~'R~'P&T4&__s i g'X4&__s  '>__s bC'4C'A'i'S4&A'O4'__a ͐'3cLJ'JQ4'g' Q4'(lb1Dl1(W31,G2D062DEw*?D),Uxp ) x/),PxxW),Px}),PxҞ) xA) y#*b~zD)*{*{*}*{+{+z)*ρ{+{+~,+~}?+{I+{T+}'{'~,+~}?+ց{I+{T+}'ց{'z)H'6k{R'}i'6k{s'{~'z)'6?{'}'6<{'}'?W|'Q{'~'R~'Pz-*"'{,'}H'{R'}i'{s'{~'}'{'}'{'zK*'|'Q{'~'R~'P}H'{R'}i'{s'{~'z*'{'}'{'}'|'Q{'~'R~'P*V4&Ԕ *g:+ xM x:+ x Ԕ yMgb+W4&__s  >  y+ +Dy+3DD++<+5,ʎ?f' +?goB?h ,$c5,;, A,%, ;, A,  ;,++G,+,ɦ?1+#'RL,,$,, -,R, -,R,@, ?H- 3B ?- >L,L, -L, -.f6Uxp 6 x#6.Sp7 yQ>.Pz-.{.{.}.|.Rz-.Ĉ{.{ /}"/Ĉ}8/Ĉ{B/}S/Ĉ{]/|h/P}/҈v{/z,.0҈{ 0{0}/0҈{90|D0PzJ./05E{90|D0Pzh./0ET{90|D0P}/0]k{90|D0P1..!4.=m#Ļ.m+~+. 4.__x@.$/`#A__x#/__y#/s+~+8/ 4.N/4N/s"u/4u/__x#Ù+b/:4C'81/1V/d*/$Ub// / d*/ /////%0/:4%08Cm*0//R0S4&Ԕ fR0g1DUxp D x#D1SpE yQN1Pz0.{.{.}.|.Rz'1.{.{ /}"/}8/{B/}S/{]/|h/P}/‰f{/zo10‰Չ{ 0{0}/0‰Չ{90|D0Pz1/0%5{90|D0Pz1/05D{90|D0P}/0M[{90|D0P1.ZZ1Z""1"o3THUxQT<PxITB xAT3Qyp U z23{34z24{4}'{'}'{'}%4{/4}R4|g4R~t4hz24{4{4zS34Ȋ{4{4}"/Ŋ{,/}8/Ŋ{B/}S/Ŋ{]/|h/Pzt34ҊՊ{4{4{5}!5ڊ{+5{C5z3V5ڊ|`5P{k5{w5z35|5R{5}5{5{54L]4'__n S %4JU4'H4 >:9H4?9M4AA4 4.__k@84__i@<D4Q 4.__x@44#A__x#4__y#4~+~+5}45__x?5__y?5Q5 4.w@lD__x@lQ5>545__aBT5__bBT5+54u/=m#ĵ5~+E#E#5E#e6&i}'ۂ5_~;{oYH \/e6=6$}j6p6 v6U6ۂp6 v6 ۂp6355|65K7`H!Uxp ` pa z6.Tf{.{.}.Tc|.Sz77.fk{.{ /}"/fk}8/fk{B/}S/fk{]/|h/P}K7{`7n75 4.__x@n7w7Ak&bx$UxIk,w7Rh,Ui,w7zC,Ufw$8, *UdwP8},,6Us w}8,8BUpvPHw8ťM DUret3?9}'ۂ8_Q<{iYH \z/?99$F%D9J9 P9/9ۂJ9 P9 ۂJ988V989<^'[9_(ɏq(X r(Ss(ht(vu(9$&9: :9: : :[9[9 :[9:.}'ۂ:_~Q<{iYH \z/:}:$:: ::ۂ: : ۂ:::::+;+'>:e (;$4+;1; 7;;>1; 7; >1;::=;:;i'B;_kQ<{miYoH \qz/s;;$;; ;;; ; ;B;B;;B;ZZ <Z<z <A6<6<3><A@'}]<A(<$p<< <<}< < }<]<]<<]<H=1@'}<A( =$hH=N= T=8=}N= T= }N=<<Z=<=}'ۂ_=_~Q<{,YH \/==$== >=ۂ= > ۂ=A_=_= >_=>}'ۂ>_Q<{,YH \/>{>$(>> >>ۂ> > ۂ>G>>>>)? '>>e (?$)?/? 5??>/? 5? >/?>>;?>{FOa U4{F__x3FF -3G(cz?Ft{F}Ft|F}|F}z?F{F}F|F}|FVz@F {F{FzT@G!|G|$G}KG!{UG}aG!{kG{vGz@GK`{G}aGK`{kG{vGz@Fl{{F{FzQBG|G~|G~{Gz@F{F{Fz AG|H~|H~{)Hz(AFYq{F{FzAGHq|ZH~|gH~{HzlAF{F{F}H|H}|H}{HA`~HQ}H%+{H{HzAFAM|FV{FzAI{IzB0I{:IzBFI{PIz6BaI{kI}F|FR{FzoBwI{I|IPzBI F{I|IP\a y3N}zCI\{I{IzBKG\t{UG}aG\t{kG{vG~I~}Iz||IW{I~ JQzEG]|G}|$G~zmCKG/{UG}aG/{kG{vGzCFJ{F{F}G]|G~|G~{GzCF{F{FzCG|H~|H~{)HzDFFp{F{FzODGHp|ZH~|gH{H}F{F{FzxDH|H|H}{HD~HQ}H{H{HzDF  |FW{FzDI$'{IzD0I),{:IzEFI,.{PI}aI<I{kIzE&J]{5J|MJ}|ZJ}z^EF]{F{FzEG{G}aG{kG{vG}tJ{J|J~|J~{JzEF {F{F}F{F{Fz FwI{I|IPz(FI {I|IP a ~JSz^FJ$ ) }J$ ) {J}I. 6 {I|IPF4FFo2AH __x2AF__y2AFaaF4F__x2}F[aKG4V4V4VG4V4\(aG4FG4G__x2}G*<aG4FG4A4A4AG4A (4B(GH`4*4*4*G4* (4,,4.(H74 4 4 G4  (H444G4 Q<84H __n4H  I2AH __x2A I__y2AI0<0<+I4+I;<FI4G\I4\IlwIW4FIv4Fm2ƴI64Gm2ƴI4+I__n2H 062&J4G__n2H 2H 2H tJ24{FiO222e2(J24{FiO222 (2Q<JO2TS d2TS rK4'J$K$PrKxK ~KQ{HQ~TQP}aQĒ{kQ{vQ}QΒ{Qz OOے{O}P{P}QEL{Q}QEL{Q{Q}QEL{Q{QO 4.AO!4N/AO 4N/Os4Oh"PU4OP4O2PR4&`PN4`P __a ePbLJPO4'P̅GlG(W3G,P 4.P4N/\j#P__a#PQ64Q__a#CQn9Q49QaQ__nS R|Q49Q |QQ^4N/QP4QAQ49Q__p#7Q__p__nS #Rк>z4C'81#R1VQU| R|R zhRV{V{Vz*UV"|W}|WVzR%W"%{/W{:W{GW}F"%{F}F"%|FQ|FSzR_W`m{iW{tWzSWmp|WWz'SWps|WPzTW|W|Wz{SKGݔ{UG}aGݔ{kG|vGPzSGݔ {G}aGݔ {kG|vGPzSF {F{F}W@|W|X~{XzTF|{F{Fz,TGЕ|G~|$G~zHTF{F{FzTG|G~|G~{GzTFNZ{F{F}GZ|H}|H}{)HzTFҖޖ{F{F}GHޖ|ZH}|gH}{HzUF5M{F{F}FMq{F{FzUH'֘{R'}i'֘{s'|~'SzU'{'}'{'}'|'Q{'~'R~'Pz.VH'֘ {R'}i'֘ {s'{~'zV'֘ܘ{'}'֘٘{'}'ܘ|'Q{'~'R~'P}#X {-XzVDX 4zoVF %{F|FP}F%4{F|FPzVX^d{X}F^d{F{F}F{F{FV/>G4%08CmV/ W4{F__x2 WUW4UW__a2ZW2S zW4zW WW4FWEmEmEmGEmEn,aEo(#X ELELELGEL (DX44{FAXAAA3A,A(X2As (?Y"'U|,'}H'J{R'}i'J{s'|~'VzY'{'}'{'z.Y'|'Q{'~'R~'P`YR4UWAY?YCU|IYSzYY%({Y|YR|YP}Y+-{Y{YY4zW__p2__n2S  Z__p__nS 6[#QU4N/P__k#6[W__y#R__x#P__j#DXzZS/(+{]/{h/zZ4+.{4{4}8/+.{B/}S/+.{]/{h/zZ403{4{4{5z[8/7={B/}S/7={]/{h/}5EL{5{5[TU4N/P__k#&[P__y#'Q__x#(R}S/z|{]/{h/]6FU4N/Ww#&D__v#&]V\#;DHz\]{ ]z7\5|5P{5zm\4ƚ{4{4{5},]Ě|6]R}4њӚ{4{4{5},]њӚ|6]Dz\5 ${5{5z\4$){4{4{5}D]$'|N]R}47:{4{4{5>,] 4u/D]__x#p\]#__x#]HU4N/W__x#V__y#S}]mx{]{^}Qmx{Q{Q}Qmx{Q{Q^64N/__p#_ U4N/__x#_S__p#E#X__n#S z^_{_{_}_{`{`{`z^5{5{5}5{5{5z^;`}f`{`~`Vz_5Ûƛ{5{5z-_5ƛɛ{5{5zK_5ɛϛ|5S{5zi_5ϛ՛|5W{5z_5ٛܛ{5{5z_5{5{5z_`{`}`{`{`_4N/__k#p_,`#4,`__aBT1`__bBT6`5~+~+f`EFpH FpDFpD`CFLH FLDFLD :__nFPH `M 4u/``#A__x#`__y#`~+~+bmU4UWW2S  2S V^2S2Vzgab-{+b{7bzaTb/3{^b{ib}wb/3{b~bRzawIPc|IR{IzawIcz|IR|IPzbY{Y|YR|YP}Y{Y{YDbD94Db__a4Jb__b4Ob(cDbDbwbp4zW__n2S b__nS RcHԜU|H |H|Hv|H0Tc~HQzbH6{H{HzcILO{Iz)c0IQT{:Iz@cFITV{PI}aI`i{kIzpcFq{F{FzcwI{I|IP}Iʜ{I|IPmn&V U4{F x3qx3zdmn{n{nz dmn19{n{n7i__n3H  3H z^dFN{F{Fz~dF{F|F}zdF8{F}F8{F{Fh0y,3}zgnRBzdFRa{F{FzeFaj{F{Fz+eF{F{Fzven{#oz]eF{F{F}F{F{FzeF{F{Fz#f5oZ{oozeF{F{FzeF6{F{FzeF6N{F{F}uoNZ}FNZ{F{Fz?fF{F{Fz[fF{F{Fzfo5zfF{F{FzfF{F{FzfF#{F{F}o#5{(p}F#5{F{FzgFw{F{Fz$gF{F{F~-pVzUgFI{PI};p{EpzgFI{PI};p{Ep}F!B{F{FzgQpBK{[p{fp~rp}}FBK{F{FzhFly{F{F}ply{p{p~pQ"hH~pSzLhDX}F{F{FzhhF!{F{FzhX!'{X}F!'{F{F}Fco{F{Fz(iQp{[p{fp~rp}zhF{F{F}F{F{F}p{p{p~pQ`~pSz\ip<E}J<E{JzziwIJU{I|IPzip}J{JziwI{I|IPziwI{I|IPziwI 2{I|IPTnL y3}zlpL zCjFLU{F{Fz_jFUs{F{Fz{jF{F{Fzj q{Dq}F{F{FzjF{F{FzjFA{F{FzIkVqA{qzkFAY{F{Fz0kFYe{F{F}Fe{F{Fzxkq{q}F{F{FzkF{F{FzkF {F{Fzkq 1 {$r}F 1 {F{FzkF7 I {F{FzlFI [ {F{Flx~6rWzDlFy {F{Fz[lFI {PIzrlaI {kI}aI {kI}F  |FW{Fz5mDr M {Nr{Yr~er}zlF B |FV{F}FB M {F{F}rrB M {|r{r}pB M {p|pR~pQzmDX 0 zbmF {F{Fz~mF {F{FzmX  {X}F  {F{F}F  {F{Fnq ~pSznpw | }Jw | {J}wI {I|IPz9nwI {I|IP}wI {I|IP}F 0 {F{Fns2A__x2Ԙn__y2ԝnaan444G44(5o444G4 (4(uo444G4 (o444G44(oOK44G4;p4s4s4sG4s Q<__n4tH Qp4Fp4\I__n2H 062p4F__n2H 2H 2H  q4V4V4VG4V4\(Vq,4A4A4AG4A (4B(q44*4*4*G4* (4,,4.(q4 4 4 G4  (Dr2444G4 Q<84H __n4H rr44\I__n2H 062r4F__n2H xܼ3\U4{FiO3 33 i;0__n3S zesx |%xX|1xH}>x]v|Px|\x{hx}Hqs{H{HzsF|FR{Fur3}ztnxr{xx{x~xP}Qp|[pV{fp~rp}ztF{F{F}F{F|FPzBtW|W}|W}z^tF1X{F{FzpuWX|W}|X}{XztG|G~|$G~ztF{F{FztF{F{Fz0uGi|G~|G~{G}GEi|H|H{)HzLuFu{F{F}GH|ZHH|gHX{HzuF{F{FzuF{F{F}F|FV{F,3zovx{x{xx}Dr|NrR{Yr~erz=vF{F{F}F{F{F}rr{|r{rzvW1|W|WzvF"{F{F}W(+|WH|XX{XzvFmv{F{FzwGv|G~|$G~z.wF{F{FzwG|G~|G~{GzrwF'0{F{FzwG0i|H}|H}{)HzwF{F{F}GH|ZH}|gH}{HzwF{F{F}F#{F{F>xFpH FpFpnxF[H F[F[ Q<x4{F__n2S Z2S x4{F__n2S Z2S zԜ}U4N/ __v# z__y# V__x# S\j#AP__j#DXz^y4{4{4{5z|yS/ |]/R{h/zy4{4{4}z{z}S/{]/|h/Pzyz({z{z{zzzz(D{z{z{z}56;{5{5z6z]KZ{ ]zlz4Z_{4{4{5},]Z]|6]R}zdl{z{z{z}5df{5{5>z4N/z$#4z__aBTz__bBTz1~+1w{dU4UW^2W2S2V}w{"{{}{"{{~{P{34zW{ͻ__nS R'|pqU|pQ|pR~pS~pVz |p+4}J+4{J}wI9A{I|IP }U4{FS3S  3S __i3S Vz| } {}{"}z|w{7:{{}{7:{{~{P|__j3S S}0}{:}{E}}S}{]}{i}0}34{F2S S}Q4zW__p2v}__p__nS ?3rTU4{FiO3r 3r3r __n3rS 03sg3tS z~FI{F|F{zO~FIL{F}FIL|F{{Fv,3wX3xHz x{x{xx}Dr{Nr{Yr~erHz~F|FR{F}F{F{F}rr{|r{rz%F{F{FzQp {[p{fp~rpzgF |FV{F}F{F|FP3{z?|MV|YR}k{y{{}I{I{I~ JQzF|FQ{Fz1F-|FS{FzOF-K|FR{FzsG|G{|$G{zF%{F{F}Gj |G||G|{Gz܀G|H||H|{)HzF{F{Fz!GH$c|ZH||gH{{Hz=Fcu{F{FzYF{{F{F}F|FR{FY3|3|3V3{}G  |G{|$G{}G  |G{|G|{G}G  |H||H|{)H}GH  |ZH||gH|{H k~JSzJ$-}J$-{J}I2:{I|IPk^3~z(Qpk{[p{fp~rpz Fkz{F{F}Fz}{F|FPzR}F{F{FznF {F{FzF{F{Fz-{zF-]{F{Fz؃F]r{F{FzFr~{F{F}p~}F~{F{Fz7F{F{FzSF{F{Fz qe{DqzF,{F{FzF,A{F{FzFAM{F{F}VqMe{q}FMe{F{FzF{F{Fz!F{F{Fzlq{qzSF {F{F}F {F{FzFIa{F{FzFas{F{Fz…F~|FP{FzޅF{F{Fzp! z F{F{Fz'F{F{FzCF  {F{Fzن qN {DqzuFN c {F{FzFc {F{FzF {F{F}Vq {q}F {F{FzF {F{FzF {F{Fzq z {qzCF 5 {F{Fz_F5 b {F{Fz{Fh n {F{F}qn z {$r}Fn z {F{FzÇF {F{Fz߇F {F{F0~6r{}F {F{FzFIB H {PIz6aIJ [ {kIzMaI[ l {kIziF {F{FzވG |G||$G|}Dr {Nr{Yr~er|}F {F{F}rr {|r{rzF  {F{Fz#Gl ~ |G||G|{Gz?F {F{FzG |H||H{{)HzF8 P {F{F}GHP |ZH{|gH{{H}F {F{Fz݉F {F{FzwI8\{I|IP}wIl{I|IPznx?{xx{x~xP}Qp?{[p{fp~rp|zvF|FR{F}F{F|FPzF?H{F{FzDr]r{Nr{Yr~er}zF]h{F{F}Fhr{F{F}rrhr{|r{rzy?|MW{Y}k{y{{}I{I{I~ JQzF+U{F{FzFU||FQ{FzыF||FR{FzF{F{Fz FF^{F{Fz%F{F{FzAF{F{Fz_F|FR{FX~JSzJ\e}J\e{J}Ijr{I|IP/I3|z@Dr{Nr{Yr~er}zF{F{F}F{F{F}rr{|r{rzzmF{F{F}F{F{FzF {F{Fz}:{zԍF}{F{FzF{F{FzepzF{F{Fz9F{F{F} q{Dq}F{F{FzF{F{FzF{F{FzFIR{F{Fz3VqR{qzFRp{F{FzFpy{F{F}qy{q}Fy{F{FzOF{F{FzkF{F{FzF{F{FzF|FS{FzF{F{FzݏF{F{F}F |FP{FzvngKz%Fgx{F{FzAFx~{F{Fz]F{F{Fznb{#ozF&{F{FzF&2{F{FzǐF2J{F{F}5oJb{oo}FJb{F{FzF{F{Fz+F{F{FzuoFzXF {F{FztF {F{FzF.{F{F}o.F}F.F{F{FzӑF{F{FzF{F{Fzo{(p}F{F{Fz:F{F{FzVF{F{F~-pW}F {F{FzFIXf{PI};pXf{EpzʒFIfl{PI};pfl{EpzF{F{Fz"G|G{|$G{}F{F{FzKG|G{|G{{GzgFBo{F{FzGo|H||H|{)H}F{F{FzGH|ZH||gH|{HzFD{F{F}FD\{F{Fz#wI{I|IP}wI{I|IPfjF__iFf__nF,$<hF__iF__nF, Q<$<EmEmEmGEmEn,aEo(%ELELELGEL (GIEEWEGEEGEE{F{F{F{F{F{F{Е{F{F{F{F{F{F{F{F{F{F'{F{F{Dq?{F{FP{F{Fa{F{F{qy{F{F{F{F{F{F{q{F{FĖ{F{FՖ{F{F{Y{F{F{F{F{F{F{W{W7{F{F{W{X{XY{F{F{G{$Gv{F{F{G{G{G{F{F{H{H{)H{F{F{ZH{gH{Hܗ{F{F{v{F{F{F{F{F{F{X7{F{F{F{F_Q< _a|gQ< |0<%U|7p|C|O|[$|gr~sXz|zF8{F{FzF8:{F{Fz+FXf{F{Fz{z]F{F{FzyF{F{FzF{F{F}p}F{F{FzؙF&{F{FzF&J{F{Fz qJ{Dqz&FJn{F{FzBFnz{F{Fz^Fz{F{F}Vq{q}F{F{FzF{F{FzšF{F{Fz)q^{qzF:{F{FzF:F{F{F}FF^{F{FzEF{F{FzaF{F{F}F|FP{FzWX|W||W|zF'0{F{FzWBK|W||X|{XzF{F{Fz<G|G||$G|}F{F{FzG|G||G|{GzFe}{F{F}G}|H{|H{{)HzœF{F{F}GH@|ZH{|gH{{H}F4@{F{F}F[p{F{F;EEWEGEEGEEX{W{W{F{F{W{X{X{F{F{G{$Gӝ{F{F{G{G{G{F{F{H{H{)H{F{F{ZH{gH{H9{F{FE{v{F{Fo{F{F{F{F{F{F{{F{F{F{F˞{F{Fޞ{F{F{F{F{F{F{Dq{F{F){F{F:{F{F{qR{F{Fc{F{Ft{F{F{q{F{F{F{F{F{F{Y˟{F{Fܟ{F{F{F{F{F{F{F{F{X+{F{F{F{FӤU|+ |7|C,|O0|[p~gXz W|WH|WzF?k{F{F}Wk|W|X{XzF{F{Fz#G|G~|$G~z?F .{F{FzG.|G~|G~{G}F|{F{F}G|H~|H}{)HzF{F{FzGH?|ZH}|gH}{HzF`x{F{F}Fx{F{FzGzMF{F{FziF{F{FzF7^{F{F}jG{zFj|{F{FzϢF|{F{FzF{F{FzMpzF{F{Fz4F{F{F}F{F{F} q$G{Dqz{F$0{F{FzF0E{F{FzFEl{F{FzVql{qzFlx{F{FzFx{F{F}F{F{F}qG{qzHF{F{FzdF{F{FzF5{F{F}F5G{F{FzFw{F{F}F|FP{FZq4__y#pq+ӤΝU|ݤQΝ~Pcrq4S__y#p__y#p+Н)U|5S~FR"~URqcU4{F3S  3As+3S l3S S3SzPY{|$P{1}KSY{^{k{x{}SY{{{ĩ{ѩ}SY{{{{)}/SY{A{M{YzdfYd{y{|R}Yd{{ͪ{ڪ{}Yd{ {{&{3}9Yd{L{Y{f}Yd{{{zwIdz|IR{IzwIz|IR|IPc#3S hN3zb|+b\{7bzTb{^b{ib}wb{b~b`zŨ{|$P{1}K{^{k{x{}{{{ĩ{ѩ}{{{{)}/{A{M{YzY{Y|YR|YP}Y${Y{YKf4V4V4VG4V4\(4A4A4AG4A (4B(4*4*4*G4* (4,4.(/444G4 (fh44J4JG4444G44(444G4 (4(9444G4 (444G44(4J4JG4R4K0U4UW^2" 2"V0__n2#S}0}{:}{E}}S}{]}{i}+E,ҞU4N/W9B#pԉ#pV__v#+R__x#__y#__z#Sz߬S/{]/{h/zP{Pz4{4{4{5}PƞȞ{P>Ԟ U4N/P__k#JP__y#KQ__x#LR}S/{]/{h/ U4N/S#Dv#Dwz94%{4{4}z#{z}S/#{]/|h/P}O{Oz4,/{4{4}8/,/{B/}S/,/{]/{h/zخO3p{OzOPR{OzĮOUW{O}P^`{Pzzx{z+ïx{ͯ{د~ݯ}5|{5{5}]{]{^}Q{Q{Q}Q{Q{Q}`{`{`ï4N/w#D__y#i 4u/ ,06#DjmU4{FVW7y83S}0}'{:}{E}}S}'{]}{i}}0};N{:}{E}}S};N{]}{i}nU4{FS3S  3S __i3S Wzn{x{z#w{03{{}{03{{~{P=h__j3S S}0}{:}{E}}S}{]}{i}R4{F2S qU|rw| rq|rv|$rK~6rSzF ,{F{Fz FI8:{PIz aI<?{kIz7FI?A{PI}aILV{kIzgF^v{F{FzwI{I|IP}wI{I|IPKK#3__x#3pFy#3ݲ__y#:p__y#Ppp@U|V| -߲t~ϲR#mp__z#mpFy#mqb#m3D#m __y#np__x#opg_#ppų{{+7ѳ{Xݳ{o__w#p__w#pD^4y__a4yD__b4yI064}o""ep__x#jp|p__x#qp>@ĠU|SQ|` |m|z~W~S~Vz17{{+~7R~R4ע~Rz(e(=|oR}NUj|XR4N/__x#g06#h{-Q{HQTQ{ӵ{ߵ{{{Q{Q{Q{Q>TAN__pANgpAN>N \e S __p \e>ͣU|H|SP`zo#Q{-Q}>Q{HQ~TQQ}ŵ{ӵ{ߵR# __x# pFy# __y#pУU|Q|S~R%R# __x# pFy# %__y#!pT`U|Q| S~RE~@x˓U[@x̓Ua\6,'xPH\>-Q ԷԷ\*ԷԷ/yDMz &&1&C&U&g& y&@&&&&&&& '@"'4'JF'Y'k'}''''''' BDEEFF-F@F8P/N@NaPqqqqrr Orsrr+u=uOuausuuufIG/ra\r]x{{{{{{{{|!|2|C|T|e|v||||||||}}8}I}~zDݬK]% `q -.hp12 =ɹ.#8)H#dayH#$U  2  2  %q  ! ! !`c:&6'H#3(H#()H#8$`fl Pc:fl c:f   r@G12.#)3H#day4H#65H#36H#(7H# @v8# $%GMS 0GMS GM @ w w Ywy%VW#)X#$2 y% y% ^ ^ ^\day]#6^#3_#(`# va#`$ x    ef#Hg.#Dh Y^"i6bj$5._1._1g8k#s$/  1B\0,+A"     .        6>##p$%5 6> 6>int E % % %0###$%06< #6< #6   BC |4eT#_4yb43n#T#val#$$$* C$* C$  T E G G 0G2ba@ B#c_ \# \#qe #$% 2 2 5 5  5 7y  #! B# j - H  $   ._2  ._2 u19#!   $    ._3  ._3 u2# 0?7#/ #j $Y2   7  7    B  Y 9 9  9        &+@, \-D./,06> O:8P ;3?+R@_x  \ ]  ^3 ._4x  $    ._4  ._4   x x  x '*<1@i2@lR3@:4@ e78E 9S;y ĺ,  -( !.( \/ k0( *13 2 P3 /4t5( C 6 B ; D @ D E !, J  , O( R: T3 Q: YE P ] x ^ S _(  `E # R \ W | e. fZ6 gFP h@<7 jˮ k l_Q m@^ o N, rE P, s3 W t  P 3 P E @| 3  ( ƺ ~ WD 3 h ( @ (  e ( aj (  $m 8 ( ,  4  e Wu  $+  t   @ @Q   # q 5  5  " = 5 6#$*Z = =a m m m= 7m .n  9 J 9#  9#W$, o !q      G H< U L V# ~ X# N Y#$@ ,   ] IG \ u ]# f# / i# R j# k#  l#$CV*06 06 0R Jj*W { 88 |# ~d }#B$ AGM Z*WGM *WG Ku y # # # DK X# E #$`^dj dj d? L ev # a #b$uu{ z{ {F Mώ <# - #${ ώ ώ N?  # 3 #  #f$k ~? ? OOy$  # #  # : # # #  # '$F ?y y$ PZ? z ҟ# B #$QU ? ?B Q+ ڟ#  # b # ') #  # ĭ # I #c$& {+ +] Rns B # uw #$7  ns  ns S"   % G G <G   S < u u pu             Z Z Z       ;! 8 e@ 9##rem :#._5!m$._5._5 ! ! ! @' = e@ > ##rem ? #._6$'-3._6-3._6-   9 JI E e@ G> ##rem I> #._7I$._7._7 I I Ibi QObi N e@ O ##rem P #._8)$OU[@._8U[._8U   a  >$s     f f fu*8% & # |' # U( # J) # * # + # |, # Q- # . # / #$ i<0 #( m<1 #) 22 #* 33 #+ 4 #, mi5 #- gC6 #. z7 #/ 28 #0 9 #1 3: #2 ii; #3 cC< #4 v= #5M$qu{ e*{ *{   ; K QL# -M#$       5Xj#_pk##_rl##_wm# n# o##_bfp# q# ;t# u# ]3v#$ w#( x#, {#0#_up~#8#_ur#< p #@ p#C#_lb#D ϛ#L #Pe$*06 }506 50$ $  $>  $  * $ $ <$5$%7tm,K rL# M# fsN# 'EO# *&P# 8rQ# 8|R# _S# T# @U #$ 'V #($7=C&(tm=C'tm= L L IL1 2 # 43 #$$   N N NE ,{9 :%# &; # $E K Q 5 ,{K Q ,{K    W  mK V}L# M# $V   m  m  \ \  \ S!t cN# KN#+!$S!Y!_! C!tY!_! tY!   e! !5 c# K#!$!!! !5!! 5! j! j! !j!"\#hz# >4# g# # #b"$""" z"\"" \" ! ! "!#>U 4V#"$eW# ## "> ## > # " " #"#"o p## Aq##b#$### z#"## "#(lwp # # # # ###$~ ## ###$CE#$)$/$ $)$/$ )$ # # 5$#$ <H N# I|y # n # D$#  #8 LN#< #@ l #D$$x7%%% $ <%%  <%%k  :$ :$  %:$%x~#pad%#_%$%%% w%x%% x%% %% %% %%%.RW +,.-<'(8)@;UH'()y<['()N= Z'()>g'()7V?'()@r'( )t~A5'(@)(nBK'(*#eC'(*eD]'(*EN^'(*FF''(* 'GV'(*H '( *<IC8'(@)RJ'()JKq'(J*zL&'()3O'()P'()Q'()T X'()VU'()`V%'()W'()Xv'()6Yk'( 9'$[,(2(8( (2(8( 2( % % >(%Qx  EV(ŇZ($}((( (Ň(( Ň( Y( Y( (Y()I[($X))$) )I)$) I) ( ( *)()9{+/)ɏ|Y(X }Y(S~Y(hY(vY()$^))) ))) ) /) /) )/)n*R+)ɏY(X Y(SY(hY(vY(F*$n*t*z* ^*t*z* t* ) ) *)++O+*ɏY(X Y(SY(hY(vY(*$ ++%+ ++%+ + * * ++*+3 +0+ɏY(X Y(SY(hY(vY(+$J"+++ +++ + 0+ 0+ +0+o,k++ɏY(X Y(SY(hY(vY(G,$o,u,{, _,u,{, u, + + ,+-S+,ɏY(X Y(SY(hY(vY(,$- -&- - -&-  - , , ,-,--+1-ɏY(X Y(SY(hY(vY(-$`d--- --- - 1- 1- -1-p.S+-ɏY(X Y(SY(hY(vY(H.$Wwp.v.|. `.v.|. v. - - .-/~+.ɏY(X Y(SY(hY(vY(.$C/!/'/ /!/'/ !/ . . -/./8+2/ɏY(X Y(SY(hY(vY(/$b/// /// / 2/ 2/ /2/q0C4+/ɏY(X Y(SY(hY(vY(I0$Mq0w0}0 a0w0}0 w0 / / 0/11&+0ɏY(X Y(SY(hY(vY(0$:1"1(1 1"1(1 "1 0 0 .101:g+31ɏY(X Y(SY(hY(vY(1$111 111 1 31 31 131r2P@+1ɏY(X Y(SY(hY(vY(J2$Cr2x2~2 b2x2~2 x2 1 1 213g+2ɏY(X Y(SY(hY(vY(2$K3#3)3 3#3)3 #3 2 2 /323+43ɏY(X Y(SY(hY(vY(3$333 333 3 43 43 343I4k +>3e Y(!4$I4O4U4 94>O4U4 >O4 3 3 [434+>`4eY(4$Pk444 4>44 >4 `4 `4 4`4K5 +>4eY(#5$2K5Q5W5 ;5>Q5W5 >Q5 4 4 ]545d+>b5eY(5$&555 5>55 >5 b5 b5 5b5M6k+>5eY(%6$[M6S6Y6 =6>S6Y6 >S6 5 5 _656. +>d6e!Y(6${666 6>66 >6 d6 d6 6d6O75)$+>6e%Y('7$O7U7[7 ?7>U7[7 >U7 6 6 a767X<(+>f7e)Y(7$p.777 7>77 >7 f7 f7 7f7Q8`,+>7e-Y()8$Q8W8]8 A8>W8]8 >W8 7 7 c878ۖ0+>h8e1Y(8$m888 8>88 >8 h8 h8 8h8S9d4+>8e5Y(+9$AS9Y9_9 C9>Y9_9 >Y9 8 8 e989' 8+>j9e9Y(9$999 9>99 >9 j9 j9 9j9U:D<+>9e=Y(-:$JGU:[:a: E:>[:a: >[: 9 9 g:9:MP:$|i::: :M:: M: l: l: :l:+;R;${~+;1;7; ;1;7; 1; : : =;:;T,l:#w;$f;;; ;;; ; B; B; ;B;<G`V,B;#;$9<<< <G`<< G`< ; ; %<;<lX,;#_<$z%<<< w<l<< l< *< *< <*<"=ei+<_k:-{m-Yo-\q-/s<$&"=(=.= =(=.= (= < < 4=<?Fv+W09=Xw e=xTyo=Ox?z=W* Ж{C(=$AAA =W0AA =W0A.>UAA/!>eq7LAAA/@>ltL AAA0e>m7J0>d5 0>JA0>"K  0>6/  0?   0/?U\ A0J?tA0j?b=PAAA1eof824AAȜ93W?=#3@C(#+?ΖɔHx'kGkG E[G E E GE )H'L+G Y \V ?{H$-)H/H5H H/H5H /H G G ;HGJk1+@HM~E Y \ V/J J{ H$JJJ@HJ@IJJ@IJ c0HOz} Ac0nO { cJJ/E!6 cJFl c3Bo fM#Gx!Cc+nNZM3 q9={ r !> s@H t Y u / vc wc\ x V y zcY' | fD }ChJ ~IhHP V OhHQ I Zh ;:Qd QcOh;XQf  cOh;vQy cOhIQ\ \Zh;Q` cOh;Qh >cOhIQd /i ccI!Rd 3`(  f fIDRd 7   IgRd ; IRi!ZhIR!}%ZhJ A E gc@RnN ^Zh4RnN!ZhJ4SnN!Zh`h4'SnN!Zh`h4OSnN!Zh`hJ4rSnN!ZhJ4SnN!ZhJ4SnN!Zh J@SmN cZh Oh`h<_-!j8 Oh<_- x Oh<_-  Oh < `g  Oh`hQ8dCh;!8D,X#M8F#+l fY8J /8K\8Lf$  fl@fl8N@fl8Q$Q8 m$/!hM!&X UhZM ZM Uh ZMi"ED"B@ c"Gi# 5"Hxh# hii4h"Jii@4h"Mi0is"NAi0&i$"PgiiA0Gi$"V!iii0hi"XVAii0iP"ZF>Aii5z"[bi xh lh ilh i lhUj7i+i_k*<{mAYo \qUj/s[j-j$)fjljrj Ejljrj lj A`j A i i xjilb"_,i# c"`i# "a#j$d@ll l jbl l4kb"dli.kN"fl.4kU6"l*l.Qk"s<l0rk"~w A+l l0kP"6A+l l0k9"A+l l0k~"A+l l0k+"vA+l l2Q"A+l l }j }j &l}j &l n",}j#/"lh\"i"1ll$1 nnn lnn4l"n4l"ni0l"3lh n0 m"> nn0*m"1ln0Fm~"= nn0gm~"<1ln0m" nn0m"u nn0m2P"11l n0mr\#mxs0_r$#pJ~sxs~swAs~s0r9#::As~s0r#Jp~sQC#_~sRs}#xsbsS@#tH8scZ#gjT_#xs~s~s pxs Jp sJp sU-vp$#3&#pD#3#-v#3Z# #3#9v# Gy#g_vGM# ovGO#ܴ1vGo}#ݬvG #=vG#D vG]#Kv7nt%#ˆbs7tz/#IebsRt2#bsvRt2#bsRt2#bs-vARu1#bsRu2#bsv7jvbsV #&Tbsv 3v bqIv TvTvW ZvqIvovTvWdvvTvWtvvTvWvvTvWvvTvWvvvW vTvv vs v!} vBwq#MF# #:#~qpDI;w$#LwwXUwid#wwYiwid#w>}#B Tv v ZvZwE$7[ڪZwPh$V[1Zwk$u[@Zwy$[TV8Rl$x7$Za7xVy$|$~V#P$w#F$#\$pD# |x$&}V xVyV@xVy$VwV=x%$AV>z/$V`y|$@$#F$$ #6y$ Ny|C|$4zw$:El$:}$;Ay$o yw@yw$@yw$=zP $A\Z$]A$LA6@$k^dec$tK6Q$q^hex$gT6:V$r*6R$㬲^oct$&6R$̸6&e$6e$46$+6F$0k6'$;6$ݑ6<$a[6U$c6M$6}$f_3$'4_$7,_$̃_$N`app$*Fƀ`ate$,zƀ_u$1Զƀ`in$3 ƀ`out$5oƀ_6$70ƀ`beg$Erˀ`cur$G _ˀ`end$Igˀd+ M1e$rO|#Mp $sO|#Mrm$tw#Mey$uw# M$vw#MU$V#MB$x#a$AMC7$Ѐ# Md$#`MQ$#dMf~$Jp#h!Q$ԏw$ w* $(wi$CwP$cw=}$iwI}f$wI}l$:;}w+$#I}'$x<~E$@1w<7~E$ wwO|<~s $4O|<s $=O|<8$Oc3AA$qw} Vhw} hw f 6 6 6'0ZG'3eokl* ؂$     &(__(,&`:(1Pi$< & &I)(?  V(C     yR(@1(B)edmyemdyeymdeydmQ$-y iR R   QF(Ʉ. (VviH-΄(4(#$YÅɅ ΄ÅɅ ΄Å_(Dυ_$0ԅڅ wQFڅ QFڅ>(Ʉ     Ʉ Ʉ υɄ   Lf(2($$oLRX <fRX fR   ^ZZb)ft]BW,;HZL')f.R~o)6MP)!(p)r<)Y\A))|A6)u(p6>e)#(p6e)Z:(p)}W)5A))`A)b)OA)K) A))TA6e)4((p60)W(p6)(p6FU)~6L)(p6)(p6])°m(p6))(p6@)wH(p6 )ƊJ(p6`b)fV$=[ no oc    j)6MP)(p)r<)sA))GA6)(p6>e)_D(p6e)9(p)}W)ҮA))\FA)b)#A)K)A))?A6e)(p60)qo(p6)Y(p6FU)T/~6L)8C(p_)66(p_])(p_))`6(p_@) (p_ ) :(p_`b) +QW$  oQ Q1min){TA1max)AQHk)AQ5{):iAQLH)AQ0)#AQ )_uA]) A   e{)_MP)^(pgr<) Ag)WA_)(p_>e)}(p_e) (pg}W)Ag)#JmAgb)$مAgK)%Ag)&A_e)(3(p_0))E(p_)*-A(p_FU)+Z~_L),S2(p_)7,(p_])8(p_))9κ(p_@);3(p_ )<z{(p_`b)=4;+Q#$E Q Qhmin) hmax)/ ]Hk)e)M(p_e)NuU(pg}W)OijAg)U0 Agb)VAgK)W}Ag)XNA_e)Zs(p_0)[(p_)\w(p_FU)]M~_L)^AR(p_)iyZ(p_])j;-(p_))kc(p_@)m (p_ )n>(p_`b)oQ7+Q$e)2<(p_e)b(pg}W)Ag)8pAgb)"AgK)Ag)*A_e)6(p_0)(p_)F(p_FU)4b~_L)(p_)(p_])A(p_))W(p_@)(p_ )U)(p_`b)<+Q[$$r <Q OQhmin)xhmax)zp]Hk)8]5{)f]LH)]0)] )<])HS [ [ [|)_MP)W(pgr<)ȷAg)NoA _)(p_>e)(p_e)ĵ(pg}W)QAg)zAgb)*%AgK)Ag)A_e)j@(p_0)(p_)y (p_FU)C~_L)b(p_)3(p_])R(p_))4(p_@)7(p_ )(p_`b)c+Q$6| ؔQ Qhmin)#Khmax)FvK]Hk)ZAK]5{)qK]LH)ܞK]0)K] )K])JK   ()_MP)(pgr<)$Ag)LA_)Ƌ(p_>e)x(p_e) (pg}W)CAg)ڜAgb)=]AgK) ;Ag);A_e)Ӓ(p_0)G(p_)(p_FU)Y~_L)(p_) (p_])G(p_)) (p_@)x(p_ )/(p_`b){[+Q\$_$ tQ$ Qhmin)hmax)`g]Hk)]5{)]LH)s]0)[] )y<])   *)) _MP) |(pgr<)5yAg)DA_)h(p_>e)O_(p_e){(pg}W)u_Ag)p Agb)oOAgK)tlAg) |A_e)":(p_0)#.(p_)$(p_FU)%~_L)&Ó(p_)1(p_])2؛(p_))3G(p_@)5Pt(p_ )6(p_`b)7+Q/$5 Q #Qhmin)4hmax)i]Hk)V]5{))]LH))N]0)+^] )-*/])/D / / ƚ/P)<_MP)=6d(pgr<)DAg)ESA _)F|(p_>e)G)(p_e)H֚(pg}W)IOAg)OZAgb)PڔAgK)Q}5Ag)RA_e)Tv (p_0)U5(p_)Vq(p_FU)WNK~_L)X(p_)c{(p_])d*(p_))e(p_@)g(p_ )hoS(p_`b)iG+Q˚$ PV\ QV\ QVhmin)@Q>hmax)B¢]Hk)K(]5{)M_]LH)[a]0)]0] )_])a ˚ ˚ b˚)n_MP)oU(pgr<)v0>A g)wsA _)xAW(p_>e)y(p_e)z:(pg}W){Ag)Agb)"AgK)[Ag)A_e)(p_0)(p_)!B(p_FU)2~_L)+}(p_)Ϧ(p_])&N(p_))(p_@)(p_ )B (p_`b)#+Qg0$\ HQ [Qhmin)r4hmax)t]Hk)}^]5{)"]LH)n=]0)'] )v]) g g g)_MP)e8(pgr<)Ag)?A _)H(p_>e)a(p_e)Z(pg}W)Ag)@MAgb)8AgK)Ag)TqA_e)(p_0)&(p_)(p_FU)~_L)Z(p_)G(p_]),(p_))8(p_@)(p_ )2(p_`b)u+Q̡$H Q Qhmin) hmax)~ ]Hk) ]5{)fn ]LH) ]0)n ] ) ])d4    $`)_MP)A(pgr<)b`A g)sxA _)(p_>e)13(p_e){(pg}W)yAg)tAgb)AgK)Ag),+A_e)9(p_0)w(p_)n(p_FU)t~_L)7(p_)j(p_])(p_))w$(p_@)(p_ )o(p_`b)c0+Qh$"$*0 Q*0 Q*hmin)WL@hmax))@]Hk)-@]5{){N@]LH)ō@]0)@] ){@])?s@   6)_MP)J(pgr<) 6DA?g) A_)(p_>e)]#(p_e))0(pg}W)NAg)Agb)1AgK)>Ag)~A_e)E(p_0)_(p_)-(p_FU)r~_L) {(p_)+ (p_]),ΰ(p_))-a(p_@)/V(p_ )0h(p_`b)1+Q;$ҊƧ̧ QƧ̧ /QƧhmin)C> hmax) U> ]Hk)y> ]5{)p>> ]LH)#{> ]0)%> ] )'"> ]))X>  ; ; ҧ;\)6_MP)7U(pgr<)>hA@g)?"A_)@p(p_>e)A(p_e)B(pg}W)C,Ag)IAgb)JAgK)KzeAg)LoA_e)Nu(p_0)O(p_)PT(p_FU)Q *~_L)RfB(p_)]A{(p_])^%(p_))_(p_@)a](p_ )b(p_`b)cg+Qק$#\bh Qbh ˩Qbhmin):$P hmax)<EP ]Hk)EHP ]5{)G~P ]LH)UbVP ]0)WFP ] )YP ])[DP  ק ק nקB)h_MP)i(pgr<)pIAg)qjA_)r+(p_>e)sT%(p_e)t(pg}W)uAi){O$Aib)|/AgK)}Ag)~A&_e)](p_0)Vz(p_)D(p_FU)~_L)(p_)Hc(p_])(p_))c(p_@)O(p_ );I(p_`b)џ+QsB$V+ ZQ mQhmin)l)chmax)n ]Hk)wwh]5{)y(]LH)]0)eQ] )N])] s s s 3`p)_MP)1(pgr<)XA5g)KA_)pt(p_>e)<(p_e)@(pg}W)Ai)$Aib)xAjK)2Aj)bA4_e)Y(p_0)](p_)У(p_FU)~_L)h"(p_)(p_]).(p_))٫(p_@)L(p_ )6(p_`b)+Q$W Q Qhmin)hmax)b]Hk)FO]5{)W]LH)Y]0) ] )V])N&    T')_MP)^(pgr<)\PA@g)2A_)l(p_>e)w(p_e)Ҍ(pg}W)P9Ai)Aib),AjK)ٗA@j)AD_e)À(p_0)fG(p_)*u(p_FU)~_L)4(p_)(p_]) +(p_)) J(p_@) I(p_ ) Ɖ(p_`b)?+Qǯ$TZ` QZ` ñQZhmin)әkhmax)Hk]Hk)uk]5{)k]LH)Y5k]0)k] )Ik])քk ǯ ǯ fǯ  ܲ*6*ܲW3*$XN ̲  r r rm=*6*mW3*E$5} ]= =}   P *"6*#W3*$kֳ$+ P P    ZJ7*f1[נPm:X+k+mA#3f+nm#$ x~ X~4дX,,~r@W+~>s+BqA~4*3+ja  0KL+Era k2+rJa r J T T TP8abX-BM-mA#3-E9=G-F-GF2-H-I$l *X4HX.-A>s-j<AE-i  PIAs~    I۶PAO   ;v AZ"z !;u A]n !;5)A}A !;S(A= !;qAW@ !;BA; !OAc!    Z߷/Z5/1º084A3X0:º#300Oκ0 0Rκ00UDκκ0k0XA/ֹfd0[$κ40]κ0+0`O|κ0<0cO|κ 0g0g=κ ww00k=κ w0LF0nκ20qO|κ    ں  ںP)l13ƿv_(p+!>[w$agm gm g[3+Ի$/  0!)Q!{).G!V)5!M)!G   sv_(p+x!>ؼ$½Ƚν Ƚν Ƚ,+5$  M `0{!#Q!#.!I#5!?#! x x Խx#Y2^Mi2##M2 #+ٽ!>2[2i2S$/5; k5;<2Z[F@25L;o2)5I߾J25);2߻#5V25# )  ٽ ٽ Aٽ A R[r2e T2s)# +2t)# 2u)# 2v## +)W2fWY'2g_2j*<{2k\2l)/2m2n Y2o 2p#2qW2$[ Q02h 4a)2y)#4u)2{4)2}02G!08E2)!02y 02W0~2) 0@~2GW0a2 02P2bW!02 02[2WY'2$ m@m2L@m2L@"l2IA2IeF2##V2"## ' ' 'G(2~,'#+\2'{2\2)V2G2WY'2D2MJ2S/2Y2^2 Y2 !>2[2#J02 @2cL@2cAL@2c@2ci@2c0%$3Ftci=H2 zcA64## d d d )   -$5ZpA5's$- =^eINT:nZu&5(Fl^ 5A I5B# -5B# ' 5C #4^5E4^5F0 $5GW4']5H0H!5J, 0dJ.5Q |AL65Sӥ3:5"# E5*_r# I5+-# 55,# -5-# L5.A# U5Y#$- - 7-HT5$1nHv5%4-500P57}?AZM058tAZM2n5:A-     ! ! ! v45^5hmi5imf5jmd5kms5lmpv5m $)$ $E5o,!# F5eA#$ -5f#( 5q*#, u/0 5ssA506:5tP@/F0R^5um@/0x5v@/0~95ww54v5y/4v5z/F0$5{|@/F4v5}/4v5~/4<v5/4_v5/4v5/ 4v5/L4v5/L4v5/L4v5/L4"v5/ L0C$5,@/0d$5d@/0$5M@/0$5X1@/0$5q1@/k0 5V@/0 5̐@/ 04$5T@/L0U!5zF5W0v!5[F5G0!5ZF5]0!5yF5c0!54_F5i0!5F5o2!5CF5u * * **  ;  ; R_r _r    k  %p6 E6_r# 56#$5 &&p &&~p np6 Lop6  { { ,{:#P6,Z\6.R8,n#6/ 060_r# Yh61=#$2:@F n#@F m#@En#62@f 767#fOK68A# $8<QW] 8 7W]4L 769W5 6:YW 1H 6H3E6I_r#356J#$0 H  G 4H 6ML4H 6N2 6P AF,ZM#B7J3@6=#3o6>_r#3z#6?# 3)6@\#3 6D#3;6Ee#@6465$, # #76B 48#6YL4V#6_=ZM0r/6cL0/6d66LL/str6i+1L/log6kz0Yh6m6F0Yh6n(A=ZM03#6p40O#6q0.g6s50$6{;L0L6~L 0>6 @F@0 6$q0[:6{=_rL0!'6Q/26 \ \ L\   co!v_)(p+h!>$u{ { {+%$X7 = P0k!/Q!K/.!B?/5! /u}+M~E Y \/V5/{B$Z@W@qZ@<.#/@<.#5F<!/ =!%/<7uT =Zƣ/FAa=/ h h h[v_T)(p+!>$  +I$` a t0!*7Q!Y57.!H75!#7!w>   72^Mi27#M2 #+!>22i2g$Q=CI CI<2;T@2CZ;o2-/CIJ2ZC/;27CV2:C7 /   O O ` *2e T2s/# +2t/# 2u/# 2v7# +)e2feY'2g _2j*<{2k\2l//2m2n Y2o 2p72qe@$T$Q02h+! 4o)2y/74)2{4)2}$02@/08E2,//0202e0-~2F30N~2Be0o2:02P2<e/02022eY'2 $o m@m2Z@m2Z@0l2IO2?IsF277V2"677 5 5 5U0(2~,5#+\25{2\2/V252eY'2 D2UJ2[/2a2f2 Y2 !>227J02 " @2kZ@2kFZ@2k@2kq@2k03$3F?#|kq=V2 kF[k*2Ug[k<[*2] U9n9|$<BH b6BH09qS4b69tBZHM29X /BT!9&B/ 5 5 N5 N" 9,5#+8Y\95!>9$, 8489Z489ZE89 Y Y %Y  9,Y#+*\9Y9*{9\9/V959Y'9ED9{J9Ɂ/9ʇ9ˌ9 Y9 !>9ά49Z49FZ479@Q9 @l9)0$:=9BF<9[<f9c<f9k.EK$end9s$KAend9z E<^se92<{se9D${<*9t<*9A {<-9 <u9% =9m F=09#:@<9EdF=wp9TF=c9h0:YhF=%9 F0F:i,,0l:u=91=97:.FI:5 FT9:ߗ4FE8D,#M8F/#+lY8J /8Ke\8L/$jpv lpv@l8Np@l8Qp<8Z @<8E8]`/< 8`h'jpQ8+{h8D,#M8F5#+lEY8J /8KD\8L5$(IOU lOU@l8NO@l8QO`<8ZFk<98E8]@5kQ8M.`k!!@F * * * ,d;3@;#psql;1#prow;*#Tpeoq;A#`;>;*,$ D, ]+4q,;/log;Z2 ;%!        x }+ۂ_*<{Y \5/xP$(} hۂ ۂF   (Si+_k*<{mYo \q5/s($ 4-39 39 3F   ?F E E [E f5 [< x<_r# d><_r# 4<LL4< 2$<  q q qqJ `5UrA -P++>Je ($4 > > J J JqbA -8ZUrI SsZ7bt^}u$v.WwLuMwu w w w x" w, w@ wJ ug vq |w w ug !vq Vw{ uU Jxv Rx Pxw w w x Plw x Plwwx$Plw5wAyMPyYPxfxwpwzxxwxx~wxx~wu vRwzxܦw wx#ܦw-u H wRuRbЧwlu9wxЧwwu|Чwxwuwwu.wwu:*P\w8xP\wxMP\wWwauPYwxPVwx$Y\v5QwAyMRyYPxAZww{0`7S,#Mu>' # +bX> 3>9=!>>@He=>T>o=>=>ZMx> s>!$BH EH@k>9w@>L`hw|~>Vb<\>aa =Kstr>itZM=}str>s.`h b  #~ZE4ZAt___m>9wP~\b/=/= d d~n4 7C,#,J#+BX- e=-T-o=-=3-9=--Jb $Ke k B k@ B-  B-   ~  4 At {m-   ~W b4W At\ {m-i   J~ 4 At {m+j a a P7G,#3>^ZM#+% X>B 3>C9=!>>F@He=>HT>Io=>J=G>R>SZM>T \ $FNa T t %a T $ a 4 %>ka w4 %>ya `hw/ str>ZM_ str>p^a `h7" >a wH U>w a s Q?0o a  ?R. a  ?$>sC  a   ?zSo= a  ww3 ?go= a ?wBF> a   ~  4 B>kwa ~ R4 Zh~ M4  __a  cJ~ O4 c̅GlGW3G Dflb1pDl1W31G2pD062pD~ 4 B>w~U4Oh~Q4~P4~*4 __n+!L+w#O$;w__a$;w__b$;w~8}48 Cb~]4]=~4ZAt~4A~ 4 At~S4 A~%K4 At%Mt >:4 A~nO4 __a nJqeK\fUieqkޭhrUfkqq5t~Udqq#wȮUswqP}Upv} qb Ux.ercnR   3}+ۂ_*<{Y \//3 $F%8>D #ۂ>D ۂ>@   J<^+O_Y(ɏq(X r(Ss(ht(vu($&   O O O.}+ۂ_~*<{Y \//q$ ۂ ۂ@   Ii+_k*<{mYo \q//sI!$NTZ 9TZ T@   `@   | / |&}+ۂ_~*<{Y \)/&$`+17 ۂ17 ۂ1G   = b C   Z  Z  q/Ury6DSr6D . BK/&,&#$$=&.$&  .$&.E BM.L V;*4VA.w4UvAP*Uv8Su wxM wWvaWu wx wx$v5QwAyMRyYP*Uv8Su wxM wWvaWu wx wx$v5QwAyMRyYPbUvlSx*qwwxDXww5cUvPx3wwijUvSx2ww~3 4 __i> __o>  C> n>AG>A-> wwwwwwwwwVwwwwHwwww&w=wGwTxwwww&~;]4O$Zw__a$Zw__b$Zw~4}PAs DAs BAs  3tR$^w__a$^w__b$^w~b4*A !.A iUvsSv} vPzzysyWu vQwu wx wu&)wuH1dwwvhvlx^aww&x3jw=wGvTQujmvPwxww&bUvlSx*jwwxDXww~T 4Tww-> 9wwwJwkwww_D94__a4__b4 c~H4J1yUvQsSyPuwxwxwxY+:wkww~jeb4 g!  A! __a!jJ1!Uv;RvE vQv]x !w w w xw ww#xBwLwYwfws~=bg   A  __a =e (J~bg   A  __a (! *<J~ 4 __s> __n>O|www~S4 Ԕ f`h8UvvQvRx$EvVwU! IU4  r{ ?z=r?zwrB?zwStR?{o=tn?|APtG?}ARt?~A}uU!<w_!wi!vu!~u <Dwwx<DwvRuJ ILwwxILww1!tg? Stu? Pt? Wtz? Vt? }tf ?=Rt?=}u !w!u !w!u !w!u!! w!xU!Sw_!wi!vu!~xU!v_!Rwi!vu!~~!V@4!{ N=dNC( !~!۶4!!~!4!~!4!~!54!# U4  rn?o=rB?wtR?o=su]"U! 7w_!wi!vu!~tiO?=Vtg? }t A? Ptn?APtG?ARt?A}tW?ůA}t?ƯARu#BJwwxBJwvRu;#SVwwxSVwwuR##adw#ui##w#u#!w!u## w#xU!Xv_!Rwi!vu!~~#t@4#~#S4!~$q4!~+$" 4 ($w5$w!~B$/?__cB$Aj?j$$#Uv $R$H [U4 V__c?0tR?1Pt;?2AS@G?3Au$$ w$w%x%>Gw$%~%J?:9%?9%AA~1%{?__c1%A&s U4 V__c?RtR?SWt;?TAQt?UASG?VAu%$ w$w%%t-?^ PxY4AvkQvwPu&fvWwx%$0w$%!   *&!hyQ&4%UvAS'bUrg! r A! S__a!'B;}! __r!cWu&' w'w'x' w'w'w'u@'',4w'w (w(u,'$(,-w.(w:(wF(xS(-0w](x dw x dwwx$dw5wAyMPyYPJ'Cp Cp Cp 'C[ C[ C[ *<~$(!R__p 7 Q 7 t 7 ~S(>k k__n ~h( O4 6D0GUx6DH_U.0(( 77g((c(Q ((($!(()@(~2(h(tP) 0b)@)w) -f)g)) E))) ١))t@M`y%% &&.&@& R&@d&v&&&&&& &@& 'J'2'D'V'h'z''''' BDEEEEFF PNN3Phpzppppp pq2qsss tt1tCtfID/)lq+ q w4zEzVzgzxzzzzzzzz{{"{3{D{U{f{x{{{{{{{+|=||my6-Se4߰$uT83p1&+,@,> \-P%qD.b/tint,0E6O:8;3?t+R@_>\ ]> ^._0$\ b h /._0 b h ._0 b NUNEn't*ĺ,U-{!.{\/Wk0{*12iP33/4t5{;xKQLx#-Mt#P$~  h   >5Xj_pkx#_rlt#_wmt#nP# oP#_bfp#qt#;t#u# ]3v.#$wM#(xw#,{#0_up~x#8_urt#<p}#@p#C_lb#Dϛt#L#P$  5  5 t .t   tM  t4lt  l trUS >N >N5,X@1@6$#@tqEttm,KrLt#Mt#fsNt#'EOt# *&Pt#8rQt#8|Rt#_St#Tt# @U#$'V#($  tm  tm <1i2lR3:4 e7t89tS;_tC 6!B ;3D @ED EW!, Ji , O{R: TQ: YP ]3x ^WS _{ `# R\ W| e>. fbZ6 gFP h<7 j>ˮ kb l_Q m^ oN, rP, sW tlP P @|  {ƺ WD h {@ { e {aj { m 8 { 4 ie lWu i$+ it  iQ t5 t 5  "i = 5 6 #$*Z     =    =    N$ = 7 .T  9J 9 # 9 # $,       !q  @ @  @  G  H m UL V#~ Xt#N Y#E $@B H N]   H N  H] Ix   \u ]# f5 #/ i5 #R j #  k@ # l# $CVY _ e  _ e _R J+  *W {88 |#~d }#s $ p v | *W v |*W v K @  y # 5 # @ #DK # E # $`  0    ? LK   ev #a # $u      F M 6 ώ  m #- t# ${  & ώ  ώ  NA  ?  #3 5 #  t# $k   ?  ?  O y$  # 5 # @ #: @ # # # # X$F  py  y $ P? z ҆#B #$QU  ?  ? B Q+  چ# 5 #b @ #') # #ĭ #I #$&  #+  #+ ] R7ns B #uw #$7. 4 :'ns 4 :ns 4 St  T x x kx + + + m    K K K    A A A    )@ 1 2#4 3#$$     EEE<,{ 9 :#& ;#$< B H,,{ B H,{ BNm KV} Lt# Mt#$V  m  m SSSJt c E#K E#"$J P V:t P Vt P\5 c #K #$  5  5 aaa\ hz t#>4 t#g t# t#  t#Y$  q\  \ > U4 Vt#$eW  >  >  " o p#A q#Y$  q"  " "lwp ~ # #$CE  &   & , <H  E#I| _#n # D # #8LN t#< t#@l t#D$x7   <   <  N111~x~pad~#V$  nx  x  N.R+7, .-m 8#@;UH#y<[#N= Z#>g#7V?#@r #t~A5@#(nBK$#eC$eD]$EN^$FF'$ 'GV$H  $<IC8@#RJ#JKqJ$zL&#3O#P#Q#T X#VU#`V%#W#Xv#6Yk 9P$[# ) / ) / )P5Q EVtFv%W0PXwUe=xtTyOxzW*Ж{:$  W0  W0 &U  '8eq7L  'WltL   (|m7Jt l l (d5~ l(Jl l ("K  l (6/   l (+  U(FU\U (att (b=P  )eof8t*4t Ȝ9+W?#+@:#%Ζ<:$>y Dy Jy  Dy Jy(<ζD[: Uy&YζG Dy ,mK Dy,N Dy  (WP_ Uy(S^>y Dy (Vͯ>y Dy ( 2PZVl Dy (+#rem?#._2w$   ._2   ._2 wwwJ } Ee@G#remI#._3 W $}   n ._3  ._3     biQ !biNe@Ol#remPl#._4  $! ! ! !._4 ! ! ._4 !  #! |! >T!$s|! ! !l!  ! !  !(!(!!(!7#*8%&#|'#U(#J)# *#+#|,#Q-#.# /#$i<0U#(m<1U#)22U#*33U#+4U#,mi5U#-gC6U#.z7U#/28U#09U#13:U#2ii;U#3cC+$Mf+ l+ r+V+ l+ r+ l+**x+*,1&%}+ɏN#X N#SN#hN#vN#+$:, , ,, , , ,}+}+#,}+,:g%(,ɏN#X N#SN#hN#vN#,$, , ,, , , ,(,(,,(,g-P@%,ɏN#X N#SN#hN#vN#?-$Cg- m- s-W- m- s- m-,,y-,.g%~-ɏN#X N#SN#hN#vN#-$K. . .. . . .~-~-$.~-.%).ɏN#X N#SN#hN#vN#.$. . .. . . .).)..).>/k %>.e N#/$>/ D/ J/./> D/ J/> D/..P/./%>U/eN#/$Pk/ / //> / /> /U/U//U/@0 %>/eN#0$2@0 F0 L000> F0 L0> F0//R0/0d%>W0eN#0$&0 0 00> 0 0> 0W0W00W0B1k%>0eN#1$[B1 H1 N121> H1 N1> H100T101. %>Y1e!N#1${1 1 11> 1 1> 1Y1Y11Y1D25)$%>1e%N#2$D2 J2 P242> J2 P2> J211V212X<(%>[2e)N#2$p.2 2 22> 2 2> 2[2[22[2F3`,%>2e-N#3$F3 L3 R363> L3 R3> L322X323ۖ0%>]3e1N#3$m3 3 33> 3 3> 3]3]33]3H4d4%>3e5N# 4$AH4 N4 T484> N4 T4> N433Z434' 8%>_4e9N#4$4 4 44> 4 4> 4_4_44_4J5D<%>4e=N#"5$JGJ5 P5 V5:5> P5 V5> P544\545MP5$|i5 5 55M 5 5M 5a5a55a5 6R5${~ 6 &6 ,66 &6 ,6 &6552656T.a5#l6$f6 6 66 6 6 676766767G`V.76#6$97 7 76G` 7 7G` 76676|7lX.6#T7$z%|7 7 7l7l 7 7l 777778ei%7_k5/{m/Yo/\q//s7$&8 8 #88 8 #8 877)878S =5oB8#~RE# 3?~8$08 8 88S 8 8,8SG 8 &8U 8*]~ 8~.8.88.8m9o0 wsv%0~8E9$ m9 s9 y9]90~ s9 y90~ s98898.:^i#9$.: 4: ::9^ 4: ::9^ 4:&:*Z 4:&: ěH 4:-&'m  4:99@:9:ci:#,x:c : .:,:c : t1:$ : :2c : :.:E::E:?!tV; %0ј*lkV;%S:.;$!l[; a; g;F;S a; g;S a;:::m;:;h;$[; < <; < <; <(;!l  -!p%S  r;r;<r;=чN34g=4]\4O`*4c~4dZ994}o:%<<!<$= = =<< = =<< =5=ze~ 5-=ida~ 5J=P$ 5l=  =6=! s 7=!  8ɔHx'  ==N!<=<<=<t>'L%>~Ys\V>9{n>$-> > >> > > >>:>>>>|@k1%>M~<~Ys\Vl/|@@{UI?$@ @ @;^? @;x? @ @;? @ t6?.#k @ 6?.#6'l @ 6?! @ >7!@!_' @  6>@um,~ @7a@ƣ( @  <am @ >>@>@lB0}%@M~<~Ys\lBVyB/BB{rB9A$)B B B;NA B;hA B B;A B t6A.#blB B B6A.#YyB B B6A!RlB B >7B!3  B lB 6.Bu~ B7QBƣ  B lB B<a B lBrBBrBBrBBB@@B@B=)C<xB$")C /C 5CB /C 5C;Cy /C>z /C tBB;CB?C!<U@_V=@WCC$iC = CC = C = CUN@CC@CwY?8iDN.>#c#D$vwY }Y Y5DN }Y YNDN }Y tAN }Y  @~F{ 0r3/Z08tra~#~#&:#>D$mZ Z ZE{ Z ZE{ Z(3E6#r +Z(OEa +Z&gEAn Z&EiT Z(E> Z(Ez} Z (E{ Z @ @6FiZ @& F% Z @7>F-ux Z @(ZF6 Z8/E6 Z @ BlZ+BoC#CxC1Z%nNC3qP{rU!>s>t~Yus/vAZwFZ\xVylzKZY'|\D}^J~^DnGV ^DGI ^ 5GdQZ ^5Gf KZ ^5Gy KZ ^EH\ \ ^5'H`KZ ^ 5OHh >KZ ^ ErHd/i  KZ KZEHd3`(  \ \EHd7   EHd;  l lEIi ^ EI}% ^F AE gZ;FInN^ ^,_InN ^ @,xInN ^ ^,InN ^ ^ ,InN ^ ^ @,InN ^ l @,JnN ^ l @,'JnN ^ U @;BJmNc ^ t6dJ$fP^ ^ ^6J$i^ ^ l6J$l5^ ^ U6JfqXnKZ ^6Jfx\ ^GJend|'KZ ^GKend\ ^69Kse^ ^6VKse;^ ^6sK*n^ ^6K*^ ^6K-(d~ ^6Kdry~ ^6Ku&a~ ^7 LZ%o ^ U7(L ^ 6EL~ ^7cL:m ^ 7|L ^6LK ^6Lz} ^ 6Lz} ^ GLatk ^ GMatL0 ^ 6AM^ ^ ^6cM4^ ^ l6M^ ^ U6M;"^ ^ ^6M;#^ ^ ^ 6M;n^ ^ l 6N;(^ ^ l6CN;o^ ^ U7aNwp*Q ^ U(N^ ^ ^6NB^ ^ ^ 6N^ ^ l 6N;^ ^ l6O^ ^ U7FO [; ^ KZ U6mOc^ ^ ^6O,O^ ^ ^ 6O9 ^ ^ l 6O_^ ^ l6P!™^ ^ U6DP(Q KZ ^ KZ U6kP1^ ^ 6P8]KZ ^ KZ6PAKZ ^ KZ KZ6P8J^ ^ ^6Q8^ ^ ^ 6GQ8^lc^ ^ l 6sQ8Vq^ ^ l6Q8Zb^ ^ U6Q8^/^ ^ KZ KZ ^6R8c]^ ^ KZ KZ l 6-R8g^ ^ KZ KZ l6^R8Z^ ^ KZ KZ U6R8wPY^ ^ KZ KZ  6R8|K^ ^ KZ KZ l l6R8ĕ^ ^ KZ KZ KZ KZ6"S89f^ ^ KZ KZ \ \DHSã U @6tS6+~ ^  7S M ^ ^6Sul ^6Sql ^6S> ^6TJб~ ^ l 6~ ^ ^ 6V-j8~ ^ l 6FV-x~ ^ l 6mV-~ ^ U 6Vg~ ^ ^ 6Vg~~ ^ l 6Vg~ ^ l 6Wg2~ ^ U 65Wz%~ ^ ^ 6aWz~ ^ l 6Wz,n~ ^ l 6Wz<~ ^ U 6WM3WC ^ 6Wm;dt ^ ^6$XmF*t ^ ^6ZXmt ^ ^ 6|Xmt ^ l6XmLt ^ l6Xmpvt ^ l ,XvL ^   @5#Y   @5OYI   @ #Hl   @ 76CCYCYA%zY>Y$)Y Y ZYz Y Zz YYY ZY~iDiD&ZiD&Z AZ~N\9D.#I9F#%lKZY9Js/9KN\9LZ$S Y _Zl Y _;Zl9N Y;[l9Q Y j6"[9Z  u6?[8E9]! u6\[9`S Y6~[9cKZ Y t6[~9gS Y6[~9jCKZ Y t6[z}9o u {6\9s_S Y {6#\2P9wKZ u {6E\9{S Y {6g\ )` `-z [b `^^$`^$`^`7i%5`_k7{mYos\q`/s``$)` ` `` ` ` ``5`5``5`bb _.5`#c ``# a#Ba$d@b b bZab b b,xab d b ` &aN f b&aU6 l* b&a s< b t(a ~w  b b(bP 6 b b((b9  b b(Ib~  b b(jb+ v b b*Q  b b``b`b}d .`#/ ^\ ` bb$1}d d dc d d,'c  d,Ec  d ` (ac 3^ d(}c >}d d(c b d t(c~ =}d d(c~ <b d t(c }d d t(d u}d d t(>d2P 1b d t(_d k k(k9":: k k(k"h kOC"_kPIk}" k kQ@"tDskcZ"gj R_" k k k !i klNhkhkShn!i$"+&":#+"hn#+Z"~#+"tn# Cy"gnCM" nCO"ܴ1nCo}"ݬnC "=nC"D nC]"Ko1l%"ˆ k1lz/"Ie kPl2" k o Pm2" k l P$m2" k hn P?m1" k tPYm2" k o1wm$"e k oDm/q"L kEmy"  k o Em" i k o nEn"* k o nE$n"d k n nn5Gn *">j!o k T "&T k !o tnni nN nnUnin nnUn nnUn nnUn nnUn nnUn nnUonnoko!}o=oi"IF"~#4"~q:Evo$"L o oVoid" o oWoid" o8}"B~ n'onJoE#7XڪJoPh#VX1J pk#uX@J"py#XTx8Rl#YNp7#ZKKaK7&qVy#| #~x# P#x# F#t# \#:# p$&x x xpVy x x;pVy# x x t x7 q%#A x8z/#t xq|# @## F$##qq$x x xq| x x>|# xorw#4El#t4}#;q$ox x xrw x x;rw# x;6rw# x t7NrP # ZZ#[A#L0@#kx\dec#tKx0Q#qx\hex#gTx0:V#r*x0R#㬲x\oct#&x0R#̸x0&e#x0e#4x0#+x0F#0kx0'#;x0#ݑx0<#a[x0U#cx0M#x0}#fx]3#'4x]#7,x]#̃x]#Nx^app#*Fy^ate#,zy]u#1Զy^in#3 y^out#5oy]6#70y^beg#Ery^cur#G _y^end#Igyd+sI1e#rt#Ip #st#Irm#to#Iey#uo# I#vo#IU#x#IB#&q#_#IC7# y# Id#t#`IQ#x#dIf~#h#h!Q#o# o* #(oi#C pP#cx7u#i y x tEuf# y .pEul#: y5vw+##x y tE3v'#x y6PvE#@1o !y6rvE# o y o6v+ #Ao y o6v+ #.o y o o7v) #E y o6v4e#%t !y6w4e#'>t y t65ws #4t !y6Wws #=t y t6sw#Oc3 6wj.#[}h y k6wM#f{h !y6wJ#pa?k !y[s#wt6xI$#~z,y y t6%x@#D2y y t;@x7R# y t`Vx8R# y`qx8R# y 8ya$#T.x y 8yNpbx .p x t"pxNpxNp&q&qx&qqqxqooo p y&qN"p'y"p'yPyPye}$+$0zh%(#&%/^hz#+%0z#@%13z#Y%2lz#X%3nzD#vi%4cz#%5z#%6z#u%7z #]Z%8z#p9%9kz߹%*z %.>yz$z z zzh z zh z>zqyqyzqy;{&0JzG&3cokKKl*K {$;{ A{ G{+{ A{ G{ A{zzM{z|&']_',&`l4'1Pl{$<| "| (|{& "| (|{& "|E{)'? 8y  U tT'C 8y  U UR{R{.|R{|R'@Yl|'BK)cdmycmdycymdcydm|$-| | ||R | |R |3|3||3|}QF'Y}. 'KVKviKKKHh}΄' 4'}#@}$Y} } ~X}΄ } ~΄ }]'D ~}$0~ ~ ~}QF ~ ~}QF ~8'} U U U }UN}} ~}||!~|~f'2't_~$o~ ~ ~w~f ~ ~f ~&~&~~&~J~Zb(dtK]KBKW,K;HJ~L'(dK.KRo(0MP(!f#r<(Y\#(|0(uf0>e(#f0e(Z:f#}W(5#(`#b(O#K( #(T0e(4(f00(Wf0(f0FU(0L(f0(f0](°mf0)(f0@(wHf0 (ƊJf0`b(f$=[À ɀ πo ɀ πo ɀ~~~~Հ~Gj(0MP(f#r<(s#(G0(f0>e(_Df0e(9f#}W(Ү#(\F#b(##K(#(?0e(f00(qof0(Yf0FU(T/0L(8Cf](66f]](f])(`6f]@( f] ( :f]`b( %Qڀ$G M SQ M SQ M)min({T)max(OHk(O5{(:iOLH(O0(#O (_u[( ڀڀYڀe{(]MP(^fer<( e(W](f]>e(}f]e( fe}W(e(#Jmeb($مeK(%e(&]e((3f]0()Ef](*-Af]FU(+Z]L(,S2f](7,f]](8f])(9κf]@(;3f] (<z{f]`b(=4;%Q^'$E  ?Q  RQ fmin(Ufmax(/U[Hk(e(Mf]e(NuUfe}W(Oije(U0 eb(VeK(W}e(XN]e(Zsf]0([f](\wf]FU(]M]L(^ARf](iyZf]](j;-f])(kcf]@(m f] (n>f]`b(oQ7%QÇ$e(2<f]e(bfe}W(e(8peb("eK(e(*]e(6f]0(f](Ff]FU(4b]L(f](f]](Af])(Wf]@(f] (U)f]`b(<%Q_$r ! 'wQ ! 'Q !fmin(x>fmax(zp>[Hk(8>[5{(f>[LH(>[0(>[ (<>[(HS>-(]MP(Wfer<(ȷe(No ](f]>e(f]e(ĵfe}W(Qe(zeb(*%eK(e(]e(j@f]0(f](y f]FU(C]L(bf](3f]](Rf])(4f]@(7f] (f]`b(c%Q2$6  ÍQ  Í&Q fmin(#rBfmax(FvrB[Hk(ZArB[5{(qrB[LH(ܞrB[0(rB[ (rB[(JrB22ɍ2S((]MP(fer<($e(L](Ƌf]>e(xf]e( fe}W(Ce(ڜeb(=]eK( ;e(;]e(Ӓf]0(Gf](f]FU(Y]L(f]( f]](Gf])( f]@(xf] (/f]`b({[%Q΍$_S Y _Q Y _Q Yfmin(Pfmax(`gP[Hk(P[5{(P[LH(sP[0([P[ (y<P[(P΍΍e΍)( ]MP( |fer<(5ye(D](hf]>e(O_f]e({fe}W(u_e(p eb(oOeK(tle( |]e(":f]0(#.f]($f]FU(%]L(&Óf](1f]](2؛f])(3Gf]@(5Ptf] (6f]`b(7%Qj3$5  KQ  ^Q fmin(4bfmax(ib[Hk(Vb[5{()b[LH()Nb[0(+^b[ (-*/b[(/Dbjjj(<]MP(=6dfer<(De(ES ](F|f]>e(G)f]e(H֚fe}W(IOe(OZeb(PڔeK(Q}5e(R]e(Tv f]0(U5f](Vqf]FU(WNK]L(Xf](c{f]](d*f])(ef]@(gf] (hoSf]`b(iG%Qϔ$   Q  Q fmin(@Q>tfmax(B¢t[Hk(K(t[5{(M_t[LH([at[0(]0t[ (_t[(at'(n]MP(oUfer<(v0> e(ws ](xAWf]>e(yf]e(z:fe}W({e(eb("eK([e(]e(f]0(f](!Bf]FU(2]L(+}f](Ϧf]](&Nf])(f]@(f] (B f]`b(#%Qk$\' - 3Q - 3Q -fmin(r4fmax(t[Hk(}^[5{("[LH(n=[0('[ (v[(9Ú(]MP(e8fer<(e(? ](Hf]>e(af]e(Zfe}W(e(@Meb(8eK(e(Tq]e(f]0(&f](f]FU(]L(Zf](Gf]](,f])(8f]@(f] (2f]`b(u%Q>$HÚ ɚ ϚQ ɚ Ϛ2Q ɚfmin(fmax(~[Hk([5{(fn[LH([0(n[ ([(d4>>՚>_`(]MP(Afer<(b` e(sx ](f]>e(13f]e({fe}W(ye(teb(eK(e(,+]e(9f]0(wf](nf]FU(t]L(7f](jf]](f])(w$f]@(f] (of]`b(c0%Qښ$"_ e kQ e kΜQ efmin(WLfmax()[Hk(-[5{({N[LH(ō[0([ ({[(?sښښqښ(]MP(Jfer<( 6D?e( ](f]>e(]#f]e()0fe}W(Ne(eb(1eK(>e(~]e(Ef]0(_f](-f]FU(r]L( {f](+ f]](,ΰf])(-af]@(/Vf] (0hf]`b(1%Qv?$Ҋ  WQ  jQ fmin(Cfmax( U[Hk(y[5{(p>[LH(#{[0(%[ ('"[()Xvv v(6]MP(7Ufer<(>h@e(?"](@pf]>e(Af]e(Bfe}W(C,e(Ieb(JeK(Kzee(Lo]e(Nuf]0(Of](PTf]FU(Q *]L(RfBf](]A{f]](^%f])(_f]@(a]f] (bf]`b(cg%Qۡ$#  Q  Q fmin(:$fmax(<E[Hk(EH[5{(G~[LH(UbV[0(WF[ (Y[([D9B(h]MP(ifer<(pIe(qj](r+f]>e(sT%f]e(tfe}W(ug({O$gb(|/eK(}e(~&]e(]f]0(Vzf](Df]FU(]L(f](Hcf]](f])(cf]@(Of] (;If]`b(џ%Q}$V+9 ? EQ ? EQ ?fmin(l)cPfmax(n P[Hk(wwhP[5{(y(P[LH(P[0(eQP[ (NP[(]PK3`p(]MP(1fer<(X5e(K](ptf]>e(<f]e(@fe}W(g($gb(xhK(2h(b4]e(Yf]0(]f](Уf]FU(]L(h"f](f]](.f])(٫f]@(Lf] (6f]`b(%QW($W  @Q  SQ fmin(fmax(b[Hk(FO[5{(W[LH(Y[0( [ (V[(N&WWW'(]MP(^fer<(\P@e(2](lf]>e(wf]e(Ҍfe}W(P9g(gb(,hK(ٗ@h(D]e(Àf]0(fGf](*uf]FU(]L(4f](f]]( +f])( Jf]@( If] ( Ɖf]`b(?%Qө$  Q  Q fmin(әfmax(H[Hk(u[5{([LH(Y5[0([ (I[(ք )6)W3)P$XN' - 3 - 3 - '>N9=)6)W3)$5  ī=  ī=  >N>>ʫ>9P )"6)#9W3)$$+I O U)P O UP O I>N ϫϫ[ϫJ7)dK1[KKנN:@X*k *m# 3f*n#ڬ$   X  , X+,  ;&W*  t8s*Bq ,e3*j n t ' (L*E n ti2*r n t 'ŭN8aX,BI,m#3,EPG,F,GʭF2,Hޯ,ItM$l  eX  ,X--  8s,j< A,i ) t ' NޯEFs~    EPFO   54v FZ"z D5Ru F]n D5p)F}A D5(F= D5FW@ D5ʯBF; DMFZ!ԭԭԭʭ6.( U @/I! @/U0/V%6/jDJht  t h h/Fz!/t!6/u"MemJ0KKJ50KK1KK184+X1:#+1<#%@$7  X  ,|1?  1&1C2  o = = (ӱ1F  l o t(;1I  o($;1Lv  t o (@>1Ot (a 1Rt  t(}1UD (k1X ó'fd1[$t ,β1]  t(+1`t  l t(1ct   t(E1g   p o(k1k   o(LF1nt *1qt pN)j2KK3KK}ƿv]f%}!>9U$? E Km E K E93%}$/3+ 9+ ?+ʴ 9+ ?+ݴ 9+(! O!{&%!V  -!M !GQ޵v]f%V޵!>$  ε   ,%޵$   +  > (Y! O!&!I  -!? !VVVY3^Ii3#I3~#%!>393}i3޵1$   I  6f3Z9 $;3  *5o3 EJ3  53߻  T3   t09ݺr3eT3s#+3t#3u#3v# %)53f5Y'3gݺ_3j7{3kt\3l/3m3n~Y3os3p3q5$[  O03h~,?)3y   ,S)3{ ,l)3}  (3= (8E3 (3y (35  t(~3) (~3G5  t(?3  t(`2P3b5  t(3   t(3935Y'3ݺ$d j pm j p;˻m3 j * ;m3 j *;l3 j tE3 j ECF3 j  T3" j  v%(3~.#%{\3{3t\3V3%35Y'3ݺD3+J31/373<3~Y3s!>393F03~;o3 A *;3 A  *;3 A ;ǽ3 A G;3 A t($4FR A G7&3 z A 6C3"9 X6`f3*5 A6}f31ݺ XGend385 AGend3??ݺ X6Ծse3Fb1 A6se3M+ X6*3U1 A6+*3]P+ X6H-3bK~ X6eu3f~ X73t9 A 73 A 6ÿK3V X6z}3F= A 6z}3; X E&3, X GGat3= A Ghat3 X 63= A63R X63= A63 X7&3 A 7wp3' A 713S{ A7Jc3f A(p4ZM5 A 5 73A A 5 (4o5 A 5(45 A 5 573u A R&4 A134  A EW3]5 A Ev4: A Ec4g A E4 AE(4? A14 A 5 5945 A 5 EB94) A 5 5e35 A 535 A E}4 A E4 A E-3D A E31 A T44 A !!/={M{{M_@%}^A#$  }  } ^^^s}%ۂ_7{Ys\/sK$~  cۂ  ۂ x+p^%ɏN#X N#SN#hN#vN#$+ 1 7 1 7 1=5%Bx$     865 BBB޵޵޵-$6JNA6'KsK$K- K=K^cINTKK:KnJgu&6(KFKla^ 6AI6Bt#-6Bt#' 6C#,^6E ,^6F  ($6GW  ,]6H  t(&!6J,  t(BJ.6Q | H66Sӥ  +:6"t#E6*j#I6+ #56,t# -6-t#L6.#U6Yg#$-  -  -  tD26$1nt DT6%t  t,h-60 (P67}?  C(68t  C*n6: gggv46^6hki6itkf6jPkd6kks6llkpv6m>b$)  z  A6o .#F6e#$-6ft#(6q#,u  t( 6ss (:6tP  $(0^6um (V6v   t(r~96wwt ,v6y ,v6z  $($6{|  $,v6}  t t,v6~  P t,v6  t,=v6  l t t,`v6  > t t,~v6  t *,v6  P *,v6  *,v6  l t *,v6  > t *(!$6,  t(B$6d  P(c$6M  ($6X1  l($6q1  z( 6V  l t( 6̐  > t($6T  *(3!6z$  5(T!6[$  =(u!6Z$  ;(!6y$  A(!64_$  G(!6$  M*!6C$  S0jjPlz>p7E7j#57t#$5  p  ~p  tlp7  *mp7  tYY Y#P7,J:7.KKR8K,n#7/070j#Yh71#$2  $n#  $m#  tAn#72 D 777fOK78#$8</ 5 ; 7 5 ;,* 779 5- 7:Y 5 UH 7H+E7Ij#+57Jt#$0f l rH  l rG  l t,H 7M l *,H 7N l t* 7P  } $.C#B8+@7=#+o7>j#+z#7?t# +)7@:#+ 7D#+;7EC#@7475$,  #  #  t17B  ,#7Y  *,4#7_   C(P/7c* (q/7d66*  *'str7i+1* 'log7kz  (Yh7m6$ (Yh7n(   C(#7p4t  t(-#7q0t &E7s5 (f$7{;  *(L7~L   (>7  $ ( 7$O ([:7{=j *('7Q/  t*7 ::*:Ao!v])f%F!>$S Y _ Y _ Y%$X7    . (I!  O!K &v!B? -!  S}%M~<~Ys\ V/{ $  8;5 ;O  8;j  t6.#   6.#  $6!   >7!%  6uT~ 78ƣ  $<a=  FFeF[v]T)f%j!>$     %'$`  ?  R (m!* O!Y5&!H  -!# !w>jjj3^Ii3#I3~#%!>33i3E$Q ! '] ! '6z3; 2;3 ! 85o3-  !EJ3Z ! 53 ! T3: !   -->*3eT3s #+3t #3u #3v# %)C3fCY'3g_3j7{3k\3l /3m3n~Y3os3p3qC$T  O03h+!~,M)3y  ,a)3{ ,z)3}  (3 (8E3,  (3 (3C  t( ~3F3 (,~3BC  t(M3:  t(n2P3<C  t(3  t(33CY'3$or x ~m x ~;m3 x 8 ;m3 x 8;l3 x tE-3? x EQF3 x  T3"6 x  30(3~.#%\3{3\3 V33CY'3D33J39/3?3D3~Y3s!>33F03 "~;}3 I 8;3 I $ 8;3 I ;3 I O;3 I t($4F?#Z I O743  I $6Q3"Q `6nf3*#C I6f318 `Gend38C IGend3?N= `6se3F>9 I6se3Mm3 `6*3Ug9 I69*3] 3 `6V-3b2~ `6su3f~ `73t  I $738 I 6K3h4 `6z}3j& I 6z}3! $ ` E43 ` GUat3n8 I Gvat3$ ` 63 I63 $ `63$ I63]<$ `7&3 I $7&wp3'E I $7?3S I7Xc3fq I(~4ZbC I C $73 I C $(4o&C I C(4C I C C7 3 I Z&#4  I1A4 I $Ee3]7 I $E4: I $Ec4gF1 I $E4 IE(4/ I14η I C $5'94C I C $EP94) I C $5s37C I 53:C I E}4- I E4V" I E-3D I E39 I T44: I !!M9$UUDDxDx $>D}%ۂ_7{UYs\/Z$q  rۂ  ۂ 24xi%_k7{mUYos\q/s2 $ӭ7 = C" = C =IKZKZeKZpes'}%ۂ_7{UYs\l/$= % + ۂ % +ۂ %1@ri%6_k7{mUYos\ql/s$[     666\\\lE* :N+:x #+D:y #++:z #%b6!>:n:|$  &b6  &(:q 1,b6:t  8DM2:X    R!:&  ,," :.#%87\:!>:$,  8  ,8:  8,8:  8A8:  t777  :.7#%\:7:{:\: V::Y':#D:YJ:_/:e:j:~Y:s!>:Ί,: o 8,: o $ 8,: o ;/:  o u;J:) o t(k$; o u7:B o $6:[ 6f:c o6f:k.# Gend:s$ oGend:z # 6<se:2_ o6Yse:D$Y 6v*:t_ o6*:A Y 6-:~ 6u:%~ 7:m  o $7:# o 6+:~ 6HK:3 &e;F  o 6z}:9 o 6z}:$  E:   Gat:C o G at:)5$  6':0Q o6D:7g$ 6a:>: o6~:Ed$ 7wp:T o $7c:h o(;Yh o $7:  o $($;i,, o (J;u o 7h:1 o 7: o1;. o $E;5  o $R9;ߗ4 o $#9D.`-#I9F #%lY9Js/9K.\9L `$. . !.xl . !.;l9N .;l9Q . ,.69Z  7.68E9]`  7.69`h'. .6 9c . t6=~9g6. .6_~9j . t6z}9o 7. {69s. . {62P9wQ0 7. {69{ . . {6 69Z$ I68E9]@ I649`' -6V9c# - t6s~9g&' -6~9jc(# - t6z}9oh$ I {69s' - {62P9w2# I {69{];' - {6? I!!${{,d<+@<#nsql<#nrow<#Tneoq<#`<>< $  ",  ;+  t,O,< 'plog<Z  * <%!  tV }%ۂ_7{Ys\/V.$([ a gFۂ a gۂ a$mSi%r_k7{mYos\q/s$ 4      $rrr$##9#D9=x=j#d>=j#  t,=  * *,=  *$=  OOO>nstm>Ϩ#7$  O  ,h>  ( >֬ $  $Hz>Y$  $nMv]f%M!>S%$ " (= " ( "!}%SM~<~Ys\s Vy /=.B.{ $G. M. ; M.; M. ;3 M. t6U.#fs  S. 6w.#Sy  S. 6!~s  M. >7! M. s  6u~ S.7ƣ& M. s  <aM M. s .Nv]f%3!>w$}     wJ%$& & & & & &(6! O!p&c!  -! !4333{[! I!.#%!>!(S!1$ͷ     6'!)S ;A!+  5_R!4: TȠ!7   !y.f#+!{ #%{!z$k%  $%  $% {#SD!=.#%8y(\!?!>!@S$y  8y  ;8y!C  >7y!D  t(((^f?o%%fb?pt?qtB?r6$,^ d jN%f d j%f dp?.#%u$     * ?c   uuu  !K.(#ICv!~#Im!u#%:\!L(8?!Og!P{,!St{!T \!Us V!Vy /!W !X !Y!Z~Y![s!>!]S! Y'!D!J!6F!^GS 5iY!gP  5&X!ui  E5f!  5 !# 53! 5!L 5"!N 5?(n!p 5\̂! 5yˉ!  5! 5N!DZ 5! g5(n!$ g5 ̂! g5'ˉ!   g5D! g5aN! g5~3!S 5! 5 {!0   g g 5ʞ!   EI!  ;$:! ;>:!  ;]:!   ;w:!  ;9!  t6$!  Eى!F 6!%u 6f!  6%f! GBend!  G_end! . 6|se! < 6se! 6*!D 6*! 6K!{ 6 -!~ 6* u! ~ 7H !#  6j %!   6 .!   6 %!&    6 .!P    7 !  6 !|~  7= !g   7` !  % %7y !Lݶ 6 J!H   6 J!_  6 Kv!O~  6 U!&   6# U!8  6E +y!J   6g +y!\  6 'D!p  6 'D!y  8V! s CECI#(CJ #% <CF!CG , $  s  D  s  ,X CO s ACT s   %       !.g#%m {! /!$\!s ! Y'!! !% $% % $,9 m! %,R m! % ,k m! % $( !(  %( 8E!ʌs  %( !;% %( !Ջ  % t( ~!% %*~!ش  % t'!.g#%m{! /!$\!y ! Y'!!!$$ $ $m $ $,m! $,m! $ ,m! $ $(!i  $(;8E!by  $(W!D$ $(x! $ t(~!܏$ $*~! $ t!!fCECI #(CJ#%<CF !CGN$& & &f & &,zCO &ACT & $ &!! @\+y@x#map,@btԠ@c {@d m@eu!z!y@v!>@}S/@~@@ Y'@@~Y@s\@s V@y J@D@  tlmap@ lmap@   lmap@  ($@  (@ܱS (8f@䉴  (Tf@ 'pend@  'end@Z 6se@Y 6se@ l 6*@ 6*@ 6K@ 6:-@# ~ 6Wu@'~ 6yz}@8  6@T  6@l    7@_  6@u~  7%@   7C@f  7\@_ 6y@u 6@ 6J@   6J@ȵ  6Kv@~  6U@   6@U@   6b+y@P   6+y@   6'D@3  8'D@F     \+%>e #4$4\ b hL> b h> bnort`vUpI Sq 8rr"}sO4īt>Wu\sus3uuuv/u9uMuWsXtt~|uusvt!*-t~!Vu!s!Vt!Rv!\u!u!u!v!\xu!v"\xu"u"v1"\xuB"uN"wZ"Pwf"Pvs"u}"u"v"u"v"u"v"u"s"īt"Ru"x"v#u#u##v0#u:#sJ#,3uT#vw#,3u#x^#s "@Fu"v"@Fu"v"@Fu"v#GRu#sc#>u#sJ#>ju#v $ju$u)$s9$uC$v"u"s $u$u)$sX$ȭub$uv$sK$EQu$v9$EQuC$v$EQu$u$s."ENu"v"EKu"v1"NQtB"QuN"wZ"Rwf"PvX$]vub$uv$y!0`8Sʭ.#IuB'# %rXBU3BP!>B>e=BtTBBBCxBsB1$ / ! /U ! t ' /;{B9 ! t ' o;BL ! t ' ^ oz~BVr ! t '6\Ban! l#GstrBitC l#{strBs. ! ^r-3:|iU}4i}}tn~__mB9o!'N~\`/A /A s  ts|}}48Cʭ.ʭ#.#%BX,Ue=,tT,,3,P,ʭ,p$K,/  2/B  t ' 2/;B,  t ' B,  t '|}4}}t${m,'ʭ|d}4d}}ti{m,i)'|@}4}}t{m*jn'n!P8G.#+B^C#%%XBBU3BCP!>BF>e=BHtTBIBJGBRBSCBT~i$F/ n! /% n! /$ n! t,%Bk n! o,%By n! ^ o'strBC &/ strBp^ n! ^1/ B n! oU UBwt  n! QD0ot  n! t DR.t  n! t ?$BsC n!  t!DzS n!  p o@!Dg n!  oBFBt n! |!}4!BBkon!|!1I}4!^|!ND}4!__a!}Y@|">F}4"Z+"̅GlG+"W3GtV;s"lb1:l1+"W31tG2:062:|" }4!BBo|"K}4"^|"G}4"|"QG}4"|#e}4__n*t!L*o0#O#;o__a#;o__b#;o|E#3v}4E#!y|l#S}4"__n~r#r|#}4#l#|#:9#?9#|#}4i}}t#'| $}4}|4$}4}}t4$'|X$'J}4!}|$}4}}t$'$B:}4!}|$F}4"__a$@ $$ $   $% {*%{%?f% /%?g B?hz%$% % %%  % %  %/%/%%/%d&?./%#%R%%$d& j& p&&R j& p&#&R j&6E& ? {& 8 ? {& %%v&%v&&&fo(A) xCUpI)tp:Z(r+(Pi3tS8t4 VsI'(u)w)Xsm',)u6)u@)s'R)ud)up)v)u)v)u)v)u)t)Ps')˯ίu)u)u)v*ӯu"*u9*s"(K*ӯۯuU*u_*uk*s>(*u*u*v*u*u*s(*%u*u*v*"t*Pv*%*u+u+v)%*v)%*u)v)%*u)t)P ( N(|")W}4")~__k@8')__i@< |M)}4")~__x@M)})c!__x!})__y!)$$|)T}4")|)%}4)|)9 }4)__x!%| *}4 *__x?*__y?*|F*}4")w@l ~__x@lF* |x*X }4x*__aCT}*__bCT*s %|*R }4)=m!Ĩ*$|*}4*=m!*$$|*}4")~__x@*)+D!__x!)+__y!.+$$}}E+}+}%ۂJ+_7{Ys\ /++$F%+ + ++ۂ + +ۂ +J+J++J+,<^%+_N#ɏq#X r#Ss#ht#vu#q,$&, , ,, , , ,++,+D-.}%ۂ,_~7{Ys\ /D--$I- O- U-4-ۂ O- U-ۂ O-,,[-,-i%`-_k7{mYos\q /s--$- - .- - . -`-`- .`-'.2. '.  SS#.}%ۂY._~7{tYs\/..$`. . ..ۂ . .ۂ .=Y.Y./Y.rr#!/!/8/0DUpy@xtVp@xtSs/0yӰv1yӰu&1v;1yuE1s/P1uZ1s/j1ut1v1u1s01hv1hu1u1u1sw01.u1u1s^0 2u2v&2u02w<2PvI2$uS2u]2vh2.Hur2s0P1;@uZ1v1CHu1v}2hu2v2hu2u2v2hu2u21{ }4")}|;1w}4)}|P1` }4)|e1}4e1|1}4e1|1}4e1|1}4")|1>}4)\j!1~__a!1 |2}42~__a!C2|!2A}4!2|I2__n~R|c2'}4!2 c2|}2}4)|2}42}|2_}4!2~__p!7|2G__p__n~g3 GKI.rI#3$$=xI g3 ~I23  g3 ~IQ32 g3 tA GM g3 *2323<*}43}g33m3Utz3PO4$Ut$Ss@49$ uC$v$ u$t$Ws$4" u"v" u"v1"tB"QuN"wZ"Rwf"P4$Ut$Ss49$ uC$v$ u$t$Ws4" u"v" u"v1"tB"QuN"wZ"Rwf"P:5#Ut#Sv $*qu$u)$vX$DXub$uv$n5 $cUt$PvX$3ub$uv$5 $jUt$SvX$2ub$uv$|6@!}4!~__iB~~__oB~ CBnBGB-B~6u6u"'6u6u686u6u6T6u"u"u"6u7u7u7u,76u6u6uQ7u]7ut7u~7u76u6u6uQ7u]7|6S}4"6O#Zo__a#Zo__b#Zo|:7ɮ}4:7}PFsDFsBFsj7tR#^o__a#^o__b#^o|7}4:7*F!.F85Ut5St5 t5Px5x5w5sw5Ws76 t6Qu6s$86 u6v" u"s;8"&)u"s861du7u7t7ht,7lv?7^auQ7u]7vj7jut7u~7t7Qs86jmt6Pu6v?7uQ7u]7!9#Ut#Sv $*ju$u)$vX$DXub$uv$|9}49F9u6u6-B~p9u"u"u"9u9u9u9&/9D959__a59__b59Z99|9I?}49@i:!9yUt+9QSwH9PsO:"u"v"u"v"u"v9+:u9u9|:X}4!g A__a:@7;i:!Uts:Rt}: t:t:v!!u!u!u!v7;uA;uN;u[;vy;u;u;u;u;|t;Xg A~__at;e#@|;#Yg A~__a; #!7@'< U4)P__k!&'<P__y!'Q__x!(Rv)ֱرu)u)= U4)Ww!& __v!&=Vq%=P!; Hs<=u=s<*t*Pu*s<)"u)u)u)v= t=Rv)-/u)u)u)v=-/t=DsA=*hu*u*sw=)u)u)u)v=t=Rv)u)u)u) |= }4)|='~__x!g|=y~__x!?y U4)P__k!?W__y!R__x!P__j! XsW>)Բײu)u)s>R)ײڲud)up)v)ײڲu)v)ײڲu)u)s>)߲ܲu)u)u)s>)u)v)u)u)v*u*u*@H U4) __v! @__y! V__x! S\j!P__j! Xs?)$'u)u)u)s?)9?t)Ru)s@R)ADud)up)v@ADu@v)ADu)t)Ps$@@KTuAuAuAs]@@TpuAuAuAv*bgu*u*st@=wu=s@)u)u)u)v=t=Rv@uAuAuAv*u*u* |@}4)|'Az}4'A__aCT,A__bCT1A&$&AU4)W__x!Vh__y!SvAѳܳuAuAv2ѳܳu2u2v2ѳܳu2u2|A}4)~__p!|(B }4!__sB__nBtu2BuGuH|kHa:9kH?9pH|H__cHrI U4!V__cDRtrRDStWr;DTQrDUSGDVs IHH uRHu^Hq@Ir-D^~Pv94At9Qt9Ps^I(Bft2BWu \-P%qD.b/tint,0E6O:8;3?t+R@_>\ ]> ^._0$\ b h /._0 b h ._0 b NUNEn't*<1@i2lR3:4 e7t89tS;tĺ,U-{!.{\/Wk0{*12iP33/4t5{C6!B;3D@EDEW!,Ji ,O{R:TQ:YP]3x^WS_{`#R \W|e>.fbZ6gFPh<7j>ˮkbl_Qm^ oN,rP,sWtiPP@|{ƺWDh{@{e{aj{  $m8{,*54ieiWui$+itVi@Qt #tq t5t 5 "i@= 56@#$*ZP V \0= V \= V PNb=7 . 9J 9# 9#$,     q~~~ G H- UL V#~ Xt#N Y #$@        ] I^ \u ]# fs#/ is#R j#  k~# l #6$CV   N   R Ji*W {88 |#~d } #$    *W  *W  K~ y # s# ~#DK # E #V$`   n   ? L ev #a #$u      F M t ώ  #- t#L ${     d ώ    ώ   N  ?  #3 s#  t# $k      ?    ?   O  y$  # s# ~#: ~# # # € #  $F)  /  5  y /  5 y / $ P 9 ? z ҆#B Ӏ # $QU@  F  L ) ? F  L ? F B QD  +  چ# s#b ~#') # #ĭ #I # $&W  ]  c  + ]  c + ] ] R u ns B #uw #M $7n  t  z e ns t  z ns t  St-- - ii i        $    ;    R  D D i D      ;  8e@ 9t#rem :t#._1  $   ._1   ._1     @$ =e@ > #rem ? #._2$p$   ._2   ._2 $$$ J* Ee@ G#rem I#._3$* 0 6 ._3 0 6 ._3 0<bi QLbi Ne@ Oi#rem Pi#._4L$   ._4   ._4 LLL)  >$s) / 5  / 5  /;*8 % &#| '#U (#J )#  *# +#| ,#Q -# .#  /#$i< 0U#(m< 1U#)2 2U#*3 3U#+ 4U#,mi 5U#-gC 6U#.z 7U#/2 8U#0 9U#13 :U#2ii ;U#3cC 5X j_p kv#_r lt#_w mt# nP#  oP#_bf p# qt#; t # u # ]3 v*#$ wI#( xs#, {#0_up ~v#8_ur t#<p y#@p #C_lb #Dϛ t#L #P$  5  5  t *t  tI t0ht h tnUO >N >N5 tm,KrLt#Mt#fsNt#'EOt# *&Pt#8rQt#8|Rt#_St#Tt# @U #$'V#($   tm  !tm -1 2 #43 #$$- 3 9 3 9 3?,{9 :#&; #$  ,{  ,{ DDD;mKV}Lt#Mt#$V; A G+m A Gm AMtc#K#$  t  t RRRI5cD#KD#!$I O U95 O U5 O[\hzt#>4t#gt# t# t#$  \  \ `` `r>U4Vt#J$eWr x ~b> x ~> x"op#Aq#$   "  " "lwp~##j$CE     """m <H#I|#n# Dm##8LNt#< t#@l t#DE$x7}  ] <   <  }Nx~pad#$  x  x   N.R+u ,.-8#@;UH#y<[#N= Z#>g#7V?#@r #t~A5@#(nBK$#eC$eD]$EN^$FF'$ 'GV$H  $<IC8@#RJ#JKqJ$zL&#3O#P#Q#T X#VU#`V%#W#Xv#6Yk 9Pn$[     PIIIQ EVtŇZ$} " ( Ň " (Ň ".I[_$X  wI  I 3332 9{%ɏ|X }S~hv $^2  8  > "  8  >  8 D  R%I ɏX Shv $       I I  I !+O% ɏX Shv`!$ ! ! !x! ! ! !  ! 3"3 %!ɏX Shv "$J"3" 9" ?"#" 9" ?" 9"!!E"!"k%J"ɏX Shv"$" " "" " " "J"J""J"#S%"ɏX Shva#$# # #y# # # #""#"4$-%#ɏX Shv $$`d4$ :$ @$$$ :$ @$ :$##F$#$S%K$ɏX Shv$$Ww$ $ $$ $ $ $K$K$$K$%~%$ɏX Shvb%$C% % %z% % % %$$%$5&8%%ɏX Shv &$b5& ;& A&%& ;& A& ;&%%G&%&C4%L&ɏX Shv&$M& & && & & &L&L&&L&'1&%&ɏX Shvc'$:' ' '{' ' ' '&&'&6(:g%'ɏX Shv($6( <( B(&( <( B( <(''H('(P@%M(ɏX Shv($C( ( (( ( ( (M(M((M()g%(ɏX Shvd)$K) ) )|) ) ) )(()(7*%)ɏX Shv*$7* =* C*'* =* C* =*))I*)*k %>N*e *$* * **> * *> *N*N**N*9+%>*e+$Pk9+ ?+ E+)+> ?+ E+> ?+**K+*+ %>P+e+$2+ + ++> + +> +P+P++P+;,d%>+e,$&;, A, G,+,> A, G,> A,++M,+,k%>R,e,$[, , ,,> , ,> ,R,R,,R,=-. %>,e!-${=- C- I---> C- I-> C-,,O-,-5)$%>T-e%-$- - --> - -> -T-T--T-?.X<(%>-e).$p.?. E. K./.> E. K.> E.--Q.-.`,%>V.e-.$. . ..> . .> .V.V..V.A/ۖ0%>.e1/$mA/ G/ M/1/> G/ M/> G/..S/./d4%>X/e5/$A/ / //> / /> /X/X//X/C0' 8%>/e90$C0 I0 O030> I0 O0> I0//U0/0D<%>Z0e=0$JG0 0 00> 0 0> 0Z0Z00Z0/1MP1$|i/1 51 ;11M 51 ;1M 5100A101Rr1${~1 1 11 1 1 1F1F11F12T&0#1$f2 2 21 2 2 211 212G`V&1#Z2$92 2 2r2G` 2 2G` 2%2%22%22lX&%2#2$z%2 2 32l 2 3l 222323ei% 3_kF1'{m'Yo'\q'/si3$&3 3 33 3 3 3 3 33 36Fv%W03XwUe=xtTy3Ox6z3W* Ж{*4$7 8 8B4W0 8 8U4W0 8(q4U 8 8)4eq7L8 8 8)4ltL 8 8 8*4m7Jt h h *4d5~ h*5Jh h 8*95"K  h *^56/   h *5  U*5U\U %8*5tt 8*5b=P8 %8 %8+eof8t,4t %87Ȝ9-W?3#-@#%6Ζ<`6$  x6  *6ζD[ ƛ(6ζG  .6K .6N   *6WP_3 ƛ* 7S^  *A7Vͯ  *b72PZVl6  *7# 3?~8$08 8 88S 8 8.8SG 8 (8U 8,]~ 8~0808808o9o0 wsv>%0~9G9$ o9 u9 {9_90~ u9 {90~ u999990:^i>#9$0: 6: <:9^ 6: <:9^ 6:(:*Z 6:(: ěH 6:/&'m  6:99B:9:ci:#.z:c : 0:.:c : t1:$ : :2c : :0:G::G:?!tX; %0ј*lkX;%S:0;$!l]; c; i;H;S c; i;S c;:::o;:;h;$[; < <; < <; <*;!l  /!p%S t;t;<t;=чN34g=4]\4O`*4c~4dZ994}o:%<<<$= = =<< = =<< =5=ze~ 5/=ida~ 5L=P$  5n=  =6=! s  7=! 8ɔHx'  ==N#<=<<=<t>'L%>~Ys\ V>9{p>$-> > >> > > >>:>>>>~@k1%>M~<~Ys\Vh/~@@{UK?$@ @ @;`? @;z? @ @;? @ t6?.#k @ 86?.#6'h @ 86@! @ >7#@!_' @  6@@um,~ @7c@ƣ( @  8<am @ 88>>@>@nB0}%@M~<~Ys\nBV{B/BB{tB;A$)B B B;PA B;jA B B;A B t6A.#bnB B B6A.#Y{B B B6A!RnB B >7B!3  B nB 60Bu~ B7SBƣ  B nB B<a B nBtBBtBBtBBB@@B@B=+C<xB$"+C 1C 7CB 1C 7C;Cy 1C>z 1C tBB=CB?C#<U@_V=@WCC$iC = CC = C = CUNBCCBCyY?8kDN&>#c#D$vyY Y Y7DN Y YPDN Y tAN Y  @F{ 0r3/Z08tna~#~#&:#>D$mZ Z "ZE{ Z "ZE{ Z*5E6#r8 -Z*QEa8 -Z(iEAn Z(EiT Z*E> Z*Ez}8 Z *E{ Z @ @6FiZ @("F% Z @7@F-ux Z @*\F6 Z8/E6 Z @ BlZ-BoC#CxC3Z%nNC3q3{rU!>s>t~Yus/vCZwHZ\xVyhzMZY'|\D}^J~^DpGV ^DGI ^ 5GdQZ ^5Gf MZ ^5Gy MZ ^EH\ \ ^5)H`MZ ^ 5QHh >MZ ^ EtHd/i  MZ MZEHd3`(  \ \EHd7   EHd;  h hEIi ^ E I}% ^F AE gZ;HInN^ ^.aInN ^ @.zInN ^ ^.InN ^ ^ .InN ^ ^ @.InN ^ h @.JnN ^ h @.)JnN ^ U @;DJmNc ^ t6fJ$fP^ ^ ^6J$i^ ^ h6J$l5^ ^ U6JfqXnMZ ^6Jfx\ ^GKend|'MZ ^GKend\ ^6;Kse^ ^6XKse;^ ^6uK*n^ ^6K*^ ^6K-(d~ ^6Kdry~ ^6Ku&a~ ^7 LZ%o ^ U7*L ^ 6GL~ ^7eL:m ^ 7~L ^6LK8 ^6Lz}8 ^ 6Lz}8 ^ GMatk8 ^ G!MatL08 ^ 6CM^ ^ ^6eM4^ ^ h6M^ ^ U6M;"^ ^ ^6M;#^ ^ ^ 6M;n^ ^ h 6N;(^ ^ h6EN;o^ ^ U7cNwp*Q ^ U*N^ ^ ^6NB^ ^ ^ 6N^ ^ h 6N;^ ^ h6 O^ ^ U7HO [; ^ MZ U6oOc^ ^ ^6O,O^ ^ ^ 6O9 ^ ^ h 6O_^ ^ h6P!™^ ^ U6FP(Q MZ ^ MZ U6mP1^ ^ 6P8]MZ ^ MZ6PAMZ ^ MZ MZ6P8J^ ^ ^6Q8^ ^ ^ 6IQ8^lc^ ^ h 6uQ8Vq^ ^ h6Q8Zb^ ^ U6Q8^/^ ^ MZ MZ ^6R8c]^ ^ MZ MZ h 6/R8g^ ^ MZ MZ h6`R8Z^ ^ MZ MZ U6R8wPY^ ^ MZ MZ  6R8|K^ ^ MZ MZ h h6R8ĕ^ ^ MZ MZ MZ MZ6$S89f^ ^ MZ MZ \ \DJSã U @6vS6+~ ^  7S M ^ ^6Suh ^6Sqh ^6S> ^6TJб~ ^ h 6>TJ(~ ^ ^ 6eTJ:~ ^ h 6TJ"D~ ^ U 6TIL~ ^ ^ 6TI5~ ^ h 6UI4U~ ^ h 6-UIIR~ ^ U 6TUJC~ ^ ^ 6UJ\~ ^ h 6UJ&~ ^ h 6UJ1"~ ^ U 6U->~ ^ ^ 6!V-j8~ ^ h 6HV-x~ ^ h 6oV-~ ^ U 6Vg~ ^ ^ 6Vg~~ ^ h 6Vg~ ^ h 6Wg2~ ^ U 67Wz%~ ^ ^ 6cWz~ ^ h 6Wz,n~ ^ h 6Wz<~ ^ U 6WM3WC ^ 6Wm;dt ^ ^6&XmF*t ^ ^6\Xmt ^ ^ 6~Xmt ^ h6XmLt ^ h6Xmpvt ^ h .XvL ^   @5%Y   @5QYI   @ 3Hl   @ 1CCYCYA%zY>Y$)Y Z ZYz Z Zz ZYY ZY~kDkD(ZkD(Z CZ~N88\1D&H#I1F#%lMZY1Js/1K\1LZ$  Zl  ;Zl1N ;[l1Q  6$[1Z 8 6A[8E1]! 6^[1` 6[1cMZ  t6[~1g 6[~1jCMZ  t6[z}1o8  %6\1s_  %6%\2P1wMZ  %6G\1{  %6i\e #`0e Z:`#}W 5+8# `+8#b O+8#K +8# T+80e 4(`00 W`0 `0FU a0L `0 `0] °m`0) `0@ wH`0 ƊJ`0`b fa`$=[ a a a`o a ao a8 _^,_,_a,_cj 0MP `#r< s+8# G+80 `0>e _D`0e 9`#}W Ү+8# \F+8#b #+8#K +8# ?+80e `00 qo`0 Y`0FU T/a0L 8C`M 66`M] `M) `6`M@ `M :`M`b a%Q#ab$c c cbQ c ccQ c+min {T8+max 8NHk 8N5{ :i8NLH 8N0 #8N  _u8O  8#a#ac#a,fe{ MMP ^`Pr<  +8P W+8M `M>e }`Me  `P}W +8P #Jm+8Pb $م+8PK %+8P &+8Me (3`M0 )E`M *-A`MFU +ZaML ,S2`M 7,`M] 8`M) 9κ`M@ ;3`M <z{`M`b =4;a%Qcpe$E,f 2f 8feQ 2f 8feQ 2fQmin UQmax /UOHk fchm BMMP C)`Pr< Jt+8P K+8M L#`M>e M`Me NuU`P}W Oij+8P U0 +8Pb V+8PK W}+8P XN+8Me Zs`M0 [`M \w`MFU ]MaML ^AR`M iyZ`M] j;-`M) kc`M@ m `M n>`M`b oQ7a%QCf h$e 2<`Me b`P}W +8P 8p+8Pb "+8PK +8P *+8Me 6`M0 `M F`MFU 4baML `M `M] A`M) W`M@ `M U)`M`b <a%Qhj$rdk jk pkjQ jk pkjQ jkQmin x>Qmax zp>OHk 8>O5{ f>OLH >O0 >O  <>O HS>hhvkhn MMP W`Pr< ȷ+8P No+8 M `M>e `Me ĵ`P}W Q+8P z+8Pb *%+8PK +8P +8Me j@`M0 `M y `MFU CaML b`M 3`M] R`M) 4`M@ 7`M `M`b ca%Q{kDm$6n n n\mQ n nomQ nQmin #tBQmax FvtBOHk ZAtBO5{ qtBOLH ܞtBO0 tBO  tBO JtB{k{kn{kp( MMP `Pr< $+8P L+8M Ƌ`M>e x`Me  `P}W C+8P ڜ+8Pb =]+8PK  ;+8P ;+8Me Ӓ`M0 G`M `MFU YaML `M  `M] G`M)  `M@ x`M /`M`b {[a%Qno$_p p poQ p p pQ pQmin PQmax `gPOHk PO5{ POLH sPO0 [PO  y<PO Pnnpn8s) MMP |`Pr< 5y+8P D+8M h`M>e O_`Me {`P}W u_+8P p +8Pb oO+8PK tl+8P |+8Me ":`M0 #.`M $`MFU %aML &Ó`M 1`M] 2؛`M) 3G`M@ 5Pt`M 6`M`b 7a%Qp|r$58s >s DsrQ >s DsrQ >sQmin 4bQmax ibOHk VbO5{ )bOLH )NbO0 +^bO  -*/bO /DbppJspu <MMP =6d`Pr< D+8P ES+8 M F|`M>e G)`Me H֚`P}W IO+8P OZ+8Pb Pڔ+8PK Q}5+8P R+8Me Tv `M0 U5`M Vq`MFU WNKaML X`M c{`M] d*`M) e`M@ g`M hoS`M`b iGa%QOsu$ u u u0uQ u uCuQ uQmin @Q>tQmax B¢tOHk K(tO5{ M_tOLH [atO0 ]0tO  _tO atOsOsuOspx nMMP oU`Pr< v0>+8 P ws+8 M xAW`M>e y`Me z:`P}W {+8P +8Pb "+8PK [+8P +8Me `M0 `M !B`MFU 2aML +}`M Ϧ`M] &N`M) `M@ `M B `M`b #a%Quw$\px vx |xwQ vx |xwQ vxQmin r4Qmax tOHk }^O5{ "OLH n=O0 'O  vO uuxu { MMP e8`Pr< +8P ?+8 M H`M>e a`Me Z`P}W +8P @M+8Pb 8+8PK +8P Tq+8Me `M0 &`M `MFU aML Z`M G`M] ,`M) 8`M@ `M 2`M`b ua%QxPz$H { { {hzQ { {{zQ {Qmin  Qmax ~ OHk  O5{ fn OLH  O0 n O   O d4 xx{x}` MMP A`Pr< b`+8 P sx+8 M `M>e 13`Me {`P}W y+8P t+8Pb +8PK +8P ,++8Me 9`M0 w`M n`MFU taML 7`M j`M] `M) w$`M@ `M o`M`b c0a%Q#{|$"} } }}Q } }}Q }Qmin WLQmax )OHk -O5{ {NOLH ōO0 O  {O ?s#{#{}#{D MMP J`Pr< 6D+8?P +8M `M>e ]#`Me )0`P}W N+8P +8Pb 1+8PK >+8P ~+8Me E`M0 _`M -`MFU raML {`M + `M] ,ΰ`M) -a`M@ /V`M 0h`M`b 1a%Q}$ҊD J PQ J PQ JQmin CQmax UOHk yO5{ p>OLH #{O0 %O  '"O )X}}V} 6MMP 7U`Pr< >h+8@P ?"+8M @p`M>e A`Me B`P}W C,+8P I+8Pb J+8PK Kze+8P Lo+8Me Nu`M0 O`M PT`MFU Q *aML RfB`M ]A{`M] ^%`M) _`M@ a]`M b`M`b cga%Q[$$#  <Q  OQ Qmin :$Qmax <EOHk EHO5{ G~OLH UbVO0 WFO  YO [D[[[B hMMP i`Pr< pI+8P qj+8M r+`M>e sT%`Me t`P}W u+8R {O$+8Rb |/+8PK }+8P ~+8&Me ]`M0 Vz`M D`MFU aML `M Hc`M] `M) c`M@ O`M ;I`M`b џa%QƄ$V+  ބQ  Q Qmin l)cQmax n OHk wwhO5{ y(OLH O0 eQO  NO ]3-`p MMP 1`Pr< X+85P K+8M pt`M>e <`Me @`P}W +8R $+8Rb x+8SK 2+8S b+84Me Y`M0 ]`M У`MFU aML h"`M `M] .`M) ٫`M@ L`M 6`M`b a%Qq$W- 3 9Q 3 9Q 3Qmin DQmax bDOHk FODO5{ WDOLH YDO0  DO  VDO N&D?؊' MMP ^`Pr< \P+8@P 2+8M l`M>e w`Me Ҍ`P}W P9+8R +8Rb ,+8SK ٗ+8@S +8DMe À`M0 fG`M *u`MFU aML 4`M `M] +`M) J`M@ I`M Ɖ`M`b ?a%QK$؊ ފ 4Q ފ GQ ފQmin әQmax HOHk uO5{ OLH Y5O0 O  IO քKKK  }!9#V!T #y!U" #S!V~ #U!W= #K!XN? # !Y ##!ZPT  Tall!\- ?2-*!#C@!C#C!NBUߤ!(.ZU-!qIZC),!QpZ!<V?4O!Z-^*"4!]$B""id.X}!_ $.q}!a $ *.}!d $ h.}!f $ * h .Ќ}!h $ * * .\!m $ t* $!pJ* $ *w8 5 **t9!::8 5 **! *NC!_*W}! $ X@!tDcZ!gj Y_! $ * *  $hN00Zِ$!-&!:#-!ِ#-Z!~#-!# Cy!g CM! CO!ܴ1+Co}!ݬ;C !=KC!D [C]!Kv1%!ˆ 13z/!Ie WR2!  { Wq2!  h W2!  ِ 8W1!  tWʏ2!  {1$!e  {D/q!L8 E)y!   EM! i  kEq!*  E!d  ߐ5 *!>j  [ !&T  tߐ N \? \ +\ ;\0 K\@ [\P kk\q`;}=/?!IF!~#4!~q:E$!L / 5]id! / 5^id! /8}!B~ JQE"7_ڪJgPh"V_1J}k"u_@Jy"_T8Rl"`7"ZLLaL7Vy"|"~#P"##F"t#\":# ($&)  /@Vy  /;dVy"  # t 7}%"A 8z/"t  |"@" #F$" #$: @ F| @ F>|" @w"4El"t4}";8_$oQ W ]ww W ];w" W;w" W t7P " 8aZ"OA"L80@"khbdec"tKh0Q"qhbhex"gTh0:V"r*h0R"㬲hboct"&h0R"̸h0&e"h0e"4h0"+h0F"0kh0'";h0"ݑh0<"a[h0U"ch0M"h0}"fhM3"'4mM"7,mM"̃mM"Nmcapp"*Frcate",zrMu"1Զrcin"3 rcout"5orM6"70rcbeg"Erwccur"G _wcend"Igwd+sI1e"r#Ip "s#Irm"t;#Iey"ug# I"vg#IU"#IB"#d"+8IC7"|# Id"t#`IQ"@#dIf~"#hQ";" g* "(Qi"C}P"c#7."i  # tEMf"  Egl": 5w+"#:  tE'"x 6E"@1; 6E" ;  ;6+ "A;  ;6,+ ".;  ; ;7J) "E  ;6g4e"% 64e"'>  t6s "4 6șs "=  t6"Oc38 86j."[}  *6#M"f{ 6@J"pa?* Os"wt6tI$"~z  t6@"D  t;7R"  teǚ8R" e8R"  f$"T.  g  t5L  c ;gQ} N  666e}#+ #0 h$(#&$/^h#+$0#@$13#Y$2l#X$3nD#vi$4c#$5#$6#u$7 #]Z$8#p9$9k߹$* $.>$ # )h # )h #>/%0JdG%3hokLLl*L $     444&&M_&,&`h4&1Ph$<  -&  @& Eh)&?  U t[&C  U UÝÝÝ%R&@`ݞ&BL)hdmyhmdyhymdhydm$-% + 1R + 1R +7YQF&`u. &LVLviLLLHٟ΄&4&Y#$Yi o uɟ΄ o u΄ oM&D{ $0  #QF  6QF 8&u U U U iUNuu{u<<<f&2&tР$o  f  f  y'6'yW3'Q$XN  i    >N ='6' W3'D$5  &=  &=  >N,P '"6'#W3'$s$+  P  P  >N 111J7'KL1[LLנV+:X(k(m8#3f(n+#<$ 6 < BTX < B.mX), < 0;W( < t8s(Bq8 <.ǣ3(j P t  *L(>0 P i 2(r P t ,L(E0 P t0HVg8a X*BI*m8#3*E3G*Fg*GMF2*H*ItФ$l  X  .X+-  88s*j<8 .E*i  t  j*uM  t VE8s~    EP8O   5ܥv 8Z"z 5u 8]n 5)8}A 56(8= 5T8W@ 5rB8; U8ZWWWMl-$,JA,'LsL$L- L=L^hINTLL:LnJu&,(LFLl ^ ,AI,Bt#-,Bt#' ,C#.[^,E l.t^,F l r*$,GW} l r.],H l t*Ч!,J, l t*J.,Q |8 H6,Sӥ} l r-:,"t#E,* #I,+#5,,t# -,-t#L,.8#U,Y#$-  -  -  tDܨ,$1nt D,%t  t.-,0 *3P,7}?8  C*T,8t8  C,n,:8 xxv4,^5,hki,itkf,jkd,kDks,lhkpv,m> $)  $  A,o &#F,e8#$-,ft#(,q#,u  t* ,ss8 *:,tPȮ  ή*ڪ^,umȮ *,vȮ  t*~9,wwt .0v,y .Iv,z  ή*j$,{|Ȯ  ή.v,}  t t.v,~  t.īv,  D t.v,  h t t. v,  > t t.(v,  t Ԯ.Fv,  Ԯ.dv,  D Ԯ.v,  h t Ԯ.v,  > t Ԯ*ˬ$,,Ȯ  t*$,dȮ  * $,MȮ  D*.$,X1Ȯ  h*O$,q1Ȯ  *u ,VȮ  h t* ,̐Ȯ  > t*$,TȮ  Ԯ*ݭ!,zή  ߮*!,[ή  =*!,Zή  *@!,yή  *a!,4_ή  *!,ή  ,!,Cή  îîڮ  Dh>p-E- #5-t#I$5  _p  w~p  tlp-  Ԯmp-  t´#P-,J-.LLR8L,nn#-/0-0 #Yh-1ů#,$2´ ȴ δDn# ȴ δ]m# ȴ tAn#-2 ȴ 7-7fOK-88#$8<ٴ ߴ  7 ߴ .԰ 7-9 ߴ/ -:Y ߴ UH -H-E-I #-5-Jt#8$0  PH   iG   t.H -M  Ԯ.H -N  t, -P 8 ' ή&C#B0-@-=-#-o-> #-z#-?t# -)-@#- -D3#-;-E#@-4-53]$,3 9 ?u# 9 ?# 9 t1-B  9.#-Y 9 Ԯ.޲#-_ 9 ů C*/-cԮ J*/-d66Ԯ 9 Ԯ)7str-i+1Ԯ J)Xlog-kz- 9 -*tYh-m6δ J*Yh-n(8 9 ů C*#-p4t 9 t*׳#-q0t J(-s5 9*$-{;3 9 Ԯ*1L-~L 3 9 P*Q>- Ȯ ή Ȯ*m -$ J*[:-{=  Ԯ*'-Q/3 9 t,-3 9Դnnnxo!vM)`%x!>4P$  h   4%x$X7  ŵ  ص *! N!K( !B? /!  }%4M~<~Ys\V/ej{ʶ$o u ;߶ u; u ; u t66.# { Ȯ6X.# { ή6! u >7!% u 6uT~ {7ƣ u ή<a= u [vMT)`%!>Xt$^ d j d j dX%Ѹ$`     *!* N!Y5(D!H /!# w>p.^Ii.#I.~#%u!>.4.xi.$Qź ˺ Ѻ ˺ Ѻ6$.;4 ܺ;>. ˺ 5\o.- ˺E{J.Z ˺ 5. ˺ [.: ˺ uu׺u׺4*.eT.s#+.t#.u#.v# %).fY'.g_.j2{.k\.l/.m.n~Y.os.p.qȻ$T  N0.h+!~.).y  . ).{ .$).}  *@.Ȯ *\8E., *x. *.  t*~.F3 *ּ~.B  t*.:  t*2P.<  t*9.  t*Z.4.Y'.L$o " (dm " (;m. " ;m. " ;l. " tE׾.? " EF. " [."6 " .0(.~&#%3\.{.\.V..Y'.D.J./...~Y.s!>.4.F0. "~;'.  ;K.  ή ;e.  ;.  ;.  t*$/F?#  7.   ή6."Q4 6f.*# 65f.18 GRend.8 Goend.?N= 6se.F> 6se.Mm 6*.Ug 6*.]  6-.b2~ 6u.f~ 7@.t   ή7^.8  6{K.h48 6z}.j&Ȯ  6z}.! ή  E.  Gat.n8Ȯ  G at.ή  6=.Ȯ 6Z. ή 6w.$Ȯ 6.]<ή 7&.  ή7wp.'E  ή7.S 7c.fq *(/Zb  ή7P.  ή*q/o&  */  7.  (/  1/  ήE.]7  ήE./:  ήEMc/gF1  ήEg/ E(// 1/η  ή59/  ήE9/)  ή5.7  5@.:  E_}/-  E~/V"  E-.D  E.9  [4/:  8M9Ȯή333""±EEVe3 3Ȯή44,D}%ۂ_2{UYs\/,$q1 7 =ۂ 7 =ۂ 78C4xi%H_k2{mUYos\q/s$ӭ     8HHH8MZMZMZ+s'}%ۂ0_2{UYs\h/$=  ۂ  ۂ 8000t@ri%_k2{mUYos\qh/stL$[y  d   88\\\hQ.}%ۂ_~2{Ys\/Q)$V \ bAۂ \ bۂ \ȮhnRJ@Uo RRoEWp\̴3qr̴qp̴qsPrqpqsPr6 qqp&sPqԮt>2%u2%u2%uW32%^vw4v w4x__x.}v5w4y԰@zUz4S{cUPߴn7"3|qUz47Wo>"<Q|%ArFsPSqZplqyqrյq}XrqsVpqrյqpյqsSp 4q&s0P9ήȮvgw4~__x.'gήJ3Nx__p3Ngp3NήvZw406.vw4vw4 tQ.As~__x.A~__y.Av={w4m.ƿ+%>=e 3$4  >  > ===n/H3tnUz47Vo/ rsr:qpqs{rkqpqsWr¶sSqrܶqqrsQqp%sRqr%׷q/q:p׷qp׷qqb0Pmsg4/|rDqq=r|qrqqqpqq/q9rV:Vs`{qtq~rVs`Vqjr|иsRpָqqqpָqpָqqpָq#q/};P}FPpR q\qfpsq}pqpqrDxqpDxqqrNsPqpqpqqp$1qryLQqrq%pIqSqgrw׻qp»qrI0qSqgpqqr?Kqpw?Kqp?Kqqro?Hqp?EqpHKs#Qq/};R}FPpOnqqt29u29u29u29I2w48-Ft.8x__x.Fx__y.K0`0SM&#Iu5'# %PX5U353!>5>e=5tT53535Cx5s5$u  {4  t  {;Z59  t  Q;5L  t  ^ Q~5VP  t 6\5aP Gstr5itC str5s.  ^P:vJ4w4Jw+8wtO~__m59QV~\et/4 /4 T  tTv^w40CM&M#&#%BX*Ue=*tT*3*33*3*M*R$K  vB  t  ;B*  t  B*  t gvvw4w+8wtu{m*MvF w4Fw+8wtK{m*i vw4w+8wt{m(jPPP0Gg&g#-5^C#%%X5BU35C3!>5F>e=5HtT5I35J3G5Rg5SC5T~K$F P c% P $ P t.%5k P Q.%5y P ^ Q)str5C str5p^ P ^15 P Q7U5wt  PbQ70ot  P t7R.t  P t?$5sC P  t7zS3 P  } Q"7g3 P 6 QBF5t P vww4wB5kQPv3Iw4^vPDw4x__aY@v@Fw4Z ̅GlG W3GtX;Rlb1:l1 W31t|G2:|062:vsw4wB5QvKw4^vGw4vSGw4vǣw4x__n(̆Pvw4vtw4w+8vDw4Jw+8wtDvrw4w+8wtrv)Jw4w+8vw4w+8wtc5:w4ww+8vFw4x__a@y?tDpuUz47QoYhDůR{sepDڮsrsq}pqpqr?sIPqSreDGsoRqyqpDGqqqqqpNQqqpsNQq}pNQqpNQqv`DJw4uԔf`^vFPw4uiO1~~__n1~v`Rw4uVwMZu[wMZuQwutwvHw4uiO~yZxUz47yc|Uz47So|c p?qIqSԮp&C#$&  p  p o  t/   Uhh hymUoPDڮr$Ǿs1Qp|ʾqpʾqqqpʾqpʾqqpʾq#q/};P}FPpAqKpVq`qjpqԮ<w4<vVKw4vw#]w4w~__i1Q|n3)U{qRp q3vXw4JncLc,U{osionSps6s}RsQpcoqqpcoq±cv w4x__n(t|!L(;O";;x__a";;x__b";;vw4xxx}%ۂ_2{Ys\/d$F%  |ۂ  ۂ ȮG<^%_ɏq3X r3Ss3ht3vu3$&G M S7 M S MY@%}^A3$>  }  } ^^^s}%ۂ_2{Ys\/sK$~  cۂ  ۂ x+^%ɏX Shv$S+ 1 7 1 7 1=6%Bx$~     866( BBBqUz4V__t/: /;rE'qqrv@Mqp@Mq}PrlPSsyPqrgs&Rs0Pr qqp+q5q@pLqqYpnqq{r#qpw_qp_qsWrxqpqr s#Qq/};R}FPήv~w4u.~v>w4˺v صx__n~|R淮v+\w4~__p.vLx__px__n~nh3}w4w+83}w4w+8vw4w+8ln2tUo2 o2o222sr9qqrZBq$s.SrmHqRpb?qtsRrqq}p}l}Q}Prsq}pqpqpqqp*-q4q@qLpXqbpqrqmJaqwraq$s.rHalqRrloqpsloq}pbzqtsRr]zqq}h}d}Q}Ppszq}pz}qpz}qryqqp*q4q@qLpXqbpqrmqwr"Qq$s.r HqRr5qpsq}pbNqtsRrqq}`}\}Q}Ppsq}pqpqrqqp*%=q4q@qLpX%'qbp%'qr9m\sqwrsq$s.roHs~qRr~qps~q}pbqtsRr%qq}X}T}Q}Ppsq}pqpqrAqqp*q4q@qLpXqbpqrmqwr}qqr q$q.r$qpsq}pqpqpbqtsRrqq}P}L}Q}Ppsq}pqpqrqqp*q4q@qLpXqbpqr-,qqrI,7qqr`m7YqwrYq$q.rY\qpsY\q}pbjqtsRr1jyqq}H}D}Q}Ppsjyq}pjmqpjmqrM|qqp*q4q@qLpXqbpqrmqwrMq$q.rqpsq}pbJqtsRr{ qq}@}}Q}Pps q}pqpqrqqp*!9q4q@qLpX!#qbp!#qr m|qwpq&s0Pr+q&s0PrI*Eq&s0Prgq&s0Prqqrq&s0Pr0Hq&s0Pr[qqrq&s0Ppqq8w-8w48xp-C=ήv]$w4]tj8uu^^vWw4uԔ;d<~v9=~->~__r@t^ p6x__a6 x__b6%ZvX4khkhx__n~vmSw4v\w4v~Lw4n12~hQUo2\S2\{__f2hwr1)q;sER}NPrY),qcpn5Aq{qvYw4<xcnntvnw]w4ww4<8ke CTUek epԔfCspwqpqsWr<qpqrZs#Qq/};R}FP^^P09&#$ 0  0  0 tA9 0 ԮX<w4Xw+80y6UsCP-3w476-qqqqqq/q:q!q+qRq@ qZ"qqqos-Pqq=Pqwq\qqqq}qqq/q9qqq`qtq~qqqqqqq`qjzqqqq_qVqqq#q/;Fqkq@qqqqqqqqqq9qSqgqqqqqqq%qqwqqDqq]qqqq#q/;Fqq9qSqgqqqqqqqqԮ i.8x__x. x__y.v1w4 1ԮvKK?w4K@ve@w4]tR"^Qx__a"^Qx__b"^QvEw4Fw+8wt IvEw4v`?w4K @v Sw4/7D^w4w+8vNz?w4Kw+8ByUsSs r qqp qp qsRrq!q+8 }$|r$sVq=rqr[qqqpqq/q9rVs`|qtq~rV*-s`|qjp|\rsRpbrqqqpbrqpbrqqpbrq#q/};P}FPpqrbwgqpuxqr~IqSqgrqqpq%r2$qpw$qp$qqr!qpqp!$s#Qq/};R}FPn~>2Uo2so2oW32~22sWr$qqrmqwrmqwrmsqwrmqwr6TeqqrMmqwrdm<Jqwrmqwpq&s0Prqqrq&s0Pr:Rq&s0Pr pq&s0Pr)q&s0PrEqqrcq&s0Pp0Hq&s0P^"UsSrw qp qsWr qp qps#Qq/};R}FPUsSrw qp qsWr qp qps#Qq/};R}FP Us%SpI*qqSqgpDXqqAIcUsSPp3qquIjUsSSp2qqR?Us\QsfRps q}p qp qv"w4w~__i5~~__o5~ C5n58G58-5~EqbqVqq gqq q}qqq q* q6 qB qq qwqq^ qh qt qq qwq O"ZQx__a"ZQx__b"ZQvO qw4O u}P8suD8suB8sv w4O u*8u!.8 UsSs sP }s}$Wr  sQq r X qbp qr% s&)q}ri  1dq q* s6 hsB lpe^aqwqpT jq^ qh st Qr jmsPq peqwq Us%SpI*jqSqgpDXqqvt w4t 0 qq |-5~Y q}qqj q q q@ D96x__a6 x__b6 0  yUs QS}2 Pr sq}pqpqpy +:q q vh Xw4g Ax__ah @ 0 !Us: RsD  sP s\ p!qqqp q q q p= qG qS q_ qk v8 Xugu A~__a8 e3@v} %Yugu A~__a}  3!2@ aq qq qq qqqq#q/;Fqq9 UpwqpqsVrgqpqrs#Qq/};R}FPUz4/~ /8s+/~l/~S/Sr qsPqp5 qGqSq_qkp} qqqqp qqqqp  qq+q7rRD qVqbsnRp qqqqp qqqqp  qq)q5pN qXqdqp|rp*s&Rq0r*Ps&Rs0Pk#/~hN/ry ks \q r qqpq}`rqsPqp5qGqSq_qkp}qqqqpqqqqp qq+q7rqsRsPpqqt56Vu6Vu6VuG6V6\3t}6Au6Au6AuG6A 36B3tK6*u6*u6*uG6* 36,6.t 6u6u6uG6 D666G6t-6u6u6uG663t6u6u6uG6 363t 6u6u6uG6 3tN6u6u6uG66vu6u6uG6R6+v{w4~__n.~vx__n~|R濺vw4~__p.~__n.~v(x__px__n~vZw4wx__s5x__n5qIqSq@Us$s.Qs9Rp?$EsIVqSIUz4w o{ 7z3o7z}oB7zQSR7{3n7|8PG7}8R7~8}rJ<qqs~r<Dqq p<Dqs RrILqq pILqq  g7Su7P7Wz7V7}f 73R73}r;q rRq'ri2q<rG qQpSqqs~psRqs~v6w4{ N3dNgvw4v2ܥw4vGw4v\w45Uz4w on73oB7QR73sr 7qqs~8 iO73Vg7} A7Pn78PG78R78}W78}78RrBJqq pBJqs RrSVqq pSVqq r5adq?rOqYrq'rd qnpXsRqs~vJ6w4Jƛvd6w4vyTw4vw4wqq v5x__c85y#UsRd7[Uz4wVx__c70tR71tP;728S|@G738rPd qnqzp>Gqv5:9?9%8%8v5x__c%8bUz4wVx__c7RtR7StW;7T8Q7U8S|G7V8r(d qnqz]P -7^~Ppy 4As Qs Pr{?fsIWqSp$0qd*hy69UsCSQYUogo AS{__a1|}~__rZWr`  qq*p7 qIqUqarg,4qqq}qr,-qqqp-0qpdqpdqqpdq#q/};P}FP@7:ps:p:pg:[s:[:[ 2vH~__p7uQ7ut7v95kkhx__n~Q \*y .0 07g/c/!(&\@A~2ht UN0 UN-f UNE   UN-  Ugy @ 1D W@j|J 1  9:)<<<O<b<u<<FwDDF׃ -?c&8J\n ˋދˎݎfI;/5"t R"UN+$5FWhyΕߕ$6HZlזvrٟR% : ; I$ > $ >  : ;  : ; II.I4 < I4 I .4 < .4 < I!I/  I I&I : ;  : ; I8 .? @I4 < .? 4 < .? 4 <  : ; I8  I: ;I : ; .? 4 < .? 4 < 5I : ; : ;I8 !< "< #4: ; @I? <  $4: ; @I? < %I&.? : ; @< '.? : ; @I< (.? : ; @I< ).? : ; @I< *.? : ; @I< + : ; I8 2 ,.? : ; < -.? : ; @< .I8 2 /: ; 04: ; @I? < 1.? : ; @2 < 2.? : ; 2 < 3< 44: ;@I? 2 < 5.? : ;@I2 < 6.? : ;@I< 7.? : ;@< 8.? : ;@I< 9: ;:&;.? : ;< <.? : ;@< =G : ;>.? : ;< ?G : ;@ : ;IA.? : ; < B4: ; @I? <  C4: ; @I? 2 < D.? : ; @I2 < E.? : ;@2 < F.? : ;@I2 < G.? : ;@I< H.? : ; @I2 < I : ;I8 2 J4: ; @I? <  K4: ; @I? 2 <  L< M.? : ; @I< N.? : ; 2 < O.? : ; @2 < P.? : ; @2 < QG : ; R.? : ;@2 < S!T.? : ;2 < U.? : ;< V : ; W(X : ;Y( Z.? : ;@< [.? : ;@I< \4: ; @I? < ]4: ;@I? < ^4: ;@I? < _4: ;@I? 2 <  `.? : ;2 < a.? : ;@I2 < bc( d( e4: ;@I? <  f.? : ;@I< g4: ;@I? < h4: ;@I? < i.? : ; L < j : ; Ik.G: ; @ lI4  m: ; I n1o1 p1q41 r1s.? : ;I t: ;Iu.G vI4 w4: ;Ix4: ;Iy.? : ; I z: ; I{: ; I|: ; I }.G: ; ~.1@ .: ; .: ; I 4: ; I4: ; I.? : ;  4: ; I 41 : ; .? : ;L < .? : ;@< : ;I.? : ;L <  : ; .? L 4 < .? : ; @< .? : ; @IL M 2 < .? : ;@IL M 2 < .G: ;   U.G: ;@ : ;I 4: ;I : ;I .? : ;@I@ 4: ;I  .G@  U .G I 4: ; I  : ; 4I? 4 < 4I? 4  4G<  4G< 4G4G 4G< 4G<  R% : ; I$ > $ >  : ;  : ; II.I4 < I4 I .4 < .4 < I!I/  I I&I5I: ;I : ; : ;I8 .? @I4 < .? 4 < .? 4 <  : ;  : ; I8 <   : ; I8 I : ; .? 4 < !.? 4 < "< #4: ; @I? <  $4: ; @I? < %I&I8 2 ': ; (.? : ; @< ).? : ; @I< *.? : ; @I< +.? : ; @I< ,.? : ; @I< - : ; I8 2 ..? : ; < /.? : ; @< 04: ; @I? < 1.? : ; @2 < 2.? : ; 2 < 3< 44: ;@I? 2 < 5.? : ;@I2 < 6.? : ;@I< 7.? : ;@< 8.? : ;@I< 9: ;:&;.? : ;< <.? : ;@< =G : ;>.? : ;< ?G : ;@ : ;IA.? : ; < B4: ; @I? <  C4: ; @I? 2 < D.? : ; @I2 < E.? : ;@2 < F.? : ;@I2 < G.? : ;@I< H : ;I8 2 I4: ; @I? <  J4: ; @I? 2 <  K< L.? : ; @I< M.? : ; 2 < N.? : ; @2 < O.? : ; @2 < PG : ; Q.? : ;@2 < R!S.? : ;2 < T.? : ;< U : ; V(W : ;X( Y.? : ;@< Z.? : ;@I< [4: ; @I? < \4: ;@I? < ]4: ;@I? < ^4: ;@I? 2 <  _.? : ;2 < `.? : ;@I2 < ab( c( d4: ;@I? <  e.? : ;@I< f4: ;@I? < g4: ;@I? < h : ;i : ; j.? : ; L < k.? : ; @IL M < l.G mI4 n: ; Io.1@ p1 q1r1s1t41 u: ;Iv: ;Iw: ; Ix.: ; y.: ; I z4: ; I{.? : ; |.G@ }I4  ~: ; I 414: ;I: ; I .? : ; I .? : ;I .? : ; @I@ .4 @ : ;I 4: ;I  U 4: ; I  4: ; I.? : ; .? : ;2 .G I .? : ;@2 @   U4: ;I4: ;I : ;I  .: ; @  : ; 4I? 4 < 4I? 4  4G<  4G< 4G4G 4G< 4G<  % : ; I$ > $ >  : ;  : ; II.I4 < I4 I .4 < .4 < I!I/  I I&I5I: ;I : ; : ;I8 .? @I4 < .? 4 < .? 4 <  : ;  : ; I8 <   : ; I8 I : ; .? 4 < !.? 4 < "< #4: ; @I? <  $4: ; @I? < %I&.? : ; @< '.? : ; @I< (.? : ; @I< ).? : ; @I< *.? : ; @I< + : ; I8 2 ,.? : ; < -.? : ; @< .I8 2 /: ; 04: ; @I? < 1.? : ; @2 < 2.? : ; 2 < 3< 44: ;@I? 2 < 5.? : ;@I2 < 6.? : ;@I< 7.? : ;@< 8.? : ;@I< 9: ;:&;.? : ;< <.? : ;@< =G : ;>.? : ;< ?G : ;@ : ;IA.? : ; < B4: ; @I? <  C4: ; @I? 2 < D.? : ; @I2 < E.? : ;@2 < F.? : ;@I2 < G.? : ;@I< H : ;I8 2 I4: ; @I? <  J4: ; @I? 2 <  K< L.? : ; @I< M.? : ; 2 < N.? : ; @2 < O.? : ; @2 < PG : ; Q.? : ;@2 < R!S.? : ;2 < T.? : ;< U : ; V(W : ;X( Y.? : ;@< Z.? : ;@I< [4: ; @I? < \4: ;@I? < ]4: ;@I? < ^4: ;@I? 2 <  _.? : ;2 < `.? : ;@I2 < ab( c( d4: ;@I? <  e.? : ;@I< f4: ;@I? < g4: ;@I? < h : ;i : ; j.? : ; @I2 < k : ; Il.? : ; < m.? : ; < n : ; I8 2 opIq : ; r.4 < s.4 < t : ;u!I/v : ; w : ;I8 x : ;y.? : ; @I@ z: ; I {4: ; I | U}4: ; I ~4: ; I11411.G I4 4: ;I: ; I.4 @ .: ; @  : ; 4I? 4 < 4: ; I4G<  4G< 4G4G 4G< 4G<  % : ; I$ > $ >  : ;  : ; II.I4 < I4 I .4 < .4 < I!I/  I I&I : ;  : ; I8 .? @I4 < .? 4 < .? 4 <  : ; I8  I: ;I : ; .? 4 < .? 4 < 5I : ; : ;I8 !< "< #4: ; @I? <  $4: ; @I? < %I&.? : ; @< '.? : ; @I< (.? : ; @I< ).? : ; @I< *.? : ; @I< + : ; I8 2 ,.? : ; < -.? : ; @< .I8 2 /: ; 04: ; @I? < 1.? : ; @2 < 2.? : ; 2 < 3< 44: ;@I? 2 < 5.? : ;@I2 < 6.? : ;@I< 7.? : ;@< 8.? : ;@I< 9: ;:&;.? : ;< <.? : ;@< =G : ;>.? : ;< ?G : ;@ : ;IA.? : ; < B4: ; @I? <  C4: ; @I? 2 < D.? : ; @I2 < E.? : ;@2 < F.? : ;@I2 < G.? : ;@I< H : ;I8 2 I4: ; @I? <  J4: ; @I? 2 <  K< L.? : ; @I< M.? : ; 2 < N.? : ; @2 < O.? : ; @2 < PG : ; Q.? : ;@2 < R!S.? : ;2 < T.? : ;< U : ; V(W : ;X( Y.? : ;@< Z.? : ;@I< [4: ; @I? < \4: ;@I? < ]4: ;@I? < ^4: ;@I? 2 <  _.? : ;2 < `.? : ;@I2 < ab( c( d4: ;@I? <  e.? : ;@I< f4: ;@I? < g4: ;@I? < h : ;i : ; j.? : ; @I2 < k : ; Il.? : ; < m.? : ; < n : ; I8 2 opIq : ; r.4 < s.4 < t : ;u!I/v : ; w : ;I8 x : ;y.? : ; @I@ z: ; I {1|1}.G ~I4 : ; I.G: ; @ I4  .4 @ .: ; @  : ; 4I? 4 < 4: ; I4: ; I4I? 4  4: ; I 4G<  4G< 4G4G 4G< 4G<  R% : ; I$ > : ;  $ >  II I  I   : ;  : ; I8 I.I4 < I4 .4 < .4 < I!I/  I&I : ;  : ; I8 : ;I : ; : ;I8 < .? @I4 < .? 4 < .? 4 < ! : ;"( # : ;$!I/% : ; & : ; I'I(.4 < ).4 < *5I+ : ; ,.? 4 < -.? 4 < .< /4: ; @I? <  04: ; @I? < 1I8 2 2.? : ; @< 3.? : ; @I< 4.? : ; @I< 5.? : ; @I< 6.? : ; @I< 7 : ; I8 2 8.? : ; < 9.? : ; @< :4: ; @I? < ;.? : ; @2 < <.? : ; 2 < =< >4: ;@I? 2 < ?.? : ;@I2 < @.? : ;@I< A.? : ;@< B.? : ;@I< C: ;D&E.? : ;< F.? : ;@< GG : ;H.? : ;< IG : ;J : ;IK.? : ; < L4: ; @I? <  M4: ; @I? 2 < N.? : ; @I2 < O.? : ;@2 < P.? : ;@I2 < Q.? : ;@I< R : ;I8 2 S : ; T4: ; @I? <  U4: ; @I? 2 <  V< W.? : ; @I< X.? : ; 2 < Y.? : ; @2 < Z.? : ; @2 < [G : ; \.? : ;@2 < ]!^.? : ;2 < _.? : ;< `(a.? : ;@< b.? : ;@I< c4: ; @I? < d4: ;@I? < e4: ;@I? < f4: ;@I? 2 <  g.? : ;2 < h.? : ;@I2 < i( j( k4: ;@I? <  l.? : ;@I< m4: ;@I? < n4: ;@I? < o : ;p.? : ; L < q.? : ; @I2 < r : ; Is.? : ; < t.? : ; < u : ; I8 2 v : ; w.? : ; @I@ x: ; I y4: ; I z1{1|1 }1~41 .G I4 : ;I: ; I.: ; I : ; I4: ; I: ;I.? : ;I 4: ;I.G: ; @ 4: ; I.? : ; I .G: ; 414: ;I: ; I .G@ I4   U  .? : ; .? : ;2 .G .4 @ .: ; .1@ .? : ; : ;I 4: ;I : ;I 4: ;I  U .? : ;@2 @ I  .: ; @ 4: ; I : ; 4I? 4 < 4G<  4G< 4G4G 4G< 4G<  4G: ;  R%  : ;: ; I : ;I8  : ;I8 .? @I4 < I4 I .? 4 < .? 4 < $ >  I  I&I : ;: ;I : ;I.I4 < .4 < .4 <  : ;( $ > I!I/ & : ;  : ; II5I : ; : ; I8 !< " # : ; I8 $I% : ; &.? 4 < '.? 4 < (< )4: ; @I? <  *4: ; @I? < +I,I8 2 -: ; ..? : ; @< /.? : ; @I< 0.? : ; @I< 1.? : ; @I< 2.? : ; @I< 3 : ; I8 2 4.? : ; < 5.? : ; @< 64: ; @I? < 7.? : ; @2 < 8.? : ; 2 < 9< :4: ;@I? 2 < ;.? : ;@I2 < <.? : ;@I< =.? : ;@< >.? : ;@I< ?: ;@.? : ;< A.? : ;@< BG : ;C.? : ;< DG : ;E.? : ; < F4: ; @I? <  G4: ; @I? 2 < H.? : ; @I2 < I.? : ;@2 < J.? : ;@I2 < K.? : ;@I< L.? : ; @I2 < M : ;I8 2 N4: ; @I? <  O4: ; @I? 2 <  P< Q.? : ; @I< R.? : ; 2 < S.? : ; @2 < T.? : ; @2 < UG : ; V.? : ;@2 < W!X.? : ;2 < Y.? : ;< Z : ; [(\.? : ;@< ].? : ;@I< ^4: ; @I? < _4: ;@I? < `4: ;@I? < a4: ;@I? 2 <  b.? : ;2 < c.? : ;@I2 < de( f( g4: ;@I? <  h.? : ;@I< i4: ;@I? < j4: ;@I? < k.? : ; L < l : ; m : ; In.? : ; < o.? : ; < p : ; I8 2 q.? : ; @I@ r: ; I s t4: ; I u1v1 w1x1y41 z41{ : ; |.? : ;L < }.? : ;@< ~.G I4 : ;I.? : ;L <  : ; : ;I: ; I.? L 4 < .? : ; @< .? : ; @IL M 2 < .? : ;@IL M 2 < : ; I.: ; .: ; I 4: ; I.? : ; I .G: ; : ; I .4 @ .G: ; .1@ 4: ;I  .G@ I4   U U .G I 4: ; I .: ; @  : ; 4I? 4 < 4I? 4  4G<  4G< 4G4G 4G< 4G<  R% : ; I$ > $ >  : ;  : ; II.I4 < I4 I .4 < .4 < I!I/  I I&I : ;  : ; I8 .? @I4 < .? 4 < .? 4 <  : ; I8  I: ;I : ; .? 4 < .? 4 < 5I : ; : ;I8 !< "< #4: ; @I? <  $4: ; @I? < %I&.? : ; @< '.? : ; @I< (.? : ; @I< ).? : ; @I< *.? : ; @I< + : ; I8 2 ,.? : ; < -.? : ; @< .I8 2 /: ; 04: ; @I? < 1.? : ; @2 < 2.? : ; 2 < 3< 44: ;@I? 2 < 5.? : ;@I2 < 6.? : ;@I< 7.? : ;@< 8.? : ;@I< 9: ;:&;.? : ;< <.? : ;@< =G : ;>.? : ;< ?G : ;@ : ;IA.? : ; < B4: ; @I? <  C4: ; @I? 2 < D.? : ; @I2 < E.? : ;@2 < F.? : ;@I2 < G.? : ;@I< H.? : ; @I2 < I : ;I8 2 J : ; K( L4: ; @I? <  M4: ; @I? 2 <  N< O.? : ; @I< P.? : ; 2 < Q.? : ; @2 < R.? : ; @2 < SG : ; T.? : ;@2 < U!V.? : ;2 < W.? : ;< X(Y : ;Z.? : ;@< [.? : ;@I< \4: ; @I? < ]4: ;@I? < ^4: ;@I? < _4: ;@I? 2 <  `.? : ;2 < a.? : ;@I2 < bc( d( e4: ;@I? <  f.? : ;@I< g4: ;@I? < h4: ;@I? < i.? : ; L < j : ; k : ; Il.? : ; < m.? : ; < n : ; I8 2 o.? : ; @I@ p: ; I q Ur4: ; I s1t1 u1v1w41 x41y : ; z.? : ;L < {.? : ;@< |.G }I4 ~: ;I.? : ;L <  : ; : ;I: ; I.? L 4 < .? : ; @< .? : ; @IL M 2 < .? : ;@IL M 2 < : ; I.: ; .: ; I 4: ; I.? : ; I 4: ;I.G: ; 4: ; I  4: ; I  U.4 @ .G: ; .1@ 4: ;I  .G@ I4  : ;I 4: ;I : ;I 4: ;I  .G : ; I I .? : ; .? : ; .: ; @  : ; 4I? 4 < 4I? 4  4G<  4G< 4G4G 4G< 4G<  R% : ; I$ > $ >  : ;  : ; II.I4 < I4 I .4 < .4 < I!I/  I I&I5I: ;I : ; : ;I8 .? @I4 < .? 4 < .? 4 <  : ;  : ; I8 <   : ; I8 I : ; .? 4 < !.? 4 < "< #4: ; @I? <  $4: ; @I? < %I&I8 2 ': ; (.? : ; @< ).? : ; @I< *.? : ; @I< +.? : ; @I< ,.? : ; @I< - : ; I8 2 ..? : ; < /.? : ; @< 04: ; @I? < 1.? : ; @2 < 2.? : ; 2 < 3< 44: ;@I? 2 < 5.? : ;@I2 < 6.? : ;@I< 7.? : ;@< 8.? : ;@I< 9: ;:&;.? : ;< <.? : ;@< =G : ;>.? : ;< ?G : ;@ : ;IA.? : ; < B4: ; @I? <  C4: ; @I? 2 < D.? : ; @I2 < E.? : ;@2 < F.? : ;@I2 < G.? : ;@I< H.? : ; @I2 < I : ;I8 2 J : ; K( L( M4: ;@I? < N.? : ; @I< O.? : ;@I< P4: ;@I? <  Q.? : ;@I< R4: ;@I? < S4: ;@I? < T4: ; @I? <  U4: ; @I? 2 <  V< W.? : ; 2 < X.? : ; @2 < Y.? : ; @2 < ZG : ; [.? : ;@2 < \!].? : ;2 < ^.? : ;< _(` : ;a.? : ;@< b4: ; @I? < c4: ;@I? < d4: ;@I? 2 <  e.? : ;2 < f.? : ;@I2 < gh( i.? : ; L < j.? : ; L < k : ; Il.? : ; < m.? : ; < n.? : ; @I@ o: ; I p1q1r1s1 t.? : ;I u: ;Iv.G wI4 x: ; Iy.G: ; @ zI4  {: ; I |4: ; I}41 ~: ;I.? : ; : ; I4: ;I U4: ; I .G: ; .? : ; I  : ; .? : ;L < .? : ;@< .? : ;L <  : ; .? L 4 < .? : ; @< .? : ; @IL M 2 < .? : ;@IL M 2 < .: ; .: ; I .G: ; 4: ; I 41.G@ : ;I 4: ;I I 4: ;I4: ; I.? : ;@I@ : ;I .1@    .G  .4  U : ; 4I? 4 < 4I? 4  4I4  4G<  4G< 4G4G 4G< 4G<  "/g /usr/include/machine/usr/include/usr/include/sys/usr/include/g++/bits/usr/include/g++../includecell.Cint_types.hansi.hstddef.hansi.hstdio.htime.htypes.htypes.hendian.hpthread_types.htime.hsched.hpthread.hunistd.hgthr-default.hc++io.hwchar.hchar_traits.hfpos.hstdlib.hnewlocale.htype_traits.hstl_iterator_base_types.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tcclocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hlocale_facets.hlimitsmath.hostreamostream.tccistreamistream.tcccell.hstl_algobase.hstl_iterator.hbasic_ios.hsstreamiosfwdsstream.tccstreambufstdexceptstl_iterator_base_funcs.hc++locale.hH Yw5E9;U~9a9B0UdU(9gUpfIV}U %2 2Gc29G2U--5gC2+-);c2}~c9{9gfI,u9 +.r26+d:c2H+892IUT9 9~c9z9gfI,u9 +.r+|2@ /29929+2Uq2{jACc2UIc0 d0|ceG2h 2U92!2+29V!+2!q2*,)s32|3+2|c32|c392|cVI~2:zӀ*:2Tc2,UTc2,T9! 2$q![+2&!Zq2((d,,.)3f2|93f2|-Fh29,2UU2@b,*,z,*, 00*:h}U9}Gc}q~c99z9fI,u9 +.r0+h+|G~c9z9YfI,u9 +.r c|U|90!S0-G!S9+k090}9-+/'={U0|9 0**({*</*~c/q0/}909 0<!~!~c0Gw+0A:3+!{c3+7;!{90c!~c39!{93+d!{90qe 0k09!990~9!q0+*p({*</*~9/q*/|9*9 *({*X/*+08**({*</00}~09cz9ufI,u9 +.r3+_dHrr0}0}~09cz9ufI,u9 +.r3+_dHrr0}+z9A~999~93-99-~9{+GHyUU9x9Yz9A~999~93-99-~9{+GHyUyUU9y9K:K,+:T:e*:d_q9{+{+~c9z9gfI,u9 +.r+{9 c,q05'bd >q3zӪ9{#~c9z9ufI,u9 +.r+{9 ,Pcy9gfIV, z9,~cqpq:qV+*qF+"q,xcE,Pcy9gfIV, z9,~cqpq:qV+*qF+"q,xcJ,X)g 9vc5(9,_9y+w:!+,a04 +(G~c9z9gfI,u9 +.r+|,X)g 9vc5(9,_9y+w:!+,a04 +(G~c9z9gfI,u9 +.r+|G~,Sq v9: 9w99,}9H:*:,(qdd,V04 +&&,cy9ufIV,~c99,q9PG,pqGpqG8q,rGc,I+q~c9z9YfI,u9 +.r+|,cy9ufIV,~c99,q9PG,pqGpqG8q,rGc,I+q~c9z9YfI,u9 +.r+|f7,\qr%G:.,cy9ufIV,~c9,b9PG,pqGpqGq,cGc,+q~c9z9YfI,u9 +.r+|,cy9ufIV,~c9,b9PG,pqGpqGq,cGc,+q~c9z9YfI,u9 +.r+|Df7,Mqr4G:.,cy9fIV,~c9,S9PG,pqGpqGq,TG-c,+q~c9z9YfI,u9 +.r+|K,cy9fIV,~c9,S9PG,pqGpqGq,TG-c,+q~c9z9YfI,u9 +.r+|Sfa,qrGdJ,cy9YfIV, z9,~cq*qF+q*q=+,C9F9Gq,EG<9rrd:zq,cy9YfIV, z9,~cq*qF+q*q=+,C9F9Gq,EG<9rrd:u!;&rH:;1/*}/U*}0*|c/U*}:/9*~+(p**0{*90{cycfIVU~cck09q0~9v/}(+!(}!~9(!(}!~9(0]+#0]c}q0c}9~#<~:YfI,u9 +.r+~:YfI,u9 +.r++|++(|+/,*~+09c|c*0~U*({*'|~9zcYfI,u9 +.rc~90Fcd{YfI,u9 +.r+0(|*<0~q|%*U({rH:YeE7!':r::X,~Gcy9gfIVc~+UaI,~9z9,~c:qVUq';,~9pqG*q9s:;1/*}/+*}r/c(~/(~*(*0{98*c0{U0zcycYf03GO9U~c00UP+00PcX0-q/}c(+!(}!~9(!(}!~9(0]+#0]9}q0c}9~+~c~:YfI,u9 +.r+~:YfI,u9 +.rq+|++(|+*),z0U,{c+~c:ufI,u9 +.r+|*))k0~9c|9*0~(|0U(|*+|~:YfI,u9 +.rc~09d{YfI,u9 +.r+/|09(|9(|&,~Gcy9gfIVc~+UaI,~9z9,~c:qVUq';,~9pqG*q9s:;1/*}/+*}r/c(~/(~*(*0{98*c0{U0zcycYf03GO9U~c00UP+00PcX0-q/}c(+!(}!~9(!(}!~9(0]+#0]9}q0c}9~+~c~:YfI,u9 +.r+~:YfI,u9 +.rq+|++(|+*),z0U,{c+~c:ufI,u9 +.r+|*))k0~9c|9*0~(|0U(|*+|~:YfI,u9 +.rc~09d{YfI,u9 +.r+/|09(|9(|&,6<6;H<&s:;1/*}0/~c*}/U*}:/9*~+(p**0{*90{cdycgf03GO9U~c00UP+00PcX0-q/}(+!(}!~9(!(}!~9(0]+#0]c}q0c}9# ~:YfI,u9 +.r+~:YfI,u9 +.r++|++(|+*(0~*|k90{c+*0~U*({*'|~:YfI,u9 +.rc~09d{YfI,u9 +.r+/|09(|(|,~cy9ufIVc,~9V+*9P+,pqGpq:GV9q,~G9,}q~c9z9YfI,u9 +.r+|(,~cy9ufIVc,~9*9PG,pqGpqGq,~Gc,}q~c9z9YfI,u9 +.r+|/,~cy9ufIVc,~9V+*9P+,pqGpq:GV9q,~G9,}q~c9z9YfI,u9 +.r+|/,~cy9ufIVc,~9*9PG,pqGpqGq,~Gc,}q~c9z9YfI,u9 +.r+|6,~cy9fIV#c,~9V+*9P+,pqGpq:GV9q,~G9,}q~c9z9YfI,u9 +.r+|6,~cy9fIV#c,~9*9PG,pqGpqGq,~Gc,}q~c9z9YfI,u9 +.r+|=,y9`fIV,cV+*9+~9,pq*9,~G9rG99c9,~q~c9z9YfI,u9 +.r+|=,y9`fIV,cV+*9+~9,pq*9,~G9rG99c9,~q~c9z9YfI,u9 +.r+|,~Gcy9gfIV,~+z9,~cqpqqaI9,~9U,~9G*q9s9M/*}/+*}/q*}/c(~/(~*(*0{98*c0{U0zcycYf03GO9U~c00UP+00PcX0-q/}c(+!(}!~9(!(}!~9(0]+#0]9}q0c}9#Y~:YfI,u9 +.r+~:YfI,u9 +.r++|++(|+*%,z0,{++~c:YfI,u9 +.r+|*%)k90{9+*0~(|0U(|*+|~:YfI,u9 +.rc~09d{YfI,u9 +.r+/|09(|9(},~Gcy9gfIV,~+z9,~cqpqqaI9,~9U,~9G*q9s9M/*}/+*}/q*}/c(~/(~*(*0{98*c0{U0zcycYf03GO9U~c00UP+00PcX0-q/}c(+!(}!~9(!(}!~9(0]+#0]9}q0c}9#Y~:YfI,u9 +.r+~:YfI,u9 +.r++|++(|+*%,z0,{++~c:YfI,u9 +.r+|*%)k90{9+*0~(|0U(|*+|~:YfI,u9 +.rc~09d{YfI,u9 +.r+/|09(|9(}}#P~c9z9YfI,u9 +.r+}9,~+}#~c9z9f 9}#~c9z9gfI,u9 +.r}G/U*}0*|c/U*}:/9*~+(p**0{*90{cdycYf03GO9U~c00UP+00PcX0-q/}(+!$(}!~9,<+!D9(!(}!D9,<+!D9(!(}!D9(+!~9(0}~c:YfI,u9 +.r+|(x//*}0*|c/U*}:/9*~+(p**0{*90{cdycgf03GO9U~c00UP+00PcX0-q/}(+!$(}!~9(+!~9(!(}!~9(+!~9(!(}!~9(+!~9(0}G~c:YfI,u9 +.r+|(x//|*~k90{9+*0~U*({*'|~09d{YfI,u9 +.r+/|*9({*k90{9+*0~U*({=~09d{YfI,u9 +.r+|9~9e0d0rvd0d0d +F:g/+*}0/~c*}/U*}:/9*~+(p**0{*90{cdycuf03GO9U~c00UP+00PcX0-q/}(+!(}!~9(!(}!~9(+!~9(0#0]c}q0c}9@+c~~9zcYfI,u9 +.r+~:YfI,u9 +.rq|+(|+%K,~+~q~9{9YfI,u9 +.r+!$|(+!~9(c/~G*~'k90{c+*0~U*({*'|~:YfI,u9 +.rc~09d{YfI,u9 +.r+*({(|~:ufI,u9 +.r+| c`9 9eceV-V-V-V-V-V-V-# /usr/include/machine/usr/include/usr/include/sys/usr/include/g++/usr/include/g++/bits../includedbstatus.Cint_types.hansi.hstddef.htypes.hansi.htypes.hendian.hpthread_types.hstdlib.hnewlocale.hstdio.htime.htime.hsched.hpthread.hunistd.hgthr-default.hc++io.hwchar.htype_traits.hstl_iterator_base_types.hchar_traits.hfpos.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tcclocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hlocale_facets.hmath.hlimitsostreamostream.tccistreamistream.tccbasic_file.hdbstatus.hstl_deque.hdeque.tccstl_algobase.hstl_construct.hstl_iterator.hstl_algo.hiosfwdiostreamstl_iterator_base_funcs.hstl_uninitialized.hc++locale.hstreambuf/y/9/cyG/F+!/Lx.y99y99y+9/yq|c/9|/|/9.}+/+./yISW.}q~c.9~/|/9I0w.~09(<.GK504/,*V8,0+.U0.Qd:9c99?Gd:9c99. wp::Fc=GUe+999U/j.9H~c~c~z9~cj0c.~+jq0.~5g_0c.~:09.~+d09.~G#E\$cFc;EGc/.kU/c.k9/c.k/cV.j$#r/zc.?\+$F+;[/ .GU+9cc=GU+9c}d,2d,jj$09.9u:*:b:b:0c."Ndb,V[G$cFc;[/H. ,CGl+UUe+9999d:9c99?d:9c99/U.w:#.j}.}9.H/4i8:b:p=0|G9.J;);9:8:c/0}c+9~ő>U8r/U0|9.0~v9/Gd8,{7b*9.c7N.297N.20.~909.~*7N0.~0G.~90c.~*0.~90ci.~0.~c0.~90c.~*0.90c=`cc.0.~0c.~c0+.909.+0c.cbd0c.50^/db:*,0c.Udpd7q.Vd:9c99?d9+c7 \.7.97.9ddd7o.7N!9_9!_!c_9!9.97oc_!_.27N.20.~-07~G0ck.~c0q.~q0.~-07i.~0q.~0.-0c.j~909.5h^/d*:*d0+.U7.VŎd9ccc?d9+c/L8.}~c<~9~c/,.{/c.c8,uc7H89I79IU#/]+#9]+#c:cm9\+$Fc;[2Nc29/9.|#Gr\U$Fc;[d/U.{jGjc&c~909.+0c.:*db:*d0c.90$.~H"$:b,]c#c:\+$c\+$cFc;[G0.~c0.~$0c.~0cic.~c0ciq.~0.~0c.~60.~H0c`.~0*.Hj0.~c0+.~c+09.+0.Ӄ5h^/d*:*d0+.U0*.d9ccc?d9+cUCGl+UU+9ccGd9ccc?d9cccUCGl+UUe+999/c.|'6g./c.|G:F;[d/(.{cd/20}.~30.~09.~G0.~B0<i.~0$.~B03c.c0.j0.~c&099.+0.Ń5h^/d*:*d0+.Vd9ccc?d9+cCGl+UU+9cc=qCGl+UUe+999 98,uc:dHV//.{c/.{c",*,]+#:[+%9\+$Fc;[9$G9c/.|9/9.{c"-:~^+#c:F;[G::/.{'jD~909.~5g5g09.~0.~+0ca.~909.~c0<.~c0.~0ck99k.~00.~0ii.~0.~00.0ccc.jjjcjc09.5h^/d*:*d0+.U0*.qd9ccc?d9+c?Ua::c,2:c,CGl+UU+9cc/c.{q/G.{c:/G.{cF+=Cl+UU+9ccd8d/W0}'.~Z0).~?09i.~c0q.~c0.~?0=`cc.c0$.j0.~c099.+0.5h^/d*:*d0+.U0*.Ud9ccc?d9+c&CGl+UU+9cc 9/yG/7.yc9y+c/y|9/9|9./9|/9./yISW|q.9~c/|/9I/-6}k6kckkc. 96s+. c6sc. 96s. /c+.}Sd/4.uNc8:drV7o.7oc.?7N6.2-0.~90c7}0.~q0c.~c0.~90c.~*0.~90ci.~0.~q0q.~909.~0G=9`.~0.~0c.~0.~c9jc9j9G0c.99~909<(.c809.Y504/:*:*,0+.U/.}/c.}qd:9c99?d:9+9 uuGc7cIb:7cIq79IU7o.97o.97oG.97o.97oc.97oc.7o.7N.200.~7Nc07}0c.~0*.~00Gii.~00.~00=`ccc.~0U.~c0.9~9089f.+0c.c0c.5h^/db:*d0+.U/.}c/9L.}d9ccc?d9+c U.l-}c.+}9.9֏3 +.93.39.39.939'.939.:8:^:8:^:8:^:8:3c.U#3.:8:&u:8:&u:8:+d:c3c.m+d:c?Gd:cm9d:c?d:c?d:c?d:c/!.~c~/`J. 9/`.c~cz0.~60q*.~0c.~0c.~0q.~<0qccc.q0c.~0c.c0.~0.~cj0c.c~cc09f(.cb0c.Ӄ50^/d*:*,0+.U0U.98:0c.0c/U.d:9c99?d9+cwU3qpc+pcV\+$c\+3cMc3coceFc;^#"c^c0$.~c0c.~q0B.~c0.~0c.~c0.~c0ciqic.~0c.~c0.~c0c.~0c.~90G=c`c.~099c9.~0.~c0.~c0q.9~90.+0c.c:09.GY504/:b:*,0c.UEw0 Wu* 9uc qu uc 7ucqd:9c99?d:9+9CGl+UUe+999.d!fbJ~c.+~+.l |0=.90}9{=+,0B+>9.++<});98d:clG|c?}.9~c.+~+.dr-1~c9z9gfI,u9 +.rc~:YfI,u9 +.rc~:YfI,u9 +.r.c{8:8::b:1u$. 91u-+_-,1~c9z9gfI,u9 +.rc~:YfI,u9 +.rc~:YfI,u9 +.r.c{8:8::b:1u$. 91u-9_  .Gz9.9q{99}q8}U9|1y9gfIV~cy9ufIVac9U~c^%|c~c:gfI,u9 +.rc~c:fI,u9 +.r.+1u9. 91uc9.{c1u~' .Gz9.}9}qc}q8}U9|1y9gfIV~cy9ufIVac9U~c^%|c~c:gfI,u9 +.rc~c:fI,u9 +.r.+1u9. 91uc9.{c1u~' .Gz9.9q{99}q8}U9|U{9#y9fIV~cy9ufIVpc9U~cm%|c~c:gfI,u9 +.rc~c:fI,u9 +.r.+1u9. 91uc9.{c1u~' .Gz9.}9}qc}q8}U9|U{9#y9fIV~cy9ufIVpc9U~cm%|c~c:gfI,u9 +.rc~c:fI,u9 +.r.+1u9. 91uc9.{c1u~'r㟝e5-?7--qA9}c~9gerrrrsq2 9c2}9s2 9c2}9s2 9c2}9~2+~9u}+}9Y:/:/.b:8:,b:36~c.=~9.9~U (!q(}!~9(B'c~c}U(0!q(}!~9( C( (:(!q(}!~9(1(8!'(}!~9(1Pd"V~:(+l9pU!|(e-~50U-Pq509-P5q /usr/include/machine/usr/include/sys/usr/include/usr/include/g++/bits/usr/include/g++../include../include/provider/usr/pkg/include/usr/local/includedbstream.Cint_types.hansi.htypes.hansi.htypes.hendian.hpthread_types.hunistd.hstddef.hstdio.htime.htime.hsched.hpthread.hgthr-default.hc++io.hwchar.hchar_traits.hfpos.hstdlib.hnewlocale.htype_traits.hstl_iterator_base_types.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tcclocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hlocale_facets.hmath.hlimitsostreamostream.tccistreamistream.tccbasic_file.hdbstatus.hstl_deque.hdeque.tccstl_algobase.hdbstream.enum.hstl_bvector.hcell.hquery.hiosfwdstl_iterator.hstl_vector.hvector.tccdata.hlogin.hstdarg.hsqlite3.hsqlite3.htds_sysdep_public.h sybdb.h stl_tree.hdblib.hsqltypes.h sqlext.h provider.hdbstream.hstl_pair.hiostreamc++locale.hstreambufty  u 9UUc9+~+ ,xrs4#cG U4wqG 94w5q /usr/include/machine/usr/include/usr/include/sys/usr/include/g++/bits/usr/include/g++../include../include/provider/usr/pkg/include/usr/local/includeprovider.Cint_types.hansi.hstddef.hansi.hstdio.htime.htypes.htypes.hendian.hpthread_types.htime.hsched.hpthread.hunistd.hgthr-default.hc++io.hwchar.hchar_traits.hfpos.hstdlib.hnewlocale.htype_traits.hstl_iterator_base_types.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tcclocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hlocale_facets.hmath.hlimitsostreamostream.tccistreamistream.tccstl_bvector.hbasic_file.hdbstatus.hstl_deque.hdeque.tccstl_algobase.hcell.hquery.hiosfwdstl_iterator.hstl_vector.hvector.tccdata.hlogin.hdbstream.enum.hstdarg.hsqlite3.hsqlite3.htds_sysdep_public.h sybdb.h stl_tree.hdblib.hsqltypes.h sqlext.h provider.hiostreamc++locale.hstreambufhz 2ckUY29rUKe8d;/e8d;/W:S'W:S3'E U3wqE 93w5q* /usr/local/include/usr/include/machine/usr/include/usr/include/sys/usr/include/g++/usr/include/g++/bits../include../include/providerprovider.dblib.Ctds_sysdep_public.hsybdb.hint_types.hansi.hstddef.htypes.hansi.htypes.hendian.hpthread_types.hstdlib.hnewlocale.hstdio.htime.htime.hsched.hpthread.hunistd.hgthr-default.hc++io.hwchar.htype_traits.hstl_iterator_base_types.hchar_traits.hfpos.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tccstl_bvector.hstl_tree.hlocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hlocale_facets.hlimitsmath.hostreamostream.tccistreamistream.tccbasic_file.hdbstatus.hstl_deque.hdeque.tccstl_algobase.hcell.hquery.hiosfwdstl_iterator.hstl_vector.hvector.tccdata.hlogin.hdbstream.enum.hdblib.hstl_function.hstl_map.hstl_construct.hstl_pair.hstdexceptiostreamstl_uninitialized.hstl_iterator_base_funcs.hc++locale.hstreambuf#r::(;:,:eI:::l}#Уr::(;:,:eI:::l}#}c ~9 ~+##ĠR.d U 9u+: 9yG:*,8;g:4}9*,#+4}+#+e)F,jw,Se-),d,dx7ddm+7ddT:j -),d,dxU7ddvvc7ddT} *:,:t:wr}T,r}T,qRVUT,H#7;FdӒ(ddrdt[:7ddm,]: [:7dd,42~49(<2GK504/,*V8,4+2U42Qd:9c99?Gd:9c9932y99y99y+93yq|c39|3|392}+3+23yISW2}q~c29~3|39I3393cyG3F+!#  {Uw9(9++|9{+9G{Rz+?9{ZmG9Ux+9xU# u+#9x9#Ԟ :8z+9'=?zq#Uz+|q +z#,&>}9.}+9}G Uz9tqy9y9U}+??|9#G}9}+1z92}2}92H38:b:p=4|G92J;);9:8:c34}c+9~ő>U8r3U4|924~v93Gd8,{#Нrs, -xc:W,r#d,r wG:ZVm, E*92cEN229EN22-42~9492~0492~4c2~c42~H42~942~E42~94c2~04c2~4c2~cdEE2E429dEoc23Eo92EN!92cEN22ENc22cEN922ENc22'4G2~94c2~?492~c42~H4G2~94c2~42~'4G2~94c2~?492~cE32}~c~c#~c~c32{c3c2cu7H89I7IVFV2N98392|923 c2|'Fg39F|92'3c2|:3GF|c2`Fc;[d384}q3c4}92~.4c2~492~c492~4qiKE2~c4q`2~E42~cd42~c4^2'GUe+999c:b:bH8Vd3/2{jGjcjc~+492+4c2:*db:*d4c24$2~97I942~c4c2~942~c7I42~4c2~c4c2~42~4cic2~c42~4ic2~64q2~<7492~4 `c2~cmd9ccc?d9ccc qu:dHd/392{7I7$IU9G979392{99q3 c2{qr3GF{2`Fc;[d8d3Z4}'2~492~94%iHB2~c4q`2~B42~cd4*2~c'LGUe+999c7GIc7Ic79IG7cIU::3+2{'jcjG*~9492~5g54c2~:492~+:492~G42~4*2~94k99kk2~402~4*iqqic2~c4c2~4]2~c4+2~42~c0d:c,2d:c, 3yG32yc9y+c3y|939|9239|3923yISW|q29~c3|39I2p::Fc=GUe+999U2}c2+}929֏#Ԝ|U9':-,?y9#9)-|+qy+c|+9{+9Bz+#cBU#Gy?i#9?|9+#}UB+#3F}k0ckck2 FsG9k2 9Fs#32}93c2}Md342uNc:bVEo2Eoc2*EN229ENq4<2~94q2~cENc4c2~c4ci?2~'4$ic`92~':4c2~9b:41`92~9392}$39>2uuGc7cI979Ic7cI979Iq79IUEo29Eo2qEoc29Eoc_9!9_c!9_9229Eo29Eo_92242~6ENc22942~cEN492~c4c2~642~64c2~c4cic2~c4c2~67cI94[2~c42~c32}q39>2U329H~c~c~z9~cj4c2~+jq42~5g_4c2~:492~+d492~G#E\$cFc;EGc32kU3c2k93c2k3cV2j$#r3zc2?\+$F+;[3 2GU+9cc=GU+9c}d,2d,jj$4929u:*:b:b:4c2"Ndb,V[G$cFc;[3H2 ,CGl+UUe+9999d:9c99?d:9c993U2w:#42~94249 (J2Y504/:*:*,4+2U4U2Qd:9c99?d:9+9 2|4=294}9{=+,4B+>92++<});98d:clG|c?}29~c2+~+2dr# Bw#BcF5#+G+9qG+cx.R+F9##H );{9|U##d cyGh99h9U?|9#+?9#U?U#9?9#w+yq?|9+#q?{q9#G#T :8z+9'=?wq#Uz+|q+z# {U9'd.?wU#U{+q{+c?{+9#|G+wq2fbJ~c2+~+11 ~c 9z9gfI,u9 +.r c~:YfI,u9 +.r c~:YfI,u9 +.r2c{8:8::b:Au$2 9Au19 _>M3M2>{+29|9~99|c~9$}9+}}q#}9}cb:p:ENQ22cEN22642~HENc22942~cENc492~c4c2~H42~B42~c4cic2~c4B2{942~c4D2~c4`c2~c>? 22>5r |>9 c|c~c 9z+ufI,u9 +.r c~:YfI,u9 +.r2cbdFdAuc2 9Au92 cAu0  |U%32~c~3`J2 93`2c~cz42~64q*2~4c2~4c2~4q2~<4qccc2q4c2~4c2c42~42~cj4c2c~cc49f(2cb4c2Ӄ50^/d*:*,4+2U4U298:4c24c3U2d:9c99?d9+cwU3qpc+pcV\+$c\+3cMc3coceFc;^#"c^c4$2~c4c2~q4B2~c42~4c2~c42~c4ciqic2~4c2~c42~c4c2~4c2~94G=c`c2~499c92~42~c42~c4q29~942+4c2c:492GY504/:b:*,4c2UEw0 Wu* 9uc qu uc 7ucqd:9c99?d:9+9CGl+UUe+999{{9 |*~9{9fI,u9 +.rfcd c}+ c~ (~9 9~9+; G~cm9fI,u9 +.r c~c:fI,u9 +.r c~c:fI,u9 +.r2c{c{9c{cAu2 9Au2 cAu<U1mc19 y |~ 9zcfI,u9 +.r  |*~cA9YfI,u9 +.r c~c:fI,u9 +.r c~c:fI,u9 +.r2c{c{9c{cAu2 9Au2 cAu<19 ~e |6~9{9ufI,u9 +.rzcf7e*dc z z9 +zq z9 ~+~~9{9YfI,u9 +.r c~:YfI,u9 +.r c~:YfI,u9 +.rc q~c9ufI,u9 +.r c~c:fI,u9 +.r c~c:fI,u9 +.r2c{c{9c{cAu2 9Au2 cAu<U1c19 [ |U+ |U+ |U+ |+~ 9zcfI,u9 +.r  |~:gfI,u9 +.r c~:YfI,u9 +.r cA~9c 9A~9fI,u9 +.r c~c:fI,u9 +.r c~c:fI,u9 +.r2c{c{9c{cAu2 9Au2 cAu919 [ |U+ |q~:YfI,u9 +.r +~:YfI,u9 +.r c |G~:YfI,u9 +.r c~\@q|@9#}U8@U#~9P+09 c}+ P} 9} U} }90#~9@q|@9#}U8@U#~9P+09 c}+ P} 9} U} }9/#9 U { U{9@+#}+(U@9#}9P+09?R+;BU#c@#~9B#q@U#9@9U~c8:',@#}8@U#~9P+09+{# ~c 9z9gfI,u9 +.r +@~9}Y Uxtxqlo{# ~c 9z9ufI,u9 +.r +{+;;;;;: cv cx+pupp@FDU@+cDU99 ~1:YfI,u9 +.r c~:YfI,u9 +.r c~:YfI,u9 +.r2cAuF2 9Au2 UAu9 9~1:YfI,u9 +.r c~:YfI,u9 +.r c~:YfI,u9 +.r2cAuC2 9Au2 UAu9#~J|zU?9Dy ,y9YfG{9 U~cU{{UX |U~c9{9YfI,u9 +.r cqy9YfG{9 U~cU{{UX |U~c9{9fI,u9 +.r c~%#U}#UUqkc|U#9 |G~c 9z9gfI,u9 +.r +*~c 9z9Yf:#{+@q= Y /usr/local/include/usr/include/machine/usr/include/usr/include/sys/usr/include/g++/usr/include/g++/bits../include../include/providerprovider.odbc.Csqltypes.hsqlext.hint_types.hansi.hstddef.htypes.hansi.htypes.hendian.hpthread_types.hstdlib.hnewlocale.hstdio.htime.htime.hsched.hpthread.hunistd.hgthr-default.hc++io.hwchar.htype_traits.hstl_iterator_base_types.hchar_traits.hfpos.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tccstl_bvector.hlocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hlocale_facets.hlimitsmath.hostreamostream.tccistreamistream.tccdbstream.enum.hbasic_file.hdbstatus.hstl_deque.hdeque.tccstl_algobase.hcell.hquery.hiosfwdstl_iterator.hstl_vector.hvector.tccdata.hlogin.hbasic_ios.hsstreamsstream.tcciostreamstreambufstdexceptstl_iterator_base_funcs.hc++locale.h!YwCE9!;U ~9 a9!B0 U!dU( 9!gUpfIV }U ;)%??Gc?9G?U-45gC?+-); c?} ~c9{9gfI,u9 +.r?6+d:c?H+89?IU T9 9 ~c 9z9gfI,u9 +.r+ |?/?99?9+?Uq?{jACc?UIc>d>|ceG??U9?$?+?9V$+?$q?*,)sA?|A+?|cA?|cA9?|cVI~?:zӀ*:?Tc?,UTc?,T9$ ?$q$[+?&$Zq?((d,,.)Af?|9Af?|-Fh?9,?UU?@b,*,z,*, >*:h }U9 }Gc }q~c9 9z9fI,u9 +.r>+ h+ |G~c 9z9YfI,u9 +.r ! c|U!|9>$S>-G$S9 +k>9 >}94+/'={U>|9 >-*+{-<=-~c=q>=}9>9 >$~ $~c>G w+>A:A+${cA+7;${9>c$~cA9${9A+d${9>qe -+{-<=-~9=q-=|9-9 -+{-X=-+>-*+{-<=>> }~>9 cz9ufI,u9 +.rA+_dHrr> }> }~>9 cz9ufI,u9 +.rA+_dHrr> }+;)`rss{+{+ ~c 9z9ufI,u9 +.r +{9 q8cegq qzqnq=-}>=~c-}=U-}:=9-~++p-*>{-9>{c ycfIV U~c ck>9q >~9v=}++$$+}$~9+>{ ~:YfI,u9 +.r+ |+xG=-~# > 9+G->~U-+{-' |9~>9d{fI,u9 +.r+>+|-<>~q |-+{s;;;;;e䧭dC6@ U6wq@ 96w5q /usr/include/machine/usr/include/usr/include/sys/usr/include/g++/bits/usr/include/g++/usr/pkg/include../include../include/providerprovider.sqlite3.Cint_types.hansi.hstddef.hansi.hstdio.htime.htypes.htypes.hendian.hpthread_types.htime.hsched.hpthread.hunistd.hgthr-default.hc++io.hwchar.hchar_traits.hfpos.hstdlib.hnewlocale.htype_traits.hstl_iterator_base_types.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tccstl_bvector.hstl_tree.hlocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hlocale_facets.hlimitsmath.hostreamostream.tccistreamistream.tccstdarg.hsqlite3.hdbstream.enum.hbasic_file.hdbstatus.hstl_deque.hdeque.tccstl_algobase.hcell.hquery.hiosfwdstl_iterator.hstl_vector.hvector.tccdata.hlogin.hsqlite3.hstl_function.hstl_map.hbasic_ios.hsstreamstl_pair.hsstream.tcciostreamstreambufstdexceptstl_iterator_base_funcs.hstl_construct.hc++locale.h!r::(;:,:eI:::l}!r::(;:,:eI:::l}!}c~9~+!!7;FdӒ(ddrdt[:7ddm,]: [:7dd,!&>}9.}+9}G Uz9tqy9y9U}+??|9!G}9}+1z9YwHE9;U~9a9B0UdU(9gUpfIV}U<)%!rs, -xc:W,rDDGcD9GDU-55gCD+-);cD}~c9{9gfI,u9 +.rD6+d:cDH89DIcT9 9~c9z9gfI,u9 +.r+|D/D99D9+DUqD{jACcDUIcBdB|ceGDDU9D#D+D9V#+D#qD*,)sFD|F+D|cFD|cF9D|cVI~D:zӀ*:DTcD,UTcD,T9# D$q#[+D&#ZqD((d,,.)FfD|9FfD|-FhD9,DUUD@b,*,z,*, B*:h}U9}Gc}q~c99z9fI,u9 +.rB+h+|G~c9z9YfI,u9 +.r! );{9|U!!|U9':-,?y9!9)-|+qy+c|+9{+9Cz+!cCU!Gy?i!9?|9+!}UC+!! {U9'd.?wU!U{+q{+c?{+9!|G+wq!d cyGh99h9U?|9!+?9!U?U!9?9!w+yq?|9+!q?{q9!G! :8z+9'=?wq!Uz+|q+zc|U|9B#SB-G#S9+kB9B}95+/'={UB|9 B,**{,<A,~cAqBA}9B9 B#~#~cBGw+BA:F+#{cF+7;#{9Bc#~cF9#{9F+d#{9Bqe ,*{,<A,~9Aq,A|9,9 ,*{,XA,+B,**{,<ABB}~B9cz9ufI,u9 +.rF+_dHrrB}B}~B9cz9ufI,u9 +.rF+_dHrrB}+<)` uA,}AU,}B,|cAU,}:A9,~+*p,*B{,9B{cycfIVU~cckB9qB~9vA}*+#$*}#~9*9B]+#B]c}qBc}9}#~:YfI,u9 +.r+~:YfI,u9 +.r++|++*|G~A,~,B9c|c,B~U,*{,'|~9zcYfI,u9 +.rc~9BFcd{YfI,u9 +.r+B*|,<B~q|%,*{@~@U}9@q~9!}(U@9!}9P+09?R+;CU!UCc!q@U!9@9_U@G}9@+!}+8@U!~9PG09W+~9@8EU@+cEU9G!~J|zU?9Ey9!U}!UUqkc|U!9|+!{+@q /usr/include/machine/usr/include/usr/include/sys/usr/include/g++/usr/include/g++/bits../includequery.Cint_types.hansi.hstddef.htypes.hansi.htypes.hendian.hpthread_types.hstdlib.hnewlocale.hstdio.htime.htime.hsched.hpthread.hunistd.hgthr-default.hc++io.hwchar.htype_traits.hstl_iterator_base_types.hchar_traits.hfpos.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tcclimitslocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hlocale_facets.hmath.hostreamostream.tccistreamistream.tcccell.hquery.hstl_deque.hdeque.tcciosfwdstl_iterator.hstl_algo.hstl_construct.hbasic_ios.hsstreamstl_algobase.hsstream.tccstreambufstdexceptstl_iterator_base_funcs.hc++locale.hYw:E9;U~9a9B0UdU(9gUpfIV}U;%77Gc79G7U-65gC7+-);c7}~c9{9gfI,u9 +.r76+d:c7H+897IUT9 9~c9z9gfI,u9 +.r+|7/79979+7Uq7{jACc7UIc5d5|ceG77U97"7+79V"+7"q7*,)s87|8+7|c87|c897|cVI~7:zӀ*:7Tc7,UTc7,T9" 7$q"[+7&"Zq7((d,,.)8f7|98f7|-Fh79,7UU7@b,*,z,*, 5*:h}U9}Gc}q~c99z9fI,u9 +.r5+h+|G~c9z9YfI,u9 +.r/8:b:p=6|G9.J;);9:8:c/6}c+9~ő>U8r/U6|9.6~v9/Gd8,{c|U|95"S5-G"S9+k595}96+/'={U5|9 5**({*<4*~c4q54}959 5"~"~c5Gw+5A:8+"{c8+7;"{95c"~c89"{98+d"{95qe 5k59"995~9"q5+*({*<4*~94q*4|9*9 *({*X4*+5**({*<455}~59cz9ufI,u9 +.r8+_dHrr5}5}~59cz9ufI,u9 +.r8+_dHrr5}+2.29.9129.|+~c9|9~9fI,u9 +.rc.{V8,2c.|+~c9|9~9gfI,u9 +.rc.{V8,2c.|+~c9|9~9gfI,u9 +.rc.{V8,2c.|+~c9|9~9gfI,u9 +.rc.{V8,2c.;~29v.~c9{9YfI,u9 +.rc.{V8,2c.|+~c9{9YfI,u9 +.rc.{V8,2c.~c9{9YfI,u9 +.r+.{cV8,)d:9c99.wd:9c99q.wGd:9c99q.wcd:9c99q.wcd:9c99wq.wcd:9c99q.wcd:9c99q*~c:YfI,u9 +.r+|*9~c:ufI,u9 +.r+*~c:Yf~c:Yf~c9z9YfI,u9 +.r+|*+~c:Yf~c:Yf -.:z9c~c,|+,|+~c9z9fI,u9 +.r+4~9*}54~c*}4U*}:49*~+(p**5{*95{cdycgf53GO9U~c50UP+50PcX5-q4}-~+5}~c9{9YfI,u9 +.r-c~-95{YfI,u9 +.r+5(|*<{cq-{G4>;*~k95{9+*5~U*({*'|~c:YfI,u9 +.rc~59d{fI,u9 +.r+4|*9({;T{~U9z9ufI,u9 +.r+|212{+19"++|9*1q|919++{+2 s92 9 2t.~;29.+29.}99.}++hc~cA6cc96z9{++UHyc-y9.db,^U.~c99~kc6zc96~c{++UHyU-y9.b,^U.~c99~kc6zc96~c{++UHyU-y9.b,^U.~c99~kc6zc96~c{++UHyU-y9.b,2c.~W~2cd]9~+~cc6z96~c{+++HyU-y9.E%db:*,~c6z96~c{++UHyU-y9.b:*,~c6z96~c{++UHyU-y9.E%b,):9c+99-.c:9c99-+.ce8:c-+.cd:9c99-4.9d:9c99-9.9d:9c99-8.9d:9c99w-"/b:. c/v. 9Vu.3}99 ~9.:c/,~cq~c9z9gfI,u9 +.r/+/.~U/,~q~c9z9YfI,u9 +.r+|!.8::0:ʀT:d&.:w.9 xc.xc:l+/~9@..9yqe.::c, x9O.:.99.G9.=:d~c9{9gfI,u9 +.r2dq~c:fI,u9 +.r.cqz9cz+4*}4U*}4*}r4c(~+*(*5{U*c5{9*95{*95{U5zcycYfIVU~cck59q5~9v.|4:.9(z.6(45~{5+{+~:YfI,u9 +.r+|*G~c9zcufI,u9 +.r9~c:ufI,u9 +.r4|*~&59+G*({*0|9~59d{YfI,u9 +.rc5(|9*{5~|*({9R*d+}q +}99}{#~c9z9ufI,u9 +.r+1|9~9q1 91}9~+c0~); e9gfIVc~cUU`U}G#~c:fI,u9 +.rc~c:fI,u9 +.r+~c:fI,u9 +.r+;|+|9q{q|~c:fI,u9 +.rc~c:fI,u9 +.r+~c:fI,u9 +.rc|+|+-T.[( "-(}"~9(+"~9(c[G~9z9gfI,u9 +.r+q| ^AB FXcAB FAB  ж"AB FF.aAB Ah. XAB F\.TAB AB  lAB FR. `AB FR. TAB FR. AB F. AB F.$ AB  DAB F. HAB F.L AB  lAB F. tAB F.|&AB AB FXAB F( JAB Ir./.I.X/AB B7AB L('AB I.Q.I.('AB I.Q.I.(AB I~.#.I. AB F. AB F. AB F. AB F.  AB F. ( AB F. 8!AB F. \!AB F.(AB I.o.I.(AB I.o.I.0I AB I\..I.s.I.1AB B[.0AB @AB PAB DlAB |AB AB (AB Im.$.I.dAB d.AB M. AB Fd. AB Fd.8AB D^.cAB V. pjAB DO.O.?AB Ai.<AB F AB D^.n. yAB FB. !AB O. 0AB Fn. IAB N. h AB IB. #AB @ [AB B AB Fe. %AB DJ.O. H AB F[.|   TAB IH. 4TAB IH. TAB IH. TAB IH.0AB DJ.P-AB D#AB AAB DB. , AB DJ.LAB `AB DtAB I.0C..[.|.I._.I..R.^.I.AB M.,AB Aa. CAB Ah.M. ,AB F. AB F.(l AB FB..Q.d!CAB A\.(!a AB I..0 +^AB e$l-dAB FT.q.Q.$- AB Ia.0a.(7AB Fy.].P.HL8#AB I.. 9 .0.. .0.n.P.k.  \AB I. bAB I. 4icAB FP.j0AB BX. jV AB I~. wqAB CwAB C(LxAB Fx.b.P.ymAB B].AB J.AB J.|  tyAB Fh. yCAB Ah.M.8zAB J.PzAB J.| hz AB xz AB zAB zAB z9AB AV.z9AB AV. ${CAB Ah.M.h{AB J.{AB J.|  {WAB I]. AB IZ.AB DP.AB DP.AB DW. HAB FM. $AB FQ. AB  AB   AB , AB 8 AB DEAB (a AB I..0 %AB Fw.(AB IW..0D. AB F.CAB A\.YAB FT5AB D$AB Fg.q. f. H>AB FR. AB FK.(AB FB..Q.AB j V AB I~.8AB IQ.0a..0D..0u.$ԜAB FQ. a.$dAB FT.q.Q.qAB C(AB Fy.].P.PAB I..0.. ..0.X. .q.P.k.(AB I. .0(AB I.0. NAB НYAB A cAB FP.0AB BX. ,AB FY.Ԟ5AB D  AB Fv.mAB B].(AB Fx.b.P.AB C  AB F. ĠAB F .)AB E.УHAB DHAB DAB J.̓AB J.|  `AB FE.(8"AB IV.2.I.\ AB h AB t AB  AB  AB TAB  CAB Ah.M.AB M. AB Fd. AB Fd.AB D^.cAB V. jAB DO.O.AB F AB D^.n. yAB FB.!AB O. AB Fn. IAB N. AB IB.#AB [AB B AB Fe. %AB DJ.O. AB F[.0AB J.HAB J.| (l`AB Iz.2.I. lxAB F^. lD;AB EF.lAB M. lAB Fd. lAB Fd.lAB D^.lcAB V. ljAB DO.O.lAB F lAB D^.n. lyAB FB.l!AB O.l5AB D$lAB Fg.q. f.lYAB F$lAB FQ. a. l>AB FR. lAB Fn. lIAB N. lAB IB.l#AB l[AB B lAB Fe.lYAB A l%AB DJ.O. lAB F[. lAB FY. l AB F.l)AB E.lHAB DlHAB DlAB J.lAB J.|  AB Fb. @:AB Bb. |AB F.0tAB IL.m. ..R.(pAB Fx.. S.xAB %AB DG. kAB FW.AB K.$,AB DW.R.|.M.(qAB FJ..I.tAB F UAB F_. TwAB FG.AB M. AB Iu. AB FL. AB Fd. AB Fd.AB D^.cAB V. jAB DO.O.?AB Ai.AB F AB D^.n. yAB FB.!AB O.QAB E. cAB FP. AB Fn. IAB N. AB IB.#AB [AB B AB Fe. %AB DJ.O. AB F[._ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEEitimerspectrapschar_traitsxdigit_ZN9__gnu_cxx17__normal_iteratorIPcSsEpLERKi_ZNSt10money_base20_S_construct_patternEccc_ZTISd_ZNSt8ios_base4Init14_S_ios_destroyEv_ZNKSs5emptyEv_ZNSt14numeric_limitsIbE9is_signedE__string_type_ZNKSs13find_first_ofEPKcj_ZNSt8ios_base4setfESt13_Ios_Fmtflags_ZTISo_ZNKSs16find_last_not_ofEPKcj_S_showpoint_ZNSt14numeric_limitsItE11round_styleE_ZNSt11char_traitsIcE7not_eofERKi_ZNSt11char_traitsIcE11to_int_typeERKc_ZNSt21__numeric_limits_base12max_exponentE_ZNSsaSEc__pthread_rwlockattr_st_ZNSt14numeric_limitsIdEaSERKS0__ZNKSs12find_last_ofEPKcj_Swap_lock_struct<0>_ZNSs4_Rep8_M_cloneERKSaIcEj_ZNSt14numeric_limitsItE10has_denormEoutput_iterator_tag_ZNSt14numeric_limitsIjE12min_exponentE_ZNSt14numeric_limitsIlE13has_quiet_NaNE_ZNSs6insertEjRKSsjjsizeupUNKNOWN_ZNSt14numeric_limitsImE8is_exactE_ZNSt10ctype_base5graphE_ZNSs9_M_mutateEjjj_ZNSt14numeric_limitsIfE15has_denorm_lossE__ios_flagsshort unsigned int_M_string_lbfsizeepptr_ZNSt14numeric_limitsItE13has_quiet_NaNE_ZNK9__gnu_cxx17__normal_iteratorIPcSsEmiERKi_M_replace_facetunsigned char_ZNSt21__numeric_limits_base15has_denorm_lossEmax_exponent10_ZNSt14numeric_limitsIsE11round_errorEv_ZlsRSoN9dbstreams8metadata8datatypeE_ZNSt14numeric_limitsIiE9quiet_NaNEvto_char_typeptb_waitersvarylen_ZNSt11__ios_flags6_S_outE_ZNSt14numeric_limitsIsE3minEv_ZNSt14numeric_limitsIlE10has_denormEtimevalptr_privatemin_exponent_ZNSs6rbeginEv_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE_M_word_zero_ZNSt14numeric_limitsIfE5trapsE_ZNSt8ios_base4InitaSERKS0__ZNKSaIwE8max_sizeEv__int64_t_ZNSt14numeric_limitsIwE13signaling_NaNEv~_Lockptrdiff_t_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode_ZNSt14numeric_limitsIsE14max_exponent10E_Integral_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi_ZNSt10ctype_base5cntrlElong double_S_pback_size_M_current_M_replace_categoryptr_magic_S_in_ZNSt8ios_base18_S_local_word_sizeE~basic_ostream_ZN11_Is_integerImEaSERKS0__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcj_S_hex_ZNSt14numeric_limitsIbE5trapsE_ZNSt4fposI11__mbstate_tE5stateES0__ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEvspc_pscntopenmode__type_traits_S_ios_createcpuid_t__newoffi_ZNSt14numeric_limitsItE12min_exponentE_ZNK9__gnu_cxx17__normal_iteratorIPcSsEdeEv_ZNKSs9_M_ibeginEv_ZNSt11__new_alloc8allocateEj__mbstate8_ZNSt17_Swap_lock_structILi0EEaSERKS0__Is_integer_ZNSt14numeric_limitsIjE15tinyness_beforeE_ZNSt15_STL_mutex_lock15_M_release_lockEvtinyness_before_ZNSt14numeric_limitsIsE9is_iec559E_ZNSt6locale5_Impl13_S_id_numericE_ZNSt14numeric_limitsIsE9is_moduloE__fd_mask__mbstateLbufferpart_ZNSaIwE10deallocateEPwj_ZNSt11char_traitsIcE2ltERKcS2_spc_psdiv_ZNSt14numeric_limitsIiE12has_infinityE_ZNSt14numeric_limitsIcE8is_exactE_M_acquire_locknothrow_t_ZNSt14numeric_limitsIaE8infinityEv_S_id_monetary_ZNSt14numeric_limitsIiEaSERKS0__ZNSt11char_traitsIcE4copyEPcPKcj_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEcsizeuppthread_cond_t_ZNSt14numeric_limitsIdE9quiet_NaNEv_ZNSt14numeric_limitsIaE5trapsE_ZNSt14numeric_limitsIcE6digitsE_ZNSt24__default_alloc_templateILb1ELi0EE14_S_chunk_allocEjRi_ZNSt6locale5_Impl14_S_id_messagesE_M_fold_M_width_ZNSt14numeric_limitsIwE17has_signaling_NaNE_ZN13__type_traitsIaEaSERKS0__ZNSt14numeric_limitsIfE3maxEvvalid_ZNSaIwE9constructEPwRKw_ZTISt12domain_errorptb_lock_ZNSt11__ios_flags10_S_unitbufE_S_classic_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4__S_app_ZNSt14numeric_limitsIhE3minEv_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvjfpos_t_ZNSt14numeric_limitsIcE12max_exponentE_ZNSt14numeric_limitsIbE14is_specializedErebind_ZNSt8ios_base7goodbitE_M_call_callbacks_S_empty_rep_storage_M_refdata_ZNSt14numeric_limitsIlE6digitsE_ZNSt14numeric_limitsIbE12has_infinityE_ZNSt14numeric_limitsIsE17has_signaling_NaNEgoodbit_S_c_name_ZN22__pthread_mutexattr_staSERKS__ZN13__type_traitsIjEaSERKS0_ptca_private_ZNSs4rendEv_ZNSt14numeric_limitsItE8is_exactE_M_okseekpos__pid_tsq_head_ZNKSs4rendEv_S_atoms_in_ZN8timespecaSERKS_denorm_min_ZNSt14numeric_limitsIhE12max_exponentE_S_id_messages_ZN15pthread_queue_taSERKS__ZNSt14numeric_limitsIlE9is_signedEnotnull__vtt_parm_ZNSt14numeric_limitsIiE13signaling_NaNEv_ZNSs6assignEPKcjoverflow_ZNSt11char_traitsIcEaSERKS0__ZNSt14numeric_limitsIaE8digits10E_ZN13__type_traitsIsEaSERKS0__ZNSt14numeric_limitsIwE3minEvpthread_barrier_t_ZNSt14numeric_limitsIyE17has_signaling_NaNE_ZNSt14numeric_limitsIdE11round_styleE_ZNSt11__ios_flags9_S_badbitE_ZN9__gnu_cxx17__normal_iteratorIPcSsEaSERKS2__ZNSt14numeric_limitsIfE8infinityEv_ZNK9dbstreams4cellrsERPKh_ZNSt14numeric_limitsIeE15has_denorm_lossE_M_free_list_link_ZNKSs4dataEv_M_decr_ZNSt24__default_alloc_templateILb1ELi0EE9_S_refillEjtm_min_ZNSt14numeric_limitsImE12max_exponentE_ZNSs4_RepixEj_ZNSt4fposI11__mbstate_tEaSERKS1__M_namesupper_ZNSt14numeric_limitsIcE9is_iec559Eu_int8_t_ZNKSaIwE7addressERKw__numeric_limits_base_ZNKSs5c_strEv_ZNSs13_S_copy_charsEPcPKcS1__ZNSt14numeric_limitsIyE8is_exactE_M_incrcodecvt_base_ZNSspLERKSs_ZNSt14numeric_limitsIlE12has_infinityElong long int__type_traits_S_c_locale_ZNSt11__new_allocaSERKS_cntrl_Rep_ZNSt14numeric_limitsIbE10is_boundedE_ZNSt8ios_base5widthEi_ZNSt14numeric_limitsIeE14max_exponent10Eis_iec559_ZN6__sbufaSERKS_numeric_limits__off_tcatalog_ZNSt14numeric_limitsIjE8is_exactE_ZNSt14numeric_limitsIdE13has_quiet_NaNE_ZN6slpqueaSERKS__ZN9__gnu_cxx17__normal_iteratorIPcSsEmmEv_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_jwctype_t_ZNSt14numeric_limitsIaE13has_quiet_NaNE_ZNSt8ios_base14_Callback_listaSERKS0_input_iterator_tag_ZNSt14numeric_limitsIhE14is_specializedE_ZN11_Is_integerIbEaSERKS0_basic_iostream >ptb_curcount_ZNSt14numeric_limitsIyE12min_exponentE_ZNSs7replaceEjjRKSsresize~basic_stringbuf_ZNSt14numeric_limitsIiE13has_quiet_NaNE_ZNSt14numeric_limitsItE9quiet_NaNEv_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi_ZNSt14numeric_limitsIfE10has_denormE_ZNSt14numeric_limitsIwE10is_integerEhas_signaling_NaN_ZNSt6locale8monetaryE_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs_ZNSt11__ios_flags8_S_truncE_ZNSs4nposE_M_stringbuf_init_ZNSt14numeric_limitsIwE12max_exponentE_ZNSt14numeric_limitsIjE3maxEvptm_private_ZNSt10ctype_base5punctEcurrency_symbol_ZNSt14numeric_limitsIhE14min_exponent10Epta_magic_ZNSt11__ios_flags9_S_skipwsE_ZNK9dbstreams8metadataeqESs__testwrite_ZNSt14numeric_limitsIlE3minEv__in_chrg_ZNSt14numeric_limitsIyE13has_quiet_NaNE_ZNSt14numeric_limitsIbE7epsilonEv_ZNSaIcE8allocateEjPKv_ZNSt14numeric_limitsIaE14is_specializedEhas_trivial_assignment_operator_ZNK9dbstreams4cell5validEv_ZNSt11__ios_flags5_S_inE_M_st_ZNSt24__default_alloc_templateILb1ELi0EE12_S_heap_sizeE_ZNSt14numeric_limitsIeE9quiet_NaNEvpts_flags_ZNSt14numeric_limitsIhE9is_iec559E_ZNSs6assignEPKcoperator<<_ZNSt14numeric_limitsIhE9is_moduloE_ZN9__gnu_cxx17__normal_iteratorIPKcSsEmmEv_ZNSsaSEPKcfpos_ZNSt8ios_base4Init13_S_ios_createEb_ZN11_Is_integerItEaSERKS0__ZNSs6resizeEjctype_ZNSt8ios_base14_Callback_list19_M_remove_referenceEvint_curr_symbol_ZNSt14numeric_limitsIcE10has_denormE_ZNSt14numeric_limitsIhE8digits10E_ZNSs20_S_empty_rep_storageEfdlibm_xopennegative_sign_ZNSt14_Refcount_Base7_M_incrEv_ZNKSs7compareEPKc_ZNSs6assignEjc_S_highwater_ZNKSs4copyEPcjj_ZNSt14numeric_limitsIhE13signaling_NaNEvmessages_base_ZNSt14numeric_limitsIaE6digitsEoperator==swapspc_curprioritysync_with_stdio_ZNSt8ios_base10scientificE_Raw_bytes_alloc_ZNSt14numeric_limitsIsE7epsilonEvmove_ZNSt14numeric_limitsIeE11round_errorEv__moderfind_S_id_collate~bindery_ZNSt8ios_base10floatfieldE_ZNSt14numeric_limitsItE15tinyness_beforeEtz_dsttime__type_traits_ZNSt14numeric_limitsIhE13has_quiet_NaNE_ZN10itimerspecaSERKS__ZNSt14numeric_limitsIsE8is_exactEunsetf_ZNSt14numeric_limitsIaE12min_exponentEhas_trivial_copy_constructoregptr__off_ZNSt8ios_base5flagsESt13_Ios_Fmtflags_ZNSt14numeric_limitsIbE10denorm_minEvptr_writerstathz_M_install_cachenoconvpdata__vmi_class_type_info_pseudo1__vmi_class_type_info_pseudo2__normal_iterator, std::allocator > >operator>>_ZN9__gnu_cxx17__normal_iteratorIPKcSsEppEi_ZNSt21__numeric_limits_base14is_specializedE_ZNSt14numeric_limitsIjE14min_exponent10E_ZNKSs13find_first_ofEcj_ZN13__type_traitsIhEaSERKS0__ZNSt14numeric_limitsIdE15has_denorm_lossE_ZNSs6appendERKSs_ZNSt14numeric_limitsIjE11round_errorEv_ZNSt14numeric_limitsIxE13signaling_NaNEv_ZNSt14numeric_limitsIyE8digits10E_ZNSs6appendERKSsjjaddress_M_is_leaked_ZNSt6locale10_S_classicE_ZNSt14numeric_limitsIxE10is_integerE_ZNSt21__numeric_limits_base10is_integerE_ZNSt14numeric_limitsIbE9quiet_NaNEv_ZNSt14numeric_limitsIaE9is_signedE_ZNSt14numeric_limitsIyEaSERKS0__ZNSt14numeric_limitsIdE12min_exponentEsetbuf_M_iword_ZNSt14numeric_limitsIfE12min_exponentE_ZNSt14numeric_limitsImE9is_moduloE_ZNSt14numeric_limitsIsE6digitsE_ZNSt14numeric_limitsIyE3minEv_ZNSt6locale5facet9_S_c_nameEpthread_rwlockattr_t_M_add_reference_M_dispose_ZNSt14numeric_limitsIwE14min_exponent10E_ZNSt14numeric_limitsIfE10is_integerE_ZNSt26random_access_iterator_tagaSERKS__ZNSt14numeric_limitsIyE10is_boundedE_ZNSs12_M_leak_hardEv_ZNKSt8ios_base9precisionEv_ZNSt11__ios_flags6_S_binE_ZNSt8ios_base3octEtm_mon__type_traits_ZNSt14numeric_limitsIdE10denorm_minEvnullitude__int8_t_M_references_ZNSt8iteratorISt19output_iterator_tagvvvvEaSERKS1__ZNSt11__ios_flags13_S_floatfieldEtv_nsec__num_base_ZNSs3endEv_S_skipws_M_inittm_zone_M_release_lock_ZNKSaIcE7addressERKcfloat_denorm_style_ZNSaIcE10deallocateEPcj_ZNSt24__default_alloc_templateILb1ELi0EE10reallocateEPvjj_ZNSt14numeric_limitsIjE9quiet_NaNEviterator_traitsnumeric_limits_ZNSt14numeric_limitsIiE7epsilonEv_ZNSt21__numeric_limits_base12has_infinityE_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4__ZNSt14numeric_limitsIfE11round_errorEv_ZNSs6appendEPKcnumeric_limits_ZNKSs4findERKSsj_ZN9dbstreams4cell5_dataaSERKS1_ptb_initcount_Is_integer_ZNSt14numeric_limitsIhE15tinyness_beforeEnumeric_limits_ZNSaIwEaSERKS__ZNSt14numeric_limitsItE11round_errorEv_ZNSaIcE6rebindIcEaSERKS1_is_modulorendlconv_M_get_cache_M_impl_ZNSt14numeric_limitsIyE10has_denormE_ZNKSs7compareEjjRKSs_ZTISt13runtime_error_ZNSt8ios_base8internalE_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE__pbeg_ZNSt24__default_alloc_templateILb1ELi0EE11_S_end_freeE_ZNSt14numeric_limitsIiE10is_boundedEswblk_t_ZNSt14numeric_limitsImE14max_exponent10E_ZNSt14numeric_limitsIfEaSERKS0__M_grow_words_ZNSt8ios_base9showpointE_Is_integer_ZN15__long_double_uaSERKS___pthread_barrier_st_ZNSt14numeric_limitsIfE9is_signedE_ZN9dbstreams4cellaSEi__uint32_t_S_categories_ZNSt8ios_base6eofbitEu_quad_tround_toward_infinity_ZNKSaIcE8max_sizeEv_ZNSt14numeric_limitsIyE5radixE_ZN9dbstreams8metadata7bindery8allocateEi_ZNSt14numeric_limitsIlE10is_boundedE_ZNSt14numeric_limitsIeE14min_exponent10E_ZN9dbstreams8metadataaSERKS0__ZNSt14numeric_limitsIaE10is_boundedE_ZNK9__gnu_cxx17__normal_iteratorIPKcSsEmiERKi_M_destroy_ZNSt6locale3allE_ZNSt9time_baseaSERKS_~metadatapto_done_S_extra_categories_size_ZNSaIvEaSERKS_u_short__class_type_info_pseudo__pend_ZNSt6locale18_S_categories_sizeEallocated_ZNSt8ios_baseaSERKS_imbue_ZN11_Is_integerIiEaSERKS0__Is_integer_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi_ZNSt14numeric_limitsIdE10is_boundedE_ZNSs4_Rep11_S_max_sizeE__socklen_t_ZNSt14numeric_limitsItE13signaling_NaNEv_ZNSt14numeric_limitsIbE10has_denormE_M_remove_reference~basic_ios_ZNSt14numeric_limitsIfE14min_exponent10E_ZNSt14numeric_limitsIcE3maxEvptm_interlock_ZNSt14numeric_limitsIsE15tinyness_beforeEhas_quiet_NaN_ZNSt14numeric_limitsIxE8is_exactE_ZNSs2atEjchar_traits_ZNSt14numeric_limitsImE11round_styleE_ZNSt10money_baseaSERKS__ZNSt8ios_base5truncE_ZNSt14_Refcount_BaseaSERKS_basic_stringstream,std::allocator >GNU C++ 3.3.3 (NetBSD nb3 20040520)_ZNKSt8ios_base5flagsEv_ZN9dbstreams4cellaSEPKc_ZN9dbstreams4cellaSEPKh_ZNSt14numeric_limitsIdE14is_specializedE_ZNSt6locale5_Impl13_S_id_collateE_ZNSt14numeric_limitsIxE14min_exponent10E_ZNKSs17find_first_not_ofEcj_ZNSt14numeric_limitsIdE12max_exponentE__ctype_type_ZNSt14numeric_limitsIcE15has_denorm_lossE_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE_ZNSt14numeric_limitsIjE10has_denormE_ZNSt14numeric_limitsIeE8digits10Eint_p_cs_precedes_RC_t_ZNSt14numeric_limitsIcE5trapsE_ZNSt14numeric_limitsImE10is_integerE__val_read_ZNSt8ios_base15sync_with_stdioEb_ZNSt14numeric_limitsIcE12has_infinityE_S_badbittraits_typepts_spinint_p_sep_by_space_ZNSt14numeric_limitsIwE9is_iec559E_ZNSt14numeric_limitsIwE9is_moduloE_ZNSt8ios_base6badbitEtick__type_traits_ZNSt14numeric_limitsIlE10denorm_minEvsched_priority_ZNSspLEPKc_ZNSt8ios_base8showbaseE_ZN11_Is_integerIPcEaSERKS1_not_eofthis_ZNSt14numeric_limitsItE3minEvsuseconds_t_ZNSt21__numeric_limits_base5radixE_ZNSt14numeric_limitsIhE6digitsE_ZNSt14numeric_limitsIeE8infinityEv_ZNSt14numeric_limitsIiE12max_exponentE_ZN10__double_uaSERKS__ZNSt11__ios_flags6_S_octEordinal__sFILE_ZNSt11char_traitsIcE6lengthEPKc_ZNSt14numeric_limitsIhE12has_infinityE__tmp_ZNSt14numeric_limitsIbE9is_iec559Eu_int_ZNSt14numeric_limitsIbE9is_moduloE_S_truncdatum_ZNSt14numeric_limitsIwEaSERKS0__M_refcopy_ZNK9__gnu_cxx17__normal_iteratorIPKcSsEixERKi_ZNSt14numeric_limitsIdE15tinyness_beforeE_ZNKSt4fposI11__mbstate_tEneERKS1_unchar_M_local_word_ZNSt14numeric_limitsIaE11round_styleE_ZN17schedstate_percpuaSERKS__ZNSt14numeric_limitsImE15has_denorm_lossE_ZNSt14numeric_limitsIwE5trapsEcopyfmt_event_ZN24__pthread_barrierattr_staSERKS__ZNSt14numeric_limitsIlE9is_moduloEptma_magic_ZNSt11__ios_flags12_S_uppercaseE_ZNSt14numeric_limitsIlE14is_specializedE_ZNSt11char_traitsIcE3eofEv_ZNKSs12find_last_ofEPKcjj_ctor_arg__type_traits_ZNSt14numeric_limitsIlE14min_exponent10E_ZNSt14numeric_limitsImE12has_infinityE__c1__c2max_ZNSt14numeric_limitsIeE5radixEalnum__osizecolsize_ZNSt26bidirectional_iterator_tagaSERKS___type_traits_ZNSt24__default_alloc_templateILb1ELi0EE22_S_node_allocator_lockEptr_wblocked_ZNSt8ios_base20_M_dispose_callbacksEv_ZNKSt6localeneERKS___uint64_t_ZNSt21__numeric_limits_base8is_exactE_ZNSt14numeric_limitsItE12has_infinityE_ZNKSs4findEPKcjvsize_tbasic_ostream >_ZN13__type_traitsIxEaSERKS0__ZNSt14numeric_limitsIsE12max_exponentE_ZNSt14numeric_limitsIcE11round_styleE_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEjc_cookie_ZNSt8ios_base6skipwsE__testeof_ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEvappend_ZNSt8ios_base4Init20_S_synced_with_stdioEschedstate_percpu_ZNSt14numeric_limitsIhE10is_integerE_Is_integerint_frac_digits_ZNSt14numeric_limitsIsE13signaling_NaNEv_ZNSt10__num_baseaSERKS__ZNKSs16find_last_not_ofEcj__default_alloc_template_S_uppercase_ZNSt14numeric_limitsIdE10is_integerE_ZNSt12domain_erroraSERKS__ZNSt14numeric_limitsIaE7epsilonEveq_int_type_ZNSt14numeric_limitsIjE8infinityEv__double_u_ZNSt6locale7collateE_ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv_ZNSt15iterator_traitsIPKcEaSERKS2__ZNKSt6localeeqERKS_allocator_type_ZNSt14numeric_limitsIjE6digitsE_ZNSt14numeric_limitsIiE3minEv_ZNSt14numeric_limitsIxE11round_errorEv_ZNKSs12find_last_ofERKSsj_Is_integersched_param_ZNSt8ios_base9precisionEi_ZNSt14numeric_limitsIxE12max_exponentEbasic_string,std::allocator >_ZNSt6locale4timeE_ZNKSt8ios_base9_M_getlocEv_ZNK9dbstreams8metadataltESs_ZNSt14numeric_limitsIbE14max_exponent10E_ZNSt14numeric_limitsIlE8digits10E_Atomic_word_ZNSt14numeric_limitsIeE11round_styleE_ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv__type_traitsquot_ZNSt14numeric_limitsIwE12has_infinityE_M_pword_ZN17__pthread_attr_staSERKS__S_boolalphafixpt_tclock_t_ZNSt14numeric_limitsIdE8is_exactE_M_ios_iostate_end__end_M_set_leaked_S_empty_rep_ZNSt14numeric_limitsIcE17has_signaling_NaNE_ZNSt14numeric_limitsIwE7epsilonEv_ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv_S_initialized_ZNSt14numeric_limitsImE14is_specializedE_ZNSt14numeric_limitsIhE10is_boundedEround_to_nearest_ZNSt14numeric_limitsIjE17has_signaling_NaNE_ZNSt6locale9_S_globalE_ZNSt14numeric_limitsIyE15has_denorm_lossEcell.C_ZNSt14numeric_limitsIaE11round_errorEvnumeric_limitspbaseptba_magic~basic_iostream_ZNSs6assignERKSsjj__base_ZNSt14numeric_limitsIwE10has_denormE_ZNSt14numeric_limitsIbE15has_denorm_lossEint_p_sign_posn_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci_ZN13__type_traitsIfEaSERKS0__ZNSt14numeric_limitsIxE3minEv_ZN9__gnu_cxx17__normal_iteratorIPcSsEmmEi__gnext_ZNSt8ios_base5pwordEi_ZNSt14numeric_limitsIxE6digitsEdaddr_t_ZNSt14numeric_limitsIbE10is_integerE_ZNSt14numeric_limitsIfE17has_signaling_NaNEiterator_traits_ZNKSs4findEcj__uint16_t_ZNSt14numeric_limitsItE10denorm_minEvptc_private_ZNSolsEiwint_ttm_mday_M_cloneoperator->_ZN6prochdaSERKS__ZN9__gnu_cxx17__normal_iteratorIPKcSsEmIERKi_ZNSt14numeric_limitsIxE12has_infinityE_ZNSt8ios_base6unsetfESt13_Ios_Fmtflags_ZNSt14numeric_limitsIcE13has_quiet_NaNE_ZNSt14numeric_limitsIcEaSERKS0__ZNSt14numeric_limitsIyE9quiet_NaNEv_M_really_syncmoney_base_ZNSt14numeric_limitsIbE12min_exponentE_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEaSERKS3_pthread_once_t_ZN19__pthread_rwlock_staSERKS_is_null_S_showpos_ZNSt8ios_base3appE__result_ZNSt14numeric_limitsIlE9is_iec559E__testpos_ZN11_Is_integerIyEaSERKS0__ZNSt14numeric_limitsIeE13has_quiet_NaNE__streambuf_type_ZNSt14numeric_limitsIiE11round_styleE_ZNSt14numeric_limitsIbE8digits10E__testout_ZNSt14numeric_limitsIsE13has_quiet_NaNE_ZNSt4fposI11__mbstate_tEmiElround_toward_neg_infinity_ZNSt11__ios_flags12_S_boolalphaE_ZNSt21__numeric_limits_base5trapsE_ZNSt15_STL_mutex_lock15_M_acquire_lockEv_ZNSt14numeric_limitsIeE3maxEv_ZNSt14numeric_limitsIlEaSERKS0_ptb_private_ZNSt14numeric_limitsIeE13signaling_NaNEv_ZNSt14numeric_limitsIfE15tinyness_beforeE__c_locale_ZNSt6locale24_S_extra_categories_sizeE_ZNSs16_S_construct_auxIPcEES0_T_S1_RKSaIcE12__false_type_ZNSt14numeric_limitsIeE5trapsE_ZNSt14numeric_limitsIfE6digitsE_ZNKSt4fposI11__mbstate_tEeqERKS1__ZNSt11char_traitsIcE7compareEPKcS2_j_ZNK9__gnu_cxx17__normal_iteratorIPKcSsEdeEv_ZNSt21__numeric_limits_base15tinyness_beforeE_ZNSt14numeric_limitsIxE14is_specializedE_ZNSt6localeaSERKS_find_first_of_ZNSt11__ios_flags8_S_rightE_ZNSt11char_traitsIcE4moveEPcPKcjptc_mutex_ZNSt14numeric_limitsIiE10has_denormE_ZNSt8ios_base3decE_ZN13__type_traitsIdEaSERKS0_max_exponent_ZNSdaSERKSdit_value_ZNSt6locale5_Impl19_S_facet_categoriesE_ZNSt14numeric_limitsIdE8digits10Eis_nullable__fmtallocator_ZNSt11char_traitsIcE2eqERKcS2__ZNSt14numeric_limitsImE3minEvbasic_string_ZNKSs7compareEjjPKc_ZNSt8ios_base4Init14_S_initializedEv_ZNSt14numeric_limitsIsE8digits10E_ZNKSs5rfindERKSsjhas_denorm_loss_ZNSs4swapERSs_ZNSt14numeric_limitsIaE10has_denormE_ZNSt14numeric_limitsIlE12min_exponentEreverse_iterator<__gnu_cxx::__normal_iterator, std::allocator > > >substr_Alloc_ZN13__type_traitsImEaSERKS0_pta_private_ZNSt14numeric_limitsIjE10is_boundedEspc_rrticks_ZN9__float_uaSERKS_~basic_string_ZNSt14numeric_limitsImE11round_errorEv_ZNSt14numeric_limitsIaE14max_exponent10E~_Alloc_hider_ZNSt14numeric_limitsIxE5radixE_ZNSt14numeric_limitsItE8infinityEv_S_end_free__type_traits_ZNSt14numeric_limitsIdE7epsilonEv__pos_ZNSt14numeric_limitsItE14min_exponent10E_ZNSt21__numeric_limits_base14min_exponent10E_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_operator&_ZNSt11char_traitsIcE11eq_int_typeERKiS2_operator+operator-u_longis_specialized_ZNSt14numeric_limitsIeE6digitsE__gbeg_ZNSsaSERKSs_ZN9dbstreams4cell10copy_valueERKS0_operator<u_longlong_tsetp__long_double_uevent_callback_S_refill_ZNSt10__num_base11_S_atoms_inEnumeric_limits_ZNSs9push_backEc_ZNSt14numeric_limitsIcE7epsilonEvulong_ZNSt14numeric_limitsIfE9quiet_NaNEvpbackfail_ZNKSs6_M_repEv_ZNSt6locale13_S_categoriesE__k1ssize_t_M_word_ZNSt14numeric_limitsIwE5radixE__si_class_type_info_pseudoptm_ownerdenorm_present__uintptr_t~ios_base_ZNSt14numeric_limitsIaE15has_denorm_lossEvaddr_toperator|_M_ref_count_lockpthread_mutexattr_t_ZNSaIwE8allocateEjPKvtime_base_ZNSt14numeric_limitsIwE10is_boundedE_ZNKSs5rfindEcj__ret__type_traits__Atomicity_lock_ZNSt11__new_alloc10deallocateEPvj_ZNSt14numeric_limitsIhE10denorm_minEv_ZNSt14numeric_limitsIiE15tinyness_beforeE_ZNSt14numeric_limitsIiE8digits10E__type_traits__cpu_simple_lock_tu_int32_t_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode_ZNSt6locale8messagesE_ZNSt8ios_base3hexE_ZNSt14numeric_limitsIbE3minEv_ZNSt21__numeric_limits_base14max_exponent10E_M_ios_seekdir_end_ZN9dbstreams4cellaSERKSs_ZNSt6locale5_Impl16_M_install_cacheEPSt19__locale_cache_basei_ZNKSs5rfindEPKcjhas_denorm_ZN23__pthread_rwlockattr_staSERKS__ZNSt14numeric_limitsIaE8is_exactE_ZNSt14numeric_limitsIjE14is_specializedE_ZNSt14numeric_limitsIyE14is_specializedEunderflow_M_callbacks_ZNKSs7_M_dataEv_ZNSt14numeric_limitsItE7epsilonEv_S_internal_ZN18__pthread_mutex_staSERKS__ZNSt14numeric_limitsIyE8infinityEv_ZN8timezoneaSERKS__ZNSt14numeric_limitsIxE5trapsE_ZN9dbstreams4cellclEPKcinone_ZNSt14numeric_limitsIdE13signaling_NaNEv_ZN9dbstreams8metadata7binderyaSERKS1___pthread_mutexattr_st_ZNSt14numeric_limitsIjE9is_signedE_ZN11sched_paramaSERKS_radixoperator streamoff_ZNSt14numeric_limitsIdE11round_errorEv__testposi_ZNKSs6substrEjj_M_off_ZNSt14numeric_limitsIwE14is_specializedE_ZNSt11__ios_flags6_S_appEreverse_iterator<__gnu_cxx::__normal_iterator, std::allocator > > >_ZNSt14numeric_limitsIdE6digitsE_ZNSt14numeric_limitsIxE10denorm_minEv_ZN12__false_typeaSERKS__ZNSt14numeric_limitsIdE8infinityEv_ZNSt14numeric_limitsIaE9quiet_NaNEv_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1__ZNSt14numeric_limitsIdE12has_infinityE_ZNSt14numeric_limitsIsE10has_denormEdifference_type_ZNSt10money_base7patternaSERKS0__ZNSt11__ios_flags8_S_fixedE_ZN6fd_setaSERKS__ZNSt14numeric_limitsIaEaSERKS0_punct_S_normalize_category_ZNSt14numeric_limitsIaE9is_iec559E_ZNSt14numeric_limitsIlE15has_denorm_lossE_M_facets_size_ZNK9dbstreams4cellrsERf_ZNSt15_STL_mutex_lock13_M_initializeEv_ZNK9dbstreams4cellrsERifdlibm_svid_ZNSt21__numeric_limits_baseaSERKS__ZNSt8ios_base9uppercaseE_ZNSt14numeric_limitsIsE11round_styleE_ZNSt14numeric_limitsIjE12max_exponentE_ZNSt11__ios_flags6_S_decE_ZN11_Is_integerIwEaSERKS0___in_port_t__int16_t_M_leak_ZNSt24__default_alloc_templateILb1ELi0EE13_S_start_freeE_ZNSt21__numeric_limits_base6digitsEbasic_ios >~localeclockinfo_ZNSt11char_traitsIcE12to_char_typeERKi_ZNSs7_M_leakEv_M_refcount_ZNSt14numeric_limitsIjEaSERKS0__ZNSt14numeric_limitsIyE5trapsE_ZNSt14numeric_limitsIsE14min_exponent10E_ZNSt14numeric_limitsIaE3minEv_ZNSt11__ios_flags11_S_showbaseE_S_facet_categoriespthread_mutex_t_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEEround_toward_zero_STL_mutex_lockmake_bindable_ZNSt6locale5facet11_S_c_localeE_ZNSt11__ios_flags12_S_showpointE_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs_ZNSt14numeric_limitsIjE7epsilonEv_ZN13__type_traitsIbEaSERKS0__ZNSt4fposI11__mbstate_tEpLEl_ZNSt8ios_base3curE_ZNSt6locale7classicEv_ZNK9dbstreams4cellrsERPKc_ZNSt14numeric_limitsItE10is_integerE_ZNSt14numeric_limitsItE5radixE_S_atoms_outtm_yday_ZNSt14numeric_limitsIsEaSERKS0__ZNSs6insertEjPKc_ZNKSt4fposI11__mbstate_tEcvlEv_ZNSt14numeric_limitsIxE13has_quiet_NaNE_ZNSt10__num_base12_S_atoms_outEbidirectional_iterator_tag_ZNSt14numeric_limitsImE6digitsE_ZNSt21__numeric_limits_base12min_exponentE_Is_integer_S_bin_M_check_ZN17__pthread_cond_staSERKS__ZNK9__gnu_cxx17__normal_iteratorIPKcSsEplERKi_ZNKSs8max_sizeEvbasic_istream >_ZNSt24__default_alloc_templateILb1ELi0EE17_S_freelist_indexEj_ZNSt14numeric_limitsIiE8infinityEvimbue_event_ZNKSs4_Rep12_M_is_sharedEv_ZNSt14numeric_limitsIlE10is_integerE_ZNSt14numeric_limitsIdE3maxEv_ZNSt14numeric_limitsIhE10has_denormEfloat_round_style__exchange_and_add_ZNSt14numeric_limitsIdE14max_exponent10E_ZNSs7replaceEjjjc_ZNSt14numeric_limitsIwE15has_denorm_lossEmin_exponent10_ZNSt14numeric_limitsIhE8is_exactE~_STL_auto_lock_ZNSt14numeric_limitsIfE3minEv_ZNSt14numeric_limitsIfE9is_iec559E_ZNSs7replaceEjjPKcj_ZTISi_ZNSt14numeric_limitsIfE9is_moduloE_ZNSt14numeric_limitsIwE11round_styleEit_interval_ZNSs6insertEjRKSs_M_p_ZNSt8ios_base11adjustfieldE__size_M_word_size_ZNKSs4sizeEv_ZNSt14numeric_limitsIiE14is_specializedE_ZN13__type_traitsItEaSERKS0_ptma_private_ZNK9__gnu_cxx17__normal_iteratorIPcSsE4baseEv_ZNKSs7compareERKSs_Is_integer_M_rep_S_node_allocator_lockpmc_evid_thas_infinity_S_scientific_M_precisionis_integer_ZNSt6locale5_Impl19_M_remove_referenceEvrbegin_ZNSt14numeric_limitsIyE12max_exponentEis_exact_S_showbase_ZNSt14numeric_limitsIcE13signaling_NaNEv_ZNSt6locale5_ImplaSERKS0_iterator_M_os_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5__ZNSt21__numeric_limits_base11round_styleE_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE_M_ibegin_ZNSt20forward_iterator_tagaSERKS__ZNSs12_S_empty_repEv_ZNSt11__ios_flags6_S_hexE__type_traits_ZNSt14numeric_limitsIsE3maxEv_ZNSt6locale5_Impl11_S_id_ctypeEtickadj__type_traitsfind_first_not_of__beg_ZNSt14numeric_limitsIyE11round_styleE_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode_ZNSt10ctype_base5upperE_ZNSt14numeric_limitsIfE7epsilonEvhas_trivial_destructorctype_base_ZNSt14numeric_limitsItE9is_signedE_ZNSt14numeric_limitsIyE6digitsE_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE_ZNSt14numeric_limitsIbE11round_errorEvqdiv_tint_n_sep_by_space_ZNSt18input_iterator_tagaSERKS__M_set_sharable_M_lock_ZNSt24__default_alloc_templateILb1ELi0EE4_ObjaSERKS1__M_mutatepsize_t_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2__ZNSt6locale5_Impl12_M_get_cacheEjino_t_ZNSt6locale21_S_normalize_categoryEj_ZNSt14numeric_limitsImE9is_iec559E_ZNK9__gnu_cxx17__normal_iteratorIPKcSsEptEvnumeric_limits_ZNSt14numeric_limitsIfE8digits10E_ZNSt8ios_base9boolalphaE_ZNSt8ios_base7showposEepsilon_ZN11_Is_integerIcEaSERKS0__ZN16__Atomicity_lockILi0EE17_S_atomicity_lockE_ZNSt10ctype_base5alnumE__s1__s2_Ios_Iostate_ZNKSs2atEj_ZNKSaIcE7addressERc_Is_integer__mem_ZNSt10ctype_base5digitE_ZN16__Atomicity_lockILi0EEaSERKS0__S_ios_base_init_ZNSt4fposI11__mbstate_tEplEl_ZNSt14numeric_limitsItE12max_exponentE_ZNSi6sentryaSERKS__ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tagnpos_M_dispose_callbacks_ZNK9__gnu_cxx17__normal_iteratorIPKcSsE4baseEv_ZNSs7reserveEj_ZNSt14numeric_limitsIcE12min_exponentE_M_flags__sb_ZN11_Is_integerIlEaSERKS0__ZNSaIcE7destroyEPc_ZNSt21__numeric_limits_base10is_boundedEnumeric_limits_ZNSs4_RepaSERKS__ZNSs6appendEPKcj__sp__testin_S_right_ZNK9dbstreams8metadata11native_typeEv_ZNSs5beginEv_ZNSt14numeric_limitsIlE11round_errorEv_ZNSs4_Rep13_M_set_leakedEv_ZNSt10ctype_base6xdigitEspc_schedticks_ZNSt14numeric_limitsIlE9quiet_NaNEv_ZNSt14numeric_limitsImE17has_signaling_NaNE_ZNSs6resizeEjc_M_ref_count_M_dataplus_ZNSt14numeric_limitsIwE8digits10E_ZNSt14numeric_limitsIbE13has_quiet_NaNE_ZNSt24__default_alloc_templateILb1ELi0EE12_S_force_newE_ZNSt14numeric_limitsIyE14max_exponent10E_ZNSs6appendEjcmin_ZNSt14numeric_limitsIhE3maxEv_ZNSt14numeric_limitsIhE12min_exponentEnumeric_limitspush_back_ZNSt14numeric_limitsIyE9is_signedE_ubuf/usr/users/home/jklowden/projects/database/dbstreams/doc/www/cvs/dbstreams/src_nbuf_ZNSs7replaceEjjPKc_ZN5lconvaSERKS_short int_M_check_same_name_ZNSo6sentrycvbEv_ZNSt14numeric_limitsIlE14max_exponent10E_ZNSt6locale2id12_S_highwaterEtimer_t_ZNSt14numeric_limitsIiE17has_signaling_NaNE_ZNSt15iterator_traitsIPcEaSERKS1__ZNSt11__ios_flags12_S_basefieldE_ZNSt14numeric_limitsIhEaSERKS0_tm_yeariterator_ZNSt8ios_base3begEtm_sec_ZNSt11__ios_flags7_S_leftE_ZN9__gnu_cxx17__normal_iteratorIPKcSsEmmEi_ZNKSs4_Rep12_M_is_leakedEv_ZNSt24__default_alloc_templateILb1ELi0EE8allocateEj_ZNSt14numeric_limitsImE10denorm_minEvtm_hour__pthread_barrierattr_st_ZNSt14numeric_limitsIbE6digitsE_ZNSt14numeric_limitsIsE8infinityEv_ZNSt9nothrow_taSERKS_operator bool__iostream_typeround_indeterminate_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv_ZNSt14numeric_limitsItE5trapsE_ZNSt14numeric_limitsIdE9is_signedE__uid_t_ZNSt6locale13_S_initializeEv_ZNSt14numeric_limitsImE12min_exponentE_ZNSs4_Rep11_S_terminalEto_int_type_ZNSt14numeric_limitsIeE7epsilonEv_ZNSt14numeric_limitsIeE17has_signaling_NaNEsegsz_t_ZNSt14numeric_limitsIbE13signaling_NaNEvptm_magic_ZNSt21__numeric_limits_base9is_signedE_M_stringbuf_ZNSt14numeric_limitsIyE12has_infinityEc_str_ZN21__pthread_condattr_staSERKS__ZNSt17_Swap_lock_structILi0EE12_S_swap_lockE_ZNSt14numeric_limitsIwE3maxEvptca_magic_ZNKSs7compareEjjPKcjis_POD_type_ZNKSt4fposI11__mbstate_tE11_M_positionEv_ZNSt14numeric_limitsIjE13signaling_NaNEv_ZNSs12_Alloc_hideraSERKS__M_position_S_swap_lock_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv_ZN13__type_traitsIiEaSERKS0_ptba_private_ZNSt14numeric_limitsIaE17has_signaling_NaNE_ZNSt14numeric_limitsIeE10is_integerE_ZNSt14numeric_limitsImE13has_quiet_NaNE~Init__stringbuf_type_ZNSs4_Rep10_M_destroyERKSaIcEiterator_ZNSt14numeric_limitsImE8digits10E_ZNSt14numeric_limitsIsE10is_integerE_ZNSt14numeric_limitsIsE5trapsEpthread_cleanup_store_ZNSt14numeric_limitsIdE14min_exponent10E_ZNK9dbstreams4cellrsERd_ZNSt14numeric_limitsItE6digitsE_Callback_list_M_exception_ZNKSs6lengthEv__pthread_rwlock_stptc_magic_S_dec_S_id_ctype_Ios_Seekdir_M_iend_M_replace_categories_ZNSt14numeric_limitsIxE7epsilonEv__endi_ZNK9dbstreams4cellrsERSs_ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv_ZNSt14numeric_limitsIfE13has_quiet_NaNE_ZNSt8ios_base5iwordEi_S_round_uprebindptra_magicnumeric_limits_ZNSt14numeric_limitsIwE12min_exponentE_ZNSt8ios_base3ateE_ZN17__pthread_once_staSERKS_timespecround_error_ZNSt14numeric_limitsIyE9is_iec559Enumeric_limits_ZNSt14numeric_limitsIcE15tinyness_beforeE_ZNSt14numeric_limitsImE13signaling_NaNEv_ZNKSt8ios_base6getlocEv_ZNSt14numeric_limitsIxE8infinityEv_ZNK9dbstreams8metadata7bindery9allocatedEvtm_wdayblkcnt_tspc_flags_ZN9__gnu_cxx17__normal_iteratorIPKcSsEpLERKimon_thousands_sep_Words_ZN9dbstreams4cellaSERKS0__ZNSt14numeric_limitsIiE9is_signedE_ZNSt14numeric_limitsItE14max_exponent10E_ZNSt14numeric_limitsIaE12max_exponentE_ZNSt14numeric_limitsIjE15has_denorm_lossEtz_minuteswestwctrans_t_S_id_timeoperator[]_S_synced_with_stdio__dnew_ZNSt14numeric_limitsIcE10is_integerE__locale_cache_base_ZNSt8ios_base5imbueERKSt6locale_S_force_new_ZNSt14numeric_limitsIaE10denorm_minEv_Swap_lock_struct_ZNSt14numeric_limitsIcE8infinityEv_M_ios_locale_S_oct_ZNSt19output_iterator_tagaSERKS__ZNSt6locale7numericE_ZNSt14numeric_limitsIxE14max_exponent10E_ZNSt14numeric_limitsIlE3maxEv_ZNSt14numeric_limitsIyE11round_errorEv_ZN7timevalaSERKS_fdversion_ZNSt8ios_base14_Callback_list16_M_add_referenceEv__k2_ZNSt14numeric_limitsImE5radixE_ZNKSs7compareEjjRKSsjj__first_ZNSt14numeric_limitsIfE12max_exponentE_ZNSt11__ios_flags6_S_ateE_ZNSt11char_traitsIcE4findEPKcjRS1___pthread_attr_st_ZN11_Is_integerIaEaSERKS0__S_fixed_ZNSt14numeric_limitsIcE8digits10E_S_floatfield_ZNSaIcEaSERKS__S_default_patternptr_interlockptb_magic_ZNSt14numeric_limitsIeE12has_infinityEregister_tptm_blocked_ZNSs6assignERKSs_ZNSt14numeric_limitsIyE9is_moduloEreplace_S_initialize_ZNSt14numeric_limitsIcE10denorm_minEv__curiu_char__curo_ZN9__gnu_cxx17__normal_iteratorIPcSsEppEi_M_is_shared_ZNSt14numeric_limitsIdE10has_denormE_ZN11_Is_integerIjEaSERKS0___new_allocpthread_t_ZN9__gnu_cxx17__normal_iteratorIPcSsEppEv_ZNSt14numeric_limitsIaE13signaling_NaNEv_ZNSt13messages_baseaSERKS__ZNSt14numeric_limitsIlE5radixE_ZNKSs3endEv_ZNSt11__ios_flags13_S_scientificEiterator_traits_ZNSt14numeric_limitsIjE12has_infinityEerase_event_ZN21pthread_cleanup_storeaSERKS__ZN9__gnu_cxx17__normal_iteratorIPKcSsEppEvtimezoneint_n_sign_posnptr_nreaders_ZNSt24__default_alloc_templateILb1ELi0EE12_S_free_listE_ZNSt8ios_base7failbitE_ZNKSs17find_first_not_ofEPKcjj_ZNSt14numeric_limitsIwE9quiet_NaNEv_S_format_floatoperator!=_ZNSt14numeric_limitsItE8digits10E_ZNSt8ios_base3endE_ZN11_Is_integerIsEaSERKS0__ZNSt14numeric_limitsIyE13signaling_NaNEv_S_construct_pattern_ZNSt14numeric_limitsIeE10denorm_minEv__mbstate_t_Is_integer_ZNSt24__default_alloc_templateILb1ELi0EE5_LockaSERKS1__ZNSt14numeric_limitsIlE8is_exactE_M_id_S_failbitmon_decimal_point__gid_t_ZNSt14numeric_limitsIhE8infinityEv__atomic_add_ZNSt14numeric_limitsIcE14min_exponent10E_ZTISt11logic_errordigits10_ZNSt14numeric_limitsIxE9is_iec559Espc_cp_timebasic_stringbuf,std::allocator >_ZNSt14numeric_limitsImE10is_boundedEpthread_key_t_ZNSt14numeric_limitsIaE3maxEv_ZNK9__gnu_cxx17__normal_iteratorIPcSsEixERKi_ZNSt14numeric_limitsIeE9is_iec559Enlink_t__uint8_t_ZNSt14numeric_limitsIeE9is_moduloEnTYPESbinary_ZNSt14numeric_limitsItE14is_specializedE_ZNSt14numeric_limitsIcE3minEv__true_type__default_alloc_templateint_n_cs_precedespmc_ctr_t_M_next__gthread_key_t_ZN20__pthread_barrier_staSERKS__ZNSt14numeric_limitsIsE10is_boundedE_ZN9dbstreams4cell13make_bindableEvpthread_attr_t_ZNSt11char_traitsIcE6assignEPcjc_ZNSt6locale5_Impl16_M_add_referenceEv_ZNKSs17find_first_not_ofERKSsj_ZNSt8ios_base2inE_ZNSt14numeric_limitsIiE6digitsE_ZNSt6locale5_Impl14_S_id_monetaryE_ZNSt14numeric_limitsIxE9is_moduloE_ZNSt14numeric_limitsIjE14max_exponent10E_ZNSs7replaceEjjRKSsjj_ZNSt14numeric_limitsIeE15tinyness_beforeE_ZNSt14numeric_limitsIyE15tinyness_beforeE__lastclockid_tfind_last_of_ZNSt14numeric_limitsIbE15tinyness_beforeErlim_t_ZNSt14numeric_limitsIeE9is_signedE__rhs_S_start_free__gthread_once_t_ZNSt14_STL_auto_lockaSERKS__ZNSt14numeric_limitsIxEaSERKS0__ZNSt14numeric_limitsIjE5radixEprofhz__normal_iterator, std::allocator > >value_typesetg_M_install_facet_ZNSt14numeric_limitsIwE14max_exponent10E_ZNSt14numeric_limitsIsE9is_signedE_ZN9dbstreams8metadata11native_typeEi_ZNSt14numeric_limitsIiE15has_denorm_lossE_ZNKSs6rbeginEvemptyfmtflags_S_ios_destroy_S_create_ZNSt14numeric_limitsIjE8digits10E~allocator_S_eofbit_ZNSt14numeric_limitsIiE10denorm_minEv_ZNSt14numeric_limitsIeE8is_exactEreserve_ZN7__sFILEaSERKS__ZNSt14numeric_limitsIjE13has_quiet_NaNE_ZNSt14numeric_limitsIbE8is_exactErdbuf_ZNKSaIwE7addressERw_ZNK9dbstreams4cell7colsizeEviostate_ZNSs12_S_constructIPcEES0_T_S1_RKSaIcE_ZNSt14numeric_limitsImE8infinityEv_ZNSspLEc_S_unitbufptm_lock_ZNSt21__numeric_limits_base10has_denormE~_Impl_ZNSt14numeric_limitsIcE11round_errorEvnumeric_limits_ZNSt14numeric_limitsIyE14min_exponent10Epthread_queue_t_ZNSt6locale4noneE__pthread_once_st_ZN9itimervalaSERKS__ZNSt14numeric_limitsIeE12min_exponentE_ZNSt14numeric_limitsIjE9is_moduloEptra_private_ZNSt14numeric_limitsIiE5radixE_ZNSt8ios_base3outE_ZNSt10ctype_base5lowerE_ZNSt14numeric_limitsIfE10is_boundedE__sbufhas_trivial_default_constructor_seek_close_ZNKSs17find_first_not_ofEPKcj_Obj_S_construct_ZNSt8ios_base4setfESt13_Ios_FmtflagsS0_~sentry_ZNSt14numeric_limitsIiE11round_errorEv_ZlsRSoRKN9dbstreams4cellEblksize_t_ZNSt6locale5_Impl10_S_id_timeE_ZN9dbstreams4cellclEPKvifds_bits_ZNSt14numeric_limitsIsE14is_specializedEeback_ZNSt14numeric_limitsImE5trapsEpthread_condattr_t__type_traits_ZNSt14numeric_limitsIhE11round_errorEv_ZNSt14numeric_limitsIjE10is_integerEoperator+=_ZNSt8ios_base6_WordsaSERKS0__ZNSt8ios_base7unitbufEconst_reference_ZNSaIwE7destroyEPw_ZNSt10__num_base13_S_format_intERKSt8ios_basePccc_ZNSt6locale2idaSERKS0_streamsize_ZNSt14numeric_limitsImE15tinyness_beforeE_ZNSt8ios_base4Init16_S_ios_base_initEregister_callback_ZNSt14numeric_limitsIsE12has_infinityE_ZNSt14numeric_limitsImE9quiet_NaNEv__Atomicity_lock<0>tv_usec_ZNSi6sentrycvbEv_ZNSt14numeric_limitsIfE13signaling_NaNEv_ZNSt8ios_base7_M_initEv_ZNSt8ios_base9basefieldE_Is_integerclear_ZNSt14numeric_limitsItE15has_denorm_lossEdenorm_indeterminate_ZNSt14numeric_limitsIhE5radixE_ZNSt14numeric_limitsIbE14min_exponent10E_S_id_numeric_ZNSt8iteratorISt26random_access_iterator_tagciPKcRS1_EaSERKS4_basic_streambuf >reallocate__str_ZNSt14numeric_limitsIiE14min_exponent10E_ZNSt14numeric_limitsIfE14max_exponent10E__gthread_mutex_ttm_gmtoffptqh_first_ZNSt11char_traitsIcE6assignERcRKcu_int16_t_ZNSs5eraseEjj__size_typeis_signedgraphpthread_spin_tpartial_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2__ZNSt14numeric_limitsIlE5trapsE_Tag_ZN11_Is_integerIhEaSERKS0___gend_ZNSs7_M_dataEPc_ZNSt14numeric_limitsIiE12min_exponentEdateorder_ZNSt12codecvt_baseaSERKS__ZNSt10ctype_baseaSERKS__ZNSs5clearEv__state_type_Is_integerother_ZNSt14numeric_limitsIcE9is_signedE__distance_ZNSt14numeric_limitsIxE17has_signaling_NaNE_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_jc_M_facets_ZNKSs8capacityEv_ZNSt14numeric_limitsIiE14max_exponent10E_ZNSt14numeric_limitsIeE12max_exponentE_ZNSt11__ios_flags9_S_eofbitE_ZNSt14numeric_limitsIbE11round_styleE_M_index_ZNKSt6locale4nameEv_S_copy_chars_ZNSt14numeric_limitsIxE10has_denormE_ZN9clockinfoaSERKS__ZNSt11__ios_flags14_S_adjustfieldE_S_atomicity_lock_ZN13__type_traitsIeEaSERKS0__ZNSs4_Rep10_M_disposeERKSaIcEoperator()_ZNSt14numeric_limitsIeE10is_boundedEmon_groupingFLOAT__st_ZNSt14numeric_limitsItE3maxEv_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc_ZNSs6insertEjjc_ZNSt14numeric_limitsIeE3minEv_ZNSs4_Rep9_S_createEjRKSaIcE_ZNSt14numeric_limitsItE17has_signaling_NaNEfd_set_Is_integer_ZNSt14numeric_limitsIxE15tinyness_beforeE_ZNSt14numeric_limitsIhE9quiet_NaNEv_ZN13__type_traitsIwEaSERKS0__ZNSt14numeric_limitsIiE8is_exactE__int_type_ZNSs12_S_constructEjcRKSaIcE_ZNSt6locale5ctypeE__dummy_ZNSt14numeric_limitsIaE15tinyness_beforeEseekdir_ZNSt14numeric_limitsIwE11round_errorEv_S_construct_aux_ext_ZNSt6locale6globalERKS__blksize_ZNSt14numeric_limitsItE10is_boundedEseekoff_ZNSt14numeric_limitsIjE10denorm_minEv__len__intptr_t_ZNSs4_Rep10_M_refdataEvqaddr_t_M_coalesce_Is_integer_ZN11__true_typeaSERKS__M_grab_ZNSt14numeric_limitsIhE15has_denorm_lossEfpos<__mbstate_t>_ZNSt14numeric_limitsIsE12min_exponentE_ZNSt14numeric_limitsIfE5radixE_ZNSt14numeric_limitsImEaSERKS0__ZNK9dbstreams4cellrsERPKv_ZNSt14numeric_limitsIeE14is_specializedE_S_freelist_indexfailure_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE14_M_really_syncEjj__newoffooperator< , std::allocator >_ZTISt15basic_streambufIcSt11char_traitsIcEEis_boundeddev_t_ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEvspc_runtime_ZNSt14numeric_limitsIlE17has_signaling_NaNE_ZNSt14numeric_limitsIwE8infinityEv_ZNSt14numeric_limitsIjE5trapsE_ZNSo6sentryaSERKS_lwpid_tpaddr_t_ZNSt10money_base18_S_default_patternE_ZNSt14numeric_limitsIhE9is_signedE_S_free_list_S_heap_size_ZNSt14numeric_limitsIxE12min_exponentE_ZNSt14numeric_limitsIfE11round_styleE_ZNSt14numeric_limitsItE9is_iec559E__testboth_ZNSt11__ios_flags10_S_showposE_ZNSt14numeric_limitsItE9is_moduloEallocator_ZNSt14numeric_limitsIxE15has_denorm_lossE__float_u_ZNSt14numeric_limitsIsE10denorm_minEvfdlibm_posix_ZNKSs12find_last_ofEcj_ZNSt14_Refcount_Base7_M_decrEv_ZNSt14numeric_limitsIfE14is_specializedE_ZNSt14numeric_limitsIhE17has_signaling_NaNExallocfind_last_not_of_ZNSt14numeric_limitsIlE13signaling_NaNEv_ZNSt14numeric_limitsIbE8infinityEv_ZTSSt12domain_error_ZNSt14numeric_limitsIcE9quiet_NaNEv_ZNSt14numeric_limitsIbE12max_exponentElong long unsigned int_S_adjustfield_M_length_ZN21__pthread_spinlock_staSERKS_operator++_ZNSt14numeric_limitsIaE14min_exponent10E_ZNSt14numeric_limitsIiE3maxEvph_rlink_ZNSt24__default_alloc_templateILb1ELi0EEaSERKS0___wayslpqueno_order_ZNSt14numeric_limitsIlE15tinyness_beforeEpthread_barrierattr_t_ZNSt14numeric_limitsIaE12has_infinityE_ZNSt14numeric_limitsIiE5trapsEdtime_t_S_construct_ZNSt14numeric_limitsIdE17has_signaling_NaNE_ZNSt14numeric_limitsIxE11round_styleEoperator=denorm_absent_ZNSt14numeric_limitsIhE11round_styleE_ZNSt14numeric_limitsIaE9is_moduloE_ZNSt14numeric_limitsIsE15has_denorm_lossE__endo_ZNSt14numeric_limitsIyE10is_integerE_S_categories_sizeoperator*_ZNKSs5rfindEPKcjj_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_const_reverse_iterator_ZNKSt4fposI11__mbstate_tE5stateEvpta_flags__ostream_type_ZNSt14numeric_limitsIdE5radixE_ZNKSs13find_first_ofEPKcjj_ZN9dbstreams8metadata7bindery4copyERKS1___istream_typeptc_lock__dat_ZNKSs5beginEv_ZNSt14numeric_limitsIhE14max_exponent10Epos_type_ZNSt14numeric_limitsIfE12has_infinityE_ZNKSs8_M_checkEj_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv_ZNSt14numeric_limitsIjE9is_iec559E_ZNSt14numeric_limitsIwE13has_quiet_NaNE_ZNSt14numeric_limitsIxE8digits10E__pthread_spinlock_st_ZNSt14numeric_limitsIxE3maxEv_ZNSt14numeric_limitsImE10has_denormEuint_ZNSt14numeric_limitsIhE5trapsE_ZNSt14numeric_limitsIcE14max_exponent10E__pthread_condattr_st_ZNSt14numeric_limitsImE9is_signedE_ZNSt14numeric_limitsIjE11round_styleE_M_getloc_ZNSs4_Rep15_M_set_sharableEv_S_max_size_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3__ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZNSt14numeric_limitsIlE12max_exponentE_ZNSt14numeric_limitsIxE9quiet_NaNEvnative_datatype_ZNSt14numeric_limitsIwE10denorm_minEv__pthread_stoperator--print_M_leak_hard_ZN9dbstreams4cell6assignEPvi_ZNSt21__numeric_limits_base17has_signaling_NaNEpthread_rwlock_t_S_left_M_capacityoperator-=_ZN2tmaSERKS__ZNSt14numeric_limitsIiE10is_integerEstreampos_ZNSt14numeric_limitsIbE17has_signaling_NaNE_ZN13__type_traitsIyEaSERKS0_thatwchar_t_ZNSt4fposI11__mbstate_tE11_M_positionEl_M_ios_fmtflags_endpto_mutex_ZNSt14numeric_limitsIwE15tinyness_beforeE_ZNSt8ios_base13_M_grow_wordsEi_ZNKSs13find_first_ofERKSsjiterator_category_ZNSt8ios_base5fixedEpthread_spinlock_t__type_traits_ZNSt14numeric_limitsIdE9is_iec559E_ZNSt14numeric_limitsIdE9is_moduloE_ZN9__gnu_cxx17__normal_iteratorIPcSsEmIERKi_M_initialize_ZNSt14numeric_limitsIhE7epsilonEv_ZNSt11__ios_flagsaSERKS__ZNSt14numeric_limitsIlE11round_styleE_ZNKSs16find_last_not_ofEPKcjj_ZNSt21__numeric_limits_base9is_iec559E__pthread_mutex_st_ZNSt14numeric_limitsIaE10is_integerE_ZNSt21__numeric_limits_base9is_moduloE_ZNSt14numeric_limitsIyE10denorm_minEv__mode_titimerval__type_traitsnumeric_limitsph_linkpositive_signptb_generation_ZNSt8iteratorISt26random_access_iterator_tagciPcRcEaSERKS3___lhsnumeric_limits_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSsoperator==, std::allocator >_M_data_ZNSt10ctype_base5printEushort_ZNSt14numeric_limitsIbE5radixEoops_ZNSt14numeric_limitsIeE10has_denormE_ZNSt14numeric_limitsIbEaSERKS0__ZNKSs7_M_foldEjj_M_fn_S_ate_ZNSt14numeric_limitsIfE10denorm_minEvu_int64_t_ZNSt15_STL_mutex_lockaSERKS__ZNSt11__ios_flags11_S_internalE_ZNSt4fposI11__mbstate_tEmIEl_ZNSt14numeric_limitsIcE5radixE_ZNSs6insertEjPKcj_ZNSt14numeric_limitsIxE9is_signedE_ZNKSt6locale2id5_M_idEv_ZNSt14numeric_limitsIsE9quiet_NaNEv_M_client_data_ZNSt14numeric_limitsIfE8is_exactE_ZN11_Is_integerIxEaSERKS0__ZNSt14numeric_limitsIxE10is_boundedE_ZNSt10__num_base15_S_format_floatERKSt8ios_basePcci_ZNSt14numeric_limitsImE3maxEv_ZNSt14numeric_limitsIyE7epsilonEv__type_traits_ZNSt14numeric_limitsIeEaSERKS0_get_allocator_ZNKSs16find_last_not_ofERKSsj_ZNKSs4findEPKcjj_S_chunk_alloc_ZNK9__gnu_cxx17__normal_iteratorIPcSsEplERKi_ZNKSs7_M_iendEvallocator_ZNSt14numeric_limitsIsE5radixE_ZNSt10ctype_base5spaceE_ZNSt21__numeric_limits_base8digits10Eoff_type_ZNSt8ios_base4leftE_ZNSt14numeric_limitsIlE8infinityEv_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEaSERKS3__ZNK9__gnu_cxx17__normal_iteratorIPcSsEptEv_ZN9dbstreams4cellaSEd_ZN9dbstreams4cellaSEf_ZNSs4_Rep7_M_grabERKSaIcES2__S_local_word_size_ZNKSt8ios_base5widthEv_ZNSt14numeric_limitsIaE5radixE_ZN13__type_traitsIcEaSERKS0_~domain_error_ZNSt14numeric_limitsImE14min_exponent10Ecopy_value_ZTSSd_ZNSt6locale5_Impl18_M_check_same_nameEv~cell_ZNSt14numeric_limitsIiE9is_iec559E_ZNSt8ios_base6xallocEv_ZNSt8ios_base17_M_call_callbacksENS_5eventE_ZNSt14numeric_limitsIiE9is_moduloE_ZNSolsEf_ZNSt14numeric_limitsIlE7epsilonEv_ZNSt14numeric_limitsItEaSERKS0_const_pointer_Is_integerptqh_lastnumeric_limitsnumeric_limits_ZNSt14numeric_limitsIwE8is_exactEprochd_S_out_ZNSs4_Rep10_M_refcopyEv__int32_t_ZNSs13_S_copy_charsEPcS_S__ZNSt14numeric_limitsIjE3minEv_Refcount_Base_ZN13__type_traitsIlEaSERKS0__ZNSt24__default_alloc_templateILb1ELi0EE11_S_round_upEjlldiv_t_M_streambuf_state_ZNSt8ios_base6binaryE_S_format_int_write_ZNKSsixEjtv_secptr_rblockedtm_isdst_ZNSaIcE9constructEPcRKcsq_tailp_S_basefield_ZNSt21__numeric_limits_base13has_quiet_NaNE_S_terminal_S_global_ZN9dbstreams8metadata7varylenENS0_8datatypeE_ZNSt14numeric_limitsIwE6digitsEnumeric_limits_ZNKSs13get_allocatorEv__pthread_cond_stlower_M_ios_openmode_end_ZNSt14numeric_limitsIyE3maxEv_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPNS_5facetE_ZNSsixEj_ZNSt14numeric_limitsIwE9is_signedE_ZNSt8ios_base5rightEfdlibm_ieee_ZNSt14numeric_limitsIcE10is_boundedE_ZNSt14numeric_limitsIdE3minEv_ZNSt10ctype_base5alphaE_ZNSt14numeric_limitsIdE5trapsE__normal_iterator~basic_stringstream__testposo_ZNSt6locale11_M_coalesceERKS_S1_j_ZNSt14numeric_limitsIbE3maxEv__to_type_ZNSt11__ios_flags10_S_failbitEsizeuppts_magic__in_addr_t_ZNSt14numeric_limitsImE7epsilonEv__sa_family_t_ZNSt14numeric_limitsIcE14is_specializedEnative_type_ZN9__gnu_cxx17__normal_iteratorIPKcSsEaSERKS3___caddr_t_ZNSt14numeric_limitsIcE9is_moduloEptc_waiters_M_initialize_map_M_fill_initializeresetbits_ZNSt15_Deque_iteratorIiRKiPS0_EpLEi_ZNKSt5dequeIiSaIiEE5frontEv_M_allocate_nodemsgno__copy_aux2_ZNKSt5dequeIiSaIiEE6rbeginEv_Alloc_traits >_ZNSt17_Deque_alloc_baseIiSaIiELb1EE15_M_allocate_mapEj__copy_backward_input_normal_iterator, std::_Deque_iterator >__copy_backward_input_normal_iterator_ZNSt5dequeIiSaIiEE5clearEv_M_range_insert_aux >_ZNSt12__basic_fileIcE2fdEvsetstate_ZNSt14__simple_allocIPiSt24__default_alloc_templateILb1ELi0EEE10deallocateEPS0_j_M_reserve_elements_at_back__copy, std::_Deque_iterator >_M_open_modepush_front_ZNSt5dequeIiSaIiEE23_M_reserve_map_at_frontEj_ZNSt15_Deque_iteratorIiRKiPS0_EmmEv_ZNSt5dequeIiSaIiEE23_M_new_elements_at_backEj_ZNSt5dequeIiSaIiEE24_M_new_elements_at_frontEj_ZNSt5dequeIiSaIiEE17_M_push_front_auxERKi_ZNSt5dequeIiSaIiEE3endEv_ZNSaIiE7destroyEPi_ZNKSt15_Deque_iteratorIiRKiPS0_EptEvpop_back_ZN9dbstreams8dbstatus7fetchedENS0_7iostateEib_ZN9dbstreams8dbstatus5clearENS0_7iostateE_Alloc_traits >__copy_backward, std::_Deque_iterator >_ZNSt14__simple_allocIiSt24__default_alloc_templateILb1ELi0EEE10deallocateEPi~__basic_file_ZNSt11_Deque_baseIiSaIiEE17_M_initialize_mapEj_ZNSt5dequeIiSaIiEE14_M_fill_insertESt15_Deque_iteratorIiRiPiEjRKi__old_start_ZNSt15iterator_traitsIPiEaSERKS1__ZNKSt5dequeIiSaIiEE4sizeEv__iterator_category >__copy_ni1_ZNKSt15_Deque_iteratorIiRiPiEmiEi_ZNSt5dequeIiSaIiEE10push_frontERKicopy_backward__old_num_nodessys_open_ZNSt5dequeIiSaIiEE22_M_reserve_map_at_backEj_Deque_iterator_Alloc_type__node_offset_ZNK9dbstreams8dbstatus7rdstateEviterator_traits_ZN19_Is_normal_iteratorIPPiEaSERKS2_srcfile_M_map_size__trip_countxsputnrdstateprocedure_name__uninitialized_copy_copy, std::_Deque_iterator, std::_Deque_iterator >_ZNSt15_Deque_iteratorIiRKiPS0_E11_M_set_nodeEPPi__copy_backward_dispatch_S_buffer_size_ZNSt5dequeIiSaIiEE16_M_pop_front_auxEv_GLOBAL__D__ZN9dbstreams8dbstatusC2ERKSs_ZNK9dbstreams8dbstatusneEi_ZNSt5dequeIiSaIiEE14_S_buffer_sizeEv_ZNSt5dequeIiSaIiEE13_M_insert_auxESt15_Deque_iteratorIiRiPiERKi__num_elements_ZNSt24__copy_backward_dispatchISt15_Deque_iteratorIiRiPiES3_11__true_typeE4copyES3_S3_S3__M_new_elements_at_front_ZNSt5dequeIiSaIiEE5beginEv_S_instanceless_Self_Has_trivial_destructormsgstate_M_cfile_created_ZNSt5dequeIiSaIiEE5eraseESt15_Deque_iteratorIiRiPiEseverity_Distance_M_set_node__new_map_M_cfile_Is_POD_M_map_ZNSaIiE8allocateEjPKv__new_finishiterator_traits >servername_ZNK9dbstreams8dbstatusntEv_ZNSt11_Deque_baseIiSaIiEE15_M_create_nodesEPPiS3__ZNSt12__basic_fileIcE12_M_open_modeESt13_Ios_OpenmodeRiS2_Pc__type_traits_M_push_back_aux_ZNSt14__simple_allocIiSt24__default_alloc_templateILb1ELi0EEE8allocateEjuninitialized_copy, std::_Deque_iterator >_ZNSt5dequeIiSaIiEE6insertESt15_Deque_iteratorIiRiPiEjRKi_ZNSt14__simple_allocIiSt24__default_alloc_templateILb1ELi0EEE8allocateEv_ZNSt5dequeIiSaIiEE17_M_reallocate_mapEjb__new_nodes_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei_M_reserve_map_at_back_ZNSt12__basic_fileIcE5closeEv_M_push_front_aux_ZNSt5dequeIiSaIiEE4swapERS1___old_finish__priority_ZNK9dbstreams8dbstatus3badEv__curoperator-insert >__finish_n_ZNSt5dequeIiSaIiEE13_M_insert_auxISt15_Deque_iteratorIiRKiPS4_EEEvS3_IiRiPiET_SB_j_Map_pointer__elemsafter_ZNSt15iterator_traitsISt15_Deque_iteratorIiRKiPS1_EEaSERKS5___copy_backward_dispatch,std::_Deque_iterator,__true_type>_ZNSaIiE10deallocateEPij_ZNSt12__basic_fileIcE7seekposElSt13_Ios_Openmode_ZNKSt5dequeIiSaIiEE8max_sizeEv_Alloc_traits_ZNSaIiE9constructEPiRKi_ZNSt15_Deque_iteratorIiRKiPS0_EppEi_ZNSt15_Deque_iteratorIiRiPiEmmEv_ZNSt15_Deque_iteratorIiRiPiE11_M_set_nodeEPS1__ZNSt5dequeIiSaIiEE9pop_frontEv__uninitialized_copy_copy, std::_Deque_iterator, std::_Deque_iterator >__copy_aux2, std::_Deque_iterator >_ZNK9dbstreams8dbstatuseqENS0_7iostateE_ZNSt5dequeIiSaIiEE5eraseESt15_Deque_iteratorIiRiPiES5_xsgetnfetched__uninitialized_copy_aux, std::_Deque_iterator >_ZNSt11_Deque_baseIiSaIiEE16_M_destroy_nodesEPPiS3___copy_ni1, std::_Deque_iterator >showmanyc_helper__copy_ni1, std::_Deque_iterator >_ZNSt15_Deque_iteratorIiRiPiEpLEiiterator_traitspop_front_ZNSt13_Alloc_traitsIiSaIiEEaSERKS1_ignoringline_number_ValueType_ZSt4findISt15_Deque_iteratorIiRKiPS1_EiET_S5_S5_RKT0_St26random_access_iterator_tag_ZNSt5dequeIiSaIiEE6rbeginEv_M_nodeignore__copy_backward_aux, std::_Deque_iterator >_ZNKSaIiE7addressERKi_ZNSt15_Deque_iteratorIiRKiPS0_EppEv_ZNKSt5dequeIiSaIiEE14_M_range_checkEj__new_elems_Is_normal_iterator_ZNSt5dequeIiSaIiEE6assignEjRKi_ZNSt13_Alloc_traitsIiSaIiEE15_S_instancelessE__num_nodes_ZNSt12__basic_fileIcE10sys_ungetcEi__copy_backward_output_normal_iteratorreverse_iterator >__copy_trivial_Is_normal_iteratordriver_function_ZNSt15_Deque_iteratorIiRiPiEppEi__mid_ZNSt17_Deque_alloc_baseIiSaIiELb1EE16_M_allocate_nodeEv_M_reserve_elements_at_front_M_lastos_error_ZNKSt15_Deque_iteratorIiRKiPS0_EixEi__i1__i2_ZNSt15iterator_traitsISt15_Deque_iteratorIiRiPiEEaSERKS4_operator!_ZNSt15_Deque_iteratorIiRKiPS0_EmIEi_ZNKSaIiE7addressERi_ZN9dbstreams8dbstatus8setstateENS0_7iostateE_Is_integer >_ZNSt5dequeIiSaIiEE6insertESt15_Deque_iteratorIiRiPiERKisrcline_ZNSt5dequeIiSaIiEE27_M_reserve_elements_at_backEj_M_fill_assign_ZNSt15_Deque_iteratorIiRKiPS0_E14_S_buffer_sizeEv_ZNSt17_Deque_alloc_baseIiSaIiELb1EE18_M_deallocate_nodeEPi_ZNSt14__simple_allocIPiSt24__default_alloc_templateILb1ELi0EEE10deallocateEPS0__ZNSt12__basic_fileIcE8sys_openEP7__sFILESt13_Ios_Openmode_Node_alloc_type_ZNK9dbstreams8dbstatuscvPvEv_ZN9dbstreams8dbstatus5resetENS0_7iostateE_Deque_iterator_ZNSt24__copy_backward_dispatchISt15_Deque_iteratorIiRiPiES3_11__true_typeEaSERKS5__ZNKSt15_Deque_iteratorIiRKiPS0_EplEi_Destroy >operator!=__new_map_size__destroy_aux >_ZN19_Is_normal_iteratorISt15_Deque_iteratorIiRiPiEEaSERKS4_good_ZNSt12__basic_fileIcE6xsgetnEPci_ZNSt24__copy_backward_dispatchIPPiS1_11__true_typeE4copyEPKS0_S5_S1__ZNSt5dequeIiSaIiEE6resizeEj_ZNSt14__simple_allocIiSt24__default_alloc_templateILb1ELi0EEEaSERKS2__ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmodeb__copy_ni2_ZNSt14__simple_allocIPiSt24__default_alloc_templateILb1ELi0EEE8allocateEv_ZNKSt15_Deque_iteratorIiRKiPS0_EdeEv_M_reallocate_map_M_create_nodes_ZNSt14__simple_allocIiSt24__default_alloc_templateILb1ELi0EEE10deallocateEPij__first1__c_lock__uninitialized_copy_aux, std::_Deque_iterator >_M_range_checkfind, int>is_open_Deque_base >__ioinituninitialized_copy, std::_Deque_iterator >_ZNKSt15_Deque_iteratorIiRiPiEdeEv_Value_type_ZNSaIiEaSERKS___deque_buf_size__copy_ni2, std::_Deque_iterator >_ZNKSt15_Deque_iteratorIiRiPiEptEv_ZNSt15_Deque_iteratorIiRiPiE14_S_buffer_sizeEvreset_ZNKSt5dequeIiSaIiEE4backEv_ZNKSt5dequeIiSaIiEEixEj_M_cur_ZNSt15_Deque_iteratorIiRiPiEaSERKS2__ZTIN9dbstreams8dbstatusE_ZNK9dbstreams8dbstatusneENS0_7iostateE__add_at_front_ZN9dbstreams8dbstatus6ignoreEiquit_Deque_alloc_base_ZNSt15_Deque_iteratorIiRiPiEmIEi_M_first__copy_ni2, std::_Deque_iterator >_ZNSt5dequeIiSaIiEE4rendEv_ZNSt14__simple_allocIPiSt24__default_alloc_templateILb1ELi0EEE8allocateEj__last2_M_pop_back_aux_ZNSt5dequeIiSaIiEE18_M_fill_initializeERKi__node_ZNKSt5dequeIiSaIiEE3endEv__vacanciescopy_ZNSt15_Deque_iteratorIiRiPiEppEv_ZNSt17_Deque_alloc_baseIiSaIiELb1EEaSERKS1__ZNSt5dequeIiSaIiEE28_M_reserve_elements_at_frontEj_IterCategorysys_ungetc__offset_GLOBAL__I__ZN9dbstreams8dbstatusC2ERKSs__first2_ZNKSt5dequeIiSaIiEE4rendEv~_Deque_base__initialize_p__c_file_ZNSt12__basic_fileIcE4syncEv_ZNSt24__copy_backward_dispatchIPPiS1_11__true_typeEaSERKS3_make_ready_ZNSt12__basic_fileIcE6xsputnEPKci__copy_aux2, std::_Deque_iterator >_ZNK9dbstreams8dbstatus3eofEvoperator void*__copy_backward_dispatch__copy_backward_output_normal_iterator, std::_Deque_iterator >_M_deallocate_nodewhat_ZNKSt15_Deque_iteratorIiRiPiEplEi_M_destroy_nodes_M_allocate_map_ZN9dbstreams8dbstatusaSERKS0___elemsbeforedbstatus.Creverse_iterator >_ZNK9dbstreams8dbstatus6ignoreEv_M_finishignore_list_ZNKSt17_Deque_alloc_baseIiSaIiELb1EE13get_allocatorEv__Normal_ZNKSaIiE8max_sizeEv_ZNSt15_Deque_iteratorIiRKiPS0_EaSERKS3__ZNSt12__basic_fileIcE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode__nodes_to_add_Deque_iterator_M_insert_aux_ZNSt15_Deque_iteratorIiRiPiEmmEi_ZNKSt15_Deque_iteratorIiRKiPS0_EmiEinotify__distance >_ZNKSt12__basic_fileIcE7is_openEv_ZlsRSoRKN9dbstreams8dbstatusE_ZNSt5dequeIiSaIiEE9push_backERKi_ZNK9dbstreams8dbstatus9resetbitsEv_ZNSt5dequeIiSaIiEE19_M_range_insert_auxISt15_Deque_iteratorIiRKiPS4_EEEvS3_IiRiPiET_SB_St20forward_iterator_tag~deque_ZNKSt5dequeIiSaIiEE5beginEv_ZNSt5dequeIiSaIiEE16_M_push_back_auxERKi__new_num_nodes_ZN9dbstreams8dbstatusaSEi_ZNSt5dequeIiSaIiEEixEj__start_n__advance, int>_ZNK9dbstreams8dbstatus4whatEv_ZNSt12__basic_fileIcE16showmanyc_helperEv_ZN11_Is_integerISt15_Deque_iteratorIiRKiPS1_EEaSERKS5___simple_alloc >_Map_alloc_type_ZN9dbstreams8dbstatus4quitEv_ZNKSt5dequeIiSaIiEE13get_allocatorEv_M_fill_insert_ZTSN9dbstreams8dbstatusE_ZNSt15iterator_traitsIPPiEaSERKS2__ZNSt14__simple_allocIPiSt24__default_alloc_templateILb1ELi0EEEaSERKS3__Num__last1_ZNKSt15_Deque_iteratorIiRiPiEixEi_ZNSt5dequeIiSaIiEE5frontEv_ZNK9dbstreams8dbstatus6notifyERSo_ZNSt5dequeIiSaIiEE8pop_backEv__new_nstart_ZN9dbstreams8dbstatusaSERKSs__elems_before_ZlsRSoRKN9dbstreams8dbstatus7iostateE_Is_normal_iterator >_ZNSt11_Deque_baseIiSaIiEEaSERKS1__ZN13__type_traitsIPiEaSERKS1__M_start_ZNSt5dequeIiSaIiEE4backEv_Trivial_ZNK9dbstreams8dbstatuseqEi_M_reserve_map_at_front__new_startnrowssys_getcallocator_ZNKSt5dequeIiSaIiEE5emptyEvoperator==_M_insert_aux >_ZNSt5dequeIiSaIiEE15_M_pop_back_auxEv_ZNKSt5dequeIiSaIiEE2atEj_ZNSt15_Deque_iteratorIiRKiPS0_EmmEi_ZNSt12__basic_fileIcEaSERKS0__ZN9dbstreams8dbstatus6ignoreERKSt5dequeIiSaIiEE_ZNSt5dequeIiSaIiEE13_M_insert_auxESt15_Deque_iteratorIiRiPiEjRKi_ZN9dbstreams8dbstatus10make_readyEvallocator__basic_file_ZNSt12__basic_fileIcE8sys_getcEv__simple_alloc >operator-_ZNSt5dequeIiSaIiEE2atEj__iterator_category >_M_deallocate_mapiterator_traits >_ZNSt5dequeIiSaIiEE14_M_fill_assignEjRKi__nstart__length_ZN19_Is_normal_iteratorISt15_Deque_iteratorIiRKiPS1_EEaSERKS5___simple_alloc__nfinish_ZNSt17_Deque_alloc_baseIiSaIiELb1EE17_M_deallocate_mapEPPij__copy_backward_aux~dbstatus__copy, std::_Deque_iterator >_ZNSt13_Alloc_traitsIPiSaIiEEaSERKS2_deque >_M_insert_dispatch >_ZNSt5dequeIiSaIiEEaSERKS1__Is_normal_iterator >__new_node_ZNK9dbstreams8dbstatus4goodEv__static_initialization_and_destruction_0_ZNK9dbstreams8dbstatus4failEv_M_new_elements_at_back_ZNSt13_Alloc_traitsIPiSaIiEE15_S_instancelessE_M_pop_front_aux_ZNSt5dequeIiSaIiEE6resizeEjRKi_Deque_alloc_base,true>connection_map_M_parentwszArg_ZN9dbstreams9providers16parameter_binderaSERKS1_DBSTRING_S_maximum_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE2atEj_ZN9dbstreams7drivers4odbc17tagSQL_DAY_SECONDaSERKS2__ZNSt17_Deque_alloc_baseIN9dbstreams4cellESaIS1_ELb1EEaSERKS3_DBMONEY4_ZNSt6vectorIN9dbstreams4cellESaIS1_EE5beginEv_ZNSt13_Alloc_traitsIPN9dbstreams4cellESaIS1_EEaSERKS4_SQL_IS_YEARparameterspass_through_ZNSt6vectorIN9dbstreams4cellESaIS1_EE3endEv_ZNSt6vectorIN9dbstreams4cellESaIS1_EE5frontEvinput_ZNKSt14_Bit_referencecvbEvDBCOLDBCURSORSQL_IS_HOUR_TO_SECOND_ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EppEv_ZNSt5dequeIN9dbstreams4cellESaIS1_EE15_M_pop_back_auxEv_ZNKSt18_Bit_iterator_baseltERKS_strtext_ZNSt14__simple_allocIPN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEEaSERKS5_lowordreverse_iterator >_ZN9dbstreams9providers10dblib_impl11switchboard5closeEP19tds_dblib_dbprocess_ZNKSt18_Bit_iterator_baseleERKS__ZNSt5dequeIN9dbstreams4cellESaIS1_EE16_M_push_back_auxERKS1__ZNSt5dequeIN9dbstreams4cellESaIS1_EE9pop_frontEvpair_ZN9dbstreams5query4modeENS0_7sepmodeESs_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE13get_allocatorEvDBXLATESTATUSdbstring_ZN9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEaSERKS7__ZNSt13_Bit_iteratorpLEiDBNUMERICdatetzoneconnections._21SQLINTERVALdatesecond_ZN9dbstreams13dbstream_data7nullifyERSsBYTEfractionsqlite3_stmt_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE13get_allocatorEvSQL_IS_HOUR_TO_MINUTE_ZN9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEppEi_ZNSt19_Bit_const_iteratorppEiinterval_sign_ZNKSt14_Bit_referenceeqERKS__ZNSt6vectorIN9dbstreams4cellESaIS1_EE4rendEvdatedyearmessage_ZNSt6vectorIN9dbstreams4cellESaIS1_EE5eraseEN9__gnu_cxx17__normal_iteratorIPS1_S3_EES7_SQL_YEAR_MONTH_STRUCT_M_decrement_ZNKSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EixEi_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE5frontEv_ZNKSt18_Vector_alloc_baseIN9dbstreams4cellESaIS1_ELb1EE13get_allocatorEv_ZNKSt19_Bit_const_iteratordeEvinsertmode_ZN9dbstreams9providers10dblib_impl11switchboardaSERKS2__ZNSt5dequeIN9dbstreams4cellESaIS1_EE9push_backERKS1_DBTYPEINFO_Deque_alloc_base,true>_M_rightmny4tagSQL_DAY_SECOND_ZNK9dbstreams9providers8urhandle7sqlite3Ev_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE14_M_range_checkEjtds_dblib_loginrec_ZNSt14_Bit_referenceaSEb__simple_alloc >_ZNK9dbstreams5query5tableEv_ZNSt5dequeIN9dbstreams4cellESaIS1_EE5frontEv_ZNKSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EdeEv_ZNSt14__simple_allocIN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEE8allocateEviterator_ZNSt5dequeIN9dbstreams4cellESaIS1_EE5eraseESt15_Deque_iteratorIS1_RS1_PS1_ES7__ZN9dbstreams9providers10dblib_impl13provider_base11initializeraSERKS3__ZNKSaIN9dbstreams4cellEE7addressERKS0__ZNKSt5dequeIN9dbstreams4cellESaIS1_EE14_M_range_checkEj_ZNSt22_Rb_tree_base_iteratoraSERKS_DBVOIDPTR_ZNSt5dequeIN9dbstreams4cellESaIS1_EE24_M_new_elements_at_frontEj_ZNSt11_Deque_baseIN9dbstreams4cellESaIS1_EEaSERKS3_WCHARthis_dummy_member_must_be_first_M_black_ZNKSt6vectorIN9dbstreams4cellESaIS1_EEixEj_ZN9dbdaterecaSERKS_pairDB_DBCHKINTR_FUNCoperator<=sqlite3_value_ZNSt5dequeIN9dbstreams4cellESaIS1_EE22_M_reserve_map_at_backEj_ZN9dbstreams9providers10dblib_impl11switchboard5errorEP19tds_dblib_dbprocessRKNS_8dbstatusE_ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EppEiparameter_type_ZN13__type_traitsIN9dbstreams4cellEEaSERKS2__ZNKSaIN9dbstreams4cellEE8max_sizeEvpguidEventDBFLT8Scale_ZNSaIN9dbstreams4cellEEaSERKS1__ZNKSt6vectorIN9dbstreams4cellESaIS1_EE8capacityEvSQL_IS_DAY_TO_HOURsqlite3_context_ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EmIEicopy_cell_value_ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_E11_M_set_nodeEPS3_sqlmodesqlite_int64reverse_iterator<__gnu_cxx::__normal_iterator > > >DB_DBIDLE_FUNC_ZNSt11_Deque_baseIN9dbstreams4cellESaIS1_EE17_M_initialize_mapEjSQL_IS_HOURtagSQL_INTERVAL_STRUCT_ZNK9dbstreams9providers8urhandle6dbprocEvicol_Deque_iterator_ZNSt5dequeIN9dbstreams4cellESaIS1_EE5beginEv_ZNK9dbstreams9providers8urhandle4typeEvflip_ZNSt5dequeIN9dbstreams4cellESaIS1_EE6insertESt15_Deque_iteratorIS1_RS1_PS1_EjRKS1_CI_TYPE_ZN9dbstreams5query20end_insert_statementEvDB_DBHNDLINTR_FUNC_ZNSt18_Rb_tree_node_base10_S_minimumEPS__Bit_type_M_bump_up_ZN9dbstreams9providers16parameter_binder4bindERKNS_4cellE_ZNSt17_Deque_alloc_baseIN9dbstreams4cellESaIS1_ELb1EE15_M_allocate_mapEj_M_offsetActualName_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE4sizeEvDBBINARY~provider_data_ZNSt6vectorIN9dbstreams4cellESaIS1_EE4backEv_ZNK9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEixERKi_ZNSt5dequeIN9dbstreams4cellESaIS1_EE6assignEjRKS1__ZNSt6vectorIN9dbstreams4cellESaIS1_EE9push_backERKS1__ZNKSt6vectorIN9dbstreams4cellESaIS1_EE8max_sizeEvMaxLength_ZNSt14_Bit_reference4flipEv_ZNKSt18_Bit_iterator_basegtERKS_prior_procs_tDBUSMALLINT~vector_ZNSt8iteratorISt26random_access_iterator_tagN9dbstreams4cellEiPS2_RS2_EaSERKS5_hiword~initializerDBTINYINT_ZNSt6vectorIN9dbstreams4cellESaIS1_EE6rbeginEvDWORD__normal_iterator > >SQL_IS_DAY_TO_MINUTE_ZN9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEppEiparse_provider_name_M_coloriterator_ZN9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEppEvdbtypeinfo_ZNSt6vectorIN9dbstreams4cellESaIS1_EE6assignEjRKS1_MHANDLEFUNC_ZN9dbstreams13provider_data3logEPSo_ZNSt5dequeIN9dbstreams4cellESaIS1_EE10push_frontERKS1__ZNSt5dequeIN9dbstreams4cellESaIS1_EE14_M_fill_insertESt15_Deque_iteratorIS1_RS1_PS1_EjRKS1_DBPROCESSNONEdatemsecond_ZNSt13_Bit_iteratorixEi_ZNSt14__simple_allocIPN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS2_jinterval_type_ZN9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEpLERKiSQL_IS_DAY_TO_SECOND_ZNSt6vectorIN9dbstreams4cellESaIS1_EE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPS1_S3_EEjRKS1_iterator_traits_ZNSt6vectorIN9dbstreams4cellESaIS1_EE7reserveEj_ZNSt5dequeIN9dbstreams4cellESaIS1_EE6resizeEjRKS1__ZNSt6vectorIN9dbstreams4cellESaIS1_EE6insertEN9__gnu_cxx17__normal_iteratorIPS1_S3_EEjRKS1__ZNSt6vectorIN9dbstreams4cellESaIS1_EE6resizeEjRKS1_DBDECIMAL_ZN9dbstreams9providers16parameter_binderclERKNS_4cellENullDB_DBBUSY_FUNC_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE5frontEvDBVARYCHARtagDATE_STRUCT_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE4rendEvdbproc._19CaseSensitivevector >_ZN9dbstreams5query15copy_cell_valueERKNS_4cellERS1__ZNSt14__simple_allocIN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS1__ZNSt18_Vector_alloc_baseIN9dbstreams4cellESaIS1_ELb1EE11_M_allocateEjData1Data2Data3Data4provider_basehandle_t_ZNK9dbstreams9providers8urhandlecvPKvEvmeta_ZNKSt19_Bit_const_iteratormiEi_ZNK9dbstreams9providers8urhandle6handleEv~param_finder_ZN9dbstreams7drivers4odbc14tagDATE_STRUCTaSERKS2_TDS_SYS_SOCKET_ZN9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEmIERKi_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE3endEv_ZNSt22_Rb_tree_base_iterator12_M_incrementEv_ZNSt6vectorIN9dbstreams4cellESaIS1_EE2atEjtablename_ZNSt18_Rb_tree_node_baseaSERKS_bcpmodedbdaterec_ZNSt18_Vector_alloc_baseIN9dbstreams4cellESaIS1_ELb1EEaSERKS3__ZNSt5dequeIN9dbstreams4cellESaIS1_EE18_M_fill_initializeERKS1_add_separator_ZNKSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EmiEi_ZNSt5dequeIN9dbstreams4cellESaIS1_EE8pop_backEv_ZNSt6vectorIN9dbstreams4cellESaIS1_EE8pop_backEvSQL_IS_MONTHcolnamestrtotlen__simple_alloc >operator const void*operator>=SQL_IS_DAY_ZNSt5dequeIN9dbstreams4cellESaIS1_EE4rendEv_ZTIPKcvector_type_ZNSt15iterator_traitsISt15_Deque_iteratorIN9dbstreams4cellERS2_PS2_EEaSERKS6_._25~loginparameter_binder_Bit_reference_ZN10dbtypeinfoaSERKS_SizeOfStructtagTIMESTAMP_STRUCT_Alloc_traits >_ZN9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEpLERKi_ZNSaIN9dbstreams4cellEE9constructEPS0_RKS0_allocator_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE2atEj_ZNSt5dequeIN9dbstreams4cellESaIS1_EE6insertESt15_Deque_iteratorIS1_RS1_PS1_ERKS1__ZNSt18_Bit_iterator_base10_M_bump_upEv_ZNKSaIN9dbstreams4cellEE7addressERS0__ZNK9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEdeEv_ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EaSERKS4__ZNSt6vectorIN9dbstreams4cellESaIS1_EEaSERKS3__ZN9dbstreams9providers10dblib_impl11switchboard7messageEP19tds_dblib_dbprocessRKNS_8dbstatusE_ZNSaIN9dbstreams4cellEE8allocateEjPKvtagSQL_NUMERIC_STRUCT_ZN9dbstreams5query8check_wsclEc_ZN9dbstreams5query3logEPSo_ZNKSt18_Bit_iterator_basegeERKS__ZNSt11_Deque_baseIN9dbstreams4cellESaIS1_EE15_M_create_nodesEPPS1_S5__Bit_iterator_ZN9dbstreams5query6fiddleEvEHANDLEFUNC_ZNSt11_Deque_baseIN9dbstreams4cellESaIS1_EE16_M_destroy_nodesEPPS1_S5_operator>mnylow_ZNKSt18_Bit_iterator_baseneERKS_sepmodeODBC_Rb_tree_color_ZNSt13_Alloc_traitsIN9dbstreams4cellESaIS1_EEaSERKS3__ZNSt5dequeIN9dbstreams4cellESaIS1_EE13_M_insert_auxESt15_Deque_iteratorIS1_RS1_PS1_EjRKS1__ZNK9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEptEvprior_procsrcsid_sybdb_hparameter_list_type_ZN9dbstreams9providers10dblib_impl11switchboard4openEPNS1_13provider_baseEP18tds_dblib_loginrecRKSs_ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EmmEiusername_Rb_tree_base_iteratoreoprovsfiddleiterator_traitsDBBOOL_ZN9dbstreams7drivers4odbc14tagTIME_STRUCTaSERKS2_wszCorrelationstrnext_ZNSt6vectorIN9dbstreams4cellESaIS1_EE5clearEv_ZN9dbstreams9providers8urhandle6handleEP19tds_dblib_dbprocessurhandleSQLUINTEGER_GLOBAL__I__ZN9dbstreams19parse_provider_nameERKSsPSt4pairIjjE_ZNK9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEmiERKi_ZNSt19_Bit_const_iteratormmEi_ZTIN9dbstreams4cellE_Bit_iterator_base_ZNSt13_Bit_iteratormIEi_ZNSt14__simple_allocIN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEE8allocateEjminutes_ZN9dbstreams13provider_dataaSERKS0__Deque_base >_M_red_ZNSt17_Deque_alloc_baseIN9dbstreams4cellESaIS1_ELb1EE18_M_deallocate_nodeEPS1_day_second_ZNK9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEmiERKi._18_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE4rendEv_ZNSt17_Deque_alloc_baseIN9dbstreams4cellESaIS1_ELb1EE17_M_deallocate_mapEPPS1_j_ZNSt5dequeIN9dbstreams4cellESaIS1_EE13_M_insert_auxESt15_Deque_iteratorIS1_RS1_PS1_ERKS1__ZNSt13_Bit_iteratorppEiDBMONEYwhere_ZNK9dbstreams5query12param_finderclERKNS_4cellE_ZNSt13_Bit_iteratorppEvDBSMALLINTdbstream.C_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE6rbeginEv._20._22._29__normal_iterator > >_ZN9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEmmEidatemonth_ZNSt6vectorIN9dbstreams4cellESaIS1_EE6insertEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_dttime_ZNSt5dequeIN9dbstreams4cellESaIS1_EE3endEv_ZN9dbstreams5loginaSERKS0__ZNK9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEixERKi_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE4backEv_ZNSt5dequeIN9dbstreams4cellESaIS1_EE4swapERS3_end_insert_statement_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE8max_sizeEv_ZNSt5dequeIN9dbstreams4cellESaIS1_EE5clearEv_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE5beginEv_ZN9dbstreams13dbstream_dataaSERKS0_DBWAITFUNCSQLITEreverse_iterator<__gnu_cxx::__normal_iterator > > >_ZNKSt5dequeIN9dbstreams4cellESaIS1_EEixEj_ZN9dbstreams5querylsEPFRS0_S1_EVarLength_ZNKSt18_Bit_iterator_baseeqERKS__M_left_ZNK9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEdeEvSQLCHARparameter_list_ZNSt14_Bit_referenceaSERKS_USHORT_ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_E14_S_buffer_sizeEv_Alloc_traits >_M_deallocatesecond_typeIdentity_ZNK9dbstreams13provider_data4metaEidwFlagsDBDATEREC_ZNSt5dequeIN9dbstreams4cellESaIS1_EE14_S_buffer_sizeEvSQL_IS_YEAR_TO_MONTH_ZNSt5dequeIN9dbstreams4cellESaIS1_EE23_M_new_elements_at_backEj_ZNSt19_Bit_const_iteratormmEv_Vector_base >year_month~query_ZNSt6vectorIN9dbstreams4cellESaIS1_EE6resizeEjRetCode_ZNSt5dequeIN9dbstreams4cellESaIS1_EEaSERKS3_~mode_statusresult_status__bigint_struct_u_ZNSt19_Bit_const_iteratormIEi_ZNSt18_Rb_tree_node_base10_S_maximumEPS__ZNSt14__simple_allocIPN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS2__ZNKSt6vectorIN9dbstreams4cellESaIS1_EE6rbeginEvCI_ALTERNATE_ZNSt5dequeIN9dbstreams4cellESaIS1_EE4backEv_ZN9dbstreams7drivers4odbc21tagSQL_NUMERIC_STRUCTaSERKS2__ZNK9dbstreams5query14parameter_listEv_ZN9dbstreams7drivers4odbc17__bigint_struct_uaSERKS2__ZNSt15iterator_traitsIPN9dbstreams4cellEEaSERKS3_tagSQL_YEAR_MONTH_ZN9dbstreams7drivers4odbc10tagSQLGUIDaSERKS2__ZN9dbstreams7drivers4odbc19tagTIMESTAMP_STRUCTaSERKS2__ZNSaIN9dbstreams4cellEE10deallocateEPS0_j_ZNSt18_Vector_alloc_baseIN9dbstreams4cellESaIS1_ELb1EE13_M_deallocateEPS1_j_ZNSt5dequeIN9dbstreams4cellESaIS1_EEixEj_ZN9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEmmEv_ZNSt5dequeIN9dbstreams4cellESaIS1_EE5eraseESt15_Deque_iteratorIS1_RS1_PS1_E_ZNSt19_Bit_const_iteratorppEv._28_Bit_const_iterator_ZN9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEppEv$Id: sybdb.h,v 1.85 2007/12/02 23:01:37 jklowden Exp $prepare_insert_element_ZN9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEaSERKS8_DBDATETIME4_ZN9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEmmEi_ZNSt15iterator_traitsIPKN9dbstreams4cellEEaSERKS4__ZNSt4pairIjjEaSERKS0_datedmonthmode_state_ZNSt13_Alloc_traitsIN9dbstreams4cellESaIS1_EE15_S_instancelessE_ZNSt13_Alloc_traitsIPN9dbstreams4cellESaIS1_EE15_S_instancelessE_ZNSt8iteratorISt26random_access_iterator_tagbiPbRbEaSERKS3__ZN9dbstreams9providers10dblib_impl11switchboard13prior_procs_taSERKS3__ZNSt18_Bit_iterator_base12_M_bump_downEv_Vector_alloc_base,true>_ZNSt14__simple_allocIPN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEE8allocateEj_Deque_iteratorSQL_IS_SECOND_ZNSt19_Bit_const_iteratorpLEiDBINT._17_ZN9dbstreams9providers8urhandleaSERKS1__ZNK9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEE4baseEv_ZNSt19_Bit_const_iteratorixEi_M_end_of_storage_ZN9dbstreams5queryaSERKS0__ZNSt6vectorIN9dbstreams4cellESaIS1_EE5eraseEN9__gnu_cxx17__normal_iteratorIPS1_S3_EE_ZNKSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EptEv_ZNSt12_Vector_baseIN9dbstreams4cellESaIS1_EEaSERKS3_map,std::allocator > >_ZNSt17_Deque_alloc_baseIN9dbstreams4cellESaIS1_ELb1EE16_M_allocate_nodeEv_ZNSt6vectorIN9dbstreams4cellESaIS1_EE14_M_fill_assignEjRKS1__ZNK9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEE4baseEv_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE5beginEv_M_incrementSQL_IS_MINUTE_TO_SECONDiterator_traits >_ZN9dbstreams5query22prepare_insert_elementEi__pointer_type_info_pseudoUpdatable_ZN9dbstreams7drivers4odbc22tagSQL_INTERVAL_STRUCTaSERKS2__ZNSt5dequeIN9dbstreams4cellESaIS1_EE16_M_pop_front_auxEvdeque >_ZNK9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEplERKiSQL_IS_MINUTE_ZNK9dbstreams5query6statusEv_ZN9dbstreams5query12param_finderaSERKS1_sqlite_uint64_ZNKSt13_Bit_iteratorplEiCI_REGULAR_ZNK9dbstreams5query3strEv_ZNSt5dequeIN9dbstreams4cellESaIS1_EE17_M_push_front_auxERKS1__ZNSt6vectorIN9dbstreams4cellESaIS1_EE4swapERS3_DBLIB_ZNSt13_Bit_iteratoraSERKS__ZN9dbstreams9providers10dblib_impl11switchboard11prior_procsE_ZN9dbstreams7drivers4odbc17tagSQL_YEAR_MONTHaSERKS2__M_allocate_ZN9dbstreams7drivers4odbc15tagODBC_VS_ARGSaSERKS2__ZN9dbstreams5query11mode_statusaSERKS1__ZNKSt5dequeIN9dbstreams4cellESaIS1_EE4sizeEv._30tagSQLGUID_ZNK9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEplERKi_ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EmmEvUserType_S_minimum_ZNKSt13_Bit_iteratordeEvscale_ZNSt19_Bit_const_iteratoraSERKS_dateminute_ZNKSt6vectorIN9dbstreams4cellESaIS1_EE5emptyEv_ZNSt8iteratorISt26random_access_iterator_tagN9dbstreams4cellEiPKS2_RS3_EaSERKS6_SQLSCHAR_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE5emptyEv_ZNSt6vectorIN9dbstreams4cellESaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1__ZN9dbstreams5query6statusEi~switchboard_ZN9dbstreams7drivers4odbc15__bigint_structaSERKS2__ZNSt14__simple_allocIPN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEE8allocateEvprovider_typeLOGINREC_ZN9dbstreams1paSERKS0__ZN9dbstreams5query5resetEv_M_maskva_listSQL_DAY_SECOND_STRUCTsqlite3_callback_ZN9dbstreams5query5tableERKSs_M_bump_down_Vector_alloc_basedateyearDBLOGINFOsqlite_handledatehour_ZN9__gnu_cxx17__normal_iteratorIPN9dbstreams4cellESt6vectorIS2_SaIS2_EEEmmEv_ZNK9dbstreams5query4modeEvcheck_ws_ZNSt5dequeIN9dbstreams4cellESaIS1_EE28_M_reserve_elements_at_frontEj_ZNSt14__simple_allocIN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEEaSERKS4__ZNSt5dequeIN9dbstreams4cellESaIS1_EE14_M_fill_assignEjRKS1_tagODBC_VS_ARGSiterator~dbstream_datamnyhigheat_separatorprov_tintval_ZNSt5dequeIN9dbstreams4cellESaIS1_EE2atEj~_Vector_base_ZNSt5dequeIN9dbstreams4cellESaIS1_EE6resizeEjSQLUSMALLINTDBCHAR_ZN9dbstreams9providers8urhandle5resetEv_ZN9dbstreams9providers8urhandle8handle_taSERKS2_nullifyreverse_iterator >_ZNSt6vectorIN9dbstreams4cellESaIS1_EEixEj_ZNSt5dequeIN9dbstreams4cellESaIS1_EE23_M_reserve_map_at_frontEj_ZNSt5dequeIN9dbstreams4cellESaIS1_EE27_M_reserve_elements_at_backEjenquotetagTIME_STRUCT_ZN9dbstreams1caSERKS0__ZNSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EpLEiDBREAL_ZNSt5dequeIN9dbstreams4cellESaIS1_EE17_M_reallocate_mapEjb_ZNKSt19_Bit_const_iteratorplEiDBSORTORDER_ZNSt22_Rb_tree_base_iterator12_M_decrementEv_ZN9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEmIERKi_ZNKSt17_Deque_alloc_baseIN9dbstreams4cellESaIS1_ELb1EE13get_allocatorEvpparam_ZN9dbstreams5queryaSERKSs__type_traits_ZN9dbstreams5query8check_wsaSERKS1__ZNKSt5dequeIN9dbstreams4cellESaIS1_EE4backEvfirst_type_ZNSt18_Bit_iterator_base7_M_incrEidatedweek_ZNSt13_Bit_iteratormmEidtdays_ZNKSt15_Deque_iteratorIN9dbstreams4cellERS1_PS1_EplEi_ZNSt13_Bit_iteratormmEv_ZNKSt13_Bit_iteratormiEi_ZNKSt5dequeIN9dbstreams4cellESaIS1_EE3endEv_ZN9dbstreams5query7enquoteERKSsSQLSMALLINT_ZNSaIN9dbstreams4cellEE7destroyEPS0_arrayCI_CURSORDBDATETIME_ZN9dbstreams9providers10dblib_impl11switchboard3msgEno_unused_sybdb_h_warn__bigint_struct_ZNKSt14_Bit_referenceltERKS_passwordTableNameallocator_ZNSt5dequeIN9dbstreams4cellESaIS1_EE6rbeginEvPrecisionrow_typeDBBIT_ZN9dbstreams9providers10dblib_impl11switchboard3errE_ZN8dbstringaSERKS_INTFUNCPTRRETCODE_Base_ptr_ZNSt14__simple_allocIN9dbstreams4cellESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS1_j_GLOBAL__D__ZN9dbstreams19parse_provider_nameERKSsPSt4pairIjjE_ZN9dbstreams9providers8urhandle6handleEP7sqlite3_ZNK9__gnu_cxx17__normal_iteratorIPKN9dbstreams4cellESt6vectorIS2_SaIS2_EEEptEv_ZNSt18_Bit_iterator_baseaSERKS_plog_GLOBAL__D__ZN9dbstreams9providers11native_typeERNS_8metadataEi_ZTSN9dbstreams9providers8urhandleEprovider.C_GLOBAL__I__ZN9dbstreams9providers11native_typeERNS_8metadataEi_ZTIN9dbstreams9providers8urhandleE_ZN9dbstreams9providers11native_typeERKNS_8metadataEserveroserrstr_ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERKS9_PSA_EppEvresult_typeprovider.dblib.C__x_binary_function_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE3endEv_ZNKSaISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEE7addressERKS8__ZN9dbstreams9providers10dblib_impl8desttypeEf_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE4findERSA_equal_range__rightmostErrorHandler_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_M_eraseEPSt13_Rb_tree_nodeIS9_E_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE12_M_rightmostEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_S_rightEPSt18_Rb_tree_node_base_ZNSt13_Alloc_traitsISt13_Rb_tree_nodeISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEESaISA_EEaSERKSD__ZNSt19_Rb_tree_alloc_baseISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEESaIS9_ELb1EE11_M_put_nodeEPSt13_Rb_tree_nodeIS9_E_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11__rb_verifyEv_ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPSB_j_ZNKSt10_Select1stISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEEclERS9__ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE13get_allocatorEv_M_erase_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE3endEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE7_S_leftEPSt13_Rb_tree_nodeIS9_Epair_Rb_tree_rebalance_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE4findERS3__ZNKSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_EdeEvmsgtext_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE7_S_leftEPSt18_Rb_tree_node_base_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE7_M_rootEv_ZN9dbstreams9providers10dblib_impl7retcodeEi_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE13insert_uniqueERKS9__ZNKSaISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEE7addressERS8_operator new_S_color_ZNSaISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEE7destroyEPS8__Rb_tree_node >_ZNSt13_Alloc_traitsISt13_Rb_tree_nodeISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEESaISA_EE15_S_instancelessE_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE9_S_parentEPSt18_Rb_tree_node_base_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5countERS3__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE4rendEv_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE5clearEv_M_get_node_Rb_tree_rotate_left_Select1st_Rb_tree_rotate_rightallocator > >_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE5countERSA__ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE13get_allocatorEv_Construct, std::pair >_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5eraseESt17_Rb_tree_iteratorIS9_RS9_PS9_Elower_bound_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE4sizeEv_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEEaSERKSD__ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE5beginEvdberr_ZNSt4lessIP19tds_dblib_dbprocessEaSERKS2__ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_EaSERKSC__M_clone_node_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5emptyEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5eraseESt17_Rb_tree_iteratorIS9_RS9_PS9_ESJ__M_create_node_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8max_sizeEv_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE11upper_boundERSA__ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERKS9_PSA_EmmEiprocname_ZNSt13_Alloc_traitsISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEESaIS9_EEaSERKSB__GLOBAL__D__ZN9dbstreams9providers10dblib_impl11switchboard11connectionsE_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE8max_sizeEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EEaSERKSF__ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE10value_compEv_ZNKSt19_Rb_tree_alloc_baseISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEESaIS9_ELb1EE13get_allocatorEvswap_ZN9dbstreams9providers10dblib_impl14MessageHandlerEP19tds_dblib_dbprocessiiiPcS4_S4_i_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE6rbeginEv_ZNSaISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEEaSERKS9___x_parent_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE5emptyEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE14_M_create_nodeERKS9_operator!=, std::pair&, std::pair*>_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE11upper_boundERSA_first_argument_type_ZN9dbstreams9providers10dblib_impl8datatypeEi_ZNSt13runtime_erroraSERKS___leftmost_ZNSt13_Alloc_traitsISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEESaIS9_EE15_S_instancelessE_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE10_S_maximumEPSt13_Rb_tree_nodeIS9_E_ZNSt14unary_functionISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEES3_EaSERKSA__ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE6rbeginEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5eraseEPS3_SG__ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE4findERS3__ZNSt15binary_functionIP19tds_dblib_dbprocessS1_bEaSERKS2_binary_functiondestroy_node_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11lower_boundERS3__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE7_M_copyEPSt13_Rb_tree_nodeIS9_ESI__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE12insert_equalESt17_Rb_tree_iteratorIS9_RS9_PS9_ERKS9__ZN9dbstreams9providers10dblib_impl8desttypeEi__simple_alloc >,std::__default_alloc_template >iterator_traits, std::pair&, std::pair*> >__comp_ZNSt13_Rb_tree_baseISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEESaIS9_EEaSERKSB__ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE11lower_boundERSA__ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE4rendEv_ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_EppEi_ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_EppEvsrvname_ZNKSaISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEE8max_sizeEv__it_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE5eraseESt17_Rb_tree_iteratorISB_RSB_PSB_E_Rb_tree_iterator_M_key_comparepair, const std::pair&, const std::pair*>,std::_Rb_tree_iterator, const std::pair&, const std::pair*> >__value_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE6_S_keyEPSt13_Rb_tree_nodeIS9_Epair, std::pair&, std::pair*>,std::_Rb_tree_iterator, std::pair&, std::pair*> >_ZNKSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERKS9_PSA_EptEv_ZNSt4pairISt17_Rb_tree_iteratorIS_IKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_ESC_EaSERKSD__ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11equal_rangeERS3__ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE4swapERSD__ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE6insertESt17_Rb_tree_iteratorISB_RSB_PSB_ERKSB_less_M_node_count_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE8key_compEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE4swapERSF__ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE6rbeginEv__position_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE11equal_rangeERSA_._10._11._12._13._14_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE3endEv_Rep_typeupper_bound~_Rb_tree_base__root_ZNSt4pairISt17_Rb_tree_iteratorIS_IKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_EbEaSERKSD__M_t_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE6_S_keyEPSt18_Rb_tree_node_basevalue_compare_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE4findERSA__M_insert_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11upper_boundERS3__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_S_valueEPSt13_Rb_tree_nodeIS9_E_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_S_colorEPSt18_Rb_tree_node_baseoserr_ZNSt15iterator_traitsISt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERSA_PSA_EEaSERKSE__ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11upper_boundERS3__GLOBAL__I__ZN9dbstreams9providers10dblib_impl11switchboard11connectionsEreverse_iterator, const std::pair&, const std::pair*> >_Link_type_ZNSt19_Rb_tree_alloc_baseISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEESaIS9_ELb1EE11_M_get_nodeEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5beginEv_Rb_tree_nodeallocator >_ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERKS9_PSA_EmmEv_Alloc_traits >,std::allocator > >_S_parentMessageHandler_ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEESt24__default_alloc_templateILb1ELi0EEEaSERKSE_operator==, std::pair&, std::pair*>_ZNSaISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEE10deallocateEPS8_j_ZN9dbstreams9providers10dblib_impl8desttypeEdinsert_unique_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE11equal_rangeERSA__Rb_tree_base,std::allocator > >second_argument_type_ZNSt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEaSERKS8_~map_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11lower_boundERS3__Alloc_traits,std::allocator > >_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE12insert_equalERKS9__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_S_colorEPSt13_Rb_tree_nodeIS9_E_M_rightmost_S_value__y__M_empty_initialize_Rb_tree_rebalance_for_erase_M_root_Rb_tree,std::_Select1st >,std::less,std::allocator > >_ZN9dbstreams9providers10dblib_impl8desttypeEPKcreverse_iterator, std::pair&, std::pair*> >_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEEixERSA_operator== >_ZNSt13_Rb_tree_nodeISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEEaSERKSA__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11equal_rangeERS3_unary_function,tds_dblib_dbprocess* const>_ZNSaISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEE9constructEPS8_RKS8__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE13_M_clone_nodeEPSt13_Rb_tree_nodeIS9_E__simple_alloc,std::__default_alloc_template >_ZNKSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_EptEv_ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPSB_key_type_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE5beginEv_ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERKS9_PSA_EppEi_M_value_field_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE12destroy_nodeEPSt13_Rb_tree_nodeIS9_E_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11_M_leftmostEvpair, std::pair&, std::pair*>,bool>_ZNSt19_Rb_tree_alloc_baseISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEESaIS9_ELb1EEaSERKSB_~_Rb_tree__distance, std::pair&, std::pair*> >__rb_verify_ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERKS9_PSA_EaSERKSD__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE6rbeginEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5clearEvunary_function_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE6insertERKSB_desttype_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE4rendEv_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE11lower_boundERSA__ZNKSt10_Select1stISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEEclERKS9__ZNKSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERKS9_PSA_EdeEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_S_rightEPSt13_Rb_tree_nodeIS9_E_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8key_compEv_ZNKSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5beginEv_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE5eraseESt17_Rb_tree_iteratorISB_RSB_PSB_ESH__ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_EmmEi_ZN9dbstreams9providers10dblib_impl8desttypeEPKv_M_copydberrstr_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE4sizeEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_S_valueEPSt18_Rb_tree_node_base_ZNKSt4lessIP19tds_dblib_dbprocessEclERKS1_S4__M_leftmost_ZNSt17_Rb_tree_iteratorISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEERS9_PS9_EmmEv_S_key__before_M_put_nodemapped_type_ZN9dbstreams9providers10dblib_impl12ErrorHandlerEP19tds_dblib_dbprocessiiiPcS4__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE9_S_parentEPSt13_Rb_tree_nodeIS9_E_ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEESt24__default_alloc_templateILb1ELi0EEE8allocateEj_ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEESt24__default_alloc_templateILb1ELi0EEE8allocateEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE19_M_empty_initializeEv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE13insert_uniqueESt17_Rb_tree_iteratorIS9_RS9_PS9_ERKS9__ZNSt10_Select1stISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEEaSERKSA__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE9_M_insertEPSt18_Rb_tree_node_baseSH_RKS9_retcode_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE4rendEvauth_ZNKSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE3endEv_Select1st >insert_equal_ZNSaISt4pairIKP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseEEE8allocateEjPKv_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE10_S_minimumEPSt13_Rb_tree_nodeIS9_E_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5eraseERS3_value_comp_M_headeroperator+, std::allocator >_ZNSt3mapIP19tds_dblib_dbprocessPN9dbstreams9providers10dblib_impl13provider_baseESt4lessIS1_ESaISt4pairIKS1_S6_EEE5eraseERSA__Rb_tree_iterator,const std::pair&,const std::pair*>_Rb_tree_iterator,std::pair&,std::pair*>_Rb_tree_alloc_basekey_comp_Rb_tree_alloc_base,std::allocator >,true>_GLOBAL__I__ZN9dbstreams9providers9odbc_impl10sql_c_typeENS_8metadata8datatypeE_ZN9dbstreams9providers9odbc_impl8desttypeEiSQLRETURN_ZN9dbstreams9providers9odbc_impl8desttypeEPKv_ZN9dbstreams9providers9odbc_impl8datatypeEi_ZN9dbstreams9providers9odbc_impl8desttypeEf_ZN9dbstreams9providers9odbc_impl5prretEs_ZN9dbstreams9providers9odbc_impl8desttypeEdprretprovider.odbc.C_GLOBAL__D__ZN9dbstreams9providers9odbc_impl10sql_c_typeENS_8metadata8datatypeE_ZN9dbstreams9providers9odbc_impl8desttypeEPKcsql_c_type_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EEaSERKSB__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE13_M_clone_nodeEPSt13_Rb_tree_nodeIS5_E_ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERKS5_PS6_EaSERKS9_operator== >_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE12destroy_nodeEPSt13_Rb_tree_nodeIS5_E_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8max_sizeEv_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE5eraseERS6__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_S_colorEPSt13_Rb_tree_nodeIS5_E_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE13get_allocatorEv__simple_alloc,std::__default_alloc_template >_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_S_rightEPSt18_Rb_tree_node_base_ZNSt13_Alloc_traitsISt4pairIKiN9dbstreams8metadata8datatypeEESaIS5_EEaSERKS7__Select1st >allocator > >_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE5beginEv_ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERS5_PS5_EmmEi_ZNKSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERS5_PS5_EdeEv_ZNSt13_Rb_tree_baseISt4pairIKiN9dbstreams8metadata8datatypeEESaIS5_EEaSERKS7__ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE4findERS6__ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11lower_boundERS1__ZNKSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERS5_PS5_EptEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5clearEv_Rb_tree_base,std::allocator > >_ZNSt19_Rb_tree_alloc_baseISt4pairIKiN9dbstreams8metadata8datatypeEESaIS5_ELb1EEaSERKS7__ZNSaISt4pairIKiN9dbstreams8metadata8datatypeEEE9constructEPS4_RKS4__ZNSt13_Rb_tree_nodeISt4pairIKiN9dbstreams8metadata8datatypeEEEaSERKS6__ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11equal_rangeERS1__ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8key_compEvreverse_iterator, std::pair&, std::pair*> >_Rb_tree_alloc_base,std::allocator >,true>_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE13insert_uniqueESt17_Rb_tree_iteratorIS5_RS5_PS5_ERKS5__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE6_S_keyEPSt18_Rb_tree_node_base_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEEixERS6__ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE11upper_boundERS6__ZNKSt10_Select1stISt4pairIKiN9dbstreams8metadata8datatypeEEEclERKS5_pair_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11upper_boundERS1__ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERKS5_PS6_EmmEv_ZN9dbstreams9providers6sqlite8datatypeEi_Rb_tree_node >_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE7_S_leftEPSt13_Rb_tree_nodeIS5_E_ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERS5_PS5_EppEv_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE8max_sizeEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_S_rightEPSt13_Rb_tree_nodeIS5_E_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE6insertESt17_Rb_tree_iteratorIS7_RS7_PS7_ERKS7__ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE4swapERS9_sqlite_type_ZNSt4pairISt17_Rb_tree_iteratorIS_IKiN9dbstreams8metadata8datatypeEERS5_PS5_EbEaSERKS9__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5eraseESt17_Rb_tree_iteratorIS5_RS5_PS5_E_ZNSt14unary_functionISt4pairIKiN9dbstreams8metadata8datatypeEES1_EaSERKS6__ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE6insertERKS7__ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERKS5_PS6_EppEv_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE6rbeginEv_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5beginEvbinary_functionprovider.sqlite3.C_ZNSt4lessIiEaSERKS0__ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE5eraseESt17_Rb_tree_iteratorIS7_RS7_PS7_ESD__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_S_valueEPSt18_Rb_tree_node_base_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE11upper_boundERS6__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE7_M_copyEPSt13_Rb_tree_nodeIS5_ESE__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5eraseERS1__ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE4rendEv_ZNSaISt4pairIKiN9dbstreams8metadata8datatypeEEE7destroyEPS4__ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERS5_PS5_EppEi_ZNSt4pairIKiN9dbstreams8metadata8datatypeEEaSERKS4__ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE4rendEv_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE4findERS1__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE9_S_parentEPSt18_Rb_tree_node_base__simple_alloc >,std::__default_alloc_template >_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE5countERS6_unary_function,const int>_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE6rbeginEvreverse_iterator, const std::pair&, const std::pair*> >_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE9_S_parentEPSt13_Rb_tree_nodeIS5_Eless_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11lower_boundERS1__ZNSt19_Rb_tree_alloc_baseISt4pairIKiN9dbstreams8metadata8datatypeEESaIS5_ELb1EE11_M_put_nodeEPSt13_Rb_tree_nodeIS5_E_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_S_colorEPSt18_Rb_tree_node_base_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11__rb_verifyEv_ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKiN9dbstreams8metadata8datatypeEEESt24__default_alloc_templateILb1ELi0EEEaSERKSA__GLOBAL__D__ZN9dbstreams9providers6sqlite11sqlite_typeENS_8metadata8datatypeE_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE7_S_leftEPSt18_Rb_tree_node_base_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE4rendEvallocator >_ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERS5_PS5_EmmEv_ZNSt19_Rb_tree_alloc_baseISt4pairIKiN9dbstreams8metadata8datatypeEESaIS5_ELb1EE11_M_get_nodeEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_S_valueEPSt13_Rb_tree_nodeIS5_E_Construct, std::pair >_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE3endEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5eraseEPS1_SC__ZNKSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERKS5_PS6_EptEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE12insert_equalERKS5__Rb_tree_iterator,const std::pair&,const std::pair*>_ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKiN9dbstreams8metadata8datatypeEEESt24__default_alloc_templateILb1ELi0EEE8allocateEj_ZNKSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERKS5_PS6_EdeEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11upper_boundERS1__ZNSt15binary_functionIiibEaSERKS0__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE14_M_create_nodeERKS5__ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE4findERS6__ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE11lower_boundERS6__ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKiN9dbstreams8metadata8datatypeEEESt24__default_alloc_templateILb1ELi0EEE8allocateEv_ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERKS5_PS6_EmmEi_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE19_M_empty_initializeEv_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE11equal_rangeERS6__GLOBAL__I__ZN9dbstreams9providers6sqlite11sqlite_typeENS_8metadata8datatypeEoperator==, std::pair&, std::pair*>_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE5emptyEv_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE5clearEv_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE3endEv_ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERKS5_PS6_EppEi_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE12_M_rightmostEv_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE4sizeEv_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE7_M_rootEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE10_S_maximumEPSt13_Rb_tree_nodeIS5_E_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE12insert_equalESt17_Rb_tree_iteratorIS5_RS5_PS5_ERKS5__Rb_tree,std::_Select1st >,std::less,std::allocator > >_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE13insert_uniqueERKS5__ZNSt13_Alloc_traitsISt4pairIKiN9dbstreams8metadata8datatypeEESaIS5_EE15_S_instancelessE_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5countERS1__ZNKSt10_Select1stISt4pairIKiN9dbstreams8metadata8datatypeEEEclERS5__ZNSt17_Rb_tree_iteratorISt4pairIKiN9dbstreams8metadata8datatypeEERS5_PS5_EaSERKS8__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE10_S_minimumEPSt13_Rb_tree_nodeIS5_E_ZNSaISt4pairIKiN9dbstreams8metadata8datatypeEEE10deallocateEPS4_j_ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKiN9dbstreams8metadata8datatypeEEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS7_pair, std::pair&, std::pair*>,std::_Rb_tree_iterator, std::pair&, std::pair*> >_ZNKSt19_Rb_tree_alloc_baseISt4pairIKiN9dbstreams8metadata8datatypeEESaIS5_ELb1EE13get_allocatorEv_ZNSaISt4pairIKiN9dbstreams8metadata8datatypeEEE8allocateEjPKv_ZNSt13_Alloc_traitsISt13_Rb_tree_nodeISt4pairIKiN9dbstreams8metadata8datatypeEEESaIS6_EEaSERKS9__ZNSt13_Alloc_traitsISt13_Rb_tree_nodeISt4pairIKiN9dbstreams8metadata8datatypeEEESaIS6_EE15_S_instancelessE_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE4rendEv_ZNSaISt4pairIKiN9dbstreams8metadata8datatypeEEEaSERKS5__ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11_M_leftmostEv_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE10value_compEv_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE11lower_boundERS6__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE9_M_insertEPSt18_Rb_tree_node_baseSD_RKS5_pair, const std::pair&, const std::pair*>,std::_Rb_tree_iterator, const std::pair&, const std::pair*> >_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE4findERS1__ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE13get_allocatorEv_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE4sizeEv_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE6rbeginEv_Rb_tree_iterator,std::pair&,std::pair*>_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE3endEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE4swapERSB__ZNKSaISt4pairIKiN9dbstreams8metadata8datatypeEEE8max_sizeEv_Alloc_traits >,std::allocator > >_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE5beginEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE6rbeginEvpair, std::pair&, std::pair*>,bool>_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5eraseESt17_Rb_tree_iteratorIS5_RS5_PS5_ESF__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11equal_rangeERS1__ZNKSt4lessIiEclERKiS2__ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5emptyEvmap,std::allocator > >_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE5eraseESt17_Rb_tree_iteratorIS7_RS7_PS7_E_ZNSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEEaSERKS9__ZNSt14__simple_allocISt13_Rb_tree_nodeISt4pairIKiN9dbstreams8metadata8datatypeEEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS7_j_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE11equal_rangeERS6_datatypes_ZNSt10_Select1stISt4pairIKiN9dbstreams8metadata8datatypeEEEaSERKS6__ZNKSaISt4pairIKiN9dbstreams8metadata8datatypeEEE7addressERKS4__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_M_eraseEPSt13_Rb_tree_nodeIS5_E_ZNKSt3mapIiN9dbstreams8metadata8datatypeESt4lessIiESaISt4pairIKiS2_EEE8key_compEv_ZNKSaISt4pairIKiN9dbstreams8metadata8datatypeEEE7addressERS4__Alloc_traits,std::allocator > >_ZNKSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE3endEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE6_S_keyEPSt13_Rb_tree_nodeIS5_E_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE5beginEv_ZTISt11range_error__type_traits~range_errorfor_each<__gnu_cxx::__normal_iterator, std::allocator > >, dbstreams::quoted_string>operator-_ZTSSt11range_error__t_copyquery.Cmanipendloperator<< _ZN9dbstreams5querylsINS_4cellEEERS0_RKT__ZNSt24__copy_backward_dispatchIPPN9dbstreams4cellES3_11__true_typeE4copyEPKS2_S7_S3__ZSt8for_eachIN9__gnu_cxx17__normal_iteratorIPKcSsEEN9dbstreams13quoted_stringEET0_T_S8_S7__ZNSt11range_erroraSERKS___copy_backward_dispatchfind, std::basic_string, std::allocator > >_ZSt4findISt15_Deque_iteratorIN9dbstreams4cellERS2_PS2_ESsET_S6_S6_RKT0_St26random_access_iterator_tag_ZN19_Is_normal_iteratorIPPN9dbstreams4cellEEaSERKS4_operator==__copy_backward_input_normal_iteratoroperator<< __copy_backward_aux_ZN13__type_traitsIPN9dbstreams4cellEEaSERKS3_find_if, dbstreams::p>copy_ZN9dbstreams4endlERNS_5queryEcopy_backward__tcf_0operator!=__copy_trivial~basic_istream__copy_aux2iterator_traits_ZSt7find_ifISt15_Deque_iteratorIN9dbstreams4cellERS2_PS2_ENS1_1pEET_S7_S7_T0_St26random_access_iterator_tag_ZlsRSoRKN9dbstreams1pE__copy_backward_output_normal_iterator_ZN9dbstreams4findERSt5dequeINS_4cellESaIS1_EERKSs_ZGVZN9dbstreams5query7enquoteERKSsE5quote_Constructoperator()operator<< __copy_ni1__pred_ZN9dbstreams13quoted_stringclEc_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8__ZNSolsEj_ZN9dbstreams5querylsINS_1pEEERS0_RKT_~quoted_string_ZNSt24__copy_backward_dispatchIPPN9dbstreams4cellES3_11__true_typeEaSERKS5__ZNSt15iterator_traitsIPPN9dbstreams4cellEEaSERKS4__Is_normal_iterator_ZN9dbstreams13quoted_stringaSERKS0___copy_ni2g%@aXyu&&yMMe           $$%&6%o%%$%$$$${((**()(((((($2*22D3x22j2o2a2d2Q2^2B2N232<2L6Q6 7~766x66W6o68 88788'J[[99I J9?CtCD&:):DDR?T?0DD??????`??@@C0DBBtCCB?CBBBB?CtCDIWE]EtIIHHHtIHHHH'J[[ \KKD[[KKV`VTT@UUTUTTTTVV6[D[ZZZ6[\ZZHZJZ"ZEZaa,bbabeeh1ideeDeLe"e>ekpqvlpLqrnotoLqqppqLqAtt|vvGw|wwwwwxLxxxxx HR=R%+\q|MS1A ]  $\xz|qԜN+8 RL8y '\fqpuz Ln _  k  nL   88 $ &  !  lqv ^ ,ts4IB4a:f$,>v  S\ܳ޳IB4a:f$6TtlnLQIB4a:f$.symtab.strtab.shstrtab.hash.dynsym.dynstr.rel.dyn.rel.plt.init.text.fini.rodata.note.netbsd.ident.data.eh_frame.gcc_except_table.dynamic.ctors.dtors.jcr.got.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_ranges ! L L )  51 4U4U^: ̳̳ C&>PIhh$O@@&U ]llp v  htt 0 0       0`` `@Qga + M  $0 |p ,Lp h =L  4U̳h@  l   t0   `  [ $0 > L  _lhct̴3|` m? - ; ? l`< @  G )CY  )yC08zoPz)${Ch{{9JN )%̓$4 O M )C0$Ht M P )D;= 5Q=0 >Gp Ua n1! I (!    e l    <!  ," J1 ; E ` hz  " X " x   "t T ! # !   ' +^"| '  0  ,"j! ^LH>" ! z9-z_}8",)"7)"w"- \@(! c"h ! y"S  (! DE.tyb qU"=%XPq{TԞ5"gdH5""5= l(!  " <! Qz "@ ["8"T'|&> Ys4Tj0"$ #l;K"(! ! "+|F_\ jV "`kTF|p" ztLx">Kd T !" <! 3@ ! W"H^t" \"( lC t p "!"G!`!j!u!! !X/!!!H"4"O"I"""(! "P"" #{Wq#Y"$8!%$B$0"~$8 $$p$7""%X=%M%! T%%%<"&9&"P&! d&$ ! y& &?"&'L8"V''''H((N(Z((ж"((h "L)LX)q")\! )).! )h '*"*"+&+"A+@:b+%"y+0++Xc+x,#,, A, \,o,@ u,t ! ,H ",,,-p"l-1---! .xz 6.M.T.  ! h..Y"."./ #"D/"g//Ԝ"20УH"h0!a "0>"1Tw"91Q1l-d"1c"1`2D! 72I2v2`(! 2, 22d!C"3&383 "u373,333 T 4L474M4R4\4T5"4l "*55b"55 "6-"'7\!E7"7! 774ic"$8$S8 %"k8P-88@8Ġ"99/9`de99! 9pj"9L 9'9`9(  :a(: @: T:0:::d ": wq"!;3;E;D]; s; ";t;НY";<t9<N"g<z9<<<ym"<= "V=h=crti.cinit_fallthrufini_fallthrucrtbeginS.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST____ctors__dtorsinitialized.0object.1__do_global_ctors_auxfinished.2__do_global_dtors_auxcrtn.ccell.C_ZZN9dbstreams4cellclEPKciE19__PRETTY_FUNCTION___ZZN9dbstreams4cellC1EPKviiE19__PRETTY_FUNCTION___ZZN9dbstreams4cellclEPKviE19__PRETTY_FUNCTION___ZZN9dbstreams4cellC1EPKviRKSsE19__PRETTY_FUNCTION___ZZlsRSoRKN9dbstreams4cellEE19__PRETTY_FUNCTION___ZZlsRSoN9dbstreams8metadata8datatypeEE19__PRETTY_FUNCTION__dbstatus.C_ZSt8__ioinit_Z41__static_initialization_and_destruction_0ii_GLOBAL__I__ZN9dbstreams8dbstatusC2ERKSs_GLOBAL__D__ZN9dbstreams8dbstatusC2ERKSsdbstream.C_ZZN9dbstreams19parse_provider_nameERKSsPSt4pairIjjEE5provs_ZZN9dbstreams19parse_provider_nameERKSsPSt4pairIjjEE7eoprovs_GLOBAL__I__ZN9dbstreams19parse_provider_nameERKSsPSt4pairIjjE_GLOBAL__D__ZN9dbstreams19parse_provider_nameERKSsPSt4pairIjjEprovider.C_GLOBAL__I__ZN9dbstreams9providers11native_typeERNS_8metadataEi_GLOBAL__D__ZN9dbstreams9providers11native_typeERNS_8metadataEiprovider.dblib.C_ZZN9dbstreams9providers10dblib_impl8datatypeEiE19__PRETTY_FUNCTION___GLOBAL__I__ZN9dbstreams9providers10dblib_impl11switchboard11connectionsE_GLOBAL__D__ZN9dbstreams9providers10dblib_impl11switchboard11connectionsEprovider.odbc.C_ZZN9dbstreams9providers9odbc_impl10sql_c_typeENS_8metadata8datatypeEE19__PRETTY_FUNCTION___ZZN9dbstreams9providers9odbc_impl8datatypeEiE19__PRETTY_FUNCTION___GLOBAL__I__ZN9dbstreams9providers9odbc_impl10sql_c_typeENS_8metadata8datatypeE_GLOBAL__D__ZN9dbstreams9providers9odbc_impl10sql_c_typeENS_8metadata8datatypeEprovider.sqlite3.C_ZN9dbstreams9providers6sqlite9datatypesE_ZZN9dbstreams9providers6sqlite11sqlite_typeENS_8metadata8datatypeEE19__PRETTY_FUNCTION___ZZN9dbstreams9providers6sqlite8datatypeEiE5types_GLOBAL__I__ZN9dbstreams9providers6sqlite11sqlite_typeENS_8metadata8datatypeE_GLOBAL__D__ZN9dbstreams9providers6sqlite11sqlite_typeENS_8metadata8datatypeEquery.C_ZGVZN9dbstreams5query7enquoteERKSsE5quote_ZZN9dbstreams5query7enquoteERKSsE5quote__tcf_0crtendS.c__FRAME_END____JCR_END____dso_handle_ZNSt24__default_alloc_templateILb1ELi0EE8allocateEj_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZN9dbstreams4cell10copy_valueERKS0__ZTCSd0_Si_Znaj_ZNSs6assignEPKcj_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E_ZN9dbstreams4cellC2ERKS0__ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc_ZN9dbstreams9providers10dblib_impl8desttypeEd_ZTVSd__cxa_rethrow_ZN9dbstreams8dbstatusD1Ev_ZN9dbstreams4cellclEPKci_ZNSoD1Ev_ZNSolsEl_ZN9dbstreams9providers6sqlite11sqlite_typeENS_8metadata8datatypeE_ZN9dbstreams9providers11native_typeERNS_8metadataEi_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev_ZN9dbstreams4cell6assignEPvi_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE13insert_uniqueERKS5__ZN9dbstreams5query6fiddleEv_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_cur_moveEl_ZTISt15basic_streambufIcSt11char_traitsIcEE_ZSt4findISt15_Deque_iteratorIN9dbstreams4cellERS2_PS2_ESsET_S6_S6_RKT0_St26random_access_iterator_tag_ZN9dbstreams8dbstatusC2EPKciRKSs_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE_ZNK9dbstreams8dbstatus4whatEv_ZTIN9dbstreams9providers8urhandleE_ZNSiD0Evmemmove_ZSt4findISt15_Deque_iteratorIiRKiPS1_EiET_S5_S5_RKT0_St26random_access_iterator_tag_ZN9dbstreams4cellC1EPKvii_ZNSt9exceptionD2Ev_DYNAMIC_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE9_M_insertEPSt18_Rb_tree_node_baseSH_RKS9__ZTSN9dbstreams8dbstatusE_ZNK9dbstreams8metadataltESs_ZNSs4_Rep11_S_terminalE_ZNK9dbstreams8dbstatuseqEi_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE8_M_eraseEPSt13_Rb_tree_nodeIS9_E_ZNSs4_Rep10_M_disposeERKSaIcE_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv_ZTIN9dbstreams8dbstatusE_ZNSsC1ERKSs_ZNK9dbstreams9providers8urhandle7sqlite3Ev_ZN9dbstreams9providers8urhandle6handleEP7sqlite3_ZN9dbstreams4cellC2EPKviRKSs_ZN9dbstreams9providers9odbc_impl8datatypeEi_ZlsRSoRKN9dbstreams1pE_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE14_M_create_nodeERKS5__ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE14_M_create_nodeERKS9__ZSt6__copyISt15_Deque_iteratorIiRiPiES3_ET0_T_S5_S4_St26random_access_iterator_tag_ZN9dbstreams9providers10dblib_impl8desttypeEi_ZN9dbstreams9providers10dblib_impl11switchboard7messageEP19tds_dblib_dbprocessRKNS_8dbstatusE__cxa_call_unexpected_ZTISd_ZNSdD1Ev_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEEmemcpy_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c_ZN9dbstreams4cellC2EfRKSs_ZN9dbstreams9providers10dblib_impl8desttypeEf_ZTVSt11range_error_ZNSt13runtime_errorD2Ev_ZN9dbstreams9providers10dblib_impl7retcodeEi_ZN9dbstreams19parse_provider_nameERKSsPSt4pairIjjE__cxa_finalize_ZN9dbstreams4endlERNS_5queryE_ZSt8for_eachIN9__gnu_cxx17__normal_iteratorIPKcSsEEN9dbstreams13quoted_stringEET0_T_S8_S7__ZN9dbstreams9providers10dblib_impl12ErrorHandlerEP19tds_dblib_dbprocessiiiPcS4__ZN9dbstreams5queryaSERKSs_ZNK9dbstreams4cellrsERd_ZNSolsEm_ZN9dbstreams4cellC2Ev_ZN9dbstreams4cellC2EPKcii_ZNSt13runtime_errorC2ERKSs_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11upper_boundERS3__ZlsRSoN9dbstreams8metadata8datatypeE_ZN9dbstreams4cellC1Efi_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE11lower_boundERS1__ZN9dbstreams8dbstatusC1ERKS0_isspace_ZN9dbstreams9providers9odbc_impl8desttypeEPKc_ZTCSt18basic_stringstreamIcSt11char_traitsIcESaIcEE8_Sotdsdbopen_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi_ZlsRSoRKN9dbstreams8dbstatusE_ZNSs6assignERKSs_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZTVN10__cxxabiv120__si_class_type_infoE_ZThn8_NSdD0Ev_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi_ZdlPv_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev_ZN9dbstreams8dbstatusC1EPKciRKSs_ZN9dbstreams4cellaSEd_ZN9dbstreams4cellC1EfRKSs_ZN9dbstreams4cellclEPKvi__cxa_end_catch_ZTISo_init_ZN9dbstreams8dbstatusC1ERKSs_ZNSt11_Deque_baseIiSaIiEE16_M_destroy_nodesEPPiS3__ZNSs7replaceEjjPKcj_ZN9dbstreams4cellaSEi__gxx_personality_v0_ZN9dbstreams4cellC2Edi_ZNSs7reserveEj_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZTSSt12domain_error_ZSt6__copyISt15_Deque_iteratorIiRKiPS1_ES0_IiRiPiEET0_T_S9_S8_St26random_access_iterator_tag_ZNK9dbstreams4cellrsERPKh_ZNSt13runtime_errorD1Ev_ZN9dbstreams9providers9odbc_impl8desttypeEi_ZNSt5dequeIiSaIiEE5eraseESt15_Deque_iteratorIiRiPiES5__ZNSt12domain_errorC1ERKSs_ZNK9dbstreams8dbstatusneEi_ZN9dbstreams5query7enquoteERKSs_ZN9dbstreams9providers9odbc_impl5prretEs_ZN9dbstreams5querylsINS_4cellEEERS0_RKT__ZNSt12domain_errorD1Ev_ZN9dbstreams9providers9odbc_impl8desttypeEPKv_ZN9dbstreams9providers8urhandle6handleEP19tds_dblib_dbprocess_ZN9dbstreams4cellC1Edi_ZNSt5dequeIiSaIiEE24_M_new_elements_at_frontEj_ZNSaIcED1Ev_ZN9dbstreams9providers10dblib_impl11switchboard3errE_ZNSs4_Rep9_S_createEjRKSaIcE__deregister_frame_info_ZN9dbstreams4cellaSERKS0__Unwind_Resume_ZNSsC1IPcEET_S1_RKSaIcE_ZTCSt18basic_stringstreamIcSt11char_traitsIcESaIcEE0_Sd_ZTSN9dbstreams9providers8urhandleE_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale_ZNKSt13runtime_error4whatEv_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE13insert_uniqueESt17_Rb_tree_iteratorIS5_RS5_PS5_ERKS5__ZTISt13runtime_error_ZSt7find_ifISt15_Deque_iteratorIN9dbstreams4cellERS2_PS2_ENS1_1pEET_S7_S7_T0_St26random_access_iterator_tag_ZSt25__uninitialized_copy_copyISt15_Deque_iteratorIiRiPiES0_IiRKiPS4_ES3_ET1_T_S9_T0_SA_S8__ZNK9dbstreams4cellrsERPKc_ZN9dbstreams9providers9odbc_impl8desttypeEd_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5eraseERS3__ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev_ZNSs4_Rep11_S_max_sizeE_ZNSoD0Evstrcasestr_ZTISt11logic_error_ZN9dbstreams4cellC2EdRKSs_ZN9dbstreams4cellaSEPKc_ZN9dbstreams4findERSt5dequeINS_4cellESaIS1_EERKSs_ZNSsC2ERKSs_ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0__ZNK9dbstreams4cellrsERPKv_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode_ZNSt8ios_baseC2Ev_ZTCSd8_So_ZTv0_n12_NSdD1Ev_ZN9dbstreams9providers10dblib_impl11switchboard11connectionsE_ZN9dbstreams9providers10dblib_impl14MessageHandlerEP19tds_dblib_dbprocessiiiPcS4_S4_i_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE4findERS3__ZN9dbstreams4cellC2EPKciRKSs_ZNSs20_S_empty_rep_storageE_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci_ZN9dbstreams9providers10dblib_impl8desttypeEPKv_ZlsRSoRKN9dbstreams4cellE_ZN9dbstreams5query4modeENS0_7sepmodeESs_ZNSt5dequeIiSaIiEE23_M_new_elements_at_backEj_ZN9dbstreams4cellC1EPKcii_ZNSs6appendEjc_ZTSSd_ZN9dbstreams9providers10dblib_impl11switchboard5errorEP19tds_dblib_dbprocessRKNS_8dbstatusE_ZNSt6localeD1Ev_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE14_M_really_syncEjj_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv_ZNSt11range_errorD1Ev_ZTSSt11range_error_ZTISt12domain_error_ZN9dbstreams4cellC1EiRKSs_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode_ZNSt8ios_base4InitC1Ev_ZNSt5dequeIiSaIiEE13_M_insert_auxISt15_Deque_iteratorIiRKiPS4_EEEvS3_IiRiPiET_SB_j_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci_ZSt19__throw_logic_errorPKc_ZN9dbstreams9providers10dblib_impl11switchboard5closeEP19tds_dblib_dbprocess_ZTVN10__cxxabiv117__class_type_infoE__cxa_throw_ZN9dbstreams9providers10dblib_impl11switchboard11prior_procsE_ZN9dbstreams4cell13make_bindableEv_ZN9dbstreams8metadata7varylenENS0_8datatypeE_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode__bss_start_ZNSt5dequeIN9dbstreams4cellESaIS1_EE16_M_push_back_auxERKS1__ZTTSd_ZN9dbstreams8dbstatus5resetENS0_7iostateE_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE_ZN9dbstreams9providers9odbc_impl8desttypeEf_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE13insert_uniqueESt17_Rb_tree_iteratorIS9_RS9_PS9_ERKS9__ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev_ZdaPv_ZN9dbstreams8dbstatusD0Ev_ZN9dbstreams5query8check_wsclEc_ZNSt11range_errorD0Ev_ZNK9dbstreams4cellrsERi_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci_ZNK9dbstreams8metadataeqESs_ZN9dbstreams9providers6sqlite8datatypeEi_ZNSs6appendERKSs_ZN9dbstreams8dbstatusaSERKSs_ZN9dbstreams4cellC2EiRKSs_ZNSsC1EPKcRKSaIcE_fini_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE_ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tagdbclose_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvj_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev_ZNK9dbstreams4cellrsERSs_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc_ZNSt11logic_errorD2Ev_ZN16__Atomicity_lockILi0EE17_S_atomicity_lockE_ZN9dbstreams9providers11native_typeERKNS_8metadataE_ZNSt11logic_errorD1Evatexit_ZTISt11range_error_ZNSt11range_errorC1ERKSs_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE4findERS1__ZTv0_n12_NSdD0Ev_ZNSiD1Ev_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv_ZN9dbstreams5querylsISsEERS0_RKT__ZTVN10__cxxabiv121__vmi_class_type_infoE_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE13insert_uniqueERKS9__ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0__ZNSt5dequeIiSaIiEEaSERKS1__ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE8_M_eraseEPSt13_Rb_tree_nodeIS5_E_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8__ZNSt8ios_base4InitD1Ev_ZNSt11_Deque_baseIiSaIiEE15_M_create_nodesEPPiS3__ZNSt5dequeIN9dbstreams4cellESaIS1_EE17_M_reallocate_mapEjb_ZN9dbstreams9providers9odbc_impl10sql_c_typeENS_8metadata8datatypeE_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE_ZTv0_n12_NSiD1Ev_ZTVSt15basic_streambufIcSt11char_traitsIcEE_ZTCSt18basic_stringstreamIcSt11char_traitsIcESaIcEE0_Si_ZN9dbstreams9providers10dblib_impl8desttypeEPKc_ZNSsC1EPKcjRKSaIcE_ZNSt11_Deque_baseIiSaIiEED2Ev_ZNSt8ios_baseD2Ev__cxa_begin_catch_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev_ZN9dbstreams4cellaSEPKh_ZlsRSoRKN9dbstreams8dbstatus7iostateE_ZN9dbstreams4cellC1EPKviRKSs__cxa_allocate_exception_ZN9dbstreams8dbstatusC2ERKSs_edata_ZTVSt9basic_iosIcSt11char_traitsIcEE_GLOBAL_OFFSET_TABLE__end_ZNSiD2Ev_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE11lower_boundERS3__ZNSt11_Deque_baseIiSaIiEE17_M_initialize_mapEj_ZN9dbstreams9providers10dblib_impl11switchboard4openEPNS1_13provider_baseEP18tds_dblib_loginrecRKSs_ZSt25__uninitialized_copy_copyISt15_Deque_iteratorIiRKiPS1_ES0_IiRiPiES7_ET1_T_S9_T0_SA_S8__ZTv0_n12_NSoD1Ev_ZNSt8_Rb_treeIP19tds_dblib_dbprocessSt4pairIKS1_PN9dbstreams9providers10dblib_impl13provider_baseEESt10_Select1stIS9_ESt4lessIS1_ESaIS9_EE5eraseESt17_Rb_tree_iteratorIS9_RS9_PS9_ESJ__ZNSt5dequeIiSaIiEE19_M_range_insert_auxISt15_Deque_iteratorIiRKiPS4_EEEvS3_IiRiPiET_SB_St20forward_iterator_tag_ZN9dbstreams4cellC1EPKciRKSs_ZNSt8_Rb_treeIiSt4pairIKiN9dbstreams8metadata8datatypeEESt10_Select1stIS5_ESt4lessIiESaIS5_EE9_M_insertEPSt18_Rb_tree_node_baseSD_RKS5__ZTVSt12domain_error_ZN9dbstreams4cellC1Ev_ZNSt5dequeIiSaIiEE17_M_reallocate_mapEjb_ZN9dbstreams9providers10dblib_impl8datatypeEi_ZNSt12domain_errorD0Ev_ZN9dbstreams8dbstatus7fetchedENS0_7iostateEib_ZNSolsEd_ZNK9dbstreams4cellrsERf_ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS0_S1_S1__ZN9dbstreams4cellC2Eii_ZTVSt13runtime_error_ZN9dbstreams9providers10dblib_impl11switchboard3msgE_ZNKSt11logic_error4whatEv_ZTVN9dbstreams8dbstatusE_ZNSdD0Ev_ZN9dbstreams4cellaSEf_ZN9dbstreams4cellC2EPKvii_ZN9dbstreams4cellC1ERKS0__ZN9dbstreams4cellC1EdRKSs_ZNK9dbstreams4cell5validEv_ZN9dbstreams4cellC1Eii_Jv_RegisterClasses_ZN9dbstreams8dbstatus6ignoreERKSt5dequeIiSaIiEE_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E_ZNSs4_Rep10_M_destroyERKSaIcE_ZThn8_NSdD1Ev_ZNSt15_Deque_iteratorIiRiPiEpLEi_ZTv0_n12_NSiD0Ev_ZTv0_n12_NSoD0Ev_ZN9dbstreams4cellC2Efi__register_frame_info_ZSt18_Rb_tree_rebalancePSt18_Rb_tree_node_baseRS0__ZN9dbstreams5querylsINS_1pEEERS0_RKT__ZNSt22_Rb_tree_base_iterator12_M_decrementEv_ZNSt11logic_errorC1ERKSs_ZNK9dbstreams8dbstatus6notifyERSo_ZNSt22_Rb_tree_base_iterator12_M_incrementEv_ZNK9dbstreams9providers8urhandle6dbprocEv_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev_ZTISi_ZNSt5dequeIiSaIiEE5clearEv_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev_ZNSs6appendEPKcj_ZNSt13runtime_errorC1ERKSs