RProtoBuf/0000755000175000017500000000000014156576672012311 5ustar nileshnileshRProtoBuf/demo/0000755000175000017500000000000012440004312013200 5ustar nileshnileshRProtoBuf/demo/00Index0000644000175000017500000000015312440004312014331 0ustar nileshnileshaddressbook Demonstration of RProtoBuf functionality io Input/Output handling of protocol buffer messages RProtoBuf/demo/addressbook.R0000644000175000017500000000325012440004312015623 0ustar nileshnilesh# load the package require( RProtoBuf ) # read all the proto files in the proto directory # of the package "RProtoBuf" # (this is also done in the startup of the package, so this call is # actually redundant) readProtoFiles( package = "RProtoBuf" ) # creating three Person messages # create a prototype with a simple call to new on the # descriptor for the Person message type, and then update the message # with fields romain <- update( new( tutorial.Person ), email = "romain@r-enthusiasts.com", id = 1, name = "Romain Francois", phone = new( tutorial.Person.PhoneNumber , number = "+33(0)...", type = "MOBILE" ) ) # directly supply parameters to the constructor dirk <- new( tutorial.Person, email = "edd@debian.org", id = 2, name = "Dirk Eddelbuettel" ) # update the phone repeated field with a list of PhoneNumber messages dirk$phone <- list( new( tutorial.Person.PhoneNumber , number = "+01...", type = "MOBILE" ), new( tutorial.Person.PhoneNumber , number = "+01...", type = "HOME" ) ) # build the address book book <- new( tutorial.AddressBook, person = list( romain, dirk ) ) # debug string. This is not what is transferred in the wire writeLines( as.character( book ) ) # the serialized message # see also the io demo to see how to serialize messages to connections # and files serialize( book, NULL ) # number of bytes taken by the message on the wire bytesize( book ) length( serialize( book, NULL ) ) # swap two persons in the address book # (1-based indexing) book$swap( "person", 1L , 2L ) writeLines( as.character( book ) ) # number of "person" in the book book$size( "person" ) # clear the message book$clear( ) writeLines( as.character( book ) ) RProtoBuf/demo/io.R0000644000175000017500000000164412440004312013737 0ustar nileshnileshrequire( RProtoBuf ) ### read messages from files and binary connections # read a message from a file name f <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) m1 <- read( tutorial.AddressBook, f ) writeLines( as.character( m1 ) ) # read the same message from a (binary) file connection con <- file( f, open = "rb" ) m2 <- read( tutorial.AddressBook, con ) # this also works: # m2 <- tutorial.AddressBook$read( con ) writeLines( as.character( m2 ) ) close( con ) # TODO: we need another example from a more fancy connection (pipe, ...) stopifnot( identical( as.character(m1), as.character(m2) ) ) ### write messages to files and binary connections tf1 <- tempfile() serialize( m1, tf1 ) tf2 <- tempfile() con <- file( tf2, open = "wb" ) serialize( m2, con ) close( con ) # test that the two binary files are identical stopifnot( identical( readBin( tf1, raw(0), 1000), readBin( tf2, raw(0), 1000) ) ) RProtoBuf/MD50000644000175000017500000003063314156576672012626 0ustar nileshnilesh97bae04b29ab84c41620084c98bbc38d *ChangeLog c93362686d125475cf63ea6d3b0a4ff2 *DESCRIPTION 85f0de4ef5c0132950a34540e1bb3198 *NAMESPACE 0b6885244d84e7d97098d3daf3d30aff *R/00classes.R ad31e4eeef1cfcb9e6052da2884bf818 *R/add.R 9d141fa9b6995218d84192f2f8f48313 *R/aslist.R c4ae245b40eee8819918c5763194ad99 *R/clear.R b3b7a9eb09ec909a0b8ca0a2c5451199 *R/clone.R de1ad9bcba0d52f9b6b7178613180cbe *R/completion.R 38ae44c79783992074c60338c61d02c3 *R/containing_type.R ebb6240719c8fd6781e2e9a490d53268 *R/debug_string.R 7b469c12eecb5782af0255b06cc65009 *R/descriptor.R ed9e4c00923c284134c8e053698fbc0d *R/extensions.R 7b4e29c09e90e8bc12c3c1142a0b136e *R/field_count.R 2a27c0337d136afdbff0fb37edaf8f4e *R/has.R 6992b3d8e9a20c4be926a58bf5522f26 *R/identical.R 5aad5f1d7263b6ce452bf07cdb33dc66 *R/initialized.R 3de1a255e6cb2544fdbffcd1cb6105a8 *R/internals.R 0176cbff7f11d23ae2d6de6c57a407af *R/lookup.R 4453435f6ffdf81405768b62736d2280 *R/merge.R b2cc72aa3786f7225b03edd135d7bba8 *R/read.R 669b5c47e1332fe7b22e281e7cd70c00 *R/rexp_obj.R d3a77f8815c1665cb7809823c2aade5c *R/serialize.R 1e07553fc771bd00c48378440481ccb4 *R/serialize_pb.R e5e4078bddf3252088482ff7b93109a7 *R/set.R 3147fe08c024da6833e8507161fe40b4 *R/size.R 94d9a6f7d11473f2d933edb6cb343a85 *R/swap.R e403daf56d76175b0dbb779fbf241a12 *R/unit_tests.R d65f4fddc0268d985d9f70577afdd8e6 *R/with.R 3d748318946134e30c89d702056b18df *R/wrapper_CodedInputStream.R 4c905df41ab1daf41f6259c8ab506850 *R/wrapper_CodedOutputStream.R eaeb7ee0e7ea168d4fdc60de5211de30 *R/wrapper_EnumDescriptor.R 0f8b8670532d914e828e84d99923a210 *R/wrapper_EnumValueDescriptor.R 8e2a91b60a9be5ae68160d4b907014da *R/wrapper_FieldDescriptor.R 3836caea68599871649d735dd364ded1 *R/wrapper_MethodDescriptor.R 3e75318bef5d508a5432b4ef972aa106 *R/wrapper_ServiceDescriptor.R 15200614add0962256aba49748578e0d *R/wrapper_ZeroCopyInputStream.R 648806f73b44bd95ec17cc3f3030c94f *R/zzz.R 0a7dddaf1478bf6737351c05852168f1 *README 1afce0628fbf4aac21590a490c4098f8 *README.md 9c2e29fe733b28fbd0058fe8f82a4c86 *TODO 4d771464d5ab84a8aabcd4dd85f2be8e *build/vignette.rds ecc5e657a5356f7305f5e693d252d8a0 *cleanup 661374b143e4396023f7bb0de6c5b762 *configure 71aee39ee3bc111f22ef90093e653780 *configure.ac d41d8cd98f00b204e9800998ecf8427e *configure.win 38719099f12809ebe19a43b951474c6b *demo/00Index 6275f697db7b64510f10f6bbc95c0498 *demo/addressbook.R 81d0dda686db1c07b625f49ea321a0af *demo/io.R 9ed50fca39d7442e4baaf9d24a1b1663 *inst/CITATION 498aff08bfe80592293e7f82c0d9aefc *inst/NEWS.Rd 5485d1d9d1bfb19216aaef28bd8fcc89 *inst/THANKS 24b19e060fb00703e9eb9605acc5fc83 *inst/doc/RProtoBuf-intro.Rnw 0757279794e5ac90b86377d2aea9f063 *inst/doc/RProtoBuf-intro.pdf d60d4b6e6889fd2750cf84d26c5df289 *inst/doc/RProtoBuf-paper.Rnw e2187a52f49217dfde024540ecf76dc7 *inst/doc/RProtoBuf-paper.pdf 81c6d4114d136b4a43668d834a444a8d *inst/doc/RProtoBuf-quickref.Rnw 23537377cab9977c4fcffe42048d1beb *inst/doc/RProtoBuf-quickref.pdf 8513688afa8b8be605c63815fe85dead *inst/examples/addressbook.pb 7f6e97dd4d48fcec1cfd7f9998dc0a62 *inst/opencpu/ocpu-getdata.R f16a4dde30d41003822a89fc99c7be66 *inst/opencpu/ocpu-getdata.py a9db27c47c52780e2fd620644059c6bd *inst/opencpu/ocpu-rpc.R 3de58b5add288354f79acf36a25429c2 *inst/opencpu/ocpu-rpc.py f3af33a40592bb447056578db18dfeee *inst/opencpu/readme.txt 45d4975a534ce2ea5aaf45c502ef4ec3 *inst/opencpu/rexp_pb2.py 9f9089f3b10a48b44260a8bd70db28e1 *inst/proto/addressbook.proto 2a3e35b1bc89e486008c91f67f39a818 *inst/proto/helloworld.proto cee1ab85ab9b103b74e0bf5be25f5cbf *inst/proto/rexp.proto c53fd49e9bd1f270d6fc87c8904866fe *inst/python/readmsg.py b4383797c61d0ec353a7e2ed5d571018 *inst/python/runtest.sh 95732c81a78c63573be5c9f43a36bddd *inst/python/writemsg.R 0d9b5f1be466ff971309ecb2afd30cf4 *inst/tinytest/data/bytes.proto c853d888d9648d142f1ba3a867fe376e *inst/tinytest/data/cyclical/proj1/proto/a.proto 66e65922360db0cbd266c44dfe39d53c *inst/tinytest/data/cyclical/proj1/proto/c.proto 20fe6aa791698528054fd3c44d11676a *inst/tinytest/data/cyclical/proj2/proto/b.proto dd450c59db3fd4f402013878edb78d7a *inst/tinytest/data/encoding.proto e78677c37ce64acb1a5d6ce9155ab83a *inst/tinytest/data/int64.ascii edcac7eaf963ab392904f481e616f7a5 *inst/tinytest/data/nested.proto a8a596114f1818d1f507f8f4e6b30c24 *inst/tinytest/data/proto3.proto 0f55fc44f50565d09be96de324ccc451 *inst/tinytest/data/recursive/subdir/subdir_message.proto 64a90d269a1f1460f7afae971bd5dd93 *inst/tinytest/data/subdir/subdir_message.proto 98dc306b2d0214026885e8477fcc77de *inst/tinytest/data/unittest.proto e2af081c633af2731f87220d75873750 *inst/tinytest/data/unittest_import.proto c18bdb7e8caa98f670fc255c4a759a89 *inst/tinytest/test_addressbook.R 36f307d85021e6ed0f8c980e3a1179c0 *inst/tinytest/test_bool.R b4c24c2f91f7ab6b5e277d7c63fd45bd *inst/tinytest/test_bytes.R f9cb439604e88e65a59cceb21c281164 *inst/tinytest/test_descriptors.R 22735aeedb99726fe0a970a6aa91828b *inst/tinytest/test_enums.R 2640fa64284f9e6702b32d86be5f3ec8 *inst/tinytest/test_extensions.R 557b2707cac83a59351ddece21b9ec23 *inst/tinytest/test_extremevalues.R 29a0b8fb75a7b134a337f059ce2e475d *inst/tinytest/test_fielddescriptor.R 0acf51a1f7471b660d7262479ae62d44 *inst/tinytest/test_golden_message.R 0bf7fb246ebc7fcd4b04c10c375b2f83 *inst/tinytest/test_import.R efc963895c5e86755c700467bdf82dfe *inst/tinytest/test_int32.R c4fdc31f4324f423ce0f66369492ec01 *inst/tinytest/test_int64.R 0dd6e24c9659df32facad763b19abae8 *inst/tinytest/test_messages.R d2b8e2924a0d3765aa67ff768f36a274 *inst/tinytest/test_nested.R 5dd9d25251f212a0f77459cf82001059 *inst/tinytest/test_proto3.R 2023280254b0e26cf41df6b4ec664448 *inst/tinytest/test_serialize.R bfe1de5603f8535c291b87885d4f414e *inst/tinytest/test_serialize_pb.R 8294c431099edf961d6615674972f229 *man/ArrayInputStream-class.Rd 40890fed5d4ed64cafc7095aa9a0b46e *man/ArrayInputStream-methods.Rd faea47ae293b70fefc1e56a36e44f4a6 *man/ArrayOutputStream-class.Rd 0f2696eff9e3308e2ffea7307dbc769c *man/ArrayOutputStream-methods.Rd 5cb17d6909f88e5aab5887e62cd03e0d *man/BackUp-methods.Rd ec65248e4a40e1f705a69a2e660425cb *man/ByteCount-methods.Rd f6d8ae782a18986ec842ab22c4107f42 *man/ConnectionInputStream-class.Rd 9b86bbf0669b15a1c86a90adbf8784db *man/ConnectionInputStream-methods.Rd 9c1dd1706a12a141a94a7982ca4ac1d0 *man/ConnectionOutputStream-class.Rd 3ef50451a780e5a3573fcf5c89590fda *man/ConnectionOutputStream-methods.Rd 33fa7d99f83a3c0b9e48207dbbf38246 *man/Descriptor-class.Rd b29c09ea587a461f7f6447a8e48b781e *man/EnumDescriptor-class.Rd 65d989a83e46495805116287e896947d *man/EnumValueDescriptor-class.Rd c719999a64809be361a95ef8ae36c8dd *man/FieldDescriptor-class.Rd fd61848af8ffb2f3e4082768e13994ff *man/FileDescriptor-class.Rd 86ebff6d59d63893efdfe27da4c36e3e *man/FileInputStream-class.Rd 8410f4bcb3dd93a643d1817b7cab66b1 *man/FileInputStream-methods.Rd 1c35de03316a8cd4c7fb5e03393dc49f *man/FileOutputStream-class.Rd 6d89722407047c622381b971f70effca *man/FileOutputStream-methods.Rd 359bb4bc81b9ea412fb7fe4248954ff7 *man/GetErrno-methods.Rd 5734b07ffeac347eb20d1b46319dedbe *man/Message-class.Rd d22d70747d8b6a2929054c2b1cb1a5b5 *man/MethodDescriptor-class.Rd a8f24fa648bfa9b4b311086b81d4c81f *man/Next-methods.Rd 29172e33c7df0cdb8df4b4ef43c14134 *man/P.Rd 04c2989db68ada4b236a65ac616bf2f8 *man/RProtoBuf-package.Rd 5e00d1563140d560193bff4d0fde572c *man/ServiceDescriptor-class.Rd f28fc53c2c8ef8b09f4fae34adf738e8 *man/SetCloseOnDelete-methods.Rd 79b80066abd78e6af423a45407d557e7 *man/Skip-methods.Rd 3c169b1cab087a73d6d268a53ead871e *man/ZeroCopyInputStream-class.Rd 7a25eac572b07a659c3b1072c4b3beb2 *man/ZeroCopyOutputStream-class.Rd c092e6235449f92bed78cf42ade227e8 *man/add.Rd bfcd76fc10327e8e559d568a22e399db *man/asMessage.Rd 5a569e9722221656abeaa53e865ac403 *man/aslist.Rd 437375c4a91c79c4618d9439bb0d41e8 *man/bytesize.Rd 650fee9155267d10598ca3bfbc30d5b2 *man/clear.Rd ec80b25ba5b04242a998dd4b743c2826 *man/clone.Rd 28e05b535fa45594cbcae8ab58a92e9b *man/completion.Rd 58e6fbab8fa48a76201ce96d3c67feb9 *man/containing_type-methods.Rd 4adb8eb20d5e6c6961e50efc3261f65e *man/descriptor.Rd b0d10473fc610c8763aa8e0822d6d428 *man/enum_type.Rd a5c50110525b52974417e4f4860781fc *man/enum_type_count.Rd ac509f4bcfde554b5541b143122ad49a *man/fetch.Rd 5e6e20abc7caae612d4a5cb0d5aa8f97 *man/field.Rd 29a2f92961280e7ea5105235f05e06d4 *man/field_count.Rd 2abfd8a218be88e5108a048fd2974b01 *man/fileDescriptor.Rd 54e1485862abe98a5bb444a446945e07 *man/has.Rd 9b76094272fe261773739f60443f9bb0 *man/isInitialized.Rd 99613c07ff0d286d571b75052a331f08 *man/is_extension.Rd f3ae2777164af8aaeabf52587913ea03 *man/label.Rd 9b42f851d250af547c5adc6381e3765c *man/merge.Rd 5b4e21d267dde303131629350925e52d *man/name.Rd 1d36ed77357d85fd08bf95d70ebd0763 *man/nested_type.Rd e4b536e4574dfba5c1684dbdadd37000 *man/nested_type_count.Rd 6c281b6344bdaaf719bad2430769f80c *man/number.Rd 8c81a58d60569755860b6e46bc4661d8 *man/read.Rd 1bb12d499e1147754a02e8660ee6346b *man/readASCII.Rd ddbaf3c0c0bcba202112685e7bc7b076 *man/readJSON.Rd a82daa5d1d504c4fe08527652e8d5918 *man/readProtoFiles.Rd 9819c09ba88a668ee8285a13b8c17630 *man/serialize_pb.Rd d9b5d35f7caac9c5f3780cd80cb9f180 *man/set.Rd ea60927461e723cba2b921693f2ed82d *man/size.Rd 3983a1b4b6b4d817447ad13d79d46228 *man/sizegets.Rd 7d4c64066a8b5486b23ca87879a643af *man/swap.Rd 17d0fefcddcd72efcc76a60978bb6b00 *man/type.Rd 5badc02095845ac4e1498539be042e7d *man/with.Rd 544f42fc1c35f1de8d8c2c6fe2bc7c38 *src/ConnectionCopyingInputStream.cpp c308631a6248210e33044f688aef16e7 *src/ConnectionCopyingInputStream.h e9ecde274f161c38541d2e6736a9cd97 *src/ConnectionCopyingOutputStream.cpp 2f7edbd09315738f39a635c991a8c3b0 *src/ConnectionCopyingOutputStream.h 9af4f9491b2b3e5bb9258a7cef42d274 *src/ConnectionInputStream.cpp 6b5497098f3def43a3adf5357cf92d46 *src/ConnectionInputStream.h 7367fe0ccc5c97cb1a98cb38c9fd064d *src/ConnectionOutputStream.cpp 9fe964bff78152777033909f3d8aa4fa *src/ConnectionOutputStream.h b8c98bd0c5b4df4708a75c5a6a5c74fa *src/DescriptorPoolLookup.cpp 4fb28107f0914a1e85d9e75a12832149 *src/DescriptorPoolLookup.h fe7b7b94b4b7508e2d98747994d39e6d *src/Makevars.in 97835512c8afeafee34872a4cd559ebb *src/Makevars.ucrt dceaa7022370655793d3eec8da38db15 *src/Makevars.win 8ee47b1df3edcc42719438fb946b069a *src/RSourceTree.cpp 47cc802d523899e6a6129704059d8ef3 *src/RSourceTree.h 34ae32444850decc880332d95a42b39a *src/RWarningErrorCollector.cpp 761a01e19cfa448dc46555d64b351773 *src/RWarningErrorCollector.h 7a0a19d1f7e7274492e2bc23ed5f6900 *src/RconnectionCopyingInputStream.cpp dffb1dcc72def5105f3c563ca9b6644e *src/RconnectionCopyingInputStream.h 9eb491ac170419ae6557de8acb57d7eb *src/RcppMacros.h 568cadf0482951d002c2183cf5415c02 *src/Rcppsupport.h 42b0baefe8adce8cc83c27372889e604 *src/S4_classes.h c9da30f2ded23d5631d1cc1515c6858b *src/ZeroCopyInputStreamWrapper.cpp 303aa1ef2030275d60d8e4bfeffbc4eb *src/ZeroCopyOutputStreamWrapper.cpp 00d70d3ee7758426b43694e94948e994 *src/extensions.cpp 52afd56eaa8013202920fc5be4a4dbe6 *src/extractors.cpp 699307a87cee7adf4a5087b934c27b01 *src/fieldtypes.h f0f950d93f17df3534508da1046e99b8 *src/init.c a81bea8fd0b5bec76fadf4c63628de2a *src/lookup.cpp 3406e5f66b1d77ba35ec316cb8608d85 *src/mutators.cpp 748af48bafb265d0a79ba788806056c8 *src/rprotobuf.cpp e709f194347306cd5484758531cea36f *src/rprotobuf.h 77dcd57d1827ecc62b6cd8380314e910 *src/streams.cpp 61a9cf9d31a974cffc414370609a000d *src/wrapper_ArrayInputStream.cpp 4d6efb41f45428c4757c1d8cffad6035 *src/wrapper_ArrayOutputStream.cpp 5a1939c0e620e265e192827e06c929e0 *src/wrapper_Descriptor.cpp 7100d8b0a565ca4acaf1e50b03b87540 *src/wrapper_EnumDescriptor.cpp 7c2ce621deacb24c111e8b5a4b651c3c *src/wrapper_EnumValueDescriptor.cpp 62f221cb2ca8b06475595602f350e3d4 *src/wrapper_FieldDescriptor.cpp af9f8878c4741038f39375b2af24abd2 *src/wrapper_FileDescriptor.cpp 4af8485ac44ef133f5ffb8ae5fb172e9 *src/wrapper_Message.cpp 34a093d89f713f4e2671045f17a420fb *src/wrapper_MethodDescriptor.cpp 54949183d26c88d0cc270b2d8e014b36 *src/wrapper_ServiceDescriptor.cpp 2c1c7ee61c0e6a8f30c291c89b46bf55 *src/wrapper_ZeroCopyInputStream.cpp 59937d13d10add259606848f88f4e65c *tests/tinytest.R 8a91a82dff044d44fcdd2eedc5bb4132 *tools/winlibs.R 24b19e060fb00703e9eb9605acc5fc83 *vignettes/RProtoBuf-intro.Rnw d60d4b6e6889fd2750cf84d26c5df289 *vignettes/RProtoBuf-paper.Rnw 81c6d4114d136b4a43668d834a444a8d *vignettes/RProtoBuf-quickref.Rnw 9ad30eeb7c977dc76b6788f8c54ecf12 *vignettes/inactive/Makefile.in 31ab1ab2350cdc2a0a8df9949484302c *vignettes/inactive/RProtoBuf-unitTests.Rnw 814abd89ea166e4d54794d8ddd5197aa *vignettes/inactive/static-use.Rnw 5ddea5cd14bf6d80df2746e1a276d785 *vignettes/pdf/RProtoBuf-intro.pdf afa1aecc170f02bb5df88502da9e95b5 *vignettes/pdf/RProtoBuf-paper.pdf 6e3b3a194ac6d2941ba20c58170ab0c2 *vignettes/pdf/RProtoBuf-quickref.pdf RProtoBuf/configure.win0000644000175000017500000000000012440004312014742 0ustar nileshnileshRProtoBuf/DESCRIPTION0000644000175000017500000000255714156576672014030 0ustar nileshnileshPackage: RProtoBuf Version: 0.4.18 Date: 2021-12-15 Author: Romain Francois, Dirk Eddelbuettel, Murray Stokely and Jeroen Ooms Maintainer: Dirk Eddelbuettel Title: R Interface to the 'Protocol Buffers' 'API' (Version 2 or 3) Description: Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal 'RPC' protocols and file formats. Additional documentation is available in two included vignettes one of which corresponds to our 'JSS' paper (2016, . Either version 2 or 3 of the 'Protocol Buffers' 'API' is supported. Depends: R (>= 3.0.0), methods Imports: utils, stats, tools, Rcpp LinkingTo: Rcpp Suggests: tinytest SystemRequirements: ProtoBuf libraries and compiler version 2.2.0 or later; version 3.0.0 or later is supported as well. On Debian/Ubuntu these can be installed as libprotoc-dev, libprotobuf-dev and protobuf-compiler, while on Fedora/CentOS protobuf-devel and protobuf-compiler are needed. BugReports: https://github.com/eddelbuettel/rprotobuf/issues URL: https://github.com/eddelbuettel/rprotobuf, https://dirk.eddelbuettel.com/code/rprotobuf.html License: GPL (>= 2) NeedsCompilation: yes Packaged: 2021-12-15 17:36:26 UTC; edd Repository: CRAN Date/Publication: 2021-12-16 08:50:02 UTC RProtoBuf/README.md0000644000175000017500000000520214130626017013544 0ustar nileshnilesh## RProtoBuf: R Interface to [Google Protocol Buffers](https://developers.google.com/protocol-buffers/) [![Build Status](https://travis-ci.org/eddelbuettel/rprotobuf.svg)](https://travis-ci.org/eddelbuettel/rprotobuf) [![CI](https://github.com/eddelbuettel/rprotobuf/workflows/ci/badge.svg)](https://github.com/eddelbuettel/rprotobuf/actions?query=workflow%3Aci) [![License](https://eddelbuettel.github.io/badges/GPL2+.svg)](https://www.gnu.org/licenses/gpl-2.0.html) [![CRAN](https://www.r-pkg.org/badges/version/RProtoBuf)](https://cran.r-project.org/package=RProtoBuf) [![Dependencies](https://tinyverse.netlify.com/badge/RProtoBuf)](https://cran.r-project.org/package=RProtoBuf) [![Downloads](https://cranlogs.r-pkg.org/badges/RProtoBuf?color=brightgreen)](https://www.r-pkg.org/pkg/RProtoBuf) [![Last Commit](https://img.shields.io/github/last-commit/eddelbuettel/rprotobuf)](https://github.com/eddelbuettel/rprotobuf) [![JSS](https://img.shields.io/badge/JSS-10.18637%2Fjss.v071.i02-brightgreen)](https://doi.org/10.18637/jss.v071.i02) ### What are Protocol Buffers? A serialization format developed by [Google](https://www.google.com) and used widely within Google, and by numerous other projects. Quoting from the [official website](https://developers.google.com/protocol-buffers/): > Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. [Protocol Buffers](https://developers.google.com/protocol-buffers/) natively support C++, C#, Go, Java and Python. Many other languages are supported via contributed extensions. This package adds support for [R](https://www.r-project.org). ### Installation You can either install from source via this repo, or install [the CRAN package](https://cran.r-project.org/package=RProtoBuf) the usual way from [R](https://www.r-project.org) via ```r install.packages("RProtoBuf") ``` but do make sure you have the system requirements covered when building from source. Under Debian/Ubuntu you may need ```bash sudo apt-get install protobuf-compiler libprotobuf-dev libprotoc-dev ``` with similar commands on other operating systems or distributions. ### Documentation The package contains two pdf vignettes; the second one corresponds to [our JSS paper](https://doi.org/10.18637/jss.v071.i02). ### Authors Romain Francois, Dirk Eddelbuettel, Murray Stokely and Jeroen Ooms ### License GPL (>= 2) RProtoBuf/man/0000755000175000017500000000000014060653075013047 5ustar nileshnileshRProtoBuf/man/ConnectionInputStream-methods.Rd0000644000175000017500000000073412440004312021256 0ustar nileshnilesh\name{ConnectionInputStream-methods} \docType{methods} \alias{ConnectionInputStream} \alias{ConnectionInputStream-methods} \alias{ConnectionInputStream,connection-method} \title{Creates an ConnectionInputStream} \description{ Constructor for \linkS4class{ConnectionInputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(object="connection")}}{Creates a \linkS4class{ConnectionInputStream} reading from the given R binary connection.} }} \keyword{methods} RProtoBuf/man/isInitialized.Rd0000644000175000017500000000131612440004312016120 0ustar nileshnilesh\name{isInitialized-methods} \docType{methods} \alias{isInitialized} \alias{isInitialized-methods} \alias{isInitialized,Message-method} \title{Indicates if a protocol buffer message is initialized} \description{ Indicates if a \linkS4class{Message} is initialized. A message is initialized if all its required fields are set. } \section{Methods}{ \describe{ \item{\code{ signature(object = "Message")}}{ is the message initialized} }} \examples{ message <- new( tutorial.Person, name = "" ) isInitialized( message ) # FALSE (id is not set) message$isInitialized() # FALSE message <- new( tutorial.Person, name = "", id = 2 ) isInitialized( message ) # TRUE message$isInitialized() # TRUE } \keyword{methods} RProtoBuf/man/number.Rd0000644000175000017500000000115212440004312014605 0ustar nileshnilesh\name{number-methods} \alias{number} \alias{number-methods} \title{Gets the declared tag number of a field} \description{ Gets the declared tag number of a field } \seealso{ The method is implemented for \linkS4class{FieldDescriptor} and \linkS4class{EnumValueDescriptor} classes. } \keyword{methods} \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{ Person <- P("tutorial.Person") } number(Person$id) number(Person$email) as.character(Person) number(value(tutorial.Person$PhoneType, name="HOME")) }RProtoBuf/man/FileInputStream-class.Rd0000644000175000017500000000321214156423460017511 0ustar nileshnilesh\name{FileInputStream-class} \Rdversion{1.1} \docType{class} \alias{FileInputStream-class} \alias{close,FileInputStream-method} \alias{GetErrno,FileInputStream-method} \alias{SetCloseOnDelete,FileInputStream-method} \title{Class "FileInputStream" } \description{A \linkS4class{ZeroCopyInputStream} reading from a file} \section{Objects from the Class}{ Objects can be created by the \link{FileInputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{google::protobuf::io::FileInputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyInputStream}"}, directly. } \section{Methods}{ \describe{ \item{close}{\code{signature(con="FileInputStream")}: Flushes any buffers and closes the underlying file. Returns false if an error occurs during the process; use \code{GetErrno} to examine the error } \item{GetErrno}{\code{signature(object="FileInputStream")}: If an I/O error has occurred on this file descriptor, this is the errno from that error. Otherwise, this is zero. Once an error occurs, the stream is broken and all subsequent operations will fail. } \item{SetCloseOnDelete}{\code{signature(object="FileInputStream")}: set the close on delete behavior. } } See \linkS4class{ZeroCopyInputStream} for inherited methods } \references{ The \code{FileInputStream} class from the protobuf C++ library. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream_impl_lite?csw=1} } \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyInputStream} for methods } \keyword{classes} RProtoBuf/man/is_extension.Rd0000644000175000017500000000056312440004312016031 0ustar nileshnilesh\name{is_extension-methods} \alias{is_extension} \alias{is_extension-methods} \title{Indicates if a field descriptor is an extension} \description{ Indicates if a field descriptor is an extension } \seealso{ The method is implemented for the \linkS4class{FieldDescriptor} class } \keyword{methods} \examples{ Person <- P( "tutorial.Person" ) is_extension(Person$id) }RProtoBuf/man/Descriptor-class.Rd0000644000175000017500000001215514156423460016562 0ustar nileshnilesh\name{Descriptor-class} \Rdversion{1.1} \docType{class} \alias{Descriptor-class} \alias{as.character,Descriptor-method} \alias{$<-,Descriptor-method} \alias{$,Descriptor-method} \alias{new,Descriptor-method} \alias{show,Descriptor-method} \alias{toString,Descriptor-method} \alias{containing_type,Descriptor-method} \alias{field_count,Descriptor-method} \alias{nested_type_count,Descriptor-method} \alias{enum_type_count,Descriptor-method} \alias{field,Descriptor-method} \alias{nested_type,Descriptor-method} \alias{enum_type,Descriptor,ANY,ANY-method} \alias{[[,Descriptor-method} \alias{names,Descriptor-method} \alias{length,Descriptor-method} \title{Class "Descriptor" } \description{ full descriptive information about a protocol buffer message type. This is a thin wrapper around the C++ class \code{Descriptor}} \section{Objects from the Class}{ Objects are usually created by calls to the \code{\link{P}} function. } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer holding a \code{Descriptor} object } \item{\code{type}:}{full name of the corresponding message type} } } \section{Methods}{ \describe{ \item{as.character}{\code{signature(x = "Descriptor")}: returns the debug string of the descriptor. This is retrieved by a call to the \code{DebugString} method of the Descriptor object. } \item{toString}{\code{signature(x = "Descriptor")}: same as \code{as.character} } \item{$}{\code{signature(x = "Descriptor")}: retrieves a descriptor for a member of the message type. This can either be another "Descriptor" instance describing a nested type, or a \linkS4class{EnumDescriptor} object describing an enum type, or a \linkS4class{FieldDescriptor} object describing a field of the message} \item{new}{\code{signature(Class = "Descriptor")}: creates a prototype message (\linkS4class{Message}) of this descriptor} \item{show}{\code{signature(object = "Descriptor")}: simple information} \item{containing_type}{\code{signature(object = "Descriptor")} : returns a descriptor of the message type that contains this message descriptor, or \code{NULL} if this is a top-level message type.} \item{field_count}{\code{signature(object = "Descriptor")} : The number of fields of this message type. } \item{nested_type_count}{\code{signature(object = "Descriptor")} : The number of nested types of this message type. } \item{enum_type_count}{\code{signature(object = "Descriptor")} : The number of enum types of this message type. } \item{field}{\code{signature(object = "Descriptor")} : extract a field descriptor from a descriptor. Exactly one argument of \code{index}, \code{number} or \code{name} has to be used. If \code{index} is used, the field descriptor is retrieved by position, using the \code{field} method of the \code{google::protobuf::Descriptor} C++ class. If \code{number} is used, the field descriptor is retrieved using the tag number, with the \code{FindFieldByNumber} C++ method. If \code{name} is used, the field descriptor is retrieved by name using the \code{FindFieldByName} } \item{nested_type}{\code{signature(object = "Descriptor")} : extracts a message type descriptor that is nested in this descriptor. Exactly one argument of \code{index} of \code{name} has to be used. If \code{index} is used, the nested type will be retrieved using its position with the \code{nested_type} method of the \code{google::protobuf::Descriptor} C++ class. If \code{name} is used, the nested type will be retrieved using its name, with the \code{FindNestedTypeByName} C++ method } \item{enum_type}{\code{signature(object = "Descriptor")} : extracts an enum type descriptor that is contained in this descriptor. Exactly one argument of \code{index} of \code{name} has to be used. If \code{index} is used, the enum type will be retrieved using its position with the \code{enum_type} method of the \code{google::protobuf::Descriptor} C++ class. If \code{name} is used, the enum type will be retrieved using its name, with the \code{FindEnumTypeByName} C++ method } \item{[[}{\code{signature(x = "Descriptor")}: extracts a field identified by its name or declared tag number} \item{names}{\code{signature(x = "Descriptor")} : extracts names of this descriptor} \item{length}{\code{signature(x = "Descriptor")} : extracts length of this descriptor} } } \references{ The \code{Descriptor} c++ class. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor?csw=1} } \author{ Romain Francois } \seealso{ the \code{\link{P}} function creates "Descriptor" messages. } \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P( "tutorial.Person" ) } # enum type Person$PhoneType # nested type Person$PhoneNumber # field Person$email # use this descriptor to create a message new( Person ) } \keyword{classes} RProtoBuf/man/ArrayInputStream-methods.Rd0000644000175000017500000000147312440004312020236 0ustar nileshnilesh\name{ArrayInputStream-methods} \docType{methods} \alias{ArrayInputStream} \alias{ArrayInputStream-methods} \alias{ArrayInputStream,raw,missing-method} \alias{ArrayInputStream,raw,integer-method} \alias{ArrayInputStream,raw,numeric-method} \title{Creates an ArrayInputStream} \description{ Constructor for \linkS4class{ArrayInputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(payload = "raw", block_size = "missing" )}}{Creates a \linkS4class{ArrayInputStream} using the raw vector as the payload of the stream} \item{\code{signature(payload = "raw", block_size = "integer" )}}{Creates a \linkS4class{ArrayInputStream} ... same with block size. } \item{\code{signature(payload = "raw", block_size = "numeric" )}}{Creates a \linkS4class{ArrayInputStream} ... same with block size. } }} \keyword{methods} RProtoBuf/man/enum_type.Rd0000644000175000017500000000050112440004312015317 0ustar nileshnilesh\name{enum_type-methods} \alias{enum_type} \alias{enum_type-methods} \title{Extract an enum type descriptor for a nested type} \description{ Extract a \linkS4class{EnumDescriptor} contained in a \linkS4class{Descriptor} } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/MethodDescriptor-class.Rd0000644000175000017500000000276312707407313017726 0ustar nileshnilesh\name{MethodDescriptor-class} \Rdversion{1.1} \docType{class} \alias{MethodDescriptor-class} \alias{as.character,MethodDescriptor-method} \alias{toString,MethodDescriptor-method} \alias{$,MethodDescriptor-method} \alias{$<-,MethodDescriptor-method} \alias{input_type} \alias{input_type-methods} \alias{input_type,MethodDescriptor-method} \alias{output_type} \alias{output_type-methods} \alias{output_type,MethodDescriptor-method} \title{Class "MethodDescriptor"} \description{R representation of Service Descriptors} \section{Objects from the Class}{ TODO } \section{Slots}{ \describe{ \item{\code{pointer}:}{External pointer to a \code{google::protobuf::MethodDescriptor} C++ object } \item{\code{name}:}{fully qualified name of the method} \item{\code{service}:}{fully qualified name of the service that defines this method} } } \section{Methods}{ \describe{ \item{as.character}{\code{signature(x = "MethodDescriptor")}: debug string of the method } \item{toString}{\code{signature(x = "MethodDescriptor")}: debug string of the method} \item{$}{\code{signature(x = "MethodDescriptor")}: ... } \item{$<-}{\code{signature(x = "MethodDescriptor")}: ... } \item{input_type}{\code{signature(object = "MethodDescriptor")}: the \linkS4class{Descriptor} of the input type of the method} \item{output_type}{\code{signature(object = "MethodDescriptor")}: the \linkS4class{Descriptor} of the output type of the method } } } \author{ Romain Francois } \keyword{classes} RProtoBuf/man/ArrayInputStream-class.Rd0000644000175000017500000000301014156423460017704 0ustar nileshnilesh\name{ArrayInputStream-class} \Rdversion{1.1} \docType{class} \alias{ArrayInputStream-class} \title{Class "ArrayInputStream" } \description{A \linkS4class{ZeroCopyInputStream} backed by an in-memory array of bytes} \section{Objects from the Class}{ Objects can be created by the \link{ArrayInputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{google::protobuf::io::ArrayInputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyInputStream}"}, directly. } \section{Methods}{ See \linkS4class{ZeroCopyInputStream} } \references{ The \code{ArrayInputStream} class from the protobuf C++ library. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream_impl_lite?csw=1} } \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyInputStream} for methods } \examples{ stream <- ArrayInputStream(as.raw(0:10)) stream$ReadRaw(5) stringsstream <- ArrayInputStream(as.raw(c(0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67))) stringsstream$ReadString(7) intstream <- ArrayInputStream(as.raw(c(0x9e, 0xa7, 0x05))) intstream$ReadVarint32() } % local({ % stream <- ArrayInputStream( as.raw(0:10) ) % stopifnot( identical( stream$Next(), as.raw(0:10) ) ) % stream$BackUp( 5 ) % stopifnot( identical( stream$Next(), as.raw(6:10) ) ) % % # limiting the block size % stream <- ArrayInputStream( as.raw(0:10), 5 ) % stopifnot( identical(length( stream$Next() ), 5L ) ) % }) \keyword{classes} RProtoBuf/man/FileOutputStream-methods.Rd0000644000175000017500000000076012440004312020236 0ustar nileshnilesh\name{FileOutputStream-methods} \docType{methods} \alias{FileOutputStream} \alias{FileOutputStream-methods} \alias{FileOutputStream,character,integer,logical-method} \title{Creates an FileOutputStream} \description{ Constructor for \linkS4class{FileOutputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(filename = "character", block_size = "logical", close.on.delete = "logical" )}}{Creates a \linkS4class{FileOutputStream} writing to the given file.} }} \keyword{methods} RProtoBuf/man/type.Rd0000644000175000017500000000246512440004312014306 0ustar nileshnilesh\name{type-methods} \alias{type} \alias{type-methods} \alias{cpp_type} \alias{cpp_type-methods} \alias{TYPE_DOUBLE} \alias{TYPE_FLOAT} \alias{TYPE_INT64} \alias{TYPE_UINT64} \alias{TYPE_INT32} \alias{TYPE_FIXED64} \alias{TYPE_FIXED32} \alias{TYPE_BOOL} \alias{TYPE_STRING} \alias{TYPE_GROUP} \alias{TYPE_MESSAGE} \alias{TYPE_BYTES} \alias{TYPE_UINT32} \alias{TYPE_ENUM} \alias{TYPE_SFIXED32} \alias{TYPE_SFIXED64} \alias{TYPE_SINT32} \alias{TYPE_SINT64} \alias{CPPTYPE_INT32} \alias{CPPTYPE_INT64} \alias{CPPTYPE_UINT32} \alias{CPPTYPE_UINT64} \alias{CPPTYPE_DOUBLE} \alias{CPPTYPE_FLOAT} \alias{CPPTYPE_BOOL} \alias{CPPTYPE_ENUM} \alias{CPPTYPE_STRING} \alias{CPPTYPE_MESSAGE} \title{Gets the type or the C++ type of a field} \description{ Gets the type or the C++ type of a field } \arguments{ \item{object}{A \linkS4class{FieldDescriptor} object.} \item{as.string}{If true, print a string representation of the type.} } \seealso{ The method is implemented for the \linkS4class{FieldDescriptor} class } \keyword{methods} \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P( "tutorial.Person" )} type(Person$id) type(Person$id, as.string=TRUE) cpp_type(Person$email) cpp_type(Person$email, TRUE) }RProtoBuf/man/EnumDescriptor-class.Rd0000644000175000017500000000732612707407313017412 0ustar nileshnilesh\name{EnumDescriptor-class} \Rdversion{1.1} \docType{class} \alias{EnumDescriptor-class} \alias{show,EnumDescriptor-method} \alias{has,EnumDescriptor-method} \alias{as.character,EnumDescriptor-method} \alias{toString,EnumDescriptor-method} \alias{$,EnumDescriptor-method} \alias{containing_type,EnumDescriptor-method} \alias{length,EnumDescriptor-method} \alias{value_count} \alias{value_count-methods} \alias{value_count,EnumDescriptor-method} \alias{value} \alias{value-methods} \alias{value,EnumDescriptor-method} \alias{[[,EnumDescriptor-method} \alias{names,EnumDescriptor-method} \title{Class "EnumDescriptor" } \description{ R representation of an enum descriptor. This is a thin wrapper around the \code{EnumDescriptor} c++ class. } \section{Objects from the Class}{ Objects of this class are typically retrieved as members of \linkS4class{Descriptor} objects } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{EnumDescriptor} instance} \item{\code{name}:}{ simple name of the enum } \item{\code{full_name}:}{fully qualified name } \item{\code{type}:}{fully qualified name of the type that contains this enumeration} } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "EnumDescriptor")}: small information } \item{as.character}{\code{signature(x = "EnumDescriptor")}: returns the debug string of the enum descriptor. This is retrieved by a call to the \code{DebugString} method of the EnumDescriptor object. } \item{toString}{\code{signature(x = "EnumDescriptor")}: same as \code{as.character} } \item{$}{\code{signature(x = "EnumDescriptor")}: get the number associated with the name} \item{has}{\code{signature(object = "EnumDescriptor")}: indicate if the given name is a constant present in this enum.} \item{containing_type}{\code{signature(object = "EnumDescriptor")} : returns a \linkS4class{Descriptor} of the message type that contains this enum descriptor, or NULL if this is a top level enum descriptor.} \item{length}{\code{signature(x = "EnumDescriptor")} : number of constants in this enum.} \item{value_count}{\code{signature(object = "EnumDescriptor")} : number of constants in this enum.} \item{value}{\code{signature(object = "EnumDescriptor")} : extracts an \linkS4class{EnumValueDescriptor}. Exactly one argument of \code{index}, \code{number} or \code{name} has to be used. If \code{index} is used, the enum value descriptor is retrieved by position, using the \code{value} method of the C++ class. If \code{number} is used, the enum value descriptor is retrieved using the value of the constant, using the \code{FindValueByNumber} C++ method. If \code{name} is used, the enum value descriptor is retrieved using the name of the constant, using the \code{FindValueByName} C++ method. } \item{[[}{\code{signature(x = "EnumDescriptor")}: extracts field identified by its name or declared tag number} \item{names}{\code{signature(x = "EnumDescriptor")} : extracts names of this enum} } } \references{ The \code{EnumDescriptor} C++ class } \author{ Romain Francois } \seealso{The \linkS4class{Descriptor} class} \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P("tutorial.Person") } # enum type Person$PhoneType has(Person$PhoneType, "MOBILE") has(Person$PhoneType, "HOME") has(Person$PhoneType, "WORK") has(Person$PhoneType, "FOOBAR") length(Person$PhoneType) } \keyword{classes} RProtoBuf/man/serialize_pb.Rd0000644000175000017500000000262612710022354016002 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/serialize_pb.R \name{serialize_pb} \alias{can_serialize_pb} \alias{serialize_pb} \alias{unserialize_pb} \title{Serialize R object to Protocol Buffer Message.} \usage{ serialize_pb(object, connection, ...) } \arguments{ \item{object}{R object to serialize} \item{connection}{passed on to \code{\link{serialize}}} \item{...}{additional arguments passed on to \code{\link{serialize}}} } \description{ Serializes R objects to a general purpose protobuf message using the same \code{rexp.proto} descriptor and mapping between R objects and protobuf mesages as RHIPE. } \details{ Clients need both the message and the \code{rexp.proto} descriptor to parse serialized R objects. The latter is included in the the package installation \code{proto} directory: \code{system.file(package="RProtoBuf", "proto/rexp.proto")} The following storage types are natively supported by the descriptor: \code{character}, \code{raw}, \code{double}, \code{complex}, \code{integer}, \code{list}, and \code{NULL}. Objects with other storage types, such as functions, environments, S4 classes, etc, are serialized using base R \code{\link{serialize}} and stored in the proto \code{native} type. Missing values, attributes and numeric precision will be preserved. } \examples{ msg <- tempfile(); serialize_pb(iris, msg); obj <- unserialize_pb(msg); identical(iris, obj); } RProtoBuf/man/ServiceDescriptor-class.Rd0000644000175000017500000000337512707407313020106 0ustar nileshnilesh\name{ServiceDescriptor-class} \Rdversion{1.1} \docType{class} \alias{ServiceDescriptor-class} \alias{as.character,ServiceDescriptor-method} \alias{toString,ServiceDescriptor-method} \alias{show,ServiceDescriptor-method} \alias{$,ServiceDescriptor-method} \alias{[[,ServiceDescriptor-method} \alias{length,ServiceDescriptor-method} \alias{method_count} \alias{method_count-methods} \alias{method_count,ServiceDescriptor-method} \alias{method} \alias{method-methods} \alias{method,ServiceDescriptor-method} \title{Class "ServiceDescriptor"} \description{R representation of Service Descriptors} \section{Objects from the Class}{ TODO } \section{Slots}{ \describe{ \item{\code{pointer}:}{External pointer to a \code{google::protobuf::ServiceDescriptor} C++ object } \item{\code{name}:}{fully qualified name of the service } } } \section{Methods}{ \describe{ \item{as.character}{\code{signature(x = "ServiceDescriptor")}: debug string of the service } \item{toString}{\code{signature(x = "ServiceDescriptor")}: debug string of the service} \item{show}{\code{signature(x = "ServiceDescriptor")}: ... } \item{$}{\code{signature(x = "ServiceDescriptor")}: invoke pseudo methods or retrieve method descriptors contained in this service descriptor. } \item{[[}{\code{signature(x = "ServiceDescriptor")}: extracts methods descriptors contained in this service descriptor} \item{length}{\code{signature(x = "ServiceDescriptor")}: number of \linkS4class{MethodDescriptor} } \item{method_count}{\code{signature(x = "ServiceDescriptor")}: number of \linkS4class{MethodDescriptor} } \item{method}{\code{signature(x = "ServiceDescriptor")}: retrieves a \linkS4class{MethodDescriptor} } } } \author{ Romain Francois } \keyword{classes} RProtoBuf/man/FileDescriptor-class.Rd0000644000175000017500000000327214156423460017362 0ustar nileshnilesh\name{FileDescriptor-class} \Rdversion{1.1} \docType{class} \alias{FileDescriptor-class} \alias{as.character,FileDescriptor-method} \alias{toString,FileDescriptor-method} \alias{$,FileDescriptor-method} \alias{show,FileDescriptor-method} \alias{name,FileDescriptor-method} \title{Class "FileDescriptor"} \description{Class "FileDescriptor"} \section{Objects from the Class}{ Objects are usually created using the \code{\link{fileDescriptor}} method } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to a \code{google::protobuf::FileDescriptor} C++ object } \item{\code{package}:}{the package name defined in the file, e.g. 'tutorial'.} \item{\code{filename}:}{the filename of this FileDescriptor} } } \section{Methods}{ \describe{ \item{$}{\code{signature(x = "FileDescriptor")}: used to invoke a pseudo method of the file descriptor or get a top level message, enum or service descriptor} \item{toString}{\code{signature(x = "FileDescriptor" )} : gets the debug string} \item{as.character}{\code{signature(x = "FileDescriptor" )} : gets the debug string} \item{show}{\code{signature(x = "FileDescriptor" )} : prints small text} \item{name}{\code{signature(object = "FileDescriptor" )} : name of the file} } } \references{ The \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor?csw=1} } \author{ Romain Francois } \keyword{classes} \seealso{ \linkS4class{Descriptor} } \examples{ # example proto file supplied with this package desc <- P("tutorial.Person") person <- new(desc) person$fileDescriptor() name(person$fileDescriptor()) # [1] "addressbook.proto" as.character(person$fileDescriptor()) } RProtoBuf/man/Skip-methods.Rd0000644000175000017500000000024312440004312015664 0ustar nileshnilesh\name{Skip-methods} \docType{methods} \alias{Skip} \alias{Skip-methods} \title{Skips a number of bytes} \description{ Skips a number of bytes } \keyword{methods} RProtoBuf/man/with.Rd0000644000175000017500000000233212440004312014271 0ustar nileshnilesh\name{with.Message} \alias{with.Message} \alias{within.Message} \title{ with and within methods for protocol buffer messages } \description{ Convenience wrapper that allow getting and setting fields of protocol buffer messages from within the object } \usage{ \S3method{with}{Message}(data, expr, ...) \S3method{within}{Message}(data, expr, ...) } \arguments{ \item{data}{A protocol buffer message, instance of \linkS4class{Message} } \item{expr}{R expression to evaluate} \item{\dots}{ignored} } \details{ The expression is evaluated in an environment that allows to set and get fields of the message The fields of the message are mapped to active bindings (see \link{makeActiveBinding}) so that they can be accessed and modified from within the environment. } \value{ \code{with} returns the value of the expression and \code{within} returns the \code{data} argument. } \author{ Romain Francois } \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P( "tutorial.Person") } romain <- within( new( Person ), { email <- "francoisromain@free.fr" id <- 10L } ) } \keyword{ classes } RProtoBuf/man/label.Rd0000644000175000017500000000153612440004312014402 0ustar nileshnilesh\name{label-methods} \alias{label} \alias{label-methods} \alias{LABEL_OPTIONAL} \alias{LABEL_REQUIRED} \alias{LABEL_REPEATED} \title{Gets the label of a field} \description{ Gets the label of a field (optional, required, or repeated). } \arguments{ \item{object}{A \linkS4class{FieldDescriptor} object.} \item{as.string}{If true, print a string representation of the type.} } \seealso{ The method is implemented for the \linkS4class{FieldDescriptor} class } \keyword{methods} \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{ Person <- P("tutorial.Person") } label(Person$id) label(Person$email) label(Person$phone) label(Person$id, TRUE) label(Person$email, TRUE) label(Person$phone, TRUE) LABEL_OPTIONAL LABEL_REQUIRED LABEL_REPEATED }RProtoBuf/man/ByteCount-methods.Rd0000644000175000017500000000050312440004312016671 0ustar nileshnilesh\name{ByteCount-methods} \docType{methods} \alias{ByteCount} \alias{ByteCount-methods} \title{The number of bytes read/written since the object was created} \description{ The number of bytes read/written since the object was created } \seealso{ \linkS4class{ZeroCopyInputStream} implements ByteCount. } \keyword{methods} RProtoBuf/man/bytesize.Rd0000644000175000017500000000112713776225671015207 0ustar nileshnilesh\name{bytesize-methods} \docType{methods} \alias{bytesize} \alias{bytesize-methods} \alias{bytesize,Message-method} \title{The number of bytes taken by a message } \description{ The number of bytes taken by a \linkS4class{Message} } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{ The number of bytes the message would take when serialized } }} \keyword{methods} \examples{ message <- new( tutorial.Person, name = "dddd", email = "eeeeeee", id = 1 ) bytesize( message ) \dontshow{ stopifnot( all.equal( bytesize(message), length(serialize(message, NULL ) ) ) ) } } RProtoBuf/man/Next-methods.Rd0000644000175000017500000000040312440004312015672 0ustar nileshnilesh\name{Next-methods} \docType{methods} \alias{Next} \alias{Next-methods} \title{Obtains a chunk of data from the stream} \description{ Obtains a chunk of data from the stream } \seealso{ \linkS4class{ZeroCopyInputStream} implements Next. } \keyword{methods} RProtoBuf/man/name.Rd0000644000175000017500000000125312440004312014237 0ustar nileshnilesh\name{name} \docType{methods} \alias{name} \alias{name-methods} \alias{name,Descriptor-method} \alias{name,FieldDescriptor-method} \alias{name,EnumDescriptor-method} \alias{name,ServiceDescriptor-method} \alias{name,MethodDescriptor-method} \title{Name or full name of a descriptor} \description{ name or full name of a descriptor } \section{Methods}{ \describe{ \item{\code{signature(object = "Descriptor")}}{ ... } \item{\code{signature(object = "FieldDescriptor")}}{ ... } \item{\code{signature(object = "EnumDescriptor")}}{ ... } \item{\code{signature(object = "ServiceDescriptor")}}{ ... } \item{\code{signature(object = "MethodDescriptor")}}{ ... } }} \keyword{methods} RProtoBuf/man/RProtoBuf-package.Rd0000644000175000017500000000206112566371245016615 0ustar nileshnilesh\name{RProtoBuf-package} \alias{RProtoBuf-package} \alias{RProtoBuf} \docType{package} \title{R Interface to the Protocol Buffers API} \description{ Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats. This package provides R API to create, manipulate, parse and serialize protocol buffer messages from R } \author{Romain Francois, Dirk Eddelbuettel, Murray Stokely and Jeroen Ooms.} \references{\url{https://github.com/eddelbuettel/rprotobuf}} \keyword{package} \seealso{\linkS4class{Message} for some examples} \examples{ \dontrun{ # an example proto file system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # create a message of type AddressBook, defined in the example proto file demo( "addressbook", package = "RProtoBuf" ) # using R binary connections and files to read and write messages demo( "io", package = "RProtoBuf" ) # more documentation in the vignette vignette( "RProtoBuf", package = "RProtoBuf" ) } } RProtoBuf/man/fileDescriptor.Rd0000644000175000017500000000233712440004312016301 0ustar nileshnilesh\name{fileDescriptor-methods} \docType{methods} \alias{fileDescriptor} \alias{fileDescriptor-methods} \alias{fileDescriptor,Descriptor-method} \alias{fileDescriptor,Message-method} \alias{fileDescriptor,EnumDescriptor-method} \alias{fileDescriptor,FieldDescriptor-method} \alias{fileDescriptor,ServiceDescriptor-method} \alias{fileDescriptor,MethodDescriptor-method} \title{gets the file descriptor of an object} \description{ Gets the file descriptor of an object } \section{Methods}{ \describe{ \item{\code{signature(object = "Descriptor")}}{ retrieves the file descriptor associated with this descriptor} \item{\code{signature(object = "Message")}}{ retrieves the file descriptor associated with the descriptor of this message } \item{\code{signature(object = "EnumDescriptor")}}{ retrieves the file descriptor associated with the enum descriptor } \item{\code{signature(object = "FieldDescriptor")}}{ retrieves the file descriptor associated with the field descriptor } \item{\code{signature(object = "ServiceDescriptor")}}{ retrieves the file descriptor associated with the service descriptor } \item{\code{signature(object = "MethodDescriptor")}}{ retrieves the file descriptor associated with the method descriptor } }} \keyword{methods} RProtoBuf/man/BackUp-methods.Rd0000644000175000017500000000041512440004312016124 0ustar nileshnilesh\name{BackUp-methods} \docType{methods} \alias{BackUp} \alias{BackUp-methods} \title{Backs up a number of bytes from a stream} \description{ Backs up a number of bytes from a stream } \seealso{ \linkS4class{ZeroCopyInputStream} implements BackUp. } \keyword{methods} RProtoBuf/man/ArrayOutputStream-methods.Rd0000644000175000017500000000254612440004312020441 0ustar nileshnilesh\name{ArrayOutputStream-methods} \docType{methods} \alias{ArrayOutputStream} \alias{ArrayOutputStream-methods} \alias{ArrayOutputStream,integer,missing-method} \alias{ArrayOutputStream,integer,integer-method} \alias{ArrayOutputStream,integer,numeric-method} \alias{ArrayOutputStream,numeric,missing-method} \alias{ArrayOutputStream,numeric,integer-method} \alias{ArrayOutputStream,numeric,numeric-method} \title{Creates an ArrayOutputStream} \description{ Constructor for \linkS4class{ArrayOutputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(size = "integer", block_size = "missing" )}}{Creates a \linkS4class{ArrayOutputStream} using of the given size} \item{\code{signature(size = "integer", block_size = "integer" )}}{Creates a \linkS4class{ArrayOutputStream} ... same with block size. } \item{\code{signature(size = "integer", block_size = "numeric" )}}{Creates a \linkS4class{ArrayOutputStream} ... same with block size. } \item{\code{signature(size = "numeric", block_size = "missing" )}}{Creates a \linkS4class{ArrayOutputStream} using of the given size} \item{\code{signature(size = "numeric", block_size = "integer" )}}{Creates a \linkS4class{ArrayOutputStream} ... same with block size. } \item{\code{signature(size = "numeric", block_size = "numeric" )}}{Creates a \linkS4class{ArrayOutputStream} ... same with block size. } }} \keyword{methods} RProtoBuf/man/size.Rd0000644000175000017500000000236713617260253014317 0ustar nileshnilesh\name{size-methods} \docType{methods} \alias{size} \alias{size-methods} \alias{size,Message-method} \title{Size of a message field} \description{ The number of object currently in a given field of a protocol buffer message. For non repeated fields, the size is 1 if the message has the field, 0 otherwise. For repeated fields, the size is the number of objects in the array. For repeated fields, the size can also be assigned to in order to shrink or grow the vector. Numeric types are given a default value of 0 when the new size is greater than the existing size. Character types are given a default value of "". Growing a repeated field in this way is not supported for message, group, and enum types. } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{Number of objects in a message field} }} \examples{ unitest.proto.file <- system.file("tinytest", "data", "unittest.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) test <- new(protobuf_unittest.TestAllTypes) test$size("optional_int32") test$add("repeated_int32", 1:10) test$size("repeated_int32") test$repeated_int32 size(test, "repeated_int32") <- 5 test$repeated_int32 size(test, "repeated_int32") <- 15 test$repeated_int32 } \keyword{methods} RProtoBuf/man/clone.Rd0000644000175000017500000000171012440004312014415 0ustar nileshnilesh\name{clone-methods} \docType{methods} \alias{clone} \alias{clone-methods} \alias{clone,Message-method} \title{Clone protocol buffer messages} \description{ Generic "clone" function and associated method for \linkS4class{Message} objects } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{ clone the message } }} \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P("tutorial.Person")} # creating a prototype message from the descriptor sheep <- new( Person, email = "francoisromain@free.fr", id = 2 ) # cloning the sheep newsheep <- clone( sheep ) # clone and update at once newsheep <- clone( sheep, id = 3 ) # this can also be used as a pseudo method sheep$clone() sheep$clone( id = 3 ) } \keyword{methods} RProtoBuf/man/Message-class.Rd0000644000175000017500000001432614156423460016032 0ustar nileshnilesh\name{Message-class} \Rdversion{1.1} \docType{class} \alias{Message-class} \alias{as.character,Message-method} \alias{$<-,Message-method} \alias{$,Message-method} \alias{[[,Message-method} \alias{[[<-,Message-method} \alias{serialize,Message-method} \alias{show,Message-method} \alias{update,Message-method} \alias{length,Message-method} \alias{names,Message-method} \alias{str,Message-method} \alias{toString,Message-method} \alias{toJSON} \alias{toJSON,Message-method} \alias{identical,Message,Message-method} \alias{==,Message,Message-method} \alias{!=,Message,Message-method} \alias{all.equal,Message,Message-method} \alias{getExtension,Message-method} \alias{setExtension,Message-method} \alias{getExtension} \alias{setExtension} \title{Class "Message" } \description{ R representation of protocol buffer messages. This is a thin wrapper around the \code{Message} c++ class that holds the actual message as an external pointer. } \section{Objects from the Class}{ Objects are typically created by the \code{new} function invoked on a \linkS4class{Descriptor} object. } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the c++ \code{Message} object} \item{\code{type}:}{fully qualified name of the message type} } } \section{Methods}{ \describe{ \item{as.character}{\code{signature(x = "Message")}: returns the debug string of the message. This is built from a call to the \code{DebugString} method of the \code{Message} object} \item{toString}{\code{signature(x = "Message")}: same as \code{as.character} } \item{toJSON}{\code{signature(x = "Message")}: returns the JSON representation of the message. This is built from a call to the \code{google::protobuf::util::MessageToJsonString} method and accepts two arguments \code{preserve_proto_field_names} - if FALSE (the default) convert field names to camelCase \code{always_print_primitive_fields} - whether to return the default value for missing primitive fields (default false)} \item{$<-}{\code{signature(x = "Message")}: set the value of a field of the message. } \item{$}{\code{signature(x = "Message")}: gets the value of a field. Primitive types are brought back to R as R objects of the closest matching R type. Messages are brought back as instances of the \code{Message} class.} \item{[[}{\code{signature(x = "Message")}: extracts a field identified by its name or declared tag number } \item{[[<-}{\code{signature(x = "Message")}: replace the value of a field identified by its name or declared tag number } \item{serialize}{\code{signature(object = "Message")}: serialize a message. If the "connection" argument is \code{NULL}, the payload of the message is returned as a raw vector, if the "connection" argument is a binary writable connection, the payload is written into the connection. If "connection" is a character vector, the message is sent to the file (in binary format). } \item{show}{\code{signature(object = "Message")}: displays a short text about the message } \item{update}{\code{signature(object = "Message")}: set several fields of the message at once } \item{length}{\code{signature(x = "Message")}: The number of fields actually contained in the message. A field counts in these two situations: the field is repeated and the field size is greater than 0, the field is not repeated and the message has the field.} \item{setExtension}{\code{signature(object = "Message")}: set an extension field of the Message.} \item{getExtension}{\code{signature(object = "Message")}: get the value of an extension field of the Message.} \item{str}{\code{signature(object = "Message")}: displays the structure of the message } \item{identical}{\code{signature(x = "Message", y = "Message")}: Test if two messages are exactly identical } \item{==}{\code{signature(e1 = "Message", e2 = "Message")}: Same as \code{identical} } \item{!=}{\code{signature(e1 = "Message", e2 = "Message")}: Negation of \code{identical} } \item{all.equal}{\code{signature(e1 = "Message", e2 = "Message")}: Test near equality } \item{names}{\code{signature(x = "Message")}: extracts the names of the message. } } } \references{ The \code{Message} class from the C++ proto library. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message?csw=1} } \author{ Romain Francois } \seealso{ \code{\link{P}} creates objects of class \linkS4class{Descriptor} that can be used to create messages. } \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{ Person <- P("tutorial.Person") } PhoneNumber <- P( "tutorial.Person.PhoneNumber" ) # creating a prototype message from the descriptor p <- new( Person ) p$email # not set, returns default value p$id # not set, returns default value as.character( p ) # empty has( p, "email" ) # is the "email" field set has( p, "phone" ) # is the "email" field set length( p ) # number of fields actually set # update several fields at once romain <- update( new( Person ), email = "francoisromain@free.fr", id = 1, name = "Romain Francois", phone = new( PhoneNumber , number = "+33(0)...", type = "MOBILE" ) ) # supply parameters to the constructor dirk <- new( Person, email = "edd@debian.org", id = 2, name = "Dirk Eddelbuettel" ) # update the phone repeated field with a list of PhoneNumber messages dirk$phone <- list( new( PhoneNumber , number = "+01...", type = "MOBILE" ), new( PhoneNumber , number = "+01...", type = "HOME" ) ) # with/within style saptarshi <- within( new(Person), { id <- 3 name <- "Saptarshi Guha" email <- "saptarshi.guha@gmail.com" } ) # make an addressbook book <- new( tutorial.AddressBook, person = list( romain, dirk, saptarshi ) ) # serialize the message to a file tf <- tempfile( ) serialize( book, tf ) # the payload of the message serialize( book, NULL ) # read the file into a new message m <- tutorial.AddressBook$read( tf ) writeLines( as.character( m ) ) sapply( m$person, function(p) p$name ) } \keyword{classes} RProtoBuf/man/nested_type.Rd0000644000175000017500000000051012440004312015635 0ustar nileshnilesh\name{nested_type-methods} \alias{nested_type} \alias{nested_type-methods} \title{Extract a message type descriptor for a nested type} \description{ Extract a \linkS4class{Descriptor} nested in another \linkS4class{Descriptor} } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/FieldDescriptor-class.Rd0000644000175000017500000001257112440004312017511 0ustar nileshnilesh\name{FieldDescriptor-class} \Rdversion{1.1} \docType{class} \alias{FieldDescriptor-class} \alias{show,FieldDescriptor-method} \alias{$,FieldDescriptor-method} \alias{as.character,FieldDescriptor-method} \alias{toString,FieldDescriptor-method} \alias{containing_type,FieldDescriptor-method} \alias{is_extension,FieldDescriptor-method} \alias{number,FieldDescriptor-method} \alias{type,FieldDescriptor-method} \alias{cpp_type,FieldDescriptor-method} \alias{label,FieldDescriptor-method} \alias{is_required} \alias{is_optional} \alias{is_repeated} \alias{is_required-methods} \alias{is_optional-methods} \alias{is_repeated-methods} \alias{is_required,FieldDescriptor-method} \alias{is_optional,FieldDescriptor-method} \alias{is_repeated,FieldDescriptor-method} \alias{has_default_value} \alias{has_default_value-methods} \alias{has_default_value,FieldDescriptor-method} \alias{default_value} \alias{default_value-methods} \alias{default_value,FieldDescriptor-method} \alias{message_type} \alias{message_type-methods} \alias{message_type,FieldDescriptor-method} \alias{enum_type,FieldDescriptor,missing,missing-method} \title{Class "FieldDescriptor"} \description{R representation of message type field descriptor. This is a thin wrapper around the C++ class \code{FieldDescriptor} } \section{Objects from the Class}{ Objects typically are retrieved from \linkS4class{FieldDescriptor} } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{FieldDescriptor} c++ object } \item{\code{name}:}{ name of the field within the message type } \item{\code{full_name}:}{Fully qualified name of the field} \item{\code{type}:}{Fully qualified name of the type that contains this field } } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "FieldDescriptor")}: small description } \item{as.character}{\code{signature(x = "FieldDescriptor")}: returns the debug string of the field descriptor. This is retrieved by a call to the \code{DebugString} method of the FieldDescriptor object. } \item{toString}{\code{signature(x = "FieldDescriptor")}: same as \code{as.character} } \item{$}{\code{signature(x = "FieldDescriptor")}: used to invoke pseudo methods } \item{containing_type}{\code{signature(object = "FieldDescriptor")} : returns a \linkS4class{Descriptor} of the message type that contains this field descriptor.} \item{is_extension}{\code{signature(object = "FieldDescriptor")} : indicates if this is an extension.} \item{number}{\code{signature(object = "FieldDescriptor")} : gets the declared tag number of this field.} \item{type}{\code{signature(object = "FieldDescriptor")} : type of this field.} \item{cpp_type}{\code{signature(object = "FieldDescriptor")} : c++ type of this field.} \item{label}{\code{signature(object = "FieldDescriptor")} : label of this field.} \item{is_required}{\code{signature(object = "FieldDescriptor")} : is this field required.} \item{is_optional}{\code{signature(object = "FieldDescriptor")} : is this field optional.} \item{is_repeated}{\code{signature(object = "FieldDescriptor")} : is this field repeated.} \item{has_default_value}{\code{signature(object = "FieldDescriptor")} : indicates if this field has a default value.} \item{default_value}{\code{signature(object = "FieldDescriptor")} : the default value of this field.} \item{message_type}{\code{signature(object = "FieldDescriptor")} : the \linkS4class{Descriptor} for the associated message type. Generates an error if this field is not a message type field.} \item{enum_type}{\code{signature(object = "FieldDescriptor")} : the \linkS4class{EnumDescriptor} for the associated enum type.Generates an error if this field is not an enum type field } } } \references{ The \code{FieldDescriptor} C++ class } \author{ Romain Francois } \seealso{ \linkS4class{Descriptor} } \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P("tutorial.Person") } # field descriptor object Person$email # debug string as.character( Person$email ) # or as a pseudo method Person$email$as.character() Person$email$is_required() Person$email$is_optional() Person$email$is_repeated() Person$email$has_default_value() Person$email$default_value() Person$email$is_extension() # Get the default values has_default_value(Person$id) has_default_value(Person$email) has_default_value(Person$phone) default_value(Person$id) default_value(Person$email) default_value(Person$phone) # Get the types of field descriptors type(Person$id) type(Person$id, as.string=TRUE) cpp_type(Person$email) cpp_type(Person$email, TRUE) # Get the label of a field descriptor label(Person$id) label(Person$email) label(Person$phone) label(Person$id, TRUE) label(Person$email, TRUE) label(Person$phone, TRUE) LABEL_OPTIONAL LABEL_REQUIRED LABEL_REPEATED # Test if a field is optional is_optional(Person$id) is_optional(Person$email) is_optional(Person$phone) # Test if a field is repeated is_repeated(Person$id) is_repeated(Person$email) is_repeated(Person$phone) # Test if a field is required is_required(Person$id) is_required(Person$email) is_required(Person$phone) # Return the class of a message field message_type(Person$phone) } \keyword{classes} RProtoBuf/man/enum_type_count.Rd0000644000175000017500000000040112440004312016526 0ustar nileshnilesh\name{enum_type_count-methods} \alias{enum_type_count} \alias{enum_type_count-methods} \title{The number of enum types} \description{ The number of enum types } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/ConnectionInputStream-class.Rd0000644000175000017500000000145412440004312020720 0ustar nileshnilesh\name{ConnectionInputStream-class} \Rdversion{1.1} \docType{class} \alias{ConnectionInputStream-class} \title{Class "ConnectionInputStream" } \description{A \linkS4class{ZeroCopyInputStream} reading from a binary R connection} \section{Objects from the Class}{ Objects can be created by the \link{ConnectionInputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{rprotobuf::ConnectionInputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyInputStream}"}, directly. } \section{Methods}{ See \linkS4class{ZeroCopyInputStream} } \references{ The internal C++ class \code{ConnectionInputStream} } \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyInputStream} for methods } \keyword{classes} RProtoBuf/man/containing_type-methods.Rd0000644000175000017500000000116212440004312020151 0ustar nileshnilesh\name{containing_type-methods} \alias{containing_type} \alias{containing_type-methods} \title{Gets the message type descriptor that contains a descriptor} \description{ Gets a \linkS4class{Descriptor} describing the message type that contains the descriptor. } \seealso{ The method is implemented for these classes : \linkS4class{Descriptor}, \linkS4class{EnumDescriptor}, \linkS4class{FieldDescriptor} } \examples{ # Containing type of a field is the message descriptor tutorial.Person$id$containing_type() # No containing type for the top-level message descriptor. tutorial.Person$containing_type() } \keyword{methods} RProtoBuf/man/has.Rd0000644000175000017500000000311613617260253014111 0ustar nileshnilesh\name{has-methods} \docType{methods} \alias{has} \alias{has-methods} \alias{has,Message-method} \title{Indicates if an object has the given field set} \description{ This generic method, currently implemented for \linkS4class{Message} and \linkS4class{EnumDescriptor} indicates if the message or enum descriptor has the given field set. For messages and non-repeated fields, a call to the \code{HasField} method of the corresponding \code{Message} is issued. For messages and repeated fields, a call to the \code{FieldSize} method is issued, and the message is declared to have the field if the size is greater than 0. \code{NULL} is returned if the descriptor for the message does not contain the given field at all. For EnumDescriptors, a boolean value indicates if the given name is present in the enum definition. } \section{Methods}{ \describe{ \item{has}{\code{signature(object = "Message")}: Indicates if the message has a given field.} \item{has}{\code{signature(object = "EnumDescriptor")}: Indicates if the EnumDescriptor has a given named element.} } } \examples{ unitest.proto.file <- system.file("tinytest", "data", "unittest.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) test <- new(protobuf_unittest.TestAllTypes) test$has("optional_int32") # FALSE test$add("repeated_int32", 1:10) test$has("repeated_int32") # TRUE test$has("nonexistant") # NULL has(protobuf_unittest.TestAllTypes$NestedEnum, "FOO") has(protobuf_unittest.TestAllTypes$NestedEnum, "BAR") has(protobuf_unittest.TestAllTypes$NestedEnum, "XXX") } \keyword{methods} RProtoBuf/man/readProtoFiles.Rd0000644000175000017500000000375313300665751016270 0ustar nileshnilesh\name{readProtoFiles} \alias{readProtoFiles} \alias{readProtoFiles2} \alias{resetDescriptorPool} \title{protocol buffer descriptor importer} \description{ Imports proto files into the descriptor pool that is then used by the \code{P} function to resolve message type names. } \usage{ readProtoFiles(files, dir, package="RProtoBuf", pattern="\\\\.proto$", lib.loc=NULL) readProtoFiles2(files, dir=".", pattern="\\\\.proto$", recursive=FALSE, protoPath=getwd()) resetDescriptorPool() } \arguments{ \item{files}{Proto files} \item{dir}{Directory. If \code{files} is not specified, files with the "proto" extension in the \code{dir} directory are imported} \item{package}{R package name. If \code{files} and \code{dir} are missing, "proto" files in the "proto" directory of the package tree are imported.} \item{pattern}{A filename pattern to match proto files when using \code{dir}.} \item{recursive}{Whether to descend recursively into \code{dir}.} \item{lib.loc}{Library location.} \item{protoPath}{Search path for proto file imports.} } \details{ \code{readProtoFiles2} is different from \code{readProtoFiles} to be consistent with the behavior of \code{protoc} command line tool in being explicit about the search path for proto import statements. In addition, we also require that both \code{files} and \code{dir} arguments are interpreted relative to \code{protoPath}, so that there is consistency in future imports of the same files through import statements of other proto files. \code{resetDescriptorPool} clears all imported proto definitions. } \value{\code{NULL}, invisibly.} \author{Romain Francois } \seealso{\code{\link{P}}} \examples{ \dontrun{ # from a package readProtoFiles(package = "RProtoBuf") # from a directory proto.dir <- system.file("proto", package = "RProtoBuf") readProtoFiles(dir = proto.dir) # set of files proto.files <- list.files(proto.dir, full.names = TRUE) readProtoFiles(proto.files) } } \keyword{programming} RProtoBuf/man/ArrayOutputStream-class.Rd0000644000175000017500000000166414156423460020122 0ustar nileshnilesh\name{ArrayOutputStream-class} \Rdversion{1.1} \docType{class} \alias{ArrayOutputStream-class} \title{Class "ArrayOutputStream" } \description{A \linkS4class{ZeroCopyOutputStream} backed by an in-memory array of bytes} \section{Objects from the Class}{ Objects can be created by the \link{ArrayOutputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{google::protobuf::io::ArrayOutputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyOutputStream}"}, directly. } \section{Methods}{ See \linkS4class{ZeroCopyOutputStream} } \references{ The \code{ArrayOutputStream} class from the protobuf C++ library. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream_impl_lite?csw=1} } \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyOutputStream} for methods } \keyword{classes} RProtoBuf/man/ZeroCopyOutputStream-class.Rd0000644000175000017500000000530714156423460020614 0ustar nileshnilesh\name{ZeroCopyOutputStream-class} \Rdversion{1.1} \docType{class} \alias{ZeroCopyOutputStream-class} \alias{ByteCount,ZeroCopyOutputStream-method} \alias{BackUp,ZeroCopyOutputStream-method} \alias{Next,ZeroCopyOutputStream,raw-method} \alias{$,ZeroCopyOutputStream-method} \alias{WriteRaw} \alias{WriteRaw-methods} \alias{WriteRaw,ZeroCopyOutputStream,raw-method} \alias{WriteString} \alias{WriteString-methods} \alias{WriteString,ZeroCopyOutputStream,character-method} \alias{WriteLittleEndian32} \alias{WriteLittleEndian32-methods} \alias{WriteLittleEndian32,ZeroCopyOutputStream,integer-method} \alias{WriteLittleEndian32,ZeroCopyOutputStream,numeric-method} \alias{WriteLittleEndian32,ZeroCopyOutputStream,raw-method} \alias{WriteLittleEndian64} \alias{WriteLittleEndian64-methods} \alias{WriteLittleEndian64,ZeroCopyOutputStream,integer-method} \alias{WriteLittleEndian64,ZeroCopyOutputStream,numeric-method} \alias{WriteLittleEndian64,ZeroCopyOutputStream,raw-method} \alias{WriteVarint32} \alias{WriteVarint32-methods} \alias{WriteVarint32,ZeroCopyOutputStream,integer-method} \alias{WriteVarint32,ZeroCopyOutputStream,numeric-method} \alias{WriteVarint32,ZeroCopyOutputStream,raw-method} \alias{WriteVarint64} \alias{WriteVarint64-methods} \alias{WriteVarint64,ZeroCopyOutputStream,integer-method} \alias{WriteVarint64,ZeroCopyOutputStream,numeric-method} \alias{WriteVarint64,ZeroCopyOutputStream,raw-method} \title{Virtual Class "ZeroCopyOutputStream" } \description{R wrapper for the ZeroCopyOutputStream c++ class} \section{Objects from the Class}{ This is a virtual class } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{google::protobuf::io::ZeroCopyOutputStream} object} } } \section{Methods}{ \describe{ \item{$}{\code{signature(x="ZeroCopyOutputStream")}: invokes a method} \item{Next}{\code{signature(object="ZeroCopyOutputStream", payload = "raw" )}: push the raw vector into the stream. Returns the number of bytes actually written.} \item{BackUp}{\code{signature(object="ZeroCopyOutputStream")}: Backs up a number of bytes, so that the end of the last buffer returned by \code{Next} is not actually written.} \item{ByteCount}{\code{signature(object="ZeroCopyOutputStream")}: Returns the total number of bytes written since this object was created. } \item{WriteRaw}{\code{signature(object="ZeroCopyOuputStream", payload = "raw"}: write the raw bytes to the stream} } } \author{ Romain Francois } \references{ The \code{google::protobuf::io::ZeroCopyOutputStream} C++ class. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream?csw=1} } \seealso{ TODO: add classes that extend } \keyword{classes} RProtoBuf/man/set.Rd0000644000175000017500000000060112440004312014106 0ustar nileshnilesh\name{set-methods} \docType{methods} \alias{set} \alias{set-methods} \alias{set,Message-method} \title{set a subset of values of a repeated field of a message} \description{ set a subset of values of a repeated field of a message } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{set a subset of values of a repeated field of a message} }} \keyword{methods} RProtoBuf/man/completion.Rd0000644000175000017500000000411712440004312015472 0ustar nileshnilesh\name{completion} \alias{.DollarNames.Message} \alias{.DollarNames.Descriptor} \alias{.DollarNames.EnumDescriptor} \alias{.DollarNames.FieldDescriptor} \alias{.DollarNames.FileDescriptor} \alias{.DollarNames.ServiceDescriptor} \alias{.DollarNames.MethodDescriptor} \alias{.DollarNames.ZeroCopyInputStream} \alias{.DollarNames.ZeroCopyOutputStream} \title{ Completion support for protocol buffer messages and descriptors } \description{ These functions support completion of protocol buffer messages and descriptors. } \usage{ \S3method{.DollarNames}{Message}(x, pattern = "") \S3method{.DollarNames}{Descriptor}(x, pattern = "") \S3method{.DollarNames}{EnumDescriptor}(x, pattern = "") \S3method{.DollarNames}{FieldDescriptor}(x, pattern = "") \S3method{.DollarNames}{FileDescriptor}(x, pattern = "") \S3method{.DollarNames}{ServiceDescriptor}(x, pattern = "") \S3method{.DollarNames}{MethodDescriptor}(x, pattern = "") \S3method{.DollarNames}{ZeroCopyInputStream}(x, pattern = "") \S3method{.DollarNames}{ZeroCopyOutputStream}(x, pattern = "") } \arguments{ \item{x}{message (\linkS4class{Message}) or descriptor (\linkS4class{Descriptor}) } \item{pattern}{filter} } \value{ Character vector containing potential completions. For \linkS4class{Message} objects, completions are the fields of the message and a set of pseudo methods ("has") For \linkS4class{EnumDescriptor} objects, completions are the names of the possible constants For \linkS4class{Descriptor} objects, completions are the names of the fields, enum types and nested message types defined in the associated message type. For \linkS4class{FileDescriptor} objects, completions are the names of the top-level descriptors (message, enum or service) contained in the associated file, or pseudo methods. } \author{ Romain Francois } \examples{ # creating a prototype message from the descriptor p <- new( tutorial.Person ) .DollarNames( p ) .DollarNames( tutorial.Person ) # but this is usually used with the expansion on the command line # means "press the TAB key" # p$ # Person$ } \keyword{ programming } RProtoBuf/man/GetErrno-methods.Rd0000644000175000017500000000057012440004312016506 0ustar nileshnilesh\name{GetErrno-methods} \docType{methods} \alias{GetErrno} \alias{GetErrno-methods} \title{Get the error number for an I/O error} \description{ If an I/O error has occurred on this file descriptor, this is the errno from that error } \section{Methods}{ See classes \linkS4class{FileInputStream} and \linkS4class{FileOutputStream} for implementations. } \keyword{methods} RProtoBuf/man/readJSON.Rd0000644000175000017500000000230713776225671014757 0ustar nileshnilesh\name{readJSON-methods} \docType{methods} \alias{readJSON} \alias{readJSON-methods} \alias{readJSON,Descriptor,ANY-method} \alias{readJSON,Descriptor,character-method} \title{read a message in JSON format} \description{ Method to read a Message in JSON format } \section{Methods}{ \describe{ \item{\code{signature(descriptor = "Descriptor", input = "ANY")}}{ Read the message from a connection (file, etc ...) } \item{\code{signature(descriptor = "Descriptor", input = "character")}}{ Read the message directly from the character string } }} \keyword{methods} \examples{ \dontrun{ # example file that contains a "tutorial.AddressBook" message book <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) # read the message message <- read( tutorial.AddressBook, book ) # Output in text format to a temporary file out.file <- tempfile() writeLines( message$toJSON(), file(out.file)) # Verify that we can read back in the message from a text file. message2 <- readJSON( tutorial.AddressBook, file(out.file, "rb")) # Verify that we can read back in the message from an unopened file. message3 <- readJSON( tutorial.AddressBook, file(out.file)) \dontshow{ stopifnot( identical( message, message2) ) } } } RProtoBuf/man/add.Rd0000644000175000017500000000120013617260253014056 0ustar nileshnilesh\name{add-methods} \docType{methods} \alias{add} \alias{add-methods} \alias{add,Message-method} \title{add elements of a repeated field of a message} \description{ Add elements to a repeated field of a message. } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{add elements to a repeated field of a message} }} \examples{ unitest.proto.file <- system.file("tinytest", "data", "unittest.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) test <- new(protobuf_unittest.TestAllTypes) test$add("repeated_int32", 1) test$add("repeated_int32", 2:10) test$repeated_int32 } \keyword{methods} RProtoBuf/man/P.Rd0000644000175000017500000000157112440004312013521 0ustar nileshnilesh\name{P} \alias{P} \title{Protocol Buffer descriptor importer} \description{ The \code{P} function searches for a protocol message descriptor in the descriptor pool. } \usage{ P(type, file) } \arguments{ \item{type}{Fully qualified type name of the protocol buffer or extension} \item{file}{optional proto file. If given, the definition contained in the file is first registered with the pool of message descriptors} } \value{ An object of class \linkS4class{Descriptor} for message types or \linkS4class{FieldDescriptor} for extensions. An error is generated otherwise. } \author{ Romain Francois } \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{ Person <- P("tutorial.Person") } cat(as.character( Person )) } \keyword{ interface } RProtoBuf/man/field.Rd0000644000175000017500000000042712440004312014404 0ustar nileshnilesh\name{field-methods} \alias{field} \alias{field-methods} \title{Extract a field descriptor} \description{ Extract a \linkS4class{FieldDescriptor} from a \linkS4class{Descriptor} } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/aslist.Rd0000644000175000017500000000272012440004312014616 0ustar nileshnilesh\name{as.list.Message} \alias{as.list.Message} \alias{as.list.Descriptor} \alias{as.list.EnumDescriptor} \alias{as.list.FileDescriptor} \alias{as.list.ServiceDescriptor} \title{ Grab the protocol buffer message as an R list } \description{ Utility to grab the protocol buffer message as an R list, with one item per field. } \usage{ \S3method{as.list}{Message}(x, ...) \S3method{as.list}{Descriptor}(x, ...) \S3method{as.list}{EnumDescriptor}(x, ...) \S3method{as.list}{FileDescriptor}(x, ...) \S3method{as.list}{ServiceDescriptor}(x, ...) } \arguments{ \item{x}{A protocol buffer message, instance of \linkS4class{Message}, or a protocol message descriptor, instance of \linkS4class{Descriptor} } \item{\dots}{ignored} } \value{ For messages, a list of the content of the fields is returned. For message type descriptors, a list containing nested type descriptors (\linkS4class{Descriptor} objects), enum type descriptors (\linkS4class{EnumDescriptor} objects), then field descriptors (\linkS4class{FieldDescriptor} objects) in that order. For enum descriptors, a named list of the enumerated values. For file descriptors, a named list of descriptors defined in the specified file descriptor. For service descriptors, ... } \author{ Romain Francois } \examples{ Person <- P( "tutorial.Person" ) romain <- new( Person, email = "francoisromain@free.fr", id = 1 ) as.list( romain ) as.list( Person ) as.list( Person$PhoneType) } \keyword{ programming } RProtoBuf/man/ConnectionOutputStream-methods.Rd0000644000175000017500000000074312440004312021457 0ustar nileshnilesh\name{ConnectionOutputStream-methods} \docType{methods} \alias{ConnectionOutputStream} \alias{ConnectionOutputStream-methods} \alias{ConnectionOutputStream,connection-method} \title{Creates an ConnectionOutputStream} \description{ Constructor for \linkS4class{ConnectionOutputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(object="connection")}}{ Creates a \linkS4class{ConnectionOutputStream} writing to the given R binary connection.} }} \keyword{methods} RProtoBuf/man/SetCloseOnDelete-methods.Rd0000644000175000017500000000067212440004312020125 0ustar nileshnilesh\name{SetCloseOnDelete-methods} \docType{methods} \alias{SetCloseOnDelete} \alias{SetCloseOnDelete-methods} \title{set the close on delete behavior} \description{ By default, the file descriptor is not closed when a stream is destroyed, use \code{SetCloseOnDelete( stream, TRUE ) } to change that. } \section{Methods}{ See classes \linkS4class{FileInputStream} and \linkS4class{FileOutputStream} for implementations. } \keyword{methods} RProtoBuf/man/asMessage.Rd0000644000175000017500000000144312440004312015230 0ustar nileshnilesh\name{asMessage} \alias{asMessage} \title{ coerce an object to a protobuf message } \description{ coerce an object to the \linkS4class{Message} class. This is a short-hand to the \link{as} method with the \code{Class} argument set to "Message" } \usage{ asMessage(x, ...) } \arguments{ \item{x}{object to coerce to a protobuf message} \item{\dots}{Passed to \code{\link{as}} } } \value{ a \linkS4class{Message} object } \author{ Romain Francois } \examples{ # coerce a message type descriptor to a message asMessage( tutorial.Person ) # coerce a enum descriptor asMessage( tutorial.Person.PhoneType ) # coerce a field descriptor asMessage( tutorial.Person$email ) # coerce a file descriptor asMessage( fileDescriptor( tutorial.Person ) ) } \keyword{ programming } RProtoBuf/man/swap.Rd0000644000175000017500000000107614156423460014313 0ustar nileshnilesh\name{swap-methods} \docType{methods} \alias{swap} \alias{swap-methods} \alias{swap,Message-method} \title{swap elements of a repeated field of a message} \description{ swap elements of a repeated field of a message. } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{swap elements of a repeated field of a message} }} \references{ See the \code{SwapElements} of the \code{Reflection} class, part of the protobuf library. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message?csw=1} } \keyword{methods} RProtoBuf/man/fetch.Rd0000644000175000017500000000053412440004312014411 0ustar nileshnilesh\name{fetch-methods} \docType{methods} \alias{fetch} \alias{fetch-methods} \alias{fetch,Message-method} \title{Fetch content of a repeated field} \description{ Fetch content of a repeated field of a message } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{Fetch content of a message repeated field} }} \keyword{methods} RProtoBuf/man/EnumValueDescriptor-class.Rd0000644000175000017500000000517614156423460020411 0ustar nileshnilesh\name{EnumValueDescriptor-class} \Rdversion{1.1} \docType{class} \alias{EnumValueDescriptor-class} \alias{show,EnumValueDescriptor-method} \alias{as.character,EnumValueDescriptor-method} \alias{toString,EnumValueDescriptor-method} \alias{$,EnumValueDescriptor-method} \alias{name,EnumValueDescriptor-method} \alias{number,EnumValueDescriptor-method} \alias{enum_type,EnumValueDescriptor,missing,missing-method} \title{Class "EnumValueDescriptor" } \description{ R representation of an enum value descriptor. This is a thin wrapper around the \code{EnumValueDescriptor} c++ class. } \section{Objects from the Class}{ Objects of this class are typically retrieved with the \code{value} method of the \linkS4class{EnumDescriptor} class } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{EnumValueDescriptor} instance} \item{\code{name}:}{ simple name of the enum } \item{\code{full_name}:}{fully qualified name } } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "EnumValueDescriptor")}: small information } \item{as.character}{\code{signature(x = "EnumValueDescriptor")}: returns the debug string of the enum descriptor. This is retrieved by a call to the \code{DebugString} method of the EnumDescriptor object. } \item{toString}{\code{signature(x = "EnumValueDescriptor")}: same as \code{as.character} } \item{$}{\code{signature(x = "EnumValueDescriptor")}: invoke pseudo methods } \item{name}{\code{signature(object = "EnumValueDescriptor", full = "logical")}: return the name of this enum constant.} \item{number}{\code{signature(object = "EnumValueDescriptor")}: return the numeric value of this enum constant.} \item{enum_type}{\code{signature(object = "EnumDescriptor")} : retrieves the \linkS4class{EnumDescriptor} related to this value descriptor.} } } \references{ The \code{EnumValueDescriptor} C++ class. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor?csw=1} } \author{ Romain Francois } \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P( "tutorial.Person" ) } # enum type Person$PhoneType # enum value type value(Person$PhoneType, 1) name(value(Person$PhoneType, 1)) name(value(Person$PhoneType, 1), TRUE) number(value(Person$PhoneType, number=1)) enum_type(value(Person$PhoneType, number=1)) } \keyword{classes} RProtoBuf/man/nested_type_count.Rd0000644000175000017500000000040012440004312017043 0ustar nileshnilesh\name{nested_type_count-methods} \alias{nested_type_count} \alias{nested_type_count-methods} \title{The number of fields} \description{ The number of fields } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/descriptor.Rd0000644000175000017500000000065512440004312015502 0ustar nileshnilesh\name{descriptor-methods} \docType{methods} \alias{descriptor} \alias{descriptor-methods} \alias{descriptor,Message-method} \title{Get the descriptor of a message} \description{ Get the \linkS4class{Descriptor} associated with a \linkS4class{Message} } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{ Get the descriptor of the message, as a \linkS4class{Descriptor} instance } }} \keyword{methods} RProtoBuf/man/clear.Rd0000644000175000017500000000271112440004312014405 0ustar nileshnilesh\name{clear-methods} \docType{methods} \alias{clear} \alias{clear-methods} \alias{clear,Message,character-method} \alias{clear,Message,integer-method} \alias{clear,Message,missing-method} \alias{clear,Message,numeric-method} \alias{clear,Message,raw-method} \title{Clear a field or all fields of the message and set them to their default values} \description{ Clear one field or all fields of the message and set them to their default values } \section{Methods}{ \describe{ \item{\code{signature(object = "Message", field = "missing")}}{Clear all fields of the message and set them to their default values } \item{\code{signature(object = "Message", field = "character")}}{ Clear the field identified by its name } \item{\code{signature(object = "Message", field = "integer")}}{ Clear the field identified by its tag number } \item{\code{signature(object = "Message", field = "numeric")}}{ Clear the field identified by its tag number } \item{\code{signature(object = "Message", field = "raw")}}{ Clear the field identified by its tag number} }} \keyword{methods} \examples{ message <- new( tutorial.Person, name = "dddd", email = "eeeeeee", id = 1 ) writeLines( as.character( message ) ) clear( message ) # clear works also as a pseudo method : message$clear() writeLines( as.character( message ) ) # clear single fields message <- new( tutorial.Person, name = "dddd", email = "eeeeeee", id = 1 ) message$clear( "name" ) writeLines( as.character( message ) ) } RProtoBuf/man/FileOutputStream-class.Rd0000644000175000017500000000351114156423460017714 0ustar nileshnilesh\name{FileOutputStream-class} \Rdversion{1.1} \docType{class} \alias{FileOutputStream-class} \alias{close,FileOutputStream-method} \alias{flush,FileOutputStream-method} \alias{GetErrno,FileOutputStream-method} \alias{SetCloseOnDelete,FileOutputStream-method} \title{Class "FileOutputStream" } \description{A \linkS4class{ZeroCopyOutputStream} reading from a file} \section{Objects from the Class}{ Objects can be created by the \link{FileOutputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{google::protobuf::io::FileOutputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyOutputStream}"}, directly. } \section{Methods}{ \describe{ \item{close}{\code{signature(con="FileOutputStream")}: Flushes any buffers and closes the underlying file. Returns false if an error occurs during the process; use \code{GetErrno} to examine the error } \item{flush}{\code{signature(con="FileOutputStream")}: Flushes FileOutputStream's buffers but does not close the underlying file } \item{GetErrno}{\code{signature(object="FileInputStream")}: If an I/O error has occurred on this file descriptor, this is the errno from that error. Otherwise, this is zero. Once an error occurs, the stream is broken and all subsequent operations will fail. } \item{SetCloseOnDelete}{\code{signature(object="FileOutputStream")}: set the close on delete behavior. } } See \linkS4class{ZeroCopyOutputStream} for inherited methods } \references{ The \code{FileOutputStream} class from the protobuf C++ library. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream_impl_lite?csw=1} } \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyOutputStream} for methods } \keyword{classes} RProtoBuf/man/ZeroCopyInputStream-class.Rd0000644000175000017500000000664614156423460020422 0ustar nileshnilesh\name{ZeroCopyInputStream-class} \Rdversion{1.1} \docType{class} \alias{ZeroCopyInputStream-class} \alias{Skip,ZeroCopyInputStream-method} \alias{ByteCount,ZeroCopyInputStream-method} \alias{BackUp,ZeroCopyInputStream-method} \alias{Next,ZeroCopyInputStream,missing-method} \alias{$,ZeroCopyInputStream-method} \alias{ReadRaw} \alias{ReadRaw-methods} \alias{ReadRaw,ZeroCopyInputStream,integer-method} \alias{ReadRaw,ZeroCopyInputStream,numeric-method} \alias{ReadString} \alias{ReadString-methods} \alias{ReadString,ZeroCopyInputStream,integer-method} \alias{ReadString,ZeroCopyInputStream,numeric-method} \alias{ReadVarint32} \alias{ReadVarint32-methods} \alias{ReadVarint32,ZeroCopyInputStream-method} \alias{ReadLittleEndian32} \alias{ReadLittleEndian32-methods} \alias{ReadLittleEndian32,ZeroCopyInputStream-method} \alias{ReadLittleEndian64} \alias{ReadLittleEndian64-methods} \alias{ReadLittleEndian64,ZeroCopyInputStream-method} \alias{ReadVarint64} \alias{ReadVarint64-methods} \alias{ReadVarint64,ZeroCopyInputStream-method} \title{Virtual Class "ZeroCopyInputStream" } \description{R wrapper for the ZeroCopyInputStream c++ class} \section{Objects from the Class}{ This is a virtual class } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{google::protobuf::io::ZeroCopyInputStream} object} } } \section{Methods}{ \describe{ \item{$}{\code{signature(x="ZeroCopyInputStream")}: invokes a method} \item{Next}{\code{signature(object="ZeroCopyInputStream")}: Get a number of bytes from the stream as a raw vector. } \item{Skip}{\code{signature(object="ZeroCopyInputStream")}: skip a number of bytes} \item{BackUp}{\code{signature(object="ZeroCopyInputStream")}: Backs up a number of bytes, so that the next call to \code{Next} returns data again that was already returned by the last call to \code{Next}.} \item{ByteCount}{\code{signature(object="ZeroCopyInputStream")}: Returns the total number of bytes read since this object was created. } \item{ReadRaw}{\code{signature(object="ZeroCopyInputStream", size = "integer")}: read raw bytes from the stream} \item{ReadRaw}{\code{signature(object="ZeroCopyInputStream", size = "numeric")}: read raw bytes from the stream} \item{ReadString}{\code{signature(object="ZeroCopyInputStream", size = "integer")}: same as \code{ReadRaw} but formats the result as a string} \item{ReadString}{\code{signature(object="ZeroCopyInputStream", size = "numeric")}: same as \code{ReadRaw} but formats the result as a string} \item{ReadVarint32}{\code{signature(object="ZeroCopyInputStream")}: Read an unsigned integer with Varint encoding, truncating to 32 bits. } \item{ReadLittleEndian32}{\code{signature(object="ZeroCopyInputStream")}: Read a 32-bit little-endian integer. } \item{ReadLittleEndian64}{\code{signature(object="ZeroCopyInputStream")}: Read a 64-bit little-endian integer. In R the value is stored as a \code{double} which looses some precision (no other way) } \item{ReadVarint64}{\code{signature(object="ZeroCopyInputStream")}: Read a 64-bit integer with varint encoding. In R the value is stored as a \code{double} which looses some precision (no other way) } } } \author{ Romain Francois } \references{ The \code{google::protobuf::io::ZeroCopyInputStream} C++ class. \url{https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream?csw=1} } \seealso{ TODO: add classes that extend } \keyword{classes} RProtoBuf/man/readASCII.Rd0000644000175000017500000000232513366713513015026 0ustar nileshnilesh\name{readASCII-methods} \docType{methods} \alias{readASCII} \alias{readASCII-methods} \alias{readASCII,Descriptor,ANY-method} \alias{readASCII,Descriptor,character-method} \title{read a message in ASCII format} \description{ Method to read a Message in ASCII format } \section{Methods}{ \describe{ \item{\code{signature(descriptor = "Descriptor", input = "ANY")}}{ Read the message from a connection (file, etc ...) } \item{\code{signature(descriptor = "Descriptor", input = "character")}}{ Read the message directly from the character string } }} \keyword{methods} \examples{ \dontrun{ # example file that contains a "tutorial.AddressBook" message book <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) # read the message message <- read( tutorial.AddressBook, book ) # Output in text format to a temporary file out.file <- tempfile() writeLines( as.character(message), file(out.file)) # Verify that we can read back in the message from a text file. message2 <- readASCII( tutorial.AddressBook, file(out.file, "rb")) # Verify that we can read back in the message from an unopened file. message3 <- readASCII( tutorial.AddressBook, file(out.file)) \dontshow{ stopifnot( identical( message, message2) ) } } } RProtoBuf/man/ConnectionOutputStream-class.Rd0000644000175000017500000000146412440004312021122 0ustar nileshnilesh\name{ConnectionOutputStream-class} \Rdversion{1.1} \docType{class} \alias{ConnectionOutputStream-class} \title{Class "ConnectionOutputStream" } \description{A \linkS4class{ZeroCopyOutputStream} writing to a binary R connection} \section{Objects from the Class}{ Objects can be created by the \link{ConnectionOutputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{rprotobuf::ConnectionOutputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyOutputStream}"}, directly. } \section{Methods}{ See \linkS4class{ZeroCopyOutputStream} } \references{ The internal C++ class \code{ConnectionOutputStream} } \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyOutputStream} for methods } \keyword{classes} RProtoBuf/man/merge.Rd0000644000175000017500000000125312440004312014416 0ustar nileshnilesh\name{merge-methods} \alias{merge,Message,Message-method} \title{Merge two messages of the same type} \description{ Merge two \linkS4class{Message} objects of the same type. } \section{Methods}{ \describe{ \item{\code{signature(x = "Message", y = "Message")}}{ merge two messages of the same type } }} \section{Errors}{ An error of class "IncompatibleType" is thrown if the two messages are not of the same message type. } \keyword{methods} \examples{ m1 <- new( tutorial.Person, email = "francoisromain@free.fr" ) m2 <- new( tutorial.Person, id = 5 ) m3 <- merge( m1, m2 ) writeLines( as.character( m1 ) ) writeLines( as.character( m2 ) ) writeLines( as.character( m3 ) ) } RProtoBuf/man/field_count.Rd0000644000175000017500000000035612440004312015615 0ustar nileshnilesh\name{field_count-methods} \alias{field_count} \alias{field_count-methods} \title{The number of fields} \description{ The number of fields } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/FileInputStream-methods.Rd0000644000175000017500000000075312440004312020037 0ustar nileshnilesh\name{FileInputStream-methods} \docType{methods} \alias{FileInputStream} \alias{FileInputStream-methods} \alias{FileInputStream,character,integer,logical-method} \title{Creates an FileInputStream} \description{ Constructor for \linkS4class{FileInputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(filename = "character", block_size = "logical", close.on.delete = "logical" )}}{Creates a \linkS4class{FileInputStream} reading from the given file.} }} \keyword{methods} RProtoBuf/man/sizegets.Rd0000644000175000017500000000047612440004312015162 0ustar nileshnilesh\name{sizegets} \docType{methods} \alias{size<-} \alias{size<--methods} \alias{size<-,Message-method} \title{Set the size of a field} \description{ Sets the size of a repeated field. } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{ sets the size of a message field } }} \keyword{methods} RProtoBuf/man/read.Rd0000644000175000017500000000272412440004312014236 0ustar nileshnilesh\name{read-methods} \docType{methods} \alias{read} \alias{read-methods} \alias{read,Descriptor,character-method} \alias{read,Descriptor,raw-method} \alias{read,Descriptor,ANY-method} \title{Read a protocol buffer message from a connection} \description{ Read a \linkS4class{Message} from a connection using its associated \linkS4class{Descriptor} } \section{Methods}{ \describe{ \item{\code{signature(descriptor = "Descriptor", input = "character")}}{ Read the message from a file } \item{\code{signature(descriptor = "Descriptor")}}{ Read from a binary connection. } \item{\code{signature(descriptor = "Descriptor", input = "raw")}}{ Read the message from a raw vector } }} \keyword{methods} \examples{ # example file that contains a "tutorial.AddressBook" message book <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) # read the message message <- read( tutorial.AddressBook, book ) # or using the pseudo method message <- tutorial.AddressBook$read( book ) # write its debug string writeLines( as.character( message ) ) # grab the name of each person sapply( message$person, function(p) p$name ) # read from a binary file connection f <- file( book, open = "rb" ) message2 <- read( tutorial.AddressBook, f ) close( f ) # read from a message payload (raw vector) payload <- readBin( book, raw(0), 5000 ) message3 <- tutorial.AddressBook$read( payload ) \dontshow{ stopifnot( identical( message, message2) ) stopifnot( identical( message, message3) ) } } RProtoBuf/src/0000755000175000017500000000000014156423632013063 5ustar nileshnileshRProtoBuf/src/ConnectionInputStream.h0000644000175000017500000000054712440004312017515 0ustar nileshnilesh#ifndef RPROTOBUF_ConnectionInputStream_H #define RPROTOBUF_ConnectionInputStream_H namespace rprotobuf { class ConnectionInputStream : public GPB::io::CopyingInputStreamAdaptor { public: ConnectionInputStream(SEXP con, bool was_open); ~ConnectionInputStream(); private: bool was_open; SEXP con; }; } // namespace rprotobuf #endif RProtoBuf/src/ConnectionCopyingOutputStream.h0000644000175000017500000000124012440004312021236 0ustar nileshnilesh#ifndef RPROTOBUF_ConnectionCopyingOutputStream_H #define RPROTOBUF_ConnectionCopyingOutputStream_H namespace rprotobuf { class ConnectionCopyingOutputStream : public GPB::io::CopyingOutputStream { public: ConnectionCopyingOutputStream(SEXP con); bool Write(const void* buffer, int size); private: /* the actual connection object from R it is protected by the external pointer that wraps the ConnectionInputStream, which is the only thing that uses this class, so we don't need to take care of GC here */ SEXP con; Rcpp::Function writeBin; }; } // namespace rprotobuf #endif RProtoBuf/src/wrapper_ArrayOutputStream.cpp0000644000175000017500000000051312440004312020761 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { RPB_FUNCTION_2(S4_ArrayOutputStream, ArrayOutputStream__new, int size, int block_size) { return S4_ArrayOutputStream(size, block_size); } } RProtoBuf/src/extractors.cpp0000644000175000017500000001665012440004312015755 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "fieldtypes.h" #include "Rcppsupport.h" namespace rprotobuf { const char* kIntStringOptionName = "RProtoBuf.int64AsString"; bool UseStringsForInt64() { static const SEXP option_name = Rf_install(kIntStringOptionName); return (Rf_asLogical(Rf_GetOption1(option_name))); } // Rcpp::wrap silently coerces 64-bit integers to numerics // which drop precision for values between 2^53 - 2^64. // So, if an option is set, we return as a character string. template SEXP Int64AsSEXP(ValueType value) { BEGIN_RCPP if (UseStringsForInt64()) { std::stringstream ss; if ((ss << value).fail()) { // This should not happen, its a bug in the code. std::string message = std::string("Error converting int64 to string, unset ") + kIntStringOptionName + " option."; Rcpp::stop(message.c_str()); } return Rcpp::CharacterVector(ss.str()); } else { return Rcpp::wrap(value); } END_RCPP } /** * extract a field from a message * * @param pointer external pointer to a message * @param name name of the field * * @return the field called "name" of the message if the * message has the field, otherwise an error is generated */ RcppExport SEXP getMessageField(SEXP pointer, SEXP name) { RPB_DEBUG_BEGIN("getMessageField") PRINT_DEBUG_INFO("pointer", pointer); PRINT_DEBUG_INFO("name", name); /* grab the Message pointer */ Rcpp::XPtr message(pointer); GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, name); RPB_DEBUG_END("getMessageField"); return (extractFieldAsSEXP(message, field_desc)); } RcppExport SEXP extractFieldAsSEXP(const Rcpp::XPtr& message, const GPB::FieldDescriptor* fieldDesc) { BEGIN_RCPP const Reflection* ref = message->GetReflection(); if (fieldDesc->is_repeated()) { switch (GPB::FieldDescriptor::TypeToCppType(fieldDesc->type())) { #undef HANDLE_REPEATED_FIELD #define HANDLE_REPEATED_FIELD(TYPE, DATATYPE) \ case TYPE: \ return Rcpp::wrap(RepeatedFieldImporter(ref, *message, fieldDesc)); HANDLE_REPEATED_FIELD(CPPTYPE_INT32, GPB::int32) HANDLE_REPEATED_FIELD(CPPTYPE_DOUBLE, double) HANDLE_REPEATED_FIELD(CPPTYPE_FLOAT, float) HANDLE_REPEATED_FIELD(CPPTYPE_BOOL, bool) HANDLE_REPEATED_FIELD(CPPTYPE_ENUM, enum_field) HANDLE_REPEATED_FIELD(CPPTYPE_MESSAGE, message_field) // TODO(mstokely): Rcpp doesn't handle uint32 properly as of 2013/12 // See // https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1360&group_id=155&atid=637 case CPPTYPE_UINT32: return Rcpp::wrap(UInt32RepeatedFieldImporter(ref, *message, fieldDesc)); #ifdef RCPP_HAS_LONG_LONG_TYPES // We can't handle these the same way, because Rcpp::wrap silently // casts int64s to doubles which may cause us to lose precision. case CPPTYPE_INT64: if (UseStringsForInt64()) { return Rcpp::wrap(Int64AsStringRepeatedFieldImporter(ref, *message, fieldDesc)); } else { return Rcpp::wrap(RepeatedFieldImporter(ref, *message, fieldDesc)); } case CPPTYPE_UINT64: if (UseStringsForInt64()) { return Rcpp::wrap( UInt64AsStringRepeatedFieldImporter(ref, *message, fieldDesc)); } else { return Rcpp::wrap(RepeatedFieldImporter(ref, *message, fieldDesc)); } #endif #undef HANDLE_REPEATED_FIELD case CPPTYPE_STRING: if (fieldDesc->type() == TYPE_STRING) { return Rcpp::wrap(RepeatedFieldImporter(ref, *message, fieldDesc)); } else if (fieldDesc->type() == TYPE_BYTES) { int field_size = ref->FieldSize(*message, fieldDesc); Rcpp::List res(field_size); for (int i = 0; i < field_size; i++) { std::string s = ref->GetRepeatedString(*message, fieldDesc, i); res[i] = Rcpp::wrap(std::vector(s.begin(), s.end())); } return res; } else { Rcpp::stop("unknown field type with CPP_TYPE STRING"); } default: Rcpp::stop("Unsupported type"); } } else { switch (GPB::FieldDescriptor::TypeToCppType(fieldDesc->type())) { #undef HANDLE_SINGLE_FIELD #define HANDLE_SINGLE_FIELD(CPPTYPE, SUFFIX) \ case CPPTYPE: \ return Rcpp::wrap(ref->Get##SUFFIX(*message, fieldDesc)); HANDLE_SINGLE_FIELD(CPPTYPE_INT32, Int32) HANDLE_SINGLE_FIELD(CPPTYPE_DOUBLE, Double) HANDLE_SINGLE_FIELD(CPPTYPE_FLOAT, Float) HANDLE_SINGLE_FIELD(CPPTYPE_BOOL, Bool) // TODO(mstokely): Rcpp doesn't handle uint32 properly as of 2013/12 // See // https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1360&group_id=155&atid=637 case CPPTYPE_UINT32: return Rcpp::wrap(double(ref->GetUInt32(*message, fieldDesc))); #ifdef RCPP_HAS_LONG_LONG_TYPES // Handle these types separately since Rcpp::wrap doesn't // do the right thing. case CPPTYPE_INT64: return Int64AsSEXP(ref->GetInt64(*message, fieldDesc)); case CPPTYPE_UINT64: return Int64AsSEXP(ref->GetUInt64(*message, fieldDesc)); #endif #undef HANDLE_SINGLE_FIELD case CPPTYPE_STRING: if (fieldDesc->type() == TYPE_STRING) { return Rcpp::wrap(ref->GetString(*message, fieldDesc)); } else if (fieldDesc->type() == TYPE_BYTES) { std::string s = ref->GetString(*message, fieldDesc); return Rcpp::wrap(std::vector(s.begin(), s.end())); } else { Rcpp::stop("unknown field type with CPP_TYPE STRING"); } case CPPTYPE_ENUM: return Rcpp::wrap(ref->GetEnum(*message, fieldDesc)->number()); case CPPTYPE_MESSAGE: return S4_Message(CLONE(&ref->GetMessage(*message, fieldDesc))); default: Rcpp::stop("Unsupported type"); } } END_RCPP } } // namespace rprotobuf RProtoBuf/src/RcppMacros.h0000644000175000017500000002007113776225671015317 0ustar nileshnilesh/* * Copyright 2013 Google Inc. All Rights Reserved. * Author: Murray Stokely * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ /* * This file contains macros for taking C++ functions that expect * native C++ types, automatically generating new stub functions that * take SEXPs and call the appropriate Rcpp conversion functions * before calling the original function. It is based on slightly more * complex macros that were originally in Rcpp but have been * deprecated. * * In the future, Rcpp Modules would likely be a better more modern * way to implement RProtoBuf. */ #ifndef RPROTOBUF_RCPP_MACROS_H #define RPROTOBUF_RCPP_MACROS_H #include // RCPP_DECORATE, BEGIN_RCPP, END_RCPP #define RPB_FUNCTION_0(__OUT__,__NAME__) \ __OUT__ RCPP_DECORATE(__NAME__)(); \ extern "C" SEXP __NAME__(){ \ SEXP res = R_NilValue ; \ BEGIN_RCPP \ res = ::Rcpp::wrap( RCPP_DECORATE(__NAME__)() ) ; \ return res ; \ END_RCPP \ } \ __OUT__ RCPP_DECORATE(__NAME__)() #define RPB_FUNCTION_1(__OUT__,__NAME__, ___0) \ __OUT__ RCPP_DECORATE(__NAME__)(___0); \ extern "C" SEXP __NAME__(SEXP x0){ \ SEXP res = R_NilValue ; \ BEGIN_RCPP \ res = ::Rcpp::wrap( RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 )) ) ; \ return res ; \ END_RCPP \ } \ __OUT__ RCPP_DECORATE(__NAME__)(___0) #define RPB_FUNCTION_2(__OUT__,__NAME__, ___0, ___1) \ __OUT__ RCPP_DECORATE(__NAME__)(___0, ___1); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1){ \ SEXP res = R_NilValue ; \ BEGIN_RCPP \ res = ::Rcpp::wrap( RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 )) ) ; \ return res ; \ END_RCPP \ } \ __OUT__ RCPP_DECORATE(__NAME__)(___0, ___1) #define RPB_FUNCTION_3(__OUT__,__NAME__, ___0, ___1, ___2) \ __OUT__ RCPP_DECORATE(__NAME__)(___0, ___1, ___2); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1, SEXP x2){ \ SEXP res = R_NilValue ; \ BEGIN_RCPP \ res = ::Rcpp::wrap( RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 ), ::Rcpp::internal::converter( x2 )) ) ; \ return res ; \ END_RCPP \ } \ __OUT__ RCPP_DECORATE(__NAME__)(___0, ___1, ___2) #define RPB_FUNCTION_VOID_1(__NAME__, ___0) \ void RCPP_DECORATE(__NAME__)(___0); \ extern "C" SEXP __NAME__(SEXP x0){ \ BEGIN_RCPP \ RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 )); \ END_RCPP \ } \ void RCPP_DECORATE(__NAME__)(___0) #define RPB_FUNCTION_VOID_2(__NAME__, ___0, ___1) \ void RCPP_DECORATE(__NAME__)(___0, ___1); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1){ \ BEGIN_RCPP \ RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 )); \ END_RCPP \ } \ void RCPP_DECORATE(__NAME__)(___0, ___1) #define RPB_FUNCTION_VOID_3(__NAME__, ___0, ___1, ___2) \ void RCPP_DECORATE(__NAME__)(___0, ___1, ___2); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1, SEXP x2){ \ BEGIN_RCPP \ RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 ), ::Rcpp::internal::converter( x2 )); \ END_RCPP \ } \ void RCPP_DECORATE(__NAME__)(___0, ___1, ___2) #define RPB_FUNCTION_VOID_4(__NAME__, ___0, ___1, ___2, ___3) \ void RCPP_DECORATE(__NAME__)(___0, ___1, ___2, ___3); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1, SEXP x2, SEXP x3){ \ BEGIN_RCPP \ RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 ), ::Rcpp::internal::converter( x2 ), ::Rcpp::internal::converter( x3 )); \ END_RCPP \ } \ void RCPP_DECORATE(__NAME__)(___0, ___1, ___2, ___3) #define RPB_XP_METHOD_0(__NAME__,__CLASS__,__METHOD__ ) \ extern "C" SEXP __NAME__( SEXP xp ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ return ::Rcpp::wrap( ptr->__METHOD__( ) ) ; \ END_RCPP \ } #define RPB_XP_METHOD_VOID_0(__NAME__,__CLASS__,__METHOD__) \ extern "C" SEXP __NAME__( SEXP xp ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ ptr->__METHOD__( ) ; \ END_RCPP \ } #define RPB_XP_METHOD_CAST_0(__NAME__,__CLASS__,__METHOD__,__CAST__) \ extern "C" SEXP __NAME__( SEXP xp ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ return ::Rcpp::wrap( __CAST__( ptr->__METHOD__( ) ) ) ; \ END_RCPP \ } #define RPB_XP_METHOD_CAST_1(__NAME__,__CLASS__,__METHOD__,__CAST__) \ extern "C" SEXP __NAME__( SEXP xp , SEXP x0 ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ return ::Rcpp::wrap( __CAST__( ptr->__METHOD__( ::Rcpp::internal::converter( x0 ) ) ) ) ; \ END_RCPP \ } /* We need a special case macro for methods taking a std::string_view, because * Rcpp::internal::converter will not automatically convert to that type. */ #define RPB_XP_METHOD_CAST_1_STRING(__NAME__,__CLASS__,__METHOD__,__CAST__) \ extern "C" SEXP __NAME__( SEXP xp , SEXP x0 ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ return ::Rcpp::wrap( __CAST__( ptr->__METHOD__( \ static_cast( ::Rcpp::internal::converter( x0 ) ) ) ) ) ; \ END_RCPP \ } #endif RProtoBuf/src/ConnectionCopyingInputStream.h0000644000175000017500000000122212440004312021035 0ustar nileshnilesh#ifndef RPROTOBUF_ConnectionCopyingInputStream_H #define RPROTOBUF_ConnectionCopyingInputStream_H namespace rprotobuf { class ConnectionCopyingInputStream : public GPB::io::CopyingInputStream { public: ConnectionCopyingInputStream(SEXP con); int Read(void* buffer, int size); private: /* the actual connection object from R it is protected by the external pointer that wraps the ConnectionInputStream, which is the only thing that uses this class, so we don't need to take care of GC here */ SEXP con; Rcpp::Function readBin; }; } // namespace rprotobuf #endif RProtoBuf/src/wrapper_EnumValueDescriptor.cpp0000644000175000017500000000343212440004312021251 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // wrapper_EnumValueDescriptor.h: R/C++ interface class library // // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(EnumValueDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::EnumValueDescriptor, DebugString) RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::EnumValueDescriptorProto* message = new GPB::EnumValueDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return full ? d->full_name() : d->name(); } RPB_FUNCTION_1(int, METHOD(number), Rcpp::XPtr d) { return d->number(); } RPB_FUNCTION_1(S4_EnumDescriptor, METHOD(enum_type), Rcpp::XPtr d) { return S4_EnumDescriptor(d->type()); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/wrapper_ArrayInputStream.cpp0000644000175000017500000000055112440004312020562 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { RPB_FUNCTION_2(S4_ArrayInputStream, ArrayInputStream__new, Rcpp::RawVector payload, int block_size) { return S4_ArrayInputStream(payload, block_size); } } RProtoBuf/src/Makevars.win0000644000175000017500000000066714077525624015372 0ustar nileshnilesh# ProtoBuf Version VERSION = 3.8.0 RWINLIB = ../windows/protobuf-${VERSION} PKG_CPPFLAGS= -I$(RWINLIB)/include PKG_LIBS= -L$(RWINLIB)/lib${subst gcc,,${COMPILED_BY}}${R_ARCH} \ -L$(RWINLIB)/lib${R_ARCH}${CRT} -lprotobuf ## Make this C++11 so that we get better int64 support and more CXX_STD=CXX11 all: clean winlibs clean: rm -f $(OBJECTS) $(SHLIB) winlibs: "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" "../tools/winlibs.R" $(VERSION) RProtoBuf/src/Rcppsupport.h0000644000175000017500000001465312440004312015566 0ustar nileshnilesh// rprotobuf.h: support for using Rcpp // // Copyright (C) 2010 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #ifndef RPROTOBUF__RCPPSUPPORT__H #define RPROTOBUF__RCPPSUPPORT__H #include /* for stringstream, basic_ostream */ #include /* for string */ #include "rprotobuf.h" namespace rprotobuf { /* support for Rcpp::wrap protobuf repeated fields, this essentially uses the same macro trick as in protobuf, but reversed */ struct enum_field{}; struct message_field{}; class Int64AsStringRepeatedFieldImporter { public: // Probably want to convert to strings here. typedef std::string r_import_type; Int64AsStringRepeatedFieldImporter(const GPB::Reflection* ref_ , const GPB::Message& message_, const GPB::FieldDescriptor* field_) : ref(ref_), message(message_), field(field_) {} inline int size() const { return ref->FieldSize(message, field); } inline std::string get(int i) const { std::stringstream stream; int64 val = ref->GetRepeatedInt64(message, field, i); stream << val; return stream.str(); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; }; class UInt64AsStringRepeatedFieldImporter { public: // Probably want to convert to strings here. typedef std::string r_import_type; UInt64AsStringRepeatedFieldImporter(const GPB::Reflection* ref_, const GPB::Message& message_, const GPB::FieldDescriptor* field_) : ref(ref_), message(message_), field(field_) {} inline int size() const { return ref->FieldSize(message, field) ; } inline std::string get(int i) const { std::stringstream stream; uint64 val = ref->GetRepeatedUInt64(message, field, i); stream << val; return stream.str(); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; }; // TODO(mstokely): Rcpp doesn't handle uint32 properly as of 2013/12 // See https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1360&group_id=155&atid=637 class UInt32RepeatedFieldImporter { public: // Represent as doubles, since R doesn't have uint32s. typedef double r_import_type; UInt32RepeatedFieldImporter(const GPB::Reflection* ref_ , const GPB::Message& message_, const GPB::FieldDescriptor* field_) : ref(ref_), message(message_), field(field_) {} inline int size() const { return ref->FieldSize(message, field); } inline double get(int i) const { return double(ref->GetRepeatedUInt32(message, field, i)); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; }; template class RepeatedFieldImporter{} ; #undef GENERATE__FIELD__IMPORTER__DECL #define GENERATE__FIELD__IMPORTER__DECL(__TYPE__, __CAMEL__) \ template<> class RepeatedFieldImporter<__TYPE__> { \ public: \ typedef __TYPE__ r_import_type; \ RepeatedFieldImporter( \ const GPB::Reflection* ref_, \ const GPB::Message& message_, \ const GPB::FieldDescriptor* field_): \ ref(ref_), message(message_), field(field_) {} \ inline int size() const { \ return ref->FieldSize( message, field ); \ } \ inline __TYPE__ get(int i) const { \ return ref->GetRepeated##__CAMEL__(message, field, i); \ } \ private: \ const GPB::Reflection* ref; \ const GPB::Message& message; \ const GPB::FieldDescriptor* field; \ }; GENERATE__FIELD__IMPORTER__DECL(GPB::int32, Int32) GENERATE__FIELD__IMPORTER__DECL(GPB::uint32, UInt32) GENERATE__FIELD__IMPORTER__DECL(GPB::int64, Int64) GENERATE__FIELD__IMPORTER__DECL(GPB::uint64, UInt64) GENERATE__FIELD__IMPORTER__DECL(float, Float) GENERATE__FIELD__IMPORTER__DECL(double, Double) GENERATE__FIELD__IMPORTER__DECL(bool, Bool) GENERATE__FIELD__IMPORTER__DECL(std::string, String) #undef GENERATE__FIELD__IMPORTER__DECL template<> class RepeatedFieldImporter{ public: typedef int r_import_type ; RepeatedFieldImporter( const GPB::Reflection* ref_, const GPB::Message& message_, const GPB::FieldDescriptor* field_): ref(ref_), message(message_), field(field_) {}; inline int size() const { return ref->FieldSize( message, field ); } inline int get(int i) const { return ref->GetRepeatedEnum(message, field, i)->number(); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; } ; template<> class RepeatedFieldImporter{ public: typedef message_field r_import_type ; RepeatedFieldImporter( const GPB::Reflection* ref_ , const GPB::Message& message_, const GPB::FieldDescriptor* field_): ref(ref_), message(message_), field(field_) {}; inline int size() const { return ref->FieldSize( message, field ); } inline SEXP wrap(int i) const { return S4_Message(CLONE(&ref->GetRepeatedMessage(message, field, i))); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; }; } // namespace rprotobuf #endif RProtoBuf/src/ConnectionOutputStream.cpp0000644000175000017500000000172112440004312020244 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionOutputStream.h" #include "ConnectionCopyingOutputStream.h" namespace rprotobuf { ConnectionOutputStream::ConnectionOutputStream(SEXP con, bool was_open) : GPB::io::CopyingOutputStreamAdaptor(new ConnectionCopyingOutputStream(con)), was_open(was_open), con(con) { /* clean the wrapped stream on delete */ SetOwnsCopyingStream(true); } ConnectionOutputStream::~ConnectionOutputStream() { if (!was_open) { /* then we need to close it */ SEXP call = PROTECT(Rf_lang2(Rf_install("close"), con)); (void)Rf_eval(call, R_GlobalEnv); // Ignore SEXP return val of close(). UNPROTECT(1); /* call */ } /* con will be disposed by the R GC, it is protected as part of the protection of the external pointer that wraps this */ } } // namespace rprotobuf RProtoBuf/src/wrapper_EnumDescriptor.cpp0000644000175000017500000001043312440004312020253 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // wrapper_EnumDescriptor.cpp: R/C++ interface class library // // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(EnumDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::EnumDescriptor, DebugString) RPB_XP_METHOD_0(METHOD(length), GPB::EnumDescriptor, value_count) RPB_XP_METHOD_0(METHOD(value_count), GPB::EnumDescriptor, value_count) RPB_FUNCTION_1(S4_Descriptor, METHOD(containing_type), Rcpp::XPtr d) { return S4_Descriptor(d->containing_type()); } RPB_FUNCTION_2(SEXP, METHOD(getValueByIndex), Rcpp::XPtr d, int index) { if ((index >= 0) && (index < d->value_count())) { return S4_EnumValueDescriptor(d->value(index)); } else { return R_NilValue; } } RPB_FUNCTION_2(SEXP, METHOD(getValueByNumber), Rcpp::XPtr d, int i) { const GPB::EnumValueDescriptor* descriptor = d->FindValueByNumber(i); if (descriptor) return S4_EnumValueDescriptor(descriptor); return R_NilValue; } RPB_FUNCTION_2(SEXP, METHOD(getValueByName), Rcpp::XPtr d, std::string name) { const GPB::EnumValueDescriptor* descriptor = d->FindValueByName(name); if (descriptor) return S4_EnumValueDescriptor(descriptor); return R_NilValue; } RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::EnumDescriptorProto* message = new GPB::EnumDescriptorProto(); d->CopyTo(message); return S4_Message(message); } /** * Get the value of the enum called name * * @param xp external pointer to an EnumDescriptor * @param name the name of the enum * * @param the value associated with the name */ RPB_FUNCTION_2(int, get_value_of_enum, Rcpp::XPtr d, std::string name) { const GPB::EnumValueDescriptor* evd = d->FindValueByName(name); if (!evd) { /* or maybe it should just be NA */ Rcpp::stop("cannot get the value"); } return evd->number(); } /** * Does enum have value named 'name'? * * @param xp external pointer to an EnumDescriptor * @param name the name of the enum * @return logical */ RPB_FUNCTION_2(bool, has_enum_name, Rcpp::XPtr d, std::string name) { const GPB::EnumValueDescriptor* evd = d->FindValueByName(name); return (evd != NULL); } /** * @param xp external pointer to a Descriptor * @return the descriptor as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr d) { int n = d->value_count(); Rcpp::CharacterVector names(n); Rcpp::List res(n); for (int i = 0; i < n; i++) { const GPB::EnumValueDescriptor* value_d = d->value(i); res[i] = value_d->number(); names[i] = value_d->name(); } res.names() = names; return res; } RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(getConstantNames), Rcpp::XPtr d) { int n = d->value_count(); Rcpp::CharacterVector res(n); for (int i = 0; i < n; i++) { res[i] = d->value(i)->name(); } return res; } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->file()); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return full ? d->full_name() : d->name(); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/Makevars.in0000644000175000017500000000045413040136500015151 0ustar nileshnilesh## -*- mode: makefile; -*- ## Make this C++11 so that we get better int64 support and much more CXX_STD=CXX11 ## Configure tells us about locations for ## both Rcpp (ie libRcpp.so and Rcpp.h) and ## ProtoBuf headers and library via these variables PKG_CPPFLAGS=@PKG_CPPFLAGS@ PKG_LIBS=@PKG_LIBS@ RProtoBuf/src/wrapper_ZeroCopyInputStream.cpp0000644000175000017500000000251212440004312021255 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" namespace rprotobuf { SEXP ZeroCopyInputStream_Next(SEXP xp) { BEGIN_RCPP GPB::io::ZeroCopyInputStream* stream = GET_ZCIS(xp); int s = 0; const void* in; bool res = stream->Next(&in, &s); Rcpp::RawVector result; if (!res) { throw std::range_error("cannot read from stream"); } else { result.assign(reinterpret_cast(in), reinterpret_cast(in) + s); } return result; END_RCPP } SEXP ZeroCopyInputStream_BackUp(SEXP xp, SEXP size) { BEGIN_RCPP GPB::io::ZeroCopyInputStream* stream = GET_ZCIS(xp); int s = GET_int(size, 0); if (s <= 0) { Rf_error("can only BackUp with positive numbers"); } stream->BackUp(s); return R_NilValue; END_RCPP } SEXP ZeroCopyInputStream_Skip(SEXP xp, SEXP size) { BEGIN_RCPP GPB::io::ZeroCopyInputStream* stream = GET_ZCIS(xp); int s = GET_int(size, 0); bool res = stream->Skip(s); return (Rf_ScalarLogical(res ? _TRUE_ : _FALSE_)); END_RCPP } SEXP ZeroCopyInputStream_ByteCount(SEXP xp) { BEGIN_RCPP GPB::io::ZeroCopyInputStream* stream = GET_ZCIS(xp); return (Rf_ScalarReal((double)stream->ByteCount())); END_RCPP } } RProtoBuf/src/Makevars.ucrt0000644000175000017500000000022314156372057015534 0ustar nileshnileshPKG_LIBS= -lprotobuf ## Make this C++11 so that we get better int64 support and more CXX_STD=CXX11 all: clean clean: rm -f $(OBJECTS) $(SHLIB) RProtoBuf/src/RconnectionCopyingInputStream.cpp0000644000175000017500000000217212440004312021557 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RconnectionCopyingInputStream.h" namespace rprotobuf { /* N.B. connection must be opened in binary mode due to call * to readBin below. */ RconnectionCopyingInputStream::RconnectionCopyingInputStream(int id) : connection_id(id), failure(false) {} /** * call readBin to read size bytes from R * * @param buffer buffer to fill with at most size bytes * @param size maximum number of bytes * * @return the number of bytes actually read */ int RconnectionCopyingInputStream::Read(void* buffer, int size) { Rcpp::Language call("readBin", connection_id, Rcpp::RawVector(0), size); Rcpp::RawVector res; try { res = call.eval(); } catch (...) { /* Failed to read anything from the connection, * could have been permissions, or connection opened * in the wrong type, etc. */ failure = true; return -1; } int len = res.size(); memcpy(buffer, reinterpret_cast(res.begin()), len); return len; } } RProtoBuf/src/ConnectionCopyingOutputStream.cpp0000644000175000017500000000107112440004312021573 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionCopyingOutputStream.h" namespace rprotobuf { ConnectionCopyingOutputStream::ConnectionCopyingOutputStream(SEXP con) : con(con), writeBin("writeBin") {} bool ConnectionCopyingOutputStream::Write(const void* buffer, int size) { /* we need to take care of error handling */ Rcpp::RawVector payload(size); memcpy(payload.begin(), buffer, size); writeBin(payload, con); return true; } } RProtoBuf/src/wrapper_MethodDescriptor.cpp0000644000175000017500000000365312440004312020575 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(MethodDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::MethodDescriptor, DebugString) RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::MethodDescriptorProto* message = new GPB::MethodDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->service()->file()); } RPB_FUNCTION_1(S4_Descriptor, METHOD(input_type), Rcpp::XPtr method) { return method->input_type(); } RPB_FUNCTION_1(S4_Descriptor, METHOD(output_type), Rcpp::XPtr method) { return method->output_type(); } RPB_FUNCTION_1(S4_Message, get_method_input_prototype, Rcpp::XPtr method) { const GPB::Descriptor* desc = method->input_type(); return S4_Message(PROTOTYPE(desc)); } RPB_FUNCTION_1(S4_Message, get_method_output_prototype, Rcpp::XPtr method) { const GPB::Descriptor* desc = method->output_type(); return S4_Message(PROTOTYPE(desc)); } RPB_FUNCTION_2(bool, valid_input_message, Rcpp::XPtr method, Rcpp::XPtr message) { return message->GetDescriptor() == method->input_type(); } RPB_FUNCTION_2(bool, valid_output_message, Rcpp::XPtr method, Rcpp::XPtr message) { return message->GetDescriptor() == method->output_type(); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return full ? d->full_name() : d->name(); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/RconnectionCopyingInputStream.h0000644000175000017500000000065712440004312021232 0ustar nileshnilesh#ifndef RPROTOBUF_RconnectionCopyingInputStream_H #define RPROTOBUF_RconnectionCopyingInputStream_H namespace rprotobuf { class RconnectionCopyingInputStream : public GPB::io::CopyingInputStream { public: RconnectionCopyingInputStream(int id); int Read(void* buffer, int size); bool Failure() const { return (failure); } private: int connection_id; bool failure; }; } // namespace rprotobuf #endif RProtoBuf/src/wrapper_Descriptor.cpp0000644000175000017500000002464613776225671017473 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(Descriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::Descriptor, DebugString) RPB_XP_METHOD_0(METHOD(field_count), GPB::Descriptor, field_count) RPB_XP_METHOD_0(METHOD(nested_type_count), GPB::Descriptor, nested_type_count) RPB_XP_METHOD_0(METHOD(enum_type_count), GPB::Descriptor, enum_type_count) RPB_XP_METHOD_CAST_0(METHOD(containing_type), GPB::Descriptor, containing_type, S4_Descriptor) /** * returns the names of the members contained in the descriptor * (nested types, enums, fields) * * @param xp external pointer to a Descriptor * * @return member names, as an R character vector (STRSXP) */ RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(getMemberNames), Rcpp::XPtr desc) { int nfields = desc->field_count(); int ntypes = desc->nested_type_count(); int nenums = desc->enum_type_count(); Rcpp::CharacterVector res(nfields + ntypes + nenums); int j = 0; for (int i = 0; i < nfields; i++, j++) { res[j] = desc->field(i)->name(); } for (int i = 0; i < ntypes; i++, j++) { res[j] = desc->nested_type(i)->name(); } for (int i = 0; i < nenums; i++, j++) { res[j] = desc->enum_type(i)->name(); } return (res); } /** * @param xp external pointer to a Descriptor * @return the descriptor as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr desc) { int nfields = desc->field_count(); int ntypes = desc->nested_type_count(); int nenums = desc->enum_type_count(); int n = nfields + ntypes + nenums; Rcpp::CharacterVector names(n); Rcpp::List res(n); int cnt = 0; for (int i = 0; i < nfields; cnt++, i++) { const GPB::FieldDescriptor* fd = desc->field(i); res[cnt] = S4_FieldDescriptor(fd); names[cnt] = fd->name(); } for (int i = 0; i < ntypes; cnt++, i++) { const GPB::Descriptor* d = desc->nested_type(i); res[cnt] = S4_Descriptor(d); names[cnt] = d->name(); } for (int i = 0; i < nenums; cnt++, i++) { const GPB::EnumDescriptor* ed = desc->enum_type(i); res[cnt] = S4_EnumDescriptor(ed); names[cnt] = ed->name(); } res.names() = names; return res; } RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::DescriptorProto* message = new GPB::DescriptorProto(); d->CopyTo(message); return message; } RPB_FUNCTION_2(S4_FieldDescriptor, METHOD(field), Rcpp::XPtr d, int i) { return d->field(i); } RPB_FUNCTION_2(S4_FieldDescriptor, METHOD(FindFieldByNumber), Rcpp::XPtr d, int num) { return d->FindFieldByNumber(num); } RPB_FUNCTION_2(S4_FieldDescriptor, METHOD(FindFieldByName), Rcpp::XPtr d, std::string nam) { return d->FindFieldByName(nam); } RPB_FUNCTION_2(S4_Descriptor, METHOD(nested_type), Rcpp::XPtr d, int i) { return d->nested_type(i); } RPB_FUNCTION_2(S4_Descriptor, METHOD(FindNestedTypeByName), Rcpp::XPtr d, std::string nam) { return d->FindNestedTypeByName(nam); } RPB_FUNCTION_2(S4_EnumDescriptor, METHOD(enum_type), Rcpp::XPtr d, int i) { return d->enum_type(i); } // FIXME: two methods cant have the same name // RPB_FUNCTION_2( S4_EnumDescriptor, METHOD(enum_type), // Rcpp::XPtr d, std::string name){ // return d->FindEnumTypeByName( i ) ; // } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->file()); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return full ? d->full_name() : d->name(); } RPB_FUNCTION_2(S4_Message, METHOD(readMessageFromFile), Rcpp::XPtr desc, std::string filename) { /* open the file to read in binary mode */ int file = open(filename.c_str(), O_RDONLY | O_BINARY); /* create a prototype of the message we are going to read */ GPB::Message* message = PROTOTYPE(desc); if (!message) { throw std::range_error("could not call factory->GetPrototype(desc)->New()"); } /* read the message from the file */ // TODO(mstokely): Check return value! message->ParsePartialFromFileDescriptor(file); close(file); return (S4_Message(message)); } RPB_FUNCTION_2(S4_Message, METHOD(readMessageFromConnection), Rcpp::XPtr desc, int conn_id) { RconnectionCopyingInputStream wrapper(conn_id); GPB::io::CopyingInputStreamAdaptor stream(&wrapper); GPB::io::CodedInputStream coded_stream(&stream); /* create a prototype of the message we are going to read */ GPB::Message* message = PROTOTYPE(desc); if (!message) { throw std::range_error("could not call factory->GetPrototype(desc)->New()"); } // TODO(mstokely): Check return value! message->ParsePartialFromCodedStream(&coded_stream); S4_Message res(message); return res; } RPB_FUNCTION_2(S4_Message, METHOD(readMessageFromRawVector), Rcpp::XPtr desc, Rcpp::RawVector raw) { GPB::io::ArrayInputStream ais((void*)raw.begin(), raw.size()); GPB::io::CodedInputStream stream(&ais); GPB::Message* message = PROTOTYPE(desc); if (!message) { throw std::range_error("could not call factory->GetPrototype(desc)->New()"); } message->MergePartialFromCodedStream(&stream); return (S4_Message(message)); } RPB_FUNCTION_3(S4_Message, METHOD(readASCIIFromString), Rcpp::XPtr desc, std::string input, bool partial) { GPB::Message* message = PROTOTYPE(desc); if (partial) { // Allow partial messages where object is not fully initialized GPB::TextFormat::Parser parser; parser.AllowPartialMessage(partial); if (parser.ParseFromString(input, message)) { return (S4_Message(message)); } else { throw std::range_error("Could not parse ASCII protocol buffer from text string."); } } else { // Default parser requires fully initialized ascii messages. if (GPB::TextFormat::ParseFromString(input, message)) { return (S4_Message(message)); } else { throw std::range_error("Could not parse ASCII protocol buffer from text string." " Consider setting partial=TRUE"); } } } RPB_FUNCTION_3(S4_Message, METHOD(readASCIIFromConnection), Rcpp::XPtr desc, int conn_id, bool partial) { RconnectionCopyingInputStream wrapper(conn_id); GPB::io::CopyingInputStreamAdaptor stream(&wrapper); /* create a prototype of the message we are going to read */ GPB::Message* message = PROTOTYPE(desc); if (!message) { throw std::range_error("could not call factory->GetPrototype(desc)->New()"); } if (partial) { // Allow partial messages where object is not fully initialized GPB::TextFormat::Parser parser; parser.AllowPartialMessage(partial); if (!parser.Parse(&stream, message)) { throw std::range_error("Could not parse ASCII protocol buffer."); } } else { // Default parser requires fully initialized ascii messages. if (!GPB::TextFormat::Parse(&stream, message)) { throw std::range_error("Could not parse ASCII protocol buffer."); } } if (wrapper.Failure()) { throw std::range_error("Could not read ASCII protocol buffer."); } return (S4_Message(message)); } RPB_FUNCTION_2(S4_Message, METHOD(readJSONFromString), Rcpp::XPtr desc, std::string input) { #ifdef PROTOBUF_JSON_UTIL GPB::Message* message = PROTOTYPE(desc); if (!message) { Rcpp::stop("could not call factory->GetPrototype(desc)->New()"); } GPB::util::Status status = GPB::util::JsonStringToMessage(input, message); if (!status.ok()) { Rcpp::stop(status.ToString().c_str()); } return (S4_Message(message)); #else Rcpp::stop( "The protobuf library you are using is too old for using JSON utility functions, " "please upgrade to version 3 or above."); #endif } RPB_FUNCTION_2(S4_Message, METHOD(readJSONFromConnection), Rcpp::XPtr desc, int conn_id) { #ifdef PROTOBUF_JSON_UTIL std::string json_string; RconnectionCopyingInputStream wrapper(conn_id); GPB::io::CopyingInputStreamAdaptor stream(&wrapper); const void* buffer; int size; while (stream.Next(&buffer, &size)) { json_string.append((char *) buffer, size); } if (wrapper.Failure()) { Rcpp::stop("Could not read JSON protocol buffer."); } /* create a prototype of the message we are going to read */ GPB::Message* message = PROTOTYPE(desc); if (!message) { Rcpp::stop("could not call factory->GetPrototype(desc)->New()"); } GPB::util::Status status = GPB::util::JsonStringToMessage(json_string, message); if (!status.ok()) { Rcpp::stop(status.ToString().c_str()); } return (S4_Message(message)); #else Rcpp::stop( "The protobuf library you are using is too old for using JSON utility functions, " "please upgrade to version 3 or above."); #endif } RcppExport SEXP Descriptor_getField(SEXP pointer, SEXP name) { GPB::FieldDescriptor* field_desc = (GPB::FieldDescriptor*)0; BEGIN_RCPP std::string error_message = "could not get FieldDescriptor for field"; SEXP retVal = R_NilValue; switch (TYPEOF(name)) { case CHARSXP: case STRSXP: // This tries to get the field by name for various types of descriptors. retVal = do_dollar_Descriptor(pointer, name); if (retVal == R_NilValue) { error_message = "Unknown field"; } else { return retVal; } break; default: { error_message = "Invalid type for get field extractor."; break; } } if (!field_desc) { Rcpp::stop(error_message.c_str()); } return S4_FieldDescriptor(field_desc); VOID_END_RCPP return S4_FieldDescriptor(field_desc); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/fieldtypes.h0000644000175000017500000000307512440004312015371 0ustar nileshnilesh#ifndef FIELD_TYPES_H #define FIELD_TYPES_H using namespace google::protobuf; #define TYPE_DOUBLE FieldDescriptor::TYPE_DOUBLE #define TYPE_FLOAT FieldDescriptor::TYPE_FLOAT #define TYPE_INT64 FieldDescriptor::TYPE_INT64 #define TYPE_UINT64 FieldDescriptor::TYPE_UINT64 #define TYPE_INT32 FieldDescriptor::TYPE_INT32 #define TYPE_FIXED64 FieldDescriptor::TYPE_FIXED64 #define TYPE_FIXED32 FieldDescriptor::TYPE_FIXED32 #define TYPE_BOOL FieldDescriptor::TYPE_BOOL #define TYPE_STRING FieldDescriptor::TYPE_STRING #define TYPE_GROUP FieldDescriptor::TYPE_GROUP #define TYPE_MESSAGE FieldDescriptor::TYPE_MESSAGE #define TYPE_BYTES FieldDescriptor::TYPE_BYTES #define TYPE_UINT32 FieldDescriptor::TYPE_UINT32 #define TYPE_ENUM FieldDescriptor::TYPE_ENUM #define TYPE_SFIXED32 FieldDescriptor::TYPE_SFIXED32 #define TYPE_SFIXED64 FieldDescriptor::TYPE_SFIXED64 #define TYPE_SINT32 FieldDescriptor::TYPE_SINT32 #define TYPE_SINT64 FieldDescriptor::TYPE_SINT64 #define MAX_TYPE FieldDescriptor::MAX_TYPE #define CPPTYPE_INT32 FieldDescriptor::CPPTYPE_INT32 #define CPPTYPE_INT64 FieldDescriptor::CPPTYPE_INT64 #define CPPTYPE_UINT32 FieldDescriptor::CPPTYPE_UINT32 #define CPPTYPE_UINT64 FieldDescriptor::CPPTYPE_UINT64 #define CPPTYPE_DOUBLE FieldDescriptor::CPPTYPE_DOUBLE #define CPPTYPE_FLOAT FieldDescriptor::CPPTYPE_FLOAT #define CPPTYPE_BOOL FieldDescriptor::CPPTYPE_BOOL #define CPPTYPE_ENUM FieldDescriptor::CPPTYPE_ENUM #define CPPTYPE_STRING FieldDescriptor::CPPTYPE_STRING #define CPPTYPE_MESSAGE FieldDescriptor::CPPTYPE_MESSAGE #define MAX_CPPTYPE FieldDescriptor::MAX_CPPTYPE #endif RProtoBuf/src/mutators.cpp0000644000175000017500000012527412440004312015440 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "fieldtypes.h" #include "RcppMacros.h" namespace rprotobuf { // {{{ GETDOUBLE /** * get the index'th value of x, as an double * * @param x some R data * @param index the index * @return x[index], as an double * @throws Rcpp::exception if x[index] cannot be converted to double */ /* FIXME: should we convert the NA's */ double GET_double(SEXP x, int index) { switch (TYPEOF(x)) { case INTSXP: return ((double)INTEGER(x)[index]); case REALSXP: return (REAL(x)[index]); case LGLSXP: return ((double)LOGICAL(x)[index]); case RAWSXP: return ((double)RAW(x)[index]); default: Rcpp::stop("cannot cast SEXP to double"); } return 0.0; // -Wall } // }}} float GET_float(SEXP x, int index) { switch (TYPEOF(x)) { case INTSXP: return ((float)INTEGER(x)[index]); case REALSXP: return ((float)REAL(x)[index]); case LGLSXP: return ((float)LOGICAL(x)[index]); case RAWSXP: return ((float)RAW(x)[index]); default: Rcpp::stop("cannot cast SEXP to double"); } return (float)0.0; // -Wall } int GET_int(SEXP x, int index) { switch (TYPEOF(x)) { case INTSXP: return (INTEGER(x)[index]); case REALSXP: return ((int)REAL(x)[index]); case LGLSXP: return ((int)LOGICAL(x)[index]); case RAWSXP: return ((int)RAW(x)[index]); default: Rcpp::stop("cannot cast SEXP to int"); } return 0; // -Wall, should not happen since we only call this when we know it works } template ValueType Int64FromString(const std::string& value) { std::stringstream ss(value); ValueType ret; if ((ss >> ret).fail() || !(ss >> std::ws).eof()) { std::string message = "Provided character value '" + value + "' cannot be cast to 64-bit integer."; Rcpp::stop(message.c_str()); } return ret; } template ValueType Int32FromString(const std::string& value) { std::stringstream ss(value); ValueType ret; if ((ss >> ret).fail() || !(ss >> std::ws).eof()) { std::string message = "Provided character value '" + value + "' cannot be cast to 32-bit integer."; Rcpp::stop(message.c_str()); } return ret; } int32 GET_int32(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: return ((int32)INTEGER(x)[vec_index]); case REALSXP: return ((int32)REAL(x)[vec_index]); case LGLSXP: return ((int32)LOGICAL(x)[vec_index]); case RAWSXP: return ((int32)RAW(x)[vec_index]); case STRSXP: return Int32FromString(CHAR(STRING_ELT(x, vec_index))); default: Rcpp::stop("cannot cast SEXP to int32"); } return (int32)0; // -Wall, should not happen since we only call this when we know it works } int64 GET_int64(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: return ((int64)INTEGER(x)[vec_index]); case REALSXP: return ((int64)REAL(x)[vec_index]); case LGLSXP: return ((int64)LOGICAL(x)[vec_index]); case RAWSXP: return ((int64)RAW(x)[vec_index]); case STRSXP: return Int64FromString(CHAR(STRING_ELT(x, vec_index))); default: Rcpp::stop("cannot cast SEXP to int64"); } return (int64)0; // -Wall, should not happen since we only call this when we know it works } uint32 GET_uint32(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: return ((uint32)INTEGER(x)[vec_index]); case REALSXP: return ((uint32)REAL(x)[vec_index]); case LGLSXP: return ((uint32)LOGICAL(x)[vec_index]); case RAWSXP: return ((uint32)RAW(x)[vec_index]); case STRSXP: return Int32FromString(CHAR(STRING_ELT(x, vec_index))); default: Rcpp::stop("cannot cast SEXP to uint32"); } return (uint32)0; // -Wall, should not happen since we only call this when we know it works } uint64 GET_uint64(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: return ((uint64)INTEGER(x)[vec_index]); case REALSXP: return ((uint64)REAL(x)[vec_index]); case LGLSXP: return ((uint64)LOGICAL(x)[vec_index]); case RAWSXP: return ((uint64)RAW(x)[vec_index]); case STRSXP: return Int64FromString(CHAR(STRING_ELT(x, vec_index))); default: Rcpp::stop("cannot cast SEXP to uint64"); } return (uint64)0; // -Wall, should not happen since we only call this when we know it works } bool GET_bool(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: if (INTEGER(x)[vec_index] == R_NaInt) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } return ((bool)INTEGER(x)[vec_index]); case REALSXP: if (REAL(x)[vec_index] == R_NaReal) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } return ((bool)REAL(x)[vec_index]); case LGLSXP: if (LOGICAL(x)[vec_index] == NA_LOGICAL) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } return ((bool)LOGICAL(x)[vec_index]); case RAWSXP: return ((bool)RAW(x)[vec_index]); default: Rcpp::stop("cannot cast SEXP to bool"); } return (bool)0; // Unreachable. -Wall } std::string GET_stdstring(SEXP x, R_xlen_t vec_index) { if (TYPEOF(x) == STRSXP) { return (CHAR(STRING_ELT(x, vec_index))); } return ""; // Unreachable. -Wall } std::string GET_bytes(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case RAWSXP: if (vec_index == 0) { return (std::string((const char*)RAW(x), (size_t)LENGTH(x))); } else { Rcpp::stop("cannot cast SEXP to bytes"); } case VECSXP: if (TYPEOF(VECTOR_ELT(x, vec_index)) == RAWSXP) { return (std::string((const char*)RAW(VECTOR_ELT(x, vec_index)), (size_t)LENGTH(VECTOR_ELT(x, vec_index)))); } else { Rcpp::stop("cannot cast SEXP to bytes"); } default: Rcpp::stop("cannot cast SEXP to bytes"); } return ""; // Unreachable. -Wall } /** * indicates if this is a list of messages * * @param x a list (VECSXP), not a long vec * @return TRUE if all objects are instances of Message class */ Rboolean allAreMessages(SEXP x) { if (TYPEOF(x) != VECSXP) return _FALSE_; R_xlen_t n = LENGTH(x); // Caller verifies its not a long vec SEXP current; for (R_xlen_t i = 0; i < n; i++) { current = VECTOR_ELT(x, i); /* not an S4 object */ if (TYPEOF(current) != S4SXP) return _FALSE_; /* not a Message object */ if (!Rf_inherits(current, "Message")) return _FALSE_; } return _TRUE_; } /** * indicates if this is a list of raws * * @param x a list (VECSXP) * @return TRUE if all objects are instances of RAWSXP */ Rboolean allAreRaws(SEXP x) { if (TYPEOF(x) != VECSXP) return _FALSE_; R_xlen_t n = LENGTH(x); SEXP current; for (R_xlen_t i = 0; i < n; i++) { current = VECTOR_ELT(x, i); /* not a RAWSXP */ if (TYPEOF(current) != RAWSXP) return _FALSE_; } return _TRUE_; } /** * check that all the values contained in value are suitable for the * enum type * * @param field_desc field descriptor of an enum type * @param value value to potentially fill the enum * */ void CHECK_values_for_enum(const GPB::FieldDescriptor* field_desc, SEXP value) { BEGIN_RCPP const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); // N.B. n undefined if TYPEOF(value) not a vector, but we catch that below. R_xlen_t n = XLENGTH(value); switch (TYPEOF(value)) { // {{{ numbers case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { int nenums = enum_desc->value_count(); // Guaranteed to be > 0. std::vector possibles(nenums); for (int i = 0; i < nenums; i++) { possibles[i] = enum_desc->value(i)->number(); } /* loop around the numbers to see if they are in the possibles */ for (int i = 0; i < n; i++) { int val = GET_int(value, i); int ok = 0; for (int j = 0; j < nenums; j++) { if (val == possibles[j]) { ok = 1; break; } } if (!ok) { Rcpp::stop("wrong value for enum"); } } break; } // }}} // {{{ STRSXP case STRSXP: { int nenums = enum_desc->value_count(); std::vector possibles(nenums); for (int i = 0; i < nenums; i++) { possibles[i] = enum_desc->value(i)->name(); } /* loop around the numbers to see if they are in the possibles */ for (int i = 0; i < n; i++) { const char* val = CHAR(STRING_ELT(value, i)); int ok = 0; /* FIXME: there is probably something more efficient */ for (int j = 0; j < nenums; j++) { if (!possibles[j].compare(val)) { ok = 1; break; } } if (!ok) { Rcpp::stop("wrong value for enum"); } } break; } // }}} default: Rcpp::stop("impossible to convert to a enum"); } VOID_END_RCPP } /** * check that the values are suitable for the field descriptor * * @throws Rcpp::exception on error (uncaught) */ void CHECK_messages(const GPB::FieldDescriptor* field_desc, SEXP values) { if (TYPEOF(values) != VECSXP) { Rcpp::stop("expecting a list of messages"); } const char* target = field_desc->message_type()->full_name().c_str(); int n = LENGTH(values); for (int i = 0; i < n; i++) { if (!isMessage(VECTOR_ELT(values, i), target)) { // TODO(mstokely): When we have C++11 CXX11, use // std::to_string(i) // {{{ std::string s; std::stringstream out; out << i; s = out.str(); // }}} string message = "List element " + s + " is not a message " + "of the appropriate type ('" + target + "')"; Rcpp::stop(message.c_str()); } } } /** * check that all repeated values are ok before doing anything, * otherwise this could lead to modifying a few values then failing in * an inconsistent state. */ void CHECK_repeated_vals(const GPB::FieldDescriptor* field_desc, SEXP value, int value_size) { switch (field_desc->type()) { case TYPE_MESSAGE: case TYPE_GROUP: { switch (TYPEOF(value)) { case VECSXP: { /* check that it is a list of Messages of the appropriate type */ CHECK_messages(field_desc, value); break; } case S4SXP: { /* check that this is a message of the appropriate type */ if (!isMessage(value, field_desc->message_type()->full_name().c_str())) { string message = "Not a message of type '" + field_desc->message_type()->full_name() + "'"; Rcpp::stop(message.c_str()); } break; } default: Rcpp::stop("impossible to convert to a message"); } break; } case TYPE_ENUM: { const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); /* check first, it means we have to loop twice, but otherwise this could have some side effects before the exception is thrown */ /* FIXME: the checking should go before the resizing */ switch (TYPEOF(value)) { // {{{ numbers case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { int nenums = enum_desc->value_count(); std::vector possibles(nenums); for (int i = 0; i < nenums; i++) { possibles[i] = enum_desc->value(i)->number(); } /* loop around the numbers to see if they are in the possibles */ for (int i = 0; i < value_size; i++) { int val = GET_int(value, i); int ok = 0; for (int j = 0; j < nenums; j++) { if (val == possibles[j]) { ok = 1; break; } } if (!ok) { Rcpp::stop("wrong value for enum"); } } break; } // }}} // {{{ STRSXP case STRSXP: { int nenums = enum_desc->value_count(); std::vector possibles(nenums); for (int i = 0; i < nenums; i++) { possibles[i] = enum_desc->value(i)->name(); } /* loop around the numbers to see if they are in the possibles */ for (int i = 0; i < value_size; i++) { const char* val = CHAR(STRING_ELT(value, i)); int ok = 0; /* FIXME: there is probably something more efficient */ for (int j = 0; j < nenums; j++) { if (!possibles[j].compare(val)) { ok = 1; break; } } if (!ok) { Rcpp::stop("wrong value for enum"); } } break; } // }}} default: Rcpp::stop("impossible to convert to a enum"); } break; } case TYPE_DOUBLE: case TYPE_FLOAT: case TYPE_INT64: case TYPE_UINT64: case TYPE_INT32: case TYPE_FIXED64: case TYPE_FIXED32: case TYPE_BOOL: case TYPE_STRING: case TYPE_BYTES: case TYPE_UINT32: case TYPE_SFIXED32: case TYPE_SFIXED64: case TYPE_SINT32: case TYPE_SINT64: { ; // nothing, just to satisfy -Wall } } } /** * set a non-repeated message field to a new value * * @param message pointer to a message * @param ref pointer to reflection object for message * @param field_desc pointer to field descriptor to update * @param value new value for the field * @param value_size size of the new value for the field * @throws Rcpp::exception on error (uncaught) * @return void, the message is modified by reference */ void setNonRepeatedMessageField(GPB::Message* message, const Reflection* ref, const GPB::FieldDescriptor* field_desc, SEXP value, int value_size) { if (value_size > 1) { Rcpp::stop("cannot set non-repeated field to vector of length > 1"); } switch (GPB::FieldDescriptor::TypeToCppType(field_desc->type())) { // {{{ simple cases using macro expansion #undef HANDLE_SINGLE_FIELD #define HANDLE_SINGLE_FIELD(CPPTYPE, CAMEL, TYPE) \ case CPPTYPE: { \ ref->Set##CAMEL(message, field_desc, Rcpp::as(value)); \ break; \ } HANDLE_SINGLE_FIELD(CPPTYPE_DOUBLE, Double, double) HANDLE_SINGLE_FIELD(CPPTYPE_FLOAT, Float, float) case CPPTYPE_BOOL: { // TODO(mstokely): Rcpp should handle this! if ((TYPEOF(value) == LGLSXP) && (LOGICAL(value)[0] == NA_LOGICAL)) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } else if ((TYPEOF(value) == INTSXP) && (INTEGER(value)[0] == R_NaInt)) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } else if ((TYPEOF(value) == REALSXP) && (REAL(value)[0] == R_NaReal)) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } ref->SetBool(message, field_desc, Rcpp::as(value)); break; } case CPPTYPE_INT32: { if (TYPEOF(value) == STRSXP) { const string int32str = COPYSTRING(CHAR(STRING_ELT(value, 0))); ref->SetInt32(message, field_desc, Int32FromString(int32str)); break; } else { ref->SetInt32(message, field_desc, Rcpp::as(value)); break; } } case CPPTYPE_UINT32: { if (TYPEOF(value) == STRSXP) { const string uint32str = COPYSTRING(CHAR(STRING_ELT(value, 0))); ref->SetUInt32(message, field_desc, Int32FromString(uint32str)); break; } else { // Rcpp::as is broken for uint32 types, so we just get Rcpp // to give us a valid double, ref->SetUInt32(message, field_desc, Rcpp::as(value)); break; } } #ifdef RCPP_HAS_LONG_LONG_TYPES case CPPTYPE_INT64: { // TODO(mstokely) Rcpp::as of a STRSEXP should just // work for strings representing int64s. if (TYPEOF(value) == STRSXP) { const string int64str = COPYSTRING(CHAR(STRING_ELT(value, 0))); ref->SetInt64(message, field_desc, Int64FromString(int64str)); break; } else { ref->SetInt64(message, field_desc, Rcpp::as(value)); break; } } case CPPTYPE_UINT64: { // TODO(mstokely) Rcpp::as of a STRSEXP should just // work for strings representing int64s. if (TYPEOF(value) == STRSXP) { const string int64str = COPYSTRING(CHAR(STRING_ELT(value, 0))); ref->SetUInt64(message, field_desc, Int64FromString(int64str)); break; } else { ref->SetUInt64(message, field_desc, Rcpp::as(value)); break; } } #endif #undef HANDLE_SINGLE_FIELD default: Rcpp::stop("Unsupported type"); // }}} // {{{ string case CPPTYPE_STRING: { switch (TYPEOF(value)) { case STRSXP: { ref->SetString(message, field_desc, COPYSTRING(CHAR(STRING_ELT(value, 0)))); break; } case RAWSXP: { ref->SetString(message, field_desc, GET_bytes(value, 0)); break; } case S4SXP: { /* check if value is a message */ if (!Rf_inherits(value, "Message")) { Rcpp::stop("Can only convert S4 objects of class 'Message'"); } GPB::Message* __mess = GET_MESSAGE_POINTER_FROM_S4(value); ref->SetString(message, field_desc, __mess->SerializeAsString()); break; } default: Rcpp::stop("Cannot convert to string"); } break; } // }}} // {{{ message case CPPTYPE_MESSAGE: { if (TYPEOF(value) == S4SXP && Rf_inherits(value, "Message")) { GPB::Message* mess = (GPB::Message*)EXTPTR_PTR(GET_SLOT(value, Rf_install("pointer"))); const char* type = mess->GetDescriptor()->full_name().c_str(); const char* target = field_desc->message_type()->full_name().c_str(); if (strcmp(type, target)) { Rcpp::stop("wrong message type"); } GPB::Message* m = ref->MutableMessage(message, field_desc); m->CopyFrom(*mess); } else { Rcpp::stop("type mismatch, expecting a 'Message' object"); } break; } // }}} // {{{ enum case CPPTYPE_ENUM: { const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { int val = Rcpp::as(value); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByNumber(val); if (!evd) { Rcpp::stop("wrong value for enum"); } else { ref->SetEnum(message, field_desc, evd); } break; } case STRSXP: { std::string val = Rcpp::as(value); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); if (!evd) { Rcpp::stop("wrong value for enum"); } else { ref->SetEnum(message, field_desc, evd); } break; } default: Rcpp::stop("cannot set enum value"); } break; } // }}} } } /** * set a repeated message field to a new value * * @param message pointer to a message * @param ref pointer to reflection object for message * @param field_desc pointer to field descriptor to update * @param value new value for the field * @param value_size size of the new value for the field * @throws Rcpp::exception on error (uncaught) * @return void, the message is modified by reference */ void setRepeatedMessageField(GPB::Message* message, const Reflection* ref, const GPB::FieldDescriptor* field_desc, SEXP value, R_xlen_t value_size) { // The number of elements already in the repeated field. int field_size = ref->FieldSize(*message, field_desc); /* in case of messages or enum, we have to check that all values are ok before doing anything, othewise this could leed to modify a few values and then fail which is not good */ CHECK_repeated_vals(field_desc, value, value_size); /* Remove some items if there are too many. */ if (field_size > value_size) { /* we need to remove some */ while (field_size > value_size) { ref->RemoveLast(message, field_desc); field_size--; } } switch (field_desc->type()) { // {{{ int32 case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: case STRSXP: // For int32, we support chars. { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedInt32(message, field_desc, i, GET_int32(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddInt32(message, field_desc, GET_int32(value, i)); } } break; } default: Rcpp::stop("Cannot convert to int32"); } break; } // }}} // {{{ int64 case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: case STRSXP: // For int64, we support chars. { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedInt64(message, field_desc, i, GET_int64(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddInt64(message, field_desc, GET_int64(value, i)); } } break; } default: Rcpp::stop("Cannot convert to int64"); } break; } // }}} // {{{ uint32 case TYPE_UINT32: case TYPE_FIXED32: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: case STRSXP: // For int32, we support chars. { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedUInt32(message, field_desc, i, GET_uint32(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddUInt32(message, field_desc, GET_uint32(value, i)); } } break; } default: Rcpp::stop("Cannot convert to uint32"); } break; } // }}} // {{{ uint64 case TYPE_UINT64: case TYPE_FIXED64: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: case STRSXP: // For int64, we support chars. { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedUInt64(message, field_desc, i, GET_uint64(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddUInt64(message, field_desc, GET_uint64(value, i)); } } break; } default: Rcpp::stop("Cannot convert to int64"); } break; } // }}} // {{{ double case TYPE_DOUBLE: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedDouble(message, field_desc, i, GET_double(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddDouble(message, field_desc, GET_double(value, i)); } } break; } default: Rcpp::stop("Cannot convert to double"); } break; } // }}} // {{{ float case TYPE_FLOAT: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedFloat(message, field_desc, i, GET_float(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddFloat(message, field_desc, GET_float(value, i)); } } break; } default: Rcpp::stop("Cannot convert to float"); } break; } // }}} // {{{ bool case TYPE_BOOL: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedBool(message, field_desc, i, GET_bool(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddBool(message, field_desc, GET_bool(value, i)); } } break; } default: Rcpp::stop("Cannot convert to bool"); } break; } // }}} // {{{ string case TYPE_STRING: case TYPE_BYTES: { switch (TYPEOF(value)) { case STRSXP: { /* in any case, fill the values up to field_size */ R_xlen_t i = 0; for (; i < field_size; i++) { ref->SetRepeatedString(message, field_desc, i, COPYSTRING(CHAR(STRING_ELT(value, i)))); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddString(message, field_desc, COPYSTRING(CHAR(STRING_ELT(value, i)))); } } break; } case RAWSXP: { /* in any case, fill the values up to field_size */ R_xlen_t i = 0; for (; i < field_size; i++) { ref->SetRepeatedString(message, field_desc, i, GET_bytes(value, 0)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddString(message, field_desc, GET_bytes(value, 0)); } } break; } case S4SXP: { /* check if value is a message */ if (!Rf_inherits(value, "Message")) { Rcpp::stop("Can only convert S4 objects of class 'Message'"); } GPB::Message* __mess = GET_MESSAGE_POINTER_FROM_S4(value); ref->SetRepeatedString(message, field_desc, 0, __mess->SerializeAsString()); break; } case VECSXP: { // we know it is a list of messages or raws because it // has been tested above if (LENGTH(value) > 0 && TYPEOF(VECTOR_ELT(value, 0)) == RAWSXP) { /* in any case, fill the values up to field_size */ R_xlen_t i = 0; for (; i < field_size; i++) { ref->SetRepeatedString(message, field_desc, i, GET_bytes(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddString(message, field_desc, GET_bytes(value, i)); } } } else { // FIXME: we should probably use SerializeToString // as indicated in the protobuf api documentation // http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.message_lite.html#MessageLite.SerializeAsString.details GPB::Message* __mess; /* in any case, fill the values up to field_size */ R_xlen_t i = 0; for (; i < field_size; i++) { __mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(value, i)); ref->SetRepeatedString(message, field_desc, i, __mess->SerializeAsString()); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { __mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(value, i)); ref->AddString(message, field_desc, __mess->SerializeAsString()); } } } break; } default: Rcpp::stop("Cannot convert to string"); } break; } // }}} // {{{ message case TYPE_MESSAGE: case TYPE_GROUP: { if (TYPEOF(value) == S4SXP) { /* we know it is a message of the correct type (tested above) */ GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(value); if (field_size == 1) { /* FIXME: we should not __copy__ the message */ ref->MutableRepeatedMessage(message, field_desc, 0)->CopyFrom(*mess); } else { /* FIXME */ ref->ClearField(message, field_desc); /* FIXME: we should not __copy__ the message */ ref->AddMessage(message, field_desc)->CopyFrom(*mess); } } else if (TYPEOF(value) == VECSXP) { /* in any case, fill the values up to field_size */ int i = 0; for (; i < field_size; i++) { GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(value, i)); /* we already know it is of the correct type because of the premptive check above */ ref->MutableRepeatedMessage(message, field_desc, i)->CopyFrom(*mess); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(value, i)); /* we already know it is of the correct type because of the premptive check above */ ref->AddMessage(message, field_desc)->CopyFrom(*mess); } } } else { Rcpp::stop("type mismatch, expecting a 'Message' object or a list of them"); } break; } // }}} // {{{ enum case TYPE_ENUM: { const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); switch (TYPEOF(value)) { // {{{ numbers case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { int i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { int val = GET_int(value, i); ref->SetRepeatedEnum(message, field_desc, i, enum_desc->FindValueByNumber(val)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { int val = GET_int(value, i); ref->AddEnum(message, field_desc, enum_desc->FindValueByNumber(val)); } } break; } // }}} // {{{ STRSXP case STRSXP: { /* in any case, fill the values up to field_size */ int i = 0; for (; i < field_size; i++) { std::string val = CHAR(STRING_ELT(value, i)); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); ref->SetRepeatedEnum(message, field_desc, i, evd); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { std::string val = CHAR(STRING_ELT(value, i)); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); ref->AddEnum(message, field_desc, evd); } } break; } // }}} default: Rcpp::stop("cannot set enum value"); } } // }}} } } /** * set a message field to a new value * * @param pointer external pointer to a message * @param name name of the field, or an S4 FieldDescriptor object. * @param value new value for the field * * @return allways NULL, the message is modified by reference */ SEXP setMessageField(SEXP pointer, SEXP name, SEXP value) { BEGIN_RCPP RPB_DEBUG_BEGIN("setMessageField") PRINT_DEBUG_INFO("pointer", pointer); PRINT_DEBUG_INFO("name", name); PRINT_DEBUG_INFO("value", value); /* grab the Message pointer */ GPB::Message* message = GET_MESSAGE_POINTER_FROM_XP(pointer); /* check that we can get a file descriptor from name */ const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, name); const Reflection* ref = message->GetReflection(); if (value == R_NilValue || (Rf_isVector(value) && LENGTH(value) == 0)) { ref->ClearField(message, field_desc); return R_NilValue; } // {{{ preliminary checks R_xlen_t value_size = 1; if (Rf_isVector(value)) { if (IS_LONG_VEC(value)) { // field_size is an int, so presumably it would generate // a CHECK failure in protobuf code on 2^32 element anyway. Rcpp_error("Long vectors not supported for repeated fields."); } else { value_size = LENGTH(value); } } // if the R type is RAWSXP and the cpp type is string or bytes, // then value_size is actually one because the raw vector // is converted to a string GPB::FieldDescriptor::Type field_type = field_desc->type(); if (field_type == TYPE_STRING || field_type == TYPE_BYTES) { if (TYPEOF(value) == RAWSXP) { value_size = 1; } else if (TYPEOF(value) == STRSXP) { value_size = LENGTH(value); } else if (TYPEOF(value) == S4SXP && Rf_inherits(value, "Message")) { value_size = 1; /* we will store the message payload */ } else if (TYPEOF(value) == VECSXP && allAreMessages(value)) { value_size = LENGTH(value); } else if (TYPEOF(value) == VECSXP && allAreRaws(value)) { value_size = LENGTH(value); } else { Rcpp::stop("cannot convert to string"); } } // }}} if (field_desc->is_repeated()) { setRepeatedMessageField(message, ref, field_desc, value, value_size); } else { setNonRepeatedMessageField(message, ref, field_desc, value, value_size); } RPB_DEBUG_END("setMessageField") END_RCPP } RPB_FUNCTION_VOID_2(update_message, Rcpp::XPtr message, Rcpp::List list) { Rcpp::CharacterVector names = list.attr("names"); int n = list.size(); for (int i = 0; i < n; i++) { (void)setMessageField(message, names[i], list[i]); } } } // namespace rprotobuf RProtoBuf/src/DescriptorPoolLookup.cpp0000644000175000017500000000760713300665751017743 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // DescriptorPoolLookup.cpp: R/C++ interface class library // // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "DescriptorPoolLookup.h" namespace rprotobuf { void DescriptorPoolLookup::add(const std::string& element) { elements.insert(element); } bool DescriptorPoolLookup::contains(const std::string& element) { return elements.find(element) != elements.end(); } SEXP DescriptorPoolLookup::getElements() { return Rcpp::wrap(elements); } std::set DescriptorPoolLookup::elements; RWarningErrorCollector DescriptorPoolLookup::error_collector; RSourceTree DescriptorPoolLookup::source_tree; GPB::compiler::Importer* DescriptorPoolLookup::importer = new GPB::compiler::Importer(&source_tree, &error_collector); GPB::DynamicMessageFactory DescriptorPoolLookup::message_factory(importer->pool()); /** * Add descriptors from a proto file to the descriptor pool. * * Specifically, message types, extensions, and enums are added. * Services are not added because they are not really used in RProtoBuf. * * @param files A character vector of .proto files to import. * @param dirs A character vector of directories to import from. * @throws Rcpp::exception if a file can't be loaded (uncaught). */ void DescriptorPoolLookup::importProtoFiles(SEXP files, SEXP dirs) { source_tree.addDirectories(dirs); int n = LENGTH(files); for (int j = 0; j < n; j++) { const GPB::FileDescriptor* file_desc = importer->Import(CHAR(STRING_ELT(files, j))); if (!file_desc) { std::string message = std::string("Could not load proto file '") + CHAR(STRING_ELT(files, j)) + "'\n"; Rcpp_error(message.c_str()); } // add top level messages from the file. int ntypes = file_desc->message_type_count(); for (int i = 0; i < ntypes; i++) { const GPB::Descriptor* desc = file_desc->message_type(i); add(desc->full_name()); /* should we bother recursing ? */ } // add top level extensions int nexts = file_desc->extension_count(); for (int i = 0; i < nexts; i++) { const GPB::FieldDescriptor* field_desc = file_desc->extension(i); add(field_desc->full_name()); } // add top level enums. int nenums = file_desc->enum_type_count(); for (int i = 0; i < nenums; i++) { const GPB::EnumDescriptor* enum_desc = file_desc->enum_type(i); add(enum_desc->full_name()); } } // source_tree.removeDirectories( dirs ) ; } /** * Clears any persisted state for the descriptor pool. */ void DescriptorPoolLookup::reset() { source_tree.removeAllDirectories(); elements.clear(); // TODO: Find out why deleting the old importer crashes the unit test run sometimes. // delete importer; importer = new GPB::compiler::Importer(&source_tree, &error_collector); } const GPB::DescriptorPool* DescriptorPoolLookup::pool() { return importer->pool(); } const GPB::DynamicMessageFactory* DescriptorPoolLookup::factory() { return &message_factory; } } // namespace rprotobuf RProtoBuf/src/ConnectionOutputStream.h0000644000175000017500000000055512440004312017715 0ustar nileshnilesh#ifndef RPROTOBUF_ConnectionOutputStream_H #define RPROTOBUF_ConnectionOutputStream_H namespace rprotobuf { class ConnectionOutputStream : public GPB::io::CopyingOutputStreamAdaptor { public: ConnectionOutputStream(SEXP con, bool was_open); ~ConnectionOutputStream(); private: bool was_open; SEXP con; }; } // namespace rprotobuf #endif RProtoBuf/src/wrapper_FieldDescriptor.cpp0000644000175000017500000000724712440004312020403 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "fieldtypes.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(FieldDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::FieldDescriptor, DebugString) RPB_XP_METHOD_0(METHOD(is_extension), GPB::FieldDescriptor, is_extension) RPB_XP_METHOD_0(METHOD(number), GPB::FieldDescriptor, number) RPB_XP_METHOD_0(METHOD(type), GPB::FieldDescriptor, type) RPB_XP_METHOD_0(METHOD(cpp_type), GPB::FieldDescriptor, cpp_type) RPB_XP_METHOD_0(METHOD(label), GPB::FieldDescriptor, label) RPB_XP_METHOD_0(METHOD(is_repeated), GPB::FieldDescriptor, is_repeated) RPB_XP_METHOD_0(METHOD(is_optional), GPB::FieldDescriptor, is_optional) RPB_XP_METHOD_0(METHOD(is_required), GPB::FieldDescriptor, is_required) RPB_XP_METHOD_0(METHOD(has_default_value), GPB::FieldDescriptor, has_default_value) RPB_FUNCTION_1(S4_Descriptor, METHOD(containing_type), Rcpp::XPtr d) { return S4_Descriptor(d->containing_type()); } #define RPB_HANDLE_CASE(__CPP__, __LC__) \ case CPPTYPE_##__CPP__: { \ return Rcpp::wrap(d->default_value_##__LC__()); \ } RPB_FUNCTION_1(SEXP, METHOD(default_value), Rcpp::XPtr d) { switch (d->cpp_type()) { RPB_HANDLE_CASE(INT32, int32) RPB_HANDLE_CASE(UINT32, uint32) #ifdef RCPP_HAS_LONG_LONG_TYPES RPB_HANDLE_CASE(INT64, int64) RPB_HANDLE_CASE(UINT64, uint64) #endif RPB_HANDLE_CASE(DOUBLE, double) RPB_HANDLE_CASE(FLOAT, float) RPB_HANDLE_CASE(BOOL, bool) RPB_HANDLE_CASE(STRING, string) case CPPTYPE_ENUM: { return Rf_ScalarInteger(d->default_value_enum()->number()); } default: break; } return R_NilValue; } RPB_FUNCTION_1(S4_Descriptor, METHOD(message_type), Rcpp::XPtr d) { if (d->cpp_type() != CPPTYPE_MESSAGE) { throw Rcpp::not_compatible("not a message type field"); } return S4_Descriptor(d->message_type()); } RPB_FUNCTION_1(S4_EnumDescriptor, METHOD(enum_type), Rcpp::XPtr d) { if (d->cpp_type() != CPPTYPE_ENUM) { Rcpp::stop("not an enum type field"); } return S4_EnumDescriptor(d->enum_type()); } RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::FieldDescriptorProto* message = new GPB::FieldDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->file()); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return full ? d->full_name() : d->name(); } #undef RPB_HANDLE_CASE #undef METHOD } // namespace rprotobuf RProtoBuf/src/wrapper_Message.cpp0000644000175000017500000012033414060653075016716 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "fieldtypes.h" #include "RcppMacros.h" #define SAME(x, y, tol) ((tol == 0.0 && x == y) || (((x - y) * (x - y) < tol* tol) ? 1 : 0)) namespace rprotobuf { /* helpers */ /* this is only to be called for repeated fields */ int MESSAGE_GET_REPEATED_INT(const GPB::Message* message, const GPB::FieldDescriptor* field_desc, int index) { const GPB::Reflection* ref = message->GetReflection(); switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: return (int)ref->GetRepeatedInt32(*message, field_desc, index); case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: return (int)ref->GetRepeatedInt64(*message, field_desc, index); case TYPE_UINT32: case TYPE_FIXED32: return (int)ref->GetRepeatedUInt32(*message, field_desc, index); case TYPE_UINT64: case TYPE_FIXED64: return (int)ref->GetRepeatedUInt64(*message, field_desc, index); case TYPE_ENUM: return ref->GetRepeatedEnum(*message, field_desc, index)->number(); default: Rcpp_error("cannot cast to int"); } return 0; // Unreachable for -Wall } /* this is only to be called for repeated fields */ double MESSAGE_GET_REPEATED_DOUBLE(const GPB::Message* message, const GPB::FieldDescriptor* field_desc, int index) { const GPB::Reflection* ref = message->GetReflection(); switch (field_desc->type()) { case TYPE_FLOAT: return (double)ref->GetRepeatedFloat(*message, field_desc, index); case TYPE_DOUBLE: return (double)ref->GetRepeatedDouble(*message, field_desc, index); default: Rcpp_error("cannot cast to double"); } return 0; // -Wall } #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(Message__, __NAME__) /** * Clone a message * * @param xp external pointer to a message * @return a new message, clone of the input message */ RPB_FUNCTION_1(S4_Message, METHOD(clone), Rcpp::XPtr message) { /* cloning message as sheep */ GPB::Message* sheep = message->New(); sheep->CopyFrom(*message); return S4_Message(sheep); } /** * TRUE if the message has the specified field name. * FALSE otherwise. * * * @param xp external pointer to the Message * @param name name of the field */ RPB_FUNCTION_2(bool, METHOD(field_exists), Rcpp::XPtr message, std::string name) { const GPB::Descriptor* desc = message->GetDescriptor(); const GPB::FieldDescriptor* field_desc = desc->FindFieldByName(name); return (field_desc != NULL); } /** * TRUE if the message has the field name and it is populated. * FALSE otherwise. * * @param xp external pointer to the Message * @param name name of the field */ RPB_FUNCTION_2(bool, METHOD(has_field), Rcpp::XPtr message, std::string name) { const GPB::Descriptor* desc = message->GetDescriptor(); const GPB::FieldDescriptor* field_desc = desc->FindFieldByName(name); bool res = false; if (field_desc) { const GPB::Reflection* ref = message->GetReflection(); if (field_desc->is_repeated()) { res = ref->FieldSize(*message, field_desc) > 0; } else { res = ref->HasField(*message, field_desc); } } return res; } /** * Check if all required fields are set * * @param xp external pointer to the Message */ RPB_FUNCTION_1(bool, METHOD(is_initialized), Rcpp::XPtr message) { return message->IsInitialized(); } /** * Serialize a message to a file * * @param xp external pointer to a GPB::Message* * @param filename file name where to serialize */ RPB_FUNCTION_VOID_2(METHOD(serialize_to_file), Rcpp::XPtr message, const char* filename) { /* open the file in binary mode to write */ /* we make sure in the R side that filename is the full path of the file */ int file = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); /* using partial to allow partially filled messages */ // TODO(mstokely): Check return value and throw Rcpp::stop if 0? message->SerializePartialToFileDescriptor(file); close(file); } /** * Create a raw vector that contains the content of the serialized message * * @param xp xternal pointer to the message */ RPB_FUNCTION_1(Rcpp::RawVector, METHOD(get_payload), Rcpp::XPtr message) { /* create a raw vector of the appropriate size */ #if GOOGLE_PROTOBUF_VERSION < 3006001 R_xlen_t size = message->ByteSize(); #else R_xlen_t size = message->ByteSizeLong(); #endif Rcpp::RawVector payload(size); /* fill the array */ message->SerializePartialToArray(payload.begin(), size); return (payload); } RPB_XP_METHOD_VOID_0(METHOD(clear), GPB::Message, Clear) /** * Clear a field of a message * * @param xp (GPB::Message*) external pointer * @param field name or tag of the field */ RPB_FUNCTION_VOID_2(METHOD(clear_field), Rcpp::XPtr m, SEXP field) { const GPB::FieldDescriptor* field_desc = getFieldDescriptor(m, field); const GPB::Reflection* ref = m->GetReflection(); ref->ClearField(m, field_desc); } /** * Return a named list representation of the fields set in a message. * * @param xp external pointer to a Message * @return the message as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr message) { const GPB::Descriptor* desc = message->GetDescriptor(); int nf = desc->field_count(); Rcpp::CharacterVector fieldNames(nf); Rcpp::List val(nf); /* TODO: not use getMessageField */ for (int i = 0; i < nf; i++) { const GPB::FieldDescriptor* fd = desc->field(i); val[i] = getMessageField(message, Rcpp::CharacterVector::create(fd->name())); fieldNames[i] = fd->name(); } val.names() = fieldNames; return val; } /** * The number of fields the message has. A field counts in these two situations: * - it is repeated and the array size is greater than 0 * - it is not repeated and the message has it * * @param xp external pointer to the Message */ RPB_FUNCTION_1(int, METHOD(length), Rcpp::XPtr message) { const GPB::Descriptor* desc = message->GetDescriptor(); const GPB::Reflection* ref = message->GetReflection(); int nfields = desc->field_count(); int res = 0; for (int i = 0; i < nfields; i++) { const GPB::FieldDescriptor* field_desc = desc->field(i); if (field_desc->is_repeated()) { if (ref->FieldSize(*message, field_desc) > 0) { res++; } } else { if (ref->HasField(*message, field_desc)) { res++; } } } return res; } /** * The number of extensions the message has. * * @param xp external pointer to the Message */ RPB_FUNCTION_1(int, METHOD(num_extensions), Rcpp::XPtr message) { const GPB::Reflection* ref = message->GetReflection(); int nexts = 0; std::vector fields; ref->ListFields(*message, &fields); for (unsigned int i = 0; i < fields.size(); i++) { if (fields[i]->is_extension()) { nexts++; } } return nexts; } /** * Get the message descriptor of a Message. * * @param xp (GPB::Message*) external pointer * @return the descriptor, as a Descriptor R S4 object */ RPB_FUNCTION_1(S4_Descriptor, METHOD(descriptor), Rcpp::XPtr message) { return (message->GetDescriptor()); } RPB_XP_METHOD_0(METHOD(as_character), GPB::Message, DebugString) #if GOOGLE_PROTOBUF_VERSION < 3006001 RPB_XP_METHOD_0(METHOD(bytesize), GPB::Message, ByteSize) #else RPB_XP_METHOD_0(METHOD(bytesize), GPB::Message, ByteSizeLong) #endif RPB_FUNCTION_2(int, METHOD(field_size), Rcpp::XPtr message, SEXP field) { const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); int res = 0; if (field_desc->is_repeated()) { res = message->GetReflection()->FieldSize(*message, field_desc); } else { res = message->GetReflection()->HasField(*message, field_desc) ? 1 : 0; } return res; } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr message) { return S4_FileDescriptor(message->GetDescriptor()->file()); } RPB_FUNCTION_VOID_3(METHOD(set_field_size), Rcpp::XPtr message, SEXP field, int target) { const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); const GPB::Reflection* ref = message->GetReflection(); if (field_desc->is_repeated()) { int current = ref->FieldSize(*message, field_desc); if (target == 0) { ref->ClearField(message, field_desc); } else if (current > target) { while (current != target) { ref->RemoveLast(message, field_desc); current--; } } else if (current == target) { /* nothing to do */ } else {/* current < target */ while (current != target) { switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { ref->AddInt32(message, field_desc, (int32)0); break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { ref->AddInt64(message, field_desc, (int64)0); break; } case TYPE_UINT32: case TYPE_FIXED32: { ref->AddUInt32(message, field_desc, (uint32)0); break; } case TYPE_UINT64: case TYPE_FIXED64: { ref->AddUInt32(message, field_desc, (uint64)0); break; } case TYPE_DOUBLE: { ref->AddDouble(message, field_desc, (double)0.0); break; } case TYPE_FLOAT: { ref->AddFloat(message, field_desc, (float)0.0); break; } case TYPE_BOOL: { ref->AddBool(message, field_desc, (bool)0); break; } case TYPE_STRING: case TYPE_BYTES: { ref->AddString(message, field_desc, ""); break; } case TYPE_MESSAGE: case TYPE_GROUP: { /* fill with the prototype for that message type */ Rcpp_error("growing repeated messages not implemented, patches welcome"); break; } case TYPE_ENUM: { /* fill with the prototype for that message type */ Rcpp_error("growing repeated enums not implemented yet, patches welcome"); break; } } /* switch */ current++; } /* while */ } } else { if (target == 0) { if (ref->HasField(*message, field_desc)) { ref->ClearField(message, field_desc); } } else { if (!ref->HasField(*message, field_desc)) { switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { ref->SetInt32(message, field_desc, (int32)0); break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { ref->SetInt64(message, field_desc, (int64)0); break; } case TYPE_UINT32: case TYPE_FIXED32: { ref->SetUInt32(message, field_desc, (uint32)0); break; } case TYPE_UINT64: case TYPE_FIXED64: { ref->SetUInt32(message, field_desc, (uint64)0); break; } case TYPE_DOUBLE: { ref->SetDouble(message, field_desc, (double)0.0); break; } case TYPE_FLOAT: { ref->SetFloat(message, field_desc, (float)0.0); break; } case TYPE_BOOL: { ref->SetBool(message, field_desc, (bool)0); break; } case TYPE_STRING: case TYPE_BYTES: { ref->SetString(message, field_desc, ""); break; } case TYPE_MESSAGE: case TYPE_GROUP: { /* fill with the prototype for that message type */ Rcpp_error("not implemented yet, patches welcome"); break; } case TYPE_ENUM: { /* fill with the prototype for that message type */ Rcpp_error("not implemented yet, patches welcome"); break; } } } } } } /** * Returns the field names of the message. * * @param xp external pointer to a Message * * @return field names, as an R character vector (STRSXP) */ RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(fieldNames), Rcpp::XPtr message) { const GPB::Descriptor* desc = message->GetDescriptor(); int nfields = desc->field_count(); Rcpp::CharacterVector res(nfields); for (int i = 0; i < nfields; i++) { res[i] = desc->field(i)->name(); } return (res); } /** * Returns the JSON representation of the message. * * @param xp external pointer to a Message * @param preserve_proto_field_names If FALSE (the default) convert field names to camelCase. * @param always_print_primitive_fields Whether to return the default value for missing primitive fields. (default false) * * @return JSON representation of the message as a single element R character vector (STRSXP) */ RPB_FUNCTION_3(Rcpp::CharacterVector, METHOD(as_json), Rcpp::XPtr message, bool preserve_proto_field_names, bool always_print_primitive_fields) { #ifdef PROTOBUF_JSON_UTIL GPB::util::JsonPrintOptions opts; opts.add_whitespace = true; opts.preserve_proto_field_names = preserve_proto_field_names; opts.always_print_primitive_fields = always_print_primitive_fields; std::string buf; GPB::util::Status status = GPB::util::MessageToJsonString(*message, &buf, opts); if (!status.ok()) { Rcpp::stop(status.ToString().c_str()); } Rcpp::CharacterVector res(1); res[0] = buf; return (res); #else Rcpp::stop( "The protobuf library you are using is too old for using JSON utility functions, " "please upgrade to version 3 or above."); #endif } bool identical_messages_(const GPB::Message* m1, const GPB::Message* m2, double tol) { const GPB::Descriptor* d1 = m1->GetDescriptor(); const GPB::Descriptor* d2 = m2->GetDescriptor(); /* first of all, check if this is the same message type */ if (d1 != d2) { return false; } const GPB::Reflection* ref = m2->GetReflection(); /* iterate field descriptors */ int nf = d1->field_count(); for (int i = 0; i < nf; i++) { const GPB::FieldDescriptor* field_desc = d1->field(i); if (field_desc->is_repeated()) { /* test if the size differs */ int fs1 = ref->FieldSize(*m1, field_desc); int fs2 = ref->FieldSize(*m2, field_desc); if (fs1 != fs2) return false; /* skip the field if it's unset in both messages */ if ((fs1 == 0) & (fs2 == 0)) continue; /* test all items */ switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedInt32(*m1, field_desc, j) != ref->GetRepeatedInt32(*m2, field_desc, j)) return false; } break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedInt64(*m1, field_desc, j) != ref->GetRepeatedInt64(*m2, field_desc, j)) return false; } break; } case TYPE_UINT32: case TYPE_FIXED32: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedUInt32(*m1, field_desc, j) != ref->GetRepeatedUInt32(*m2, field_desc, j)) return false; } break; } case TYPE_UINT64: case TYPE_FIXED64: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedUInt64(*m1, field_desc, j) != ref->GetRepeatedUInt64(*m2, field_desc, j)) return false; } break; } case TYPE_DOUBLE: { for (int j = 0; j < fs1; j++) { if (!SAME(ref->GetRepeatedDouble(*m1, field_desc, j), ref->GetRepeatedDouble(*m2, field_desc, j), tol)) return false; } break; } case TYPE_FLOAT: { for (int j = 0; j < fs1; j++) { if (!SAME(ref->GetRepeatedFloat(*m1, field_desc, j), ref->GetRepeatedFloat(*m2, field_desc, j), tol)) return false; } break; } case TYPE_BOOL: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedBool(*m1, field_desc, j) != ref->GetRepeatedBool(*m2, field_desc, j)) return false; } break; } case TYPE_STRING: case TYPE_BYTES: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedString(*m1, field_desc, j) != ref->GetRepeatedString(*m2, field_desc, j)) return false; } break; } case TYPE_ENUM: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedEnum(*m1, field_desc, j) != ref->GetRepeatedEnum(*m2, field_desc, j)) return false; } break; } case TYPE_MESSAGE: case TYPE_GROUP: { for (int j = 0; j < fs1; j++) { const GPB::Message* mm1 = &ref->GetRepeatedMessage(*m1, field_desc, j); const GPB::Message* mm2 = &ref->GetRepeatedMessage(*m2, field_desc, j); if (!identical_messages_(mm1, mm2, tol)) { return false; } } break; } default: Rcpp_error("unknown type"); } } else { /* skip the field if it's unset in both messages */ bool hf1 = ref->HasField(*m1, field_desc); bool hf2 = ref->HasField(*m2, field_desc); if (!hf1 & !hf2) continue; switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { if (ref->GetInt32(*m1, field_desc) != ref->GetInt32(*m2, field_desc)) return false; break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { if (ref->GetInt64(*m1, field_desc) != ref->GetInt64(*m2, field_desc)) return false; break; } case TYPE_UINT32: case TYPE_FIXED32: { if (ref->GetUInt32(*m1, field_desc) != ref->GetUInt32(*m2, field_desc)) return false; break; } case TYPE_UINT64: case TYPE_FIXED64: { if (ref->GetUInt64(*m1, field_desc) != ref->GetUInt64(*m2, field_desc)) return false; break; } case TYPE_DOUBLE: { if (ref->GetDouble(*m1, field_desc) != ref->GetDouble(*m2, field_desc)) return false; break; } case TYPE_FLOAT: { if (ref->GetFloat(*m1, field_desc) != ref->GetFloat(*m2, field_desc)) return false; break; } case TYPE_BOOL: { if (ref->GetBool(*m1, field_desc) != ref->GetBool(*m2, field_desc)) return false; break; } case TYPE_STRING: case TYPE_BYTES: { if (ref->GetString(*m1, field_desc) != ref->GetString(*m2, field_desc)) return false; break; } case TYPE_ENUM: { if (ref->GetEnum(*m1, field_desc) != ref->GetEnum(*m2, field_desc)) return false; break; } case TYPE_MESSAGE: case TYPE_GROUP: { const GPB::Message* mm1 = &ref->GetMessage(*m1, field_desc); const GPB::Message* mm2 = &ref->GetMessage(*m2, field_desc); if (!identical_messages_(mm1, mm2, tol)) { return false; } break; } default: Rcpp_error("unknown type"); } } } /* finally */ return true; } RPB_FUNCTION_2(bool, identical_messages, Rcpp::XPtr m1, Rcpp::XPtr m2) { return identical_messages_(m1, m2, 0.0); } RPB_FUNCTION_3(bool, all_equal_messages, Rcpp::XPtr m1, Rcpp::XPtr m2, double tol) { return identical_messages_(m1, m2, tol); } RPB_FUNCTION_VOID_4(METHOD(swap), Rcpp::XPtr message, SEXP field, Rcpp::IntegerVector left, Rcpp::IntegerVector right) { GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); const GPB::Reflection* ref = message->GetReflection(); if (!field_desc->is_repeated()) { throw std::range_error("swap can only be used with repeated fields"); } int n = LENGTH(left); /* we know that length(left) == length(right) */ for (int i = 0; i < n; i++) { ref->SwapElements(message, field_desc, left[i], right[i]); } } /** * Creates a new message by merging two messages of the same type. * * @param xp1 external pointer to a GPB::Message* * @param xp2 external pointer to a GPB::Message* * * @return a new message, as an R object of "Message" S4 class */ RPB_FUNCTION_2(S4_Message, METHOD(merge), Rcpp::XPtr m1, Rcpp::XPtr m2) { GPB::Message* merged = m1->New(); merged->MergeFrom(*m1); merged->MergeFrom(*m2); return S4_Message(merged); } /** * Add values to a repeated field. * * @param xp (GPB::Message*) external pointer * @param field field tag number or name * @param values values to append */ RPB_FUNCTION_VOID_3(METHOD(add_values), Rcpp::XPtr message, SEXP field, SEXP values) { const Reflection* ref = message->GetReflection(); const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); if (values == R_NilValue || LENGTH(values) == 0) { return; } if (field_desc->is_repeated()) { /* first check */ switch (field_desc->type()) { case TYPE_ENUM: { CHECK_values_for_enum(field_desc, values); break; } case TYPE_MESSAGE: case TYPE_GROUP: { CHECK_messages(field_desc, values); break; } default: { // nothing } } int value_size = LENGTH(values); /* then add the values */ switch (field_desc->type()) { // {{{ int32 case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddInt32(message, field_desc, GET_int32(values, i)); } break; } default: Rcpp::stop("Cannot convert to int32"); } break; } // }}} // {{{ int64 case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: for (int i = 0; i < value_size; i++) { ref->AddInt64(message, field_desc, GET_int64(values, i)); } break; default: Rcpp::stop("Cannot convert to int64"); } break; } // }}} // {{{ uint32 case TYPE_UINT32: case TYPE_FIXED32: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddUInt32(message, field_desc, GET_uint32(values, i)); } break; } default: Rcpp::stop("Cannot convert to uint32"); } break; } // }}} // {{{ uint64 case TYPE_UINT64: case TYPE_FIXED64: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddUInt64(message, field_desc, GET_uint64(values, i)); } break; } default: Rcpp::stop("Cannot convert to int64"); } break; } // }}} // {{{ double case TYPE_DOUBLE: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddDouble(message, field_desc, GET_double(values, i)); } break; } default: Rcpp::stop("Cannot convert to double"); } break; } // }}} // {{{ float case TYPE_FLOAT: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddFloat(message, field_desc, GET_float(values, i)); } break; } default: Rcpp::stop("Cannot convert to float"); } break; } // }}} // {{{ bool case TYPE_BOOL: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddBool(message, field_desc, GET_bool(values, i)); } break; } default: Rcpp::stop("Cannot convert to bool"); } break; } // }}} // {{{ string case TYPE_STRING: { if (TYPEOF(values) == STRSXP) { for (int i = 0; i < value_size; i++) { ref->AddString(message, field_desc, COPYSTRING(CHAR(STRING_ELT(values, i)))); } } else { Rcpp::stop("Cannot convert to string"); } break; } // }}} // {{{ bytes case TYPE_BYTES: { if (TYPEOF(values) == RAWSXP) { ref->AddString(message, field_desc, GET_bytes(values, 0)); } else if (TYPEOF(values) == VECSXP) { for (int i = 0; i < value_size; i++) { ref->AddString(message, field_desc, GET_bytes(values, i)); } } else { Rcpp::stop("Cannot convert to bytes"); } break; } // }}} // {{{ message case TYPE_MESSAGE: case TYPE_GROUP: { if (TYPEOF(values) == VECSXP) { for (int i = 0; i < value_size; i++) { GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(values, i)); /* we already know it is of the correct type because of premptive check above */ ref->AddMessage(message, field_desc)->CopyFrom(*mess); } } else { Rcpp::stop("type mismatch, expecting a list of 'Message' objects"); } break; } // }}} // {{{ enum case TYPE_ENUM: { const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); switch (TYPEOF(values)) { // {{{ numbers case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { int val = GET_int(values, i); ref->AddEnum(message, field_desc, enum_desc->FindValueByNumber(val)); } break; } // }}} // {{{ STRSXP case STRSXP: { for (int i = 0; i < value_size; i++) { std::string val = CHAR(STRING_ELT(values, i)); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); ref->AddEnum(message, field_desc, evd); } break; } // }}} default: Rcpp::stop("cannot set enum value"); } break; } // }}} default: { // nothing } } } else { Rcpp::stop("add can only be used on repeated fields"); } } /** * Fetch a subset of the values of a field. * * @param (GPB::Message*) external pointer * @param field name or tag number of the field * @param index */ RPB_FUNCTION_3(SEXP, METHOD(get_field_values), Rcpp::XPtr message, SEXP field, Rcpp::IntegerVector index) { GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); if (!field_desc->is_repeated()) { Rcpp_error("fetch can only be used on repeated fields"); } int n = index.size(); switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: case TYPE_UINT32: case TYPE_FIXED32: case TYPE_UINT64: case TYPE_FIXED64: case TYPE_ENUM: { Rcpp::IntegerVector res(n); for (int i = 0; i < n; i++) { res[i] = MESSAGE_GET_REPEATED_INT(message, field_desc, index[i]); } return res; } case TYPE_DOUBLE: case TYPE_FLOAT: { Rcpp::NumericVector res(n); for (int i = 0; i < n; i++) { res[i] = MESSAGE_GET_REPEATED_DOUBLE(message, field_desc, index[i]); } return res; } case TYPE_BOOL: { Rcpp::LogicalVector res(n); for (int i = 0; i < n; i++) { res[i] = MESSAGE_GET_REPEATED_DOUBLE(message, field_desc, index[i]); } return res; } case TYPE_STRING: { const GPB::Reflection* ref = message->GetReflection(); Rcpp::CharacterVector res(n); for (int i = 0; i < n; i++) { res[i] = ref->GetRepeatedString(*message, field_desc, index[i]); } return res; } case TYPE_BYTES: { const GPB::Reflection* ref = message->GetReflection(); Rcpp::List res(n); for (int i = 0; i < n; i++) { std::string s = ref->GetRepeatedString(*message, field_desc, index[i]); res[i] = std::vector(s.begin(), s.end()); } return res; } case TYPE_MESSAGE: case TYPE_GROUP: { const GPB::Reflection* ref = message->GetReflection(); Rcpp::List res(n); for (int i = 0; i < n; i++) { res[i] = S4_Message(CLONE(&ref->GetRepeatedMessage(*message, field_desc, index[i]))); } return res; } default: throw std::range_error("unknown type"); } return R_NilValue; // Unreachable. For -Wall } /** * set the values of a repeated field * * @param xp (GPB::Message*) external pointer * @param field field tag number or name * @param index positions (0-based) * @param values new values */ RPB_FUNCTION_VOID_4(METHOD(set_field_values), Rcpp::XPtr message, SEXP field, Rcpp::IntegerVector index, SEXP values) { const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); if (!field_desc->is_repeated()) { throw std::range_error("set can only be used on repeated fields"); } const GPB::Reflection* ref = message->GetReflection(); /* we know here that LENGTH(index) == LENGTH(values) */ int n = index.size(); switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { for (int i = 0; i < n; i++) { ref->SetRepeatedInt32(message, field_desc, index[i], GET_int32(values, i)); } break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { for (int i = 0; i < n; i++) { ref->SetRepeatedInt64(message, field_desc, index[i], GET_int64(values, i)); } break; } case TYPE_UINT32: case TYPE_FIXED32: { for (int i = 0; i < n; i++) { ref->SetRepeatedUInt32(message, field_desc, GET_int(index, i), GET_uint32(values, i)); } break; } case TYPE_UINT64: case TYPE_FIXED64: { for (int i = 0; i < n; i++) { ref->SetRepeatedUInt64(message, field_desc, index[i], GET_uint64(values, i)); } break; } case TYPE_DOUBLE: { for (int i = 0; i < n; i++) { ref->SetRepeatedDouble(message, field_desc, index[i], GET_double(values, i)); } break; } case TYPE_FLOAT: { for (int i = 0; i < n; i++) { ref->SetRepeatedFloat(message, field_desc, index[i], GET_float(values, i)); } break; } case TYPE_BOOL: { for (int i = 0; i < n; i++) { ref->SetRepeatedBool(message, field_desc, index[i], GET_bool(values, i)); } break; } case TYPE_STRING: { for (int i = 0; i < n; i++) { ref->SetRepeatedString(message, field_desc, index[i], GET_stdstring(values, i)); } break; } case TYPE_BYTES: { for (int i = 0; i < n; i++) { ref->SetRepeatedString(message, field_desc, index[i], GET_bytes(values, i)); } break; } case TYPE_ENUM: { CHECK_values_for_enum(field_desc, values); const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < n; i++) { int val = GET_int(values, i); ref->SetRepeatedEnum(message, field_desc, i, enum_desc->FindValueByNumber(val)); } break; } case STRSXP: { Rcpp::CharacterVector vals(values); std::string val; for (int i = 0; i < n; i++) { val = vals[i]; const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); ref->SetRepeatedEnum(message, field_desc, i, evd); } break; } default: throw std::range_error("impossible to convert to a enum"); } break; } case TYPE_MESSAGE: case TYPE_GROUP: { CHECK_messages(field_desc, values); Rcpp::List vals(values); for (int i = 0; i < n; i++) { GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(vals[i]); ref->MutableRepeatedMessage(message, field_desc, i)->CopyFrom(*mess); } break; } default: throw std::range_error("unknown type"); } } #undef METHOD } RProtoBuf/src/wrapper_ServiceDescriptor.cpp0000644000175000017500000000637313776225671021011 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(ServiceDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(length), GPB::ServiceDescriptor, method_count) RPB_XP_METHOD_0(METHOD(method_count), GPB::ServiceDescriptor, method_count) RPB_XP_METHOD_0(METHOD(as_character), GPB::ServiceDescriptor, DebugString) RPB_XP_METHOD_CAST_1(METHOD(getMethodByIndex), GPB::ServiceDescriptor, method, S4_MethodDescriptor) RPB_XP_METHOD_CAST_1_STRING(METHOD(getMethodByName), GPB::ServiceDescriptor, FindMethodByName, S4_MethodDescriptor) RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(getMethodNames), Rcpp::XPtr desc) { int nmeths = desc->method_count(); Rcpp::CharacterVector res(nmeths); for (int i = 0; i < nmeths; i++) { res[i] = desc->method(i)->name(); } return res; } /** * @param xp (GPB::ServiceDescriptor*) external pointer * @return the descriptor as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr desc) { int n = desc->method_count(); Rcpp::CharacterVector names(n); Rcpp::List res(n); for (int i = 0; i < n; i++) { const GPB::MethodDescriptor* met = desc->method(i); res[i] = S4_MethodDescriptor(met); names[i] = met->name(); } res.names() = names; return res; } RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::ServiceDescriptorProto* message = new GPB::ServiceDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->file()); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return full ? d->full_name() : d->name(); } /** * extract a method descriptor from a service descriptor using its * name or position * * @param pointer (GPB::ServiceDescriptor*) external pointer * @param name name or position of the method */ SEXP get_service_method(SEXP pointer, SEXP name) { /* grab the Message pointer */ Rcpp::XPtr desc(pointer); GPB::MethodDescriptor* method_desc = static_cast(0); switch (TYPEOF(name)) { case STRSXP: { /* what we are looking for */ const char* what = CHAR(STRING_ELT(name, 0)); /* the method descriptor */ method_desc = (GPB::MethodDescriptor*)desc->FindMethodByName(what); break; } case REALSXP: { /* the method descriptor */ method_desc = (GPB::MethodDescriptor*)desc->method((int)REAL(name)[0]); break; } case INTSXP: { /* the method descriptor */ method_desc = (GPB::MethodDescriptor*)desc->method(INTEGER(name)[0]); break; } } if (!method_desc) { Rcpp::stop("could not get MethodDescriptor"); } return S4_MethodDescriptor(method_desc); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/rprotobuf.h0000644000175000017500000002244313776225671015275 0ustar nileshnilesh// rprotobuf.h: R/C++ interface class library // // Copyright (C) 2009-2012 Dirk Eddelbuettel and Romain Francois // Copyright (C) 2012-2013 Dirk Eddelbuettel, Romain Francois and Murray Stokely // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #ifndef RPROTOBUF_H #define RPROTOBUF_H // TODO(mstokely): should we check if this header is available? #include #include // for strerror #include // g++-4.7 wants this #include // for string // O_BINARY does not exist on Unix/Linux, since there is no distinction // between text mode and binary mode files there, but if we ever got // this code running on Windows this would be needed. #ifndef O_BINARY #define O_BINARY 0 #endif #include #include #include #include #include #include #include #include #include #if GOOGLE_PROTOBUF_VERSION >= 3000000 #include #define PROTOBUF_JSON_UTIL #endif namespace GPB = google::protobuf; #define R_NO_REMAP /* we need to read and write to connections */ #define NEED_CONNECTION_PSTREAMS #include RCPP_ENUM_TRAITS(GPB::FieldDescriptor::Label) RCPP_ENUM_TRAITS(GPB::FieldDescriptor::CppType) RCPP_ENUM_TRAITS(GPB::FieldDescriptor::Type) // RCPP_TRAITS(GPB::int64,REALSXP) // RCPP_TRAITS(GPB::uint64,REALSXP) #include #include #include /* uncomment for debugging */ // #define RPB_DEBUG #ifdef RPB_DEBUG #define RPB_DEBUG_BEGIN(__WHAT__) Rprintf("<" #__WHAT__ ">\n"); #define RPB_DEBUG_END(__WHAT__) Rprintf("\n"); #else #define RPB_DEBUG_BEGIN(__WHAT__) #define RPB_DEBUG_END(__WHAT__) #endif // #define FIN_DBG(ptr, CLAZZ) // #define FIN_DBG(ptr, CLAZZ) Rprintf( "RProtoBuf finalizing %s (%p)\n", CLAZZ, // ptr ) #ifdef RPB_DEBUG #define PRINT_DEBUG_INFO(name, o) \ Rprintf(" %s [%d] = ", name, TYPEOF(o)); \ Rf_PrintValue(o); #else #define PRINT_DEBUG_INFO(name, o) #endif #define RPROTOBUF_LOOKUP 24 // #define LOOKUP_DEBUG /* FIXME : quick hack because just using TRUE and FALSE did not work in * lookup.cpp */ #define _TRUE_ (Rboolean) TRUE #define _FALSE_ (Rboolean) FALSE #define GET_MESSAGE_POINTER_FROM_XP(xp) (GPB::Message*) EXTPTR_PTR(xp) #define GET_MESSAGE_POINTER_FROM_S4(m) \ (GPB::Message*) EXTPTR_PTR(GET_SLOT(m, Rf_install("pointer"))) #define GET_DESCRIPTOR_POINTER_FROM_XP(xp) (GPB::Descriptor*) EXTPTR_PTR(xp) #define GET_DESCRIPTOR_POINTER_FROM_S4(m) \ (GPB::Descriptor*) EXTPTR_PTR(GET_SLOT(m, Rf_install("pointer"))) #define GET_FIELD_DESCRIPTOR_POINTER_FROM_XP(xp) (GPB::FieldDescriptor*) EXTPTR_PTR(xp) #define GET_FIELD_DESCRIPTOR_POINTER_FROM_S4(m) \ (GPB::FieldDescriptor*) EXTPTR_PTR(GET_SLOT(m, Rf_install("pointer"))) #define GET_ENUM_VALUE_DESCRIPTOR_POINTER_FROM_XP(xp) (GPB::EnumValueDescriptor*) EXTPTR_PTR(xp) #define GET_ENUM_VALUE_DESCRIPTOR_POINTER_FROM_S4(m) \ (GPB::EnumValueDescriptor*) EXTPTR_PTR(GET_SLOT(m, Rf_install("pointer"))) #define COPYSTRING(s) s #define THROW_SOCKET_ERROR(message) Rf_error("%s : %s", message, strerror(sockerrno)) #define XPP EXTPTR_PTR #define NEW_S4_OBJECT(CLAZZ) \ SEXP oo = PROTECT(NEW_OBJECT(MAKE_CLASS(CLAZZ))); \ if (!Rf_inherits(oo, CLAZZ)) Rcpp::stop(CLAZZ); namespace rprotobuf { typedef GPB::int32 int32; typedef GPB::uint32 uint32; typedef GPB::int64 int64; typedef GPB::uint64 uint64; /* in rprotobuf.cpp */ GPB::Message* PROTOTYPE(const GPB::Descriptor*); GPB::Message* CLONE(const GPB::Message*); RcppExport SEXP do_dollar_Descriptor(SEXP, SEXP); RcppExport SEXP newProtoMessage(SEXP); RcppExport SEXP getProtobufDescriptor(SEXP); RcppExport SEXP getExtensionDescriptor(SEXP); RcppExport SEXP readProtoFiles_cpp(SEXP, SEXP); RcppExport Rboolean isMessage(SEXP, const char*); RcppExport GPB::FieldDescriptor* getFieldDescriptor(const GPB::Message*, SEXP); /* in extractors.cpp */ RcppExport SEXP getMessageField(SEXP, SEXP); RcppExport SEXP extractFieldAsSEXP(const Rcpp::XPtr&, const GPB::FieldDescriptor*); /* in lookup.cpp */ RcppExport SEXP newProtocolBufferLookup(SEXP); /* in mutators.cpp */ RcppExport SEXP setMessageField(SEXP, SEXP, SEXP); int GET_int(SEXP, int); double GET_double(SEXP, int); float GET_float(SEXP, int); int32 GET_int32(SEXP, R_xlen_t); int64 GET_int64(SEXP, R_xlen_t); uint32 GET_uint32(SEXP, R_xlen_t); uint64 GET_uint64(SEXP, R_xlen_t); bool GET_bool(SEXP, R_xlen_t); std::string GET_stdstring(SEXP, R_xlen_t); std::string GET_bytes(SEXP, R_xlen_t); void CHECK_values_for_enum(const GPB::FieldDescriptor*, SEXP); void CHECK_messages(const GPB::FieldDescriptor*, SEXP); /* in wrapper_ServiceDescriptor.cpp */ RcppExport SEXP ServiceDescriptor_length(SEXP); RcppExport SEXP ServiceDescriptor_method_count(SEXP); RcppExport SEXP ServiceDescriptor_getMethodByIndex(SEXP, SEXP); RcppExport SEXP ServiceDescriptor_getMethodByName(SEXP, SEXP); /* in streams.cpp */ void ZeroCopyInputStreamWrapper_finalizer(SEXP); void ZeroCopyOutputStreamWrapper_finalizer(SEXP); RcppExport SEXP ZeroCopyInputStream_Next(SEXP); RcppExport SEXP ZeroCopyInputStream_BackUp(SEXP, SEXP); RcppExport SEXP ZeroCopyInputStream_ByteCount(SEXP); RcppExport SEXP ZeroCopyInputStream_Skip(SEXP, SEXP); RcppExport SEXP ZeroCopyInputStream_ReadRaw(SEXP, SEXP); RcppExport SEXP ZeroCopyInputStream_ReadString(SEXP, SEXP); RcppExport SEXP ZeroCopyInputStream_ReadVarint32(SEXP); RcppExport SEXP ZeroCopyInputStream_ReadVarint64(SEXP); RcppExport SEXP ZeroCopyInputStream_ReadLittleEndian32(SEXP); RcppExport SEXP ZeroCopyInputStream_ReadLittleEndian64(SEXP); RcppExport SEXP ZeroCopyOutputStream_Next(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_BackUp(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_ByteCount(SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteRaw(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteString(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteLittleEndian32(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteLittleEndian64(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteVarint32(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteVarint64(SEXP, SEXP); RcppExport SEXP FileOutputStream_new(SEXP, SEXP, SEXP); RcppExport SEXP FileOutputStream_Close(SEXP); RcppExport SEXP FileOutputStream_Flush(SEXP); RcppExport SEXP FileOutputStream_GetErrno(SEXP); RcppExport SEXP FileOutputStream_SetCloseOnDelete(SEXP, SEXP); RcppExport SEXP FileInputStream_new(SEXP, SEXP, SEXP); RcppExport SEXP FileInputStream_Close(SEXP); RcppExport SEXP FileInputStream_GetErrno(SEXP); RcppExport SEXP FileInputStream_SetCloseOnDelete(SEXP, SEXP); RcppExport SEXP ConnectionInputStream_new(SEXP, SEXP); RcppExport SEXP ConnectionOutputStream_new(SEXP, SEXP); /** * simple class that wraps together a ZeroCopyOutputStream * and its associated CodedOutputStream. Since we don't expose * CodedOutputStream at the R level, this allows to keep only one such * object with each ZeroCopyOutputStream */ class ZeroCopyOutputStreamWrapper { public: ZeroCopyOutputStreamWrapper(GPB::io::ZeroCopyOutputStream* stream); ~ZeroCopyOutputStreamWrapper(); GPB::io::ZeroCopyOutputStream* get_stream(); GPB::io::CodedOutputStream* get_coded_stream(); private: GPB::io::ZeroCopyOutputStream* stream; GPB::io::CodedOutputStream* coded_stream; }; /** * simple class that wraps together a ZeroCopyInputStream * and its associated CodedInputStream. Since we don't expose * CodedInputStream at the R level, this allows to keep only one such * object with each zero copy input stream */ class ZeroCopyInputStreamWrapper { public: ZeroCopyInputStreamWrapper(GPB::io::ZeroCopyInputStream* stream); ~ZeroCopyInputStreamWrapper(); GPB::io::ZeroCopyInputStream* get_stream(); GPB::io::CodedInputStream* get_coded_stream(); private: GPB::io::ZeroCopyInputStream* stream; GPB::io::CodedInputStream* coded_stream; }; } // namespace rprotobuf #include "S4_classes.h" #include "RconnectionCopyingInputStream.h" #define GET_ZCIS(xp) ((ZeroCopyInputStreamWrapper*)XPP(xp))->get_stream() #define GET_CIS(xp) ((ZeroCopyInputStreamWrapper*)XPP(xp))->get_coded_stream() #define GET_FIS(xp) (GPB::io::FileInputStream*)((ZeroCopyInputStreamWrapper*)XPP(xp))->get_stream() #define GET_ZCOS(xp) ((ZeroCopyOutputStreamWrapper*)XPP(xp))->get_stream() #define GET_COS(xp) ((ZeroCopyOutputStreamWrapper*)XPP(xp))->get_coded_stream() #define GET_FOS(xp) \ (GPB::io::FileOutputStream*)((ZeroCopyOutputStreamWrapper*)XPP(xp))->get_stream() #endif RProtoBuf/src/ZeroCopyInputStreamWrapper.cpp0000644000175000017500000000136112440004312021057 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" namespace rprotobuf { ZeroCopyInputStreamWrapper::ZeroCopyInputStreamWrapper(GPB::io::ZeroCopyInputStream* stream) : stream(stream) { coded_stream = new GPB::io::CodedInputStream(stream); } ZeroCopyInputStreamWrapper::~ZeroCopyInputStreamWrapper() { try { /* first clear the coded stream */ delete coded_stream; /* then the stream itself */ delete stream; } catch (...) { } } GPB::io::ZeroCopyInputStream* ZeroCopyInputStreamWrapper::get_stream() { return stream; } GPB::io::CodedInputStream* ZeroCopyInputStreamWrapper::get_coded_stream() { return coded_stream; } } // namespace rprotobuf RProtoBuf/src/ConnectionCopyingInputStream.cpp0000644000175000017500000000134712440004312021400 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionCopyingInputStream.h" namespace rprotobuf { ConnectionCopyingInputStream::ConnectionCopyingInputStream(SEXP con) : con(con), readBin("readBin") {} /** * call readBin to read size bytes from R * * @param buffer buffer to fill with at most size bytes * @param size maximum number of bytes * * @return the number of bytes actually read */ int ConnectionCopyingInputStream::Read(void* buffer, int size) { /* TODO: error handling */ Rcpp::RawVector res = readBin(con, Rcpp::RawVector(0), size); memcpy(buffer, res.begin(), res.size()); return res.size(); } } RProtoBuf/src/rprotobuf.cpp0000644000175000017500000002062213300665751015613 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "DescriptorPoolLookup.h" #include "RcppMacros.h" namespace rprotobuf { GPB::Message* PROTOTYPE(const GPB::Descriptor* desc) { RPB_DEBUG_BEGIN("PROTOTYPE") #ifdef RPB_DEBUG Rprintf("desc = %d\n", desc); #endif /* first try the runtime factory */ GPB::Message* m = (GPB::Message*)((GPB::DynamicMessageFactory*)DescriptorPoolLookup::factory()) ->GetPrototype(desc) ->New(); #ifdef RPB_DEBUG Rprintf("generated factory = %d\n", m); #endif if (!m) { /* then the dynamic runtime factory */ m = (GPB::Message*)GPB::MessageFactory::generated_factory()->GetPrototype(desc)->New(); #ifdef RPB_DEBUG Rprintf("runtime factory = %d\n", m); #endif } RPB_DEBUG_END("PROTOTYPE") return m; } GPB::Message* CLONE(const GPB::Message* origin) { RPB_DEBUG_BEGIN("CLONE") const GPB::Descriptor* desc = origin->GetDescriptor(); GPB::Message* sheep = PROTOTYPE(desc); sheep->CopyFrom(*origin); RPB_DEBUG_END("CLONE") return sheep; } /** * read a proto file and cache the message definitions it contains * * @param file proto file name */ RcppExport SEXP readProtoFiles_cpp(SEXP file, SEXP dirs) { BEGIN_RCPP DescriptorPoolLookup::importProtoFiles(file, dirs); return R_NilValue; END_RCPP } /** * reset the descriptor pool, clearing all persisted state */ RcppExport SEXP resetDescriptorPool_cpp() { BEGIN_RCPP DescriptorPoolLookup::reset(); return R_NilValue; END_RCPP } /** * get the descriptor associated with a message type * * @param type message type * * @return an S4 object of class Descriptor, or NULL if the type * is unknown */ RcppExport SEXP getProtobufDescriptor(SEXP type) { #ifdef RPB_DEBUG Rprintf("\n type = "); Rf_PrintValue(type); #endif const char* typeName = CHAR(STRING_ELT(type, 0)); /* first try the generated pool */ const GPB::DescriptorPool* pool = GPB::DescriptorPool::generated_pool(); const GPB::Descriptor* desc = pool->FindMessageTypeByName(typeName); if (!desc) { /* then try the "runtime" pool" */ pool = DescriptorPoolLookup::pool(); desc = pool->FindMessageTypeByName(typeName); if (!desc) { /* unlucky */ return R_NilValue; } } return (S4_Descriptor(desc)); } /** * get the descriptor associated with an extension * * @param type message type * * @return an S4 object of class FieldDescriptor, or NULL if the type * is unknown */ RcppExport SEXP getExtensionDescriptor(SEXP type) { #ifdef RPB_DEBUG Rprintf("\n type = "); Rf_PrintValue(type); #endif const char* typeName = CHAR(STRING_ELT(type, 0)); /* first try the generated pool */ const GPB::DescriptorPool* pool = GPB::DescriptorPool::generated_pool(); const GPB::FieldDescriptor* desc = pool->FindExtensionByName(typeName); if (!desc) { /* then try the "runtime" pool" */ pool = DescriptorPoolLookup::pool(); desc = pool->FindExtensionByName(typeName); if (!desc) { /* unlucky */ return R_NilValue; } } return (S4_FieldDescriptor(desc)); } /** * get the descriptor associated with an enum * * @param type message type * * @return an S4 object of class EnumDescriptor, or NULL if the type * is unknown */ RcppExport SEXP getEnumDescriptor(SEXP type) { #ifdef RPB_DEBUG Rprintf("\n type = "); Rf_PrintValue(type); #endif const char* typeName = CHAR(STRING_ELT(type, 0)); /* first try the generated pool */ const GPB::DescriptorPool* pool = GPB::DescriptorPool::generated_pool(); const GPB::EnumDescriptor* desc = pool->FindEnumTypeByName(typeName); if (!desc) { /* then try the "runtime" pool" */ pool = DescriptorPoolLookup::pool(); desc = pool->FindEnumTypeByName(typeName); if (!desc) { /* unlucky */ return R_NilValue; } } return (S4_EnumDescriptor(desc)); } /** * make a new protobuf message * * @param descriptor a "Descriptor" R object */ SEXP newProtoMessage(SEXP descriptor) { BEGIN_RCPP RPB_DEBUG_BEGIN("newProtoMessage") #ifdef RPB_DEBUG /* FIXME: the message type, we don't really need that*/ SEXP type = GET_SLOT(descriptor, Rf_install("type")); #endif /* the pointer to the c++ descriptor object */ GPB::Descriptor* desc = GET_DESCRIPTOR_POINTER_FROM_S4(descriptor); #ifdef RPB_DEBUG Rprintf("desc = %d\n", desc); PRINT_DEBUG_INFO("type", type); #endif /* grab the Message from the factory */ const GPB::Message* message = PROTOTYPE(desc); if (!message) { Rcpp_error("could not call factory->GetPrototype(desc)->New()"); } RPB_DEBUG_END("newProtoMessage") return (S4_Message(message)); END_RCPP } /** * dollar extractor for Descriptor objects * it may return a Field descriptor or a nested type descriptor * * @param pointer external pointer to a google::protobuf::Descriptor object * @param name name of the thing to extract */ RcppExport SEXP do_dollar_Descriptor(SEXP pointer, SEXP name) { const char* what = CHAR(STRING_ELT(name, 0)); GPB::Descriptor* desc = (GPB::Descriptor*)EXTPTR_PTR(pointer); // trying fields first : if (desc->field_count()) { const GPB::FieldDescriptor* fd = desc->FindFieldByName(what); if (fd) { return (S4_FieldDescriptor(fd)); } } // now trying nested types if (desc->nested_type_count()) { const GPB::Descriptor* d = desc->FindNestedTypeByName(what); if (d) { return (S4_Descriptor(d)); } } // now for enum types if (desc->enum_type_count()) { const GPB::EnumDescriptor* ed = desc->FindEnumTypeByName(what); if (ed) { return (S4_EnumDescriptor(ed)); } } // TODO: extensions (later) // give up // TODO: should this be unbound instead return (R_NilValue); } /** * * @param m potentially a message * @param target the expected type * * @return TRUE if m is a a message of the given type */ Rboolean isMessage(SEXP m, const char* target) { RPB_DEBUG_BEGIN("isMessage") if (TYPEOF(m) != S4SXP || !Rf_inherits(m, "Message")) return _FALSE_; GPB::Message* message = (GPB::Message*)EXTPTR_PTR(GET_SLOT(m, Rf_install("pointer"))); const char* type = message->GetDescriptor()->full_name().c_str(); RPB_DEBUG_END("isMessage") if (strcmp(type, target)) { return _FALSE_; } return _TRUE_; } RcppExport GPB::FieldDescriptor* getFieldDescriptor(const GPB::Message* message, SEXP name) { GPB::FieldDescriptor* field_desc = (GPB::FieldDescriptor*)0; BEGIN_RCPP const GPB::Descriptor* desc = message->GetDescriptor(); std::string error_message = "could not get FieldDescriptor for field"; switch (TYPEOF(name)) { case S4SXP: { if (Rf_inherits(name, "FieldDescriptor")) { field_desc = GET_FIELD_DESCRIPTOR_POINTER_FROM_S4(name); } else { Rcpp::stop("S4 class is not a FieldDescriptor"); } break; } case CHARSXP: { field_desc = (GPB::FieldDescriptor*)desc->FindFieldByName(CHAR(name)); error_message = error_message + " '" + CHAR(name) + "'"; break; } case STRSXP: { field_desc = (GPB::FieldDescriptor*)desc->FindFieldByName(CHAR(STRING_ELT(name, 0))); error_message = error_message + " '" + CHAR(STRING_ELT(name, 0)) + "'"; break; } case REALSXP: case INTSXP: { field_desc = (GPB::FieldDescriptor*)desc->FindFieldByNumber(Rcpp::as(name)); break; } } if (!field_desc) { Rcpp::stop(error_message.c_str()); } return field_desc; VOID_END_RCPP return field_desc; } RPB_FUNCTION_VOID_1(check_libprotobuf_version, int minversion) { if (GOOGLE_PROTOBUF_VERSION < minversion) { throw std::range_error( "The protobuf library you are using is too old for this package, " "please upgrade"); } } RPB_FUNCTION_0(int, get_protobuf_library_version) { return GOOGLE_PROTOBUF_VERSION; } } // namespace rprotobuf RProtoBuf/src/streams.cpp0000644000175000017500000002157312440004312015235 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionInputStream.h" #include "ConnectionOutputStream.h" namespace rprotobuf { void ZeroCopyInputStreamWrapper_finalizer(SEXP xp) { delete (ZeroCopyInputStreamWrapper*)XPP(xp); } void ZeroCopyOutputStreamWrapper_finalizer(SEXP xp) { delete (ZeroCopyOutputStreamWrapper*)XPP(xp); } // {{{ input streams // {{{ FileInputStream SEXP FileInputStream_new(SEXP filename, SEXP block_size, SEXP close_on_delete) { BEGIN_RCPP NEW_S4_OBJECT("FileInputStream"); int fd = open(CHAR(STRING_ELT(filename, 0)), O_RDONLY | O_BINARY); GPB::io::FileInputStream* stream = new GPB::io::FileInputStream(fd, INTEGER(block_size)[0]); stream->SetCloseOnDelete(LOGICAL(close_on_delete)[0]); ZeroCopyInputStreamWrapper* wrapper = new ZeroCopyInputStreamWrapper(stream); SEXP ptr = PROTECT(R_MakeExternalPtr((void*)wrapper, R_NilValue, R_NilValue)); R_RegisterCFinalizerEx(ptr, ZeroCopyInputStreamWrapper_finalizer, _FALSE_); SET_SLOT(oo, Rf_install("pointer"), ptr); UNPROTECT(2); /* oo, ptr */ return oo; END_RCPP } SEXP FileInputStream_GetErrno(SEXP xp) { BEGIN_RCPP GPB::io::FileInputStream* stream = GET_FIS(xp); return Rf_ScalarInteger(stream->GetErrno()); END_RCPP } SEXP FileInputStream_SetCloseOnDelete(SEXP xp, SEXP close) { BEGIN_RCPP GPB::io::FileInputStream* stream = GET_FIS(xp); stream->SetCloseOnDelete(LOGICAL(close)); return R_NilValue; END_RCPP } SEXP FileInputStream_Close(SEXP xp) { BEGIN_RCPP GPB::io::FileInputStream* stream = GET_FIS(xp); bool res = stream->Close(); return Rf_ScalarLogical(res ? _TRUE_ : _FALSE_); END_RCPP } // }}} // {{{ ConnectionInputStream SEXP ConnectionInputStream_new(SEXP con, SEXP was_open) { BEGIN_RCPP NEW_S4_OBJECT("ConnectionInputStream"); ConnectionInputStream* stream = new ConnectionInputStream(con, (bool)LOGICAL(was_open)[0]); ZeroCopyInputStreamWrapper* wrapper = new ZeroCopyInputStreamWrapper(stream); SEXP ptr = PROTECT(R_MakeExternalPtr((void*)wrapper, R_NilValue, con)); R_RegisterCFinalizerEx(ptr, ZeroCopyInputStreamWrapper_finalizer, _FALSE_); SET_SLOT(oo, Rf_install("pointer"), ptr); UNPROTECT(2); /* oo, ptr */ return oo; END_RCPP } // }}} // }}} // {{{ output streams // {{{ ZeroCopyOutputStream SEXP ZeroCopyOutputStream_Next(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::ZeroCopyOutputStream* stream = GET_ZCOS(xp); void* out; int s = LENGTH(payload); bool res = stream->Next(&out, &s); if (!res) { Rcpp_error("cannot write to stream"); } memcpy(out, RAW(payload), s); return Rf_ScalarInteger(s); END_RCPP } SEXP ZeroCopyOutputStream_ByteCount(SEXP xp) { BEGIN_RCPP GPB::io::ZeroCopyOutputStream* stream = GET_ZCOS(xp); return (Rf_ScalarReal((double)stream->ByteCount())); END_RCPP } SEXP ZeroCopyOutputStream_BackUp(SEXP xp, SEXP count) { BEGIN_RCPP GPB::io::ZeroCopyOutputStream* stream = GET_ZCOS(xp); int s = GET_int(count, 0); stream->BackUp(s); return R_NilValue; END_RCPP } // }}} // {{{ ArrayOutputStream // }}} // {{{ FileOutputStream SEXP FileOutputStream_new(SEXP filename, SEXP block_size, SEXP close_on_delete) { BEGIN_RCPP NEW_S4_OBJECT("FileOutputStream"); int fd = open(CHAR(STRING_ELT(filename, 0)), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); GPB::io::FileOutputStream* stream = new GPB::io::FileOutputStream(fd, INTEGER(block_size)[0]); stream->SetCloseOnDelete(LOGICAL(close_on_delete)[0]); ZeroCopyOutputStreamWrapper* wrapper = new ZeroCopyOutputStreamWrapper(stream); SEXP ptr = PROTECT(R_MakeExternalPtr((void*)wrapper, R_NilValue, R_NilValue)); R_RegisterCFinalizerEx(ptr, ZeroCopyOutputStreamWrapper_finalizer, _FALSE_); SET_SLOT(oo, Rf_install("pointer"), ptr); UNPROTECT(2); /* oo, ptr */ return oo; END_RCPP } SEXP FileOutputStream_Flush(SEXP xp) { BEGIN_RCPP GPB::io::FileOutputStream* stream = GET_FOS(xp); bool res = stream->Flush(); return Rf_ScalarLogical(res ? _TRUE_ : _FALSE_); END_RCPP } SEXP FileOutputStream_Close(SEXP xp) { BEGIN_RCPP GPB::io::FileOutputStream* stream = GET_FOS(xp); bool res = stream->Close(); return Rf_ScalarLogical(res ? _TRUE_ : _FALSE_); END_RCPP } SEXP FileOutputStream_GetErrno(SEXP xp) { BEGIN_RCPP GPB::io::FileOutputStream* stream = GET_FOS(xp); return Rf_ScalarInteger(stream->GetErrno()); END_RCPP } SEXP FileOutputStream_SetCloseOnDelete(SEXP xp, SEXP close) { BEGIN_RCPP GPB::io::FileOutputStream* stream = GET_FOS(xp); stream->SetCloseOnDelete(LOGICAL(close)); return R_NilValue; END_RCPP } // }}} // {{{ ConnectionOutputStream SEXP ConnectionOutputStream_new(SEXP con, SEXP was_open) { BEGIN_RCPP NEW_S4_OBJECT("ConnectionOutputStream"); ConnectionOutputStream* stream = new ConnectionOutputStream(con, (bool)LOGICAL(was_open)[0]); ZeroCopyOutputStreamWrapper* wrapper = new ZeroCopyOutputStreamWrapper(stream); /* we keep the R connection protected as long as the external pointer is kept out of GC */ SEXP ptr = PROTECT(R_MakeExternalPtr((void*)wrapper, R_NilValue, con)); R_RegisterCFinalizerEx(ptr, ZeroCopyOutputStreamWrapper_finalizer, _FALSE_); SET_SLOT(oo, Rf_install("pointer"), ptr); UNPROTECT(2); /* oo, ptr */ return oo; END_RCPP } // }}} // }}} // {{{ Read*** functions using CodedInputStream SEXP ZeroCopyInputStream_ReadRaw(SEXP xp, SEXP size) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); int s = INTEGER(size)[0]; SEXP payload = PROTECT(Rf_allocVector(RAWSXP, s)); if (!coded_stream->ReadRaw(RAW(payload), s)) Rcpp_error("error reading raw bytes"); UNPROTECT(1); /* payload */ return payload; END_RCPP } SEXP ZeroCopyInputStream_ReadString(SEXP xp, SEXP size) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); int s = INTEGER(size)[0]; std::string buffer(""); if (!coded_stream->ReadString(&buffer, s)) Rcpp_error("error reading string"); return Rf_mkString(buffer.c_str()); END_RCPP } SEXP ZeroCopyInputStream_ReadVarint32(SEXP xp) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); uint32 res = 0; if (!coded_stream->ReadVarint32(&res)) Rcpp_error("error reading varint32"); return Rf_ScalarInteger(res); END_RCPP } SEXP ZeroCopyInputStream_ReadLittleEndian32(SEXP xp) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); uint32 res = 0; if (!coded_stream->ReadVarint32(&res)) Rcpp_error("error reading little endian int32"); return Rf_ScalarInteger(res); END_RCPP } SEXP ZeroCopyInputStream_ReadLittleEndian64(SEXP xp) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); uint64 res = 0; if (!coded_stream->ReadVarint64(&res)) Rcpp_error("error reading little endian int32"); return Rf_ScalarReal((double)res); END_RCPP } SEXP ZeroCopyInputStream_ReadVarint64(SEXP xp) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); uint64 res = 0; if (!coded_stream->ReadVarint64(&res)) Rcpp_error("error reading varint64"); return Rf_ScalarReal((double)res); END_RCPP } // }}} // {{{ Write*** functions using CodedOuputStream SEXP ZeroCopyOutputStream_WriteRaw(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteRaw(RAW(payload), LENGTH(payload)); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteString(SEXP xp, SEXP payload) { BEGIN_RCPP if (LENGTH(payload) > 1) { Rf_warning("only the first element is used"); } if (LENGTH(payload) == 0) { Rcpp_error("need at least one element"); } GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteString(CHAR(STRING_ELT(payload, 0))); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteLittleEndian32(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteLittleEndian32(GET_int32(payload, 0)); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteLittleEndian64(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteLittleEndian64(GET_int64(payload, 0)); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteVarint32(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteVarint32(GET_int32(payload, 0)); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteVarint64(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteVarint64(GET_int64(payload, 0)); return R_NilValue; END_RCPP } // }}} } // namespace rprotobuf RProtoBuf/src/extensions.cpp0000644000175000017500000000356713057365267016011 0ustar nileshnilesh/* -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- * Copyright 2012 Google Inc. All Rights Reserved. * Author: Murray Stokely * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ #include "rprotobuf.h" #include "Rcppsupport.h" namespace rprotobuf { RcppExport SEXP getExtension_cpp(SEXP pointer, SEXP sfielddesc) { /* grab the Message pointer */ Rcpp::XPtr message(pointer); const GPB::Reflection* ref = message->GetReflection(); const GPB::FieldDescriptor* field_desc = GET_FIELD_DESCRIPTOR_POINTER_FROM_S4(sfielddesc); // extractFieldAsSEXP returns a default (e.g. 0) even when // field doesn't exist, but returning NULL probably makes more // sense. // // TODO(mstokely): move this logic into extractField so that // all fields get this updated behavior, not just extensions. if (field_desc->is_repeated()) { if (ref->FieldSize(*message, field_desc) < 1) { return R_NilValue; } } else { if (!ref->HasField(*message, field_desc)) { return R_NilValue; } } return (extractFieldAsSEXP(message, field_desc)); } } // namespace rprotobuf RProtoBuf/src/RSourceTree.cpp0000644000175000017500000000325713300665751016000 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RSourceTree.h" namespace rprotobuf { RSourceTree::RSourceTree() : directories() {} GPB::io::ZeroCopyInputStream* RSourceTree::Open(const std::string& filename) { /* first, try to open the file as it is */ int file_descriptor = open(filename.c_str(), O_RDONLY); if (file_descriptor < 0) { /* then try the directories */ std::set::iterator it; it = directories.begin(); std::string file; while (it != directories.end()) { file = *it; file += "/"; file += filename; file_descriptor = open(file.c_str(), O_RDONLY); if (file_descriptor > 0) break; ++it; } } if (file_descriptor < 0) { return NULL; } GPB::io::FileInputStream* result = new GPB::io::FileInputStream(file_descriptor); result->SetCloseOnDelete(true); return result; } void RSourceTree::addDirectory(const std::string& directory) { directories.insert(directory); } void RSourceTree::addDirectories(SEXP dirs) { int n = LENGTH(dirs); for (int i = 0; i < n; i++) { directories.insert(std::string(CHAR(STRING_ELT(dirs, i)))); } } void RSourceTree::removeDirectory(const std::string& directory) { directories.erase(directory); } void RSourceTree::removeDirectories(SEXP dirs) { int n = LENGTH(dirs); for (int i = 0; i < n; i++) { directories.erase(std::string(CHAR(STRING_ELT(dirs, i)))); } } void RSourceTree::removeAllDirectories() { directories.clear(); } } // namespace rprotobuf RProtoBuf/src/lookup.cpp0000644000175000017500000001654713003435477015115 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "DescriptorPoolLookup.h" /* This uses the mechanism of the RObjectTables package see: http://www.omegahat.net/RObjectTables/ */ namespace rprotobuf { /** * Returns the R_UnboundValue */ SEXP R_getUnboundValue() { return (R_UnboundValue); } /** * @param name potential message type * @param canCache Can R cache this object * @param tb object table * * @return _TRUE_ if there is a message of the given type in the DescriptorPool */ Rboolean rProtoBufTable_exists(const char *const name, Rboolean *canCache, R_ObjectTable *tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_exists\n"); #endif if (tb->active == _FALSE_) return (_FALSE_); tb->active = _FALSE_; Rboolean val = _FALSE_; if (DescriptorPoolLookup::contains(name)) { /* first check the cache */ val = _TRUE_; } else { /* try the generated pool */ const GPB::DescriptorPool *pool = GPB::DescriptorPool::generated_pool(); if (pool->FindMessageTypeByName(name) || pool->FindEnumTypeByName(name) || pool->FindServiceByName(name) || pool->FindMethodByName(name) || pool->FindExtensionByName(name)) { DescriptorPoolLookup::add(name); val = _TRUE_; } else { /* try the runtime pool */ pool = DescriptorPoolLookup::pool(); if (pool->FindMessageTypeByName(name) || pool->FindEnumTypeByName(name) || pool->FindServiceByName(name) || pool->FindMethodByName(name) || pool->FindExtensionByName(name)) { DescriptorPoolLookup::add(name); val = _TRUE_; } } } tb->active = _TRUE_; return (val); } SEXP findSomething(const GPB::DescriptorPool *pool, const char *const name) { const GPB::Descriptor *desc = pool->FindMessageTypeByName(name); std::string name_string(name); if (desc) { /* message */ DescriptorPoolLookup::add(name_string); return S4_Descriptor(desc); } else { const GPB::EnumDescriptor *enum_desc = pool->FindEnumTypeByName(name_string); if (enum_desc) { /* enum */ DescriptorPoolLookup::add(name_string); return S4_EnumDescriptor(enum_desc); } else { const GPB::FieldDescriptor *extension_desc = pool->FindExtensionByName(name_string); if (extension_desc) { /* extension */ DescriptorPoolLookup::add(name_string); return S4_FieldDescriptor(extension_desc); } else { const GPB::ServiceDescriptor *service_desc = pool->FindServiceByName(name_string); if (service_desc) { DescriptorPoolLookup::add(name_string); return S4_ServiceDescriptor(service_desc); } else { const GPB::MethodDescriptor *method_desc = pool->FindMethodByName(name_string); if (method_desc) { DescriptorPoolLookup::add(name_string); return S4_MethodDescriptor(method_desc); } } } } } return R_NilValue; } /** * Returns a new "Descriptor" if there is such a message type * in the descriptor pool. NULL otherwise * * @param name message type name (without package path) * @param canCache * @param tb lookup table */ SEXP rProtoBufTable_get(const char *const name, Rboolean *canCache, R_ObjectTable *tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_get\n"); #endif if (tb->active == _FALSE_) return (R_UnboundValue); tb->active = _FALSE_; SEXP res_generated; SEXP res_runtime; int np = 0; /* first try the generated pool */ const GPB::DescriptorPool *pool = GPB::DescriptorPool::generated_pool(); res_generated = PROTECT(findSomething(pool, name)); np++; if (res_generated == R_NilValue) { /* try the runtime pool */ pool = DescriptorPoolLookup::pool(); res_runtime = PROTECT(findSomething(pool, name)); np++; } tb->active = _TRUE_; SEXP res = PROTECT((np == 2) ? res_runtime : res_generated); UNPROTECT(np + 1); if (res != R_NilValue) return res; return R_getUnboundValue(); // -Wall } /** * Does nothing. Not applicable */ int rProtoBufTable_remove(const char *const unused_name, R_ObjectTable *unused_tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_remove( %s) \n", unused_name); #endif Rf_error("cannot remove from protobuf descriptor pool"); return (0); // make -Wall happy } /** * Indicates if R can cache the variable name. * Currently allways return _FALSE_ * * @param name message type name * @param tb lookup table * @return allways _FALSE_ (for now) */ Rboolean rProtoBufTable_canCache(const char *const unused_name, R_ObjectTable *unused_tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_canCache\n"); #endif return (_FALSE_); } /** * Previously this function returned a stop() error, but this has side * effects such as preventing users from using '<<-' operator in any * scripts that include RProtoBuf. So instead, we now simply return * NULL to indicate assign is not possible on this lookup table * without giving such a hard error. */ SEXP rProtoBufTable_assign(const char *const unused_name, SEXP unused_value, R_ObjectTable *unused_tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_assign( %s ) \n", unused_name); #endif return (R_NilValue); // make -Wall happy } /** * Returns the list of classes known to be included in the * packages. * * @param tb lookup table */ SEXP rProtoBufTable_objects(R_ObjectTable *tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_objects\n"); #endif tb->active = _FALSE_; SEXP objects = PROTECT(DescriptorPoolLookup::getElements()); tb->active = _TRUE_; UNPROTECT(1); /* objects */ return (objects); } RcppExport SEXP newProtocolBufferLookup(SEXP possexp) { BEGIN_RCPP #ifdef LOOKUP_DEBUG Rprintf("\n"); #endif R_ObjectTable *tb; SEXP val, klass; tb = (R_ObjectTable *)malloc(sizeof(R_ObjectTable)); if (!tb) throw Rcpp::exception("cannot allocate space for an internal R object table"); tb->type = RPROTOBUF_LOOKUP; /* FIXME: not sure what this should be */ tb->cachedNames = NULL; tb->privateData = (void *)0; tb->exists = rProtoBufTable_exists; tb->get = rProtoBufTable_get; tb->remove = rProtoBufTable_remove; tb->assign = rProtoBufTable_assign; tb->objects = rProtoBufTable_objects; tb->canCache = rProtoBufTable_canCache; tb->onAttach = NULL; tb->onDetach = NULL; PROTECT(val = R_MakeExternalPtr(tb, Rf_install("UserDefinedDatabase"), R_NilValue)); PROTECT(klass = Rf_mkString("UserDefinedDatabase")); Rf_setAttrib(val, R_ClassSymbol, klass); UNPROTECT(2); /* val, klass */ #ifdef LOOKUP_DEBUG Rprintf("\n"); #endif Rcpp::Function fun("attach"); int pos = Rcpp::as(possexp); fun(val, Rcpp::Named("pos") = pos, Rcpp::Named("name") = "RProtoBuf:DescriptorPool"); // TODO(mstokely): Somewhere we should deallocate tb? If package is unattached? return (val); END_RCPP } } // namespace rprotobuf RProtoBuf/src/ZeroCopyOutputStreamWrapper.cpp0000644000175000017500000000137312440004312021263 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" namespace rprotobuf { ZeroCopyOutputStreamWrapper::ZeroCopyOutputStreamWrapper(GPB::io::ZeroCopyOutputStream* stream) : stream(stream) { coded_stream = new GPB::io::CodedOutputStream(stream); } ZeroCopyOutputStreamWrapper::~ZeroCopyOutputStreamWrapper() { try { /* first clear the coded stream */ delete coded_stream; /* then the stream itself */ delete stream; } catch (...) { } } GPB::io::ZeroCopyOutputStream* ZeroCopyOutputStreamWrapper::get_stream() { return stream; } GPB::io::CodedOutputStream* ZeroCopyOutputStreamWrapper::get_coded_stream() { return coded_stream; } } // namespace rprotobuf RProtoBuf/src/DescriptorPoolLookup.h0000644000175000017500000000161513300665751017401 0ustar nileshnilesh#ifndef RPROTOBUF_DescriptorPoolLookup_H #define RPROTOBUF_DescriptorPoolLookup_H #include /* For set */ #include /* For string */ #include "RSourceTree.h" #include "RWarningErrorCollector.h" namespace rprotobuf { class DescriptorPoolLookup { public: static void add(const std::string& element); static bool contains(const std::string& element); static SEXP getElements(); static void importProtoFiles(SEXP files, SEXP cwd); static void reset(); static const GPB::DescriptorPool* pool(); static const GPB::DynamicMessageFactory* factory(); private: static std::set elements; static RWarningErrorCollector error_collector; static RSourceTree source_tree; static GPB::compiler::Importer* importer; static GPB::DynamicMessageFactory message_factory; }; } // namespace rprotobuf #endif RProtoBuf/src/RWarningErrorCollector.cpp0000644000175000017500000000073012440004312020157 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RWarningErrorCollector.h" namespace rprotobuf { void RWarningErrorCollector::AddError(const std::string& filename, int line, int column, const std::string& message) { Rprintf("%s:%d:%d:%s\n", filename.c_str(), line + 1, column + 1, message.c_str()); } } // namespace rprotobuf RProtoBuf/src/RSourceTree.h0000644000175000017500000000104413300665751015435 0ustar nileshnilesh#ifndef RPROTOBUF_RSourceTree_H #define RPROTOBUF_RSourceTree_H namespace rprotobuf { class RSourceTree : public GPB::compiler::SourceTree { public: RSourceTree(); GPB::io::ZeroCopyInputStream* Open(const std::string& filename); void addDirectory(const std::string& directory); void addDirectories(SEXP dirs); void removeDirectory(const std::string& directory); void removeDirectories(SEXP dirs); void removeAllDirectories(); private: std::set directories; }; } // namespace rprotobuf #endif RProtoBuf/src/RWarningErrorCollector.h0000644000175000017500000000060412440004312017624 0ustar nileshnilesh#include /* For string */ #include "rprotobuf.h" namespace rprotobuf { class RWarningErrorCollector : public GPB::compiler::MultiFileErrorCollector { public: // implements ErrorCollector --------------------------------------- void AddError(const std::string& filename, int line, int column, const std::string& message); }; } // namespace rprotobuf RProtoBuf/src/S4_classes.h0000644000175000017500000001704113144557350015243 0ustar nileshnilesh// S4_classes.h: R/C++ interface class library // // Copyright (C) 2010 - 2017 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #ifndef RPROTOBUF_S4CLASSES_H #define RPROTOBUF_S4CLASSES_H //1. Place using Rcpp::S4; somewhere in the top of S4_classes.h in the //src directory (so S4 is looked up in the right place), //2. Replace setSEXP with set__, and asSexp with get__. namespace rprotobuf { // deal with Rcpp API changes #if defined(RCPP_VERSION) && RCPP_VERSION <= Rcpp_Version(0,10,6) #define SetSexp setSEXP #define AsSexp asSexp #else #define SetSexp set__ #define AsSexp get__ #endif using Rcpp::S4; class ZeroCopyInputStreamWrapper; class ZeroCopyOutputStreamWrapper; class S4_EnumValueDescriptor : public Rcpp::S4 { public: S4_EnumValueDescriptor(const GPB::EnumValueDescriptor* d) : S4("EnumValueDescriptor") { slot("pointer") = Rcpp::XPtr( const_cast(d), false); if (d) { slot("name") = d->name(); slot("full_name") = d->full_name(); } else { slot("name") = Rcpp::StringVector(0); slot("full_name") = Rcpp::StringVector(0); } } S4_EnumValueDescriptor(const S4_EnumValueDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_EnumValueDescriptor& operator=(const S4_EnumValueDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_Descriptor : public Rcpp::S4 { public: S4_Descriptor(const GPB::Descriptor* d) : S4("Descriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); if (!d) { slot("type") = Rcpp::StringVector(0); } else { slot("type") = d->full_name(); } } S4_Descriptor(const S4_Descriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_Descriptor& operator=(const S4_Descriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_FileDescriptor : public Rcpp::S4 { public: S4_FileDescriptor(const GPB::FileDescriptor* d) : S4("FileDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); if (!d) { slot("package") = Rcpp::StringVector(0); slot("filename") = Rcpp::StringVector(0); } else { slot("package") = d->package(); slot("filename") = d->name(); } } S4_FileDescriptor(const S4_FileDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_FileDescriptor& operator=(const S4_FileDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_FieldDescriptor : public Rcpp::S4 { public: S4_FieldDescriptor(const GPB::FieldDescriptor* d) : S4("FieldDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); slot("name") = d->name(); slot("full_name") = d->full_name(); slot("type") = d->containing_type()->full_name(); } S4_FieldDescriptor(const S4_FieldDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_FieldDescriptor& operator=(const S4_FieldDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_ServiceDescriptor : public Rcpp::S4 { public: S4_ServiceDescriptor(const GPB::ServiceDescriptor* d) : S4("ServiceDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); } S4_ServiceDescriptor(const S4_ServiceDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_ServiceDescriptor& operator=(const S4_ServiceDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_MethodDescriptor : public Rcpp::S4 { public: S4_MethodDescriptor(const GPB::MethodDescriptor* d) : S4("MethodDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); } S4_MethodDescriptor(const S4_MethodDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_MethodDescriptor& operator=(const S4_MethodDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_EnumDescriptor : public Rcpp::S4 { public: S4_EnumDescriptor(const GPB::EnumDescriptor* d) : S4("EnumDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); slot("type") = Rcpp::StringVector(0); if (d) { slot("name") = d->name(); slot("full_name") = d->full_name(); const GPB::Descriptor* type_desc = d->containing_type(); if (type_desc) { slot("type") = type_desc->full_name(); } } else { slot("name") = Rcpp::StringVector(0); slot("full_name") = Rcpp::StringVector(0); } } S4_EnumDescriptor(const S4_EnumDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_EnumDescriptor& operator=(const S4_EnumDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_Message : public Rcpp::S4 { public: S4_Message(const GPB::Message* d) : S4("Message") { slot("pointer") = Rcpp::XPtr(const_cast(d), true); slot("type") = d->GetDescriptor()->full_name(); } S4_Message(const S4_Message& other) : S4() { SetSexp(other.AsSexp()); } S4_Message& operator=(const S4_Message& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_ArrayOutputStream : public Rcpp::S4 { public: S4_ArrayOutputStream(int size, int block_size) : S4("ArrayOutputStream") { Rcpp::RawVector payload(size); GPB::io::ArrayOutputStream* stream = new GPB::io::ArrayOutputStream(payload.begin(), size, block_size); Rcpp::XPtr wrapper(new ZeroCopyOutputStreamWrapper(stream), true, R_NilValue, payload); slot("pointer") = wrapper; } S4_ArrayOutputStream(const S4_ArrayOutputStream& other) : S4(other) { SetSexp(other.AsSexp()); } S4_ArrayOutputStream& operator=(const S4_ArrayOutputStream& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_ArrayInputStream : public Rcpp::S4 { public: S4_ArrayInputStream(Rcpp::RawVector payload, int block_size) : S4("ArrayInputStream") { GPB::io::ArrayInputStream* stream = new GPB::io::ArrayInputStream(payload.begin(), payload.size(), block_size); Rcpp::XPtr wrapper( new ZeroCopyInputStreamWrapper(stream), true, R_NilValue, payload); slot("pointer") = wrapper; } }; #undef SetSexp #undef AsSexp } // namespace rprotobuf #endif RProtoBuf/src/ConnectionInputStream.cpp0000644000175000017500000000164412440004312020047 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionInputStream.h" #include "ConnectionCopyingInputStream.h" namespace rprotobuf { ConnectionInputStream::ConnectionInputStream(SEXP con, bool was_open) : GPB::io::CopyingInputStreamAdaptor(new ConnectionCopyingInputStream(con)), was_open(was_open), con(con) { /* clean the wrapped stream on delete */ SetOwnsCopyingStream(true); } ConnectionInputStream::~ConnectionInputStream() { if (!was_open) { /* then we need to close it */ SEXP call = PROTECT(Rf_lang2(Rf_install("close"), con)); Rf_eval(call, R_GlobalEnv); UNPROTECT(1); /* call */ } /* con will be disposed by the R GC, it is protected as part of the protection of the external pointer that wraps this */ } } // namespace rprotobuf RProtoBuf/src/init.c0000644000175000017500000006154614060653075014206 0ustar nileshnilesh#include #include #include // for NULL #include /* The following name(s) appear with different usages e.g., with different numbers of arguments: Message__clone This needs to be resolved in the tables and any declarations. DE 2017-03-05: Resolved, second entry with two arguments was in error */ /* DE 2017-03-05: - Below several entries were commented out as unresolvable - A few were renamed with suffix _cpp to avoid name clash with R symbols of the same name as we also enable .registration=TRUE in useDynLib in NAMESPACE */ /* FIXME: Check these declarations against the C/Fortran source code. */ /* .Call calls */ extern SEXP all_equal_messages(SEXP, SEXP, SEXP); extern SEXP ArrayInputStream__new(SEXP, SEXP); extern SEXP ArrayOutputStream__new(SEXP, SEXP); extern SEXP ConnectionInputStream_new(SEXP, SEXP); extern SEXP ConnectionOutputStream_new(SEXP, SEXP); extern SEXP Descriptor__as_character(SEXP); extern SEXP Descriptor__as_list(SEXP); extern SEXP Descriptor__as_Message(SEXP); extern SEXP Descriptor__containing_type(SEXP); extern SEXP Descriptor__enum_type(SEXP, SEXP); extern SEXP Descriptor__enum_type_count(SEXP); extern SEXP Descriptor__field(SEXP, SEXP); extern SEXP Descriptor__field_count(SEXP); extern SEXP Descriptor__fileDescriptor(SEXP); /*extern SEXP Descriptor__FindEnumTypeByName(SEXP, SEXP);*/ extern SEXP Descriptor__FindFieldByName(SEXP, SEXP); extern SEXP Descriptor__FindFieldByNumber(SEXP, SEXP); extern SEXP Descriptor__FindNestedTypeByName(SEXP, SEXP); extern SEXP Descriptor__getMemberNames(SEXP); extern SEXP Descriptor__name(SEXP, SEXP); extern SEXP Descriptor__nested_type(SEXP, SEXP); extern SEXP Descriptor__nested_type_count(SEXP); extern SEXP Descriptor__readASCIIFromConnection(SEXP, SEXP, SEXP); extern SEXP Descriptor__readASCIIFromString(SEXP, SEXP, SEXP); extern SEXP Descriptor__readJSONFromConnection(SEXP, SEXP); extern SEXP Descriptor__readJSONFromString(SEXP, SEXP); extern SEXP Descriptor__readMessageFromConnection(SEXP, SEXP); extern SEXP Descriptor__readMessageFromFile(SEXP, SEXP); extern SEXP Descriptor__readMessageFromRawVector(SEXP, SEXP); extern SEXP Descriptor_getField(SEXP, SEXP); extern SEXP do_dollar_Descriptor(SEXP, SEXP); extern SEXP EnumDescriptor__as_character(SEXP); extern SEXP EnumDescriptor__as_list(SEXP); extern SEXP EnumDescriptor__as_Message(SEXP); extern SEXP EnumDescriptor__containing_type(SEXP); extern SEXP EnumDescriptor__fileDescriptor(SEXP); extern SEXP EnumDescriptor__getConstantNames(SEXP); extern SEXP EnumDescriptor__getValueByIndex(SEXP, SEXP); extern SEXP EnumDescriptor__getValueByName(SEXP, SEXP); extern SEXP EnumDescriptor__getValueByNumber(SEXP, SEXP); extern SEXP EnumDescriptor__length(SEXP); extern SEXP EnumDescriptor__name(SEXP, SEXP); extern SEXP EnumDescriptor__value_count(SEXP); extern SEXP EnumValueDescriptor__as_character(SEXP); extern SEXP EnumValueDescriptor__as_Message(SEXP); extern SEXP EnumValueDescriptor__enum_type(SEXP); extern SEXP EnumValueDescriptor__number(SEXP); extern SEXP FieldDescriptor__as_character(SEXP); extern SEXP FieldDescriptor__as_Message(SEXP); extern SEXP FieldDescriptor__containing_type(SEXP); extern SEXP FieldDescriptor__cpp_type(SEXP); extern SEXP FieldDescriptor__default_value(SEXP); extern SEXP FieldDescriptor__enum_type(SEXP); extern SEXP FieldDescriptor__fileDescriptor(SEXP); extern SEXP FieldDescriptor__has_default_value(SEXP); extern SEXP FieldDescriptor__is_extension(SEXP); extern SEXP FieldDescriptor__is_optional(SEXP); extern SEXP FieldDescriptor__is_repeated(SEXP); extern SEXP FieldDescriptor__is_required(SEXP); extern SEXP FieldDescriptor__label(SEXP); extern SEXP FieldDescriptor__message_type(SEXP); extern SEXP FieldDescriptor__name(SEXP, SEXP); extern SEXP FieldDescriptor__number(SEXP); extern SEXP FieldDescriptor__type(SEXP); extern SEXP FileDescriptor__as_character(SEXP); extern SEXP FileDescriptor__as_list(SEXP); extern SEXP FileDescriptor__as_Message(SEXP); extern SEXP FileDescriptor__getMemberNames(SEXP); extern SEXP FileDescriptor__name(SEXP); extern SEXP FileInputStream_Close(SEXP); extern SEXP FileInputStream_GetErrno(SEXP); extern SEXP FileInputStream_new(SEXP, SEXP, SEXP); extern SEXP FileInputStream_SetCloseOnDelete(SEXP, SEXP); extern SEXP FileOutputStream_Close(SEXP); extern SEXP FileOutputStream_Flush(SEXP); extern SEXP FileOutputStream_GetErrno(SEXP); extern SEXP FileOutputStream_new(SEXP, SEXP, SEXP); extern SEXP FileOutputStream_SetCloseOnDelete(SEXP, SEXP); /*extern SEXP get_method_input_type(SEXP);*/ extern SEXP get_method_output_prototype(SEXP); extern SEXP get_protobuf_library_version(); extern SEXP get_value_of_enum(SEXP, SEXP); extern SEXP getEnumDescriptor(SEXP); extern SEXP getExtension_cpp(SEXP, SEXP); extern SEXP getExtensionDescriptor(SEXP); extern SEXP getMessageField(SEXP, SEXP); extern SEXP getProtobufDescriptor(SEXP); extern SEXP has_enum_name(SEXP, SEXP); extern SEXP identical_messages(SEXP, SEXP); extern SEXP Message__add_values(SEXP, SEXP, SEXP); extern SEXP Message__as_character(SEXP); extern SEXP Message__as_json(SEXP, SEXP, SEXP); extern SEXP Message__as_list(SEXP); extern SEXP Message__bytesize(SEXP); extern SEXP Message__clear(SEXP); extern SEXP Message__clear_field(SEXP, SEXP); extern SEXP Message__clone(SEXP); /*extern SEXP Message__clone(SEXP, SEXP);*/ extern SEXP Message__descriptor(SEXP); extern SEXP Message__field_exists(SEXP, SEXP); extern SEXP Message__field_size(SEXP, SEXP); extern SEXP Message__fieldNames(SEXP); extern SEXP Message__fileDescriptor(SEXP); extern SEXP Message__get_field_values(SEXP, SEXP, SEXP); extern SEXP Message__get_payload(SEXP); extern SEXP Message__has_field(SEXP, SEXP); extern SEXP Message__is_initialized(SEXP); extern SEXP Message__length(SEXP); extern SEXP Message__merge(SEXP, SEXP); extern SEXP Message__num_extensions(SEXP); extern SEXP Message__serialize_to_file(SEXP, SEXP); extern SEXP Message__set_field_size(SEXP, SEXP, SEXP); extern SEXP Message__set_field_values(SEXP, SEXP, SEXP, SEXP); extern SEXP Message__swap(SEXP, SEXP, SEXP, SEXP); extern SEXP MethodDescriptor__as_character(SEXP); extern SEXP MethodDescriptor__as_Message(SEXP); extern SEXP MethodDescriptor__fileDescriptor(SEXP); extern SEXP MethodDescriptor__input_type(SEXP); extern SEXP MethodDescriptor__name(SEXP, SEXP); extern SEXP MethodDescriptor__output_type(SEXP); extern SEXP newProtocolBufferLookup(SEXP); extern SEXP newProtoMessage(SEXP); extern SEXP readProtoFiles_cpp(SEXP, SEXP); extern SEXP resetDescriptorPool_cpp(); extern SEXP ServiceDescriptor__as_character(SEXP); extern SEXP ServiceDescriptor__as_list(SEXP); extern SEXP ServiceDescriptor__as_Message(SEXP); extern SEXP ServiceDescriptor__fileDescriptor(SEXP); extern SEXP ServiceDescriptor__getMethodNames(SEXP); /*extern SEXP ServiceDescriptor__method(SEXP, SEXP);*/ extern SEXP ServiceDescriptor__name(SEXP, SEXP); /*extern SEXP ServiceDescriptor_getMethodByIndex(SEXP, SEXP);*/ /*extern SEXP ServiceDescriptor_getMethodByName(SEXP, SEXP);*/ /*extern SEXP ServiceDescriptor_method_count(SEXP);*/ extern SEXP setMessageField(SEXP, SEXP, SEXP); extern SEXP update_message(SEXP, SEXP); extern SEXP valid_input_message(SEXP, SEXP); extern SEXP valid_output_message(SEXP, SEXP); extern SEXP ZeroCopyInputStream_BackUp(SEXP, SEXP); extern SEXP ZeroCopyInputStream_ByteCount(SEXP); extern SEXP ZeroCopyInputStream_Next(SEXP); extern SEXP ZeroCopyInputStream_ReadLittleEndian32(SEXP); extern SEXP ZeroCopyInputStream_ReadLittleEndian64(SEXP); extern SEXP ZeroCopyInputStream_ReadRaw(SEXP, SEXP); extern SEXP ZeroCopyInputStream_ReadString(SEXP, SEXP); extern SEXP ZeroCopyInputStream_ReadVarint32(SEXP); extern SEXP ZeroCopyInputStream_ReadVarint64(SEXP); extern SEXP ZeroCopyInputStream_Skip(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_BackUp(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_ByteCount(SEXP); extern SEXP ZeroCopyOutputStream_Next(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteLittleEndian32(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteLittleEndian64(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteRaw(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteString(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteVarint32(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteVarint64(SEXP, SEXP); static const R_CallMethodDef CallEntries[] = { {"all_equal_messages", (DL_FUNC) &all_equal_messages, 3}, {"ArrayInputStream__new", (DL_FUNC) &ArrayInputStream__new, 2}, {"ArrayOutputStream__new", (DL_FUNC) &ArrayOutputStream__new, 2}, {"ConnectionInputStream_new", (DL_FUNC) &ConnectionInputStream_new, 2}, {"ConnectionOutputStream_new", (DL_FUNC) &ConnectionOutputStream_new, 2}, {"Descriptor__as_character", (DL_FUNC) &Descriptor__as_character, 1}, {"Descriptor__as_list", (DL_FUNC) &Descriptor__as_list, 1}, {"Descriptor__as_Message", (DL_FUNC) &Descriptor__as_Message, 1}, {"Descriptor__containing_type", (DL_FUNC) &Descriptor__containing_type, 1}, {"Descriptor__enum_type", (DL_FUNC) &Descriptor__enum_type, 2}, {"Descriptor__enum_type_count", (DL_FUNC) &Descriptor__enum_type_count, 1}, {"Descriptor__field", (DL_FUNC) &Descriptor__field, 2}, {"Descriptor__field_count", (DL_FUNC) &Descriptor__field_count, 1}, {"Descriptor__fileDescriptor", (DL_FUNC) &Descriptor__fileDescriptor, 1}, /* {"Descriptor__FindEnumTypeByName", (DL_FUNC) &Descriptor__FindEnumTypeByName, 2}, */ {"Descriptor__FindFieldByName", (DL_FUNC) &Descriptor__FindFieldByName, 2}, {"Descriptor__FindFieldByNumber", (DL_FUNC) &Descriptor__FindFieldByNumber, 2}, {"Descriptor__FindNestedTypeByName", (DL_FUNC) &Descriptor__FindNestedTypeByName, 2}, {"Descriptor__getMemberNames", (DL_FUNC) &Descriptor__getMemberNames, 1}, {"Descriptor__name", (DL_FUNC) &Descriptor__name, 2}, {"Descriptor__nested_type", (DL_FUNC) &Descriptor__nested_type, 2}, {"Descriptor__nested_type_count", (DL_FUNC) &Descriptor__nested_type_count, 1}, {"Descriptor__readASCIIFromConnection", (DL_FUNC) &Descriptor__readASCIIFromConnection, 3}, {"Descriptor__readASCIIFromString", (DL_FUNC) &Descriptor__readASCIIFromString, 3}, {"Descriptor__readJSONFromConnection", (DL_FUNC) &Descriptor__readJSONFromConnection, 2}, {"Descriptor__readJSONFromString", (DL_FUNC) &Descriptor__readJSONFromString, 2}, {"Descriptor__readMessageFromConnection", (DL_FUNC) &Descriptor__readMessageFromConnection, 2}, {"Descriptor__readMessageFromFile", (DL_FUNC) &Descriptor__readMessageFromFile, 2}, {"Descriptor__readMessageFromRawVector", (DL_FUNC) &Descriptor__readMessageFromRawVector, 2}, {"Descriptor_getField", (DL_FUNC) &Descriptor_getField, 2}, {"do_dollar_Descriptor", (DL_FUNC) &do_dollar_Descriptor, 2}, {"EnumDescriptor__as_character", (DL_FUNC) &EnumDescriptor__as_character, 1}, {"EnumDescriptor__as_list", (DL_FUNC) &EnumDescriptor__as_list, 1}, {"EnumDescriptor__as_Message", (DL_FUNC) &EnumDescriptor__as_Message, 1}, {"EnumDescriptor__containing_type", (DL_FUNC) &EnumDescriptor__containing_type, 1}, {"EnumDescriptor__fileDescriptor", (DL_FUNC) &EnumDescriptor__fileDescriptor, 1}, {"EnumDescriptor__getConstantNames", (DL_FUNC) &EnumDescriptor__getConstantNames, 1}, {"EnumDescriptor__getValueByIndex", (DL_FUNC) &EnumDescriptor__getValueByIndex, 2}, {"EnumDescriptor__getValueByName", (DL_FUNC) &EnumDescriptor__getValueByName, 2}, {"EnumDescriptor__getValueByNumber", (DL_FUNC) &EnumDescriptor__getValueByNumber, 2}, {"EnumDescriptor__length", (DL_FUNC) &EnumDescriptor__length, 1}, {"EnumDescriptor__name", (DL_FUNC) &EnumDescriptor__name, 2}, {"EnumDescriptor__value_count", (DL_FUNC) &EnumDescriptor__value_count, 1}, {"EnumValueDescriptor__as_character", (DL_FUNC) &EnumValueDescriptor__as_character, 1}, {"EnumValueDescriptor__as_Message", (DL_FUNC) &EnumValueDescriptor__as_Message, 1}, {"EnumValueDescriptor__enum_type", (DL_FUNC) &EnumValueDescriptor__enum_type, 1}, {"EnumValueDescriptor__number", (DL_FUNC) &EnumValueDescriptor__number, 1}, {"FieldDescriptor__as_character", (DL_FUNC) &FieldDescriptor__as_character, 1}, {"FieldDescriptor__as_Message", (DL_FUNC) &FieldDescriptor__as_Message, 1}, {"FieldDescriptor__containing_type", (DL_FUNC) &FieldDescriptor__containing_type, 1}, {"FieldDescriptor__cpp_type", (DL_FUNC) &FieldDescriptor__cpp_type, 1}, {"FieldDescriptor__default_value", (DL_FUNC) &FieldDescriptor__default_value, 1}, {"FieldDescriptor__enum_type", (DL_FUNC) &FieldDescriptor__enum_type, 1}, {"FieldDescriptor__fileDescriptor", (DL_FUNC) &FieldDescriptor__fileDescriptor, 1}, {"FieldDescriptor__has_default_value", (DL_FUNC) &FieldDescriptor__has_default_value, 1}, {"FieldDescriptor__is_extension", (DL_FUNC) &FieldDescriptor__is_extension, 1}, {"FieldDescriptor__is_optional", (DL_FUNC) &FieldDescriptor__is_optional, 1}, {"FieldDescriptor__is_repeated", (DL_FUNC) &FieldDescriptor__is_repeated, 1}, {"FieldDescriptor__is_required", (DL_FUNC) &FieldDescriptor__is_required, 1}, {"FieldDescriptor__label", (DL_FUNC) &FieldDescriptor__label, 1}, {"FieldDescriptor__message_type", (DL_FUNC) &FieldDescriptor__message_type, 1}, {"FieldDescriptor__name", (DL_FUNC) &FieldDescriptor__name, 2}, {"FieldDescriptor__number", (DL_FUNC) &FieldDescriptor__number, 1}, {"FieldDescriptor__type", (DL_FUNC) &FieldDescriptor__type, 1}, {"FileDescriptor__as_character", (DL_FUNC) &FileDescriptor__as_character, 1}, {"FileDescriptor__as_list", (DL_FUNC) &FileDescriptor__as_list, 1}, {"FileDescriptor__as_Message", (DL_FUNC) &FileDescriptor__as_Message, 1}, {"FileDescriptor__getMemberNames", (DL_FUNC) &FileDescriptor__getMemberNames, 1}, {"FileDescriptor__name", (DL_FUNC) &FileDescriptor__name, 1}, {"FileInputStream_Close", (DL_FUNC) &FileInputStream_Close, 1}, {"FileInputStream_GetErrno", (DL_FUNC) &FileInputStream_GetErrno, 1}, {"FileInputStream_new", (DL_FUNC) &FileInputStream_new, 3}, {"FileInputStream_SetCloseOnDelete", (DL_FUNC) &FileInputStream_SetCloseOnDelete, 2}, {"FileOutputStream_Close", (DL_FUNC) &FileOutputStream_Close, 1}, {"FileOutputStream_Flush", (DL_FUNC) &FileOutputStream_Flush, 1}, {"FileOutputStream_GetErrno", (DL_FUNC) &FileOutputStream_GetErrno, 1}, {"FileOutputStream_new", (DL_FUNC) &FileOutputStream_new, 3}, {"FileOutputStream_SetCloseOnDelete", (DL_FUNC) &FileOutputStream_SetCloseOnDelete, 2}, /* {"get_method_input_type", (DL_FUNC) &get_method_input_type, 1},*/ {"get_method_output_prototype", (DL_FUNC) &get_method_output_prototype, 1}, {"get_protobuf_library_version", (DL_FUNC) &get_protobuf_library_version, 0}, {"get_value_of_enum", (DL_FUNC) &get_value_of_enum, 2}, {"getEnumDescriptor", (DL_FUNC) &getEnumDescriptor, 1}, {"getExtension_cpp", (DL_FUNC) &getExtension_cpp, 2}, {"getExtensionDescriptor", (DL_FUNC) &getExtensionDescriptor, 1}, {"getMessageField", (DL_FUNC) &getMessageField, 2}, {"getProtobufDescriptor", (DL_FUNC) &getProtobufDescriptor, 1}, {"has_enum_name", (DL_FUNC) &has_enum_name, 2}, {"identical_messages", (DL_FUNC) &identical_messages, 2}, {"Message__add_values", (DL_FUNC) &Message__add_values, 3}, {"Message__as_character", (DL_FUNC) &Message__as_character, 1}, {"Message__as_json", (DL_FUNC) &Message__as_json, 3}, {"Message__as_list", (DL_FUNC) &Message__as_list, 1}, {"Message__bytesize", (DL_FUNC) &Message__bytesize, 1}, {"Message__clear", (DL_FUNC) &Message__clear, 1}, {"Message__clear_field", (DL_FUNC) &Message__clear_field, 2}, {"Message__clone", (DL_FUNC) &Message__clone, 1}, /* {"Message__clone", (DL_FUNC) &Message__clone, 2},*/ {"Message__descriptor", (DL_FUNC) &Message__descriptor, 1}, {"Message__field_exists", (DL_FUNC) &Message__field_exists, 2}, {"Message__field_size", (DL_FUNC) &Message__field_size, 2}, {"Message__fieldNames", (DL_FUNC) &Message__fieldNames, 1}, {"Message__fileDescriptor", (DL_FUNC) &Message__fileDescriptor, 1}, {"Message__get_field_values", (DL_FUNC) &Message__get_field_values, 3}, {"Message__get_payload", (DL_FUNC) &Message__get_payload, 1}, {"Message__has_field", (DL_FUNC) &Message__has_field, 2}, {"Message__is_initialized", (DL_FUNC) &Message__is_initialized, 1}, {"Message__length", (DL_FUNC) &Message__length, 1}, {"Message__merge", (DL_FUNC) &Message__merge, 2}, {"Message__num_extensions", (DL_FUNC) &Message__num_extensions, 1}, {"Message__serialize_to_file", (DL_FUNC) &Message__serialize_to_file, 2}, {"Message__set_field_size", (DL_FUNC) &Message__set_field_size, 3}, {"Message__set_field_values", (DL_FUNC) &Message__set_field_values, 4}, {"Message__swap", (DL_FUNC) &Message__swap, 4}, {"MethodDescriptor__as_character", (DL_FUNC) &MethodDescriptor__as_character, 1}, {"MethodDescriptor__as_Message", (DL_FUNC) &MethodDescriptor__as_Message, 1}, {"MethodDescriptor__fileDescriptor", (DL_FUNC) &MethodDescriptor__fileDescriptor, 1}, {"MethodDescriptor__input_type", (DL_FUNC) &MethodDescriptor__input_type, 1}, {"MethodDescriptor__name", (DL_FUNC) &MethodDescriptor__name, 2}, {"MethodDescriptor__output_type", (DL_FUNC) &MethodDescriptor__output_type, 1}, {"newProtocolBufferLookup", (DL_FUNC) &newProtocolBufferLookup, 1}, {"newProtoMessage", (DL_FUNC) &newProtoMessage, 1}, {"readProtoFiles_cpp", (DL_FUNC) &readProtoFiles_cpp, 2}, {"resetDescriptorPool_cpp", (DL_FUNC) &resetDescriptorPool_cpp, 0}, {"ServiceDescriptor__as_character", (DL_FUNC) &ServiceDescriptor__as_character, 1}, {"ServiceDescriptor__as_list", (DL_FUNC) &ServiceDescriptor__as_list, 1}, {"ServiceDescriptor__as_Message", (DL_FUNC) &ServiceDescriptor__as_Message, 1}, {"ServiceDescriptor__fileDescriptor", (DL_FUNC) &ServiceDescriptor__fileDescriptor, 1}, {"ServiceDescriptor__getMethodNames", (DL_FUNC) &ServiceDescriptor__getMethodNames, 1}, /* {"ServiceDescriptor__method", (DL_FUNC) &ServiceDescriptor__method, 2},*/ {"ServiceDescriptor__name", (DL_FUNC) &ServiceDescriptor__name, 2}, /* {"ServiceDescriptor_getMethodByIndex", (DL_FUNC) &ServiceDescriptor_getMethodByIndex, 2},*/ /* {"ServiceDescriptor_getMethodByName", (DL_FUNC) &ServiceDescriptor_getMethodByName, 2},*/ /* {"ServiceDescriptor_method_count", (DL_FUNC) &ServiceDescriptor_method_count, 1},*/ {"setMessageField", (DL_FUNC) &setMessageField, 3}, {"update_message", (DL_FUNC) &update_message, 2}, {"valid_input_message", (DL_FUNC) &valid_input_message, 2}, {"valid_output_message", (DL_FUNC) &valid_output_message, 2}, {"ZeroCopyInputStream_BackUp", (DL_FUNC) &ZeroCopyInputStream_BackUp, 2}, {"ZeroCopyInputStream_ByteCount", (DL_FUNC) &ZeroCopyInputStream_ByteCount, 1}, {"ZeroCopyInputStream_Next", (DL_FUNC) &ZeroCopyInputStream_Next, 1}, {"ZeroCopyInputStream_ReadLittleEndian32", (DL_FUNC) &ZeroCopyInputStream_ReadLittleEndian32, 1}, {"ZeroCopyInputStream_ReadLittleEndian64", (DL_FUNC) &ZeroCopyInputStream_ReadLittleEndian64, 1}, {"ZeroCopyInputStream_ReadRaw", (DL_FUNC) &ZeroCopyInputStream_ReadRaw, 2}, {"ZeroCopyInputStream_ReadString", (DL_FUNC) &ZeroCopyInputStream_ReadString, 2}, {"ZeroCopyInputStream_ReadVarint32", (DL_FUNC) &ZeroCopyInputStream_ReadVarint32, 1}, {"ZeroCopyInputStream_ReadVarint64", (DL_FUNC) &ZeroCopyInputStream_ReadVarint64, 1}, {"ZeroCopyInputStream_Skip", (DL_FUNC) &ZeroCopyInputStream_Skip, 2}, {"ZeroCopyOutputStream_BackUp", (DL_FUNC) &ZeroCopyOutputStream_BackUp, 2}, {"ZeroCopyOutputStream_ByteCount", (DL_FUNC) &ZeroCopyOutputStream_ByteCount, 1}, {"ZeroCopyOutputStream_Next", (DL_FUNC) &ZeroCopyOutputStream_Next, 2}, {"ZeroCopyOutputStream_WriteLittleEndian32", (DL_FUNC) &ZeroCopyOutputStream_WriteLittleEndian32, 2}, {"ZeroCopyOutputStream_WriteLittleEndian64", (DL_FUNC) &ZeroCopyOutputStream_WriteLittleEndian64, 2}, {"ZeroCopyOutputStream_WriteRaw", (DL_FUNC) &ZeroCopyOutputStream_WriteRaw, 2}, {"ZeroCopyOutputStream_WriteString", (DL_FUNC) &ZeroCopyOutputStream_WriteString, 2}, {"ZeroCopyOutputStream_WriteVarint32", (DL_FUNC) &ZeroCopyOutputStream_WriteVarint32, 2}, {"ZeroCopyOutputStream_WriteVarint64", (DL_FUNC) &ZeroCopyOutputStream_WriteVarint64, 2}, {NULL, NULL, 0} }; void R_init_RProtoBuf(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } void R_unload_RProtoBuf(DllInfo* dll) { resetDescriptorPool_cpp(); } RProtoBuf/src/wrapper_FileDescriptor.cpp0000644000175000017500000000532712440004312020234 0ustar nileshnilesh// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(FileDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::FileDescriptor, DebugString) RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::FileDescriptorProto* message = new GPB::FileDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(getMemberNames), Rcpp::XPtr desc) { int ntypes = desc->message_type_count(); int nenums = desc->enum_type_count(); int nserv = desc->service_count(); int nexts = desc->extension_count(); Rcpp::CharacterVector res(ntypes + nenums + nserv + nexts); int i = 0; int j = 0; while (i < ntypes) { res[j] = desc->message_type(i)->name(); i++; j++; } i = 0; while (i < nenums) { res[j] = desc->enum_type(i)->name(); i++; j++; } i = 0; while (i < nserv) { res[j] = desc->service(i)->name(); i++; j++; } i = 0; while (i < nexts) { res[j] = desc->extension(i)->name(); i++; j++; } return res; } /** * @param xp (GPB::FileDescriptor*) external pointer * @return the descriptor as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr desc) { int ntypes = desc->message_type_count(); int nenums = desc->enum_type_count(); int nserv = desc->service_count(); int nexts = desc->extension_count(); int n = ntypes + nenums + nserv + nexts; Rcpp::CharacterVector names(n); Rcpp::List res(n); int count = 0; for (int i = 0; i < ntypes; count++, i++) { res[count] = S4_Descriptor(desc->message_type(i)); names[count] = desc->message_type(i)->name(); } for (int i = 0; i < nenums; count++, i++) { res[count] = S4_EnumDescriptor(desc->enum_type(i)); names[count] = desc->enum_type(i)->name(); } for (int i = 0; i < nserv; count++, i++) { res[count] = S4_ServiceDescriptor(desc->service(i)); names[count] = desc->service(i)->name(); } for (int i = 0; i < nexts; count++, i++) { res[count] = S4_FieldDescriptor(desc->extension(i)); // always use full names for extensions names[count] = desc->extension(i)->full_name(); } res.names() = names; return res; } RPB_FUNCTION_1(std::string, METHOD(name), Rcpp::XPtr desc) { return desc->name(); } #undef METHOD } // namespace rprotobuf RProtoBuf/tools/0000755000175000017500000000000013505372467013442 5ustar nileshnileshRProtoBuf/tools/winlibs.R0000644000175000017500000000071713505372467015241 0ustar nileshnilesh# Build against protobuf libs compiled with Rtools VERSION <- commandArgs(TRUE) if (!file.exists(sprintf("../windows/protobuf-%s/include/google/protobuf/descriptor.h", VERSION))) { if (getRversion() < "3.3.0") setInternet2() download.file(sprintf("https://github.com/rwinlib/protobuf/archive/v%s.zip", VERSION), "lib.zip", quiet = TRUE) dir.create("../windows", showWarnings = FALSE) unzip("lib.zip", exdir = "../windows") unlink("lib.zip") } RProtoBuf/vignettes/0000755000175000017500000000000014156423632014304 5ustar nileshnileshRProtoBuf/vignettes/RProtoBuf-intro.Rnw0000644000175000017500000000044213617276206020013 0ustar nileshnilesh\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{RProtoBuf-intro} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignetteDepends{RProtoBuf} %\VignetteEncoding{UTF-8} \begin{document} \includepdf[pages=-, fitpaper=true]{pdf/RProtoBuf-intro.pdf} \end{document} RProtoBuf/vignettes/RProtoBuf-quickref.Rnw0000644000175000017500000000045013617276206020470 0ustar nileshnilesh\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{RProtoBuf-quickref} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignetteDepends{RProtoBuf} %\VignetteEncoding{UTF-8} \begin{document} \includepdf[pages=-, fitpaper=true]{pdf/RProtoBuf-quickref.pdf} \end{document} RProtoBuf/vignettes/pdf/0000755000175000017500000000000013617276206015061 5ustar nileshnileshRProtoBuf/vignettes/pdf/RProtoBuf-paper.pdf0000644000175000017500000066363713617276206020570 0ustar nileshnilesh%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4181 /Filter /FlateDecode /N 70 /First 574 >> stream x[Ys8~_MH85U!{r<(2ms#KIIL9Af`"&6L21h 3˒Hq[#C R㈯8&,b\X(:b+p4LL ňI',LZcyҜŒ)+q$0X~c 2 #" 1dUf s&$֢SpKj#F!AU b a,eF1X73`xQpN=c/<7Ogl>;)nW&2̧lu}.2]di,8/!2jgv̗Ev$ \>7G/|FP/vt}Mt7xvs!NflS߃ 7AWW9MuIѾ^TI *W|sBBiST}@GJRS=,s/ WxCèD`En_֣t9_-&z;\4Wxc H.擋4GcP~?׉k2 2gqó1EW+˼~W@ghMAKqOR(S!u5{<~L(8YH._zJN[ScsE~JdRLEU)iVN -ռf4FsѼ؎02oleL݀g^|Th6_e~f{e>v :)ᇴ۵`v'*xICv:t.> vӍ3]; Q$:dCЛ0"R1KQ\8 $wpsj9!!0h ~"nn1 7$F$Q"< _o·(  p^ix^Cv›6Ypޅpއp.a?~rp|G`t|$sR.[r Aoq6MFߥm19Mf7\Tϳ2%ӻd}k<#$ՑF4G8k%Y(rEE0QԀ Ӕ&l!::amˏ8-Aca!%l.qHGXYn kE3pnw"1׮NA HA Y^AK"$k&j {N '>N\Դ.| }}H++ΗBufpơ?s߇yW .4j_o_TL65 F]EzT,yX^ZR?T0Nuӧ'G/1tAjhUm}ODKq I8' }|o \dX d^P5S=ʸ{nބSHZVV"nup,KC(gw=`KyH#\}ZZ6hq&nC1T$tA7xyEWMܗ{(0=XȿU @aWoryc]c)ѿ¿78 2W9e.-`m`h`\Cqɹ> tݯm I*n7gC?;0?rOrT5OLJg`pːJ5 bǦ]>Z$GW 5T˺1TǢ\w3%$=G 3!qAVsd|OWK(noM6hpaаU1[#^o^?hMC\x5C,B%:B5ԽvV<\-jeT;հJ6Zy]i/FgIyg.HWu* ncyR/AQFrW~j.dO B8!^2R#9u${! {;2Z,ܒ#Hy p¬Œ(J!|.sguM#TW5HI"rPf`OvwVp^\p6~}W{>N#sѝÏGo\6go$Z"xGl?ԪejjM6+ޝ9#:LN<8tʜ|KUZc9K7s<}-H@k>z[0Rr^II]_^ E-'?*Js[]o )~hSz?RUےSy<PKWQz5NNjuR̆얬ܐć~;e3Vtl6T 㯵l‚ӽbaXq Xs~*EZ::"@ ܦ2nqО2q $ TeдL҅&m.BW61)?w veN괥tt |C^ Ҵeb3|ģ#'FREN5COG{R8-`Q=PMnfG~ jHk!{ܺBԨ1)[nE? mN-ڕi$n(B-iDUv[!'b@58Z^)f2aO W!A_R]Q[r :b6z{йP<ꦩdրi?ǐ~ځ@l^u@7Մky<zɫ"ʋt XsCl<9=<{١elwN١~ na>~DMu-~Ujs)#(V_Nl-&"n=0 oh|dIr9؜ONº#Y(\tV:UW|0&.x^~'0IP6=s%eu}J=J5[kI8d؎uZM3% CQɊjPy"PEiDhMy^ћYeYrkHǬ\gi4Hӛ[eR-so7TѢvKwʁ>ܬQ*V{tCYSS0ѻ>Zz@0=O#O#)PW۞n{枝Z h FVbK$@zN$LOkkAI8NJs+]-7߸ ,|fJ%nzU}zq&Jm*IQi\]h0*@RzrfeNmojmt7A:fp@i%Ylۻ@~5X*_> stream GPL Ghostscript 9.27 R, Rcpp, Protocol Buffers, serialization, cross-platform 2020-02-07T07:22:33-06:00 2020-02-07T07:22:33-06:00 LaTeX with hyperref RProtoBuf: Efficient Cross-Language Data Serialization in RDirk Eddelbuettel, Murray Stokely, Jeroen Ooms endstream endobj 73 0 obj << /Type /ObjStm /Length 2733 /Filter /FlateDecode /N 70 /First 596 >> stream xZYS~JEwoMM$elS<(FcL_bR,nr>;G -1yόS`BK&,VX"L: ,VbcJbϔ21>bq`JSɰeAA3b0 ɂe*hhS1lig1O 4 ̗ ˸ap),3¡h9Ρ3+- jv`jHf#RjfcL0X椇CΒr$z$j,K%s T9Oq!Gyz%@a r244HsRЋ}H!Ѐ+RKҐXajZ ĩ8$_IA+ MiGIP M6DR 7wiN,aa#,ygFF  fE~5 F=^8*"-XN(y>>J 3~~/ ̄y=Ki>mj)զ *|mz6mZ<6UtGnrۥvhs?@۳dOv}_ϧ431Lj`?/݋dN<~/]٬ˡ7I=\?Z !:cvZ\,@$?^Uz?|09Mf/h#1%z$9_Wl$OTIaJaotdwsaX@䥄JQ^~XaKS͊Aiy׸OW>_"˧|h3)^F;L>8b]A^lz5мQ:yڹ !GS{A8Ez27 ;i^ܓ$$|@ÝW!1Aya$>I8{$I"4C RC&&&IG6')ȑB g</C0T2 yDr3GxQO "e9  jT `zmP=m R6`2P"A#BwYINe/Ϛz҈*9 h bu VuLۚ 6-ZE8u[. oYFK:Y(ﭐ )II%2B!OM}M0U6tI8LݒMlZ@fmRl yJnс-mEaI{N;5] Lm}2Lx:Xmί:hk9Hi辭J7cr4ے#ePN`Ktѫτ >wٲ=+8j"vY}LŠlK|MjRdI,ʢ,16]Z׺=QlMML/jW"a7W%ů hjzm`G_޾e:80 l^t̎mfx@S=I79|E > stream xZks6"tjInzd'nh Hd ?2J^{ 4OO4j %1e *fwřWs4Q!RK _ &Vm&b9ӂ iL(&LunLƜ2 hˤH혔TJBLjAd؄I 0 IOil[:R%`p X%Dؘ%Ҁc,q+[)š BIe-i.5LKNqL+9 XK8ɴ4'a NF`+$Q@B1Q cf~0XUf6"X)a6+fehft51=e昋ajc {tAFltˊ,6fO/dE;i\윍U cv~Y[ogY5IW$/_W 'X X&+*?{{ze6a2/ٱ/iPt9eS_N[Qktֲ.ʖW v.|k‰]fs?HlÒ]Q̇6F*ncS_j,ϧ/i&,@-|5˧J -"0]5Zm0ٍIʩa\g6^-7{zq$F[u'}lbˍVe^qGNª%c?+@9 CQ Iwj̥D NFɐtАqmo։GV:;|X-1*aйH'lۗyN!- jh͗-+Im"ʥ3D7,OH I3OWU]@BT\$"VC|LgHPxaN1Q;ұD }:hiHKݺnưm@-ny5K lMu!zSbtR!SΤпq ]gvt^J$2toh{p_ٴQIj󦥯'qO1;zm6Iz:= ot:('!@W>a] FsY]dWW灕a x3OJ6GM&KaZ}tVG&T`8+ [b +N+[xu۹l$bt>w.DN\9:`"Z4EG|GtTD"v[vYO=N$_uzOPoQ#Vu[;"mybvh*]YH9?~;֟f gG *_͈Vٌ7[ܭ~ 86{㈨ AlG@v]Ǒ5o %*7 %Okr>_=N|mԆGζI$鶛HDT n:8^?1RKݛZO-ѧ?ZWvA8DJ%,!L&e)zc$ԇgb|wQô=s/pzEqt uBя*9r==AnD麃%4v6SnWB؉2.e:VM]AVxB"2%u1#\mcUx<;j: RI*TT}"Ag^,o?z| yFo7FOíg4WK?:YyXm7#$>>E*9 {{v~9Ms]bϣIK! 퍡-J/.pǶ5jW}ik-VE~~ : "dsr_|Zz>{ZkPX$(k@DZvtj6PF,eoYtv?Ķendstream endobj 214 0 obj << /Filter /FlateDecode /Length 7177 >> stream x][sq~] x\T';םɋˊUN,K_<,dP@ʟO_=g%,ggzze?s6/÷ޝ<Mg$ff3x9AQ<~˯a9nd^YU>dtCTF$-K=K21$! H9#ksg#'ɍkO=1)YRarȑfdc9^R%W[Y;qְ,^ue/d7r UfvIJp$~a<[_>b{7λ&>x7 MCZ qSdO[L,g%nX vcbV*0+}C#l JnO,s81t)֠=)nٸ꼜)z13W#Cx{#XNʡ80DT.p٪c@=MbGY>$]'f:ޠ`R6V  eq8|YL"ֺPLGDg0jbU]!}<vGYr<{0ۆ߰;g,fr% >Dz>bbH+ٴ&N+rs=lh#P }Ls\ MI-mVb7ox`>^<3Gr#8?>K!gv}%G>htv3C *_U x~jg883Eh& "3\nSPr@<"b,Kt(~Az&`XF8c9PKv.i{x@Tyjt}gUyS<^oЧAlqu@рrM-p@$hoQL7wr}Ʈ /%N̳ 0]-U+=d/^HǾ| b7}G|&̏dbu<-G8KyUwG0, 5DR9g Q<'~G22H[^~My0 _+iՇKU>sξM85<-ڴW/:.cw=@=m,Vh9W^ϻa.3vvFC6F 1UHoa, 1&/"7h/sƜ8-S #L-][|6 %M"Vioꃩg_Lh#N}0tKyXH$_2ƳE3 P6Y<Y0ÇU)1eO}|"ΝC"N CXkQG,HE`w֧3KغxzxQս0.F9@ߠm)SO[9 k](v},D9bًO0G @r\ɢ@x]V(p1o HG}x`^$v_eޤB݁iŸAvtwSh΀m_U%7r"0ʐʻJu PA}bhݎO0F ' )th'#!)Hmӡf 4 D=;zI` *nzq*=,O 9SvM; =֘H wòKHH=()SWLi %؞wTadFH !8Z;EH.yh,UIp3N3 K_;4M}Uwgefk$5A(< Zc6bB' _Nky6قT,Z,oNK/:tL)fWz\$9yD:DmE'xi"fHVɚ C>1}'b9 zb4T.Pu^A|*S܋=j(#> v5J!vebm:BePR``}eu(/2LZ1j8]N]sZV7"DuM5ye \FgcB~u>Qy Q Ȝ٧I&EOk"lⴙQZeʫYjcOAR.@1}|&nPWp1t)RbݤHa.ސ6 q6 x'(9gI`O;fBBJƬ#{N`ƙt8:~Rj"MD*pf"b l`nZI&zt5?<-uZwB֔DLwFF rwő[B9EtG; }8˪z^5ZPNš}8 >Yp1uSP+<:O]=U6#`Ȗ -f"JKHUU>p9AxdJ$nl'xIZJTq.b oNFPҕ&BrI]$YtcdU]J^ BAY!% F4TxtH|TФa%]GN݊;;Pf?ty8HGSE?~AEVU,xR?>p(W#%P?z $&ݍ0$e??B> })eyUPZdAb8Z.C|DEZ-OCQ:!2 =зG/o jy J{S ٌ5VXīqkΗ(egd!9g[;itEfd?6Ǹ!t;1%<ؠMlo ^cQ}I7]8M]v tmF>pNnR[5|\'ɚ 7]?4,hؖA1vFiH/V/G3.ggmљNr;bl'G{pH&}f Yf1BC \MJdN bPd3 ]ɶOͻ{~s16 3x6̃#^w׉DQXRd˜w.Ft[Z(w¯1XuS l^tY(vfą]ˤn/ݼA6_w{R~/ M Ůevւ4'_ [yl?ҹR,ȖvЋ^ƚP~DS\2<:i0x^r K,+hO'xJwWҰwn9>ͭLRI2W8yA)ؚl,vR|lu}A16N \԰ MBY,I I%%RK鵔, /p]V*BϡhV {#7rָ-QYD < hDrjlt^`(ysx)asiTptW<#'fs|fw} DIwȋ<`BcCp66y.8ϹW-j8 nSt}э'ۙ{od.6ܔ W(斳"\S¹JkjS&5u`̱ 06F͎Y3 5* 28ƠwA>P}=Z<ݢ\ !ZfiW R1̥_0uOP>F*$ I[Gȵ(~O+%.dyi<!R4zK7=tPi-A,I)"8`.PЮ8?mϦq' ^DޞXXb xBP|q3|{GF.rC>%J녢GKՠgZ#E1"4"&,@2W"_nK!Em2"ڄICMC𹉲Ujc+=|J+hz:fıu59Hw<)l9I">xTfl1B;<9yby$uwC_|I@lVj7S ؄aD:f3ݰ%b<"wm߆XG*osQKL`yNp6Eq}Еffb~1+*;u0FxR <ܱH/e syH8\U'#D%2vXѫO%".&Mn]€7O]+Нs4cVkшtP]^d%Th= )]KY2wN0YV|8oNb61QM B>6έrOPZ"N m$ySD%}6VY'^rxь .7ԭ;{U߀e}4o~"\0"1;'碫FT0K8G7 r6ܐ {lغK10ejt?:IIqRo9)X0嶵ԱMCu*)ζJ׶0)K M8%f+]ݪ2V%HVBaݶg2"X.VWVa:SLvE@ߪAH5~2z-Em_"M*W8b,zj\G9cM?ݔPe<ŭO"W!`JA c5`UӺc\v_9.M%U ]=uHqݽ؈OѶS'wvÙtѿ[>?P0Q^,Im7ת6Mo2x+~ζ݉$+6QѺ> stream x]IuC zvCD#H"0E-YeU 5UY{Kj9>}_ݣU_?;^9/*ұp~77Zu7GW ٣Ya1n/6K8˥dgcq/RLpcB<.KZ5 & Jv!?DH\6N߮ow ~ lJYKN6/8ίolLj9Fx[Sgp9h|8<O` ;]·zou1Qb:Nn>g-_ lIks el@v2ZګN]r6K}Dri$NDXs{ VrhLAݛ~g寰xjAEKYsc1b7D!"R@xux9܏~0Z֩ o7-0t@0r:rrd=}ifyTbfx k=fYē7Pr PZ9uXyǙY].IT?&'[/IIaD(RSR' lLN(NOIn÷,m_xW"ZI{q (ux/iSOQD2Sqln#[AX^c"b k$5 NɕfyghQF1mfFC쟍6;[E L"$4O::Lf=Uf` ɲXF絼t =^ob! .av?t*iω:iÐ#2/wWDYu%0/Hzn?>ԿB}B .>vqS՛ shgI{VMVp$LgX6oSֱ>X \BC3% H]DЦVᄏa4zow`aN+Fx#LkC(2>TȄKYX7z}[#wF:=AJ>&4~ }U-gav2xL `l,JI8Va na PZb#2 >򇢉SQ5띺,m.$i@< E-l6f{VSp(- Op %xCH6}m̃ ?6 "^rߊ rQ摟,6%z5?ʖFrp@ 'Hwt E4 .L}N#"YgC^]]3}8e{HzN.0FO#cbRjVLCS}|{C@9i5,(Da58١u٤-ْ.N3_V'U!dY +#QznD!\v@ze%"J^As\ mV%:I,)ȨOX2Ӹ/فl<0#p7ʞS# <`c||DD1%᫡iHlfGO"]gn6M?jԀu\=+  Eh2zgq =߁;PnGf i7T5}/ 8rΘU$6fiNI0d#w9+3j` A1RC*1+Aww|N 'pe:1f_ܟYѳ'aPH!F7sU$& TW]13m?R D%s?XbQ$(kHj/O4!a^(މA,Me@99B Yh ?b).&ɾcDAGTki`D V0Qǜ^5/c?m6?s@4nhsXFFwV{ 9Je(\"/~%'#UmǕK(H(KwL¨ۣ@AP:a`=I:V,GovnVuN)G Gyq<#dm`?MdGl W,Qµ14δ>EVZQgyd襳{n, c`|}r F  )tI;?7b1AI(뢇ŹHιLk*] }!# Bh tsV0,ȿY+˻3)!b^0~tw!9SI^(30D"h3IǠ98.jph[V:Zo}xQj ޤrӡ{h6)$L0"+-|?-% G(dmA"nHqI_H>Kb1 h6y l`SQak䡆\YaEL% ^7PRf33qQ}C#лfLJ%9SzGؠ\ k) '45^I4Ri#nD Ò-)B̈́ZViK]7#YPڱ5o哎WѶ>:P-jJDT@4gZ@0P PZik!x@h%F~q%v@]g1 !YaPs3& Ff.:(!w|&CGo\c#Ul\Q3/ 0Hizֈ(:5 HW\$YK| #ug F@ХXnl ^mĈy2$%~SDsO_fmZArSO!'{gded*w(ʕ!ܒyou`3#^e*YuqIA;*raҕ}A 7e42cyXItAm &wT Sek29o^yk}O:^T,ԴKo 4#Ib.5tj?%\Nzy$x;wecxhtN&q46l 1i͘nlA~$IBy]fi|9CGMC3M 8&5gyj;_W"4On&nk$u*,&NY6 1^'ωXt!F #D?נy(ZLFOjBQwuK= ?(K"` [2(_ aǤNϔ zG.`L~,;zyճd7ڈE) ~`#;M o )C`B%3xK7 2k,M)A 19U#кg^l,IJC sAh0 Ɠ~ TNOChQ{E6*5 (jщJnPۊK_llGҴa uUd}, z*鎮,MMmπ(?9#@H@@潱 ,6 3b+9RSY-YͻY M gO4-1pE ۿd,QfJ&~`? ˜uݢyL])$l ɪo~^Ř*q?8z*N}֯ 8A a<`%'p)4pP;aᖕ1iSfV)F\*awY kU2G47ݕ-,+`a;x,@յJAk: M2\Ā UKK ށ)E7e Kp]{~{сJNAA{Vֵ+% 'L{~3t }q,\HOO(vM9jk-vSV[фq&@;5Ct)8|NJtao|S_x1LTwޢdzqPcNĽ T&.Kd{8bciXM!Z94^Q$怠b0X)^W1Pls$Bs?-K87lqF<?'-r]X'fUJ2mf|,:t/Hk <.zm`zB{$b\=E<4uBDO7Wum2@\> a5 }p{ ;^%QQl:Ba <{"1E_\.%DKZ~T}wx'fr23Ox~cfV@b(]}5쪥rJaZLOkK>߬Pr˂6'v{v1P?^0њj=nee1] ?mՕ>|<9h0)xzbTz?J(C=s\=DZV {QoƐr &kٺ@#--kg/~۷z<~IUłH9 ./V8b@hoD1u epM-Uo-|/]d? .$*S=_K@K}PB~~qNd ~~s}?  }VkJozOZw}ǖZT>E>e-+$'ORI JUKvhFB|<0m/>:e[~%MmV" R]HW tJ[ZsSN Fd&kmOj{l:i~m1Dʹ(qkBt4IbEtm,/?Z7Eנ~4scyi\qК6Oo K==zY.YUB <}һ`~׾=AݨI a^b$)4b+ ]>0:V蔣ڿ,ܹC&_ıƞ@菩s摱{"uPM㽏Ƣ[PFhpJ_Uq|R;_/Ϸ۽}b|}Jvu>ʢG?-[bLeT_ǽ 6,>D\4\Y-+4U]܁e^j{qf4_+*O ߾4\DpR E?ﯶ70Nݳ'*xƆ0.2'^?L}Fɖ& .+ApXwu Pu|D1P5R1,&aKMa> ,NL`9-; b}߿GQ7&!nIf͉ /!eS➐!zgR'mVm%Aɓ g2ʮҍZ3M-R&iԒ6طHTd)E.ڳQޥEq+]Zt:+1OrbZ(/1 EgOo>rJ.U-l |#w&ݪZ)D\mx m/܎QAT6Ԣw!6qi ݖӶtZ}ZGMN"X)qw]a(6چ@T!{R)ܰ"ԏ$&$om5){ 4zjRZ7}S wby,tk6GFCendstream endobj 216 0 obj << /Filter /FlateDecode /Length 5532 >> stream x\[s7v~G\y&ĩJk2{F"94Z/7sA=h^+҃P s9t<xˣ_ox#E=]??{4&u|?UQdʞz݌j0)VߟʌzꆺS Av}2qu*%"taTs0l: v:nʍqNi#9Y[kKl:acq-uյZUV1zÇVÞꌿn_B@jsĸz˫s6 UCJoNp`Qfݐ&̥OeR@ޫ4x?{*ى w3z#Э6LBD6 Ϊ1λ͛|]nCmyMM5wy+{L3z_d"XbDъKVѺ@я0&J4oݠV}i9,SR*x`FJj\#UJ3BIT{V$XH掷6eaYBJYކq6o"$}wG e@c<>X]nk/UWnC\k fd?u.ҸO+I2UDU! Tu@e?8MLL&N{&}]W_}9jty夙Q.SwA{Zw]nj!wP^/6淵]m~^>4Y"ٝz>G#,HZ9X˧0 C.z(dkSXl4QAnE쏽hT! Nۻ钰/g0 Aw)`C$ $_AĔ v4z jBe\tkyt{\/jS;RQ:,IQkumxS?y;=Ǹ[cW͛6jp./LUm*D ef_uŜ |TƖ޿j~{߄4yxaT|sdgЋM)V\ yκs &FksM1ۻguWv?s^79ԮHE3)_QBfB{݂ Le?D,|ߺIekw}tCPA%pW>h&Fy^Bjy/CWॱ/blw3teabuW|^`Sˮlw"Qfډb~xnĜūOg@|3,`vhEvvr:P==z5 Be;ZHtsJaSH>[Ðqԉ &M(S.:+V)\r)zg;ׇ1PDX@ՆjZ1%co%G11(0%0J{jݔ_)M- <#z(rۼä7Un)9 3aU)">=n s+6ḡG]پ,!.o6TDVfZRxSᶌSB```<*:x΅HT%QAxTԡT^ʹA9ւ8>=u&w:G(*8*%5hpC`epWj EXetH>Zw[JP?%$o, `qZD&Kž=6#Ik&p%96,>L ?#[P5qri~ L)JŽl9#wB+1fthPC2q'9xP52H:)Y2>4]H*8X*bxI1:VDO++ѽmDTVdR-TݼAp#6G͗+أj߱ĭ +@;#KJy`U`鄼󹲣-nTVPUP1:Q7HM{iܲ!.Qr@.ǁEh[3͡Gy텿7p@BN6궓& Y6X(DZ~腮J#%ViՠERV7*f?u2;jvvpV6\=:%dE'XL+͢(b"2;|^-/ O,%`fiдc/gWyO Jrɏc_o]xvY‹1apcl4D `Jb8Sz6 >xeT8:ﭜ.&|ުĴ ctuXg(ksQQeTeWS?`!ؘV_*coҒO5hXyuF}(T. )zl)4ۼ):#^l-GN$2h&11{VP 62  .tR{m!<ٶ:/q9i -@ʛ-jN`ODP*I7 jĚci) ّ)M9#8IΪ9C4aL`4Sn54!7GUP?S.g>}gf'\l u\:8Xop`) d<9 l"=j'_iG)4"NQΪ;/Ҹq'.!dB>򎎪`߰;r:l)!54Pưi_';qIr@YXlIhVx=\50,5EWMo`1Th8GAKGXX#ĜPySD|mP9I8qFV RA(YPwmtcv|V)F[ ,ӌzI mtpnO*0&c7w$hP>:W^390wZnH 5@/LKAFd;ڇI<F}OϞ ieE9̇3[,YyqY {= ]벚+MF| &ٳ2T 3=̤h^$&g,Md>HrXP}k}BKe!WTǓ$NbR،IDV hA.lӽ?aӁ->=c~SScfٵ Z|t6}VYӉ+I]QI Z%SOE$0մKcSͽsc\p;"D 656|hbܑJd&qwՔ#RH-w`h[(8Vln00nYIJ3HRhjƦ"\dnaxSSNA`&aÜxGY/|&q,O G[ &PᔬLw.\mC (Оh sث4K04" +>[jʜt +'9LU]HU]׳T`1Opͮ1D7Z/ddZ %.JJnD i )""x^oU4"m\&L O x v4REuSOXO!M^S&&trH.eGUacdST;7D}m\^^$ALi 7vjԉ_.,q(U¼৅t` 0: q^F 6aKS [~\U DI.OJ 3IӴspJ]F r]jFm^G(!f |!Ŷ"&Lo7h*uCc揔?0V[ Xf_磥fC.6GW)2U [(A劺ᛉDnCԩL yIԯDm"Oziq`39Ծ2z(I* QEov#L6)=l{{onm 퓃M# f7ďeUB.{fI+THX?yFfdwW[|^! j1hۋS7 'IY_/U=YADYbl fʳ[[Ȕ#ކ] ]sR.6+Ta2!٤}_4"\H"^h]L-ܺʗH&9o>ʺ/o" ͍3I9V/}x8Pga[G>dmmw\x m ӘTNi/Woţh|,pc MIeE0I"u Å FTu<)熧T_6N/[6Etyb\rXN!Fi"M#f-t_j_hGf @b E`% <{7:-> stream x]Ys\u~G!Unf⇤b{+{q#J"fS#˿ ?;gиMRrX>W/oΞ__4˛_/۬>?:u<֟9n UY-V6ťF\Z9oN;e ;c4V[mJWy)|O04RQ%\ˊ櫶mq „mNG<)-LL[R^[Njd2nwD`,lQ,`q Av7_cߤ4L@uyshkJq<򋫳Mx٥sm n0JNr;u0-՛ҪSv% zK$åU>n=o 2ژRXvL|]J'ꐸs_qG8W<ҀpA=߼-P *xWt9?[WF/F^+o),jVAi4z8  Y1m4ifDzr Vc'Te[yrn@p)!P{曲Ҕ1t96_?j\CݼfjFvNR5]+0MI7"ذ҂BHBﰨNLUL1'oG %lJ2=b@JrSv |!U_<1O:7fFeKXTn'T;B)*8.dc@ˣۿo䁻pPN6q(L0}G\9ʶ:D u%W 11cUڗb@ Y_$>O8wͣ .RR‹D`nl`\[tcK=w&ciw"f+x ԓdjK)=-aM8 2+:,}Y߭ \Vpx/YD;{K H.J8VUm&%PAMIeq?=? @" 4o.4,ڦ/<"VhU@;^^/*[1рhFfU{6d4k#ٞcDˠHc@a ٰs"ltyPcѪP$Iv%h6狩ߓV42 -<2 x^7OBzax3tO6o;l7*Qv\H'S9պEj8kFI .@jwhMъaO6dB_= =,3A8E+:XAiOILDB`/}R^S'DKiG˧ &ڪ8޻]Lh+lf!?a!J?6p։xz.pQ #ZJJ?CGbєKiN:'\2䉷ő'܃%HJfAQt /tKYxt@D#g#+7 h1N f1;XINuWp;i4\zwޙh8ATHҋCD_]!1WL;-Lb+֝\c0Fw Eӄ^{VX Et[QJybd ]N~k!j]Q?r#LEnWL PxXwG~uERkh5ƯLkTo xk?o|1Y'&Pd :2ճC!$&?Cp=H.*d6ŗ/~9~]T)Pv}S8q4k< D4>ĩ+|˗/9[mkZݴ`:״Ѐ/u"ƉF C''$L``2Hi2iq%t 㢜a׵ .J@WGɅ?]`L0P8V$PҞh q߽r\EeV"s2,BV|^ң1)a|e uxh^s;UR[}k<Rep[38wA_N5QG1#CwȿJPhae7 F7m Y Q2 c!ZU@6%:DpDBo7DJD9Ce2@3#N%WaX{lUvzö  ㍽bEWRNSIE>Cի:q| w+GزEiA1Vi~H-.ü"ZliF $9 X%ZysWJ1}`C]⻢caf˪g]MhV Jd\sFp]gDa U*Cۍ~ly%-(c#cS3wP􁷜҉1-WasD՞#T}f{,Y+EkV|/CIQ+9NO}=xO24*J8i3Ե]th(e <;I,z}Kmj Z=YJS$Kia4됖Jii9Kub^PL8,m]/D%kϐ-I&%8˃܀s,<Dbԃi{Xf Sj`S]]qa.A 1l|uQ?R%$Q𸳃Tm&ΔGـNL.9肼E+Fyk6FԲz i''^PK04`4"+zU6 sI"hzT6n4b ݻ|+s?>4SD`z?'ݟGx\ DQ,Jfdad ]` _d1ΠΗ%իu'w Fq7P%j/?~W.]op_JKv,1k^{er-#,EBt\ (@dD_^J]-F$ Ø@qJCDgJ*&5ɡ?.赂ٵy"nSXMRAgݯd 4G_`|h7oͫiarm/[5Az'w"wݚ[5)DifÁ> 5CA;f =9NJYDP +^>>NjjhSh)θR:ל˧ve_9 f#mP>ƓCqʰz3j UV1 4E 4`&AD.6PTWDkiM͹tc+i}k^ ݴf3_9ϲìDgG̡s/ R W"sVTq47EDQ|sxIƊ%Y-8WeJ!P \ǒ:;፱XwJ:1SJn:y6Vxc!S҇] N!zס'v O7pd*vtHgi8;<Ԛ^<Ū8%^zrY#ZTq'Ozp-yEeXɞʇ/bp>{4t~j=75,|7mp{950g)UjŻKQTJ"/y\~ۖR ĆJ5J,#&v>qT*$dP̢W>&,_İT:J: mb865M&j"- s5iz 6uԵko4Ql\9м=%f.+~Qњ.M[7gъOZ'ؒo~Ek=U?DIubEZSoD#O7GK<#A9 ˔w剦E%p߮m@GA=ii0WH%T3(O} fZkfjiƮXԮO7X1BO*BCU,ZUҗi!d{Y3qw:W}|8'DY?E}y^(ip[<t)Nј0) p ܅tW8=#{BlӭB=>ǦDv)Ҍ].{lpڑp=F#`/<˿*FT5h9 ⛠v4'2-7(~7pfbیivY;z+lgZVlzcUk]k^fv +ig&&|Cٞ`o<*G(MZ3Mъ WM=Fe|ǃ$o-d}[F,_,ձ9}Iлh#2ZzG%[mVy/0r)s+_>cǧZ@eXCSAUSC"Xmż~D>*O"%*fyuX9Ru _l @м&> (Ch'#(e95ݷa Bu~+R|ٚ"5ZSd򳕜q(A}bZ8_4u8cJw L +Hl< l791Nay:Bmeedk)݁gtrI&|V|TP3ۮl ҢTn6]%aGň6!a"(R~*i3"=F|O\R1.]:JɧĆ[`TwϤz2UwP(+Dt{yb P~իm~6U'KI~*\/(F@?i?/GK-h?f)=&yZ}m[5¶kmk~3]0r-^,Xą7Z06OzA.uUckʤea)[~3 AVD.i cD䛩 u#|oXM-0]vWW65_F=. Z0% wg߮hP1 :<xkŋGW0 `?9}DxC*8®+8>t𡠊->@^ K^93hu;/bq.rO\朷Vd 3/R5ew(Co>QJ -g^BLurr|zݘJ$~JW 1ݩg'):\qZ0D2 2`MWLRy2k~% cR o#4߈c3x5!KHeЃ  3,u 枣'#_HW<~W)*h'`^CܗS2|q0[9bMfwmƂdn!)xP-3>А lS3-cB'{ma"t=\ZCUT\?J8V^M&Z ,8;>v{ ڴAɦA},YPʁopLh H[XH юjcj"<@>]iH&ؖ'n8 fhp,B4fur4j8plL;JOz`L] zю 1 t r)W!~.-=4I5Pږ> stream x[moG+|h )B! ڳ$j$;9̐q.RG{\r8 ?,D/O.>{fH,^p$Er1"ˣ\QQNUcu0r%z+{a2DWuvX(}DzRZ}NO"tK$ {u ںΈR f2F(Kl*"xRVW;)tJki);x(+x쥓vgM\D 8u9./v*s͸JBAJ>$q㣯4p#(OGX#,VWqqy8z@G`W,(!TCKg!lF-{CtF=0^RDۛ/8_-JiSZu+Y)pߝUl_lwo|2΀DZKLZUҶH),9miFW1q<y}ӋH `{ޓbziG򢐧9g`{o,X`3dC1YfYq:-Ŧ}\vUX- +0D" 8TMWK>o Mݭӌ{fv%A.흛2;0(/}#Ed :Qu94|JJ;>uo(DD>uçBz3MSZRr(~r_}F H#)%N r>Pg!`M`@rhGV_.ՙZ5m a1AmH&TwDoBlVR.Sy!@WKf&'7'hQ"@lN]hM W\l'euf iE_d`ƙٖbet K$t5sYrQ(lAD>,c$=f+ΠwL'(Md^:7Ǚ\8"I~Ԟ7[*8': ש,:&^jۦ_{~K^Z#`8g%A~T z'\k_`iɶeO3\NyG3M,[s,n4ؖC&|͹lM3척B,VQԗ፭b]%sɅIk"Pc [J @*BXA+wyH~$j~hZ}n r>*!(}S4& ]Qޓ"?B>/vn愖eṽT2e4o~ruܔ\;'J#v6'kUa@`ڿ+.~mu4Méd^[>0Ԧ)H&3{).I }38~Na=|t44<=sYL_JN%0ig8O}(-]$LCu 5hZX¯CO'w} "\@U_?( cje=jsa, 08w7iBtƂ➢vӦTNmg `ń|_|?(OxŇDXN{J*df5py9)Yv@( P.~SOSGXСs ,kE'aj 97]9 /P9Ir⠳cU3m2 xrKjw.$(doU5aDYE񃑓τ?%wZo"qfٞ6P@ H@SͫbtC L亐|ZHڦSgPIy^ȋBr<ͩK~<8G'(Iendstream endobj 219 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3211 >> stream xWiTTWeWRi)(J5ApDq6E1V1 2׮EgI*"^Ԩqi/ѤE[W>zY[gZU랻߷R0NB{{Mw|Rȣɣd<ˇEE .N-Tw+C0w f .e>1#9Fmp1kYSޙ>}ۼMrLD?I3n1C 9ӦO KHO~8i[z!m&Et n4n}yN'$4nHMa1:oOoraaꢴaQڕ1'',g1xf6Yͬa&1kf3f|/Lg0^BfYdce gTX$0gPS:pgX=-j|<qn3.. ]7ʅ*SdMYRބW)_:#K>q⮖B\ MWǡ.ϸPát@e YL+E/p*{ HaÃpLñf3HȡV"?U%DI At]2d~5OpAX ; tG J.k8L)ǡ^13D@?CqăoM$I_MUɜ&+Hй'՟@;4퉅@A.;&;2ʠأ$3T=^aؓ(7G\vcE&YOa$d278\m;`QKFx, !+r5xkgn_= yۼ_g2ש)mdclVŷu>w}c)ǁ?}}భ(u;G|\J(/:\95~rP\%dq[vCHc*8JU²s"bIiĦH s*aIZ ֻ deX{g'Ncsoe.e$hoUJ\i#[@LJ7=hi,.pcXT%s7)8N:]N%y6FES7w+>rҳr5HHRvucS;Zs?죓,3o> j6Cf8$,ٷggq질:~{ձMAek4ut%ifєi.vVSGJLpndHJ\/U"*5^99k_~E[%Z *{ %E !fڇ %6 "bGcRArJ-OZ~ ESk2k8eKΉG6uqѴE] -jA>补 e`-j B8]SAۗޞTeA]^=]S`K yd3δgj c4bD%zJkCG5# m[mS/zN%cbς\=sn2?u o]?]sԕp Yd l A 9|hF ~Z{t=Ek@_^ks7wl%Me?,ԣsPMajzw2 r!z:^:XꊴX% ߰,dZ(g?^'(1FpRjn?ak>)ćޯ˯-t|t7m-d?CihkpVkp U6H{q9ܺ؜'0ޚtDIN|w E96b-8:\p}%L%v+À?vwÓ!J:etˎyNi&,L5U( 1HK5"ЬJRcm!!̑(tީ8z~3{.=r#\z}߭ϒWuǁ-f/[fũq4WK[!3[$Wz;сC8Uhg.dy@I#\V;>u *{jT+Ov`'tvBW5` ַ؎T8wJb]djQ'ۂaC'@ '_xKb|XPlrwTQ뼅*`%K9i2N*] jrQ1fYendstream endobj 220 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5489 >> stream xXTT># ֣bh;VE24i҆ԡlK" "0X$5Qcb$3z͍F ] 侕Y,_0FD.wX25ßsqAx6e^xf%'lcfR03:긷FpDZ?*'c\;;ۙY. p tp p -<|¢, 9Bgx=meofP}P`/@gZ?<+!+$a7. ZʐUa(FEpڸgӾ-~[6oo.{l٦ 3LdI&f23qb0Vf833fYbv0+ٌ+glU\f5Ǭe3יdF1<3Ìe,WqL31gJL$BZƈgK6IT6th7SˍeBS63qM;M']b9Vsl _0m?F>rȿ:_=mt/S0F7XR1ͼ!F/-{xUP(:EE{uPZHZ*^:P~l /6G bcfhLcxH19(31h%%R(^s ZW Yd`?O9a`Qz|{ez"t@jkB|WUz Nơ_d2^J!hՃ- ɕڣw ȶVU}^hJdL#_.80IXx)I|E'G3,@3XA<%'ḍY8m?ђM< 8xI^rTCropWnyOgqm%&IWAFdK$d2KqjGѤ$9@Bkd&ZWtŧ<BjZ*%-xo7pd:pXx}6E --!ƽmJOrMz4pJH UQ˅#e|ރR8 l.T蛵5o]|8]{(Zcs ب*KbU/k8"/P%X4ZMfA A! n nz 8A_uDqqG !mR'8IO&LcjmԳVw>~̮ ׫R Sz,Cː_h[/ y& K1 Mko(gs#v_.޽aђԚ>fo8J`^|ߔ,c=렂rш鍁H44˼S^SQFOm>6z=S*D^/Ds>(3 pz[wjw2EMJ &yFzYz%= WȍԦTE1hs9s8zJV8GJ4.,D="laGBo";kjx M%up{dz'dג]Q.>7Ph=>$#!@u,;$4rlǎ4jS،Cy4&m140Xf8^E+ Yó2U`OSލcIqnE%dde:t:I#AxCbDLRljU4J]n5q܃%y{O>\?HP U\gFpם;2h[)_R`eцl75J,e)~<9ghR2M!^ x :NWt+dzg-{m-)+)+.v>j} Yxǝ~CJwÀ\6LUJJqOT1bP`/'[h S'^K* ]KY9W (UH?iiɚ4p"a8Bih*SY(wٯT,mhtJߝnwv1fjAVT|A<$h4q)*r9TgcpL%uFQkii skh>|aԁT[\6suzF|ax1xD=eE X/nE.|G-J`Pa>Xը Ѡ<T6z!R/ *nnzr݋+Eߖo=Gf=b'??j-">qحZdȱzKdWv6J`hw)Ƶ Pdl˓WghR) #),jpS+{g mym(*=1asw߻ͦẓHIWd5SI/?̡i?>9}>w ĕy#guc/4_E_,dӚcE~/=^oZ]q:OI?h5f`t{ܳ wkkC^5_m v;h*kct\M/s>w4X$)#6RS+`'=FHT"\9Ocf9n' xE'()ߺ˫޷U +:~?[Q:<qA=lÇxuegPu.=yr'S!d(AS6`ё5wU&!QP~r:ˉꦝ眏&{^T N|#c8%IДBF/ޱ kj.kl>C" ?6ӕs>͹ůãE r.J(RWRYfwǽ!26S((/)joHϦ>炘DKQEQ9 ~aN;Se$Rn.Jr$PȺ)~S9Crls \EՠR:GX#iAuZRjr*5$d-b,*?оZW0,!flv [Bhw*13R3 )w~ N8M{xLO?Y-O/-ZbbkUեk ΒS6<_( ti.tK7Bz' 7ԟ}~L\-{=(<SWZIm+I SptaK1PXIZ| &[,&KjqDS~4!S?qr>ꤴ!>%" *+0"_ġ3/gX[&K%1&iZ.sp"MƮuTx@IsQDs)qc.)+]٬%m\33T I73gBendstream endobj 221 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8106 >> stream xztä́bb dDoj 1`:ƽބ-YHrU\m85$@@B rǹ+&yߗ޿XK [sg9g}cս%Dl2) ?~'YCY;[C/!w)6~rK EAQ}‡q;d3:y! s&M61(D 33tǐACֺx1ssQP@43tȚ @/ܺ0hۢ!KB- _.]{eHQk=z{ٰw&[&O:f̜5{#v3l'LӚQlj8CS# (ʁMmPfjzJ-SۨEj;HPdj5ZNQ+Utj55ZCͤR~ %S,6A l);j 5L(b][@)kJNQ}AAOj ՝ wp_huQA,ba='WJ%?cgT}7_imv\??b׿퀷Hlٶ; v^nW!/9)AC6 u0lְ}?qį#\1idȖQF]}WZ'm3+u lj*3b@)OFmuݤf Am#MU>kjir4Z4 Qh堰 p`Οn]}p[T%Q=esXdXaȚo#o"۠nWèzrIɍ4ǵPE28,A韮|)wk@(0ȁ`o+-[ %h #3ʬikY)%欴 B~6A;u{k쌴Q u^ ᐨRȰϳ,ڤҥfAj#\k4^ZӪRhgԸLӢ&8JwjuihESqVS.4nDIt$ zwn#cݾ7 }t—< 廱HMk3[9WaUgbie{Wh<„rgnOajڴUP U $\:Ni90O!}K/恫sBѵǏƅi ^2sgYs$4PFY!/~)lhW]S784C 4ϗ a͐YRtJ/>.{:,a(3q2Qё| ,^#HiV5na۸ߋQ!yx( ~QAҰ8`G`}h_(\µFTW?F ] D]q\PQ( ME qSPBPV&@",a $8Jk~Pxm>Eh,1U۬iÿK~M@+0#w7@(A iS# *՗k]8<΅Tt ՈXh@ BlǑ7bQ* ;(*xo Cۜg&MGq`p( ؚdz~FM!#eh1@Y^ ,bϛ}HNNK&R$ؖtjA[Rz>g'$I|<\Hp]v`CUC-}$ea`!Tv*H甊$ҳ bI=;UK%u!5H~ RcR 5#*0Oq,/= L6dJBzZDtUosOd^Uw⤠x{:Nta[_N,m:9Z<OŮ q j9[.CAF4LU4t?EÍx8Z*R2VHµ4Nȿ|D*PaSmgMp$B!lqwT''U*]`h%HfiS!Ҳr*r;(hF؇Bt a'ms,_g=UAeA]q ?Ƶ[My^_G7%Dgڑii}9/B/q!WȁV&bGrpT}4;Pw#,Zde8~YC~ްvuy֌pH|٢B.C| \ va2)uSzN 8dj٦e!:=266` P"o[`Qʊ'ILb||m%ˏ!KJ 6=Z= {҆2fq!G^-]f+,̂@k4Yխhxa˶,ﱈ(op_N3ׁuWNN"(U\ĕ ^_tjH _yWc$lx% #̣Q2.9Z%|Fߺǧ.+-{j:Xդ#@"l=Mh$QHgV {t~%lDX%#J Oa7b&h)ZEӐ__F}zgIkt,Yz~#!Z/bCGtR%(! /-,l߼do q e W.ǨE,'BuwcH?,EkQbUX"4 nwBiV6}P¦-Zx/2>d߃՚B$+0`tx/6TNxe}6ہDXJT^XޅUdL삸aY#!^A0(kc%iХ@nP[ ,^_~Cz]~'+C[ .2ZIќӖX\R&_&[;~CWI d1,0/yH>#{ /$ 4$íIl=So^6p-pS;ߣ$E F+EHɿeeu֣m}È"oB;YsKLpL^RGUkO3)j(S%I#;t,O֩HDHt$djui\nQɻYQE^Zƈ%hrÉs: Ҁ 8ӯC%_Hl/)ߍچG⿣ C|aƲ ҵ-)R^#IH ;T2)̜9~X` g+ w [t/xEKźehO 2HĿ2,~O 9q2A=-v5F—Pܩ{1r%^-;~'f6|LlY[9"l |E)*n늲/ef܁|ROw,f.H}AX#I9qNNeL(xx袅)3|,:~.k&ݹG \qyˢ ;}8},Y6j"[`݂̞ujك ~)+!'& u֏wޤʪ-6JcVNf֮q8S^ 5\'N ч6_G4#;,14V-HI}ZM]NׂFejrYGXz? N_D hSؾݑ Mʖ%ȹm˖/%ư-xw!gpܺq1^${Km1#M۔xH,')'GlĊ|4q~ ajˢ-޾c~A곌EG3Mx@p}}-,Ht|+R(lXIDo Lx<C0)z(j(AR$EށK9JV.]xc2SReNJLR,mW2gNaF~4}h!wD'NY븭[4/>>W$rO?ۜ~Vz}QҲl^\o.+om<SkUWa:I? q"2X.&**JbteH{Cv '{\(ւt,ܑ=3D` \ (wci=‹q_loG0b?Ǎh3ӄu GG2$_n^HcJvj J4&qn*y0UE{mlY0܊͟?ݦ-`l9[:ka]-Z+F*hD.'Rњ"F29^o ^L]V PkZ722ðaߍyKR#7!KR$BDeɼٟ!EY\tH]-*DMRvvIum83.9!Q|%z4) ;R,e>gXSvb4?@ȯ$oYJ S8O.;) -'GgR72ExX_Z'2hzL Z`^uΞT.!=قB/q Ɋ~q5t*4_5IdNtHhf׳Nu츌adء?]MŅ7mf~NX~hʆԠjC ͋)Iez~Q1 Ћ[mq'ף̲^o{Z֫7E__endstream endobj 222 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1470 >> stream xeyPSWㅗ!.,i%*3ƦEh(Ѻ "D13RǎVRkJaь,2RjZ0Ӈ{gw($BEU a0GИh=:O4hvQ󇭓a)3  Cpd F4E6B>3ˢ J 6-b2<4trVάO*,]"e1]*,SdHj 63g-Y:s.Ck̵(9:ʘcʳcΜ5LfK^Z[ZO6Gh>Ҡ@Bh6ZbPGMF H V JP#b T5WW#-t#DN~/'%nl'D$n]՛>"&#n^I7z`b1@2h"7A0^pt6Vu|n]Sk!>qY ǯnN`XM>?KH`@a0bQV~/|f\,' d %H8 $)&0I-)NxHsV7 /ocɋG/!@4~~R~rE]tP?":r,{9&qb7`MA YzY*iLYbX.y27C,> T? d$I̷imz(W|kM~l,_e;y|^ 5Ltrܘj8AU޿޾[*Zj14@fHF~!r2Nf˹5}3x?bd!䠠{짽"?+evg? Y_[Y%KWn)_Ք ZouP@wZ$-!q۞0?^zmk ]9v+^}߿xT)~O%E$6 `ȍz{ Ŗ m|j륻kg6e iˡjoR?a' z;O ^?%NO aٵ?Faǔ԰2>#tP^#9Ҏ$!͑-} hHc7Pb4kbbjBg<hDᏙd +DC`ʿjnvNyٔ)f;5ylP][UT]K'̎8M2lo{.Q϶;XO_WrŲ+N9y[\+u˫ {*H{P!} rX xWD(bc?lSSpCV+.q49-`+@.p8!;'˫5`Q 'vr>tKNendstream endobj 223 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4561 >> stream xX{tSUO bJsNFA` XMKӐ&M46i^_&}%mJKi R) hQgf3wuN982Z3&k}׷ 0L5wnXLf"`ew#&+~D c La M:9= AiS,&3WY+(22Eq R-]|٢gyfyt!/59Y,ۑK-x)S$dIrNޒ\ao.Dq҅iq$Ǎot59(]97-]g0Osk D MҔ R7ښۑ}xwN %IN.nSW 5Ō}%u132^el`ld;1OJD?CW>ẘ1Wə:wj4iӿ=;3c"`dq2A*Dk8=` SE@0'o>H?$O<} 2N~-ՠQHGۀ7}!wDhgpR5%AHDib+b7L^*^Q>CQ zYTpT9ȘގY; sz9z*͡TAO$m9iCT@6ܚ$OwM~*;=9zG}XO3%JjlZUh02^UbSГP9"&z-@ /7~_RO)ŸpRiry @g' (0i^ qZLAxf1 z敪!STr ]dmh!1_iE_a}ꄪp=S7gZ ̾}3O??ڷ}m aMv/B] ̑mc2[\`"L֠uRh u4"~teLܿ)Ǯ8X k7 Yȃ:9&K|6hjyJ ZBU}md.#A,#U}iUY"N3F"U[hЙw4ooxoV](svقlgeYtRr gjG1'?]Y"ckpv?ZUV!uj*{amEd _!coJtsFk1~/PYdƒ^2j - 6nV,,ǴO=yvż^Cwu:ȹ -=P@MO]Phb"- Z:Ȋ#s8f£Kr4||DsXre!8NZI/(/g%/xG4Ⱥ#a\?|ѦZrWwiA W{qAǶj4KIk< @ۭrfd++2+8fTH֧@ $YR<jQOяvJԯ7 T.K'tB#5H6cՏY^%(^hr 'T_ؽ/;_~#Qer$ЏɫkW`uk-k:?!NqVe/D Ʈ!kX1R(LNyYgT9AuAwX5qݞSmNG!_8}m?C(t5yBC8t@@PY6pf[%Պ! MnJvQ__18ni&h7FV?s aR:ay:rd 3ì?'Rwv3k_1=K4.0ۨOJWrRueWătOBa~VZ z{΢Gu_IHKB"t;R.%g\S`ƨu1Ѥ7* 13n$ԢzrZiTAUwڬ)`$RF}q suM@Sh~Զy8jmDlQ fucG昑I `EfFZ@ET%"_lIisU v({ =LV[lzQ/Ր&L&Hu2W NYC#utz @엷LLT歇r" (Jw]_%Dw4X񩉱kRw;IזwwX9 ZB{6} l 6G3 %4uʙ@Bܝ1ޠĺ;-L =-pUП^#o0x4G=c+ߑL4p*cA]%{)ի1)fC1nrč46G229&~~|K@p;`!з}_LzN=A z.c=B#3Z9,%+2(bNY^X Œ56l A5T-ELF@/c8Bpd3Vi 8Ur_CΟϣql*tTA~^H@搸rʔV hA Z541+rgw( qc'OZ;I8X떹 Qg(UA`e_CvR# ZNWl+ N: zǁQvw9腯,n :jEŠ:9Xu+" 2M8}ĮpCJ}Kw 7`(hy !ĕPukwJMB!= ~`(%~)\5O'AjQlZ&nP(Lo:1gUtfh_i&Ec~YlQ.=1G6I2xʘe~E0oX04+>N2eBi~.z @AvzJ sU$bF6Z8aXR/傆9z~Sq,twz$ℱps MBOakyr`SO:UT(XHt4c&sesus[9I]soOG38u!Y4r{_+T_WRF]F/񹪸CRhEy*FJ张R<]Iզ=e%c8!S/ վꆪF$gh:8ypd%d5JbѨ*!w]]k`]xfI{],z9G 3+?jձkl f7SE=:ݠ1q*$=޺fwYۮEgGFMfJVZ5Hm]Z3_ G W1jtb(-b w݊xʜ92/xV(8ӽcnzۼe'Cou\_2 gEVnnȝS cP[ _GGsv0//Oֆ!r\o;N .3yl^·m\ЀN/Dz.攰DC}xN{'0T8L6к\5@>|n3Pɘfz,* &NJN7dxt133m˽VEnv- IsČāL>25" q:z,NpF2\*2z!@?xpHk58s(T Ll3}!ROT}: Ӓ]H38:jı[-h?^h<ݏ'ٓHJt.:sk?X!T%B<);{cWs?7_ h><&2ﻯ6- >@ob3ףB[Q>lu%ƴ{SU}aozUe?I3Z>US[ցm B#c]_l~~zNo)! arBvĒDe"$S/V1+گwK}փr3?);jF,deE"o5X c"qY d`m1`d˃l:3)CUOtM`?ڌendstream endobj 224 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1102 >> stream x}mLSWm[-m7ʔ F /{@-JrYmY'N)A^$v l qanvK'm3%p?9à8bFSh((537KyJNW؟b6%lI,zNGj;4.dOkR3̻@vZ%qe*17?jqmNNⴖDY̒2ԊF{"ŕ%ɱ);r1؝UϭZ-RRoqg$ "+]3( )gB+;-CȈv]hEyHEqfWu_'t$a0lPó«fﱔ>+W`#h/__NLv9?=,OL(+*Y؅JsBA'OG0s aj[8â7i25e,~K7XtLrgp{Gĕu͐ ^ql6QXɐa/ Zܾ.]}k꛻j=3tsbwH{[PBo/͙>&#d|]v(®:"| !,gwEX#k13@M2z2!môM_HSΏ҇.t9=g­5w]{$pedX7tXf&X *uw03h {p=IJz7VAݓ_&AP4ܤ#t8ŒjsY>쑛˟.$*O7:;_Bs y^'݂ $Rx]RR QE  5 IZ~ e|@.)6|O"wV ~3hBzvFLDRb"d-J+GHD^Y٤dTae]3l8h^cZ'3\ |C^񵷛\3OA!u/9di.im=e.ur*k kIvMr!(?܍]_O wkA#endstream endobj 225 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3579 >> stream xWipSW~BaI,zIfw7@ld0J-ﶖy nyCtBPI'i  L&)356R$gJTs߹w#Q2lF|+MIO&9><xOeAB:~u :$*=AeTiijZNF{gD]p##F,Ѫ3&DOPkt&"6uoZ1=Nh0;A9;5c3fEt"63Y}+RStꈡDg},Mզuꌈ)EMLN]<#S_cHؓw>ĘdvѬBPSiT,PRۨhj)O-fS˩T$KQj5JBPT-;S>[~7huz}i3+Fhy2$#G#t}0zUODI\t'bʑ]QRdQeI+ُ5-嘓ޔ`фwm-nL?U4}z}}s=udGk_u0G ߱IxY AI)/{W/(?oY1;nIz*, :I7WMCq<ė/­\֒%a ciA_݋0~SpUF|Mq ٜ (Q(e.#X<H͆;9y~98 f)'|H.[/})<a+|!%RP4U˱I: Dg79j鼙t:lڬ LX/ r4rYFhZR Ϡ8W*|IxъW4ݳyi̤a(e?ukQ"ނ౏uT|QqF>j3gS8;'ijO ?H&ToW8vK2_z/bF+&M)Wt3E8$Gxj`&.݉je (_O?蝸!I(g,8wתjʏ 0/H/SP|\tn4c2&mP`E1y (9ޚ`mL$.c̚ҭw)5`:X':KX5c!ݽ?(sD!>SfC(*6G3)FLn{-ILﻄ,. cp]| R!MLLHM(R>V\mAn9`'0[-m֮jH$5Hہ|tOrG|O\Ь <˲B)yY -Yx ߆;W P"&l [@[txTNjSP%\CAfv'*/vK(+qU7r䀥 p*y'{#E. k)+)f7ʼm3\k,Zr*3EBy0otlgX^A'f<2 f3/{kUՊ?7_Be= ^TX:130ێf{·$u9:Xcâ!iY#îmNwߙ}}LZ+%4b{6XS^ Smg9Vd%"aN% pOqw䒆Th{iˇHUww[ J ,%,QPv:W^F+:^1}no(ol%"&Ѽsr2uI@!d8*Zi1xr==)߼5i0)u},zݗK/Ic[y(fVڕDǑEZ5zL6KUWn:;` Mx qР:c}xFai4"/B)~̔585tTP>T |.p 8yE,h셶rPEzf? wy]9H$=L峋.r=(JMGљ`"~Ou_~\\t2x,!xy{pH񋲴Me`$nOy}UD}7fcy`C6hMu1U4 ̝:Šޥx&q8֢o!Ъ[TUD*cU;:\=dp;=/5sfɚFVX,)?&iģ(ËQ~C;6rTgCskbRG/bkgg15~$s'r#z#CzN9;Z{ -m>?xRKtz:kzocfU,ɦL@F݅zZl;iDslJ(B# X*f|uwEGO}ZrO`01]@R?崗}lւU"I?8[ ϪOھdCpd;X醳G>_d* WU vh3M&bZ;emRFU f)쟾SzX-rj@nUEI!;?E7_y5bE6&PXl*b<ѳi,BƐ_"1e[Bl|WI`NY1c`{A$!H*eWzwY. qK1y?cЮ Go|_yAJ} O+)&TV_jPmStfTe%i]G[Ep\ZLPQ?q8N 7u)=u^O\P?Tݾx(k{Yfc6dZKcw :/֙ޖ.AgV[,n##~m D.xd' 36^_*3f85(#U!ACG?endstream endobj 226 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1055 >> stream x-mLSgǟrEe׭AԨA-QF66CRZ[ 8A&p#m6B,`| *SQ0]a=.~:|'/C!*qa2mZnxh$Gh@f`SE+4$LMBNC6{X[HWL\& RUvX̥RY)f%xL6KTHž*6rŘclKIXʖwˎ2P`+UwVYzY4LYNEvHBQ ;t%ĄP2h ZRzQ<$F!Ȃ3NpCp6GV ~15+O[F0t> stream xY\S۾1psU%*jwpUP(N 3&6찗"֭8qojUZGk$~ {r&PݾwS}29 KlVɂv,m6:c/P&qtRw|~ |!_h4da;ص]cZu>'MVL:mg3̴Q4f-o@QCLj(QjjI9Qԧ:j4LSc jZH6Q bj"5ZBSS(j*F-Sgrj՗LYQbʅGGTjeM ʜLqTw 5fS9ToʒGVQfT( \gʅ=fGѓ#"(a쾤[z<鹦g^#z%½{_ejKK}g}l5E|߼~~؅ˏ>z_؀m+TV=xa+CP>}pۢ\[wc֙G@ٟ/=^*(1eեQg_̉0f 򍥊xo0Qs>5,3c9(1#(p%{a{wl =/+/Qi<_k~+>CYax@we̩iscLGZZ 㔎c䈙T&,x 9=!JMX]\ۥm }j  &>C83SCVFňMV]ݞ[IQ^EC!СM5{*Dcզq~IgFP擸ԙx ],5~QȺܽ}&N BP-mѯ&hPBth@r|\I'UE:z59WbH=D&\R0yQHը[iAS|O+cTtsVPJ+L/c:5IJcu^IȂt2?ט8E7>ö G}59M*eT=(1q{!/>%c c.5+Y'hp' }ߗ?6t<ba,8׃GRf>vq9 :h!zoѮ=]O1`M?`̻]{"|JzR2fb+=pd,7?HWwKNPۍڼ%Mi; B`ي-ͥFZcGG-4`%n`៥іI 4A& ϋ#6!Poo0--0@ Zj19tc7)vtI0Wp^C4}GGA-B㽭tbI:d<pu0KA)HiRd3#eN)JF{b_Xͯt:B@P l/JI "C6!f? RbyDQ uQ[O?+ZACPhJGtl{o/јS /%3BYc85m WPat&Wr\N=nqyyhO226V9h{"ߘZ8ԮxXu* 1QўqqQWA_AdfQJ8%]JQsp=nO ))rlO͵ ‚1v?H5 x-q1gኛo\qy1O@|7"1_^0(TEò=BeK;2+E]#>1A 4Z @΂55W9f$1_xROиx>pX) Q]fo_:H3jZPMfE`G䇏j?peepq6;QNG<=R}t58m&+-Gha5AQW@_R˴/ !S8zVP(9[rFk|etVsD\dT [Hw~,)L,6|hm[ ůu)f5eRi`TZXSSVVuՙPx~ffkFSm+gI7W\+Ebfh62r>k`n=n~8j_bFڶ5ϭ>|&(ɥ&vv ObOqm fM_r+_.%@lPՙuA1Rm͛,_J?e15 y`_!,qg>b`z:A o`ݦp6[h`U6 2o4Mְ՛MNt};&nڡa޻v]-D땑S Yi{gug:Ш4|4իGO]WǪt?"k?0N7Oź}~eը/E MobF4c~nmE Q-F%(4Vg[[g$ gSQ(bWDAt؀dr ЉCaVB:9{!;=g{N)OZ}/dڱҶ/ruJNJ4Lފ[ﬔ@mr9%T0!f9ё3,?笳1 6*V[iJ9.M:I'rRdU(@F1?/IF|p菻a{ ^@ HHv0 Fh_޹}S<r=faN;3E`Zvǩ,ͬ []Sxeڀ$rGr$'T(wUJ$e 3O"42U,i"T|ȩpe^UeGw[Td:n1C9!)ʠ8P恣\DQҍN2$uw.j_]dcѷb<54U63DXwrwqocjE5y{b'#7[,ڸC^bQ :\jY1a$KHq)7O(:"_㕲%1x0;%cѣ_JLt 0OD N* 1 P*-5)hV B'Gl sgWX-mZY(՟'?awrW_SM}'B{RSV'E ˈsw~yzɪkM1'?E:SR*FxM~0k>/͗:躗 joExHM39d`Dח=lxKtJTF361oDoym]%9Pf%hk@VCy23>֋%P$o(N؝U7*H;|pgҥY䨵 ؝3.3 9J+00ܷhun>1ڇ 3W e*Kύ&:.-/ACzJ+Ɖu9e;6v6kR2) BtDT9J)"{v4 ڷ5iGQ"\2p7F<rk hq0_s853z8=P6@!kt8HkZ'͹@;X˙޻ywǚ{'lĿ ZrϦ@_z]Kvjnn`gطh5²܇S_"7uߔv#; 购{B`Ū"}з# yHέyO_6à}fC]TIيRYpWB I  cp Kd {q):vYu_yt֑yp!_噷xe JD(qZzF 6C_!әM>U^n2o]u *9|SCpzxⵥ?h^Yzo5Z_G\zehf98B䒹,tflTǺ'mqq0.C.9#/jFgaho)E(WkkjHιpȥs fn޽n?:N nRiY 8xpCp@$9+6o/jl܅530ܬtTd'mx=Ojw 몌lx D"'Snk @,!8."7>#XP6f.A#( m$r L5PGmutlrja6=oi~~# `K[͓jk(&,/hP!7Y^/7ͮ=<~𱣫lm]Vo3޻DdzFv7KEޙ1871c Ջ}5̾s7bB CF> C`(%$P3+nZtsߤi`N&B vN2È%UB()( L Dp%Bq֡aeY{2ѹ907ơY"MmOYԢBkы aendstream endobj 228 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 807 >> stream xQmHSa~sliVIyw"WYGVda}Zrs޶TtJ玊ej2 rPR2 чՏ >xhx(4ݷ)$H+ iUǔ(bkftޥB8 Fb"HAlZf+:e8z6)55E&'&YfVd[\`z!0yC'qiFAnNHp8zsi__,P۸@>,v=x6_ip{Y-;5~ap2o^vQZJ 9L^#ej[%qt;\gϻ2hyGмwOog? |Lm2cFOqʗtQ߿kjut߳W0C$MIJ2 +zOi`7u3ZݢК=ug=.Tѕ-p/c_SH UOe #3(M@z`">ͧ'P+ڏT)TKnK]BaS jA_J5աZcgendstream endobj 229 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 955 >> stream xQ{LSgn ^t۸qCf&lD$I9*˶ ֶd%< !EB)I-̈.qjwg$'(#AEo[DLU<76%|,2)bnL‡*}I)JwQh064>f g_oѩMu5J=_ԪuJKh CMħ}Tk333:sټ&ojdU"P|TdFttėTj!Dgeo`cBIhJFrz1o(9sjB]"x ?5l2'? Y gW'M"ڴ־_ 9yl nt_}vO|V Ns:=ЮJk] Qv,s嫉xO1~y"cli*~;3pD39Rdrw?2μ)8^vw~{C״w`_Om[iĬ_KⶒU@yvg<(_M}li9,&/ɖd ?P1endstream endobj 230 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4215 >> stream xX XS׶>!s<ۚy֪< a A&0'Y @1L*P@X[jUVZuxjk8|^o$;F" X %8RK {Sd9jհ8úP8T" P{*U}&pwm])|B]WxBT0 ?U7UӦEGGO  ;akt*u_r°PJ?W6Z_a!Q*?0_?e(0Cy+F]: pm?~ qcV35:fld&2f lefa1 E f1,e10˙JƉAL3q b&2lD).t)rM6RfpR=~.'6ؼXF:yxoMfz# ?!RtB*LUF\z?#V D}FpS!`"4t9l4d9e1y;.[̩6ஞA"[4k_MSX( 8vp8:MaK|K[K cr'ZcB2 *ih i\B%R1KFNpul+E 4-C3)imZ'eR#C4LcW:<&{Usdt0+%rN NPK7&vK8>C Ir6%%=CQ ^98*J(ut'Tb5D|s2I)&A1W/; -,iԘ(&wDFU AG,(;d^W$H(2 e_/|_Uq4o&cpy{-pD IY2.{6rl`)Ԧ coB!~eg,d hf d" K3>5Ǫr1e8p]wL@%(slNqC`Rn2˼5`}wJab4$X<@4GTZ.@;}.@ L%;Gkl)+͒rQ+ň&W y\M3.J!l.(K%7~&a!o?]*Mz̆hrWpTq)?q^;-? RI;lSIX(3ŧ僞>gX?9TNO\-JeOQg/{iZc᧍Ya] A۹G»DEl\ܲjvpZFh5˜2K (f%5 kc]ʢhtP''FhPZN6>Qu\cU&o&B_)c(Dx2`؞1'*[<:%KYϛw;j/)P?lۺNTTFKg>rXh6ZEikU:Lk Ǚ}ruEKa4}}`jbJUp6>n?sZK95Z?20$>;ZLPg&g%).vu6W_'w"#dF'@(Q]SS;fa\P?Ph!F5hԠK 2pmpdO1te}gzx“?h8@kIʜ;>98,Eu,>ը E(5m v ctNn "V|ɾ ؈RW&]l-}Dq۠ݫ[!Q̏`[|-o`5ε98NqOq#ϓ?Ct8*/#7%Ym]>; mǩKғa;J4$8[RnxGG7=}!`;Nө և*v֚1~yO@<=h: w-.?e-JO+RxSyo'p_pX%X8FФf@,΋*.-(K0zᕾ NX憀ҽV; 46vs?l~O'Ƽ_-_״&S TChnL-eiNI~( ?T,ڒ:nD &:\u2a~ש҂OnQ.eKg.eŰ5Pz5Q&MM-X~0wX|c 5|C#TwLxer򲀒W߇2:Ĺ`wew`g]F o}< fu.NI  Z{uyʔ '&JCV=2NאO.WdSZB PJuX XsXp~%"C*ehhP] DYҟidަPk_q4`7@R .t&ڹC|w!!!Ց KI ocY;ם/VMɊѽ'9TdڲAwW!kB;?m'eGAE+)tC-<Lc݄-{};zmLzߧ5[79_ zW̛t|ŲiRS$M[)p" !@0;UclO/Er ~pYZyּBQ ٹ έKpγ G1Vbt99#}2:܈?זK]C&+=8zNk7|1;ې9\^FvZ " 6)r4OdȠFr2cMݍ<{mBjt9%kS5M^pfڑA1%&328!xJNʏޫО{zD))n xNKq@;M=U#Mrt$q!qUeu=;#\dWخDoT'E;ҞlyHpZR̠Le^>h / o2ֆQ"#'HUeo" }Tb >ّeZ,kT;|{L>Fuz=Vơ]|hkϙr/anlendstream endobj 231 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1421 >> stream xmT{Lw>M:7ނ:55[ZzT ?GTySa\>,ǜSwɏ?vmŸr>18vmi&.LfH2 ; RϘ:"< =5 +'A.f1 -SYM*Bԡ9ѱYV*VQbaPa: YeYӢٳVk*ŘŅF(:VXh̹LEcd)-5}OdrL1+LوaX1,,Ԥ Qa5ػZ,[)$,[%cA\I1?>|JR$hiooo(4NJM> [CJ-%v0@ j ȱ[D@&驶QȢaW]ƭ"DRwNX+頁F 9A)>r Q4Lq^W$ωIU*iy\vSLӒAt_2(y4 'C i;vV_4V7!ao9+>P.˼}q&rp%dĨY/V^{ꕖt_۞JD r,VQ}RʈRg./' v9uv[-5W lYY OC` KӉ+l;|"3)>+UR,Zh"`j>d?L]:1E#]=K \Y:a5<دʩϙfp\h>YÝ9s[ͽMx2`~nwk<ZjNd ^'ݑqtqd ^~~يS9u c 9'vRo!Ŧw@!Xo(ȆN24-ʖ&?::TڀZM(ʣI\u[fҶyA Zm[Ix8A ^2͋~{qtCEÉ[ȐDXWu (0bGCTFJnN-?`Xn^\6yF`K=- pddCO#;B'8㸁FxFBOsׯߺdgZ;[Z*!0"PA?~ӟ g^1_%}@endstream endobj 232 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 452 >> stream xFCMSS9/u`B@"O  )hc_nsCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMSS9.CMSS9Computer ModernRS34O-FӋ#J4RR'SCJNMu8XXӽv_Y[0"1('rc]O||}_MIRM2:?L{4N惺.@uPUb  7 Ƒ ޘ endstream endobj 233 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6033 >> stream xY XS׶>1xpF= UAUS: ud4L $$B 0 ZV[[EmZm_x>}}o'QﵷI>{-Ax<߅k֮[^.&'dy%pk2ikS℉1ѩљ q)љ5i1q23_81'''$:%#$M?̄qq%i+S Rҳ2㄁iqT O]0}%K3CDDŽƮf|5k%l4yWzofʼ-ヷM9 FD&7b2M!k:b=Ol$&b!1L,"B-bb"D,%&2b*xFӉpb%1#M !0B@ %|^HbчK!s:vф9A\%ߧMZgԕ=e--.1Jy(qOTV@4DsxQ_ҖL%s5}_,|l0q =+eW4|":D7jq>>OZmh7bfVM LQZR_ZҪw|PoXS؂n> T t/p7Co%= )ihT4 bIg;xq<˹tH5L$4,đ!_ ܇Nְ (^S wcǢH4;G~{vގbERʦxsm(ܩ們p-VA1%*[M}96F`V&%kQE BvHTꬢX2j#cM7ծxx+@ q,LJK7( b}Ri3t/En$i=4X}~Ŵ\ko>7ƇIZQ7S`+ J*m6 N41 Fv]K<r?+?&* ge 0Bt\z ψ{y?G.(J@m*gTv5Mb&_QYMdos<<䴤ԱIiٖMfjh=;d+b36 TyQMfRRf\:16~ .9ߪf%sC7M[n@.$û],Yjv3dC(ŌV+Pw"#p"јc;~UZZըAz0ZPR3!eFyO:Ia?Gp'?T MILD$2_HŸ^?_~| vvRbZKP<_7som 7)Mo mxg gRyOI xr'5O#$FF=oOو+$[cj^]Zv̚ZV5 [/|sҹ$xgycH6@]Ql1nSE@蓵ϻ4Z@uPvT8]nsC27ɥC+wo  FcY)D̜4Y _>J晭 9mxDoc)vT*+i  oByT{ {pkM3t0QV[mVŔ咠䔿Q^WpXA=tRng8~r>sthR{AI &GbqԊk;u|I[|P-.ۤr0e?; !q%د <~li0Sݞ3P1X+hhϻsz}Cdѳk >k\ Fi{rwfPNς>ƣi$t>4,'Gi7;9Li߫ec:W*vpBT9W6ލNVgkpy)M{Qv"\Ws]z'QoTnzek:#58۩՚JMULYum;ߺՙVY{ts"ȣU,2OdEem[.\> cirVit m.-h٫(xثqNggglu@=33d@-CwÏ򹃜~Æ%O"$ JD JC{/]L}PRzz^j=6=hP_/߅D%c'X"et|I]Wn+j=x:Pv˾Y129LqЅx`/S,^Y76y~wzE j7TLB{Pv{uKsuftqVv=ќ_21ޖWL., Ú9mlȢZ_|B;~86&tx=Xɦj46 ⰗcBا i /.(gpWld\=t П PW\G- Q3mFVX-d@dz\mӈiH"NY؞ (Ebj36FS I@rνtҋ\;^#nu+Z-yOpӍ4n{vs[SS&JzKuMiϸ໫|LCz佌pE#GGap-d}M/+ ~}mh\ DsRゝR3aBRXsJ#nP)fk@ %/mYx + f;q)݃n>FҐs6~5TFB>+u-rEeb<>>(i;=` Z/iKd5%u([5 /8/6>nvC?ػzےsNտ#d* hsY[Ƃv~{ө{T .#_4~ݢ E mRcuv묀p8=65;*.ݙIԼjql\Kpp8lګ9Q rA@TzLKA{H1"˼g5d+WIU'>q[؈];Vȴʄ(T&U%1Kl̼}⢩P֎`R&1)[^ZzFڐl(z{8 fPz*kOxKp@^Π7UߘkY#h@zGf320F*gYxPݞْR[3  _sCwwY%qREaP̶S5[ύ.gLm<;g:w"k5g7,qh$DHj9fNoWU@9՜e VI|)NÄyMάcurCQk|**^ckGKo]lޣ< -:{v.P+GT^\,31ɋ,RaR(Zjj JL,nwKsz] #:9 m]I "cKlk+J+@//60_R.IdbKai1 2t(@U_]f6ʜf#Cu4*,_)=(78h.UЖ*\t(4T5|D+JXVV>48z7#i*s eJeN-7&*U \uT)y?{z?/޽~?{mgYt?pWu#mq2_zB^}{pmsxw|?cHupҙTKkSS 41̙]d'e%VrX;셫pN[ETjEJC*rǡϧvp{2=w|l$K@&A4Kz°;7%c{;4gbZ3Gf\X٣6& kHV5R^Wp pnF"qiOG+^>>!wendstream endobj 234 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 808 >> stream x]_L[UeT*՛= lAtFj6@\i-˟*D1c#2AۀdbLXueI&Y=ldd$`|9J3 L.Omm~֩gS =D?/s,g2ƖR6( V=hڎHT4!ח'+8!QaUbȫ$P#r_+J}:::PCK /T.6RXyCH..)iSDYH Ft*TAuY9aЛ"R(PeL}W{*j0{d!˹FA\El웛VƑwIZY~Ƽa*pSV5h8JdvtOOn41ȅp7W9xOs3-8ģſ?6.j<-7>XqXoߡ!U,d h6OfG麃աzw_R[d45Ao]LInC^Nt SH] hnJ+.4uG1X69<Ԍڹ= 6b|,,nN_bɺq"Y2=7E=%aHr!TpU*g~e ~{H&V`z09xxW//WuaOn?~]ÿ:)# ?ٙH,,͡ɖ3i.u JG2; nGZTfyOvendstream endobj 235 0 obj << /Filter /FlateDecode /Length 159 >> stream x313R0P0U0S01C.=Cɹ\ &`A RN\ %E\@i.}0`ȥ 43KM V8qy(-> stream x]O10 b C+qP(/ СY:ߝ|pFcpƲ- DeQV-Ɠ剋BwOϪ)> stream x31ӳP0P0T06P0P05WH1230!U`aS027i`9'O.}O_T.p .}*.}gC.}h\nn@n.P9?47XΎEAmGTa?ߠ pS! B)endstream endobj 238 0 obj << /Filter /FlateDecode /Length 159 >> stream x]O1 y@%ʒ.ZUm?@b!C@Hg|wYud@>%Mo &Vq*+n:?`7=]/$ҖU{ZFg] 6R L:եPXyp8I.~r v/?vShendstream endobj 239 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2188 >> stream xylgY{=k  lC9&hJ1rp̝ذkc{z};쵽^6666`p HT~GXUZjTif4ﱰyJݝ~1#+t^|W=˰۷-{=g lHMZ4Ըi"ŒLRV.)+O 2l`u[.% YJ@ɼIOKDJ`VR){kZFTF*/z; F "Z$쒖)"lkfoRJ) B ðEeRN.RUpZ(bX;a\],ێvb=X XŤy^3{ YIk9 9WSp,nG(+:vmkp2}:i[ Əw=Auv[0Hd6;B(9o(G:Q6\r$(\ί( 7z@hS-SwBY]Ue!_篋#n=@q3um4NLqQZV4mG:м ]w8sS;ŀ3y1voH/KLf:=T}섘tAz̠UCcAȠxpB)h ZɇkѢ6\m&?~> Ŗ¼Cz<%- { wn@= IUfÌPWM: x}ȢG@gL)F/E{[ k5>vlKWYZ["35;.\!p1CmI^1"f)# ua}Pg.x4t}5:LʾʰngAov+6c?F缫md90zH[M, ya,lTy}h?ircDnç=W}烗Ho76|>.跠',}`ZjB*qhGMxFԂ?pI}OzgdΪ:OGgbdBg7Ϝ=C|{:3rsIDGKXϙJX)=6 LTzzDB!q f۬6CwsgԭcDq/v#6 :h9(B2J 2(sϸYCzAfoLÒf*B7?1<bJ q@T"L: o߀sC >q~|G'ڏ8VRt AMpOg=mVO[>* M730_篝ԭ R8[9t~0%KĂM@j*bendstream endobj 240 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 yI.QtЪjbLPB:t8K结r/#=>)ul"-~H0X4-2񭃐U'l;7IjzCKHQLSj`ٞPr48n1Ҵ4CN;Saendstream endobj 241 0 obj << /Filter /FlateDecode /Length 2809 >> stream xnc]GrDgymI7o˲׵-)!ǔd']51MNgίc1q?jPfDg_GwͯƯg0C i-t<;tLhc-ukϮFG͛ i%kڜ(4ד)i5!4)60APAmNi `rˍin[åj.6"eͱ_-ZaE97RB41܂۞"];RnTk ϙ0btK(ޚ/Hx+XMvPx2#-m~rs q)Rl42+ V/U)yv2jdT:rQZ ,$!\DIq&x9 !YLz@Z62KP* ܈B uFrqNz(Wd#Śg̈́qHX&%hsVY104wu3aKuHe<7+72M]-fEAP8"2; x*sYK.Uv牏e.r, 2eE/*7 qH"` VƓ(|JD߱/LRP瞽O9=KS[),q# MfBǺQ`6u~ ҕ5 1 ĀEB`YkLr Kq}Z%|4Tsm烧6m (ގf5Ad*wq bV"FWy ^f .6ݖ|YEaL" ep*S fI" k_Q597aQRUdt};֝wwYP2> PVewHi%=edGgce2U6Mx$Do7&xM /3 }JQEO ϪutLw*`[㭑UN8jz.y]T]|*< 2b<,z> ]U}ܧ[,i(uɾFEސAt|^~/\VQ\U%/2U [9.ώ*qg~*.&#>g+zJSyݝ˞.H\? IEIeIh.!Jw?qIR.2Hʛf]߬|TKϯe͓d3_kV{KpWB*j &Lw-sfyYU}s^a3пjq5Up]Ҍ`;,a_A˕O/2R/_.,zxT[{Tjt"(BT =H)m8'Y0D*ŇEԞq`CF2H-mk@iTeeQc?`}HXQwu~n\~J#Py) 0B$cl˱2HԴةpgb0"ŋ"jWVgWUTz(+nn,:f Qw8 nwܢZUYtA7Qt͚W\݌ \I0 (z>e)PuHzܯ(80D >wGU- Y9rf9s> )\wdj|zvRy>K3x/mIw "hV],<}k(_s޲JͽJi>pnqupth"ӪgeU9wQ"rP]u٪J$E%d ֿoWUN`8_;4(HE 3x]]vSMHԧ\@XpWbK㻬cE#[ )Yj8ʧS!ZԄ`hj_Qp/ rww^p;K 5:XZ.S"lCzCuE442D_@::wʭ!b B1ho9 yt1G2@ţ2wCH <͝YҀ {D7~o!nhA͗ok[9kOw\֫˸5Up|6^q@Y _tFDu:B׋LEZmqryo`^X&rAgLBq-(9S iӿQmX1ڤ |vNŽ<߄x#k.hs/dR;plA5-CyxWOlgw> stream x\KsǑ@Xi~8»a:bmkih/1 LCbw>jeCYY2w7'zD^|9Yk\MpA {VV*$+}=Q?T:*qwH Anc{f˜_O ߟ8ΒL-12*[6*|! LzMJÇ LZC/z%8|do($T1{op9}~L!Wǝ#qq}sz0HY|+  =0kOK:W=hSD9эpWrƙ de^E&^+p|–F 1^*%/ytN ʍOƁ"SoېAt4l^e<\,O:((YF\hc!a>_hM]e''?v;mN]K5FM)sS#(#cgɀ~Y;lސݚ޵ ֭@rwˇ ' &.*fwjARN|v*7hEٰ9-Iְxa:N2?bEuqf]$t)V 4).0l!G4jl*k\p7-Lc h;z ~U0k H ޢ,W}+B;A-$ [JѠ ڼ i- mNF: K_W~Ų\W""XzR xς$nC6UynCpAԣN[U<8xNi8=QD M%ܴby;aڗ{K"e4Nn6mLJc.M@'XCf,zg04A?XWux[u/C:k:uY|Y1B!5!Dlru,.0.>MDO({7w'T pB1*UnCuxUux_or b㖶BzXS^?g0x*6#\ YU:̏Huwu:\u1Rrb/oR*b߿,$bnb pMP';6}&hh׮Rd(S CBԦRMÁnuBC)c|{ͳR/ XJ+ ``r2\hfSvz!^׸S(Hi Sd@ ?գܗGոF@V0p_͒ARlJ?L;_p>u:3 +`9M,ȍXKGÖҞ }aRc3`B}N«=F{MNES{_pdhlVOPGVlG֒ع@Psg8X0hM@?`qQ:_tA]G+yCrpTpMqy;YS \0g'K>ɏƧ!scn>(7 b]$`j@Z1'.:fYLA13Gi]j%==a7MgyM]@n!ڐI&i`ɺS#|q5RA{ KD`kD6%Xx{! q=~<2P3HKP2ԧO5˫}21r^W|Y7gK , ,*<{tBId)+@vex`h1pA|vXzƛL?vAgSX8odkDSb6|>3V9/rH!Y`)m+1 M[ws" L*G.ނ簓ص6BJgCO ?kRUVXhk;ԠmYщ֊da ᅠTIea q:`3 G$ʶi&Cײ}f;kYV8H >2N @p <!LR0Dhy/ncvfT=M!]*P+z9?c=QhTʺ3[5Wxڌ{<59E sK9SbdFMQ~y=[ـ21&R>poGɚs1_waB 8Gj^U(W v!K&qI<%JdfB|zM,=ԱNΝ\TcnIȑC;l|,X~LKqIy5)";R6x#Yk>DH±gř'AD.YW4ha C"F- Gp4 jS< "i-xEC#52-NU<5X8O$p,y*Oc:ɚ,LwLlƭt1HKLŒowG\ l]E Ȃ#)(ZP忔UؗӊXԹep]F".&oXײ" XVb>+Z&_*`\lXRVAXh,5s%rbW $n1.Bh=Kɮa~o1fڮtW}6UŶٶ"N@ }XFl7$]穣H&f`+gl ʥ@h9k|9jP H a ,Yvg%#GT'$U)o 8Mx+kяE.2; ݔ_@+?7E`7Иؗf hvmjJ \.Wsi)J?گpՀj[/p+mPB2m:xV-eB;1&[YU>neM@2:CmKXpt GR| ±@`%z*w6׻ɟI9ʍ p͓A6E:9Eۆ,s5m{&'g&wd~kNo,u)7xU7b̓Ub+~;$Ѩ:$F+VZG:|._q_럋 mԵ0G2ZkN"]6 gS}qXoo/-.5V_8GXF>HHITel]SO_CilsskmG[zr{9Z~gQ`Kdg%ʠV:eeo{4fLVR|nc?onM.b4A%"t(ࡥ[&.Gٗ> `8iԔW_"h)ԛP$Ѷ)0Ɇ-> stream x}mGs rpi ^|D`hCsH;3MRDdUFT^, ffeFQ? {s ~wn~ϨE D9VS٫+jwuc>Vw~M5gC1xsZsvlR/AwR9K.%F~GkL6E?^iFyO}aB&%c-t/&S=іR/xzUe;fdr^Ֆ&p>\Өmo4z{^\?٤Er.DxgGt4d1;W9iRM#z R!1[,c!yIdl1wKT)oh9kJ[̑F0z&oӁtшPmv:Il!;qq6BփVҔMhhO)n2KhGXXKHF$ڑ0i^CK<_7Yu$[Vxզl3xT EJjMBhޓV’%MF$Ki}!ɆBlE \Mt"Gdh: 'Hv!xDiDZ-9C`LCso1O8Ŀ;M l*#fňby6YX52{_6y$ňcN{EJ32+MdXHmhQċD!m۠(A\Fb6c e$j/1F$ 7 בT%?kBz\b*#jbmL6b*mD${hH0mvTyP6@6أF_'"#D"3|~r_)mT-8P$q .rBmAH:JlL D!Y7q#T֜q#BRlpH-9ҘyV;M7}r,io>OhRl8Մ_LP)wW߯1܊]jVZ͔3z^3EJqh5STŊ{OUPB0Ri@dX*p*Md?B#)rT5; pQ2qJdu&FDDI٪5&icoC5n4-fnWKwRh1g6) c ]7qjİ2S{7]0&cU]&J,yBKyB܌%זIAϧ7oO7/wߟdwj!Yӛ,:SH8RK4wnW4{c> lRuEik& 3+jAT=?xb|@8R^l-NfpE!PP;aF(Ć,4c(aW>&- D EX)c&m;eFXHrp:r [ѐfvثq:>ft>B@{H${+r,3hz;eKHKx߽\NW(cY'ڬX 2qlg/M(r~ ]cj[6xPF|,H{5oGPTlDPfcsl/c3ƊK'64en;P^.TAŘd3yv(C毛]!օ()5*Gq$~ }dbٷx5JcIEy/:s.͌{ ISNmqoU$Ɉέ{5e~!754%_'O1.ƲFyT!с0v,9p 0֕G2\A=7P=PsFiZtj0imć*.UOq2$W[)я"bs7>mBItr^GQiXEh:e%#!Ո-1a"+eRXd% . 91 IU*)Q$`)bw\,I3aѩ)MD%*46씱(G PcY^„,V96)cftN԰uQ4P^63ϙqSQ^ȢǴE>®YQ^2`; FB <;- 2jK@B7!x i7X39v 9Eִ_bV/DQ^A@ғ+QڸՄ Ob 7 4eK 0@9, 8DC cfq5`k2|CN;5h43 ݯgI> Β48=t?y \oXO.zUA6HL`>9,8v~#Ee$-fZ(D0bl@yڊkɽJ~-R2jڱrGZF*DXA$C!T" ;X0i 0{~2״E9/|(c} I3,1*KJwKTH%bci ؽ2&JMH"܂oUiثjE^EJ#Oxx7ng'k\B7KASd@;XI6v'r(efn)c/$ vztH6[)c/8i߂z MԎ1(!M|ڥf1gIXNoDp-ψ8GI\̄agHSP(;{q;hv?]>|~j> |F1|WoOt9JCVM!Kͻ?<~D #U,b/h89ڊQQ%80%}h^b.vTE%cɨpѼ'@:v6<$ڞvESX݄y0_flۚZFh&Fۜ(:ZSP2j j{3-[s/eQGE??q5$J.zկZ! FNުOsX O9ѧum+kxM΋~.S\Ӈr$_oVҍ JۿC=\;T6J2ub-fIU LxOf@\ȲPe#، Kj6)1*q=Q@PWwK}U5>iC*pq]W > >q @.{h﷩Ѫ4ƿ=L@đ~{!@xoV)z㾱U Dy$C3 CYX"BCMcNӽ7Έjy_'@P a+~T;cmw꾶ٴmj[IV5m%XmBZ&ÄaWIɳdEuI,) {r$,$5PXɽ1j͎[۾={_ ݺ׮쪽1]>Uz=L]&]eRuכii|Ά; u2W>p6PWe i[i_-LPdWԽqRԌUҎM 6b˞WDj'wiF{ 2? y?|wɦMN/~](^r/ߩbwI9Z˂hZ4hLV.&#XwGzGAqvZv(|ߟRHAh6[t WbM~ \-uh!OpsO;TKxq15:Xab?0™}{uD<_(#⾀v/uvzaMߗk^moYcBB5ʈ#+rlh|%OoYmvlDU/6>/l? 游LʴF^= $:6d ق}"kokJkHI}-62X:Ih%E?A8Z+"5ahB*İ׭ECkuG,&"Bt\$G7Y ۮ3{i~efH8A=U?GH4ޏM|bzW pQl%uUKaU o[?FiU,s߄KNdu4%9 v->On|V4d}"C6 S/мxε*njjcLf6gn%fQToGւQJ .fe1񅏉K!c;0: A@zIBgNJN~dkK5 %ڋ' uˀ -uK2&D9^9'AMenZ%To-^=Ԟ)%4LI9e7BVAHAngV03.' fߏ,ۿLx/ :d?Q3őg1qui4%ڢQ #Xy)#*4F^@ͽGyu)MOw,YjבX,Vdshy)zTP.7yw?nw#< iuFkє-Ѫhs^ B ec7W47y[ F!j—8&dhKtp,̟#؋ ֛WkWѪ2^k72'Sx coNEucCw2<*Md@| |ߵ|Ie`߈J[Fyf Ah\uo{QR?xj4ӛGX1.ˈEINMH k؟T)"F\޵<&.E[Ib8EԱ]Ѫwk}Kq㹗/~oNm43lKY>J<4 I~KI`wC7ug8mQ^9HzMR Kߔ֔tKţ`'m,)3tǺ챳úh[mOLlZgE玓)BHrܞ˜Kybyw\ q|eș%cY mY0D&߾dǠt1ZfJ&,_JGE5\rm9TXssHmyQ#uRFFJɥ@Sg[㯙#[M^4OI1LXƯ- ͜-:aGQ&L-r yZYC39 j#Ҥ766rFi+ +l}j݂a%Tuh5pf/\9psC7uj?ONawR;R-mY3j F[LPaҿj_9 %ubNeVM3~+&>T4%tq2gO 3eH͹f< b3(^&A|(,&i ˅'[. M+EWl ,B'}o=ʝTi54Ba M{(!=d!g-Onv4*YxX$qCXsܕcΒc|ӷK;%7}|`ХJn^ ׀7e #qL M߾%H+c~1sIz{b*sv=ޅ;w‰ Jp-R$Stk9N X= Z6E'r疳=]Y 83Si )y6>{)ayv{r?_a:vnG9O yrgc7u6ey|5|ca؅(s廜8 aaׅƀi4 \FG ܢ+>Ӟ?*Up>ŋKg569R"ڜɉJ.5OP̱R2[2Oc#ip_O9.? ?S1l|yZ@zu֋͞~xp_~xw 2\7ۮ8d\g΍]X"'4!|}8,KÁ KeE}\s<Wsi/Rb[ǪuJ]:_ ߌhcMoF[&Ғ{j=$qYE}Jާc I1Ź]Ly6CO^#.iyq1O:\芉vz/4w=sA*:kFThftL|OlqZE~/s-[ǏB'2[yqBTڹOg⭋'JG+ctb%ľ˼'+ɯ+H>}r<!MqfaaupMkAKt1j#ám iүI'v^<~ԒC\Qv@LJܯV^SFSY\YGwU4TH1|V6fOJ'nU{Iy6:;wXGw/4(xIqbw^:SaԃLiIƧ~桇gΈS:.Az˼tfl# Pnf!ӄFE}{Q5 GTd#[ucYf,v+gr+Ī1 i lS݀z`ݡL̗> ysNayPӇ18 y|1HxjL7s΢r:='GH7p8vIQ(U~.nIE.0 s;᪱Rd FZY"߂&L![Hgq_K` @ vG|&9o䇿#liCkZ#<;5ڛN~QuƣCʱ3ʼnw)$=I֛0x7T#kd:(vV! 3M&0pEMu-?X>m\,+D}i wmꗔ/$endstream endobj 244 0 obj << /Filter /FlateDecode /Length 5324 >> stream x\[odI~7PSg~AE" xᴫv3KqK!I:Ofd\Fuz?ߛr6W)m~{ +u٤.NkX`xܾ'rROrH]^λl OSJW$aG)GTtEa_'YYg٧:|7r##VE2[1SxOK>OuX}bxxpW"Y8K׺?,K~PЃM,XuxKS~lq.X\Z4&_BoP؈0of&W>.vLPowue~q::bqgd~}gFӁDSBqQY'DP6;Fo{=npy:wJC6{"Is#2,쳣d! T$icADz$ G~n`&%XN6&@h (5T"(+0A PP[DȦK5!&$H0R"XN0Q&j$RܞԴ}|I9pMKo$7ٞId73rMΧ aQeF iL$# >P^ #7uY-y!&d$UI4/o"HQ(᭝ F%e dn=mB_"o`D]) Kkl j 8싊,NR)F 8raS6a| Y.~_,3'$ˣ?V< ̳.kOL&jЕpKr727Zơ1O? Y"2șa[[r!j3ؖ qHR;ʁQ9fx I|g3;Xߣ&Y(-z.7wcM8+TeO8cʑ}*ɃK'zA)eSc(JeRR fl[hL2iHu[ ^ {B),^ڢ$x5| Wކ,f< 0KeL(#Ohp|`l Ao`3Ȓ 7"IH:4YJfr\7.aĬ6Їu%5A) V62!`-nV_ItZ@nŒu` qzWHز)‰f_|D!Ii=Opz5% Xt(_ 0dT- >j;=d -ސtWq۟ 0iKpEGQӒ*=R]az[K2)\uhNpxWV;9@ظ՚Jg,@B4Q)#rQV@5dS@S?7Qn4 .U{+ܒABu熈6щNK!bp:VtCxi^yr% 2tFze)nŊP\p %G[7b[J\ :WI5ph9pT/J!T?`t?єqձ/cCC054.AZ֢p@wO|b(஀3~( np6VC5v7{X+{ <,)l#Ȟ{`ZY!KJb܀'=ˆ hvjc <%Fes~J|^7cj6=c;7TÓhoi-e `^@VdV5lvX#6E;<.jؙ伣4"d6҃4ԏ,bI{-Yca->b@9U2n B`lC>4 wAKbql.J,+CgErL|M܂Q&♮B,CDk^f1qOLFRvM lYƤ@aw_t CѭH\~Cd9oej*u40foݔ. #xZBfGpN~d |{/rBʽaRVjCG^᧯Y[w>ą?2TX玘WJ&mY ~$//ucO̎@Z+QS58?WՁ^oeifLBg"кSKmB!PNqU[FY" UgHDe!&NjĢ޷[cTMä/Ʌ߿fE%Ƌ!#ǰO-Ԕw3𔛽͐M#Wo*xjQ|Ep,)Y  \3Bזn@7zAk#zfQlHk"6$ |h"'O#auC}99 bx*\H2zFh$P r#W_%$ނ7EAXr+Ox'm(I[~7\ٯ!YnbPbCtņo|LTLF*Y"rV^Zxb0!/zc^g{X,ޕM@z,pJ_jLtCXlp&sLO}Q[eo42ĞcWZ<\b=GfoZOOCv_Y/+C=0pe_YbHJC1BVŵHY@Y` ?K`*9ŋUDaj|wyBDή6N1wʰx`X}nq;GfgBR1jj9~iphy4`}a*RЀ= I`T}P\zjp%?Ծ> }$램Bݗe'$ /ˍ$ъdeFA>')|z| X]2Sԫee"#A b@nBOq-uzfZC(93nMU`島,zp$)Th}؄/͡A".&t`x࿼xv&$tD0;DPM^0,1} +Ou`T߶M9)wEts+u IYQƼAB $l'ĸ|t_] &^|^r~^^OfLR i%J[M$릏CzڹQ#3 U\z8C+ g/iTɬe\* 667+r !5K~Pr|NŊnf%\smј Ez`$p,,I4#3ϩ#m ;(RΗRLoDqZ`Gfzq9GAdX`j+h,R׀s:J-NozvɾyFԴՏH'5>5/71D?M/:lZ髒-ۃn^' _p7KC~[j6P'OQy>ⅽ/RGރ_rWZZe1Ғc]h|ya ܋#|_? ͂4hXE"CD±u? _@U7 tW 3:3s#>H&I]YQI9@t6}}jC _d̔D7Ɯc,TJOfmhO{ !z,pl m]+GG:RZߍP BG]x/\h[XC\]um> stream x[oA.PN"mT[$Epdʼnt'$9_K:)[pr/g3G{ntr_g鿣C衱۽8Ym{/|n~#t6Lﴂ{v\(ϻ;e+$֊n==c^[ܺʹ6ssɜnh۽EZz'ߐ E0z`|]d!{ ǽf ǐQY[RqX20PRWH 3 vv̘n3^:׽9u2Cڈx+yBoש 7[H;(@hJ\)f ǡ1V&o )/V^;p17Y?7[+n氝yZs{Yo y&<)0}\g/䫦 / y찡{w<Z{}wQT{#bPu$/ )B7BB֣&7a3v^?ulbٔβ9,j2ะi@rSB^M[TX|7> iy-@hj6;%~xbAl\5 wsS1d)b/ M!tYW9kL͉Mmٗȗ8MDki{[Afnύ!Yz Ѣ\I8&NBSyStd5'|` cCtIhV1ZCKw>Ks}*]U`?⢆1 ye5Fbl׫98CF\*(QxUB ,0^ugǡek4#D| ;Vdc=p > Ml!J\9H.}gT[XZoeM8#[d8`- @ s'AM[ <+i63r{?e0ni#EU M5rC wЁq# t`NcR"< KyLLSP To \ $tCkVMCl2h㘳h_g gyv7qM}KLp} t'~Vi)}(>0ecSqoʤ܏kb *gLp0w?JnZ1ؾ.r( +Rkƥجe/P1 H) Y0ِ**3{}83ndvnU] h?*[bZS?a;?nv@.iig7ODӕĨmB($1dN3ױ3%jUuVU-rʴ1ʠ)?mвś 9% b'y[!q1ȵ)dbc)3m{;Y)zhR͖s:'0^ LYC@-@<\$*33>?heTEdbbD?3jg΀wj-q8~x`;Ƅu3_ Q&S'ETd%A:RB]Nә9Y`1@]ג} mԆgKN+Nt"]qLT_qqr+L gIŰ-38D8NUU[hG(OYo%:dm;1a#LȮcIb|lcS:Ge;cHQ_vovSvkK뻭Ngt4bz`*V)5U/xo^\h=l+$n-)#E/"( {u)TIfDKL&%.(X0!G~Jtl#GJvFYxHƉ.cXjk0UP S8crJEYuJPȇඃ jfIo 8OmRU.Yc>-(;i /rDU[^L)TqQkM7JsCgWh<_P<S$A` \JH]pEP-24s:yeh0wriw )!<}Fvۏ)Hk !mHW\t /nk JQ'ˉyc,q3ڏ}3kSWȢ|^(CHBF).n %aE/DFz! }he'j+E`rD4XYLÊ kDLxW l<լii>Y4^`,g2$ Xiu?nkh߰4 >abb7MGgc8] ݨDՌ\*&< 9$k;il6beڨCjGԨ&w {DUd/PPhRuu $ jq 8!sl̇,H, ¶q^bP8vU]ZAU-#kCA&~/؄aPxUm,΀\?(VUκPk*t+RA,i[!YRfFn/*D2m xL=Yx9qA/km%z()^Ni5>vxS4U!鋋BjXOH,/7ywTH*z8@܋Ba`*<X@ו#Asng +6޼ v_{!s8`D-/Ng542r ԄoB~?.[[gg6p#?;^5g?I^5'峃6S܃HBoǫ_y0)XZ-o2M>+*$y,lgdMrȋn"4r.QB_2裂/$ Cה*y|ZH?)zQZ.Mr\% I b 왘|퟇qSDy?-~<> stream xoLeߣzZ6a\6@T`éAB;v[{mP>[%ĺh⦋F4Y\bR?8MLD×_>y{Cya ua<<T^zd{HA3E[jݿ܏6a=az z\nM**ՕRQ-=U.'5ʚ[Zn8*]E땊kܚY^doOt.)-(=JrHW}UuӲC4%(5bZo&LKIv%fN`61c̯y{2n3!mX̗h o!\#5H cx|p0H=SG1L(G&,ppR!'4=b8 }A %D|qczT?9r68 Tt,>#!\p_}-@;Z`~Dф1c)7p+>V-ibǝd}C"+ooW8^\#d1bS9c#ק\-MFA婞q_$%.?B r6Z BFGYvNXn^!\n@3V!Fendstream endobj 247 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1193 >> stream x=Q}LSw}d c~S#D@f4(&L3UmmJAb>PJ-4i E3%s8G_sl lUs=ɽ#bc(DB.z3fs%1Y ȏqԌ5 6ڧW^OĦ4@LJ*k晫얊rOզV\/Zɯ5-Z/X zbBo֪U6-Cc0[W ߪ[:l5F=Ngƻg6VZȬ[LE1k-5VmE-jKQ(5JRS +'S@Sb[2Hf8f8rN~htSa pyS0LeK<-Mٷ$%.=JB_!M^*8R/S]., WHRn|8jSwAǑj'vAḷ./&f64omUvu;\ob!6GKr1]xpqTrV0p{BScmPc].-0F$Irc |wsE;Osܒ)a|X:%WAZoԥP44j}񗩩NV1.RFYNT퇝2w 7AQ3XI?[IJ>z]?`/uy`49\ s#dќ%8~U=H5.SK2,Zupٛ"UM2|NY<؋30Rx#E ^|s H%ܦ p;7.s #=c&Ի[l6м =] 5*_&WVf0 bΈO.32ǣ=6>v[>--| WPԿ"7%endstream endobj 248 0 obj << /Filter /FlateDecode /Length 6436 >> stream x\Ks\7v3 Έx?IefqMgYYd$eY9܋4.IYIy!y?oԤ7 +^ܜ}7g7Wgjsu󙦿n?7?/SVYo^=OF'7Y7)[y}sO;5z#V6\MQ)?έ5Sy5tp)s@[M6۔єOlw}/F~V*$+ýWZ.BLro>IwuabO;'R^[]vb2*[ 8aT!߱oR&oK:}ky6N#_ζvξ~}ћ`TҔ|2zst,pl`&OB `+"{PFI}v9j+WR8* 0pfr0dzyJs|;}~+M9Bh235B? GÇ4+t oHs 21Q"'s:|-[u%z4SgGd_͛ dgW\d+^R!3԰KvAbA6 MO&3Mʩrc7ցО㪳ƃ6K0*ai8e䏑8Hi#-ʬHLAQEDyL̄^x 5pB.Hw$쳕h^tCM LШs(RŒ!QKUTd~AAFm]]BY lH.촵(Ifv_z$0_ |ЄPp.S(V Խp6s=sy9H*F4~s]*:Bd1^ԕ\$%c!x_L.n*}$qext+shg_W\iH04kPcg-snkd# ~T$)Cl%J{.HO,4P,4^Z5ZbzWHeDﱎ80jymz]]z]kC{wr!VȟJ>"N|wyzeB|wćznkZ G͐\)L..nDQѪ㟵QFc#+tSI0| S/9}}֒05Y$Sq5EcɄ6x9!V|oeTCI=]vaHNQJ۾:3?z7ߊel[5NK ~.t)) J^}d&_[3+ Z:`b^b'Ya5Ǩp"p:<i%jc}Zf?#YEXVNn,]}2zF/b M R`Inq ^XTx-70±it>dEsԗrZ6v*ݫ=v:36|ikL"c}`_N7)EUHEc*3qLBup]M>eOV/Sx,r%0Gh;Iܖ'PfS]**6x2LtiXRU6"ݫeGa X뜕?pM# EJ8x:;9^92OvGR֡XSp2hȨՠm9 X{+f g/ Nt, % P<:Ҡ#n@OLq ?'V deBdh謐G9@PأrwՒ1Cb(V,Qx;'Z[͡;s*b [] ."mk;44 L8Fmj&o y  6yRow̝\ݮG^_ y^րEwϑjYKoejۗxi3iZ[L1qdbx7F6G>uFm6RG:KDctBa/ _]*x-RyLoD`&1kf.1Fyxu&`Vq@\5?CK+!{ '~55ZUVR Wy&ktd Frȱ9 mr*"L Mֆ3C[P1۔/ Xfl^j4bZefAJ~)'؆8trY$ԎMʋՠgz8$,+8~jՏ(5*|$Xd# U  m9D4rσ )² q!rN'.s-F KQs'%!]ypezfIRľ.p$G)Mpf'0FWaaSX=s)(L)u`i%rkktpW-B8L MAf %G0 "\*IIJ}yBq;.j0Ik L&PІY#?~;70$ c* Gk"SFE1@'?zryb׿и3 jfr̥(PXM Z5E߁F }}= NlYjc_,ުCVۇ2!`΀FB_q7I+ yc0q>RRN&]#g LH ӊ7S{EѳIU BZDXR NZފ(Br*Ro^9ʬOT݃ȁJTHOa: Q&$phެ|_ c=i.j =( s@B ȭzP^V\}Y2 L(\jXQH%'qd${q>V8:ze!q9$!j&׶Zf2z ps5eZ^ä؍8>wœ/<>y:||NF4w%EvLeI,49YQP_ :툂X}WyG늷 <Ŋ,flP3qƅ§o )~^h O?,o_n2$?(DX$ocJK`s,V.kD5YY<6w)e ߚkɱLA5a\]ܼ߬F|Ò`$ʊw'?^`puC KyQ7$W\i8>5p91dUcuVVLaRSп W Vs2X/G99m=-y.FpHfR 0Ֆh?O 6up=K*AN[QZ-Hozb;^|{CIVX_v3FZBm. ϊagwY\cY='pX{wNW)Pֻ*TCT,aXßbkQ٩׵ϕQ_/>;iiM5/*ľ>8a`zgm?sfdmi" R-u)P"zנ9JyPCZlwaKd;{ SDb,G[W)P$sO)^FN#cS~ua .ط UkĬSNh֡uR0)-5Սi(k6\e2#c]b6լQdY8V49Ʉ"H5,b98W=0Z~A7P<ъA;M۬ϳXT@Ynfg0m j6(] @Zt ki4K%;ᤢäb#hZw A.qZI/1y$vpF,ލ/C՚>YGhTL~yT.J ZK+$yz}t5ϗ1ţ!F*" Wn P>JoWȏJZO%X?QPxŸT.M*'db#<>QGiR ܌D]m~U_yCm^TWώ k6)ka٧]Ks|Sky9\xm"i3@nhnjƊvgbj9msTVz Wfе _fga] XU1_ 7v YK#C 1. 0x1H6ZUFLʚP <_W}j2mDsZИJ>_ )riij՟cYi u 4PuC tvHhl]sho7q~hd:d Dl;hv/3 n1ƪdu.ttn1. ֟,%E U|B.;0߈6nBGPջg(;zvV"M5=,S$>z.z*g{K(&lƯuY9̸(j,]eeݒ.z%΍OwJ\\Zҋ7C:=|sڽi⽬X1X[r@¤=XO8C ȣS@ @4% |]`Mc>79q.n}EWWYDȼ͒1Eju,}m㉤ڶFob$W2hw3^O)Gxkf:ы)I,%|;K'Ñx1u.KXzႛQՄ ܮCsl^Gm (8G"-Q5NHևu% &)z(QXDOڰnŒ>L%W!:Vk(ȄRCXԌ kGnZ_پ`T7/@16 *lnΌVwѨC0m7%4:j n hn+:nX&PW[.(^(ϺCg+R=ȽWZXs1B`5oˋmLY*9P.NiO<Eks_׵9淵y96l3TR%I:犰f*fXH+):ηu##QREUњ"SOD}}F堕W}6.C0X-QQr|p~X:WZ H'1K#Wyfфz!iQCYNrG^lHE:_IB,$삃Ev7^Be=_Gg<>cu]UػT'e &x)ٛN6STLr!9Cxb'~6Ci^ĝ4P%G{qj!h$r_e̬JEk¾ҹ-'o.2ՃZh/X6!>endstream endobj 249 0 obj << /Filter /FlateDecode /Length 360 >> stream x]An0E{HlMc*DȢ/wRx?Eoa?DXI c%9D!E5`Y +C>DʐزQd%:VR>D=+(YI-7b ш)PS )HLFL511zh`ˆ)0Yb )`֬8)a@VL!S`h)Y1R+ywγQX4^>{ cy_Uno Xendstream endobj 250 0 obj << /Filter /FlateDecode /Length 13 >> stream x syendstream endobj 251 0 obj << /Filter /FlateDecode /Length 7122 >> stream xzy|Uԭt'd,MI@i#;Y4@ 0Q m cdpğ AψܼS݉m>Tuխ{|TPBF'iyز*g>جON'1 I $)n; 6 <ǩS{b~zܬtS35,Q<͜=ef Si. 3IvMtY–jv,&s-zVض\' Jrt9ȣKtU:GzJssR4V>5fnr$ !Gkȁ: 9M`/> YICgRVÖو <nuGsYL6 83Gb8Vg79NC֜Im{u\Lحz:'kP~y݇#*&uΓ]8>t1TxrN*eeK^ GPEVB{M8t$KCH!)2Qa!E5c}%u>!5`kkX)q5Wk$_t2`e@(m#u>i ߐ䩾]ϧ~5wW c"?}4>jͧc#"d*F\dQ , + _s6T?:7w߫{.kUm467M W| WF+UЀ6_fMe&|!seUpI'nEp(MxNjA"8?>0$X@sUpL?+L Xlqv$ xK_)  8.:G1v vvx(V&h/~8$*8(+?;`?[{v?v.4zWa?mu?eV*"`6Y6R4T/mta 6^*;_'xSe]k;nW/ Xr_uVI+_`e@z+,_֍/<|.Xj ,5ʋ` zj/{ xքg (h}z"E`a?<%`g'u+&`V0CMGL70ME0 "HdL M &x@x|\h~60{0pF #{uu=aq0$·` XYW~wA@@?wwzN~V'Coyz^Mг@\pA ٿ3xi,;dЭƻ]!gAt7t7tJNwA: ~RHvB3 "HlBB!=' b!t((TH)2<"jk8!nv6 /S(@“" YW. h-^A3/?ȼŢJ*P($&`n&Uy)HfYfO2%<b*tVi@_9 jLYbbBn$$J^JPiJdEsyHUHrlIT`]7hht]Hq9ݶqN8t@hJD&HIrhNv3i7=5';R]s#2 ]ZCb@*Rm{wQ^kG;Ժq^zU2\͍7q56r6dό?z_whf+w,\c =ѠpPamu:e*nTc}ٷF}9T}.3њI-.[[7Om-`l>\*76_=H@tL-qxj J"*d!fgc׍V׮kY ;LE$?"'2⣩v)1ݗD_b,-QeQd]6vp\ 1 qR/U;L "9Q-,s|EŤo=Z|b˧ YŇ~:u5*0$yCŦ))ssǍVwV>yoCx_d<#)u5g@9T%BZ[0ClzƢ8o=e[hl:KHL&};E rL:;vaky9Ͽlqˇp%3Lg2.]Ԧi9YtEi܃Gř 7o}׸Y] ͘A x ^+MS2 LAmM;cgC+3ვÏi㧹!DMjmA9Bxi lDJJR"*jV%R{Y*5KףMS(0J˶X<%ڲ9k\w-]ӧ_oD=C{S6vEu'uD#Js]Qr-I<We#QDP=:g#͐n4߰fyV^z<+>+!+1˗/-H$|@rA|ABAb mfr_yUiiom„B_ā3}3|eI&;hvZ6%7g{6Wt)uS\2iC*n\m[Ch0Mg%-aeEVGh(4b#Mtɧ\zKY@2!@>Xc:Ij1)`0*sJ)y1YL+BK*REױ^Z;+rڪމ/"GQfu> 1X?Tt )I/K RTڟ1$.Hף%GI8@E ̾7Pv6k@󟊠pʙ J7Eu4Qzl Ȧ8yKzycC1hEIHX0s_lw)Jk++WUOjRKVaoVs}R>QQv xI t̥m&q)3Q)5"7G9'+Io,eܠ4Q|!Έ|Ub(yy .4jX'Ӣ*(;- 12tM5 !Α*8G\U 6l9~C_2Ο i";U8^f2g:jݭw⩺OɻY=^qGzna!/ez ј Dq1 E#6Um.OJ>٧-U>ї\)g=<-aP JPZ^[pecqG1{&Jx\EZ^d#O6IOe:So+:rXqX{XX'mqw<7hJ7ͻlmΉ !MtZ2z(\vpz믁Pc PS%jLUD>3Cиn·)oQ}m|P99$cɓd&YN4nI:S|$[y|.eelTIQ&Y$Hau+,å---Ѱ)gBt|k nGq;q;#ܾOpk1sj&aRXvuNEHC>{ X_^.gzVcu]vi KUC/ECcXcxm4HD>>^Oe5v7SMF03zKr(cxl1gI'xIF-3{reYR0zzy,.hc|m>>10Gt R#Vƨk#ssŴMէ99 uc<-6* Ҩmtltn388kVs w E8 _pͣI}sꩧ6^2J޼6p-#$񁎲[$rⵕ [RTUTqJ T3F;}𤋮9Z:3uUj5.~ښajdu{>g=wV쨭W=P?niyK)I cK|xˁdr.R .YYUd ZV.-gכЁ|+/udj3z@eXs> 4w8!b( $(3S'yd4iLoj^L w6f'jBŴ|SVPja_XCRQLdLymQ!}k(C Kd`l2+eLZH:HzGiy1}^-+d7)/2/n&CلN骉bXřj+_EAud&s*ɪðs2!6TtWHA=$1]di,gcJuǟeu ?175:AԉgJ6 mU y)~Xy[X Ou)f,+yVX27-#[Nʞirˍ,SDY2lT7Na-|%-6j({^(Jz\1=>s{HHfq79 2-܇})]WICX׳<&;H :r_IN5 CH[oZ)g)xVS7$lSjy~\rf?}ܼ>[mP'8endstream endobj 252 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 b C+qP(/ СY:ߝ|pFcpƲ- DeQV-Ɠ剋BwOϪ> stream xkLSgO9Xu^d9ݔMnˈ-8 XRRh \J[ZzyP ( :s mɜ˦6LÒE,پy߼~`+sۆGdz)^C/A31c96///jAq˸c ~>CpHKdyb`Uj R ^KN xO"  H"TBA47_P V%V(7&%)DD(彳z@ >E2aiBP" 4 Gc-p _w\UTf渾tx.t(G t~#Llz[l}D˩,&NҳZG.Kk,ہπ`bLjx#~ʙsLߕv)4}>ۋbTSFHׁŤejB RXI-d AǗ$FEѭ ̚u6&궟aئfԍتX3yQ$zFDySF=j3}B|VG['sq'x.^kb>_~Ꚍ0o@a8f#;`uS(;! $wbts~LJ>塉@/ŗWptw {jeryLap;:և .\C=10$++SDRhזgɱqkBS >L4VЦk0-h-PAAch|}/76 $38iNssfx9ؔ@ܬ=.> >> /Subtype /Form /Type /XObject /Length 93 >> stream x0 zO5$P &: p*%5NRAKZsNsS(̌ʹUu䀇u4 endstream endobj 255 0 obj << /BBox [ 3249.06 6564.82 4999.5 7021.95 ] /Filter /FlateDecode /FormType 1 /Group 92 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R84 91 0 R >> >> /Subtype /Form /Type /XObject /Length 100 >> stream x˱@ D\Ul@֞tb Lx^s+y!|HcÊc/j& fEDhxzy=E ~b?"*endstream endobj 256 0 obj << /BBox [ 2282.77 6591.15 3139.62 7041.23 ] /Filter /FlateDecode /FormType 1 /Group 92 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R84 91 0 R >> >> /Subtype /Form /Type /XObject /Length 149 >> stream xݏ;1 D{5'qPX DM4񬇚p M- 0N4)=T3^@3 ɹš)*3cqgTY#oүL2?W JUMO` 3[endstream endobj 257 0 obj << /BBox [ 3142.3 7169.97 3226.55 7253.98 ] /Filter /FlateDecode /FormType 1 /Group 92 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R84 91 0 R >> >> /Subtype /Form /Type /XObject /Length 97 >> stream x @ sW1g* _ &$Zi4eE& TTpilXpplɻqSM_=t^%endstream endobj 258 0 obj << /BBox [ 2125.17 6421.24 2209.21 6505.23 ] /Filter /FlateDecode /FormType 1 /Group 92 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R84 91 0 R >> >> /Subtype /Form /Type /XObject /Length 93 >> stream x9@P9ŋc/@U@(E )$ v2C \62ͱWn|dS߫nh&endstream endobj 259 0 obj << /BBox [ 419.9 1232.66 5610.09 7949.37 ] /Filter /FlateDecode /FormType 1 /Group 89 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R84 91 0 R >> /Font << /R88 94 0 R >> /XObject << /R86 254 0 R /R91 255 0 R /R92 256 0 R /R93 257 0 R /R94 258 0 R >> >> /Subtype /Form /Type /XObject /Length 959 >> stream xVK50 iVJyIӇq\~e3䰻pSU{"Hn\<{3*: j'@]vv,6ݫ{u݁뗝묎Q@ULu"_׿vFvqXOW=e5XkP_P1QFGrv9Uvuv^lmWK@ܮ,Y[A#z aۋa[|ޮ ͓[k.^K41wFcVVw`1$C=?3 =d8!tXA>617Cqh0T( nϼgz$m&&)cGwׄ >,k}d0DLLPeq HwHhХsDqCʈ }QO\9%:O$:ea7W* LL,{ͼpVs ÁyX`nYoz9[Uv<cAz]K麟j|\8hr\I9FE L5w.Txr:\@glCYTDK^]6>O3L26h S I&R3 @;3cÙiGw=)0?mǠ5Re %>{8iJRKi+r7 ZgQ-OnܯW-):J4(qԛƦD=gCˊw(t-x*͛RVSHf8x* SWD1!ɺHI{g}pq?yCB>$xC`9m4;\ylO ym>:m) Eyd\>&=C?0!@endstream endobj 260 0 obj << /BBox [ 1030.51 6321.08 4999.48 7330.28 ] /Filter /FlateDecode /FormType 1 /Group 89 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R84 91 0 R >> /XObject << /R95 259 0 R >> >> /Subtype /Form /Type /XObject /Length 65 >> stream x+240635T03623P04г4S04032T(JUW0QH/Җ .\\k endstream endobj 261 0 obj << /Filter /FlateDecode /Length 6007 >> stream x\Y$q~Gtl.>mR)QL/z@u!2|b *e"?oT7 +^{g7wGjsy󑦿n?כaDp*7:޺>UVF}g TrYksgSFwg8glS]!5S6 }݃^m5PGTTI>rXQ쾭|6[G<)P&=|ܚ ³˼ۧ/`,lQ,U!7u75 ZJB>>;szO!۷'hAk 9>i:Hg.Va}XYSr m=Lv!8k=EdrX_O z$ @лWHS99kWCA; bGRP&Bdsw@2ٙ 3hdKQrg99IGhc|-4!ltIy+)꒤w7Pi\@'``K<` ߭Hu'vU dȇ%rkAwDQ6E0YVX$ ZJe<`SSÚW-zNP&CKا`6 Bmxс0M[x_M[kH&pLQ6)Ds]}xP/7>5|XG[ǫ?sm1 }e<("wJ-&-' d0!xXDH-X 8 7o8Z0,4n<^5n|tK^ܘыK>8jX'Uw114Xa&I! 6c9Fh<)YC]mx*Qye4]0 >žfT/8LpsMBVٯ2``N܂e2!7k;W;3OטIU%ڙo':9Me2P޳R\Q0SNzӽ I%?)$Oyϳ`$ӧS\%\(E pSTe((bŀd 5}轅)ǫGq< nw(N/%v_?7uaq9S<7+Pߞ-A^o .E@(MpZ텔 OUbJa`ЙF+5pRX>K_ VAݕ'_ʮaZf9G 3=_8cr@.^Xwh@~{vƕ L\2TL}E4:&$Jak7ZYY;Z^[,8\0P0A 6ShQYhS!!`BVW14 n;9H+ʬA!QT\4n G5 ̵ϋD^"3(cE|oHY0|W] ;"qGSky>c\(Bg2[cM%bԽ]| zo< x Bo[ݾ~狒/9f?(_2"Z"O.%(YEUvE,hr ҳ]56D^yjXc,58W7YȬ/IL&G2=xWJ B3`VRV Gl)ѾdjzM,OEHڳur8"PLOP>ZM_\46zu"X縬`pPm q֚r_`+YjRyOi9AbC`ly#Vv= K}n,ʎRDH-69ڣn'䮆(5гIO\fHYDz@]VD׫rQzͦզZ&]p[䦀 1죃TQ:Oqԏ5E pXhXoR(>ɱ g֤5;휗ÀrmݶxKA\☐ 5_ x.> ُ)dd,{[""F9GS_;.50Y>+5.kҕ !OˌrH_+r6yDc2 ৾䎉ּ( , @|(!%q?b邓m3'u דT%zjȑI#ðoF1}(q4ݞ =wO5c^%y4\kcbKS!A vqh6+~3]"Q G쉳W[nƻq1M`1bss$⑳g1՜-5lĹgcn?jF,um:6s3*4TfC$,%NO{e~?^ӎ115a^!qCaٖRK\IԦ\JҭŚlzppvwÐ'I6mpNNEVίgж煛@0Ki)`~+[^[ak|@e-%EOqxoC HДo Yis,Fb.t4#7m)ߥX}*Tbnr9nhYiQ pBx5/!X8("3!]N! չsxa񉭭$rMMhؘ{$ T*}aŷ)ă1za+Ex9 ծVT ҿ> stream xn$. /+ܗA6|p&>Ԩ%ڬ<>=լ2l DE/ó8<;@үG0""ãӃTyG[:U51ZVH-T mwCW:t1J,{!u‹ݭphe0)u ںRZ},7 2"xVNW;.tW竵֪Rw( tăRn{^н.teL*d#p2MD7^茉ݟWkt,WwP7A}}pEYyR  d<%q'i}^2B48խ}jaHv]2(C6Há ˰/o f2*6XD 6gI|D ߎ.沓&N̴ö6U;l݃.GJ= VLT!BhWC=ɘ)!S; mSwoœe-R}Qc(N yǵrdg5(r!0)kqhX81X4b6e wM۴7!L&p9k ϐpx1IBttRЗ $ g%B7ow/X 8> I<%6Vt@ 0f,":ʷ[|+:PlI! ?mF; xz{kBH7T$9!(L 7 B4%go!vqXi_2s/sk/ȵ7kg|h|jp4,p'FJ@ 7{́y컇"M7D4)p|Wٔ᫢LVԓ&o51h⹼ii`)Y~ڌCSM, <w0 'V]CG6A yjrxK -B|"{U@ gM2#>;vn#' .|Qm4j6|X [မS i I 3`KLݮ 16$JzS-dIjO3vPmj&)pۤg dGxz0t&H\hgeÂhR:111*JP!CCս;d̡΋`rڄ6s1D^}qr"j#Ӱk6SIHΚJ<qaAyI%>x٦eR0g7P2E/I'tJ(98G}qN"͍KjtQL/(V k]t&[^-OdlR ~4b9%?\uDtR% ,-IoRx41\;*LYlZX0(A?jTU40#^ƦG2SԦ`cZ+6"R%MLӯHڶƈ"wD+IZiRYMw uAuq+ׂB\Rp@.Aۤ?IktӺBiff^y"H(l/ +L#R[&r[@3sf*c6#Y*zS,Z9- W  mB+w~VkU+ WjƔ(],ޮ})=YC{621L 4dаhznIp4 +/+>l ?+u/$FF4z& 8q_4OOtEMbTo(yidmTxr|YK}b/|l?UMʻ]j1#OyM^VL,2ˊkoZ:iҥ}mo*iK' qLQꪖ*.=e9k{k]{oPD!"@/=J@Zl~Lsq_ݱ0lY:TMb3Mrҍ|撗 .崸tz*H{KqCeP(G)%s}7Bf49`: ]WJN'9.1^qާSRW{zI`΋Vڇ'D_bA[1\ K6*kxl#&`6j#ma!:|Yd.`,PW9>sfZCZ5!1!jKP \YeUZ*+x]W*՞7CmأayJ[SS Nb/&]*_Uy_U "=tBϵ/+ϵz k>N,)s~bU[,|?ᅬKiendstream endobj 263 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 y@B,KdhU1&b B3l_X#~H0lkh2qQvB)KYG5(Lo#9'dStB`JM-Fr4-MrL!`@Sjendstream endobj 264 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O1 y@*CĒ.ZUm?@o Ct;:8?%0H_#4YZbLU`@fw5˩=^RTn"5쌑j`4)βB`JM5Fr4-MrL!`ASlendstream endobj 265 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 418 >> stream xcd`ab`dddw 441H3a!G=,H _7s7B߳O``fd/mq/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS ԃP%E )Ey LL@b2X9wʂ(g!};{%Zz;5:;[$6M;}h L5mbSvwLm0rw&Κ1abOo$iS䀶xw߫D?JFs_[zfr\,bi> stream x]O10 Ԫ ]2D! }Il[6|/`,@[ 4ZebY8)/d+x@fw5|VK^[+x$QESb'36 7h*q\B in X3 sTendstream endobj 267 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3262 >> stream xVyTW "*:(B]T6Ee5"-P&[Y4* DF$,iFbkD3מo&ӧOU{}Qz(H{LEIl1ʱcYa @x (HmEpЦVVۓRv[#MMW瓇ؤɊXe_bT(e7o(RmwO3=#*skVtvLl\@|BP$"{KN6OS\* S?P( *Z@m6Q)7*rB)*(ojC(_ʑZGQ)#ޥxjeL(j*eMȦ&-J=$5iϤsLq,=d$@Et Ƒb޲.9;Ŀ,}g3'L.1 f5( B#*: :]p1wC(EpZ1v=z_3jR("ap@TFi73@E?BT_R؀ZptM% /\j욅2{)r藞u?a0 Ҍ/(E(vdd*l"|poTu+\B×Hi݂uR j1*yl`=9,o`%.[]ͮxjk p-X\JUnichۃ"){9Tmh |zYf!{w)]Hl_Wfwd+RN)o`u=&η\kVPJץ#fc1L2g灂Ŭc{ڕZ!{-r<O[ngSajKS/UCi^pwb{b",nu d-2|ǜ-+0 l~C03Dg G%шa {*{#ة*B֍6!2A="s6>|0jh&d8C9\X.c(*ߝT9AUhhC!w7հO-|C>oኵˮ4'tg[dɳݧ>9i@)0e7?5(h￁>؀/ha, vF=-(|g8 l4 瞪bK]؅N]4/#0 VNW*[~u=yو{Jx-n[~0Y#nfLa۵݆n":Ctm1j퇂]\>C(r W+_:RqZ0&_ jm%I vݢj8/}v}XGJepxcogL45yM}+=N&/>k>+~;"7kk[cq]iM+tPomߟP^hSY>rR묅=O%h ϴӤ^CA&(&=:i2=borF$\O3}NnH1RެJ:0͢ P5OZ l&d< Eb&p.}ewWdǘ[~~˱>RV~ejݫ0yܰ3*= TUXز}2³эCX<+B#֤Y!<Ź}kTmҸ ĺ轸i7V l_B}11"81,K@& 3vYݩCB3!pXkߡe̟~{QQW6}!rI4҇>8QR\F t 0dm6[,{?7&TV6d#^##Cqv݆ vu~"#x,*G ?9ꗜqme;g]Js^)؞.be{cNj^LHep6Lb@C/ShHUgGXDoΐ@_t/ Xg^ݗN>xl{юH/_%m~³Cw+!T&@# ~WHOlSyFFzd:†]o %dsynر1V?BЍ/> stream x%KSqq3O6fF~FjTz1K%vvv3|ٚo|tsRY&" ?HIMW=ɳA9:L{XYB:% CIsRMvʻyӜ2PS-_l ' XwH:BC.(Zm%М@ٱ4CÆ {qU3;z<q\bf\Gh6۬5C㣟%Gc9g4gGeyG HvBrNإ~[n\ ?do*6 v\/6/,M}7n5?փȋuBxd0<֤m%R@N ګLSZaa{pNkGOzky;23-7" B|e[J !( % e؆LjUCTǨ?m}ސ3q4eݪqwzfjG3n(3{J})s)xHO -F&6ἷߘdRiMh4c(Ӧ?bvRt .p,CrsP+f endstream endobj 269 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O1 y@ЪRĒ.ZUm?@o Ct;:8?%0H_#4YZbLU`@fw5˩=^RTn"5쌑j`4)βB`JM5Fr4-MrL!`CSoendstream endobj 270 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 y@,KdhU1&b B3l_X#~H0lkh2qQvB)KYG5(Lo#9'dStB`JM-Fr4-MrL!`BSmendstream endobj 271 0 obj << /Filter /FlateDecode /Length 4443 >> stream x\Yo~#@;v`'0'9DYre.i[>U]=ճrq^ 1j888<; 6n Gφh2Q.(b0~B6r"j5\SJi978 ^ c+܆pbTv'Kch y+Wlh TVr8k Rk5iӖhm)*H I iܰCqq) e!5r*?a!Zaz3oR8JZ1Ł ^˓ۤB [ %l/7.Ƞ}pf؛p0S:$ 2uSFnQ>n: +-ɌkGov+wD2J$ʐl:KᄙT'HG;1v+.Sԋ< sn oUlϹ4s;'(:) Zi׾W@.xIkXT)z;lH뗅fγ;p۝#/ ud2Qgg<%d͌k&"O^PG}(#7T@?Y1Obj"@(߀(9s:]BPFNO K_jؼVauwh.4 5ߵFVY+@Mm[H5@j?`P ~w߃GL wa< >wӽ5^aW|-n:]-PBNb|`բo79HJ󖝿ê^ »ajF6uἪ^vDuyVxKI*I p(;?Cl%7y[PnҙrvP~GA~)K{fyL\e@K*@- WKfɍ[;ǫ{4TA>-b1M>|X*WpjJaؼ J4Cm}t-#mZuMX>|O"+~~Q:c}l93|k/QǬvj3 Z>hmI4'0z%ߒ݂S1SpzrGU?Ԁibgj:: VF++r#*`[4G95Q 0`3QOGtNiKSg/ldM2m5L}ND 6IG%K \WTtfDb!ʍtjZunm +:OZy^H#Rx0w5ߖ6QNSbq[Z 4LI]F9_O'^ 2 'FR h[\!0NqcgΙI--22% 7w2b+ALo3mf Ahi#kYstSP%2"u4^I<1^Qʶ9 E?A]pGnÔD!3<ϳǛ"Wť6jJ^UrS+yS+y^Ur[ɧZ찫v|m޼^z rw|V1XemRau^,1,<$MdfsY2I$6:ov1!E?{>3, +ڃ6DvbାM5DIJLn F^uTZXe6m6)rZF4JRM)$F~t.!Ľõ~9Ah!⪖R%ܚz5|‚'kby PpN =Gbv /k_KN HKv,ևlO8\|;4Ȧ(R=d% YU%pRvu#g<|w>b_t`A*ZvU%k=Df;!h'"wGw!,B' ϛ_LQVGI2:{LA ~4<6FYNR=h+:84Z}$Ҫg!,7a>pUnA ^2puN]--$CD(8b3V]N;^HqۤcB&: I7*}Z7tpQ{/ dvIyI%#H7Q?@c/ذU/"ژ WKřӘ)NꊓkʊԚܖSɸ?۝ws|r])5+9 YyE!#~L`XِjYm mӓ&[qʦY /ɇ3NK5a-VcIq &`>OM6Fy|\f{rdFEX!8`D2blx]ĝWD$ov/)j.XMu s{am:%~,ː]i]Ys3J7J"dI9}ő㘌nHȖ\[h;1ɮi Z]4t^szl^t#d3;!]>:DFRzrW"Wn.+2;Of%`Fˊͽǎkp.K 0 "?hMRA;̟8dͺdJ\mU'1{Vy3[<#1 ⦛ռPP90EjH ^,MkrߠwMu^-=cF~&mkw{;NtۭR6Σ` LZ<7ABjp1؃ =&$> VhW`'(mVO+ʬ<]}}pǻuvߒ nZuۆTV /nD\T7Dz_i([P:0wX3jLeTrOfsRvdUn\]On]X||Ygf5ӯ+ΥnPW *x|O4ֱ.M \ߓ 57{72-@o㠱._/*Df%KyjPSg!).YD.ۺȄ>i8Џ6 \2ڲ\#c6{.7M*dlvMg5-`9G'00G7zUOB6@7u$\= }W`js~[R#sJY{T`V6()q#X3^2bh B;5fUPꛩN!G^Kb zSڜ$`M]vMlf) M#pȬp/X:'mѪv>JW.{I {jC9Te^)q\zh6#qXuV>UVi ]*v/LdE滌=~F`78&n&Xs;2j0ߪ^cc a-4)fp,D]Az3*em!5bÄnR6tSsK[O-ĕojl,,&!pMdM6"-\E'Zj/;,$, }^ɟ+T6_UiJqUɱ_TK%WJ+bSeϴ+躒ݱ]+Jwg= Lxx^{WNhLOEeUd3;dbFm=Ns+η2Ow5K2f)z:556]e1_<;;3wsܝ: {MOOSgSfB5=PwǮ+yZm\nGendstream endobj 272 0 obj << /Filter /FlateDecode /Length 6884 >> stream x][o\Gr3O070 .#RKjh,Tu9]gHJ~p먧uөϯOx:e*O4㔭?}q}_s0 S~35ym\֛o϶jR9yMsf?ӓRٚ~9>l*=vH97ms>2_FP"~{uNP}㚤s%A[hlMޜ96fJڗ%3:cRؼ.nDVdSkeCڼm#ԍqJO0S;Osʞ:˛1M٤ӭSoޗu)erhu5}k٧ {(.z\a _jyoة(D8«6-*n.q.漥_bFʧZe:\!o_ԕk1rؼ,d^GfW()A+F\?+g\&@5E VYt&vC' YyV9qd`as [aK:?C@~ڕ{.uN CrO=Lrfskf'*#[nˆv|q:نo̊m,$lɮTG#y:o78? 33:u"ARnf^|I3#ovIJ3010Z(j'AW)Z8^ϝ/Ɂ&HqqX)~1hrQ)ni;yA'AN`wCR-5KJ K3 0;P,귋ZK$}F-h (H^4FB9z9rJVÎKiV89"): o)%ă1:f$BW3{@ , l9F` )MJn cﲨ4sNpNpLVrhbDp˹wRxVմH0a\*DGYZܵհ`n͛|y6T:@yuUw&а7v}mkm7uyӚ& yddW~m^!ai.nЄ!r 9AY`ژG!3DMӟ jgjo~,C̻Rh&}芠?k Ai&}#5*D_uu2`wˢL$֠\%oP讉 '| &f'ya8+Py9wn_+5ߵ揭kͫaܚ7I?nf,8{6o#mi_oͯ?l '/iL.[{ۚw9ߍ/]ֳv?^R\KEj*ƫcozՎ;ֈ-}kSz򪙄 "@kbQB%;kPSDH%Kr{vw"毎);/bOtUu_xgpdldEgi) hzn̔Q% ēF%X[DL2{#A%k!OXEW΁@B5\ U>{HqD"h=:N+"#1 j[b'C^wXeR%Ґfwc zw`ޡԓ֋&YR2Қk_ּ_'7RYDdȤC9bY4fpPγ >BD |҅"Dtm\f1ٛ~Ddj{%|UR.xEv& 8z3ܜ[$+l ʭO;t:ր#-Y1@Z1lŀCF "9? ڑ5(?T@ @ ]V:s~aN*c+AN,Q9r՘-ee$iB= HE0V_ z43< k<[Z7 v4'ȭi?PwHJ$/ LoEf> [ i!._j[fibj%ax#*dQϣ'1;hԉ3޼J_`K'+X3oYUb >O=ٵ~&v|)*Tt. M}фj`=Ӎtj|k6b%ݳb-gJaHB{MZ8o%hUIʁ:cϊ bym YEc<;8퉔=!Ȝl~xM8F&(1@z~V r sq 쮵ăEC~9{M^zGqKv*QpoRϨWgaE!A4L1˜a"V/=N5R< yǿl`d phPݱ6qduW2Yl͛%QGBeU%ųb tʘP ( hfZBɋ;͌K>3_Y)Xw9KŽ l%6$f;{ּcF[, *'dkyA׭`«RyRLu `rLF\-3󂬲@MJ@1cygEƆF2]s`tڶ`yյ4 ʖhj; ~I#Aiٜ5qp%IVUu=szqR˶dn^x*ǂ7Hg|M2 9dL4$St/3ZE^ЅvZb B#rnt93Gi1Ca]YC'crg$\qĞl(2m ?$qsi &4(Sa:8\I $ $&KyckQ >xt!DaE4/17kd7aϗDB];h*v] W)ξқ@3Y)5i CRi.Coy8 :z% :o9uiPJUZ2+hJHj5Ff=GxT 1o浬=Uí:Fc Ѕɰ ]ɊB9.7|#ڬ9He-vq,kLEֈorNhbu;odꗜ]k޶&C~;l'y܅X+S͝|dưtgt5JҬ) @}h ٗb"KQ{hT Jƙ+2R+WJ$/pޛBx߇S&pZ5j#~=%]@+Sh.aƣF `ƪY]h)\%PR$+˥a)A-֋"*U!P18hOQ0B0z FL&foVcìW|uxShV䪽X2d\}Lqz2=R>7YB{PCbɕ|aw$!QR-Zk$P v"W)#\v_RG3\J_Ӈ!T{^ظGRS: ˒zvXWۅitL^^#;[rF,;NeZ߰)K.?.=V .hdϧץ"xMmF[ޔlb?b&W0>lX WP=ڒ[jGݼ_9D _-p<ƮwU3gh| MK0H4x:&7%T S,Qa- 62%4VKY:6j,e%Z΃eǦv,ElE&ہ4,*M!˿?_dqClF J оK%D'/v]+uxkZq)樍\DX5}y6E~(#i73)f(ԇY%0B~D4/ysg),MƆۖD 9i}{ ղ|P\W Iz` !š·*0X-&6HhJq5EK&E6*TlYX-9dhTY-.UOge23-9spgN5rj(!x#'!Z-^rGbER<;[z 3YԧU!ƶ X Pߙ;rgW | e #s*̺ZF.٦X$uD72[FFeTsZP7x?zN=.*X aE@3 LjAbeWޅ> 4w;Cñ|I6A+ P؃"``"{KUL;dW#Ld&pF+W3YKV=`֜Ջ?3SDu@{8oy;<Y}xO>D>]? E/P9b1U<T1)'`| \1b{$]fP&P-<TFU'`&({6w. "S?9*o ?_3L0V|xtf$7!RRY慶,p{ ?1&  `.! o/W'=aL t9W|j(@8=lX9r{El|ȝk3]qI+),k th*)Lz[N]jub̰%F<9s ;# RGvq& g%)2)I͵ۉ b=]x…_17EwH7# Y3r4#il¦RK6ʑ2RxZ[0x5sDm2fKY[7"n[a V%Ő (u3nhUZ32 Kk˲a®N, sߗ֟Sf0XAhKYRsأ{yIsyd5e>[Y %/AW+xKɕrd{ (ԺΪ:0.!l _Zt&ʚ p̟}T$R%#c Β6c[MH` Ѫ Ky˖!X Vbc>#aYf52A ŷ׈S].e]m^ {; n1j LRѭER4>f^5wы=}cp Aa֚387!Z¶i3+Ŭ. 蜽=;oEݾb'bR_  i!,]z<2q*F0,S?5D$8^Qy58ZC/sɒ1h5+ 3g7}9Z뼑ĝUKmHKKIȭJ?2Vr~`)b6*Wg/{; =ܜX0]9q %3a(qy ^:Q*hز##`zy'+P8?&~Ny UDq+Zh\h(utPa,YNJ 9&cr+'10NAF%endstream endobj 273 0 obj << /Filter /FlateDecode /Length 5200 >> stream x\s7rra6KWuKt䫫%W"y"<:YNOw4reKRz`FiK]}VGߎz;>FX =c8>yuQp2'G/_M&.-ŤVitӤzVJ.;84^b ^;\lA& os/ %`hirͅ龜W?u)MmlVҎ3~0t>,+hעF?iJ[d ح0+7q1&px]'a/kxďW)7Z|=Yh8^+3zkpA;uy8fz4ܸ pnb\5)MJ0ܲCEKo i=4hg`@t|wP;'ərwm'SW\^f8+M;jU=95y> f@Z7l`eCav$ӌ5Қa uV?Nh$dA5'#JH`zmg50Ii#Kx#%@c6C5tg@+zs6豲 # -<9C5^jG)@l5.-:oJ$H9Ls9S%*O9`h$@ࣩo" >`b !D>afä4raC7hYc7-Iv fta5\msB CusIϣ/t@`"6y4d"s!]_Gz}kwNN}:Γx G.8 ]$Kzpy NfgKv>}ł6A.J[#XxqGҒY`Qv}Sb1|2좮1s{LC d+IMZTgsSH[\k|u9lgHSdJK0Q%16=XKJ'GTBCb5P1`n3_vWysCf2ZHQCE*1įa"oJ cTԏG 'f(g$@X!! ^p#*G5Y'2vz [m-2.BޕhR*Cz(e׳0Y_-8+Xr{ص~kyE#%ҌEpA|EvZ 6pЕ+^¡c (}D`Mөb|:&8]+l: ,y9x!~mG܀i~)\4CL-RMauEfu ռBd$un oچ@5qIs X^)i:ԗq+lR*R9 @1F U<0>a1Lj;/,Wqgۊ*h%,Ңf uTijB>Ǿlh0ũ BXD,/@*س̑L<ݓdPx,R¡ qX>./yۗ3t3qМ=ՊpONH n^rimJʳXi[)P8)֏m셱{8Lea B_ݫi`,ͦ@7r&+Cךn,R"/g/A`MI&0MCEb%[*ÄrKP~ٛB0t% x50 xaVBʙ+e\6<5P΅h_maJf.,Qxj\CjO4*xd$} ?|6ޗjB(rYϸ,7ɖKg/jN-!*zjl3pn~Y8B|-bfs|igKadsHv@Yn~]_w]Z'c_u.3uǾ>Wz2S7Y/^5VeM{|ե]LgpՌH uPb=mz>XƘ}mW?\v)o3ϻ3Y`d;箄t1/k:X&<yUb\*TY9&|%y 8ZS Ro~N<~mr޵ ?UĐc.&^T%b`hIsU{?돕췾G%1Aa6a8և:^(2DN^(O4{_߻q0g`KEۛ1nʠmm_J(44N*ochmy?vVѲDag)}B\¶ŧj_^n^s;gb V"؟DYŭU@XOX=_t3D= 9J.Yhb/& 斣57b=Wd*vYpqDu1nV̔"%!%x("ZugOr*jtu5ɆJ LX!k{e^d{)GcxEO,bK+G/ŞY @PHL*|}|ۇH>0!{ oHMK*{1{-&pOG, Drap!%C,XX텄lYQ#NtJcBӠ%@]yB3(K}4"w4ɯD >txVL8 ~_dF =88i3)pA93zPǝ'+ 膉}᭖;i+=ŘxDtv?j焛^4Ks,K;_z^w)|ޝl9Xϔ݌QX۫2#\X$tJO,v턠M/.@}pR^2E GeﵲA*z5'g\, Gkth᩹~@{0 P}2ͳ47}'k~H`^UAsfRs/*k%6j щg`30BYLti#C®eǫV ˇYmM=v mi ^j} ȦL.JkMѕuϧ}P8\uЏ[ݗ?U* X"0&Bեk T.x_JoXp^y]Qf#n_ &fG?^ &&/oG=*vȿ̙3Ǔ,MϲoJs!oɾԲѮgLiɺV𬻇'K~OXz}[~]}2uOf騭2u@6o7ve|~ǖ K;3: Ab}@sZ_fbmT+endstream endobj 274 0 obj << /Filter /FlateDecode /Length 6714 >> stream x]o]"zIc$M `H$n$=YKb察^j3/~(s,~?t5{=Ewt!Ә=WѮMu2n|Oq=ћwj4>WqՁ1zR^@p\J!hhkL ~5)3mt15k[Q0 481pM+ 7eeqW{Ju;y]YvJ1-n mⵘuJf/%5|}`a{]RާẬ FyƄwxȇ{ X[Gp09lUS@=5\ ^(R*!~+B)N+L@ulpH6|@Zi;li{z$ [1T2i8:=ԀCu9asC$!t:+9alcQ`<C>.żxiuGoڜ~WUע RE P%H@l9hWX0;8W`! ]> )譋ﯙxvLf&m`/g \X˳+%狮?L?PflLfy4~~M(pqԠlW6*dma4&``).Xud`d"p_i}( NSˆԏzT).FLJSX5ۈ_qiO0!NRq_RsUplhB+ZϪժJs*t4{a8!pJ GYnW+9^11X?ْqFE!9M{SyGS -Prvwb-4:ݿB޼oo сٻ=S_H,0p9_mbeRh08 8WD/Pt=L1bm4VgL=zZ;,`ተerERl':)ZٱXY',6duF<KX#WGiH1 w`̼ &~E!Hs -yfMp蝶pVmEʍVˆAh }"4['oY v$:8'RBɪ6C@~ " aoeG"v'٠ww[tr`[iGŸlJ8DDVxͳZ 0y&[>yw Hxxcm%c"zJyF!Ă aBψ;1SКQżWΑk%l%9< pC<0Ueڶ -t]g.L0B4 WCdQèd0fZ ӄ*mG7'JK_ކ||\:P:U,( I#Ve_΅̎Ն7Bg*@p&AhV{"8LR~<63YtK/|ݥd|4zW[/ r[B?b5V:Z3Hl|9Ϫ42Ii~(\_f;Js[7kz[BHGOEO+$U?{U:1O#cϦ_ݞt)47ykwKSuAQ'U;4эQJ.,t sץyRW47ykwK4A=Z["z dx Gf HwYYk}FklӔKG/)̄ϼ8א嚑Q5#LJnytcA)PF~h},!,Ľ} Ma .dE,HW2mtN$$X ,@kfdFLu$U)GN( ɹ\V. ]@!mlv<&a``N"]ҴzK.&&KeNkcU}syfU_LZܜGE^H*IO ()i_7m'p׈l4s,j:,8L^kp4dzJ׸iϲgM8G |}!v#i y E [!0J1¯ XKcR! C&('W8z! S;ъY%x% ҜXFӞ翃r}r1Ldqͻʏ;8 _XE}s'bv~DUGj)_ bP˗dWT4!k <`Dvl2k?C:3R U`0}^4ߕyinJ4 ӉsގvIN2@c*d#?ȼٸ܃Zi=8yi~'6"M S7}<#JceBFrZkR%2LXBq\R a <#n=?|YUvG_-Yz4h[l%ۼ07n4/Dn[ףv Ĺ.M Yi>B"z?;.M$t>Nq]yw|_w}>dA2j&X&c,@і=A+d里X͉|zY{h/RXt4Lc ߿ZJ7BxR X'3`V^:"Zh몴-NPNh2[S a#QJ]vE.g)RmLDG&RG@+RMuGL+{DxA/{7Xn$k1RD#foW\dFZh^,r$.G]7Vƻ|Em)f5E(Y>UD> unO޸DTb'}LaaAx.N}S+:"/&~h瘧S:e 7%h42u;ؗut*^gjaN-f|X:d0w8m WñK](|̐UXY8;0.J.TL /HYNpPy!b0ja~!yb 6e4o__H;Y@.|<.`jHH`v?2D_E`TaͭUH PtFQ  sBPe)k*3]+WӍ+w)*l>1kǚ}YBQfIl*l4{\*_2dXjzkiMxTH~%𶆙?1'Ä\ 1|-$ŮyPMؤը+ Z!BL_1J2R)l{ė6 Q;.LV]zV.̭ԺV)#cqq rVҩNtg@ y z`rFI 8=\@7CkϞzd5 &.Ǽa<6 |Sn{ƑVw@Ipի>-uzeu!_y&޹$@Z,3r2TT8SW W,ơRYrvqq>q*5K'=\5—BJmͫWyClӜ;I"oߨuJn>ph"PSMT$gܵYrkټ;] jߨUS} f;^2jJ&NX yt]WQtlV43#&{Na ~EReȅx]=$z4.{D:ݦG^LGҙG!O ӻkT)9ߎۍ5h1kez`4tgvM!6`H\k`.ԸRLj9@:+*+鈙IM.S+kmEEYE22UWa9|a#)6LJ[yۚrEj.-P\Nqs1s-_iT"9j5+TdI(y]46qn4_2Ҽ-7ld-Phҗ׻ 3 w&:ޗ:)_.raU48\5R oU sO H XwW,V4]OO<AI\-_|e+J %C5UwO]Ԟh6S<& y.=R=DUS?#g "ϻT2w|ʂ>J !H@K*&_(>cv+uf!Y/Ape/&(J;n%4lC1 ռW(`57WEM~B}[r-UGIc}O+Q.Ӿnz;]!E#~Jd tO^~Uu&k 6趻%&VaÔG,JQ*@\PanY7߾ Qm4H2<&_d:VΜR*-YS~+xˡ~vfS}"ijp2k@) ڕG|\j$#&A_y5%`Ɨ?}:*vn?og;(_E8ټ?v;v\Sح MSwn!^Ou݇Ө.,XeW5D?n&mUZxήIFDo4\J{v}d"o-YϦG "dL"!B3p1'-> .4#$^t*ѫpOy}jhGg˓zU񙻥pq2N-c1U4pl;acՑYT!'RVWϹIk$ZkLM1=Fm&:F(^B?ї=<ǘc"GG[9|͝O,N KՀ񊷍|aly> stream x\[u~oT*e9mEicJJՒr␴9t zw) 3g>{ Ĝ]?:Fov{v=9|(gSvdzWOL1Ov5>͛MƄy=R6`qvsb)|9o/ǴLmeN ^'-1qefqo ~Үd<&=ܺigs.kmP˛OyWݢ =Ya$2186 o`dmJesl4ŧp~ڥ|qdcOOCg>rJkW~sy]0`w vR`ĠOt8_c#?!ȸKCmNoVJfOCW=r4x8ݰA&}-_򝐦+%ZD<z2N- $ eO)˪^&IAn OR=1&)aγXs9-mЄ6Wmj D,JnQ|8kE3kt%{|rY퀈a 8 "> gYRx,Qϴ[8Ab=q'D'')H<[0Y4zI@L7b!;Kd\p d5 2z.%(UvM\єˠS9AkQp(I0]M| ?oʺ|B!#XQ]8s8I*8jZD3/imvn.gʚe:WL:̺4%8c6%)"CJ v#3(=oG:CPXҖ&(߁]E|Λ?lY+,93{ktނYgYυH%=o.¦&Ivǿ`Ѝ;wmEn)!)ne29AФDthEf*c_y+R ;^ sl_(1uA}wMn17\ܱT4\3EU!༴5uʌ=C^G0׳c82!@Uz2sW@tb+D2tfچZ|9q&vJ,ﭫ4,K=APo;J*Q yQO%#YL$M1@( /- Q`E x x@1]C9B.]*_e&|A ]':i2$¸Smõ{Y<$t(y|ds * 20C`%yL᭰r_< /ҖD;@ P>1jPxf$@c6؉%0 ӹyKnzt:rU&@?dz9^(83 i_lXZrpel9}҇^/n(DCg2is T`Ixdzt:}|H<:`Bh\ riNF7m*b{:%sO \+n̹89p-eË́q.KӶDZ/(wUd\=@dWb9.-;E`VKĊ$ l"b#A2*v&p |]I϶ ,`%ltnI*"##}_|Ѻ,^ǎشh*Wb/'Ԗy'C"4}ڴ"PAMwQ7Q4~0pFh uBevMކ(&k?@eMu+䑫K,G?²'um`zyo#R@DU/ECX>w-IxɡӢ /yLOp XЩ]ȇ3Y J D+ fK7,92qU'{YP1RY̘v-yfh8XtFDoH xc  .+XleI?<,IO*3G9<[Sp~ Ƣ{"9 ^$ M̂ DBQ}Wgod{A?٤.׌q:.ks h͕pLgpxZ:k8) P)S#pBܳTS#veb#ůrqCV#@Q8z˦.ep^8QY"I߰-W 5 V'`f$"v].eMQcZ-7tEbͤFqvIu|'̠8*eڇQ?w=5Iu7?]Äu} ϛ MaQok!FPh\I3%XBvqM$oj3͍_D<Q[M igEρUlSਃNiAc2ʼn\?'@w[ֻ-m:@"U)+9]`A)sKҷ.1s17Ȩyݬ5;:{-,Hq]'l?[<@eWO{e@ }]783obG%oLKd,^ Gh"a V8\uVF.!҉K z/.:v 8%ir!/?Xr.iFﻄ v"dΆSE`%pkc Jg`nAS7LృU=DC>m$%Xy&K#,0';1[#kO;~!qKt ux* =ҌCicݟSKOC+ΥJ7&^.^–+ o/IK{܎Xz!nyvܗU^`/ٵ>{C_eaJl5a%`]{ 4h!@S s[&2+Ǘ(306;<4o[S*HJ~] d3USQ69$KjJ$`1K#/R;Qclw}X5'Ny!$4mHc齘Jy482[vԂ0G\IRLGV`11ohiKAAYg/Bdj YezvQO|j0BE#NG,C Q |) rAltE*#tNUkEM3Q.+lUߟ/ɒ%WG r+"˘p鮫Hb-lW͚ZY2UwIT:HhuIG WF3c8|,ۮdzb}y"JhACOL3:;_ HMtt6$}fB֍Z-cuI>wAIO䦅C\ mGCZIĩQH%ۄѬu-7q'5Mtr-=4Ǿ{.y 2mkci|>C%.t&Wɑ2lWSx0OQ)D7W0)*!6$N(f=^ otB4mr+C?щ~tokvD,fk2[j阽L0K4B;&D$OQr~1{`C_DDRRag7@!m=?0Vǂe 7YW/ x$㦻+a1#>,X'1EK/g>yZ] ˎ柛'Tr০x`ֱ7E{ܷǛဿ '=n( [pZScm)~bw^ CxlLMoo7ibo8s;dJ1ՓD7#Rævw7^IJQgֲXouwI[@&=0qyizeC(_S{8#յՎ'ox*.-8[rA@L V Q ̜ S[Ak`b⾿f4yR껺vc־ZsN ڇd]Vӕ%7T_MꆈD5VR|#Nl_ߓL C?l:_.bs|hN"T"]D(ց/Vf ?Ӹ1Պîd=d;<fE OhV)תpOqzwVVV>I7iuP.ZR./S&}_3?CRV'GC.7C`p;T*9~B/ϯq@TM'HD3@؆u6kw7bġx^vnJ>$YCkn;# r rq_Er/ ⡟*&>~/Oŕ-ef#@wpɒQJ\&̟^)u՟b%%H!cy~Ko=oGWp%Eyiد//ݍK;0(rR?(xudc#}/= e8ٷC+uD[[][=?-S&KOMxl.69}{|_6c.rGC$?{r_V>Orjlo?ihc]R7wp_Ǜ!G8/.ڣXmn? d |2\n4wĴ-G2g b8oG~6> stream x]O10 b C+qP(/ СY:ߝ|pFcpƲ- DeQV-Ɠ剋BwOϪn> stream xM1LQ"kQ RZ3(Kʼn>M^s<> stream x]Isdq}SA<׾0-[A -= 1F޹Ԓ̐t1 PKVV._fe|S)_ٿLnξ=])w/^qWKz}g{_ 34vaJAWg_x&z 5\?9F?Il uLUkY[6H9d}A2$#JĿ_8g$ya\tN@<MRHυ0>xw~aDR0IegsJaMDV?v)_Zِ}0S f18mE.9)1*?^wx-=cw.X9Q4 z2 7fa ݽS$.1hL h(xckOrUY&^ø} [_僲(->wz/.^,︰ٰ4`X Q`q}`5w v8vF|C`m/.LZc%m2Q7*~G{3@e-x\`&œ:_x)^,ؠ-/NJ.>~;֢붶AIfX504` l,j/޾{!xϬSaw6;;\W%_> 0i51`3hJy !ªdQhkʢTlc2cP))ʐ䀬S.A?u='B(309mv&4h]D)O'Nl`Xw"$īwׄL >ܝ#t ݁hrg$xlLjkPoų\0RM c}J|GK_|;{jJMG?[w;A;kAiw_ %%OM"W#*ZKs,]cE8@pJG{9 h^M씳ߜ 5 })5s{#¨>$ FG2f{/s2m~}C$B,?dヌOhG&ju{Kѣv9[BU} a6gyCJ$)KvDA 4wZUlV(EYCblM { {1{텦l l2'%C1?'~N0 ܀6M)fԔjDt4˽I< dyo:Y;T#2aP(* nl |ZIƇ8E65?5S?1~4\&IQZcJS_|@w*N ùLc GcfAW[ӗDL0=6tHs3N)2Ob1 &" $Ljjc$tN$F *=H#ض|Qkݿ8,!^ Ean9#`E~P&[;‡^E>8!q$b8Y-(T)p$W4M 59e l: L׬lܮrчٸXO*0 ֿ;ouT'rQƚ {yɮ?~S|WZRx> G1͑cW‰i,Sk&|9zD{9HxQ|%Kd [ENqzZF<->h=HϺA(0^]nXoV`M^e"((` J$!F;GxKBfB- νeB}Cn曱8&5LIYfʚ1Pq3r*;(6O.#}yA4upՃx2y(G!84ǷM1 %y bT\>G:[|SzAѐ~u%z뺱,C(C1R@%2[ vCTƾ4HIC 7fhHu-hg2o(Ұ7f!}ɞ vT{T۾H#r᭡o" 4Pl˾VIg@LܧJQ900=G4Q{e°Re# rz>aL1*Y1v0NxjF^hcHӊ j2`R1A 3sUmovMM<ɰ!XöCy9ht82&k%MF&pcܶ$7H1P6$ycQ":aׄHϣib()Bla̮w\aâKf%XH:"1k;;%q?rxe!ϥ˅]"o'2I>#bK9%4HOSz.q uDVr[GgnGVz[xQ?ܰG@[=obȑvGY['mѧN0LcDN3Mֳ8B@$9 Ƹ <VF7[y:Fsi~VY'F;}ջn8q9?[[/p: YϹ+lO kکXjKZjck-A#fH*oN`w r׏rE=s*0c(!smpDJ MK9Q:[Nmņt7(gQ0Ƚ8swttRɂ Gj4'J 9UNaU}:6/9 h+AرMD>xD<#s!"VvySĩL8]badNL?_}}٨8Ov-BXt +:[^lbh-PmbkA @vB|Z- HFA? -B gQ,O1;D%_cXrht ?_pzD%⼖]!%HL+mլkyR ¢Ah!3*_T Hyf7BۊfjH DB`F1٤96Qz&5q*;4>gS@PP#־ {r3!ڙgeKlN1śL25 D  f?9VJZOnww^wъ"eo oȑW8 aIc0Tk낙̫+keb &Jf,|Kh@ii$;e&>?92ʗeڕ55e3{ZxG b}dgō&3 k킈ʤ y,h|&rQةQ*उ/Y؛hHQ&[.QUf~ ē[r ܁EY+ f,F~UPoxB,:L|rnfm^X-KUݐN4% ۦ( <;! ޟOQ&_+|qqvC$VgA݌78,h^8~bh qTzq3v\()*I^Ke EvGT<8}/ 47t3+J/J-~D*qmr&N\~j[')A܈)arZ, TOH㯠 0c=C6יzj-i#o1mk*l(y35щN-KXeTGݳWz}F:1x@4WЖ׫n`i</@mpI?0#NNEjx.9P(BY4T4vMHGޏuzƬO1(XNƮ_Dw6"B"֐,7)gz.[f ,Y|ĥ?Z8B5Xىoc<Hv&BJQ(57v<Ma-egx!#endstream endobj 279 0 obj << /Filter /FlateDecode /Length 296 >> stream x]n0 }AC(6Hp4m{Ҫ~ oI%>2,KzspPU ݐ'yv[;}L@W?v?mjmhQ}/_+ǎs\#*p+p'4NƻxVL8(h#Ɛ$C !H.I&IP ӠNZOц7#LdR2{endstream endobj 280 0 obj << /Filter /FlateDecode /Length1 10300 /Length 6533 >> stream xZy|Tսϒ%3dl$$$!$!!AH`BEiQQJT* `nEG)-MKj-Gjd!9ro93 HaZS~O/O󻻼: @/]|ѲdP-]0Y7|}Y3@ؐ|ٹ;va1gmS2, 'a,j_֑H~mwthX#5^|/'A,L>xob~KzoJ=? 䈔xU%G`;v!sa+#KpCb $x8 Nf8jfw= $zy&,dB|C9κn=ScE`:ι{^NLNB54`8A[NAr$< O>ҟLt'' {]Єi'%L|#Y&xߏ$RKn%]dLE~f-k"!n#pE>l(I`RItczz1‘24U1ʦnoSߡLO+1w0}VN$q,q&X 7 X;2|NhETzvyIrC@D>"_P,TEmRҋO1,>~H'Z>L5L[wFwq0G99`(1)"S0M%B%Neg=:az>2{[ͭ,~20JOaÐLI [PϐvEZ@DCV^M PNݨ`37=:jRv2fGE eb ӟz.nZ&AKS XڼQ-ʈ~୵ux[mDe^8"&¸U6|I#jMm@mhׂm،k. E`^Di-QMKkֻ>}YJ><3J;z60&5yqZjmKsM1!&nVjj[*%m.469"Z{MK\=b[]7VzWlܟlJw=|OjH+' Q|y?2[&e; BpqQ uDhOU6:k̵-Sڪ[p|[n.u~o'"ږT }) zHW*-#-gwJMa XxE}Qo 6 'wR  Y#1qз\IXņlR\oN\'銷;aAۉ7vt#M͈#-!eΓ/ KR3,g qPA$ܦ<9SFjZP ''Qp--8pS|ZlK\<f#Q )Zz{5/z+X#ՆH!h4]=~S![-#PjT JDnKe˾!oQ7pD+$Gs U_pd8cۈp7A>us <8IDSn7#܀U5P+m&D#ݯt̄YЌڒ6 s 朜6!;Q?Lbļ!j7#>F%+A&FTg)UWbOLjo{_(*Ӱ<,`h vr=i$dw_zɅCr<1yNc ~s܋<'0Mv Ťovz6ȶ>Fw`džN7~zȳ,ųP%Fc̈SZ/z1`==ٓ]O[I](DQ$q'ʶ 1rW>kK>MBu 3k|N$ԂR>F~W᎑P=(p#/b#s@0Ke:B'S\;l0:J*zSDPk-U*}y]Ϳ+ڮ)sc#4w H$-C_aꜜI+v/_Pۢu㕥g{`T/͛);5%^(uwkF:j#׬nhיZlּtJZZEkI]T}Gj':Et|YM g7m&FvHN?T<{͇} x `t1:1`0psga]PX郘+d>.L⠬sv50¤W-VCq< ȓMz:oi-əzyʀSk;j UU9j1$(R#5mZ.TfQVc_W/}l׬i$/H@"?F(=3YkXP K n2櫺ۖՁwa4,"]NĬ9z:mcł܊tG|?F,ѱ7.m+}`Q~*TZ ҭPht8q׽.TݧSjj`ʈH,YxgxxS"B,X( "›Я䐜윜{[E#KT>=Z-zOucl ğ>K5ǿ79x[CM㉞_?>sXl*G)I zs$u~WM^b?-83p:+Sr(-+\˥2Ҏt[N÷daJ2|@Հ C8DPXѢC@J!eU®tqJȠ${dE t<En3@o2hf;O7 Eo}F??V{L$ٯϒT_?Ž7&ޖBT;ԩjW^XDǗ v Nȡ¡TEQvY̰b7ⷺ=|VQU%_Y2]1ΐk6Xf='qᑻR]8xzRo Z.ÚU:Ҝ Zҝ>xM0m M$bԴDC93tn9?Y-f @S^bɈґFY1-΢e H)w=wNk@[-g4;wŽ fIs/"K\[ޜM^_uqWMUsH?y#(`w]&=HxtJe # 2S/^LY\DfpJ gAĨH(!AaЛ(?3 g6Y-+o;OߺkFQj }D=5)x?eݪK'v{JY-z7|;R4R3^3KdҺu ݼQI*6l Bzã :|+3ys_ݗR(1ҲDP;%)$3ܚAmj/hZV=zIP2PgV=wަm.~FHD?y~3C2 >@qA&FDž';=4ɬ1hͦ:bB2Iu>C~Aq!yzɯ:?c/S,xsxۢ vEpvkZwu3|nv|qRфߚ**+u*CV~Y%,ytFIp@3S/EVXyTfH4~X,R4I%ٙlk9[V /Hf7XC8}領1r Ԡ(06x6!xTYݳ%~f7M_:~Z:bC#~T;;KNc\pVILnN馉TnI J;4}j ZGCi6ߢ)[O@]=VQ*-,ӵb5AfSIqɏULˮjmVCQS_Y@?~|/x p824AhZw;wwwq"miN+3Н2\mWJmYB@ .{~0Xq; 7I#3'n篡d9AP%bH.Z`B ce4oV+BJC`[mx;W}WV\eQʉd #,. ~Y]Z)u_>P?:ʟkyjp:\mς?RcK#.J m.(|CjW5UN Tikdq={xamx VU3UTj@pJ|n;sQLC&IwpofHp..\Lqflb`@:*ZZ֫')lz}-Lͬ|㍩nÎ;2GWelzrԥ[@[V4驗$Tцb84us]ASW n̉C$eh҄GĀBIp!,.[\ɛ@| KR|#LV|),p_z/"E2&T1H>5lv:ÊcX6kOU/~ݏ0i]0k͵edOwO]4~j.nt>o5`gwhqZXyRCb*`,V(t4B`֘+cܲqK~2p ^O)Z1Yۈ%R޽0-\={vvMeF+{Q?$e=?=[ùQ1Y0 &nM/%piJ}TIHr8HHbw(Q*W.I2Z2G? #m)gGJOΞD: tt ^RFQ=ԇL,eMv#pgۄ_*2]&6YpH^lw>BRi0̖R; ,R) N@ \}a7 ,nTt HQf$%^?µՏ5 ݳq{`= s\940w@#ne݅јא3k$s4_`HYsuGoV~$SL>q% K!5^Wendstream endobj 281 0 obj << /Filter /FlateDecode /Length 358 >> stream x]1n@E{7bmHC(Jr^G.0"ϟHGz^x->Ʃ_|[R.{U]c>H53o)WO{S:2w)/6C,hG=!Q!nwQ!ST1G**!X}T=qSG%Vbb㸉 qCB> A^B\;r 4 hQ!#!}>Ann|$- Q!ôƕnvhc2272ژ̍6&#s#wf x~j??,yt[~Rs>U2/Sendstream endobj 282 0 obj << /Filter /FlateDecode /Length1 12636 /Length 8331 >> stream xzy|Ygd}23L&d#!!! Ȣ M1 oTHdܵRC hoqj+dwgB_?`9 E+]s,,XvnY2& ,v\2.lk`1Za#F 50fFM_6Ph(h֢%mS }opALla8/pA_?9,0C73al|8LB/#iFXXx$olx @,'r,G0?V% (/;q['Ͱ">z5$^H\㘫~CT8]/?s>1P=O32Gzs3b&⻂색NLY[a<8RCn#dL#>>YCF[D0?hvT8AcpJڠ5%<'#8'(GDi;D79 )zOun'JZ=5ڎ]58¡͑GTQ9}\+&RW]6_3}VtjیuX5 ͙' gf=V)7}jSXW,mJfUQꯝU$TJkf)vç2!=#yG9h+ḓN:GaKkhj]a8 <]_nL/AJ=+~%!#Mg͕f\Ue 1Z8f\7iƊd猉b\B7HT[asjq~,`EsO-\+U?S뙋ںM܄3Fٶa8N4+Ռ#a<Џs27E;Hu3qMqث`RLW̳\4da(9DhJ|.G$crw+"1@Dcs:d̽>/,a:Y GŠ.Hmp p@%q •ߏpjo@j#2U&G5GiCW#<-#<߄pA!|4(!Sf [8p5O r E?Cj} R5GF܉@@Yo ҅G|c5NS_]׶}=`6h=^ z+jHїˇb(AjVsa45}aL&hA(*1cξ d')rzŮ `L$XuugڝᒻypPDv6aS&8 Q,?}܃-1r,en n6WU- BQ@ (EբRE!F~S插P=("#/`%{+Y c?Jp鼺 *v}sǾc.b}|νzgDDa) fŮ8J&Xdڻ`5&>xl_cM['PYYO&@0PZbӞ5pӲR(vG~(|aG'H2?D2=H1@ID-`Bzر$mFʻIJ}p6`҈%όz*\+Q@~hZ4R%/%h[qqq6?i?C:J pgZw}414 3iP84 8orLA<=$A-3tλy7jj2tO~}Y^EEN|}YZ0F-B QƂWx <^H#nb-&T=y$ 7Q[2|v~vw/|cI9QjV-*[/?8m|,-L_][yPk#.Ĥ561eL }@;*0#\4CqhXY3W'Qjg+i}Иfdaي|Ԉtwf~ԋL{ۯi:b &^`@Y*}:dpQ" aD\?ȆܰpYb6q0YJrlPUį"a !Nl4c)fgmH{/H8@xHFQ!kI&,ݼh\ZQJgXHlJ+K/{]nz=Ŭ|:?_Fʔ&x_)Or"YDE= i)k2QV0B!CҪ]4*?TN z`#][**VUNΰpS#~NplkB+W*$@p$P(W2d 5IIi/=F<a(e#'!-2^É^M$y^ Eh _:RR2@4Kom[pFD;¤^e7s:i@KY17l>vdkSrwn09yM3oY XsN5uu:5_ٚG:~zVi()rd4X\ST*cP{am@gs{V{\QO.&te$zVWycKiH8t&IPuF*#`e$Aco*,Igo݇Np'0>G} kW|_|s.O|Ĝae#۬+3Z02wم`a Rݥ ZlNt%+AyH*yC&&e4-RlXBYFeN @#^dYq/`vÔ"hz%+::E}qom3O?ڥo"E;!L \4R8T3J3Y \AI]6!V4jݽ[ %zV͉h1@vW2*_,(/j3+ٹ|n51g+z7Hn~3CoFlDr3:.qqBȲc]nThSMƈ:bCv2F"sœv+8~3N9oFv+./lurB`T)ՂNLu9{0#,m@wgˀdc8V5hZW+@\ I )݋UF*Ed_52deg݋,nXH:YiDR=m2I@JK˟sl}|Ƃ njĭnQ<~g;R2|CxS6O(`y?ik;Q,[`H.)^iCCO Y>UPej읳r2PW\ީT l7}?U2,NjgfjTJ_<[3/g>C^qC.PX/+fnGkwpga*"22lJKaɄgWk)#A-/*W&q@/uߞ)}'=ǗiOS2ڀ/-L;F: uߕ AGZV;\9K$).ޛ i!,13xgŢk9~Sm KD8Bj9qcNMjo˅w`IL5)$xϭvlU4WUS01R#Zd;;EѐB \`R+SBJ,L!0m#AkYɒ5JD> J FГη7R4?M=Vzы-{M GH@I)|,]AR<|T؊=Rr ^ArV‡ͺt;N\?dpWdV3%Db(`~27[%31SM:| ]EEdh^`9~Q>.5,ãקDwOA!Pqa0p*%k`\>qeVZ;>I,",:|o>&>l݇F^r:~{ H^Z؅"6 k6۫kmotar?x?; @\ j-KjP MRQ}~))k{]W /p2ԅe=$YF Q8lI.h/]r > +e( kⰞȐŝ9϶ۘum1cxeFߴ(qwoGy hR.P)8ğ)o8ZvnuHaw5dpVDLړ%j=s/9_ .u]H OM~VRUŋN'ch'?)&n>f -6Ww؏52*]zML4jw(&# Z9$A'`9QH4qh@8J>h6=bAɖ-ϝ#i_L$ui^{9+He4#M5표. =NwT^r54hg(SmZו N8{ ƙ1"6M ?`%݌k.kTd?SWvkc/rCۗM/]۷:8:k=w2gVk|v˭i 1݈2# HʌbYNꔢ@$lzC $n<R:ĈnP$ei Mu&lޜ__SxU|4mD!/DKJHVWyyN=]_Q)/gv:[5UOU=e,Qɿ6 :aMʿPNKzD`QhR:&jJsK_Y9e) pI6N#R,)=kPQC Z5s__Ȳ]&O=$E#G|bNU A1Tc~p{PZOC/[1݃0t X嘖bNLcXEN*lt-~J b4˝ ZD5K%r_rPA@Rendstream endobj 283 0 obj << /Filter /FlateDecode /Length 160 >> stream x31ӳP0P02U06P06W05WH1230!U`hhT027`I'O.}O_T.pJ.}2.}g %hj,`cﭠ q)+jtQP[&6o_?5^ap`rTB-endstream endobj 284 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 y@RUKVUc"D7ҡY:ߝ|x%I cikDfǢU`ķBW^@$ܔUZFg] 6R L:թPXqp8I.~r 6/@Siendstream endobj 285 0 obj << /Filter /FlateDecode /Length 1583 >> stream xZN#G}w|< R`""Ĭ}c\QOwx<.0 +|WTuMϔo2Z7lH n[4nZ,~Ua*\)u,략ʥ,,3N;lNݏ^X)a _=m6-1iATɨ J.\e1c˫)MV,Jܐ M &Ns)EaK*c[wcj 4smsFz]s!xa.iPҥJ7sդDDCjMnQky0ΨЖ\% U zO o)饍NU jB+k:Ag<wMM vڹ§IuaPiu;"{C Hp?mt!1졡;Z6j=&EsXN$#o7hFvqs%%g,bmOoh#ǥZJG>aBOOB颢<Ԏe89N.qa^2I9 )G!'il9`'pqalLUpf:`\0H>~ WI/)deZHkjO~zzF TA>F*| 8kRY{|IǑ'rnʬ678(m["_Җv<2dɓ~%y_.!Və;Xk$H9,if2DΓW=:+{ds83ihLRSbԬTAǑl})Sn]˫?1m?.hYaG*XPS_6A;K~1/b;Y(bܟ@p^Op ( չVyK}@(+pCRߵ*rendstream endobj 286 0 obj << /Filter /FlateDecode /Length 1144 >> stream xVMo7#9M4܋FeǑ7Y{%'pP:hD 3okkQVzWr]|-D9zƕs/yR8]+Kkl)Z{ v\cjk˹v쪚)%k={Zh.[㽵m^+cS%4ݒ}+\FASpnp/,#yۆ8-$qʉc۫JZ8ep_9)U;& RIm5èxP딌 <tBx9|N۫&ϗ*fZrL ͨ)&A=F*oP -P @ymXCBF{YOOgx:h3#a:i%Fq_H{X!!ED4#qN <&8HGX"΄UCt+@k wRU-3@{-W!v<AZ^bY#]Nd;ppw4kiY(mFEU*Ŏ`=w:웥@+C٥D}7=)b/2ڂx4U?EBm3A ^ Oq_z^+0H &ZV.J+C&@ 8:s;i6ټe&m6ɸu4M6lYC *T i,dzCa5pj|$R͗<42Ԣ}6EynIU{ԝ_'֋`4R1*I(RРp-.zBTN_EW%jq&|I(cf&rD1M:c\Nᔢ7("{C$OHTvM&aNGoAܛыGnc@c}j1c³gJdA;iw2;ZNF S#: M/H ç1(!?+z܅GO{Ey5@GEF]D=*QLR %ࠝk_[|@"$ᶓ&]OJifo&afr*Kym `%G` Ojg@Dw-"Rz99Sq2@H_fendstream endobj 287 0 obj << /Type /XRef /Length 291 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 288 /ID [<01a7fe0f6e84543e4451137f88764845><04a861d2ef4759e2df778b3169203576>] >> stream xcb&F~0 $8JR?@6;8^֍&3(M {Fcjt28Rb@2)8DEDπHV& $u@l ? ̮Rn`v#s do@$sd3"  R\ e+deJ2lFp E)/ ll8BAgp ĝLJ RZYi"rwH!X=z^0V v!ML: endstream endobj startxref 222569 %%EOF RProtoBuf/vignettes/pdf/RProtoBuf-intro.pdf0000644000175000017500000054227613617276206020607 0ustar nileshnilesh%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4559 /Filter /FlateDecode /N 88 /First 738 >> stream x\ks6~&2A3;y$Ah[YPdf= %J6el2GnID%BD'&IMKxD.q• '"!!FxPL"VȔ'u]"F~HDdDiT$\6/Tbp(3JsXk%NdH}5gCqO@IxRj&Pk+._~/,<.Fw{[0oWŬ MTXd8 l\Mr:?-ӊF3{=FGIŀ ];uSC"b:q񪋗]s]T4\L2cp_˕:7YLu#b*cbcjbȍuS^Գ,|T/^E6+ͰN3Ө澋i520Qd'<ɦE<(OEyJ5yZL| Uf2I1@};(s?u|V!ZiEWZIqWY O Rg/Ќ BݢBƸAq4ms>g$3_љMrt>o'\="9r08Vڵ1="yC N NRb"Dh +" #,<" #,<" _0( I7t.9P_(ODyQ"Hxvߚ/?pV/ilTMOQN&+ܨ)tcR M):8\ͽ$c߬.IWmvu3H_`8YX'W9Ű$=a){ƞ%석3 9;/i6d!|208lrij|:̮K.`]o7Wok6e4g+ݠbn&+ٌ/>eW Xm.U PہU#8x>l8W('|O&yHr 0󼜍/K *1/ƥyQ lNlyx̧#(1,6܌>n%j5iy5lCm;/m侄LgM^}$`4e6䯥D! vO}us=cqgIP&7euMK׭-C=] @`.j]k5&Nm.ֈM̩kE.x=ͫ^s4*^1q+zEdO?]XFV䨵E箋Pue[3q:kd/%m,v ܒ=0h\fո@']Ouj¸ncl_|^矎~8:>.Qųbd://,m}1:wo!R-x>ۖ>ZMmWﺹ/b<- }Cr8Olk;Ś&Xf;Yuec"ru7u$m! 7]XȶazukA~`!zyI'CCQ_nh\~J( G }_%Z&KT '< S m|u@\Sh.t>:pO ](3h[O|<(* MM3oIYU|'ҢEIx)H%RvqsI9齈tp:CT^Ӧ( O+٦DPІ딶iSgčIdtJ믚TiURL¦U%RɤDrFL6Z*bQ%!uآK2lXLyp %F^ǒo X mQetEO:}TdJcKɗF;ei^[){N%FI͕)3اNuHWtR*5FObudp< ރqpV2J C~Ҋ GZuJX7݄pBkgfImclM!5Fw5lyXyX!OId~vuuk_k?sT0SXhUt)qX4uad8\%."8LVO?q<ǝ9aO"sxIt$\ݨ5"v.Tn>(^LՒHtl2PŦ=_L: EP^QeRendstream endobj 90 0 obj << /Subtype /XML /Type /Metadata /Length 1549 >> stream GPL Ghostscript 9.27 2020-02-07T07:22:28-06:00 2020-02-07T07:22:28-06:00 LaTeX with hyperref endstream endobj 91 0 obj << /Type /ObjStm /Length 3249 /Filter /FlateDecode /N 88 /First 805 >> stream x[]o}c~^EJ4rҺ ]m]aw8=KIkLس( {4#y~)W6*APT*<emJ$eͪdeEЪ ʢ-bU<6N9xA&(#G[a"ްhE0[I"JdW׽Q[%1S" L"6T@g}T):X6N 1*NʆSʎ`ʉS\R`Bql }flS}a^| gV9iP⏴VD0 ݳ^ kyg{4qB[ i$4z d ߨ" ,i vՉ=S'9D)]e3Xĉ7<;Dy@<v,?}כNT;2vsJPݗ_)gݓjqy xcۧ-m^oNqy_6x+ztY>{#}߿ݣ/]mE~7g'56W/1zyZ_> _ZlfC~JF [udoo`NwV6BGj?EE086 /nnI&]-&{؝uvOn-7WuwEwխMvݾ{8 u;Х +)GRq[OYj|Bdہ dj%1׉19㵇8) 9f1+&7`,w?it;Jy`TLs $ssW .fkn _W F09ΕI:Y"PgE[Dψ!t3An.%똦& Ѵ+A4}#Z0<&^ӐN *CM`J،HC \tZB2i;1-BZOIי`*b3X'@a6kjk"`Ǩ (ȁT!\phl1e}MDqM@r Glb&G;RU؎Og>DY("'F[f!( {Нe+B&fEj˔TWܓGФM7{7q+rXo)0; AQSS6bԔXDŽ!g .f=1S~lJTyP<%~KJ% i9Y1Jɍ:kJbvGY5@D!5 K牣8;d_GGbv1ڥ)9@PWm_f^,fXbpg]W F y,(2:%$%=Ua-z胟!v<BEĜyu`cJ`1o i(+-Tc^TseBb9dJ:C&nf4 2LM7L"SpLSc‡cbyd1 $oMJTuarXna؃OP_P3KH%N Qd> stream xZߏ~_A/C(r83$4@\E0-Evp~tRvȧcq&g3ߐKtB.f+Kd%;VSR]VfWE Ju+*[*^gT0fVIZW8:Ҿ%;*}KqTRd0٫!Č$6j̄ TUq  q[c[c[aEU"۷з$'Է& -ʼnؤ10'*[;AR):q#\QINC;%cM)(;`!*$LAթ4hB.x)%.\Jr1) J\]I`R(NXdP A襘LJba ^lڪ¢皡4 l0Mɬ "lb $[Z&J`z1X?7ƨX'cbHa}0fc&s3٘9`kZ k7~~pm"+7~ݣUfnn_,ޣ_?2}__Ux\ͻgcOo뮷+ u+7[~A՟ctU @'2}ΒƉPQ<@EgɏFOi*Gϱ=:4M4 -!ݘM[IܠN9Z9 fi{+L<]$n+Vj+s+K+$I$IVVVnO%2HH&P} tGDʲo!m:1OB|ILO:Q|L`OT1S@~٦+mJ۽,jZ<Ňb֥oVuϴ$KI9D_=՛yKwPi%,&EE{/FI1 1T TmQeҘJʓ ib$fq9qDOd. >bRѓ5E=HEq-^TEPYɗ-8*@q-(B waTE|'?J*@(8Ul;: 3=2U Q `PK*@UQ%_RX]4Pljj*![ۡR׉cr+GQmXCMlVCTh= Y'+c ccg;?ݢBPI7՟w7߯ˇf_}\-bn+r|K{A'$=GJB҉ZvpaOMeXW?4={wMWvxw[Gs~//J9Y@Dŵs}[c̾֡?Vn@X}λ><t @JGADe\gi?dq2P D$=ulC-n:nxwa4_}mz,Uzw?fr^{z߯lT7 8NFl.Dny.KC> /..Ȏu l1#r"`?2xJHaq(hDEedU6, #81/b>ePLֲ "-  0# lpqS'&CAE8R# e\;R$/ *fo,W@!=<_y:M6L&iAB+tqJ0c=.3Bt#LXdಁB&PGi񤀶n6fo;~3L)KBAgTRh#O^eOl}B:@ܭ`5% s$!JdRo~k_=_wX93- V{fY|<#uN`g9#>#]* `CXgu 2L< G":ٽc,zv$O˘yQUYp30Eo'{Xvʐl@qMvDϞ^.K9<.ۗ|[P\Ҿ0(; /OŖNLV 2v&M>ٗ[L`3 ]vFJh6 a-Wjendstream endobj 269 0 obj << /Type /ObjStm /Length 2997 /Filter /FlateDecode /N 88 /First 799 >> stream xZ[s~؇Hp۳g=U^0Lz*"]53"j5W˜3:ճ(4IaȤ/`REХ7IF3č4V ANpL Mo q{b*| DEH %<0-dHcgzO`*)202:(t.3R tj 3FXOc`M`VPmM"YK5Kͬـj % Ms@79MDI+\( ^)@^Ja^S?aS}>,H.(6Z`ScbuYk)Sd}`ݑ`hRL6,piL7h;8cIMӝ;= {iʞu,)~?1<<׋-iYr)mgAnTg wtܩFnA/ʺ֟UKaS#nu1/ qpi<íVE]] 0&o./u [p쬠fo<ͪ/-j=4m4}h5]_cNN j촘`@rG)S@ hTBOM\~Bz\Vc|p#ʦ4:.9Iǃ#jHE(*-OR'GbRPȀ D# JI!baĥxgNX&NLQ" 9jΞ=1SZQH98E,NLCy,$32s> UZNӤLϸ G6ڗ4')XL}@> BRT}ɥ?cN_65W.fUeu'uo"[|j2'珓?۞~[H_v4ɯctq@ZT!IIAqvWg vv]GۏX.|e a48z"RQK9D2=8iQ yǩXNi, zs*ajb?ڈ}J= d>9qڀx$coCBIg6t8m9 C#!]aa7e8p[=.Ny:̉XwqXa O(@^c .^Lgƀ6 #8==nML<)KisS#BElʏYM_dwBz-RY:)g͗ʆ68&_Yu(t}{:eMڝ-FИ)0j-5qα%\F z^.!uG8i{2v@FMU~*g [6fp᭖>ztT!"M`Mi][7O}"qzC LgӉKd˔x:Jp*D ιv+x/2v#xӰٯ̋tWrS OǀO+nvEPtE# rM i=\aonao굵_;?K>G &IiO}B .4UAGܭ 2h>endstream endobj 358 0 obj << /Type /ObjStm /Length 2167 /Filter /FlateDecode /N 88 /First 798 >> stream xM#<ƇPb ǀ׎ MAbol-yԚV0w{!M>*VɎI]p1%9)VbetE^ȎZ8JbvH  9fQTqԂJt$"K$T* Os!TTGB1功%JƎ.*[W?t~xNިxSZX; UԉH{IR$m`R*ѥ h #D%mh"ITJ.)r )!1q9;dW'T *H.AQ+q + 1*68ẒѼPBk;hlUb܁+Ci䪰U ~ 5 ӀƄFilwSiwv%f-k1N!Kc JVC;ay!_azAv!2 ٞ)`j ,($*RQ ALY`%_WݝGசKݗP^r/c/=ioOK%2Rzonvm*6WYl.$&oR“k@T# HIc҂+H-+o% ">&Wn?ٽoofz폫77?C濿jvoY(8:[B^->#(̘tTbX*rN9 -͌d2p>ՙҡr`y{ p >aatpQ"=Ml9Y}uvEX<^@xQ\q+nϚio=A>U'Br`D3 (ą ߂<~Y`܋0)P_Vg`Xj uKPTxVRPfyЀLPړLI%8T*ž4RBiT>0V^~GU G""*>-g̈́k,AYTiaۡoKz/Mx&#(˱Pja631TQmʼn*do˵ Say/xNU':BETǖ,dڡfXZ/xΔT'Lcs[/GPI|f28D/LH%b oelSs(mkTƐE邫JvU#c-;‚/(AU.2/*9,UW/=zf520;z :QĪ_IC0=}/7ٮ̒Ɋ -"9G S-T_ fDa(T¶?($/G(BJj){kᡛNW)WyLGsõ:_SpzDYځ1t`>“ɾ( [mx+}[{AdpC-"{`'>:1QilHv] A1b ~ fY0-˪Y( B&j{CTLV,r:.u*O[4vOeendstream endobj 447 0 obj << /Filter /FlateDecode /Length 4384 >> stream x\mo丑S`̏q,H$Nv7`L&s2ZMw+:z?7R,(ݞ7{7Y ۢ(">Rv¿,Kɍ)E:î_[׽`& ޜqع);W\Jݞ1))>ن [Yss2rME<8I{7PSRy.&s8s?eE R^A@òUknV]%On'Cx}tMO@/<#C0 ,oy=3 \Q|԰[ֿY3;!L[zd8x'WR"\yr" P(jQ`W6H?̀i`FsS'DNIlUJF% +Xe&yݵC[rsaQ_u~9%B_.><W4ׁcafh8(w-S.-s:>?>PUhRޔM$7mT زr"K"'\=$in.Wvki'(xBeh\jXZRTb`y.^ ctй ȁ5S"eӪ""qd׭pK$U x҆H>,n`@ۅ/s94X1MOmg} q "Ls)aۢ z\kᆾ꫓*'Wxʙ* G޼j@Y"3#3wo:oa`X1oӧ~ NogD)9!ˆ /ֵ 6 t->49_E{5CޗMy_ʏygn0hG[]7X qW|F\( JW%"/:K~|NЃA.&CqrkiL2: SjM,t# iɅf SgIh[_\e)j|\+ 3gqylz,M`3MnJ#SD\TI{ 1)! E._Iwut o0ܿH!2Dl\,÷`Wxng7o]eW̩=~ݻ e]Q!2~Hl*VPl>;$?Tzv\_z1(Q~ES/Td&v{ 9DJ ĹD~ufpi 8RK86h1T/*|/ՑDqjS/;aqu>Tηc^tpx)È.@`&oƃt"Os|u-L^sM_]I~ wȯÚ""cf7X%o".:l_w1i7rceqM_4#m_O \Ods,;?i _l" ,gruR~I ]uZxe3Pb"|f&2@ڔ}DRg. 6Jy` s`3'XoʱH]åg}m:C/:jCA/ܛBJ6cn.)O  C=In!q^@Ǻ1eA!et [hL")apv^_ABaR6&hub{vW;FbdI= aٵ;x`PقI_8 !]&{|FK|&fK2KrA1SR21{z!D΅<י2ar60NI Ptqӫ͕ٕx|d~| hiEgc.˧c43DcBKQ w M%Od^ l_* kY |A> Otkhu_mM3hh /d}-~+isu쎀ϔsc]BbBӑޕuEH> stream xK<`㵃0 A[teoHnIRտb՟ER%JhU a[-}v"8^ODWZ)1 ݙIQ Zh41BMW` C7^9hE0ѕ(>˸Fa&(dZ a"=`I NXM,j {~m]GaFS!D%lD\&+xJCF utE&H=0~r?$ҡoa 7B %Ϝƒ>+E4<%`A4ۣ)c "{p+^DtWQE =F{j-]1Apv"*5!4,}E81P$?7ZĄ7zlRHnFS-/'cDE)=&DDۄL~+^}&ūh6ʄlOxpCe?caů!_wCOyxܭ-nʆ;H`۝땳:awy׉X~ٝIж 0%`^ xYuwOst5S[9.  儛I#Ǭ? n5ۇ6.LNb4_]N?>f_f>1==IU McC7PMsT_n@k ҠDv d(ɩIFrQOk 8R]ЃjclwMnp5l4hBmkVM={ΞuF.Tèv--8e(E34e,pf}:OyLr7`M0)g[$97{nM] \F&u l+[ޞ^vz.$nXS"}E-˾oQӨLxwQ%Mb^ \L-5>q~fTK`Rj5\^[jhgTLe7ѕfm^kTŴBZ3ZdeФs[6ؠy+-pwü= t炄*5\Pq>ΗWhiu7Fr1kKnRy߶ۣl*Ud`+8#_l}̛W_ɔ2ar>w87,bS"W3ߧp;CM)\ʐXR|m-(7-rE{w|ߝ6ns7ns .<6e-rY&((wMQ\ԞvqŰΩ5Ɍ((/uuh'Ή3Sμ%Z05/Mpм8Ue=5'_ ]2uܳڵ5 :-iJ R]}iJ%&k݋bpi\zM0EN6KplCe.rj8_hB-zPJ>uM>W"7%;64K&o;E逦Nj7@uR29]&γW{F9(q33Hh"QfGt5@Ko:jL l^S+W)eLGoclʠr>Ar,AMkP*-KФr)ho•hh-At,>=6鷟T,U;+XհNJLq(2<#KfKb@A ,tޣd,P:\^Jw,ݴmkMK'R.lϊ8XcD/)M)c)l`է- hLJ 4_b ҌWumI^?oxiF{u<7v)fwaS2~72~.VTǻʫህ}]y/ 7WKMiɴRL(jګo4_zl}ZЛQ5_uZ66SzʇO:|Tޗ ZSFi>Ӥل-s]xt$Q"+p,Lu{ 'y@p7ݧӞQ+Ej!ةN~v8BQc* V qȫFe~#vnۈߞтv tBUT Gua׭yMbH@N=ݑ'E$qtS٩^}C~[!>endstream endobj 532 0 obj << /Filter /FlateDecode /Length 3298 >> stream x[[o(G,~<$gV_oN ft]Tg\hmf}s~= HM>9eblY\^ D~z; 5c#F\1AU C c9;_~jz U~r,kFegl{ BKrsUW*_'ˬ2/)v/~(ML67YO%ge_&nڞ e]@ss}ӿjtHH"+- 9ф)F){ا`RTr{m w58']y؉S؜I{v-M!î_$#=DainYh/}_}{X(KZ:=I9&V©OxD DE[`s ;VM[[1Sqʐ6|g<#֋_dMNժߣ=@A`c 8 ̙J  %1 gln;۹55jts0x1Q_ZyM$)^J=yhvK@` 03iǛbiQiU+"IqrMFJ\OamX52nWN+ z67=0 T"G<9a%.Z lKbV8Dcv]7]ڍdu5P{q-C~= )(3j4qYSK4hL~},A4pwdiqF!QXËh Ffڔ%[6sEB"L HS >}:*3`s$HKz3I@RIiO l_vgzlJv؛e뻢t7ǔձĖҖ]~x0B/ Kۃ @(kLCb. C*4C~8(h40fGR' ļmibebE:@/ QvӶTru?\[ThpcS[1`oC)],. uk2뜾mv^ < #SЃct/,gkYt]|ȫ4_P |P$ݺXa$WQnaqw_77  :[= -VhfPN,\qK "-vJ=rzF .ad@?` B q2HXyfHY{|&ňPv,M;J W`ؒmA E\t/b(LHt3U˨d˦XCT(b!+Xs0ͳn-ɘAr *tŷo%KSj\ 3 {4}_$yhDSSM`T)ᆶ6_dUގWM[#@w'u3-apZ/‘mn"Y (@ a"AZLP;թ'DqtJCTO{V8VtZ"\.BS Gt6aLDKN9A"D{uB +)Dzr–)ԜI6'OO1vZO_TJ&c׿Z[T={˛{=bo㩣f -/)Wgm<"sv6?nA}_eH}&oں: dy$zPb8$xxcE9D 0m:Zr2`b.)ϵI g`Md#afڌ j%Х7N E/ rNe"^Ùv)tjҩ/ZpӴupBьdm["LhfwM {"/qHo ؗ͌۳|vi]j<}~775jJ4`#;K3Y;^nCш ov!P?R~T]w?4(Dx$2m/߂Tv߼ b9WN9BV?Ɉ-i,D=QѦO[a)ph쑎D `KXG![pNSMXTP9Ācs >B#oc`Kb}_j_0ԋ+Mrt 8e+l DT򃑇{3 7z.LPТ@@҇uË }w!h_u< 4hд)F$(-!V9&, rUe9R$:ontpȩ!m~@ |[tۉKW@{h{1Ze>Xm; b 9F(e q.AQYpz'AbC]هԠ ç;@J0-3T!=q׻ALc> bA~CA\=PqIL%[R)7e?ȧ8@TXBG`g^aR8m*{l|zֿÃ]w"#CS7i0ڶBxE$8MX_M`(6]b+MG#b~ ΨYwӛ[_|l-&ۢf1_(0j2i>~Ζs> stream xZ_۸7C]E/K{i8wɶ}A]lˑ,Rg )r6]R93!YJ.6Wofq"(IN,"c,%rJtjk2G&?hBc?_Dysx{*$tdǨx*2M?5Lb3͜LO*JSff|Ҝd+p`q6)ЩAtAW,9Zcy7zv%('}#Y^:קr\7!$s>Ū.l qUGMHjt0ESTº t;ſV擩gh']QvSIUYv/4IvL޺?iy[*u[kQ$]ܕ[7j37AM2oHŦfߴMCr[~2[?\'fۖYX4rRl,A+},|9j0 "փ1Lǣn˦.ڪA&"⑋T1;'YNJ r;/.y}}麰I;#  -<8Vi 9J4 #H14GSUD) gjofW$ 7''CBdY-H2;-?U[-d_L8.g4ߴL$m756=>LO[/;̺Xb.OȌ-p?*LUݦ+tw}URq'$Hydzp:$>.kBwN+\dGY,r5Yeǵ8VY&$f T `RqFuq{ 4i]Է&p$R4iV E%/):aja0q&apsŌbDH)i%o3$#m`=TV^.аh!?{  l7=ӷ[j; 1E_nvkm¤Hc{殺~L׃ylL{W-#+ۻڦ>(g̋\YX!X-.Do1mQ,NUp.?R ^'al<:TNA#? <5G %Qք&՗ +r iijZ<ô}!,]eydjc$ҕN%H/P2uxf&^@O]b CFc)Asvx؆K3:I&}BL$ ODtqWŢ K/S=ogMxS榪^,*Dt3wcTR8զt ,>]3Tuϭx ^ؽp!yph€pObֿNr2>~BllA 8|NpLA0 }qrrm(|Ö^Pۓ5KqYy" f?ÙgQɇ&㙶tM_6"$F)\U}>"2Y~)y^z/vc-lbV,J].zLm k&s=W.]df^eA^”[X V{&@ { |܃-.Y1"n1*WS_HOd>e@qb9nQIO F\3J%pj"4OhTh;؃N[0_,RjCY;HՑc8U[{99m]܇:Tmxot1;*βZ4aS *P 0x&SuCW2 HM'Gro)teBX퐵B3]aǧLF0@Q0\>lx")0>`%Q`2\Pϥ H`UgG"TyYT 2z/QDmofeh+A,jD}H+Q$2j{Hd!=$= $6FjfhrxѱJt<9B9  tn-+rwKm.{w']i K(5\ꏿ߬C.SǏ&hJ! g3DJ1D :Uo?vW Pq.$+P`x|XsҚnU쵬}ߡDc}qa .qGj6$# pB1g2͙٫v{{z[40>(ΖϥǶMN*PfFc|یz/aB?GK愆bȝhƟErpp,0"{ЇܝצX,=.Rt._x@q$g8N~wTgO1$.Z 7HCa{!u`u|Ϧ2q~ n4*}ko-_WloYnQ7.dWOwadY^{)o̼545V8 f@=;="D*Ĵk紁ܖ\ںendstream endobj 534 0 obj << /Filter /FlateDecode /Length 2642 >> stream xZ[o~#TaM8 6&*-QveQK RoʤlKssΡ~BOT6JXёL8'TEj,W%ڄq>h1ɑDp'7*"0) b | Xh9?$mDb3MA9fddULEŨҚFÙ4cD&"ޏO2BO$$IX,ZvMl"U)@z"UKhcqHB*R F'e 1k lrB2 "*sUDـs7*O _z(ׄ!{_]HŢI+<gTW2„rr*U5^eK  M!/qmj!I"Ck1H A8jpmn.K$ n|o 12+jn4~\֮ѯAWF'f)5[1 LzC^W #Y:\D-ѓd AQ!vS lv!5y!C1BڎSI Qs29J:6ZF.ހ} ;=p www.B \ Ԁ'V/] q*PMV5e6xWqZ,ϋn(t |Dh2#y[O;^2oK`\GoyZEMI"*m^7?FĽm ($b 8ncOt XVMZњ6f 7t.{ cV{:=%Cw9a"kN۝ɈОJ&d A4>⏯?Bv8&(vCzP}% ^r jzm 8m Immk֎@,,(!NYB17>9X Ɲ\3ZD;Da!4 ua皈zOE icDNK|2(FYYcxȘ$ˌ]4Gw jBǀn%9cow>c4qc~Mo:+񑺹3j/Ǡj'$`+a]/VH݅VB&)ԛUV^p#B5s%3Wn_N<2Ue=q߿pvO@/Dm%M! A.}4Ss0_+$V3-H"tn=v&𦓯ĬMY12:_Bh0Y DOV|n7~dBiэT7k߸lȿ.;eMX}h:g,9Zut9Сk8IY3 Xnc5A[:_T: ⤡;׀d v> Sn}Y;.iI& ۩U'_rq#vw |̊2__S̪wXXR0K1|}rBZJK2Ktu;ǽ1@&z`؉CҷqJ?LdP$$c =TS~V*~_Y,/ M _6Ȁꪝ-],<±ˢ2(. 7 I+?)I_U``Fi.JEo˵'?Ts#rqnP~W@&*k?Tiv^_>Z-ҲZ8YczZTpsJ e$7>э؇hRSp8> stream x[ے?%,b3ʑmRQ,KAHI&Hɛ 0HJ\)=}tσA+*9L2Jr2FȜsB@{)`U9Xjr;G845DZl )"y; 0&x^ 0ʥа2.Z]-{Ϯ`霙%V15yЁ0@3NٛB2eTk|!Il}SûrWٲ$6PY=yy4u9_ξzsؚ_fHf Yc8hY,;01"Y^+h7l=ݠmѶ#`%'cf9 !)3{JVp^Xotڣ(/1` |p,b|!zge-BpqFL!ߠ%TŌ,WM8_Je_((DLAF%b(!`( 9Y*b,bélT/٦)' ˊ&QlٔIIآMtCmZƆZ G?vv:)-!SK8;:h'HGs?O;0É@w骞'qbi5{P@UڄP=CS Q kHɾ:M H``Tސ.Bz( +xx g=^ Ubu1qXVTq' a'|0 xeә1$Cβc> SzY.};$݄u&e-XXWGѣ R3.2ό<9:L|I&z(I|C[wm QX-u968 !p)ͅ7~V-3A1]76*%K'ǻž^@%075٤jz| I><άdzu(W8P,Tvrє]f mU4!s"`QUN%dY HFMwk<+2Hik?i¨Do.Xե}Qp!<K@3-ؽ ce5.hq\l6z(wg`~U4{pu\}=7{޽(VכyX7|{@pQU9A֟U1U@v2/T}ѫ2%BE}t̀BS=9bb@V6 <k 4ڌ2DJ]E?@Aq*wCq:gD2*n 84#Jk_pm)772,\Q,AN?GWk`M\SqfVЎI H~Үp7v.9;uvpIUzZQ{ީкPz:u:'ABh1*B/{=@:? P7g0F&sX"&73 o W2yF~@9{O!Sc` Q (&sM1oիA<,$o:QU)0`Hɪ›ު0T颔FT?*} 1'܁/>DP̅ @ wMm{A(`.=yУ ̙L;(ɓE)\"3ՊG[f乫8Q.Ym=v)nR@YG kfo.ê3]k#dŐg<#d 9 >Z,ڑ7ө\ r# I3lO!P#-oq=)T⭅\?R2DXVͥ?f9xX$Nq~T6z\Jr /Ÿ/qJPIh7SB{Ҁ #ZplKQ &ZvқK2P{ګDz$yAnXsSR}> {p=oz|9Je%ZPkB%xb]@B;scG{bŖq̦eݳ2(DFL Il eFt)c!gRdZd*6 cؖR@Z Yp ^qEѱ,a\L*y}aR*wWd# Fj_K2skҡN]%AN+AZ]w)' rD:`X=qe*m!N}Y(hP v2M&<٤͹P|?By6M4VT*אJbd#='T_mNK! 'sP+'KwWrЍ=޼k\y?詭,l:00@m}=*V?lFϠ@پIWB' Sto8M4AEk+PnyS/hc2hi66Hͪf. SU{58To*y f>*W'7@T)yDX7avu2Px'ӹGO8o"zp2+wɿAW::ur%_|wⰎ?} SɈO _M|Ǐ?O%cاR ~^Jgq^Oa_?0*h6oНo./~hJ}as>)S"gJq1а>&M&l굆lS켻|(V ֍몭館dlz]˿dXgDMeWmk8Hwu\8$m6xI݁nc5feOF$߿v5qo}:XCendstream endobj 536 0 obj << /Filter /FlateDecode /Length 3953 >> stream x\ݎri!mXɢ4i z8-t>K_sH?;ck\X"}<~\d\ݿ7Dn$è;"L\bF#4 㟬Fo,r-NJr3h0^Fv~DzՕ׌e.R㫛sU9!f|ͲuՋɔSfj.dJ4!1٢͛>|w7WpE^0C _,e0=I[SrOB:h>\D紀 ("gF#m愲%;lJ8(9Ns ~Ert,s}Y,e[&SAM75YhHvmտ#vmvۄ Ųj?'j$"@a*1p]3+r(d8_TCGMc z7Y}l婢tSLQ1&MI 6vYIx!a iq,c-ZoDlwGS_6բkk}Unۇ=Y/xr `ܥkC益x!@ 2g8o$Z9I3 Lf V-m p$jɪn+rzkZ5[0B/*=)6v6gD> ^2O{~g'BDwofzOECX. @Aȧ?gre΂Uio}teqY)w'^1}$ŴqBTRE*wj:G(BgXh;ɜNtl=(&8d&EcvG u5 o/Ci"~XtRhx}gW{ GlV [ \+e9g]=۴wKN8f> 1~8fNs&!&/9 ,KB> ^ٿ|=-AO1h,HoVA+Yx I XUU~6C NkkU|2یξeBw7Ҽ.xvc-v7H]s3tvr/ |i a݀\e ~u;DZ.Т@bYFd ^"PY{̲\?Vͮ?"?;fK2ڽf$7#aj8x ﱌ} Ri? 1g^ɗ'{$7 x>Q3ʉ!Z dDQm-@a:aljJ3f;v?KhI:cn؄,vOgpzam1'L%"[7(TBh'j8pb - )á׼0>!eP~,Ƞ>.߆$&!lx J]E lLո($>2c#!s>0Tܪ,tq;8Qten06<ۖ ~B`I춷O.6.IJ.póf 0Js)fjWw?D2l7ն`>0>^\͏mSѕF[Qn~ @< ؇ar8S`\o%,Ħ*ۿ}˸ azZHbĮק~n:xLp`P9>2sʈ :5=!y/`X,[T-d]y4n[oUw+өj+>PH#:f{vA4[m~w}Z.c%,)zx{^ r4 Nਘ1.E΅&"L9C R0P$[GDa X}X]Z;6Aبt~׿T6%Fb&3,E '/؏tVhʔ&]㶯;Z3nX;[Z 3&ke_FGf/I>ݱLNp~~/I `Âi[>hw]?0y>.ȅ0iWIZ(2(c!x5GK`ljNFk{IM=T` 'y?_<Y!3*7VBJETHFW>_ Id~$95 _.J0#4ItI%.!%5 `Hެ+w=F$Z벖g!n\jx4|.墝b類xGAP? ̽І0my_btw!m?}G) $)7y3Lu>65FRy~-Q2(y^Q$#NŢZ]3X,Um[>U +ܗM?YK{\mkwj&Ytendstream endobj 537 0 obj << /Filter /FlateDecode /Length 4458 >> stream x\n[ɑv<<c$I$@n.칠# EjHj4,yFCR:wZUUWUWݘtL_~Tf`iDƿQfdkXs[#lJ#;e["ƚ r nߎQs*>VZ/nF^ :\\ [J~nq=2mZBdM請7# q2hJ#[@^CEYG&uͶd Q:d{+iCl27 %7-%FaEf IJl+e %Ps #WrBmk͢,AB˱nff`{=l V^\O)njC(ר'd;*H*MhP]Ͷt<t v!5 #%тw/Qaa&o1N喳= דlXrP*(pM*H%u[7 ƀ A '.dt׀Ӟ3,НSfe4P!Ǫh+G*05-L #BrNLreq\cX3num/QDEO&(&%B i-~aP+0 `g}p(s݁l8@O.b>f2Zuܡj9F+ ƻMrY sTfU>H EbiikS.W^+&s;q<l9.iHqJH(,LbPԆ&VzPHûfL)Gh8="I1>)qDSZ8Q I e k(3lPpi{j2 Nk>nMXY 32VCKdtq箵{fv9plJ-Dl[j^w[^96`$lhD?͖+J-q3kmn.,–סaHu=E-:y8.鰲ٴz9| 'Hىh.EDT L4v}҇j^ηQ6=0і5ࣜ|7דQ߬2NrXjBQ) ʍ1Qaڮ~xӺZ/6@y]y6jMDa;wDdM#Uoẙ`%.zT+ Iu ̫^p[ *:M۔JIU#B4>GV(Y S28bA}uw5߀jP\yBk6Wew~ cZ޼wk_^PLG &+]3dzJ(1(Ho* oc@ Z>ΊoYcpPr3]vݎl h ON6Yf}7 ,ܨc#ἥjzݍ8^p}^1/!r c,Qpׁ2> S ufa{Fc]ɯg$BA`Ɗ$|c$T _k %\?J A7C(N7~ s41N CC86jȫr~P3"gf=9w"?XWE5apBK4NJ 7+9`pKV?,:,ҚlVhDp'=D'-x=ZxK79`Ǚb%:A(l3Ѳt$vul7*2ݛp !H Ҙntժ[5·SL!{!D#Uu(,`>qf tA.a ۰$jBV9l\$}^n%)9p.T@>_Sfdcu\ՓH@T#(w[O%f~1[^Tqdgyۚv`ez'p5("8Vwlel Oq]K V qDTef H3x`o"f!fL b) kjز _9NQe2%KF )Rb,,A#,N³AG*ӭ2%TF`D ]-R!O2Bo6ney1(~BXJ>V@!zGu~~:DXt -6jL*VUK03uʺ(c.K@CѸ\q-)}R!Q|Y58EP*{A%q g'WaLG-fiC%&FCeZs!u@*$%MisD*N7c2dEOrWm I>! wo?%O<0TPtwA}:µD>=Sm d^-"4HVi2 1c)MY؟fa$=ΈEtcMSW֕/mѺJ̸@%10 qV@* ^YLC"J~_mgV@ImOx(?i:vOstid0Qaa EHKˬ.p-hA2`w{9]>ry^=>W? ?W!,\k%!|OA ww%|;3c,\hlJھ|![az.&*|uV1-EEE^`_3V xܳwc fZ1>o_=5ePk+{ڡ`dܻ!J~)$[q)8h#/xT1kQs_TCMG# k_`?O~}ӹhW<, P×7-ӟXz)W|o:XkZTsL w%W}[]_7SXJecFܗU\:R\ bc)ڹ9ju]]J8j?IRk)+MuցD)ochLGbύ/f/O"1Z-2 iɥ ]"\~ס#ؤz46:IJ5۴zI(E:s[ez=8\nPA8 <2T'ÿ2-II/Lgi'ږu|0Fs^_HlFՊt]SAm\ckG zlkT} L-PK]P®`Rzw@۬k+.x1|Ŧrᾒ+ji!M> stream xZnH}#ڍ;{lfnI<؇dd5DbSMR$eQd;C(.uNUyp1N_l5zN;*FG;aflXW<g%<8m0r[4V$pkIs!g[˚…H_=\$X瑈VؠfxҎ/Gxc'%7FܔY.4/sνHvH0· 8qCB %\ǃAw' rL|q-^;{?Ǎ|XI%i=] \md$x< N|9n|?!wy9ߖ'31Ϻ :tx"$RO kyrDGt()`(|`DC8ə'dϦyE}7yVf&Ĩp^V*PrKk)u:9Bl"ȥVt'˱+Z c$,4*-9ؘZooZn⪜? 5Oj`]W֠+$@j^% * l"_x6E+Y<-E%:`VQmVYbl?Z6-lJvQ^7`mQl?e٨ - P˪xC8*{: a=bagVϮG]OW=>VMzéQB'Gq`&Ij/A}ANp/[y=oOG"YG -YxIc谭7ar;"b@4Cycti.,>ͫDUbFP&YtP).H)"de6.7g2]k0?fotNTD !DY^XkzӨ IC3˻Izl]/*$%ˮPm(,-N葉JW|K],[~V@^}jp'~p-:|>Æ;dzr>+M^ [..ií5a,-ZFWlb pXҏŦzTլ[D!xNE2v8O2492n{P)D_mJdJDŖe8V[(=*1)#4ohE.2 #`hc3ր#}g ,C޷"$:]D @j]& q$Da衹j ?*ٯ*vk%Qe%G.PvPbeq&~`]0U0+45LE5*1 KTq T2ICyd==pqj ̸ 8N&ޔӲGwX*D7<؏VwȮ(LiFhBjKoyD%nKHEY3[&6ES=ɊbqX.ʯT<$lIG3jl+H.UVTݦYJtFlL]wUCu%hAk(ʅ'U$B _24'cX_QVO$e_s*&h{;Ǝd>i=FH4{ 4;pnWeZָ^t=@%@ݒ Q_iV|o4U:ŪjT(IVդ-W ~cgTD.Is70[ jЄQ>k$R_AAA}kPL@l$Yq ְb?^ݶ*?П. f)6t˵7]=?vCf;c@cfg4ժNzǁZj/gZ[K*{vC }'Ny1q~d<nG&;0kd3φ<{R;̳wXJ M #ُ3$A0cWn^/6 /$4m].%3ˊG P͝aa>$GoOG> tYZzR<:v 9u/ƥI"J O=_#.8mq;5VFDHP)':#1@!n>t;H8WTB˾t5],Ғ0WJ ;oWgDzҰI c(`d3=}<)a$*CJ;GPI}q?|<-%!6sPJEѾXrgwƣ?:+yK *~.9]XʉodC~r#11!U{ CWz4~ zpls=:B!(PYk(#R'!]MӋ| MO&-t]yog3T _V]0kJ}}~0> stream xZnj""p~96@wh(HF67舔}^_pġL)l/,3eQ6?[^ʔ_ԣ/#sf$ef2!(c3*o(6:;-Fx҂J$ST)Kj ܽX6]X|ˈyjȍ[j5(HP#&l5"+69} R2%sЕxs\REt<}hQw:j&AL$2 }2 hͬ0`S?nX8G|$?L,ؒTqEw?䷳{Ҹg1Tjx53lt~\6n.-N4cLyn%ͥkO F C咺/bg %8r8.YSVBYɹɶvx fCuS/sRć4mu4o.ݺ[0VW$eU4Crpg]Vmš=1*y=_!Rfծ.[W$ bΕCy,a{@'ͬ nM'Siw Ÿ́p(oJj'eN,/Sn@u IX..\ޱTu.\z;Q9P[ \IwF bKJ2ĕ;d#8LPR4q ʸ5]XCqqwL-'|< }@FRYJiM)%}6u~) }%yfI(gh-zD=3^/<.1| rp[*Hc2`,a:_v?*eDt(clO.93"@ٺ $Le eS쥤SAf ͏7+ ɟD s$YDqbD /NEMgŦAaHNT4 ҹpӻ5u{)kMPbJՙoGΕh 0)(#TκΟGgY?z92N汜UI9~˜XyDz_M ̤d)3rv]~Pa eJZ$ZCJ,_%${bZt[{PmydM麥D,FE殞m+za59TޡjM0R9ޟ&"ǔߚdW+Ǻj:AEoYw3@ -iQ/ɲ>oCzA]g,)ve_iן(f[%}MO$w-ٔ"9!Q?prxG`0'պa)2% 9U">A"˔Wi Kc|0}H@7|DJ#JpL~8UޱC[Y_U}#W!zH \"c|9Y 4@سЋy#o/FaJ !*G8!LY=*neJeXC8?)wEԙ{bcPIs SvWk'x8y1ċv'7es5Y,Yn9#q M3Hinѡ {ƀJ^6dHJAAg|Tdב@󝵂996YϫcW /˺3GW2Uj$ As5Gѷ+ N7Ȏ?=ȸa%oCɩQMޱPajJ\BpwJu0LdmqW>ci.܇?qZo{IySL{X.e"Ȍ.YN~7Р_Oee q#\l7/{C%n%)KHoոu M}cA#L)t/EGj2?xk Աn,6.~)~A7qg`Ao]c&J y KgRet s(n󀭁#.u{6򬝛~~$ţp~Usik'Dn/GEvH! >-<_~m`wt;%``GB689Ul $4^ͫY&}[)@3 (@uPqjڗd; ˢnrJ&Sy+D/x?UJZnta~S.j7Bj2+s@>v{˨2rmQ{~H) [ȻS&sq |ZLh4=nͯ Tcf:# BKqƣ`#MqP(=VQvT#L N{S<)." i57._Wyw.Z^]!5#ZNfNI[?Z@SP`hs?:0D?~4瀷9Q]endstream endobj 540 0 obj << /Filter /FlateDecode /Length 4143 >> stream x[_qumC*^b1Dv"]JE*y9 HbБwpw 0^\p0?,M,k3.$J\W -0*w?^p9vl;˓f G4Orx djvD$66g\vM;_HTpmw}2o/E:;3h ֖6f7r~LI3˳43ϸm7[7ń|}zWܕ/%a'~Cn l]~VkrOm]yߴH%:b."b89gE7mxXsFI e¡rd0r8fO DkB 7X6"}Qmqvxmv$EoS;ٕwſӾmp]+y\ypº!:oˢ?eeY6ٍsEL5[(ɧg(xx@~׹;n_"|1m]Y6^Y${|5ܷs[̹eMDOI ru؅a]Y*OoڥH7^RXWO97xwD My,t]2~_݃U)gیn/+x뇺U+8?*l+2ك-661‹ܰ֏#5Кw5š*ҝQĆfeX͜6stЙbŭ# t Ԍ*PF{X,RZ>{1K!-->iX‚5K[S7)OYc7٩Oqg1#2ƴ|Yt*&K|Eٚ[9qrOz\dΦ4fB?CU8$LAF')@YeS!UZM8-@GHGPCԟOO$@ 9/xeZ/OH 7E+ HֹRjTݶ%fuOZ)ArS95]﹆ de#0*2xpyVd`b(WpIK0#HUQ<0E -Eʂ5ab mC]*rC9 遟1Tp XXC&ݕĚԴn2hND c$.qs)t|DhxHvc4p6E[z K 'Cšz1pofhdᣫh_mmmNpch7|)FCd}4o{ pDQDm(z|QR׎$xx|~_l!"Ԙ+ QGqO )lHԤT<r\|aTJm;+"gb!iAKk|Ya*.,eMEX tR]0%#^];HZ-ob F O~Gq[Ұ2p7'=Y3>=>c9)@2cyяI,IH/#8sBOp$Dzm1<'J v1ŸyF,$[p_?r=?)Fx]sgJr9<kؕ؟N d$\ qN>ב3pppfT.?saBu"r8tNO=7܄ơD;UuHDD \_2Au =NܷVMlC3or}.VE7L'Й5Wwp?GEr=SC 9婂2a2khGlTG@lw$?|-"աl,Y5n`Ku?C9%pn}ynVW~ 5۹Ļ.ޑ P<:=x+,b%x 'hJFm6x9+e氤v)5B47ENZp 6|:5o~q()tw\xL# \lSv2\.0 /cAxBXծWz[+h&Io1D=@u/ulS "V)RIjUpc;>8"ٗ;Mݐ;k$\+V~=E)A2J6ս" @;a9d+Yq hՑcS^ewFeۋ:ɕ-0%KEu]5u.-;}_n};bWs P;a/yd'[ܺpiyw#5pz^ո6$1dD;l0t> stream x]r۸'o]tlvzdw7fDȢugH`$ Ş KG$9wGN2L&/%BN gSjRz@ܝbݭ&`C咉 XC 5_Ue3"&iF*_L0hs:)}?q=.YOgL ~,ZĆitZNY&(:h/$ES4/WݭYEU_uミZ|K $Ihiòzf)ZW)mhQNBѦhb5l %aŴeKt0g\_ 2)d\3z6-/康u[.Z5V* J~8TU>%6DBл|'†~e6ir4%% K&3Oeml13C,DbHM-7Ϟ-M[*zEbjC `B!:]WQJX*!AD5xrHr٠ 2r #U2z[쀭25R[!\VgaolʲZρRȖ'#1RIr*^[4C,CIb!-UQ5=]B@]pKU@jȘ&iPK٦m-ei*\JD/6.=>m6P e_X(II\[hUt 4*)XႧ&w٪IԜ/H4njT}1%e )KkDh릨t4U]RACU*NO6EQui fX{8zWnFj9໫@ZK&f0!ִj(|C޶hRumfя]2SOU,$(:wFbr-Z .ΨPpQ}yh&K``n42x Z;f9kNi U"60ΐ{ikCڼkTf2> j>Cc8`V ;ͬ%<]D3txiL صV~5EOV6-rs(V˨$CeaLAE˪kװZ@.3VS)k+/$ݫAgI+}6}xlp#07Ӈy>Ie`O[bFxdQ(M}LҸC|xk;H=y *eݭ&HI*oIoj?":Ah󮨖jPƹĕ$͠=qEEKْhj2CcC6'Tڜ$m#0}*~ꧮzS40Qʑ}BP]l WGHh mFvn&F;`gX&|<-˴ePѳ-~(z;u˧ڮ%W텟κe.ٗoIzK|3Ё5oYv0U>R{኎fx\aWܟ~>Qbwv*\/R&Cc@+q16"ەKc[볶a;E؀tVbCu[}½DZ$:mc9Ksޫ#?IPO%,4ۨ?nz踘()w\B ؏MF6X`F3NW4|!$J;$33( Nv@hNK{&PE4zj`ȃC Of~↦# Ig|AŮݛݠ}h3'0GF$~c=WJ |g%]{F$~cg+82|Ql7_,(s O}T~@}pX3IXpP5U>ojx'*c)##]qL4t81qܔjxQ6[acR~lI(93;3jY7onM 0lD0Gw,en.yS / :tDO=B\ c d)knk$*قIEwݱx,zhX2CppB/ONX)5QO2Oendstream endobj 542 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4536 >> stream xWiT׶dF,rB@%@Ȍ 27  8DEP 1N8&q={ ~V^}T|;ZB$2.<)?L5s:6R {2p|GsV:2u6hL'AfD!#=dh g߫#ۼcYz[%:،9j:^cp-HTFx+2HVĪ*PU3f-u} "!,K UF3 U†R'|Z(ժD;~z"'+"%EJ"^1W$)ɘW& a*"רy*"6)R O* &:Q$[w07QIn(d:"I{0*(R4bpL ӒdeW IJUEtXBd"k]/Xm׻ꮧ>WjQvIX|)hE9MW9gĻ&%kT_՟PFTeLP&2R4j-%Hg=~ ջ;(Mft]B?fL;]i3' 0alpaas%FFOMMBMMLL&՛=3O5fϼJM:,u0J'6wtI$') +sP)5;0Tz5!k* rX]~d ?$3f:fgE,1bx{6:yvBMaX_}>3:W[Q[Q|]D7#/8ֳW,鄆ЊyS`9[+TG؞N[UWYi c$ApÎVX]L$px y&rm[N۷gnܕ5K %`!д*DZd{8  < ar[v~#s~ hcywdE$Mҁ3Sr&H[1zuB&ݍ>->q r jnl\ySzC 6|[A8x륯HǾxɭD}7ymNxdREɏd9B 9c0z_dN.TȖNI ̔th7L$.#)$ p6Ie!s&@*1X]:"ߧNU0b.(<eL/k?/)}LCL)0x]+Xhۮ"Kf[]/`(88"TG /?agŕ55;lx[]y3&Pt:IXeGm=)&_Bi,㞂\ iWz otd%~%Kt3sUqs[d7 M_TQ806(ʉvt:h1pڱd`"ż8 0ĂaC~yw_L;  r A,40cyl`  wߟO"7Fk3V\+OIG-? l\EQ|ғ)2:wޖQ4qܤ.TEUՅ9l HE>)vcq`/H NSpzQWz\ pystQ` nGG5xD((A9 i@W7E߾RvDew† )aq%f@6sV6ٷ)g^t U<_~ȥx¥Cq?F3۳0>\[ZWu<ĺ^}fw2y^Ii^繰&iv lI!<9,%\Nhv6mGNfp6Ohb'&n"R-$!D,4) Ňȇ߁= Xde1<8l +)tX n rwu j}F0~ A;NԸ/uuFa}쉧? eR9ѩ PZwyj݆ϰ[qYǎ_!ȗԹ˿IvMAɊ$Xvh^50XR1٭ɽ};i IeC{s`zoLFxހ ag/KRsHC]-sde[c2Sk2F5nF:XGPM.9b&C.h|'p {O1U NSzf\ = jC͂ ! \}6i+6{n2wHw>5(fMl|?XK'P aze XQ uܺxC3"C]R63|qۑ?Tmsl2;2uq|)ɽZUyա`s L]<;νfy^TD>С'bN8,.u.hn!|W_RBRFXh0& >܁ٻ[N7>݋C*eoC-[;gecwl Iܕy!>!ߝkl[݌r5ݸY{E?$X( W 6,y:LZY}#imj҆໮Ub;[c#Wyܬ]Yx)Pyz0^=aJHwęUgt5vDZRX?ĦWD#fP+PO(Z{6^cHF^SO<0/}8o-&''A$yyU&a;*#z!j ?}'O A-/f9KhJ=š:Mʳ{ߌ(XߵV: +{/խJ,._syJjQ'\U Zz"$p^p"@;WΦBM’/0*t0ElYFF0x1E%dendstream endobj 543 0 obj << /Filter /FlateDecode /Length 630 >> stream x]=n@D{7~Li\$\ S,}fFQ#`LIX|߯guy=]:0t|:Onu~Z7޿Mm#E:?4_Ncvַ{,u28.>Ue9CEz@C jak{Ȋoeu uf=UڪP |+*,,,,,,,,,,^Tg+d~BB~BB:LTF*He 2Q D&*#De2T"@d2RLTF*DM;w6llٸacƝm *~=ώ];gwظFa2r9l\FN#iq96.# 0]i`D! U(D TU*@ RBTAQ*t.69qhq f<4{pك\CA߄kj הo7M&\SI߄k7pM&})ߤo5M| הo7M8?#dP)8Lf#7Vz\?x=nn^z}ymSE?endstream endobj 544 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6056 >> stream xXTT־p e f{BcAH"ijETHǂQFEd!sG3o__a}߾J%H.v \>M%ʦ #$~H8Hu$5dϜhAR4H+wHkR$[} ϛgbd2 Qm 04 pc"@7C ~~ =<yl26\ q3 }RkӢ[l]h,0c` :ih:H CSDD';/7o6аvޚ=^1oK?K -(VQ x6y8x)Tx]4jX˔`% 1m2>jE"ְ68^Σm䥁ӭ'o(хJ%%W<ʯ3h(9rp|En"{ zrA [<KEΟ>hUbsdkc&ckyКhm <{akJlKQITKGrfgOkXmxпIY0% 3UlpbnR3KwSB6LmSd7[h?V[SҮv&%>(1 ]lx'!H>`vJA4;O"p"j)kJX-y}*/YЍ;=GG i.ciζ釕X(O0$ B^Iٽ R*ԓ=+5qxՒLWl'%`R8, ^2ugtҷ;Q@F ƈZR>Fמ/ 9hmu#3{>Ohc`0/|b8|d5 ze&pOÒϹVBd> $?dGèJQ $Աo׍ƲV[*:1GTbWih '/_xBٌZ ֑k96FlF;W¨j8U S$B41`@o,v=ߟƽ“̧I`3 =&x砗rqƣJ |fYy'ݰ[O!>F.x_좄rw3-a[~dqfX+lnvGL&M<+=+%Fd~x5}Ox'`7OaL}R5a.dpٛ+k q?k[DVEZ7aݍjl|hՓP-)TxW&/l WzD("9r_',`A`uֵ(Pș9oRQ Jܟ#_9|ྻ"x{51$÷tj{w]'[받;bJ[Kg++$@GqJajb5w xfiьj\Eոf@+2 3Oؾ lNRvR&zolVZۀ Qѷ%n$~B!š9ZP]@OH^s&kf^3~[(lYy+8CXn {$HQY#$tp YQt4D\D5uajӪ]9$>HN(Y< RBA6`u*Ŏh`i[FrIx3OD]ƢiNѓ/ ގB8ߢsg k/ksxh ki?\)V7J΃ X E)Lz5 fW~A~*|c~瓎?N:O!쓎'Sw ڿ"4NJo3{B=|[O`` ;iQxp+K<7ԌD!(zUG-05v[l3ڐ㒽.k]jd-s,[[]BmҖ҄bt]-h.k^7Ijz?PcH޶=Xc`La+l5tzyz^86-3^nAjIRhoI0[Fc6jYLDgj [$x^!oWd<N a@mz 3,L9-._+b=»$8)cbz P+P+/h|Zǃ ,li^x'7ͱ3Qx֙mn[Ru(@-+=PN\'x-mNjϮ5aafOv-J1;boP- chZJª KSńx5a4.&]O]5L s/mHW`}6RVn xoJeXc+s{OPK0ksz%lR+O;AÒRP^`ͷ_).r|+]}P\cơx\q`j0nu"sZ\ةRȋLښ` ʗQȝ5W9yƒu?dʙt=ҳ%u7*H n+a>_AIIQ~YD֭ IIRDr2\$#7'$ELY} unћ7 Hߥxqkl'[O<P5gB&a}4ן>tb=f'Ƌ9muTpD5&̑ RQx/r O㙮0w6Et>GeMsa}t^hl<@0q2L۱b@.R!w/cJQhyxyBdLj옷X (i:'km xEkB)HWG_x@2AWA;,TCTHؔ9zܸw, -?[#8Ö҄m岘LcL ԵZ!-8=.֊\=.ʝ@ۚ16؄ظJn#Zq+K*Oە{Hak&5=r>U0UgJ~y,tyl2OAi_X7(hd'w¶Rr'a#mMA0G~) 84`r[gd?w/m_ҭG͘g %*"h?w/dv_ԡoNDfn 7ac*RtV/i7Z_9,%*-@5D/\(~ tKMƹ* ݄c6EG_>Z)2|¡~uܯK DGysNd[$߉tE1c+4]ǴJ[ʹd+> stream xW T׶R@DAEeF (("B#2Es}1 (A gP:C(@0bj1)SCky3?f?VS{9ǼK GBS4fdof `%c=צ椭NH0 Y}uBDr6U19%<\MrL R3kwOoY1+sbsV'$](),9\6~tG3g9[vqd5ySm(ʂ ,`j<@PPj¨pʚZL-<ʓ([j)MP(_ʞS)ʑrT 5Z@RFT%FReLP(Sj4CQc( RCa.%T OP#(o dl*W0\,8?DHӿ1^1NlPPϡeC1ùS/~FwLzzzEFn l 1xj02b׈rCῌF3r2}R?M.S`-׊׊Z&º4>/JZC 4BHCr>%Qn toq4ǞA5#n ձNޜ15B%hWU^%lP]@e"ۍAI7+GYJ՛QOlm9+^{<eğ?7bq-9~UTdvqW2eel[L&,":x:yI QgI3֧6-G,I(iwC]N`WLI`w|H ܸ7ܰ16Xjgb0PIի2|RpI%T[KG;vDќ䰠 CXb|׍?B޼>azkRdA]Iݾ$paPq<+&k8{FĂ  x9,?x@ݍ;!`4o0[=PcTp JZo`X8`d<^pSo%qsݽ}Hf{,HZ.߬2OTp/n`#e݂zw?KG yJAJ@ǏSjA?M/J %;FMqSw|<ɠ֣Jwbl2 C+W>cxo:JM^LE;YR [?H^s`LȾWM##x,?tRnT {;絚U|-l̘z;Ώ9w_34Vc}o Ֆ6 YrBW˸ZQM4DZLKxF41''v4ؐ/鷼;`pZnˮĦ|zX we X(IO,۵}FPY@lkz%fnېyiː/k{C]ѵے}thw~O_ݚ:y姑/^q!io:E8fjClhą8Eh0(0Q>ZM. Wpև̹u)-U^RK<I^NT$h";'hlh ޚYWe%"P<Ȗ#G%񯋏>u5GYe,-Me&zguHͻBL:o/-j`rMS#!z218' D$ il[|ICciܠZў~ :.VR8`vX~\RQ| Kړ!=}t@8|!lPKV?w:nT<FYk/dv:*w3*:BwIzVO*Ua7Up8[`[aUO{5 B0ϰ5gp eAΒ('[@$lA/ hJ{PQIwSA.bݢI}5:e̠aV'}A}]wpgpv [7`ðӧ-?͝ x))ٲA.9[VN'DJ43ЋFe*CXĒl;+bh?LATD'V/tQ dhN0x[NfZY8+>0~0jx6X&&`]jLg4B A\>XNsVxCM4)_sz*b2cקdEm FsPo?;[pTߡ˾@#yMymUY=zCJ'H:nk>ܦ@%NiQ~ P nP,]\SC}Y[Hc FgE'= jF)SmV@ nvsVO;Wx &FiȜi8M4`K#8Ԓg4^AxhXS:%w;p0%L 6> yxflQ~1#؊5x /Da?`jm>~x? h/^caW'{dGJoĜE(jV|GU({W|*2*0f@ٷv`1؀;$^@r)RO:jq:v/5^ _{piv#2XeD(οܵn;^! ʛk~vvʘ!{)z'Cﹴ`Qq'dn蚥 Rj x)Q^^q%]Q 7](nʲKK )\u$ܷ9ė07RˏFl-);%=t'<.p:b5Q"rdqJ7'` tzCtVMȖN!  t+[HRhcS3G2[Lⶬ#}pac΅A|5QRz "Epiﯠ|S.s0\w|L@O#ÿ[Pr/Y}o@ UX(uqo~q_Dɜ` ΁?ܹJ8!őoV8}IWA X ǐ0|g"~ǛC9q_˅GQA\tW,"q/`{۹JYS HQ[^b & OPsmݷ<&2g6 #p!:=,#aGk,؏S 'ro>#G]D`ZIOĮ1yYA(lXoc5iw>/k5hh1t ܉|TV!TCv>/kQT%-*r~kרۿ 2-=.#;9-k_Qt̕RoBOjoVغʓ=qlrN&A>S ~[P [C#Y !$7ӰYYQC> stream xWiT׶(8H2(hifhPQTQQFQ pDlrMe]4E{kQkSꜽ#P"h*E|D7\Z\cDCFXXqlBS^bB!#db\,zJ#UEo&L6jAf:88" \Q&A\Uz;\.e \+h*WdU~2WJ Wʼ"H"RɧȢZr`"TzZ-e:6\/Se:|LyWt2 q3g͞cy؅Q8ʓ75&RjʏRT DQK`ʙP(ʕIQ˩ٔ;5<*ʜ(,єeMP4OQl1و C6䕑(Wƹ'hN2ECG ujf 7pX갊N ?2\2#&8=iff5#35dFb9*b_x 0S{i{0}~07vPKy{0V[::Z\.| cnZ15k6eH/'Eهagޗf-Ӭg~A s-<?QWk=>w?p54 *\X jyLGEZf͆di6Ċ{|ko\ujdkbgz00[([#~&fy-\㡜YlrXmD߰0rcDlܰ zX 99 17;;W5K8Qk_Ԍ>%݅hbʅ_Z,zSzK {#_J3aiAɎ 2X/a[Eg$ŕ6㨸w!"xO@3Z ;E&l?}x^* dL{>B gJ0}ySex#3LH`hq_Zȥn+@QN}7Jܽp|Teŕ/Cx&Ɩ,f ۏw"bɦԄtif{oZ5:U/_ y"ay,dit?z0 mf-6x&k'ZN/ЮYg˾ ?*8H"/$㹁0W.©26Ba`y넠G\䷗&`G|GZϥOfbL}oj0eɮ9B؎yWBŸmGٛ%z,*ؙyYA 9.,)ZXGED {nW))<ԴQy\^Z>AK<(ppulmD{Cqذ؆Q:Vj-VzNZy@eiRӲY>LmPaӅ.f޾+I$YK2w"6">ρalo C~5S 4+x FKϒ1q-YGΪȁwn-k=+-HÖa%Baa$p8W.$r9MТi.uBeH PI,\“#z:]%L\oWtsXV;\PXZXԈjPՆޔ(%B2qNoD"B,֜ʐuړYUx,ÓRݭ tsRw_0i5l5i0p 8dWڮԼDO%}Kʈnx/x; j옶ڸ樔D.V|va"Im lyc^z1r/vCTyZdSNZ]R%ʧx&#pV$/J5ځ`> vBxr%RlgĝG@PHhTD?>oԉ[5zJwg_*rGN{a:&{ @̕JCtM[bd/۠df39ք: f{jlP2VƲˍ ވW,"|9n+J9iiJCz2- !=\hʏ%`w@k0%0(,d'FLn.2*fij.H|c3w! ~J"|oJ qs pʞܬ\ LLGȿ8vݹZ*/ѓ՗&cQ'EC6٢۞%sd@ ~?Axx>`\_ϻ% :A\t<[9R Ƴ{!6 O }`ciK .|&;3UwfUN &ɪ~ZՒ kW"wrg3 KS>s/HXhj<,|;D_LXG' o4}_N3GD! غzlXBlh?Vii}UQ hn"xͧr}17c":Ŧ(Nh(H\`LpGieJ`/UU7]8z$IY''| Scskb۪B(Ruz8c؊[vPw(7#*:t<))GL 鉎 eP'j7c]7zjS;L*4MY6U ,6W"z̔ V?rnI?ibsa4Q v药~lCȌOr5[r' וG x-6_{8%F]oXϊF%x]Um֋';躾vU+~mGr{j ec7[ߖ&.wBȓ-WA8`,Ğحz{3@.i`T.zNj4y#r-7k,ݼf4m> stream xXiXW֮f.D,Hb&okTP#*-;4;#}E}_p$&j2.͢cƸd4f.?[|s}ƊH$co ]9{eğ $›VDk"HYd K5M8ȏ^c kdjyJYsOwk\p]+SDʔ\0uch aP_g֕[oyz KBV _&:Fkbn5(3&-`ό6xLL">%%{6ƒ$';eNb9A"Vwb6XC!nzb1`'Š%XžXL!3qN "KZͰ:fmokbmcr7Y-H([*Nbn?gԷ{mk^OxLqc=ƶ1+Y:J1iP SD`@i> ;wN9A6ErZ(r YYǷhyNN&s,Wğ7qh- ++x|+44:e3lr;#WPIHuKѦ7akԖrvZ_z?Iue|{Wsp>ZS, xgSR@fk?C߾}N A 3ە5j΀)~DHEƆh|zN7 ӐI:J}p[_ٙp $Im!\jfy.`e&iuFQrsMB T2"iS?ZCǏ!+`nYor⦏Y|@Q1J &؆KN%HLVlQ>h3tY%\MjN ~Ԥ 6{?N ٫rįxE <_p0׭ow_@,$77WoyBx KOҦS+VMZyI bpŗ@CzՓ|96eizEǹ/O'r(8xsȅE_ݠJd +N@W8<;W'_~dDtg??t?8ѩBrg:TtBh&+5 I`U32I:Z?Z[Yáu F[1C ~Lqh`l߳x+{W.^^6µbC@Si# i澴 _(FDQ66R^.{ в%nú*Gڎ H`1 I[ =c obq;2]oΖHiW|u%%b F#N^ý'vxp K+"4U=ĿLm-$ Ɍ v@:YĈrO-8oHC_[Ɋ UdYd?R[эZ1pNfA9UO9P*vjK%|LnLok8zԴ,VV@ѷ⨹~_?])eт(q@$9W46 ٖnօ4$BwT*RjC u6o~܈1@ wМhHd Q iF"_Abb!ok0K_{XN$Kth@yV 7O{K5ue-Ex4^=9EKhO0W\vv$ƭDvDŽL9k2@ ԁ i6:sX"dȟDpmYք шYY)Mr[nSŗF6e\ Q`H(AM9(9MTPEBD ^!5'dҗԙg5R¯ѡ`6L%3jH^f%GLr T>(hUCt2X3Х8Su4&)L$ϧ#R̤:@-\}DK8ϵ2W[8٭rҍh_'A{ٰPO̹a-`ZbXA&m.o!m#GH<%թ8܀Lh`N& &a<eey`ڟw 0fV4%J£KW8Ţ{OJGjjVEQb+ીz@EKrb3Ų~B<*C$!X9:{83zs S$Lf8v\q\p|A="C -*5+*YZ8X VRǡtNFcјbkG\8Ad/N碊ݨWy{tVi9 wfgK<-58ˆu6dXXy6/ph3t-gF vha!hCd"3 p5p`8>SlNῒ?ueUpzuЗw= LMLd/mnVSX -v :åĥEP\Y@O^I~:8W_lg dԀx]jV5'b~d}PV_)(-) N/Ty]I+!ٱO҇]>GOyAŽD3~3E?'1.vӢ~dT%( 5Lc"z\#@=h=! ]Pcl;^B+>]=.}s/PI7o=4]4$b+JQ'1e, ELSxMPPxxpPMxssMMeB5­FH%g|wNkA 1߱.UBBO8Jv8zA<(E%2/I{Qfր.ý*X,T[؇m1ClWXF}˃D<5J^ހe " WCMH-BM;n~w #F^9k2@K8c4#24jĺwG ݘ5{9H٪& ,$,lu9&"@vLm./ꆴuW1鍧=NAMB"IT #@ T)2]k&a~S"%v=R'".ߏH3w[q[Y*֪3A3]~gkwxGAˮ]⮡4b X2" iE \YȎBsJ(ʧ8=}ur͒` Oz fC7c-8CM;(d$g=%YY -ldmg}/L35Br~=:&=l?Mǣ(}zfm8T$M+Mlz7fnW{*D+cngI[e2Q=Ao7Pp>#Ojjf"H#b̭U)"6,KADy: ,TK>2E}E6U7F)]y>NЃY ])`{}[(!= _XKǢd<[!7hK8,1b'ࣕ+K9,a4npTBMX-t3hԼd,n\wT'NpLxٻ\ְX/S(ZmGZ[ͮx, >9|%r]r0++&LQ6BSUy'_wFUy!_hA/vendstream endobj 548 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 604 >> stream xeO`e&K[l;zX&s,.nJ @]wXLE2T4jB ;)#BȘHt#y Ȥ5AFt@!2On}ͅB*M%NX&1SH1Ќy\id\}E:즷gks[`rbnjF- P_u@׎jSt_Oa BĘ-sg~,2J$S3 9;̧אrUlʰ+$kS3Z|tp rz:ҹl$ 6,$0Y*6 5qGUΔP]BVXoZg3+|ÊL2e>NU%YՖKTU7[V~ onFl<#o~$-6B-endstream endobj 549 0 obj << /Filter /FlateDecode /Length 642 >> stream x];n`^ ؗ c7.I.@Q Z.ř)H$| eo<~X>y^mw<>x]} tǷOG߯ԗq~ͦ=NmnהOTk zSP5Yzh uj zl ꑵ7 ƣl6xne&`D0 Fa|Hl jVSP84L@#ƦFjk&N: :p.N: :p.N: :p.N: b:Aok!oAok!oAo\p!`A`@ES$!1~$$O)B?EHIBb!IH"$ S$!ʒ+KhR(I&%JJ,.L *-z ֒-XKޢ`-yނ-z ֒-XKޢ`-yނ-z ֒-XKޢ+5:{<<_u>7aYʯdibendstream endobj 550 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7565 >> stream xYXTG>+٣b9=56PQ,`7K[zޫرbYը$D1jL4~'繳͟r/.3gv~"J%FXΚ95kzr0Z$ CC[ߥ/wbz(2CL>f( `8%]}#Vwwu 4=sB=3Lvxgj5f:_t7}tn/S_S;筦7dv ޟ2|}\gr-f>n[߮UY[v c&l:.\7ٺo~f9spMh%K{;>GR j5HMlEDm&Sv{f}j 5R[)sjZAM j;fRYj6eI͡ZjeMͧluj2Xʑz⨑eLPz(JM1MKH R)j 5ZJ Q˩=q1YI W4S߫Gc (ղYx:y{UjJUPF K̝S ^,` La܈*_ u_cj!lup.GUn(̙߸ΖXG4᯦ۧ[+Agig #9[ ͬ<qGŃSK-ZI0J&5kZ+G%԰pa>⫢&!'G##)b?6K3X[ #rU/{8llCP!u+7'[oCAJf"LW }m…\E[׆Z$C͎x@t;b:9'RY-b*J{P~R)$p`C3<` C>UBROps }2VL݁*Kaia=ҤR@<>wtB!$L> \a//"cMIJ|?Ĩ%" GM%bJɄ:MpJ!kR5otwر1E b??j8SҴ?{pb{ִx7`-/_9T]! B2`}6&F|> 2TƧƐ]B,,/xLE¹*g8z/Ot:/z7j6ym'uuŎ vG`pCVI;upB̰PY #6BmV[\;cZv4>kQbtՒȥ5OE%*}.UdbL rtH^-ǔH_, )E51l Z6X`<7n`hj$ʸI$+EwO(6-ez=01$n;3232Q SRiɎ]_^6IzWJ`+خ'd c !vz>/N"OG~bHE%|IἸ]QD+#0=29s˔EUδo3 PjE%Uס˸7IDUSA8ADۻc2xO5{W7*xPT) Q.b>RW%aT3<ܫl 3GjP- suDqm:M+L菓 8*)IYix.1i`'>Lnڏ9jwh%vb(Z_V}k~ ]֩.7kp0bɽ4~a4ctQ}o$%CRI~ <_c4 xx/@m#/70 HL}JRWX)"2qkvg2L0.W&"$P_3d&I[? ޲CI)lW61X6#v? eJ'VƗπxڿf3bP2B&ϰ>v) -kCyP݇=R@.nҁHu}.=D\JI !;3ŝo6]yJnT6xlj"=ѴP %J+:1͈2H4#O^K~IX585'$̙9PS٤m$K풲ưʂBE<ĔV4J:9o}"̼rKwl˜sZk'N8Pז{1' ?Hx`NT>*A&tq)*ϒ/Ikm7A<^HЄ2U(h(d=K!O6~7Wǧ4}|!5'RCN2y!q ߮"8B \AN0ًRFXfK|x6v &Rm hZq:H_Ѧ[.ԜI#ٟV} M.xdou&GFS/aX`9Xy{zbTR|-rKȲ]jْT:E01fwTnH/{&]\I=*G`,\{mtvP\yH${"|<'1M)2:ړ;wJ\{ַd)]mgڪ¬x,׃?-%<|076\#=j,A- .>՗'pH͊D-Җ;m3ES]rX4\B>tˬAs ˫HϾHx *RP6iQkPf˧Bq~ 0iOQu5~F0(-9d `{wǓ@ Կ=e5+by<&F ̓6 -TyւY*,&MM@ې/3K\QkkĶ@$kRu JNE/1yJ*A"e]OJi5V$DE%CRSSAemYGN݋fJIS'ix U>68f_;c 7x]K+K  cg/#ÝsV9lb?.6.!Mԝ2f ez2-qSS"Pi) |$A }: 7Ą+O"Y˧y0oM);P-$]IɑOXBP\B|V|pYE7=i7Aixk}Wa R%Cww\l8p]bljGBwQB^r:|W}qw kmRB>.46Yܻ44332}7@H`/{0R G$=Flz Jq})!HdGn|3akG=~k-ЬyJ3Wx- 7=l#_c_=~DB2Y]mEiS)$G!ǀ},mWXkWTt^?ٗט *E'UW4BOJBQbQPtwO.oࡔfGx#G-|&t0W^(KK#'ēvxR٩7QA:MMU~Q]ac/=s?z{0ے T$V]gl/?Djg]fEF*=U- ܖ{; ȏL,*H:K$Q%m]r_0WByVb’QL N:@j P0NŬ&i1<,ƃ,8DW1x86kjM+M-rݵcGON_>~EZxDYd[z4&KmZWV!,h쎞Fl+<ō $}xx: )aҷ5 )R2+2 Z*2劼K P$endstream endobj 551 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2643 >> stream xeVyPSxoզU}$VjUU4ln ! =Pl@$lC[$dQ*X*}[_Me]ԙי7|opl-1Iǁ4ritSg>pbpr, w<6-rw0{FxsaTqpZE# ЈV[J+EZe\T1 "F+D!+Erѫ{jQD-mQ)äF,_ o^8ab5PIxTXa{1WL`%~#aAl+ ێVckݘ7ۃ`4K6 'p?2'tSy:#p($iO\OCj3ěm GOs+.,^)<3 mh/2 LdFiɩ3 y˼ga[j|ˆ_9|8/^(Jp?QNH`\5O+ןNr8G"MR@RZe$ZKot?m9 6"jXgUmx,@;(S)DnAp]0Fwq/Enް[&,E&uW9Ӝ>E ,N}%N%Pul{S-z n6]mS5cq}%W/hgK ЃgoP ₀ &7t3wpgk6ltls[ؽ{ \' I'rqXScmu1 ڻa~fns~xRt*1\;\K!Ktv Kt'gs08Fj=tr#{a>#dn\–B`f\G"ldybmֿC,L%O샿8,rubu4ikGVy p-Æ.XمG3GDSI: v<]y/n%<|FU PmM E">_bfv<3p.?#HBEu, HXC-7vnHJ^ؚ ցՐda_ze1l½l2";*24q F [/dA:H/ǟLTd:&^xM#55'0.mx8Y  T^ X+ݟ vRi`DOOåY 9g=[R{QčJO8e93p[Ҟj-GǃB@(ۿkpf^.ylb;#ygGZޤ.G`Q='ieYFD- OpY;z4n!I/?,p[Opd 3c8 C}-Q.|J!bxۯ[~FF} x} %GDEs&ȀDoBdm#Q]si"zx ]YC*F@bwwDh1gXp*+~"zzcacq,7·FTcFu/fHp{`i:[ /k9M#n{ޯ0T˄<؉יN;L1m&3PMV]6_ʳe7 Q{<W>HZui_6\t1)}[Ï;7sԳu8LLsp=e`6gLC>Õ :x_f(cw BVwoF):ADz+HY'l眻^zxNOLww^jY7WL @[AUVIz&?ԧ|GEU9Pj\  >nԳ5ܼI- 4Ʈ6{+T.oX SS!e]Ǽk)1Cbxx98BV4MuM1JaᣥH,F}'Y v8zƕ3%O,N1oQp[\Z0]&=Ru5kts6XhXJ;`m/6ɉ69&{krLPCHy+x/+0o4=σeY0Κ g·&/ɬQf9":WoGaQl8l47GYeB^b%J{rIܶ°Sendstream endobj 552 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3902 >> stream xW{TSW?Zar5L{Vi3jժA@ޏy? I$$@x% AThJ+UоoNkk}NW׽wV";;g}YDTbؾc+ r3ք ?~(#6s> GyD$u h#XR#|'VOǧK7)-#/*ύO+:ҪwEx17~9(>=3' +/aބ-{w۝UAį/o,.-o ̬܄GV.b7C$>b?8@$FqDl&/[56Ib;IDE'+u+B}&2;;`Ƈd%L׬f~zn`^_5 7#E"VK {$P\&<8KFD[% Axh-J@o):(H~;x._B432 9h1nbCu#VxXdx-ڪZs Rf3:jݵ&2bU,J>UW9P"  &56Qg.T24&ˠx"7sQ?s~&:/%%Oudrg^Gbǐn42lA[gf3E jxLjDsPZJmpj&$ ( zRޣO ;GXto7r{V:\)*( L*yn0:f-sIa^_ZjBB-D-tGC! mBs{ҷLU:u[0\tq"1>ކz%B1~)O(! Jqb?TLBiq}я1& &̽+RA怛FrqyŠS8g+ZO1T?FzRRcpe_DGsG_m=(@ 2K Uu7;޺ 5ML9 个iU !pISSN@)Y(knszq$2,AK҆dgBmV5t@MuGZ@4˵ZcTڦ@ =1KW jJB* o*^L*s%tc(!V >ҫj-< 0.Qgr2SBnDP)PԴT BG[=&cߙABq6X0IXmUSU"N:&ĴwTV[=>k9|-_k2ulf:;gL NppzAk|WZH6JeIE}p\w!{y 68 e +0I>ObNr%8FLǾ):.堹a;r 6C-^mD"lUcVd0'C'=}R^1\Voc̚ vz/jT]eҊ؎qk8>z$QW0n p? #pxZbj$ =$0^&|IAm_{suO׽ Ӿ m 5`%=*LdRD!juN]]O[4Uy`4 @d,Riub2֯r-yNo;8tNoAar1$Qj(X RTpZL0k"LmO0b=gjki%" A)1N,}ߔ(z}1R{g/nvלpXVz5^nMTkd P~+Gz32ER8W- +}cW! C J>lT?OJ4l5񥇎t' uQ];u E' bcEy:kf)/fק50g&D-s645ǙIsud{ |;gtAKJݬ+("&:yq%4vv}J׶BD^NH{3t٩^,n[EEQSYJg-SWB%\yfʡC+ #mruq瞁cWOPgӄ1+.'nUhuF%̬uO|+5PF7)>21z?:q:Λ<^ Ch-ץc2P I|Y),*Kc7E|?>sFPEJu` *_/imnvo @=xt~_i4+;?(iGrRzN,o5+0P(]R%ftBj"p2轸6Ɛv췪41l67! xWO4K,Ӕ( B߿iIgnГw#ۑ)nn-Ք6C85 ^e>13W fX, KRo{ÎZ{v9xӉyqoڃէlnGwH[`0iK{^O1S' 'L@\!1PeXg0l&]NMA  *@j1[V\qI)l׿\''F*vyp*]W'{ĽNrώ} )Vg~K&.LҎ6ՇC;GyYr 3OGu2Bw(Wѿ5ow?AʱTN܋ȫ='~+~w}K23e^[oZ5ઔ *#I+Z0EƧc)./=Asʏa/:̅G.k[Z{+o_x5:IZ( uVu-ݥ:Mҩuԁ]6>+?च.ׯٶRo 4hiHgh*fYwq9`cx_#?۷|>Ay5#}{M̜ l5j*xl&_ea4ufMSkfXe;jjFx M:Ya1fƓd(w0y5?/4Vs!M5fF 'Ez-][їW$ޓIYضs_.h7a.aJWͤ6ŋA Ҫ*QTdb^ovI9Tuu$I .W.-?/vњS $b2}UY܎st#u?p*bYv/RJatBѦ{mC#Nc~7umNh@tw a}aB\]RެhVgwRU"҃iY%E'>P(*mbA/2Vd0kI]\vA㒇j2*dMR'xΠh~k2%o%-M6 0Ͻv{Kx~!zZz> #'!nOD%}PA9'3ƣAiEj6<)*rrzE_$2KىUBQ V,)Z\6<ⱿqUvVM7~4Ql$&Uҙ4;( Vԅѳ.32kl65+*=g֛_6s}l[GW= ]V!endstream endobj 553 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3966 >> stream xW T׶eZ5q1&ā)P1 t<7 APA@P%FTvx11d%5mZ=>{;B$KT͛-Sǘ͏cq\w06Ð9_;npAEXٳf3c}׀$W+#T 0We늙^3]WaoPE*uuú%\yްfݛ3Aː 7ݕ*ϨKbc>OO H J [Μfn# jb :Dxub=! _ƒDx~bb&XB,%oˉc‹K"hb!#^%nT>žH!DnvZo99Fz-7I0D=Ф_;nr(=ѳ\,sMBҙ/-{ WsF(ˀ 2x]28LjHpy,0GXKcHGc]DFkem(ʟ$A.Gq*FP#4y*xȿ>kJR)deIl"_>|rq7XJ i|1c9:HJBPB3]BK~K&"mAMi8hO?biÏ't{/'m!٫'eIG'&1Hkbi9w/)6 {) jήBTc]M5Z '3xX8o|6%H }HD Iz1&i CL0t ȵAg w;Nz2U: 5dJ/+[CچE$iˆFTfI+YXA 5Q{!NBs>grʕ$vޑTm"97T+Hۭ)0xߟy?-;DYљvDǸ,Ie x}Rchrop" cu'՛VwxT¯~>^`>1#U0O[Wߜ72Um~ !6k"J-n'>DIe^*'9Q#+ 2LYRONė'ez4$?BހKj@`:7&8_ R2SvP"-áoLִ^ȭ FrNM~ U@nNSz~[ـ\]Ӗꅂ^wӮ.TKs}M 6B["̈́@fM`gJk">¦#`aCZjA ղ^ġzj#B+xC :T(טt(&D8P`%W@&=0Q~Wp!vNzL?ʬ@%JfLMfw7j䋧:n('FPCޜ JEE:l?-L%;\EG_w.hT#**!)[uE=3ը ҕʶi^1l_ri|Zbf jޒ/;/[wEUKnDAD/]Ӌ0 &]vW^\ҥH^-dZ2Š 7^P9 ܪ`sVsvE ֚oB>$zo&i%1E8Z@TъJX/x  /=&ZiCq{TTHKHdJdjF.-I҃&)|Tra(ߘiށ=}w549B90OFyo|1ݺtw`i8{PqJt N$lD q:I}eϱ :E>|¸0Ir _RɶGW k.JY87ZszqTjSm,$y)؟VUV<8Ol!X2@S<VÏNEZ$=oKy={`}pUe\yxƗRفfߨѡLVQSDE";=#JRS)rZ;@Z%>ݢn]L}rEOtۆN݅l-zoP =[[&ta&S^|ZGluǶA?gN^|HEأ8xv`şX/;e_+7B( /B1yl^)ӳxVfP7DFՑ j0x4>T0_Rw*vWY,/ lEӧN^يb8.BtK#TÊ- \-X8ۻ-4=ߒs;Rzy~C\uJeRP>7cq?s}AmôWuS NsF(Co>~l m *uB$^m6] + $;@VN6QmE޽ xà' d 9xQ6S6{Z ު3+S=Le^7Fd` ss]һ=ᨳݏW '1&:a4_|`˪,i{>;W2$H f*B 7Ģ1M5VwK">2[ ̃c'b}, ڍ&+i|f#ᣏɚ,E'V-$y+m-v=2.Юx cfU2󺦪ܽY{u֖kV8/NE).-'HH/]޻ӸE4O2t1g~qásLbGϭ-OꚪJWH];!J UΈk l/eNt_f׬蔜-,*ѡB ;iv5&+cf0&+!'aɃYaA98Yh' NZmcS+[f*6VfF؇;@By5lxL$g)p?-@}4&`׵8 ㄢ^?>'vQlJoOϵ_gnݺvƈƈ#͡Vա#ͭZK;">rS2| BT5u4:S +$7 _r;OahSGyH:uendstream endobj 554 0 obj << /Filter /FlateDecode /Length 1711 >> stream xW͎6}i E i?ɮ=$쭋>K_~&MQ K gf:d_x0W NdҜ*)cLo+$Q4['-fg~5ft- XhV 7,c@ojT8I8o2~X ñqCuuzjzJOZb0+v%Q>-8O7MgSNw/p@w +%A*.PNU߄՜[3:tХwnIQ꺏ݠ7/o6~lFÝr~ߚYA%A^ޑفuy А<(eYbMC[(ݓ0f9rghC00àQhDD2pp^oe2P@Ѡ:2AݺO {t<^^lw+=tP=!>Vd V0'!fAxjZuw$>*3Tԕnh@)$EMK@;+Ђ4 7XG2ll2*nP#e x4t_@|QK'\hkrG;k ˲IYYDgKiE[Yx,j.IMiBE?LC~ғHᵮ,$@T{_0ֳJXڲt1DL}jbwLba{z##l!nVe]TRaR/80@ōd#[-Dl5LjS.(V,ZK6\R ñ>3݌M|3f;h @BA,d}Ì Ppu1cr)6 s?7;?WKW#1C|un0NwсsTݨ2cKH\S(ZOظBu)L;~TZY!ElXBC/R`!Q \%8Č@9yJkvϟ,BH\Rendstream endobj 555 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1728 >> stream x{PT½WC!k$0 MBKQ m|y, CdryDYD&Qi8Q6f0i0ƴԱɹωBLf~My,h޶=!%8<,$:?'uЪaȀifLg 10yuŀǻ>b?L143-,cf6,,"$D[ѡrLJjv~Yqv&DŽn_/y̔ 9?Cޑ,'&lO_MKX EQK_T\R55=#.>g]E=JR+8*A%RIjj3"NEP۩z 嫕LyPgt&=Bf#>:|iqEIc𔺻<$@4uzwY[yP|[yP 1޻ X/Na<52<ƞnl)߰0$H.̮;N:,%ҽhh붨twG]uL/?* g^h)Ϗ6jhnTF6*O>h<4 jЃÔѣw;*r.掔w:2SZwS[a?:tPpXilh_PN45e+!Yܡbi${=u`/+&moB]b]S`Z^3_q1ϡo#Ԝrksɉ2scgYZjz-UPVkm4⊞knqp8P)ݍw7"K8ShzI3~ϋ=MD.kY4~=ʦfJm͌!gHQNೳb9fLL%>`N_'/7/˞OӣTv#@ۡ3fYlT +?7W^uHt@MUdF z_9tKQ'\@w+2@F[cBY%ȏև5$r: OtbvhzhتT!mHqɱ5OUi0-.˶ޏo܀ڞugpA@gw BNV~eUZx]rs~HR?SK6^MvcdA8uު_:fi {kdK}`}A-0xU*_ H~[L?!;чE}GWXGAAFkf|냮铀H.I Ynd8$:۠1BkG$~X~,}j9̎y23lc2雨g0&AR(n` BiWXIvPQ%r]k囇e-nt{IO}N׾T7 ;K==uԦ%hxH\s^ 77+Qi)^^w۵5ټ~@Qendstream endobj 556 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3602 >> stream xuWiTTǶ>ms=Ljw( 8C'AQR(h@AQ24FQPـ&q&هoU{kWj׮oPc(@ek6::B^ZOSӄ8f8FiYiL xZg$ׂ)@ugMtLBl8ewQ1"v+{caqb#团Lk#"vcwVmBQqasչUf{O`"1i{KX{DEf-,\fPLʉr\)#ʍr<-'eMSBjHm̩͔I6%&SCRz>e@M xI`)H:a EX'|XZ3EL'{Nsfձcύ}6b\8~&DM'J *OURW fx9wN{CO++DxvdJ8}%׉'B-L{JZj&=si<V0IYja5hym'6JW8dJsJrJ%j֠(']&ր"ITKnQ`6)1'gL?8\$T*>Ëf¦xG#f?1eYuXۮ]wtksGš.?~bSu%Op4VܤR3:XXϰo{{os1Z<@t{:=<Hs: O8x'k=őKxHt%kuE.79婂rT*SbQ H#@mQAa$hq8dgNx}\U♌udۘ=B}weƽ&1[f 1.^xBR͏[i>`FSgGUM$ [-72x{D#:#v 2I ~Y (9_7l_` o{-n.̕cX3#ne f$GN~8 Ę(Uug_3#?7am$šCcQ*_oL/P+`)h=X +qV)O8[dc= 'oD'r!Vm,>f]vuU5K5{v"7Vg5&90OP aWpwHĚ:܅ w'XBt/3H4^o3s0%gì$O$:^*k8SA:@,^lϏ8C5o[`ƕ+8*rzx) a>s O>H`90g2j= Ӻt| LC<kl 09|2x,BGQ>:ʂL_Νb(Ⱛȋ^vXf,x`b_&#lix=}|OzgK:[YE9o 5GXk+1ȗva7 ZBUyD->A/6eFJTygw$:6o?- 9:Dj[Zݿ.#mGlgwS.&#o}Oޭ]u55UR1F=J_˄?t $=6G5teGZ5t^B7QsR(!5 _^8%3G UGTpn^S{/4s‘<(|Qd"qua_n-5^@jµ]]3PEk!0~ FXO=X2m?Tw1ΏWM%}xktZ¸jGJ|P 5{O@R䕫(K,vd9$h%gx&^Aq"loԷ *;"Vv34*g =/d)=wV=LF>d6{,z?yCR2qU:P9%m1ldDy$';g?&ЄC~\CتQ[⭹֠S^mĪԓQFOoVW\sbw,&y6T%㗧9_\Oۭk^I/nSdar_ˊ~*S!7氩1x{ H b`2^ q.C1gJ/D7~KzW:+P:Bp5ʂz$II0ʠC;3?7Qė xMI[X &.pzheERc'kO3_|˂e`ձ߀G!B5La?g c,v~i&Y Ykz$^aSnĭ_D,lL˽YANeY5!* 6]z*.6]">Q` .")`4by|~ca  ψڑT>؄` asCc< O~amҐ+~:ȌhBy>  mnW*CdY*I֢^'JauyGG#s,Q8endstream endobj 557 0 obj << /Filter /FlateDecode /Length 2205 >> stream x]n7}zz@_& 4ނHA(W pJcE{4 t9|>).P '1$J@d9x;"A/Mn Rg|77z[yq6x1!T! 5 /L/ KKa )[cdL8u%ʖ&P6b4s0FhRw1hi211ccL׫"G8N\.эEB8$mn"0-7a7Y"탛va(}&W Nthg{N jɘ/ <"zBL|tQz]H麥L6$\C"x %K#>'WՓPȨ^caޤ ;lr^m?^nO5!T@iUo _`!#UiB%]UDk+~ wosDWJ+_fA 0ƭǁ/y`zmioIծ&Ǹ%LZܼ@LYbb;_]BSaKa鲈 P&Ҋ[n]7hyMC#>'WzZ;*q0Fhл;4pw?MItЧ;3 RKKݗ9\>9S ZQ/E׫H$fOhbgn."Tnڜ 12p?: G}t4HU =SM&41PfXq &¬"1IhhW_[ٻ|QpCiNAZnNs2M_M6Ym q=N<5Pn:1=!Om^t0mX=gu&h;WM1_E IW F g{#q3ںufvQ\}ͯ5UgC''4Ep X M,KJac *AB16vƗBem& ABĩ6̜:.N[?E*a܈:_oKP|tס”s{>ǭp&G66#/m۝/egaqԉ;Fv|A@qf)v`1AYDEĹ9+ߜ Kb8~|! $6N.<BXuvЈ =3c@!jׄU1FލUpžnm& DBO4&휧sK|rlʰ=c:꺸i.q80Ghл!r;>v!+]@cԣ==΀(;QW|:kGP8<Eb';}}mus8ɾ|ZNDCZZVPRUsjXNαp.X!U%Q ~tyI{ I<~C'@U溺k0H~BvAՎ5mDs84?+ Qt:QH$fO虉]hP̎}|ur]։:,"yBA;? )b:QF|OyNbAZӅPPnxk6~8ڿ Ϩ8>jJ;}rjnX*GLҬ#h/g:,"yBA?# #;$Rң]=b!qDBA0 Ł!E,eS0H8C؈ {Y7c(Įv 8,Ј&f $G(ڮ o}o?ϧO9:lgzcB[$q4 \RL)T /̎U#yh+WRz'.MU_X<)*E7cl(6//۱:[V_(dY6|Zz{}iVqja)F2?bC}(C+2|1wcce6/|S9U"/f֒vK$zc\9[Xj/_ pSendstream endobj 558 0 obj << /Filter /FlateDecode /Length 2513 >> stream xZn s> nHv ;DJLRY5ϐgdQupZ?faD"l52z,z=!2Ff C&?ѼQ\b=A~v̮aF2 krd4<$0$n7 .=-ljd$WTH3#E/ҢH+ \LbCw "Rmd\@מB DPaAPCz$pJf#"a!SLt6FF6;DQLB\LFhρ16%a/D'a^L⽛"wBw,xW‹-oC\j"w9,6?T i?|rW!%P),ATPH8LPf$0?{9NS|g.S6Of~sA } B'Zo܏u͞2D1n@Fh@R9G"8f:P3Wh@Lh_>c))l!vS6B+3HHN7T`Q;hT'7 tG-R[|xI6[cxIA?kԪTTk-I|>ac#"2-EPs0)u$K+]qnRh >iZiv%O44$ϖAk߰]YԮ\ tl&h-^MޅE–JS6\hAޛԤ6l?f4ZY=,WW?M򐬜FZuv sC e>I#,pPa B?ٝa eO\ @n 1q4sFlNQ攍{+em u`9I2E?yͿ9rH,3Mhy2K@Xoux 248ˎTB!:4kĥIJ e ƾjr[YǾ:%y2,a9 Ō7"!̵%[A7EU9;wT%j\ضpGU7w҂`BFZCְ^sG319aϜgY3 iw옮ٖgkQ)L&y<5!V-׻#..~{I|R€:o`K&ⴆȭ@:5a@1M!d O !Ot 2V6-~^N/v>Eē['iLy d{騨R?% KLi~/҂wEtkF"1h^-$>(a:šﲱ+ a,괠{!n c%D0yEgA@z5UAŠ-k}X`h@d{/Z[ΚBq6={ҏ59膊K1M>ЌGn9aht30k*qwpk_ҫshLJ ]o5Ec^)r{&-/6+0Y-bF\;5%Y ([Da'`m :9œQ%jv#Tw6gHy;tޚK:uMyw4Bڵb-_!b5mgI~DnQn׭lA i^#6iuhuW bP)[Qu%Wz>P vT ,*w))>LynP-Y`rlcܾ'D_nқ ȱ*4`;zG͆ЈVaP3ڗ- PpdU.Ǥg{a$ gȰj+b<w+϶ֈ ICowz3*HurM6%C{i˥طh;xⲜ-.ŰbDAB )|:ʇr!vCjt4Il<[c V[k2̵Quǩ5n. ڳhĔo4rQ\]I|9̫qT8|#my+ ,(/IN Q2 |q4J}bܡ2-tM=!:`q޷n0%?I~|ܔg(ӗV{Ñkendstream endobj 559 0 obj << /Filter /FlateDecode /Length 2773 >> stream x[_oC=Pm(R(r]=Pe*DoFg,~:(jwfgv73;F$_9[~ BFw瑠aM#DXE3ՈKm?fQ\bݝ0cdIڎӈHp.XE##0Đ藺,08c݀T #nBr H`ݬG:풻t|KiW.&18ڶ!R51ؾ2o= FI"b82Y-zgJн[ P`7'' 1<|$.u+.Vru"e@6.U`vLyB2B+7 1}0Yb` ` vwŒ#? 6?"ɍ]GG#v*aO9A1&'a 7t眤U":>eYQQYf^jaȘ:bDaDF @iW"r,e|ݘ00%/Ax]@댣tAd JNNJY|qM?;631}/"ȳ?Lv#<-IO_tk`u/Zoms:)&ݶlsg&5P&sLA,]@L:B}&1{s@xZ?4G'|{OgR?+=M1 1hn?H!Q8;X <_hRPuCs D/ 34`COh͜ {L"!a>5S;ȟ Z\Ta`@\hbg%M[`1AU~L8T8]}v:/*NVew-T v~I7&,Cʭ,R\EVȺ+)5 kdeX0c8ǻauBZ0S<Ukgpsa %={9y#xM%@}[atFು*%`b ZX0?=82x bsGCIJD![&L` DBn ix hU?Xqζܵogc1WibO C75/`QJWHc -US4G7e?sH؁?r`~TA"awXbXڨ;rہFU9~&]w%PQ"(UyO7+|{\cP7śj (s{_}m$ζMg (_ E(FMёaѹ'#uuƇP F$ hADUG=RwUoҋJ5]@j==яvmiQjjHM8\#BXƫE]Z4yPo:YJ׃)1axN-eKmWȶQ r^Ah/ fBC*! CrfC I~!aNA"!df6鶇PoǍ33HׇPԐ9N8y7Yl{&sn~n(ti  x .٨nO1_6uF8BOC*B6u1RWg$)#, P>au!s?;)}b'b@;}V=cg(vNlV F=&)_9&*&C{L}`{_9+i`z{Xq}&+J`2`Z 3Qp׈>"O3V=^ȭcu_$U78XY$%|V=g <:Z}QChxX RC2 5T{ɜFn=m*P̢ЙϞY~&зM~3[y[ad{y_w8I8%tewat܉8Ebors փU{2T6$Iv;T- hp vE Qw{Iݞ+\\mdtM冂5S;WUtT~=JٯwٷlK:˽5gA&y:Wb{)ug&A,P.qg/KȊ&̴̦,tL1=tZAʵs@۴1"/+Ic-cב3B-2?h ~QX`!JmFT{}:mS МzSӦFa/r~+&`].Q g~6endstream endobj 560 0 obj << /Filter /FlateDecode /Length 2525 >> stream xZr}g#P9EJ9MZLADA5E$SFza&( ҃@rLAM0" '"dr|)4 Du"0c`"O%63Wߝh8(RƎӈ92| FSЀ֖&w1jd$jP-$B#@ ̓,˗:ce4<@x ,ڵh'D"Y0Qy=\7("FU8r Mq9Qr4Mvf?IW>,ܦen~VIy*n"3ҟnK %W~ IcHs]d(S~5'm1{>A="q>6s`9dj ō%8(4[. bdPY¡0L/42h8 Z"kp.4g2 ML~T[j!CSsmzb)%OI&P Oy/u$X|T?:+;O"'^L҇~z|,/&en.X``# +5vjfvax^[X|Z9GJُ>wʇW&ᄧ.ʾ&ps멭GS75ld(;\|PD5DlHǗtp.jU([=h?J<2zCq̞W"w'Q\9MC;bTTKO{vHvVqP.>eZ+A)M:"c9j s}P1Œ3Vv *dW캼ut# 稡.ƚ.OW,AH%ka;멍{wmm+k"ÖGQi0*SQAGUP)QJA}͵uDMxiU[B ms %(H;6qP;SfmWK+z @DI 1"w2Ex|38FEDI@,yl@ßix$\JH&:oG# 5дq߮C@BI%\yT:"\Pf-}0K?sK_`E-}4?[}8}@[B6E*P3bσ@[B*QQ-}:H<ԁT.T(H+u*7K{ȞBUk ~໔B٤SדAckX%!nfj;juIdcX,Dַ煪%dlRK~[ Ub@ف1#4t&eq&#y?tTmm\D-3"rUL!ڕ\qxRDA_?GmqYViኑe*v@ I)cRB=ƂPiJ.eV4pӏYҿ.)͐o&T*fh1vD< 0LfѶ ߍj}}m./ieize>}YM4,] f`5_Quz)U[ՄӲR)oendstream endobj 561 0 obj << /Filter /FlateDecode /Length 2237 >> stream x[[s۸~GpYP/%3m&hf3moF?(#=y%988/%,_S:^~(<3Lq\9Ft٢~fJOYw1&1L'ָ8?ADzʝ b.wܙlq \t>.cpm2G:_ *@9I <*  ^l?jJ5^Ea.5]bz*-aTUcU` BSFp*qĚtߴQ*hf>+&DPA8ty 9GX( φ:X- X9VGQ+iLD`H#Z"}~%X!HabHqE(8ِr2<uN)L^}XSBd7_3˵$JiȄokN2<$ORAUcDS !QRU.v9gɸ/8)MF0kӎr 3hb6lڋK!R6y93G^*emDp=ZP=^AEe5~H\WmoMWKޢ]OD%zI ^Gsss%rT7# [֕NsϑM~jRXoŮ2_ sEuUbQ]dK袷AX6glEO)ަ',IŋG&o^*zT!q"<q@"*"9_h2Eڋ¡ܚfY#nl9X/F•\802M[_Xqyr\5fdz,őf/&PòFgyC d<_qQ|, .,{ˇkQ^gw Kgԇ1N\U?~Qq$<֏%Z%dWզ*08&ϊOm2jcij|/nwmXg-K\sML9ޯD،ݵ\!DjƓM- f?vc 'ale S v# "䚻ePh^#%: qdj>T-'oAVV>ݟgLTe0ӽ8>o^.ǂBhbK-'aN1<NRlt1ҺӘ3Lɞ)j[b*9b >mL򭢊jFmŮcyN]E(<輺D9~s"tƓ&X"lq4 DC@t3H-~RI:o* q,̦~YQ3F^(GO$`ئ: l sbIl`/FLEd0-&A\xCcz,@^࿽TaƢ[}] +k꘵'~= ;x)<7YT4pg)̮y)&|b]ﴇ7>C+w=ݽo6[-.[۪|mC6 M=,E/ˋg&U1[g.B>12;XJ""RXt{-Z 4D9ǺPXOT"C>TrvOehx0dPXSJlC?æoa3~?K8l^}.h8Γ|5pJzecYp~`+>,OnNklN9iF-L՞'"mLlO)endstream endobj 562 0 obj << /Filter /FlateDecode /Length 2612 >> stream x[m.Gz_qSu0( ->LI,#)Vj$s*E1#V=o JiX|>z L2O/X`^^u*dMwx:2YI+gչ6ͷ'seaT4u֣u%^Ͳ;FzMy6Oms[JIWuCHK0_(PЖJAS5QT("%%ձĿMf^C-`R۫E'o"Bׇo-Ӫl#A)U! +l zꗦ!o >ҫ>Q ,L"VFio~}c4-+Ĭ@ CM ^Dİ*:Gj:WWu+s'}Ε9j|śh1s41HFTяMyD1Nl@UW>=΀sp}yU QOX0 W'_\MUXÃ4r,W48""F'q\6LƙDOQ#($~!BenM(JT&BxUwm+ܖDV] ,f$zX^ m{D^}e9mZ$A 0ȫW&0 /:ᡖ27:-gHc]@"i]ܺv%\0k[$xV$V6|nk);ԉgy7ywQ8=W,N( V[B﵅cu"/P}Z\ ;pSpx4a= # I; |"J>GJ>W|+s'}ϕ9niKY8j%[ǹ/^PĜ•8j3 WS7]N;rbž)( 8"(SP^>&  PK%{fg,Fu'{JbJVG wyˮMIl\J0ڢrz "ݵyt ZR2,!R?l]X,͔F<_$N/@ l4ߤl^GE> stream xZݎD@;I[h/\p%ZI)n]y^_ IC6^9g~ %,'x͔N'IEH0d2)fBs <br?ѫf(8YK*p,&J;Fɇ K:zqG:OSDJ D*֓oJt?NoWE_'Kf~-Y.E()|-WVֿe%Z7U9X#5u(DAY?(0{!|w¸V X w&)CĴ ֚p%|yVMgtz 6.Y]΍"0ʶdټg!`T)v=;ݽ<Ѷ9Tc YD}kyT2ւ܉e,͕اz q[Nc'\crYMY/B$̚47U7P{z,18!`(ݭEf1H*-(zK7ꓷ.ڢ׸4t2k8c[p;uְ [ӊHͼZ'@3'QTh+&`=Mpn+$o MU鶛 le>fn`Mtt*e"?ؼzf_o#:7ƏLQ06tg/G;òD؍u;:ߑJdt^o.uz5 ¡㺎{2ܾ%"^.!"tntKI#&UPS`rw9WCJ4Fj(.${n# a,ԟd'W#pRZJ! i 1@"u*~E8QRV(4``_1-gC D_UIaltڷMI'!Ɲg|ENCaZ[ϒ9_K9qTjV5\a̫%[b5{k5p%RU 4L$ wTp^l6&ј@#mL#V+p=95cuA򙃒!AyL5pnJ ?!="}/L#W(Rdd0˒.I F*d0kAT ~!t\|NL^0aa &އ#tt@!#} 㡷u " ;eK^u>Xܼ,6_:OFϑ,8ӸY  cѳSaiq/92@hIqb_AIT2MZԋFUQlhw[ȘGUmkAŒ0{~mo}!x殉I@#娶 O^),W,oj/?'Yxoa]㺽XxJ^5˻>T]^twS1`Ġ 3瀚6#GtZ ܾN:#-YFk8~UyFh1ic,QuWsiD$;DM`9NvrwfȁUƭǠ<8x.ɯ ; "9="9}(eM\3c1bn3BTahϦjh+5$2G닼 q9O3=g1>&cT>z2aj] CjtNCh”1o߷by`U^u>v*{+^953-$ \*9e|)$Q L4?mIz-.R?N endstream endobj 564 0 obj << /Filter /FlateDecode /Length 3199 >> stream xZmoQȏY5}=@^Zh$gr@K$$9-{}fK-eQg|m}y!ߎ˂KkV6H]x!Ɩ c]JYp3Ncj|aiY(q8Wpq[Y;laY/!K('aƗף5kW8) YГGdKݮ'S-tQ5yn-ilojY|Wowv`K&g׋z9ߥ ?/65[4q.wqyY\ x s-/]x97~m|fvV}{3^''ݢ cH Ϡ#ONwJcpWa񧠆).ƺZ/Rl+u|#2>}ob"`"O Wb6:lj[̚U܈% NW(VTllٶo5C&\DtKџ{oY -`F7:N+wlh>9Pk|lthK֮gQ]MlQ(li8 Ѩq8zUEb!gVWݞ.]0lS h2wũ ?9}& c|DH<W4Ē8fYOl]d!(QO$#r3Ԃ =v9}4 Uʐ 100XoԇZU lYJ'үh@p)X>YEr{/ hHs=~|C|ѷrX=~co$w҈z.moᎅmVGsІeë?ݱL>C>| ae2'M@GpDQ: yI0.M^8Oe Ce dD (hHe{XY#,u>S W]3[Tz'[p3XHTDIc3!! "Zm$EH5! E\88OіB^'Cў"xv}/͔NﱺRA}"j>(C1`_\3fokJh)\3>>ղeO))gzgGAʃf՟0z{>dCg9zS:SF-imo`SXQ 4g)M3;|,V*+-䋟gGijS 8Ӄ DhI$~)iBsq -W.vTOPiE)C[@~#btaΜ,gB -U{}{hۣw\<Kab-@U ?FBcyz 0ǾX$Se6]v}+ 6' `MnO@*IY\Eѡdnu,SX3F=AK-+Fڧ!6Տ"|Ԗ_) nr5J'r/mø 䠍Hr>>W^Z6,oG"@;|Z/s[lWHLz1R>%e-*J^O 4`nB!3BVcXAVp#+Re;B dr'pRNwEԸ4ʚk#YD;J) MNX.Ajy[e/ SLt%aQXd Q݋ g`U.вZd*ԙENlo.6, 0j )ٔodf>QB}pP{HJX_"T4"M7վy2BjNGzendstream endobj 565 0 obj << /Filter /FlateDecode /Length 2970 >> stream x[Yo_1@X ;0(r$1a:o>F$E#/`]5]WG4?6ӆr7Tv;R0iDG i4[,GN#%̒ h&(0) pA~inGGle͕kպ KmAƔj9z~nwwBRa0a貝wv#/#K㥝2n0NH=2X5+Tb)K0:d eA$ma1.ZW{$[i7G,K3*4ΰ,?~BL)-vNvv|4G?5nCnf9qn6~(9ԁ&Z,k3 }VXo@ͫ!z3=DJfje\,+я@_cd; x|/;gox|bzY/;M9"BQyJ*}@&Ж@*K f2{:)ܾFY hU9Ganp2rĉ'2aDڣ4Q|eL1bUf |W+Á3*ɲ&k[w4dd'.2 ~3Ш6hTdjuI$v=CڙuZ 4OV~a6Ȉg>% 4 YQ".;# LllbblnL[r;PH*=WT)0g$̥&ci?lmMBסHŇ%XhV)"1%xqA fk-ܭ/wv58P%ώTrwh@=z|^y"cEXލ}TDaJugD}n G Y̷ Rhp C0$| 4;$]8uWZ?cCY))pЋv1{QClBKtfY֪7o-^.g< 3U|o?cy#OZf*qug%X|rgZ?90 \freœ"2ڝ-s *7Bud/]ׄ7ܖ5a0d`]# qGo!)ztzD8JL㙤*|'9n K3ALĔug JvbuLkȯs+p5ȗ[9 zac8%Ƀ:H}v&?"d'3C\@j ΞDrLɛ9j"2Dr_t VB( puO( ԍU D ˜)ݺ3F `%2C[!, Hk*uRC;}bOܙ >;*.p*+(JD/MB[:N!^:G]+CgHО> r_ d dYeT1K :@EXjL(n yi9%gk9_* n5T`fg_zY@3Dʓ@#ȧ  >ם}I CǂBGvQ!wY,!M`YE7r%><ռ18p})kr&ױ"Rx|zXS]ψ{ngtN@M8q躱1*%Buڱ6X  47Ml^ 4( -&m6Ǒd T 3]ٴ?x < `&nڧa%Uݭ XxK ,J_G|ٵ']RFXNm>9*JD' lO9LTcJQG9DT{'ONkyr2_$X$5He:.5 CviY2K/ %\%P"-d5 \҇ވ/Kº _P^rܺ]s.+j`XX$\ع>~Ds99'wA6>ޟ*}P8^߭WUYES`KO+zS9W9,{ Lv̮`t 5)uofmN5sR$;W,NFuI.}X34KwGـ!]6R|=/{J0Bo;oӻ1]9@^K.)v;P"^o/\(~AWY6+Gɓ+c-7 *L(ޚ2?Y endstream endobj 566 0 obj << /Filter /FlateDecode /Length 2624 >> stream xZms۸ɏФ9@i鵹g!DۺӋCuK`Jv,i:owx=jrS\|J$ DƜ&T u2ɳ'ۋ3.&7Oqq}]%1N&D);N*01>@E"'|c%.hIg|}1-'5HM4gz0N6_Lg4kMVM6I&Ihwm<âdWYC%Qy_U&ﳼmjaU6(F*[/ '\EEVN=Ep 7D(dQ_-S<(Vۛ%bh.rۦ;4d۲p_gY`an>(]wnrgrEzݑޡgMY=S݉M+\E/즚56lqY2T{gJ罉P{Қ$^N yF98JJiykDXULc4ğspP~A;}9 ibem6c S<>#< ipL}q,dJƱUD@HS8+jH7Yk޴|pV!MBt̪๿[evBD, eG`ir$G-@9 4 f\Qu- $蹒GHKo2a(l:ؑž9 ~@QNL +9IAڅ4hF HaL,[GM yVR2OH(0"+iAjT( LjCQǪhi}yiK+c- ]MM!Q/֎P^IWmnY86I/=!r|F ~p&Rd6VXeMEgثW׉`f6Ne@~j . ow,':(P9th R9z}$SQ+tIjP'&~o<_9Fry3B!AH*]~Z@~δ!rk]-o304T1nI 4+mJڹF T*f'l X %e_|bJ_UZm~uBP|:6s2L8+6P*!zҟOiMK:>Wl[ i^[(o4M^ k03sx}X:JU+zO03{,ěQ 8Kf挨K|UgFpP%! `ޱaa gQǒM |D 3Pf֓>X 4 ECCHh{N/It>o vt(>˪jx@Z=>cM&0-{[zWTX.*m6_EbZjeѢ7Z>/s~DDΑo)Mk7[ 2t:|Mӗ;Fz@zCoƱ谋κb !}ԙDQ`Wj-+Hn*-Z ˲uq/5Vwi@km~Ϝٛ_ C&Hw{s~sZSj_U#|b#E> stream xYnF(#L. j^% A'0y%VZ$LW{9UiQR~H]."F1eQL辘)]LCu, `)0Z;s%C̽32>Cy`mg#jR`X9X>n PԤV~yѠ=P@ q{؂]uQQ_jA !&UT~yLQ)_؝Ux>^r9*Qֆ'ba|:/ZkW0x+/g>dO|# ^Өz?{޴z.lS<#x㶶Y ϲJR|E2^xv"X?ŽZT{<e EP/)WCڧt|5K2~}c}U7)}̳2/2xoZ9<Ј| ]CZ,c%s/!\`q {{MK&( ^>kq:b9xT| oh2/;1;E$:n3e|IQ1Qw lZ{\=`-lT`{LV@)WIܞ5)ys@uSml#ɶvG!]iwH3ܭ^˞MP {prz-~0㔟Z)ظS #Ѱguh ׆V l%m_X3y4In}YA>*N# 6/P I!pk\sfѴKY1zԘɫg\ȒʁT?srNT ,=K̇_ l'N#kZbXq/[>q`z~y112|;yPyLoî)%kV9m~(3G}Zbw#&nho_p0!{Lj}^]{`Z{7=p67>Y%3cXx%w0p 8) /M_ >|hmoaBɮ6W싴]§IKޚ5w<53j< )eX|ǞZh>bGX/ sM|K|}8|1ܣcPǾ\휹}Zs5䫹D%H޾Jvd՗`M ڜ$9endstream endobj 568 0 obj << /Filter /FlateDecode /Length 2096 >> stream xZnF(#4@( ЗI"rqڇ$ʔKF.Iq)H_3C}K(a /zm8#PBnʒ?|B3RS(3c1&;|2*1ԥgNE(BkF J {%y{Jr-5%yiE&y~y5D0c;I{0);\iIvktStc>E8p [W*qNLe&`ero˽,x# 2>(>Yot8,r_CebwTsɗ0¤b9#;w P RjȾZ `hNkw:Aэ,|,+-j-'.݄ βj~s+} Z$d>9Kݝ-#p\UhX?iJHEa)3BHEy n8FJ(x*;*{jXfeЀ7wP"4L#Tqk= y@R/&n6??ëWmy%1 g4cq(9&z\cAW'\e\,k#wkCN(V8ȋf:A h"%Xa{&bp.&F1?وkˀbҳWxQTJ^W`Vp|]8d *HbUv:͚V1 NA{@y:g쁒]b40)`DrZ9-X6+[~͸UQOtDqvR皋mc^h P3 8M82{̏'ApY@2}O+邢*ՂTHAj"Zh]Oyd>9 G 59%9Or]MD偛4tE,7l(ʕס%롡3*J4 Be>Dakq1:O|b[bOĿ GC4n&\5n tk\u (M~iq 2T:4BƔx ȕ"2c^D5l̅5qWc튦H<855OeԂk[dp{ rF)@^) 'Jk^>H3RC=.F,IHcK=߮K3Y]rcӷ՜k.b{F?+:HTqT- n^HO ˦vަz5u馥.X儡뢶 ~Npl5,36,Xr$P_f"\6l I_N%0`HWS?"'b &$:U֥7˿9l-ŀֻ7f|{VuY<DbڃnP 22ڞ> stream x[mo.G*b/iˡI} ^jdJIo %eږV-Z-93y8>)acji8#aZNJ A3c n.?#J\zfP4D9l'1P'kɒ8 ~F %Fl]ݍqƎ8b6 fc%Pc9QT/F_Mϓ3wfşF/XUPJjAoH VӘ6ݦC,XsϨbᆹTOfYy[ղO,#`lG iIĽ]-ˋ将s׬3 .Sy3\rȧH4bMi,%c3|ViuX吅3L^5*"!Ub8$֡M0T/YF^BAW91у=vC(Ⱥ(#܋>jɈfIE\\1X+ 㒧||4^`G~=հE0b{ ;x*4 Di 8S'O.P BDәo$p7R.k|Nu\*M lq5]⃁^\ᳳ0Ȫb]x.7y77u?`j=و)V(ں~8uwS/:F,#Z[a˂VpKHì:;+)cpUpe!hz8 L)U*0Sqad!ILdY{T@fP}j;0J䃽Yn%_6`=&rؙ0O'~ZB"RB"Pss%5+3 K P}Ĥ΢!Ĥ[ \#`E{>i!]pbUHTމp>0}@"t4+~jO/S'a/! ,1Y< !4R^2V#C霿Tf[r~vx+{OuGXؖdVk:d_/E![ *SuE`_\dĂL"Cd*yÊuy.r)/ۮ%100zݕ3 Kǹ6a\-L0AQUqL*6p;GbχĭD}|u/;nM4$"kW;cΨ!( *!ģu>3j[ӫ6Hm `E2hd^/wt f2毸r̚[VB/E73_%˾`mL[ݗ멿0,wtiT;&']l-Abھ|'Ad1[;WbϰC~}9_>^ܼ%i*_Ɨx y@ڋe08H9{.2bb*`X ƻ(U3YW"^B5,'W;@^.]8q,M  o$L> ;*ިoΚmO{/p.=6ѐcONpQDczDi DX_<4c@!4m)/:Qm )QX`khj%-S ԰.X3? dCendstream endobj 570 0 obj << /Filter /FlateDecode /Length 2897 >> stream xZ[(GNjs:C8%[@ JԮJ\Tj+ZjWV}Xq4s;.1r/6WD쪝HX$ϾsHgPf•ҸRO^] +) f).0Myv5y7![ls{oI, j"Ks9U"o&oP[7tqNѲjMnӟO~0,LTN\H؉Q1d~%LLbFS(MǤbLd sEBq%g" 0F(tӬ]1,HFlB{}F9. Iж3*B!Qׄ/5+T.Hu]}5;Q?:Ph,lsK̍Ԭ-П?*F7Ʊ Dr7- ч)s3 },jە}s<3B5Rd3X ѲaU=`сS-@GTfGuٶ3ghms S 5ҭkTWUjl*.*F`4 ae4Hs/N@VkV ׶T $$Ƨվ?@\R $л}YTK!8ݵ+6>ǂ.0;h*\^\A#D%DE4S4X +AYs(ůgj(Q9%4l(~=gWcDE 4տ_Kbj qE/'Sm ab>"ꪷXprrP`:iAC&+7I$vN,S2 uTAnBm0LjLrk{^!7\n"$d\GDCL!2#/]m! ď{LV0rM`a4%k",Bq>kK|gEfsLq0&ʹׅgә4Y @T ܃^/@2) ޢrUm{4:x;SP ˩@99MӼ:Pvyޫ\J12(>+_@6M x}I.88 5P#WH($'+~_qGgY|<Mb{eATbG3'$uA#Г[stn}\;}~a&dA , 6 ,Sf*kXarw~=SBogmrNM]79iT!r7'{J]D M*Mna YT[xx!)Đ;w*34טCCB'yW:%I ]M鳢6I\]{b~i :(M`={[qSo:,pDzK遊尋)Si(&7XD9>ds}uUeeq{S-Bb[Q(6>&8#ejܣ JaPu+]mTs $7:!gF_+ؑvW@AOBKeoS76=@`Ԑ)O`tc\P ^Q׼vՙ};Fρ[O[ oQ;hwK+E[ͷ*=׭⨦h%ݨ(%Ij%#AA` =:As 8pnsÓ`'z@&$ cԏǜ;T1?qa=4""iOcOE+r?dC:':^M$A,fCk W)"mU694w8q@+f+TEd7@m\LпKIBMM$UhoUE([ò_GHT98<8:<д'$o%̉فu1 '3' 'pI#;nxmc ]3 ZB=|ZFLu-ˢ>b^80Æߢ$y@\uh@HmխH1(m6`vjFyPcɉ5?v<;w6(dP\SG̭ P>5EO>܆3)3:f?0stNi| WRV<3ehlpSi^?7nJ`u=?o_mٞPFUis?EɄduo.8ã wջzg"dp6qI$tJK_Öy?0,Ur//}1@}Hs1`ܢƕŨ#*2KhǗ>&BzS^F?~ozz۱!<.m:"ۦt^)uO=vRƍͯ⨫{]m_%C^ЕnI#Bq !By$e4}$Cѿ٠Fj!@djASBrwL{_"sv+|W&1V@0bKPr;`Zp *n]^wk4=?L kendstream endobj 571 0 obj << /Filter /FlateDecode /Length 1716 >> stream xXIoF [ "ξ FnIXhvHV*2I%1".""y2 wT,\$(i$Sh0!&]&X 0.-8+/,-/ +K7*^t?+ji R}2ah!gr0hF2FP|5+^.&P:Wb$W)(S %e4ǭ Z-:O[%`|Rڪ|*Ô@;䭺Gtoҹ/Re,+g&ጆԛ *ROym~ziTC7W`ÔO 7XMalo 瓪c+ceuTo:iF^ٿ (#a uN}e\TTYXsGr.EE/ޯ?`N(f CwX9fBoP]b? հʻ Głܝ}aj$r?ۈ/ ΛlcCVzvʡ!KU ,4m/%a56\#k kBw֒)B9j,fdM~8 ?*8O/*^YM-&I5vu 6`;J?GPFŞ: (pW4u{ij_ݷ!‰ /&iz=ݷ=`-A$ɞ.Lꆦk\\4 -l,(L |4V`O&nq>±h-+hmOz=(v&%E')l ^UΠq"(_gh3-)Eg+14|y4+> stream xXnF} "7Q)B" ZZL(R!)'Aotwʤ|Ab?л9s9CqsrJ]fO(&ySI{hR ƅwy䵃KӘ 'ckd`BIeP(os`4R NM~"zz6޳dil|{I b+-6$ 6{mB)D)x5Y{D;;;$?; Cq7>mu$mmZhILXȷ&No/0i_ VfyF"k2bu+ H@4fYpim]xNAY|_6Z`[fI:,>//8I>ُWSy/`fpe櫫<ͯu: ._6u.냙.߇06ݒupGUKFqk:rzPM(Ȳ^AoII6v;aMЌ&}İ0013cEhq5 2Y6FP NpcH_ *%f<`^B0J Tu\WP(h|3*An3v0i$Q" s@$΃0ΪZ{[6[ b[\V8 v(!JvQXPSF(u T|QN35kN ' 'N|130Q2aM03t 3Kǧѩ Kw%U!nPߡFcMiC(LXaዾ/aTUEm='wh=OtdzgKFCWkyN9*HF'ȍbU)Lf6J 騵wBhna Z: v]/ IPj4ו(|U  *Z%̲d[a~zS!*$^yPR:"xKQTWgAЦܘr$-W mlW"TV)U3֮GECE b.@ rYȪ- &sa]/{^s)&~ RpK+2RQӃ+̥A LY~27½ʗ u+szGU|%5Ck '\oKlk\x1.ΜA_f3V0,upFjd3pb+_vU3sWx;% [kv <K kNfןN6Knt)דBendstream endobj 573 0 obj << /Filter /FlateDecode /Length 2331 >> stream xYnC2 -˹qf:AHm2`jwVb%$W1}qWj%g΍d)N2]y\w,#TRXpG.9g"i؞L.veODBd]888^ v$=_2R$CW/:=j"KPD_rApBW^f6 +8s!9/x#; պpP8$H%vsxbnݖiGX ԧ@ !}_VNWuc3Ո^1SYd!<.,s)2*ouXwq13 )VE.B:t]4if뷃b;&)|z`A1OtKgai8J;R*UnBO7w'hӀY`GDPs_7+CêBok.kIdztF,vJ:b "껲mM\Q]PrSVm )5T{.w&{IbCKDe=8u; \VÓ-.%NZ] skJJx'"3)e5)@,/_|ٴeY\ϥbce0"j 7cΗ8b PAu#`- .7`Ӟℌ&k؟*ar+6/8"YJS3}i|>~ D689ww08TSc^wKY!`ga+ivP,Ako˺:ܺ&Q}5.Pn.,Gyw2|v,ͲY˜QLAq ?B\ጙY bPlR5_ET%l~="i-z7HֱanN}s+4wU9,/|T1Q2A (Xr8^WUG r?'OHG<5ŧJ`*/Aendstream endobj 574 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1299 >> stream xmTmLSW>{]Wg&l(8&EV"E!YE'(ߨpFfԠf%lcNy9 E.Zl%!ma٤e-{qܲm"?g3%;qkD: D$uC2.0'9:2 FSAeWw-z]^Zi-K;rzkG-:N'mVњuln,huVX.&/^mfy kkLJ;,V[Ml[@*H@ Z&0E rCB84V#ʢ. r/h$Ns|O.QenY%X6q aHl6*݄Ve䚽jD ‚'uH.s|TWc3}h_O.bހz7깠l(#45)!&!?8ٗ?#}UFE4*AshH[~8Efs:@#Z<2{ }tO§=Q0ř|-y)*tHx]7 ycKM_\P.A v7!;{y%*.v‹^_r2G[yoQ{8l#bU<\_"5\| &jh _I4NlUvZ aPQ@~%u gEXEP&d؟~ɉHSw+DdbݍX xi0c׺<S>wkƅk^~Gӡaq:|? ;4{`|n-{RhQ1o.__Kendstream endobj 575 0 obj << /Filter /FlateDecode /Length 1164 >> stream xWnF+hTO{vc+[hq4vJMQhC"e˖-Hw}̽pn@X$&W&R(&(&`@ 'I1̑{]K Vꅙ LSWRg7t~ga$7,"e0!G}L[Eukҿ9#BJ$l;P\Q" cDY`M][i bGSų得&`ϓIfu&(E8L6[i=R?IF (Z3퓼_{swusOtV_] Vu;lw4HS+Ea+m+HS+|ojC>'8{a#u {<~5rj  §Ir۽A\i_ʮ|р7$-ό+gݷ66rrnÉ( ^F*VPt߂> stream xV]o0}ϯK2 7JJ{hcJ!4M Pք6U]@ @(aڤs9חL>0κY`<4f11!0,`Y>fBML(FM@J0"`6NwC`3p=Z؄RhajqMd% `JʴcKOr [i˃$,3cɝQEQG&`OHum H|>{8K4_B3Լ[ f/s0h"E'?\#]L1Tbdru<Y@(MDl6pjD}".Hr2TDLo^\~׽mtwe Uٙ<ORUC'A5io=H?𕤋ȟԓ;^}+?R{U/~.Rn531OEPTΠ:t{;KKPvsiWXGTyDͥ>-jۓuY}ٝ}I۾mVlSon'G F"Lpk[nicG'nx>4n]_67Lv~{%8r?\::Nqh:Ma `LS z B¥M2v;rgM8ĂĖ3swi: I9&wt Qw2Lti a d|&UؖLnGY(Ӽ$e-'Ffv"HBƵK8s=1TMœ #/? 64ϲqE!|іendstream endobj 577 0 obj << /Filter /FlateDecode /Length 3724 >> stream x[mo7ȏpL/m׻6>8E׶ZYR$iq׿r͐\+Y7?XZC<ÙQMƿrs%jt>yw"$*G_>Z'5Zڎqry͉خ&Ja;Cvp% b <}C(hbCxC0w')7 &7@Af]xHb83#ݜTb5mfv^g?8CZ 㪦5|vHrMŀdCPf (TfkP>HfG$`V ool~_o&& `1 鯫(292fPIdkEH{ d8q$w@RSgOSZ hlsT2IUt_``9b(aSI]F,@&5u;&0$ּ (nı(L[*ܴAu*Lp;" m8Q q&j7OZVm .d5]b hu>o5^/i{ܗ*iFis=]_(E7Ҷڐܕ f~L=#<f棅| =2Qoy!u \ g;[A +DfRj4p*'.Q: eqقN\΃d0%}񱚇YZ}bޞHTi+X~)xfvۮS1E1k&%:2 "W[s:2e453 #b6Yo[Ob>YaBd֬!a M\I3I8`VK8vj|a@ƴzo%)MMT/I|&:IiG6WrvҌ^ l5_Ьn20ufuڀ`bq5k?_R d~>̲e?Ye4,^>4rUgc y;kn%`7ЊS`p*2AAsHK0=o["(ƍ@Jsw܏8RsQaaC_۰\>tSI B ,95]99bd R(D`Mߤ'u* `EPOCD^/Hfbӣ6ũ'i*Q+9:*<)@̵b>8G.4+)5K sr1oό!8Ѹ oJ0kU͛YR[t?sbR vsUQqX>կcp%Ä(N´y;!Hj ͜0LfQ%HAX 3, t!Bd2u͛- Z趞,g~{dh, MS]De2CEeYj0Zv Or@(rR͎dZHjX sy;e۰;l6 ~Y3Y1 Zq,$uO +$[&F*(,qӮU0uj;#H7/Z ,Ҿ0ytܗR#m6@@860ǬM>H*olhY\֩.rޫEU]PŶ %Γ 6b/5-\d(ေn 2agzbJLP'XmJ6<%cҕz(7^n'޸P7McJ NQ&dJ#+V"W:<)[Whi<ιXe5\7fyq:,x>V!2lK-P O#l=AςSӵXvJJDbYwTn5 NS"<,^mVUVo4 Uyun} !O)!.fEed ؊{Q)Y">:߇D;C8H&W;Wg<?XEH.1 lc!Ӓk8"d `{ HD'CW/:)Hqsk˚F^ #:ۨjh%C Ä%r:kͨ*0Ȧ1=rdsEDIP4p+!k?}0GKt<349;f@i0̵4cr20qHL1εkXޓq xm P%pbjrPC/97ovFTs? i@\ݠsrSEhaŷWgcY֬[mC^,,wLu[? "4"$ۛ`9 |x&w&b˅Zi;FWڵؗx@p0neTπm܁xVAÊZӀedvȒнխM Q,{‹V3C4'AAH !|a$u/,{a_ʨĺrQwĢi\ 8k޶{(dR5[-ez]-\鮙}u)DcD[f^!ۆ__26;#"r0Q.(4`@zO )}XFͱdZ"~d%{ ?ـ!*4Kn{L(I<+Au;J|l2lp(Ӏ!9.(AفmN;w{8\AN]77es;ۼI M@|(@JITQ3<,a&Ld+Д "[~QxF2ϳQyV. ѝ.'7ҘXJtUX2xv/x]6)1Y pCr =WtQIcۓ@vz%W\LE 0`gcxdRu  'vSݓca [Kv#5ىW4x`tW=TKs*QX!E.t*|rg/߭xX|tݪMziw ^u5՟Lr۫V8VyL{Y=d϶ze*1G}gjw. ݹ4gW_m3a,* U!]{}z{r]ObDwjWr1DN_ӑ;ת"EרTnbH𷓳?;)bD]1~Z{a.\/-:$[nH+^D7 ,}<$9k|/2umng?v-ϛ^[b+amZchn_'hDi<ojؒu{f6m۾d ȈVݝ$zKR< o0RN cn#p- X|`eqݝϺlϞMQU3'yjs;ِٲV/|k}u{y _LE;W7 nͦ/`/Zjȯ#K~:,~ 4x4Oxmendstream endobj 578 0 obj << /Filter /FlateDecode /Length 2311 >> stream xZmoȏ8z,ȇNjLB6 [0+;%Qw&Ya/;)?&7ɋ.]NFA K$B%sLF7t2.#Vu3P ߥŶ׋֛|E^_UM˨"4e4788lajq-ҪwwÝZ*CD M(2n@0LU֪drPۯ?Xjk`;z2Q C]zm6y6`8pF,]gu6-%J7aTi _ϑv֡=-j0}9=^?^Nx,jѸan*xxnj@q07it)8qH@/tt8RwCKMhfbMGSۛΧdg>+-9prSH4@yxCXӼ5ӚX*aF]6֦cx__ϪG/{Ho|eFny_mg"[N6Zԙаg;|q@5|2m2iء(+8\+=y_.0W8b,w3>LR02QԷyBh91bcxR#ͧ@_iG.UYAɴ_w Yp)}t4TޟMAB㭄q R?/Z 5l*:dE'1`QKA oQ~0GcғQ2Ǔ">΁UC&BTS߱i (1OE*)Z{}ǂF㱨̥Ԭ>ܸ%dyt4^6ߣP6ǬBݳj|=U_._Tvu|X,//_}8÷tI`f2~?xD䝃TpZ,{CC;rQus8z¨l^Lztɢ!!g8hO咜uqɮv ʞ7})0mנGFh ec;  BȧJWdp#=T%"ZE<,nnY x.`wXLv)FCν-P!dQ[0p0N N~N%d@k$=q3Kc~ Q?ҷ>{bET>0c[rud $԰PqܝO)GƆw$7X=&'1$%,3DIǑ{ʑo#-3WwQ-}eW.ǷWiTZ 3%fi˨DxY|׳LUjt 5-JP״^GUzA~^k_z]mP梷kѳpETՓtaEf~n0NVw@+6〨C:NX‹S C9Ď2Mnϔ$|R{_(7H[:W"3E D W~(2ˈaw RPq@ÓIgVVFC}.Ol \&=)/rj<)h~K1.b} .bKG#˪+﹫>jz%ZX~0ǵWC)YT;5uI*Ƌ*?4w+o0z},q* ֑!ҞFGa \XCTB`+Beh q8XeeBeSu;Ac{;PݵeGg d34Gz[678Efy+'MB-p~\?NՐFKYQdgUڤ/%749^7x5\?zuN4[~sCIى/=bB?jԵnḫ:j~.a\jպ9JAchZBa0 bpo#endstream endobj 579 0 obj << /Filter /FlateDecode /Length 1809 >> stream xZ[o6~7#l@ila=C;`CxC[$n;m7vM)b$<|DK(O^g7\j=2RZQ*QLNTXdig1%W;]^¯cTkR.qBo,K,otqɯ@8׌c(pL]aH;^fO]QA'QY(KL[-bX^}ȿޥɧыĭUֹ0kXG|-7UW˭}j9S`:B3|Tw)xcr%m>mf `)%\)q%DK()Dm >,[3Y֎`HΐBQD))T^9NPl~ۃJiѪrњή>TUe:|#:ĹM{cFB>"rlpt<6ߑn*aQPItG l`*?x"&-F֦}YNJ&st cm1Fp2F`,^C:GIzX~9M՜nqLTi Eɢ(A5,Vkbq"A2ҹa|@4ϖ2:L񢺲,.׋zMz3|b.+l"]$;Xu@Cl np*]sBr+p\[dj*{;Ŧ;ǑR8 +fva2R6{E5Sab^"@9=\HtB1ߟ -_?~BHl0 :$FؿN)jʤ1dRhD2) dR#P^h$Ty!zUE 1f15beŽ#{(>Ftr2~L3wgLaxAԒgY;B>YeSqv3ywW!dd U?..T;$c={-1 !=JHm#z|J\@#?ih99°&nAgM` |Vә0NtG:/Ufp@$GdNqB{'8OqBO?lQN4Fԍ`tт;nzufpl\DٔFq8> gmK PIls X rN%!~EWN0Mu,kmIҩ|@:|a||G)8(aQ&ThnAkOꃨ.,t2zOu}~S]A/Y\'qB5Vs{::< HDB>itBå1#w..1 zt :`Jp(C {Fmjբ $%VI4/UF 22:q=oUG]Y87bJEu;+0;w{zG_8_UT2ZFVTaU|ANfH 4n.є+ cc3LfPiYϪr>7E$uhX{˩<:?ϲę9KKleO,n:g6UӛW*_= zS$VFaӛc ܧyP3!/Hh(A'2VTx=nW kX|z?Uendstream endobj 580 0 obj << /Filter /FlateDecode /Length 1969 >> stream xZnF "by? -hl]E@GVj>$i י{;QSp7k>L>M9Yn U"LJMĭ(MߢՄQ*=@br3yTsG$2q')Ҭwx7LXpKgӄEwѫNGz#L4QH+*udhv7yGqԓw2&>ir>+(2pss*!dH4:A o4v@KW(:δ)ig̗10@ɦ>+G]>S. ϰUnIKjE҇) yMuSn5]YCl=-Jwejc|У}tcM 깕Aљ@p&3a).͡C4cqIf0PkYZ| K9pTP^W|U%qdA2G@^4Y߄ 9UWr^`Yg*^ 8$M>mi2/yg:-5p8KWS+ +-ُbQ#{0PPkU!y8mC`^`9d,2w:]L W*͕ 7s >&&,JBEVVq uk"MR<D% 7-d?Ї,]n6R9^4]چɇxU.v mߧ$~}4(" ?nr+OlazTK=)# `~%)z6n&Kb(ۦ/G> "n 4xčQ;0FtxSbՊiAnV(}!ۣ}!CV-fx`0VD ]C򠎻ĉj US\U3yڪ[9M4z@YfgV'/ Û[ ]=PFoh&?֡O%?fF%cУ~,5.FSË7߽:/?^bS(fˋ6StKaV9 110|y1fS>`6[z*5s+r"^s:ĺ3`t/1CxSU ӡWy[2ek= ( t 6,"լY>Â.,u2LlОʇV.ynchPe&u^]>Wa,nv#YqQ`XZRopf&5N];SqDOo]Cn "%^ٽwc 8TzMXHpoVnQ^ ]#O}5Ue}2ooYD+yjKcL hr^|Bj[pl2I( |Ƭf}YMݩڲ+rfw&B2s%Zٮn^h?7}Lq^>c~Ơ3vFgg o3:M@4:C=&N`GP|W{bKS-M=c4`oixx h喁a醶4=r7pH=252!)(4z8cb4HRQ ~n=M]ߩO49 UmM]sG_i\> ͌0a]Mqԣ;{4پ|/HS~I(#C)ԋΤ¯> stream xZnF}DZ P6{)Їp E*bїDj,I4ɐibsfvv쮾D߫[*NL@G "YF&VJ覃z&D 78Cq,5 C,~]5L mp˭67˦W37u#K*]O 1HsNhv?ﶗn/O5#s5Ȍ}n$f^0 RT "pS72L#/Eg~Yʅ"#e(~:2P+kHWC-|DD%]Qm}B)_'9 =z٢# J.4a4J^F-x&4 SLbn1p̈mMSR8 XQ]iɠRb\ $F#i( n 2Ic-+@ ∉@ԙg||{Hez9\.Iz^G 'Jlr3@ L c"E<7yWD"Y6I۬40xϳ,wJ ?EtWYɀ-Ll%m'a, f[Өv}Ï|QG(!zlJ‡ ڬ=CRZKB-*} }U[ HP#g\2"ػ*-8LY׽ÞpEBb걸‡&]>\1X9Wp,ZVcdB*,+s<=\8~>ZN`IhAYV n\Uȥdܷ IJx}]'ݜj ,jj-F#_,Y֠/WTf^tVQUC}W l33\:5 5,VkfpjéWh LveuރcZLP"sI-lQ)%dack?8yzHW\]ǁuQ =Yވ/i- Өavq v@l:=dG>'4"~ج?%W)YonNWٝ*şߞolD&%SvX$ˏٯMvI&; Jn "L݋#uNX8>/Jt96qZf?>&endstream endobj 582 0 obj << /Filter /FlateDecode /Length 3554 >> stream x[nG(GYnپ_ Keo ZRLRv[7TLO75(~9ꮮs.=#Vϋ??ڌW'oO5sbd=LʚwΎ3!z'W'ߑhj1Nj0$ɪOc GG g ?.nFcs鑯ft~uwG Y󛓗ǧ)eXNo׋T mu1Y5߾Y̛_oۇz?]ipYVջY<9^3tH+4ljV]qs/jmz|F2r|'.=%uIO2]Ҿ4m;RR;҈*`ܮI9(j'"nI Jw'w|<|2HR3:SɅlߡ|hy\/l^1OTn⎳hDN'ǰNUfd '\U@Kjx,BRdA(КOn!aO&YMongx8WCS*QonSҦ}$ sO ej2$C)@e~f#qEc% hwIyxri-vҾrr\qJ or[lm,0najgf\gtJ߿iMgh˞C\.BH7vPfdd@Cs܌΀R0#SCB& \סȠgM+T^]E>k{2ͪ3VU2yXS4U ;r/30 CvFOIl0=5*98Z5V V%r'8UI;pP(PYRrHCc_ժeAVlk idڥj-;m NI:H#iC$k U=}2w*-6_ [bduP&r_Vf}GsZr$7tg|\GD_ 'B<7d2,ѾΧ zpt^Y;>-QszRd505p䀷 n12m8놬z dMܵ/e]3l)I3N=$-`ךP\6= @mW.t8N,^SώzCd(<ȗ6>6I6v3 aTQ-{uaROЫI?cv4?7mf8Pf6U~AP2 d̹ѫ%-'j;Yv-(wGT>vúEJg}_T֦&Po ~xBՇa:<@-Yg^Gax{L'f}PrQa<4OMvRpłOJ[d)/Yu? 5r.o3I( p&[K !sIZ*f Pm?v=CTXLW't:Uώ(^'t  B_e4G0ph^ZԂBhzry+z{(E#-/W(m(J Jߩll"Aʢe3Y4 ˞d X(>&oJ*]׋$Lu1EA޵hSsVw)M)2/ſ~E(i8]>z8<< f܁(FoF#XoQ |ޱ‡ WgȂɚ㫓?m,i0F~cӿ}u\`TFQC|Qtp (0"|'}u׬,n˱z>w."=]e_ۼW/֋K+ o85hmyY= ݥo^}? nۀA5,ټ^ޅ?4 k\[_O{ق 6hHݗ_C@+7ߝ35endstream endobj 583 0 obj << /Filter /FlateDecode /Length 2129 >> stream xZYop袚̾$KPwM4E>-PT"nC%Kns9wL#;*U4> 2if2sLǜ2%qKl-a\D$7jwf=7H2l1f P]sV{)ŠI.a@}Qo^ (ilfM Lx5DpI1Ñ$F66p&[<Rpt;I&4N[m Zf6idTy gt bF ydP&㌕6F(Y>27_狏񶸕(nfnRiX mn\ޭJ@/y)ŲN Tؠ: ״,,j4nj ;+Yp!eVGI_=0mE=l\FVBIgBkuWRxF!ZJZ3,FAÒF.$fe(BC,\JhSY3 !0N Uݬ1@ JPհuY@r0ge*=L nDcaʅ!n^1SX5?;_ Glsܐi蓟3@^Jpj0WCa^yë|E!ye߿y}QY )b7~jd;,\ٌ$4kψ}&ݼ/!ѿXZ{Kie_9Wjoi1 v`wStͼ柋7U|YeYd~e!U^R&v; ֠77Q@SVn$/Jg d f)=m1UPV@+8%m.͹Pf%s]r~s_$2{̗1K6zw/ddq|E4aYTfgDV@uCJH[1\[0;b{9uT2Mik%rѐ;s^vO3 A1^uK84xw:Y7]g m`tD5j"Gd7E|gIHrĵtK4B.HIHU#P .0_ÙnbʪEu^]quLc$4CQ|eH9m T^:T4hF9:/ #:e[ԩ6ERq ߵGwRj&У7wKklomN@I-ј(X:&^rzL<(P)0V{q .nRts0 &ˆ>Ydn|X{Pvւ)=\*[Jiu vJ4Ё@1},vk?Fa,pV{-Vu@lu kT! F+v#ed(6BC>I0,PfQ 6A-VԆ *v ?Bg.2A}r 9{2dҌ@,ߨVi6$=iJQN~c#6K˛FPr{fIPʱaqg}_Tp+FCӚ{18D6MϞ>&1Sdpgptl~)$w鐹Y >/З{昀+j]fzH4_FpG%76gtfADendstream endobj 584 0 obj << /Filter /FlateDecode /Length 1945 >> stream xZ[oE~Dj_AHDi }hrMb/J_Ş={c!^˜9ΌόQW|k]9Y>LJM=^lgob0]!1Tsc\0arazU;| -L+H8Çg#8/1 U^}lyMz;M lJK RtBȿGR!ᨒ8C;9g C}8gZhʸ$u ;-0Ir?0n$YeFC#[F,/~6]L߆oE])N!5؈5aw5WYx2RPLcʈ#xLȮ;M9V:{)ۖHM{ߓ݈Pbu$%6r9@Ik\Sg_ i.[<<`Dv.5Rl8wF( o`P8A.b4)& ]G,QDW9"@V) ʴD6(œFQThkxW;& hO.GExR{I.ʙIX<7o4YL7l\dQJl-geEUYr Q|6p[g?0T/upH0K2QBͲ9uX80}G| yq cm70$8Z* FEaA| $!WԨ^{ϚLwbT,$O6lDg9\kHKS 5@wX8_J^/aOxY4Bh]lQ`F#uݻ}%:urKKldP"C¸}1NId)[ rWyIƑ)OK#Ouu J?<6x'w' ڟңaM {-Gjͨrd]i"@zCСwLmw BG߂d8Y]-GՍ 6qr3ɜ1ٵxlmڧkqzaݳ _7,\5}jYٵ݌z}~9,orROzͱ.w:Id_㴅ީ$>!GƑSnOƑ"13oi|O"gC>4.f᧤Գ?cW lGNx$-ѮWԋCyC}b-꿓GJhhB9%awRY1-wb@K~@-b'Գ+#kInN\<9Xd̡֡wͲį^~{:yCx}-./˦-d쁃>ᩳ^g#;zglp}*}Ǖr H>ća4}<vc%"}өSyMmY|-ki>j!Fqa=xߡ/q~qgme: 2M478NQ#,6x,w, q-;Z : h;$$:;Wq~{Qd/W8g3ܵ Y(Q"4[7YL?v$T *xM_+,냨pulT䟦|Vs De~1[fuG>5zbu٪c55:l-"Z ~V?Vtendstream endobj 585 0 obj << /Filter /FlateDecode /Length 3285 >> stream x[n[7ч +f/mfm#)ZYjq$9Myyy]HYRdY*ZC; g_w4={R[,ޞkXpZeaRLB8Ţ*]8 K=V]PVL+XP4t!b<薲fcwlL}ȿyNޞ`Eg4-7E`J[\\Sx􅓒σs5&ipnaR ~'ɚ± "Ri.ΥcZ_\\dB0!sθPm5/|7W'x)jz)oWS}cqxbGӶ IVn=5-yWQ/ھ҅e0b8Z-9 ǁtHUj9ZVi7UBjI߃CC,r>/.nl P+Ϯ}/Z`Ye Fiax*pml8>krzv eT_FO~< ,?Rm;їlc\9nŇWrSxqQkc :uQ-#™hXS vHmr0/}6Kţ!Fh@} +pWu8"`2>dp42ߩC%%Yh))`xq$ω0:y<;bk*Ph?Cwwxmx?+m@+fZck;&3wG+rbhG"ߎlK7<N|[X?; R)nLd7%87&H8}@\݌dʸlOݷ/>}9F5s3;w5^3XA `@<\+e[WIUHϤ;w+ &wzͬw SnUE2hNu ;:~ÜT&f>Tϟ-䶡#xaps2 2̚A@v$9 I֬ pUÚ 6n3˾}'vu۶eiz˾xU}2ڦgu6}?,m5ӆB4JSڂ'M5ͺ[&~AyhX¡3\3ޏL~UZU#\^a[aaZ$kG2y$}N',{G)d-mw6Is GC~8)"$F`D'i'Dʝ:zM}B(Ŵe .y#We(L")WMqs\At@1+s#MFXx}4dCK^%FU*@ |^_sN6j''kmGF=(P@o"fYtT%l DN#E1 {H^wNI%O Ƥ@&>Ĉ^ɂ$2m홅 3ElPU[j*}JuVduq5ND` 9T*Ֆ9.~L_"4a2v^mNkZ4ɭ]m=^2)d`B,S Z;5}]l4 IKkxqDɔ|Tɝ՞*YB>PAi $!0-Yy쎡tZNÙW~(Mnj-N]7|HVm(1"tK6[T;1Z>5Ǡ34rԔ>drl5L <֍*sb8Uzk6 *]`jn14=:~S.MůЦ7IvT͠t)?>lWaYoŠj=jǰ.$Oގ<꧀ݺɺ"\ZvOzt- isz-"=Q5>\z^*Z3DнzWoW !A i="SWh4ȷ>lo֤Y'Pw@ҿ[o2G3U=_VɔAgWǨ>Y_>TOH׻)pvBOe.7>^ #.㷯P2\Ց/9VAm{}I[Þ?p .-%@{#}q»5]@s=T%X)Ql| kb߉l_B!yDvP?YgwBD $Tm2ɋG#RSBRcs84#dg{\<;FJD罵9"Ӧe| ƶ8 [ @&wX+Kߙk|"[%*"}q$aјp}JԱT-oSzͨX?flnҥ;=96ctk>Mln)gz\O2h&s4/`SR >n;WlKؒ訵0 6 67uggԕ[=ubk5Zp4Ζ o/_M}|1 h6o؋j_>-ժ|FbWurE}߼kBz:v/x&z8?0endstream endobj 586 0 obj << /Type /XRef /Length 287 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 587 /ID [<63165dc345ab44a7bf06136b4a84bd7b>] >> stream x햽JPONI[c$.BA\x?(`:x BA:""A:Zh]]DkgEexxr!y NK я\ 117̊ޗYa̭hDe٬0V,<Ɋ˜[t_ȭ?w9{܂bz%7쑷I)p1.ta~pZ̐]:s*&ob $bi$yHr$F ?p>c34wbrN: sgj?;ϪD3z; endstream endobj startxref 180876 %%EOF RProtoBuf/vignettes/pdf/RProtoBuf-quickref.pdf0000644000175000017500000010027413617276206021251 0ustar nileshnilesh%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2551 /Filter /FlateDecode /N 42 /First 316 >> stream xZr8}߯$2AT'$Sy%X"JTͿiHeovK `w8}-P29ˤ29d>y$Xx 70`B8LH *.l4袂GB1)l%T ȑ9VJxϤ\[Lu!a˥~,pm#滒L@lBY ϑ,p*zpXU:Ѕ'b0WLYJ Ae ~cT8.cX2~^I LT[>z^6"vTK*.ĥb/~؁ر_l=3/g=)l yN02O1qG xm"Kp1SJ#2)SE}=J&5?!ff.zae̥zԩfb.a#o_g[܏xOA<qͬUf wEI3u6GzztJG+!c!"ɋUATQ.׿aVkE|6OSԅ t(j ~xnQuuS)9շf¡ǵ`3U {\TQ`ޟOlu]BR.0OFtkd$PtJ!޴T[42׮FOͣk~ 4T~!?w/x̯U#pZ|gq1_'|§S>3ޮ3o9bD/7"'J^~|=\yA"yK ;Q" P36烬(5]ֈ+R{;C=-w(XS kXpBmI !nZQ{zpt!\]M2xH/e{j2ossMk/|v"=\j|prtiTl %#ƯM@,Yg^DSkuzmѝ7>~8ʧzJ,Rb~^)v^55ЎWIx^g݉[?["vj GՏ-6k+–=1<{w08BgaZ v:Vl!l1~ğ@qB\T)C+OU8PmETYe!@Xr-09F}/ +["4܄5P~:x{R+ hYMNg -tkjgqMk-F'+)Iu>D\ smwWA [n)Hwͱ'c0bZr>NK*T9Y96}"UtH0g~YߑcGȒqIvdlks=ʯll%?PḖ@¼4 ,;&KRߨ)FJ[X FJ϶(Q[l#N5<&Zc9UDs5Fۓ& E.DIa9tBO?IRNW6ynFcXb addGy L:'F7DsxN=v`$Ā1xG/i8FYޯF4S=ۜg8k B,[䅰=C kuxh("zk*cWvSvM٣7Ur@oPtvBeu|b-ˉjl/? vendstream endobj 44 0 obj << /Subtype /XML /Type /Metadata /Length 1549 >> stream GPL Ghostscript 9.27 2020-02-07T07:22:31-06:00 2020-02-07T07:22:31-06:00 LaTeX with hyperref endstream endobj 45 0 obj << /Filter /FlateDecode /Length 4584 >> stream xh# 7hu0/(KBΡ>"F X|沨ň%Q~kpDP`*iTE[ $a_LT@f"w h]6QDQQ _bOܓRŐr.D</puB!0c0k@zHSDk12y>(p7BĈߍQL F;⻼&/3LE&:WLŤX'$mf8GϊrFĐ4:n~!}b8wf %`v:r7F.yI;$dv!$ ;dKȃM,ZeC q:-zV~P}ݏDf^:}Tu9_ɎFMS euT4z hÄdy0jԾ/Vc ,ٕūyM%cOW;2<ԱZϛm^:rOrz\-˛i>6j #w 1u!"Z^Z+uDGk 0 83&Z[,h>PXldGotgwXrN*/?''q/G㭥sT\Yc;y@YlgmA,y5)67U@gi &cA٠0cllоݲAAtzUFPd\M3TT2XA65UPaBEu`XV ^@} ~L KI:.bπT&OBVcqj]p'"=.]A"&}mN~؃֒@NopYdFFB*tc߶-gT4ߞh:]9v!t#ߏtYLp jY!I%8#F7ӕ p .WGAWPsiwHRB 8]̬yc ..E!D@+ƸLJi!3EmS~*k2EZ h $E[M*`Gӛ$?Jc4zOzxF7EqMJ9'(7uǀJz1PHǺ&Bbߙ$:5}ƫq,}2d1vGD*`X=#>SNM<Ηk ;з1 - V6\צ;P-9#ߜ"?4඲2%:`ߢMtܩ^1c =6s@)-`{)Ǝ`u1PhŸc牛դ/كqz,v,Y ŸrV#h^n(c`2Dt@rpײ~_wc_4ϋ"Zݬ4) ;Y }Iڕ?˗O'C!{B{=c,f rħ|fݧK|jݷSC>o6AlOEOFRB 6!K F-܄=\bJ5[!gfv<1xi4Z-4f-7,f4Yn|0.lQTHe 4[$=nlŢy>2ZS<:[75:1Y7v/L]Τf;˙ /ʗL7G _B׼78%=I#g{,"0shm֞t2{p0?ZTWh85k2X3P'l:}\|8 1y$ L=b%"IE{sENڻV&u 2LMOzm[œ&xV\eoe[qS0ϧ˼5e6F|] 7)GuR7wF\7c|Xe[A.Ͱ\ݙyP9%( W^ :<9vX"c[[T2-iAI`rf#B c)`,i>^l1߭sK=G]G;mtqFshf6겸gFcf>j_)J| jAjB=oϹ4Qs.ϺpiG#))ޘ#M'4E@9~R,/זh JYd5csblП~ hDyRFRw~s;5Vvbjdj >)5f 0t8fxcNE~*.Af/О◬.٤ٝQ~\qsg=v12 ȃiLcoˍH+t-q _%5ga'ņҁ}P' σdendstream endobj 46 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1857 >> stream xUT{TaqfL(*ufGT ,X"A 1Je}c˲aFc1z@[-jMCOj^ί'vօϜ~KS>M'-I܄iY#P̑7'̠&E ?ߏ\LNI0R9),, [p]پGMMfgiRs5C5efn^f&Oٴ#YY8/t\wc&F*ҥoLʦ8jO%Rs$j3bUT8ZLR) _ʗʤe>>G}vL+<'|^np|j\ ~\+ eK)Sv1(1h%YL]b_9w(Y$lǾscO ߒ(n x3 Rad1ngɥw9\M U$H^$`F\#H!AH8 ?r BHD >t'٨Vͨ0"rH"/"!/Ea8wcH 2 qg)X.P' W1X, =l8E U =^QbYgխ*9:8s;+%Jo#/ :&1RÚl. drLٰ;.pnԹ/)tBgɃv*2[f؏g*8*lUoldjZ!+ccta.s;s3;c\ulJt aލ7'`5;JCPT ;Khx6tAWWHz*Q R3h,:mWZu᪼@OzSԙ?O1;3%bdd&L,mSj&Ge->PASx%/9XnQܻ͂ov};CTCTZj65Uyݵ.82/4B~;w|b\:l@APLPAry {׎ҳ)_s(%i6 IEއ /r&cXȈz@p(W_\l- }0Yvi~D͉jD ?:~|8|\bW1D"RjZ2M$؄ jVjRK ʷs9I`&& ?ͳxCCpg.yB gg'kd'?SwTTA6փ Ĵ9DZ!@$@a \5g)zC6#C4Q_?W;mH>!,n6׶2'< T_D\HpT Y V+းiS_mijnni@|Sx^ɥx_SujaϠYիϽ7;b[,jjwCrRVB,endstream endobj 47 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3267 >> stream xWiTWDK!rCAC4b"+Q:Fw4a1.Ec@~WfJ!TJQܘU&l&ϼ̧z*x^HݓuAo&בb*`&1a1ZѯYCyL1(3lY-d1 +KLMGf>wy*UaJѪ"*!kѨ:X*:<_5%FQ0n0GZ2Vœ:5uMZnW;M_2E-b1j,GR㨥xj VRsx* p*hj 5 P E'5VSޔHuQj5 \cIBtE8w\F,qsy" Kkig: gT=֕}}0e@Ӏ]w~6-nnCdMorxXp+B@^{;1_1}3JW 1a)<3 pxpU~gK91/.|7<9îa g_Lnڦ'7a bq2|8l4 J؏. YHz5퐼2kgvi Kz$Ib$WVLc[  þq+<|Աy(%5Yp5ppZo#)3 Nn8~zcR.K#j đk#^ SqPls/sf_s`.~O3gtIWN{>/ýt]śd0)*و6(V e&=e3\}.>%>%k".JAqj''I 1`'l-@OcIB"sj*S^B]_27Rw[eeoua,`t}XXXjE7Қêqyh/{v9DaPFbM'9)R$Ax^7%2S,M_BbTbrCp:WT^m-˩P0Bx)5_Y8ੰѵۗ{&H=)<} OLy<6"֬_[#&oKQqbՅe-r8LnB5"N' =fjEb]U>w]泳;eJ:D._gz7gڷ=tVf_~oBY(Kt#5Z.H]PD~l7o[PbXLv @= oTca"g{UJ_xrra;[+wH6$PATKqOjkB߇{8D|rd>_MLavG_d-?c=A0S/խǢQJ0iP΀+>u G >&d^]|+Ł4$K UJ|~QvlSx7G'w~}:dĺT=|G6L}i$^# ~+*n0.ClXRg]-Gj+ч蠱2lp6Jr0杖h8᪴*u8Cz#ŖgLth5d؆X*Ăd`tI g À'y\N"9px0w8yC55ԅԷU߹"rÁW*!+)GVtnGA펮D삣FK0QZ99I)H:޶q\ u96CE;oY%B{%ߊjFJ*@yerY/5$Lϛx/ x!h. փ0(:-$ =k8k>WNT_2W/O۔/cETZGB}^r"wB8Qщ]~#Qĺ\NzFb2?n>}JYu[Jc\D]uVҐÂg :i%MQdI`6}PPAzyq6|-*iKE{nݴ+v]S;]jM;ƱJvW\hڳiORҠCNI_K8W:Ɲ8h΅pǓʟޅ!L1@]_vkBL\vwhwHVTa{7 [4{¾{~貓Qݪ;]=fu_k.*G4@.wu;g^RZaBgQ"52T;Rt}jSG7jIPt\(q}y d2&a 1Dc }b(O{Nr }{ }ςK_c> stream xcd`ab`ddpH,*I-r Mf!CGVY~'ـnny?څ ~$_PYQ`hiiXPWPYP_TYR\RWPZZTWu+sbR23 # , U er0fuU m}=ីpGGEg~W\6r6m)+ܲH}eOXqy~|6hne5{n >6 -Kd^RuV7Gd=WN-I?d|w[5{>{;2Y"?5_"߃=]ohka_3uD-['hlP˱ʛ7> stream xV{TgﶙqT&#":E<APQT7̈!bP>+ 1AEQ5 : $aWv5[=o$sϙsz_կ~ES(ǯIRQ)%dl-L%LepȐ'J(1bExkMwƁb<ȝ~ғ3"6̞;%K퍽\FR~&ɎKݕSebObɰW؛II(W.+32Crbv̏MH K O^\mRO/٣w#JMQaT85ZOEPj5HR~TOmT JQ;ByPZM-PhJBM)MYRJj,%Q)7&eA<'ӅvݣYd3L-3h! bD!EX1̞f_pEޖ_-?:jt觖Ֆ]Ccc<Ǥ97[ZXXEAXhBj!+Qm zl$*/PIy~B#s[36)}e?sb a-Z?cDx<lqb=/yS{A}dԿi~-/j7?r⾊;FVHaq7QӹU9*N[;'=Wu`Saᮢs'3瓙$LFdefe( "$-8wӵ:h1pZYn;l5| 5+/'q\uokr!>S+ jkz0G@RxhF KpDaJe6KڣR]E<~`7-yϤK8*VO#X7п 6c+@'/QX.Ga)+?]'1k.K=q0Γ~:tpgC.%J/sY帆3 =5Z)a=Or1fU H::Lr)9D?S?$u E)xIKN,RC 􀞁UL CZ<X0Գbბ5`BwXxbΒXkrTf8ۨd߭q'e{{:ޝ=ǶICmO=O~:l]iPZP&.aN;#$0}1ўU?<+ ?[6q֭=p瑍D/dO u><#8}-6:qIݨLcˑ"!@Mz@A)7|aJ - &BP!b'-("2>vYcֽ+)? Ϋ8l ye0<]p`gɍ 3/!h$tI|(_>z񪷏UY} |/{ ?ߵIš=ErO){פnAs_ښ*}Yьgx&JѮ̤oG!>$ry'>[n涩[M7ML0V>z]ZӤ" |{,ۘ+jf ~(.K>*-$xO&X`LY7> پ }AGO~Vu {֐M!7 ̩NhTT-ͼ&<~o#e#6͚;-3q-%|*یV" k8N+O$~#7b1>&65)nƞ8@i3W+r8_rOc' AM eW{mŤ>ϛH>i0 zځ 9dܒ"S;p&]zd\XKo.c=‘C䄬=\Xxm>rNaά/jQ-2oFW_<҉􀇩Ktn6B$igfY %Ac7#, !,bXDu<^Xpy[[PlC!۳UY68TyO߫uqHҵcmBsWKcsX=Aiȡ%u! 9;ggeN%x[CrSF}< E;ST9хh8X;K]Tz`}nmXӊ63xU$S)g-ak_ot.5EU]7Jƴ ?@4_ϕXRrcء5k)4IHkX#c4.fb8٧O ׉dyȞ8]dtgr`ѰҌΈU2>2(EN,j°h dž"4Frټ{7) pEঀY`ïgc#!Y6{ry9j&ZOE$5{d}pk@J~?G`%9<7O>>8RPjX>Q!endstream endobj 50 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6004 >> stream xXTT־0wFlxD%$ | ̹#g٭{],qBg.cdJЭjrx)#sO5)ـ6ϺH S9x7O+/簧[,̖.ZnnY%S6Egcu"ؕ d`.BQ]]}b9lG!ʼnB"?`Èh΢Qa21=%LMև;b5f׸oSW a! /|ݒV$ uU-z;F >y}V3:6~ya3 ۻ'd*-SEoX!.0gPo`{xi{-A]~+Y3*DfN%~S"22Y(x|E T@dKϱM{J@$S6x]Pi{KdHB|fPHGEyAK!{<%\>P.`9 s0%*,W,G}DlJhJoi,/B}G{kլQBW'=W yy.ϑұ gd~yQjXNR' 7줟]AC5䲁F).[iЛ[P/?Р,wclzos'mqF>ho\$alz1?DFxY⪋ (k\ʪɫrjT w-æO n|elq _bѲ}ٖjT$_EY '&-f:G؇:VH "=igNѽH`4xE!JXNd(CP1w"Չ+tM0_nT^oD` N%a6E }xx1AϭꉨQ3h9BǃLQ @rKDoe P UQ$Vb-75и U F11ɳ$φGp/.^`ڡ~a_WPU*AZ@2b!L_"xln_9Uq.zŴ$f 4Zt,qTTiJQ&y_,Yy E, {'eXd +FYtTGs>UXzrC O7"yByO4ߴ%h3 kQ7H~ :u f_&}Q#3w::`XI*Ā/gXd ! {X_ E ZV%:'碹(>d95.'ζ~297`0)xvZ,dmS 9hTZ c"@fOҷ>S!uuHRT:ڪ MR~ bқ`aH`K4 1@[WOe'@+["2,lӗJm=!}~?i;GJfe~%H2mlﲀp.%69=u{2Pd .~zs(Ƣ(I:PCEq)HT}&"\/.hؚFa{g{v;bX{{6G{:c/R"@`]x XºHiP͉Q+gJ!@gY>qaTe/M n؛+Ϲζnɷx Ww6݈[C%'DFuD[@MkAϛ/px`vy:LgW5ǝoj9ZJN[}- Q'ųHQ2}:&'uLKDL!5D44#uw}Q>1#HaSn%>6U y;K|SbzXTMbM# OIJc8憑|'XxSwq"wtW[kyhquE!쎖Gk+k}mf}A}QY[{2@te%_';{r3'#ODXLTT-Hx*7H'^Z%9"/Y\dV+fEt"O &M^mZrO# .K{=y,ޞ1`}txk,ќ4?Bu6zMH7ҶnMg} J()k]'wP4r *\End,"-KqcnY;~GG4T_K-[x`tgh 0 `D< (0K vO?LaZa(=;!1oP$8/xjƠ#~V5m'h" {T$TS bnb^-~gwDjJO(`u~~q!vDy/|u|%xlsJeA2'T{&Emh,k=[zz?~q۩܇N[`pb@46Vo"ZiI(E"패hmi;pa"ð+N_X%ѹ`ݦS~O MLG?J:|]:2hvS_Yȣ׺.]MŦh$tRd@X˚ҮU$"4`e-'(Y֢Re6k!7Vjke0u{"McÙ`r⣲cl.5(`"/?/UIq 1 !@iUq˒E[U7_[By6Qu06s(|c;]t7F%A:EVw5cK%?ݢKQjFq4J48r +X+^t6xxtt5w1YHoxי,6/\FI\EtM>ir+S>g6j AXm`MqAy!//#h'j{&&!%RfC`QYH6h0ܾ{[; X~8Y$ " OoIJb1O'ks0lc{5!RM̠});tNUȝޣ I)׆D8g3~ËH"ːnQ̢qhi|n$&SE67?o,'UPO/i " %ij>1HkNj^tzs EDu/X7 w.#Ŷx,t !x46™wx\>^i<8_)4mwQɿ[B͛x)~ܿ׊ S` i^41{<ÂC 6CZt&.3y;=VxMzOKdסS]h xRK&o x_,]tt:O޿g*S3XmRcQ6Jn,.gm +XM*WJZeĚl ,&)r j˩Tj䑏Uendstream endobj 51 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2184 >> stream x]UyTSgay*ψ{ѪPb(qV %$!aIEA=QP " t\FLRyvƒǭ.uz>Lsnr]~~WBdpF69(0`V[+S]!V WO%-_:5bĵBOWvi^lҌC[fnVgǩbe Cd&95m!!N&얭>GN&'ȢrRU6*Ȣ"WnmX7 5 `4Z~!Y[S'N'D9I$6Qb9Jl#V0"XCwb?F%%\\z]gu3pW_!j.u.A ՐGJcCtem6-gHCgSgHdLյܣ}CI@:i`ۭ#Va K2'6 gdcQ֩r&)Fl4WȏX\*]aeX؆;~f7?b/1@f& Y`_vEg3f)W9 5P2fPbYsIg,sY ==i4 4ukÄd˗޺ CY+UY4LCZ5o7#k=d$Ԥ)el}#4i*ŢR033I2Ë?!fB 6S]6a#y@^i5bi iP 3OsuUmQgD!eIpIp60["ւؔ92 |,P4:.VkKY_28PwT hPFNZV nuOA8MyFy @쀫yKOn! Bz5:OkGVkc`bjhDYw 2^{1B0MzJ[ +U֙ml;)f#ouL }a*JR`]so'֤dV|$U[W(/>`ǓGӪǡYXl)'7V Gݼqu]ڪL̢ɩ;\Wcl.;TTۭ(xY> aK|AosMa+׼B#4gLɞ89Qi?ϓhR;zqَ̯B"-\1Az?{& 3SQ}j,?mMG J0B.KtAW6<, E 5հZ}N}ʹgaM 5C2<>1fHA =]'Ldŷ7%&r@%dC ՂVjX͓2D/^iT7߼ֹu[x# /ToKOi_~_WL4j!ka'>} <{t?cR|baR>퍸ĝ_+\h[D ]\G#4%2DQu DȍtA礃[;;( Pd03\s~;{Nb@ 2i6!AW'ꛚjkL0%9Oǎ y1Cbɾw*ϛmfc #uy*k@]jn_f~5r&_Pi+OD].=vEP ymY_)rr`Tehi8v: lW)#H0'| \ 0iT ̎C YkM'|u1r> stream x]1n0 EwB7f\%C> stream xVkTeN[3˶]Q{urmYP@ȕ J @%[ -VWRU{vj߬;@=NΙf7@bqWڼi0p~YaH *PRaBʪ3@|,;H|v B}Hq[ JK7o~f&S lO/,KjJ98's%b)g=SPT_𹜌,NftΞ)IE5EšaUB:q~X19 H:b4 $ىBv#{א>d?rCe K #]׸¸SʼћK vz鎥Җ ,|6KNY*Rfb&g9Ia8W4v PqnK (bO^LLk Fmmժf-4*ْ6/h?;>>xbxr`n /7Z'2ԆA #P?KZaޙW2j5E$b{,{9K2>H;: %O.?ѬpE;s|\8kU| +eCntny?"04)ZqK,FU7E߂-)ȏpi\K^y9?d~ _i͝ t_ǒ/Ys;Cei 5W lZk\T$FZA5uz`6*=T5EHd_xptx sHoPkwu$ xr,mcLs;N`{` "I>MrIV`6vUVҘq.*ר!fɼ`̇pE0DَoR A8(^|_`gJ\*3GWbj+] Nå{ (x^f}{tzX%V3ؖ♡!xW8 @o?NF 3yr.钷pZfxԎ: w9q9s6҄e|='"& CkD7V*%MkQ=&+FPGSmOGYHy2]vɈ `ZMY'%es}3j8JaZ(UK&ivx.(lcw=\cˎt(d5"6N~0̈́C]pL.OGu0j |^@4G栐m\e ?_8Nd 2 T[$@^3!m&||ЧYG!KwD_QBςEc{0,OLv^0T|1Ӏe>1429NBA7cdJ/+hbR _w1Jh3D)Q]l9Vb)T Ewnkss>OtkhK/$\4XQJj@mvyZ=@$h=Y ,(k`t/Q*ݽN|? @`NQMN.uG$:rR*9)@\2"'EmkS *OO bǞ:z\%?>Nm\sVqX(=>eۆbo% JfGKBs z(Zgj;3O;SAkn!hոkj wLw]X í. > P*$JSԦ"` 5U t8t+(nLlTh*1 {`st7 y 3K٬3iyuaz'n:BѮIjt=fۍPu)()nAefꒅ@|vl7 eon܊rns,r|Y\?~)_Z刏`;kA9endstream endobj 54 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3012 >> stream xV XWRcQLU,V-mm bUyW~I@,rb$hת[jK^N ֶ&ߗ|ΝsssD !Y뫈SuG$'ZfEs6$1i|/KGL"==&m?9ݜ{ :B3X$Z륈OO$3k֫tLhE2z,8.LtL EE6M' GDŽu5W|W[5}oZy*I襤f""(}o#iUsBN f1)v)LNţ;3,(]{}}/-wc6Qs~ĶC2 }3˼8K=~Yט'Xo*֧ʚD$ʢ,gƽ XaO>#I]vф5W#P2]s Y:')27J>+jt5GjGF=Do-(dBjCQ{3μ͞λRX7Pùf{8DQb:;GBoBbS9s2/hZ<Ácli[>Iǡ\UbC!;"XH7Qe3Rr+f\IVP~HL\bh\'/p~|Hp3|x?Q2$}m,;jjb`򕾸/N ˈt^ɉ UHֵXL?&Š-@9ź U$'ļ,ܟ5:r >?Ώq!7`7 #l[ҹj~8Fp">WՒuz{u83%CUIc1J9J{(wnS;US)5ZeZ3 բ:Tqp5H9Ω )oiV *K/ x}Iߠ=anRSAZD}ᵉؑs/ SYYgb>)JAIai]V3/)1fG8Ѡr ~:O(]ZOt7*S7sN2,&3L i5lia=A밋s֦w  jCx^rY,.+./G5kRlɎFe៝B 3$$靋ZuJDŧDz!%zՋu kP*ьY^j( {3RQRy_@7(P&ΐQ(~o)h^쇙ױÝ0&ܩaؓJ2eGuUh703;2& (ICJ z|F(g|x=eW|wL;ciΐe wD…t xWifmx7TIH0Jf4\)m%+[_sܧgO[p{dSoX^;IoOdJup[tE!'9[PV͢ʸ hKusAl'^#n'EOB=H[\֨Z;uw`f[NV=BPM6W(^odL68(ˉA]O:۽97iWK $wΎN[`޲0{?KGr2Ӟ[E !ӗ+:sJD&JǢ8-4m;"ў>TQ3TSb# O؎v&2eeY6l =zC XYL ^! ҄#7#YZ @qGGX])6B]e yBV> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 56 /ID [<89567a9d42daa1efae4c13747d67f583>] >> stream xcb&F~ c6L l@o  @WH0 u@B|$cw HBz W endstream endobj startxref 32614 %%EOF RProtoBuf/vignettes/RProtoBuf-paper.Rnw0000644000175000017500000000044213617276206017767 0ustar nileshnilesh\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{RProtoBuf-paper} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignetteDepends{RProtoBuf} %\VignetteEncoding{UTF-8} \begin{document} \includepdf[pages=-, fitpaper=true]{pdf/RProtoBuf-paper.pdf} \end{document} RProtoBuf/vignettes/inactive/0000755000175000017500000000000013617260253016105 5ustar nileshnileshRProtoBuf/vignettes/inactive/static-use.Rnw0000644000175000017500000001270112440004312020640 0ustar nileshnilesh% % This has been removed from the vignette because the corresponding % functionality is no longer in the package % \section{Static use: Revisiting the tutorial} In this section, we illustrate use of Protocol Buffers in a \textsl{static} fashion: based on the \texttt{proto} file, code is generated by the compiler and used by language-specific bindings. \subsection{The address book example} Through this document, we will use the \texttt{addressbook} example that is used by the official tutorials for Java, Python and C++. It is based on the following \texttt{proto} file: <>= ab.proto <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) writeLines( readLines( ab.proto ) ) @ The \texttt{proto} file defines : \begin{itemize} \item three message types \begin{itemize} \item \texttt{tutorial.Person}, \item \texttt{tutorial.Person.PhoneNumber} and \item \texttt{tutorial.AddressBook} \end{itemize} \item an enum type \texttt{tutorial.Person.PhoneType} with three values \texttt{MOBILE}, \texttt{HOME} and \texttt{WORK} \end{itemize} We see that a message type can contain several different items: \begin{itemize} \item sets of fields---for example the \texttt{Person} message type contains the required field \texttt{name} of primitive type \texttt{string} associated with the tag number 1; \item fields can be either required (as \texttt{name} or \texttt{id}) or optional (as \texttt{email}); \item other message type descriptions---\texttt{Person} contains the nested message type \texttt{PhoneNumber}; hence the fully qualified type of \texttt{PhoneNumber} is \texttt{tutorial.Person.PhoneNumber} \item enum type descriptions. \end{itemize} Using the \texttt{protoc} compiler, we can generate functions that access these Protocol Buffer messages and their components for both reading and writing using any of the three officially supported languages C++, Java and Python. For example, for C++ the call \begin{quote} \texttt{protoc --cpp\_out=. addressbook.proto} \end{quote} generates almost eighteen hundreed lines of code: seven hundred in a header file \texttt{addressbook.pb.h} and almost elevenhundred in a file \texttt{addressbook.pb.cc}. These two files are used in the tutorial application programs \texttt{add\_person.cc} and \texttt{list\_people.cc}. The former adds a new record to an address book defined by the \texttt{proto} file shown above, and the latter prints the contents of all records in the address book. \subsection{Simple R accessors for the address book example} The Protocol Buffers tutorial contains two simple standalone programs to, respectively, add a record and list all records from an address book as defined by the \texttt{proto} file shown above. In order to ease the transition from C++ to R when working with Protocol Buffers, we implemented two simple wrapper functions in C++ that accomplish essentially the same task, but are callable directly from R. This use the \texttt{Rcpp} package for interfacing C++ from R. \subsubsection*{Adding a record: \texttt{addPerson()}} The R function \texttt{addPerson()} accepts five arguments: <<>>= args( addPerson ) @ The first argument denotes the (binary) file into which the new address book record will be written. The next four argument describe the record to be added. Both \texttt{id} and \texttt{name} have to be of length one, whereas \texttt{emails} and \texttt{phones} can be of length zero as they correspond to optional fields. The actual implementation in C++ is close to the tutorial example and can be used as gentle first step in programming with R and Protocol Buffers. \subsubsection*{Listing all records: \texttt{listPeopleAsList()} and \texttt{listPeopleAsDataFrame()}} Displaying the content of an address book defined by the \texttt{proto} file above is straigtforward in the command-line example as records are simply printed to the screen. For our use, these data need to be read from the file and transfered back to R. Given the definition of the \texttt{proto} file, we face an interesting problem: some fields are optional, and some fields can be repeated numerous types. That means our data structure can be textsl{ragged}: the number of entries per record cannot be expected to be constant. Of course, R can handle such dynamic data structures rather easily. One approach is to use lists of lists which is implemented in \texttt{listPeopleasList()} which returns a \texttt{list} object to R with one entry per address book record. Each of these entries is itself a list comprised of two character vectors of length one (name and id) as well as further lists for emails and phone numbers. Similarly, we can use the fact that the id field is key identifying a person and return two \texttt{data.frames} to R that that can then be merged on the id. This allows for both potentially missing entries (as for the optional email fields) as well as repeated fields (as for the phone number records). The R function \texttt{listPeopleAsDataFrame()} implements this approach, and its corresponding C++ function is very close to the tutorial file \texttt{list\_people.cc}. Both these functions show how R can use the C++ code generated by the Protocol Buffers compiler. Binding the generated functions to R is straightforward --- but arguably tedious as new interface code needs to be written manually. But R as is dynamically-typed language, we would like to use Protocol Buffers in a less rigid fashion. The next few sections show how this can be done. RProtoBuf/vignettes/inactive/RProtoBuf-unitTests.Rnw0000644000175000017500000000420413617260253022457 0ustar nileshnilesh\documentclass[10pt]{article} %\VignetteIndexEntry{RProtoBuf-unitTests} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignetteDepends{RProtoBuf} \usepackage{vmargin} \setmargrb{0.75in}{0.75in}{0.75in}{0.75in} <>= require(RProtoBuf) prettyVersion <- packageDescription("RProtoBuf")$Version prettyDate <- format(Sys.Date(), "%B %e, %Y") library(RUnit) @ \usepackage{microtype} %% cf http://www.khirevich.com/latex/microtype/ \usepackage[T1]{fontenc} %% cf http://www.khirevich.com/latex/font/ \usepackage[bitstream-charter]{mathdesign} %% cf http://www.khirevich.com/latex/font/ \usepackage[colorlinks]{hyperref} \author{Romain Fran\c{c}ois \and Dirk Eddelbuettel \and Murray Stokely} \title{RProtoBuf : Unit testing results} \date{RProtoBuf version \Sexpr{prettyVersion} as of \Sexpr{prettyDate}} \begin{document} \maketitle \section*{Test Execution} <>= pkg <- "RProtoBuf" if (file.exists("unitTests-results")) unlink("unitTests-results", recursive = TRUE) dir.create("unitTests-results") pathRcppTests <<- system.file("unitTests", package = pkg) path <- system.file("unitTests", package=pkg) testSuite <- defineTestSuite(name=paste(pkg, "unit testing"), dirs=path) tests <- runTestSuite(testSuite) err <- getErrors(tests) if (err$nFail > 0) cat(sprintf("unit test problems: %d failures", err$nFail)) if (err$nErr > 0) cat(sprintf("unit test problems: %d errors", err$nErr)) printHTMLProtocol(tests, fileName=sprintf("unitTests-results/%s-unitTests.html", pkg)) printTextProtocol(tests, fileName=sprintf("unitTests-results/%s-unitTests.txt" , pkg)) #if (file.exists("/tmp")) { # invisible(sapply(c("txt", "html"), function(ext) { # fname <- sprintf("unitTests-results/%s-unitTests.%s", pkg, ext) # file.copy(fname, "/tmp", overwrite=TRUE) # })) #} @ \section*{Test Results} \begin{verbatim} <>= results <- sprintf("unitTests-results/%s-unitTests.txt", pkg) if (file.exists(results)) { writeLines(readLines(results)) } else{ writeLines("Unit test results not available") } @ \end{verbatim} \end{document} RProtoBuf/vignettes/inactive/Makefile.in0000644000175000017500000000275112440004312020140 0ustar nileshnilesh ## this is a 'fake' all as R-devel gets a race condition on RProtoBuf-intro and deletes the .tex file all: RProtoBuf-unitTests.pdf RProtoBuf-quickref.pdf ## 'real all' pdfall: RProtoBuf-unitTests.pdf RProtoBuf-intro.pdf RProtoBuf-quickref.pdf pdfclean: rm -fr *.pdf clean: rm -f RProtoBuf-intro.aux RProtoBuf-intro.log RProtoBuf-intro.out rm -f RProtoBuf-quickref.aux RProtoBuf-quickref.log RProtoBuf-quickref.out rm -f RProtoBuf-unitTests.aux RProtoBuf-unitTests.log RProtoBuf-unitTests.out rm -rf auto/ setvars: R_HOME= @R_HOME@ RPROG= $(R_HOME)/bin/R RSCRIPT=$(R_HOME)/bin/Rscript RProtoBuf-unitTests.pdf: unitTests/RProtoBuf-unitTests.R $(RSCRIPT) --default-packages="RProtoBuf,Rcpp,brew,RUnit,tools,utils" unitTests/RProtoBuf-unitTests.R RProtoBuf-intro.pdf: RProtoBuf/RProtoBuf.Rnw cp -f RProtoBuf/RProtoBuf.Rnw RProtoBuf-intro.Rnw $(RSCRIPT) -e "require('highlight'); require('tools'); Sweave('RProtoBuf-intro.Rnw', driver=HighlightWeaveLatex()); texi2dvi('RProtoBuf-intro.tex', pdf=TRUE, clean=TRUE)" cp -f RProtoBuf/RProtoBuf-fake.Rnw RProtoBuf-intro.Rnw RProtoBuf-quickref.pdf: RProtoBuf-quickref/RProtoBuf-quickref.Rnw touch RProtoBuf-quickref.Rnw rm RProtoBuf-quickref.Rnw cp -f RProtoBuf-quickref/RProtoBuf-quickref.Rnw . $(RSCRIPT) -e "require( 'highlight'); require('tools'); Sweave('RProtoBuf-quickref.Rnw', driver=HighlightWeaveLatex()); texi2dvi('RProtoBuf-quickref.tex', pdf=TRUE, clean=TRUE)" cp -f RProtoBuf-quickref/RProtoBuf-quickref-fake.Rnw RProtoBuf-quickref.Rnw RProtoBuf/build/0000755000175000017500000000000014156423630013371 5ustar nileshnileshRProtoBuf/build/vignette.rds0000644000175000017500000000041314156423630015726 0ustar nileshnileshŒ͊0* yq#enC{#NI+ŝ/tnkmn\4='bײљoR%`#yοl~%ٰ7{ vqm5WS,أ7^m#/}ҽ+%t̆0'1{w{)LAJtWq;ίY 4x HXpu{'ya}¥,s7QL'(9XRProtoBuf/tests/0000755000175000017500000000000013617263320013433 5ustar nileshnileshRProtoBuf/tests/tinytest.R0000644000175000017500000000100013617260253015432 0ustar nileshnilesh if (requireNamespace("tinytest", quietly=TRUE) && utils::packageVersion("tinytest") >= "1.0.0") { ## Set a seed to make the test deterministic set.seed(42) ## R makes us to this Sys.setenv("R_TESTS"="") ## there are several more granular ways to test files in a tinytest directory, ## see its package vignette; tests can also run once the package is installed ## using the same command `test_package(pkgName)`, or by director or file tinytest::test_package("RProtoBuf") } RProtoBuf/ChangeLog0000644000175000017500000030552214156423557014063 0ustar nileshnilesh2021-12-15 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.18 * man/*Rd: Update a number of URLs 2021-12-14 Dirk Eddelbuettel * DESCRIPTION (Version): Roll minor version and date * src/Makevars.ucrt: Applied patch by Tomas Kalibera that is part of his changes for the Windows utf8-enhabced ucrt3 builds of R 4.2.0 2021-10-10 Dirk Eddelbuettel * README.md: Update JSS article url to doi form per JSS request, switch to shorter https://doi.org/ base 2021-10-01 Dirk Eddelbuettel * .github/workflows/docker.yaml (on): Restrict Docker rebuilds to pushes to master branch 2021-09-26 Dirk Eddelbuettel * .github/workflows/docker.yaml: Add action to build and push containers with cron set to monthly schedule 2021-06-27 Jeroen Ooms * src/Makevars.win: Support UCRT build * src/Makevars.ucrt: Idem 2021-06-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * .editorconfig: Added 2021-06-10 Vitalie Spinu * R/debug_string.R: Support extra toJSON format arguments * R/00classes.R: Idem * src/wrapper_Message.cpp: Idem * src/init.c: Idem * man/Message-class.Rd: Document new parameters 2021-06-01 Dirk Eddelbuettel * DESCRIPTION (URL): Add package page to URL field 2021-01-09 Dirk Eddelbuettel * DESCRIPTION (Version): Roll minor version and date * DESCRIPTION (Imports): Remove RCurl used for rpc * NAMESPACE: Remove 'rpc' class and 'invoke' method * R/00classes.R: Comment-out removed class and method * deprecated/R/http.handler.R: Moved from R/ * deprecated/R/rpc.R: Idem * deprecated/man/RpcHTTP-class.Rd: Moved from man/ * deprecated/man/invokeLocally.Rd: Idem * .Rbuildignore: Added deprecated/ * .github/workflows/ci.yaml: Add CI runner using r-ci * README.md: Add new badge 2020-08-16 Dirk Eddelbuettel * README.md: Added JSS badge 2020-06-15 Dirk Eddelbuettel * .travis.yml: Switch to bionic, change to derive package and version 2020-05-28 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version 2020-05-28 Adam Cozzette * src/wrapper_ServiceDescriptor.cpp: Support FindMethodByName() taking std::string_view * src/RcppMacros.h: Idem 2020-03-26 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.17 * README.md: Add a last-commit badge 2020-03-21 Dirk Eddelbuettel * src/wrapper_Message.cpp: Condition use of ByteSizeLong on ProtoBuf version 3.6.0 or later to permit compilation on older systems * inst/tinytest/test_addressbook.R: Skip JSON tests if ProtoBuf 2.* * configure.ac: Extract version from DESCRIPTION via awk * configure: Regenerated 2020-03-19 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.16 * src/wrapper_Message.cpp: Switch to ByteSizeLong() to appease a clang warning on deprecated declarations * man/bytesize.Rd: Relax a comparison from identical() to all.equal() 2020-03-18 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * R/debug_string.R: Correct method argument * man/Message-class.Rd: Alias toJSON 2020-03-16 Siddhartha Bagaria * NAMESPACE: Add JSON parsing and printing support * R/00classes.R: Idem * R/completion.R: Idem * R/debug_string.R: Idem * R/read.R: Idem * inst/tinytest/test_addressbook.R: Idem * man/Message-class.Rd: Idem * man/readJSON.Rd: Idem * src/init.c: Idem * src/rprotobuf.h: Idem * src/wrapper_Descriptor.cpp: Idem * src/wrapper_Message.cpp: Idem 2020-02-08 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.15 2020-02-07 Dirk Eddelbuettel * vignettes/RProtoBuf-intro.Rnw: Wrapper around pre-made vignette * vignettes/RProtoBuf-paper.Rnw: Idem * vignettes/RProtoBuf-quickref.Rnw: Idem * DESCRIPTION (Suggests): Remove Suggests for RUnit, rmarkdown, knitr, pinp; (VignetteBuilder): Removed * docker/ci/Dockerfile: No longer install r-cran-runit * R/read.R: Always close connection in readASCII 2020-02-06 Dirk Eddelbuettel * DESCRIPTION (Suggests): Add tinytest * inst/tinytest/*: Converted from RUnit to tinytest * inst/unitTests/*: Idem * tests/tinytest.R: Idem * tests/doRUnit.R: Idem * docker/ci/Dockerfile: Add tinytest 2020-02-04 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version 2020-02-03 Dirk Eddelbuettel * src/wrapper_Message.cpp: Correct indexing for Message and Group 2019-06-30 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.14 * src/wrapper_Message.cpp: Add extra parens [g++ warning] 2019-06-27 Jeroen Ooms * Windows: Update to protobuf 3.8.0, add support for GCC 8+. 2018-11-30 Jarod G.R. Meng * src/wrapper_Message.cpp: Protect identical() against recursive messages 2018-11-26 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version 2018-11-26 Jarod G.R. Meng * R/identical.R: Add 'add.equal.Message' for Protocol Buffer message types to avoid the default method being called by unit test runners * NAMESPACE: Add S3 registration for new method 2018-11-03 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.13 2018-11-02 Dirk Eddelbuettel * tests/runUnitTests.R: Rewritten matching other packages * man/readASCII.Rd: Set examples to \dontrun{} as occasional error from a remaining open connection seen 2018-09-08 Dirk Eddelbuettel * .travis.yml: Rewritten to use rprotobuf/ci Docker container * docker/run/Dockerfile: Correction to Dockerfile 2018-09-07 Dirk Eddelbuettel * docker/run/Dockerfile: Added Dockerfile for deployment 2018-09-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * .Rbuildignore: Ignore GTAGS, GRTAGS, GPATH from GNU global * .gitignore: Idem * docker/ci/Dockerfile: Added Dockerfile for CI use 2018-09-06 Jeffrey Shen * R/rexp_obj.R: Refinement for POSIXlt treatment 2018-09-05 Jeffrey Shen * R/rexp_obj.R: Unclass POSIXlt before converting them * inst/unitTests/runit.serialize_pb.R: Unit test 2018-09-02 Dirk Eddelbuettel * .travis.yml: Enforce R version 3.4 for now as the PPA we need for the Protocol Buffers library has r-cran-* packages built for R 3.4 2018-07-25 Dirk Eddelbuettel * configure.ac: Set CXX and CXXFLAGS values by calling R to reflect values in Makeconf used by R [CRAN request] * configure: Idem 2018-07-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.12 2018-07-08 Dirk Eddelbuettel * src/wrapper_Message.cpp (rprotobuf): Properly reference std::vector (as noticed by Brian Ripley with protobuf 3.6) 2018-06-25 Jeroen Ooms * src/Makevars.win: update Windows build to protobuf v3.5.1 to support upcoming gcc-8 toolchain. 2018-05-21 Siddhartha Bagaria * src/DescriptorPoolLookup.cpp: New reset() function * src/DescriptorPoolLookup.h: Idem * src/RSourceTree.cpp: New directory removal function * src/RSourceTree.h: Idem * src/init.c: Register new resetDescriptorPool_cpp functions * src/rprotobuf.cpp: callable resetDescriptorPool_cpp() function * man/readProtoFiles.Rd: Added documentation * R/internals.R: Add R-callable resetDescriptorPool() * NAMESPACE: Corresponding export * inst/unitTests/data/cyclical/*: Unit test infrastructure * inst/unitTests/data/recursive/*: Idem * inst/unitTests/data/subdir/*: Idem * inst/unitTests/data/unittest.proto: Added proto definition * inst/unitTests/runit.import.R: New tests 2018-05-20 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * man/readProtoFiles.Rd: One minor correction, and some whitespace and indentation cleanups 2018-04-18 Dirk Eddelbuettel * vignettes/RProtoBuf-paper.Rnw: Two updates for OpenCPU 2018-01-19 Siddhartha Bagaria * R/internals.R: New function readProtoFiles2 to use directory argument along with pattern similar to protoc behavior; also add recursive argument to readProtoFiles * man/readProtoFiles.Rd: Documentation for readProtoFiles2 2017-11-20 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/unitTests/runit.serialize_pb.R: Added unit test 2017-11-20 Jeffrey Shen * R/rexp_obj.R: Added test to avoid infinite recursion if sub indexing list returns the list 2017-10-03 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.11 2017-10-02 Dirk Eddelbuettel * DESCRIPTION: Minor edit to suppress another NOTE from R CMD check * README.md: Idem 2017-10-01 Dirk Eddelbuettel * vignettes/RProtoBuf-intro.Rmd: Renamed, now uses Rmd via pinp * vignettes/RProtoBuf-quickref.Rmd: Idem * DESCRIPTION: Added pinp package, rolled minor version, use doi in Description * cleanup: Adjusted and updated * .travis.yml (install): Add r-cran-pinp 2017-08-26 Dirk Eddelbuettel * .travis.yml (before_install): Use https for curl fetch 2017-08-14 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/S4_classes.h: Initialize S4 base class in copy constructor for S4_ArrayOutputStream class 2017-08-13 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.10 * R/00classes.R: Correct one package= arg in .Call to PACKAGE as requested by CRAN * src/init.c: Corresponding change in Descriptor_getField registration * inst/unitTests/runit.import.R (test.import): Test failing import on package's own DESCRIPTION file rather than /etc/hosts 2017-08-01 Jeffrey Shen * R/rexp_obj.R: Check in deserializer if invalid class is set 2017-03-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.9 2017-03-05 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version and date * src/init.c (R_init_RProtoBuf): Call R_registerRoutines() and R_useDynamicSymbols() * NAMESPACE: Use .registration=TRUE on useDynLib * src/extensions.cpp (rprotobuf): Rename getExtension to getExtension_cpp to disambiguate from R function * src/rprotobuf.cpp (rprotobuf): Idem for readProtoFiles_cpp * R/00classes.R (.icall): Comment-out unused function (setMethod): Remove erroneous extra '...' from Message_clone arguments * R/clone.R (._clone.message): Add missing PACKAGE= argument to .Call * R/extensions.R: Idem * R/has.R (._has_enum_name): Idem * R/internals.R (readProtoFiles): Idem * R/merge.R: Idem * R/with.R (generateActiveBindings): Idem * R/has.R (._has_enum_name): Use PACKAGE= in .Call() 2017-02-26 David Kretch * vignettes/RProtoBuf-intro.Rnw: Several small corrections 2017-01-19 Dirk Eddelbuettel * configure.ac: Renamed from configure.in, minor edit 2017-01-18 Dirk Eddelbuettel * configure.in: Updated and simplified in a few places as we no longer need m4 macros for C++0x or Rscript for Rcpp library query * configure: Re-generated accordingly * src/Makevars.in: Set CXX_STD=CXX11 * m4/m4-ax_cxx_compile_stdcxx_0x.m4: Removed * cleanup: remove autoconf cache 2017-01-17 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Relase 0.4.8 2017-01-16 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version and date * tools/winlibs.R: Use proto3 library from rwinlib repo * src/Makevars.win: Update to proto 3.0.0 paths * inst/unitTests/runit.proto3.R: New test file * inst/unitTests/data/proto3.proto: Support for new test file 2016-10-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.7 2016-10-24 Dirk Eddelbuettel * DESCRIPTION (Version): Roll minor version and date * src/lookup.cpp: Replace omegahat.org with omagehat.net * vignettes/RProtoBuf-paper.bib: Ditto 2016-09-09 Dirk Eddelbuettel * DESCRIPTION (Version, Date): New release 0.4.6 * README.md: Expanded, added three short sections 2016-09-08 Dirk Eddelbuettel * inst/NEWS.Rd: Ditto, also replace \cpkg{} with \CRANpkg{} * README.md: Use https for CRAN URL 2016-09-06 Dirk Eddelbuettel * vignettes/RProtoBuf-paper.Rnw: Comment-out the use of the \DOI macro from (updated) jss.cls: cannot ship jss.cls (or R will warn) and cannot use \DOI as (as R-release and older do not know \DOI) 2016-09-01 Dirk Eddelbuettel [ Entry for anonymous PR #18 by 'oliverbock' ] * R/rexp_obj.R (unrexp_string): Ensure zero-length strings can be serialized; special case of native encoding for S4 objects * inst/unitTests/runit.serialize_pb.R: New tests 2016-08-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): New release 0.4.5 2016-08-16 Dirk Eddelbuettel * DESCRIPTION (SystemRequirements): Add explicit note that Protocol Buffers 3.0.0 are supported as well 2016-08-15 Dirk Eddelbuettel * DESCRIPTION (Version): Rolling minor version * inst/proto/addressbook.proto: Added 'syntax = "proto2";' * inst/proto/helloworld.proto: Idem * inst/proto/rexp.proto: Idem * inst/unitTests/data/bytes.proto: Idem * inst/unitTests/data/encoding.proto: Idem * inst/unitTests/data/nested.proto: Idem * inst/unitTests/data/unittest.proto: Idem * inst/unitTests/data/unittest_import.proto: Idem * vignettes/proto/int64.proto: Idem * inst/unitTests/runit.addressbook.R (test.ascii): Comment-out one sub-test concerned with access under bad file modes 2016-08-13 Dirk Eddelbuettel * .travis.yml: Switch to using run.sh for Travis CI, also switch to using a build matrix across ProtoBuf versions 2 and 3 2016-07-19 Craig Radcliffe * configure.in: Make sure that CXXFLAGS is from the environment when writing to src/Makevars 2016-07-10 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.4.4 * vignettes/RProtoBuf-paper.Rnw: Added, based on pending JSS publication * vignettes/RProtoBuf-paper.bib: Ditto * vignettes/figures/*: Ditto * vignettes/proto/*: Ditto * vignettes/jss.cls: Ditto * vignettes/jss.bst: Ditto * inst/CITATION: Update to version provided by JSS * README.md: Updated to use of canonical URLs for CRAN 2016-05-19 Dirk Eddelbuettel * vignettes/RProtoBuf-unitTests.Rnw: Do not write unit test results to /tmp per request from CRAN to not write outside test directories 2016-04-26 Dirk Eddelbuettel * CONTRIBUTING.md: New workflow document 2016-04-25 Jeroen Ooms * R/rexp_obj.R: Fix zero-length edge case * R/serialize_pb.R: Improved documentation * man/serialize_pb.Rd: Ditto 2016-04-21 Jeroen Ooms * src/Makevars.win: Accomodate new Windows toolchain 2016-04-21 Jonathon Love * inst/unitTests/runit.addressbook.R: Set to mode 0644 * inst/unitTests/runit.bytes.R: Ditto 2016-02-11 Dirk Eddelbuettel * DESCRIPTION (License): Set to GPL (>= 2) which is what the code files with actual copyright and license headers had all along * README.md: Idem 2015-08-25 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.4.3 2015-08-24 Dirk Eddelbuettel * README.md: Additional badges * inst/unitTests/runit.FieldDescriptor.R: Added msg field 2015-08-23 Dirk Eddelbuettel * tools/winlibs.R: Actually tests against R 3.3.0 2015-08-23 Jeroen Ooms * tools/winlibs.R: Test for R 3.3.0 on Windows 2015-08-23 Dirk Eddelbuettel * NAMESPACE: Added imports for as and is from methods * DESCRIPTION: Removed several of the (largely redundant) URLs, and minor edits in Description: to update to current standard * man/RProtoBuf-package.Rd: Updated, removed old URLs. * .travis.yml: Accelerate by installing dependencies via apt-get 2015-08-05 Balasubramanian Narasimhan * NAMESPACE: Added import for show from methods package 2015-07-08 Jeroen Ooms * tools/winlibs.R: Update URL to windows build of the required ProtoBuf library 2015-01-16 Dirk Eddelbuettel * DESCRIPTION: Minor edits 2015-01-16 Jeroen Ooms * DESCRIPTION: Make SystemRequirements: more explicit 2014-12-11 Jeroen Ooms * DESCRIPTION: Update URLs 2014-12-10 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.4.2 2014-12-10 Jeroen Ooms * src/Makevars.win: Use new ProtoBuf 2.6.1 builds on Windows * tools/winlibs.R: Helper function used for Windows build * inst/unitTests/runit.int64.R: Fixed a windows bug 2014-12-08 Jeroen Ooms * inst/proto/rexp.proto: Add a new type 'native' * R/rexp_obj.R: Modify (un)serialize_pb to serialize() non-data types as 'native' types 2014-12-04 Dirk Eddelbuettel * .travis.yml: Added after move to GitHub * README.md: Added minimal first version with Travis badge 2014-12-04 Murray Stokely * inst/unitTests/runit.int64.R: restore options on exit from this function to make the test indempotent. 2014-12-01 Dirk Eddelbuettel * man/Message-class.Rd: Completed documentation * man/Descriptor-class.Rd: Ditto * man/EnumDescriptor-class.Rd: Ditto 2014-12-01 Murray Stokely * R/wrapper_ZeroCopyInputStream.R: Avoid file.create for getting absolute path of a temporary file name (JSS reviewer feedback) * R/serialize.R: Idem. 2014-11-26 Murray Stokely Address feedback from anonymous reviewer for JSS to make this package more complete: * inst/unitTests/runit.serialize_pb.R: Add a test to verify that we can serialize all 100+ built-in datasets with R and get an identical object to the original once unserialized. * R/rexp_obj.R: Serialize function, language, and environment objects by just falling back to R's native serialization and using raw bytes to store them. This at least lets us round-trip encode all native R types, even though these three only make sense in the context of R. Greatly simplify the can_serialize_pb function. * inst/proto/rexp.proto: Add support for function, language, and environment objects. 2014-11-25 Dirk Eddelbuettel * vignettes/RProtoBuf-intro.Rnw: Applied a few corrections spotted by Tim Hesterberg and communicated in email. 2014-11-24 Murray Stokely * inst/unitTests/runit.golden.message.R: remove trailing whitespace. * man/P.Rd: Improve output of example. 2014-09-15 Murray Stokely Address feedback from anonymous reviewers for our Journal of Statistical Software submission: * src/wrapper_EnumDescriptor.cpp (rprotobuf): Correct the definition of as.list for EnumDescriptors to return a proper list instead of a named vector. * man/aslist.Rd: clarify order of returned list for descriptor objects. * NAMESPACE: add names as exported method. * R/00classes.R (show): Update the default print methods to use cat() with fill=TRUE instead of show() to eliminate the confusing [1] since the classes in RProtoBuf are not vectorized. * Make Descriptor and EnumDescriptor objects subsettable with "[[". * Add length() method for Descriptor objects. * Add names() method for Message, Descriptor, and EnumDescriptor objects. * inst/unitTests/runit.enums.R (test.enums): Add test of subsetting an EnumDescriptor object. * inst/unitTests/runit.descriptors.R (test.descriptor): Add test for subsetting of descriptor objects. * DESCRIPTION (Version): Increment. 2014-04-02 Murray Stokely Two patches from Karl Millar : * src/S4_classes.h (rprotobuf): Change handling of S4_EnumDescriptor when passed a NULL pointer to just create empty object with empty name and full_name rather than setting to R_NilValue. * src/wrapper_EnumDescriptor.cpp (rprotobuf): Change return value of getValue* functions on EnumDescriptor and return an EnumValueDescriptor or R_NilValue on failure. 2014-04-01 Murray Stokely * tests/runUnitTests.R: Add improved checks to ensure R CMD CHECK fails if there are any errors in the tests, not just failures. 2014-03-25 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.4.1 2014-03-24 Murray Stokely * inst/unitTests/runit.int64.R (test.int64): Check Rcpp:::capabilities() to ensure we have long long support in Rcpp before trying to run the 64-bit integer tests. * inst/unitTests/data/unittest.proto: Comment out TestEnumWithDupValue. This causes problems with the newest libprotobuf-2.5 which now wants an option to be specified to enable enum aliasing like this. * configure.in: if we can't find the libproto headers with the default CPPFLAGS/CXXFLAGS, manually add /usr/local/include and try again. 2014-03-10 Murray Stokely * src/DescriptorPoolLookup.cpp (rprotobuf): Import all top-level enums defined in an imported .proto file. * src/rprotobuf.cpp (rprotobuf): Add a function to get the enum descriptor associated with a named enum. * inst/unitTests/runit.enums.R (test.enums): Test that we import top-level enums from .proto files correctly. * R/00classes.R (P): Correct a bug in the show() method for EnumDescriptor that prevented useful output in some contexts. 2014-02-21 Murray Stokely * inst/unitTests/runit.messages.R (test.message): Add a test for the deprecated group feature which works fine with RProtoBuf. The type is converted to lower case, which users often forget. * vignettes/RProtoBuf-intro.Rnw (subsection{Deprecated Feature: Protocol Buffer Groups}): document groups. * inst/CITATION: Add a manual CITATION file pointing to the preprint on arxiv.org in addition to the normal auto-generated citation(). 2014-01-19 Dirk Eddelbuettel * DESCRIPTION: Finalize release 0.4.0 with initial Windows support * src/S4_classes.h: Adapt to S4 access function renaming in Rcpp 0.10.7 and later, with special thanks to Kevin Ushey 2014-01-13 Murray Stokely * inst/unitTests/runit.int64.R (test.int64): Skip this test with a warning if running on a machine with sizeof(long long) < 8. * vignettes/RProtoBuf-intro.Rnw (subsection{64-bit integer issues}): Hide 64-bit field accesses with if conditional to avoid running code that won't work on platforms without 64-bit long longs. * DESCRIPTION (Version): Increment to 0.4.0 2014-01-09 Murray Stokely * R/read.R: Add a logical argument 'partial' to readASCII that accepts uninitialized message fragments. * src/wrapper_Descriptor.cpp (rprotobuf): Idem * inst/unitTests/runit.addressbook.R (test.ascii): Add tests for above. 2014-01-04 Murray Stokely * R/wrapper_CodedInputStream.R: Accept numeric size arguments for ReadRaw and ReadString to make this more user friendly for interactive use by calling as.integer() as needed. * R/00classes.R (P): Add missing object prameters in ZeroCopyInputStream calls to ReadRaw and ReadString. * inst/unitTests/data/encoding.proto: Add example messages used in the encoding documentation. * inst/unitTests/runit.serialize.R (test.encoding): Add tests verifying the exact byte serialization as described in the encoding documentation. (test.arrayinputstream): Add new test of ArrayInputStreams. * src/wrapper_ZeroCopyInputStream.cpp (rprotobuf): Add BEGIN/END_RCPP macros to gracefully catch exceptions and return them as R language errors. * src/streams.cpp (rprotobuf): Idem. * man/ArrayInputStream-class.Rd: Add some examples of using ArrayInputStream. 2014-01-04 Dirk Eddelbuettel * src: Deprecate files SocketCopyingInputStream.{cpp,h}, sisocks.h as the current RProtoBuf design does not provide networking capabilities 2013-12-31 Murray Stokely * src/wrapper_Message.cpp: Fix type coercion bug in add() method for uint32s and add a missing break statement that erroneously raised an error when setting some int64 fields. Make more function arguments const and remove a superfluous BEGIN_RCPP/END_RCPP. Also add comment about long-vector support. All of these fixes were highlighted by Flexelint. * inst/unitTests/runit.int64.R (test.int64): Add tests for above. * inst/unitTests/runit.extremevalues.R (test.uint32): Idem. * src/wrapper_FieldDescriptor.cpp (RPB_HANDLE_CASE): Remove unreachable statement in a macro. * src/wrapper_Descriptor.cpp (rprotobuf): Remove unused variable, rename another variable for clarity, and add some TODOs. * src/wrapper_FileDescriptor.cpp (rprotobuf): Idem. * src/DescriptorPoolLookup.cpp (rprotobuf): Remove unreachable statement. * src/extensions.cpp: Remove unused header. * src/mutators.cpp (rprotobuf): Update code to check for Long vectors and use the safer R_xlen_t type everywhere. Protocol Buffers repeated fields seem to be limited to int size indices as with normal R vectors. * src/rprotobuf.h: Idem 2013-12-30 Murray Stokely * inst/unitTests/runit.extremevalues.R (test.uint32): Add test verifying that we can store 2^32 - 1 properly in repeated or optional protobuf fields. * src/extractors.cpp (rprotobuf): Correct handling of uint32 for repeated fields. * src/wrapper_Message.cpp (rprotobuf): Remove Rf_error in favor of Rcpp_error so that we throw an exception and unwind the stack to deallocate objects before jumping to R's error. * src/DescriptorPoolLookup.cpp (rprotobuf): Idem. * R/size.R: Correct an incorrect method name that prevented size<- from working. * man/size.Rd: Document the behavior of size<- * (C++): Ran all the C++ files and most of the headers through clang-format as described in the STYLE file on R-Forge. Basically, we now use 4-char indents and 100-char limit for line wrap. 2013-12-28 Murray Stokely * src/extractors.cpp (rprotobuf): Correct handling of uint32 for single values greater than 2^31 by returning as R numeric types to avoid losing precision since R doesn't have unsigned int types but C++ does. Works around an Rcpp bug https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1360&group_id=155&atid=637 2013-12-27 Murray Stokely * src/mutators.cpp: Refactor setMessageField into four separate functions, correct a few minor typos, and wrap everything in a try/catch block so we catch any exceptions generated by Rcpp::as or other functions and forward it along to an R-language stop() error instead of terminating our R instance. * src/mutators.cpp (rprotobuf): Add more helpful error message specifying which element of a list is of the wrong type, and what the expected type is, when setting a list of messages. * inst/unitTests/runit.messages.R (test.message): Add unit tests for our handling of setting repeated message fields. * src/wrapper_Message.cpp: Add const qualifier to field_desc throughout file. * src/exceptions.cpp: Remove ancient exceptions handling code, migrate codebase to use standard exception classes and helper functions from Rcpp. * R/exceptions.R (throw): idem. 2013-12-26 Murray Stokely * src/mutators.cpp: Support setting int32 values with character vectors of a decimal number, as we do by necessity for int64s. Also, refuse to set non-repeated bools to NA, just as we do for repeated bool fields by raising a stop() error since protocol buffer bools are 2-valued and NA is the third-value of R bools. * inst/unitTests/runit.int32.R (test.int32): Add tests for above. * NAMESPACE: Add missing export for .DollarNames EnumValueDescriptor to allow completion on that class. * R/00classes.R: Update FileDescriptor '$' dispatch to work properly for the names of fields defined in the FileDescriptor, instead of just returning NULL even for types returned by $ completion. * vignettes/RProtoBuf-intro.Rnw (subsubsection{Retrieve fields}): Update the type mapping tables to note that characters can be extracted from 64-bit integer types with the RProtoBuf.int64AsString type and note that int32 and int64 types can be set to character values representing decimal numbers. * TODO: Update todo list. * inst/unitTests/runit.bool.R (test.bool): Add more tests about boolean values, NA handling, etc. 2013-12-23 Murray Stokely * DESCRIPTION (Version): increment. * inst/proto/addressbook.proto: Reserved extension fields in tutorial.Person. * vignettes/RProtoBuf-intro.Rnw (subsection{Extensions}): Added a new section documenting protocol buffer extensions. 2013-12-20 Murray Stokely * R/00classes.R: Correct a bug that incorrectly dispatched as.character() when as.list() was called on Descriptor objects. 2013-12-18 Murray Stokely * R/completion.R (.DollarNames.EnumValueDescriptor): Add $-completion for EnumValueDescriptor and FileDescriptor classes as with other S4 RProtoBuf classes here. * R/00classes.R (P): Ensure that the FileDescriptor $name() method accepts a boolean for full paths just like the generic name() method. * R/wrapper_EnumDescriptor.R: Add better error checking. Expect exceptions if wrong types are provided for arguments rather than just returning NULL. 2013-12-18 Dirk Eddelbuettel * vignettes/RProtoBuf-intro.Rnw: Use with vignette builder * vignettes/RProtoBuf-quickref.Rnw: Idem * vignettes/RProtoBuf-unitTests.Rnw: Rewritten / simplified * DESCRIPTION: Increased dependency to R (>= 3.0.0) * configure.in: No longer create vignettes/Makefile 2013-12-17 Murray Stokely * R/completion.R (.DollarNames.Message): Add missing methods to dollar completion list for Message and Descriptor objects * vignettes/RProtoBuf/RProtoBuf.Rnw (subsection{messages}): Add missing methods to Table 2 (Messages) and add a table and new sections of methods for Descriptor objects. 2013-12-16 Dirk Eddelbuettel * src/rprotobuf.h (RCPP_ENUM_TRAITS): Don't use extern "C" on internal functions returning atomistic or C++ types 2013-12-15 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.3.2 * tests/runUnitTests.R: Minor rewrite and cleanup from doRUnit.R with a tip of the hat to Murray's version in his HistogramTools package 2013-12-14 Dirk Eddelbuettel * src/lookup.cpp (rprotobuf): Descrictor pools attached directly * R/lookup.R (attachDescriptorPool): No longer attach them here * src/rprotobuf.h: Updated function declaration 2013-12-14 Murray Stokely * src/mutators.cpp (rprotobuf): Fix a bug which incorrectly prevented users from setting raw non-repeated fields under some circumstances. * inst/unitTests/runit.bytes.R (test.all): Verify raw(10) can be set to required bytes fields to verify correct behavior for use case mentioned on rprotobuf-yada list. 2013-11-13 Murray Stokely * R/extensions.R: Give a user friendly error message if someone tries to set an extension to a message of the wrong type instead of causing a C++ check failure that terminates your R session. * inst/unitTests/runit.extensions.R (test.extension): Add test. 2013-10-23 Murray Stokely * src/lookup.cpp (rprotobuf): Remove stop() error in object table assignment as this was causing errors with the '<<-' operator in any code using RProtoBuf. * inst/unitTests/runit.import.R (test.assign.in.global): Add a test for the above. 2013-09-16 Murray Stokely * DESCRIPTION (Version): Increment to 0.3.1.1. * R/00classes.R: Improve show method for EnumValueDescriptor and add enum_type to '$' dispatch. * man/EnumValueDescriptor-class.Rd: Add examples and document missing methods. * src/wrapper_EnumValueDescriptor.cpp (rprotobuf): Add missing enum_type method. * inst/unitTests/runit.enums.R (test.enums): Add more tests. 2013-09-13 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.3.1 2013-09-13 Murray Stokely * vignettes/Makefile.in: Update configure to output R_HOME to the vignette makefile so we can avoid the use of a non-portable GNU makefile extension here. 2013-09-12 Murray Stokely * src/RcppMacros.h: Add Rcpp compatibility macros which are simplified versions of the now deprecated ones from Rcpp. 2013-09-11 Murray Stokely * configure.in: If pkg-config is not available add -lprotobuf to PKG_LIBS. This makes it easier to install on MacOS X 10.8, for example. 2013-09-06 Murray Stokely * src/rprotobuf.cpp (rprotobuf): Include the name of the field that could not be found in exceptions in getFieldDescriptor (errors from update / new, etc.). 2013-09-03 Murray Stokely * inst/NEWS.Rd: Summarize changes since the last release. * vignettes/RProtoBuf/RProtoBuf.Rnw: Add a new section on 64-bit issues, document the RProtoBuf.int64AsString option, break out the 'other approaches' section from the 'future work', and fix a few typos. 2013-08-30 Dirk Eddelbuettel * NAMESPACE: Import 'file_path_as_absolute' from package tools, and the two functions needed from the RCurl package * R/*R: Updated several files which no longer need 'tools:::' prefix * DESCRIPTION: Updated Depends: and Imports accordingly 2013-08-29 Murray Stokely * R/zzz.R (.onLoad): Rename option controlling int64 handling with package name prefix. * inst/unitTests/runit.int64.R (test.int64): Idem * src/extractors.cpp (rprotobuf): Add templated function to reduce code duplication in last changelist. * src/mutators.cpp (rprotobuf): Idem 2013-08-27 Murray Stokely * src/extractors.cpp (rprotobuf): Add support for a new option("int64AsString") that controls whether extractors for 64-bit integer fields return character strings or use Rcpp's default wrap type which coerces to numeric, possibly losing precision. * R/zzz.R (.onLoad): Initialize options("int64AsString" = FALSE). * src/Rcppsupport.h (rprotobuf): Add RepeatedFieldImporter classes for int64 and uint64 that return strings instead of int64s. * src/mutators.cpp (rprotobuf): Add support for setting int64 fields as R character vectors that are converted to int64 or uint64 C++ types with std::stringstream. This allows the user to get around the lack of 64-bit integer support in R when working interactively with RProtoBufs where a large precision number or identifier needs to be stored. * inst/unitTests/runit.int64.R: Add tests for the above. 2013-08-21 Murray Stokely * inst/unitTests/runit.addressbook.R (test.ascii): Add more tests. * src/wrapper_Descriptor.cpp (rprotobuf): Add better error handling for readASCII of text strings rather than returning an empty proto. * R/extensions.R: Add checks to ensure that a valid extension FieldDescriptor is passed to getExtension and setExtension. * inst/unitTests/runit.int64.R (test.int64): Add a test illustrating how RProtoBuf is broken in handling 64-bit integers (commented out for now). * man/P.Rd: Document behavior for extensions. * inst/unitTests/runit.extensions.R (test.extension): Add more tests. * src/wrapper_Message.cpp (rprotobuf): Add function for returning the number of extensions set in this message, to improve show() output. * src/rprotobuf.cpp (rprotobuf): Add support for looking up extensions by name and returning FieldDescriptors. * R/00classes.R (P): Add support for returning extension descriptors. 2013-07-14 Dirk Eddelbuettel * inst/unitTests/runit.extensions.R (test.extension): Comment-out test for setExtension against enum, at least for now * vignettes/RProtoBuf/RProtoBuf.Rnw: Added Murray to Authors, at last * vignettes/RProtoBuf-unitTests.Rnw: Idem * vignettes/RProtoBuf-quickref/RProtoBuf-quickref.Rnw: Idem 2013-07-13 Murray Stokely * inst/NEWS.Rd: Summarize new features since the last CRAN release last year. * DESCRIPTION: Increment version to 0.3. 2013-07-13 Dirk Eddelbuettel * man/Message-class.Rd: Added \alias entries for getExtension and setExtension * DESCRIPTION: Incremented Version to separate current test builds from previous release * DESCRIPTION: Removed 'MinimumLibProtoVersion: 2002000' which we no longer need as that version of Protocol Buffers was released a rather long time ago * R/zzz.R: Check for minimal version is now commented-out 2013-07-12 Murray Stokely * src/extensions.cpp: Replace custom extractor and mutator with call to existing functions in mutators.cpp and extractors.cpp that can be used for extensions and any other field type. * src/extensions.R: Idem * vignettes/RProtoBuf/RProtoBuf.Rnw: Document getExtension, setExtension methods. * man/Message-class.Rd: Idem * src/rprotobuf.h: Remove unused desc argument to extractFieldAsSEXP. * src/extractors.cpp: Idem * inst/unitTests/runit.extensions.R: Add additional tests for nested enum and message type extensions. 2013-07-11 Murray Stokely * R/extensions.R: Implement getExtension, setExtension methods. * src/extensions.cpp: Implement getExtension, setExtension. * R/set.R: Add a TODO noting these functions are undocumented. * R/00classes.R: Add setExtension, getExtension extractors for message objects. * R/completion.R: Add setExtension, getExtension. * NAMESPACE: Add setExtension, getExtension. * src/DescriptorPoolLookup.cpp: Add top-level extensions to descriptor pool. * src/rprotobuf.h: Add helper function for getting field descriptor objects. * src/wrapper_FileDescriptor.cpp: Add support for extensions to getMemberNames and as_list * src/lookup.cpp: Add support for looking up extensions. * inst/unitTests/runit.extensions.R: Add basic test for the above. 2013-07-10 Murray Stokely * man/aslist.Rd: Document behavior for enum and file descriptors and be more sparing with \dontrun in examples. * man/EnumDescriptor-class.Rd: Be more sparing with \dontrun in examples so we run more test code. * man/add.Rd: Idem * man/clone.Rd: Idem * man/Descriptor-class.Rd: Idem * man/FieldDescriptor-class.Rd: Idem * man/FileDescriptor-class.Rd: Idem * man/is_extension.Rd: Idem * man/label.Rd: Idem * man/Message-class.Rd: Idem * man/number.Rd: Idem * man/P.Rd: Idem * man/readProtoFiles.Rd: Idem * man/type.Rd: Idem * man/with.Rd: Idem * man/RProtoBuf-package.Rd: Idem 2013-07-08 Murray Stokely * R/has.R: add a has method for EnumDescriptor objects to return a logical indicating if the named constant exists or not. * R/00classes.R: fix a typo that prevented the length method from working properly for EnumDescriptor objects. Use this functionality to add the number of constants in the show method for EnumDescriptors. * R/wrapper_EnumValueDescriptor.R: add a number method to return the numeric value of this enum constant. * man/has.Rd: Add example of the above. * man/number.Rd: Add example of the above. * man/EnumDescriptor-class.Rd: Add example of the above. * man/EnumValueDescriptor-class.Rd: Add example of the above. 2013-02-21 Murray Stokely * R/00classes.R: add filename and package slots to FileDescriptor S4 class and provide more user-friendly show() methods for Messages and FileDescriptors that provide more context about the contained data. * src/S4_classes.h: populate package and filename slots when a FileDescriptor is created based on fields from the underlying C++ object. * inst/unitTests/runit.addressbook.R: add a basic test for FileDescriptors. * man/FileDescriptor-class.Rd: document the new slots in FileDescriptor and add examples. 2012-10-03 Murray Stokely * src/mutators.cpp (rprotobuf): Fix bug where LENGTH() is used on non-vectors when setting a repeated message field to a single Message object. This caused non-deterministic behavior after memory was read from a random location. * inst/unitTests/runit.golden.message.R (test.repeatedFields): Add tests for this case. 2012-09-25 Dirk Eddelbuettel * man/is_extension.Rd: Use \dontrun on examples as we cannot reload the same proto file twice * man/label.Rd: Idem * man/number.Rd: Idem * man/type.Rd: Idem 2012-09-24 Murray Stokely * R/has.R: Distinguish between non-existant and not-set fields in a message by returning NULL in the former case. * R/00classes.R: Idem * src/wrapper_Message.cpp (rprotobuf): Idem * inst/unitTests/runit.golden.message.R (test.has): Add test. * man/has.Rd: Add example of the above. 2012-09-21 Murray Stokely * Fix a bug causing segfaults in containing_type(). * R/containing_type.R: Return NULL instead of invalid descriptors when there is no containing type for an object. * src/S4_classes.h: Check for NULL pointers in the contructors for S4_Descriptor and S4_EnumDescriptor as these methods are called on the return value of e.g. containing_type() in the protobuf API without checking the return alue. * man/containing_type-methods.Rd: Add examples section showing cases where there is and is not a containing_type. * inst/unitTests/runit.FieldDescriptor.R (test.FieldDescriptor.class): Add tests for the above. 2012-08-21 Murray Stokely * src/mutators.cpp: Add better input checking when setting an optional field to avoid an uncaught exception that would kill the R session, and add a test. * inst/unitTests/runit.golden.message.R (test.invalidAssignments): Add test for this. 2012-08-18 Dirk Eddelbuettel * Applied two more patches by Murray and Karl: - Make readASCII() more robust to error conditions; adds tests to catch them. - Correct type(), cpp_type(), and label() methods when as.string=TRUE; add unit tests for these methods, add examples to the Rd files for these methods, and adds type and cpp_type to the NAMESPACE file where they were previously absent. 2012-08-09 Dirk Eddelbuettel * Applied two more patches by Murray: - R/wrapper_FieldDescriptor.R: correct more '_' and '__' mismatches - man/*: update manual pages for style, add examples - src/mutators.cpp: fix bug in handling of NA in boolean vectors - inst/unitTests/runit.golden.message.R: add unit test 2012-08-08 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.5 * src/mutators.cpp: Applied patch by Murray to correctly deal with nested protocol buffer definitions * inst/unitTests/runit.nested.R: Added test from Murray * inst/unitTests/data/nested.proto: Nested protbuf def from Murray * R/serialize.R: Added patch by Murray to not serialize uninitalized protocol buffers (with missing required fields) * inst/unitTests/runit.serialize.R: Added tests for this * /man/add.Rd: Add patch by Murray for stylistic improvement and added examples * inst/NEWS.Rd: Converted NEWS file to .Rd format * DESCRIPTION: Changed Maintainer: to single person per CRAN Policy * vignettes/: Moved from inst/doc/ per CRAN Policy 2012-05-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.4 * R/zzz.R (.onLoad): pass lib.loc=libname to readProtoFiles * R/internals.R (readProtoFiles): use lib.loc argument * man/readProtoFiles.Rd: Document new lib.loc argument 2012-05-14 Dirk Eddelbuettel * R/lookup.R: comment-out unlockBinding() which R CMD check does not like as it turns out that we do not need it here anyway * inst/unitTests/runit.addressbook.R (test.ascii): Small correction by converting to character before comparing * DESCRIPTION: Remove Depends: on int64 which is no longer used, lower Depends: on Rcpp to 0.9.6 which should be sufficient 2012-05-13 Dirk Eddelbuettel * src/rprotobuf.h: Added '#include ' to make g++-4.7 happy * src/*: Reversed out SVN revisions 426 to 434 related to int64 2012-04-07 Dirk Eddelbuettel * R/zzz.R: Add 'lib.loc=libname' to packageDescription() call as requested by Brian Ripley 2012-03-20 Dirk Eddelbuettel * Applied another patch by Murray: - src/mutators.cpp: Deal with case of repeated strings - inst/unitTests/runit.golden.message.R: test for this case 2011-07-17 Dirk Eddelbuettel * Applied another patch by Murray: - src/wrapper_Descriptor.cpp: Add missing readASCIIFromConnection C++ function that was called in read.R but not defined. - R/read.R: Remove an _ in the readASCII C++ functions to match the naming convention of the other nearby functions. - man/readASCII.Rd: Add examples of ascii export/import of messages. - inst/unitTests/runit.addressbook.R: Add tests of ascii export/import of messages. 2011-07-07 Dirk Eddelbuettel * src/wrapper_FileDescriptor.cpp (rprotobuf): Applied patch by Murray to correct a cut & paste error in variable name 2011-04-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.3 2011-04-10 Dirk Eddelbuettel * src/extractors.cpp: Protect UINT64 and INT64 inside of #ifdef test for RCPP_HAS_LONG_LONG_TYPES which we now need for g++ 4.5 or later * src/mutators.cpp: Idem * wrapper_FieldDescriptor.cpp: Idem 2011-04-05 Dirk Eddelbuettel * inst/doc/Makefile: Call R and Rscript relative to R_HOME/bin 2011-04-04 Dirk Eddelbuettel * inst/doc/Makefile: Do not call clean in all target 2011-01-12 Dirk Eddelbuettel * R/with.R: Use envir= argument to eval() 2011-01-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.2 * inst/THANKS: Added new file to say Thanks! 2011-01-10 Dirk Eddelbuettel * Applied another patch by Murray Stokely providing: - R/internals.R: generalise readProtoFiles() adding 'pattern' arg - man/readProtoFiles.Rd: documenting new 'pattern' argument - src/DescriptorPoolLookup.cpp: enhanced error message - inst/unitTests/runit.golden.message.R: new unit test for repeated fields fixed (which was issue addressed earlier) - inst/runit.import.R: new unit test for non-existing file 2011-01-07 Dirk Eddelbuettel * Applied patch by Murray Stokely providing all the following: - src/S4_classes.h: new 'name' and 'full_name' slots - R/00classes.R: idem - R/wrapper_EnumDescriptor.R: fix typo now permitting function call - src/wrapper_EnumDescriptor.cpp: add a bounds check - src/wrapper_EnumValueDescriptor.cpp: add a new name method - inst/unitTests/runit.enums.R: add new unit test * man/EnumValueDescriptor-class.Rd: Add documentation for name and full_name 2010-10-20 Dirk Eddelbuettel * inst/doc/Makefile: do not remove the pdf in 'clean' * inst/unitTests/runit.addressbook.R: stick 'book' into global env. 2010-10-18 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.1 * ChangeLog: moved from inst/ * inst/NEWS: moved from top-level to that it gets installed with package 2010-10-13 Dirk Eddelbuettel * src/*: applied patch by Koert Kuipers to support raw bytes * inst/unitTests/runit.bytes.R: also added unit test by Koert 2010-09-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.0 2010-09-10 Romain Francois * man/readASCII.Rd: Rd documentation for readASCII 2010-08-20 Romain Francois * R/read/.R: New readASCII method 2010-08-12 Romain Francois * src/*: restore R CMD check 2010-08-04 Dirk Eddelbuettel * inst/unitTests/runit.addressbook.R: start of new unit tests 2010-07-30 Romain Francois * src/*: correct many small errors so that the vignette builds again 2010-02-02 Dirk Eddelbuettel * configure.in: More rigorous checks for ProtoBuf headers, library, mininal version as well as availability of pkg-config. 2010-02-01 Dirk Eddelbuettel * inst/ChangeLog: added 2010-02-01 Romain Francois * Release 0.1-0 * [r274] /pkg/man/RProtoBuf-package.Rd: tidying up * [r273] /pkg/inst/doc/unitTests-results: * [r272] /pkg/inst/doc/unitTests/RProtoBuf-unitTests.R: minor cleanups for the unit test vignette (same as in Rcpp) * [r271] /pkg/DESCRIPTION, /pkg/inst/doc/unitTests/RProtoBuf-unitTests.R: OS_type: unix (for now) * [r270] /pkg/DESCRIPTION: version bump to 0.1-0 * [r269] /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.R[DEL], /pkg/inst/doc/RProtoBuf-unitTests.Rnw, /pkg/inst/doc/unitTests, /pkg/inst/doc/unitTests/RProtoBuf-unitTests.R: minor cleanups for the unit test vignette (same as in Rcpp) 2010-01-23 Romain Francois * [r268] /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.R, /pkg/inst/doc/RProtoBuf-unitTests.Rnw, /pkg/inst/doc/RProtoBuf-unitTests.Rnw.brew[DEL]: borrow simpler unit test vignette from Rcpp 2010-01-11 Romain Francois * [r267] /pkg/DESCRIPTION, /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/rprotobuf.h: adapt to Rcpp::wrap 2009-12-29 Romain Francois * [r266] /pkg/DESCRIPTION, /pkg/inst/unitTests/runit.golden.message.R, /pkg/src/DescriptorPoolLookup.cpp: adapt to recent changes in Rcpp 2009-12-27 Romain Francois * [r265] /pkg/inst/unitTests/data/unittest.proto, /pkg/inst/unitTests/runit.golden.message.R, /pkg/src/constructors.cpp, /pkg/src/lookup.cpp: enum might not have containing types, which used to bomb new_RS4_EnumDescriptor. fixed and unit tested * [r264] /pkg/inst/doc, /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.Rnw.brew: a bug in .tearDown prevented the unit tests from working properly 2009-12-26 Romain Francois * [r263] /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.Rnw.brew, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/inst/unitTests/runit.golden.message.R[CPY], /pkg/inst/unitTests/runit.golden_message.R[DEL]: force cleaning pdfs before vignette creation * [r262] /pkg/src/lookup.cpp: not sorting manually anymore since std::set does it for free * [r261] /pkg/inst/unitTests/runit.draft.R[DEL], /pkg/inst/unitTests/runit.error.R[DEL], /pkg/inst/unitTests/runit.golden_message.R: started adding some proper tests * [r260] /pkg/DESCRIPTION, /pkg/src/DescriptorPoolLookup.cpp: using Rcpp >= 0.7.0.2 * [r259] /pkg/R/internals.R, /pkg/inst/unitTests/data/unittest.proto, /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/DescriptorPoolLookup.h, /pkg/src/RSourceTree.cpp, /pkg/src/RSourceTree.h, /pkg/src/RWarningErrorCollector.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: fixed importing and use set in DescriptorPoolLookup * [r258] /pkg/inst/doc/Makefile, /pkg/inst/unitTests/data, /pkg/inst/unitTests/data/unittest.proto, /pkg/inst/unitTests/data/unittest_import.proto: added utils as default package in vignette makefile 2009-12-26 Dirk Eddelbuettel * [r257] /pkg/tests/doRUnit.R: wd var no longer needed either 2009-12-26 Romain Francois * [r256] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/cleanup, /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.Rnw[DEL], /pkg/inst/doc/RProtoBuf-unitTests.Rnw.brew, /pkg/inst/unitTests/runTests.R, /pkg/inst/unitTests/runit.draft.R, /pkg/inst/unitTests/runit.error.R, /pkg/tests/doRUnit.R: revised display of information in unit test vignette * [r255] /pkg/NAMESPACE, /pkg/R/unit_tests.R, /pkg/inst/doc/RProtoBuf-unitTests.Rnw, /pkg/inst/unitTests, /pkg/inst/unitTests/runTests.R, /pkg/inst/unitTests/runit.draft.R, /pkg/tests, /pkg/tests/doRUnit.R: prepare for unit testing * [r254] /pkg/DESCRIPTION, /pkg/src/as.cpp, /pkg/src/rprotobuf.h: remove the external_pointer experiment (now in package CPP) 2009-12-24 Dirk Eddelbuettel * [r253] /pkg/src/ConnectionCopyingOutputStream.cpp, /pkg/src/ConnectionInputStream.cpp, /pkg/src/ConnectionOutputStream.cpp, /pkg/src/as.cpp, /pkg/src/rprotobuf.cpp: as.cpp: comment out unused rcpp namespace to fix odd "does not build on amd64" issue found by Saptarshi other files: minimal tweaks to shut 'g++ -Wall' up 2009-12-22 Romain Francois * [r252] /pkg/src/rprotobuf.h: .3 2009-12-20 Romain Francois * [r251] /pkg/DESCRIPTION, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/as.cpp, /pkg/src/rprotobuf.h: start to use Rcpp 0.7.0 features 2009-12-19 Romain Francois * [r250] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/src/rprotobuf.h: more completion for streams, and removed debugging messages which resulted in vignette crashing 2009-12-18 Romain Francois * [r249] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_CodedOutputStream.R, /pkg/man/ZeroCopyOutputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: added methods for ZeroCopyOutputStream (actually using CodedOutputStream) 2009-12-17 Romain Francois * [r248] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/wrapper_CodedInputStream.R, /pkg/R/wrapper_CodedOutputStream.R, /pkg/man/ZeroCopyOutputStream-class.Rd, /pkg/man/completion.Rd, /pkg/src/streams.cpp: +WriteRaw.ZeroCopyOutoutStream and added completion for ZeroCopy{In,Out}outStream * [r247] /pkg/NAMESPACE, /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ReadVarint64 2009-12-16 Romain Francois * [r246] /pkg/NAMESPACE, /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ReadLittleEndian{32,64} * [r245] /pkg/NAMESPACE, /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ReadVarint32 * [r244] /pkg/NAMESPACE, /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ReadString * [r243] /pkg/src/rprotobuf.h: passing R CMD check again. solved problem related to finalization of Message* * [r242] /pkg/inst/doc/RProtoBuf-unitTests.Rnw[DEL]: * [r241] /pkg/inst/doc/RProtoBuf-unitTests.Rnw: * [r240] /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ArrayInputStream-class.Rd, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/set.cpp, /pkg/src/streams.cpp: passing R CMD check again. solved problem related to finalization of Message* * [r239] /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: finalizer for messages * [r238] /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: also use ZeroCopyOutputStreamWrapper * [r237] /pkg/R/wrapper_CodedInputStream.R, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: using ZeroCopyInputStreamWrapper * [r236] /pkg/src/ZeroCopyOutputStreamWrapper.cpp, /pkg/src/ZeroCopyOutputStreamWrapper.h: + ZeroCopyOutputStreamWrapper C++ class * [r235] /pkg/src/ZeroCopyInputStreamWrapper.cpp, /pkg/src/ZeroCopyInputStreamWrapper.h, /pkg/src/streams.cpp: added ZeroCopyInputStreamWrapper that wraps together a zcis and a cis, so that there is no need to create a cis each time 2009-12-15 Romain Francois * [r234] /pkg/NAMESPACE, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: added ReadRaw.ZeroCopyInputSytream * [r233] /pkg/src/ConnectionCopyingInputStream.cpp, /pkg/src/ConnectionCopyingInputStream.h, /pkg/src/ConnectionCopyingOutputStream.cpp, /pkg/src/ConnectionCopyingOutputStream.h, /pkg/src/ConnectionInputStream.cpp, /pkg/src/ConnectionInputStream.h, /pkg/src/ConnectionOutputStream.cpp, /pkg/src/ConnectionOutputStream.h, /pkg/src/read.cpp, /pkg/src/streams.cpp: rework Connection{In,Out}putStream * [r232] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ConnectionInputStream-class.Rd, /pkg/man/ConnectionInputStream-methods.Rd, /pkg/man/ConnectionOutputStream-class.Rd, /pkg/man/ConnectionOutputStream-methods.Rd, /pkg/src/ConnectionInputStream.cpp, /pkg/src/ConnectionInputStream.h, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: added (R side of and not yet functional, but hey) Connection{In,Out}putStream classes and methods 2009-12-14 Romain Francois * [r231] /pkg/man/Descriptor-class.Rd[CPY], /pkg/man/EnumDescriptor-class.Rd[CPY], /pkg/man/EnumValueDescriptor-class.Rd[CPY], /pkg/man/FieldDescriptor-class.Rd[CPY], /pkg/man/FileDescriptor-class.Rd[CPY], /pkg/man/Message-class.Rd[CPY], /pkg/man/MethodDescriptor-class.Rd[CPY], /pkg/man/ServiceDescriptor-class.Rd[CPY], /pkg/man/protobufDescriptor-class.Rd[DEL], /pkg/man/protobufEnumDescriptor-class.Rd[DEL], /pkg/man/protobufEnumValueDescriptor-class.Rd[DEL], /pkg/man/protobufFieldDescriptor-class.Rd[DEL], /pkg/man/protobufFileDescriptor-class.Rd[DEL], /pkg/man/protobufMessage-class.Rd[DEL], /pkg/man/protobufMethodDescriptor-class.Rd[DEL], /pkg/man/protobufServiceDescriptor-class.Rd[DEL]: remove the 'protobuf' prefix of Rd file names * [r230] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/FileInputStream-class.Rd, /pkg/man/FileInputStream-methods.Rd, /pkg/man/FileOutputStream-class.Rd, /pkg/man/FileOutputStream-methods.Rd, /pkg/man/GetErrno-methods.Rd, /pkg/man/SetCloseOnDelete-methods.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +File{In,Out}putStream classes and methods * [r229] /pkg/NAMESPACE, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ArrayOutputStream-class.Rd, /pkg/man/ArrayOutputStream-methods.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ArrayOutputStream class and constructor method 2009-12-12 Romain Francois * [r228] /pkg/R/wrapper_ZeroCopyInputStream.R: added some invisible's * [r227] /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ArrayInputStream-class.Rd, /pkg/man/ArrayInputStream-methods.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: allow block size for ArrayInputStream * [r226] /java/src/org/rproject/rprotobuf/ProtobufHttpServer.java, /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ArrayInputStream-class.Rd, /pkg/man/ArrayInputStream-methods.Rd, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/man/ZeroCopyOutputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ArrayInputStream class 2009-12-11 Romain Francois * [r225] /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/man/ZeroCopyOutputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ZeroCopyOutputStream S4 class * [r224] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/BackUp-methods.Rd, /pkg/man/ByteCount-methods.Rd, /pkg/man/Next-methods.Rd, /pkg/man/Skip-methods.Rd, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/mutators.cpp, /pkg/src/rpc_over_http.cpp, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ZeroCopyInputStream S4 class * [r223] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/man/CodedInputStream-class.Rd[DEL], /pkg/src/CodedInputStream_wrapper.cpp[DEL], /pkg/src/constructors.cpp, /pkg/src/rprotobuf.h: changed my mind, don't want to expose CodedInputStream (yet) * [r222] /pkg/src/CodedInputStream_wrapper.cpp, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.h: added constructor and finalizer for CodedInputStream * [r221] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/rpc.R, /pkg/man/CodedInputStream-class.Rd, /pkg/man/RpcHTTP-class.Rd, /pkg/src/SocketCopyingInputStream.cpp, /pkg/src/rpc_over_http.cpp, /pkg/src/rprotobuf.h: added RpcHTTP@root slot, and CodedInputStream class 2009-12-10 Romain Francois * [r220] /pkg/inst/proto/helloworld.proto, /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/DescriptorPoolLookup.h, /pkg/src/lookup.cpp, /pkg/src/methods.cpp, /pkg/src/read.cpp, /pkg/src/rpc_over_http.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: now using runtime descriptors correctly * [r219] /java/build.xml, /java/proto/helloworld.proto, /java/src/org/rproject/rprotobuf/HelloWorldInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufHandler.java, /java/src/org/rproject/rprotobuf/ProtobufMethodInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java: added hello world example * [r218] /java/src/org/rproject/rprotobuf/EchoInvoker.java, /java/src/org/rproject/rprotobuf/MethodImplementation.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java: added annotation (not used yet) * [r217] /java/build.xml, /java/proto, /java/proto/addressbook.proto, /java/src/org/rproject/rprotobuf/EchoInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java: more generic java code 2009-12-09 Romain Francois * [r216] /java/start.sh: added convenience start script for the java server * [r215] /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java: more flexible java server code * [r214] /java/README, /java/build.xml, /java/lib, /java/lib/protobuf-java-2.2.0.jar, /java/src/org/rproject/rprotobuf/EchoInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufHandler.java, /java/src/org/rproject/rprotobuf/ProtobufMethodInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java, /pkg/inst/proto/addressbook.proto: more flexible java server code * [r213] /java/README, /java/src/org/rproject/rprotobuf/ProtobufHandler.java, /java/src/org/rproject/rprotobuf/ProtobufHttpServer.java, /java/src/org/rproject/rprotobuf/ProtobufMethodInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java, /pkg/src/rpc_over_http.cpp: functional rpc over http R client and java server 2009-12-08 Romain Francois * [r212] /pkg/src/channel.cpp[DEL], /pkg/src/rpc_over_http.cpp, /pkg/src/rprotobuf.h: started to work on rpc over http * [r211] /java, /java/build.properties, /java/build.xml, /java/src, /java/src/org, /java/src/org/rproject, /java/src/org/rproject/rprotobuf, /java/src/org/rproject/rprotobuf/ProtobufHttpServer.java: added dummy java rpc over http server * [r210] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/rpc.R, /pkg/man/RpcHTTP-class.Rd, /pkg/man/invokeLocally.Rd: added invoke, removed invokeLocally, added RpcHTTP class to represent the rpc over http protocol 2009-12-08 Dirk Eddelbuettel * [r209] /pkg/R/listPeople.R, /pkg/src/clear_person_R.cpp, /pkg/src/list_people_R.cpp: minor robustification against empty addressbook file 2009-12-06 Dirk Eddelbuettel * [r208] /pkg/NAMESPACE, /pkg/R/addPerson.R, /pkg/man/addPerson.Rd, /pkg/src/clear_person_R.cpp: added clearPerson() support with kudos to Romain as usual :) 2009-12-06 Romain Francois * [r207] /pkg/inst/proto/protobufrpc.proto[DEL]: not using protobuf-rpc anymore * [r206] /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/EnumDescriptor_wrapper.cpp, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/Makevars.in, /pkg/src/RSourceTree.cpp, /pkg/src/RSourceTree.h, /pkg/src/RWarningErrorCollector.cpp, /pkg/src/RWarningErrorCollector.h, /pkg/src/RconnectionCopyingInputStream.h, /pkg/src/ServiceDescriptor_wrapper.cpp, /pkg/src/SocketCopyingInputStream.h, /pkg/src/add.cpp, /pkg/src/as.cpp, /pkg/src/ascharacter.cpp, /pkg/src/aslist.cpp, /pkg/src/channel.cpp, /pkg/src/clear.cpp, /pkg/src/clone.cpp, /pkg/src/completion.cpp, /pkg/src/constructors.cpp, /pkg/src/containing_type.cpp, /pkg/src/extractors.cpp, /pkg/src/field_count.cpp, /pkg/src/fileDescriptor.cpp, /pkg/src/has.cpp, /pkg/src/identical.cpp, /pkg/src/initialized.cpp, /pkg/src/length.cpp, /pkg/src/lookup.cpp, /pkg/src/merge.cpp, /pkg/src/methods.cpp, /pkg/src/mutators.cpp, /pkg/src/name.cpp, /pkg/src/read.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp, /pkg/src/set.cpp, /pkg/src/size.cpp, /pkg/src/swap.cpp: not using using * [r205] /pkg/src/RTcpChannel.cpp[DEL]: removing * [r204] /pkg/src/RTcpChannel.h[DEL]: removing * [r203] /pkg/src/RTcpChannel.cpp: ùù * [r202] /pkg/src/RTcpChannel.h: ùù * [r201] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/EnumDescriptor_wrapper.R, /pkg/R/EnumValueDescriptor_wrapper.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/MethodDescriptor_wrapper.R, /pkg/R/ServiceDescriptor_wrapper.R, /pkg/R/add.R, /pkg/R/aslist.R, /pkg/R/clear.R, /pkg/R/clone.R, /pkg/R/completion.R, /pkg/R/containing_type.R, /pkg/R/debug_string.R, /pkg/R/descriptor.R, /pkg/R/exceptions.R, /pkg/R/field_count.R, /pkg/R/has.R, /pkg/R/identical.R, /pkg/R/initialized.R, /pkg/R/merge.R, /pkg/R/read.R, /pkg/R/rpc.R, /pkg/R/serialize.R, /pkg/R/set.R, /pkg/R/size.R, /pkg/R/swap.R, /pkg/R/with.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/P.Rd, /pkg/man/RProtoBuf-package.Rd, /pkg/man/add.Rd, /pkg/man/asMessage.Rd, /pkg/man/aslist.Rd, /pkg/man/bytesize.Rd, /pkg/man/clear.Rd, /pkg/man/clone.Rd, /pkg/man/completion.Rd, /pkg/man/containing_type-methods.Rd, /pkg/man/descriptor.Rd, /pkg/man/enum_type.Rd, /pkg/man/enum_type_count.Rd, /pkg/man/fetch.Rd, /pkg/man/field.Rd, /pkg/man/field_count.Rd, /pkg/man/fileDescriptor.Rd, /pkg/man/has.Rd, /pkg/man/invokeLocally.Rd, /pkg/man/isInitialized.Rd, /pkg/man/is_extension.Rd, /pkg/man/label.Rd, /pkg/man/merge.Rd, /pkg/man/name.Rd, /pkg/man/nested_type.Rd, /pkg/man/nested_type_count.Rd, /pkg/man/number.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufEnumValueDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/man/protobufFileDescriptor-class.Rd, /pkg/man/protobufMessage-class.Rd, /pkg/man/protobufMethodDescriptor-class.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/man/read.Rd, /pkg/man/set.Rd, /pkg/man/size.Rd, /pkg/man/sizegets.Rd, /pkg/man/swap.Rd, /pkg/man/type.Rd, /pkg/man/with.Rd, /pkg/src/add.cpp, /pkg/src/constructors.cpp, /pkg/src/extractors.cpp, /pkg/src/lookup.cpp, /pkg/src/merge.cpp, /pkg/src/mutators.cpp, /pkg/src/read.cpp, /pkg/src/rprotobuf.cpp: removing the protobuf prefix of the S4 classes 2009-12-05 Romain Francois * [r200] /pkg/NAMESPACE, /pkg/R/MethodDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/R/rpc.R, /pkg/man/protobufMethodDescriptor-class.Rd: + {in,out}put_type.MethodDescriptor * [r199] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/ServiceDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/protobufServiceDescriptor-class.Rd: + method.ServiceDescriptor * [r198] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/EnumValueDescriptor_wrapper.R, /pkg/R/ServiceDescriptor_wrapper.R, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/ServiceDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: added some methods for ServiceDescriptor * [r197] /pkg/R/EnumDescriptor_wrapper.R, /pkg/man/protobufEnumValueDescriptor-class.Rd: added EnumValueDescriptor class * [r196] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/EnumDescriptor_wrapper.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/R/debug_string.R, /pkg/R/field_count.R, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufEnumValueDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/EnumDescriptor_wrapper.cpp, /pkg/src/as.cpp, /pkg/src/ascharacter.cpp, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.h: added EnumValueDescriptor class 2009-12-05 Dirk Eddelbuettel * [r195] /pkg/inst/doc/RProtoBuf.Rnw: added some stuff near the beginning about 'static' use which motivates the dynamic use nicely some spit and polish for intro as well 2009-12-04 Romain Francois * [r194] /pkg/R/00classes.R, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/src/EnumDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +length.protobufEnumDescriptor * [r193] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +{message,enum}_type.FieldDescriptor * [r192] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: + {has_default_value,default_value}.FieldDescriptor~ * [r191] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/label.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +{label,is_repeated,is_required,is_optional}.FieldDescriptor * [r190] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/man/type.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +{type.cpp_type}.FieldDescriptor * [r189] /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +number.FieldDescriptor * [r188] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/number.Rd, /pkg/man/protobufFieldDescriptor-class.Rd: +number.FieldDescriptor * [r187] /pkg/TODO: updated TODO * [r186] /pkg/R/field_count.R: minor fix * [r185] /pkg/NAMESPACE, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/field_count.R, /pkg/man/is_extension.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: + is_extension.FieldDescriptor * [r184] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/enum_type.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: + enum_type.Descriptor method 2009-12-03 Romain Francois * [r183] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/nested_type.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: +nested_type.Descriptor method * [r182] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/enum_type_count.Rd, /pkg/man/field.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: added field.Descriptor method * [r181] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/nested_type_count.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: nested_type_count.protobufDescriptor * [r180] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/field_count.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: + field_count.protobufDescriptor method * [r179] /pkg/DESCRIPTION: added BugReports description field * [r178] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/containing_type.R, /pkg/man/containing_type-methods.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/containing_type.cpp, /pkg/src/rprotobuf.h: added containing_type.protobuf{Descriptor,FieldDescriptor,EnumDescriptor} 2009-12-03 Dirk Eddelbuettel * [r177] /pkg/NAMESPACE, /pkg/R/addPerson.R, /pkg/man/addPerson.Rd, /pkg/man/listPeople.Rd, /pkg/src/add_person_R.cpp: added simple addPerson() R function, manual page and C++ implementation 2009-12-02 Romain Francois * [r176] /pkg/src/initialized.cpp: isInitialized gains the names of the fields that are not initialized * [r175] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/asMessage.Rd, /pkg/src/as.cpp, /pkg/src/rprotobuf.h: added asMessage function * [r174] /pkg/NAMESPACE, /pkg/man/throw.Rd[DEL], /pkg/src/exceptions.cpp: throw not exported anymore * [r173] /pkg/man/protobufFileDescriptor-class.Rd: added name.protobufFileDescriptor * [r172] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/src/name.cpp, /pkg/src/rprotobuf.h: added more fileDescriptor methods * [r171] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/descriptor.R, /pkg/R/rpc.R, /pkg/man/fileDescriptor.Rd, /pkg/src/fileDescriptor.cpp, /pkg/src/rprotobuf.h: added more fileDescriptor methods * [r170] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/aslist.R, /pkg/man/aslist.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/aslist.cpp, /pkg/src/completion.cpp, /pkg/src/rprotobuf.h: added as.list.protobufServiceDescriptor * [r169] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/rpc.R, /pkg/man/completion.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.h: misc * [r168] /pkg/R/00classes.R, /pkg/man/name.Rd, /pkg/src/name.cpp, /pkg/src/rprotobuf.h: more name methods * [r167] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/name.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/name.cpp, /pkg/src/rprotobuf.h: added name method and implementations for Decriptor and FieldDescriptor 2009-12-01 Romain Francois * [r166] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/aslist.R, /pkg/R/completion.R, /pkg/man/aslist.Rd, /pkg/man/completion.Rd, /pkg/man/protobufFileDescriptor-class.Rd, /pkg/src/aslist.cpp, /pkg/src/completion.cpp, /pkg/src/rprotobuf.h: added as.list.protobufFileDescriptor * [r165] /pkg/R/debug_string.R, /pkg/src/ascharacter.cpp, /pkg/src/rprotobuf.h: completion, toString, as.character for protobufFileDescriptor * [r164] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/man/completion.Rd, /pkg/man/protobufFileDescriptor-class.Rd: completion, toString, as.character for protobufFileDescriptor * [r163] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/descriptor.R, /pkg/R/rpc.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/fileDescriptor.Rd, /pkg/man/protobufFileDescriptor-class.Rd, /pkg/src/constructors.cpp, /pkg/src/fileDescriptor.cpp, /pkg/src/rprotobuf.h: added protobufFileDescriptor S4 class + fileDescriptor method 2009-11-30 Romain Francois * [r162] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/rpc.R, /pkg/src/RTcpChannel.cpp, /pkg/src/RTcpChannel.h, /pkg/src/SocketCopyingInputStream.cpp, /pkg/src/SocketCopyingInputStream.h, /pkg/src/channel.cpp, /pkg/src/rprotobuf.h: playing with sockets 2009-11-23 Romain Francois * [r161] /www/index.php: update the page 2009-11-22 Romain Francois * [r160] /pkg/src/RTcpChannel.cpp, /pkg/src/RTcpChannel.h: * [r159] /pkg/src/sisocks.h: added sisocks.h header from Rserve * [r158] /pkg/src/Makevars.in, /pkg/src/RTcpChannel.cpp, /pkg/src/RTcpChannel.h: slowly putting things in place for rpc (inspired from the protobuf-rpc project) * [r157] /pkg/src/serialize.cpp: discovered the SerializeToArray method, simplify code * [r156] /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: allow messages as input of string and bytes fields * [r155] /pkg/inst/proto/protobufrpc.proto, /pkg/src: added proto file from protobufrpc project * [r154] /pkg/R/set.R, /pkg/src/Makevars.in, /pkg/src/mutators.cpp: allow raw vector as input of string or bytes fields 2009-11-21 Romain Francois * [r153] /www/index.php: start to make the project page * [r152] /pkg/DESCRIPTION: suggesting svUnit (unit tests) * [r151] /pkg/inst/doc, /pkg/inst/doc/RProtoBuf-unitTests.Rnw: added (empty) unit test vignette * [r150] /pkg/inst/doc/RProtoBuf.Rnw: update the main vignette to show reading from payload * [r149] /pkg/R/read.R, /pkg/R/serialize.R, /pkg/man/read.Rd, /pkg/src/read.cpp, /pkg/src/rprotobuf.h: reading messages from raw vector (payload) * [r148] /pkg/NEWS, /pkg/R/read.R: open the connection at start on read 2009-11-18 Romain Francois * [r147] /pkg/inst/proto/addressbook.proto: for the quickref vignette in one page 2009-11-18 Dirk Eddelbuettel * [r146] /pkg/cleanup: also remove temp files for quickref vignette 2009-11-17 Romain Francois * [r145] /pkg/src/mutators.cpp, /pkg/src/size.cpp, /pkg/src/swap.cpp: removed the conditional compiling for protobuf 2.1 * [r144] /pkg/man/invokeLocally.Rd, /pkg/man/protobufMethodDescriptor-class.Rd, /pkg/man/protobufServiceDescriptor-class.Rd: pleasing R CMD check 2009-11-16 Dirk Eddelbuettel * [r143] /pkg/configure, /pkg/configure.in: further improvements to configure via pkg-config * [r142] /pkg/cleanup: let cleanup nuke a few LaTeX files 2009-11-16 Romain Francois * [r141] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/debug_string.R, /pkg/R/rpc.R, /pkg/TODO, /pkg/inst/proto/addressbook.proto, /pkg/man/protobufMethodDescriptor-class.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/ascharacter.cpp, /pkg/src/constructors.cpp, /pkg/src/lookup.cpp, /pkg/src/methods.cpp, /pkg/src/read.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: starting to play with (local) rpc services 2009-11-16 Dirk Eddelbuettel * [r140] /pkg/configure: updated configure * [r139] /pkg/DESCRIPTION, /pkg/configure.in: updated configure.in to use pkg-config updated DESCRIPTON 2009-11-16 Romain Francois * [r138] /pkg/inst/doc: * [r137] /pkg/inst/doc/RProtoBuf-quickref.Rnw: added quick ref vignette * [r136] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/add.R, /pkg/R/completion.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/add.Rd, /pkg/src/add.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h: added add method to add values to a repeated field 2009-11-14 Romain Francois * [r135] /pkg/NAMESPACE, /pkg/R/identical.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufMessage-class.Rd, /pkg/src/identical.cpp, /pkg/src/rprotobuf.h: added all.equal * [r134] /pkg/DESCRIPTION, /pkg/man/RProtoBuf-package.Rd: updated DESCRIPTION and package help page * [r133] /pkg/R/identical.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufMessage-class.Rd: added == and != * [r132] /pkg/NAMESPACE, /pkg/R/identical.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufMessage-class.Rd, /pkg/src/identical.cpp, /pkg/src/rprotobuf.h: added identical method to compare two messages * [r131] /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content 2009-11-13 Romain Francois * [r130] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/debug_string.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/man/protobufMessage-class.Rd: added toString as an alias to as.character * [r129] /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content * [r128] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/set.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/fetch.Rd, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.h, /pkg/src/set.cpp: added fetch method * [r127] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/set.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/completion.Rd, /pkg/man/set.Rd, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h: added set method 2009-11-13 Dirk Eddelbuettel * [r126] /pkg/inst/doc/RProtoBuf.Rnw: a few more updates * [r125] /pkg/inst/doc/RProtoBuf.Rnw: few small updates and tweaks * [r124] /pkg/DESCRIPTION: updated DESCRIPTION 2009-11-12 Romain Francois * [r123] /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content * [r122] /pkg/R/00classes.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/rprotobuf.h: added $ for protobufFieldDescriptor (for completeness) * [r121] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/descriptor.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/descriptor.Rd, /pkg/src/extractors.cpp: added descriptor method * [r120] /pkg/R/internals.R, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added (unexported) function getProtobufLibVersion * [r119] /pkg/src/mutators.cpp: use the correct version for the test #if GOOGLE_PROTOBUF_VERSION < 200200 * [r118] /pkg/src/mutators.cpp: use the correct version for the test #if GOOGLE_PROTOBUF_VERSION < 200200 * [r117] /pkg/inst/doc/RProtoBuf.Rnw: no hardcoding Sweave location * [r116] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content 2009-11-12 Dirk Eddelbuettel * [r115] /pkg/src/mutators.cpp: make -Wall happy by commenting out one var, and providing more switch targets 2009-11-12 Romain Francois * [r114] /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content * [r113] /pkg/inst/doc/RProtoBuf.Rnw, /pkg/src/size.cpp, /pkg/src/swap.cpp: correct swaping messages with 2.1 libproto * [r112] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/swap.R, /pkg/demo/addressbook.R, /pkg/inst/doc/RProtoBuf.Rnw: make swap use 1-based indexing * [r111] /pkg/R/00classes.R, /pkg/inst/doc/RProtoBuf.Rnw: some more content on the vignette * [r110] /pkg/src/rprotobuf.cpp: added some code to control which version of the libprotobuf we require (currently 2.1, but will be 2.2 soon) * [r109] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R/zzz.R, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added some code to control which version of the libprotobuf we require (currently 2.1, but will be 2.2 soon) * [r108] /pkg/inst/doc, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/src/mutators.cpp, /pkg/src/size.cpp, /pkg/src/swap.cpp: added some conditional compiling to make it work with libprotobuf < 2.2 2009-11-11 Romain Francois * [r107] /pkg/inst/doc/RProtoBuf.Rnw, /pkg/inst/proto/addressbook.proto: some more content for the vignette * [r106] /pkg/inst/doc/RProtoBuf.tex[DEL]: removed tex file * [r105] /pkg/inst/doc, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/inst/doc/RProtoBuf.tex, /pkg/inst/proto/addressbook.proto: started vignette * [r104] /pkg/DESCRIPTION: Rcpp >= 0.6.8 2009-11-10 Romain Francois * [r103] /pkg/R/swap.R, /pkg/demo/addressbook.R: some more code in demo * [r102] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/swap.R, /pkg/man/swap.Rd, /pkg/src/clear.cpp, /pkg/src/rprotobuf.h, /pkg/src/swap.cpp: added swap * [r101] /pkg/R/00classes.R, /pkg/R/clear.R, /pkg/R/completion.R, /pkg/man/clear.Rd, /pkg/src/clear.cpp, /pkg/src/rprotobuf.h, /pkg/src/size.cpp: added field argument to clear * [r100] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/size.R, /pkg/man/size.Rd, /pkg/man/sizegets.Rd, /pkg/src/rprotobuf.h, /pkg/src/size.cpp: + size<- * [r99] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/size.R, /pkg/man/size.Rd, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/size.cpp: added size method * [r98] /pkg/src/mutators.cpp: minot tweaks * [r97] /pkg/src/mutators.cpp: fail mutation before resizing * [r96] /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h: nicer and more efficient mutator code (discovered Reflection->RemoveLast method) * [r95] /pkg/R/00classes.R: using a switch in $ * [r94] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/clear.R, /pkg/man/clear.Rd, /pkg/src/aslist.cpp, /pkg/src/clear.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h: added clear method * [r93] /pkg/src/RWarningErrorCollector.cpp, /pkg/src/RWarningErrorCollector.h, /pkg/src/rprotobuf.cpp: properly implement MultiFileErrorCollector to send an R warning instead of printing stuff to cout * [r92] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/man/protobufMessage-class.Rd, /pkg/src/extractors.cpp, /pkg/src/mutators.cpp: added [[ and [[<- methods for messages using the declared tag number 2009-11-09 Romain Francois * [r91] /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/DescriptorPoolLookup.h, /pkg/src/lookup.cpp, /pkg/src/rprotobuf.cpp: maintain list of currently known types in attached DescriptorPool 2009-11-09 Dirk Eddelbuettel * [r90] /pkg/src/list_people_R.cpp: remove RcppList implementation which we now get from Rcpp (>= 0.6.7) 2009-11-09 Romain Francois * [r89] /pkg/src/rprotobuf.cpp: using RSourceTree instead of DiskSourceTree * [r88] /pkg/src/RSourceTree.cpp, /pkg/src/RSourceTree.h: adding a simple SourceTree implementation * [r87] /pkg/DESCRIPTION, /pkg/man/RProtoBuf-package.Rd: required Rcpp >= 0.6.7 * [r86] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/initialized.R, /pkg/man/isInitialized.Rd, /pkg/man/protobufMessage-class.Rd, /pkg/src/initialized.cpp, /pkg/src/rprotobuf.h: added isInitialized method * [r85] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/man/protobufMessage-class.Rd, /pkg/src/length.cpp, /pkg/src/rprotobuf.h: added length method for messages * [r84] /pkg/R/internals.R: minor * [r83] /pkg/NAMESPACE, /pkg/R/size.R, /pkg/demo/io.R, /pkg/man/RProtoBuf-package.Rd, /pkg/man/bytesize.Rd, /pkg/src/rprotobuf.h, /pkg/src/size.cpp: added bytesize method * [r82] /pkg/TODO, /pkg/demo/00Index, /pkg/demo/addressbook.R, /pkg/demo/io.R, /pkg/src/RconnectionCopyingInputStream.cpp: added io demo showing how to use binary connections to read and write messages 2009-11-08 Romain Francois * [r81] /pkg/src/RconnectionCopyingInputStream.cpp: minor doc tweaks * [r80] /pkg/src/RconnectionCopyingInputStream.cpp, /pkg/src/RconnectionCopyingInputStream.h: factoring out getReadBinCall * [r79] /pkg/src/RconnectionCopyingInputStream.cpp: minor doc tweaks * [r78] /pkg/R/read.R, /pkg/src/RconnectionCopyingInputStream.cpp, /pkg/src/RconnectionCopyingInputStream.h, /pkg/src/read.cpp, /pkg/src/rprotobuf.h: reading from binary connections * [r77] /pkg/R/read.R, /pkg/R/serialize.R, /pkg/man/read.Rd, /pkg/src/read.cpp, /pkg/src/serialize.cpp: silence R CMD check 2009-11-08 Dirk Eddelbuettel * [r76] /pkg/man/protobufMessage-class.Rd: small correction to tail of example * [r75] /pkg/src/rprotobuf.h: make it work with version 2.1 of ProtoBuf 2009-11-08 Romain Francois * [r74] /pkg/man/protobufMessage-class.Rd: minor doc tweaks * [r73] /pkg/R/serialize.R, /pkg/man/protobufMessage-class.Rd: minor doc tweaks * [r72] /pkg/R/serialize.R, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: workaround for serializing to binary connections * [r71] /pkg/R/serialize.R, /pkg/src/connections.h, /pkg/src/read.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: use partial on serialize and parse to allow message lacking required fields 2009-11-07 Dirk Eddelbuettel * [r70] /pkg/DESCRIPTION: finally set Date svn property on this to have the Date filled in automatically 2009-11-06 Romain Francois * [r69] /pkg/R/serialize.R, /pkg/man/protobufMessage-class.Rd, /pkg/src/read.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: serialize message to a file * [r68] /pkg/man/read.Rd: mention the read pseudi method * [r67] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/read.R, /pkg/man/read.Rd, /pkg/src/read.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: reading messages from files 2009-11-05 Dirk Eddelbuettel * [r66] /pkg/src/Makevars.in: simplification in that we no longer need to list all .cpp files as dependants 2009-11-05 Romain Francois * [r65] /pkg/TODO: added services to the TODO list * [r64] /pkg/DESCRIPTION: added more urls and a MailingList field 2009-11-05 Dirk Eddelbuettel * [r63] /pkg/demo/00Index: make 'R CMD check' happy * [r62] /pkg/src/Makevars.in: adjusted Makevars.in for addressbook.proto in inst/proto/ * [r61] /pkg/inst/proto/addressbook.proto[CPY], /pkg/src/addressbook.proto[DEL]: moved addressbook.proto from src/ to inst/proto/ * [r60] /pkg/inst/examples/addressbook.proto[DEL], /pkg/inst/proto/addressbook.proto[DEL]: removed two extra addressbook.proto files 2009-11-05 Romain Francois * [r59] /pkg/NAMESPACE, /pkg/R/merge.R, /pkg/demo/00Index, /pkg/man/merge.Rd, /pkg/src/Makevars.in, /pkg/src/merge.cpp, /pkg/src/rprotobuf.h: + merge * [r58] /pkg/R/clone.R: added clone 2009-11-04 Romain Francois * [r57] /pkg/demo, /pkg/demo/addressbook.R: added demo file 2009-11-04 Dirk Eddelbuettel * [r56] /pkg/src/aslist.cpp, /pkg/src/mutators.cpp, /pkg/src/update.cpp: commented-out two unused variables and init'ed another, all to make 'g++ -Wall' 2009-11-04 Romain Francois * [r55] /pkg/TODO: added TODO * [r54] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/aslist.R, /pkg/R/completion.R, /pkg/R/debug_string.R, /pkg/R/has.R, /pkg/R/with.R, /pkg/man/P.Rd, /pkg/man/RProtoBuf-package.Rd, /pkg/man/aslist.Rd, /pkg/man/clone.Rd, /pkg/man/completion.Rd, /pkg/man/has.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/man/protobufMessage-class.Rd, /pkg/man/with.Rd, /pkg/src/Makevars.in, /pkg/src/ascharacter.cpp, /pkg/src/aslist.cpp, /pkg/src/clone.cpp, /pkg/src/completion.cpp, /pkg/src/connections.h, /pkg/src/constructors.cpp, /pkg/src/exceptions.cpp, /pkg/src/extractors.cpp, /pkg/src/has.cpp, /pkg/src/lookup.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp, /pkg/src/update.cpp: lots of updates. fully working mutators 2009-11-02 Dirk Eddelbuettel * [r53] /pkg/src/completion.cpp, /pkg/src/constructors.cpp, /pkg/src/exceptions.cpp, /pkg/src/extractors.cpp, /pkg/src/lookup.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: switch from four namespace to just one * [r52] /pkg/src/extractors.cpp: add default initialisation for SEXP to keep g++ -Wall happy 2009-11-02 Romain Francois * [r51] /pkg/src/Makevars.in, /pkg/src/constructors.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: minimal implementation of mutators (only non-repeated fields atm) * [r50] /pkg/R/zzz.R, /pkg/src/lookup.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: enable lookup mechanism (using full path for now) 2009-11-01 Romain Francois * [r49] /pkg/R/zzz.R: added readProtoFiles to simplify importing of proto definitions from package * [r48] /pkg/NAMESPACE, /pkg/R/internals.R, /pkg/R/zzz.R, /pkg/inst/proto, /pkg/inst/proto/addressbook.proto, /pkg/man/readProtoFiles.Rd: added readProtoFiles to simplify importing of proto definitions from packages 2009-10-31 Romain Francois * [r47] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/man/throw.Rd: +Rd.throw * [r46] /pkg/man/protobufFieldDescriptor-class.Rd: +Rd.protobufFieldDescriptor * [r45] /pkg/man/protobufEnumDescriptor-class.Rd: added Rd for protobufEnumDescriptor * [r44] /pkg/R/00classes.R, /pkg/man/protobufDescriptor-class.Rd: added protobufDescriptor type * [r43] /pkg/man/protobufMessage-class.Rd: added Rd for protobufMessage class * [r42] /pkg/NAMESPACE, /pkg/R/debug_string.R, /pkg/man/P.Rd, /pkg/man/listPeople.Rd, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added Rd for P, implement as.character for protobufMessage and protobufDescriptor * [r41] /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp: minor fixes * [r40] /pkg/NAMESPACE, /pkg/R/serialize.R, /pkg/src/Makevars.in, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: hooks for serialize method for protobufMessage * [r39] /pkg/NAMESPACE, /pkg/R/exceptions.R, /pkg/src/Makevars.in, /pkg/src/exceptions.cpp, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: start playing with Exception handling, we need to call throwException instead of Rf_error in the c code 2009-10-30 Romain Francois * [r38] /pkg/R/exceptions.R, /pkg/src/extractors.cpp: extracting repeated fields, for now repeated messages are just returned as list of 'protobufMessage' objects * [r37] /pkg/NAMESPACE, /pkg/R/completion.R, /pkg/src/Makevars.in, /pkg/src/completion.cpp, /pkg/src/constructors.cpp, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.h: implemented completions for Messages (giving field names) and Descriptors (fields, enums and nested types) * [r36] /pkg/src/constructors.cpp, /pkg/src/extractors.cpp, /pkg/src/fieldtypes.h, /pkg/src/rprotobuf.h: implement extraction of (almost) all types from messages with $ (missing ENUM type) * [r35] /pkg/R/00classes.R, /pkg/src/Makevars.in, /pkg/src/extractors.cpp, /pkg/src/fieldtypes.h, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: prepare the field extraction * [r34] /pkg/R/00classes.R, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: implement new.protobufMessage that generates a new mutable Message using the generated Message factory * [r33] /pkg/src/constructors.cpp: some more doc in constructors.cpp * [r32] /pkg/R/internals.R, /pkg/src/constructors.cpp, /pkg/src/lookup.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: use R_NO_REMAP and Rf_ prefixes to avoid name clashes (install, error, ...) 2009-10-29 Romain Francois * [r31] /pkg/R/00classes.R, /pkg/R/internals.R, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: removed hard coded path * [r30] /pkg/R/00classes.R, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added enum types to $.Descriptor * [r29] /pkg/R/00classes.R: added $ extraction of nested types or fields by name * [r28] /pkg/R/00classes.R, /pkg/src/constructors.cpp: added $ extraction of nested types or fields by name * [r27] /pkg/src/Makevars.in, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added $ extraction of nested types or fields by name * [r26] /pkg/R/00classes.R, /pkg/src/rprotobuf.cpp: grab the descriptor from the pool in getProtobufDescriptor 2009-10-29 Dirk Eddelbuettel * [r25] /pkg/src/lookup.cpp: add two simple return() statements to make 'g++ -Wall' happy 2009-10-29 Romain Francois * [r24] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/internals.R, /pkg/src/rprotobuf.cpp: grab the descriptor from the pool in getProtobufDescriptor * [r23] /pkg/R/00classes.R, /pkg/R/internals.R, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: collect information about a proto file * [r22] /pkg/src/lookup.cpp, /pkg/src/rprotobuf.h: objects returns character(0) instead of NULL, more consistent with attach( new.env() ) * [r21] /pkg/R/lookup.R, /pkg/src/Makevars.in, /pkg/src/lookup.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added skeleton for lookup mechanism * [r20] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/src/Makevars.in, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: skeleton for R S4 classes representing proto messages as external pointers 2009-10-27 Dirk Eddelbuettel * [r19] /pkg/src/Makevars.in: add CXXPICFLAGS which is needed on amd64 * [r18] /pkg/src/list_people_R.cpp: corrected listPeopleAsList() for special case of person 3 with no phones * [r17] /pkg/src/Makevars.in: support configure and automated build of all pieces incl conversion from proto file to header and source and then object * [r16] /pkg/src/list_people_R.cpp: suppress one more set of g++ warning, align function names * [r15] /pkg/cleanup: add more cleanup targets * [r14] /pkg/R/listPeople.R: align function names with C++ source * [r13] /pkg/configure, /pkg/configure.in: added configure support * [r12] /pkg/src/Makevars[DEL], /pkg/src/Makevars.in[CPY]: moved to Makevars.in and configure, also re-create header and source from proto * [r11] /pkg/src/addressbook.pb.cc[DEL], /pkg/src/addressbook.pb.h[DEL]: removed as they are now recreated * [r10] /pkg/configure.in: beginnings of a configure script, not yet ready * [r9] /pkg/NAMESPACE: added (nested) list support * [r8] /pkg/man/listPeople.Rd: documented (nested) list support * [r7] /pkg/R/listPeople.R: added (nested) list support * [r6] /pkg/src/list_people_R.cpp: add support for R lists, possibly nested this was a good test for Rcpp and should get folded into Rcpp * [r5] /pkg/src/addressbook.pb.cc, /pkg/src/addressbook.pb.h: rebuild with Ubuntu protoc -- probably need to farm this out to a proper Makefile or Makevar target 2009-10-22 Dirk Eddelbuettel * [r4] /pkg/src/list_people_R.cpp: add support for case of no phone entry * [r3] /pkg/src/Makevars: add -lpthread to PKG_LIBS * [r2] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R, /pkg/R/listPeople.R, /pkg/README, /pkg/cleanup, /pkg/inst, /pkg/inst/examples, /pkg/inst/examples/AddressBookFile, /pkg/inst/examples/addressbook.proto, /pkg/man, /pkg/man/listPeople.Rd, /pkg/src, /pkg/src/Makevars, /pkg/src/addressbook.pb.cc, /pkg/src/addressbook.pb.h, /pkg/src/addressbook.proto, /pkg/src/list_people_R.cpp: A very basic first proof of concept package reading a binary protobuf file 2009-05-28 Stefan Theussl * [r1] /README, /pkg, /www, /www/index.php: R-Forge: updated repository structure RProtoBuf/.Rinstignore0000644000175000017500000000002212440004312014552 0ustar nileshnileshinst/doc/Makefile RProtoBuf/configure0000755000175000017500000044356614156423632014225 0ustar nileshnilesh#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for RProtoBuf 0.4.17. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='RProtoBuf' PACKAGE_TARNAME='rprotobuf' PACKAGE_VERSION='0.4.17' PACKAGE_STRING='RProtoBuf 0.4.17' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS PKG_LIBS PKG_CPPFLAGS R EGREP GREP PROTOC PKGCONFIG ac_ct_CC CFLAGS CC CXXCPP OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CXXCPP CC CFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures RProtoBuf 0.4.17 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/rprotobuf] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of RProtoBuf 0.4.17:";; esac cat <<\_ACEOF Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXXCPP C++ preprocessor CC C compiler command CFLAGS C compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF RProtoBuf configure 0.4.17 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by RProtoBuf $as_me 0.4.17, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Ensure C++ is set up as R expects : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then as_fn_error $? "Could not determine R_HOME." "$LINENO" 5 fi CXX=`"${R_HOME}/bin/R" CMD config CXX` CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ## simpler alternative to test below: AC_PATH_PROG(PROTOC, protoc) # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PKGCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PKGCONFIG"; then ac_cv_prog_PKGCONFIG="$PKGCONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PKGCONFIG="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PKGCONFIG=$ac_cv_prog_PKGCONFIG if test -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 $as_echo "$PKGCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ## use pkg-config for ProtoBuf settings ## if test x"${PKGCONFIG}" == x"yes"; then if pkg-config --exists protobuf; then protobuf_cxxflags=`pkg-config --cflags protobuf` protobuf_libs=`pkg-config --libs protobuf` else protobuf_cxxflags="" protobuf_libs="-lprotobuf" fi else # Add a reasonable default of -lprotobuf if we don't have pkg-config protobuf_cxxflags="" protobuf_libs="-lprotobuf" fi ## And make sure these flags are used for the tests below. CPPFLAGS="${protobuf_cxxflags} ${CPPFLAGS}" CXXFLAGS="${protobuf_cxxflags} ${CXXFLAGS}" ## look for protoc, the ProtoBuf compiler # Extract the first word of "protoc", so it can be a program name with args. set dummy protoc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PROTOC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PROTOC"; then ac_cv_prog_PROTOC="$PROTOC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PROTOC="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PROTOC=$ac_cv_prog_PROTOC if test -n "$PROTOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROTOC" >&5 $as_echo "$PROTOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"${PROTOC}" == x"no" ; then echo " Your installation does not appear to have protoc installed. Please make sure that you have a working and complete ProtoBuf installation. " exit 1 fi ## look for protobuf headers -- now use pkg-config which even does minimum version ## ## next two lines break witha autoconf 2.65 :-/ #PROTOBUF_VERSION="2.2.0" #PKG_CHECK_MODULES(ProtoBuf, protobuf >= 2.2.0, , AC_MSG_ERROR(Protobuf version 2.2.0 required)) ## check for header and ability to link ## first for headers Debian has in libprotobuf-dev protobuf_common_header=google/protobuf/stubs/common.h protobuf_common_header_cache_var=`$as_echo "ac_cv_header_$protobuf_common_header" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done as_ac_Header=`$as_echo "ac_cv_header_$protobuf_common_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$protobuf_common_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : else # If it didn't work, try adding /usr/local directly then trying again { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Protobuf headers not found with default CXXFLAGS and CPPFLAGS, manually trying /usr/local/include" >&5 $as_echo "$as_me: WARNING: Protobuf headers not found with default CXXFLAGS and CPPFLAGS, manually trying /usr/local/include" >&2;} CPPFLAGS="${protobuf_cxxflags} ${CPPFLAGS} -I/usr/local/include" CXXFLAGS="${protobuf_cxxflags} ${CXXFLAGS} -I/usr/local/include -L/usr/local/lib" # unset the cache variable for this particular header # check, so we can check again with different defaults # specified. { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unsetting $protobuf_common_header_cache_var" >&5 $as_echo "$as_me: WARNING: Unsetting $protobuf_common_header_cache_var" >&2;} { eval $protobuf_common_header_cache_var=; unset $protobuf_common_header_cache_var;} as_ac_Header=`$as_echo "ac_cv_header_$protobuf_common_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$protobuf_common_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : else as_fn_error $? "ERROR: ProtoBuf headers required; use '-Iincludedir' in CXXFLAGS for unusual locations." "$LINENO" 5 fi fi ## second for headers Debian has in libprotoc-dev ac_fn_cxx_check_header_mongrel "$LINENO" "google/protobuf/compiler/code_generator.h" "ac_cv_header_google_protobuf_compiler_code_generator_h" "$ac_includes_default" if test "x$ac_cv_header_google_protobuf_compiler_code_generator_h" = xyes; then : else as_fn_error $? "ERROR: ProtoBuf compiler headers required; use '-Iincludedir' in CXXFLAGS for unusual locations." "$LINENO" 5 fi ## third check the lib itself #pb_savedlibs="$LIBS" # LIBS="$LIBS -lprotoc -lprotobuf -lpthread" LIBS="$LIBS $protobuf_libs" ## also check for minimum version { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ProtoBuf version >= 2.2.0" >&5 $as_echo_n "checking if ProtoBuf version >= 2.2.0... " >&6; } if test "$cross_compiling" = yes; then : pb_version_ok=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { if (GOOGLE_PROTOBUF_VERSION >= 2001000) { exit (0); } else { exit(1); } } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : pb_version_ok=yes else pb_version_ok=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test x"${pb_version_ok}" == x"no"; then as_fn_error $? "Need ProtoBuf version >= 2.2.0" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # Extract the first word of "R", so it can be a program name with args. set dummy R; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_R+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$R"; then ac_cv_prog_R="$R" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_R="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi R=$ac_cv_prog_R if test -n "$R"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $R" >&5 $as_echo "$R" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ## With thanks to Kurt (now set above) #: ${R_HOME=`R RHOME`} #if test -z "${R_HOME}"; then # AC_MSG_ERROR([Could not determine R_HOME.]) #fi #R_CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` #CXXFLAGS="${CXXFLAGS} ${R_CXXFLAGS}" ## now use all these PKG_CPPFLAGS="${PKG_CPPFLAGS} ${CXXFLAGS} ${protobuf_cxxflags}" PKG_LIBS="${PKG_LIBS} ${protobuf_libs}" ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by RProtoBuf $as_me 0.4.17, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ RProtoBuf config.status 0.4.17 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo " ${PACKAGE_NAME} $PACKAGE_VERSION ================ cflags: ${PKG_CPPFLAGS} libs: ${PKG_LIBS} " RProtoBuf/R/0000755000175000017500000000000014060657043012474 5ustar nileshnileshRProtoBuf/R/wrapper_ServiceDescriptor.R0000644000175000017500000000154112440004312020000 0ustar nileshnileshsetGeneric( "method_count", function(object ){ standardGeneric( "method_count" ) } ) setMethod( "method_count", "ServiceDescriptor", function(object){ .Call( "ServiceDescriptor_method_count", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "method", function(object, index, name ){ standardGeneric( "method" ) } ) setMethod( "method", "ServiceDescriptor", function(object, index, name){ has_index <- !missing(index) has_name <- !missing(name) if( as.integer(has_index) + as.integer(has_name) != 1L ){ stop( "need exactly one of `index` or `name`" ) } if( has_index ){ return( .Call( "ServiceDescriptor_getMethodByIndex", object@pointer, as.integer(index)-1L, PACKAGE = "RProtoBuf" ) ) } if( has_name ){ return( .Call( "ServiceDescriptor_getMethodByName", object@pointer, as.character(name), PACKAGE = "RProtoBuf" ) ) } } ) RProtoBuf/R/has.R0000644000175000017500000000105713057365267013406 0ustar nileshnilesh setGeneric( "has", function( object, name, ... ){ standardGeneric( "has" ) } ) ._has_message <- function( object, name, ...){ if (!.Call( "Message__field_exists", object@pointer, name, PACKAGE = "RProtoBuf" )) { return(NULL) } else { return(.Call( "Message__has_field", object@pointer, name, PACKAGE = "RProtoBuf" )) } } ._has_enum_name <- function( object, name, ...){ return(.Call( "has_enum_name", object@pointer, name, PACKAGE = "RProtoBuf")) } setMethod( "has", "Message", ._has_message ) setMethod( "has", "EnumDescriptor", ._has_enum_name) RProtoBuf/R/add.R0000644000175000017500000000050512440004312013330 0ustar nileshnilesh setGeneric( "add", function(object, field, values){ standardGeneric( "add" ) } ) setMethod( "add", "Message", function( object, field, values ){ if( is( values, "Message" ) ){ values <- list( values ) } .Call( "Message__add_values", object@pointer, field, values, PACKAGE = "RProtoBuf" ) invisible( object ) } ) RProtoBuf/R/lookup.R0000644000175000017500000000077012440004312014115 0ustar nileshnilesh # attaches the descriptor pool to the search path at the given # position OTABLE <- NULL NAMESPACE <- environment() attachDescriptorPool <- function(pos = 2) { if (is.null(OTABLE)) { ##unlockBinding( "OTABLE", NAMESPACE ) otable <- .Call("newProtocolBufferLookup", pos, PACKAGE = "RProtoBuf") #attach(otable, pos=pos, name="RProtoBuf:DescriptorPool") assign("OTABLE", otable, envir = NAMESPACE, inherits = FALSE) lockBinding("OTABLE", NAMESPACE ) } } RProtoBuf/R/serialize.R0000644000175000017500000000264212440004312014573 0ustar nileshnilesh # serialization of protobuf messages # at the moment, we grab the payload as a raw vector and send this # to the connection, but in the future, we will directly stream out # the payload to the connection setGeneric( "serialize" ) setMethod( "serialize", c( object = "Message" ) , function( object, connection, ascii = FALSE, refhook = NULL){ stopifnot(object$isInitialized()) iscon <- inherits(connection, "connection") isnull <- is.null( connection ) if( is.character( connection ) ){ # pretend it is a file name if( !file.exists(connection) ){ if( !file.exists( dirname(connection) ) ){ stop( "directory does not exist" ) } file <- normalizePath(connection, mustWork=FALSE) } else{ file <- file_path_as_absolute(connection) } .Call( "Message__serialize_to_file", object@pointer, file, PACKAGE = "RProtoBuf" ) invisible( NULL) } else if( iscon || isnull ) { # first grab the payload as a raw vector, payload <- .Call( "Message__get_payload", object@pointer, PACKAGE = "RProtoBuf" ) if( isnull ){ # just return it if the connection is NULL payload } else{ # otherwise write the payload to the connection # FIXME: we might want to be more clever about this so that # we don't have to store the full payload in memory # but for now it will do just fine writeBin( payload, connection ) invisible( NULL ) } } } ) RProtoBuf/R/size.R0000644000175000017500000000203312440004312013550 0ustar nileshnilesh setGeneric( "bytesize", function(object, ...){ standardGeneric( "bytesize" ) } ) setMethod( "bytesize", "Message", function(object, ...){ .Call( "Message__bytesize", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "size", function( object, field, ... ){ standardGeneric( "size" ) } ) setMethod( "size", "Message", function(object, field, ...){ if( is.character( field ) || is.numeric( field ) ){ .Call( "Message__field_size", object@pointer, field, PACKAGE = "RProtoBuf" ) } else{ stop( "field should be a character or a number" ) } } ) setGeneric( "size<-", function( object, field, ..., value ){ standardGeneric( "size<-" ) } ) setMethod( "size<-", "Message", function(object, field, ..., value){ if( !is.numeric( value ) ){ stop("value should be a number") } value <- as.integer( value )[1] if( is.character( field ) || is.numeric( field ) ){ .Call( "Message__set_field_size", object@pointer, field, value, PACKAGE = "RProtoBuf" ) } else{ stop( "field should be a character or a number" ) } object } ) RProtoBuf/R/wrapper_EnumValueDescriptor.R0000644000175000017500000000066212440004312020304 0ustar nileshnilesh setMethod( "enum_type", c( object = "EnumValueDescriptor", index = "missing", name = "missing"), function(object, index, name){ .Call( "EnumValueDescriptor__enum_type", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "number", function(object){ standardGeneric( "number" ) } ) setMethod( "number", "EnumValueDescriptor", function(object){ .Call( "EnumValueDescriptor__number", object@pointer, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/with.R0000644000175000017500000000153013057365267013602 0ustar nileshnilesh# S3 dispatch does not work for some reason generateActiveBindings <- function(data){ env <- new.env( parent = environment() ) xp <- data@pointer names <- .Call( "Message__fieldNames", xp, PACKAGE = "RProtoBuf" ) if( !is.null(names) && length(names) ){ lapply( names, function(x ){ makeActiveBinding( x, function(v){ if( missing(v) ){ # get .Call( "getMessageField", xp, x, PACKAGE="RProtoBuf" ) } else { # set .Call( "setMessageField", xp, x, v, PACKAGE="RProtoBuf") } }, env ) } ) } env } with.Message <- function( data, expr, ...){ envir <- generateActiveBindings(data) eval( substitute( expr ), envir = envir ) } within.Message <- function(data, expr, ... ){ envir <- generateActiveBindings(data) eval( substitute( expr ), envir = envir ) data } RProtoBuf/R/initialized.R0000644000175000017500000000035612440004312015111 0ustar nileshnilesh setGeneric( "isInitialized", function( object, ... ){ standardGeneric( "isInitialized" ) } ) setMethod( "isInitialized", "Message", function(object, ... ){ .Call( "Message__is_initialized", object@pointer, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/wrapper_CodedOutputStream.R0000644000175000017500000000702412440004312017756 0ustar nileshnileshsetGeneric( "WriteRaw", function(object, payload){ standardGeneric("WriteRaw") } ) setMethod( "WriteRaw", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteRaw", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setGeneric( "WriteString", function(object, payload){ standardGeneric("WriteString") } ) setMethod( "WriteString", c(object="ZeroCopyOutputStream", payload = "character" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteString", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setGeneric( "WriteLittleEndian32", function(object, payload){ standardGeneric("WriteLittleEndian32") } ) setMethod( "WriteLittleEndian32", c(object="ZeroCopyOutputStream", payload = "integer" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteLittleEndian32", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "WriteLittleEndian32", c(object="ZeroCopyOutputStream", payload = "numeric" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteLittleEndian32", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "WriteLittleEndian32", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteLittleEndian32", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setGeneric( "WriteLittleEndian64", function(object, payload){ standardGeneric("WriteLittleEndian64") } ) setMethod( "WriteLittleEndian64", c(object="ZeroCopyOutputStream", payload = "integer" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteLittleEndian64", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "WriteLittleEndian64", c(object="ZeroCopyOutputStream", payload = "numeric" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteLittleEndian64", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "WriteLittleEndian64", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteLittleEndian64", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setGeneric( "WriteVarint32", function(object, payload){ standardGeneric("WriteVarint32") } ) setMethod( "WriteVarint32", c(object="ZeroCopyOutputStream", payload = "integer" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteVarint32", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "WriteVarint32", c(object="ZeroCopyOutputStream", payload = "numeric" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteVarint32", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "WriteVarint32", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteVarint32", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setGeneric( "WriteVarint64", function(object, payload){ standardGeneric("WriteVarint64") } ) setMethod( "WriteVarint64", c(object="ZeroCopyOutputStream", payload = "integer" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteVarint64", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "WriteVarint64", c(object="ZeroCopyOutputStream", payload = "numeric" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteVarint64", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "WriteVarint64", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call( "ZeroCopyOutputStream_WriteVarint64", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/zzz.R0000644000175000017500000000124213300665751013454 0ustar nileshnilesh .onLoad <- function(libname, pkgname ){ ##minversion <- packageDescription(pkgname, lib.loc=libname)$MinimumLibProtoVersion ##minversion <- as.integer( gsub( "[[:space:]]+", "", minversion ) ) ##.Call( "check_libprotobuf_version", minversion, PACKAGE = "RProtoBuf" ) readProtoFiles2( protoPath=system.file( "proto", package=pkgname, lib.loc=libname ) ) attachDescriptorPool( pos = length(search()) ) options("RProtoBuf.int64AsString" = FALSE) #if( exists( ".httpd.handlers.env", asNamespace( "tools" ) ) ){ # e <- tools:::.httpd.handlers.env # e[["RProtoBuf"]] <- RProtoBuf.http.handler #} .RProtoBuf_libname <<- libname } RProtoBuf/R/swap.R0000644000175000017500000000067012440004312013555 0ustar nileshnileshsetGeneric("swap", function( object, field, left, right) { standardGeneric( "swap" ) } ) setMethod( "swap", "Message", function( object, field, left, right ){ left <- as.integer( left ) - 1L right <- as.integer( right ) - 1L if( length(left) != length(right) ){ stop( "left and right should have the same length" ) } .Call( "Message__swap", object@pointer, field, left, right, PACKAGE = "RProtoBuf" ) invisible( object ) } ) RProtoBuf/R/clone.R0000644000175000017500000000043213057365267013727 0ustar nileshnilesh setGeneric( "clone", function( object, ... ){ standardGeneric( "clone" ) } ) ._clone.message <- function( object, ... ){ message <- .Call( "Message__clone", object@pointer, PACKAGE="RProtoBuf") update( message, ... ) message } setMethod( "clone", "Message", ._clone.message ) RProtoBuf/R/serialize_pb.R0000644000175000017500000000315112710022354015256 0ustar nileshnilesh#' Serialize R object to Protocol Buffer Message. #' #' Serializes R objects to a general purpose protobuf message using the same #' \code{rexp.proto} descriptor and mapping between R objects and protobuf #' mesages as RHIPE. #' #' Clients need both the message and the \code{rexp.proto} descriptor to parse #' serialized R objects. The latter is included in the the package installation #' \code{proto} directory: \code{system.file(package="RProtoBuf", "proto/rexp.proto")} #' #' The following storage types are natively supported by the descriptor: #' \code{character}, \code{raw}, \code{double}, \code{complex}, \code{integer}, #' \code{list}, and \code{NULL}. Objects with other storage types, such as #' functions, environments, S4 classes, etc, are serialized using base R #' \code{\link{serialize}} and stored in the proto \code{native} type. #' Missing values, attributes and numeric precision will be preserved. #' #' @param object R object to serialize #' @param connection passed on to \code{\link{serialize}} #' @param ... additional arguments passed on to \code{\link{serialize}} #' @aliases unserialize_pb can_serialize_pb #' @export unserialize_pb #' @export can_serialize_pb #' @export #' @examples msg <- tempfile(); #' serialize_pb(iris, msg); #' obj <- unserialize_pb(msg); #' identical(iris, obj); #' serialize_pb <- function(object, connection, ...){ #convert object to protobuf message msg <- rexp_obj(object); #serialize the message serialize(msg, connection = connection, ...); } unserialize_pb <- function(connection){ #convert object to protobuf message unrexp(read(pb(rexp.REXP), connection)); } RProtoBuf/R/wrapper_MethodDescriptor.R0000644000175000017500000000071612440004312017623 0ustar nileshnilesh setGeneric( "input_type", function(object){ standardGeneric( "input_type" ) } ) setGeneric( "output_type", function(object){ standardGeneric( "output_type" ) } ) setMethod( "input_type", "MethodDescriptor", function(object){ .Call("MethodDescriptor__input_type", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "output_type", "MethodDescriptor", function(object){ .Call("MethodDescriptor__output_type", object@pointer, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/rexp_obj.R0000644000175000017500000001064313344204501014422 0ustar nileshnilesh# Functions to convert an arbitrary R object into a protocol buffer # using the universal rexp.proto descriptor. # # Written by Jeroen Ooms # Modified 2014 by Murray Stokely to support language and environment types rexp_obj <- function(obj){ if(isS4(obj)) { # Some S4 objects do not return "S4" from typeof. e.g. lubridate interval # These must be natively encoded or we will lose the S4 flag. return(rexp_native(obj)) } sm <- typeof(obj); msg <- switch(sm, "character" = rexp_string(obj), "raw" = rexp_raw(obj), "double" = rexp_double(obj), "complex" = rexp_complex(obj), "integer" = rexp_integer(obj), "list" = rexp_list(obj), "logical" = rexp_logical(obj), "NULL" = rexp_null(), return(rexp_native(obj)) ); attrib <- attributes(obj) msg$attrName <- names(attrib) msg$attrValue <- lapply(attrib, rexp_obj) msg } rexp_string <- function(obj){ xvalue <- lapply(as.list(obj), function(x){ new(pb(rexp.STRING), strval=x, isNA=is.na(x)) }) new(pb(rexp.REXP), rclass = 0, stringValue=xvalue) } # For objects that only make sense in R, we just fall back # to R's default serialization. rexp_native <- function(obj){ new(pb(rexp.REXP), rclass= 8, nativeValue = base::serialize(obj, NULL)) } rexp_raw <- function(obj){ new(pb(rexp.REXP), rclass= 1, rawValue = obj) } rexp_double <- function(obj){ new(pb(rexp.REXP), rclass=2, realValue = obj) } rexp_complex <- function(obj){ xvalue <- lapply(as.list(obj), function(x){ new(pb(rexp.CMPLX), real=Re(x), imag=Im(x)) }) new(pb(rexp.REXP), rclass=3, complexValue = xvalue) } rexp_integer <- function(obj){ new(pb(rexp.REXP), rclass=4, intValue = obj) } rexp_list <- function(obj){ if (is(obj, "POSIXlt")) { xobj <- lapply(unclass(obj), rexp_obj) } else if (length(obj) > 0 && identical(obj, obj[[1]])) { # Avoid infinite recursion # some R objects return themselves when subindexed xobj <- rexp_obj(unlist(obj)) } else { xobj <- lapply(obj, rexp_obj) } new(pb(rexp.REXP), rclass=5, rexpValue = xobj) } rexp_logical <- function(obj){ xobj <- as.integer(obj) xobj[is.na(obj)] <- 2 new(pb(rexp.REXP), rclass=6, booleanValue = xobj) } rexp_null <- function(){ new(pb(rexp.REXP), rclass=7) } unrexp <- function(msg){ stopifnot(is(msg, "Message")) stopifnot(msg@type == "rexp.REXP") myrexp <- as.list(msg) xobj <- switch(as.character(myrexp$rclass), "0" = unrexp_string(myrexp), "1" = unrexp_raw(myrexp), "2" = unrexp_double(myrexp), "3" = unrexp_complex(myrexp), "4" = unrexp_integer(myrexp), "5" = unrexp_list(myrexp), "6" = unrexp_logical(myrexp), "7" = unrexp_null(), "8" = unrexp_native(myrexp), stop("Unsupported rclass:", myrexp$rclass) ) if(length(myrexp$attrValue)){ attrib <- lapply(myrexp$attrValue, unrexp) names(attrib) <- myrexp$attrName tryCatch(attributes(xobj) <- attrib, error=function(cond) { #Try not setting the class in case the values are invalid attributes(xobj) <- attrib[names(attrib)!="class"] warning("Unable to set class, ", cond$message) }) } xobj } unrexp_string <- function(myrexp){ mystring <- unlist(lapply(myrexp$stringValue, "[[", "strval")) isNA <- unlist(lapply(myrexp$stringValue, "[[", "isNA")) mystring[isNA] <- NA as.character(mystring) } unrexp_raw <- function(myrexp){ myrexp$rawValue } unrexp_double <- function(myrexp){ myrexp$realValue } unrexp_complex <- function(myrexp){ xvalue <- lapply(myrexp$complexValue, function(x){ complex(real=x$real, imaginary=x$imag) }) as.complex(unlist(xvalue)) } unrexp_integer <- function(myrexp){ myrexp$intValue } unrexp_list <- function(myrexp){ lapply(myrexp$rexpValue, unrexp) } unrexp_logical <- function(myrexp){ xvalue <- myrexp$booleanValue xvalue[xvalue==2] <- NA as.logical(xvalue) } unrexp_null <- function(){ NULL } unrexp_native <- function(myrexp){ buf <- myrexp$nativeValue if(!length(buf)) return(NULL) unserialize(buf) } #Helper function to lookup a PB descriptor pb <- function(name){ descriptor <- deparse(substitute(name)) if(!exists(descriptor, "RProtoBuf:DescriptorPool")){ stop("No ProtoBuf Descriptor for: ", descriptor) } get(descriptor, "RProtoBuf:DescriptorPool") } #Checks if object can be serialized can_serialize_pb <- rexp_valid <- function(obj) { # We can now serialize everything. just call back to R serialization return(TRUE) } RProtoBuf/R/wrapper_FieldDescriptor.R0000644000175000017500000000754412440004312017434 0ustar nileshnilesh setGeneric( "is_extension", function(object){ standardGeneric("is_extension") } ) setMethod( "is_extension", "FieldDescriptor", function(object){ .Call( "FieldDescriptor__is_extension", object@pointer, PACKAGE = "RProtoBuf" ) }) setMethod( "number", "FieldDescriptor", function(object){ .Call( "FieldDescriptor__number", object@pointer, PACKAGE = "RProtoBuf" ) } ) TYPE_DOUBLE <- 1L TYPE_FLOAT <- 2L TYPE_INT64 <- 3L TYPE_UINT64 <- 4L TYPE_INT32 <- 5L TYPE_FIXED64 <- 6L TYPE_FIXED32 <- 7L TYPE_BOOL <- 8L TYPE_STRING <- 9L TYPE_GROUP <- 10L TYPE_MESSAGE <- 11L TYPE_BYTES <- 12L TYPE_UINT32 <- 13L TYPE_ENUM <- 14L TYPE_SFIXED32 <- 15L TYPE_SFIXED64 <- 16L TYPE_SINT32 <- 17L TYPE_SINT64 <- 18L .TYPES <- sapply(ls( pattern="^TYPE_" ), function(x) get(x)) setGeneric( "type", function(object, as.string = FALSE){ standardGeneric( "type" ) } ) setMethod( "type", "FieldDescriptor", function(object, as.string = FALSE){ type <- .Call( "FieldDescriptor__type", object@pointer, PACKAGE = "RProtoBuf" ) if( as.string ) { names(which(.TYPES == type)) } else { type } } ) CPPTYPE_INT32 <- 1L CPPTYPE_INT64 <- 2L CPPTYPE_UINT32 <- 3L CPPTYPE_UINT64 <- 4L CPPTYPE_DOUBLE <- 5L CPPTYPE_FLOAT <- 6L CPPTYPE_BOOL <- 7L CPPTYPE_ENUM <- 8L CPPTYPE_STRING <- 9L CPPTYPE_MESSAGE <- 10L .CPPTYPES <- sapply(ls( pattern="^CPPTYPE_" ), function(x) get(x)) setGeneric( "cpp_type", function(object, as.string = FALSE ){ standardGeneric( "cpp_type" ) } ) setMethod( "cpp_type", "FieldDescriptor", function(object, as.string = FALSE){ cpptype <- .Call( "FieldDescriptor__cpp_type", object@pointer, PACKAGE = "RProtoBuf" ) if( as.string ) { names(which(.CPPTYPES == cpptype)) } else { cpptype } } ) LABEL_OPTIONAL <- 1L LABEL_REQUIRED <- 2L LABEL_REPEATED <- 3L .LABELS <- sapply(ls( pattern="^LABEL_" ), function(x) get(x)) setGeneric( "label", function(object, as.string = FALSE ){ standardGeneric( "label" ) } ) setMethod( "label", "FieldDescriptor", function(object, as.string = FALSE){ lab <- .Call( "FieldDescriptor__label", object@pointer, PACKAGE = "RProtoBuf" ) if( as.string ) { names(which(.LABELS == lab)) } else { lab } } ) setGeneric( "is_repeated", function(object ){ standardGeneric( "is_repeated" ) } ) setMethod( "is_repeated", "FieldDescriptor", function(object){ .Call( "FieldDescriptor__is_repeated", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "is_optional", function(object){ standardGeneric( "is_optional" ) } ) setMethod( "is_optional", "FieldDescriptor", function(object){ .Call( "FieldDescriptor__is_optional", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "is_required", function(object ){ standardGeneric( "is_required" ) } ) setMethod( "is_required", "FieldDescriptor", function(object){ .Call( "FieldDescriptor__is_required", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "has_default_value", function(object ){ standardGeneric( "has_default_value" ) } ) setMethod( "has_default_value", "FieldDescriptor", function(object){ .Call( "FieldDescriptor__has_default_value", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "default_value", function(object ){ standardGeneric( "default_value" ) } ) setMethod( "default_value", "FieldDescriptor", function(object){ .Call( "FieldDescriptor__default_value", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "message_type", function(object ){ standardGeneric( "message_type" ) } ) setMethod( "message_type", "FieldDescriptor", function(object){ .Call( "FieldDescriptor__message_type", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "enum_type", c( object = "FieldDescriptor", index = "missing", name = "missing"), function(object){ .Call( "FieldDescriptor__enum_type", object@pointer, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/debug_string.R0000644000175000017500000000474114060653075015302 0ustar nileshnilesh ._toString_Message <- function(x, ...){ .Call( "Message__as_character", x@pointer, PACKAGE = "RProtoBuf" ) } ._toString_Descriptor <- function(x, ...){ .Call( "Descriptor__as_character", x@pointer, PACKAGE = "RProtoBuf" ) } ._toString_EnumDescriptor <- function(x, ...){ .Call( "EnumDescriptor__as_character", x@pointer, PACKAGE = "RProtoBuf" ) } ._toString_FieldDescriptor <- function(x, ...){ .Call( "FieldDescriptor__as_character", x@pointer, PACKAGE = "RProtoBuf" ) } ._toString_ServiceDescriptor <- function(x, ...){ .Call( "ServiceDescriptor__as_character", x@pointer, PACKAGE = "RProtoBuf" ) } ._toString_MethodDescriptor <- function(x, ...){ .Call( "MethodDescriptor__as_character", x@pointer, PACKAGE = "RProtoBuf" ) } ._toString_FileDescriptor <- function(x, ...){ .Call( "FileDescriptor__as_character", x@pointer, PACKAGE = "RProtoBuf" ) } ._toString_EnumValueDescriptor <- function(x, ...){ .Call( "EnumValueDescriptor__as_character", x@pointer, PACKAGE = "RProtoBuf" ) } setMethod( "as.character", "Message", ._toString_Message ) setMethod( "as.character", "Descriptor", ._toString_Descriptor ) setMethod( "as.character", "EnumDescriptor", ._toString_EnumDescriptor ) setMethod( "as.character", "FieldDescriptor", ._toString_FieldDescriptor ) setMethod( "as.character", "ServiceDescriptor", ._toString_ServiceDescriptor ) setMethod( "as.character", "MethodDescriptor", ._toString_MethodDescriptor ) setMethod( "as.character", "FileDescriptor", ._toString_FileDescriptor ) setMethod( "as.character", "EnumValueDescriptor", ._toString_EnumValueDescriptor ) setGeneric( "toString" ) setMethod( "toString", "Message", ._toString_Message ) setMethod( "toString", "Descriptor", ._toString_Descriptor ) setMethod( "toString", "EnumDescriptor", ._toString_EnumDescriptor ) setMethod( "toString", "FieldDescriptor", ._toString_FieldDescriptor ) setMethod( "toString", "ServiceDescriptor", ._toString_ServiceDescriptor ) setMethod( "toString", "MethodDescriptor", ._toString_MethodDescriptor ) setMethod( "toString", "FileDescriptor", ._toString_FileDescriptor ) setMethod( "toString", "EnumValueDescriptor", ._toString_EnumValueDescriptor ) setGeneric( "toJSON", function( x, ... ) { standardGeneric( "toJSON" ) } ) setMethod( "toJSON", c( x = "Message"), function(x, preserve_proto_field_names = FALSE, always_print_primitive_fields = FALSE) { .Call( "Message__as_json", x@pointer, preserve_proto_field_names, always_print_primitive_fields, PACKAGE = "RProtoBuf") } ) RProtoBuf/R/unit_tests.R0000644000175000017500000000017713057365267015036 0ustar nileshnilesh run_unit_tests <- function(){ script <- system.file( "unitTests", "runTests.R", package = "RProtoBuf" ) source( script ) } RProtoBuf/R/clear.R0000644000175000017500000000202212440004312013662 0ustar nileshnileshsetGeneric( "clear", function(object, field, ...){ standardGeneric( "clear" ) } ) setMethod( "clear", signature( "Message", "missing" ), function(object, field, ...){ .Call( "Message__clear", object@pointer, PACKAGE = "RProtoBuf" ) invisible( object ) } ) setMethod( "clear", signature( "Message", "character" ), function(object, field, ...){ .Call( "Message__clear_field", object@pointer, field, PACKAGE = "RProtoBuf" ) invisible( object ) } ) setMethod( "clear", signature( "Message", "integer" ), function(object, field, ...){ .Call( "Message__clear_field", object@pointer, field, PACKAGE = "RProtoBuf" ) invisible( object ) } ) setMethod( "clear", signature( "Message", "numeric" ), function(object, field, ...){ .Call( "Message__clear_field", object@pointer, as.integer(field), PACKAGE = "RProtoBuf" ) invisible( object ) } ) setMethod( "clear", signature( "Message", "raw" ), function(object, field, ...){ .Call( "Message__clear_field", object@pointer, as.integer(field), PACKAGE = "RProtoBuf" ) invisible( object ) } ) RProtoBuf/R/containing_type.R0000644000175000017500000000174612440004312016002 0ustar nileshnilesh setGeneric( "containing_type", function(object){ standardGeneric( "containing_type" ) } ) setMethod( "containing_type", "Descriptor", function(object){ retval <- .Call( "Descriptor__containing_type", object@pointer, PACKAGE = "RProtoBuf" ) if (length(retval@type) == 0) { # Descriptors do not always have containing types. # In such cases NULL is better return value than malformed Descriptor. return(NULL) } else { return(retval) } } ) setMethod( "containing_type", "EnumDescriptor", function(object){ retval <- .Call( "EnumDescriptor__containing_type", object@pointer, PACKAGE = "RProtoBuf" ) if (length(name(retval)) == 0) { # If this enum type is nested in a message type, this # is that message type. Otherwise, NULL. return(NULL) } else { return(retval) } } ) setMethod( "containing_type", "FieldDescriptor", function(object){ # Never NULL .Call( "FieldDescriptor__containing_type", object@pointer, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/extensions.R0000644000175000017500000000375613057365267015042 0ustar nileshnilesh# Copyright 2012 Google Inc. All Rights Reserved. # Author: mstokely@google.com (Murray Stokely) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. setGeneric( "setExtension", function(object, field, values){ standardGeneric( "setExtension" ) } ) setMethod( "setExtension", "Message", function( object, field, values ){ if (!inherits(field, "FieldDescriptor")) { stop("setExtension requires a FieldDescriptor") } if (!is_extension(field)) { stop(paste(name(field), "is not an extension FieldDescriptor.")) } .Call( "setMessageField", object@pointer, field, values, PACKAGE = "RProtoBuf" ) invisible( object ) } ) setGeneric( "getExtension", function(object, field){ standardGeneric( "getExtension" ) } ) setMethod( "getExtension", "Message", function( object, field){ if (!inherits(field, "FieldDescriptor")) { stop("getExtension requires a FieldDescriptor") } if (!is_extension(field)) { stop(paste(name(field), "is not an extension FieldDescriptor.")) } # This check causes a CHECK failure in the C++ code, so give # a more user-friendly error here. if (containing_type(field)@type != object@type) { stop(paste("Field", name(field), "does not match message type (", containing_type(field)@type, "!=", object@type, ")")) } .Call( "getExtension_cpp", object@pointer, field, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/wrapper_ZeroCopyInputStream.R0000644000175000017500000001634512440004312020317 0ustar nileshnilesh# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: # {{{ generics setGeneric( "flush" ) setGeneric( "close" ) setGeneric( "GetErrno", function(object){ standardGeneric( "GetErrno" ) } ) setGeneric( "SetCloseOnDelete", function(object, close=FALSE){ standardGeneric( "SetCloseOnDelete" ) } ) # }}} # {{{ methods setGeneric( "Next", function(object, payload){ standardGeneric( "Next" ) } ) setGeneric( "BackUp", function(object, count){ standardGeneric( "BackUp" ) } ) setGeneric( "ByteCount", function(object){ standardGeneric( "ByteCount" ) } ) setGeneric( "Skip", function(object, count){ standardGeneric( "Skip" ) } ) # }}} # {{{ zero input stream setMethod( "Next", c( object = "ZeroCopyInputStream", payload = "missing"), function(object, payload){ .Call( "ZeroCopyInputStream_Next", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "BackUp", "ZeroCopyInputStream", function(object, count){ invisible(.Call( "ZeroCopyInputStream_BackUp", object@pointer, count, PACKAGE = "RProtoBuf" )) } ) setMethod( "ByteCount", "ZeroCopyInputStream", function(object){ .Call( "ZeroCopyInputStream_ByteCount", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "Skip", "ZeroCopyInputStream", function(object, count){ invisible( .Call( "ZeroCopyInputStream_Skip", object@pointer, count, PACKAGE = "RProtoBuf" ) ) } ) # }}} # {{{ zero copy output stream setMethod( "Next", c( object = "ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call( "ZeroCopyOutputStream_Next", object@pointer, payload, PACKAGE = "RProtoBuf" ) } ) setMethod( "BackUp", "ZeroCopyOutputStream", function(object, count){ invisible( .Call( "ZeroCopyOutputStream_BackUp", object@pointer, count, PACKAGE = "RProtoBuf" ) ) } ) setMethod( "ByteCount", "ZeroCopyOutputStream", function(object){ .Call( "ZeroCopyOutputStream_ByteCount", object@pointer, PACKAGE = "RProtoBuf" ) } ) # }}} # {{{ ArrayInputStream setGeneric( "ArrayInputStream", function(payload, block_size){ standardGeneric( "ArrayInputStream" ) } ) setMethod( "ArrayInputStream", c( payload = "raw", block_size = "missing" ) , function(payload, block_size){ .Call( "ArrayInputStream__new", payload, -1L, PACKAGE = "RProtoBuf" ) } ) setMethod( "ArrayInputStream", c( payload = "raw", block_size = "integer" ) , function(payload, block_size){ .Call( "ArrayInputStream__new", payload, block_size, PACKAGE = "RProtoBuf" ) } ) setMethod( "ArrayInputStream", c( payload = "raw", block_size = "numeric" ) , function(payload, block_size){ .Call( "ArrayInputStream__new", payload, as.integer(block_size), PACKAGE = "RProtoBuf" ) } ) # }}} # {{{ ArrayOutputStream constructor function setGeneric( "ArrayOutputStream", function(size, block_size){ standardGeneric( "ArrayOutputStream" ) } ) setMethod( "ArrayOutputStream", signature( size = "integer", block_size = "missing" ), function(size, block_size){ .Call( "ArrayOutputStream__new", size, -1L, PACKAGE = "RProtoBuf" ) } ) setMethod( "ArrayOutputStream", signature( size = "integer", block_size = "integer" ), function(size, block_size){ .Call( "ArrayOutputStream__new", size, block_size, PACKAGE = "RProtoBuf" ) } ) setMethod( "ArrayOutputStream", signature( size = "integer", block_size = "numeric" ), function(size, block_size){ .Call( "ArrayOutputStream__new", size, as.integer(block_size) , PACKAGE = "RProtoBuf" ) } ) setMethod( "ArrayOutputStream", signature( size = "numeric", block_size = "missing" ), function(size, block_size){ .Call( "ArrayOutputStream__new", as.integer(size), -1L, PACKAGE = "RProtoBuf" ) } ) setMethod( "ArrayOutputStream", signature( size = "numeric", block_size = "integer" ),function(size, block_size){ .Call( "ArrayOutputStream__new", as.integer(size), block_size, PACKAGE = "RProtoBuf" ) } ) setMethod( "ArrayOutputStream", signature( size = "numeric", block_size = "numeric" ), function(size, block_size){ .Call( "ArrayOutputStream__new", as.integer(size), as.integer(block_size) , PACKAGE = "RProtoBuf" ) } ) # }}} # {{{ FileInputStream setGeneric( "FileInputStream", function(filename, block_size = -1L, close.on.delete = FALSE ){ standardGeneric( "FileInputStream" ) } ) setMethod( "FileInputStream", signature( filename = "character", block_size = "integer", close.on.delete = "logical" ), function(filename, block_size = -1L, close.on.delete = FALSE){ full_filename <- file_path_as_absolute(filename) .Call( "FileInputStream_new", filename, block_size, close.on.delete, PACKAGE = "RProtoBuf" ) } ) setMethod( "close", "FileInputStream", function(con, ...){ .Call( "FileInputStream_Close", con@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "GetErrno", "FileInputStream", function(object){ .Call( "FileInputStream_GetErrno", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "SetCloseOnDelete", "FileInputStream", function(object, close=FALSE){ invisible( .Call( "FileInputStream_SetCloseOnDelete", object@pointer, isTRUE(close), PACKAGE = "RProtoBuf" ) ) } ) # }}} # {{{ FileOutputStream setGeneric( "FileOutputStream", function(filename, block_size = -1L, close.on.delete = FALSE ){ standardGeneric( "FileOutputStream" ) } ) setMethod( "FileOutputStream", signature( filename = "character", block_size = "integer", close.on.delete = "logical" ), function(filename, block_size = -1L, close.on.delete = FALSE){ if( !file.exists( filename ) ){ if( !file.exists( dirname(filename) ) ){ stop( "directory does not exist" ) } filename <- normalizePath(filename, mustWork=FALSE) } else{ filename <- file_path_as_absolute(filename) } .Call( "FileOutputStream_new", filename, block_size, close.on.delete, PACKAGE = "RProtoBuf" ) } ) setMethod( "flush", "FileOutputStream", function(con){ .Call( "FileOutputStream_Flush", con@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "close", "FileOutputStream", function(con, ...){ .Call( "FileOutputStream_Close", con@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "GetErrno", "FileOutputStream", function(object){ .Call( "FileOutputStream_GetErrno", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "SetCloseOnDelete", "FileOutputStream", function(object, close=FALSE){ invisible( .Call( "FileOutputStream_SetCloseOnDelete", object@pointer, isTRUE(close), PACKAGE = "RProtoBuf" ) ) } ) # }}} # {{{ ConnectionInputStream setGeneric( "ConnectionInputStream", function(object, ...){ standardGeneric( "ConnectionInputStream" ) } ) setMethod( "ConnectionInputStream", "connection", function(object, ...){ sc <- summary( object ) if( ! identical( sc[["can read"]], "yes") ){ stop( "cannot read from connection" ) } if( ! identical( sc[["text"]], "binary" ) ){ stop( "not a binary connection" ) } was_open <- isOpen( object ) if( ! was_open ){ open( object ) } .Call( "ConnectionInputStream_new", object, was_open, PACKAGE = "RProtoBuf" ) } ) # }}} # {{{ ConnectionOutputStream setGeneric( "ConnectionOutputStream", function(object, ...){ standardGeneric( "ConnectionOutputStream" ) } ) setMethod( "ConnectionOutputStream", "connection", function(object, ...){ sc <- summary( object ) if( ! identical( sc[["can write"]], "yes") ){ stop( "cannot write to connection" ) } if( ! identical( sc[["text"]], "binary" ) ){ stop( "not a binary connection" ) } was_open <- isOpen( object ) if( ! was_open ){ open( object ) } .Call( "ConnectionOutputStream_new", object, was_open, PACKAGE = "RProtoBuf" ) } ) # }}} RProtoBuf/R/field_count.R0000644000175000017500000000515012440004312015074 0ustar nileshnileshsetGeneric( "field_count", function(object){ standardGeneric( "field_count" ) } ) setMethod( "field_count", "Descriptor", function(object){ .Call( "Descriptor__field_count", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "nested_type_count", function(object){ standardGeneric( "nested_type_count" ) } ) setMethod( "nested_type_count", "Descriptor", function(object){ .Call( "Descriptor__nested_type_count", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "enum_type_count", function(object){ standardGeneric( "enum_type_count" ) } ) setMethod( "enum_type_count", "Descriptor", function(object){ .Call( "Descriptor__enum_type_count", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "field", function(object, index, number, name){ standardGeneric( "field" ) } ) setMethod( "field", "Descriptor", function( object, index, number, name){ has_index <- !missing(index) has_number <- !missing(number) has_name <- !missing(name) if( as.integer(has_index) + as.integer(has_number) + as.integer(has_name) != 1L ){ stop( "need exactly one of `index`, `number` or `name`" ) } if( has_index ){ return( .Call( "Descriptor__field", object@pointer, as.integer(index)-1L, PACKAGE = "RProtoBuf" ) ) } if( has_number ){ return( .Call( "Descriptor__FindFieldByNumber", object@pointer, as.integer(number), PACKAGE = "RProtoBuf" ) ) } if( has_name ){ return( .Call( "Descriptor__FindFieldByName", object@pointer, as.character(name), PACKAGE = "RProtoBuf" ) ) } } ) setGeneric( "nested_type", function(object, index, name){ standardGeneric( "nested_type" ) } ) setMethod( "nested_type", "Descriptor", function(object, index, name ){ has_index <- !missing(index) has_name <- !missing(name) if( !identical( as.integer(has_index) + as.integer(has_name), 1L ) ){ stop( "need exactly one of `index` or `name`" ) } if( has_index ){ return( .Call( "Descriptor__nested_type", object@pointer, as.integer(index)-1L, PACKAGE = "RProtoBuf" ) ) } if( has_name ){ return( .Call( "Descriptor__FindNestedTypeByName", object@pointer, as.character(name), PACKAGE = "RProtoBuf" ) ) } } ) setMethod( "enum_type", "Descriptor", function(object, index, name){ has_index <- !missing(index) has_name <- !missing(name) if( !identical( as.integer(has_index) + as.integer(has_name), 1L ) ){ stop( "need exactly one of `index` or `name`" ) } if( has_index ){ return( .Call( "Descriptor__enum_type", object@pointer, as.integer(index)-1L, PACKAGE = "RProtoBuf" ) ) } if( has_name ){ return( .Call( "Descriptor__FindEnumTypeByName", object@pointer, as.character(name), PACKAGE = "RProtoBuf" ) ) } }) RProtoBuf/R/aslist.R0000644000175000017500000000124612440004312014102 0ustar nileshnileshas.list.Message <- function( x, ...){ .Call( "Message__as_list", x@pointer, PACKAGE = "RProtoBuf" ) } as.list.Descriptor <- function(x, ...){ # Fields, then nested types, then enum types defined in the message # are returned in a list. .Call( "Descriptor__as_list", x@pointer, PACKAGE = "RProtoBuf" ) } as.list.EnumDescriptor <- function( x, ...){ .Call( "EnumDescriptor__as_list", x@pointer, PACKAGE = "RProtoBuf" ) } as.list.FileDescriptor <- function( x, ...){ .Call( "FileDescriptor__as_list", x@pointer, PACKAGE = "RProtoBuf" ) } as.list.ServiceDescriptor <- function( x, ...){ .Call( "ServiceDescriptor__as_list", x@pointer, PACKAGE = "RProtoBuf" ) } RProtoBuf/R/merge.R0000644000175000017500000000054613057365267013734 0ustar nileshnileshsetGeneric( "merge" ) setMethod( "merge", c( x = "Message", y = "Message" ), function( x, y , ... ){ if( !identical( x@type, y@type ) ){ stop(sprintf("incompatible message types, cannot merge '%s' and '%s'", x@type, y@type)) } message <- .Call( "Message__merge", x@pointer, y@pointer, PACKAGE="RProtoBuf") message } ) RProtoBuf/R/wrapper_EnumDescriptor.R0000644000175000017500000000221112440004312017277 0ustar nileshnilesh setGeneric( "value_count", function(object ){ standardGeneric( "value_count" ) } ) setMethod( "value_count", "EnumDescriptor", function(object){ .Call( "EnumDescriptor__value_count", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "value", function(object, index, name, number ){ standardGeneric( "value" ) } ) setMethod( "value", "EnumDescriptor", function(object, index, name, number){ has_index <- !missing(index) has_number <- !missing(number) has_name <- !missing(name) if( as.integer(has_index) + as.integer(has_number) + as.integer(has_name) != 1L ){ stop( "need exactly one of `index`, `number` or `name`" ) } if( has_index ){ stopifnot(is.numeric(index)) return( .Call( "EnumDescriptor__getValueByIndex", object@pointer, as.integer(index)-1L, PACKAGE = "RProtoBuf" ) ) } if( has_number ){ stopifnot(is.numeric(number)) return( .Call( "EnumDescriptor__getValueByNumber", object@pointer, as.integer(number), PACKAGE = "RProtoBuf" ) ) } if( has_name ){ stopifnot(is.character(name)) return( .Call( "EnumDescriptor__getValueByName", object@pointer, as.character(name), PACKAGE = "RProtoBuf" ) ) } } ) RProtoBuf/R/wrapper_CodedInputStream.R0000644000175000017500000000443512440004312017560 0ustar nileshnilesh setGeneric( "ReadRaw", function(object, size ){ standardGeneric( "ReadRaw" ) } ) setMethod( "ReadRaw", c( object="ZeroCopyInputStream", size = "integer" ), function(object, size){ .Call( "ZeroCopyInputStream_ReadRaw", object@pointer, size, PACKAGE = "RProtoBuf" ) } ) setMethod("ReadRaw", c( object="ZeroCopyInputStream", size = "numeric" ), function(object, size) { if (size %% 1 == 0) { .Call( "ZeroCopyInputStream_ReadRaw", object@pointer, as.integer(size), PACKAGE = "RProtoBuf" ) } else { stop("Size must be a whole number.") } } ) setGeneric( "ReadString", function(object, size ){ standardGeneric( "ReadString" ) } ) setMethod( "ReadString", c( object="ZeroCopyInputStream", size = "integer" ), function(object, size){ .Call( "ZeroCopyInputStream_ReadString", object@pointer, size, PACKAGE = "RProtoBuf" ) } ) setMethod("ReadString", c( object="ZeroCopyInputStream", size = "numeric" ), function(object, size) { if (size %% 1 == 0) { .Call("ZeroCopyInputStream_ReadString", object@pointer, as.integer(size), PACKAGE = "RProtoBuf" ) } else { stop("Size must be a whole number.") } } ) setGeneric( "ReadVarint32", function(object){ standardGeneric( "ReadVarint32" ) } ) setMethod( "ReadVarint32", c( object="ZeroCopyInputStream"), function(object){ .Call( "ZeroCopyInputStream_ReadVarint32", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "ReadLittleEndian32", function(object){ standardGeneric( "ReadLittleEndian32" ) } ) setMethod( "ReadLittleEndian32", c( object="ZeroCopyInputStream"), function(object){ .Call( "ZeroCopyInputStream_ReadLittleEndian32", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "ReadLittleEndian64", function(object){ standardGeneric( "ReadLittleEndian64" ) } ) setMethod( "ReadLittleEndian64", c( object="ZeroCopyInputStream"), function(object){ .Call( "ZeroCopyInputStream_ReadLittleEndian64", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "ReadVarint64", function(object){ standardGeneric( "ReadVarint64" ) } ) setMethod( "ReadVarint64", c( object="ZeroCopyInputStream"), function(object){ .Call( "ZeroCopyInputStream_ReadVarint64", object@pointer, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/set.R0000644000175000017500000000274112440004312013377 0ustar nileshnilesh## TODO(mstokely): Set and fetch are undocumented in Message-class.Rd ## And untested. Are they usful? setGeneric( "set", function(object, field, index, values ){ standardGeneric( "set" ) } ) setMethod( "set", "Message", function(object, field, index, values ){ if( !is.numeric( index ) ){ stop( "index should be numbers" ) } if( inherits( values, "Message" ) ){ values <- list( values ) } # TODO: we need to handle R type = RAWSXP and cpp type == string or bytes if( !identical( length( values ), length(index) ) ){ # TODO: we might want to be more flexible about that later # recycling, ... stop( "`index` should have the same length as `values`" ) } fsize <- size( object, field ) if( any( index > fsize ) || any( index < 1) ){ stop( sprintf( "index should only contain values between 1 and %d", fsize ) ) } .Call( "Message__set_field_values", object@pointer, field, index - 1L , values, PACKAGE = "RProtoBuf" ) # we work by reference invisible( NULL ) } ) setGeneric( "fetch", function(object, field, index ){ standardGeneric( "fetch" ) } ) setMethod( "fetch", "Message", function(object, field, index ){ if( !is.numeric( index ) ){ stop( "index should be numbers" ) } fsize <- size( object, field ) if( any( index > fsize ) || any( index < 1) ){ stop( sprintf( "index should only contain values between 1 and %d", fsize ) ) } .Call( "Message__get_field_values", object@pointer, field, index - 1L , PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/00classes.R0000644000175000017500000004755714060657043014436 0ustar nileshnilesh# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: # this has to be IMPLEMENTATIONS <- new.env( parent = emptyenv() ) # invisible version of .Call #.icall <- function(...) invisible(.Call(...)) # {{{ class definitions # we need to formalize connection so that the S4 methods # ConnectionInputStream and ConnectionOutputStream can # dispatch connections setOldClass( "connection" ) # FIXME: there is probably another way # TODO: include other subclasses of connections setOldClass( c("file", "connection" ) ) setOldClass( c("url", "connection" ) ) setClass( "Descriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::Descriptor c++ object type = "character" # message type ), prototype = list( pointer = NULL, type = character(0) ) ) setClass( "FieldDescriptor", representation( pointer = "externalptr" , # pointer to a google::protobuf::FieldDescriptor c++ object name = "character", full_name = "character", type = "character" ), prototype = list( pointer = NULL, name = character(0), full_name = character(0), type = character(0) ) ) setClass( "EnumDescriptor", representation( pointer = "externalptr" , # pointer to a google::protobuf::EnumDescriptor c++ object name = "character", full_name = "character", type = "character" # TODO(mstokely): enums don't really have another type, remove? ), prototype = list( pointer = NULL, name = character(0), full_name = character(0), type = character(0) ) ) setClass( "ServiceDescriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::ServiceDescriptor c++ object name = "character" # full name of the service ), prototype = list( pointer = NULL, name = character(0) ) ) setClass( "MethodDescriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::ServiceDescriptor c++ object name = "character" , # full name of the service service = "character" # full name of the service that defines this method ), prototype = list( pointer = NULL, name = character(0), service = character(0) ) ) setClass( "FileDescriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::FileDescriptor c++ object filename = "character", # filename package = "character" # the package ), prototype = list( pointer = NULL, filename = character(0), package = character(0) ) ) setClass( "EnumValueDescriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::EnumValueDescriptor c++ object name = "character", full_name = "character" ), prototype = list( pointer = NULL, name = character(0), full_name = character(0) ) ) # actual objects setClass( "Message", representation( pointer = "externalptr", # pointer to sa google::protobuf::Message object type = "character" # message type (fully qualified, with package path) ), prototype = list( pointer = NULL, type = character(0) ) ) # rpc #setClass( "RpcHTTP", representation( # host = "character", port = "integer", root = "character" #), prototype = list( host = "127.0.0.1", port = 4444L, root = "" ) ) # streams setClass( "ZeroCopyInputStream", representation( pointer = "externalptr" ), prototype = list( pointer = NULL ), contains = "VIRTUAL" ) setClass( "ArrayInputStream", contains = "ZeroCopyInputStream" ) setClass( "FileInputStream", contains = "ZeroCopyInputStream" ) setClass( "ConnectionInputStream", contains = "ZeroCopyInputStream" ) setClass( "ZeroCopyOutputStream", representation( pointer = "externalptr" ), prototype = list( pointer = NULL ), contains = "VIRTUAL" ) setClass( "ArrayOutputStream", contains = "ZeroCopyInputStream" ) setClass( "FileOutputStream", contains = "ZeroCopyInputStream" ) setClass( "ConnectionOutputStream", contains = "ZeroCopyOutputStream" ) # }}} # {{{ new newProto <- function( descriptor, ... ){ message <- .Call( "newProtoMessage", descriptor, PACKAGE = "RProtoBuf" ) update( message, ... ) message } setGeneric("new") setMethod("new", signature(Class="Descriptor"), function(Class, ...) newProto(Class, ...)) # }}} # {{{ P P <- function( type, file ){ if( !missing(file) ){ readProtoFiles( file ) } if( missing( type ) ){ stop( "'type' is required" ) } if( !is.character(type) ){ stop( "'type' is not a character vector" ) } if( length(type) != 1L){ stop( "'type' should have exactly one element" ) } desc <- .Call( "getProtobufDescriptor", type, PACKAGE = "RProtoBuf" ) if( is.null( desc ) ){ # See if it is an extension desc <- .Call("getExtensionDescriptor", type, PACKAGE="RProtoBuf") if (is.null(desc)) { # See if it is an enum desc <- .Call("getEnumDescriptor", type, PACKAGE="RProtoBuf") if (is.null(desc)) { stop( sprintf( "could not find descriptor for message type '%s' ", type ) ) } } } desc } # }}} # {{{ show setMethod( "show", c( "Message" ), function(object){ tmp <- sprintf( "message of type '%s' with %d field%s set", object@type, length(object), if (length(object) == 1) "" else "s" ) nexts <- .Call("Message__num_extensions", object@pointer, PACKAGE="RProtoBuf") if (nexts > 0) { tmp <- paste(tmp, sprintf("and %d extension%s", nexts, if (nexts == 1) "" else "s")) } cat(tmp, fill=TRUE) } ) setMethod( "show", c( "Descriptor" ), function(object){ cat( sprintf( "descriptor for type '%s' ", object@type ) , fill=TRUE) } ) setMethod( "show", c( "FieldDescriptor" ), function(object){ cat( sprintf( "descriptor for field '%s' of type '%s' ", object@name, object@type ), fill=TRUE) } ) setMethod( "show", c( "EnumDescriptor" ), function(object){ cat( sprintf( "descriptor for enum '%s' with %d values", object@name, value_count(object) ) , fill=TRUE) } ) setMethod( "show", c( "ServiceDescriptor" ), function(object){ cat( sprintf( "service descriptor <%s>", object@name ) , fill=TRUE) } ) setMethod( "show", c( "FileDescriptor" ), function(object){ cat( sprintf( "file descriptor for package %s (%s)", object@package, object@filename) , fill=TRUE) } ) setMethod( "show", c( "EnumValueDescriptor" ), function(object){ cat( sprintf( "enum value descriptor %s", object@full_name), fill=TRUE) } ) # }}} # {{{ dollar extractors setMethod("$", "Message", function(x, name) { switch( name, "has" = function( ... ) has(x, ...), "clone" = function( ... ) .Call( "Message__clone" , x@pointer, PACKAGE = "RProtoBuf"), "isInitialized" = function() .Call( "Message__is_initialized", x@pointer, PACKAGE = "RProtoBuf"), "descriptor" = function() .Call( "Message__descriptor" , x@pointer, PACKAGE = "RProtoBuf"), "size" = function(field, ...) size(x, field, ... ), "bytesize" = function() bytesize(x), "swap" = function(...) swap(x,...), "update" = function(...) update(x, ...), "str" = function() str(x), "as.character" = function() as.character(x), "as.list" = function() as.list(x), "asMessage" = function() asMessage(x), "setExtension" = function(field, values, ...) setExtension(x, field, values, ...), "getExtension" = function(field, ...) getExtension(x, field, ...), "set" = function(...) set( x, ... ), "fetch" = function(...) fetch(x, ... ), "toString" = function(...) toString( x, ... ), "toJSON" = function(preserve_proto_field_names = FALSE, always_print_primitive_fields = FALSE, ...) toJSON(x, preserve_proto_field_names = preserve_proto_field_names, always_print_primitive_fields = always_print_primitive_fields, ... ), "add" = function(...) add( x, ...), "serialize" = function(...) serialize( x, ... ), "clear" = function(...) clear( x, ... ), "fileDescriptor" = function() fileDescriptor(x ), # default .Call( "getMessageField", x@pointer, name, PACKAGE = "RProtoBuf" ) ) } ) setMethod("$<-", "Message", function(x, name, value) { .Call( "setMessageField", x@pointer, name, value, PACKAGE = "RProtoBuf" ) x } ) setMethod("$", "Descriptor", function(x, name) { switch( name, "new" = function( ... ) newProto( x, ... ) , "read" = function( input ) read( x, input ) , "readASCII" = function(input, ...) readASCII(x, input, ...), "readJSON" = function(input, ...) readJSON(x, input, ...), "toString" = function(...) toString(x, ...) , "as.character" = function(...) as.character(x, ...) , "as.list" = function(...) as.list(x, ...) , "asMessage" = function() asMessage(x), "fileDescriptor" = function() fileDescriptor(x ), "name" = function(...) name(x, ... ), "containing_type" = function() containing_type(x), "field_count" = function() field_count(x), "nested_type_count" = function() nested_type_count(x), "enum_type_count" = function() enum_type_count(x), "field" = function(...) field( x, ... ), "nested_type" = function(...) nested_type( x, ...), "enum_type" = function(...) enum_type( x, ...), # default .Call( "do_dollar_Descriptor", x@pointer, name, PACKAGE="RProtoBuf") ) } ) setMethod( "$", "EnumDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "as.list"= function() as.list(x) , "asMessage" = function() asMessage(x), "toString" = function(...) toString(x, ...) , "name" = function(...) name(x, ...), "fileDescriptor" = function() fileDescriptor(x ), "containing_type" = function() containing_type(x), "length" = function() length(x), "value_count" = function() value_count(x), "value" = function(...) value(x, ...), "has" = function(name, ...) has(x, name, ...), # default .Call( "get_value_of_enum", x@pointer, name, PACKAGE = "RProtoBuf" ) ) } ) setMethod( "$", "FieldDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "asMessage" = function() asMessage(x), "toString" = function(...) toString(x, ...) , "name" = function(...) name(x, ...), "fileDescriptor" = function() fileDescriptor(x ), "containing_type" = function() containing_type(x), "is_extension" = function() is_extension(x), "number" = function() number(x), "type" = function(...) type(x, ...), "cpp_type" = function(...) cpp_type(x, ...), "label" = function(...) label(x, ...), "is_repeated" = function() is_repeated(x), "is_required" = function() is_required(x), "is_optional" = function() is_optional(x), "has_default_value" = function() has_default_value(x), "default_value" = function() default_value(x), "enum_type" = function() enum_type(x), "message_type" = function() message_type(x), invisible(NULL) ) } ) setMethod( "$", "ServiceDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "asMessage" = function() asMessage(x), "toString" = function(...) toString(x, ...) , "name" = function(...) name(x, ...), "fileDescriptor" = function() fileDescriptor(x ), "method_count" = function() method_count(x), "method" = function(...) method(x, ... ), .Call( "ServiceDescriptor__method", x@pointer, name, PACKAGE = "RProtoBuf" ) ) } ) setMethod( "$", "FileDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "toString" = function(...) toString(x, ...) , "asMessage" = function() asMessage(x), "as.list" = function() as.list(x), "name" = function(...) name(x, ... ), "package" = function() x@package, as.list(x)[[name]] ) }) setMethod( "$", "EnumValueDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "toString" = function(...) toString(x, ...) , "asMessage" = function() asMessage(x), "name" = function(...) name(x, ... ), "number" = function() number(x), "enum_type" = function(...) enum_type( x, ...), invisible(NULL) ) }) setMethod( "$", "MethodDescriptor", function(x, name ){ switch( name, #"invoke" = function(...) invoke(x, ...), "implementation" = if( x@name %in% names(IMPLEMENTATIONS) ){ get( x@name, IMPLEMENTATIONS ) }, "name" = function(...) name(x, ...), "toString" = function() toString(x) , "as.character" = function() as.character(x), "fileDescriptor" = function() fileDescriptor(x ), "input_type" = function() input_type(x), "output_type" = function() output_type(x), invisible( NULL) ) } ) #setMethod( "$<-", "MethodDescriptor", function(x, name, value ){ # # if( identical( name, "implementation" ) ){ # check_valid_implementation( x, value ) # assign( x@name, value, envir = IMPLEMENTATIONS ) # } # x #} ) setMethod( "$", "ZeroCopyInputStream", function(x, name ){ switch( name, # ZeroCopyInputStream C++ methods "Next" = function(...) Next(x, ...), "ByteCount" = function(...) ByteCount(x, ...), "Skip" = function(...) Skip(x, ...), "BackUp" = function(...) BackUp(x, ...), # CodedInputStream related "ReadRaw" = function(...) ReadRaw(x, ...), "ReadString" = function(...) ReadString(x, ...), "ReadVarint32"= function() ReadVarint32(x), "ReadVarint64" = function() ReadVarint64(x), "ReadLittleEndian32" = function() ReadLittleEndian32(x), "ReadLittleEndian64" = function() ReadLittleEndian64(x), # default invisible(NULL) ) } ) setMethod( "$", "ZeroCopyOutputStream", function(x, name ){ switch( name, # ZeroCopyInputStream C++ methods "Next" = function(...) Next(x, ...), "ByteCount" = function(...) ByteCount(x, ...), "BackUp" = function(...) BackUp(x, ...), # CodedOutputStream related "WriteRaw" = function(...) WriteRaw(x, ...), "WriteString" = function(...) WriteString(x, ...), "WriteLittleEndian32" = function(...) WriteLittleEndian32(x,...), "WriteLittleEndian64" = function(...) WriteLittleEndian64(x,...), "WriteVarint32" = function(...) WriteVarint32(x, ...), "WriteVarint64" = function(...) WriteVarint64(x, ...), # default invisible(NULL) ) } ) # }}} # {{{ [[ setMethod( "[[", "Message", function(x, i, j, ..., exact = TRUE){ if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } ## This works correctly by number or name. e.g. p[[1]] or p[["name"]] if( is.character( i ) || is.numeric( i ) ){ .Call( "getMessageField", x@pointer, i, PACKAGE = "RProtoBuf" ) } else { stop( "wrong type, `i` should be a character or a number" ) } } ) setMethod( "[[", "Descriptor", function(x, i, j, ..., exact = TRUE){ if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } if( is.character( i ) ) { # gets a named field, nested type, or enum. .Call("Descriptor_getField", x@pointer, i, PACKAGE="RProtoBuf") } else if (is.numeric( i ) ) { return(as.list(x)[[i]]) } else { stop( "wrong type, `i` should be a character or a number" ) } } ) setMethod( "[[", "EnumDescriptor", function(x, i, j, ..., exact = TRUE){ if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } if (is.character(i) || is.numeric(i)) { return(as.list(x)[[i]]) } else { stop( "wrong type, `i` should be a character or a number" ) } } ) setMethod("[[", "ServiceDescriptor", function(x, i, j, ..., exact = TRUE){ if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } if( is.character( i ) || is.numeric( i ) ){ .Call( "ServiceDescriptor__method", x@pointer, name, PACKAGE = "RProtoBuf" ) } else{ stop( "wrong type, `i` should be a character or a number" ) } } ) # }}} # {{{ [[<- setReplaceMethod( "[[", "Message", function(x, i, j, ..., exact = TRUE, value ){ # TODO: we might want to relax this later, i.e # allow to mutate repeated fields like this: # x[[ "field", 1:2 ]] <- 1:2 if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } if( is.character( i ) || is.numeric( i ) ){ .Call( "setMessageField", x@pointer, i, value, PACKAGE = "RProtoBuf" ) } else { stop( "wrong type, `i` should be a character or a number" ) } x } ) # }}} # {{{ update setGeneric( "update" ) setMethod( "update", "Message", function( object, ... ){ dots <- list( ... ) if( !length( dots ) ){ return( object ) } names <- names( dots ) named <- dots[ names != "" ] if( !length( named ) ){ return( object ) } .Call( "update_message", object@pointer, named, PACKAGE="RProtoBuf") object } ) # }}} # {{{ length setGeneric( "length" ) setMethod( "length", "Message", function( x ){ .Call( "Message__length", x@pointer, PACKAGE = "RProtoBuf" ) } ) # Returns number of fields, enums, types in message descriptor. # May be more than field_count which is only fields. # e.g. length(tutorial.Person) > field_count(tutorial.Person) setMethod( "length", "Descriptor", function( x ){ length(as.list(x)) } ) setMethod( "length", "EnumDescriptor", function( x ){ .Call( "EnumDescriptor__length", x@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "length", "ServiceDescriptor", function( x ){ .Call( "ServiceDescriptor_method_count", x@pointer, PACKAGE = "RProtoBuf" ) } ) # }}} # {{{ str # we need to do this otherwise it gets messed up by the length method setGeneric( "str" ) setMethod( "str", "Message", function( object, ...){ txt <- sprintf( ' Formal class \'Message\' [package "RProtoBuf"] with 2 slots ..@ pointer: ..@ type : chr "%s" ', object@type ) writeLines( txt ) } ) # }}} # {{{ name setGeneric( "name", function(object, full = FALSE){ standardGeneric( "name" ) }) setMethod( "name", c( object = "Descriptor" ) , function(object, full = FALSE){ .Call( "Descriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" ) }) setMethod( "name", c( object = "FieldDescriptor" ) , function(object, full = FALSE){ .Call( "FieldDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" ) }) setMethod( "name", c( object = "EnumDescriptor" ) , function(object, full = FALSE){ .Call( "EnumDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" ) }) setMethod( "name", c( object = "EnumValueDescriptor" ) , function(object, full = FALSE){ .Call( "EnumDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" ) }) setMethod( "name", c( object = "ServiceDescriptor" ) , function(object, full = FALSE){ .Call( "ServiceDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" ) }) setMethod( "name", c( object = "MethodDescriptor" ) , function(object, full = FALSE){ .Call( "MethodDescriptor__name", object@pointer, full, PACKAGE = "RProtoBuf" ) }) setMethod( "name", c( object = "FileDescriptor" ) , function(object, full = FALSE){ filename <- .Call( "FileDescriptor__name", object@pointer, PACKAGE = "RProtoBuf" ) if( full ) filename else basename( filename ) }) # }}} # {{{ names # as.list() and names() don't make as much sense for FieldDescriptors, # EnumValueDescriptors, etc. setMethod( "names", c( x = "Message" ) , function(x){ names(as.list(x)) }) setMethod( "names", c( x = "Descriptor" ) , function(x){ names(as.list(x)) }) setMethod( "names", c( x = "EnumDescriptor" ) , function(x){ names(as.list(x)) }) # }}} # {{{ as setAs("Descriptor", "Message", function(from){ .Call( "Descriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" ) }) setAs("FieldDescriptor", "Message", function(from){ .Call( "FieldDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" ) }) setAs("EnumDescriptor", "Message", function(from){ .Call( "EnumDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" ) }) setAs("ServiceDescriptor", "Message", function(from){ .Call( "ServiceDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" ) }) setAs("MethodDescriptor", "Message", function(from){ .Call( "MethodDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" ) }) setAs("FileDescriptor", "Message", function(from){ .Call( "FileDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" ) }) setAs("EnumValueDescriptor", "Message", function(from){ .Call( "EnumValueDescriptor__as_Message", from@pointer, PACKAGE = "RProtoBuf" ) }) asMessage <- function( x, ... ){ as( x, "Message", ... ) } # }}} # {{{ enum_type setGeneric( "enum_type", function( object, index, name ){ standardGeneric( "enum_type" ) }) # }}} RProtoBuf/R/internals.R0000644000175000017500000000744213300665751014626 0ustar nileshnilesh# set of functions not supposed to be called by the end user # these are thin wrappers around C functions, to help with # the error trapping on R side #' thin wrapper around the C function of the same name #' #' @param files list of proto files to import #' @param dir directory in which to look for proto files (ignored if files is given) #' @param package if specified, proto files are imported from the "proto" directory #' of the package #' @return invisible(NULL) readProtoFiles <- function(files, dir, package = "RProtoBuf", pattern = "\\.proto$", lib.loc = NULL ){ if( missing( files ) ){ if( missing( dir ) ){ if( missing(package) ){ dir <- getwd() } else { dir <- system.file( "proto", package = package, lib.loc = lib.loc ) if( !file.exists( dir ) ){ stop( sprintf("package '%s' does not have a 'proto' directory", package) ) } } } files <- list.files( dir, pattern = pattern, full.names = TRUE ) } else { if( !is.character( files ) ){ stop( "'file' should be a character vector" ) } ex <- sapply( files, file.exists ) if( ! any( ex ) ){ stop( "none of the files exist" ) } # TODO: we need to pass the full path of the file # or create a mapping from the current working directory # in the DiskSourceTree files <- sapply(files[ex], function(x) file_path_as_absolute(x) ) } directories <- unique( c( getwd(), dirname(files) ) ) .Call( "readProtoFiles_cpp", files, directories, PACKAGE = "RProtoBuf" ) invisible(NULL) } readProtoFiles2 <- function(files, dir = ".", pattern = "\\.proto$", recursive = FALSE, protoPath = getwd() ){ if( !is.character( protoPath ) || length( protoPath ) < 1 ){ stop( "'protoPath' should be a character vector with at least one element" ) } protoPath <- unique( normalizePath( protoPath ) ) # Search for the base directory in the search path that contains the given filepath. file_search <- function(filepaths) { helper <- function(filepath) { if( file.exists( filepath ) && file_path_as_absolute( filepath ) == filepath ){ return( TRUE ) } for( baseDir in protoPath ){ if( file.exists( file.path( baseDir, filepath ) ) ){ return( baseDir ) } } return( NA_character_ ) } sapply( filepaths, helper ) } if( missing( files ) ) { if( !is.character( dir ) || length( dir ) < 1 ){ stop( "'dir' argument must be non-empty when 'files' is missing" ) } files <- c() # search for dir relative to the search path. baseDirs <- file_search( dir ) for( i in seq_along( dir ) ) { absPaths <- list.files( file.path( baseDirs[i], dir[i] ), pattern = pattern, recursive = recursive, full.names = TRUE ) files <- c( files, substr( absPaths, nchar( baseDirs[i] ) + 2, 10000L ) ) files <- sub( "^\\./", "", files ) } } missing_files <- files[ is.na( file_search( files ) ) ] if( length( missing_files) > 0 ){ warning( "Missing files: ", paste(missing_files, collapse = ", " ) ) } .Call( "readProtoFiles_cpp", files, protoPath, PACKAGE = "RProtoBuf" ) invisible(NULL) } resetDescriptorPool <- function(){ .Call( "resetDescriptorPool_cpp", PACKAGE = "RProtoBuf" ) readProtoFiles2( protoPath=system.file( "proto", package="RProtoBuf", lib.loc=.RProtoBuf_libname) ) invisible(NULL) } getProtobufLibVersion <- function( format = FALSE ){ version <- .Call( "get_protobuf_library_version", PACKAGE = "RProtoBuf" ) if( format ){ major <- version %/% 10^6 minor <- ( tmp <- (version - major * 10^6) ) %/% 10^3 revision <- (tmp - minor * 10^3 ) sprintf( "%d.%d.%d", major, minor, revision ) } else { version } } RProtoBuf/R/identical.R0000644000175000017500000000171313377122044014553 0ustar nileshnilesh setGeneric( "identical" ) setMethod( "identical", c(x="Message", y = "Message" ), function( x, y, num.eq = TRUE, single.NA = TRUE, attrib.as.set = TRUE){ .Call( "identical_messages", x@pointer, y@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "==", c( e1 = "Message", e2 = "Message" ), function(e1, e2 ){ .Call( "identical_messages", e1@pointer, e2@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "!=", c( e1 = "Message", e2 = "Message" ), function(e1, e2 ){ ! .Call( "identical_messages", e1@pointer, e2@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "all.equal" ) setMethod( "all.equal", c( target = "Message", current = "Message" ), function(target, current, tolerance = .Machine$double.eps^0.5, ...){ all.equal.Message(target, current, tolerance, ...) } ) all.equal.Message <- function(target, current, tolerance = .Machine$double.eps^0.5, ...){ .Call( "all_equal_messages", target@pointer, current@pointer, tolerance, PACKAGE = "RProtoBuf" ) } RProtoBuf/R/read.R0000644000175000017500000000535413776225671013554 0ustar nileshnilesh setGeneric( "read", function( descriptor, input ){ standardGeneric( "read" ) } ) setMethod( "read", c( descriptor = "Descriptor" , input = "character" ), function(descriptor, input ){ file <- file_path_as_absolute( input ) .Call( "Descriptor__readMessageFromFile", descriptor@pointer, file, PACKAGE = "RProtoBuf" ) } ) setMethod( "read", c( descriptor = "Descriptor", input = "raw" ), function(descriptor, input ){ .Call( "Descriptor__readMessageFromRawVector", descriptor@pointer, input, PACKAGE="RProtoBuf" ) } ) setMethod( "read", c( descriptor = "Descriptor" ), function( descriptor, input ){ if( !inherits( input, "connection" ) ){ stop( "can only read from connections" ) } wasopen <- identical( summary(input)[["opened"]], "opened" ) if( !wasopen ) open( input, "rb") stopifnot(summary(input)[["text"]] == "binary") message <- .Call( "Descriptor__readMessageFromConnection", descriptor@pointer, input, PACKAGE = "RProtoBuf" ) if( !wasopen ) close( input ) message } ) setGeneric( "readASCII", function( descriptor, input, partial=FALSE ){ standardGeneric( "readASCII" ) } ) setMethod( "readASCII", c( descriptor = "Descriptor" , input = "character" ), function(descriptor, input, partial=FALSE){ stopifnot(is.logical(partial), length(partial) == 1) .Call( "Descriptor__readASCIIFromString", descriptor@pointer, input, partial, PACKAGE = "RProtoBuf" ) } ) setMethod( "readASCII", c( descriptor = "Descriptor" ), function( descriptor, input, partial=FALSE){ stopifnot(is.logical(partial), length(partial) == 1) if( !inherits( input, "connection" ) ){ stop( "can only read from connections" ) } wasopen <- identical( summary(input)[["opened"]], "opened" ) if( !wasopen ) open( input, "rb" ) stopifnot(summary(input)[["text"]] == "binary") message <- .Call( "Descriptor__readASCIIFromConnection", descriptor@pointer, input, partial, PACKAGE = "RProtoBuf" ) close(input) message } ) setGeneric( "readJSON", function( descriptor, input ){ standardGeneric( "readJSON" ) } ) setMethod( "readJSON", c( descriptor = "Descriptor" , input = "character" ), function(descriptor, input){ .Call( "Descriptor__readJSONFromString", descriptor@pointer, input, PACKAGE = "RProtoBuf" ) } ) setMethod( "readJSON", c( descriptor = "Descriptor" ), function( descriptor, input){ if( !inherits( input, "connection" ) ){ stop( "can only read from connections" ) } wasopen <- identical( summary(input)[["opened"]], "opened" ) if( !wasopen ) open( input, "rb" ) stopifnot(summary(input)[["text"]] == "binary") message <- .Call( "Descriptor__readJSONFromConnection", descriptor@pointer, input, PACKAGE = "RProtoBuf" ) close(input) message } ) RProtoBuf/R/descriptor.R0000644000175000017500000000233312440004312014757 0ustar nileshnilesh setGeneric( "descriptor", function(object, ...){ standardGeneric( "descriptor" ) } ) setMethod( "descriptor", "Message", function(object, ...){ .Call( "Message__descriptor", object@pointer, PACKAGE = "RProtoBuf" ) } ) setGeneric( "fileDescriptor", function(object, ...){ standardGeneric( "fileDescriptor" ) } ) setMethod( "fileDescriptor", "Message", function(object, ...){ .Call( "Message__fileDescriptor", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "fileDescriptor", "Descriptor", function(object, ...){ .Call( "Descriptor__fileDescriptor", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "fileDescriptor", "EnumDescriptor", function(object, ...){ .Call( "EnumDescriptor__fileDescriptor", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "fileDescriptor", "FieldDescriptor", function(object, ...){ .Call( "FieldDescriptor__fileDescriptor", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "fileDescriptor", "ServiceDescriptor", function(object, ...){ .Call( "ServiceDescriptor__fileDescriptor", object@pointer, PACKAGE = "RProtoBuf" ) } ) setMethod( "fileDescriptor", "MethodDescriptor", function(object, ...){ .Call( "MethodDescriptor__fileDescriptor", object@pointer, PACKAGE = "RProtoBuf" ) } ) RProtoBuf/R/completion.R0000644000175000017500000000766313776225671015017 0ustar nileshnilesh# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: # implementation of completion for proto messages # through the .DollarNames method (R>= 2.10.0) # S4 dispatch does not work for .DollarNames, so we'll use S3 # {{{ bring .DollarNames from the future if necessary if( !exists( ".DollarNames", envir = asNamespace("utils") ) ){ .DollarNames <- function(x, pattern) UseMethod(".DollarNames") } # }}} # {{{ Message .DollarNames.Message <- function(x, pattern = "" ){ names <- c( .Call( "Message__fieldNames", x@pointer, PACKAGE = "RProtoBuf" ) , "has(", "clone()", "clone(", "isInitialized()", "serialize(", "clear()", "clear(", "size(", "bytesize()", "fetch(", "swap(", "str()", "as.character()", "update(", "as.list()", "setExtension(", "getExtension(", "descriptor()", "set(", "toString(", "toJSON(", "add(", "fileDescriptor()" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ Descriptor .DollarNames.Descriptor <- function(x, pattern = "" ){ names <- c( .Call( "Descriptor__getMemberNames", x@pointer, PACKAGE = "RProtoBuf" ), "new(", "read(", "readASCII(", "readJSON(", "fileDescriptor()", "name(", "toString()", "as.character()", "asMessage()", "containing_type()", "field_count()", "nested_type_count()", "enum_type_count", "field(", "nested_type(", "enum_type(" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ EnumDescriptor .DollarNames.EnumDescriptor <- function(x, pattern = "" ){ names <- c( .Call( "EnumDescriptor__getConstantNames", x@pointer, PACKAGE = "RProtoBuf" ), "name(", "fileDescriptor()", "as.character()", "toString()", "containing_type()", "length()", "value_count()", "value(", "has(", "asMessage()") grep( pattern, names, value = TRUE ) } # }}} # {{{ EnumValueDescriptor .DollarNames.EnumValueDescriptor <- function(x, pattern = "" ){ names <- c("number()", "name()", "enum_type()", "as.character()", "toString()", "asMessage()") grep( pattern, names, value = TRUE ) } # }}} # {{{ FieldDescriptor .DollarNames.FieldDescriptor <- function(x, pattern = "" ){ names <- c("as.character()", "toString()", "name(", "fileDescriptor()", "containing_type()", "is_extension()", "number()", "type(", "cpp_type(", "label(", "is_repeated()", "is_required()", "is_optional()", "message_type()", "enum_type()", "asMessage()", "has_default_value()", "default_value(" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ ServiceDescriptor .DollarNames.ServiceDescriptor <- function(x, pattern = "" ){ names <- c( .Call( "ServiceDescriptor__getMethodNames", x@pointer, PACKAGE = "RProtoBuf" ), "as.character()", "toString()", "name(", "fileDescriptor()", "method_count()", "method(name=", "method(index=" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ MethodDescriptor .DollarNames.MethodDescriptor <- function(x, pattern = "" ){ names <- c("as.character()", "toString()", "name(", "fileDescriptor()", "input_type()", "output_type()" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ FileDescriptor .DollarNames.FileDescriptor <- function(x, pattern = "" ){ names <- c( .Call( "FileDescriptor__getMemberNames", x@pointer, PACKAGE = "RProtoBuf" ), "as.character()", "toString()", "name(", "as.list()", "asMessage()", "package()") grep( pattern, names, value = TRUE ) } # }}} # {{{ ZeroCopyInputStream .DollarNames.ZeroCopyInputStream <- function(x, pattern = "" ){ names <- c("Next()", "ByteCount()", "Skip(", "BackUp(", "ReadRaw(", "ReadString()", "ReadVarint32()", "ReadVarint64()", "ReadLittleEndian32()", "ReadLittleEndian64()" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ ZeroCopyOutputStream .DollarNames.ZeroCopyOutputStream <- function(x, pattern = "" ){ names <- c("Next(", "ByteCount()", "BackUp(", "WriteRaw(", "WriteString(", "WriteLittleEndian32(", "WriteLittleEndian64(", "WriteVarint32(", "WriteVarint64(" ) grep( pattern, names, value = TRUE ) } # }}} RProtoBuf/README0000644000175000017500000000355612440004312013145 0ustar nileshnileshQuoting from http://en.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers is a serialization format with an interface description language developed by Google. The original Google implementation for C++, Java and Python is available under a free software, open source license. Various other language implementations are either available or in development. . The design goals for Protocol Buffers emphasized simplicity and performance. In particular, it was designed to be faster than XML (no reproducible comparisons are publicly available to confirm this, however). Protocol Buffers is very similar to Facebook’s Thrift protocol, except it does not include a concrete RPC stack to use for defined services. Since Protocol Buffers was open sourced, a number of RPC stacks have emerged to fill this gap. . Prior to the release as open source, Protocol Buffers had been widely used at Google for storing and interchanging all kinds of structured information. Protocol Buffers serve as a basis for a custom RPC system that is used for practically all inter-machine communication at Google.[1] . Data structures and services are defined in the Proto Definition file (.proto) which is then compiled with protoc. This compilation generates code that matches the services. For example, example.proto will produce example.pb.cc and example.pb.h which will define C++ classes for each Message and Service example.proto defines. . Protocol Buffers allow serialization into any number of formats. In the officially supported implementations there is a full Reflection interface available, making it easy to serialize protos as XML and JSON. . Though the primary purpose of Protocol Buffers is to facilitate network communication, its simplicity and speed make Protocol Buffers a great replacement of data-centric C++ classes and structs. RProtoBuf/inst/0000755000175000017500000000000014156372057013255 5ustar nileshnileshRProtoBuf/inst/CITATION0000644000175000017500000000513512740556466014423 0ustar nileshnilesh## JSS publication bibentry(bibtype = "Article", title = "{RProtoBuf}: Efficient Cross-Language Data Serialization in {R}", author = c(person(given = "Dirk", family = "Eddelbuettel", email = "edd@debian.org"), person(given = "Murray", family = "Stokely", email = "murray@stokely.org"), person(given = "Jeroen", family = "Ooms", email = "jeroen.ooms@stat.ucla.edu")), journal = "Journal of Statistical Software", year = "2016", volume = "71", number = "2", pages = "1--24", doi = "10.18637/jss.v071.i02", header = "To cite RProtoBuf in publications use:", textVersion = paste("Dirk Eddelbuettel, Murray Stokely, Jeroen Ooms (2016).", "RProtoBuf: Efficient Cross-Language Data Serialization in R.", "Journal of Statistical Software, 71(2), 1-24.", "doi:10.18637/jss.v071.i02") ) # Also include the normal auto-generated RProtoBuf citation() # citation(auto=meta) RProtoBuf/inst/tinytest/0000755000175000017500000000000013776225671015146 5ustar nileshnileshRProtoBuf/inst/tinytest/test_proto3.R0000644000175000017500000000304513617260253017545 0ustar nileshnilesh## rprotobuf.h: R/C++ interface class library ## ## Copyright (C) 2017 - 2020 Dirk Eddelbuettel ## ## This file is part of RProtoBuf. ## ## RProtoBuf is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RProtoBuf is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RProtoBuf. If not, see . library(RProtoBuf) ## The Travis CI tests use both proto2 and proto3, so we need to condition against ## running this one with proto2 where it cannot pass we impose a proto3 file isProto3 <- (RProtoBuf:::getProtobufLibVersion() >= 3000000) if (!isProto3) exit_file("Need Proto3 for this test.") #.setUp <- function(){ if( !exists("SearchRequest", "RProtoBuf:DescriptorPool")) { unitest.proto.file <- system.file("tinytest", "data", "proto3.proto", package="RProtoBuf") readProtoFiles(file = unitest.proto.file) } #} #test.proto3 <- function() { q <- new(SearchRequest, query="abc", page_number=42L, result_per_page=77L) expect_equal(q$query, "abc", msg="proto3 string") expect_equal(q$page_number, 42L, msg="proto3 int") expect_equal(q$result_per_page, 77L, msg="proto3 int again") #} RProtoBuf/inst/tinytest/test_bytes.R0000644000175000017500000000203013617260253017436 0ustar nileshnilesh library(RProtoBuf) #.setUp <- function(){ if( ! exists( "TestBytes", "RProtoBuf:DescriptorPool" ) ){ unitest.proto.file <- system.file( "tinytest", "data", "bytes.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) } #} #test.all <- function() { test <- new(TestBytes, req = "abc", rep = list(charToRaw("def"), raw(10))) expect_equal(rawToChar(test$req), "abc") test$req <- charToRaw("abc") expect_equal(rawToChar(test$req), "abc") expect_equal(rawToChar(test$opt), "hello world") expect_equal(test$rep, list(charToRaw("def"), raw(10))) test$rep[[3]]=charToRaw("ghi") expect_equal(test$rep, list(charToRaw("def"), raw(10), charToRaw("ghi"))) ser <- serialize(test, NULL) test1 <- read(TestBytes, ser) expect_equal(rawToChar(test1$req), "abc") expect_equal(rawToChar(test1$opt), "hello world") expect_equal(test1$rep, list(charToRaw("def"), raw(10), charToRaw("ghi"))) ## Test raw(10) can be set to a single req field. test$req <- raw(10) expect_equal(length(test$req), 10) expect_true(all(test$req == raw(10))) #} RProtoBuf/inst/tinytest/test_extremevalues.R0000644000175000017500000000334513617260253021213 0ustar nileshnilesh# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.uint32 <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } foo <- new(protobuf_unittest.TestAllTypes) foo$optional_uint32 <- 2^32 - 1 foo$repeated_uint32 <- c(foo$optional_uint32, foo$optional_uint32) expect_equal(as.character(foo$optional_uint32), "4294967295") expect_equal(foo$optional_uint32, foo$repeated_uint32[[1]]) foo$add("repeated_uint32", c(2^32 - 1, 2^32 - 1)) expect_equal(length(unique(foo$repeated_uint32)), 1) ## fixed32 are a more efficient representation of uint32 foo$optional_fixed32 <- 2^32 - 1 foo$repeated_fixed32 <- c(foo$optional_fixed32, foo$optional_fixed32) expect_equal(as.character(foo$optional_fixed32), "4294967295") expect_equal(foo$optional_fixed32, foo$repeated_fixed32[[1]]) #} RProtoBuf/inst/tinytest/test_int64.R0000644000175000017500000000515613617260253017270 0ustar nileshnilesh# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.int64 <- function() { ## Preserve option. old.optval <- options("RProtoBuf.int64AsString") on.exit(options(old.optval)) if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } if (.Machine$sizeof.longlong < 8) { exit_file("Can't test 64-bit int type on platform with sizeof(long long) < 8") } if (is.na(Rcpp:::capabilities()["long long"]) || Rcpp:::capabilities()["long long"] != TRUE) { exit_file("Can't test 64-bit int type without RCPP_LONG_LONG support.") } a <- new(protobuf_unittest.TestAllTypes) a$repeated_int64 <- 1 # Now just test that we can use add to set int64 fields. a$add("repeated_int64", 2:10) expect_equal(length(a$repeated_int64), 10) # Verify we can set character strings of large 64-bit ints a$repeated_int64 <- c("9007199254740992", "9007199254740993") expect_equal(length(a$repeated_int64), 2) # Verify we can't set any garbage string to a repeated int64. expect_error(a$repeated_int64 <-c("invalid", "invalid")) a$optional_int64 <- 1 a$optional_int64 <- "2" expect_equal(a$optional_int64, 2) # Verify we can't set any garbage string to an optional int64. expect_error(a$optional_int64 <- "invalid") a <- protobuf_unittest.TestAllTypes$readASCII(file(system.file("tinytest", "data", "int64.ascii", package="RProtoBuf"))) # And can read them in OK from an ASCII file. expect_equal(length(a$repeated_int64), 2) # By default, when they are read as numerics, only 1 unique value expect_equal(length(unique(a$repeated_int64)), 1) options("RProtoBuf.int64AsString" = TRUE) # But we can see they are different if we treat them as strings. expect_equal(length(unique(a$repeated_int64)), 2) #} RProtoBuf/inst/tinytest/test_int32.R0000644000175000017500000000353313617260253017260 0ustar nileshnilesh# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.int32 <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } a <- new(protobuf_unittest.TestAllTypes) a$repeated_int32 <- 1 # Verify we can set character strings a$repeated_int32 <- c("9007", "9008") expect_equal(length(a$repeated_int32), 2) # Verify we can't set any garbage string to a repeated int32. expect_error(a$repeated_int32 <-c("invalid", "invalid")) expect_error(a$repeated_int32 <-c("33-")) a$optional_int32 <- 1 a$optional_int32 <- "2" expect_equal(a$optional_int32, 2) # Verify we can't set any garbage string to an optional int32. expect_error(a$optional_int32 <- "invalid") a$optional_uint32 <- 10000 a$optional_uint32 <- "200000" expect_equal(a$optional_uint32, 200000) # Verify we can't set any garbage string to an optional uint32. expect_error(a$optional_uint32 <- "invalid") a$repeated_uint32 <- c("9007", "9008") expect_equal(length(a$repeated_uint32), 2) #} RProtoBuf/inst/tinytest/test_addressbook.R0000644000175000017500000001226513776225671020636 0ustar nileshnilesh library(RProtoBuf) ## created as ## demo(addressbook) ## creates 'book' ## serialize(book, "/tmp/addressbook.pb") # this is executed before each test function -- but somehow does not work #.setUp <- function() { file <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) book <- read( tutorial.AddressBook, file ) assign("book", book, globalenv()) #} #test.size <- function() { expect_equal(book$size("person"), 2, info="Number of persons") expect_equal(bytesize(book), 125, info="Bytes in book") expect_equal(bytesize(book$person[[1]]), 60, info="Bytes of first person message") #} #test.fileDescriptor <- function() { expect_equal(name(book$fileDescriptor()), "addressbook.proto") #} #test.personOne <- function() { expect_equal(book$person[[1]]$name, "Romain Francois", info="First person name") expect_equal(book$person[[2]]$name, "Dirk Eddelbuettel", info="First person name") expect_equal(book$person[[1]]$id, 1, info="First person id") expect_equal(book$person[[2]]$id, 2, info="First person id") expect_equal(book$person[[1]]$email, "romain@r-enthusiasts.com", info="First person email") expect_equal(book$person[[2]]$email, "edd@debian.org", info="Second person email") expect_equal(length(book$person[[1]]$phone), 1, info="First person phones") expect_equal(length(book$person[[2]]$phone), 2, info="Second person phones") expect_equal(book$person[[1]]$phone[[1]]$number, "+33(0)...", info="First person phone number") expect_equal(book$person[[2]]$phone[[1]]$number, "+01...", info="Second person phone number") expect_equal(book$person[[2]]$phone[[1]]$type, 0, info="Second person phone number") #} #test.ascii <- function() { ## Output in text format to a temporary file out.file <- tempfile() writeLines( as.character(book), file(out.file)) ## Verify that we can read back in the message from a text file. book2 <- readASCII( tutorial.AddressBook, file(out.file, "rb")) expect_equal(as.character(book), as.character(book2) ) ## Verify that we can read in messages from unopened connections. book3 <- readASCII( tutorial.AddressBook, file(out.file)) expect_equal(as.character(book), as.character(book3) ) ## Verify that we get an exception if we try to read from a text connection. ## (better than silently getting an empty proto.) book4 <- expect_error( readASCII( tutorial.AddressBook, file(out.file, "rt"))) ## # Test does not work on windows because of chmod ## if(!grepl("mingw", R.Version()$platform)){ ## # Verify that we get an exception if the file is not readable. ## old.mode <- file.info(out.file)[["mode"]] ## Sys.chmod(out.file, "0000") ## book5 <- checkException( readASCII( tutorial.AddressBook, file(out.file, "rb"))) ## # Set the permissions back to ensure the file is cleaned up properly. ## Sys.chmod(out.file, old.mode) ## } ## Verify that we get an exception if the file is not parseable. out.file2 <- tempfile() writeLines("jibberish", file(out.file2)) book6 <- expect_error( readASCII( tutorial.AddressBook, file(out.file2))) ## Verify that we get an exception if we forget the file() and thus treat the ## path as a protobuf string. expect_error( readASCII( tutorial.AddressBook, out.file2)) incomplete.msg <- new(tutorial.Person, name="Murray", email="murray@stokely.org") tmp.file <- tempfile() writeLines(as.character(incomplete.msg), file(tmp.file)) expect_true(!incomplete.msg$isInitialized()) ## Verify we normally get an exception if we try to read an incomplete ASCII protocol buffer expect_error(tutorial.Person$readASCII(file(tmp.file))) ## Verify we can however read it if we set partial=TRUE. new.msg <- tutorial.Person$readASCII(file(tmp.file), TRUE) expect_equal(incomplete.msg$name, new.msg$name) #} ## Ensure we do not try to run JSON tests on older ProtoBuf versions ## Support starts with version 3. isProto2 <- (RProtoBuf:::getProtobufLibVersion() < 3000000) if (isProto2) exit_file("Skipping JSON tests with ProtoBuf2") # These tests are similar to the group of tests covered with test.ascii above. #test.json <- function() { ## Output in JSON format to a temporary file out.file <- tempfile() writeLines( book$toJSON(), file(out.file)) ## Verify that we can read back in the message from a text file. book2 <- readJSON( tutorial.AddressBook, file(out.file, "rb")) expect_equal(as.character(book), as.character(book2) ) ## Verify that we can read in messages from unopened connections. book3 <- readJSON( tutorial.AddressBook, file(out.file)) expect_equal(as.character(book), as.character(book3) ) ## Verify that we get an exception if we try to read from a text connection. ## (better than silently getting an empty proto.) book4 <- expect_error( readJSON( tutorial.AddressBook, file(out.file, "rt"))) ## Verify that we get an exception if the file is not parseable. out.file2 <- tempfile() writeLines("jibberish", file(out.file2)) book6 <- expect_error( readJSON( tutorial.AddressBook, file(out.file2))) ## Verify that we get an exception if we forget the file() and thus treat the ## path as a protobuf string. expect_error( readJSON( tutorial.AddressBook, out.file2)) #} RProtoBuf/inst/tinytest/test_fielddescriptor.R0000644000175000017500000000622013617260253021477 0ustar nileshnilesh# Copyright 2012 Google Inc. # Author: Murray Stokely # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) # this is executed before each test function #.setUp <- function(){ if( !exists("tutorial.Person", "RProtoBuf:DescriptorPool")) { protofile <- system.file("proto", "addressbook.proto", package = "RProtoBuf" ) readProtoFiles(file = protofile) } #} #test.FieldDescriptor.class <- function() { Person <- P( "tutorial.Person") ## field descriptor object expect_true(!is.null(Person$email), info="non-null email") ## debug string expect_true(nchar(as.character( Person$email )) > 1, info="non-empty email") ## default values expect_true(!has_default_value(Person$id), info="no default for id") expect_true(has_default_value(Person$PhoneNumber$type), info="default for phone") expect_equal(default_value(Person$PhoneNumber$type), 1, info="check default for phone type") expect_equal(default_value(Person$id), 0, info="check default for person id") ## Get the types of field descriptors expect_equal(type(Person$id), TYPE_INT32, info="type int32") expect_equal(type(Person$id, TRUE), "TYPE_INT32", info="type int32 as char") expect_equal(cpp_type(Person$email), CPPTYPE_STRING, info="cpptype string") expect_equal(cpp_type(Person$email, TRUE), "CPPTYPE_STRING", info="cpptype string as char") ## Get the label of a field descriptor expect_equal(label(Person$id), LABEL_REQUIRED, info="label required") expect_equal(label(Person$id, TRUE), "LABEL_REQUIRED", info="label required as char") expect_equal(label(Person$email), LABEL_OPTIONAL, info="label optional") expect_equal(label(Person$email, TRUE), "LABEL_OPTIONAL", info="label optional as char") ## Test if a field is optional expect_true(is_required(Person$id), info="id is required") expect_true(!is_optional(Person$id), info="id is not optional") expect_true(!is_repeated(Person$id), info="id is not repeated") expect_true(!is_required(Person$email), info="email is not required") expect_true(is_optional(Person$email), info="email is optional") expect_true(!is_repeated(Person$email), info="email is not repeated") ## Return the class of a message field expect_true(inherits(message_type(Person$phone), "Descriptor"), info="inherits Descriptor") ## Containing type of a field is the message descriptor expect_true(inherits(Person$id$containing_type(), "Descriptor"), info="inherits containing type Descriptor") ## No containing type for the top-level message descriptor. expect_true(is.null(Person$containing_type()), info="no containing typw") #} RProtoBuf/inst/tinytest/test_extensions.R0000644000175000017500000000731213617260253020517 0ustar nileshnilesh# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.extension <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } expect_true(inherits(protobuf_unittest.optional_uint32_extension, "FieldDescriptor")) ## Verify we can pull in other extensions with P() expect_true(inherits(P("protobuf_unittest.optional_uint32_extension"), "FieldDescriptor")) ## Test setting and getting singular extensions. test <- new(protobuf_unittest.TestAllExtensions) test$setExtension(protobuf_unittest.optional_int32_extension, as.integer(1)) expect_equal(test$getExtension(protobuf_unittest.optional_int32_extension), as.integer(1)) ## Unset extensions should return NULL. expect_equal(test$getExtension(protobuf_unittest.optional_double_extension), NULL) ## Test setting and getting repeated extensions. expect_equal(test$getExtension(protobuf_unittest.repeated_int32_extension), NULL) test$setExtension(protobuf_unittest.repeated_int32_extension, 1:10) expect_equal(test$getExtension(protobuf_unittest.repeated_int32_extension), 1:10) ## Test nested extensions. expect_equal(test$getExtension(protobuf_unittest.TestNestedExtension.test), NULL) test$setExtension(protobuf_unittest.TestNestedExtension.test, "foo") expect_equal(test$getExtension(protobuf_unittest.TestNestedExtension.test), "foo") ## Test setting and getting enums. test$setExtension(protobuf_unittest.optional_nested_enum_extension, protobuf_unittest.TestAllTypes.NestedEnum$BAR) ## Test foreign message extensions foo <- new(protobuf_unittest.ForeignMessage) foo$c <- 3 test$setExtension(protobuf_unittest.optional_foreign_message_extension, foo) expect_equal(test$getExtension(protobuf_unittest.optional_foreign_message_extension)$c, 3) # This causes an Rcpp exception, but not an R stop error as of my # version of Rcpp, so we can't checkError unfortunately, but we # can at least make sure it doesn't crash R. # TODO(edd): Commented out now # test$setExtension(protobuf_unittest.optional_nested_enum_extension, 9) ## Test nested message extensions. tmp <- new( protobuf_unittest.TestAllTypes.NestedMessage ) tmp$bb <- 3 test$setExtension(protobuf_unittest.optional_nested_message_extension, tmp) expect_equal(test$getExtension(protobuf_unittest.optional_nested_message_extension)$bb, 3) ## Check that we do something sensible if invalid field descriptors are passed expect_error(test$getExtension(protobuf_unittest.TestAllExtensions)) expect_error(test$setExtension(protobuf_unittest.TestAllExtensions, 3)) ## Check that we don't CHECK fail in C++, but instead give a reasonable ## error message if incorrect extensions types are provided. expect_error(test$getExtension(protobuf_unittest.my_extension_string)) #} RProtoBuf/inst/tinytest/test_messages.R0000644000175000017500000000367513617260253020137 0ustar nileshnilesh# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.message <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } a <- new(protobuf_unittest.TestAllTypes) a$optionalgroup$a <- 3 expect_equal(a$optionalgroup$a, 3) a$repeated_nested_message <- list( new(protobuf_unittest.TestAllTypes.NestedMessage, bb=3), new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4)) expect_equal(a$repeated_nested_message[[1]]$bb, 3) expect_equal(a$repeated_nested_message[[2]]$bb, 4) expect_error(a$repeated_nested_message <- list( new(protobuf_unittest.ForeignMessage, c=1), new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4))) expect_error(a$repeated_nested_message <- list( new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4), new(protobuf_unittest.ForeignMessage, c=1))) expect_error(a$repeated_nested_message <- list( new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4), 3)) expect_error(a$repeated_nested_message <- list( new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4), "foo")) #} RProtoBuf/inst/tinytest/test_serialize.R0000644000175000017500000000615513617260253020313 0ustar nileshnilesh## -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- ## Copyright 2012 Google Inc. All Rights Reserved. ## Author: Murray Stokely ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either version 2 ## of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) # this is executed before each test function #.setUp <- function() { if (!exists("tutorial.Person", "RProtoBuf:DescriptorPool")) { protofile <- system.file("proto", "addressbook.proto", package = "RProtoBuf") readProtoFiles(file = protofile) } #} #test.arrayinputstream <- function() { # Note: This class is experimental, and some parts of the design # may need to change, but this works now. stream <- ArrayInputStream(as.raw(0:10)) expect_equal(stream$ReadRaw(5), as.raw(0:4)) stringstream <- ArrayInputStream(as.raw(c(0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67))) expect_equal(stringstream$ReadString(as.integer(7)), "testing") intstream <- ArrayInputStream(as.raw(c(0x9e, 0xa7, 0x05))) expect_equal(intstream$ReadVarint32(), 86942) #} #test.encoding <- function() { if (!exists("protobuf_encoding_test.Test1", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "encoding.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } ## Encoding examples from: ## https://developers.google.com/protocol-buffers/docs/encoding test1 <- new(protobuf_encoding_test.Test1) test1$a <- 150 expect_identical(test1$serialize(NULL), as.raw(c(0x08,0x96,0x01))) test2 <- new(protobuf_encoding_test.Test2) test2$b <- "testing" expect_identical(test2$serialize(NULL), as.raw(c(0x12, 0x07, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67))) test3 <- new(protobuf_encoding_test.Test3) test3$c$a <- 150 expect_identical(test3$serialize(NULL), as.raw(c(0x1a, 0x03, 0x08, 0x96, 0x01))) test4 <- new(protobuf_encoding_test.Test4) test4$d <- c(3, 270, 86942) expect_identical(test4$serialize(NULL), as.raw(c(0x22, 0x06, 0x03, 0x8e, 0x02, 0x9e, 0xa7, 0x05))) #} #test.serialize <- function() { person <- new(tutorial.Person) expect_true(!person$isInitialized()) expect_error(serialize(person, NULL)) #"Uninitialized object should fail to serialize.") person$id <- 1 expect_error(serialize(person, NULL)) #"Uninitialized object should fail to serialize.") person$name <- "Murray" expect_true(person$isInitialized()) expect_true(length(serialize(person, NULL)) > 1) #} RProtoBuf/inst/tinytest/test_serialize_pb.R0000644000175000017500000000342113617260253020765 0ustar nileshnilesh## Jeroen Ooms and Dirk Eddelbuettel library(RProtoBuf) #test.serialize_pb <- function() { ##verify that rexp.proto is loaded RProtoBuf:::pb(rexp.REXP) ##serialize a nested list x <- list(foo=cars, bar=Titanic) expect_equal(unserialize_pb(serialize_pb(x, NULL)), x) ##a bit of everything, copied from jsonlite package set.seed('123') myobject <- list( mynull = NULL, mycomplex = lapply(eigen(matrix(-rnorm(9),3)), round, 3), mymatrix = round(matrix(rnorm(9), 3),3), myint = as.integer(c(1,2,3)), mydf = cars, mylist = list(foo='bar', 123, NA, NULL, list('test')), mylogical = c(TRUE,FALSE,NA), mychar = c('foo', NA, 'bar'), myemptychar = character(0), somemissings = c(1,2,NA,NaN,5, Inf, 7 -Inf, 9, NA), myrawvec = charToRaw('This is a test'), myS4 = asS4("test") ) expect_equal(unserialize_pb(serialize_pb(myobject, NULL)), myobject) #} #test.serialize_pb.alldatasets <- function() { datasets <- as.data.frame(data(package="datasets")$results) datasets$name <- sub("\\s+.*$", "", datasets$Item) encoded.datasets <- sapply(datasets$name, function(x) serialize_pb(get(x), NULL)) unserialized.datasets <- sapply(encoded.datasets, unserialize_pb) expect_true(all(sapply(names(unserialized.datasets), function(name) identical(get(name), unserialized.datasets[[name]])))) #} ## this was issue #37 reported and fixed by Jeffrey Shen #test.serialize.sublist <- function() { x <- packageVersion("RProtoBuf") expect_identical(x, unserialize_pb(serialize_pb(x, NULL)), info="checking sublists") #} t#est.serialize.posixlt <- function() { x <- as.POSIXlt("1970-01-01T00:00:00Z") expect_identical(x, unserialize_pb(serialize_pb(x, NULL)), info="checking posixlt") #} RProtoBuf/inst/tinytest/test_descriptors.R0000644000175000017500000000242413617260253020660 0ustar nileshnilesh# Copyright 2014 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.descriptor <- function() { expect_true(inherits(tutorial.Person$email, "FieldDescriptor")) expect_true(inherits(tutorial.Person[["email"]], "FieldDescriptor")) expect_true(inherits(tutorial.Person[[1]], "FieldDescriptor")) ## Currently, the $ extractor for fields returns NULL for invalid reference ## stop() probably better. expect_equal(tutorial.Person$nonexistantfoobarbaz, NULL) ## But we raise an error with invalid indices with '[['. expect_error(tutorial.Person[[909]]) expect_error(tutorial.Person[["nonexistantfoobarbaz"]]) #} RProtoBuf/inst/tinytest/test_enums.R0000644000175000017500000000462013617260253017446 0ustar nileshnilesh# Copyright 2011 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.enums <- function() { ProtoFormat <- P("tutorial.Person") ## value(..) returns an EnumValueDescriptor object expect_equal(name(value(ProtoFormat$PhoneType, index=1)), "MOBILE") expect_equal(name(value(ProtoFormat$PhoneType, index=1), TRUE), "tutorial.Person.MOBILE") expect_equal(number(value(ProtoFormat$PhoneType, index=1)), 0) expect_true(inherits(enum_type(value(ProtoFormat$PhoneType, index=1)), "EnumDescriptor")) expect_true(inherits(asMessage(value(ProtoFormat$PhoneType, index=1)), "Message")) ## Now check the '$' interfaces expect_equal(name(value(ProtoFormat$PhoneType, index=1)), value(ProtoFormat$PhoneType, index=1)$name()) expect_equal(number(value(ProtoFormat$PhoneType, index=1)), value(ProtoFormat$PhoneType, index=1)$number()) expect_equal(name(value(ProtoFormat$PhoneType, index=2)), "HOME") expect_equal(length(ProtoFormat$PhoneType), 3) expect_true(has(ProtoFormat$PhoneType, "WORK")) expect_true(!has(ProtoFormat$PhoneType, "NONEXISTANT")) ## Verify we can subset the EnumDescriptor class expect_equal(ProtoFormat$PhoneType[["WORK"]], 2) expect_equal(ProtoFormat$PhoneType[["MOBILE"]], 0) ## Verify that invalid indices are returned as NULL. expect_true(is.null(value(ProtoFormat$PhoneType, index=900))) ## Verify that we import top-level enums from .proto files. if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } expect_true(inherits(P("protobuf_unittest.ForeignEnum"), "EnumDescriptor")) #} RProtoBuf/inst/tinytest/test_nested.R0000644000175000017500000000120713617260253017577 0ustar nileshnilesh library(RProtoBuf) #.setUp <- function(){ if( ! exists( "NestedOuter", "RProtoBuf:DescriptorPool" ) ) { ## None of the messages in unittest.proto is exactly right to tickle this bug. unitest.proto.file <- system.file( "tinytest", "data", "nested.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) } #} # RProtoBuf before v0.2.5 had a bug whereby uninitialized memory was read and used # to determine whether or not to update a nested message field in new() / update(). #test.nested <- function() { for (i in 1:1000) { q <- new(NestedOuter, b=new(NestedInner, x=1)) expect_true(q$isInitialized()) } #} RProtoBuf/inst/tinytest/test_golden_message.R0000644000175000017500000001332113617260253021271 0ustar nileshnilesh library(RProtoBuf) # this is executed before each test function #.setUp <- function() { if (! exists("protobuf_unittest_import.TestAllTypes", "RProtoBuf:DescriptorPool")) { unitest.proto.file <- system.file("tinytest", "data", "unittest.proto", package = "RProtoBuf") readProtoFiles(file = unitest.proto.file) } #} #.tearDown <- function() {} #test.import <- function() { expect_true(exists("protobuf_unittest_import.ImportMessage", "RProtoBuf:DescriptorPool"), info = "exists( protobuf_unittest_import.ImportMessage ) ") expect_true(exists( "protobuf_unittest_import.ImportEnum", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest_import.ImportEnum ) ") expect_equal(names(as.list( protobuf_unittest_import.ImportMessage)), "d", info = "names( protobuf_unittest_import.ImportMessage ) == 'd'") import_enum <- as.list(protobuf_unittest_import.ImportEnum ) expect_true(all( c("IMPORT_FOO", "IMPORT_BAR", "IMPORT_BAZ") %in% names(import_enum)), info = "expected names for 'protobuf_unittest_import.ImportEnum'") expect_equal(unlist(unname(import_enum)), 7:9, info = "expected values for 'protobuf_unittest_import.ImportEnum' ") #} #test.readProtoFile <- function() { expect_true(exists( "protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest_import.TestAllTypes ) ") expect_true(exists( "protobuf_unittest.TestAllTypes.NestedMessage", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest_import.TestAllTypes.NestedMessage ) " ) expect_true(exists( "protobuf_unittest.TestAllTypes.NestedEnum", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest_import.TestAllTypes.NestedEnum ) " ) expect_true(exists( "protobuf_unittest.TestAllTypes.OptionalGroup", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest.TestAllTypes.OptionalGroup ) " ) types <- c("int32", "int64", "uint32", "uint64", "sint32", "sint64", "fixed32", "fixed64", "sfixed32", "sfixed64", "float", "double", "bool", "string", "bytes" ) fieldnames <- names( as.list( protobuf_unittest.TestAllTypes ) ) prefixes <- c("optional", "default", "repeated" ) for (prefix in prefixes ) { for (type in types ) { expect_true(sprintf( "%s_%s", prefix, type ) %in% fieldnames, info = sprintf( "%s_%s in field names", prefix, type)) } expect_true(sprintf("%s_foreign_enum" , prefix ) %in% fieldnames, info = sprintf( "%s_foreign_enum in field names" , prefix ) ) expect_true(sprintf("%s_import_enum" , prefix ) %in% fieldnames, info = sprintf( "%s_import_enum in field names" , prefix ) ) } expect_true(exists( "protobuf_unittest.ForeignMessage", "RProtoBuf:DescriptorPool"), info = "exists( protobuf_unittest.ForeignMessage ) " ) expect_equal(names(as.list(protobuf_unittest.ForeignMessage)), "c") expect_true(exists( "protobuf_unittest.ForeignEnum", "RProtoBuf:DescriptorPool"), info = "exists( protobuf_unittest.ForeignEnum ) ") foreign_enum <- as.list( protobuf_unittest.ForeignEnum ) expect_equal(length(foreign_enum), 3L, info = "length( protobuf_unittest.ForeignEnum ) == 3" ) expect_true(all(c("FOREIGN_FOO", "FOREIGN_BAR", "FOREIGN_BAZ") %in% names( foreign_enum )), info = "expected names for enum `protobuf_unittest.ForeignEnum`" ) expect_equal( unlist(unname(as.list(protobuf_unittest.ForeignEnum))), 4:6, info = "expected values for enum `protobuf_unittest.ForeignEnum`" ) #} ## Early versions of RProtoBuf did not support repeated messages properly. #test.repeatedFields <- function() { test <- new(protobuf_unittest.TestAllTypes) test$add("repeated_int32", c(1:5)) expect_equal(test$repeated_int32, c(1:5)) test$repeated_int32 <- 1 expect_equal(test$repeated_int32, 1) ## Prior to RProtoBuf v0.2.5, this was not handled properly. test.2 <- new(protobuf_unittest.TestAllTypes, repeated_string=c("foo", "bar")) expect_equal(test.2$repeated_string, c("foo", "bar")) ## Versions of RProtoBuf <= 0.2.5 had non-deterministic behavior due to a ## memory management bug when setting a repeated field to a ## non-vector type (e.g. a Message). test$repeated_foreign_message <- list(new(protobuf_unittest.ForeignMessage, c = 1), new(protobuf_unittest.ForeignMessage, c = 2)) expect_equal(length(test$repeated_foreign_message), 2) test$repeated_foreign_message <- new(protobuf_unittest.ForeignMessage, c = 3) expect_equal(length(test$repeated_foreign_message), 1) #} #test.repeated.bools <- function() { test <- new(protobuf_unittest.TestAllTypes) test$add("repeated_bool", c(TRUE, FALSE)) expect_equal(test$repeated_bool, c(TRUE, FALSE)) test$add("repeated_bool", as.integer(c(TRUE, FALSE))) test$add("repeated_bool", as.numeric(c(TRUE, FALSE))) expect_equal(test$repeated_bool, rep(c(TRUE, FALSE), 3)) ## Verify that we don't silently cast NA into TRUE or FALSE. expect_error(test$add("repeated_bool", c(TRUE, FALSE, NA))) #} ## Versions of RProtoBuf <= 0.2.5 would terminate the R instance with unhandled Rcpp exceptions. #test.invalidAssignments <- function() { test <- new(protobuf_unittest.TestAllTypes) expect_error(test$optional_int32 <- 1:10) #} ## Versions of RProtoBuf <= 0.2.5 did not distinguish between non-existant ## and not-set fields with has(). #test.has <- function() { test <- new(protobuf_unittest.TestAllTypes) test$add("repeated_int32", c(1:5)) expect_true( has(test, "repeated_int32")) expect_true( test$has("repeated_int32")) expect_true( is.null(test$has("nonexistant"))) expect_true( !test$has("optional_int32")) #} RProtoBuf/inst/tinytest/data/0000755000175000017500000000000013617260253016044 5ustar nileshnileshRProtoBuf/inst/tinytest/data/proto3.proto0000644000175000017500000000017113617260253020356 0ustar nileshnilesh syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; } RProtoBuf/inst/tinytest/data/int64.ascii0000644000175000017500000000010213617260253020013 0ustar nileshnileshrepeated_int64: 9007199254740992 repeated_int64: 9007199254740993 RProtoBuf/inst/tinytest/data/recursive/0000755000175000017500000000000013617260253020053 5ustar nileshnileshRProtoBuf/inst/tinytest/data/recursive/subdir/0000755000175000017500000000000013617260253021343 5ustar nileshnileshRProtoBuf/inst/tinytest/data/recursive/subdir/subdir_message.proto0000644000175000017500000000026713617260253025431 0ustar nileshnileshsyntax = "proto2"; package protobuf_unittest_recursive_subdir; import "unittest_import.proto"; message SubdirMessage { optional protobuf_unittest_import.ImportMessage msg = 1; } RProtoBuf/inst/tinytest/data/unittest_import.proto0000644000175000017500000000473613617260253022414 0ustar nileshnilesh// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/protobuf/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT // OWNER 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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // A proto file which is imported by unittest.proto to test importing. // mark as Protocol Buffers v2 format syntax = "proto2"; // We don't put this in a package within proto2 because we need to make sure // that the generated code doesn't depend on being in the proto2 namespace. // In test_util.h we do // "using namespace unittest_import = protobuf_unittest_import". package protobuf_unittest_import; option optimize_for = SPEED; // Excercise the java_package option. option java_package = "com.google.protobuf.test"; // Do not set a java_outer_classname here to verify that Proto2 works without // one. message ImportMessage { optional int32 d = 1; } enum ImportEnum { IMPORT_FOO = 7; IMPORT_BAR = 8; IMPORT_BAZ = 9; } RProtoBuf/inst/tinytest/data/nested.proto0000644000175000017500000000024013617260253020407 0ustar nileshnilesh// mark as Protocol Buffers v2 format syntax = "proto2"; message NestedInner { required int32 x = 1; } message NestedOuter { required NestedInner b = 1; } RProtoBuf/inst/tinytest/data/unittest.proto0000644000175000017500000005053613617260253021021 0ustar nileshnilesh// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/protobuf/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT // OWNER 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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // A proto file we will use for unit testing. // mark as Protocol Buffers v2 format syntax = "proto2"; // (Romain Francois) The only thing I have changed in this // file is this import directive. RProtoBuf will import // the extra file from the directory in which this file is import "unittest_import.proto"; // To test if we can import a message in another directory. import "subdir/subdir_message.proto"; // We don't put this in a package within proto2 because we need to make sure // that the generated code doesn't depend on being in the proto2 namespace. // In test_util.h we do "using namespace unittest = protobuf_unittest". package protobuf_unittest; // Protos optimized for SPEED use a strict superset of the generated code // of equivalent ones optimized for CODE_SIZE, so we should optimize all our // tests for speed unless explicitly testing code size optimization. option optimize_for = SPEED; option java_outer_classname = "UnittestProto"; // This proto includes every type of field in both singular and repeated // forms. message TestAllTypes { message NestedMessage { // The field name "b" fails to compile in proto1 because it conflicts with // a local variable named "b" in one of the generated methods. Doh. // This file needs to compile in proto1 to test backwards-compatibility. optional int32 bb = 1; } enum NestedEnum { FOO = 1; BAR = 2; BAZ = 3; } // Singular optional int32 optional_int32 = 1; optional int64 optional_int64 = 2; optional uint32 optional_uint32 = 3; optional uint64 optional_uint64 = 4; optional sint32 optional_sint32 = 5; optional sint64 optional_sint64 = 6; optional fixed32 optional_fixed32 = 7; optional fixed64 optional_fixed64 = 8; optional sfixed32 optional_sfixed32 = 9; optional sfixed64 optional_sfixed64 = 10; optional float optional_float = 11; optional double optional_double = 12; optional bool optional_bool = 13; optional string optional_string = 14; optional bytes optional_bytes = 15; optional group OptionalGroup = 16 { optional int32 a = 17; } optional NestedMessage optional_nested_message = 18; optional ForeignMessage optional_foreign_message = 19; optional protobuf_unittest_import.ImportMessage optional_import_message = 20; optional NestedEnum optional_nested_enum = 21; optional ForeignEnum optional_foreign_enum = 22; optional protobuf_unittest_import.ImportEnum optional_import_enum = 23; optional string optional_string_piece = 24 [ctype=STRING_PIECE]; optional string optional_cord = 25 [ctype=CORD]; // Repeated repeated int32 repeated_int32 = 31; repeated int64 repeated_int64 = 32; repeated uint32 repeated_uint32 = 33; repeated uint64 repeated_uint64 = 34; repeated sint32 repeated_sint32 = 35; repeated sint64 repeated_sint64 = 36; repeated fixed32 repeated_fixed32 = 37; repeated fixed64 repeated_fixed64 = 38; repeated sfixed32 repeated_sfixed32 = 39; repeated sfixed64 repeated_sfixed64 = 40; repeated float repeated_float = 41; repeated double repeated_double = 42; repeated bool repeated_bool = 43; repeated string repeated_string = 44; repeated bytes repeated_bytes = 45; repeated group RepeatedGroup = 46 { optional int32 a = 47; } repeated NestedMessage repeated_nested_message = 48; repeated ForeignMessage repeated_foreign_message = 49; repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50; repeated NestedEnum repeated_nested_enum = 51; repeated ForeignEnum repeated_foreign_enum = 52; repeated protobuf_unittest_import.ImportEnum repeated_import_enum = 53; repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; repeated string repeated_cord = 55 [ctype=CORD]; // Singular with defaults optional int32 default_int32 = 61 [default = 41 ]; optional int64 default_int64 = 62 [default = 42 ]; optional uint32 default_uint32 = 63 [default = 43 ]; optional uint64 default_uint64 = 64 [default = 44 ]; optional sint32 default_sint32 = 65 [default = -45 ]; optional sint64 default_sint64 = 66 [default = 46 ]; optional fixed32 default_fixed32 = 67 [default = 47 ]; optional fixed64 default_fixed64 = 68 [default = 48 ]; optional sfixed32 default_sfixed32 = 69 [default = 49 ]; optional sfixed64 default_sfixed64 = 70 [default = -50 ]; optional float default_float = 71 [default = 51.5 ]; optional double default_double = 72 [default = 52e3 ]; optional bool default_bool = 73 [default = true ]; optional string default_string = 74 [default = "hello"]; optional bytes default_bytes = 75 [default = "world"]; optional NestedEnum default_nested_enum = 81 [default = BAR ]; optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR]; optional protobuf_unittest_import.ImportEnum default_import_enum = 83 [default = IMPORT_BAR]; optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; optional string default_cord = 85 [ctype=CORD,default="123"]; } // Define these after TestAllTypes to make sure the compiler can handle // that. message ForeignMessage { optional int32 c = 1; } enum ForeignEnum { FOREIGN_FOO = 4; FOREIGN_BAR = 5; FOREIGN_BAZ = 6; } message TestAllExtensions { extensions 1 to max; } extend TestAllExtensions { // Singular optional int32 optional_int32_extension = 1; optional int64 optional_int64_extension = 2; optional uint32 optional_uint32_extension = 3; optional uint64 optional_uint64_extension = 4; optional sint32 optional_sint32_extension = 5; optional sint64 optional_sint64_extension = 6; optional fixed32 optional_fixed32_extension = 7; optional fixed64 optional_fixed64_extension = 8; optional sfixed32 optional_sfixed32_extension = 9; optional sfixed64 optional_sfixed64_extension = 10; optional float optional_float_extension = 11; optional double optional_double_extension = 12; optional bool optional_bool_extension = 13; optional string optional_string_extension = 14; optional bytes optional_bytes_extension = 15; optional group OptionalGroup_extension = 16 { optional int32 a = 17; } optional TestAllTypes.NestedMessage optional_nested_message_extension = 18; optional ForeignMessage optional_foreign_message_extension = 19; optional protobuf_unittest_import.ImportMessage optional_import_message_extension = 20; optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21; optional ForeignEnum optional_foreign_enum_extension = 22; optional protobuf_unittest_import.ImportEnum optional_import_enum_extension = 23; optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE]; optional string optional_cord_extension = 25 [ctype=CORD]; // Repeated repeated int32 repeated_int32_extension = 31; repeated int64 repeated_int64_extension = 32; repeated uint32 repeated_uint32_extension = 33; repeated uint64 repeated_uint64_extension = 34; repeated sint32 repeated_sint32_extension = 35; repeated sint64 repeated_sint64_extension = 36; repeated fixed32 repeated_fixed32_extension = 37; repeated fixed64 repeated_fixed64_extension = 38; repeated sfixed32 repeated_sfixed32_extension = 39; repeated sfixed64 repeated_sfixed64_extension = 40; repeated float repeated_float_extension = 41; repeated double repeated_double_extension = 42; repeated bool repeated_bool_extension = 43; repeated string repeated_string_extension = 44; repeated bytes repeated_bytes_extension = 45; repeated group RepeatedGroup_extension = 46 { optional int32 a = 47; } repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48; repeated ForeignMessage repeated_foreign_message_extension = 49; repeated protobuf_unittest_import.ImportMessage repeated_import_message_extension = 50; repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51; repeated ForeignEnum repeated_foreign_enum_extension = 52; repeated protobuf_unittest_import.ImportEnum repeated_import_enum_extension = 53; repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE]; repeated string repeated_cord_extension = 55 [ctype=CORD]; // Singular with defaults optional int32 default_int32_extension = 61 [default = 41 ]; optional int64 default_int64_extension = 62 [default = 42 ]; optional uint32 default_uint32_extension = 63 [default = 43 ]; optional uint64 default_uint64_extension = 64 [default = 44 ]; optional sint32 default_sint32_extension = 65 [default = -45 ]; optional sint64 default_sint64_extension = 66 [default = 46 ]; optional fixed32 default_fixed32_extension = 67 [default = 47 ]; optional fixed64 default_fixed64_extension = 68 [default = 48 ]; optional sfixed32 default_sfixed32_extension = 69 [default = 49 ]; optional sfixed64 default_sfixed64_extension = 70 [default = -50 ]; optional float default_float_extension = 71 [default = 51.5 ]; optional double default_double_extension = 72 [default = 52e3 ]; optional bool default_bool_extension = 73 [default = true ]; optional string default_string_extension = 74 [default = "hello"]; optional bytes default_bytes_extension = 75 [default = "world"]; optional TestAllTypes.NestedEnum default_nested_enum_extension = 81 [default = BAR]; optional ForeignEnum default_foreign_enum_extension = 82 [default = FOREIGN_BAR]; optional protobuf_unittest_import.ImportEnum default_import_enum_extension = 83 [default = IMPORT_BAR]; optional string default_string_piece_extension = 84 [ctype=STRING_PIECE, default="abc"]; optional string default_cord_extension = 85 [ctype=CORD, default="123"]; } message TestNestedExtension { extend TestAllExtensions { // Check for bug where string extensions declared in tested scope did not // compile. optional string test = 1002 [default="test"]; } } // We have separate messages for testing required fields because it's // annoying to have to fill in required fields in TestProto in order to // do anything with it. Note that we don't need to test every type of // required filed because the code output is basically identical to // optional fields for all types. message TestRequired { required int32 a = 1; optional int32 dummy2 = 2; required int32 b = 3; extend TestAllExtensions { optional TestRequired single = 1000; repeated TestRequired multi = 1001; } // Pad the field count to 32 so that we can test that IsInitialized() // properly checks multiple elements of has_bits_. optional int32 dummy4 = 4; optional int32 dummy5 = 5; optional int32 dummy6 = 6; optional int32 dummy7 = 7; optional int32 dummy8 = 8; optional int32 dummy9 = 9; optional int32 dummy10 = 10; optional int32 dummy11 = 11; optional int32 dummy12 = 12; optional int32 dummy13 = 13; optional int32 dummy14 = 14; optional int32 dummy15 = 15; optional int32 dummy16 = 16; optional int32 dummy17 = 17; optional int32 dummy18 = 18; optional int32 dummy19 = 19; optional int32 dummy20 = 20; optional int32 dummy21 = 21; optional int32 dummy22 = 22; optional int32 dummy23 = 23; optional int32 dummy24 = 24; optional int32 dummy25 = 25; optional int32 dummy26 = 26; optional int32 dummy27 = 27; optional int32 dummy28 = 28; optional int32 dummy29 = 29; optional int32 dummy30 = 30; optional int32 dummy31 = 31; optional int32 dummy32 = 32; required int32 c = 33; } message TestRequiredForeign { optional TestRequired optional_message = 1; repeated TestRequired repeated_message = 2; optional int32 dummy = 3; } // Test that we can use NestedMessage from outside TestAllTypes. message TestForeignNested { optional TestAllTypes.NestedMessage foreign_nested = 1; } // TestEmptyMessage is used to test unknown field support. message TestEmptyMessage { } // Like above, but declare all field numbers as potential extensions. No // actual extensions should ever be defined for this type. message TestEmptyMessageWithExtensions { extensions 1 to max; } // Test that really large tag numbers don't break anything. message TestReallyLargeTagNumber { // The largest possible tag number is 2^28 - 1, since the wire format uses // three bits to communicate wire type. optional int32 a = 1; optional int32 bb = 268435455; } message TestRecursiveMessage { optional TestRecursiveMessage a = 1; optional int32 i = 2; } // Test that mutual recursion works. message TestMutualRecursionA { optional TestMutualRecursionB bb = 1; } message TestMutualRecursionB { optional TestMutualRecursionA a = 1; optional int32 optional_int32 = 2; } // Test that groups have disjoint field numbers from their siblings and // parents. This is NOT possible in proto1; only proto2. When outputting // proto1, the dup fields should be dropped. message TestDupFieldNumber { optional int32 a = 1; optional group Foo = 2 { optional int32 a = 1; } optional group Bar = 3 { optional int32 a = 1; } } // Needed for a Python test. message TestNestedMessageHasBits { message NestedMessage { repeated int32 nestedmessage_repeated_int32 = 1; repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2; } optional NestedMessage optional_nested_message = 1; } // mstokely commented this out, it breaks with libprotobuf-2.5. // // Test an enum that has multiple values with the same number. // enum TestEnumWithDupValue { // FOO1 = 1; // BAR1 = 2; // BAZ = 3; // FOO2 = 1; // BAR2 = 2; //} // Test an enum with large, unordered values. enum TestSparseEnum { SPARSE_A = 123; SPARSE_B = 62374; SPARSE_C = 12589234; SPARSE_D = -15; SPARSE_E = -53452; SPARSE_F = 0; SPARSE_G = 2; } // Test message with CamelCase field names. This violates Protocol Buffer // standard style. message TestCamelCaseFieldNames { optional int32 PrimitiveField = 1; optional string StringField = 2; optional ForeignEnum EnumField = 3; optional ForeignMessage MessageField = 4; optional string StringPieceField = 5 [ctype=STRING_PIECE]; optional string CordField = 6 [ctype=CORD]; repeated int32 RepeatedPrimitiveField = 7; repeated string RepeatedStringField = 8; repeated ForeignEnum RepeatedEnumField = 9; repeated ForeignMessage RepeatedMessageField = 10; repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE]; repeated string RepeatedCordField = 12 [ctype=CORD]; } // We list fields out of order, to ensure that we're using field number and not // field index to determine serialization order. message TestFieldOrderings { optional string my_string = 11; extensions 2 to 10; optional int64 my_int = 1; extensions 12 to 100; optional float my_float = 101; } extend TestFieldOrderings { optional string my_extension_string = 50; optional int32 my_extension_int = 5; } message TestExtremeDefaultValues { optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"]; optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF]; optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF]; optional int32 small_int32 = 4 [default = -0x7FFFFFFF]; optional int64 small_int64 = 5 [default = -0x7FFFFFFFFFFFFFFF]; // The default value here is UTF-8 for "\u1234". (We could also just type // the UTF-8 text directly into this text file rather than escape it, but // lots of people use editors that would be confused by this.) optional string utf8_string = 6 [default = "\341\210\264"]; // Tests for single-precision floating-point values. optional float zero_float = 7 [default = 0]; optional float one_float = 8 [default = 1]; optional float small_float = 9 [default = 1.5]; optional float negative_one_float = 10 [default = -1]; optional float negative_float = 11 [default = -1.5]; // Using exponents optional float large_float = 12 [default = 2E8]; optional float small_negative_float = 13 [default = -8e-28]; } // Test String and Bytes: string is for valid UTF-8 strings message OneString { optional string data = 1; } message OneBytes { optional bytes data = 1; } // Test messages for packed fields message TestPackedTypes { repeated int32 packed_int32 = 90 [packed = true]; repeated int64 packed_int64 = 91 [packed = true]; repeated uint32 packed_uint32 = 92 [packed = true]; repeated uint64 packed_uint64 = 93 [packed = true]; repeated sint32 packed_sint32 = 94 [packed = true]; repeated sint64 packed_sint64 = 95 [packed = true]; repeated fixed32 packed_fixed32 = 96 [packed = true]; repeated fixed64 packed_fixed64 = 97 [packed = true]; repeated sfixed32 packed_sfixed32 = 98 [packed = true]; repeated sfixed64 packed_sfixed64 = 99 [packed = true]; repeated float packed_float = 100 [packed = true]; repeated double packed_double = 101 [packed = true]; repeated bool packed_bool = 102 [packed = true]; repeated ForeignEnum packed_enum = 103 [packed = true]; } message TestPackedExtensions { extensions 1 to max; } extend TestPackedExtensions { repeated int32 packed_int32_extension = 90 [packed = true]; repeated int64 packed_int64_extension = 91 [packed = true]; repeated uint32 packed_uint32_extension = 92 [packed = true]; repeated uint64 packed_uint64_extension = 93 [packed = true]; repeated sint32 packed_sint32_extension = 94 [packed = true]; repeated sint64 packed_sint64_extension = 95 [packed = true]; repeated fixed32 packed_fixed32_extension = 96 [packed = true]; repeated fixed64 packed_fixed64_extension = 97 [packed = true]; repeated sfixed32 packed_sfixed32_extension = 98 [packed = true]; repeated sfixed64 packed_sfixed64_extension = 99 [packed = true]; repeated float packed_float_extension = 100 [packed = true]; repeated double packed_double_extension = 101 [packed = true]; repeated bool packed_bool_extension = 102 [packed = true]; repeated ForeignEnum packed_enum_extension = 103 [packed = true]; } // Test that RPC services work. message FooRequest {} message FooResponse {} service TestService { rpc Foo(FooRequest) returns (FooResponse); rpc Bar(BarRequest) returns (BarResponse); } message BarRequest {} message BarResponse {} RProtoBuf/inst/tinytest/data/bytes.proto0000644000175000017500000000040313617260253020254 0ustar nileshnilesh// mark as Protocol Buffers v2 format syntax = "proto2"; option optimize_for = SPEED; option java_outer_classname = "BytesProto"; message TestBytes { required bytes req = 1; optional bytes opt = 2 [default = "hello world"]; repeated bytes rep = 3; } RProtoBuf/inst/tinytest/data/encoding.proto0000644000175000017500000000054413617260253020722 0ustar nileshnilesh// mark as Protocol Buffers v2 format syntax = "proto2"; // Examples from: // https://developers.google.com/protocol-buffers/docs/encoding package protobuf_encoding_test; message Test1 { required int32 a = 1; } message Test2 { required string b = 2; } message Test3 { required Test1 c = 3; } message Test4 { repeated int32 d = 4 [packed=true]; } RProtoBuf/inst/tinytest/data/subdir/0000755000175000017500000000000013617260253017334 5ustar nileshnileshRProtoBuf/inst/tinytest/data/subdir/subdir_message.proto0000644000175000017500000000025513617260253023417 0ustar nileshnileshsyntax = "proto2"; package protobuf_unittest_subdir; import "unittest_import.proto"; message SubdirMessage { optional protobuf_unittest_import.ImportMessage msg = 1; } RProtoBuf/inst/tinytest/data/cyclical/0000755000175000017500000000000013617260253017627 5ustar nileshnileshRProtoBuf/inst/tinytest/data/cyclical/proj2/0000755000175000017500000000000013617260253020663 5ustar nileshnileshRProtoBuf/inst/tinytest/data/cyclical/proj2/proto/0000755000175000017500000000000013617260253022026 5ustar nileshnileshRProtoBuf/inst/tinytest/data/cyclical/proj2/proto/b.proto0000644000175000017500000000011713617260253023333 0ustar nileshnileshsyntax = "proto2"; import "proto/a.proto"; message B { optional A a = 1; } RProtoBuf/inst/tinytest/data/cyclical/proj1/0000755000175000017500000000000013617260253020662 5ustar nileshnileshRProtoBuf/inst/tinytest/data/cyclical/proj1/proto/0000755000175000017500000000000013617260253022025 5ustar nileshnileshRProtoBuf/inst/tinytest/data/cyclical/proj1/proto/c.proto0000644000175000017500000000011713617260253023333 0ustar nileshnileshsyntax = "proto2"; import "proto/b.proto"; message C { optional B b = 1; } RProtoBuf/inst/tinytest/data/cyclical/proj1/proto/a.proto0000644000175000017500000000004113617260253023325 0ustar nileshnileshsyntax = "proto2"; message A {} RProtoBuf/inst/tinytest/test_import.R0000644000175000017500000000653313617260253017636 0ustar nileshnilesh# Copyright 2011 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #.setUp <- function() { resetDescriptorPool() #} #test.import.reset <- function() { ## Verify that the common setup is resetting the descriptor pool. ## Only the messages defined in the proto directory should be present. expect_true(all(grepl("^(rexp|tutorial|rprotobuf)\\.", objects("RProtoBuf:DescriptorPool")))) #} #test.import.error <- function() { ## Verify that we get a graceful error rather than a segfault. expect_error(readProtoFiles(system.file("DESCRIPTION", package="RProtoBuf"), syntax="proto3")) #} #test.import <- function() { #unit.test.data.dir <- system.file("unitTests", "data", package="RProtoBuf") unit.test.data.dir <- file.path("data", "cyclical") expect_true(!exists("protobuf_unittest_import.ImportMessage", "RProtoBuf:DescriptorPool")) resetDescriptorPool() readProtoFiles2(recursive = FALSE, protoPath=unit.test.data.dir) #expect_true(exists("protobuf_unittest_import.ImportMessage", "RProtoBuf:DescriptorPool")) # The following is imported by unittest.proto and hence, should have been imported implicitly. #expect_true(exists("protobuf_unittest_subdir.SubdirMessage", "RProtoBuf:DescriptorPool")) # The following is not imported by any of the top level files. expect_true(!exists("protobuf_unittest_recursive_subdir.SubdirMessage", "RProtoBuf:DescriptorPool")) #test.import.subdir <- function() { unit.test.data.dir <- system.file("tinytest", "data", package="RProtoBuf") # Any of these two will work. readProtoFiles2(file="subdir/subdir_message.proto", protoPath=unit.test.data.dir) readProtoFiles2(dir="subdir", protoPath=unit.test.data.dir) expect_true(exists("protobuf_unittest_subdir.SubdirMessage", "RProtoBuf:DescriptorPool")) readProtoFiles2(dir="recursive", recursive=TRUE, protoPath=unit.test.data.dir) expect_true(exists("protobuf_unittest_recursive_subdir.SubdirMessage", "RProtoBuf:DescriptorPool")) #} #test.import.cyclical <- function() { unit.test.cyclical.dir <- system.file("tinytest", "data", "cyclical", package="RProtoBuf") proj1.dir <- file.path(unit.test.cyclical.dir, "proj1") proj2.dir <- file.path(unit.test.cyclical.dir, "proj2") # The following files should be loaded in order as C depends on B depends on A. readProtoFiles2(file="proto/a.proto", protoPath=proj1.dir) expect_true(exists("A", "RProtoBuf:DescriptorPool")) expect_true(!exists("C", "RProtoBuf:DescriptorPool")) readProtoFiles2(file="proto/b.proto", protoPath=proj2.dir) expect_true(exists("B", "RProtoBuf:DescriptorPool")) readProtoFiles2(file="proto/c.proto", protoPath=proj1.dir) expect_true(exists("C", "RProtoBuf:DescriptorPool")) #} #test.assign.in.global <- function() { xx.undef <<- 3 expect_equal(xx.undef, 3) #} RProtoBuf/inst/tinytest/test_bool.R0000644000175000017500000000326113617260253017252 0ustar nileshnilesh # Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.bool <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } a <- new(protobuf_unittest.TestAllTypes) a$optional_bool <- TRUE a$optional_bool <- FALSE ## Verify we can not set a protocol buffer bool to NA. expect_error(a$optional_bool <- NA) ## Verify we can set character strings a$repeated_bool <- c(TRUE, FALSE, TRUE) expect_equal(length(unique(a$repeated_bool)), 2) ## Verify we can't set any garbage string to a bool. expect_error(a$optional_bool <- "100") expect_error(a$optional_bool <- "invalid") ## Verify we can't set any garbage string to a repeated bool. expect_error(a$repeated_bool <-c("invalid", "invalid")) expect_error(a$repeated_bool <-c("33-")) ## Verify we can set NA expect_error(a$repeated_bool <- c(TRUE, FALSE, TRUE, NA)) #} RProtoBuf/inst/NEWS.Rd0000644000175000017500000004533514156423460014325 0ustar nileshnilesh\name{NEWS} \title{News for Package \pkg{RProtoBuf}} \newcommand{\ghpr}{\href{https://github.com/eddelbuettel/rprotobuf/pull/#1}{##1}} \newcommand{\ghit}{\href{https://github.com/eddelbuettel/rprotobuf/issues/#1}{##1}} \section{Changes in RProtoBuf version 0.4.18 (2021-12-15)}{ \itemize{ \item Support \code{string_view} in \code{FindMethodByName()} (Adam Cozzette in \ghpr{72}). \item CI use was updated first at Travis, later at GitHub and now uses \href{https://eddelbuettel.github.io/r-ci/}{r-ci} (Dirk in \ghpr{74} and (parts of) \ghpr{76}). \item The (to the best of our knowledge) unused minimal RPC mechanism has been removed, retiring one method and one class as well as the import of the \pkg{RCurl} package (Dirk in \ghpr{76}). \item Two extra parameters are now supported in the \code{toJSON} conversion (Vitali Spinu in \ghpr{79}) \item The \code{toJSON()} method supports two (upstream) formatting toggles (Vitali Spinu in \ghpr{79} with minor edit by Dirk). \item Windows UCRT builds are now supported (Jeroen in \ghpr{81}, Dirk and Tomas Kalibera in \ghpr{82}). } } \section{Changes in RProtoBuf version 0.4.17 (2020-03-26)}{ \itemize{ \item Condition use of \code{ByteSizeLong()} on building with ProtoBuf 3.6.0 or later (Dirk in \ghpr{71} fixing \ghit{70}). \item The JSON unit tests are skipped if ProtoBuf 2.* is used (Dirk, also \ghpr{71}). \item The \code{configure} script now extracts the version from the \code{DESCRIPTION} file (Dirk, also \ghpr{71}). } } \section{Changes in RProtoBuf version 0.4.16 (2020-03-19)}{ \itemize{ \item Added support for parsing and printing JSON (Siddhartha Bagaria in \ghpr{68} closing wishlist \ghit{61}). \item Switched \code{ByteSize()} to \code{ByteSizeLong()} to appease \code{clang} (Dirk). } } \section{Changes in RProtoBuf version 0.4.15 (2020-02-08)}{ \itemize{ \item Repeated Message and Group objects are now returned correctly (Dirk in \ghpr{64} fixing \ghit{62}). \item The unit tests are now run by \pkg{tinytest} (Dirk in \ghpr{65}). \item The vignettes are now included pre-made (Dirk in \ghpr{67}). } } \section{Changes in RProtoBuf version 0.4.14 (2019-06-30)}{ \itemize{ \item An \code{all.equal.Message} method was added to avoid a fallback to the generic (Jarod Meng in \ghpr{54} fixing \ghit{53}) \item Recursive fields now handled by \code{identical()} (Jarod Meng in \ghpr{57} fixing \ghit{56}) \item Update Windows build infrastructure (Jeroen) } } \section{Changes in RProtoBuf version 0.4.13 (2018-11-03)}{ \itemize{ \item The \code{configure} setup is more robust with respect to the C++ setup (CRAN request). \item \code{POSIXlt} elements are now properly serialized too (Jeffrey Shen in \ghpr{48} and \ghpr{50} fixing \ghit{47}) \item Added two Dockerfiles for continuous integration and use; see \href{https://hub.docker.com/swarm/rprotobuf/repository/list}{this url} for more. } } \section{Changes in RProtoBuf version 0.4.12 (2018-07-11)}{ \itemize{ \item Recursive serialization of sublists returning themselves is now recognised (Jeffrey Shen in \ghpr{38} fixing \ghit{37}) \item New function \code{readProtoFiles2} to be consistent with \code{protoc} (Siddhartha Bagaria in \ghpr{40} fixing \ghit{39}) \item Update Windows binary library used (Maciej Lach and Jeroen Ooms in \ghpr{42} and follow-up commits) \item New unit tests for new functionality (Siddhartha Bagaria in \ghpr{45}) } } \section{Changes in RProtoBuf version 0.4.11 (2017-10-03)}{ \itemize{ \item The \code{RProtoBuf-intro} and \code{RProtoBuf-quickref} vignettes were converted to Rmarkdown using the templates and style file from the pinp package. \item A few minor internal upgrades } } \section{Changes in RProtoBuf version 0.4.10 (2017-08-13)}{ \itemize{ \item More careful operation in deserializer checking for a valid class attribute (Jeffey Shen in \ghpr{29} fixing \ghit{28}) \item At the request of CRAN, correct one \code{.Call()} argument to \code{PACKAGE=}; update routine registration accordingly } } \section{Changes in RProtoBuf version 0.4.9 (2017-03-06)}{ \itemize{ \item A new file \code{init.c} was added with calls to \code{R_registerRoutines()} and \code{R_useDynamicSymbols()} \item Symbol registration is enabled in \code{useDynLib} \item Several missing \code{PACKAGE=} arguments were added to the corresponding \code{.Call} invocations \item Two (internal) C++ functions were renamed with suffix \code{_cpp} to disambiguate them from R functions with the same name \item All of above were part of \ghpr{26} \item Some editing corrections were made to the introductory vignette (David Kretch in \ghpr{25}) \item The `configure.ac` file was updated, and renamed from the older converntion `configure.in`, along with `src/Makevars`. (PR \ghpr{24} fixing \ghit{23}) } } \section{Changes in RProtoBuf version 0.4.8 (2017-01-17)}{ \itemize{ \item Windows builds now use the proto3 library as well (PR \ghpr{21} fixing \ghit{20}) } } \section{Changes in RProtoBuf version 0.4.7 (2016-10-27)}{ \itemize{ \item At the request of CRAN, two documentation instances referring to the Omegehat repository were updated to \url{http://omegahat.net} } } \section{Changes in RProtoBuf version 0.4.6 (2016-09-08)}{ \itemize{ \item Support for serializing zero-length objects was added (PR \ghpr{18} addressing \ghit{13}) \item S4 objects are natively encoded (also PR \ghpr{18}) \item The vignette based on the JSS paper no longer uses a macro available only with the R-devel version of jss.cls, and hence builds on all R versions } } \section{Changes in RProtoBuf version 0.4.5 (2016-08-29)}{ \itemize{ \item Support for version 3 of the Protcol Buffers API \item Added 'syntax = "proto2";' to all proto files (PR \ghpr{17}) \item Updated Travis CI script to test against both versions 2 and 3 using custom-built .deb packages of version 3 (PR \ghpr{16}) \item Improved build system with support for custom CXXFLAGS (Craig Radcliffe in PR \ghpr{15}) } } \section{Changes in RProtoBuf version 0.4.4 (2016-07-10)}{ \itemize{ \item New vignette based on JSS publication (v71 i02) \item Some documentation enhancements were made, as well as other minor cleanups to file modes and operations \item Unit-test vignette no longer writes to \code{/tmp} per CRAN request \item The new Windows toolchain (based on g++ 4.9.*) is supported } } \section{Changes in RProtoBuf version 0.4.3 (2015-08-25)}{ \itemize{ \item Declare additional imports from \pkg{methods} in \code{NAMESPACE}. \item Travis CI tests now run faster as all CRAN dependencies are installed as binaries. \item The \code{tools/winlibs.R} script now tests for R (< 3.3.0) before calling the (soon-to-be phased out) \code{setInternet2()} function. \item Several small edits were made to \code{DESCRIPTION} to clarify library dependencies, provide additonal references and conform to now-current R packaging standards. } } \section{Changes in RProtoBuf version 0.4.2 (2014-12-10)}{ \itemize{ \item Address changes suggested by anonymous reviewers for our Journal of Statistical Software submission. \item Make \code{Descriptor} and \code{EnumDescriptor} objects subsettable with "\code{[[}". \item Add \code{length()} method for \code{Descriptor} objects. \item Add \code{names()} method for \code{Message}, \code{Descriptor}, and \code{EnumDescriptor} objects. \item Clarify order of returned list for descriptor objects in \code{as.list} documentation. \item Correct the definition of \code{as.list} for \code{EnumDescriptors} to return a proper list instead of a named vector. \item Update the default print methods to use \code{cat()} with \code{fill=TRUE} instead of \code{show()} to eliminate the confusing \code{[1]} since the classes in \pkg{RProtoBuf} are not vectorized. \item Add support for serializing function, language, and environment objects by falling back to R's native serialization with \code{serialize_pb} and \code{unserialize_pb} to make it easy to serialize into a Protocol Buffer all of the more than 100 datasets which come with R. \item Use \code{normalizePath} instead of creating a temporary file with \code{file.create} when getting absolute path names. \item Add unit tests for all of the above. } } \section{Changes in RProtoBuf version 0.4.1 (2014-03-25)}{ \itemize{ \item Document and add a test for the deprecated group functionality. \item Add a \code{CITATION} file pointing to the arXiv.org preprint. \item Fix a bug in the \code{show} method for \code{EnumDescriptor} types. \item Import all top-level enums from imported \code{.proto} files. \item Removed duplicate enum value type from the unit tests that caused problems with the most recent libprotobuf-2.5. (without option allow_alias). } } \section{Changes in RProtoBuf version 0.4.0 (2014-01-14)}{ \itemize{ \item Changes to support CRAN builds for MS Windows. \item Added functions \code{serialize_pb}, \code{unserialize_pb}, and \code{can_serialize_pb} plus documentation from Jeroen Ooms RProtoBufUtils package. \item New dir \code{inst/python} with some Python examples. \item Added Jeroen Ooms as author. \item Vignettes have been converted to the R 3.0.0 or later use of external vignette builders, no longer need a \code{Makefile} \item Added missing methods to dollar completion list for Message, Descriptor, EnumValueDescriptor, and FileDescriptor classes. \item Add missing export for \code{.DollarNames} EnumValueDescriptor to allow completion on that class. \item Add more than 15 additional pages to the main Intro vignette documenting better all of the S4 classes implemented by RProtoBuf, updating the type mapping tables to take into account 64-bit support, and documenting advanced features such as Extensions. \item Added better error checking in EnumDescriptors to catch the case when wrong types are provided. \item Updated the FileDescriptor \code{name()} method to accept a boolean for full paths just like the generic \code{name()} method. \item Correct a bug that incorrectly dispatched \code{as.character()} when \code{as.list()} was called on Descriptor objects. \item Update FileDescriptor \code{$} dispatch to work properly for the names of fields defined in the FileDescriptor, instead of just returning \code{NULL} even for types returned by \code{$} completion. \item Added a reservation for extension fields in the example tutorial.Person schema. \item Support setting int32 fields with character representations and raise an R-level \code{stop()} error if the provided string can not be parsed as a 32-bit integer, rather than crashing the R instance. \item Update the project TODO file. \item Add better documentation and tests for all of the above. \item Corrected the handling of uint32 and fixed32 types in protocol buffers to ensure that they work with numbers as large as 2^32 - 1, which is larger than an integer can hold in R since R does not have an unsigned integer class. These values are stored as doubles internally now to avoid losing precision. \item Added unit tests to verify behavior of RProtoBuf with extreme values for uint32 types. \item Removed old exception handling code and instead rely on the more modern Rcpp::stop method maintained in Rcpp. \item Add better error messages when setting a repeated field of messages to inform the user which element index was of the wrong type and what the expected type was. \item Add an optional 'partial' argument to readASCII allowing uninitialized message fragments to be read in. \item (internal) Added const qualifiers in more places throughout the C++ code for type safety. \item (internal) Standardize coding conventions of the C++ files and run them through clang-format for consistency. A STYLE file has been submitted to R-Forge with details about the coding standards and how they are enforced with Emacs and clang-format. \item Applied changes suggested by Kevin Ushey to the \code{S4} class handling to support both the currently released \CRANpkg{Rcpp} as well as the currently pending next version. } } \section{Changes in RProtoBuf version 0.3.2 (2013-12-15)}{ \itemize{ \item Fixed a bug that erroneously prevented users from setting raw byte fields in protocol buffers under certain circumstances. \item Give a user friendly error message when seting an extension to a message of the wrong type instead of causing a C++ check failure that terminates the Rsession. \item Change object table lookup slightly to allow users to use the \code{<<-} operator in code using \pkg{RProtoBuf} without hitting a \code{stop()} error in the lookup routine. \item Add missing \code{enum_type} method and improve show method for EnumValueDescriptors. \item Improve documentation and tests for all of the above. \item Rewrote \code{tests/} script calling \CRANpkg{RUnit} tests } } \section{Changes in RProtoBuf version 0.3.1 (2013-09-13)}{ \itemize{ \item Added support for setting and getting 64-bit integer types as character strings of decimal integers to work around R's lack of native 64-bit integer types. \item Added better error handling, documentation, and tests to the extensions support (getExtension and setExtension). \item Add support to P for returning extension descriptors. \item Improved error messages to include field names when invalid fields are specified to protocol buffer messages with new, update, etc. \item Improved configure to detect and pass -std=c++0x if it is available to enable long long 64-bit integer support in Rcpp. \item Improved configure in the case when pkg-config is not available or does not know about the google protocol buffer includes. \item Replaced newly deprecated Rcpp macros with a simplified macro functionality to avoid warnings on the latest development version of Rcpp. } } \section{Changes in RProtoBuf version 0.3 (2013-07-13)}{ \itemize{ \item Added support for Protocol Buffer extensions through the new getExtension and setExtension methods for Message objects, and added top-level extensions to the descriptor pool. \item Added more user-friendly \code{show()} methods for Messages, Descriptors, and other RProtoBuf objects. A common source of confusion on the mailing lists is to confuse Messages and Descriptors. The new \code{show()} methods succinctly display more information about e.g. the number of set fields in a message to make it a little clearer to users what type of object they are working with. \item Added has method for EnumDescriptor objects to test existance of a named constant in an enumeration, and fix a bug in the length method for these objects. \item Added a number method for EnumValueDescriptor objects to return the number of a named enumeration constant directly. \item Improved documentation and unit tests. } } \section{Changes in RProtoBuf version 0.2.6 (2012-10-04)}{ \itemize{ \item Applied several more patches by Murray to \itemize{ \item correct '_' and '__' mismatches in wrapper calls \item update a few manual pages for style, and add examples \item fix a bug where NAs were silently treated as TRUE for logical/bool types \item fix a bug that caused crashes when adding vectors to optional fields \item fix bugs in readASCII that returned empty protocol buffers when the file or connection could not be opened \item distinguish between non-existant and not-set fieldswith has() by returning NULL in the former case. \item fix a bug that caused non-deterministic behavior when setting a repeated message field in a protobuf to a single Message. \item add unit tests for all of the above. } \item Added Murray to Authors: field in DESCRIPTION \item Removed old and unconvincing example on RProtoBuf for storage and serialization in an imagined HighFrequencyFinance context } } \section{Changes in RProtoBuf version 0.2.5 (2012-08-08)}{ \itemize{ \item Applied patches by Murray to \itemize{ \item correctly deal with nested Protocol Buffer definitions, and also add new unit test for this \item test a a protocol buffer for missing required fields before serializing it, also add a unit test \item add a small stylistic fix and examples to the 'add.Rd' manual page } \item Moved inst/doc/ to vignettes/ per newer CRAN Policy } } \section{Changes in RProtoBuf version 0.2.4 (2012-05-15)}{ \itemize{ \item Applied several patches kindly supplied by Murray Stokely to \itemize{ \item properly work with repeated strings \item correct C++ function naming in a few instances \item add an example of ascii export/import of messages } \item Suppport g++-4.7 and stricter #include file checking by adding unistd \item Made small improvements to the startup code } } \section{Changes in RProtoBuf version 0.2.3 (2011-04-12)}{ \itemize{ \item Protect UINT64 and INT64 with '#ifdef RCPP_HAS_LONG_LONG' which itself is valid with either g++ <= 4.4, or newer versions if the -std=c++0x is used \item The documentation Makefile now uses the $R_HOME environment variable \item The documentation Makefile no longer calls clean in the all target } } \section{Changes in RProtoBuf version 0.2.2 (2011-01-11)}{ \itemize{ \item Applied two patches by Murray Stokely which \itemize{ \item correct a typo preventing some functions from being called, \item add bounds checking in call to google protobuf library, \item add a new name method \item add a tiny unit test for the above \item add more graceful error handling \item add support for import patterns other than .proto$, \item add simple reading file that does not exist (exception) test \item add simple repeated field unit test } } } \section{Changes in RProtoBuf version 0.2.1 (2010-10-18)}{ \itemize{ \item Support for raw bytes added thanks to a patch by Koert Kuipers } } \section{Changes in RProtoBuf version 0.2.0 (2010-09-10)}{ \itemize{ \item Second release with numerous internal changes made possible by changes in Rcpp } } \section{Changes in RProtoBuf version 0.1-0 (2010-02-01)}{ \itemize{ \item Initial CRAN release } } RProtoBuf/inst/doc/0000755000175000017500000000000014156423630014014 5ustar nileshnileshRProtoBuf/inst/doc/RProtoBuf-intro.Rnw0000644000175000017500000000044213617276206017525 0ustar nileshnilesh\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{RProtoBuf-intro} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignetteDepends{RProtoBuf} %\VignetteEncoding{UTF-8} \begin{document} \includepdf[pages=-, fitpaper=true]{pdf/RProtoBuf-intro.pdf} \end{document} RProtoBuf/inst/doc/RProtoBuf-quickref.Rnw0000644000175000017500000000045013617276206020202 0ustar nileshnilesh\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{RProtoBuf-quickref} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignetteDepends{RProtoBuf} %\VignetteEncoding{UTF-8} \begin{document} \includepdf[pages=-, fitpaper=true]{pdf/RProtoBuf-quickref.pdf} \end{document} RProtoBuf/inst/doc/RProtoBuf-paper.pdf0000644000175000017500000064455414156423632017522 0ustar nileshnilesh%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4270 /Filter /FlateDecode /N 84 /First 695 >> stream x\Ys۶~o7NBXy/$N\ɉvشV\In;HrQhvps&a1Lq& SLi`)-ei"Yx$njwΒdH4%Jd"hq45LX+ЉIeRK4BbLRpH;@aY)v)#,T:QoNT˴9493I;gFJL0 uT0Li&+Z,Y XfSTI&cX,R10LEjE3hCc, sX1-ylbZ8{6u ХH?ȑH0rB W[*莑Z4F ֩1DtJr)%4FV1(u%$8h2Y1/W#E#bR*`dTCh` F֒R*bd*B164CS[O?4[O& H&lr]Ƣ7]e6YO:cO @N=?Ky":^FohGI9,%Mt6Gh}"*ZMF> Hd9&1~4ܬH;{| - WMg|\r]2ܛ24NXđ%/Iq׉^cC |,yMvIcrJN<mV cE ]0=2'cf`h[a`}ޒ$b,x)KG~x5#Kep0\+s 2 )]^·l2YԤLww9( =' \^GLkRq-IM#ﯬ|: ? tqE) -@oY^hEG_o?="&hX閱@~=?WL0cnI bI b|'j;H74խӣ[GwƾEV&k% 4L7jPت!StlnqٖE$Pa}gi) 5twvEg-+A# mɇ W\:AH}H'\zΫOp#(?"۔MץZr 炜.B9{h)tˍݥjUSժU{T*WNݾi(E!X(^٤Gg6:l Ln,^ -M +џي(|'T/2˨TjF(lh( h[jRM4vCׇ޺ U@E越*B^'|9ӡ !NJ(itmS2 T]830f1qeqgzlP62q`ٶ_dHR,͔It`ywyYF@^rQw^OZT[&(j1'lTdp_(t(Ga=R˩ˆ[=4*"x"]DD5 =Rאf?eHظ-=Js!7W{dYԷ l 4;vkm~F'$5n++!IPH_DX :mŁqN8oNϿSk㞤 5E_>w}eJe/YdS ea箄S VZ&tVDfM~^wر>W}YSgN>*IQn vd엪GrB烉.:=Pow{U#oc^l޽ IOS&sSksk<>/'>J>D?ue_VWlrfEl \`g*u?ʖ2۔JRV* 6hf[L֨T NljA&[[i K^m;+c)|zXrqEdE>nU&0/-`o?]_NW0dU^mKp+i''WXtM~(os軻Yw/g/<~cƂӯ&!7&=>G1-3@wH9Yja 'o+pzDN=_N*"XMV S%i*,2Mpp NQ5:%{&`>10y;垓T:>ec _AMtâ4.Em)CVSI#S}}$/SM}ck}w}kJ A jj).lvL DyћQ$n+9>įUB7<=YXE,};14RKEӀk-tME_.iMOۤcal̲J8MV [/vtBm4(2?옆A!ӢJ!g1,QQD<06M;I}]O~=(Y@%y< 5ͰU֤!mI( QƸv3/?GsZ$ZY{=c *ۼ]QOz5ܚ\ ZҌ*y1Ǜ_}i]hӼ"O{ դNu ː_^dy:Te08\EC=ӎ÷]Qw $!덆IWTx>WۜlpR3KOZKn_ `뀷^{埆MB-޲COKi.;7M:l_pڅ48Di}Awt=:9?m vxP}ᒬSŎi}J %nIiDT/SUCMyI[%k"6`_ݴROsEM2*ŗz@ڷZd\PqVϾHPZ$Q$Uj"+ɿ`t6r5OC\ϖ FRȑ.LcrJ)ӧPyHeREЇO78ot~{ߺ}K0>PnRM]Vam9ejP%Wtyy%OoAȝ'kٲC'yV ts'ּ#]ā6П~Sڗ/2~g;:NYd/7'+$mK{eβP m{[&H'g=gH*%Mj=bS:r_:t/?u<vzMa5}&SN3-͈K(5u筯q/?b/WxoDi@lޠ54m NzI|IqXE3?2Y/\X"ʭ9T!?<-endstream endobj 86 0 obj << /Subtype /XML /Type /Metadata /Length 1167 >> stream 2021-12-15T11:36:25-06:00 2021-12-15T11:36:25-06:00 TeX Untitled endstream endobj 87 0 obj << /Type /ObjStm /Length 2231 /Filter /FlateDecode /N 83 /First 740 >> stream xZ[o~?bOQBkӺumSAi-:fIJHeAQ(:;;nB`)Y"%9aYX%IijhLx&V, L& )+$(hW(LI uy%PL Kt$vƠKJmt4 XfF1IJnj43h;20+4u%Jֳ(QY$Zw`L椢˜F*Kj%Z ' `^Q(PdIRk-0 XU0M= " %$(,MCఠ49K-@4 A3!]aw-h tiH&A! +m2t ={ZOy C0ЁPN$ B:RphsRq(]HB# )EmJG0q.Braa ְA߻MOڈ$+a~brㆨfٜfE-x;yd1آǣ4 ;tQ)a*t6y^(Ÿç30P?g3_"`2z!V7sahp-]yk?t)e6y&>ly>|NFSL`%[Dql>ryB|g|adC'zjy'9>Zav )i:qt4u4f;#q6AMQqlޝG_{Eebw~xKt-縞yda]}>DO)'rQSV(ep_UUv^C窤pK)Q;8Et1,#Yp[ W? U7< _NoSxQ8I:lS B,aV~2>Wo dSQbXḚpB;'G? Tlf!Z^UgŁgJ˫wfv~:Q9s"7"Sq<5D7!+[" 3DIUtb ^n\AZsx#_QGuyT%#K{<} ij[~<8ηo<L+fLiLo|S+{uk8瑍FZyKsyigXELAڄXeKߦG§o ?gu?nU9W@&7x2Nߧlr ,{Ex~3M?Oȿ_tRsVѯə5醳MgFb" J;R,fĢ.6[IV[])n8U?t~b\[nq~'ꡂeo#+}A^嵭n&Dnk:ϝE-.:_ㄿWAsdr_rR;ʕuGhSSz_Nw}_rHǕc z+oi7Q> stream x\rǑ}<"8_lòw핸~YAY$I楪TO7HyaGpԨK̓YY9 k^}/3sqgVxz{ jP.l>8ŋWE{a]8D.ŋk9ꬋ][R}Gm!<71ּ;}aM/{u/i0r}_\X܇Ziq9w6>ߵwW_S活QM~wwP;A=7 5TvfRL{YDL5_跩(6nK ^IiibuaK?Fsy/!E*,n/oEE,U|˚I\NO]VmNTvsh?#g\ZC[]!\}ey2ӊ=ݕ1_8WKpj[O 8L'J{1T's%Vln{&(kpZvG %LB-,홗 |1hZ3͈K4+=,V!:;NDl1"&@^XG cڠ^i+4E2rx,:GOZG<ǩkCu$&! a)M 'fG ԥ6)AgQFO&čnKyw|+4W[%x",nwofJzG q탌O4έvp'G7KZX'FI^uJDEL2#qICë';Qs 0kmܩz'~̒fzNIbzLӒ}qouhmb Qw=/,[ z:n߳ʒzӯ;]v}>R;g-:oBԸLgK- 3^  ѡ!;Cq׈Gvxo(m)JS a\YHŜ/_(n8)1! \'ռxdy;|da_;OB>ݴA),<嚥}9#^#ÆƟNrOw44<(!3ڢmmU=˄{~HX;F\5Ls{q.N~)2uZ؋+ TWXR }J5}f,$m#ۇjWO%&Is\:Bs@Oeg:u26u'9WF~7y4CKM ׳tǀgנ:$opj3:PUI|:f3 | sD<_X&6d΃@-d΄ 7j[GS쁙f!ao0Mʧ>+7v2\%(}1p𩿑\^ǡ6џuw @l!frFPw;ilaač!)3O66elLqeA&Hv!nᭂg$S$m= 'tvF%qfd#|[ FѮC>23ԱDNGlROU8&|$݋ (BQ'"yOX.zl 1r*9YS}"Gx++|30 2nL)F{KE9O\v)^I ݤ-oMЮ1JhdP0*h|ur0x\-`aÃ#k=ٚ!53z d GP#dx#zEVh#CH5jܑ+NriDNVsfoZ2k*wZB;qp{Kq? l0nQC:52^OQ$, _OَH&#SQ8g&@q&yx xy/ٸ~,FȇzLt;Ae$ϯRђUsQѮ.ņ}2F 터~7^^M!&c8Ot\Z- 34/t; 6V[9]#g=eXH9Cb%"gg҇c<3Lb-m rr&c"Z!jJA C f:FY6>-;9T9#ЮGFGtsJٴօy̥!;o~v҃E T˒Ԍgʃj&g#;LV%[')S#cPp{Rv1HDÜV? > 6!<( mu) Q*k9Y@ B?{<ңc" sng~ɰ!/9a"@'P3=sJF@-D g$$wf09^7]%O/%RH#uj9v>{ T*&љ:Oe+s9 ;F ]z.IP_/}E,`f7+Y* 5ծ7gٖQWs]E_HOy !8Hd_Tqȱ'ICT08k(zvVO@ t!G4Fu2c0s~X}#U7Zo)f@ɶnw}XþRyh¢&44]^|9a8e M C;z ;/[#Isg.s")>N{ۈ_ 6NoAW_&6&+PC3 5elGb*Fj陣&Ք@sHE Ȉ +4O2-dRy^HoqMHb2С <69#26s !UlI:x:T :cݨ!=>rDb2]JF˃v(刟Ohn @B%>^OX\zUyGO0#.ڈ!lt|OGd d"15ٜByTQ a[>T 㿒rOԊ 2!vRq RثvCuPן Ye4|f3rZ_%8ȂbKU;dMTn"81ID_(EV*ZKKz&26+Oj?8*B 7oׅCzg֥ $JKN:_Xxg_~c\BǗ65:əNԇ<2!G\۪$3 n,h5{0vEX<Y[W5;(̧|^O[~3uxu'B9 q3!ͨmפg-Ie:%pO i!1G,w*X.T ;XrVL=ʜ]ɡ_[P\~ 9A]}ОIn\gMz&"{YM]ޯw2):)FZf=<ʑI*/]K1euM眞JlDCܻsxnl 5ر(+ēlIcăTCT.sJ\*)=ɨMUн3=QVr7né~Rs6 },jY?"q=#6/١(]5ɻAl$Ö~.M\ .']1?~3%w?9x=@xU=ܶ2"H |_]qG%>ݍ-;l7]D2b{ò+R*!4.cxEtB7Z+~ H\?ָ4k_Xg//W=r&5 |S5$ޫ¢q@R+XiӔFk!)nr?  4cL嘅@&­'E˺' :m$E-8M)'H?g痦߁r|YI(r;;2 y.;?ON}agZy*t"b=Juڀ cX945WEF I=uSD X]17-5# m;:N Dž@^im#aQR5 y-HDF=kmK8y8䮼)zYfN/u\y:ggPe4[^BAns%],RXerIuEƍKrĴāiCtc&mק1-ݔm!sHـQ 0D *|TG m/JE͑R\p7F2Z[k:3 _?${:!LNN*q3)!=C?'BeqYGȟn0G}KZЦ-Đ6ZL򧏍HLM _$CpDjt|QiB&];s=9:[HZEegp$cqOZYsԤ=ǚ`~՞>Xo-ax׀3m"aru-.EKBf8$:7b_c. ^"Q՚"Vb=Zkn iBt0Wɧ:O⽟áBgM .i4$U8bN~8VsU9NKq3)x>p#5cȘ%PO[S2 [}@C7krp?>x)H*Iב3FQ 5gaFB6Ip)E E>yMy6s6 @:{y~,| sdGX". |5shぶg. c{bRݨb!9>Jghbxp!ikx[z1_)ic-tXt%}lA:f7$,J@3nU2c Y;~'QlT8UgZTJ䒸9 _eFƥ9 'cNKRC_|U䖤ma. ۹EO7Ǘ_sJKK m6W+&#Oj>" ^|"f`cIxR%9u$o) vc!Π唪"#w77rgB=0b:~Dp !\:sL[z$gMC!I|/tLP4[<^3"ߡI{dyaAB֪ÇOrE/沔Va]?#Qv ȗQ5^ّyzLS` #6:7bwH3k*ZX{#) %3I큿ll>wuTlJb \fg3v~u۠(R ]ȝ_I~/endstream endobj 172 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3209 >> stream xWiTTזeWR5Foሢ&/FQE1V1̵@Qbe5j0<~:䉶K|oWɏUjs] ƩP(Xo?/ϙi!>=1Jit6s9\ߝ9s8mbTX/ 1k aQZc#y3fNKnH}4ekj1u6I w5荮+B⴮}yN6'~pmaz/wObqq򒔥!aڕQky>ìd3f3Yìe1S;x1BƇef2Of13Y,cf33~ FfEqb~{T^uة_g9Ns>?c뀘xp X,6*3d]YRNk/{cJh%g;kk%&|5\4Õ:Y/j9Tޕț%K5aivZXr rv<$)p8lrx '=y2n7_} 8g6sLЕ;|Ԥ?FvU@TiavBax\"+y+qRAcg=&0]2Lx2ȇߡHSٍ 6coCO>6h 4!+*+<¨8"2%?%tx8<#7}gaaNj斍Km I I©dn9Op/9-w:t_>O}Dg?H޼ ~V2ɲ_kԪ)mdcw >7}I'?SmmuG|z<PVx![N}vs-`ac*xJMDQAæIu'󀟀JQqZ& 4SL,΀}s'^bc1׹U_6w|*%tMCRk|_9$iqhzĒyܛ6s4 z=N%vEcu)>S3s[J {{JhBuC̉;[;w譗"7F5QpipUb8 (Oܺs%~>ut$tt]);o<ص,"3,Wî*J\ίP|CI \aMs G9|rc75u[#prTSB%,^GoccDb# LU1ٓVyvw/qzS"@eu),{$e*9_XiYa$KTߦk_PVxޮ˴)ZIG+4.(h;{29hXV\A;BpUtDXlx^*yKѣW㻽"< O\&ɈB [ɆC&h-c9ڀEjG&0Ó;v'يrȲd՚"VKGZė㪋:RP*ZWmtCw" <#>J{ּp<\[ k()CSLzKQnvKO6oSYz_!^L{AQ xPJi?=z=Sa%eKxFS.+$٧BMƙW|y.[c*1l̓,\YꬡS½w f נTi#24+NR-TZ0.+TH/MP>l?ZuB-wǫm C.n_mM_C!R겭ApObQ,#haSA\^D1ife,\I(pSҿ&Af8Yendstream endobj 173 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5488 >> stream xXTT־+"\@l! 1Ƃ`EQTP,C&mhJf@*""%AQcg^4h̾x[ 何_gu:콿}߾h#HX{%n6IW㥛ȶ=aK̏0S){e[#E~V CT" Tه jacgg;5kk;A>a^N~>A@ / ""v9{vTT,Y!aoOag''Lma#Ǣه펌 p fKBw/u _Y|Y'iDS,BSX!<۹h2LAۻq@dOFuޭhW/м,\#`ӕGJ\YzE3ۥ=I=sȊٻZ^I E&FGd MR3$%AFLfVœrK~-gɳo>)87z"KP\ hkTd'1͒gZ94:)<-v?_t\Ҏ\A;JCۥ+NqLD*%id-oE|z Õ]f/2XL!1s,Kn,gĀ[A44c79gO(gs#>ō]}͂Eug|pNS R/d)9zIm5Ɓih]SPFm>v@sߵiU")[w 8=V'5;NSi@$'I,B@7:vť#i5`^ yJLIi~_j-SuYsuôQTi҅z4jjP Z6;K^#sv5rQN{G|'(:eUyP] {3j8"9ϴ ;wd'вR@5 }zօ֟L!9JSQVN¡D|¢5YOoJ^j+ Z-4Rnk!Z/72sOdBVJt rhu+ǻg%{m-((t&j63[<#NgÁZևoM ejJqOTq4ˁbmQ`';[3JU$A@)K$e9Vw2&'̣Rp,2҅Z{2c`'2Ȋ 4NC,ȄocrWc^%xd8n7=SmA(HmF|E&?n@!m'.\HbJ@j&#>Urҝqg FڶcUMGT^if ; -=Û{%ZJ{jI 'K|тXn,( \WFݯڸn}qӺԳ\P4l?ȉʈU͎a ‡}Ԃ?g0HAɐg u')9WŚ撎6DC8ab RO>="`mSdf!v*#gݲ`Kfˉ;O5kn6aaI- sKq%*,hg: eڌ4:(s+jc<YF"lx!_GGQ*.<)sWj|{7^V$׮9ti܄Jy%9υOmq,q_w[GX߳-/A1ˀ?&oYd~ϧVwNǣ:l֏G ZG<`ظfݧI5 㯶(;"kCt\Ngi[j~(_\Qki! TWSpvnFGY'Yv4s|^x;lj4J1Gʷj io;klRv9{.InP}*xߗbNGn%c,%h*2:$% -aUM|9a ,oZW~`곈'Ejpʷ"?SM9dEb |ff~PXܶ[YtHh t/Mhr\Hcn h j hmmjjˠJǴ{ o& *KjbЧ9TSh*j(ʾ>- c [>iaFoqN&>a34)h-lCB`R|8r;ִ~n2d07:u9?9gY,M*TiFk)zU𚐴yvTj}Ӹ䢤o˗nر{oɆlj"\? ] AYix #, YJ Ec)>a5WC[BvrZsD`۵?I@g ^FN,3$@]kR')EPљ-kiJ QGCODO[5c~OMcsՉlDWvp:/d祖 L{#?TNDiթt.6*Ḯ#&~fP7駉eu5Iȣ޵ !'8gG"z(sC ,?ROއmqj%h(Pmq[]`=n-Si3%@RtPN,f Ewha[0 ۹}yAbGp8ͻK{(}C{M6KN"t4%O߫n[_ } ڰlu"@ٟF|0?+:yrBF @gg%ny'Qpf1]E+ޣvn×/#gDB̗.~ oovW:pѱPI4w]yp2 eMz!(yƢ̋H('HFz Ll+M75EILS3}endstream endobj 174 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 859 >> stream xoLel "9 F\aGm7n@9l jK432.dqI412%||Xɛb# ìkli/vưE,P⣋WD j-woS0Xe@^{[;KdGuue\aWy[:pTnQ;=#׸5Ϳ<9ejеT{4ܬt+c!^iN"T?)AQ=}Oz̈́#MLl#|nWb"m-f3;/cVc҆%|6AkxS㏵??)?=+풖LfXxt~ [s׮mkWVM\2GSj<;wUr踕* `/$9Lq"b~B}Fg qADq_fv˕q)EG-ߜ H cx|` 9>{LΟSLh` Q. OY/CNhzl q.vzLIғ}~jSph,1tF>֧GFҹgCӀ*&o]l489[11-`)7p3>Q5-hbǝ_ľ={/Ї%jIn-1:S^xaвfL匍0~+\s)E/*yY3V˓c0RIxGZz 0fm M@f$37Gb2eY1g,VB֪endstream endobj 175 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8109 >> stream xyta X`z35ތ{"m*G{ll6L$@ qJI彼Z^43s{;s'J ._c7O$tź_-Q=h {GY{ȹ%m :n)lǏ7v{vWg?!^!۵CmM 6vlhhg1A e=v{{Nw7~!+}mc97@d=ȏճ6<7`^ CI\4eY+=Vyzپv:>|7vcu䘱NO8i)L39%E VRSA*j5ZM}LPk:jNmFP&j5LͥFS[yj+5K-Q );j@-&RKI2j2B>|eI)'ՋM(1RRTʚR(NulnRA3p;_Xgq^Je^tYܥkpݾc~/-Y6xzO]Vs}L?$XS3mbNߘ~=߯++_hG\/n| 85p䁯2x+jH!熞ᕖ-`DbAul!?eJHPʓkw\֫T_[FhVUtd7uLVr@ :GkZ9(l|BCԍ*-JN0Xg߶R% FޢQB +}Q'% jj+mE28(A蟮x!kGk7Bw1h- S]x5{'4 'n"0 Z!,mW~1nj{UVpՑz)@J("<hJ6/دar,xhMw'(-Fk N6lH4P4~& !C"k4'h:(m VdM:ItDw42-H/^<@_yG̣ t6CD/k'oXe Jų/\\k'2-SZFT>}"dOْ{Ui5TVѯ,q`%qzA끐F;Xw= po4uA=~9Y'p, 8tAe*5_ZTI*=aQC _l3@rUjj cr Kbyb&h!ŦĐ|3ҞPn 4B_B,?yF=~Q^^3e^ ZO[xH-V'޵A>'w,vEZ$Ʉ\d; Y7FG%Q3ڸ<shP MP@lyGݦ##FēD݌7(=odzw?#~f4l4D|իavkPGUltٸk`P~@,x;K/gc<UGW ?e{qC$4PL^/~-mS'84 Bkp?dgJٲfH{ڀZtHۿ*c, [%4`!|Y{# V|#^X_Gʟ,/+c\.|3GqCCta1YѨ76N@c:鵳FT[?A[ hAgَ8oQE( gmۦ)2{Ā Dd>#8;(jkPVFCź|,a "$h=ѕ||wݣ>[S :Xbҽ&m%&gFNz*NƐ}uZN@ƿ$J_hȮrķh'RQ[fj s 2;-Cɢ}nFig9~D#I(="4 k1G9\dUcB>#~V sM^3x&S樓〉p # 1+E)*Zp>.!p}1]ْnDf-9ݷb4H)hn$pJE\B^QzzWH%'ՁI~ Rc|1 2Y`>(6G5 Hϓ9Ktָ3jmB!z*UkV4$s|`SI9əRiԙi4h#!:c7 _=]uю|՛YM:Yn7ïrYQ家':́?@G M^'lcN),) K ~ k N'A3gXCՊlI+B1YOI U=2cRYiap(TM6qG[AvVf{#+uJ.mjJ O>][n2}y˟=?j9r:wclks0%rINWe;S8dOc׳mL]`ط8<;fFRQ{8çK#bm| dS@-i7zؙ{$&2 yC={LTI7hc`QJ!Id\L| ?ƛ[ eP/VEN*hM+_az4u*N.5P6 %@j}PtYN$_||T]Ҝmث@61 =h0[Ql`ve&ZIϭhbćC7a"3>2X|P'OA ,s/wѭPsc=8gYp=qY:($cAصڸ ,6H$8ywm>ES9<ҍ8RiPdU‡C!?m|xF`ǨΏ VZ;d҅Pĵ(l95 hX'DH/X Id +4&!) :4zpTgɯ" V`rzGLCMǢ)e\P{r.J/03{,p/N30׾ը{ff( Uߘ% I_m%_vO-xl3{%ͣa29*$|F:Ĥd.=9 [zXkZ:^yU|YGg@ub8o=kM2рΓj?f3L$@8dxAu"G$խ=e$4R@TV7t C1m̠nQ|b ]3?؇s*_oz!/݆jt4JAdpy)bg'DetȊ l׿Z)DQ-l&,O(yRF aLk_TNIҨ֗u0V$ KEvW߂}u&݆94GoEAfuF)l*аdQHW_cƽ%s}A˃HXMWT`;+s u$Biy˔rqo-9H2B. h<[7C 4M@ˎ}E( c4h)c%贙lćz|c!eCty*c +.0jDFm S.'+,!BuþI?,(QJۆ'"4lL إ9AUesM4fm>_d(b' MuA]Z04$@$I w%@bXH҂ "`^\r>>TR.t@:L$X&"'6?( -Q98Y3Ga$&*|x1 |r܍+#jD]:z6JnCjXA 5;@d0Ypء=t3G3LZ?opI1-m^V:};!+#}n"ՓӣfY|}y(cQ6 ej x&yþ,}n3cC<_ JHE4--{<pmpo+<@1w/nYWD.zn>h>Ŷ/e ;T9-#tTۑŊ:G4VJ"5K-*N^D_^@rYqyq8msS=!A>^m-QMV4'pʄs;@8{5HܕXQIy)7p+/ԙ ~oFƁF9f~ с.w@$z)$%%M0e)/2LƖv4)r\`ËC7?ugDW[t . + *+"ԃd}j ]/3'( l2mE0,%*&ՠPH`*Q B=s5!-41J&u$-L".xР\FwpW}}-}ĭk!&,BFԜіXj~ Bk6)kg3/mԖ2^n"u b 4:ҚN'fZ&#>e G $*tŐt&=ToUm/تE@DxY,ahW :5hXŴlln}E՗Weڬ. $v)A)W֝x-'ԪS`0. m^2yBwuZX2 @Kd?(0 [xvw ޿c8V_Xk$g5yj_#_w _L b'1dU*wrsui@~5ƓxZG^=}k.^>i9h*b}h)OLhsgA존 .4T`#~V ,D;..sQ!QSTZ̺cpMXa?ؑ?_ݢ y@#E76G {1+< 0 .?;5=j-4uRJ$(RA41Rzh_b_;)SZzfcbA7 id_Q\"2!<=@NZyZ dO&Hy_%V^.": )b #= J&FSVCFM!%LgXDB^Y}Bj$')FcyZl^ _˖GTxFZe괯.dutLZRr쓙2]H-z(wBYtƶ;J2{A f%5?za8_Jm`O|uUeg9p9xv3@E2LXFxliԨ5Jzb !DM-e /QLkiX;dv]oNUop F#?#gmc- Ŗbk6<+Aj%Wzxi`6-ux4ۈiQ%C$DǸĄDLV^#RFyo1 ݟpr䐙+gЇUUG!3SL ]juwve:AJuqLq~N xIjz{G;{ go84_v{PI[Q_#L2tdMe'52^i:g[FRJR],̡N?ezՑW[( hM}N^HkyYN2%Qe$4~K"pmi% :4 |4.5ʯ?~-=mŹjj5 0ZVx']\Kv4[փQWm?͜9~`g`"K"kt-_UwQ]EOY>W޳?0%_q1b@F 9qBAMv7](dnW~BDVrfn N{.wl,JaKP( B.?BNvZm!t"ctKcR@C`&wǓKs8)S|$*?ru ݶK s]q+8}Uf<jiDŽk qoWMZ;7~F=Nvн +\̢3*Ú|aYN{4R~)K#& 5֛1XH*0I#}wd 폼I__%sqqY pԙrKO3gl$l pL|TR_qdON-15 6#&pf@Z[odB0 5eѻ0nV!K~WwS)Zh4M6=dփf)lM*5CTZ%%&ʹ ́ܰ9`g.Wn^?u΅͒KGk8jLM֨[fI&ˌ&gs~ 8MC^)9vt@LmQ¯l_,dCc NEwټ"(.hI0 -< }%i(\OxG.!oC(~h#(ℊ3nw N CȚGDj@ك栞wNC:yB,^mbXY lq|$d][xw]ywK /QDHzyӮpL-_d{it AgN5BUsca@A}xҟ9P$ X-C=!Kq 9qUE^*bdEj/ wuFBxHxnMѓy\~Xȯ3Ĉ3'7S:kW9+8)FL~yA"6$Y/7^:\NMGBM\TO&xe0MYyM7oG7ElU؈R<2akT8R\Ѹ N4xqx$ M ͎,Lb,z~nJՋK6mz׵]ݻ_)ރ/Aeendstream endobj 176 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1193 >> stream x=Q}LSw}d {&:6DA0aD2l P**+Ig ("MZkBLe\25Αלf,[b#?j'9{dTl %輢Y,iLZ#%1djV;OJ9(c// hٔ\&3}g[*+ V!U&,_je"+kΨTj5&Hc5kJ.~dZWgfl 6lX.*aVo*loZX]g["No1QŬZ5{9.ULP۩\*ZO ԌQ*jDݘ1??_i`JD*Fi:=t~a'?q49[s/Sa py](Bg[:)u^ŷ$%.=J_MKU,*piP$cJ| T%Gq>e1&[.vAG; w zW6{PaogyC7}ʩGAúQI;i/1xEs[%I=a OA > Jqbfp~t\ЭH2$i=՞|tLdO[̈́5-\68L-8< p+W'z9z:Ǫ0Ø xncwTi#D0#BGSB ?~QVJo5o;EC#)X\Fw,,5T*i0FpE\H5٨HRK~77@34DpC?U?mDu=aņ3NBO_Wz'q!-DF0p9N/ljWwqĨ2V1nϥ,$_Mĩ|Lz<],MTkc-CAePRM{w|<}qGHqb_JKY{c{=a a M2y:fq>m\Ɲ p8n^%yg`B fDFЇ} ~Ov^j<Eّ1`~ue{Zm6м =]m=_$l//7psC-'p)#x]QJT\P*6endstream endobj 177 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1469 >> stream xeyPSWㅗ1.YKLET6(EAP0u"D13`:v\kP h f N(JUjz^Lv:ӿ=~;ߡ Q%R$'ޝD8؅g2,Ttv&@x MQ0}VAjTz&MS͝8C;W Cc&3Qjc&Cm 2VFcVdVglRO4iC&YXiTF34w0}FVQcPF5Lk>,`ΉT%RWhcuZTŠXţ4-DQ8ChD( I{H"L)Vͩ"KƗ ~j;/kl>"[dv=l0ŭEx:Gb^٨Sv8/h!%X/D'n0 ^Ddy[0ܯoiH .ejBp-j{_i V^lڠth]=wH-ܿG, b7`zI i,~DrW'nno`|XCZ,Ln$u1q !VfeѽkʎqMr ӱ|ԍa~_yBjԥk9 !OaG<~[#jj4BeIrN.hZfMRBUO˶9Z)hxDnHL>N\ /h9s;=X>7@6jm> r"W]-(k7qUYA-J.5r)pcq.6hs34{d#5m0ABM?#}=F0ysJ@PglM1، pތ}n;NpUΣ7?U"c#`~wUJ*,^R4NPu珠?aܛ>p R2 5 pςOѳEBXv%^g'1EmH9t( 6(@bNmݒ?LG Hs/3Pb×Bd 4:Y^Le(t ׳Z[]p5o6LܡNLLՊuM_r:iWDID\ܖ'q?`9=} N-+Gk9c)؛qx[\'iyiϕ4]7BlA' 8ϩKpYȀs5τ|N3rlb3L8̑3؜MrlQP1fkr 'ˮU `%C6m.ќ(*eR*-_1endstream endobj 178 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4560 >> stream xXyTWO*FM/Kv::ժjW"CB! $d{$l - ,b짶̜igi; ݀:3=gڙ9!9ͽ۞d{d2'޴s/Df1#O=+N5g'X|N\ LbqO897@,&3GY#3DqS-Yl¸_xaYܪ4!/%)I$ۑK-C$dqRva,DqrӄyiqoEq6xlX&۔&3g95k"zIFi) RmM:;;9c.cc'cc7Y^xj">b~Zƛu%/162flb,elf>ƘbNb^x%4mq/&7qġG~I%x6fy̵''Ϟ=E7uԯb~5#H*Ydi j-h؂gT' yҏS(O_ yӿ?j(P#m@YCUvqG|3o-R5&B:HDlib+"7JMY*^Q+^CQ zYX-wT:Ș7Y; sz%z2͡ywgh2g9:4Zj$ ش,Ga83i*E vQk-P9"&z G oKϖ}<>K K@ɡE+/ޞ$oĵ{Vti1YN*fXaf9g,CW^LR (th9}=*uPNNݞjq#zV>yԾk1},mo|r5eohe Q^e4m4tCkof:dPͧ`(=tc1WX H=^%+!kWx=&h 1Bk>2jѧx3Y+d5Zk-< _ဪ>PA+'Gk"*0~eqۏQ`+3wD A/@px;Ҕ Ze/T#: %bz5&%l?ƭZ&[ 68oOЊ9X/&pD= =W10`N)K -UTg*qapzMfrBP`Qs︰X%ѯKgعE.Lf NULhz{ 9$RUZPpBwq~ F+ Â$ܠ؉@O;oyN $Pmq|ި3< co m -+o75p' ={.v闿anPANzkjizdR1N VމHhLi#NfPRl JeZy.HqEQY(Tҕ\@HOa> g .~cdrSQrIWSI"ZTF`[&J2Z@!lt hEc,th*g4qhUIѽ?ĘfoV0[}K7uxD}쑍ixW%BZ"@k?jZQRٯ(2+OaD5lFZh#"NH $9*'~qxz&?^1YMvfHk4Ʉט$Xwž>eKsN}yGC:Šy/\yj[CdMc4DON3hzJl:dv;I]ںj9 0YI4AqRa4A'eUG4G ⱘʭ]w"2g >;n0@e#New혿.oлWWrr4?Ԛw֝kdez])U%55`4~ͻc8=u޿FGLE[W`4˱i>%l=l6g^:< UՎz0mW/ ?~ TCe2&iM Rx2YFk19//Lr@!wC۪BdyjK@'5‚Ҥ~o&12q`0 c #-V^ِi&A%#4Re  D;G$3F{MnXԓ E<ȰdFj!Xh.&mp`3y*p,o}=`tI$-hbj]o襱5Xжk&7T&ؗ{?pSx<&VG4f1f 5Ch^<&265 >BFs@I[-(u6ڜbc2\87޼Nդ icE쪮)mǶ !B Qۮ6]|óKصGoP]{88A-PU sw$ǾFqh^=9t[;jF,dfFBo5Xu"q~Y d@-i1`d˂l:3!cVMtM`?&Fendstream endobj 179 0 obj << /Filter /FlateDecode /Length 8392 >> stream x]IuC zVR-9,m$҇R$z%+̞@)x`O*+|o\-GsϿ/_ǫ_}n0ӗOIsR^U\1OࡧO:|q}W7?]/ǔm.=qYUkFqS$;}L-rX&7޻c+o{~w8`FɍxxwdC4Y!'D  ^'ŋq Ubx \n>SHXZLrn?`J0ѴW]L7p 8QRޕ8p˗׈1_aGEa?[jIx}Zc| O N]mY_bdr 8 Sg\K6ũyxO8lPvoĹM\.i3@֐5#!-QNl)}squsK8v3Eg2 {E?1)\q}%1ڶ{Y唽|s1/9[6㎫GgrH ޡp쐚8RBS[,$'P.ҶvLɍ9p٧+vTA (^Zc"Fπ>xC[2|It9V&}V v C "+3nB0!E^LSI0Zom ݉`ȅ,TyftuE8sR$ry*=uw8XMf1|49?DB\§dmf F` :"b_}0XeMۮFsZBypkt>&v ʃZ m8ՉY>swwE٪μwpX vH́LyI=h`n#"O`=$i-ѠcjBچ!+G;dI(v٬в)UP!v<ȟ[* ";U$eH?j(fu @+L$\Y-;&@_˯b*3xb5yQR [Gz&#P_ϮJ*`Xѳ2Rwn$c1}&" ya" m dcQЮP|*HmޅoG,ndM3D/"6(e~EޡR@r,X\.I.[]= @:13uLsl | -MT8kTˡ4%Қ'0MJp#߽(ŜD-/ g+Qm+jhY37k{GU ;ZO imNU:+[aVI wd}$(^PLȊ 1)Q໽SY;#U+ '8ey k3q5bI.< z=Wg&"+v $"ѭو|lawģfބ#A^MB<\-`W\lW݈ěL\؉6m4"b"{~ɿAt gA#0>/`{gFQ^umN712B)g(Ek-ZYI&z $K)*T釱E8BS9e3Z(yeIНws6pHb [(K{ĪzfW,x{LYCQQ<\p/jwVJ ?uo`J|+ERܗ@ 4|*>h\لv~eIV6M 4ƒ~X1drr\ &޳]ٳHs1Tѩ.@s,^7gb)Xl&В^~ >I?qм]'Uq7crǻ1Hw*r^02'yO;jB.R9*f1Νݿ~͝D6Mc=t+je6<((ݭub)3NOW!"@R(CE5f_KԳ7SZa`Sj3;5#abSi5 `4##U+,paT_\@op 0mUXSGSwQ3mQ:#i>t~vݞ[]@); ~F`߈Ds%)CZױ>Jb Pt(0zN줛]q0ANc 2jN%kFi8Ʋ"=^W")ou΃ZrN}3kwB|zՈnYl1IRl;.X Z˜<1kt # ([2J͹U!{ڭ/>!W)!сf W ȇȔLx}&90-} k7 LzWJQF"g{$ 4*\ xB Ӎ̗Q"?ςώO8sXV{ε&NV< :̴vʁoڇx |ryFW[oBW\u.!NVSd}4U%˩W0 b|7c։gtYeckdqs˶ R ~fˈXA%2",7,JO!w"ѹs;N}R|?z˷N~JfSmuIkJF{7KD#V8 ՟L1( BcƣwA;>t%4#D@}F{q4V;_~j/tĢ6?9SB"&'b1ˢѻrTOYTV7KJ:-%gZǰy7Hv]Qe'\#e5ŋZK.VEYH"o$\Ȕޕ gVXVgCn>bBC2=OfQX^*GJ.lV t2GXk.Y>T gR^gBFH1'Z׭Zd6nLԷ;6/Iޕ.qڈmea%:iɄuB%SVtJr[B. ?;I)tQGO[8tE9eLo&Im] +q&)ѼQ2HNW|D(THzL?MQBZp*O ",Bt8 }1v%@T6=T7fA8vo JNdMIއ9N zנpL5Mɇ*͓Ae3p=tv@`LgۧrWq&߃O&]q_2=!ѾAsq3ɯ!2;#Pr2nm8Y% | 17r +$ ZPhSuUPJzXJaePEPȗV ðŋ>K:u*sh(y{ktXPMIodCiYZhC;<""xD܀>z; ul6fc5L?F (SGxoi+x+7bhFث%&TG:]ր1k~ _`q¾8dՅхΝSףDŽďZrJ[TM|* mI*CmJTpplC.pf'Jl56aOH98ța-ym;SOM,z7fmK؃ץ}^:30֊jDaI^!4(? P2k˅4L%Fxu "Ww^þZYaؖYm[ږ,r]+%p!7N†x1W- \; % {ˢSiQI&hDZe#Y?}mrWZ0P2JL9c-ɹ"̩V֦cldNÙ~/¥9o Ȉ$2^<^8U`5-<.QXP+ ԑu䁜ᦉCK-!m*h d$U%8we& py1#.jZk߉`=}t+f"/jE(Ÿ(Ryza%CF1̶ %cwR~]ZyV]Enh< $l~ X3 7w`:%Qq 0>8e-1^\._#4~_q1E;XV=Dv$]lcNn&\q2J?_uji_V0aI8e$T8hսP>?r/]g2:D >K[mܘ9[:t'?Q;Zg3]p2j#&m璓ϓ~%KerC=SX.}n{zɭ6^pו69hIHL!&N49Ѻ(:e߹ٺHҢpbٸmX$=]qgFϾL|kpJsOV`/J] m*&C~QIKi|BL#v9[/%Ʒ|i =u)% mgHb/#?EX(O k$"MG1!ck#ȷNЬ6Q}:J~ICe1Բ9wK} ZGWR >j&ƳIru|-6]]X~Es|l`.,`fxGE~ř{wJ#$#;c$̾5Z&c8-&w='$ }V,4Ur #A✵LqYc$M]WFg5cW[<l8?'S>\L|4*=Oj;T~Sv8ڻOϗ۲q+R8a?$S? c KK5E!8K~]ɀ0~k7Зh֙//+b%B]XˌiH[SjDUXY9vC ٮXE~J@D)$Q;~ǧ|yIlJ(1vh4H[AfNZ%H $m'\]*\ݵu S€fȂa%xW; 5G$&:iޡ >쬚sd=ĻmݎfCiY| Ȼ/K!X;qfs A.Vm #lP󴧵e2DDžjȭ0ZwXgkCMl钓}DS*zd,0s$qwcjҵ3+TE[l[f(ofN3Q®e7_X{uwZendstream endobj 180 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1102 >> stream x}mLSWm[$7ދ""c6NAR:P+Ֆuh]"/b\fb6}탛i9f,qr>ONy0(N +2F^WIKX1%n^gVMqDž/  ;Pdw֚ZI\U)lX--_Y*sh0KYRzhZ$jS$96\l1y>sJb|R-n7HfE|4ɣns4IhW[ !v"h+CHEq `򙣪E*ŮL?r U 6 g>RL\GDomL=C_ΑIs~YxE JSV5;"LC(ίȣ <uHSUF)f)VX2Xů$7& ~`L\ ]!CK5A*/k N)V A kXx!\ٽΟp!ӫo^H7)vt Q2FfɧKڴCv-F3X5T2pw Yn1+$#-\IO<| in}|9Wռ[8 WIFή~A[ KA1 t:|njj^^l!'O-|ɯW3 [[(Mn2 v :CI~aF·$5L;l>kHJ7 vw`7qN7 MiR!߫"\BOS {.*KUj /aXQHU"p({Gnq䟚?K=9~񏷁v\%J[zCP9Ӌ΃]_VjZB< #dendstream endobj 181 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3581 >> stream xWipWn!i17" B$̰I}` 2K^%˖w[Kw.oxw&0: C&!Ld KIL^!]a&J%y^Ttn|;2*l%F.[n^ls:'/RvYW15!-1]x4EmR 4j:Hm-6*ZF%SSs *ZIͣPuzj5$T(*GL##:Fx=>?rOFGȉ0z(ݘQ7vCq%ɤKrdDP4|Y4Y*aEr47e`+X4}Y[tO89Avussz_9y9X f"wlnVzPggzmGk'w4HȤk_Ѭs ^Pz`+ʧ|\TkXDǐ_5}6f?w G_VE6g9JI^EQ,?RdClq_7~Ga+!%RH4MI EE#ٓW/;Vtڿlڬ LT, 39,EDEX+c>?fS<_>9mIKROB_HI4Ewnɑ}hGU/XY 3! ` ؝ŬZRx .H lUbɧ7|u=hmxȝOF hMmֽklUEI2&ͳ(\%=yv9+<J+H] 55uuFS78Vq60i9OINh@c*Phx2&YWtv M{fg;vz#MMW /NUբNr&@ e(4IM#~-8}靸+ I(g]U[mL]dWI)?]-:D7i3QE%mP`E9E (9ޚܽژi\Ǜ5[_ܥLOהkb`ϣ/~2\'XY]̆~*JU68(nsb$:;m7(L ΣrDN>Zŧ LȅTل XdG@k+df.9y֝qvps3ah*JXj;_MԲib@v#\\n+:N4V(W85䲬PIgH pV<{654:f l0V1 ״CxKnS0IP~V񅄋ɢv8TE#ne-8<4 DýԁnW 7*hA|>@_RfRJm~I0z{V˺zZ1<`5*}6WTUyͿrScy8@x 8yE.h쥶jPVEzл? 0y]C9H$=L峋.rmqT_&́\B9t\/hN/O;J<G<εslZYYZӥA0iRgmjr3g[s5ep-('{*r}] mdA=7 O0hn ƕXՍ( nG=6`nL^0Y5; e}%e<&Tx cux h'چQjH54Mhn=qQ_OZï6ŹᄹYO^AL :Oxx9yD+(ǞWeKG/^8y20<[{C{mr%ݴ otbzV߳?@h3 !R 1w^=MWח^œXOqo ށ!-i_&}B3\Z^6oQ?Q4 NrEU/M{t*`3 f &3qZIYml#?5&xsC$#?\KJQ%Xe1it'-k@.w׌ D\[9獌*endstream endobj 182 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1053 >> stream x-mLSgǟrX/n^NjAƂ8t, zK'q)2]aF7-fT.e >,yOp(B82s/7܍t.GhPnh+2Ң߰ ZQMĩ;\Q}Rsӳ?rYKJie<99id2tZv)Ǭ6>ʥ|*+UREqx2")lh< endstream endobj 183 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6642 >> stream xY\S۾!psU\[@]Ԫ*(N'l!lž9ldnʼn#W[b:Z7$@W/?䞜}yejB G'IN hh>&0;wfS}x;2"sӆCZhVC}ag?J(HHä2Q;>4k֌6'Nec&g*puO7Yͨ2 !!!]}Ks>k)Y& viX'Yf7tMj(&(j ,.B$>8uiea;w.w[kj5^Nk}:oyqN1i|ig2vgtE VPJʖFSj$DRRє3O6P qFj!5D-&P$j eOMRjN9R3Lj6eN}NP}<՟LYPbʅ@G%eEYSBj 52SՃI}B L0A Ja_asf# IXTd0_Xn-=Zӫ|yBz>>}.7/.1#E"/iu6VnSrRYPR jMh7jP! _j(EVXDsB j3I^d6'f r et{k*·,̬.~&ECH)DBRX|9KBSQ^\[}xa˜x7Ka+R ;wҾo0Qsm ^PC`*my9hlq: F¸~|U>=<;du6'xFr ;\ lׅ | {ZU AL!,4|@w#mT=5hkcBGKK)W3< I6Z{OC.5/m NZdwc(Ħy+Q)bn:yx@izjd=mRyumNzRǼWᔖ(8`H::20Gi-O>wU*P3ĥ9= kVތn5 <ˑYJWkg T 51BJ@F!c2ހO)䚨ч®{X1A) ;0(hg8m֪22q%j/LYFAd}e䕪fT0its _^ P (ά`5IJeq^IȂ5&MlIuklVF<>kaۆʈ4妥Ay3> y (0fo8qp s!nha.(1}c 4s{/Ƃ~ dhcJAYF:5 z 0V"w يt6Y) eA .=B-o7bk.{ `z[Y`H$I.-&fttwF.$'+$pdHK*>ȣ#`Ϩ]a > :,NP6?]4 2cQ*RXT({je=LuX?<,uߎW*?떎.[#bSCĨvO'@_8>ͣL^*eI[O? ZYpA%G4fl{_S 5;JY?5rwpat\NQ=nY  h*- 2i?,5);1p{<.V51;VYJ}A(hx/~k ]E @e/]QsѠpz|.uuGqdOŭ^ۋ ‚1:9dmpm]=ަ Ek\fYfo\k]d6&>_FGFeFѰ#eGY7d5բD)j_*y5TGΆ5 W5f$}^N%4Z6Ny"~d./HK$tmj%zEaG쏏Jpepq.;IѧOGu($FA9 2ߺ}ZM%Wǧ gܸJ.^wC+ p{ hhO' xB_kRM*$ "J=3סuP%~2VΖl̬&V*JޝuمMyA_U5m0_s?~?RFڶԵ>z&,e'wuV')7޼ty/9n} x2/d)L7GlK+jL]1Rc‘[Y~(:=2TtJeA~sE`~0Ɖi~w%F jV )dB΂u٨o-""ɤMrY "f#9>Hkx:ko:zk|QbԉnOwd͞5= tΐzuW 1Zf$k+?kTϴ:3rsVr~hK}4իGO/߻ޏ.u?"k4~`T?ZԊRM>;\5susiSsrI\hU?f'p(Vu-*Cy- 椲8/흑@3MmAa6|_wzO#w[8TYa(}o9%hG'n)"IJ#|A@*AF!H;lDo?/OpVHCmJ#T%f9ɑ3(K8笱12i,*+Y<#De$T9#A9yj8Sn(iŻެ!WB7ROv>"=Pm+0\!7`!tA3jn@<C<9<E=QOP:y4ZT .j a l ĄDgf$/bs+uyQIinlݽ _iak[ 6qsDtrlJX a"Kޜ/zKf礥p ϿF):x^8B AfP3pt9pb[!ܻ¶xI}|v54nl0kh\eseJ#KB"9ߋ"[W )5|IUjˇ%6#uw`K0W0=Zz(~yOH<\g Ni_]塄E`Fn͈.Ϯ"[QSyE"ڀ$$rG2$$V)v5 e"3~eN" 5Kx<8G LCN Uw^Q!K"v\뼢MNܦ;DŽF(SҤCrE4 yb}0)gBZE6.>1 mS}k:{P K=rjk;G}pٳ懲)QV$኎h<lh*{1M52=NL@Y2\*wyN݌XDOչXE|Z6:'"ⴢNUcaԶAh/4BxĶ1wE|Ѧ^ry wdp7W%_rw#cĿi;Ncd%DT4Mu ]8[ _ׇ`vl‰59e;6vR٩ BLD~:e>TZBdՕ˧%vW/ЙԴGHM eaFKJ,hq0_u4=2ZC'iwZ{61v p/]9ogS?X<}%;%773ԪWzzakf}8!7u/SMi'6>)E1D* Zq{Zt Fpn"lt.C٘> ջGɓf|OIwv-_yIu/~ÔZ"O@:%P˷=@))h:oywv5\d-P[ <8@HC#RxExQG<41E2!.OxZ hOmM cSuz3i a{a /ăq?l/'/IPlx =b> stream x+T03T0A(˥df ҋendstream endobj 185 0 obj << /Filter /FlateDecode /Length 360 >> stream x]An0E3Nh6&VU 1DȢ/wRx?=.~0ǰ0ڹ.3r[>u, SsҦX=\|X  +KdYI +)"r$a{+mȳ[DGVzJѲ?v$BXItJ:JdjVR@$@퍘=j4b $hH'Db t9S ASGFLM^Lrh`ˆ)Yb )5)Y5Z1RHLE$@+gH\M9F)cYbZ}Sy_Uno Dendstream endobj 186 0 obj << /Filter /FlateDecode /Length 13 >> stream x syendstream endobj 187 0 obj << /Filter /FlateDecode /Length 7122 >> stream xzy|Uԭt'd,MI@i#;Y4@ 0Q m cdpğ AψܼS݉m>Tuխ{|TPBF'iyز*g>جON'1 I $)n; 6 <ǩS{b~zܬtS35,Q<͜=ef Si. 3IvMtY–jv,&s-zVض\' Jrt9ȣKtU:GzJssR4V>5fnr$ !Gkȁ: 9M`/> YICgRVÖو <nuGsYL6 83Gb8Vg79NC֜Im{u\Lحz:'kP~y݇#*&uΓ]8>t1TxrN*eeK^ GPEVB{M8t$KCH!)2Qa!E5c}%u>!5`kkX)q5Wk$_t2`e@(m#u>i ߐ䩾]ϧ~5wW c"?}4>jͧc#"d*F\dQ , + _s6T?:7w߫{.kUm467M W| WF+UЀ6_fMe&|!seUpI'nEp(MxNjA"8?>0$X@sUpL?+L Xlqv$ xK_)  8.:G1v vvx(V&h/~8$*8(+?;`?[{v?v.4zWa?mu?eV*"`6Y6R4T/mta 6^*;_'xSe]k;nW/ Xr_uVI+_`e@z+,_֍/<|.Xj ,5ʋ` zj/{ xքg (h}z"E`a?<%`g'u+&`V0CMGL70ME0 "HdL M &x@x|\h~60{0pF #{uu=aq0$·` XYW~wA@@?wwzN~V'Coyz^Mг@\pA ٿ3xi,;dЭƻ]!gAt7t7tJNwA: ~RHvB3 "HlBB!=' b!t((TH)2<"jk8!nv6 /S(@“" YW. h-^A3/?ȼŢJ*P($&`n&Uy)HfYfO2%<b*tVi@_9 jLYbbBn$$J^JPiJdEsyHUHrlIT`]7hht]Hq9ݶqN8t@hJD&HIrhNv3i7=5';R]s#2 ]ZCb@*Rm{wQ^kG;Ժq^zU2\͍7q56r6dό?z_whf+w,\c =ѠpPamu:e*nTc}ٷF}9T}.3њI-.[[7Om-`l>\*76_=H@tL-qxj J"*d!fgc׍V׮kY ;LE$?"'2⣩v)1ݗD_b,-QeQd]6vp\ 1 qR/U;L "9Q-,s|EŤo=Z|b˧ YŇ~:u5*0$yCŦ))ssǍVwV>yoCx_d<#)u5g@9T%BZ[0ClzƢ8o=e[hl:KHL&};E rL:;vaky9Ͽlqˇp%3Lg2.]Ԧi9YtEi܃Gř 7o}׸Y] ͘A x ^+MS2 LAmM;cgC+3ვÏi㧹!DMjmA9Bxi lDJJR"*jV%R{Y*5KףMS(0J˶X<%ڲ9k\w-]ӧ_oD=C{S6vEu'uD#Js]Qr-I<We#QDP=:g#͐n4߰fyV^z<+>+!+1˗/-H$|@rA|ABAb mfr_yUiiom„B_ā3}3|eI&;hvZ6%7g{6Wt)uS\2iC*n\m[Ch0Mg%-aeEVGh(4b#Mtɧ\zKY@2!@>Xc:Ij1)`0*sJ)y1YL+BK*REױ^Z;+rڪމ/"GQfu> 1X?Tt )I/K RTڟ1$.Hף%GI8@E ̾7Pv6k@󟊠pʙ J7Eu4Qzl Ȧ8yKzycC1hEIHX0s_lw)Jk++WUOjRKVaoVs}R>QQv xI t̥m&q)3Q)5"7G9'+Io,eܠ4Q|!Έ|Ub(yy .4jX'Ӣ*(;- 12tM5 !Α*8G\U 6l9~C_2Ο i";U8^f2g:jݭw⩺OɻY=^qGzna!/ez ј Dq1 E#6Um.OJ>٧-U>ї\)g=<-aP JPZ^[pecqG1{&Jx\EZ^d#O6IOe:So+:rXqX{XX'mqw<7hJ7ͻlmΉ !MtZ2z(\vpz믁Pc PS%jLUD>3Cиn·)oQ}m|P99$cɓd&YN4nI:S|$[y|.eelTIQ&Y$Hau+,å---Ѱ)gBt|k nGq;q;#ܾOpk1sj&aRXvuNEHC>{ X_^.gzVcu]vi KUC/ECcXcxm4HD>>^Oe5v7SMF03zKr(cxl1gI'xIF-3{reYR0zzy,.hc|m>>10Gt R#Vƨk#ssŴMէ99 uc<-6* Ҩmtltn388kVs w E8 _pͣI}sꩧ6^2J޼6p-#$񁎲[$rⵕ [RTUTqJ T3F;}𤋮9Z:3uUj5.~ښajdu{>g=wV쨭W=P?niyK)I cK|xˁdr.R .YYUd ZV.-gכЁ|+/udj3z@eXs> 4w8!b( $(3S'yd4iLoj^L w6f'jBŴ|SVPja_XCRQLdLymQ!}k(C Kd`l2+eLZH:HzGiy1}^-+d7)/2/n&CلN骉bXřj+_EAud&s*ɪðs2!6TtWHA=$1]di,gcJuǟeu ?175:AԉgJ6 mU y)~Xy[X Ou)f,+yVX27-#[Nʞirˍ,SDY2lT7Na-|%-6j({^(Jz\1=>s{HHfq79 2-܇})]WICX׳<&;H :r_IN5 CH[3䈔Cfw+Ω65<ITC?.9k>ng~78endstream endobj 188 0 obj << /Filter /FlateDecode /Length 166 >> stream x313R0P0U0S01C.=Cɹ\A \ &`9 *<=}JJSÁ\`)YK%ht,`cﭠ q)+*tQP[x!~/@?ߠ]vC\==3endstream endobj 189 0 obj << /Filter /FlateDecode /Length 162 >> stream x]O10 *XЪj8(Nߗ,N>~l#GpƲ5 HeQV-ƃ剳B7OfRUiZB 'mQt1 l.kSIT @s$Lg)C Swendstream endobj 190 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 807 >> stream xQ{HSq]fJʻ[P ,+Ƞ ʹvmؔ;*V,|nedBGCI?*^&wC0D:'oP$/%ear QǢٱL~$hT EcHEVa/>nxcRӹM^l4XBΜi V+3@)\?܄Ϡ&N֗.@CSc];J| A]e?h7=s*L>h fMҧ I}?Xwp//4潢U4ɩnvApo;$#-ns)"W ԁ=F֑x8]'ϸ h%7dq V{Gp>?3W(-E}C&_Qb*_y1߾1ngLS)#q܆YEU]|{JZOԳ5^jYJź]Nz^8EW7Uv6@X|N%.:Nyյzƨ6;d e$8Hez.I˩lY̨ TCi¥bLIsو4fNOF3Ѯgendstream endobj 191 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 955 >> stream xQ{LSgn ^͆RimfAd >Ga[Jk@ a" (8oȜ9dٲ̌.&|}&[kNrr~ߋB12DQTlna衖ޠ7eRgIHQ#5rPL)N:%2S+dnTWVلBzV&Uذ!KؠTWhBV7hmP+*!*͜Vקi 4rTV%z]LFCk Qiѕk2lzPh-FM qb"P *BsgԸS(% gB%䙒/X a GL Ku\"\"y+˙d 0-Ra.wQMxɑ cƦgW'ku¥o^_MSN869?4{/>a'{snjWIU`USO/`'Y|}j"ߓcNn_%}9 #ul8M?x]|̱vCi~w \*r9΁@[gjbfrXWRs@UXywz\K=dG{|ύ8'aN ﲛE;Qyuc+0ʒnX[tgAb;oA_NV:$(xGn6;ifeKe1"nCXWɶ$endstream endobj 192 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4216 >> stream xX XS׶>!sU<ۚyPkUZqe S2 9J a *uV[j}mڧuZ[mN}__o{׿0D}7/W$v/1\I?q\0oĘP~Kա]C`8狌T" P*U.|ƻLws{cˌi\)|B]{BT0 ?U˸9*USxDN S?%:H/OeaXeWuS/(ey2aq Õ #UQwG{x_&h׺`E)>n@Yɸ2Qjf-3YǬg60&fqg002S3Y,ff2Kk2f9 a1g^`H0i ~LQ|ghwI:_z~n*!kc38)g䞼t 8Ճ;9D9::.{#/>Rȩ0IiMJK6qI|W7e1i.[̩VஞN"9ӯ)RH,qj",>=C X9Op:p%^M) `1pŧYcB2 *ih i\\%R KFN]pul+E 4)fPu"A۸N*eR=#4LA u?L:x|:(8Dȹ:8^mUJ,]%,Z -$%ʵڔ E"7k∪(8֕ҕOSWj?nH$@\ d()\l<;('ջCc8]:]U%ț_ƪ{Si R(Nf|\e|NWQeaQ4&gI>([W,˱LR( 肳vR߰d+! ,,薴#>?9ߔf#%,(slNq#`Jn2˼5>ERد I>&͖+ F bSi e\Jq"BW er3S@[bʠt΍߫ɇ|kۇu犮&c3!OB(a[Tvd6SJri?[gg0+?lɮh |VlC4$k5iSI͜Yk̆ocp_D# E>mtn$y^{vl>tPꋣ5!O~vIJ...x$%0 80T4;8aN[%>ǫ> 8ӹaX5lrtgZ<[l- z-UTԖ״ 5G)bjy6v?5:U\ǥ|OcO?ɹTDR,J Fi{-eՄӃA/e.2ǧ3җq~aZyXhFi#tVX׀o_g`vQG)7\ E;u}2YqjsM(,ɉ:jַQxᰍ@TX [@*ЗxJE}aX!#5^5; o VlO#[T] E{[~Z,NU'ޡ3RTS(dG ;e(sDwph [O&P2AdkczV}e~ [Å޷)iyqh.HQtW@ŏk6~+y i,:ñUy)ɚL4zvlZe1Yh|>N]Zଗ Q$ܒ ۰h3 ət+XSC~ֽjsȗbe֡g%uxrm\c݄]wW;l ېO0lܽs{ ;m0Q|p- q!_ioɞm:if+ (^>{,_"'\9_c;sRXY_+<5nogfP 2r _E / o2VtiwHqI>D[A[+,"'ޤ3(˗NΛڷ2NpŬ&i> stream xmT{Lw Bqu[tT )jj)j{<e818PyA :eLѠeѨ8机dK~k;-%}~y}I0ljUOq[0O*$ T,D8uZ $ Hzb qq"M!P)$8n0Hf&f 'SDg˓&Ji*9:Oɉ^Ui\O/o^3\AkiVrA s97*8v6#1aɞjs̺qý*b*B+a?_tZO E?F?: ɐl$JtHb)E~z%uf\Bè+\A&j,% ?xY"ضѺ Tooߟ#ŢhoHN"QO@ޓ(sW,3gcZvHJؼG_sLjTV$<}`ȡM %Ԡk鑀Z`jlXIpTFAΝyE`_/Ьʶ~Nkׂ"@d[,N=Qi6)7h"TVnW Y0Twk.:1y]=s ʴ/FYq$ZZ*/fpn WS/.O|[ͺMx3wlĻ5 \vJt:E $l|b oP^9Ĝp ~KDoygyu _q0'vPo! Px[ڱ8ȡor4MGAn:A m`4@䫬6]vI;Ug~<O/ԪJ"#r?bgvt0zP5$Jen{|d^*-ނ%j1DWz1c )1rf5G1ӈ; %YX9vF(#' s*8}Ix P{ /<&lF&7N5"Qލ'p$CWN}.Ǩ[;[Z*!L"PAe?HAAA/?Uendstream endobj 194 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 452 >> stream xFCMSS9/u`B@&nN  )hc_nsCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMSS9.CMSS9Computer ModernRS34O-FӋ#J4RR'SCJNMu8XXӽv_Y[0"1('rc]O||}_MIRM2:?L{4N惺.@uPUb  7 Ƒ ޘ endstream endobj 195 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1526 >> stream xkLSgO9Xu2 nˈ P XRRh \J[ZzyP (**9ELde&[a{ÎYL/o7`1mܺ-^ȡЋqL'>E]RZ#l;ǶbCc 7؅}SRM<;M^b溉|c5P6w]jt5nۏYۺ/vvݽ_18Z 3"9j6@5(>@˚Z` 6O> ZulpˍlJۗSPBQ)UJqu nldOPb1R<:8)w.NP7юo|f 4j8^E h 8_S$w&{S@ ".gٛ @tM^8!4ءUmj>#kGn^ C^Z{7.=LM{(9h(N/#z(3wù4fZNb{c=zrD;=D|)h$Glz®1vf\:t pK$Kl) N>ϝ=5Y;QZƑ~+_* \vV45ޫvVkJ+a&y; -~3ԩ*>;|`(ũb6M¬}@h*"v[ȳ鸎zi n*-ԙt椾жbR7}SĹG]M+\V+uQ ZF/0 XqGyԀ?Gs+{ O6{}mWxiXn$+\ =8]KOTh%.lJ?ef2 ̪[׆3,ҕ>u6)4}Ѓb܃T׍HׁŤejB RXId ~nǗ$E- 5V&_~{xAئfnw@lp{!.6A -Ml0F7œqt.Z"qocR̕I zjY8B|%k26Sp1|6$[BMxzo0ܱZF}058CcO^AEx2 wt\>^{3L{o|IWVĉUФ-Acք&挳:VЦk0[PeZ`#Z *,*^ mHI%p,mӜHQi2B3)i!{\<> /Subtype /Form /Type /XObject /Length 100 >> stream x˱@ D\UlLliOW1P8󌝸}:`~!ni`f)V$"z.8?xc&=g>|sxe%Y$endstream endobj 197 0 obj << /BBox [ 3249.08 6564.96 4999.61 7022.11 ] /Filter /FlateDecode /FormType 1 /Group 38 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 102 >> stream x˻ 1|` *8ȐulGdHLhEc<ǎޢ8;^GmRˊ\dE3J.zGendstream endobj 198 0 obj << /BBox [ 2282.74 6591.29 3139.64 7041.39 ] /Filter /FlateDecode /FormType 1 /Group 38 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 150 >> stream xݏ=Q{NAmAoZ-UM2QtS{+0H(M3:y&sXQ/g 2ܵ]w;\]5endstream endobj 199 0 obj << /BBox [ 3142.32 7170.14 3226.57 7254.15 ] /Filter /FlateDecode /FormType 1 /Group 38 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 114 >> stream x+BQ D}WQh}v@3l6A"ɈI&g L\ &qN,v>]O,~2yL tGཙIF~.;Òs?? ,=endstream endobj 200 0 obj << /BBox [ 2125.14 6421.37 2209.18 6505.36 ] /Filter /FlateDecode /FormType 1 /Group 38 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 113 >> stream x9A sckb`_}f%BY[nkDRܱ0! 떋7\54}XJTn_1רL>IhC+endstream endobj 201 0 obj << /BBox [ 419.781 1232.53 5610.23 7949.58 ] /Filter /FlateDecode /FormType 1 /Group 37 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /Font << /R46 40 0 R >> /XObject << /R44 196 0 R /R49 197 0 R /R50 198 0 R /R51 199 0 R /R52 200 0 R >> >> /Subtype /Form /Type /XObject /Length 1063 >> stream xVK52,iF,^I0/i0UG@HHFve/}W<$ôˮٯ[pL$s='"0Wmpn\cWS~M)@B`bd]0/_umF,8S懿]V pC3'KT}~6*Ѱ`v/a$%7usoֹq,2yY gO퍳9eyݜoaK;$2\8lڻ 2QfU>dY% 9$^9!ubs blItd(S;MU;" 2R+[R}) P_ʟ?sQ |0-kP=Uӈ0n$C 2mQjq<﹮X'529f gYmǝH ,"fQY PeT&Z *;}ZL#~= 6Q vM %BvDؕ&r_;-lvb$U-{;ҴJ@)|6ˌ`G}sz =L~ Y,r&sՙZIEJ'fSޟ醨,۱DZ %>x IUFP\G6)2rё唎:%3zE=ŌRE%A9{18"&9$g(9@Q $.o\oYTcr3eu$b gY=[ȃI|QA.#l 3s_\͈> >> /Subtype /Form /Type /XObject /Length 59 >> stream x+240631R036232T0434S04032S(JUW25Vp  endstream endobj 203 0 obj << /BBox [ -0.14 -0.19 5952.96 8419.13 ] /Filter /FlateDecode /FormType 1 /Group 37 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R7 6 0 R >> /Font << /R14 13 0 R /R16 15 0 R /R18 17 0 R /R20 19 0 R /R30 27 0 R /R34 31 0 R /R56 43 0 R /R57 44 0 R /R59 46 0 R /R61 48 0 R /R63 50 0 R /R65 52 0 R /R67 54 0 R /R8 7 0 R >> /XObject << /R54 202 0 R >> >> /Subtype /Form /Type /XObject /Length 6190 >> stream x\Ks7sؽ.ec̮Vf=EԊbӤdY go>PER&*?S˳_δ/mp~ LY9}yF'7Y6){9w;5lRTn1nunvL1w0i^2 gWM&D~#>_A=2LR}^!3G]@|ܬ3akr۝QvOd'ub,0hT (+qau6_ Zο#Nq !1_mϾ;?o K3`#do cye$S턋Le 6A)2yK:d}ov{`s!1)zh״[蘠FQԔ3:neR<>sbs$h乽q.'t WZFdmNt{17{d6dcQC9ρw;H`ASʹ>y[SWBtf t~S҇F>8()\Npp1y LNfWEJޒeQr Z v2VF'RnM0 NiWp/Eέ; @"7X9AZ쵝ˆz)t8 7`YL7j!6i{+>x˞|~F"ʥ^2u-d'vw1ꊟ׀ fBK> m~61{cidc0Fe(Dbfސ#SlIXʯ^`H{GO)#O`}@@% 5 {خt:$yV76 < p,wބ ta8?~A|  7MsΣ4!Gr-q~Ģ6VܬkCXkb$kT+9B+ZJk]HÕ}0[<;˔|K ,lYlXJ$Mj $Lt~y_HDx%+ v;U R4~Fgv#{Tg}Xcb7Huÿȋ" hck/x4* x^M܅5GKYwAn|R#/Q`1f{5 ?[cZh@^kaX ~zOi R7,rY`xo*\I^n\ImX#H?T%Mpȁ*؅%PmJX%Qj!=,xx}>P•\IaezYit9'ۣ.cpD ѱ1pid08OK(e[&G)w~Nn!7qIޠ-ͩPDI C tX⛅`:$9\T >܄4ÖKGhE$ *=hd؟&^3Luym]8D7 aw #I CcR`Y\5I@Ud\kH} گ|kƐQ,ct"Umi,zЗ~T,m*#8fN 9F<ǜF&bs>򬈍F’s9WluQC/I$ۂt L c܈v$鈙Ic`Ôk: ^HSdo1#U̾p>=4+}6I`P h!Bڵb@rk(og )?`~lezZrF+v\<fԋ-vz#hfq@XZxݗRC?i*ĩ0$lotѧ.ѫY/puѝxڒTx\!2yN Zb WY:п#:q&D (D>0~: 5BK\#|0%vHcN9]3hoޱ0Z/AaW=MW$T!)˦gTJkٜ)gU;0 d{hqkP$kNY˰՛󿜝ۿQLcαxIwt:RKxƯCpZ10<? meӿWjI`9$ƁLiyP̹m)N an:cW]:75avQQ{]8o`kF!+,bE9*@\џR8ًpN8:AUY`Nm'f[[l E-ݨ]Ed ։ԮCNaK,<繲 ϩ4 DlZ$/IF +TڌtFHH簖e'a4LSBWu.Ž5@(|.tyQf]%ߢ+7IYv9JvBG@ޚb"1IFA}B)GCH]~h--do0XH1`ҩ1(;L(_wi:Xg};=bO 0/x7h 8/VzV+X ed,9 >c}|/]AI%mlMa2Zt&FʜQSAO൫@{FQ(~kYb;qRF .fя( mlq6ux!PTLnm9vИQDN"W<ؗJDy~=?l {dK&ő2$B"/wiwQWO:wﱈcmi w&a+U#MoO}8" #lEQu!+,y*_ձIn=2̔ˈJGXRj d `G mU6Fc3~2^qqW]%BMǽ(=d#[8b &bH5 K5z7b\bev&pwdӳNmK1;ζI綥/+n}LwT'ҙ81zFl7o{mC1]w>TU;DD"TB|G[!s)Z$UѶ–L XEZԾ:͚5OjH}[ocE3hg~R_K"&CR)etM>L2c{~{bFN[3VACm [[1 ERLG~ {M1xY> 7D-a J,dE3k:I^s(jn+3YQȡ+~*K׀C Qb*t?4q.ź4. Rj_8\@ xytU84}A 9\°f63M ȉ kJzV%i;L3i jg9YGyQWmzCil6PxWu% ">p)msfqbUdtfIr )L@q%QF)NA#0g ƍR,t9ԃ+99Y@G/-x zѾ7&͒QJ薙 #$j}"@\I7m4"gtgXxI5febt֝k!?d;yj}w{mW @-@ {mvċxoǗQB>"%t9|8p1|S}^ Ă~!c~/c D$ũ\ }ӻx-?Y !rh%pȔ[9%|=M8YZ2E.B/J05s|V/ {x~Jg[*hq =DnZuR؁QڄֺfcRZup1҉jh2V])7a*0b!s4M9V^* c  7\f@HO kA}~jk0܃=qKi)H 7(W[{sc8µ^Eq?P%Vِ`],RQ=sq*7WPl(G˞dF K"R[xe%tĥyrcX:O)Vxn?›)iQWeVL }bN:uJΗry=7oT(+*ran#樣Tx\Rw_$Q9ɏqD8wyN9N]jNƷ=j~N+ʚ?⟺{ Q^-^yOXn~|.),ְ!!397d'Ɉ]SCa.K#Nvpov'{m#̔N-akDZ_16* gq?M_$Նk/a KT`[)} Bk s+~/S]+M t}#ۛ90$wP) Z=-r$L7k/I%Iz"A \٬i 5WZ96aF$ w&S6'i$2y5m67iI;:,d˶w|ms>իrph* v'Ub_.)1Tr%d^s~?#<ރSs mqZK>Pjl*kғ ¾6Z6j(#߅2'Lܵ&@XCyBe&bJh!  #k@fvx@ _~X=yL)AC| C{lJ[Yx(\0̀ 3(xו )@=I`-q!n. vV^]ǔ{Qz#31:?ߎfy:,OӴ<=_^ 昍cM-(|r @ߒhm$) c 4﫢;9םX3y}G q4LBi ,C9h_3\nXBR+Ra 4sci_gAbBVJ+S3.5*7 [9M4ٔ=/o #M! ۷;!% *KIZ{v˖^{9SQ(4,h`yd׋3 $:lƷuJ.-l5p]],KjM]GppCyL eP62o1 yB*gClɬi ~&϶Z@ []LT 'Ŵ 1ïE6z~89cendstream endobj 204 0 obj << /Filter /FlateDecode /Length 5331 >> stream x\IsGvc#>4lu9E!d[hk4p ͡ @C8de ADV.oR˱ϮxH ȔUǧ/M}`(+s}wǧWGwrGx'tz~Ǔ'jJ٤7oi8f';5ZY8Iͻ|^۸yqX%` |/N);́:ow`DiS{&^|I-RIHb zBIAo]°NIv1i K88OpK @T :da$[Pb΃Y0IdJ~ +#ɜWBJx9 !gC /l˒iVX9b@ڂㅾ?:6WO҇põ'sllbL )zxnx;C\e}#xf|ˎ"mۣu>y@ovw1nvyopwrzb~Hً2V:=k/{{=~oF_iE-,J9\"A1OaH8t&1B~إOh>F=~άf8o(W p}Ig? T0B\p&^"Pv(?ookq?036bIշo߷?oG6@%?`;Lx߶or1/ۣdX"3:CafI}| W_=d9n സ|aPvKֿD{7WHz7<eΆK őZ&f/bW'?< y7X.Et(LYx}$o.@u)C^>Db "z=~|~:z3Cѩ>d`0}/ ѠY L3A:*6*ljJ0mOUq6dXod h %i@D8pE^ Ѻ B~G/]L 1O)L<}%TI2SR*nv&:R_ktFc-0SR۪I-'m4r. [Ī3dO6݌Vr m9|}b"֥8I;8e,%̈p*jxb:K5Q+ ye/E0cL8RG?Co5(y?r0YʓC//>ѻ 9ف<;نM  4-xɁYuSsȪ "i#'Sxr!-UQE5:lY3Ec5wڕE>/JbDbўA>sQRe ݿ*,-OЭ l:msIovS^9* P;K&V2(jl*I]q6C' 3w~/_]:>J5ZHQXQVfpSLxL5:DTz|5 ˲CQYsXw̥kuSpMyI$\OaID>0KˎZoɒ;pV2nw|nS705軦3 0?rN2dI<mVVk-Y8yS-p1F3p / bg)Rh)rjw5RP@IUlkO;hװF~T"QS([4 %5E, %!26Co@,!_ ]Ջ?!Zn<"%:rJZ"Ӓe}sϊCjك߯LΫwRl!4]<!Q];=C/gH5HN03 |Lg j0d3zj+<ر!tQuSrhZbqmx+YǍ bbtЋV`%^*¯wn,("֖v@C@QGDR8N1mئ 4j t& ڰ-3q2BS1y#?㱛RQ;#`KtHD`|Z/mԇ&w;VE-{%*Ba|#^wh:n.dt!S0p|~M@,e.AR1hv PFFL.% w`"-0)of$˶ Z\MQ*pcM+iASi4.V[Xԇ9;> TkkiлlNc02|;m+Msʟ2 nED .ePu.ګr@y(V=n0A3N0ul)id1 qCI*=}ĝ5| nMJkc%A|rh 99p9A2ZindvmGΌPG%\>"fFpF0((ab^i ;f>1Y@vDlcM0&$s 7N0U\X8' 5W`AWCT\D9Nz=hW u2{`WR& Ė1!I] sO/ /WG)iZL[\8G@#E2y{%z BKnN<~='oqh+pE m6<"hXJ#biZ8A" s0 3!#]#8CLg`;/d-ȀyhZ8b&Yy¾(8Ds\sRdba#KW#X<.<cQ. 3B;O>Y+2j6 퐋\ZC P듋sA\G,}9 j5CemK-=w%}vM=Ҙ)ZfS;Y&°fvnOXF<M4`g{T >q/Խء|B|יEd.^jhb.2 BJ"&L.qupM"}t*AA T:R+eaR@3,)Seɼdl$gwaA>QvG\^IpIѭ\\+L{қ.õCSnjiR/ dg/k3} -#UU+z)Et }20߃ɢ! JN03ϡ8=P|.}z6+UE%Dp]f Bȕꂇ$eKEy )ն'Y,feþ&"\,}+gHё$9/PF%ڳ2 Gv"dI~c(><껛*:s_~`'B;>ZE˕jg|"q`>+S ` 2ndfNh"aF2xW=#&yMj׈W#ذ\s"9X[SHj ';5F/yeTY'6KaN~C|0 ,87_1'ȣNr!w N(9E$[,Y,Io\D&j"gA8^ ޵SX} E2%aȠY`Am,1 ^<r.ti@]przs-8S .XR+` %'^ {f~#_(X>hۅ>k*$-8=)lԇ4و k=SFke)( pvɴt>cR}QVO3`hK9"`ޙy5jC0M5eP["bu( >VnRFR؊m=h_ivCOIŮq&΀6_@(3v{]DɹOPӫNo먿`vT})yڂތw]C1 3]%Tؠ8<|&/*ekㆱ F \E*%t Puw<9f;?Lz]#++]BVzf=x3P!fF PQ +Pmx}<(briȋxlRU~qCR3&[;BgB \|J(R8& W7^~$`=#ewΘ{fkT݊T* t6^oD"sy}qAtbcAdѴ>?-&5n=CĿZˡl;%q ia$OX`ݧo>d#2ֻ+64@އuZHiUOjΙ$98.z[Sw"ByJ}fvQዎz .EɶK> *'hQ_Cwlv,ȁN|`"+nfH66׺Z 81Buj64B֩7B٪T-3 FTS528> stream xx xS !ˋ '$v4=@F 5<FCK$՗^:v^X_J<ت׎]wwWj,V|WօM bm63RRYk5cVmmBNQat'!AZZQ &nl0s tY}o( b=fuC N$]S,,1maȽЍ-&[/oCTZgy&*sj=|_ypn%V5Y5 Fۼ]NT1G]h}q?/?x*mD](%BYlL#ώ[?o+F/6W\TrΞI+Tm+BcSԘJqoE'):>>2϶ٺ {֣aH3pbUF[~sS`bʋjyEZSh u l)VXZ}:'t,rQh ھg@Vg`jEP 9^$r .#qށ][kۻxm/zN ]`Z(3XѰLklv[- p@Y4חx]_&r\T2_X!+_0.~z vfZ h }0fm<w_q'E2PP__Rhwһp_y 2 aCgyl^:7/vk `VեeoyKj@܉ )Z;(i;™e%h u:<ƟCI>]J3} .:pt0^ѺD ./y>G2We'+WڳU z&#=+Ec~~J%VpB,86<q]&vT..q$P z4og>x pkMW 0Xa v8Sv1 C`zu2^g~v>#'Sls9X Rrg!1 e<.K_bk ku&u_q`Z=ɕ2dkdج=; ۸Ѕ|%bN g-`q=j%-K:>G'}$YG' GB DҎُ*4C-?u+HN;xfJ|BGp]gFB\-skZ4na;#׭ʻzg{1Ow>I:y"$D57Uoo4 Vin \1R[LIIMl|g.]Rj+cW%+lK9|7'ZGw],ȐRUI34\} FAoɁÎO-xs8dH|Z`5%J@ϻ,qƵ_j_o !xn@Wq֞@eRUm0yw蟼B@ʶ^*7)ml%B;_~W k+//&1 r9|NB:QRm&]YrN[9|gIEAa> "jkn(;Jhܭw2 X AW?/."̭d2{`E98ZP1nW4oVn }kej _^@RtWŹ!==N3B! !DEqKi}#Ϡ\P=eҹ>o" fO js =;"Y5O|e`œ4EqeEpHвv:HK3L59 *ef# [կ]\(.2v>j?7io WK "xD ?"yw3įMrs]IW+`30vBQ %Owe&/ɷr ddB: ۨW6~{X/z|2PaxrADa?dCp2pxw#wN_)ߚ. y*PA>[/h$4W^=Ufi37FK T2C^>K:%/_wn\&Gyt FY}Jbzt3ÓYE?R4c]]\Ԋb-zSvZg&cI&llL[S՟> x[Q 13p?n@)UyWiTR<)l=XX.~D}Q\W~%"37,jc- 0ϝ$s!_,;oH٨c<ֻd's< @o^k=Q_먌%J/a_6>Kp<$?+|;1vh3՗}Ӏ[<LJj*GH|+ p7>R?Iܷ{\^ Bԏ?匧;_:^kn0mJn!t/kn8w *}J%m'\yv!`(SP!)kZ2n w|oN yC6q(,! U|U{F_K8Bمpt&<J~72~a 63v= bt1}4E=_mAvʫ8i53w? J,gz=Sn`?h_kH_ }A~u{͉uu:1Eh[tuŹgޑt#cz6Vk2 tOq"ƣtC)5s햶r“w>hBchMYEVejbYηP}3= ͙eF08wS b % 8oUX,S8ԯaBݢ?b!xsvHHpX,ʭ:"e?<@VC67ŴҹNxʢ@bs,Rx]"F7ϳ-qI1I;;} 6gJ_Z3gzoBXρ\ LmC&+RqcEBl{N]m{$ _D mS,bW"3H(4C;8l߲ˣo~CA^:0s0`HN$*=3Hpym :Hb%9ԷsKϒ17򲈛[-,bn_3?tc➫u9-ΆrMc;!0|`=+l ސ,.y7oP%PlgV^E3[oCc[mrfߓfS ,{T0ޮP~~7x^{_C3szyO\dS\GQECcm n3S3#b]Ix+c?)Лs" 5fCPl}* XJlLI|[[J@`;\hKwltˮ֯vRPqҫ&*opLV+;g-tw_7qҢG|yiu!y l,q}4 =;4[~"%%َ$!\doLD*\~M' p9"*oi夼B.MmuFPqΡsba=$F*̅<&25[O-,m0yTm Sjezp/\}9dX\9# XUi"ڜ| ^͛kU\q Qg mS4\g,7աwӳ*v5 ހ<[8pW}:V+k/P˖TC S].s>), ReѠc8&^gjj J,<{ n!Y,lE'!"D纉]_ᦨDL+ɓϖVV@1W$zٶb*+P ;0&jyg&tE ֳPUX>sUz Zڌа[## W둖gpQ[i*+}[![MWz(ܕTU(/STkqX/8WkTBKVdGUλ.N~n}pX iBj'ؤ9?زti^2`c"< O FtF~BXlE/U(4.s/קgvJ!kendstream endobj 206 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 794 >> stream x][l Qtg2@g&mVֶZq[Ţ %k;Th\BPBiiT#"$E<ׄoxXtΗsP(ŀ(29[>LYߤ_3f"kQaۘ-4N`shwpDW!˛-̘":¼((>1QC@(~QY|9ujCCsHr՜)B_ b(o ",E!ӑX\R0\֋r!d²(:ZJPZ*BdE%JA ej P mz[ OUJՠ]`! Y$^ٿ}{lYEY(v݅.> *;kpFeyvg(2 &҉RQ 'bw2@&g~EwK`{IlF nX ۴>"͎$>eث/46%Kv5|\|k#!WHA%ic{P,jF{Gt!{!&uƍHHTb,# qendstream endobj 207 0 obj << /Filter /FlateDecode /Length 5703 >> stream x\KsGrc#&>8V׻J-nXp#u)3 j6eVZۣo^Q:WgO`7mJ\\feoR[_i~XwmWlNo.e]76FxcRt9u63J.ۘLs3;G</u4%g< # frqD,ćy8d`Zfmc[/ͧq]?ɹw6sl|Zgךb23䀡H$0dߥحrgJ#QȦ3չ?+?/عƘaOΏ>{v֮]h3 򦹣cٳ܊ڹjpƫ6!X)Z!Rʒu.T^#CS1®3"9= :н@]n6W&of=@:6E~wjaD`_`L]HNL-  c뱠 B(|(\1#h؃{.8Q@TZYI[WcQWRY'B9n䔛>Pr09T~eDi35~rʤ`„GlsR+;KڹHQzvַŧ^C/x7N8xCEؾq >%'S;E/;% $X L Ђ v#{~A,EG&[l6$S KAB9v +1D.H QC!)h2`V‪ }`Zj1V4*by%^o׳@| 6yfK yЋlƃ1ˍˏ(cƫ 2'/ [ y  Q O Z 8t} &v3lC;M 0 Dc460قH,)@pb&Oµ (^]K1>)8BA6/deacq'ȢVkc8e;LnWC[NzXb\ָEgK6У/+Fnm9;e۵01:P@1(4Čq)ڜ3 %K Bs:c!1@a{,@HJ *hLr`KN0x\>Cr$"n#QcGUƴ%,eQ;>'d6vơmtxƱ } ggMA6S,րJ`@l5 7Bb԰חdKٸ{k9Y`:UbႨG\yEU.Kfa(|:~s.}w ,{QW:i dNDq]N Vh; s "X8!Zp׼-~gy)ri}A7Ԁ9tRBr!l! !ly, S%ũe<F22짧<(H; )bXs g[#Kg^nj KRݭg@JIT E7BYys|vY۷rB#h,/~ C2MK_<Ǩ /MXR*UBxTGtW T:JP8xmKf|L`[Sӿ>^.m3=*gK2oG2ˏ v?;XskrbOWsl q0`.|vQ$~`Oy_\À87-=]-|<|3L0/aBupz/'Yl\kRDjń[m 6-j18$&pmx?1(BѺSk4>")y0wo‰ZD5<Db0ŚY^flfy|5K xd],v`PAIQeSXq&$z] 62"(S=)f |bL3ҽ}N21*ߣ{J;f3a~QQa!bTD5; x$qJS<a!d$(lYO FѤ6p67ìGj K m?LܫN48͈;=3 @̈́>.QD;p!1f}G̥ փiia&mPEj $t!i?C.=҉yT*l/i"'$,.1M > AzMWn6zЎZrӚEHy_æzWjerxqYfU|¹۾ab'WVo{u!I^L݁팦Rc6-6L}}vi!u5cp_lTA5ea C"66 @)nnGjgEDa$c~uf׃?,77{@>P o=F Th1BG | v4[]5 mW@.g5 +W,||b?)eHLTD}˧k]8L{㝏%_yRQ<4Dz+yZ8bKmOYP?U,t.5̟ gx7 D{#W&*C" jzqj?ww >xY}y8FE*乫A)#d32UL/kLΦ |YWox`:?rWpGV&z ķa O˝eiYvr\)c7YǘUѷT@LyP|VXAR DR-`)ntCƩ/l#25!̤RwÏ9ͷ9q8zz SWg9DW2i\m)X%@=vnBMRWc;w^<~s$sfdnNj%!Ɓ^KY!vĦ %%/^h8 `O{ɇvgOhXMOEʀތV#K3e[~wbviKZu3*8iNaGC (ͥAnعa vMz4 | _J./BCea*NL.Rr%s]DM÷) DIa[zi}<6j}ߋ'YIzq2J;Y't;(NKZĸI3UUMjlw~oD:hb=IHn'y0J_0k\q&1b,":K(ӍVoʪ1`z/u&y<~ch2M$QO)-hwhĠ;]MӾ.Wzv,f2 oyt6zTZ?q,d !U˻xS<3."#yc@p Mw/?x C';;c: @<5,lT}+ @*1oPsq d<% +$(F/g⛑ Ck4LS<v KV-WX0xYFba 2ݝ64V,͇}[O³Et"{Gu%C[w2t<0Go1 ? o@L=z"\ KjHnNT&ޮ"A|IGO%m8&SǍVv "%^8 "eh;ݨ1i8͌;'9"=TO&Qs{Us[R*~oaH.!J.R/ @ 8͝gR3BSW'uxJAƝ2Uwٖē!^lwS$d [ȧ@N!o=r+x,WQ$>sKy ttA@K~;& gRfxeZ/˦, yML4٤?A*kk'z7vgendstream endobj 208 0 obj << /Filter /FlateDecode /Length 3421 >> stream x[K/ 4BD2rP9>̮hg}XYTlÞIq" r*c݂|_}y-.Nޝ"\<=\AO78/ty&Vk8<0Ajb&nN^v/WxŻK;/u*]-yϘк^Ԗ>^愃?%v˟NHF 0Vr$rdw10F[h鄱z\I)z aN0 %Jnd&א^c֩n7 *2E@A!+d[qa\J ֽV0{>?9ܖM96nxU:sm/ͷt~$WMF'u~EQs{こJKu7ٗ拦":[ry/#T_e:oN6YPNnnOXqzN zipŁF0~)|yh ɚ:f)T[ Zβ]g ĄSeX9 ֏gn҃WBWiCAAqǬ3zMF=M\X+b;2a-cJaA )fs8&P•!ɂO~3/ym/gA \xlI{+Lif/AD,PLDfN?|.m@'S[ЙV$"1#%pCbY-(AW%}0ƿRVŊ^g*( d!6=J󠩸:ڈa$cUa*}:DUc\hFMj"bJϛcwE@~\V#bIJ;?tb>C ˿ mo0F!"i@:n\mUf|WsxMd8zNFAť]jYwΎDɘr2 $\ acij#˜1޽[A*LiԷK_V ŽqԼVVBCM*8z!^qGn5ܚ@8:bkru! 813E4]Dh®.{s7%b#At28b燥twT*E-|g1J*\(kRXFF 5vJײ.x&΁v1"&-cqm$IE&cwYN D ~BpIPP7`47b l 3ތ㯋Ļ஀ q6N<,(- =qKnb[j qgIH\Sj.RI)$#+'+vq*@x %]N" wݴ5&A8.Au48\'NDfnv,%$=$i##P>Cz]eV:^ϛ͙2/V9OY)o(oΒWs;mԭNqP#}N]:ekjmtH٣ duY[c5D`}X,`}Fkr;`zwwuK mϔA194eRc}t7ܯSz.æ^ :`^1Z5Ng4yf2a? wQJ,3Jw(l..h;L4)raG[mH#:*Q= e1]Gu=jTAbA/c9`ItTZNK7QV$6֋#N:N4Y 8bZK>Qc`zGC7>ћWH5D(."rI\O f4Ah,DՐNlW,  8\q`;>3k̏"S؞8*թo? a> $}Td|z~-N /)0endstream endobj 209 0 obj << /Filter /FlateDecode /Length 155 >> stream x31W0P0T06P0P05WH1230!˥d^U`aR027`%N\ %E\ \@U\N \.@c݀}o]s~Nin^ڎAAVCB *z*endstream endobj 210 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 y@ZuX%C1C2 tpw'y?\gG:ikD&X+@[L 7ޟ@fOq>UkZBMĺ1R :EV,C\ H.I.` >l`_@Siendstream endobj 211 0 obj << /Filter /FlateDecode /Length 6930 >> stream x]sugG3,@L];t)E~ IYQ=,p =hrp.syR3]p|qw4_H/gW_LiNś#Rh'cqpaJ:zdc-u}W?c~8aҳNI4J* L@]E;pglq3rQư:puz5lr .hofM~y{ݪ ,z5(SNMө@';}Iܑa>Y]; 2@[ b <vV,S]9aP}x9oSze:>w;^z9,pzsp<*%#lI{ 7`AZ[L@4( (ZJ&F&ȃtz SzJ]v]F[XXNEVZE Vzt9 kܠ)qIfkҜYl\*҆,tA~- fwzǤR>{K & bnLekl*#}5{e&gϨ֞^.$ k; ͙*4ڐjp6Vb*?S?8j=x߁JC1jvDdI1})&Bl"D9M C7"Ahj)! '7P~y9FG79`k~mQ@Aަ49w6wl~q*I/%d;$[0sqՉz50 ~ Ǵ2Jw{>OG-^JmSd]OivjyYl-@n%U^H/"9GC<[XJ\kN4._G[?5AE"d( s4ZGkRBZҹ,FK('2Y2iDlAh0ل9k0JR``oZ r|F`ylx-v; d#/ͯ,d&Z>xYh0*q'!5?`{o Bb( 0Z3 'G]S>l$_'eڅ[$I8P7r-Q[1p3C: AK uGG*h#-@0ژW7]`Eq~wHڌ##(=[S`V!ï+I# 4Ex @`|lmPף<$p zD”f#aOeqěPJؒw|ƝEOKwN8@0ӍiނYC\s`ݾYrK'qD(\KS<;I+)+ݝ"t7bDtVkx|#`f@5ߑԠ">0.UjC-0c9ugU՞#H2p5gi4pl0Q"x__{ %E~}wj ڕva@SA$MR|"ѫVK}B057OԒ LBf&i"ZOC:Epx3 ."ZDRP}9ƀ8Fr ymhisi1Z| vOǎ3@"~d!< X 8Map|f5kD`#5&Oe&-F^v<4V^ 1k7M兖y70lW!Պ90^Y#;Vw; NaxWʑU xnBijƸo <4BVQ :4A&2}`mFa.&!K5?%EѧhNKv_b"LUwvަŏfgR}zI&/A 듵6DL3A#:ڔYu؄0Cw~̐sIis{_thཛb`^BvnxZuMv cijAQJ`Pp%sc#BN yޮGEA_-]z٥-S00 ЛUnC>H7⃺Nq: snW~~0D4;L'&*BdG>cw=@2\C+gcVvdJ f̊*  ñ\aDzCop:OPҺ10F@ZJP))h]L}&m"q1/J`\f/ߚ`468"JaPچq`G3 N_ 󖲄 sA^hºM!M\BއyS\LvѲ E`)2W+GeKe 'WgZf6Pˌ M0^*,";ܥŝ(ΐ ф+k D6RB0MPj/SsDA6" C5`кm\Ɨy^ >ݞ oq&{P u~2;@~1.*Ljh{ /kn7Y9xMčyzP%Z}x*em!e۵=$*K[< (n3םGAk gu3bH4y}V38Y\K:wVh90WM1C\F_fD<(G`uX=΄B9͋wF+ͱ1BΧ[TCӒg۴ILM"ԦbO<z>C' kC8IM{:Q‰ V+ʖ1U"ЋBN&!-PBNa3uטv{;c7H^ȁj;ebzS:I.*E^E%?({icU9Z#ϵ TL=X Y N[a\Zf 0g0ܸex~ulDM==' ?GGSBH^^Tu< /ؼr,UEyC& *=$NY”@܏}S) bk@Z9cD|_Ei]52lɅ\&d 銽KMɹsl~*m`)" $O5^,DrQu]t]T3 q'(^m)+4{*ycЅ8K-ҵDq_}l5h*Qѻ\-0ZΝ>ϐ18}Oޱ@,[; $. 6r젹RJ8p!︗hv_!/w+DPŵ.qQvam s6K̍*?YDD&LxX8(GHXٿYW^gxF^ %X=<*:u}h_4<8?+W G~LQz86q=ys_Oѧ$~/Y}q+ V$AjB+Ev&'\GEП87姤$S+/*쯝Һ~?TMf*mm2OtP)%a)IԯD\۰ c9Wpt_"JD=%|eFipoӋ#Dʋ¸AT n1ej%G%Wko)YRxZR ;E(W=O#j^ ?$>wc,a<X7eTNT~ӧYboKA] fRXr*jAySz+lDeg НuSP}.Oo;Jwݯk`Y8(ΉjN)#ͻ7ڤc&ЁpD8)0ㆱg vS٧SjSrˑ9hcld,niSẀں;xKY:ZNk`qY9 Jo X)k15(s7b |+5FҍPawN%Yu_M4 lSʉ37Z:nH`#aߛC x> stream x]O10 . 2D! }I.|D/J`H_#490Lu@vw=|*UUZF'mUu 6l@].Xyp8I.~r 6/BSvendstream endobj 213 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O1 y@TU"tЪjbL@ }!:g=(NGZ`: SeeM'l2;S.e!ridgdTNqPr48n1Kii XGg9C(Snendstream endobj 214 0 obj << /Filter /FlateDecode /Length 3942 >> stream xko5?^9|E 4HQJО$[IXVΐpG"NS䃩=p8ۥa)b[^ŷ ?.?'Ǹ4>vy|Ho ί/H_KItu$z6h螬D!t~Ҙ = q'TxfE`@l_%8A~:ZOG Gۿ!J#zuڭnuDF6x)*twd] ?J.+Ȋt$!˅GE} 5aˋ{B٥+'_B tQ@vA?gE`ݸÃ6HиpKS lE7s%#31"TS@ VA"ǽ(c[/##"I]2T-lwkmVq#ȴO=>_IUSe j:bxZ,_גxi:ՑD),2I7gLNZ|kJ]YngPozG+Bd4P_> ͣs`B<vY7ey> EG){tE<#AU:D'zD G AA"5آ =QC}k ߋI* F_>%$1bNjaʪ aZۋwzg=T$ʡyhKؤRnPf6c-$Ht.y"E(ZRmR#,nA1\bf1nGFkշǬ#`ԘCH 1Ly sti7T1!Yvʨl3Pqvw2\Fqp߰[d{U( `Ob>4K3)uT Oq#CJT_sn)㡳v+#{FKݮzon̑o!fpl:+@M]}̰s6 t gs۩3q0RJY@v}cKr칍ݯ#R|l`PYH~+7q6`Py6Ve'9vXRg;Gw#=d3ad0D0\&3` fh;>u֚xn$a}U@4,a@Xy*/|2ým{w7yʖʲo+vM06 ;(#$Sh/3Ό4LyT*e Z 7koP Qvxy0b d pXT|@㘽A#j!MQX)5 Xi,/ܥ Q}7'e.Wr21Ig.EVd'CR >Ku*6BݵI ! *R=wYܙXܭxhCQ{c㙸5VvJeᇗ%wyVD4V9M]&Ř`-d hX8 Bl:BPrFŧTkWgzx2oyPB1FcFld%7}~#EС'=ޤ(@Sy&DF"ơuhh4+O|iudbsꩇgGMMnv$ʶ b{ 4W5QEt+|5LoUe~ A'g h>e_]jYK(6k6%W= Pn<ՄµsMo'%)} y61c}$]1Mj 99X7#X ,_:{؜> jXFPTY"-]*I;0sc*I*_iMM}6SzFn,""ծf*5cQ<_,W+ln dO:7Uel~j=4Ǫޅf O4{4k8jqόͼwq~]t_2Lþ!TaJ*q7N{>fpj5ׯ1?k|G]+ѵEAP*h,zJG]^^,$_*˿U4F\詅G4Z5$,9r8M8{I454> stream xylgz NVeٔbp#)@a1wbî]>ޝ}{xO{m 0B@#Ҥ)%"Uj߮Ƒ:qVJ#͌F=X]f3cbKb@ǿNZ-ڶuYz91RؐؽEii1R/B16%Q$RL\,RWgn޼Mk7]&O "aYy) Z-"B5jzua|DVNƛ|X!ʅ2P))Ws ˄@Wݲ$eRB(gKBY9a%r@(./ð\lKb+<=,ۆmv`;X6X"ͤ)4GIEykU8 -xFؚ+2~i^3WHetJQ @)~֋2~Xj+aK3^mvt{|Q3_W}ӄm P@^U) 7S![:Ui!#W w-n"5f %G 13uϭt*FA44BW;Q'(I%ye"u(Z37_KMf!:=h^삨,tC/͠UV@E{ɀhpBh5ZՉ;cv eVVr}=wBkQA1X]Hvmr>253{Q4ÊgZNp=,62-< TNt"?F=I_q>UI& e$`p78܍.C$spfd$_iĹ~xh1O@m)!BPD; \*CJh>h#4̐Ad6O#p"pxiЧB0Q=u5E_B=jd>xa]Py0L4Irkmf- g>~ɹT6,1 lA+"n!]<++Z%g[gٻ2֦ @ŨEs254[ PE9R̩>r1gK%rTXq&zjp"ZQPԪ뉖VeDRz:HhTG\s296(}WǂSQUHEO]Eۘ]8FX:@&$pP`75id%':3i9'Q©oѪY)+dfܧ{nbRnnoldǨ؏!n_+1ʘ΢/1) O]X$:O:!+͆Yuw}s E.W%jϜ] AA.B$mo .|' 3ޤIWZZ#75.;&q]Ap1FmIݮ7HGd-:}އ]#d0gD[ sO=iE Ȯ#]gt@1#oG|V[ٕv?0-șwr^/!g#Urґw{2x:I#q\Wd79+ Kj;hqF8hhCM,ZC`4֟s5y\4jiIC!_2,8*Q56R4o9MOf2|{{.pDCh0C1~JTt}^dOlnkMR[Q%Q2 w/רZ0/_ߊYUW#M¼gkNӫ,߫ޮgLFWa4i(\H|I7ӝU +gfj^~j_\=`3dLvf=Z+>iU[QV$>`));+f]ͬg'= ʡXcg`ɡX qB%;K!pe*wgsjF5kSs>1q|;~8ZZ| A ވpO=g=m큁)l/Zrhœ> stream x]O1 y@B+uX%C1C2 tpw'y?\gG:ikD&X+@[L 7ޟ@fOq>UkZBMĺ1R :EV,C\ H.I.` >l`_>Sgendstream endobj 217 0 obj << /Filter /FlateDecode /Length 2603 >> stream xko7!tu6|?P4EK6'}p /V7CrC+9FǀPp8/r|_{t1yN66=>ist1f$y3]NJ>NRնZMk2՜,N59k-Fl.h7 8F68C{ɄB7'8,072<,׿2wv&l+%fd=w ǀ Sڂn6̌{Kg"Eg N7 |D5ƁǓ̕-b:urtkρ+H[ df-h`wQdZ4U@aD)A8*)ļA13-qL\?a%.2"SRqG!r/2uP0E ˴FGP{nܖ,<1B//p&oPvv`ZJ%~)KB$2,&/YVuK$b!]œJ˨h f\˜03O̰t(>I ?`8"u H;-a`xy9VhG@.W&A1*hMT `RM@-2MnZ` .^N=h^Z\\ ߇-uh gpwl3KO6VKٛ}n dpMF‘r \*nB>fOg&Bjz&r /cH{,ߢOVVj5?dL~_fisGX5&9')n$縝Lt GU/%*''vUUq>}OxeUU)9)V'U얔>PČ~ǽoK~;C)vf4͙rz]()6<jaaC l͸ U ʙX+=`mVZCI:J_VIu+"NP ӱߪh2mCb$*^Kzg,55)!.b()PRbo$C9Y BRcMjlJEƢzi(~[xSNp*B\+^ʴ¦S(-,acEv`1i#V\8bDQȷ{1l4TEY]PDʘ/ʠXVc04h/Zm_!x\zdvJ*4URT$~[R-K%SR']e-ZVb 𗷔nITFZJXGЍ\Y7vtĈV*Ē:h(VAcw^olԂAIq"5 .+7꺳;J}qE#q{ZUK?HXs~Xv_{pHڣ}:j"}^~SyUF]uc g9}UT1\Q&p/ 7Xm}-Wv\=$<kRu㋠:`Wf:eW!tߺI$gDj!6>̻o\YADI޽s'torq6Ń+ペ)z+xHqQuxrxcG GVh9EJCJ0x!1S^s  K,i|U};ιauVvļ硳\ǻIqEXEذ>Z@IS#ŽA| d{K3Cm 6gq:mu4`d +}XGt{2ܭ"0TyD0gפyyu{?,2:raKatBC *H2Rq |H:G4ޥKo> 8pJLuؿHdI&ӉL;D8o Fs] "{bdց~Z>p19 n)E  |ZqMU=D!/ĥ>쐋`DUsJ&pE6s_:|ہLg$p:`3N>E<8fk &0+ !eôT_EPͶihKI zSȖl]m5DSLV6eYng.[8yJ#T/<^$h@3+ϧĜ9*i'Q*= z_Ŕ.?t9TuJc136$ (HaAc># fIܡ7»Ȕ]LS?Z^tCŒH0} PGfF;G*dc`@OGtx,D7NJ/_ $~L+endstream endobj 218 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 y@QtЪjbLPB:t8K结r/#=>)ul"-~H0X TYA6ٝCsY{%hy&5MY b'dS (9K7SiZL!`@Sjendstream endobj 219 0 obj << /Filter /FlateDecode /Length 4348 >> stream x\Yo$~#@Zv`'0 *OA0:V+GR˚SEb[#ˇ3\6Yb~X//bt{?+=fqz/~< mZ\u|_W}L ~wpnZpm%˴qJt>ZwImj%S| KFO7v2[Iuh212\Ns'¨3r-t?R*?PGRr+aʺBQHD),ފ &Md/=Bo$6d0g&#H|( 22?!{(c'fŬd9a#:_o "vByHkkp:Q#HAn,e3@ NMZID3^DZ;YśS9)usR:+{ lh3~Bm9vǥA1Ќ0_^̇qoP1y[Jy'igv<^N=ON@Tc[6'U!UNG/[ڤv#DsZG yHa3mq@0XHA3T>*ӄ BP٘o.ӜbJK/fګ{* l?Ԍrp1#2pW=Jխ0_IH+ݗXl3( e=bd#FV `Ul. ¼38d;ppv1Bh PVh&dIRA%Ma;TjZN<%1HYZBlKmU%ǞBUPr9us2,{“J%βg\9QЩ쀒جTg{fQ Et;1iV;l!x*k]e:R@ (o@E-*.&I JVPxSl7&v8NVA1_5` nSrت*He-^s }=#T1іȔYKm9̼ɦ6S -i eF#~EBiJWA7.,) &pE#ݛ0{~t$ =ʛB2t#?[#a. FuقV9D|Jq$F&LHia9(7=7Sc E^+' :{&[n EPG)ZE&z] sE&hR2M Jy~9Lyn*@ݔѬ Nb 4pەԞũ)6bm_&3PCrbmؗ/ɸ6F\x^]ȁb3ڂoD f5UW%Qq@,GiRB".KfB8>)0761 ag=U3!X ! x4yWTثz:nwU0/ͲIhud>㗲~%ԥ5&OG;Zȋ+hE !UjӳU%Jkp` ֩#J\թ5V cDrf--HWč/Mp  lN4%D^֥!n|jA%y=KnPu&%ΆmArAIS30G/V4cӦĥRπKG VL!w+;e$L`nM7kV~n:.\W @$~z)F۴AR4gs3-] I3Un/RD#z+mI~X4xL؆U~Yj+q[Bz3"dB~_.ÆOCѮuBI;撅SP w ⷶVOKzgK-b>Ty'II-àiu!iZU ҐC:,ß]4=o5߭6g9'?*áy.i0:kl^2> stream x<]sqy#X~lv2R,S"%Jɥʯwwtb҃C ৳iTg+_ܼWb:z酢_.n^o4%vERhGcYpaLΞ߼x=fc6!~Ơ7vǐ JoK\ᒙtgx=%_}PuM[}^{bu&8'e9hf~LK?{qè' ƗM4J*f A1tN!(-< j#.Ltfz5rF#Šp p]]5[k8i}5nb`8AnŸ=I됆LinEFi1PC>F9Q"M^+IVvxMt5@J)(d2^s.PB\$. 5>$pO VeyG(蠹*2\?4q9mDSVvP1$-*3ˡ 09yڬHD{,@@#@ ѫ$Տ^%YН0&jP5 &i!* &m܀#( "[~0_zE\82G2-;Ё`DQuIPr<) ;{+]/W,"kg*a7wY{%:U9}aK?$.KBLYTg[eF2rjBSc\e)x=zmq [=Wb\5En],NKH;E.@{eTVY=}Φ:] &dQ Q)Hw&&   8 <}ҪTy!:@mvjf~  ۾`\]qFz2 1`ʒ1/ /M`jh ,r}yhc{oC{|oC{ۣi=noi e+t=؅ٯlp왁'ɜWtٻ'Pv>~Xݥ} g=N1r4'en}8W])o=& _6_dVCT+V ~S|҇+rR\oݤ}h?E; gfvqsXb=FV" uDM~g6h K-k*ymBR=w9'HS|v1y2KX\r*LJ&:$E>)cw^T3"nkH Ee4E7t rz "Tťh>*WքfTTkF 2'roKa) K@DF=el]9뫕$y5kcy{0=~D,p#[ Ry o={ZۼnIJ~V48aTj-Yn\ZǗvϭ3g!D@u` 5ۜPnAtO@ާ=!*8h6i"U@`$rᡭUV=2ΌRnٴM|ZT穐fQY'(eעz(:oc g+/@:Zt&`$Lu/z!+ Ka,>UPrL'b"իy\_ 2_ vAwr7,1l$pC ]^ Lq3 U`z7Xw >._|Ÿv@X+7QKҏSKRm\tX |,96'sgEVEhyE`ރGIG^+̹KarS|uOGcD觨.jVٕ/1J.LdJ(#}Wz V5Z6c ənr{+*3SU|KuJX< EJ7UaM;j̝\$S+@W%(5:Y2xEhY8a_b :ldWچ vA4%sM-0fOc!ѐu[!"tr,L N:fvBs{_6Z#f!_+t+Xƭ151)av,%NjmVm[y|v]h x/> ZpxUե)с\[V5$Rl=sBu9dVn/pM3ţ쁊&sw T?ӑmuB<"YHجKeLю1#'F' ]3[\fiwt3V=O2[XzK(16KqgҠ2׈&OXIfxm+ xB x^)f]޾ll]{|b27푍}ݡ?^NZƠto(+6'{BTgXEH1,I"caŠVR`^cG!&}'ɤ0<_`h] eT6:w+)qfZiԾk9WYpPY9,$OV@zc]xuK?|n ;pX[¸.xT>mJz1#hىo C]qr6.h?"<^ejXz\ub~jv4Fpv֕bJ<:+bD!3MO(_1;?[u~m$ |6[{'~ُ`M hh1ـX^0PO'.+~w|4aɊbN1׹ ,G9(97k1XrZLN68QiD] +rc{$s%Ɛ=c+vƗ5# Fp@G"J+-E cq狪'tf>l%}s&nOMϝ7\֮Kz;!Ot-5{xާ\ iXZ,BD89L vCtNބV50?nG~ ,{= `\kT9hjgzHS5ܑ#ݍ,m@JC뾭|Ga?_', Ykx#S]n ~>׷- x Şz,\]{&^Ri0\Ģ J|fV4ZsՆLl;tQs?nj͘ƞUjcIy- v!Lө/\4ӱru= c[1Nܙocd r:ūk4lWxKOίqbgjϞcՔc׎!ۙNy_^}L|$)P8hlCƠz\IFi~S`;~q=--x >,ڭu=X}=(1Ekƥh {vLooS)*8AEZ$jnk@] M;tTSw,m 9[GUaI;ܾ+U 9.1Xo>!]@?w.KLEXIhՅ>5m6}F'ye]6H[|E[/\\XPSaAޕ Kbo|JSA}P;:ScLscV 5o MT$FYt)6jvDךe{1{].&yَ%%we˾9'p]o2endstream endobj 221 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 418 >> stream xcd`ab`dddw 441H3a!G=,Z:nn?$g ~O$Ș__PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@s JKR|SR e G4-s?|3~WQC*1ߣw6wK6665vNk;774tvvH6Lm:wt@;kRn铧L a߽%&L5cĞIӚ774m^ޏ?տWΙ=~ewlUs/i4\Xy87b^uͤendstream endobj 222 0 obj << /Filter /FlateDecode /Length 6573 >> stream x=n]h%2"&.(-YN+8~vZ&#n[[_"}3q~}Ù_:) ,QDwYRx:/њvR]<3|BqKp˳v\*i@a್;^Ee-URhۯ`(zDٽյ;*GXxwǷ _*򋀅vqy;\VKP q1($6j g]CP|;CÔq=Uu AXL[Skh^[@vH}ONԸ v64WZ[PᭅEK:i/Nrg$@&:,xoE R![#TQfNaGs\cϗx>1Ow Kظ8$iORpOT_g+[nZk v$aedpxh4;tu{ܯB. QwY}`9tcsp]'&CU,LQOj2ld*6 l3:{s~2;VЊ]N4xݡ>rEȨ2[QaֶR4; ?hU *QKMTZ>|P@/zx e`-Gu2{!*x}ymlc O./_;|!R۳6([r5&>}~>is'?6Z9.QwYXdCS-ȯ gw~s"/8R_GT[<&9LE)&(q'5|WEѓ bP$c]1JPgs$k4>^չ-<+W}+CIrJjuZD'_i#qX+!ʌn2Zt]HWȝFf<0Ԉf~FUAυ1GCH3 W3B#,:m MX,sBgZN)[+.yz/: S!iN~s pk: Ko5O;#6&ѼrTqm ӊHۓC^s,AOpkfsx㼺"=2kLN3sY&St(y<h 仛6 >~I0wܧO-XC1 sj |eMEx4a$i$.o#UAp["#A21z !N30y9LoR&>0q#mB,xGp916;p$O쫤>]f %\a֥}Y(뇛 %hn4R,̵H^#^VQ@cVHX6'+S|J-ޤ "?IMB.}i!M!wMD`w~x 4c`K\S-Ȉ}_HGMcx4>QWDn8jsULg^P]&<]TNd 3G3;/`~$% 8]p,]v6E*-=U KjA Z\Hp's9[GA& (ͬ&fm%wipraU:򃸭(Ѧ`^kbJC*QKƁ[Xd3~U2ƦHCfU%VH]Һ%BLprbBa̯`4I C(:en]-Ū;ÅЎn]jʓՑ ÷)Me T*E HPd||NQcSv%ē9{m)6Boo_ozr1h>!X d6(}ꗧs`m}d!,#" qa"B ?0l# !p/ U{C+S&.Yb~GOl9n~LDј.JCuly/{FKV—0;sH8 mqb,(,$oݚ@ԡU<.aW 08ḵS]=Sg[faa$GjQ;2tՀWsd[J4g1UK Vi`{I<j_Z82,/r™#lvp&0za8`,R^  4]u?5v:g8c52!bI|bEeuuJ`]imZ%jUA=5F@waͫ[nϧ`c7@Zw`9rǸ| P+ٗ&YM,\s_꠽1s6:-f'Q/I`c6Z6G=/ZAMYeV@zR (s哰ICyE&~Q)u{*>}f(2ze=C4i g2}\b(AnwY]4D- +[e 'xq^)Ԥ"J̟vi|~mc> Y gLܾE%X$bY-αP@4&طa>w`fK "IKt*VOXY4Iځ Q N w р-6P2WfXE*)X-_ݷikVX,N!Gn7yP`D+بnKH~5xtyH L΁`o0Kl 9rőp7dD ' 28w9ئYuV,6xn< 1ޤYlT#@ X\D/ )0 OcrKE˧yiaå B9MچտV}d{+Fp`~$!LEHRMڶ1p(ߤ,EqwV^= [c=6UYae]ԡ5֎6+QS.\% Yk0Y6FG۸C0iF!gU[vACPBtIRmzHܽUNUQ}Pr!;]"T"/u_1yG\B06h!ecG1jYF}/zh c/s ĮPٲg1r-Rp`bJo#LO/ThY*>MC6|U #|WN󎕩eA鬃ӡw?xM=;q>q"y|lӥD=LH=өIS,WFDE*6,2pٮR9v3C9r`}! `mw&T?Wlɏ[}[rZ'RMD%<҂<6ū49 ՞ׂ9Ugj\фs,_Ŋ7^(>[k ˬNC@}>M Z’"dQRyf* SXῚy)A #3lYY)FvUnMmS;Ǎyp:`4+ͤӪs{qGFSF7NP~L5RI=A>qzr§lhl>'mpv宐G<^J~az>mwA_۰sdSaIpL+\nwM V =`2>i{_Do|rT=Jqҡb])uWE<+<pkp?vBC?uCZ9L=OIPIuS2q[gG; ֈ\Kx*gF*|pu:_] -%hM0 gӳߝ '%[w\GI=:w]w‘R9wK mIXRgqe.I3:K-uI?< Chm4|#U7!v1.@'Ӥǎ7j?UQ#2 u(gK̠M$ L hG̹DSFވ~OV( zqx!]}4ӢL_ (J8n;w&ɥT?8mɑ'T'>Jz *qI!:_>E'mM3Rqd4Ala%Q@>\SP' Q’:%}>4RwLȊM0O7YiS}3"]huT I6=ׄӟ13l6̒Ŭ?TܺPu#ߦ` Jf\ڨEԆXmT wMǾU7.&k'bAseWeA'ؖORG&!^% 1_&@H,gZ&F\qT801m)1դ;O陫Om{Nv = }rk(48ˀ]u)dwqp_~VkK2elhћ;>s~½}8VDrq1^O6q\x252cB &ܧ-iu8}4k`ťka ^SkGfP` [Tq=iX4?)_}LfrGeBޓIne;YJm^KաBs=#ݩu^@xڍz"w[>&[g30;3g\b8MMpNK`8l(_~"F9vR&GO"F64cu"f۵/VLX*On;KFl*!Z {RPMu̯F7ZQ49A Je!Cwڔ{ o 'z f,֑!Ft^㇒1.6?Mi4gLn`77avqp+zΡ㦢dh]u ><…ӸVь4P8v:julkl=s"Pm%mBotendstream endobj 223 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 @ ]ZUm?eB:gׁm_Xց$i, x> stream xM1hQKR֘j%AZ(i"T{RD,Sᒼ^M.\X 4矤lC*8Z@vE R\"}/ tq}F_b\qo=zZnp ̺J#u4\5Z.ՔA$$&ɝ`P&2TO',*Ff乖HS#OgS?5ef@,4]}01I̴"_$ye TPr4pia-[6NZٜlC<}Z }@n"cew]|/ mb;x q"j@;źpZ#mش!s!Y៙Ql\}F|e,yjĤX*VuKaHL9v l{3dVZ T%(,XY3qCWW8l_{jX85s+7y5[sz_ħendstream endobj 225 0 obj << /Filter /FlateDecode /Length 9512 >> stream x}[dGr¿^6إ_Ʈ%^XL-\=\3]ÞrE9'NG@S'3_Dn~_Uw?^?C9󲮯n٧?]z.Nu} EPfYanjfqUƴw}_DqPJ#1?{qٷW#{ 4>bhiqwrϻ$_}y#9Dy&R,1j= z(Fݳ+2_RtBA}#ד(<$VǍn*zN)F:6K@InŘ)V-o# w-VMA&: CMP ,#uYNMMܭКiM")MDd H'HD҅FO:N9VBJKH^"O4DбncZmq7#;C'];~\6Pԓo,$R)MC&Lo Qa6p PYS+DɈlVD+1 ]U7A< ?&~)&m+H워*D&qi$ڗQ~@hQOeBڑb(lr !M AX nP%FhҠ7)J&hrҲP69,lpXc6|&|%&x;"ŲmꈈomJ[j:MVv4|(%vhu)p/! d1$鴅=%Q^"F,(Kp\7|p_<.2mJ2H&(Ie#GA5Mj*}%ud0nr(,&$5JR &aȚ  Y8I)H;DH~ jbխnG:&r6,ң1y#M; iki5C ,McS6x;v۶eF2KmDѥI{);F[~C[y7Zu<8ӈ}.B6s)6ES+EM8]z|ñel%`=8}yEvYi>*DO ﮾~f&9&iCK>Tf"6KLQ 0wjVv1juKU$ @.rH>)wp7 K_})/mBP:/3b_ܼЪРmV%aU&i%I Y&%IՠV$n5(մ^/ C@y]'eR͋+B.Ĥq%b{L +YCLʮ&JH̓Gm'͌6}S$ɽ߽t5y|4X74FSx4-7?=nOv5ME_Faqq`?d%Y}ULP+t.fZ^n#.WhyL^1vfUPH @'AϘ^ǰyY읷IPX![%aZ% 'gX<4)U\kE|YcPk xJkP7t_k-b3v;{v E4)87jqK77`P2 H$ḧ-'k؁b:PB%K5E8B.22Rip(vZEh|Y{kXmo G Yd|4h(cƓHMС-m1!'t' W.YԆ`; ^f'8 RdZ7I"xSk@!P{ 嬗{C9XVHi\+,"",4lAsHgqń=rks08"y7!U`NbU.( X Ҕ2{(~쓦NC'D"( le4YTu}223qBȑ~e{y͎ 5M5%VPb{y4O|eۆ@_^cNEl㰋>O9uћb{H+y&#A0&pNO(rH49 } 1`ۋGj^ 9 " z3/L95\d qB+y>@ ;O:Nxƹ,uQF-vN[BDj\G^swA ވ:tK?I!ԙ`:ƹRlHW\ 󌊹W/k <$sG^G+NQzBGu%QH"hR GnZ5&q$Tx_laQllxOn &.#75GvbܛXh.Q5I8Vb#9Xdo}T^J"64 Ve}=ysPe;.p,g.K]p0T8s8lbeGb:E1;kkr\TuQ_*J f5,ױEǰ9ʼZ2Slo#BF f$aOETخ^Z$@ l>k#c4({X{+lRFƘ,kGfSa,șPp> D)@^dQMY`N Ne1 }/;{q;hfpbOl/|;iֿ~b7b }9oߠ7=7~q?ۇ8-Q&OHQCoc=7jէwv7c^S+%΅-DRp|yR#~rФ{zRcc>'6u 6eIB{4 ^>_Bjfl-`bgvzǏ/_\p2fIk|<'2ū$ MLGjV^qn!"/ޠ<9ø(e:]#e-5i|vrx||X>o?=Eͬi>r+#ѪƬNJSѷE˝MID|4}Տ&Zt7fl'p6tW>ZQczB>g;E.ߟ~/>8 fJ%CtVuGZGȏEnMM#ta7iwá3$V.zYbG΋wII_E|=c`j'V?\ߠ`xs^\$tXEP{M3AGʂOLh"LrʸL= /O R?˛hhi/QECJg_8BnO_,vT\H?hpҬNA+o)G=áo1Rh4y#ҥz&9OCib2Tzr[2ϵ\݃]mK~5@\r((%.|?_4!ԬJ,ԜׄJH\ 5 B3b2V5cꮻVe)Q":ԅNz.2-PlVE}n/E=xw`ǃ/֯lNqMO%dX}ee. (m]eJ&q+T~W ! BS~s7; ˕{ȹy!U[i!8F0"( }ʋJ rѦŞ`{`ŏ]ۙ^ueKt2CBF)Z\1z6c)T@`n}~}h򈁜QnQF_Q&GQlDg dfHcG&Ĕ܄XoEtk}`9Č=ariN:sGi9wgr_r6Ruqa_&Z0iOT*t&ˬU%jŜm kƝ(E,z .֗[x=Wtd87ۼXˆo=ˣ'9NN HKOfR+hg>^{}Zy;>c>v7*ξ0R[e\:>Fѹc+3fq =BRUCϱC~v[ VÖ̈́,hqՂNϪx EzMe<$"rVxE :?ϸ`k%J9e5iL۝m|,&DTlI%;RY K[,K X0`xM ͹yx3%R9f&vƽ$I'yzJRJV"_g)&>9c^]UOJνWpwgoe8sHDkmH S<$$P~,&j `6Q~A4Y<^%p΀26vUQ\.#xn"65}PX,T. "ES}\zcrP̊(q^|,gלQCj ?i\!!YUGDϰwz2 uP@EQ7S.1*{8yW"{'ءZ ?Odž8R5ҵϤpԘ<:X:W]K:6[]^u8KTiCW ǙG[1OS8Z6D6b.)1e#4ǚ VYQI#Gcd`BH9YաjfY^uY+T9榀HzSBi󐛱0 "dHQYRv7K?3IimN6VE=";R\iXqtB~*.]} '`lpzxS靥. ]/ Ԫʴfuxurn~ow x)c$*"v~V06'S49ת4/ MG)FSm*ڇ*?&w!قϋйv3!aL^^ieKSEyMR&A1x?瓏;??"!9b̈́u-,RVt?=JR!CN&M+C {[1&湁RgS: īg*;wP?d"#ŸQ/ t^<-?Rp"tb=)@b<5gf>P { qʝF܀ܫ&>cq<a-p:˹1b_q.E:RpNfڞc~4x d'8uu˂a,E#J{phF-B^@+Qr<3IC!3sIUϫ2RȏiY s'JKN)n.lY@>5\kӣLU>uIdenE|Cj⪭ȘŊQ-W:]7sdG)ΤUm2DiY=O{7m`6 anTnxi0_~NNj+~x~pn)l}MRVRGeu9g@EuEA^yv۝ѕ~ki7">ꨛEUB{t3ؤw$re8uÍCGkC4ۊ7(ЂJUT] m?R9^kNCZisc{`^ʪ􋓪Ly:UR8R{e5g;nLVp+G=3x%!XIoE &fWӥ*k)J/xvx\@%-."x񔣭xI>$fzn9*?YY.}ѳ*Gƈ;3޽G q> stream x]O10 @E'B 8QC_Ct;,ֳ ":ր#MEY' ݕ> stream xViTTWeQ^Q"UP"DEfEe4")xP;vb QA8$ "aH1KCM;z_wϷVZV7D Y )qłH3I#FX9vh,W2ro2P@ JF/34HNE{,B7,ؚ)w_$ߜ+gBFJRnAR))3kc EQ}G6t LYٱ9sCS֦*l98:-^"w ʜ Q!T(eAޣQTZOm6RT8AEPT$EyS>"ʗZM9R~@RӨQP<52D eCpȦ&-J=$=iפiUql=W4$䰤6}R'&y˺gC&'Mvr~)S3xϠ . HL.2vCܥ kgsPۍ8)~AΨ-+ WDÌRaPjW1>]ujQjAq,'-2zD*3?c|2` L;p6 CD\ PT:^+r\ІBDkհG-Co>nVnt',h{L‰3Yҝ'?9i%HSC`.x@뫞M7\N|<*Mn^hX\wPj8v:S*8UYx,lϴ^MV@٠T|` ЅE6z9 Ш%^QX13a._{*{KK$w b3;v`2n ɥ>=9+._C,>!t!/->uC)Rj }ƨm J~{5[j6@ #""8 rj{ H^T[QWut`dm9ncr>i օɎy`C\VɟXi1w_,=W|պWa./b]^Zxsۨ /&ELJp=><¤bq<']3!tوX8浓/}sUy֯wn?AOѽتثE/٤'"Cu?^ZRsa. [.g/v0R'dW6d###C1vuVQu"#r4ԖJGɣ-gK.ȸs;g]Hg)^]z=QsSd<v"#=M.mĖ^Ӑ'=` .p^;^)^wT3b_3`U՗E>rtkkaSH/_msv*6!B&@$ ~WIOo<Sy%x8†n (wdsy۶>AV>ͿB͸/XbH.`c}=@Sʉ#@^Q _ܨ`*ԔTvh^3W`wIrgm`x֨9V3wwu)7Y8w݊Y2VM Yj8⊙%BI=KG}͔CG qc(endstream endobj 228 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 632 >> stream x%Kq﹙ (o߈BtFjTbFֱnݜsŷKwNy\*Kd"BR q&W{>Pg r&Su |1K.P!wVUFEҨs3_jɓg XoȺBs,(C%MSL2D6&Y]KK}>_ I{JXfQ1y<FY=a ISgIY)X 1v? X@ 60F?{ľD'D@%bo^4>&_F'GG)BH|_kTzhw) u桎I@xKhlXH)Be $$Z> stream x]I\q#Uôld3$p@М$f_/H: Uג{eNN~wgjw{3??Ovh9dYw MY]=?kw0i!v:|~Pͻ+z9Ggs}PxMF+hSd7!k[%WMls>4k{mWJKa_w7JCA{Xܨ?<|zGf~up*.@ ] 8Q`3aݨ6:{H0Fyhx/?dvܧQ'B:A:b)ʔ4D2hڒ}%Xc)Fi %. o]V!bɭwm*yQ?c7 Ń~䙍p_9Tqx-~xݗY_f .i;RÀ\B>F~3& >-r<ڿ̺ [X4ㆊZgERف+ ȫԅ6d~kHI+4]> yX$i)Z]{  yhBRm}"1v6a'0U#>e} "tŠyrڂ}1lj׏ai{CagSXZ6 qƗwŽWipΞ`LiT/sVC+/qs"7y"܄c4m;wOD#TLa!}mߧuWco|{c!cCX:XJEK9Mp{GiIyx5o\^7R(;ݦlu޿4ms}>Bdžه48SYqnt"D["bxסT) [ { =sf+TSx< Q 8pApķ/P@hjCC(2^{t6IHGq.}D:e+I}kϰJcCTS/*FIV.QJk%jo=D@uT3W̔dId=`Cݥؕ_#uCOE*4E |$ 4j WP5I++('kMR$[7.1Z>5!Pa*</U0,-#<8|%g!n3#%5QgDjߕhrf5dt|CQ 5ٰ aSM B9̹]mT4"_>p8!pz 68xȔ=]}E$~ѓQw |!Q sk-q /QeBĮ {t~Nt"cjp'D՚脙\5ɌlT,G ~#sdd]5.Jv4otM_e4\[Iy~c Kx~|KéC/6W^K_d98]VXo$15*7VH,m"`K2xnˬSPՆ:j!"P حvv.h 6 ,_F9Z5ssii|+5A2E_aD`˖o@-dץ٩[xChlX|=B.JCGmŰ>FZ  {34-dW ΚB`-{"| β\,{z(50zPvl*H[*)#] ayzO]"Z M *wA)@7f[8iȶϖ?2]@ahn'{$R*O;"*}֭w̰Њf?ayݴ:9PybڮC^\,ni$t8&spO^9B#Gl{2\t*hkD o{DD}Eg?JDafӋR`vS h !?𧊊i>U$K+= o0]ʎⅶT#R3 u|4:дj}_DEf vx078>Cq+{9rKeeD-Jഝ7mDۏW89L"^QCCF S`lB'P^|1C"H(b Z6o6Yר"r_}ʔNJSmFh!)56=k=]2+Nyw db( ^24AQtv>֣T5M(el;! (J ]҅\f!דɑ=iۥyM00+ޔ( 5S;~=03b#_IǑ$]cڃulIԱkƔE麠fs2~_Ocw#G& <ľU!̲sE$؆YR89CVXEP{./K"(-+H/8šSƲ;Yϐ#G3{4Gf0r) ?u7j^t֩4+5S; ncG65Meો_r]Y0kH亢5o'Ghym!K澬I`&IۅM=pMz96$mv(Fa'X!,A|e#Z!#n{ 9ҦwnMJB;88?/VA.f7|pZ)!N> G:ywg5in? )MBF/(dgkulgdNHN~!Ksœ@݌Riy kOB/ ȁ+O9W24`F eےf1ѧ#S?ĹP\(X"{2x$Rѵ) 4f9H-F[/ek3-O>pPHLƋ05լi} ^:^n˄jL0;$Cx} Ka{ԨIDcE`;NJX2%ח+w=ҙ\!4q,GJtSd#qg) E+-]5b17J"%RIez!%jpcΣXd.v5؀.Nq5t\i5HO/'{3 Px`;EWN%Ar҆]zaᙤö/ۺH9x=bѴ:/u?CSZwj_9+JM"N8,er^۶1p-rꏕIofmwѕy̺ )Q|cK*!7C SҖmVjI=$f]Oլuǃ)PN_(S/{`-r*>DŽ< (F D]rr>H"M8lXI xcL %9g'Ki8sUJ1f,jjQh8@y(Srj{f:" s"Eh2xl9<]k^ĥ IS[*%r_$z&LEoHupu/Qqtjb8‡偳S}"(ĠKj瑓cQ\hつTO;&朩5tvd?UՏr&k]&䂓ݱG9M3ԋDŽC8GcRFø{[""Y?ɄU1E?p2a?spM1U3zQڳ rJDg/O;M-FMTM){"QV,˙!yU}%.fMi~g|5Ђt)bUoF 0 y>L>v6"1ӭDdʂUTCfk6bF(Bd^6<iմn h(1b; DŒⴢoSo)k# ?:8P;HDnXBSy҆ᐎck*jY)5Y)TTIc<Jax:{Y * 3r/$]I;L Y|rD$_3"Sov*^J|v0Cٸ}d (; qfbk8N )%XpbƇoG= ؔ>U o.oyZ9"*~vR՗{ti];|y[VI/J=q-B4z9Ư$/# H`! o^Z-X8Fɮ?7C(73J,%7};L,v:s Pɘѽ\,[I3gHuqHQBD6u~1ȝ}DC(Uu Q}Z8m侩Vq“:q}1ځN쬨$ %WJrdy2jH31LsX8ܻ[wHBw7P%AN]5Jz!5.i6ڗ'osj跟C?H\endstream endobj 230 0 obj << /Filter /FlateDecode /Length 296 >> stream x]n0 }AC(6Hp4m{Ҫ~ oI%>2,KzspPU ݐ'yv[;}L@W?z?mjmhQ}/_+ǎs\#*p+p'4NƻxVL8(h#Ɛ$C !H.I&IP ӠNZOц7#LdR!̖endstream endobj 231 0 obj << /Filter /FlateDecode /Length1 10300 /Length 6533 >> stream xZy|Tսϒ%3dl$$$!$!!AH`BEiQQJT* `nEG)-MKj-Gjd!9ro93 HaZS~O/O󻻼: @/]|ѲdP-]0Y7|}Y3@ؐ|ٹ;va1gmS2, 'a,j_֑H~mwthX#5^|/'A,L>xob~KzoJ=? 䈔xU%G`;v!sa+#KpCb $x8 Nf8jfw= $zy&,dB|C9κn=ScE`:ι{^NLNB54`8A[NAr$< O>ҟLt'' {]Єi'%L|#Y&xߏ$RKn%]dLE~f-k"!n#pE>l(I`RItczz1‘24U1ʦnoSߡLO+1w0}VN$q,q&X 7 X;2|NhETzvyIrC@D>"_P,TEmRҋO1,>~H'Z>L5L[wFwq0G99`(1)"S0M%B%Neg=:az>2{[ͭ,~20JOaÐLI [PϐvEZ@DCV^M PNݨ`37=:jRv2fGE eb ӟz.nZ&AKS XڼQ-ʈ~୵ux[mDe^8"&¸U6|I#jMm@mhׂm،k. E`^Di-QMKkֻ>}YJ><3J;z60&5yqZjmKsM1!&nVjj[*%m.469"Z{MK\=b[]7VzWlܟlJw=|OjH+' Q|y?2[&e; BpqQ uDhOU6:k̵-Sڪ[p|[n.u~o'"ږT }) zHW*-#-gwJMa XxE}Qo 6 'wR  Y#1qз\IXņlR\oN\'銷;aAۉ7vt#M͈#-!eΓ/ KR3,g qPA$ܦ<9SFjZP ''Qp--8pS|ZlK\<f#Q )Zz{5/z+X#ՆH!h4]=~S![-#PjT JDnKe˾!oQ7pD+$Gs U_pd8cۈp7A>us <8IDSn7#܀U5P+m&D#ݯt̄YЌڒ6 s 朜6!;Q?Lbļ!j7#>F%+A&FTg)UWbOLjo{_(*Ӱ<,`h vr=i$dw_zɅCr<1yNc ~s܋<'0Mv Ťovz6ȶ>Fw`džN7~zȳ,ųP%Fc̈SZ/z1`==ٓ]O[I](DQ$q'ʶ 1rW>kK>MBu 3k|N$ԂR>F~W᎑P=(p#/b#s@0Ke:B'S\;l0:J*zSDPk-U*}y]Ϳ+ڮ)sc#4w H$-C_aꜜI+v/_Pۢu㕥g{`T/͛);5%^(uwkF:j#׬nhיZlּtJZZEkI]T}Gj':Et|YM g7m&FvHN?T<{͇} x `t1:1`0psga]PX郘+d>.L⠬sv50¤W-VCq< ȓMz:oi-əzyʀSk;j UU9j1$(R#5mZ.TfQVc_W/}l׬i$/H@"?F(=3YkXP K n2櫺ۖՁwa4,"]NĬ9z:mcł܊tG|?F,ѱ7.m+}`Q~*TZ ҭPht8q׽.TݧSjj`ʈH,YxgxxS"B,X( "›Я䐜윜{[E#KT>=Z-zOucl ğ>K5ǿ79x[CM㉞_?>sXl*G)I zs$u~WM^b?-83p:+Sr(-+\˥2Ҏt[N÷daJ2|@Հ C8DPXѢC@J!eU®tqJȠ${dE t<En3@o2hf;O7 Eo}F??V{L$ٯϒT_?Ž7&ޖBT;ԩjW^XDǗ v Nȡ¡TEQvY̰b7ⷺ=|VQU%_Y2]1ΐk6Xf='qᑻR]8xzRo Z.ÚU:Ҝ Zҝ>xM0m M$bԴDC93tn9?Y-f @S^bɈґFY1-΢e H)w=wNk@[-g4;wŽ fIs/"K\[ޜM^_uqWMUsH?y#(`w]&=HxtJe # 2S/^LY\DfpJ gAĨH(!AaЛ(?3 g6Y-+o;OߺkFQj }D=5)x?eݪK'v{JY-z7|;R4R3^3KdҺu ݼQI*6l Bzã :|+3ys_ݗR(1ҲDP;%)$3ܚAmj/hZV=zIP2PgV=wަm.~FHD?y~3C2 >@qA&FDž';=4ɬ1hͦ:bB2Iu>C~Aq!yzɯ:?c/S,xsxۢ vEpvkZwu3|nv|qRфߚ**+u*CV~Y%,ytFIp@3S/EVXyTfH4~X,R4I%ٙlk9[V /Hf7XC8}領1r Ԡ(06x6!xTYݳ%~f7M_:~Z:bC#~T;;KNc\pVILnN馉TnI J;4}j ZGCi6ߢ)[O@]=VQ*-,ӵb5AfSIqɏULˮjmVCQS_Y@?~|/x p824AhZw;wwwq"miN+3Н2\mWJmYB@ .{~0Xq; 7I#3'n篡d9AP%bH.Z`B ce4oV+BJC`[mx;W}WV\eQʉd #,. ~Y]Z)u_>P?:ʟkyjp:\mς?RcK#.J m.(|CjW5UN Tikdq={xamx VU3UTj@pJ|n;sQLC&IwpofHp..\Lqflb`@:*ZZ֫')lz}-Lͬ|㍩nÎ;2GWelzrԥ[@[V4驗$Tцb84us]ASW n̉C$eh҄GĀBIp!,.[\ɛ@| KR|#LV|),p_z/"E2&T1H>5lv:ÊcX6kOU/~ݏ0i]0k͵edOwO]4~j.nt>o5`gwhqZXyRCb*`,V(t4B`֘+cܲqK~2p ^O)Z1Yۈ%R޽0-\={vvMeF+{Q?$e=?=[ùQ1Y0 &nM/%piJ}TIHr8HHbw(Q*W.I2Z2G? #m)gGJOΞD: tt ^RFQ=ԇL,eMv#pgۄ_*2]&6YpH^lw>BRi0̖R; ,R) N@ \}a7 ,nTt HQf$%^?µՏ5 ݳq{`= s\940w@#ne݅јא3k$s4_`HYsuGoV~$SL>q% K!5^Wendstream endobj 232 0 obj << /Filter /FlateDecode /Length 358 >> stream x]1n@E{7bmHC(Jr^G.0"ϟHGz^x->Ʃ_|[R.{U]c>H53o)WuO{S:2w)/6C,hG=!Q!nwQ!ST1G**!X}T=qSG%Vbb㸉 qCB> A^B\;r 4 hQ!#!}>Ann|$- Q!ôƕnvhc2272ژ̍6&#s#wf x~j??,yt[~Rs>U2/Mendstream endobj 233 0 obj << /Filter /FlateDecode /Length1 12636 /Length 8331 >> stream xzy|Ygd}23L&d#!!! Ȣ M1 oTHdܵRC hoqj+dwgB_?`9 E+]s,,XvnY2& ,v\2.lk`1Za#F 50fFM_6Ph(h֢%mS }opALla8/pA_?9,0C73al|8LB/#iFXXx$olx @,'r,G0?V% (/;q['Ͱ">z5$^H\㘫~CT8]/?s>1P=O32Gzs3b&⻂색NLY[a<8RCn#dL#>>YCF[D0?hvT8AcpJڠ5%<'#8'(GDi;D79 )zOun'JZ=5ڎ]58¡͑GTQ9}\+&RW]6_3}VtjیuX5 ͙' gf=V)7}jSXW,mJfUQꯝU$TJkf)vç2!=#yG9h+ḓN:GaKkhj]a8 <]_nL/AJ=+~%!#Mg͕f\Ue 1Z8f\7iƊd猉b\B7HT[asjq~,`EsO-\+U?S뙋ںM܄3Fٶa8N4+Ռ#a<Џs27E;Hu3qMqث`RLW̳\4da(9DhJ|.G$crw+"1@Dcs:d̽>/,a:Y GŠ.Hmp p@%q •ߏpjo@j#2U&G5GiCW#<-#<߄pA!|4(!Sf [8p5O r E?Cj} R5GF܉@@Yo ҅G|c5NS_]׶}=`6h=^ z+jHїˇb(AjVsa45}aL&hA(*1cξ d')rzŮ `L$XuugڝᒻypPDv6aS&8 Q,?}܃-1r,en n6WU- BQ@ (EբRE!F~S插P=("#/`%{+Y c?Jp鼺 *v}sǾc.b}|νzgDDa) fŮ8J&Xdڻ`5&>xl_cM['PYYO&@0PZbӞ5pӲR(vG~(|aG'H2?D2=H1@ID-`Bzر$mFʻIJ}p6`҈%όz*\+Q@~hZ4R%/%h[qqq6?i?C:J pgZw}414 3iP84 8orLA<=$A-3tλy7jj2tO~}Y^EEN|}YZ0F-B QƂWx <^H#nb-&T=y$ 7Q[2|v~vw/|cI9QjV-*[/?8m|,-L_][yPk#.Ĥ561eL }@;*0#\4CqhXY3W'Qjg+i}Иfdaي|Ԉtwf~ԋL{ۯi:b &^`@Y*}:dpQ" aD\?ȆܰpYb6q0YJrlPUį"a !Nl4c)fgmH{/H8@xHFQ!kI&,ݼh\ZQJgXHlJ+K/{]nz=Ŭ|:?_Fʔ&x_)Or"YDE= i)k2QV0B!CҪ]4*?TN z`#][**VUNΰpS#~NplkB+W*$@p$P(W2d 5IIi/=F<a(e#'!-2^É^M$y^ Eh _:RR2@4Kom[pFD;¤^e7s:i@KY17l>vdkSrwn09yM3oY XsN5uu:5_ٚG:~zVi()rd4X\ST*cP{am@gs{V{\QO.&te$zVWycKiH8t&IPuF*#`e$Aco*,Igo݇Np'0>G} kW|_|s.O|Ĝae#۬+3Z02wم`a Rݥ ZlNt%+AyH*yC&&e4-RlXBYFeN @#^dYq/`vÔ"hz%+::E}qom3O?ڥo"E;!L \4R8T3J3Y \AI]6!V4jݽ[ %zV͉h1@vW2*_,(/j3+ٹ|n51g+z7Hn~3CoFlDr3:.qqBȲc]nThSMƈ:bCv2F"sœv+8~3N9oFv+./lurB`T)ՂNLu9{0#,m@wgˀdc8V5hZW+@\ I )݋UF*Ed_52deg݋,nXH:YiDR=m2I@JK˟sl}|Ƃ njĭnQ<~g;R2|CxS6O(`y?ik;Q,[`H.)^iCCO Y>UPej읳r2PW\ީT l7}?U2,NjgfjTJ_<[3/g>C^qC.PX/+fnGkwpga*"22lJKaɄgWk)#A-/*W&q@/uߞ)}'=ǗiOS2ڀ/-L;F: uߕ AGZV;\9K$).ޛ i!,13xgŢk9~Sm KD8Bj9qcNMjo˅w`IL5)$xϭvlU4WUS01R#Zd;;EѐB \`R+SBJ,L!0m#AkYɒ5JD> J FГη7R4?M=Vzы-{M GH@I)|,]AR<|T؊=Rr ^ArV‡ͺt;N\?dpWdV3%Db(`~27[%31SM:| ]EEdh^`9~Q>.5,ãקDwOA!Pqa0p*%k`\>qeVZ;>I,",:|o>&>l݇F^r:~{ H^Z؅"6 k6۫kmotar?x?; @\ j-KjP MRQ}~))k{]W /p2ԅe=$YF Q8lI.h/]r > +e( kⰞȐŝ9϶ۘum1cxeFߴ(qwoGy hR.P)8ğ)o8ZvnuHaw5dpVDLړ%j=s/9_ .u]H OM~VRUŋN'ch'?)&n>f -6Ww؏52*]zML4jw(&# Z9$A'`9QH4qh@8J>h6=bAɖ-ϝ#i_L$ui^{9+He4#M5표. =NwT^r54hg(SmZו N8{ ƙ1"6M ?`%݌k.kTd?SWvkc/rCۗM/]۷:8:k=w2gVk|v˭i 1݈2# HʌbYNꔢ@$lzC $n<R:ĈnP$ei Mu&lޜ__SxU|4mD!/DKJHVWyyN=]_Q)/gv:[5UOU=e,Qɿ6 :aMʿPNKzD`QhR:&jJsK_Y9e) pI6N#R,)=kPQC Z5s__Ȳ]&O=$E#G|bNU A1Tc~p{PZOC/[1݃0t X嘖bNLcXEN*lt-~J b4˝ ZD5K%r_rPA@Rendstream endobj 234 0 obj << /Filter /FlateDecode /Length 4821 >> stream xkoqamoiSAڦ9EqlٵS%Swf]fOc!4~zOѰ:;ב?N.V3}_8_7֮ }rvu|qz臤cl Zmw }P۽^o}HVX7)p :㴉՝Wx؇aګn Qah ?·+|R6>s*5ٮS{[M{֡׃YO:OOtӘrʺ`,ppcewFpE>Q QQaP#.#@SVaDrN!vi<|-#yCh)O' ۻ|aqe/gax' [v7Y{pWOdWȹau/vGHV*3HARO?v_v{/bH!8 Lfi(S@"|H q.p7xWٞ (   PBAzҺ^{_DS˦߮m\'6xEt8 o$8 q RLuF<ɌJIy@^QwޣLJU 7ml{4%CuFo: pMòTq,o1uXaƠiyKQHq̠*eJ A{0-) p4A]C&>]?ߧWezgq}3G,fBz^,O>ڒ_ۙPSU2\$F$4<₳:S9.op'º7cPx ~髛߈l=P=p뵈+qviix:my*^:|&09GFj2< \_:W'w!N%[݉7d^Qp>%s:4C3f$:0 #QAu>0 33mA'ۛmE{]/pƝP*%6ba)XU7lD,{3\E;]L{AG @3``wܹϛyG/Q':v)r_eG13RA/ثXO˼/3X*Q1! 'I܄i7 o^ϋ Čmfeu&Hۄ^&p5h-Mp89KX۸{2|F(~J\J ٕ@7I|9Pģ=äWmLj4] ~RbJl~:5{NO#)R`[Yc D6.']Q>MxRMpwmY(p=jT=مߔ}pZ@BCsvȷ#=ͲXmc`\rś) Bf,'01 V b͗<4mq ᐃ&Kp9tLԺvO˳C\Rp A 73KL<bށbdXz71Sf6xT3W~)  1iE ʨmLN .gL7 ft Y&< ;Fun=< h0t$@#|U7vx觻 lqS 3L`0Q(9״RT)K6jD:@jfT3Fn,^c-@0c} aHĈhDrb HDȔ4L$&r蕲&/ C ۔AF~XvځR;%'ST\3z,ͨsW!w8c~p!N }g0cz@tJx D='f)'3\j3ő$!AaH5ױ8.6#ʢ@ \/E+n%II\ #'=ױķ3 _uxsN}*xx+;8ab c欝3}Ԏ`蛔4d' KLvsZL_2܀l1S{)!xM܈ފ^;?߉~#"9U3y|=pЯ(]6|%+E,@HmT2 ҡ Pܯ&<ˁAl4Y(&ڇd{h0fc|͙BfLUpq]гQ|[R$zMh U-3kK5)y\>f*bjQ:~,LJ702Z3-7um!Հrs,K Fh˰mü5skD%k#:KE(L38Z=i>+f3悧s]C ~e`+&siՏ\ )3fNÖ _o|J45*d&IMqN,M#Yi@0'n\&ue w%Sy<(}׸`fJ1$d] cH*}N`* )Pۮ.>oDQ[`1 ڑ, 2\.IXrCA)lˊwuԉ!)ؚZ5iGEJ;9kv +nhA< %2*ۅ^R6횱?Ul A8 ݳ_Fj1nfL0vn &L8~m؟e=f W$X$SM ˌ0]=Q&S Dc)Z7"|>rqq S SI{bB9 щe^ŏMzH.įv⾷nO48n{@>!Ƣwn Sk0r֝O$Ҥ'F߹1*d8uUmԚ, Q~.Jt'x?Ƀzɯ;&> WN?9EBDnA9;2"F'"®eǩM"GVs8rOX>V[L疍=:J/Ǣ׉v#B{@~lws ;!_qZ`z,79 D107Q cj#N/?:>+VDê*h|RJQ0 <eMڃҰ֭aOPN~p-L/uynog Re ryiMxDe&v^1rSn4ג>Ԗpx))eMxrr|S޳f/[wܐ =_Klb; x;ID\ >~giʥaRTdY8"FOGp~!nq`>bQ ܳq•guQ6'Oc; \endstream endobj 235 0 obj << /Filter /FlateDecode /Length 5156 >> stream x\[o\Gr~g d'},,n^ ÈQZCZV~}ҧL QO|U]G6j?n釸9ه3M?nWo.@;asԛCYMqm.o϶:_0{Å)|s5y/ n>p'G5ZY70E9z}Br7n\=y__8gkbu4&"&N ^!M&D=?L$$dTdN| UmHsJF.t9,LpwL'@a[c$V);3-_xcȶoxl 7~1fZ M:XB;\x̋4dDj-+[_r(wF6O{hoc,lw{|}yYp'í ]g Oo톣k~<'{']5}V剴ڄ=xm,|b82μrϘP CaXe^C*#~Ii6꛶@?"/n灠rOi 0_G$Qe+ʈ :M$6󒦌H@P$IL)#hl#A5;Z{;) eQm#pmԷDw1m8 Hk  ^T Ց x8XhfC\?QQV0Xf L(ʐ8>K2`*MQFDwMJ:` @f:W%=2žL4>"ޛ/8E],! ܿ$O@$\Q_af!u18G.(PzA9Ӝ&yB)4DH!9m90B)*h $.r,iIKg`8jPfi6r3FyEwgF)4`.x @HdeN,F_y&w8gG'OU*ug:Tj1.uZE8֔„1hKJmÓX'ISL\HCY?TN+ smć%>|&vp&]wY0}9oG fDԻ˪Xy;mjM8 tw I) 1xl(=&9*M.  `Z f]VS۟);LGtO/J_X<{>kCz@6s^-jawȯ~?=SmyRZE;@\0¿ns
    a$ZC_`Rpl?Ov{@zZn<tXz@ 3+ ]˰+@3^ݹOic*+8o1s#;E1I⤵T/1>ˀ1n {+%0ܯ)5ϦS☽#;r,?&( .ㅧ)%9$єS 6swe`ZX+{ x "lR^-klVwVsm#I C+tz&PN*̊uؚӺs"08 "$-p|dbfx Bȿ `T)G[@KYm=B'{0+yq# ˉ(p(:\I}>F4*TO2t*xí$PT, VKKx/$R[X)á$W=S0SpeM*"XCZp+:rq @( QIׅqoBj&sfK7w>cZpC@Ps4[MF4g fsi:o;/,5ɧR:$^1t vaGG~Bq@[5Qe.i!Jxs2A_&4x|Vwvx}IgXxQrl@)gNp|ܷg]Fҟ9PU!Ǖuf蔚OZ_^P #ei ͅo&-xHpT!FA@`]j"{7/e:e ad0&|St2”5ys 1B['IYh:9HY7v*V84C.z& P$#` Ps%9,Wc+ݔ`Zo^ /vc\Izzqy([fr2TU'sVO#&zoAIkŗMSd8eP<#&KRcG$CZ4٨2o%O TJz$^Kw|u"ѡrˀ i鵑㤵ï!7'CRIJ_X/@ S"׃$X4(Q (q,Ckq)k6,NHvߘI]r^U}X-wCn~wYnl ?XDI 't /׉L .@Ga)O.47(6NTWob'eUQ=wř>!cp} 7)oDS+07^z~AV-tboDڍתMPȵ2nYT_t=uһ* {#=} XrPr;wUYR-UG21Ju,}:Wuz|kZ F]{uJ:rX^PJ¬=/Vy̚ߴ{ f҆GTk$3=l `:?JtN̬3X,+- |BKbK_Sq+QX3:$[-QYendstream endobj 236 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 y@TuKVUc"D7ҡY:ߝ|x%I cikDfǢU`ķBW^@$JʪC -A#E3i^?&[W(,C\ HJ$pLg9>Sgendstream endobj 237 0 obj << /Filter /FlateDecode /Length 6403 >> stream x]o7!b|=d},جWdK%,YfMH6X_=}w8p\ uR"\J6Ğl֫3apfD-1Oxԫ,n%ܛ E{Z+&'y/ L֯I`' wp+SAwB"3ٌ/~t-RT҃zqf4ܠa*گNQiaĮNNf&j 3 ӿf8m g6$N9zX-&NJ⤰Z`D Hgt7t0V9_NX}W f$Rx8iN7 &lЬ@ ɖz 7z8C0ߡ4tB@LctBVK1 Zp AK+# һY_BXx-$UDNKLhapHh{Q vd\%\1fFG>v>$ԙM0%q7 p3h+٪n/Ҫ$X+~! 6mڽ/v"l%*yC:'ڗDU<}#F$)=OR 4u%k $lFȨd u?lE:6re ۸qVf @h- AQYe@u\ή 5353%a@*Y $YJ(6K-e226h*%uGv9c8_iX)9&L[7 NGТ !$shх3m>nHH K eAK:.i,[K/2ryƩނY\v$ Ch + bOK1{LYRhN۷FNta|ho]޸Cs4S= !'7tek @{a4Y :YQnH1xm#7%%C\(۸h<P  .pÙYۼ/=jo< l9i!ͥmiR"o)]b޷@&' Of Z&@6;qh8L3zF趆(rdaE g$zKexsx9B[0Ci,x0~'0f _"3g:JU/n U+{b 8Et`4h]+׌ڑ;(erpe$ 7J2ꝶ.QeeD! /y8\'H KpR\<[:-RR*GO3& K̠fraOAK`֓Bg8a2BPG\eI\9ql -p:8:+®ʻX$~)} ^"$\3NXB؉=#agt :FM]!Q23 0~vUJtBs?a#Yz(ʫ@pyMH--Djw'A@%5bEDXZa.( s>aw_3O2,")5#,0F2c1֏L  OvP^=h'(Wq'j9輔ZHxHRU<9k#-*07HI4H v)l# y) 3) | ǽp`UyE|sרa1kk:VnGӧ ]U>#Ѥ:V66筭 1SEϕg#9EV،$w Nq+"ƷM2ɟy[s$CP]ζ yy?_ϛ&nEo~ʟG0kqLHfV%U8+;wZ%$;\ aV4'J3唘7q^j7Hg;%_SQ[BpZ#ƚj*Vt сbᚤX 'Pw35 {@̰!v<)8[CԻ=|co#+(p*:N/d![`e~d)qW3QjQ՜%Fb4Zb Drvҕhҕ1[gS 'Zv)Y 'DM4)u)ѦUpX OD0bʊR‘gEy氝7ig@*@ DdNp_`m%FiI<%XY)KflpPpHSn|ƻ֩ X]+'ؒP !]OV O^1j'ʪ4v٤_B@`Z5b MBc@!]xǫG.SMrǣߟ^ X\ct(uH PJmnI:F$ *H9a!(L3aJC X(zZ,,^dG p!ݜ2Uu^CB KVd.6] ju͝RU r,7K^} i ?.?J܂|NҊQq/)=o De.8 ꢡxЌÜ0b 7P>DMYT *+TπsT1D"8TRT4uY˘fdGϑQE;r0q2|D< m0j_5G}ӄ NaP?xmpFul dԡf6o̟,Xa^*;s5`_ET׽nL1I)‰1"ċ4<^ r)SXaJZB(rven5Z2>%p1銻y"U,(޳ؚ"GmIL=ŋu% i"b3n_M*k誄Kp 35 gEaᲑڕr1RŒ:QRIqZ̻{䎞MEҪ!r|iOJH=#bda&fUX(fdysBx|)1v/pW6LW U;.hХ$;fk:jSf[aXD5šΪh弱\' kV'n6 #oSe*Y@ۏNXưj_\A4Ki̶Űq*QS:>QR`-La՗XyՆjE?JR>deJ`=Jb+^ib2 nU/=ajBѦV/ f :x ?G`KnvCNm"Q򎉆ec"2a(*:ً':2SDu~bW%j##dmۡ`Җfm]u$W =K[نrP6B5zKղL5)(@`䦝xOI=smDBVvAɩ/Ne~!8Cp&e.!e{8 *ǚ;Z nUNISQe~C%ujl eY&8o)/:԰UV޶S ;b|ay`X6ǃ]vOz{77mșnb!j2hKgjq5 Y^8&b\wƝ/+^iM>iK^/xUk[@aQ&)qB*vʹI8@"0bLVŴ2~EB+OY͕,jD q*츯R!9avg0amp[jH4ƌ/mh 2] dj"2>Ɉ!Zؕ݊&y̋qvB:z. ,T[7[P{G[E "^S/C…z(Vp(9ʕ0r#@E\~`lfM}J`l }/hfY+ OM}s^UdiPeR?0م]/.q4o'cW<$AFK%߁`Jו/FCGFw&}}ǠY谓Xi*,ϟdOO%}U2lmk7wѦGy鏑̧*m O4F bٓ D"oT9I3tSi2DX? /ː_N&Azx^4>36VWFB| 6P.>%k$R87'P[)_8|s i3xף~q"+S,F#rXl;,UQdf{v7CdtRxc+wۃe&ٻI2@N,5³#ثoqۦsx]L*89BUgʩ?AŻ/#UKב8iˢŒiKY?@vEw괥ේF~v"4+Z7Ǻopޜןڦ~J>DOD{z;⡂2|| CSV=h ga \N\4+⹷VڻLxbi;{qM2YYBAZ^)b ;eFfŊ]Bē1rWaȀHsy&0xάh&|Y?aA^ntw#~jѝHkMdyk:RY\-J6j75]l{xDJlvk_k:#_1x>B OPff=vT2csP']8-4ܛ+3L^4?PپHOO,I=.^uL5g鸉6 2iƺR;*Y> stream x31W0P02U06P06W05WH1230!˥d^U`hhS027i`5N\ %E\@\@e\N @K4X.}7}gg7 7F[A(㜟SW bg颠Lljf-U/endstream endobj 239 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O1 y@*U"tЪjbL@ }!:g=(NGZ`: SeeM'l2;S.e!ridgdTNqPr48n1Kii XGg9BSmendstream endobj 240 0 obj << /Filter /FlateDecode /Length 4115 >> stream x\oAZߚ4i6s $EdՉ-ɍw.{w prf!:t~_^~(/a4Eb ϔ]Q,K uJW@ f6Fors(;!kURhISX"^(0W_vׂ`U~݅GxkhL6[%5Zl-ZkNKm@`d׿fσ6crVJᆝ]Cm~6y.zV:=;lqre<ͫ|\W } 0C^vF ͪfKl[7F30шhM p{dthԩ;Hΰ )@q Tz)l9Cp4(DˊH Gx|G=U3zۻj]0Ϥ_[``A<ͬL9њBr:p:T3ah_d}p4WKR`}VE,· Qʨ5C+thX`9"^) `{5Lm5\\?DB9imzBG,a$'WyQt$]osku5$4%sISzmfZAG)lsHS3{R{Nja+BfwkFz\XrqHȃ`7luIC^s)yF/1^H8Ch B9J3('E֮3 a 3`T8Qa86%dT!c줕%j4Ē%=4JyTF_rA#IH;‘//ӹ;a}f nϊG]$ؕ͜PUp0FƘ u?Fڎzֻ82.t aZ^U!/:"hdZ^,L㏒˟HPk>6 [B O2~cIqUy]rNlU?v>ұ3y`l[+ 9A}U̔EaJ qy\f=6;X*1;i^-n8q("7&؈ďl-)L՘V?yY缧|vo*֩W#^r u_hk?*KD%2Aq mHNYFד^FJ#WyffCԐ%Tc%TD든#$͝>=I j& vLT{ ֢;~~MQů@R8,>2Ttwp0hA_Z/P<3+ Uep Gſ%/5H3_w67I sOj6dg1#x={dF͹WE~"DAX3G+Y̔h?u5mS8%y|&LBs5) Olej|2'I{y+m`n5F{ a:_^y|x)<<̶LGhӒ ؈#$R29JLawKfZP\_XSP4;D`{'!!í nzFvzWʇY*+{ 6c/iQk xp-:fJړS ~9`/KD7VȢӪ)ҺY^di;$D?Gh(/ rO:RSnZmD1ŝeh{0V=G|LvX=wNOKpoIV<ƇadCY! > Ht/kiIWOXRnJ !W±'܂\'w\fbB!-/#OzIj.AtMMVT,]\x'ij<=~4v-{לdVJf ؝b__@]l' xv~S_}"i+FbP_&yo@T4})}{~qD)PKއ>ߎƱuC|ל>j Xm$E'|ml& @]N{]owEpS 'qJoH=\5L } (I)!Bp-.z.V%IBG@ *}rȲRXw os,R)Y^}> ?{endstream endobj 241 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 y@BvX%C1C2 tpw'y?\gG:ikD&X+@[L 7ޟ@fOq:UkZBMĺ1R :EV,C\ H.I.` >l`_@Siendstream endobj 242 0 obj << /Filter /FlateDecode /Length 6495 >> stream x]s$Er_7\}8ธ]iJ!ygfUWevW ㋰VuVUV~2kD꿟_?xryD\>?=> X|*OʗD'ΝDwٻ'lmv*ۼgclLns=Uunz{j6u vs#|$x*{7&\uz xtNlBIJE%e7!k-o`b7 ]<}}?s^oMeWMvNeA7h/;ɩ*St|MYOz%7-~ʛ}G?bk.|vd'2]?Ÿv[pszhNG UZ0 ԛqv!k/iHNk`2X{o6{bS(#Gbn`?^sSÓBv]{sc~FZ/q}&iFxfp|r*жP#nvMtAߓ*Ԙfњᐍ_؍ǟp[مl09bDnd./i7!Z 9. hP3:A}⦨fNaV\g ;..a5aT!a/ z= сL\S7eu)s$ Esvf󺩠͌.̌hiW>$9ل5لY;4wIG;ׅJ'}Hb5؄[9i eޗYS2FIX8Y#t䀯(᮹_#c[ FoHKb[qvk,մ3\,GbvkQ p WMߔ} |?0cwW LHt2iUd-{eWE<4i?D`,<2&3}]WARtYx@51;].LRd:䋲f56"s7ՒPz pɖb&'3+1W<{0bmLpWYMuHx8eLVA*2} eFDmO#l#̠E-yj‰)c[݈3^G-)c~M"ʕ41G)룝 c;0&d E fFȵ.5Y+yx"ف_(3ELoY6}KʀW 0Tzx|ЄU7Q,dj SQ@%i dOrCn"O6fUyb?L!xxu*Tl>EvxLyΩquh`)VIAeLP){Y]AJPYdAЈ+:+qGU;4&YwV)8`Nc$zi}OE)&Y@,Ff GbNͷcg ̔s~w %bE7Lˎq\y;!ސI@TeA20E֝9Āڔe>BtmOyx 縀GHflœK,b24~hD0()s\bQ}0ȩo2K.59ry!uuqq8>&c|U=*Ft2( a9 MpOY) *鮀 a~4:q;U h&GTgD| 5)caQ§r˶մXH `<"&LU|v)iBoG/ţ\y贪уO ]zt`8/;%!l7G!M8P n=zμ2dϚ*0;.ǰdI}%z5@Qc>`*i g-q NNJKQ/MO<9(qqgAWPIAZ@^`% Ɋt~sn(?Il,RV"`_T|+Pܥ*MH )W7NP3E^qrB)=S' 4 uޥ͇T/224(imff֝FgTX=GZa%L&kx[ LTj4"]n*Uxs+B]%XfcբJo@g^ aO8u'~o+vL m^_u"* )pJ>CP(.T^C$w ޸EFu1`ǷKɰ:ˍ}JˈÈ:P(;NN*_fy||ǃ 6|*X@ј-Gc74-L38y85Ǖ ~ >db8$ f9m_@@1 țwNվ"6e-&{>qR'f8gYlf񘉗Ap8FR!R{T (`3"fۡɐ:!k@Su;Qd,:ڮ_Y73£1gٽsՠ7PC[6N2zjIdl$k@nZ.7 u,a׋zhotjJog(K|w ?NwY=7KL|]GK+J[fe>%L"Y8`Wx_E"%n! 쿛6"ǚ_2"(K h;*f5!ZPOFF4AZxTZH/w>uEy/_6u>%3բoQJakE٨-m4c0SkĠqdlMSlSWuֆ9v.zL73=5K oN-UYHeqm8ZYinxL*ˎQFTD#c5:\yzj^Xn~1yS*-Q|9elOK<^hCYcO$9"xk2o)sڹ|\ݡO[~NZ@5W3X)H/܍:yցIj:3[.FL "nl_G11FwV$-DT Wz˖ |,uU+Ut&559Tn{^Yϯ%ԱIǴ--qrLgZ؝5+eViE,z/lXN)tX%AQgۑ~&̮ hʫ(R8[``SY%F֌CH+$0(*ԯ\rm]6 1 dM#zst!| &Vqg ]R_PoX!]> B \ΎX jibtã&2(֐_~dj }a& VI΅A8G\2Ih f- a} 9=6 Iv2.5M=D5\zڇՄ.=>wN/oQE#|Wnͪ +T*К4se4NAGq5Do)بvnkiVD]Xdf)\nZDT[fWXo#,g=yن/.Lw5 ,n3AxoFΥX3G3 Ui)Ey !#RP-ojQ-!PۖrH,;;1k5 O[:.vxM:gci.3Z.![\ubsYEb(8yU/Cx-^Ž1v&_,P⾃I+; ERT拐uvFSB}r܊,r?dQ>i]Ӳ cwN/AHW]ND7; dVoGSF3ˮ¥'Zȍ'6ECW[ ][^_XD" >) Q/9y{ʌ]qx^γ4KG@ꃛ-İB.%d{DR!a`>]j B+M$1Ab[b}8r 6"˭bFP۲LhUG}D,GWz-9ej!%M<'7Mi'YVѕBAY{2sF;U7HV Qbz,κ"?x5_m|6Ώgbh;s64EA}wUǫဟox8ԝ)Z}@"'?' 2O˨BV~yjlRf?H/gNVnޮ40U8(.u+]qlzZlF<ƚW]ؼ9ou`?b+e5vq,>@8~Ya1xw3l``2ѧR6//x}0Wí-M%= RܡS8&w+1sBys58P/p#ZذͻNXsx+L"TXV oz p?J7,SEQFOA]_/YBK!(>CYĞԬG~av4r}OkQ)@Ur]83h늲/]vx~’8,XIvQYqLdR˺Ԇ~!ڌ~@j*yANȁ_2 0Uۅ];= ;VZ#@ DemҮX(fmN,Rڶ7=`ь|:_#wF_ړQ?e~ )}1dFƈx9M5fِ÷OST_ J꒒Sɟ@GƟ7C3endstream endobj 243 0 obj << /Filter /FlateDecode /Length 1479 >> stream xZmOG~BTH ri☨bM`4UݻwOfwyfuKiRUA1iд%V?Az LQMRdM(;% !}nk=έWh8̐WCjJqsFr2jRQ h=C8dTֻ޺к73LJҶr8ox}˾'&ȸɩ7DzA[X #V&-,DBje%*YˡIC!Z0^w8ss cQJƭΩ1i&'ۖζO֒ߣx(aۭLq#M撎*2+p,~?#ab7FUf@Fn'Z1j-p)tXr`h4NW]g%c,>y/$pvՇQFq07;BxyoX $/`.03ſ…i7=w(w˜r(N8=j4"V`8B9|:s#6)L1 >.P .|ZA Xs d H!:l6@cMc#wliG7#Tmbiv)k.`O|^GݣF($Oi"ݹo `1Ciu{̡Wݯ]ǐ=+ fS #Jnw<^8fPĀSҁi&2!ll1kƳ[| MQ>ja$gO"~7vsh,Ǫg {-t*dPeW͸U#\xQl5AÛu 6O~3ӂ\AN!nQ.Y=fӣ;Kx&&x}kƏ3 l P\<^uJٲ4%s!GO(QneyS ͌)^¢F+:…JyT:Wr5K/aHǭՊaL I>;Lq8-B ջI*0~L)^xQ>jLq墎aȕzP(KfI봆]:X(*o`EӇY4T(?kH?ejg ZvȬ{je YQvNp M kpfjXU`Yޮڍ5|X ɨ Pwn骤&` R%^/ΎnJAQ~p[/zI q9 LpWTBa1=)Wq7ya"xu^5{W6LArQ_0,J`om9u|%0s!+;@t{+<6mT_DGqPJMPJc nU!|0p/cyK1Ziendstream endobj 244 0 obj << /Filter /FlateDecode /Length 1121 >> stream xWMo7#~3iP4pƕ{1zP$Yvli+! 79x%=C{hy7]l3ۮw o͇vشp +޴&RնZMsxϽp+v: -t)EoaqFeء¡k*,K'v;>+\6cH yiq"%d?ƃ܇͈y'L1k>Fc7h=xp)! i&Tv[[d1t[c2a3V'fæ  pv7bPRm-&o&JAυh'R?  \.Ceܾ` *%P֢*d*$}̾`?;{HwlXs8fH ;et"ǀ! Q(O7apDZl^GAihWyLkg!H(藀6$&{q6Ķ0!mj8bxq~8Q2--".$t_sη)4(W<͟3XLt ɋo4PDظCZ c~=~ Ľ v"F{_ I&ezּm0Ȯ_ cU%cl;8sWolWy6m6w!7\e귯z &_P&ps %m,4g>4Y05cu 12'U)C}V 0Lͨt1Xʅ)wkx1_1*^{*~iAH(5JpG/eMri bSdLJFXix')qz,鏐 ȴ`sf F&N/Du~[C\\QDPutbKQ(xS+$Dǂ宪nPb6%S 9}r+ aX eW4^f=~Ѭy>>m|oBWPݰ}I0z9hDUW*3P&_3 ?D/]UG]u5'g; ԿmS`endstream endobj 245 0 obj << /Type /XRef /Length 280 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 246 /ID [<913a635c63143ef60083d094be8558f4>] >> stream x풻JQEyH3$1<t vVBB" ,e b`c#٫~D2b9{8Yc8vbsN=z$M-{E,<;qfDL%tQ \F-z+_~dUD.㬠a^oWW"]G)̻Xyfo7bƎ 蛋痎?T#7..<~GDkv<l^S~&v};O|6y endstream endobj startxref 214849 %%EOF RProtoBuf/inst/doc/RProtoBuf-paper.Rnw0000644000175000017500000000044213617276206017501 0ustar nileshnilesh\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{RProtoBuf-paper} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignetteDepends{RProtoBuf} %\VignetteEncoding{UTF-8} \begin{document} \includepdf[pages=-, fitpaper=true]{pdf/RProtoBuf-paper.pdf} \end{document} RProtoBuf/inst/doc/RProtoBuf-intro.pdf0000644000175000017500000051331514156423631017533 0ustar nileshnilesh%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3462 /Filter /FlateDecode /N 79 /First 661 >> stream x[ms6~߮ xLl'vqlq(m*DI= "\n ,0LL0_L2xL145db懾< 0b!,"|Y(cTL"`dB{xWL#&F}͔?fJhɨ3,aHC!RE(E"V,P,> FtbP>Z*l,XE czJi*BLMi*F yk3}/ !>,22!(aڠe? <@FFLr r"p Cl!eБzr2@]KPiIWiMw0i(JcEeAP2@Y EB$ H'PhiŐP!ecy#`/=tw,/ 2DO4(K_?Nh3O7 bj^.'|ݰOMi2l?t|>Dx꟞ϟ]l~Hzֵ8f0A#vpp,E?/'9 f(7Æ P D؉ [&loXYJ& mlbkh[me-m| NH|mTT  = GO8znX~:zP,]G'y2g'(f_]H"L5&~[,e/yN_2i6OX声ш#ChKiOx˵.MT(OPBesؒZQ>r-9-0!ڸuI>_o6~/[>5&bN݀alBX^7f5)T|?]`ğgvNHw̫bPLz ۶gsAߚ.u'kL<P}}R"pBJmh N[n<14@53`li>[x3ѧ&jݥvH%~Ƅ '_w@mir*a\]x%=k7usWDi=A[Xlf&-msԪT駝sD1qмN>ZCa_BsIkM-IWz#`uʥ )rVa]rGWmoNϞg(oߠgYZ~(ukPF$I9BD[۷64k-SEr?}jzBuQ䌶ow\&0w 1[[e8ܑ5u'9Noƴɲ*6„T()jH ӾB8k^ˣˊr?xu bYhS e3DԄI*{n;v4 rc:Ϸ0дV:yeU"#81Qt'POZ\-vҾ gQNGKA`],jއA͚m֡}Mj4~)Z{+0^1Y`Q+|t[鬵Ӊew{D/!ylyV9}xYUeGemR߿| ca[s'=9MT(XJ&aRK*6Q% =Nf3,:?$E'OZF~],*ei|ykjY`vP +.sgաÓwn^Z -mI`;9_.e;r4/ Ǜk7kd]{22~SN'c67a6 3_r d/=p3|N~g>r d zHXZD lƶMA`aBC/5uTӾzsͻz||悑 3(t)[q8hL:2-4kϞbhAVxۮCb.k~U)pY)rk_ 6=Pեl\¦֌Sj zE>"|]1mɘx]4̘{_XKF4'3aQ(r[{M8҄.x{tUok]^Q*8躶Xooo7 \݃\=!h!d]Do ӖS-2r/.M.KiqZ@7UY~UtxzKeCTׇOv/u2JM..:Sx-J{5Jڞ~V=M]UW̹P(꣗:O^H[*bM2ݸ%d`[dߚbwEVU~~M[Ťz|+f#j-1EW@L钠ULaJ=)_RLi2BmȈ-yyՋ$L=_3bK_qhQX5-yQX!'bSBOLi_ܨܔdbo޺kB{n2;Om ! Z[Ɩhk/E)endstream endobj 81 0 obj << /Subtype /XML /Type /Metadata /Length 1167 >> stream 2021-12-15T11:36:24-06:00 2021-12-15T11:36:24-06:00 TeX Untitled endstream endobj 82 0 obj << /Type /ObjStm /Length 880 /Filter /FlateDecode /N 78 /First 671 >> stream x՘KOPru DRA*3KvQP/Y'xι3U)Q5bTdĕj!KLI5QKKTR&TSܩ8EpJ_ToXQ5\Pq4A)B(~%tVh+!]Sqaa5Dr֘Va+!q- II"/( p#uQ{ETgEt贴NQG( +bKI/-wwBxؗ%A}lJ> stream x]rܸQ7e vϦr"rʁYZcRyżF AQbKGX:э ~L'Ϗ: Xpk& ezRr@sr5FeNN:DRM-V\LN.~B5:jv䢆kʥ/K#SNFgәfGt&Ů WVQf ZOg\IlrPyoX38KSLZFZ˹heBY  >wAZȪe%QD=]in =ٳaD*_+?N~-)-c<]xY<ޑU{5`N]+@µ <`X &i|/Ї)c^Vbޑ}ąEY(w\)]4(L]e2h5sm" ts "kD" Ի@A5GbGט>L@ٙķ E⪥ U*Z\Ш]N8?fe$])_Awx u CQ]H/t1M+k3T:_W!AU\yV+_&| {UUC,U Q6E^g5< W:hwŦQ>vC$WCA,H붜n9\U$2&Aӊ3oY Ln1X,箼If^oʦY8P8MwmOZnu ‰̠G:z>5.(/+Hy}8i_%6WWEZWA^VrPYhBjcE e}LBbHm\qAkaOq4wF,|A;3\%qIjʰ4~JQ~ѹ8w-Wůy>HgM%mtr,D-yZ&dATz[q].tQ ]ހwWU#/Pr:]p]&t~n(X*ZvҸa@ӛ* {W22$tȢ*)梯7w5K}dqZz<<OhoˬA[C"p{;[BpHrC!ڮRb9#2&cMG>v xK`J:w&SVIBy].y 4sId!{Lj?4=9ɝR/NZbTv%x eUH7NgL-FEfwEV+Hܘ@ FoQefҫ:llQr$f(GFpj'bܳ͢UM覜#0%&Gi+ͣٛ{B;vC߮#/ ls_k79JXIpߛF◃7X2;|jlU jB?5 @ࠌbh|yVIb#OvԛoP#ŻWaܚb50Bil1gJ/R&!0'KƍLj7o6l'bS КcjY?Aowp> stream xPT{OC!}g$0 MBKQ mPX~bKvc-`$"2J6Ɖ6M1e19N[d:{9<Q4M{o۞_]: ShհH d4y63 ^ xyk|a)f`C;s/((6fk"BByo*Ǥd˩rLPr0[^Y/J͔ 2rb¦ĸU P%e[22sPԣT,T"D^6S/RT PZɔUI}Fgѣ׋o&9,a l>y[DO4Cc}'1wUG;Aa,ãI 5)LN~D_aKVk.kNp\n0)QNw_{&{tsD;웵={lXeʔzp1${9*awĹI{iHp9N_kiqq.A4 %l& ˉ4esp-$REbSq+0+nĭ?%z( F\Ƒo Ar"y kЗyD3kxIhe栁QLȨi4ڰ7B "ѥZT3p֊h3RDwr6jlQ1|2Aa`HsľOfT p!o'͑ՒڶÞıeCM`CJScJOR)=G)~7yȊ H9ި?[ {= R[RmVf?E&\9GZDǨ`YZֺ:SMaY*%W%4:pJZnDrL0!q+?6{/4]Rהs<2i'0ȒۚBB]yO_ݗ c|1gg"7c(16ͼ٘rK|IAqN^Ho^s=^\zG-b7,L +?7W_sHtiyMUdF ~_9t[Q'Gw+2@F[`B4Y%ɏև5$r& O|4jhmxvpĪTAmHqɱ9OpA)0.Ko\ڞugpA@gwBNVi~eU[y]rK> HR/K8 H^Mvcd!8y;_:fi{kdK`4} ^YA-0x*_ H~[L?!ЇE}g/;55.?* 3'ǟ<-ZVjsj=pINv녣 V3H Xwmդ{ݟI\X`mQO@=0 Y"q[dI":$NC2$Z+<-kq[N}0$[.h~tz{Lŋ~qA|7wـֹ K?|k1x=tE5)-6vGf(꿰endstream endobj 163 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4534 >> stream xWiTGe]P h\WEvQQT@`fdp-\DEP*.Qㆉ㚸6o`|pP]]>[2ʰ%ɺb& UOƈebNb_4zU'K;O;/a021<؇ښi\K~eza6f :tM.NF::: uET d(Z;aR)hB*Z)L7]q%+ʸh/aa*L SCM i*J& B|2LE>R&)caB2.FOƂ*^ UkV#a y2Qk8 Y!+d+?M6>,NE?QZn, f&,AӚ6T$dgRWF]Ul݅x:aB224.ns9O:t=e/v=3<+uc '+Zs _TJ p[8zԸ%K_LG',OW/W2,ufϱ y+_x 9$c`G[{f@?n fׄք>)߲#_YqTFep.~E'};ǂ%ʺnjPi1W m& 6/+3(BVWAʃ5öcORA/7W,cxY1Lo+'Z/OB+m٢Ẅ/hT\ǶS4qϼJ٥MC~i>XB#ÆK6юmfD39i4a ,:v4k [ P@Ig5-Л~vb.Rlj>)!=]?EE'բ́fKj2xpSWg)j3J9gG s{؉G4{|98O1vF o^v*\ 3̑$E^9Ly<nCbCP{4x.pW .|g70LqO;2s~?pHh$&g?8\n(ܟm]X|Aڈ v-@nh&܏=qf~" K $C%+K|עM+MIHRք(iPzX~]yKq:.dё9$}mHvdО{YT(*U|يB.=bQ_X{;!U_5Ɛ܂H`Bj"P ķV5.,wOv?h?J* ^3#F Quw49xćK@$y轨יGׅMަ xv],óWttJJL- ll8Q_KJ?9ܞ#)(X%Q_s"=5IR Ap>Jʡ+s{ph<~"ǣBId-6N*T3jA **4lKcuAK@]>W*n6"'LXlz ,XR5Ԛ(Eg/k &T=Q< (t|܌-zԫH"QD8v}sGT^X>|u+%݃0-S7K2.sm  a-53I,Ra p5-Op_-v}xVG>jF EOD}Cՙkn$ a :twķ1;&iTͲm@og{;T/'^" $i mjs{lF%!. t@˾0_}eS{ԣIv?C1Z:=EVK]T2!. l1u RÏlռt6qwηɠ*}nM:Eo}BOנ5)[{i3Wr"9(&ڔG28AyqWMJIC,y[Ymuش Q3zCOr-Zqs)4Q+Tvtg˶nߓ]T[س*?y7Y&FPG܏Er؇8я~0xGԋ\ȷ+Zrm6^]]GsC՜1s\}UE6Hf=(޾%yWǼU }`#cAlr HW V[s,m@)QhJxK[f&̨3ٻI?fÓ[n#Ma򲳨Y3+s&L\wnu^ *_g=tKCM6hos`+/cI#KH0%Uh؝۟=s硃1 =pϡ㰡{AecjzcCSYUX[AwJ?+8'3Ue 囍T5{w75Jgz PۂeOƃz*o6} zܲn|m %Gv;2`qoS`#q:wrÄoSZO_jo(Hgw%}b&`d(41d=endstream endobj 164 0 obj << /Filter /FlateDecode /Length 623 >> stream x]M@D74d3DQ =b11"OUȢ c^zu;ݺynzږk8^in9ͷMt_N_/zߦ14봽su-]Jq\}z쇊:W: UWRjUA5֬XT]Cԙu ڪP |+*,,,,,,,,,,^Tg+d~BB~BB:LTF*He 2Q D&*#De2T"@d2RLTF*DM;w6llٸacƝm *=ώ];gwظFa2r9l\FN#iq96.# 0_j`D! U(D TU*@ RBTAQ*\l9s`X#+&=0yhCg| )ߤo5M| הo7M&\SI߄k7pM&})ߤo5L? G> stream xXTT־p e f{BR D&HSs0(H"*M@,(b ֨$yɾC玘gzZ` {J%H/v \>M%MK}pHjТϙH##FX˄ X=#-l4m\S# #7Qjk&? oFFŒzYM3dcfUɿo赖_,޺deA˃C,[ش"}efkO[/o{U[V:99tddFig̜upsF=o )jeCͥFSʎKSUxj55r&R$j 5rQbʘZK-L(j)5ZFR˩i9eA͠,5ZAͦVRR*@S)K R_PzKɩ!OS5FI)CJNGP}~5 YNJJI))- ]f3|g83.ר_ߎ~~?Fѵm4eާ7J/@^l,UNɇgQf0d!? ~;[3,08:T6j(6uWZ uDW#GJ4P2v&pf-Sve܄U40d=Ivſ4^ Q / l.y}>T0.)Y4iS͚Oȁ #qh|y[Px9[ݸkR qt;0xO"ɕeŃM HIB@  Яo F#w?_ݴ}ZA$a VsQZ)̒ fAs82s }L{ݙuLl0VV&߳:c _ 's ufŚuvԬE#3;ΑqeeTqٜ|㪼ZMGGS.0&&Y;?_2 ,L$X*r@;##`Cd6#69u*\!5r86;b ]“=焾ǹ]ҧ\ewUT+*=$g,lS~d7Xh?VWCJmH'+{WUsPζw bj{lP!d^g30JS$2v|3MWU0uM ˢelL&]ORCx{\бH ִwgJLX+UJD!d[`V%}łT/d/NCg5%ӕFiI% c cLNE ѫ|!6'`A4FIo^Mt##Z. =įK3m`)۰ Ycd5Oa#74hY8@B-fC(,[:(5@9v4-fJ_LG9y3FԔRY)b ܾvFVAR\)I"9CB~c} v0%O|*YT<PX|qܓmLHi| )k=@'M$+W  4<D(ޟ` ~~ a߆.J(c\# `'nry k% MC $Ԉܸ]hezsx;{Y!fMVTJI1eKT[U& Cöxh\f1|zIwOK*Kj[(BO-n t>JTe3we&f"d~^i`?#.\.H:\RJKN ;B ,e`FiawEYWͮHJz5-~,IĶ—qMZl87oX^sz}A3N'&fv$їba$} j63$JFs{xkL`) )Ti]#'KҀvt^^fs7߽9Z$d]/$ "-$6ZH^u]x\=H\tg=[X- H9[G^Y/| 1Ϥx{Pgč3 CB(Y LR:q0h,x 0W#._jC܍ QJ$D4 $  }4KYh4%kUpK?lnGwH~0nE,9 `kl=b75>>ԅ;Dy5%tDU0+Eh XyE>z@t+-\͞AnU$C}D?V^CYҢ=Bp'0:W+m=$jF&fsgO-ZoSAEZC2ոf8@3QrCT #W^͆X6');)=GUێͳJlt+-G)v? ozȕ0B|K1Irxt'o´t eڙ-+w`e?gD}(hxm[|+,-v̗@%H|EGCMl tDggeW/Hs[t5omEf]Я.RU\WG:U.7 ok|T^U '-yYup5!Q0=.ksåΓ{f;m]8UjI'OBL./32i0ie¢e94%v+8Ä&d PO%-fcGz bRHO`lMlQ/w!?Qlk[{%Dk5ˢ/RVWZwG#S|Jr U/WXq+[;bJUt]MFCݞs_@E٨+ٖix&Q5 /`zW kJYm zplU>'7i. Dp?$DЅtRZ?ߤ}}QO`ȖhE#!EE~| 5Xdیhm ygct}L/aVJwI[~CrĂ\-ȥ~*˫hky'1$e:vBNrP=:qJG ON=b(5?tٲQxTwéPYƤmXat7al3tyqv,^:: so_{PF+RhoI0SFc6OkXLDg G$x-E2c gWG0>O_F 6K3, )L9-.:P`?Kp^\Sw M)F-$⅁|#|O:7,s ҬlQnruu22.>> +m#_$Cuf-fmU=IޕB0!loDϭZ4UD3 Po;=iKGtB1-f?b$Yl\k$oZa }DϔcL̍CSCwKJ@|B\:ֽ9^{+1f\=l)50wk].VzF'GܩC(n]hmڴWYr%ԑF{#<6%0>ׯ|svE ,{ 3Qs.>yqXi`Cq3_Uh )3?R3Yiha?]i o" eu;ȝ@XRXڹ;n7:w pZ㣨 TUW o,qJ|ujFL:?b#T.4pH]Gc/n87P6)w~(\Bmo~?aUɮH*k6xYX<älÓaQ(GXܰd7i퓣 IKȝ? jCG8ښa0GDpx,L9݈,!$ SBlmwendstream endobj 166 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4473 >> stream xW T׶RDDAEe$ "" (4" S8G'c#"2(j $iD;6`V=g}-tP`5UBoЎ~~0'E(yf9#]!);2Ȉ75C? a1RS'Y/bmm{gggUb&>lɈKZ"KN ŌĒfo&):)rOX;u~OYcrbW' Y814)Lf=gT[i;:͘9bd)eNRT5ZDMIT5ZLYRTeE-RT8IEP^-S(ʞP)?ʑrT5ZHR2JzD%S52HJL8jeLL1eJ$K Ql*G0\$0DBӿ1^LY'6gpв Âvrp DwnDQ[/JS nnDa~2##(W!9,S>qxe"K~W ։ oAD|- r6X|/?h ^@5#n 1?wsk#R">hwU%lT]Pe,GnBWWUkƠ:rV7t ˬ;w6[oZZq|ktɬod(&LJ޾L/98%tz4GǠ/7oHm^XPzo&(n!9<{as{?z-k6&ָ' ~ s#{iiIѤCd9x*x+u-W}q2鋡iW r!X*Bl9wgcC<|iRqE`;z) %_)xǪFAȄ  ghU)߇y LxfbSCwõN!ĥqfboO2cn/ArV1xڅ{uaE.>}лY:HJU zUB 8~R3riJ;~/Wjc=_0 _aBD{ YKƱ>7XՆjKjXjok!e~k-(QRxWr Sv`fo#HOؘ;l{h0imn'ۺKɟ-=Fsss7&HRv/a_ЇV*Z.\A l6fiajr4PWx`Xqut +9IáurR$<~qeu7*Nʗ|_y^"6S# XdC'X.zC D1<nrN-N뗵>b-Kn!j7X4%(V LjfO{pR=9~ķՐWeHܗW7Y__Ajc!5k` #3ܙ+kFuOWy䑊:HPO<4Уa 8Im $hрHg "ISDhւ qڍv-m?TGUBD8lmqr=%WHՀpRJu79b; ҹ}J'azHM@sTgUڏ41Y6A[dڀ0tiZM+FFˈNcI'XCǴ?[P [C!ځL:4lB [[>Bp*zpJ-@ɫ#"mض,R=Ɇ?t(Λkb"#N] AX͛7%#=B84zዘ$,܈h#r4W+wsWt_}w}ׯv#2rw&m/,=RXx:v vn wf'}r&Oیxi^cq5]W$n5aq˿XbOsBq,^wØބ+3J⮆<[)늭wIz}}B^ub5³eKӶ$}A`7vs~%VMȖkN! V]w! 4Dgm3`#}dQ޺B$u-}+0}džl\) $/I&L!W5?aͭ c{Rmb)K{>KUd79񧞻?5_IǴ9$;bee_U #ac))*zza2ΛC9q_ŢGc@ >p+.(B"}vlL<{0_zk\%,|M^ "=ڋO!f;{G:} *{fp0l>Pg?ao"p,o>3xՇjC!)jE) ;_#`ߓBLLa{`wDmn" pD0\{ < U8{= b[ gG`,K/  /ú+:GQ n8[endstream endobj 167 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4478 >> stream xWiT׶8(N DA ( hifR8AAEdEg1qC7,K&!7Լ[9u{{;"p%ƮVĆ|BU8+J-?^8`տ˦'PNb8QeF~8GӾ&}c՘=Df멾fxZUDEedaI\Rɬ ^Tkb*G.HR.[br}e*6T) S*epJ'&Tke,\PjFD' 4pI. 4rmB#cB'҆^-S•q}ZijKVVj^Uh2rˠPpNAeHe:TDpN\iI\F0!NPE;cVPu Qy=C5eꁯޞHAee]&,VeR?(D^q޸LǭOM K _)BYf2kl?nEM<(+ʓDyQ)oʚP5RNT )jrS)Wj5rQ;ZMRƔ#eBRbj,Qf8ʜ,)K22$D$ыav {i 15pa n2kᣇO~b }poDʈʑN#7,yfQeΌr܍ҍXo\;y̗&Q_$*1b)0; 3/K g@{1`CU) 7pxx 2\ /BnKzʮ8+RX| .:X<8gfDKޡ.rQ9RDk.PMo^:Z`$%ǁ,N؁ϫNkmi7 ^hZP.QPJ*+iw&ؕMj=^b+qLPɴ `Cw3))hŚfڲ=$?o؊,yr 7,~i%L7`8 l Yl8wrTz K GJLOBI |Q!I^NqTܷa_,"O3X^* d?0B oD0ƓF;y#e$19cއmdPAx_ !"+i ccXt/H摟wA@eL~g)m 6$*KL\ON*6rԧ`pv>W( Q02i(ԝ(kDE2JiԴ؁S>Sw =)#%Z65+ ]'hIP LxC??jK[2J _BWJ6TtZTZ?9+5e߃aؼO&20Sj뿜_qPJ%s}+#~7n-ibw00e@ӸpkM3l,;B˗# {d謚Xlz3Hޔ>d6]"^zF#ڄAEpB<ߺ53Q^eNh1Z \L7cOxrtotJIh![Й禍¶kܚG jQTޗŰZH&_Le߾rdr2*w1ڔ!7sn36BsF bآ&Ϳ" N@tr1o ;Uvo9qg@M Q/E+6 u U{X@s#'p@r^Αxah.%FVK3iG'e+%>?~#s*)2umQRqo-QjVD2{+C-emus-QJ²rVMʘ^"9(J>e&ԩʤ*ejAB zДI*T0`aJaH,>Nniq}|6* *fs;%ށю-8#u?'~HNtu _{9'373W i(o8##SwvK[}%zb,*5HsѲR/T;3el (8{9m2}ۼr}/aٝOvAbd\p^_F~+a O1w2\U{'o")ҥg(V`oWFr~]*䆂nxV!?!X6sXTpZJl=N<[ķ9p?1.43@|F|agzv}L5xDL9vDDAs FvJZ~h'˂Cy1 ۴(p?Z [?[:0X*%a;w4(l!R'`6}^r؝,rItJ )~142'Z{f_tySN\)iUoa>uQ/O?"i\vu0̵ ILP d 0#}gȷrD^Ll}?r x0ۧ_K\zb_ߜ$WPSuetM fD˝^k膋|@:(֮ {e+4ldhI4]uCFo~k`Dfy} fįTތ;Q\Tp:`'Vdض(IvcXV&2$s%}9˙; #{4 Xa.. ɍ`}E,6cvh7$4TD;LK{O4X> stream xXy\ڞLUZkVo7ܵ*$aKžɎ (B¾ܵ^O]k]={;P~w2s<ω!$֩U굑3gL]#~6S'޴!~<1jɢ>smݗo2O10k>Hk5e3f̚:uܗLs_-Sc"e=^? tVwm^oi͓)!Aj-_*:Fbo Pn i=>zk|x@Cl$&f=b Ex[mb;XFL#vˉ'1XI"f b-XO8 Q"!\ž`8KK%gluۍK>J= qHs7ۑKF'7*c^lS;꘧N^ZB/;6.T=#2Pv0azA]g+A'ːCkӳR8JِU>&+jf]D8[e Z}~^֐ʡplȯ!{뮰ü7%Ņ ۙv5ePE^YO;g2R hЗp6ԡcxNҵ |[rJ8ɢpoJ*sq><|}wA.7&G .F}}6eoJ:dU6 9(@Bg8ĈQ3ֺ 셓q\D113~s'J}JQX1b֯WtRG +4m:Z~5KB~8uK~y/=?adfk+ = NFn,rW/K$txed㍨wقs$NwCE ""O]cBI]Vt H۫T?)01h̯#5ZTYJ:cPϋ] ynl{Rծe}pRgY;'F}ƷKx3z$#vQ|XP]vKp,梼_=!iSAi'~b}$ M,nT=1kǧ[R`Izx@veNO I؍{O솱?A"ETjj* %Y>$$1֠lt(̪~YİrO-8_HS'_S QeYiхt~t 3.FATM4Jvlҋ9|LNLo*8Ƭ:eTjJj&++U[ha쀩c&p{.*P뻭;M8(TWCɐY~<=r[ Sd{1k{J4VS +.] dmKNwf'_!r)+^(41m|m&: ,NRyXX2Pa,܆2Ia7M-,_7&u|;Ma.fv }Ahae`uJi 1K8 |W%:ڗ ?Bڠ;*A%p+5vhVY~̌1DwVuv4n$2JWr&RZjz?p Abb\}!ooJ_[Xv$%Z ,ltjrc @ɕ&nqLܚǵ,{YfSM5WET 99,IoxCwoa`(ς+'7hq& PtҲK[/םTj\)gh6(e uc7@<K)I4N~۷x:18%iUzn+|֪YKA! l+ %huST+Y$kJ`^619x_.tPdeX6@'_r+ g2 6If2nAcLiSYuKWgOɬbmWy]7۾}POzPeJɌJacv~VGu=l!+1(] h4ٻZya 7NdP:Yr'٨"e^`]`pqn3YߙR+Oy:f #!z;Y*"V#"D^"M8nTey,}w'Od> ;#_0_@/k*9PWo* 5@,LvCטl8GJOz%//.m\_dʩOٽk- -98ߘ5HLTϒ%D 8r"8R%W )p㍟!G,(V7-Di,vh!q*Y @}QI`5buZ'Çn9Zu}]޻_9h+Ԡ!sXQZV>C8@@P4WW75UW7 ܐjpRfə.]}VP p4S?0WlGǏ^~^csU >X/J a~{L yn45t`p܊ַ.Ӥ/ї`"=``]v.֦rU"%/RLIА+ FIa!1}XEji^)Ryk/;00+լq`Du}p]jlxxR ,r.dS.+9KzS_AgB&..YZw +.ͺR2Ь k .)%}W:LhVmiڝY}!9 s"r;`,8p OnrO=CJ[-9Ad6DQ#Cnb5(hO<엒ƪCGny}z+UZ6Tu bpNƄ A9լ6F&29'*Nz# #+(z1ۋv7l2`|^ zI%ݢ.a( Nyvq,$B)YlP@D<%rEWV %]ٝIEœ"8(4dGmQ;:Ǒ'+sy'Ϙz6QY_Azgendstream endobj 169 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3602 >> stream xuWiTTǶ>ms=Ljw( 8C'edhDPA+ȌD%*CChdo h␨1k}HV^5{ov1Z6aq!nE?u ?M0É4Jz4(KZ xZg$ׂ)@ug"&!6|{X|Ѳe 偻mB{m r]q!QMA򵑑s!Bbwmѡ!qၑsչUfV߽'0(81i{Kx{dEf-,\fPLʉr\)#ʍr<-'eMSBjHm̩͔I6%&SCRz>e@M xI`)H:a EX'|XZ3EL'{Nsfձcύ}6b\8~&DO'J *OURW fx9wN{CO++ExvdJ8}%׉'B-L{JZj&=si<V0IYja8|M @J>o_9M@2`JZ!IfpE%зaHs$\Syë6Ђ 0Vxyb㥰4G*ܣ;iEil,@A{fSmq^*LyԈ: {Om̞݇v!vӾ2^l -3!|U /\SiMjU`t>`FSgGUM$ [-72x{DC;vA$ QU_f/ӛG6/EOb_Jd,ʙRTґG2ᆿNfw u#'?``bLT:/әl6aM ˡT7(O04IBxÕ`y'-f` ˱KLyY7e{6Fy3.o{"v"WQzV'0Upw(Ě:܅ w'XBt/3H4^o3s0%gì$O$:^*k8SA:A,^lϏ<C5o[`ƕ+8*rzx) a>sHQ$| w޳SiApi B>&rΡ 5D><(epwD& gx/F`rNKqUtEc{/b,PL<|0/h~6k4<>>'3p% v-j d7؅#,`5|Ł`Pcˁ;0ebxZy^Q ~-!VƼD2%WϼлTRqauzAs7G Lr}bnDEkGc]^CUل,S5l/Uޢ[e"y!c-3SSrrpT'|f x$|}ijIӕL|'KUxLϲiv{' ݑv}{Yɏ_d,{F7֞ų* fcHq^Iav!*@, zM>x:ZT܁8e}p_-_hnж#6ܳ)OF֮Қ*/`eB:G5teGZ5t^l#n =PCj iqK$Ug桏:ܼ~A^LiFЅ#yD3Q6{tE*¿Ztk5 x؅klg<5ț)ҕC`L-zd8>\KcT%JrWqU#BՎ<|j_ց<+W-Q*XHqP" 8QfxQB;2w||s_X1dgЪ<˞[D'uzxQZx3ehN `JKo*F =HJFhU@R|Ű?qoAH@^ asYaFm!bZNy!%nCSOF%G?Y]qSޱ^}R_z|qM>1owze'|M1~/+SzdJLT:æXw6‚ 1x,Ǖ<{`9+WBtӭQ;{B%#a+GZӞ ̨,HGR >3sSiO|iT8`2 !l  Q(+*T=G_{Id vl)[&(`u('LBg!7W!{XO]&6<\ ${UPN̆9[SJo:V+)*)/H P 4DT`﯀IbЫX\8܆AS0ߏˡ&=iނ!s\:%4?ςO o u/45Ҏp5_( :97H*t2CX|0_V0Y{ x2+_$Npq6^>bw`GEG/i0)6eFʝ?ձKv8qؼ1TU" B#~:[LO44ÑW5"uFI}^&kGL Ht%f7x7쵆7#_q+bX }q'B*9my8|7#x>&4^d!h-koڥb%P @- <"]S6X?,+"#RkGrP L`m`'l ,<9hJOICggzb#3 $. ,߿>^ d&ZzMX+"@LXt,endstream endobj 170 0 obj << /Filter /FlateDecode /Length 2196 >> stream xKo7B>P~%s(Put c#e%zE ʻiSsA`A $gO}wy-ӢjɛiS>د#aLP? k\ ٗҼ?Z h - |xAy1jSyy ֻwA,k /~RI|&K= Ȣ&ɘ"@2FaLkl{c@<Ȁ˄q?DIl_袌T03*GBH.-jYfl9)q@Xq10\K"$q9[(Bi [U>܌WeYK=0p]#:uh: bLܼ @2&VnOGtĖ]BĢȻv`9e^d8ӻ!ʒ#Igb[66amENY0le/dzg_ےY% (vYm*LkCL^O)&ЖTfI UBr oK@4b~opyMfHR& ̵l s#1KbPoJU1 HYl|S/b m3$ ,r̖f߉p,I|y+CtxVE6ˋpcCL^O)Ѧ -d9m4G=Mh&sД[mt숨x68P=Onʱ$&'1Bl)"s&RbZpr1so'HH6$|ʋrx7!!f,\!g: ^֭N %tG$$~`4nvuSsU{v]}1!HK왢-wqc|l:U负$Z'Uæ *GR<+T (PuI<|C\UvӣD6yS#^+:wvϚh&b;WrZfM"C_zNJijpLؾˊI~ml]V٦t$>UUB+;/G@K}uǎ۬NslINs?V{"2/htaKYՕ9ՔO fkiIb+@p1egEl̄mIǂ4o'ZnNʰ#~<՚bۊ}ēN*NH-Ui-;&t$<ƉAŸ͢bdžijF3B_RQq?DIl_*p00m#Դ]TQ$\q0,l;$>[[C%v6_6ϗp`cqOD#Il_:lAb/Eˊ&"n)^wؖkg@@Nnj!3E1acn hΡA~ѓh蹀/BMEbx":nkDXO֣I ψ6)>ɑv!ǀr[diuᮖ6DKl/iǚ6]mm86D$t^,0(-gZ>ѹxH  i-:&t$<ƹ!ŸlWbz&ɈIFj?pޠ-tbu;f=?Lbt<`Xi\g4P h76ẗ/x%!0> :t;g };Q&vV7g="6.Ͻ]=H / T;]0@ ѿ0*4NUK(?Z=Y/+~[M>S@TAͮWx31(ux34m# [bxazKXmf D՚Uz}[&8v5C^LH2T7Cjfs͓-]͊#B ׃$|`5!ia^%endstream endobj 171 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 606 >> stream xeϱOa +M*͍6:4I[Ac6Z ''9<DDNEڀ AgsSN];Q_p L b' bG J!A%[+uIof7=ҵZn v B%S 'rT&$#$ 1[Xd> stream x\mo8ȏcbY|)η"Yl6=rr6Rׇo\ɢvqb n"T;=O~w;|oYHYp>w_L&_yTfWd"* %$jS-.]5l~ȲU՗]ڮsIux!UBSJϩJ 'px3_A+H=QG*HOET&R+6=SmPWTJ%Z@eTksmyR" ͦ7e[ueݬ}vȮ ml9XDzzbOXOuRt\:j Иg]N@kD|2WGyf&Qy4!M6A+!/O,D^hy gZ&ɲ$lGEUݺz} f|?޼ׯxBS$MY!t~Xh,gU1g)LvG֞($5ؤ(߆!_|J'jˋsx%|O3':XVbYd"P+Y'y1<^f~20CMȾbޘkOA Ņ4ܙϻڲRR7koOۮ=2`KŐL$:^1/ðq*g!qIsV]['gCVЗfC#yC]Ma-Ϗwն*gIF"J?)ڳg&YlioպU,,>sR8?xγL&`iJHFGc ْ NcuKP?3J'``=(XuƇW McIJٍc]#3Pap;uBzp! kz01+z9gpJ oRE~`o>,*%*D&y$lEa+J%r>^ڹc0&Xqa(T mOӡ]foeWtTqg}nuPaɺ _ Hvc$BfVxTM=;ac)ivPp%Uṍ8'-m&ݴno(U@QlM,fpvwE (VCFۋj-fE|è؉ #QKC w?z4?2^i**s DWR7 fZ'(58ٙ P;X$ \m:u4D7v;^'2?*ZVcmDȿjV_ez/H&ROc}0}*T=Oz`G|˦vC-~1͝E2Cu֧\B0Tds0WnMW=>2zTG .FXmhXկ:gSE=z.۝տD,a$)oW! CJ;z$::ni V5X  =>}3`ܴ=I)[W");ے%œIZNGd( ,`Nӭ#AMTjUk3>=FsGJ ao!͠'V gوoz -Kڙ058qW B-K'AXwS6nu;L o^E7t*u й g^ \I&2`f{^uy ;]TbW/">m<:mOn`šޙѦ , ́UMwB@$[:2hiרʹm*rH2gHh²+w5'8đX S}.G3W]ՋxtD'TX+KXWFlαC";ޱsmOyR\C,%@nn!1yY `:ȷVrPh@3fjO\Q%ki;sȏ 8rM?apow!~JRccN~Ac.h1v.5*,6JXnNPeLm\NI 00>L}L >s2ؒP+E?]TՓrXZB/(̦|<_ . e`Y"$6vrX<0On[n*#]"Gni"5&<0Ge=L'꘦Spaכ>y;?,(#I耳 ƀb$Ҹ:>X 6o?ExW>m=ZIn5/iK»X Kp6sAW8F]#:#_(r-r5-!FxG>,E3%MjFj %]]h7bbSzCw0'0ӄA}|5\tSGR{a2l͆DL:~cJ {`{  9ǐ bbh٪`hҙZWmo596Ȅ|C3A϶^34+#hB'yQ,ބ_ >@Z Ȝ_pd@ ݴMI'sݺ/}o0[k C y{t_Wa6vTﺩnf/I+,U0494:CM5,,{JYXKgi3~h.bISQaK]]Ά'HYʲ ge#[E<1_|\N25 q@ |2c-!3`ؗ:M8와)*/@3m({|(j@Ԥ8q^S ,/3}9"]hQ迧A.]6{K`FeC,kݧ r83i|Q/0[1S.sr`{`хjԑWnX!6\VFo-ٜCg a9'E 6@;X\BѠNXR(UJrjE뭹=[4=l~rBNB/R^7L:w;ҭ %j~H vďƷؘHEzRH@+߃gIf=(]gbwendstream endobj 173 0 obj << /Filter /FlateDecode /Length 642 >> stream x];n`^ ؗ c7.I.@Q Z.ř)H$| eo<~X>y^mw<>x]} tǷ~?.~k_=n6tj>k/Wwl6xZSP՛`7uCSPSSP'cSP)T0 fu-+7&`D0 FeSPZFg66ud5z V5XM^`5y^t8 t\@'Ёs@t8 t\@'Ёs@t8 t\@'Ёs@t8 t\@t-ԹЀ5 z֐7 XCޠ7` yހ5 z֐7 XCޠ7` yހ5 z֐7 B 0 . ((J"$ S$!1~$$O)B?EHIBb!IH"$ uV\YB%E MJ%4)QRXWjeɕ%p)`XXWieŕ%o[EoZk[%o[EoZk[%o[EoZ\ 'a,}T_/W~5 bendstream endobj 174 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7554 >> stream xYXSWrsU\F:[WE(@QPp@؄O{oTĽphj[kXmm$@k|!ܓs{F qAvOoehv71֖on 47 ʼnӏQK FzHϝ`llW3#}v10l]p$5{;8l/`/3g-fV9:v\i;sSqHx37;s4lw6[mޕ!BmVKׄFMܹvG.1{yS@fm=ݹ,\=IK&[LY:uocIQj2P#5rS&j35rf -55KlʕZI͡ܨUԻ 5ZMͣP)[jeG-R({j1@G̩eEFSc(Kj,5FR,NAeLPz)OMDޤ8JB FPoQ.Q< j9}-=K FiBP*|FK?En'&n8=ux#,6xנQ9CXMk(eloT?o2h5 7MLM>5k`jZdz &\7L\hlY[ު0jWLqR5M80o@_[VXibT^'PEɞxT IQZVbZZg[P5]ӄ;"!,' #Q@`DWv ^[ؘ>O^{%8+S|q#rGIJ5QQ܏*wstl(ٮUHN^dw'%fwŊ#RkU^'QȻ`S !(-!H tj2+LDžF(YiºFyBJI# 8ja8dž < 7 CRs,d3_a, X0w7JS-KHvӢF p-Sތ$:ɦY)=̃c]3)hW ~z|DgBn:?M+JhV qs^a}?m<͂a0컗`8XZY9͛w>a7sbs,7`$e-<ޤAkD&G= okB6T44#fb%pMXSIJFea(1Yw,v!f`䷾뗷[THrcrbӉ$ Ut.+eŇmۂ,&jb;_}TP[(>3%c>Ne1x=:c_˪Kc<1 ;`%6g[Y5vZ/jpI  l]WJe,">3yK=$bmH>5s/ѵxr{jq$џ: x3`ح]㳥x%Vv=- \j0RRn#6>&ilph<jbwqM<(8e~: }b"yc 5/;"vpL"f,d0 ?rBMuQSIϼ}'8P@>8"O( nCh96Jc*8wxD/՗fY$/Cs(LecJں8vLKW5kS (8Ke >z|&?EcB<\j>}akMN(CȤ5 ouFBplȡÁpxIzTj QU* h/.} EF"L!>}##v\'f5DגJ11YRGvka^GӖY/)f9s/_KPC+U-Tq{氈SZI7f-EYꃒH&g\F$MyaIQdq_47(29rkO wRbjPBUy סϸ~0HtQSB,A(D;sS8O1Y6Uw9T$TQ1b>RWe1[LMŽ3kp66B qYLgĞh-vG)v&4W;cxlT0iWzv|##9^&گJfv*X8'*2d!kqwrPZ3 , )㤶Gc?/W{цXy\Tv΋/{rTQTT[]d!j MhDt+ cZ:Dp乨`8 /%O]4D~Z GoLcۀj9~ PP%3_T![ /9۷jaJ\<ٌzkuHv(x'f;W\훷ot;9kED4[ilg&݋LVP`9 >U-Ȥ,/hi ]:0d{,:%3* ߲)9Y"s_3pE]@#gNc$l4gJ$Ƶtko#ҊOaz%U1h!b/>ohM9B"(>\y]FVke}ԙ\\H G^=ޖ$.]}!y{Њ&-0Z'G~ڹ=uUm^j"HyK gXa?5 ֞6ﰙɽ/OlVRur:=ᾫQJG%Q\PnjĎXձ)5w;ǎJc}jOrj( +cMOEhqAVhu_Ư_q>5pg<ĬSPiaVq^ ~Iӎ3 (|)CՁmaGI?]7>Oh nC|!&R:@N& vxN q/&g5D' 𶶆uM;%H7>,]G.1Yى0ށ ҴX¦p:7ֳ\xi/$ +d+Ҿ\hcò`׼֌55,6V 0< q_"=ļ&@H$?F13ggaA(!'.TȴI#1AL=78 9o +z|-M)֖‹`/sѹҹN ͙_ 4 ;98 c@$i01/ƳF;m:w_П߃]ͭZ#EDiP&Ab-mfqmw%˪W4ׯ<1vl:m@A'{dҊjQq5Ƈ%\_]쁑_#/W;o yz~=\?ea E{V$O{ET[Vcg5VqX&Y/Ky) Kaa2,쀅F D{TYZ:e]Kv01Oڍm](EɤDI݆;fkS/f|iC9I}߄&WR[x 6gB6O:ҁn\d$ "7Ĭ',`K&K\+ (H:ȁP(@mDc%HtA>d4O%>LBZtDeLI2VKzQQFIf~jpDD%IbI]eu: `4=x,V9[/@Ae p2͎vGŇ=o|n xIJ%˓ g:.#у Vnu.9%-LTW&i 0-qS{< a9Y= ,6te[}bbƄf沈L?k`Xo<5KmRrd꾨 9<U:TyVޤu pU[W#%x)Xѝml{]A{c6Xf,S]VutQn:7\PJ4͖:f:'W tZqI5L)714^R|`: gG(qr<"WA>th-~9p1!~j,СE S%dW?>8pT; ZQ4/)ZJ\n-LT,*$*VE&1 aܫg!}0{a ewV~a}xK.wStU%槓4̈́D4Uw{_A28 _q3 H=݊H.) U0}5VK" Iu7А/鴪h_%9@j8{Ȑ_guu>.`6X+II<)U_힥v׬?o=Ս0?#{,Oo,cXF`i:ϟ~ϙQ5v8sgH*9:(W?ujXx C{Ʒ(E\ra,ˍh#_#f9EBqcJsS iXO9 M3'f·a.T;%ߞI <*/?U3Mu!15+IjLb|r79[lޓ;=hFt`)ZiJNnô۰8R@誫<50MxV]TOD]a%q$ee'QSvv|LGiBW:A11r*-?Ք&lbVSԂijkE_Bx S.}1~2Gt 㜬jKRJzgHZTVQ~O`jn.~gT\JZ,ŪHK02{ar@o*O7Wύˏ8>|>Qd ,5;窌tjU[TXSAJrQɅmʪkùs]q/{D'$D> stream xmTmLSW>;E{W0Wg&2d(8N>H7,pVۋeD NPQiV7 ) uA)"MŝKv[1sy10 ^]r5!maŬg,8nY6Q 3C29Q*"Vҙߤ0\C5a҂':< ESAeV[ۭB^h=KۋsL[!GXF:N'8gefzK2`26ƺɋW[|Cr)I)pv| &4 ImlS/ `l<$.Me=,R !/]KG~dG'#WdjqwBZ9Y =ì˶m5_389,rӏ2RDGI”!}?"oA{_WU;$Po%/t%Z*@y)O)[(U]TP7$|VňWm"J)$ISM%IQ䰤gX|4@O 69yHr\ ϤC3woԣȽX"6ɫ͆x'cir6C'.y{F5X4eYbgO_Ij_ܻOڎQE煍6{OvU%} %SuFx;քeBZG7UrU$qP- bױr.}t!TCs2H|rcVy ɥZ+X+Smm)f9+ e{截26*Z5ã+MEuYZ!K`ːG:wf9"Hd]Chiײ琱cû2!:,Ʉ+#Oa5u' (;`UWs}LV;`e]3/Z\ =ͧIIݡ XNN3sSA(GIGu '"]endstream endobj 176 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2642 >> stream xeVyPSxoզU}$Vj{ hP!@B {h@$lC[Dl(uHѾ֭2nԙי7|opl-AIe4Ari#93918h)RNNjy{V39`ʏffY0=z!~*2>Z\v(H- RHqT. Ū#DERZ- Rv)6ԢhZ# Y.ڢRJC$J4Hq *U[EoWkA!P>Wbb'ܱVlہVa1/l5sh$l5N%N>g%lZ1b'Q@#SɟGfH]5 6񘁴cffwlf;b}fj1AW,g\qəZRx yk3@2\[^hs5i:@*ley 3gA% 0$x8`el_:գU| ZzaS :4Boᒇ>]BpH5\oOvڑ9G=h2eb-;/9` _yAԜm1Gl#6ߋ!:qYцWO 1`O>:BͿ;l7c|w]WArjb _  ? ll9u o|?`9:j,kq F[E3Sb[wphmbn8{[P|jjv=xu@xhl PUD&WnnyuMTf5 NQKn{ ;~;V"PHuj燷*9Qj)]H pY;8G1R# A%_p"3:aCqmZZs0p? b5#9ިxY!yl<`EŌrVM $<8l|Si =t|h>T2"bMUUչu[pXGnB0,.p^`>qqi+9rVXLbjx/BN'zz/@eyKFndZPj+ͮoVha}8[=\Nsse{P#̽s84r'&u=bD9Ec4 kQ*KڡþƹU "DA"8W @:8EA0a/^6Ɓpo7Հ&.%/VlSÕ#.ρ#>~En>1ĸA3^è&5|LI?ÑQ^V|vP`HC`r R:SJK9?N~Ͼ(#P@I/?CәY, '.gy<:~|wh@5h[Yza&6σbjC߸8<"zGprCTȃH~ꄺ 8Zq8)d1&+yf~jCtŠiW.m[%ݒu.ja}{NCY7|؁38:T;#O_j,sVN8t&]%<\qGRvPЩ/xzf䚬3t,[v–N~[iEo&cdعsSJ`2 *34y%e; **NؔCr3| bE>?y}U%}Oh1v^u1lMH ,>}K{ ƁG&jB^ilmlS cQ4-`Gƒ$1;͌)t`&> stream x[_۶M>cO <䏓2ɌĻS#R~~~ D|:~0)b.Gſ|tӜ~$LIHQ#fQyFͥvtp`NؐD1hTy+YkD.G` ,}a ƒ[~07Qgv7snFg l əm9Y6oog/.qѰHv-Ҥ"fu1ubY4oR@[ ҺYKj Ka)_[K %RH&I/8^ _;b`Fyy l4AIʗs0O͢O8e*[ojd ˌƥYkk. N+3o@{UeюŲٴl_l֬cn5V,t lٶeEm·\|Md}5\2 !*nRF)bLb^0Ámn@vЄK~H`3[imZ>iQeyʨ(m,sf[U/\*o_b" j!/c*1S0Jy@ %ޏO Ce27Ґg7"lHDGԄכ咔;Ί&O|<qValzyӋ N̨O?Nxa;DCɒD'^O 5x&v%5P|m|YM-!ܨD3*L"L}q{ Vf8XfӰ Ar9a\BC7U1D.q*r)Ab$T(9E# @š$!Llmb8ZW9#0K{HkSG)s!VP%'`0 u6/YXA@$Tt^-;ݬ /^yA֘wKanLuŷju_pPN?Ӣ|Ce旷mdr^ˏGsn墹k$yۀgEI!DH{_u]utװEܲ)\Oi,g}&!JifIAca+ c 11}ƛiyLHPg~T)Cmѣm8>HTUEMdJwv&NxsL Rб?C`6=~~3cE竗'O/~yu#7➘ח{#y jsMV,U_of%'T"ngfUMqN!73WuU!;ew}^uSqPVrᶫȹr²˾JG> d u%i~ E:7(7<Ljd78 `c8@ rXa`; ]i\|2,ZsHX~@,2̙mV/"__c>{CFOieŢʦMS Nй%.#!@(!UھMڕC,U_gE34Ʊ1pc1~S \`.u;JeR4(8<To^ͺC%ͺ=L~lWUӾ[SɊxF7**"1sJy3lE-x\B54c2@CgǣWϰ>:k6xvq ķV?1YjD,NuIdIUwM9"OĞumjż5NF@j%Ʀsbq0vPG`= [ڍ8Xí6_SmE[4-O==@KXx3D7rWtر+a{L > 3@?"<;b3"эg?+6ڢ{ k*Lp^-: UuwЈ/0 O߅:w;p}]iXer.Y@[f_S5 4ݝ3M UhXSFc|20dϟ W92 .i3ˇWCĖJl?bJw'-&ppF%a2%? wضt3 -NO{:'#;a?;}8_7@ǷY{՞4a26D_L VII-F`Ê©tC8 nUzBMKROѰ@j:swgxeW> stream xZݎ۸CKF'^tn-bw2m/&{!򌻶Hr),}FϡHrl @FK~;?M2& 盳חfrS}:SQk0h'**1aLIUL9ٞe37yO^)ȩ20PfT1i&M-( ̱ɟ(Og;7 +pPNn'W˳s6QrpNRMuʣe l˨aRVQJ-@o{d-vFIW>'/?_5:!XAh;IhƜn̗cԸnr\U Fl.8QRz(2;NQE_ʻsQMy5#'y5)w.kIS/GK^Mɐd[Svyլu/t7&~*40ei|on^6qMx̒q76Ф6X2!NO0èY\jHétZFgj01LD2^TySV`y / SqAm sS` |!aL]41M^Q 2s$ 9uz~[i3+SE;*7 Y&B"f M%{YhR0ʕ3pgЀuA8;Wce3se pȤB?G/`plɻ.Z:,_P FQK*Ο%F$쥌pû C_vt4{mɄGq=)& J L HPs0ˎ"Q (~3k֭Bu:}PPfXM9/ב:H2/EU ~Ӿbj"P0)n|aˮؐM,k"|'Pۼ[V ^/ꗼ*g_!-"gXl]Xa(F R> vR\Z:ZЦh!y* S1c4gedja`q\ ʡOKO<ŸP 櫺Ra>2!|/j9 A`cH9R lLILpaZ9~eOzΧ=K3' KnpcE2DjBe`Q ChUx":~==d*F@7uq$@VA-Npȩm0Cs7 *?E,W;7- X>+F?hoBdYByO/V.qX":3%AwD{a' },֜NT1R.O8Ԁ!%A:z2# B̰`v%rY"Ú$&e~_A~XĽ8PGG?ұw<^}Az7&k>xu/+0J@36ai6hx^ls" Pm(@PlPIy@ҁ eI0ZChePXCY*ˆ96ǯU mzuN+-q85 oD}>nkvPڕ3jXJ#J^`z?`{ %W)+bdB3uұԟdHRME FkKAm:*2NURfyeIקx"yfɳKg'$s8aC$cX+K?O|dKu{\bKq=P%N5cOXɹGZt m$0NhP}ܒXg݅CG޺pt -7IU Yw}ig+g`B $x8`,o_û+Y H4얫JU_@z 0L6# qzފ )ŽU`D.45luٽ..w5G0Fδvn6 9= |(VQ跅~QR )TSDW?M72S!DO"_V~FxH~D^6+7t"{ dvhncIhkN_=q6-S`tfN`x3f' y^bQgv8MS?{7G,#5oW0D BMK+M*} o-*BqȦl5Z{jWD݆gQY(E5Vk4Pg2ֱ0Duy}9Y~endstream endobj 179 0 obj << /Filter /FlateDecode /Length 2648 >> stream xZ[o~#bt"@tSE}%$* Erȡ"* ,4sns.9`.GW:FGR e0D.d B2KF[KF?bvTzۚ@Yг9Jξޞ`;F$f\m7>no0sZ8VUV"A*c3gRϭV BJZMEuFpkѼix՛@Fx~eh#=zܭe kD ϶:\k!Y$"Nv|~,iuI7䲞-vH@@s` C>~f{Q4+~o ~o ^{]n5b/_ 4 Z*5Cy8CJq,pBM,wMEG/ie65i EϋV&]EZ6_rXnv54Ю(k}LQKwI(:B Mh űe uQpnt=Txtpz8=?¨~fѨp1;iq>Vr,6ۇq#gu:5s0PJYfU:t[=-{~Y8@&%x_ê.40Sq'5Q7T_]-(3yY,I,=r_t}zW٥F]vw_g@rq<7DK/2<g 5Jk?,!ʎ na x"˥KJHMsn0*yl^O{v*Okv6+zC9ݖz75z0ߑU:,*%F5|`+X`k `Rb#wvC 4JB&cM,c'Xlw҉eYyev;'c}TD$c\B#B;1y*=">)2>Y؋όpH6φlc)l #tÃSL < R]endstream endobj 180 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3898 >> stream xW{TSW?Ojl}m3jժ'~GO;|y ^ H@ZEJm۹Zot޻+Lo k,"zbyv~1+ 2y`F(`$?~b?H)Es!& b_{ L,zu>C'X%Ҳ\AW?r%~:!CaUK|qyA^BzфVm_/Ƌy Y 설䄽$&lٳs?E?$"a}1cIY@U$NdH3eGsr V=L;]bb7H${} b?Ll  !bBHl%^"ۈ'bM, Rì<?Di"э_s8+83 g~DV_cϾSӜcsW KwwH30Y$fElanJH+G %"ȗSN J`IuUz{/ar+ fʠW䷃!L3s^.k*6>T?aE֌EEb5Ĩ(AQHY V7Ѯ oeH˔fgSrȅR4_^L ;;lP5et[dZuѬ71]F%TᬛjfוsC@65,E: "S:oxu/R7Q+ r:<3,bUÛ>A$Rj˰V3% ΜG_"JH5{+ۋ`Y]`iBA4j0y᣾C@2똵Q&{m)~hk ZaD::^.-鬏Cڄd,6W.cXslj ?v<R\UPWJ bJ;䢜- `2c0if1<4zS*9[]Y灇 @ox|!wF }כ:W(/2*;BxtKS|YjI i2`6*-LШU5Mjmεv NzZ edy!Vm#ő-KR\5aj ]ЬLPIuj'ϧ<,Y.) o:@,ȓH2LŠ$( lIHz*zHv xFG1 mrcTKRӀT!'X[}{t>YN۽`LjTxźfVWMU#΋L7;d[h 474 'ߤ)XSsOx v^إ:3uY0K^6?y1;*ƫ{|v5Tm׫JZ$ us=Ǩ:q-m /Pt)GQ lTEt웢RQL )Ǣmc1؂ۑ0Ir1^Iٴ%Ii&P"|;sxf&?)ϬUZ>4Uf^.ݟ#g^E N~= >>1珎GFF "0@J.C䢗@7Ww8t+`;忶P 6ҫ& .dOvT7u:e*LaDjƊbMVqDw$~S;}TY] =Z)ƐX1F]EHqUe;Ir*8oǴbE ~kïꖌ 0-']ư"~S6&msK*>TdSsJc9pu^ p;{vJ|BmW.M ʨp~m>0n\ 7*zQR <\Fo vITVΗ<ܝ<~6E{@"UwA|` pQ'>,ϧN?[V'8y\Üu'dd <xԸrgflNVއ_'ڳvMd/{Fĝ~2l(fbr^tcWMogtm; M䥌G3&?RWTTet2!H%x`x lSen9@=b7&jM;v}Xfߨt:Cɒ&U3vC62\&=CdvR'3C'9ˀ縎ac1Vul6FJ!_RPʽE>Ummlx:⢨Wgd)yXU:AS}+ ~mCcmA>6d82)hr8.QS-f%&1~Tпohf$u:s4,fd?z/~ᩍ1j= x [,tsެ{wo$n`R1Kv7eKÃz/<~*|Ιa [d$##hkVTd4r۟~zj! w*v/N 9{̒Ek;6';keŢt ^A\ļ;\v?=Xe4 A5}П'xȓbDITr,36P.z7i ۨ.xaO Zl.Ƹ>o{(7'wѓ {#K̜ΚXX1Z$J[k]*^7gތ2 3A{[igKCϢdSXSqܠ )oMZ/bj,86>USlWfA:jqW?r|=}2樭wPlpW4FM^dT&yr_~"Op۱06tNqUT~-*Cpem jy ^'7AGꤎӼLSzP6xdy5۶4^uXuXZcCV R mKsji9/l,gwRL;Ov87|o7S<WM,7Nǘd<6Y/f4ڏ4`УIG+">حxL&PqcN=|Wh_5ՠhTݵk 8aeO=im;Ղ/FdISC*o%{ݵo]/\YUUL*MF۠p۩Pp¿ǍSGkϴ‹ Uۇ~ۍ(Yeݐ jҋě[A[,v/8ѷ8 w=oӍ߻6D+ sqˬZ];ƋW`dStdBX4IlzAld.Dn!j. 3*i=ڣJ_IR soR;4 P\UڙUp$'$ Z1ӈ#*r䂚J\DK8 4sz`~qN1bc// 7%NQN, {I_ZSݯ/:=:rl"ufM͊N1-/刉d;⯎C φVmendstream endobj 181 0 obj << /Filter /FlateDecode /Length 4257 >> stream x\r#GrG>C#4lvݫvZZ wvf$B#ѱod]1 YQ̓'eTlTݵ\(V֚.̅B\,7jG9Z^yi..n/6(c-Nbhs#2/0r+d~1FӅ(Ji} [(3Yƺy 6R2"~Z\|^/$(Kj:[,EeS=4γU0oi:Fgmz_8:\˰ X9㥵e%/1-2ovYM)ٝ澟-??wML\-{0>>\KX/ʟ Hi#D:vqPH9uuOX\ӀZ]⧒z gNŜA%m:g8Œ WȔ:l=jm|~{PJe_2/Knr)'-urbm(7G|)*'rn٬ Y7MumihyV/U잭z;m+澉X0VžCLvo,kn~2>)U.w;4ӹd]cm) Bnz<ݮE|ol"K ,^}>ڇ̡p xxזp};'f٢_blQ͖KMۍ<FdUmSөnWm\mCڧ"&nw&F)E-ZV7ژF` ?Uy3T=V14"-M }J^?_"ߗF?UBhUg7kLHgqZZd)laoȇ{$h(rĺ4TxRb}dg$bj偿ݬO$D#" 9uDni#y.y{1(C(B;nLtʬϛ_:e.ܤS>}} mQDƁt֮#!:`_&td FVptcUc̩#a,2f3Z Rq*v_jhEQZѪbRP#NK-AK`̌]66(EKݗDnM L D4v"[#C xP.`ہ!=Z^luCdBE2J( Xf2BX,s6 W"kHRu!M/T1(9kmoU Y)l1j!&~Rf?|mh)oJIh"KH))phDEȐcv{4k吮45tJJ_JC01!䞢WcNVRӘ, ffhWS"?0&q/+xo\LU"/hW$* H BGz٬4z̨wMs7(U{Uf?a@a#ɧIq~R쬶6j]zo,cW*HL[+X#ns*u'NelvXBxq,4uNu:w~A@ӈX9&[-V8%/ۇ La Q{atFݐA{B}N%xjTxPJE@k:w;dxX_qDȓ]a)_Zꎆ^JV7`ABL4d;f?d yXl;jy*>2<^s9IyrB@'85Cw }r+W0-|xd: \ 7.:+!2w9pQ$ ƾYm{h((frP,hyMH=z%Rpm[>mC}eggUS /T 0D7uR (@OٙR~Zj#xM| Z^Ux)44.KLkR鐅;:.ȳbX?T`%1aI'8ד|}sDͺ]z'N.v, J-i+sÒM+sCݱ"+txdn\I ]dxۊtd?~~?,7-y?dPZ翹"OfξmS.ƻI[ۏE5]q,Uo5BNQ 4kP  Mrϳp 5=-<πȨ/9ʆYv)v gYy M bk|tCw5K*^ -rNt mscL:wB|̊> stream xW T׶DlU8'N1D3 TDyd ( Ђ (ΊQ?ËIy/J?sj$/nW=>k+B$SPΟ% E>{#ZĹ8f1uֈ)N/8@pAEMA9g;sDY.+•P?EY\V+C]T*\e!~ eKֻ,Zqf.AӒ JQKbbW%'x&ʂ{G1ݹb D#&^b=1@l$i&‡p'6/El!Ke;rbK|Bxp•ML#dO*:i5jZffMo"qPKCTC8kͶ޴S EX4{w8fV+?5^+|A- 2ؖEYPV q Baa:_"}ns6&K;.$& JJ@XVs?Z|<%3Kn[23.2q# P{wWBdYp%W?]0 lF,L5&A':W\ 3fNt | E{={xxzƍ[n|21yq=H8K>H(Qfjl^nf&JFaʣ_O*\⋒Ձ,T永xfgrDa',R 8xg~oJGs0+& N.'꟤ fc(5j-n䡈Τ.5{٪%nA37%Oe1*NPvpI XIQ>U1ATB O {cVۼ ֗(L~뜨]]x-2Ӥ5d(V(L# {$Ea"|HVOKx/r[wn:9xѧKG}~g*_|BTbJ`V`ayaz`G!i_!pfigkOٿbL ?l;¾^wj7L6&_FhF'ooEdjzܽȼ23txB^09 Qu5-hs?_e‘,@u} @ Hz1"i C[ 0t ȵ@g%Vʸt RԐ}T ,YRlj~|Vf QlWMLnzN>_b=,2'쥬{ȗ E ,ɭ+W J9zW RijtBP o7; ~}aeEedF04;8R6 ]g!J*X(s|4ߨG}HLCzݸ=l|ADžPr +5 "SHF! 7;* (n@cZ!^(Mmȫ~1S2O5ѼvcQ7INLjB~p~S\ɉDfSo|ДVPrC [&kA\1_fbH5or܆;l Ɣ֔KUAHR|۝L[ ih(ibiw7 hOyBа{oޓ҅jP=yqo!qqg'h3 **ړɀLh]L] tU?=<+8ut^`%Eq(&0+C Ƭ?~t@-Cؔx1Li7v~VM7Zv;˞TBmC|x"gY.1Cb@~IȁJ`\@ĉ Q}d"6C w OG@I IBlvo~#F>xSʶ9т:U-*-hP5exm[Y2_չBbKN*DE'Ft]@>g`&5B=RTCY+ÀH*KME1YL⎀`D_ zwA1[T.@YFDMDҵy۽#aBjsYO*9`uu\$UM&#Q4Jy%NE~#iͭJo_۝+|:$QC=Y>P-).DQ:VTmISЩ5TX O͝6Js8]C(/IyZNU2B C?ǧSRQ6JsjD5 eC/+:6I)f_ WێG mDLL.l-"Ԥ%`L6|)c嫹'O9 >[=`lj.>f2 b3M~@YRۀ:nK,çMO'XwI#&Kq9YzꗔlVpUksN7^=bB74[ K=M8b `U.w :[/apܟ 89a#`{ vZ|3&{-z`~㨻ԯ^C7V tyGfȝQ!LVQ憗E";-=RR+S(ZJƻ@Z%>{xQ&B['@gQyb:-z}|$P- DUETVbO& !6td; 3,>qj2чfBon;OQםӯ[@8B ~F1e`,^ӳxVS5DDT *A7xT Gn(XOu_Q$+ hEggN9b8i.BtH+DÊ- Z-X8ǫ-4=גs7XմH$wnt0ڂ`ӈia+.0g\9 %$  +ԘQx2xX۴YL-3,4xoFV:էn Dy66( >M`s,vuSaKo-ob~0mŸ=mcܼܝdnWܣn8k4$!*4&܄ M'+|]U•u s| 3.G`NJhpTYFy$E9' 7&ՀZY- WhI&,xHsN>Vap$sn_2*/wK7(CZG5&NJgM2#;P9 7ɲNa)sػE*Q'Mꐼs+AOMp,=bJ~YTV?k[~6kji9(9U2̲ Uxq'{n=oNIX.G|yRw"cp 2{MuuMyy%lBnYErwuyIBaW3 @2]/'9;m:#c J4PL@= 9~ R?sx|%W>l3gpVi(#'QNAZǼSVڍ(yqZX8Js UM$ṍ=,`{;w@Bxlx3Lޚ|~Oe䦣t>]iZ.^qB݂svY/C@*/u_ʵsw\]XXY&z[fdgѤ~ յE:EZVvQendstream endobj 183 0 obj << /Filter /FlateDecode /Length 4128 >> stream x\ێr9C+x&(rh z1 ;-v>K_')eόE+ ,/޼UIA}(F\&T^b\B\i`q*"/HQNs͡RW DP[]| vԑo}q#ëeQ텛strjyq-fVOǗ ˶դ׫%фFgj;׶/']:aWͰ[,e&W&Z/H+ìJ I,%EO֜s%I!yN>y^19F3qk5-d'"gF#mgH$()U@@V`!펁TT:!LXwfPZug:Lt/7U3Q1hEYˁ];0JeR0vGKiADh1 bo1'.\RA #Z8Σ@ymS}o*U Qm+POXМFmw)%#A6:l M_6{)]MrE+< X!ټ\H`aq%>&TYStd@lB]|UB)51²^Zw6w,[7UJjV f*umW`g35.]MAaQӰ-]s!QR:jFӚ4qG!-fx)Ŭ>y Y3<^㗋ʲBó`"k1VcH ÷,rǞΫjX8>ǣ&Z5\>(3&fmb C-@Y1YX3P&^,2+z~ySmat|LC.E\r펱B@&zBO aƖ \l.t!v]hOP~1 h,j_&#vߠj]o|tEy +T.C  ;*S>ǑxV8WTW֦`֚rBmRQMi4ln6#Ö;:r~ XPU ow|FRRL:C=aK"-bjfsCXh{pǍhyt:nLJ~Yx8Q.aSȪ@>ZJI 7Q"b<' ?5M'˙9&) Lo.,}8cWjIo ӇJ,/Jζ+C؎ITFvYEx$[ 6 4t[5  HhT f'h{ lg[Fxyi8t~'m>,q|$r#dV"qiGכj lN=$ϋh>!~`F紐aSs'U)ۖ]Q<@1퀓geϧCuI}` vq֕3U vnʥ2iQk 9bkw+h# @N5q};34OM"O]#KgsȆuؕYq1%SbI,qG}cXF@A I(!1MC3CfgV]Oߴ⋐|Spf%D u! :|c2CGbf֭fgNXlvf {НaqyXlT%=r%T"P)SB "j9;1$O8ES|P c?Eraz9u&((h~?7I>+tBc +ardL %  {m~Klj=WիSi*PѤ*bAQ(bK%ldlT@Ex? 춇ݳ޳> p{܃2/f[׾98V G]׎^ Nt}MIuԤ/5è#Fګ373BD!u0A :5g(O68 )~F tvW悶V!7]xYkt!xV&nX5Gx*{ÏjH4Y"T;gX T==ߠGpb{@\@N 8T(R+ Xrߓ3  ,8!/T}#=# MGZՇG04q0R&\g`8m8FrmnϾlY6/_ mߝ^u"3#y!#FA$ m'@9|3̲''G+v1L.(CCnr \rP(=t]x^WKS͏byå:fZ-t<.Ǥ}t4ŲfQg|QpDiDNq>zPw'du6ldzz5=k ncUuU 8Tjt^,iٔpu&Qm;Fͫ_ 똄-|dpO;zH* p%oG} gn.997A6^]=>0!u7ZtSnG9$xS%M>q$R g&?f3IG¶z~0P;* ;w]dy24gL)Xo7?WRQ)[;?^l]_6md?m1z)( mgvYej[So1ͤeݑ1Y>u'բ D 5u$lpư\079`s88`yJѶ\vNYafPn%m P OdfM+ l!~`<~,fxhs"e*ʕ_HnqړL]!I1&s@N 1b S5{t1}٥[/"Re}59MJ/^K[>~]N -2,|zRz'.1m'_K"%-gNRɔNō}4բ<^ 9}Xª!&{ԿYx}RZ?^7H> stream x]n#Ir7Am~i؀w3k^`[@I%;KCRӆſpDVުX,RTkzl *q⒙' ߿7͙&rk&g[E!Qzr&քe g%'VB"EqߋNn~ƃD2;S]]eXro\@)Ūj۬Lr{pն.sk>͕W]%ge'mZ}} Jy<>rKGvRbM`6{ dXy2VBEA[uO&_PӮ&'/:e:HgnJ^qD$t1K:CLǖ!$ωXň GP40 P&mL/S3L/}5W7ƎQhs40>6`av*3гgXaZW]V{"xi=Dr982z6g_I^_vaݓ!"7Pl阨ur{(<]9Nl .f49nыr[WEaW<\m'5\ UaԘR+)$ZXQY[:2VSnzMDQ(a]Og c9H;x,'[a~@xG˘& N284@%8sȴ0#-Vf`zr, + 8tb4)=]hPGDYP46!GjJ\0b 3za(іx%,2-lI#*L8--@*iHf~[fflFA0^T2881 =6kV57j9l"`q? b[73bn18v YRMD'?ԃ)s4JaKc_r0qj ;;4{Q{*gTʡd1|j1+SfA e?4uyhV*Ѧjp3[g+CE~mrnDzzQO}US}<P@j{W_z6{!QIWP$ųv 9o+O YAj|)LTZ.۸-xQ'TU#3t8&v~AZ(dp*&0yl?)lauW|jd")v`kU?S`v Ur]@p _.Y\mmrԅ9 &%WpTiXH3 lrΧNc0.>/ӈpX@ATNHCiAt)9guL}͡w!lB0nm ׽sr|j7;zq{gqC(i:u4^]igV-Lob"q5*oo,C[rJRn A+ & l@x"1= Z͗i}͍sS]Pm-E `-Aӭ1A-ȑW H+Zi٫m)u$9E# $Hw/ ۡ  8$zӻJʐ:UZ A^QR[Z˷D }wxY0RΡgǢhg$[[jh)mqԓBөhxԑ'"14Hi>y9HZzrvHtv'mnqr!{\m a<ȭ yIsmqvr76G>|83̴ԣqf:\иUhF#,>0F"fGǝ;Eκ>"kSz25ЗK]d*IHscBZʄ2*b ]ƄJul7h.ꉷlӧ2,dՂXp4hd$ӠLh0 +tasruРȯ0σ s6+yzEOWmfY{v~@KJ+@,b@-%,NDz D Y@ Tj0%޲*Oe.)dc_=,TO/G7="_b e(%"J -(n)4owc# A:\zS;X/pY8bȒcNbK-'-s)ck q/=0vI Rߴ̷`Xu+cb.Auufp1JaDgA׃A1|QQ2:_ﲽC-N3Ec X: 4(fCRvdt H,!]YyJ@i$d@~vW.!1-inwX|xf*iwYRdh{r[nxD[@#NB fG>e UcL0muF Ҏѫc* ecYJ"1Ɍz޻-b/Y"ԫU9Uڃ?VmD\73k:=X%VE9_#3h{ Ab;TWr>5KhE/R jfzBUȀ)>))0s*#?V_9Tٖ &-`t*X<Hm='"$ VwJkO _"U}d7b#4-?F1HdL ul?^+k:d0|r?"n{BgöM^~Τ=3eѪǷ[f2&8&9Q|KHքM/׏uHTm;5l ~NizQSr g9;ߝ/xg%endstream endobj 185 0 obj << /Filter /FlateDecode /Length 2510 >> stream xZ[o~7#7T~1`7HEyeRVqH.X9gΜSD WL/nLt$FE)I(1 .Zѿ%H_p1G.Ȉ8Ibg,3Thr,a˜O,_XTL7XP#NnEj)K 0s(OӋx.cڻJ,J8Kh(>DnEnRR;kTpG3kbsmC(Y֪cpӔ!lPrA eYU!"XC%'Ruk-c VC:ܻ'][ju[AћbA\!q-r^#i|~!NnjG"ؽtOhG*Eԃ-:1pkA謵 TtZJv%%Jpφcٴ~WwlAD /-bp_˭d$X,{E׿ԍmd~iښo` N"/m7$%y^׵<({hwsߪV'{aܭ#rʪ:kr I*DU^HB*[ 5],ٷGͪ9-/ΒiZQ߅n<]/A,f1#DMG歼)XeQ"Ѧ/ψ`'w9-^Jp^WSi P2?TE,=)>֎0,Q^d!.NxRhSR|>YA6X G^[bk^右 t^kN8- fW&pp #aa@;puΤgˍ)9[m`]i.̷jui<8R}(|\ώat~2)).JW!rj=JH2#<կTt)Z9y6H2|ܪMFD?\Kfx57ĭ5`<[ۗȵ2ڇ\ےwkOQ$[ `{BFawH V:*!]&LyVUv6]*ʏ% FeZ7: ;gÍ%M-2=bɯ\%,W%B ;UIY94%FB uOh :C[^c+H.Au *e{B;R 22E._A9bywOVJYC>W5|(:k- ;jc>oe^nD2`[?wACEl.Jnciq5*]_'q<1D(~ Tt\qHZ07$˰ U}$e=uq?ɲ &erhKg 2s|5xVh۷%YÊj|H٢"k. qYRA6U-G!K^J=Tdv;t-*+l,?1@H(HÕJFE27S[~k\qB2>s܆뢽O;IbApQPPJEl.((0d-(p]Rfի!A(q#wNk^ڐZڼO7_30hjGN/o{;[0j:7oo`0L|F(SP:Q߯{Gp,d> stream x[_!kZ?(\$ HkpJJ♒| ߷_KRܥIZ'QIqwfgv73;OF$Ol=zAEѧ i"BD3Hih3(.1Z~rbF؁ 9F&0fi0@̐0L0ӈ8:zw2d:Y ɁG)J|Zu&w7* @aLb!ʻIT[Fk, 4<jQ'p.N4_&寞P/V mwnAƖDkdф2^ʢDPU#?O?"ʕ́I]~\,WgI(RTdR\7,@Z'l%n8`Pd}`ʸK3}%bZmG >:٩6xN[sWowǷ[A,T$֟0\ 膢 8sfFD

    H=v|YPt/ykE.X !=5OsbXCvKZ?=cCeG(<8eY,h&؛K}ӗMє~V4ư6|J*^ϝ$DgnBg }TW1: >!9XS嶠3B^Ps焦kr!C< ɟ%wh.jx0P£ bRHw`듶 \@I A۰,ʑPVP" d=+;dgA2ja\Ut/iU3W-u J^. 3#I{|{F` :#/_3 K;'˞Hy<ܧR-Ұ{:!xE}V,^XQ",}=M60@tcNa{T) S E^ $We "fc`bL)mYbql &U#!DGP[OeI#!WEѪ)P`?o$ 1-i~#V**Afd.Y+vvVn\MoKbZ1 ԔݸtS OKw:8śj I~_Yzl4>ܻ_~.0*Q[Fr=sB-`:EyD "VRnRHb} q7YuU$2 4f˴(}$T&Yx jeg5u h^Ho[N+14_($Gl}mwW4\x9gEpNLq_0de4Kvg,2N}A<GRJhlsRnܚDSN /A{r ͠mBVEBBӯO6R,_WJui]ߏnX_ί댛gr=-XV NeO>={(;*# I36e ve+v!?9)}wFO 6b=}FOJ@ωmP环dM, d_9Xr =TӼluL/*w$ۗi$;pIx9(#>bO3V֭cu#Uw8XeXՀiGYi$!"؀={ji4)g4|l#AݦpWB/ 5Vs|b%E=}*@~|WԝjBcm$%kݫw+lIJ6YvJlM`M@W x]6,$csralxmMuGdz]:8V<._,\q'UBǘS%O4.?1"Ӵ̬utXhtoiKatP }q%$0*={_IM$ȰBjoJxvk`}?t}K6 )w j\ĩYGkN {yF4Z7 y2S>{+ka犵՛2@$%Nn &G!Qd!䝚endstream endobj 187 0 obj << /Filter /FlateDecode /Length 2545 >> stream x[[o~#$T7̙]Hmfc} e#DHۿ33(ɢ(̙s͹kD D'7tt|H%\!#I$EZ,D$W4PbPF77 aRXPP"! 2aAZDB!-,ΐEa W,*M#T43zPh 4Df y|,dx" c!w#ǃp4,:Zs;"L{PٷyךX~û.8ȀŰ6JE4áʧ҂σw/_UQ[᷷ W`6:' I) `&(cŰ| B|iUW[B\Qt4ZIPDrxV?I$ R 5EtqP"P`"X8rWhC (q,e\x%NfC-BήJ0> 9Hg:ܴ `R]or-60n鞑=:8%axHfkqiRV#YԢtLζʏ l?W[% t&Mo|fzLtY8 0ߊx;<•QkᒚbyF ݑlΐLy+>r'.u|e zS#$dC;4j䉱ͣC;. 9x;myrIK x9ךeE.(_Q[5 >,~LWl%)2IRX&BJkc4X|,ʵ%W ChǨ{KmSvtF\-\-j߂L6grsilaÒw/DD`{}3&08'b%e4 t6)iwH mn±ޞoh4\]>T4|hTZg+MqOC==Z"Xh~|7_wJLj/$?D/w͑xwWl`9v<˯Db 0Z4m\/׵qhk74l `{4?6 cMd/*sQ.({h!1 ċdh)ڇBIRbmÅߺrm/|o}ּYtpH4f@ )o>T?'FCx>Ì ?۸&AB ,xq~a!hCx.yU>#gU <7Qwh7&|o먪[#6k3QЬUE;d#v>ÍT=U{PNӐ[#j٤iw,VW^@i12w^  (Vt>LnNj$ð;P~e7g7zrWǡ 6ʂB@]9iht74 h,.C~Wn lil)P>7[Fw4㴮a_4rI-z PDYpyVЄ+AO-ow@wWWrՅ5TI%U7S? K-<?_ϲKNM3'oo>17dendstream endobj 188 0 obj << /Filter /FlateDecode /Length 2262 >> stream x[r}g#Z0hܑʾʻc>Hz%H/Iq%Fs!cqLqf҃"hF~Lğw.^~{90 7* P![/l$xp;]~.D;[7RՒ5^9}Be~E{ԁ {+A/P 2lq@uq<I\J@9)~.GNlDehoJ@"mh3R_LӋU PϗuNAp U]oX &f>OO %OwXvXJDlAu \a bh [Cq A OqF H)h:㔽Op=ODkdGSꌉ1h|~V༟F'\})7_ÛޕpӥhӒhzWZAU%%C%DϝSE0.?M?v:MQ\rL!La|˂ C]HUYKj=J=)2b*BSzxnprO%\}!=G)TCdZGZ Ro(HƃGCv)HIoQС 깫r3ڪM+ {?-J`LJc>·TU0]Őj#RyC۞qmܘ'?g4! E0.m ŋ4!$o^2%bX ]ѐăMGoh䞣h GҲ cgQMo,x"wf~kUl,:-.*\5j`'7p: AQr1(}ΖcN+тPXp1m>|KӰ`˼&%[oWg=U,֒-tUJĉγw1V]UK:8N*:BEh]A-:yVAs, ꂢ,%V$xVvz|vܱƵ'ĕڏ}O_ - E]]hI`aJr'M1[KupRF8L9w.%f uKTSX4&Fѧ- ӐV U!P)CazMUxQ'R{ăD0xQҩb7qZh2]=׎)ܪ=bH<$@cFw1E=+P?l"6`e6Q٤l0dyn`G:aǢnJ<yÈφ5V 8L&pO; OQhPj(iz7 x,]Y%3t:* M>GPE&Tu F|nj|/<[% \M坢UU"rGJCTL\ѧqmFQᦤ6;( v `5j)(%'[ "5 6Fn֗KkVB&iX [ ܍`+嫋]f ' l+.]Gg}|]2%'l3΀zÜ-mhoޚ.ܢc`KP?L9S9'|VΙ./Ιs(s&f 9SMcy ;Leˏ%|V~,_O390 q)L"h}Lmt9Sczy1E猍\乨X9;I0<Z7'uё̦2S)U߽z*{Tv_?vQ-`֍kJo"eF@ӞzqE`_%D)1'ƬqgHi߶To+_Xvu$n+^n4EyojogL+'a>ށW6*d&ڪjpwӥfy(%'-!^0.p܆xg͛l"p+yuy}c$ {W8-t0E{( b?Jiڰx11woU(z>NHnA&nԞ!x.\vQ`9druC=:}N??>endstream endobj 189 0 obj << /Filter /FlateDecode /Length 2626 >> stream x[mo.GGzhi@?A@K;IԑԥF{|eDE6E_a ݙٙ癥 0"? 䧉)Hb4 $h@Ȑ  FFqM`v L`0c$  Z0GF3ŃB,*ށ X 5Z3X5A 5*H`)TWlTTWw$)"y(3$\M~~L8`'&l"M Lf o2Hrܣ9ҚHOSeg\DDTp#lcla1G%zSuM<}myg9Z]=llʨ8S( Noʾ])fr'$Y Y#ȵfz3 ؘW3!f$8'DžrۙV¯ϋ'[@r;CҀ;,6_8G] yT:˗![ʈ_ O8Q`$no (/$KAGKDTBr4P,4mُ"~90GRz4h-ē hWWY%RJ4242 ֞p/n `‰fC`dΜ leq+d6pj<S"mXY^ mD9E FGfnUOoeɐSFp*fac5Ve":O\7a/zո &8h3F̒BP_]Mf‡+$-ArDuAQ~hvhuٿ`|YetNj8=:69RE' 1 dN9PPb6HA;$S%VfjYW*qESb!K /C7(:y@=ԪئF[狣vu&vWPANv$J'I9mm1Ah>ƥ6ﲸFi'7*&9Z6;6jӳF;6 E6{:wF]:q@ǻBSʊPxQGɸiQԍYԑ$6cP}0&F8e "\)Mz_l? !\ya5yߢR?Qč Bd;q\Sk"a bo{ atYiu7Lrl(뉰ī b5.l?O! ś pt<=㼌ĵ E\G!;WH>;3Jzo|'2Z7q m=-)DJߕh/]7/.J)wd/(O ےd,H@$N2UGەIȠ7vyۭot\&f@ [.=R]Egg&7SРRe\x$Da[ǡԍ?^jP3S܏rL (Sg퓂S#Ҁ1N>U b`ŕ8򥘫HCl3B4ʹB>(iz+W4q]7m󎪑xGSS! |_ս2A \E $,*؜1S 1% .[QB{`R޲V(6T-~3V [#ˣ%s%n1>ƭ,ߥ9(O)\ˬxg $/JC\PȻjc|+[>ňO if1JɎjcCĈbsy|V.T$ϕ9ߊk:~r5#X'6J,Y؀A}eu2޺KPa-i 3P$yFðbWQU>WM R{!MR`n!ӹ lb"FK %tZ6[EYV~B/_1e5@ջ:}}[~\mqVI0oF6#DmsFW,egi;S9GO Ivt2%њۺn9Ol śQ{/ܣz@ӏ*+N-3O=clx9lPyӆ>JYPɃ^2h5:z^f)Lq]VvVg彷*~42]j_ b=zh1A0%h?s%>3\|]+s\y^q{;{F{N:uWPNxIJU5%[.:r^ā͟X!0*.`MHx5c C6?)0+|iu@WcUqbJlYb FO5r SZROO>DzK〓lkѵ|n"9,]r +fbMoRv•0xW„Bh䍽o5,2?fendstream endobj 190 0 obj << /Filter /FlateDecode /Length 2022 >> stream xZnDjb=H"@htWh/vh[,Rt Yzy~Cr!-),y SnjQ>~mHsOP2ͤZf{j"O1=RewݎUTz&*DŨbj׉V;iU J~8D(`ٷNSopvԜgZQ!ɬ[5gePe|%vj~|6hgC>_t3D-o7yIFwJiT Vmbus7y:jP.hFgX-6+w{}1PY;Lj<6N2 |G6θu)7R5e>gRm zƝ$pT^he@bPf Nb#9u$gObD ᷣkA>RBl2u; I! gpᘇʑRZ jF[ iXHa D`Df͆eY,C uxv3"b!">sR7sa& e4UFvrZWK%DCuQ-F=rA`c %16*{Z;$Zm8M9g ~^ɲ%,$#c*X3vBM D"M(9cV~>fhDݔ )\nQՕ↓Pp{Cr째A gxg;4u&˧g11.4T3b&%o 53<7[GH{O8>kmԛwZc]ST.}pZOĄP \w+TB%Hjs`ʂzIi$Ȏ{F wTܐmxd#^#RÐ$/v qc'lA<2+ E)Xu àSxMPhW˪ݚpA2hʻ8PT7m|`3 U{ :0hɧyuAw^9`22%^#\mLɮ>e*r&^OM[K.ꛉ_{·.Wh_E[lܸ 8mU_$m-1"h.)W6F."a\,JTEi'·PDd#ݽ>$> stream xZn#(#ۀګbTnjGӐ693%963M$'Tٮ<>6sw?;WS4M*X`6{]q@aYm@7)/H؝*Wv4swRIPo]Wcy|)Tvep4E`[E`zJ;P MZ 2|-{R D,GK;D) jf)nxBM8i3ZgçdݙmcC!UL%M&*BϓxBj ƗϘxvSEwbʺwsB悟N҇CsX~dOrc9>r j~G>:3s:S>mYsm4O=;# :פ>_ӽzx@PzR߭CB"O =/V6k>! MB{I DViY,;Be]g|%Ff[-d/_⋃;ѓH#;(l9=.{VX\,H lQzdm>j?||wdGꯀ㨶hp&Fk H]*T4*؞D9k+y` +`z",S%>\S)fkgOSL0 (f{0TBaVtwq?2^BId3UNȤ&>ٻαqrt&l|[^Uջ|t~V1H޺S~\|T5Wړ#B`x@tz8hGs@HyP#ۂMI2C[CyhoDxAՈPXEk ,Ng@d{\H?6g}ԓ#KDWnrC2PƔyins@1CД9RmEMZ&e6[CET0~$.|٬M$R14(Bݸ_U}gͣj7=2o[Xɗ\wgr@.j9J-tA"\];2ȶ4ZQIZVXFϜ#Q!$bP#YC$k_G RfDkW\ %CҒOliDNT5Z t? Τcd tY<.P7My,]XR&Pn^UȻ&paB7 tR־j>6$9DJ h6EULMi5}oo=@He4/(,Æ}+)ߤヒFq=BնZ^pAyEc" ,fk@[,,[Өj״)H; RnmyGP)UynD]x_gNO1'w+l'M՘|lFFS̪UYvUO}h}ڏ4&X=دˋ',{IX;x**a{q~>S몺^NEwr%Ё¨J~.mr>f]쨱v{V$~U^0LveQ(\HX7j=@n 70 P䦖Z oD12_*̫7U J?6j *āUR,nW Qtsjqȋ-q3Ognֳcvm{^keZS-k'@Jn6_`]^ f>*yl1)"S \K^2wF#:4d8d:y^Aٓ$"ej#h~A2k"*D~Pjr yض>rPGCg:TokHF'ɪmC]fMzQUnn*+;rwdz%GK&9|hH_we/o$2ubcdM}wVs+[ CkL?PN,:%]t:n_"D/7eJ;҃NYsJD?qu? WJd71CW=LuMe&VWkRD">"s % zJtb1>}7 ,)~ @NAB큥.ki؎+ni,ǠX'/7MߡJTl=9;ؗendstream endobj 192 0 obj << /Filter /FlateDecode /Length 3196 >> stream xśێ@?+$㮽k8^ yXFxbKu fEk$0dU䧂VPW.G߽3ŇHF5-^8Q!QXpה,FPK1laJՔ(Q<ԢŇѧ [M4))A5Э!ܨf9ݯg+`ft7_W2^c(͟G?ތ~IM)Akʅ#%ZLKZa*@8İP04tOQS 4VcJtVʗåT72D8m!{ZX[Z]6 n竉ZhWeިVvP-VxK } e|y/_7ٛ'M>p"%qW _|󦹻Td\NvueOخ p7T? ^.p8iG-ET҂RECB-P;h 1ڲh4ɗLSuq Rghb|U:P%ym!.!*kwnVe8ZL. y_nkwD=}a*0ݛYcA!S]K44S/Q鴣X-YXj j(운YǍJtȷ"_+N aj/^}nPiPoiyH=p8Y}K]ow#⾍G5j1{܆ X u|XrkY݆j:TQu[w Om M^0,7~̶PKS؎khPs6W@><=\,}pw}> B^/SKX%w9fGKȑXVt[CPZeȴ)"198]4Zk<X>Mpc5?kANwC.I-p,۸X V݁XZ}%rVxZC-bϕv([W=AEK7x+CHD]́eĺh@4P =#*o_Þ.PXF#1*G`6~{`nvzj4X2z}Cj9@QyAbu,Gj|_ԮI_TwJB.5;M)շGj?$nwsv=k҈OC}v;pHCZYwa dc_R`fd|% `޹kIgF+{n @Н%V">IAK *)wk\L,O#?vT-պTߋ3RS p&$L%%`*E:_$:sx} f %A6D(Jx7JՀ +]'eoJiLT+z 1[<+q=@ɂ6[ IJZ 4_qTo@&`Uk?OЉA&/&m2h#A2b !;آ y d:B[ p8I  F1/! H57Nek ^>R| n.1R>k<rjf-:AI lAڙ䞵W+n.lޔр1v< ?a[t9ӜmnB;=[9&C|-Hmxz`[S!>آ+r8nc]madKo [*/~n7cQ?!ꯇЦ4/bϰ堩>16b2.}|s/}endstream endobj 193 0 obj << /Filter /FlateDecode /Length 2615 >> stream x[ێ}$Rňd'A6a3õD)*T7""5H<Sn0"b=yQEɗ))" 2 $hD4G\HD#c0e<}|f#L 1ą92)= '1HeBܪc1d:TK&hkLl~hY_@ 6~@ -'tiF IGs!t"E &62L a _gX"!z߅#<\(I@L{:B!lX~*AJ6۞x>R[vˤLOpA;p 4f9|@рӉok>}= S"PA 0%"Bf'tqG(P~npaL?>2с3Ș}QwUL86q&.uzTtiOAPª&suP\dDǻm4OUՐf)6f^kUiC R1,OAё+286oXwvxB 0O GXl2)&6nՌH~0_\ L$l rdF~jVYqʴY 6+c:9 ( $#ul„ɖZ?_>መpW)U#<*7^=** d4s^T"\HԅS6fU:3=@jІ` "x*w0 0rh4X4LYQ"{]Lʈza>ϳ܎J(K#L ]URڷ&V OqhqJv SˇZ|AM,k"PVFTǶ?ComXmnڇgn-YF/uӳMwpµ2Wf2|*Ϊ*#2uA3W`U٪PhI8Ye@rnPͮ:rI٪7>S$CA0Nz=z|Pa`NtܮAlYB+ڋi L› "v]o Z,ĝXŐj.&$L"/]312Oۨa54d}^&b[DCE"nZe ʡGXP=}Ƒ)lU, 2LF]Єy9!AGHͯ . ɃbU]Yo߾[= Yξ P(a7d1.V3^< @eBBe4.-t%?M G i%3"gSB~*75EeL}R0~=hendstream endobj 194 0 obj << /Filter /FlateDecode /Length 1153 >> stream xXnF+h"NIE-hZ7zI"Ōٖ us9C]#J9G du#dD)PD $(#ʠԣwhQԡmiT! ')Q 4ڲ$ #C-{ \G U9:BvB!G6ܢeJ!% L#Gg^_q)m^k/$3ƧY} τqgrG!hX(ضΘ#Z1QVgP 4FeTIq M#wP'7|rq18w͆<t1y@Y)yW6 t M/2g85!rO¢=Q`P:lhl5_'}_DutJ _EoJmNry9iPueRL^NS?VXY*&x֘$Y'e|Û+_PjWXm'Yx9k˶-GM8 TUIC \mY4 N%KTHnӳAq!H@{y<:U^\P鸡fi+u#x:k,_8on΍_)~_d|VҦsh˙qېc 2R'F;.5 溲R].mQH(´Ap #;vNq-wϻɲ~2 2m.{{)wrnx2ݭ ] t0mnwX˅T$ݶG&ݶ8#qrh0^4;YtZ| kh?ls| X5:=V=6| Zo޴6 f?"YI5{Ss*5扩L| ej645>\lg$arNc?:c^> stream xYn#H#*RKI0 ȃ'ؒ!vӎW{ު[lR8]]w[{)cg,5o66+gf(jufTL3r]# ߣbAV(1Q19&zjm5+ꝴ*6O~+ül36cT#zv 4qYf}uKy.aoZnTfj3v~.lOjUl2IYVۻxAbn_%}Daϫ?8Y]n|?*_ij]Ylbmw,fClԤJLryd*ߖXR9G8cM}6{_kp%\& D繠ʇs!BX0D$L-F=|c,J^UpX'/U.Y82Z"5`ԇbn5|4&GR?:n.Ma-bǩA^v#'m Rաzbm;ՓvPdUgA\ `ZT6Γf_j[gK[ XZQV%6h9g1a-檁rJ*8ĹO*|-cl[cs`2{|9b2x n6&ըvCrŰ0P9a!MwXZ"|,aBxuA /}%zQr`)޳·b0Tv#oFSQ`Nt#BۓmiZ˳F{K&I | Iu}۽oWMXN΂³]ʈ8-W?=$lg >8f|l\rvnl6D&z77uS~F1I^`]|W[k,&))yv[uNg*pqUP)m㪺%{bG&BD x5/8 8\j'q}u+1I pSOF^H]>AZnBRrd1ӦD~h1I씭^aϥ3(9}Uq_w). _X2cz$x5 ; ;R{*"qrM [6aGUvtT`g\QjeGAɼ9tAJ w*sM'Y{iz4inH:hއZZ'xG{쭕yu^uD=,1ǎ.I85Hp6Mx5P.] xpVR ΋ ߭"k1||Λ/:s;?Lvb(98p*@ԡprwz%v&Vq^#=RU5j 1|RͨcM4#-{ bv:maYO',} &[PrKW(^QԓgZ`BC2CO[q!‹r6x]憐?rq#*g|Z`s ~/rqq3a>sK5qs&`SR`QV80Kg02PH>2Bh oUNE ^f~>.D|h &TO$D81, xu?lՃ3)ww ˀCY_ox`ZpsQcMTU: ts~N:P[>hyJXkJᾪ_\}$@>'AWi@vAB|>R&L<2gY.#/dWU~["&UMH2Xb}‹*>FmՔݽx|Wendstream endobj 196 0 obj << /Filter /FlateDecode /Length 2118 >> stream xZێDxV@J6}<B!Y!Af׻2P$t=3]!SNQz16&{,Ӗ:i&52Qmγ߲Qoa>;bvs4m: Tj Tj /{ӊz'cg5aZYlMjƼYxwVwȾ޵< ]NL+*$77Xwd3[Y"~eXJ95*#v]|Y-֩F vC!ZL\pᝓp!<9>F{'K O1\{gŵ"|[v7YcX=1í왐*r&K-#;I [h¡ :yɳBj&¹RlюpX?)yx_, < D"l*S5C`lV%L>H夫| )!$ޔ]o=Y,;߄0 Ѕd7=[`}I|˫0$rj#Όĵջ^ MdpӮj2^CϩB诖3ڙ!fP+>N8u kQqkQ+'0ޣJqN ~k6(2HQ#?ͯ@sן~ǮR"݈ъ  |+:rZNN:i2+9Len>_?vPʬ2T(a%MU 3hFr'KY0 +ՠT W*Gn(Ņ05_J3?%D* 2)Y>ywA+}0i T`Wubp(,֊*񆢊řBoȲHGGV\gi!s(dNIpWt?X TT&l `z阕ZS+RO-lZ#JN-pE;? !qcoπ:>pTcorJ lpHVK~ sɔ:H $.[/%2/zh׳ui2RɁ~hC[ZCVq,ej=lO峲L{aXJ`"5YUTf:WrF "\-7@rL7ygeU1셩ΚӄHx] B7&FTs$ς.9A T(ȭ?K(B7$^%BDR bUI+XAWkM+hԴ7W.x ׂS8RW lZ +ېΑK8!1<yŽDqA'Lxs'=B;'Bh! @TBw HtV ]>VB40&rqTQ) * wTcJA/^I'*9M%$h|dRHe X[d.oNTr4fj Ϯ,Zq8D3rynkWV Lu(GC3a+'gdsOHǥS gv Rˮnja-H>0@.ᯂXi*F Fp֝hop3He)߂v}7Utxeamp&y9~lä5IDukçFn, u@p,6&P]6 MUĦ#x\b bsն2ޮ,)Mr"yrڮ=;n} Vf麕ū_||[b*L:cbngp稶WCDM;_$9endstream endobj 197 0 obj << /Filter /FlateDecode /Length 4040 >> stream x\[ȏ5N:Kb'EѴEjgwh%Y8Fҿ׿яC/Vj?xC܆ԻAUAewgO_ݙTbQ1Q : \k0;Jgg?6iIiI$:eɅj)h= fx9*i8w/S\\9@R5Q xuwV7r2?|6Ņ^jR 5&+Ra=!}J ~LAњa j*A 5ꈙ8-9gLlsvaQ7uG)W)7śa $5hutIHd*x #Ta"4+!wՐ??RA ? xM~ QOʒUJ*jCG>SUVXҔD\UeEeqq[CĶUxeWwv~USQ,YHSYv 4Ŗvw hq]3rܔJʭMlb,f9[AźY\իr6kHq^-:PW_QdTd&d6+!vpUp÷{@R%!=s<̂qF/q^:S#р>7EBR/=A@NJdClU>,"Twޱ̻t.Te6@:4W id9@Y\;#h d+%ax?Y߶cyGS:nU2l8e ؙBXK- ԥqЪ"1vRO.6Юb{b-w'@-|!i%gp OGwJމFio>+::zWlm+{{/~0WU4,FQrXv>Rqnǧ%XZΣyե$v'-{3Lgz~~~%j%Rƍ:)b I+ϱdD Ǿ0BXw7CLZbh]NgF@D}3Xf2,n𧙼_{\M@6"r ?=h^esU{a4asbgXU@+ AfeZ Stpw5 ~}XٰlڠWhahAb{1My4a5r w55 B,0q!%YH`*\2[2)STRI"k0jYl!2@X[Z p3SyDz"Yl]:>.ãn<(Ieo+QxhcZ,擙{_]]cΙC S6a@Wilc;b8.;SDžsIZ!5q=B.&?_+f-2|?WhOFCj$ʊi݃ɀ@"mtзd1Hk%Al[&(>u `Ljr-vWͯ3@?w[D Jз2Fحʰ!CH)t2im||9DL,mFa܆~2z[ezTFے)C lMWA?\cR;e$fC|\dvWV:1oerK-QWlpjxeݧ D;A~A#nm=8).2 {_ н i`, ': 4S6}֡$ |KkL#1 2eiNz%7!3!h$O3B8 Ƹ-NH9DpqEhaIGErQf[*ĖPEND,Cbsd(A&Βedexy}K @ɬkc¦|GR8 'Kl*>@µe;lDZ+;cXx)"ڤN?M d""h!;%EKPDH Q0q1pQS)RqGk HvxKN喋HWQ^LLz]M[PqNOwo!7ʻQk1p՛M=]M$pn\1ws:;ZvMaUuI>q$e<8פ㎋(% ~Vvoiў,ޡ=@OJ.%16ۃWm Q qiJTןVQ]8d®"Q~;#)"6ӝPqNZL9{ j1u7&k:谫LPW?*{GI!ۤy&iڻ͟֏~ - Ç慖+2%NTɴ~bBme{iV'{2`0hiԎ;fP2H&!6.TU7`BgmV7o:le#.'OT"n}cHpzk'\ȋ#@( NTd!trUV|0ه^4jc lL&]xe`B`BA]JʶŸ?|I9!  )Veb(# v=J; F,6w22)=3A^a ]H5= eG}O޸ ^sVo^hXt՘VN֌;nZ Nbѫ}@wXx*C +JNŰ[ȇi<2@gʴL;fBRc(?y'’POOg>ゼ>OPY͸ܭ貞W)M4" [6///գu}fV]\d(If0pÎU"HHho{V1ڻz, EtB4Bv\B D僰7 XIxX9A3gwza'O#FN4h]jrh9&.BbGT1JX*ɃLPm% , dZ(o21{ٳ$52׽^hPco]%URaϘ-bKI[ nee$Ըt$)Ch^B=ݸ HMM/P?x8{0lx*']EpHAAt"l&ATφ3J75ׇA)-BuVKQ[<9׶sL*uR1J6nG)6ry#[W8?8T;ܣU9'nGq2܀;,sN\p{fkq'0wrsv%j_9PO{> wl")q?'eйJ$&#нgW'^g%ZGKn?$'\: atҙ(ܕd_#q~/~2KXn#?gG!.k=̻j^ʔn*^ Fá{>(t2j_AT,}{={ "\:)CL`we/Z)ڬbsZ67YѕRߗ} s'1:Fjf M8V>κ]gOoG;9|b9b4n.9B/5_l~>8)M+Ql(rk:=ݜW> stream xZێH# ?D*q ;ҊNhK|o~#r\^LwWUWT5?Fյ&ǎbXk"Ô$ZE EcD-ѼC3RSMXw^g N00QLIZg/`A̱/0y&w l;xPqmGſ}396;NXF\@L98bisyEEQ㛠F&Nb9ȫdZɫ}Qo\<|0HsS!^=%zm87v i? Ng8(ljċzf`,Ԍ'$Oi[ذӄYrQz-+ ˴)3 pQe YG /)D ۸qar"\{@*r|`֟.:^g[bݒg I>Y,&<,v=&/l].WM*mUvfBp7v|qEY!n'-.hcb;c)˂wMϛB_&Bzљe)d>c.e 'کyɔf)$sL$VY $L+6/lK}(JϺ<(\`L1./l%l4*w=U5JҝAIdW4ȻaaɥdNoQ(n Ӱ 8>vqx^cyJ<\T޹9mG}p?8g_R <ȪxPA}rIGct_>'_1UğOGՁkVyuxXdSfdxW/__ﶦ׫:\!r 2aBվja1Se@MbRF{ts/4,2bz z8}G5IY{CZY(_F"谪ĭ%& D~q'%=Lt ai'R)ׅ`"p͍ Vka#./܅1#erp^dcmIu1ћv{!|)܁}9K= Ch/`P֢[4RU5c){ۂz(*s_ S?b;'-gσm|8[fujxNVgu˳@o:zv"jmk+NEgonGYc _tu >Lk{O+Qz4#= .`+2v>Q*a-מ(θERШD uHgOk2C] WklP W+lP 0^\Pfs7! _?%%Abͷ L+s9R^.eNi ,e)j3/N`̩y;w{P;[rKumŒ X5E YԮRfdQ +Ƅ (0&xgyc-fLlC1ǛLx ?ѥQTw7`4Z&b!oCC; Ia.n_ԻpJs nk9BzjX!EͲCobTrq4 h8MARtNDHq1` \_m7mP?D%D_y,ЏScɤ6`hr /z -ތ,*1<-_nxsT2ҨoV;7k6?=m@u'kzEWf>t} TMl9tΕĐ,vYոM+[\l"Wלj>,endstream endobj 199 0 obj << /Filter /FlateDecode /Length 1806 >> stream xZnF}Z Zg_ )EXE P$VbKD o EJCZCQ™sá$}In/=%1*1LIUPD9F_Sb&qt63aGBwiyXF4Gh(> M~w@kT&w䪕Vr nF+a \[ɺX+.yE[C,iJퟡ`4g|zũh#|Sh4odJq2L) eY°N:, &9&# lGm# C=d5KA.4BߥIQdN@" ;a$"HgADq|A}ubro M3n5ae@hrn͍%TŇ`ܟgø\z巳1qE|V LI2,u[(V"R \|U—y?Χs(`:xENINn޵=i Mlhw6>J VB8b G8tRrIj˭!nB_0QOGCa8vP&{ELYWɜ3at}8*ANx0? *~ bה//6FZ'^du#/XU$d?5)}>Y<, N%">@բ9Uj!fM$BTc\ -J,mT@k@pAA3c#"gwNYx1m7ҥ@\..џ ! DP]W8 Y `MU6ˋ6]ר ]MFRL-dfN mJH43u%xN*}NQ|^ ǃpa0\4\,!hݸ~.܏yej]|C35Binkq@~$#?Oh&;|qZ:u7A:9z-8 ~iW*@*m]$HPcL4J.:\S5 W#*f:Ky\d2|V]a^'_YXX]T!.ՅMp~1>'MK'}t>roh#bgu=\iKr>҆*xEw0b0r3|:˝fO1;r\ 9ÄqڐQFj Wì31Nw*jV_T!f><2ifKE;@ na?h]~JCE vÇ@(zr5eJ)!q_ʐ CRt{,ƐB ஥cBJDž*Lgfoh4;&jR-6N%cwA76Sƅ*0.ưz8$=[0*WO+p-dDWSQҖ:ZU_y`(4m?,~ ^yx|^>^kf$uݥ8gH*}եsf}] j ˩endstream endobj 200 0 obj << /Filter /FlateDecode /Length 1973 >> stream xZYoF~#+ }<ƨCb+CE;jeɡ7:CZ$-`s|3;R_#Fy}7Fׁ:g#ˍ^FIMu{IG40=RE -^@MQ#$宒wҪoauf )_<+*]E#MSopfP8#DVj4|$?O8ӌ|䟆'Z5^>4mp6*(1ϩ2@*|PB0PR UڶAd@f%] 2Q BDe6O'K|6Y è䔅qQxB.BVuѶ&o2>Q%d͔ 3\hᅷ;h^GspLKr9\ ^YKo,BSg4^YHlQ/ d&8v4M-PAdJJINM$\C2!d>/L&_4y&I%!x*ν,h[1GNHnו4 ^w@tEp0&[E @ 4ՙ*+8yrW!C.#h9xC1 KMfl 2bn$UVfh-.YjYatr?f>l0$^ENfqTPmm8]%xV"f$*R7c`9^O&$W,xHUHwey^`q|5M'Ƒҩr-Z3bmouo´G<ָ1. G[X]XZXʃ,@ܵTFBW=wQe+8~P4Zf*BF@AN. = v/ jX]k]xg?z~ˋ2"؇g4ђ.p=S b|WgLʾ.,u;7K{PFLc~VàWA{S]hZ'uVYVo[uح԰*mFb Vn=h8A?‹[߮5 |=?b*s=ڣV9H,_ɡ_QU yT֖] 7~?.nנɊ֣`&(}dgm '3`Daar5hFkG0 Z-w,~nYA];@ד͌W?QGߨ$~==鑿{{p* OaC~|o|?ԸmOnV*'71+TȐJ/Q<B"4Y&Y^XA^U(@OJ5g 0"UHS$Ӈ eGr.ge}r;Ce X}~fJc*_'W2N1,ΑJ%e!RB!F2|ˠմ9\z^>~/_endstream endobj 201 0 obj << /Filter /FlateDecode /Length 1826 >> stream xZ]o6}7#nd`a1`+M<-7V>ZNmyCrL)"RK1y彇$~pzn@iIJ Sh(*Qwf $6LCqzV Iz*!,#HxP"83X'H9O8@,ehEtt dEz;^^Nj_=侅x*މ>o1*/Ș'MNѣ ܲuw}#tlf'yycYݦwtmO6,oKnLCx/(;ԒR)Zpцl%sĺ|w4jC ;j'4yh!*xonlѱNdw;G$7CAPhk|P.5|S5J`k炊2% qwE 51q` S4)$UR!7bdL9_2E7+RaUDkAa' TBΠ!cB&C IBmTs ΀mnPgMɵ~?.:m^RiOh/ҢF'"wYtƹ b͹0%m{]PVYO{Y׆l~ptl\ {`\_&=xIzCYM^C=W|mZǦm$[^-0%Y^? ׅ},?֒; fT/xZdh+a`)RJ~{`!^Q)-Ѩ]^UbvmuB:\A$sP{ rb_Fi?"#ZA!٘f̤Pw1רদm.7.e 3ZD޴5-*YٟFB҂ t{:w5:L%⥨#LTp{[6G"aX-+Pm^h&0Ѐ[xGHh\meؖa)daN _E!VRS<X|zz(xNM38OUN招ӇUq=M?cQb_.Il'GgI68d*]eyM*o#J_ keӵk2~>)_K/ppsoO7endstream endobj 202 0 obj << /Filter /FlateDecode /Length 3777 >> stream x[[o7h: /mE[>4B'veɑ[3Cr/ckױ4bl| +*!Y:c{, pFa'ҿf1M+;!U fU8z{5.y=))$IiP' .Eb)6+apzPMm_&[@% TjY7 ;,_g X wX(@y?nBӒiXɥR8!cXx瑗4`ni+o.Og|tb¥,KҴdR!]2k%+apjE+w!_հ+X:V&XىE&R4-1Xn)W]AMEd|]}L16) p@9k/ݡ62V{knyh( y"0qBB]P/S-( ~)°@~QX.^g&WXu-uV#2ݚ|W$,W(qp40Y_7Î"D⺖H\Me@IٴdHʬShx!I8K9u"T m(u|,Ul& 1x Bc_18'λd.7DeI%F勎`Xhjg1YdR}3kX9O' gE9YY,)8~ N#Lms94 U?l`k ȭAqp+۔ed.$LdE nUfY 9vx0Mf!H:VgXe}kLϫq'vN^w?0D)nۥ rAx=4h#=ev }-"iS4j2;)zæ4A؉ tϜSw?\╪f80#ALwv# 3uo@A^E 3AINJo +9A| I|9L4@?`${t\Ԧ~((t@y:2Fg:zA!*2Yj3,$ݺbЁ BgogۯӴ(M,qqqKy'K8elq)>0֡ cF).f(@z;)u|#? tpe^I"e@d,6)=ȌZ)94:)b! ; 5ñq3AIu8K//q$-K"֩I DT3XoHPU^\!A;R(-W=؋h9 ӘPIA\ =0ma7G`RAv|?6y6qu|7]@t|Fmt_>#s l s? hS`~dF!!HVDZ&1i4Ofp,Zx ,̈́B!%z|EKZ[&p1'*~Jh*ǦmNSxz!WS_Zlzz?85v̡ҋ#Im9Z$2e8D[>K&Za#o&hrLbѤ KHlIC)p H voj2t޼K (S;&_w-ɽ[:Tsn ِj*NZtyW&V ,7Q6$ޯ['" sR> %t)o/I4GzZ2pggV&!jwYUWZJTz$3V\ I*7SN+Є{U\lRQf}K"/"T\Nc{f6׫5@ЙҲ at*dA-8@eA%7&>2g]`m;{7e }U"s@rQ}DũK˼O@!Y[/ƟTn(˒}}D;'XwYw W?-9>{9FUMf|5kmN`0K@zSJ#JRt!D^f=1?m+=C Q!9!D([`pgt4UW69Q?A)cPGՏP,y+gemvbP9Dao#~)'/omb.uV][ zd)Q"qOމ\mՌh;.?N~E~R5tUO6U,9w2fɴ޶Eg4 nrc:C(~D~A~b^i#՜ 9s碩jhjjjp fg;}D#>a|ޱȇapvrb&Ck#Ke%d˳:k=t5)Uv:دAR ^ێ+2WWJ6Ҏ?A1yϿ~sN/47'ڢHBOtx0'FgH>NҾLWT0dήzDWc%F5c>/G:.U^WrwMB'#rBFqk>(NJo\yW3E_m 2x5mn.t& +.>;>'ښendstream endobj 203 0 obj << /Filter /FlateDecode /Length 2125 >> stream xZ[oFQAd ts$KnwI} KVRioF oCIA`Rs9g!Gӈjpqv~ ZF9$Ks.mz@q fR7@,i$ VhE _97Xh4L -޾P?(3]E0{"-EA,Lw9^ Ôb# FSh|GLLltHwA $i')h ~3_;,X*M0gsXs Zc҄\S$lunڹb1m5$UhPiX+]~Ml].^V0_l<|Y * PenQ!B-(ʯ>w0eLYfQғU" T M' _8%"=?mP˜>0xJ.F ݢ (Q|  "P#1%$Hv2T; ;sa/n/g6N[H{E͐i1ǀQ귄X0z~+VhV}~+4y~+D H3;6B~:swd#ގն9ӌg=cAF Q4;$B+<]OpCkQd?/ge"=k>Lm65g֡m< G>x]Zئ;d~cz_2,距 y!'^~_ٮ1]}tnndaAG[<Khlh)CYuBr+ 6[&l &hay1z_1W=h.U0@_)*XKle],u| " )x,IQإA'R褦PC5M%өk5D-tva|ЅK5:m*qIw4A@s0Х6=6  XO?,-o;<<5DހqNT+.fn\ lƤuus/O&Tr1؝ Mh ~2v?@ژ>mV $Ւ&D,,~֞[PRlH VC^70hj(rσWsC'\GsC3N ؽDp"1Ξf s߸w10깲d.鹲Oߒ(0`CKT.=Y{CݖшsDHe?05nDcxwG +c+# 4}>&dpd(zH6?od:dy2_^3W>iuI(H Ur6C 5Э4_HP. \> stream xZn7t%/[4Y`@SGHBƶ[r}߾F?fdDK#Ec;9g"_~nZxͬЊqi.52>ٻl:[e0~zs2u(<řg'YkV;iU?0E]l ,s+#,'o <媳}+.K.^! &DCzrWP,擇l~6mjfiRoS.2?NFwM1_̦\+H/`Z?Xt1ΦClQzǔ@ TD Q] euoKq0Msl/sv x1sFWG7 @#Ecmpb>l9C닸+E̙=29-юBF=EC'&!Y dym6td))Tx(qahJF2;!<)I5!l@+71O~)mvj)\)6x;qmJ~[ڒc6C(N:$ЏXCAQVvD; D'-F>U: 2Y,Gk6*+79G07;U U Eqӛmx%u.:ZeGJD`k7գ$SJj!^'+rX{YAϮ+ItNi0+|+Iv8D%Z(Dxȩ1LɊ6'O uCLj0yPuE >.m,LD~5O2^$+Eދ_MnK59%Z-NawHx\ %%J~(t0 $VD'*VJB i6 E IVP `哬X4R$NZ\2sAl:o?a9kݪjpuvhm}Q)2e IwnMI eTDpڧ0r-QyҾxZd`ׁPlςxI@zN--Ɠ 6ݛ]Ĥj&^RilFG(drZlZĝZtj\jw QapR.<sa|U,ꍝ*音u} /~Zyq (I~&|j}1wr3 ƐE?Ꞁ~+^|51]}LxJTUӡjgͷDޟڄBendstream endobj 205 0 obj << /Filter /FlateDecode /Length 3472 >> stream x[ێ8GNa~=qİ;pvG3v߶/{-FEI4ޞ,l`5X,O*o2JXFտų&_]PZ2ô!Nd EϘ9-_(2xKp%H%%e l-Xg; !%S(悕ʪFkLL E1˔% u8'ZU%دKšSza: Q\r"pLv} 0F'N)TXBBM>lvG(wX`S+cr讴5W4j0H׿o7 .oK5N[ -üp^U-Uc6m ~h9^˪00VʯCC%|>MD>\olƳ_ŷab&of5̄YAjF݆Jt<)/uZgm=-Ƿu|~wC'eh>[a>aqmFcb5^+O*]B+a q 5RS]t{CE. f1rC\Tkєk7x8!?|[Z ϕ&4er;'pVUVڡ6 zcH6A#0'}rcɬ%6 hi!߄q1Yrc jmv7U)+d`=9o{M!'Cyb1vUdx K坙~KG:2S;H ӛT I~c< kYtZ&9c߲C E̟ʺ;H_i YׯQ2<[;tM8?tqY~B΍㝄rs3n 86<7ƑSeZpTB}qef{2XTf!p $AdVV'(& WeV} lI-ūBT (C J:_ll|1ʪO%}U(`tB 櫤 _g5UdY{Jy> WR2/RS[I)Y_p++(@U>^wbQ,+͘4ݖ[cY@o+MkiS| C8x)jU=i)e~>ϟ/fsyiW.%+mvY9}NÛIldp[ӫ`*Y{X<@]"&^UH)VuZr[͚B]kJ(hc+YQI ]dуr|1kBu&948KMWLwJ80+7-~2ڕ_M4ӊ@}0j2_.!؏Q (WyTiIi& IU-IQ#)I1#5)-2C$ɒ o*,a8.-ful+E%.ޯ=pOb: b>)%]_{f2J6;Z+& 7u[8V:~-f.et[ױu׭Ǡ04^O/3 l?)3ԗ7^2'E\EG5p54` D-LVKt 2Tl q]-X y,O+ ¹JlL'*&#GDG&W ظni81>H"iކjO} FbiZ$Fo6O!:uj'Y+ЧӐT|$$to+_ `Λ2fv2Gx$%25RE2|Ugk!X2nCȪ!/D !/Ԗ7KYzGnH5BE&pKÂP sMK0?T؟ 4-^X^Ab ˬo$UkZDåw8αjiUhiY+Zr{zkDTGu=%Ͳg8~F~~s;ٙXo Q"%l+YI-7Ų,&pd#M>N{jb,nB>*]J *vb͚G5op@>2eT!tJ wډtb/"فd{@Y.8R(pNPqA.M!P|#(= H=d',wU]>IYo"fXk!+ô5}.҂%fYG!2vݛO`/?$pS/ŲX0IM4<" m4cBFغ|}*'4^Ƶ_caMӢ *PNgFAKUMyaqxߦ$吮WևJM( <G"^-|_,[x Я0o-k/Wx .`g Qv}o1(O'fI7s\+$.- 0 14q[/M@~^O(lT5˞^1MisGэtF/m͍t__HǬtpp޸D목_C.]:7${AVB7sVy)=]f՜p޺n X}q'>djև7m#mz's6ř:'2L\1_@E#.+8hȤj }}:F w!QexKޙ.WQ~ŮoE#}eG0yTWjcdv 5o/~5~yJlfwq ҟNww4"Sczϸ>?* |[Ќ%/vGJ@T}"e(a~8YM1\8k ,5UV=JnЁ"d0SPUeC tMSi/(QFśg9 kz 9=#X_-Z 6p-O+\cf0O۰HGk,ԹZ'\W1h!߱G8&\s7Guu.45.%E\vT8?A[~ܺ*~'E(fB}LpjzX=ljjf8#eb9|yl1mW?/ʊ7=$ OKbrScUXWn^HʗʳJ 7o *W*_ b~1}s /Rendstream endobj 206 0 obj << /Filter /FlateDecode /Length 2979 >> stream x[n#}#Mm#.Ie 0de+#K]f3@%HVmuۖAK$X,9U> )aC 3 > sZ34LPQCf,a r@s 9}Fl6TDJh()QlȬ V#K0r 0jsƿ)i M#Nn L $\0=4}јQEXqƩ⫟zF?O8x;s JiCr0a3Kޣa&%V$!Cv0X"JS% xP: (Ӻ݌JwQ["ތxXNڔbw3_GCIj[rg03t)ԥZ&^6FȆPlwz>]wzZ*Sk1|x,O.lwwe9PWuHT?R*>OS֚K '&+*&W$)Ɓ o͍3z݋uȠ&5-mi-#dr'XK(N 70]Ωmф4y)v?udхJjMgcN$|q17@A`H u1(T(#)vbwPܗۻ q` tMaR2ɝ8Ib]e%wl%Xh,`Mt_LqUnS׆Pjn.yٷ`x{WToAߗ!6^b8CE ~! wt킎(vx*,Ab6 8%>3ͨ'H~e0ޣLC p:O$Dg]N0Syu1݂J5«߮.hh.P`Pnb]Jsh 4<;dĜϓDTb9åRTIP ʕ |EsB9Qr:9:kY@*XN\I`Kq\hB0oьZ7=s{V,\?sxu/f3rKVܢpQV V.B NSv*'ҸE]kNq, >@e>@[Nkg<鶸1ҙv]aڮv31wƂs`Jb8Fkf?t,"_ JjENZ{4嘯NڅX ҺO*?'NZT?#ԆI:jAnFD&<%tO@ d =Qg{O?^~SHtu7I3Ԅ̩kȚM_-dv݆WEd-x瞌9/ޖ'|4&F3P'.P<rë2 '1UЭ@ZյYm0 Ա OBS: ns{4(E0I~$/2g! КX՟g'uF.x~eSM_f\$2ܜNǮ[c3U~ʡa%77jȪbWnuuHzױ_ 0]g6* 0TE"-G-.|軝?ŏ% wʋUS4=P 8YyMKV_*Ѧ0L N9Lۤ .X)fa\}s9%Pzendstream endobj 207 0 obj << /Filter /FlateDecode /Length 3128 >> stream xZ[(GNPM5˹$C];%i{̽(l+jycfNx1go'4)dj4V2{Zby0{/&͌r>j<]ii_FZ#c[ÛrkzrZ541 Z>_ͪ ^/8Ƴel f搜׉C<-W u&[L-v~:񶛗Ua-!̑nN@IX3)>`LO0Q(lBr[ G h*b ):<yh0Lü'5P]\bW,BXl|H09 怓$?dX-tjzɗU$eͰpCtL1D7StJ' qJ &RяڙCk! [<Tf0N`!qO웄Wn*v6ȲWY3W6-* yAF\E\ BYrξx6} r4c8.[/'EJ !Ku@N9qyDiRֶn]P*_B$qDptBQ'Dn:fm a]!_q6o7ٹT9r(gDwU7̥0 ;"? =!9a`HFc GvUZppE -;¯?lfЗ[Q0/ȑB`Orgtidp+R!^f]QUWe*ԗK_4ʨr~zBOҝ;);t,?/`Npථ , 4\|eZq3eeAJuܻY4P"[Sueל7Tj@Kwy͙?x" N?ٿK |x 4V4F}\GloF`9gA?Ա@.D" ڬ¡vKIpd]KIk%e8} JZSQ>P}0Py}v>*ܚPw`u 9W*߇9L CplN'zxI8E\v a6M~UsBnOWU|@9wBF3*50{[ܲ.kR>Z&!0Eۂع9WWbkxPB *@M FxPnJ ? x՚@Qcih0.~8;v!fq+(+c㱡''Yjұcs |:`1T0+r5!TA]_!d$=M?(5GӇ@d8@=R%|deV% αsv/L}HM64¬ 8O]N'a68ʨB#{9!QZ|"w!k=@3,Ś1B7j(~:,=?S}by'-ꆊF^U.6q(6ccyO _Oe%FD W-H&\0q*i(ifվyiL dMS;۟VEh xQ0(w*r$5}xd8Vq{'%jOL{3U:")bP$MZ˱PA`.i!e[ 32o(RjIu#:ivccZڋŐpN b]6w6z۫".$Fŗ \=qҫM3f~ĩ]u&pvk(umNlY0Md>2 z,n*+"`ߐ< )Ҁ)l? (ˬ~^b'u@6?2K:,wt l`62=ڌ~1dXC0.woO7ab1;-oy)S6w H+ogUx֜>pʫ!;?\n!*Y H[J}l'x'}08;㾈pA|}7bS*^> stream xXnF}[ "̾C:ݒ&Zd%(T7zgH(qssyLbDlp5bcte@.䁖 sŃ4 ^E0`:݋֘[ bmP,)lD l "J ~(\ [*い?,hϓ+ P}PDb43h:(BC)0T lbp2bڢ4ZEaMILE8_I:c*Jd8Z5-CUѣ/J‚[I%%yT.qVsZ /4QڣY1%1vǣzʜT`n6eF-B7 S El0wrt BF)LjRa6s_w2k ,^2 wW$5*RQ_PhP}y+x m owmCde8YSXfl:5t8̲el׺9L(˞&W.AãP"zG6e~[/.`pOqNE I IrJV1{HH*Ex7:%bQ^ ?*X}y6:+ɦIoGiUAQM6Wa?/^>qo>g`h˓_{Qgne7G|R]mΔy"ǵDþ6.=M?ѫ'G RgQq¸7F qbkoD@v fH xC D\P4sS*rL4(@_(V v,c-6K[DC&Yi(Z&xV$v^DŽtjݤ4 2:PLV >­S8h ¡ (BAba;ǨU@oQP Հ_݌]7B1g%wkuZ*fp5v/8#cAau5D=nns6vZ((NA9t$C;tmh$3AZAr\p>˚Yo:IVʢ/s,Vf}m%W3NJSC~Za}*c(ڎ}S3腄i-Mڹdj9ګf@Am=%!vC$/PVQG˵fPFpL*Q;)>>rꆢV/MHCak8ķƧ6ϖNt`Z_D%MtGgErR~\HfJT+Rb-d"J-mKmyI愞Нep^[endstream endobj 209 0 obj << /Filter /FlateDecode /Length 850 >> stream xW]@}ﯘKkdvL|؍uB1Ɛ.VBR4uP[Fps91@NFWsAẐ{pD9!<((HR"Bz:Y @ bqAQaI~R& A▜Af{crNiS$%F֪,pX0 ?MO3G4NMYRFQ$4ɒ9xga" > stream xX[o6~7#@ayɽ%;`41V ma(6-W[%[JҠMlR;ǀ`_}.Vgg*GG 82K,yX `="¸1F:Ay`IƼ,\P28 Ձd$ ڳSk%s@G'TUp2plBt0q !j49TA_'f(M‚(ɑuc8g'hK\0B0h/;?~\>fC+Ɉ޴ t=Ϣ^bhݼ;I$=;+ѕ_6Mpmne'ia'd{do~c<]JwpptB]ؤ%dr~6=Ϧ\z}:1=??u:$>og5b[Y%v0mv/.{tqu0:tVPvNlySWh5=t[CfpM8h4'.x6m"Խ-HfEyS[H5;"͇JٙC^luz9:bXG `̖ Sg8fN\i-Q$ 0\M( +/C`b Dp`εc`~484]: 6Q4%Rh٨۠Q2rU_O:=jP(#b@麈u^=n)|-m tA# a61@/bQb#bTvy Y54\ϔ0$5 [! {f&B#!35  Ü 4/fT !T60Ímn[}0hg]9)T7B |DՐq+UƍmGqbcc^NN֥3M`}Tk]:ubX5I?23 WW^uY&:ѓ<)R'-B18yqEBHZFMab7&hXnvt=Mf WO" P U[BO1Z;&;dѺ\^h[/fef4ʮZBVq jʂ8I|c#*/k;!&nk~S2[k Ze/RGœ~k0.Ѫ{-N~R1pmBr1iVj(A4 F;rWU!`%km-4;׸*t Q9AgY7CBDew;G%|5)A!ǧ6%/ g\b ۢSz1>_,/8DB^ ZoMHd/3x-Q _3Hpo6i-ć^d(supїڵBiiFz+ua(Yi ܕtTJ˦랝1~/}5Qendstream endobj 211 0 obj << /Filter /FlateDecode /Length 2588 >> stream xZo~7Gj }4h4=m"H%FY.ERu,~0)̒Gًwnt]}>3VsgFNͭLnHSU>hy']; \M%uƍ@˵qd̓WNB F:2XLĕҿ NQ:GWgxMRB.ݞj]d櫲X/~?{uAҹ^S6.FaR(n*Bག 2FZ"{^NW;U`IadOGq|ZgIi(;8K*R&z1.B+62Y<.x!]LOŻ__=|o~(u^<2txWC. Lx0$l2,OnUTųoyps2hiG3#*n9eiM>> 7cwXҥ5d,⯁]!hIJۼ)f..c# Ѓg>s}+L)0:MR%)N`z:Yҍrغ̛a޳h*VK^O Aꦙƴ4ܲrZܥlRt>j- 뼺IySOfbC†pW}x aC;9ԊCrPA-v>mj:y jgWS@۰6@3.\H^"$43Fn#'q> "5F޽} 2I5/ *%(.k 4~@|`o֘ by}u@8Dguѱ+s@Q: ^pyYWʘdE5IfEP,]| ?,,oJ?=h9{f.UҍtuR5U-Lz[(JY>)1@*Njm# 4VݺwLk9 jޗzor@Pѵ]I2/e]Qb^} b^C[^K46Dlj3 Z6Z 6秨S\rjNkEK#Zm7rd/*Aϗ6bY?Se9STiJ 4C:djQugLy;[. e;y9HR$ZᲭkPBeh5?ܶPҮtuʛ{Imݦ(uº##;UbhUO퓐]R(1hGD[Sӹ,u[WwV[{!C|D>uu,soabc GxMܙ6JF[W; dv'l G أ8*ȗ۝R(KuPʽeX]ZR A)zA-uJӁg1ٸ-`!``Њ4=?}:}Pvy(Hh2Mp  (x2Vior{߃%*L$Ъl^[۱Chp\ ̇"NF}_ v;-8z+P ?G"~”M';;ҧsqNxtۗ8N ;-K/M|u>>5tȋIF/.zՁg;mpk&ev5\:z }U|Ҝ,_|k}ucendstream endobj 212 0 obj << /Filter /FlateDecode /Length 2332 >> stream xYmo~80*t[ro b H "ˀ=<<ؿљ}'Jv[3~LhL/~R-EBLg@"R ղ^_߮,,5IzpLӥHrTS kQFW"I2}wϋd̩ZY!4a^N2*!w|8 8KZ3G^6}q>(-TI6Plnks I"HMw-o }Tg30cSUEboqe \Nq<$ȵM[n,;4C+rIIm\BYԂtjrj+E^6|Tn3RTUp3&wOE@w&F@z`Nm*-۴o`g?)QV`e3i'gS襀xTb,uR1(a:XW卩,uEI<$wE?{L ?Jyױ+I %ت^<謦:'Z'ȗF:"7D4ppni5+ĩN*T;{Nd:fp j xbN٘7PlyȲCRE;ͭru}]gn-aCjroYGUdSԑMQw] 2r5d?47`끧B:smKP9Ͱq-+W25ܖ;!rn 4$S3{l*~8' ; $Key>贸_ G8TgGmy0pC4~GxiGND?(V'XC]+cs[Č`C*c&Sە a:ze0 ʶ6;:dgG3QXZӷ%xagmj}nY]5S#;X`9l>:(bp\*X| [h@M>ٝn@PPUg,֡;cATMB^?ԑ|`/lSsV &LFc)<4WfS@{<#I'io;ڨ8W2i`q*MQ}#Cspv0gITv>lνhG=SZR鐾}Hю%Vj*Z2|dy,ZYL`cmEdJ{::l~!`Ԑ5S%$8p+")$,w/8y0C凍aq#O)=g)J,,177NYw!Mi":}d͵_92kŠVL5JJ_~?{oJi~xy3tiO A k0Z]OUFXm{9vnye|)8u cd뒉}88u J=8F9 |/+z;cN HN]uGy='BYE8|>Y *uraiGq'N/ҺƿMWd _J 12H,͗+Qn59>)-.(ȋsnUĢ/|Hw!r)`ǍC- M9 lFaD1|%NƸ@{T\ǢEaTwA"=AdI0D0; 9%SA/~^:endstream endobj 213 0 obj << /Filter /FlateDecode /Length 2836 >> stream xZ[o~#ÎxK7  )V5 ?b?=ȟXNa~"m~"a%z7 ĀTF{J e-KNRR%Kz]6-2^OH Qyjj}4:(]O,boeo= Qhjхn~Ŭgfz2((*ۥۅELENw~q؀yZ F5|W-XbaXT2_) I{WN +7GfRZy( I6Duf +6n7(y=ObAcGF/%.wrL'=~8Ѱy|CkEm| +|?oGkA8R3 :/7 Y8R0^ P$mI70eeTC2aM";> RBv=Q/];+Nsq֌`*= FN /ACΙ+xWy~?@>LU}]=FMNAxYE22bt2-ml>#L=`HqN,6vq SÿHA@^:u(d=m4?l~GU }I-ĢK#zO+aDUZUKP>*F`Sly儃Δe~̤CN)eӤwf#ZCq] pzON/6exom-=l7Vxe]پSFVVbkj>`t+7Z7\Mޖw#%o >t4nIjPF/`L 7>U@wtr9Mče-\\JPjׅrI]v yZ⾨1pE#5| 5]Q,E(K9Z]]E q Zw:?c.۬>EgPNZ`R7tȓorh u _ qBQ]`7 B{L gO'4 =2(R8p^/K>^2g=VC*5 2$ߎ*9rrcX,WS433dC3+kLBЏ82Nj852a#X7iNZ BT\#\ftGaܳ& q#116GX=!xyztsn'i­k15e_g-ӠE>(" `گV.J|QT;~psV}v4{sH?trB`wy-3Ā ZEޚXg杼3uQʼ)m]9v}E7z 2QT,&^af zo-EK:2uCzXB ^ t¡$' BZ鱘^SLvJ𞿌8jYS@wG֏OkWEhN<`e@M(=њ 2unۊT ezݴojdf\0y [N|NDW6{9S`f^+k)'Sa o]jQbc?Iwc -vsC[%wbB'8Mگ J2 %'қҭ#BCtu%z;>A*.up?j)6gu? endstream endobj 214 0 obj << /Filter /FlateDecode /Length 4166 >> stream x;]sƑ..U&"`s~HlSWV{ %WK+.1#=3kI'>,1===fig)/gfv۝I+!9iDC,Sfޞpi~{&6\ͮnP>xbd͌PgJD2_dimvZ%l4odǫ?}quY:;qICTs9,\v.W&\acTId7m7߸&OS*wmq[a ï 4%jjTت.W~cY_\oinb[5[DpV U]#`+: X+~<W!vx1kW.\*ǬߗaSun@fW?ɊwEama'+p1}@Ũ|(k1>50ڣ)2֕E\{נ27@ 6;*m=cb[#`TDaI-UزXiN"Op@˪Sdۗaъ0W_-,E-$=G bJVup#5?˶rH(hou:"s:?dȸc\j\ X}m {WWQz0 iuw7 mXkجUw=l[pn [ejU9rp/][㑒F@7M;qȮzޟÒ~{6(M:yCA]0?Rk`Oy=( }8_ r'r{ݷB[SXhM'F<U'd/AU˽!MmJTY\̝z _T'Ҋk3앋o}=&DD-4QJNq j٪)!i9^HİLCi!{vMۓtk΃xIM CmуVyB".f߭+7G%$j[y  fWUMM#/s\S h1ghE8U4݈uu{?ʙ;_AVkO_GK/FY,-CK]ŐIl٬-g5QVig7I ॹ 1J;8C,R_}H1iֿvȽЎdyAѮ &^=\troӓ*n'J+>9#>Bİ36 s5Z)CްgO15By~~Pq |<ҁ' Wh&YY-C k`L"Q'* PA(rW}q, ϔMdA $D7Ι¡ sҰ’ʯ@7քbͮ 3}As`wSV[+!рH`K9 vܕ zXhh)Ķ@͐uJuٕ{, 0[ZI CPD>zdQ(W v5)Ҭ ,s,|mP3jE)?>#RZK1۲ ˈonߕi.!)V|X+BFėm.YXiǤ/)Yݦb1cGaґܜvӌ9r^rI y䈁+F)QKW|1_@E7M;) M MA6G`, '_U5ݣҩMRUꗹDJT[A1֡*x=ƍ` +v}, l\t!@L%PU& (2ꕴz(JkIe׹>N=`hLBVf$6[ǬHq=TOOA\ 3t@6+D'+&uKԓuC)'pJ~q #b)fb8jKiDS_~C`0 Qs4SLC߉'r7DL "&%H2 KLwB(yF}D]<ƊqYHٱ3[p 7As?)F}>9b)ʕ<%1ey>[G5PY3#Ziy^g! O%w 0v=:Iif|#qGc#}>qg9q-#E;!%_\tX6 A5Z$HnAE\r0_ ?$OspPx =/Siex93D]aI뾊5/c]v:bmJW5=ոR]K:Xv2r3DSlBɆJv҄\/z6PRܑRwP@<pov=k聵XқCQ_ckʶ*6tR|H%^a ÌkOexkTs낊UxFo*!#C\/TU]jF(,ŧ*$H}M &a2w@]#\E;3c݋&6doWrαjEvŪY^"o7rjp5,5QO$ #b$Y7qăb]e[AeRצy맼I݆qI ͚靺?ٗ$@)ztvyl3h:Wz[WAfe1cڼ K)|]fþ72P)&RIoql4bt Jg- uwO宬Wa@[9iѶQd_vs,8> GJg ;rȭ|#`x'$*ႂgЪF۰ ժ{Ar;j?kÅh`slEN` Dsߓ(7 <^A3Ґmq]L" &,hlt\f ṅ2ťw|ߞ.|endstream endobj 215 0 obj << /Filter /FlateDecode /Length 1752 >> stream xXnF 7}lYe 2tC&Tm+ґto7B" ' RY#/4YݰJ3{\3) 2)^w_VɭïYY_Xo+JbH2#f#QZp5uiCjIN>|$coq%)㤷;l~~z]}J/4ڕ-m)\L{wcWt5\&{X|-`Q$'ilqЄ݌sn|F}W{ty]A\Kܾ)1nqRciPrӂ`1Jl)!h @.G4痀YPA/rNqQ89Hg?:WZz!BJRNc~g>`oxIgvǾ.lB]$dk.EAn"C۟,x'\іQ%'E]v5]igS!4WWQ_ypе# a˞" #?Xum^W#jV:<`Iջr-[i_qvi!/` ^ t='_t]mp#!A%*@AEvRR_}Jj  unw0#q膡U.lkG0j|ڵc_A5BlX#j dlaQeb Jէ+^}q>x8V.&PCGd)0 H%IC2{fPL,`S *|iD'3vۍnj̀qv&WwlPK_;=k8h_ %"-:;c@]Zɧ,N {ۄqzm̓UBU_]3&4ᒮ%˳99<߅RDLR-`exjž I;I@>n2)-&G3qBDK^w~=aڽ\?l`vU$.!oi00:{on| BAendstream endobj 216 0 obj << /Type /XRef /Length 237 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 217 /ID [<0044b56e53f213f47543d5e5199132ca><3b59eb7ee0aef81e93ac46bc72e499c0>] >> stream xcb&F~0 $8J+?M@6CP,+EgK d,;@'X "_H\yD2U M: "H<ɽDIFv" Sd\`\`5.H0)&4mV3lX6Ksn"nH` DlKnH> stream xYn8}߯[[)ERE N48IIQA[[YJ%M;C]L]l+,0d:%N "ňIˉE8M#CLC؞IBeg`]=P;tO sm~_Cog*Lq'W1`8=5f'lnK>hiCBP-_^N}vf(FmKI2i8C ߶0(R ؂Ei3Y?>d2endstream endobj 29 0 obj << /Subtype /XML /Type /Metadata /Length 1167 >> stream 2021-12-15T11:36:26-06:00 2021-12-15T11:36:26-06:00 TeX Untitled endstream endobj 30 0 obj << /Filter /FlateDecode /Length 4859 >> stream x<ے8vU_jԊM܁L*Ğ؝C۵Ŗn%Q$F(E_b?48;|d)d/.ީ,K3) 1E0 \ gĎ?%JRC5\NϚ9@T1#T2>\]%,D+Tö0IC;l&,T28өV&;.;pjf2d2gh'#&U4m14)@LO,jlp3q9l'@ZLycӻzL6k{?-ql,ZvPG=LïդwzK3M#U"c Gk],my, Iq9D@~s³Mo-`} ا[wx]AaXo]T_f}WdCðŵ*jYЧ}T =UB-XnW?)j̷O-}?5ˋh M5Go1bSx/Zo !=_ bJі)0pf?Z/m O{Q:ݟvX""Hp F>V2c(ju.hHmq~%2JuaD VK}&ȳؿ"Ub O/XJP N0 QO0^'>lq2W?.߽mt^t T}zKܻD1@ aq΅kҟ2}d5VH{ĆۀFnCq(ai# CId ?4RDShV~~J AcԱ)*tZBwڹ!@ 7!1m"zקb0ЦviJW[ur=[bMK}2.b)P4.jŁ{f=b{0#բEg⡩ŏHHk5eV3gi1 oɧCMF؄!GU^)if?EMjROlO4#YVцAye*,@)݁v F2 ӥEΝ@ weRo}[F 9̌{UF"Txڽp\6*fZ6Ru(.ZDA' n^D*^,O+bBϿ^`,H pG:k`aeFSh~xsoKhtaH! b L?Oc#& Hgq.'q @q`*;~@rY4x^Iħ36 Gt-fŗr}HV'8rFRN7Љ%;tTɎL%`T.?!'F3{ ڤȞ)0[!)TFPMóȨ]F5Ig=fy}G2Y>P!>DwьQ,E$bДOGm*OM:yZD3-:c,ƟhK!~o:*ȸDTo=H&Sfn+B<!e딄Js Dmh $`{]3/Ik`RBUp2@o?E#zZQoGv9{!bHG @LyH2IO2ʂw!֋Cw ѤWǏ;@0jEe~@mj>ױds3@?LȜ9IL3rysb=KԼn6I;V7mrN!OE}[vܠL [Ed$)P8!ӀnM[Ӏ=--WBlGG "Oݖ[<5ͰpEuB``d6bkl>aI7ܶ 5;̾ mu\X.:\of12h6h46uZ͞PO.Q1-# [G cǾEd ,%5:c/5Q:$m-7w}n3_q̼ 6[M|n 丒~ Fp6u '$n~$}˯oX7H9XW:3<ۻqj;_ 31( 6_q)fF^{q-u8whMYC0-?ZD3R@H:_fW1͹_/T0ŭXz-‡$8Ex4c?0h"ޅixmd[nٻy7hHd(zCQ}ocx,I_,ɪì6M[KSE3$0)^ &RO1jXvIZ8ȵK^G87ey3/4^HUz B.1. mcȒww]` @ eS& nf3l&[,zC 1SsETm\n q$핆#YHH3b|VqMp_q(^qsH!0 9 ell'/[>"ж'0:_ו6Rt6&pe&vXY¹|]TӅ$oR7 ?kendstream endobj 31 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1857 >> stream xUT{TaqfL(*Z jT X"(A 1JyOe]ްk  HژipO='5;Brg~sw~ߥ)o/i qIiyEas37a,ZV{ɳU0g`)iQf'l{|T1 S*~-#=ٙYŚ%+e{4Qش|]QN&-/Cy5_\fkiJjM;R4IщI5 I B'u7q(jz^T~ڄ9Oͥ$j>LmVST "%T,𥼩,kz)]uj+]L2le_i'^ᳩRvcT Tk~Oo#)U R,KB=QBm{ʙ,TP,~vs ;Gc3ݏ3K Q$錱(ŰFk]K\cNeA#b00p' 'Nu]TcjjO ث5mjek-ZccJB`>,p ܌V`1xԂU铮7PU>,&{ygEv*\$ M=ӓ er=Dz-df@AlLH[.v8yܩ*/T=u:CYD 캬I-"^xz AzY͕u݄<읰% !;L o$@cES3g15*M`0{oݾ Z}skI_5ښ?ꍵ{pl,&_…]?0AǥxKt~ (&*A {_G=kysoٴed"C9m{"dD=$^8+Wl:\|q|vJnOb/@$ ը U|G_'Hr ?Gn&7VU6J0ސo@U8<=f ]H^tܺ?nPveF0hF1F Yxڜm[^)쟵%/H,%#7_ɓrc)H3:yad mEU뼍-##%jTc\(IH,w·-E,y%"կ'3E-8hjfް|{XIqcjG!DI"IuGGzJM̱T;LQp֙jڥ{qHY 07iJ*sR %K8g$I[>L$d{#k܋709':zpzNvBH $hClKQ#8!OLNHd$i"gܶNzbq:U>{WqOՎI G[ bu8U%;74(8bN72{`7`23)\:yضֶ'+%gZ|Kr[̌T?+>z}ϳGl6RkY>>njRNbendstream endobj 32 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3264 >> stream xWyTSWE| $ -[!+Q $$5IX`Y *-JPqE,.T\@+ݤөZ;jt<3̙?] BI$ ,K|aKF]6Y!^t]qaS"f%dtEn^4{#>H~y%v?/y#!p„&YL6OvHEa [3*5WxFū:?{aKhAeNqYi:U U 6y]W Zh,|*o1ZrITčIek-2>ÜjytQ=YW Vd6}=!Ei֚<ѪIz-ZdQ%z|Ϛ5Xx**ISZIj#z(Y4!ˢ5d}"oVeu*Suɤ9Z-*:?<ɰNj9o)FQT8eVXYi6t:C6~N2^E!Z0Rqj5 qbjx16>8.[L$~MsP^#<%fb"`܃BD+-%FVu° nf8'8stFIB܍'gc?sC4`oI/apWtcَ!"p=ZԓءnP#G`@z)OơXJĽL"M#""'& }ꅓWN{ ~$/?}uĭvn(l=ڀT}q/Ї Ρ6tCYW@{ G,e2/Gbk&I"I‹n!Ȝjq"bЧ$> G䵶* #ia8Re3a ^kuI{[ XpMc={u[v2JJ.hÙg!۝[%0\]PpU?`ϓעf\J:H.Wvg޻=t6\f^8`|],K{w -V&D[0ȗ%,FA(JUg_}&uϞG-EUkXH^S&G05c\)k-o~v q RN⩓`8H\cp{~#.B풎gsAE3f0~y-h,AIf*p縞Q+?~0 ;%LW>!Kq0 }Rf#LXXR&n,݅v_k.0;||b^j.W#&4Ê!*9~EMK] CtTz9>GvG]r  W9wUJj8᪴*98Cz+gtkUbɆa)lwKT)>n1V&oȳrޢfI-0DXMH5+_Y]Rܬ)ElU!93o/f~ŜZs&h1]Nu v+k:.#9+j(tYj36>p`q!b\ಘ?}u(ƺ\J~b?n9}¬jYmkҰ/n[^{+-7DZ`g`= gBJ"J$33JKs Y5&U z[ ':6ͱ7&WF8A$F$2 w痛iyk r֧ zDy|݉݁vvɈt+xxJZ`4Wga+Og4'vhix~?dDq~ !c8zi8)9\,#1բ6g{)gm99F,Ѯ$ I#\8\,0/{t_;y)E+ C's?Tt <)*Ho_'CJ5Choaf@: $]];mĽ3'8P\nS`ӹ$.ϸ |i+ޥT7K+Oa0.EzZc̿@8` 0xOzs>9ݬ!U=Y![|GMo!A5-el%̈֕nVTf̭egfoVIE1,3`\Y!α@0NI91\> stream xcd`ab`ddpH,*I-r Mf!CGVY~'ـX1nny?څ ~$_PYQ`hiiXPWPYP_TYR\RWPZZTWu+sbR23 # , U er0fuU m}=ីpGGEg~W\6r6m)+ܲH}eOXqy~|6hne5{n >6 -Kd^RuV7Gd=WN-I?d|w[5{>{;2Y"?5_"߃=]ohka_3uD-['hlP˱ʛ7endstream endobj 34 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3155 >> stream xVkTS׶M"F%hE"yAPQT7$"oXm JK5H[A=ET@ւ@&H6Zs;w{ w;Fܙsoє鱫3âUf`K GS\22抦Pc|D##+YYTN8xo (R M/357-1>!1]?$u؆ɛg ¨T>7=- CP.bG'<#(L"32>vzCk$L̋CLSyJ[jaH=kp4n8p}<`r&83MNv'rsY4\n^edzl+xջǪp3\e̘Yz^ez=j (PBBl;=R6ީmͯmM>JoFQGx<hga^ZFbw#[RwY/)yKM7i& *.nRuA> nH C53p0LUK%be<',\Y7U&/&潹PNW8Vy=2J>dl:c B3~;q;lm~w^ƂM}J).AE kHF&[6[FMXO Mag+u+cxt?-'vp礪R#E\}!,n\R7i*+];夆QrrK |{{ PQq|h۶#dTeϩ8*>!r!+j?ӴY'lpTKdg (;)䲷Е]xaʒn@c֤l-CW?7UM|'tYX&Ey=v\-ϟ(4*L*wAbO|`vsd?Darh}ǐwɤyf=?z <󟝴PJM9B;bnjD 3#산=ºC$,E<ON{g v"&nBV(GVVOZwendstream endobj 35 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5997 >> stream xYXT׶>#̙2sH,b5Vl(,`0t{(;HG jD IԨ)57m{oO|oo޳Z_:(~@ \( ΛW'\tVǏ6KQ!˖v1z0h*qCbZRfp_?݌ifNB>yD-j3Pe0qz|o7Ab'Nc{˦7٭齩;aHQҐeа+#dk"{FytZS@-nwLigϜ59`[BQRNʙ@mSQ)=ʕHmR˨6j95NSSJjNP3)jM>\j!5ZD PK(Kj(NYQj'5bʚ2FR(j4R) j*‚XAw&四f#}Xd/$vk/쯴c?`΁zжA!-C-cnuY>l0aaH97|pS+lFؼdi[QCFj}0_83Sۘ0F؂LmIR#$%aJh:.4rtY#jk#?5S~r؈rx lfPD05XIg ݔbqQ;iY3Br/!Eq.P?m?9}GL7+ޔU.ĶvgqХM$.XJKqPwwi3#E!d]vD:No9T [V4 ӸGB]>݆ [Y8[*zad~M#o誉`+ %Wjpq-!li&]Zj|*A XN pl-Os0,٥te˖9~ʥ7.;`8\ pOn4`+l'&ď8p8w5H $[:|e^ߜco$.\UL_Q :5PIpodڥsni EU1=n2ƒLGKK9fEti6Tf,_{7wv-rbΒaVNr᳎3OEzS(v.)XQTGb梼Ylh1HvL?}OԞg{+1xkWL&X^T=9w7U$ 5Y`)+j %v~ӔZu5M;^ڷ |"欖tl(I/-fm@ ^0St tqxM ZB6vZ#<M)۳M75C\fKQK촛pj2(KߛzWmG1I]Fp#mU& ޳悂MW$Eb;7MBJ 3~Q5 O(`i_.0Pb"30t#RSA4.YmsE:ȴcnE kB"0y8< 3Pb/l;#LrqU/a06HМ 2{. ޢAZ=g^EZWS;t4, έFwMx '7vmg0x9P&EScdܥO]Sy$/R P3>W{X[6cz, &[[d b:TlT|tYr>ь0mZT 3|\Ek4%}>틋ݐ/\Eo3&]T|Z{6](b7je))W9 cբuS=jsdi qĝ/oמ-6.G+Klc ^'h]q-JDМb8IWעN;! cdv[EGQW`믜WK$aLU+-ćV!fVFpɱIa( fgړ30C!=-9PJN,ڇQJP.*S5Ƶ&"3ےbRRa*9[:{k /3+voٱcgsً\X3{@X'-&iuZۊ(ewM9_9(E,6-7.}}OgC%k+rE/Q XX%OSqjf|I6ON:+j& C5E#Q-8rmzkcٌcmqu]wg7螷V=G^z e~Z@M7Uwn&oOҟ=Bҭ9"/IT|FfFr!!BR} mߴpc.I;u$ޑ1Cv|k_,ў8?fM6yLPO7S7nEg^I D^3:-q'v\q$dکݤ;3z܄T[ȉ@6*ҲY\3XR(#|'ʩͮ[\1W-qEqE6gl i hWECt7@\:Q.NǓW@Р@ж6݃w.U*D6*HJJg^P*^UY—-+(GJoӧqHN@j`6x$_`W0إE #XXw[McgVCmLT0j,BݛZ>mCQn|Hb=wD mFQ dBT@{Pn.,{/2둸Aq+JN3bZ[bRؠqYL,V?z}d2!sOw{|q +2T>>uu$Ė_NbٖTJV7TԤq'N4f.NN)(Fu,|H-TL0A ֵ]AMYLBu@Eo DnPÑ7)ޫWp[P)d zƅ}jآ:tS,4;  35A|oXپ*6UFQz>ިFIiW8ᕩz@:DsĊ6:[{ڏٯBم6H{@Q!l# xj~uE]Ԗk`ʏ QZVB$c:9eHqHn|' ʱN&(՜~vτz OW[])Dld^/|xwMUk7KD(Pe^^ardi7ubE+yn)sJe~2;XwEuXt /_܂j3 9f>\x7o`ѷVylZjF"JKeꪖSa[p"-\oan\>?콯9,ta$ߣt뺆;z|=:<%tQӠ+jYȥ׸-Nh8vV,gsAX˫ʜlTmu$|Dh7?A(9RÖ`p:dSb>5 Dz'J\a Swc9x >'?.9&`3HsT $..$Th!!ٰq[Է\Ճ]+yoZ50sf)|;Dڶ܆ùl?? *F$qVˏ5)?O~|ڹ7TQ}&Mǥfĥ2= H>Wa(zTJLJ`5Յ怼$H]7%1)l4 @ U"l^]Vܻ#]X~(-/x/ata&wDt/AV2KNcuەAIC`/nѻ>j#S$.L0k:7fWNbr qBÞF)<~ËaH,MH =f8Asv$#)MsSj%N^$eZ@ l7ߝOeW{O)P"ͼ3>`&nW0w?89A3 w9Cvpb>,Qj |t`4p@gy!QJٹʊ삁;sr˕PDQ3Pendstream endobj 36 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2184 >> stream x]UyTSgay!*ψ{ѪPb qu %&! "{,VL :ST:qK󽞏?p9䜛w߽ߕ~>D"t2F1_-Zc|Ca! A~|#Pn+Qhuf}*(8*jjD=Cd͏-'k 2flIHrmclV#KRJV)[X+KLX2ArEb|BX$huE)gB: VD1XE$kD,XH,"hb XN# ?*Y!;ٷoﹿFPS{t%jPC Ǟ/=*Ϟ]nj9HA?;f$$M,vZo %MRtѶ(h 4ܭĦ;jNJ4gEa!ы+ţ {|4"&0G<|g1U+ŭǫWw jLzS{QXo3J\9)OKaۀZivY4 eM!ųo" ȶ"ϋ_vȩ-_&VCC]uƅ`2^MiϽ% R{AYR]?HfYS2.ezp{,iXT^EU VND$Ɍr58 k`DG܃H)|Ci2jfd{4VH [iSJ%@^ ͐fs2"~~vp#ymuWC:b0ӸkaХ>W(e\3M WXBa|Ő , vfQ& ޶ÿ#g̦7I8tKqnGk:x9|0%T ǵeYerl1pt̂ ,qms3ʌH4%Y|BWs> +v>Ն?:]g9G֊+Ψ溊c=.Q|V\o`m5YW^ 9]k>'zOeKbDCC<|**˦pJtbzM0JB4q267H|D` f cRO2Qf3=]W;G:GL0exOuÁo#߻}r<=NXK=/o a ViR:\"i}a4"gUWf+NLiw>ie[E3)ܽcm}RYS1LE=rh;k`'㻾"QK9 G⩦0Ψ3478}mL.fq l0m8`ŤXEmyU{Vtf!/Ysy6<9 P&wD麚M4n_?GUendstream endobj 37 0 obj << /Filter /FlateDecode /Length 278 >> stream x]1n0 EwB7$b\%CO4-(sōSG.rRմn4>'C7?748r}ҧT܍#WZvÆU6Gl@[U4kּeUݱݩ6A؀ ^ـFՁ *l@Eud;P'tB^̤ y2f&%L,n6]^uHZv&=ϔyʁ Bendstream endobj 38 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2585 >> stream xVkTgGB6D[/ڻni] K Jn@| (AT*H+n]mmm{nv6vr;3<>~ $& a0n^AMwJyGcQh@ȿ'۫+?j1͌ˡ~X`drUr!XyfӦg7n[8rζDΞ+?ٓ7O <:A9'8p9Yi]3~  DUDQ֖ *"$/_^p[T+-{a#d$IC2H& َDv ;$d:كE!1C4'䟌DE5 &̔1oE{;x%K`p RI^e9u*ZŸ-1׊t%|j#ZS .eπ=wsl.[k p49`yF܀JӛMv59±}r.Ws@1RUôv@hmY?ܖjh;A -mQֳn:ON]ɣ(ܠ,{9ZHa|I+c{Uj)ZI3;?&5.+blb^1_BmGW𩅕G:k;a}}yGQP&sjUDun!%;]4N`2IԲ[Jf.|Ax` ̴ "?C$ѸHasus1\zqě3'!:(&?vSAJ~ߗ Bj6N'8 (QIJ]S} N8nn -bUm֠{sp^&X+ܼ\)%΀X>]̼y;IV4^`6v+/Uԙq.+ש!f։wapY FN`RA/`G@gƏPEEWp p6 $S,<[Ŏ/v5V_MTd橢!xG4 @Oc= w7 эri-*Ȫteؐ74-lqxrG̤btZxG#ytuf箓gf'<Α˧PC iʴQLLZtYqzjFQgK4ZO&Sޛé&¡?&@ -. WS ( ?UU%NϠ%@ ճ)d' {}JR5 Ø+{ )v<ṇϒ{ԬɄHJ#.VNQ?YSm#M h.m8L-.iqɾ.{MMI[+$kU@ԥ`ՎK&@:|,~G?(͊0v5:ɈK|EWg37d|VQ&tZ-*=:bQqԣQ0X(`LZƽ-+7i_\DD㷨N1BjmIHtx"` F+Q.6j9}<:=џY;Vi:3JFȡY|~E49G`[P:TuTYIGJ]R*l 0XVj>l\RY3.|&TS|S9 'g`zhoZz;H4H€"ʂdZ3J܈7T\D1)|58"Ө)ybԀjfhW +D7>pLyp7y_+ MB Ni,ɮp偊zk.O3=!BBU5mJGẳpD6WePkDC0d ŧ: jkAuFiߡ1%eQ67x:t_lSGeNh9kuVMf*ߠ6途}`w3p %en E28:p \F˸ A2ztzs6(y0(kF={Sݳ=3f\3t]m5XnWgKmln%7eA(VL=2Aj)^x`.P8xWr1_QEu#Qm9j!/^kOHG4y d  N5{ ӁBV_ZSl{x@q0ptj 3/~NMLWv7$d3Pz/5pjmKK%1 vig?f#6җ6!>/Pendstream endobj 39 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3013 >> stream xW XWRcQL*k-mC!bU"y3@x?X&($D*ڵj-Fֶ>ҭg~D%߽s9ND !Y뫌WuGĆ$Y^'lIb_D8zO0vh Fstsc !"8/eBFRT"Y6gW]]7e2Y%!a14UL,$>\d,re%!2e,@FjJU~+gCK xOeB*9ԴЌpy_?je)g b*GG$UD B&D,$"‡xXLKJ,!_b4H!"l%Z&l޶1r_Gl["DJnR>Tq#i˾סíQRmkC^n9l,}n%,&R{k.Lf~S> PttfP M$ $xʾG)~ VEKlpYp<>v@A t |#EW>W./ap'\bBUJe]"d ޾ʺ@48Mf2#I_Q~n ~0mWIra+9чf7y%Ja}Lauܙ $wfAtB//KtoLNapX5Gl>4Sw'0|P{2! ]0nRoǙ~ =3]<$t^͓ƌ^^Ę$t^uY4EV̸w0+0իwmxs~5k[CpNqP=Kga$E}0SxΧby9G.0ژFTNd4K9:yB&6 %# OyC1笛9쩼+Q)s ?l@(9J`H-HV^[l*gND }89K`to}B*IBJbI2-JㇲKNbumos}>6%TLDDw7΍hBn"U)7z4Qe'WM'T[|ň]lg(w(" {խ٧VG 9 3{MkԅYTF%ّC4gRa?'ohtZ!5K=nFv/~ ws1C[:͂@[Z؈j✽!݂$ªP ރ4ˊQ 54C[Yxdg|VPayQe Q iq,]{ʅ\ԄJ+Zj8jb>̲ԜdF"j_oh-5ۊvE"lDɰT/4 SZ԰TSt {ؓJ?<,~U:eGUh'ߑ2 ]/IG* |AhFTd[v¯އ!*| a_ȎA]1[ofncs`J~stw/nΜX5j0S]fR Oٓu`DbGgyx&΃XG/9Ρۨd-5 C$i 7P!LLŽ.ZMYe+am)fcv"~wu.O %_0ϓ T+MT Ú8z%0g}.HCļ =!༓Oi^=}ƺ:I'yMDW"oX( E}"KO!7mNPN@:.冨⃂& 7qLc[vzTQG݁l6uhKTD #}e! ]N >uPރczЋs-dO{a}W{a룃ҳdNjRT8d2M# B^Kb>2wgnwŖ^U,kEGGAR5'v#MY@Y(2_Ѽs!-g6 )5YKn\e?0Eȡ ԥ),grcBñ֭!(G }3l}mLuWDy71Ih3p$D:Ɋ.$LALcaEX}skp?Ő_MNNS(=ިI&=Hk)C]Y%MդAMH۠1 o/}B&`;~ fC]'vju̫UE`< |j+'j7?BÄdufNnLw_ < ;ؔeQ9 m Rf*b ٙ;H`٤^:\1hyQ?/endstream endobj 40 0 obj << /Type /XRef /Length 71 /Filter /FlateDecode /DecodeParms << /Columns 4 /Predictor 12 >> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 41 /ID [<80ac8d0518b060633ce1588bed19cecf>] >> stream xcb&F~ cX?gL nv`J @`@G1P endstream endobj startxref 31792 %%EOF RProtoBuf/inst/python/0000755000175000017500000000000012440004312014552 5ustar nileshnileshRProtoBuf/inst/python/readmsg.py0000644000175000017500000000051212440004312016544 0ustar nileshnilesh#!/usr/bin/env python # # Simple test script to read a serialized message in python # import rexp_pb2; import glob; messages = glob.glob("*.msg"); for myfile in messages: print("Reading message " + myfile + " ...") f = open(myfile, 'rb') msg = rexp_pb2.REXP(); msg.ParseFromString(f.read()) f.close(); print(msg) del msg RProtoBuf/inst/python/runtest.sh0000755000175000017500000000040112440004312016610 0ustar nileshnilesh#!/bin/sh #write some PB data with R Rscript writemsg.R #compile proto file cp -f ../proto/rexp.proto . protoc rexp.proto --python_out=. rm rexp.proto #read with python and print python readmsg.py #cleanup tmp files rm rexp_pb2.py rexp_pb2.pyc rm *.msg RProtoBuf/inst/python/writemsg.R0000644000175000017500000000071312440004312016537 0ustar nileshnilesh#simple R script to serialize some R objects library(RProtoBuf) #some vectors serialize_pb(c(1,2,pi, NA,NaN,Inf,-Inf), "double.msg") serialize_pb(c(1L, 2L, NA), "integer.msg") serialize_pb(c(TRUE, FALSE, NA), "logical.msg") serialize_pb(c("foo", "bar", NA), "character.msg") serialize_pb(charToRaw("This is a test"), "raw.msg") #lists serialize_pb(list(foo=c(1,2,pi), bar=TRUE, baz="blabla", zoo=NULL), "list.msg") serialize_pb(iris[1:3,], "dataframe.msg") RProtoBuf/inst/proto/0000755000175000017500000000000012754736105014420 5ustar nileshnileshRProtoBuf/inst/proto/helloworld.proto0000644000175000017500000000054012754736105017657 0ustar nileshnilesh// mark as Protocol Buffers v2 format syntax = "proto2"; package rprotobuf; option java_package = "org.rproject.rprotobuf"; option java_outer_classname = "HelloWorld"; message HelloWorldRequest{} message HelloWorldResponse{ required string message = 1; } service HelloWorldService{ rpc HelloWorld(HelloWorldRequest) returns(HelloWorldResponse); } RProtoBuf/inst/proto/addressbook.proto0000644000175000017500000000117412754736105020010 0ustar nileshnilesh// mark as Protocol Buffers v2 format syntax = "proto2"; package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; extensions 100 to 199; } message AddressBook { repeated Person person = 1; } service EchoService { rpc Echo (Person) returns (Person); } RProtoBuf/inst/proto/rexp.proto0000644000175000017500000000243512754736105016467 0ustar nileshnilesh// Originally written by Saptarshi Guha for RHIPE (http://www.rhipe.org) // Released under Apache License 2.0, and reused with permission here // Extended in November 2014 with new types to support encoding // language, environment, and function types from R. // mark as Protocol Buffers v2 format syntax = "proto2"; package rexp; option java_package = "org.godhuli.rhipe"; option java_outer_classname = "REXPProtos"; // TODO(mstokely): Refine this using the new protobuf 2.6 oneof field // for unions. message REXP { enum RClass { STRING = 0; RAW = 1; REAL = 2; COMPLEX = 3; INTEGER = 4; LIST = 5; LOGICAL = 6; NULLTYPE = 7; NATIVE = 8; } enum RBOOLEAN { F=0; T=1; NA=2; } required RClass rclass = 1; repeated double realValue = 2 [packed=true]; repeated sint32 intValue = 3 [packed=true]; repeated RBOOLEAN booleanValue = 4; repeated STRING stringValue = 5; optional bytes rawValue = 6; repeated CMPLX complexValue = 7; repeated REXP rexpValue = 8; repeated string attrName = 11; repeated REXP attrValue = 12; optional bytes nativeValue = 13; } message STRING { optional string strval = 1; optional bool isNA = 2 [default=false]; } message CMPLX { optional double real = 1 [default=0]; required double imag = 2; } RProtoBuf/inst/opencpu/0000755000175000017500000000000012440004312014702 5ustar nileshnileshRProtoBuf/inst/opencpu/ocpu-rpc.R0000644000175000017500000000116112440004312016554 0ustar nileshnilesh# Jeroen Ooms # # HTTPS+ProtoBuf RPC POC using OpenCPU # The call below maps to: do.call(stats::rnorm, list(n=42, mean=100)) # !! This requires httr (>= 0.2.99). Version 0.2 has a bug. # library(devtools) # install_github("httr") # Actual code library(RProtoBuf) library(httr) args <- list(n=42, mean=100) payload <- serialize_pb(args, NULL) req <- POST ( url = "https://public.opencpu.org/ocpu/library/stats/R/rnorm/pb", body = payload, add_headers( "Content-Type" = "application/x-protobuf" ) ) #This is the output of stats::rnorm(n=42, mean=100) output <- unserialize_pb(req$content) print(length(output)) RProtoBuf/inst/opencpu/ocpu-getdata.R0000644000175000017500000000044212440004312017402 0ustar nileshnilesh# Jeroen Ooms # # HTTPS+ProtoBuf RPC POC using OpenCPU # Script below downloads MASS::Animals using protobuf library(RProtoBuf) library(httr) req <- GET ('https://public.opencpu.org/ocpu/library/MASS/data/Animals/pb') output <- unserialize_pb(req$content) identical(output, MASS::Animals) RProtoBuf/inst/opencpu/readme.txt0000644000175000017500000000017312440004312016701 0ustar nileshnileshThese scripts illustrate how protocol buffers can be used as a data interchange format or as the basis of an RPC protocol. RProtoBuf/inst/opencpu/ocpu-rpc.py0000644000175000017500000000206012440004312017002 0ustar nileshnilesh#!/usr/bin/env python # Jeroen Ooms # # HTTPS+ProtoBuf RPC POC using OpenCPU # The call below maps to: do.call(stats::rnorm, list(n=42, mean=100)) import urllib2; from rexp_pb2 import *; #create the post payload, i.e. list(n=42, mean=100) payload = REXP( rclass = 5, rexpValue = [ REXP(rclass = 2, realValue = [42]), REXP(rclass = 2, realValue = [100]) ], attrName = [ "names" ], attrValue = [ REXP(rclass = 0, stringValue = [STRING(strval="n"), STRING(strval="mean")]) ] ); #HTTP POST req = urllib2.Request( 'https://public.opencpu.org/ocpu/library/stats/R/rnorm/pb', data = payload.SerializeToString(), headers = { 'Content-type': 'application/x-protobuf' } ); res = urllib2.urlopen(req); #parse output pb msg = REXP(); msg.ParseFromString(res.read()); #the return value is a double vector in this case print(msg.realValue); ##### To debug: #f = open("payload.msg", "wb") #f.write(payload.SerializeToString()) #f.close() # # Then do in R do: # library(RProtoBuf) # payload <- unserialize_pb("payload.msg") # do.call(stats::rnorm, payload)RProtoBuf/inst/opencpu/ocpu-getdata.py0000644000175000017500000000065212440004312017634 0ustar nileshnilesh#!/usr/bin/env python # Jeroen Ooms # # HTTPS+ProtoBuf RPC POC using OpenCPU # Script below downloads MASS::Animals using protobuf import urllib2; from rexp_pb2 import *; #HTTP GET req = urllib2.Request('https://public.opencpu.org/ocpu/library/MASS/data/Animals/pb'); res = urllib2.urlopen(req); #parse output pb msg = REXP(); msg.ParseFromString(res.read()); #the return value is a double vector in this case print(msg); RProtoBuf/inst/opencpu/rexp_pb2.py0000644000175000017500000002350412440004312017001 0ustar nileshnilesh# Generated by the protocol buffer compiler. DO NOT EDIT! from google.protobuf import descriptor from google.protobuf import message from google.protobuf import reflection from google.protobuf import descriptor_pb2 # @@protoc_insertion_point(imports) DESCRIPTOR = descriptor.FileDescriptor( name='rexp.proto', package='rexp', serialized_pb='\n\nrexp.proto\x12\x04rexp\"\xb3\x03\n\x04REXP\x12!\n\x06rclass\x18\x01 \x02(\x0e\x32\x11.rexp.REXP.RClass\x12\x15\n\trealValue\x18\x02 \x03(\x01\x42\x02\x10\x01\x12\x14\n\x08intValue\x18\x03 \x03(\x11\x42\x02\x10\x01\x12)\n\x0c\x62ooleanValue\x18\x04 \x03(\x0e\x32\x13.rexp.REXP.RBOOLEAN\x12!\n\x0bstringValue\x18\x05 \x03(\x0b\x32\x0c.rexp.STRING\x12\x10\n\x08rawValue\x18\x06 \x01(\x0c\x12!\n\x0c\x63omplexValue\x18\x07 \x03(\x0b\x32\x0b.rexp.CMPLX\x12\x1d\n\trexpValue\x18\x08 \x03(\x0b\x32\n.rexp.REXP\x12\x10\n\x08\x61ttrName\x18\x0b \x03(\t\x12\x1d\n\tattrValue\x18\x0c \x03(\x0b\x32\n.rexp.REXP\"f\n\x06RClass\x12\n\n\x06STRING\x10\x00\x12\x07\n\x03RAW\x10\x01\x12\x08\n\x04REAL\x10\x02\x12\x0b\n\x07\x43OMPLEX\x10\x03\x12\x0b\n\x07INTEGER\x10\x04\x12\x08\n\x04LIST\x10\x05\x12\x0b\n\x07LOGICAL\x10\x06\x12\x0c\n\x08NULLTYPE\x10\x07\" \n\x08RBOOLEAN\x12\x05\n\x01\x46\x10\x00\x12\x05\n\x01T\x10\x01\x12\x06\n\x02NA\x10\x02\"-\n\x06STRING\x12\x0e\n\x06strval\x18\x01 \x01(\t\x12\x13\n\x04isNA\x18\x02 \x01(\x08:\x05\x66\x61lse\"&\n\x05\x43MPLX\x12\x0f\n\x04real\x18\x01 \x01(\x01:\x01\x30\x12\x0c\n\x04imag\x18\x02 \x02(\x01\x32(\n\x04ocpu\x12 \n\x06\x64oCall\x12\n.rexp.REXP\x1a\n.rexp.REXP') _REXP_RCLASS = descriptor.EnumDescriptor( name='RClass', full_name='rexp.REXP.RClass', filename=None, file=DESCRIPTOR, values=[ descriptor.EnumValueDescriptor( name='STRING', index=0, number=0, options=None, type=None), descriptor.EnumValueDescriptor( name='RAW', index=1, number=1, options=None, type=None), descriptor.EnumValueDescriptor( name='REAL', index=2, number=2, options=None, type=None), descriptor.EnumValueDescriptor( name='COMPLEX', index=3, number=3, options=None, type=None), descriptor.EnumValueDescriptor( name='INTEGER', index=4, number=4, options=None, type=None), descriptor.EnumValueDescriptor( name='LIST', index=5, number=5, options=None, type=None), descriptor.EnumValueDescriptor( name='LOGICAL', index=6, number=6, options=None, type=None), descriptor.EnumValueDescriptor( name='NULLTYPE', index=7, number=7, options=None, type=None), ], containing_type=None, options=None, serialized_start=320, serialized_end=422, ) _REXP_RBOOLEAN = descriptor.EnumDescriptor( name='RBOOLEAN', full_name='rexp.REXP.RBOOLEAN', filename=None, file=DESCRIPTOR, values=[ descriptor.EnumValueDescriptor( name='F', index=0, number=0, options=None, type=None), descriptor.EnumValueDescriptor( name='T', index=1, number=1, options=None, type=None), descriptor.EnumValueDescriptor( name='NA', index=2, number=2, options=None, type=None), ], containing_type=None, options=None, serialized_start=424, serialized_end=456, ) _REXP = descriptor.Descriptor( name='REXP', full_name='rexp.REXP', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( name='rclass', full_name='rexp.REXP.rclass', index=0, number=1, type=14, cpp_type=8, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='realValue', full_name='rexp.REXP.realValue', index=1, number=2, type=1, cpp_type=5, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), descriptor.FieldDescriptor( name='intValue', full_name='rexp.REXP.intValue', index=2, number=3, type=17, cpp_type=1, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), descriptor.FieldDescriptor( name='booleanValue', full_name='rexp.REXP.booleanValue', index=3, number=4, type=14, cpp_type=8, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='stringValue', full_name='rexp.REXP.stringValue', index=4, number=5, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='rawValue', full_name='rexp.REXP.rawValue', index=5, number=6, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='complexValue', full_name='rexp.REXP.complexValue', index=6, number=7, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='rexpValue', full_name='rexp.REXP.rexpValue', index=7, number=8, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='attrName', full_name='rexp.REXP.attrName', index=8, number=11, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='attrValue', full_name='rexp.REXP.attrValue', index=9, number=12, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), ], extensions=[ ], nested_types=[], enum_types=[ _REXP_RCLASS, _REXP_RBOOLEAN, ], options=None, is_extendable=False, extension_ranges=[], serialized_start=21, serialized_end=456, ) _STRING = descriptor.Descriptor( name='STRING', full_name='rexp.STRING', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( name='strval', full_name='rexp.STRING.strval', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='isNA', full_name='rexp.STRING.isNA', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=True, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), ], extensions=[ ], nested_types=[], enum_types=[ ], options=None, is_extendable=False, extension_ranges=[], serialized_start=458, serialized_end=503, ) _CMPLX = descriptor.Descriptor( name='CMPLX', full_name='rexp.CMPLX', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( name='real', full_name='rexp.CMPLX.real', index=0, number=1, type=1, cpp_type=5, label=1, has_default_value=True, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='imag', full_name='rexp.CMPLX.imag', index=1, number=2, type=1, cpp_type=5, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), ], extensions=[ ], nested_types=[], enum_types=[ ], options=None, is_extendable=False, extension_ranges=[], serialized_start=505, serialized_end=543, ) _REXP.fields_by_name['rclass'].enum_type = _REXP_RCLASS _REXP.fields_by_name['booleanValue'].enum_type = _REXP_RBOOLEAN _REXP.fields_by_name['stringValue'].message_type = _STRING _REXP.fields_by_name['complexValue'].message_type = _CMPLX _REXP.fields_by_name['rexpValue'].message_type = _REXP _REXP.fields_by_name['attrValue'].message_type = _REXP _REXP_RCLASS.containing_type = _REXP; _REXP_RBOOLEAN.containing_type = _REXP; DESCRIPTOR.message_types_by_name['REXP'] = _REXP DESCRIPTOR.message_types_by_name['STRING'] = _STRING DESCRIPTOR.message_types_by_name['CMPLX'] = _CMPLX class REXP(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _REXP # @@protoc_insertion_point(class_scope:rexp.REXP) class STRING(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _STRING # @@protoc_insertion_point(class_scope:rexp.STRING) class CMPLX(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _CMPLX # @@protoc_insertion_point(class_scope:rexp.CMPLX) # @@protoc_insertion_point(module_scope) RProtoBuf/inst/THANKS0000644000175000017500000000021212440004312014137 0ustar nileshnilesh In alphabetical order: Koert Kuipers for a patch adding raw byte support Murray Stokely for several patches and helpful discussions RProtoBuf/inst/examples/0000755000175000017500000000000012440004312015047 5ustar nileshnileshRProtoBuf/inst/examples/addressbook.pb0000644000175000017500000000017512440004312017675 0ustar nileshnilesh < Romain Francoisromain@r-enthusiasts.com" +33(0)... = Dirk Eddelbuetteledd@debian.org" +01..." +01...RProtoBuf/cleanup0000755000175000017500000000074514156423632013657 0ustar nileshnilesh#!/bin/sh rm -f config.* src/Makedeps src/Makevars \ src/addressbook.pb.cc src/addressbook.pb.h \ src/protobufrpc.pb.cc src/protobufrpc.pb.h \ src/*.o src/*.d src/*.a src/*.dll src/*.so src/*.rc */*~ *~ \ src/symbols.rds \ vignettes/RProtoBuf*.aux vignettes/RProtoBuf*.log \ vignettes/RProtoBuf*.out vignettes/RProtoBuf*.toc \ vignettes/RProtoBuf*.tex vignettes/RProtoBuf*.pdf \ vignettes/pinp.cls rm -rf inst/doc/auto autom4te.cache RProtoBuf.Rcheck RProtoBuf/NAMESPACE0000644000175000017500000000616613777165345013540 0ustar nileshnilesh ## Package has dynamic library useDynLib("RProtoBuf", .registration=TRUE) importFrom("methods", "new", "show", "as", "is") importFrom("utils", "str", "packageDescription") importFrom("stats", "update") importFrom("tools", "file_path_as_absolute") #importFrom("RCurl", "basicTextGatherer", "curlPerform") importFrom("Rcpp", "evalCpp") exportClasses( # descriptors "Descriptor", "FieldDescriptor", "EnumDescriptor", "ServiceDescriptor", "MethodDescriptor", "FileDescriptor", "EnumValueDescriptor", # message "Message", # rpc #"RpcHTTP", # virtual streams "ZeroCopyInputStream", "ZeroCopyOutputStream", # concrete implementations "ArrayInputStream", "ArrayOutputStream", "FileInputStream", "FileOutputStream", "ConnectionInputStream", "ConnectionOutputStream" ) exportMethods( "new", "[[", "[[<-", "$", "$<-", "show", "serialize", "as.character", "update", "has", "clone", "merge", "read", "readASCII", "readJSON", "bytesize", "length", "str", "isInitialized", "clear", "size", "size<-", "swap", "descriptor", "set", "fetch", "toString", "toJSON", "identical", "==", "!=", "all.equal", "add", "fileDescriptor", "name", "names", "flush", "close", "setExtension", "getExtension", "containing_type", "field_count", "nested_type_count", "enum_type_count", "field", "nested_type", "enum_type", # FieldDescriptor "is_extension", "number", "label", "is_required", "is_repeated", "is_optional", "has_default_value", "default_value", "message_type", "enum_type", "type", "cpp_type", # EnumDescriptor "value_count", "value", # ServiceDescriptor "method_count", "method", # MethodDescriptor "input_type", "output_type", # rpc # "invoke", # streams "Next", "ByteCount", "BackUp", "Skip", "ArrayInputStream", "ArrayOutputStream", "FileInputStream", "FileOutputStream", "GetErrno", "SetCloseOnDelete", "ConnectionInputStream", "ConnectionOutputStream", "ReadRaw", "ReadString", "ReadVarint32", "ReadLittleEndian32", "ReadLittleEndian64", "ReadVarint64", "WriteRaw", "WriteString", "WriteLittleEndian32", "WriteLittleEndian64", "WriteVarint32", "WriteVarint64" ) export( "P", "readProtoFiles", "readProtoFiles2", "resetDescriptorPool", "asMessage" ) if( exists( ".DollarNames", asNamespace("utils") ) ) importFrom( utils, .DollarNames ) S3method(.DollarNames, Message ) S3method(.DollarNames, Descriptor ) S3method(.DollarNames, EnumDescriptor ) S3method(.DollarNames, EnumValueDescriptor ) S3method(.DollarNames, FileDescriptor ) S3method(.DollarNames, FieldDescriptor ) S3method(.DollarNames, ServiceDescriptor ) S3method(.DollarNames, MethodDescriptor ) S3method(.DollarNames, ZeroCopyInputStream ) S3method(.DollarNames, ZeroCopyOutputStream ) S3method( with, Message ) S3method( within, Message) S3method( as.list, Message ) S3method( as.list, Descriptor ) S3method( as.list, EnumDescriptor ) S3method( as.list, FileDescriptor ) S3method( as.list, ServiceDescriptor ) S3method( all.equal, Message ) # constants exportPattern( "^TYPE_" ) exportPattern( "^CPPTYPE_" ) exportPattern( "^LABEL_" ) # copied from RProtoBufUtils export( "serialize_pb", "unserialize_pb", "can_serialize_pb" ) # export( run_unit_tests ) RProtoBuf/TODO0000644000175000017500000000673512440004312012757 0ustar nileshnileshCurrent TODO list: o Finish improved vignette / R Journal writeup. o Push some type coercion hacks done in RProtoBuf upstream to Rcpp (Rcpp:as types should work on character strings representing numbers, especially for int64s since we don't otherwise have a way to represent 64-bit integers in base R). o Add more packages that depend on or enhance RProtoBuf. o Improve exception handling to prevent cases where an Rcpp exception crashes the interactive R instance. o Investigate Rcpp Modules support for some classes. Murray is not personally super enthusiastic about this one, as I think it may require non trivial changes to Rcpp and/or result in losing some of the user-friendliness we've crafted in the explicit RcppExported function entry points. Still, it could be explored and may result in significantly fewer lines of code if successful. o Add a FAQ and other documentation / examples. o Add more unit tests. o Explore removing the CLONE() in extractors.cpp. This makes for unusual semantics for any mutable methods of sub-messages. For example, clear(), setExtension(), and probably also update() ( but "$<-" on sub-messages is not a problem, it seems). More details below. o What should we do when we unload the package? Any additional resources to free that is not currently done? o finalizers [murray: what is needed here?] o Clean up formatting / whitespace of R code. The C++ code is now kept consistent through clang-format and a new emacs directory level config in pkg/src, and the style guide notes in the STYLE file on R-Forge. o Thoroughly audit extensions support and other deeply nested types support to ensure everything is implemented as expected. Stuff I think belongs in additional packages that depend on RProtoBuf, rather than inside RProtoBuf directly: o http-powered rpc implementation o More as.Message methods --- Detailed Notes ---- 8. CLONE() --[ examples from Murray illustrating the problem ]-- library(RProtoBuf) InitGoogle() if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("unitTests", "data", "unittest.proto",package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } test <- new(protobuf_unittest.TestAllTypes) test$optional_foreign_message <- new(protobuf_unittest.ForeignMessage, c=3) # Example 1: test$optional_foreign_message$c test$optional_foreign_message$clear() test$optional_foreign_message$c # didn't clear test$optional_foreign_message$c # Example 2: foo <- new(protobuf_unittest.ForeignMessage, c=3) foo$c foo$clear() foo$c # did clear foo$c # Example 3: baz <- test$optional_foreign_message baz$c baz$c <- 4 test$optional_foreign_message$c # still 3, but would be 4 if we removed the CLONE(). Example 1 is currently I think very confusing semantically for users of RProtoBuf with nested messages and I would like to fix that case. Example 2 works correctly now and would not be affected by this change. Example 3 would change behavior and could cause problems for users. Would need to be clearly announced in the NEWS file and to our user list. --[ Romain's thoughts ]-- `$<-` is the task of setMessageField: https://github.com/RProtoBuf/RProtoBuf/blob/master/R/00classes.R#L197 https://github.com/RProtoBuf/RProtoBuf/blob/master/src/mutators.cpp#L377 For "$" we could perhaps move to some sort of copy on change semantics (similar to what R does), instead of what we use currently which is more like copy on access. RProtoBuf/configure.ac0000644000175000017500000001064213776225671014577 0ustar nileshnilesh ## RProtoBuf configure.ac ## ## Copyright (C) 2009 - 2020 Dirk Eddelbuettel ## Portions Copyright (C) 2010 Romain Francois ## Portions Copyright (C) 2013 Murray Stokely ## Portions Copyright (C) 2016 Craig Radcliffe # require at least autoconf 2.61 AC_PREREQ(2.61) # Process this file with autoconf to produce a configure script. AC_INIT([RProtoBuf], m4_esyscmd_s([awk -e '/^Version:/ {print $2}' DESCRIPTION])) # Ensure C++ is set up as R expects : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then AC_MSG_ERROR([Could not determine R_HOME.]) fi CXX=`"${R_HOME}/bin/R" CMD config CXX` CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` AC_LANG(C++) AC_REQUIRE_CPP AC_PROG_CC AC_PROG_CXX ## simpler alternative to test below: AC_PATH_PROG(PROTOC, protoc) AC_DEFUN([AC_PROG_PKGCONFIG], [AC_CHECK_PROG(PKGCONFIG,pkg-config,yes)]) AC_PROG_PKGCONFIG ## use pkg-config for ProtoBuf settings ## if test x"${PKGCONFIG}" == x"yes"; then if pkg-config --exists protobuf; then protobuf_cxxflags=`pkg-config --cflags protobuf` protobuf_libs=`pkg-config --libs protobuf` else protobuf_cxxflags="" protobuf_libs="-lprotobuf" fi else # Add a reasonable default of -lprotobuf if we don't have pkg-config protobuf_cxxflags="" protobuf_libs="-lprotobuf" fi ## And make sure these flags are used for the tests below. CPPFLAGS="${protobuf_cxxflags} ${CPPFLAGS}" CXXFLAGS="${protobuf_cxxflags} ${CXXFLAGS}" ## look for protoc, the ProtoBuf compiler AC_DEFUN([AC_PROG_PROTOC], [AC_CHECK_PROG(PROTOC,protoc,yes)]) AC_PROG_PROTOC if test x"${PROTOC}" == x"no" ; then echo " Your installation does not appear to have protoc installed. Please make sure that you have a working and complete ProtoBuf installation. " exit 1 fi ## look for protobuf headers -- now use pkg-config which even does minimum version ## ## next two lines break witha autoconf 2.65 :-/ #PROTOBUF_VERSION="2.2.0" #PKG_CHECK_MODULES(ProtoBuf, protobuf >= 2.2.0, , AC_MSG_ERROR(Protobuf version 2.2.0 required)) ## check for header and ability to link ## first for headers Debian has in libprotobuf-dev protobuf_common_header=google/protobuf/stubs/common.h protobuf_common_header_cache_var=AS_TR_SH([ac_cv_header_$protobuf_common_header]) AC_CHECK_HEADER([$protobuf_common_header],, [ # If it didn't work, try adding /usr/local directly then trying again AC_MSG_WARN([Protobuf headers not found with default CXXFLAGS and CPPFLAGS, manually trying /usr/local/include]) CPPFLAGS="${protobuf_cxxflags} ${CPPFLAGS} -I/usr/local/include" CXXFLAGS="${protobuf_cxxflags} ${CXXFLAGS} -I/usr/local/include -L/usr/local/lib" # unset the cache variable for this particular header # check, so we can check again with different defaults # specified. AC_MSG_WARN([Unsetting $protobuf_common_header_cache_var]) AS_UNSET([$protobuf_common_header_cache_var]) AC_CHECK_HEADER([$protobuf_common_header],, [AC_MSG_ERROR([ERROR: ProtoBuf headers required; use '-Iincludedir' in CXXFLAGS for unusual locations.])]) ]) ## second for headers Debian has in libprotoc-dev AC_CHECK_HEADER(google/protobuf/compiler/code_generator.h,, [AC_MSG_ERROR([ERROR: ProtoBuf compiler headers required; use '-Iincludedir' in CXXFLAGS for unusual locations.])]) ## third check the lib itself #pb_savedlibs="$LIBS" # LIBS="$LIBS -lprotoc -lprotobuf -lpthread" LIBS="$LIBS $protobuf_libs" ## also check for minimum version AC_MSG_CHECKING([if ProtoBuf version >= 2.2.0]) AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include int main() { if (GOOGLE_PROTOBUF_VERSION >= 2001000) { exit (0); } else { exit(1); } } ]])], [pb_version_ok=yes], [pb_version_ok=no], [pb_version_ok=yes]) if test x"${pb_version_ok}" == x"no"; then AC_MSG_ERROR([Need ProtoBuf version >= 2.2.0]) else AC_MSG_RESULT([yes]) fi AC_DEFUN([AC_PROG_R], [AC_CHECK_PROG(R,R,yes)]) AC_PROG_R ## With thanks to Kurt (now set above) #: ${R_HOME=`R RHOME`} #if test -z "${R_HOME}"; then # AC_MSG_ERROR([Could not determine R_HOME.]) #fi #R_CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` #CXXFLAGS="${CXXFLAGS} ${R_CXXFLAGS}" ## now use all these AC_SUBST([PKG_CPPFLAGS],["${PKG_CPPFLAGS} ${CXXFLAGS} ${protobuf_cxxflags}"]) AC_SUBST([PKG_LIBS],["${PKG_LIBS} ${protobuf_libs}"]) AC_CONFIG_FILES([src/Makevars]) AC_OUTPUT echo " ${PACKAGE_NAME} $PACKAGE_VERSION ================ cflags: ${PKG_CPPFLAGS} libs: ${PKG_LIBS} "