rjson/0000755000176200001440000000000013306535564011417 5ustar liggesusersrjson/inst/0000755000176200001440000000000013306330736012366 5ustar liggesusersrjson/inst/rpc_server/0000755000176200001440000000000013123762200014530 5ustar liggesusersrjson/inst/rpc_server/start_server0000644000176200001440000000043313123762200017176 0ustar liggesusers#!/bin/bash #R reads in R_PROFILE first - which will start up the server.r script, which then sources in anything from R_SERVER_SOURCE #R_SERVER_SOURCE is a colon delimited list of user source files to read in export R_PROFILE=server.r export R_SERVER_SOURCE=$1 r --slave --silent rjson/inst/rpc_server/server.r0000644000176200001440000000464613123762200016233 0ustar liggesusers#!/usr/bin/r --slave library( "rjson" ) library( "utils" ) #load in any extra sources source_files <- Sys.getenv( "R_SERVER_SOURCE" ) if( source_files != "" ) { source_files <- strsplit( source_files, ":" )[[1]] for( s in source_files ) source( s ) } #rpc is an R object corresponding to the parsed JSON-RPC call #returns: a JSON string with the results or error do.rpc <- function( rpc ) { rpc$params <- as.list( rpc$params ) result <- try( do.call( rpc$method, rpc$params ), silent = TRUE ) if( class( result ) == "try-error" ) { #TODO JSON-RPC defines several erorrs (call not found, invalid params, and server error) #if a call exists but fails, I am sending a procedure not found - when really it was found #but had an internal error. the data contains the actual error from R rpc_result <- list( jsonrpc = "2.0", error = list( code = -32601, message = "Procedure not found.", data = as.character( result ) ), id = rpc$id ) } else { #RPC call suceeded rpc_result <- list( jsonrpc = "2.0", result = result, id = rpc$id ) } #return the JSON string ret <- toJSON( rpc_result ) ret <- paste( ret, "\n", sep="" ) return( ret ) } #requires R 2.5.0 process_stdin <- file("stdin", blocking = T, open = "rb" ) json_parser <- newJSONParser() while( TRUE ) { #TODO read in data in larger chunks #when n > 1, readBin sometimes waits until a complete block of n chars is read - piping a flush doesn't always work when n > 1 s <- readBin( process_stdin, what = raw(), n = 1 ) #catch an OEF if( length( s ) == 0 ) break s <- rawToChar( s ) #add input to parser buffer json_parser$addData( s ) #Optimization: JSON RPC objects MUST terminate with a `}' - no need to check if the object can be parsed otherwise (since it can't) while( s == "}" ) { #try to extract any JSON objects rpc <- try( json_parser$getObject(), silent = TRUE ) if( class( rpc ) == "try-error" ) { #an error occured cat( '{"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}' ) #reset JSON parser json_parser <- newJSONParser() #clear anything on the input seek( process_stdin, where = 0, origin = "end" ) } else { #not enough data is in the buffer to extract a complete JSON object if( is.null( rpc ) ) break #a valid JSON object was extracted ret <- do.rpc( rpc ) cat( ret ) } } } #must quit here - otherwise, we get dropped into an R shell q() rjson/inst/rpc_server/start_server.bat0000644000176200001440000000046313123762200017746 0ustar liggesusers#R reads in R_PROFILE first - which will start up the server.r script, which then sources in anything from R_SERVER_SOURCE #R_SERVER_SOURCE is a colon delimited list of user source files to read in set R_PROFILE=server.r set R_SERVER_SOURCE=%1 set Path=.;C:\Program Files\R\R-2.9.0\bin\ r --slave --silent rjson/inst/rpc_server/some_script.r0000644000176200001440000000030713123762200017242 0ustar liggesusersrequire( "stats", quietly = TRUE ) user_func <- function( times ) { rep( "I am made of sugar", times ) } fib <- function( n ) { if( n < 2 ) return( 1 ) return( fib( n - 1 ) + fib( n - 2 ) ) } rjson/inst/unittests/0000755000176200001440000000000013277605035014434 5ustar liggesusersrjson/inst/unittests/test.number.r0000644000176200001440000000151713272714174017071 0ustar liggesusers.setUp <- function() {} .tearDown <- function() {} test.number <- function() { json <- "0" x <- fromJSON( json ) checkIdentical( x, 0 ) json <- "-0" x <- fromJSON( json ) checkIdentical( x, 0 ) json <- "15.05" x <- fromJSON( json ) checkIdentical( x, 15.05 ) json <- "-10.3" x <- fromJSON( json ) checkIdentical( x, -10.3 ) json <- "-0.3" x <- fromJSON( json ) checkIdentical( x, -0.3 ) json <- "0.3e3" x <- fromJSON( json ) checkIdentical( x, 300 ) json <- "0.2e+4" x <- fromJSON( json ) checkIdentical( x, 2000 ) json <- "0.1e-4" x <- fromJSON( json ) checkIdentical( x, 0.00001 ) # TODO check for invalid entries like 0.1e-4.5? failing_json <- c( ".3", "-.3", "0.1e" ) for( bad_json in failing_json ) { x <- try( fromJSON( bad_json ), silent = TRUE ) checkTrue( any( class( x ) == "try-error" ) ) } } rjson/inst/unittests/test.tojson.r0000644000176200001440000000417713123762200017106 0ustar liggesusers.setUp <- function() {} .tearDown <- function() {} test.tojson <- function() { x <- 15433 j <- toJSON( x, "C" ) checkIdentical( j, "15433" ) x <- 15.543 j <- toJSON( x, "C" ) checkIdentical( j, "15.543" ) x <- TRUE j <- toJSON( x, "C" ) checkIdentical( j, "true" ) x <- FALSE j <- toJSON( x, "C" ) checkIdentical( j, "false" ) x <- NULL j <- toJSON( x, "C" ) checkIdentical( j, "null" ) #Test strings x <- "hello" j <- toJSON( x, "C" ) checkIdentical( j, "\"hello\"" ) x <- "hel\"lo" j <- toJSON( x, "C" ) checkIdentical( j, "\"hel\\\"lo\"" ) x <- "hel\n" j <- toJSON( x, "C" ) checkIdentical( j, "\"hel\\n\"" ) x <- "\n\r\t" j <- toJSON( x, "C" ) checkIdentical( j, "\"\\n\\r\\t\"" ) x <- "" j <- toJSON( x, "C" ) checkIdentical( j, "\"\"" ) x <- "\u0041\u006c\u0065\u0078\u002B" j <- toJSON( x, "C" ) checkIdentical( j, "\"Alex+\"" ) x <- "\u018E" j <- toJSON( x, "C" ) checkIdentical( j, "\"\\u018e\"" ) x <- "\u3020" j <- toJSON( x, "C" ) checkIdentical( j, "\"\\u3020\"" ) #test arrays x <- c(10, 50, 30) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,30]" ) x <- list(10, 50, 30) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,30]" ) x <- list(10, 50, TRUE) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,true]" ) x <- list(10, 50, list()) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,[]]" ) x <- list(10, 50, NULL) j <- toJSON( x, "C" ) checkIdentical( j, "[10,50,null]" ) x <- list() j <- toJSON( x, "C" ) checkIdentical( j, "[]" ) x <- c(T,T,F,F,T,F) j <- toJSON( x, "C" ) checkIdentical( j, "[true,true,false,false,true,false]" ) #test dicts x <- list(key="value") j <- toJSON( x, "C" ) checkIdentical( j, "{\"key\":\"value\"}" ) x <- c(key="value") j <- toJSON( x, "C" ) checkIdentical( j, "{\"key\":\"value\"}" ) x <- c(key=TRUE, car=FALSE) j <- toJSON( x, "C" ) checkIdentical( j, "{\"key\":true,\"car\":false}" ) x <- list(key=TRUE, car=FALSE, apple=c(10.5, 28)) j <- toJSON( x, "C" ) checkIdentical( j, "{\"key\":true,\"car\":false,\"apple\":[10.5,28]}" ) x <- c(a=T,b=F) j <- toJSON( x, "C" ) checkIdentical( j, "{\"a\":true,\"b\":false}" ) } rjson/inst/unittests/test.list.r0000644000176200001440000000304313277604034016546 0ustar liggesusers.setUp <- function() {} .tearDown <- function() {} test.list <- function() { json <- "{}" x <- fromJSON( json ) checkIdentical( x, list() ) failing_json <- c( "{", "{a:5}", "{\"a:5}", "{\"a\":", "{\"a\":5", "{\"a\":}", "{123:false}", "{\"a\":unquoted}" ) for( bad_json in failing_json ) { x <- try( fromJSON( bad_json ), silent = TRUE ) checkTrue( any( class( x ) == "try-error" ) ) } json <- "{\"a\":5}" x <- fromJSON( json ) checkIdentical( x, list( a = 5 ) ) json <- "{\"a\":5,\"b\":10}" x <- fromJSON( json ) checkIdentical( x, list( a = 5, b = 10 ) ) json <- "{\"a\":5,\"b\":10, \"clap\":[true,false,false]}" x <- fromJSON( json ) correct <- list( a = 5, b = 10, clap = c(TRUE,FALSE,FALSE) ) checkIdentical( x, correct ) checkIdentical( x[["clap"]], correct[["clap"]] ) } test.nestedlist <- function() { json <- "[\"a\", [\"b\", \"c\"] ]" x <- fromJSON( json ) correct <- list( "a", c( "b", "c" ) ) checkIdentical( x, correct ) checkIdentical( x[[2]], correct[[2]] ) } test.bad.list <- function() { bad_json <- "{\"a\": 123,}" x <- try( fromJSON( bad_json ), silent = TRUE ) checkTrue( any( class( x ) == "try-error" ) ) } test.unsupported.sexp <- function() { x <- fromJSON('{ "key":[ { "foo":"bar" }, { "bah":"baz" }] }') correct <- list( key = list( list( foo = "bar" ), list( bah = "baz" ) )) checkIdentical( x, correct ) } test.rejected.comma <- function() { bad_json = '{ "key":[ { "foo":"bar" }, { "bah":"baz" },] }' x <- try( fromJSON( bad_json ), silent = TRUE ) checkTrue( any( class( x ) == "try-error" ) ) } rjson/inst/unittests/test.strings.r0000644000176200001440000000106113123762200017250 0ustar liggesusers.setUp <- function() {} .tearDown <- function() {} test.strings <- function() { json <- "\"\"" x <- fromJSON( json ) checkIdentical( x, "" ) json <- "\"hello world\"" x <- fromJSON( json ) checkIdentical( x, "hello world" ) json <- "\"hello\\ttab\"" x <- fromJSON( json ) checkIdentical( x, "hello\ttab" ) json <- "\"hello\\\"quote\"" x <- fromJSON( json ) checkIdentical( x, "hello\"quote" ) #really long string s <- paste( 1:100000, collapse = "-" ) json <- paste("\"", s, "\"", sep="" ) x <- fromJSON( json ) checkIdentical( x, s ) } rjson/inst/unittests/test.twitter.r0000644000176200001440000002133613123762200017270 0ustar liggesusers test.twitter <- function() { x <- "{\"results\":[{\"profile_image_url\":\"http://a1.twimg.com/profile_images/904661361/IMG00034-20100515-1550_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:21 +0000\",\"from_user\":\"YOtwittaDADDY\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"#random no basic bitch is safe on twitter! If I dont get you and tear you apart, @heartless_dex or @chefhomeboyjd will\",\"id\":20267740998,\"from_user_id\":108000717,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://mobile.twitter.com" rel="nofollow">Mobile Web</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/839850446/n835436_43297164_3982_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:20 +0000\",\"from_user\":\"vmsweet123\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"RT @richard_solo: Giveaway thru: 8/09. Win RichardSolo Noise Canceling Headphones. Follow @Richard_Solo & retweet http://bit.ly/bD8ezA\",\"id\":20267739854,\"from_user_id\":12289632,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a3.twimg.com/profile_images/430611695/sm_profile_square_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:20 +0000\",\"from_user\":\"ScottMcLemore\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":85038,\"text\":\"@alevin Thanks also for all the insight tonight! Trying to DM you but it says you're not following me. What's your other twitter name?\",\"id\":20267739573,\"from_user_id\":2032996,\"to_user\":\"alevin\",\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://www.tweetdeck.com/" rel="nofollow">TweetDeck</a>\"},{\"profile_image_url\":\"http://a0.twimg.com/profile_images/1083435260/black_rock_ramona_normal.png\",\"created_at\":\"Wed, 04 Aug 2010 01:45:18 +0000\",\"from_user\":\"zetacoes\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":70577019,\"text\":\"@xjazzy13 http://twitter.com/zetacoes/status/20254842627\",\"id\":20267738141,\"from_user_id\":1876460,\"to_user\":\"xJazzy13\",\"geo\":null,\"source\":\"<a href="http://www.echofon.com/" rel="nofollow">Echofon</a>\"},{\"profile_image_url\":\"http://a1.twimg.com/profile_images/350332457/110542_332748125_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:18 +0000\",\"from_user\":\"pepotan\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"\\u30de\\u30af\\u30c9\\u3082\\u3001twitter\\uff0b\\u30d6\\u30e9\\u30a6\\u30b6\\u30b2\\u30fc\\u3067\\u3001\\u30d7\\u30ed\\u30e2\\u3002 \\u30b3\\u30f3\\u30c6\\u30f3\\u30c4\\u306e\\u5185\\u5bb9\\u306f\\u3044\\u307e\\u3044\\u3061\\u3060\\u3051\\u3069\\u3001\\u5e83\\u544a\\u4ee3\\u7406\\u5e97\\u3068\\u5236\\u4f5c\\u4f1a\\u793e\\u304c\\u5132\\u304b\\u308b\\u4ed5\\u7d44\\u307f\\uff57 http://bit.ly/dtfwgs #McD_ckn\",\"id\":20267737693,\"from_user_id\":7864312,\"geo\":null,\"iso_language_code\":\"ja\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a3.twimg.com/profile_images/946831163/113082922_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:18 +0000\",\"from_user\":\"d_davidshi\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"HIT - HOW DO YOU GET 100 FREE TWITTER FOLLOWERS? http://tinyurl.com/32n9eda\",\"id\":20267737116,\"from_user_id\":82204650,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://dev.twitter.com/" rel="nofollow">API</a>\"},{\"profile_image_url\":\"http://a3.twimg.com/profile_images/387119699/Picture_or_Video_002_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:17 +0000\",\"from_user\":\"aestrap\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"Whoa! The twitter site changed on my phone.\",\"id\":20267736765,\"from_user_id\":2258787,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://mobile.twitter.com" rel="nofollow">Mobile Web</a>\"},{\"profile_image_url\":\"http://a1.twimg.com/profile_images/1070967993/J_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:17 +0000\",\"from_user\":\"jinnli\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":2408767,\"text\":\"@chrisoul \\u6628\\u5929\\u4e0a\\u6d77\\u65b9\\u9762\\u6765\\u62a5\\uff0cTwitter.com \\u7684\\u57df\\u540d\\u4e5f\\u89e3\\u5c01\\u4e86\\uff08\\u4f46\\u662f\\u6709\\u5927\\u90e8\\u5206IP\\u6254\\u5728\\u5c01\\uff09\\u3002\",\"id\":20267736571,\"from_user_id\":3150412,\"to_user\":\"chrisoul\",\"geo\":null,\"iso_language_code\":\"zh\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a1.twimg.com/profile_images/1077123381/20100714_000933_140_normal.gif\",\"created_at\":\"Wed, 04 Aug 2010 01:45:16 +0000\",\"from_user\":\"keshasuja\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"RT se Raul Gil acaba de visitar seu twitter - "Twitter is over capacity." - Minha baleia \\u00e9 MACHO (:\",\"id\":20267735081,\"from_user_id\":103469135,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a0.twimg.com/profile_images/1094336724/twitter_icon_from_annie_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:13 +0000\",\"from_user\":\"ColtChambers\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":108642403,\"text\":\"@shawnmock132 they dont have twitter\",\"id\":20267732425,\"from_user_id\":34795175,\"to_user\":\"shawnmock132\",\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/1078874562/Foto_47_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:13 +0000\",\"from_user\":\"Sjoerd\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":16735834,\"text\":\"@Jarlrule @mitsuo @wilbertleering @zapache @ock12 @ehpo @henneaux no 4square!! SMS Twitter en #ichannel... Vanuit een dampend kroatie\",\"id\":20267732273,\"from_user_id\":905717,\"to_user\":\"Jarlrule\",\"geo\":{\"type\":\"Point\",\"coordinates\":[44.1138,15.2333]},\"iso_language_code\":\"nl\",\"source\":\"<a href="http://twitter.com/" rel="nofollow">Twitter for iPhone</a>\"},{\"profile_image_url\":\"http://a3.twimg.com/profile_images/576571611/Smoked_Tacos_2_jpg_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:13 +0000\",\"from_user\":\"creep4ward\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"Giveaway thru: 8/09. Win RichardSolo Noise Canceling Headphones. Follow @Richard_Solo & retweet http://bit.ly/bD8ezA\",\"id\":20267732038,\"from_user_id\":85290503,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/1005104638/Picture_310re_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:13 +0000\",\"from_user\":\"LADiixBANKS\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"Ahhhh so matt finally got yu on the waveee! Lol RT @RitzNOCrackers: @myniggaLIP . ----> @LADiixBANKS guess who has a twitter JIMMY LMAO\",\"id\":20267731542,\"from_user_id\":23608569,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://seesmic.com/seesmic_mobile/android/" rel="nofollow">Seesmic for Android</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/1093270058/never_let_you_go3_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:11 +0000\",\"from_user\":\"DenverBeliebers\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"getting off twitter!!!\",\"id\":20267729271,\"from_user_id\":80666587,\"geo\":null,\"iso_language_code\":\"no\",\"source\":\"<a href="http://twitter.com/">web</a>\"},{\"profile_image_url\":\"http://a2.twimg.com/profile_images/1094119234/image_normal.jpg\",\"created_at\":\"Wed, 04 Aug 2010 01:45:10 +0000\",\"from_user\":\"overDRESSed_1\",\"metadata\":{\"result_type\":\"recent\"},\"to_user_id\":null,\"text\":\"Omg!!!!!! Twitter for iPhone won't work on my phone!!!!!! Having a meltdown!!!!\",\"id\":20267728785,\"from_user_id\":53192938,\"geo\":null,\"iso_language_code\":\"en\",\"source\":\"<a href="http://www.echofon.com/" rel="nofollow">Echofon</a>\"}],\"max_id\":20267740998,\"since_id\":0,\"refresh_url\":\"?since_id=20267740998&q=twitter\",\"next_page\":\"?page=2&max_id=20267740998&q=twitter\",\"results_per_page\":15,\"page\":1,\"completed_in\":0.017069,\"query\":\"twitter\"}" jdata <- fromJSON( x ) checkTrue( is.list( jdata ) ) } rjson/inst/unittests/test.factors.r0000644000176200001440000000032413123762200017221 0ustar liggesusers.setUp <- function() {} .tearDown <- function() {} test.factors <- function() { x <- as.factor(c("abc", "abc", "dog", "abc")) json <- toJSON( x ) checkIdentical( json, "[\"abc\",\"abc\",\"dog\",\"abc\"]" ) } rjson/inst/unittests/runtests.r0000644000176200001440000000035013135713575016506 0ustar liggesuserslibrary( rjson ) library( RUnit ) path <- system.file( "unittests", package="rjson" ) test.suite <- defineTestSuite( "json unittests", dirs = path, testFileRegexp = "^test\\..*\\.[rR]$" ) runTestSuite( test.suite, verbose = 100 ) rjson/inst/unittests/test.unicode.r0000644000176200001440000000222713272715632017226 0ustar liggesusers.setUp <- function() {} .tearDown <- function() {} test.unicode <- function() { json <- "\"\"" x <- fromJSON( json ) checkIdentical( x, "" ) #test ASCII compatible utf8 json <- "\"\\u0041\\u006c\\u0065\\u0078\\u002B\"" x <- fromJSON( json ) checkIdentical( x, "Alex+", paste( "got:", x ) ) #test 2 byte utf8 unicode json <- "\"\\u018E\"" x <- fromJSON( json ) checkIdentical( x, "\u018E" ) checkTrue( all( charToRaw( x ) == c( 0xc6, 0x8e ) ) ) checkTrue( length( charToRaw( x ) ) == 2 ) #test 2 byte utf8 unicode json <- "\"\\u018E\"" x <- fromJSON( json ) checkIdentical( x, "\u018E" ) checkTrue( all( charToRaw( x ) == c( 0xc6, 0x8e ) ) ) checkTrue( length( charToRaw( x ) ) == 2 ) #test 3 byte utf8 unicode json <- "\"\\u3020\"" x <- fromJSON( json ) checkIdentical( x, "\u3020" ) checkTrue( all( charToRaw( x ) == c( 0xe3, 0x80, 0xa0 ) ) ) checkTrue( length( charToRaw( x ) ) == 3 ) #x = newJSONParser() #x$addData( "\"\\u00" ) #checkTrue( is.null( x$getObject() ) ) #should be incomplete # test surrogate pair json <- "\"Anaheim \\ud83d\\ude0eDucks\"" x <- fromJSON( json ) checkIdentical( x, "Anaheim \xf0\x9f\x98\x8eDucks" ) } rjson/inst/unittests/test.big.r0000644000176200001440000022677413123762200016344 0ustar liggesusers test.big <- function() { x <- "{\"client_crash_date\": \"2011-03-07 05:13:12.0\", \"dump\": \"OS|Windows NT|5.1.2600 Service Pack 3\\nCPU|x86|GenuineIntel family 15 model 4 stepping 9|1\\nCrash|EXCEPTION_BREAKPOINT|0x7d1a39|35\\nModule|mozsqlite3.dll|3.7.4.0|mozsqlite3.pdb|CCD45CF588204B1A8CEF6FECB6B93E792|0x002f0000|0x003adfff|1\\nModule|nspr4.dll|4.8.7.0|nspr4.pdb|FDA5820F749843EC874389EAB4E93BE31|0x003b0000|0x003e0fff|0\\nModule|plc4.dll|4.8.7.0|plc4.pdb|D597300208DE4FC280BF6EE27D65B2CA1|0x003f0000|0x003f6fff|0\\nModule|firefox.exe|2.0.0.4070|firefox.pdb|C4A306AC5FEF4AEC8C1D4B5FB67AC5962|0x00400000|0x004dffff|0\\nModule|mozjs.dll||mozjs.pdb|52A98E4CEEFF4B49B3CCFB5F982EEB502|0x004e0000|0x006a9fff|0\\nModule|smime3.dll|3.12.9.0|smime3.pdb|C4A927FA7F2C40F2A4CE92ECFD85AB8F1|0x006b0000|0x006c7fff|0\\nModule|nss3.dll|3.12.9.0|nss3.pdb|2BA2153B4E9B4E9584B1607C74B49D731|0x006d0000|0x0076cfff|0\\nModule|nssutil3.dll|3.12.9.0|nssutil3.pdb|8AF09479D67149F49A1D6A449114A7151|0x00770000|0x00783fff|0\\nModule|plds4.dll|4.8.7.0|plds4.pdb|E415FC709E07498198C66014653CC5411|0x00790000|0x00796fff|0\\nModule|ssl3.dll|3.12.9.0|ssl3.pdb|24D906A8F8A0487591D3824EED19DFC41|0x007a0000|0x007c0fff|0\\nModule|mozalloc.dll|2.0.0.4070|mozalloc.pdb|584764FC91694A68BFB321843787472E2|0x007d0000|0x007d5fff|0\\nModule|xpcom.dll|2.0.0.4070|xpcom.pdb|8DF06173F9764BA1B96E8137AC7D8B952|0x007e0000|0x007e6fff|0\\nModule|Iminent.WinCore.dll|3.47.0.0|||0x012e0000|0x012edfff|0\\nModule|browsercomps.dll|2.0.0.4070|browsercomps.pdb|ECF64DE0EC534626B0A3463F506FB4172|0x02800000|0x02820fff|0\\nModule|F3HKSTUB.DLL|1.0.0.0|f3hkstub.pdb|4C75A6EB1|0x02920000|0x02925fff|0\\nModule|RadioWMPCore.dll||RadioWMPCore.pdb|165E7A3FF5404CF28E6E55658F2466D51|0x02a30000|0x02a4afff|0\\nModule|softokn3.dll|3.12.9.0|softokn3.pdb|F43E2E3D6CE54276B054B916557C99301|0x03600000|0x03626fff|0\\nModule|nssdbm3.dll|3.12.9.0|nssdbm3.pdb|671501D946A64CF7A375B506033131F01|0x03630000|0x03647fff|0\\nModule|freebl3.dll|3.12.9.0|freebl3.pdb|0716E0E00A644CC09C0070C3966B0F961|0x03650000|0x03693fff|0\\nModule|nssckbi.dll|1.81.0.0|nssckbi.pdb|FF4BEC1F2A1D4069BF727A4088E5FEC71|0x036a0000|0x036f1fff|0\\nModule|xpsp2res.dll|5.1.2600.5512|||0x03900000|0x03bd5fff|0\\nModule|NPMYWEBS.DLL|1.0.0.0|NPMyWebS.pdb|4C75A6D41|0x05b60000|0x05b65fff|0\\nModule|M3PLUGIN.DLL|1.1.0.6|m3Plugin.pdb|4C75A6D81|0x05b70000|0x05b7dfff|0\\nModule|MWSOESTB.DLL|1.2.4.0|mwsoestb.pdb|4B2AF61A1|0x07f50000|0x07f5afff|0\\nModule|normaliz.dll|6.0.5441.0|normaliz.pdb|D0658E322B2D4DDCA57FB9C9715C6CAD1|0x094e0000|0x094e8fff|0\\nModule|xul.dll|2.0.0.4070|xul.pdb|EAD6C11B057D423D976392142725A5382|0x10000000|0x10daefff|0\\nModule|mdnsNSP.dll|1.0.3.1|mdnsNSP.pdb|0AF2F131804446D8BC574BC39DEF79F91|0x16080000|0x16098fff|0\\nModule|netapi32.dll|5.1.2600.5512|netapi32.pdb|FB9EEF3B11C949BA95FBD378260A07B02|0x597f0000|0x59844fff|0\\nModule|uxtheme.dll|6.0.2900.5512|uxtheme.pdb|E99E16308F094767B1F07FB5C3E5E2462|0x5b150000|0x5b187fff|0\\nModule|dbghelp.dll|5.1.2600.5512|dbghelp.pdb|7FA1C63A9BF54470BCA31E35A94F49971|0x5d4b0000|0x5d550fff|0\\nModule|iertutil.dll|7.0.5730.13|iertutil.pdb|EE4D411A91474AA79C2966293E0B73DA2|0x5dca0000|0x5dce4fff|0\\nModule|snxhk.dll|5.1.889.0|snxhk.pdb|6C3E58D898DF46A0BD5CDC2E19CD87DA1|0x64d00000|0x64d30fff|0\\nModule|hnetcfg.dll|5.1.2600.5512|HNetCfg.pdb|87332C2BFF6E42FCB89784A1D24EC2711|0x66740000|0x66798fff|0\\nModule|rsaenh.dll|5.1.2600.5507|rsaenh.pdb|893323FC16E048E8943A01E789A49C9B1|0x68000000|0x68035fff|0\\nModule|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x68040000|0x68300fff|0\\nModule|feclient.dll|5.1.2600.5512|feclient.pdb|D063E98372D14444BE0B1ECEABF191271|0x698d0000|0x698d8fff|0\\nModule|mswsock.dll|5.1.2600.5512|mswsock.pdb|0BC563E52F9E43E49E074DA97D4171712|0x719d0000|0x71a0ffff|0\\nModule|wshtcpip.dll|5.1.2600.5512|wshtcpip.pdb|DE2E52603FFB406D9052C8D884A1AD722|0x71a10000|0x71a17fff|0\\nModule|ws2help.dll|5.1.2600.5512|ws2help.pdb|6049CF5877C54E2AB512ABC1B4B2E7992|0x71a20000|0x71a27fff|0\\nModule|ws2_32.dll|5.1.2600.5512|ws2_32.pdb|A7605F8695A34329B38DDB8421A004CA2|0x71a30000|0x71a46fff|0\\nModule|wsock32.dll|5.1.2600.5512|wsock32.pdb|2B38FE8F84144DACB8A4FD07C05E49FC2|0x71a50000|0x71a59fff|0\\nModule|mpr.dll|5.1.2600.5512|mpr.pdb|A9B542306C364AA2BAF25EFE9F3C2B5A2|0x71aa0000|0x71ab1fff|0\\nModule|samlib.dll|5.1.2600.5512|samlib.pdb|4BB85DE79B104F1595F96DF1ADAC91C82|0x71b90000|0x71ba2fff|0\\nModule|msacm32.drv|5.1.2600.0|msacm32.pdb|3B7D82B51|0x72c90000|0x72c97fff|0\\nModule|wdmaud.drv|5.1.2600.5512|wdmdrv.pdb|CC3EC71E05C44E6595271A6773E15AF21|0x72ca0000|0x72ca8fff|0\\nModule|winspool.drv|5.1.2600.5512|winspool.pdb|5199B63B39904A05A517CEE5158071522|0x72f80000|0x72fa5fff|0\\nModule|vbscript.dll|5.7.0.16599|vbscript.pdb|22EE02E44C844093937E481AF7C079C12|0x73280000|0x732e9fff|0\\nModule|mscms.dll|5.1.2600.5512|mscms.pdb|58640C648DA24D56912927158414FA8C2|0x73ab0000|0x73ac4fff|0\\nModule|t2embed.dll|5.1.2600.5512|t2embed.pdb|731403DF32C24A29AFB4DC3D4825E4411|0x73c60000|0x73c7ffff|0\\nModule|lz32.dll|5.1.2600.0|lz32.pdb|3B7D84BD1|0x73d40000|0x73d42fff|0\\nModule|MSCTF.dll|5.1.2600.5512|msctf.pdb|C52F0B4C00E94556AE999F228B0019662|0x746b0000|0x746fbfff|0\\nModule|usp10.dll|1.420.2600.5512|usp10.pdb|0F289BC0C9A94139BC1C31EDEDBF52311|0x74d20000|0x74d8afff|0\\nModule|MSCTFIME.IME|5.1.2600.5512|msctfime.pdb|602288883AF44453979369233E091E641|0x75160000|0x7518dfff|0\\nModule|msimg32.dll|5.1.2600.5512|msimg32.pdb|D2E18526D8234F4BB5A85DE12E71DE812|0x76330000|0x76334fff|0\\nModule|imm32.dll|5.1.2600.5512|imm32.pdb|F7A5B5DB13324153B57AAF340C77EA512|0x76340000|0x7635cfff|0\\nModule|comdlg32.dll|6.0.2900.5512|comdlg32.pdb|026A6FF770FD4E6186ADBBE96DFFA99C2|0x76360000|0x763a9fff|0\\nModule|userenv.dll|5.1.2600.5512|userenv.pdb|9FEE774E547347799689D6BAF9DAB4102|0x76630000|0x766e4fff|0\\nModule|cryptui.dll|5.131.2600.5512|cryptui.pdb|EBC7B38E15F9461D9BBC9317BBB7E8D42|0x76890000|0x76913fff|0\\nModule|sxs.dll|5.1.2600.5512|sxs.pdb|13300A765A3B4E9BAE52C373053C152F2|0x76980000|0x76a30fff|0\\nModule|winmm.dll|5.1.2600.5512|winmm.pdb|90FC96D5AD8440A2B14855895BD92ED62|0x76b00000|0x76b2dfff|0\\nModule|psapi.dll|5.1.2600.5512|psapi.pdb|B9875A55C874489384EA8FB805322C312|0x76bb0000|0x76bbafff|0\\nModule|wintrust.dll|5.131.2600.5512|wintrust.pdb|91992FC368B7419889AC7597420354F52|0x76bf0000|0x76c1dfff|0\\nModule|imagehlp.dll|5.1.2600.5512|imagehlp.pdb|111D199988C249ACA0335F467A6311412|0x76c50000|0x76c77fff|0\\nModule|iphlpapi.dll|5.1.2600.5512|iphlpapi.pdb|9B09F073003F4CA48F9980B3C091448F2|0x76d20000|0x76d38fff|0\\nModule|dnsapi.dll|5.1.2600.5512|dnsapi.pdb|2602DE4D984348A8A8C36DD43F02E2152|0x76ee0000|0x76f06fff|0\\nModule|wldap32.dll|5.1.2600.5512|wldap32.pdb|AC04BCF6FF294FCEAC8B8D937CBA3A172|0x76f20000|0x76f4cfff|0\\nModule|winrnr.dll|5.1.2600.5512|winrnr.pdb|9FE1A4669B69400FAC821A4367AA9CC52|0x76f70000|0x76f77fff|0\\nModule|rasadhlp.dll|5.1.2600.5512|rasadhlp.pdb|CCA669B1582847D0B330D7ABDB446A472|0x76f80000|0x76f85fff|0\\nModule|clbcatq.dll|2001.12.4414.700|clbcatq.pdb|8AE9C54730824764AAF39EA69F8D87582|0x76f90000|0x7700efff|0\\nModule|comres.dll|2001.12.4414.700|COMRes.pdb|A02453A3EB42413FBFF95326893E977Df|0x77010000|0x770dffff|0\\nModule|oleaut32.dll|5.1.2600.5512|oleaut32.pdb|F2A209009B694EFCAD1A6CE9D992EBC12|0x770f0000|0x7717afff|0\\nModule|wininet.dll|7.0.5730.13|wininet.pdb|9EA644C8A78041C1BB0FC6D6ACFE8E202|0x771b0000|0x7727dfff|0\\nModule|comctl32.dll|6.0.2900.5512|MicrosoftWindowsCommon-Controls-6.0.2600.5512-comctl32.pdb|505057971C40416FB39FED1D39BED0571|0x773a0000|0x774a2fff|0\\nModule|ole32.dll|5.1.2600.5512|ole32.pdb|ED517599D2C14CF19200861833059C142|0x774b0000|0x775ecfff|0\\nModule|ntmarta.dll|5.1.2600.5512|ntmarta.pdb|EB9B3E21F92F4F51AD85D86F4D7741A82|0x77660000|0x77680fff|0\\nModule|setupapi.dll|5.1.2600.5512|setupapi.pdb|9D52182415AA4179960B37F4C694F90D2|0x778f0000|0x779e6fff|0\\nModule|crypt32.dll|5.131.2600.5512|crypt32.pdb|3D2E43BF4FF5446B83957512615FD0942|0x77a50000|0x77ae5fff|0\\nModule|msasn1.dll|5.1.2600.5512|msasn1.pdb|DBFCEAEE0AB647F7BB94623535C531262|0x77af0000|0x77b01fff|0\\nModule|midimap.dll|5.1.2600.5512|midimap.pdb|D9AE872F08744C789E5170943BBBD10D1|0x77ba0000|0x77ba6fff|0\\nModule|msacm32.dll|5.1.2600.5512|msacm32.pdb|8256BD89DE024F3C970B66B9B5E5D8992|0x77bb0000|0x77bc4fff|0\\nModule|version.dll|5.1.2600.5512|version.pdb|EA3D1BD3FE65475C8449C8D8B00722962|0x77bd0000|0x77bd7fff|0\\nModule|msvcrt.dll|7.0.2600.5512|msvcrt.pdb|7BCF30D8C91B4F1B85FA4E55896250111|0x77be0000|0x77c37fff|0\\nModule|advapi32.dll|5.1.2600.5512|advapi32.pdb|5EFB9BF42CC64024AB64802E467394642|0x77da0000|0x77e4bfff|0\\nModule|rpcrt4.dll|5.1.2600.5512|rpcrt4.pdb|CCD4FE9B704E48B6B8A12F31E112AA6F2|0x77e50000|0x77ee1fff|0\\nModule|gdi32.dll|5.1.2600.5512|gdi32.pdb|740F60A99F2A417E96C387400994588D2|0x77ef0000|0x77f38fff|0\\nModule|shlwapi.dll|6.0.2900.5512|shlwapi.pdb|8519E3403447478884CFFE7F1A91BAE02|0x77f40000|0x77fb5fff|0\\nModule|secur32.dll|5.1.2600.5512|secur32.pdb|E8D378740B8E4A46B19CAFCD2D6DDF7D2|0x77fc0000|0x77fd0fff|0\\nModule|mozcrt19.dll|8.0.0.0|MOZCRT19.pdb|14FCEDCA1CE34BD2A90401CBC9260D2D1|0x78130000|0x781defff|0\\nModule|mozcpp19.dll|8.0.0.0|MOZCPP19.pdb|68AC85FFFBB84AA58FCA4B9883BE11D91|0x7c420000|0x7c4cefff|0\\nModule|kernel32.dll|5.1.2600.5512|kernel32.pdb|34560E80F5C54175B208848EF863C5BD2|0x7c800000|0x7c902fff|0\\nModule|ntdll.dll|5.1.2600.5512|ntdll.pdb|1751003260CA42598C0FB326585000ED2|0x7c910000|0x7c9c4fff|0\\nModule|shdocvw.dll|6.0.2900.5512|shdocvw.pdb|709A33A5D8EE48BB8A437827FE342C0C2|0x7e210000|0x7e380fff|0\\nModule|user32.dll|5.1.2600.5512|user32.pdb|D18A41B74E7F458CAAAC1847E2D8BF022|0x7e390000|0x7e420fff|0\\nModule|shell32.dll|6.0.2900.5512|shell32.pdb|69B3829BB6884926A5B97BF04E812C6B2|0x7e6a0000|0x7eec0fff|0\\n\\n35|0|mozalloc.dll|mozalloc_abort(char const * const)|hg:hg.mozilla.org/mozilla-central:memory/mozalloc/mozalloc_abort.cpp:d322a1c8537e|77|0x0\\n35|1|xul.dll|NS_DebugBreak_P|hg:hg.mozilla.org/mozilla-central:xpcom/base/nsDebugImpl.cpp:d322a1c8537e|350|0xc\\n35|2|xul.dll|nsCycleCollectingAutoRefCnt::decr(nsISupports *)|||0x38\\n35|3|xul.dll|nsGlobalChromeWindow::Release()|hg:hg.mozilla.org/mozilla-central:dom/base/nsGlobalWindow.cpp:d322a1c8537e|1336|0x1a\\n35|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4cabd\\n35|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xaca7\\n35|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f3e01\\n35|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xafd7\\n35|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x11258\\n35|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x82298\\n35|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f978a\\n35|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x82537\\n35|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x19ce51\\n35|13|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x20de7f\\n35|14|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x19d6df\\n35|15|ntdll.dll|LdrLoadDll|||0x14a\\n35|16|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x20df3f\\n35|17|kernel32.dll|BaseThreadStart|||0x36\\n35|18|ntdll.dll|LdrLoadDll|||0x14a\\n35|19|kernel32.dll|GetCodePageFileInfo|||0x138\\n0|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n0|1|user32.dll|NtUserWaitMessage|||0xb\\n0|2|xul.dll|nsAppShell::ProcessNextNativeEvent(int)|hg:hg.mozilla.org/mozilla-central:widget/src/windows/nsAppShell.cpp:d322a1c8537e|343|0x5\\n0|3|xul.dll|nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIFrame *,nsPresContext *,nsHTMLReflowState const &,int,int,int,nsIFrame *,unsigned int &,nsOverflowAreas *)|hg:hg.mozilla.org/mozilla-central:layout/generic/nsAbsoluteContainingBlock.cpp:d322a1c8537e|500|0x9\\n1|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n1|1|ntdll.dll|NtCreateSection|||0xb\\n1|2|kernel32.dll|MapViewOfFile|||0x31\\n1|3|ntdll.dll|RtlQueryInformationActivationContext|||0x14e\\n1|4|kernel32.dll|CloseHandle|||0x43\\n2|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n2|1|ntdll.dll|ZwRemoveIoCompletion|||0xb\\n2|2|kernel32.dll|GetQueuedCompletionStatus|||0x28\\n2|3|xul.dll|base::MessagePumpForIO::GetIOItem(unsigned long,base::MessagePumpForIO::IOItem *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|528|0x24\\n2|4|xul.dll|base::MessagePumpForIO::WaitForIOCompletion(unsigned long,base::MessagePumpForIO::IOHandler *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|499|0xb\\n2|5|xul.dll|base::MessagePumpForIO::WaitForWork()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|492|0xb\\n2|6|xul.dll|base::MessagePumpForIO::DoRunLoop()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|477|0x5\\n2|7|xul.dll|base::MessagePumpWin::RunWithDispatcher(base::MessagePump::Delegate *,base::MessagePumpWin::Dispatcher *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.cc:d322a1c8537e|52|0x6\\n2|8|xul.dll|base::MessagePumpWin::Run(base::MessagePump::Delegate *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_pump_win.h:d322a1c8537e|78|0xb\\n2|9|xul.dll|MessageLoop::RunInternal()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_loop.cc:d322a1c8537e|219|0x8\\n2|10|xul.dll|MessageLoop::RunHandler()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_loop.cc:d322a1c8537e|202|0x4\\n2|11|xul.dll|base::ThreadLocalPlatform::SetValueInSlot(int &,void *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/thread_local_win.cc:d322a1c8537e|33|0xa\\n2|12|xul.dll|MessageLoop::Run()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/message_loop.cc:d322a1c8537e|176|0x6\\n2|13|xul.dll|base::Thread::ThreadMain()|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/thread.cc:d322a1c8537e|156|0x8\\n2|14|xul.dll|`anonymous namespace'::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:ipc/chromium/src/base/platform_thread_win.cc:d322a1c8537e|26|0x8\\n2|15|kernel32.dll|BaseThreadStart|||0x36\\n3|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n3|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n3|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n3|3|kernel32.dll|WaitForSingleObject|||0x11\\n3|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n3|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n3|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n3|7|xul.dll|nsCycleCollectorRunner::Run()|hg:hg.mozilla.org/mozilla-central:xpcom/base/nsCycleCollector.cpp:d322a1c8537e|3315|0xa\\n3|8|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|633|0x13\\n3|9|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n3|10|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n3|11|ntdll.dll|_SEH_epilog|||0x19\\n3|12|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n3|13|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n3|14|ntdll.dll|_SEH_epilog|||0x19\\n3|15|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n3|16|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n3|17|ntdll.dll|_SEH_epilog|||0x19\\n4|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n4|1|user32.dll|NtUserPostMessage|||0xb\\n4|2|xul.dll|nsThread::Dispatch(nsIRunnable *,unsigned int)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|433|0x42\\n4|3|xul.dll|nsTimerImpl::PostTimerEvent()|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsTimerImpl.cpp:d322a1c8537e|552|0x18\\n4|4|xul.dll|TimerThread::Run()|hg:hg.mozilla.org/mozilla-central:xpcom/threads/TimerThread.cpp:d322a1c8537e|313|0x6\\n4|5|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|633|0x13\\n4|6|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n4|7|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n4|8|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n4|9|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n4|10|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n4|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n4|12|kernel32.dll|GetCodePageFileInfo|||0x138\\n5|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n5|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n5|2|kernel32.dll|CreateFileMappingA|||0x85\\n5|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n5|4|xul.dll|nsNotifyAddrListener::Run()|hg:hg.mozilla.org/mozilla-central:netwerk/system/win32/nsNotifyAddrListener.cpp:d322a1c8537e|192|0xf\\n5|5|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|633|0x13\\n5|6|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n5|7|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n5|8|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n5|9|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n5|10|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n5|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n5|12|mozjs.dll||||0x19006d\\n6|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n6|1|ntdll.dll|ZwRemoveIoCompletion|||0xb\\n6|2|mswsock.dll|SockAsyncThread|||0x59\\n6|3|kernel32.dll|BaseThreadStart|||0x36\\n7|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n7|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n7|2|mswsock.dll|SockBuildSockaddr|||0x135\\n7|3|mswsock.dll|SockReleaseRwLockExclusive|||0x40\\n7|4|ws2_32.dll|select|||0xa6\\n7|5|nspr4.dll|_PR_MD_PR_POLL|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w32poll.c:d322a1c8537e|279|0xe\\n7|6|nspr4.dll|PR_Poll|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/io/prio.c:d322a1c8537e|173|0x12\\n7|7|xul.dll|nsSocketTransportService::Poll(int,unsigned int *)|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsSocketTransportService2.cpp:d322a1c8537e|358|0xc\\n7|8|xul.dll|nsSocketTransportService::DoPollIteration(int)|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsSocketTransportService2.cpp:d322a1c8537e|673|0x10\\n7|9|xul.dll|nsSocketTransportService::OnProcessNextEvent(nsIThreadInternal *,int,unsigned int)|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsSocketTransportService2.cpp:d322a1c8537e|551|0xc\\n7|10|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|597|0x1\\n7|11|xul.dll|NS_ProcessPendingEvents_P(nsIThread *,unsigned int)|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|200|0xb\\n7|12|xul.dll|NS_ProcessNextEvent_P(nsIThread *,int)|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|250|0xc\\n7|13|xul.dll|nsSocketTransportService::Run()|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsSocketTransportService2.cpp:d322a1c8537e|594|0x9\\n7|14|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|633|0x13\\n7|15|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n7|16|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n7|17|ntdll.dll|RtlpAdjustHeapLookasideDepth|||0x2d3\\n7|18|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n7|19|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n7|20|ntdll.dll|RtlpAdjustHeapLookasideDepth|||0x2d3\\n7|21|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n7|22|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n7|23|ntdll.dll|RtlpAdjustHeapLookasideDepth|||0x2d3\\n8|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n8|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n8|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n8|3|kernel32.dll|WaitForSingleObject|||0x11\\n8|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n8|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n8|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n8|7|mozjs.dll|js::GCHelperThread::threadLoop(JSRuntime *)|hg:hg.mozilla.org/mozilla-central:js/src/jsgc.cpp:d322a1c8537e|2084|0xb\\n8|8|mozjs.dll|js::GCHelperThread::threadMain(void *)|hg:hg.mozilla.org/mozilla-central:js/src/jsgc.cpp:d322a1c8537e|2070|0xe\\n8|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n8|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n8|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n8|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n8|13|kernel32.dll|BaseThreadStart|||0x36\\n9|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n9|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n9|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n9|3|kernel32.dll|WaitForSingleObject|||0x11\\n9|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n9|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n9|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n9|7|xul.dll|XPCJSRuntime::WatchdogMain(void *)|hg:hg.mozilla.org/mozilla-central:js/src/xpconnect/src/xpcjsruntime.cpp:d322a1c8537e|988|0xc\\n9|8|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n9|9|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n9|10|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n9|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n9|12|kernel32.dll|BaseThreadStart|||0x36\\n10|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n10|1|ntdll.dll|NtReplyWaitReceivePortEx|||0xb\\n10|2|rpcrt4.dll|RpcpPurgeEEInfoFromThreadIfNecessary(THREAD *)|||0x48\\n10|3|rpcrt4.dll|RecvLotsaCallsWrapper(LRPC_ADDRESS *)|||0xc\\n10|4|rpcrt4.dll|BaseCachedThreadRoutine(CACHED_THREAD *)|||0x52\\n10|5|rpcrt4.dll|ThreadStartRoutine(THREAD *)|||0x19\\n10|6|kernel32.dll|BaseThreadStart|||0x36\\n11|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n11|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n11|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n11|3|kernel32.dll|WaitForSingleObject|||0x11\\n11|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n11|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n11|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n11|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n11|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n11|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n11|10|ole32.dll|CheckDownloadRegistrySettings()|||0x59\\n11|11|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n11|12|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n11|13|ole32.dll|CheckDownloadRegistrySettings()|||0x59\\n11|14|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n11|15|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n11|16|kernel32.dll|GetCodePageFileInfo|||0x138\\n12|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n12|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n12|2|kernel32.dll|CreateFileMappingA|||0x85\\n12|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n12|4|wdmaud.drv|MixerCallbackThread|||0x41\\n12|5|kernel32.dll|BaseThreadStart|||0x36\\n13|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n13|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n13|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n13|3|kernel32.dll|WaitForSingleObject|||0x11\\n13|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n13|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n13|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n13|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n13|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n13|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n13|10|nspr4.dll|PR_ExitMonitor|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|132|0x6\\n13|11|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n13|12|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n13|13|nspr4.dll|PR_ExitMonitor|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|132|0x6\\n13|14|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n13|15|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n13|16|kernel32.dll|GetCodePageFileInfo|||0x138\\n14|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n14|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n14|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n14|3|kernel32.dll|WaitForSingleObject|||0x11\\n14|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n14|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n14|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n14|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n14|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n14|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n14|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n14|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n14|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n14|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n14|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n15|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n15|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n15|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n15|3|kernel32.dll|WaitForSingleObject|||0x11\\n15|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n15|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n15|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n15|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n15|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n15|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n15|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n15|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n15|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n15|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n15|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n16|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n16|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n16|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n16|3|kernel32.dll|WaitForSingleObject|||0x11\\n16|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n16|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n16|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n16|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n16|8|xul.dll|nsThreadStartupEvent::Run()|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|207|0xf\\n16|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n16|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n16|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n16|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n16|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n16|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n17|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n17|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n17|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n17|3|kernel32.dll|WaitForSingleObject|||0x11\\n17|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n17|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n17|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n17|7|xul.dll|nsSSLThread::Run()|hg:hg.mozilla.org/mozilla-central:security/manager/ssl/src/nsSSLThread.cpp:d322a1c8537e|980|0xa\\n17|8|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n17|9|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n17|10|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n17|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n17|12|kernel32.dll|BaseThreadStart|||0x36\\n18|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n18|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n18|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n18|3|kernel32.dll|WaitForSingleObject|||0x11\\n18|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n18|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n18|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n18|7|xul.dll|nsCertVerificationThread::Run()|hg:hg.mozilla.org/mozilla-central:security/manager/ssl/src/nsCertVerificationThread.cpp:d322a1c8537e|138|0xa\\n18|8|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n18|9|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n18|10|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n18|11|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n18|12|kernel32.dll|BaseThreadStart|||0x36\\n19|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n19|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n19|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n19|3|kernel32.dll|WaitForSingleObject|||0x11\\n19|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n19|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n19|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n19|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n19|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n19|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n19|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n19|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n19|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n19|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n19|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n20|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n20|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n20|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n20|3|kernel32.dll|WaitForSingleObject|||0x11\\n20|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n20|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n20|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n20|7|xul.dll|nsHostResolver::GetHostToLookup(nsHostRecord * *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|777|0xe\\n20|8|xul.dll|nsHostResolver::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|881|0x9\\n20|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n20|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n20|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n20|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n20|13|kernel32.dll|BaseThreadStart|||0x36\\n21|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n21|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n21|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n21|3|kernel32.dll|WaitForSingleObject|||0x11\\n21|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n21|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n21|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n21|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n21|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n21|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n21|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n21|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n21|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n21|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n21|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n22|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n22|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n22|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n22|3|kernel32.dll|WaitForSingleObject|||0x11\\n22|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n22|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n22|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n22|7|xul.dll|nsHostResolver::GetHostToLookup(nsHostRecord * *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|777|0xe\\n22|8|xul.dll|nsHostResolver::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|881|0x9\\n22|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n22|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n22|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n22|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n22|13|kernel32.dll|BaseThreadStart|||0x36\\n23|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n23|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n23|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n23|3|kernel32.dll|WaitForSingleObject|||0x11\\n23|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n23|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n23|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n23|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n23|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n23|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n23|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n23|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n23|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n23|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n23|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n24|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n24|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n24|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n24|3|kernel32.dll|WaitForSingleObject|||0x11\\n24|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n24|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n24|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n24|7|xul.dll|nsHostResolver::GetHostToLookup(nsHostRecord * *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|777|0xe\\n24|8|xul.dll|nsHostResolver::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|881|0x9\\n24|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n24|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n24|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n24|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n24|13|kernel32.dll|BaseThreadStart|||0x36\\n25|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n25|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n25|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n25|3|kernel32.dll|WaitForSingleObject|||0x11\\n25|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n25|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n25|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n25|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n25|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n25|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n25|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n25|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n25|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n25|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n25|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n26|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n26|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n26|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n26|3|kernel32.dll|WaitForSingleObject|||0x11\\n26|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n26|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n26|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/prmon.c:d322a1c8537e|184|0x13\\n26|7|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:d322a1c8537e|616|0x8\\n26|8|xul.dll|nsRunnable::Release()|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsThreadUtils.cpp:d322a1c8537e|55|0x2a\\n26|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n26|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n26|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n26|12|mozcrt19.dll|__dllonexit|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/onexit.c:d322a1c8537e|276|0x5\\n26|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n26|14|kernel32.dll|GetCodePageFileInfo|||0x138\\n27|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n27|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n27|2|kernel32.dll|CreateFileMappingA|||0x85\\n27|3|advapi32.dll|WmipEventPump|||0x1a6\\n27|4|kernel32.dll|BaseThreadStart|||0x36\\n28|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n28|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n28|2|kernel32.dll|CreateFileMappingA|||0x85\\n28|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n28|4|xul.dll|nsDownloadScannerWatchdog::WatchdogThread(void *)|hg:hg.mozilla.org/mozilla-central:toolkit/components/downloads/src/nsDownloadScanner.cpp:d322a1c8537e|704|0x1b\\n28|5|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n28|6|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n28|7|kernel32.dll|BaseThreadStart|||0x36\\n29|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n29|1|ntdll.dll|NtFlushBuffersFile|||0xb\\n29|2|kernel32.dll|FlushFileBuffers|||0x49\\n29|3|nspr4.dll|FileSync|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/io/prfile.c:d322a1c8537e|222|0x10\\n29|4|xul.dll|nsFileOutputStream::Flush()|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsFileStreams.cpp:d322a1c8537e|610|0x6\\n29|5|xul.dll|nsSafeFileOutputStream::Finish()|hg:hg.mozilla.org/mozilla-central:netwerk/base/src/nsFileStreams.cpp:d322a1c8537e|715|0x8\\n29|6|xul.dll|nsCOMPtr_base::assign_from_qi(nsQueryInterface,nsID const &)|hg:hg.mozilla.org/mozilla-central:obj-firefox/xpcom/build/nsCOMPtr.cpp:d322a1c8537e|98|0x7\\n29|7|nspr4.dll||||0x1b38f\\n30|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n30|1|ntdll.dll|NtReplyWaitReceivePortEx|||0xb\\n30|2|rpcrt4.dll|RpcpPurgeEEInfoFromThreadIfNecessary(THREAD *)|||0x48\\n30|3|rpcrt4.dll|RecvLotsaCallsWrapper(LRPC_ADDRESS *)|||0xc\\n30|4|rpcrt4.dll|BaseCachedThreadRoutine(CACHED_THREAD *)|||0x52\\n30|5|rpcrt4.dll|ThreadStartRoutine(THREAD *)|||0x19\\n30|6|kernel32.dll|BaseThreadStart|||0x36\\n31|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n31|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n31|2|ntdll.dll|RtlpWaitThread|||0x126\\n31|3|kernel32.dll|BaseThreadStart|||0x36\\n32|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n32|1|ntdll.dll|ZwDelayExecution|||0xb\\n32|2|ntdll.dll|RtlpTimerThread|||0x46\\n32|3|kernel32.dll|BaseThreadStart|||0x36\\n33|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n33|1|ntdll.dll|ZwRemoveIoCompletion|||0xb\\n33|2|ntdll.dll|RtlpWorkerThread|||0x3c\\n33|3|kernel32.dll|BaseThreadStart|||0x36\\n34|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n34|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n34|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n34|3|kernel32.dll|WaitForSingleObject|||0x11\\n34|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95cv.c:d322a1c8537e|280|0xd\\n34|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|204|0x1b\\n34|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/prucv.c:d322a1c8537e|547|0xa\\n34|7|xul.dll|nsHostResolver::GetHostToLookup(nsHostRecord * *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|777|0xe\\n34|8|xul.dll|nsHostResolver::ThreadFunc(void *)|hg:hg.mozilla.org/mozilla-central:netwerk/dns/nsHostResolver.cpp:d322a1c8537e|881|0x9\\n34|9|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/threads/combined/pruthr.c:d322a1c8537e|426|0x8\\n34|10|nspr4.dll|pr_root|hg:hg.mozilla.org/mozilla-central:nsprpub/pr/src/md/windows/w95thred.c:d322a1c8537e|122|0xc\\n34|11|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|348|0x8\\n34|12|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/mozilla-central:obj-firefox/memory/jemalloc/crtsrc/threadex.c:d322a1c8537e|326|0x4\\n34|13|kernel32.dll|BaseThreadStart|||0x36\\n36|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n36|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n36|2|kernel32.dll|CreateFileMappingA|||0x85\\n36|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n36|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4e8b6\\n36|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x506fc\\n36|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5094f\\n36|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5515\\n36|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x3f73b\\n36|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2a07\\n36|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ffa0f\\n36|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xbf79\\n36|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x2554bb\\n36|13|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2ee7\\n36|14|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xd1155\\n36|15|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ff6af\\n36|16|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x10fabe\\n36|17|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x2051ca\\n36|18|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x90033\\n36|19|ntdll.dll|LdrpGetProcedureAddress|||0xe6\\n36|20|ntdll.dll|LdrpGetProcedureAddress|||0x18b\\n36|21|ntdll.dll|MD5Final|||0x2bc\\n36|22|ntdll.dll|LdrpGetProcedureAddress|||0x135\\n36|23|snxhk.dll||||0x28b81\\n36|24|ole32.dll|GetNextContextId(_ULARGE_INTEGER &)|||0x28\\n36|25|ole32.dll|IFillLockBytes_FillAppend_Proxy|||0x9dd\\n36|26|ntdll.dll|LdrLoadDll|||0x14a\\n37|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n37|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n37|2|kernel32.dll|CreateFileMappingA|||0x85\\n37|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n37|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4e8b6\\n37|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x506fc\\n37|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5094f\\n37|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5515\\n37|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ffa0f\\n37|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x87c9\\n37|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x255497\\n37|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2c4f\\n37|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x8ff2f\\n37|13|ntdll.dll|LdrpGetProcedureAddress|||0xe6\\n37|14|ntdll.dll|LdrpGetProcedureAddress|||0x18b\\n37|15|ntdll.dll|MD5Final|||0x2bc\\n37|16|ntdll.dll|LdrpGetProcedureAddress|||0x135\\n37|17|snxhk.dll||||0x28b81\\n37|18|ole32.dll|GetNextContextId(_ULARGE_INTEGER &)|||0x28\\n37|19|ole32.dll|IFillLockBytes_FillAppend_Proxy|||0x9dd\\n37|20|ntdll.dll|LdrLoadDll|||0x14a\\n38|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n38|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n38|2|kernel32.dll|CreateFileMappingA|||0x85\\n38|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n38|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4e8b6\\n38|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x506fc\\n38|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5094f\\n38|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5515\\n38|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ffa0f\\n38|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x87c9\\n38|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x255497\\n38|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2c4f\\n38|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x8ff2f\\n38|13|ntdll.dll|LdrpGetProcedureAddress|||0xe6\\n38|14|ntdll.dll|LdrpGetProcedureAddress|||0x18b\\n38|15|ntdll.dll|MD5Final|||0x2bc\\n38|16|ntdll.dll|LdrpGetProcedureAddress|||0x135\\n38|17|snxhk.dll||||0x28b81\\n38|18|ole32.dll|GetNextContextId(_ULARGE_INTEGER &)|||0x28\\n38|19|ole32.dll|IFillLockBytes_FillAppend_Proxy|||0x9dd\\n38|20|ntdll.dll|LdrLoadDll|||0x14a\\n39|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n39|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n39|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n39|3|kernel32.dll|WaitForSingleObject|||0x11\\n39|4|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x4914e\\n39|5|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f498a\\n39|6|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x49500\\n39|7|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x5681\\n39|8|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x3f90b\\n39|9|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2a07\\n39|10|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1ffa0f\\n39|11|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0xa460\\n39|12|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x2554cb\\n39|13|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f2f17\\n39|14|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x711de\\n39|15|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x6f298\\n39|16|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x71547\\n39|17|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x1f8890\\n39|18|2aaf317e-9a06-558b-cf88-894fbb0dd11b.dll||||0x8ff0f\\n39|19|ntdll.dll|LdrpGetProcedureAddress|||0xe6\\n39|20|ntdll.dll|LdrpGetProcedureAddress|||0x18b\\n39|21|ntdll.dll|MD5Final|||0x2bc\\n39|22|ntdll.dll|LdrpGetProcedureAddress|||0x135\\n39|23|snxhk.dll||||0x28b81\\n39|24|ole32.dll|GetNextContextId(_ULARGE_INTEGER &)|||0x28\\n39|25|ole32.dll|IFillLockBytes_FillAppend_Proxy|||0x9dd\\n39|26|ntdll.dll|LdrLoadDll|||0x14a\\n40|0|kernel32.dll|BaseThreadStartThunk|||0x0\", \"startedDateTime\": \"2011-03-06 21:14:01.327981\", \"product\": \"Firefox\", \"crashedThread\": 35, \"cpu_info\": \"GenuineIntel family 15 model 4 stepping 9 | 1\", \"install_age\": 567924, \"distributor\": null, \"topmost_filenames\": [\"hg:hg.mozilla.org/mozilla-central:memory/mozalloc/mozalloc_abort.cpp:d322a1c8537e\"], \"id\": 227423740, \"user_comments\": null, \"build_date\": \"2011-02-22 21:00:00.0\", \"uptime\": 291, \"uuid\": \"dabea982-548f-4b71-ae4f-b9ebf2110306\", \"flash_version\": \"[blank]\", \"os_version\": \"5.1.2600 Service Pack 3\", \"distributor_version\": null, \"truncated\": false, \"process_type\": null, \"processor_notes\": \"\", \"hangid\": null, \"version\": \"4.0b12\", \"build\": \"20110222210221\", \"addons_checked\": null, \"app_notes\": \"AdapterVendorID: 1106, AdapterDeviceID: 3344, AdapterDriverVersion: 6.14.10.275\\nxpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)xpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)xpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)xpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)xpcom_runtime_abort(###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-cen-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1195)\", \"os_name\": \"Windows NT\", \"last_crash\": 299, \"date_processed\": \"2011-03-06 21:13:18.528463\", \"cpu_name\": \"x86\", \"reason\": \"EXCEPTION_BREAKPOINT\", \"address\": \"0x7d1a39\", \"completeddatetime\": \"2011-03-06 21:14:03.975606\", \"signature\": \"mozalloc_abort(char const* const) | NS_DebugBreak_P | nsCycleCollectingAutoRefCnt::decr(nsISupports*)\", \"addons\": [[\"engine@conduit.com\", \"3.2.5.2\"], [\"{ac6fad42-419e-4f3a-abde-1bc6ce916b7d}\", \"3.2.5.2\"], [\"m3ffxtbr@mywebsearch.com\", \"1.1\"], [\"testpilot@labs.mozilla.com\", \"1.0.6\"], [\"{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}\", \"1.1.1\"], [\"{c5134213-7204-f204-7748-3faf7674a27f}\", \"4.6.7.8\"], [\"{0974848a-b5bc-49f2-9778-307742b4a55d}\", \"3.2.5.2\"], [\"{972ce4c6-7e08-4474-a285-3208198ce6fd}\", \"4.0b12\"]]}" jdata <- fromJSON( x ) checkTrue( is.list( jdata ) ) } test.big <- function() { x <- "{\"client_crash_date\": \"2011-03-03 02:06:41.0\", \"dump\": \"OS|Windows NT|5.1.2600 Service Pack 3\\nCPU|x86|AuthenticAMD family 16 model 6 stepping 2|1\\nCrash|EXCEPTION_ACCESS_VIOLATION_READ|0x9|0\\nModule|sqlite3.dll|3.6.10.0|sqlite3.pdb|33F22CE2B2B54C128F26B1AEB209DB3E1|0x00280000|0x002ebfff|1\\nModule|js3250.dll|4.0.0.0|js3250.pdb|3D2BE64A2A27418AB874AF1FC37FC28F2|0x002f0000|0x003d2fff|0\\nModule|smime3.dll|3.12.3.0|smime3.pdb|C691873CEC8A45CEBB8D577029D6A05C1|0x003e0000|0x003f7fff|0\\nModule|firefox.exe|1.9.1.3483|firefox.pdb|E820A6C3DA3E4D41B4D4856FBE95A9682|0x00400000|0x004defff|0\\nModule|nspr4.dll|4.8.0.0|nspr4.pdb|90B401B223E44E29B52427A96E5030B61|0x004e0000|0x00508fff|0\\nModule|nss3.dll|3.12.3.0|nss3.pdb|417FBFD301594DDBB3B1B0FDD01AD18D1|0x00510000|0x005a9fff|0\\nModule|nssutil3.dll|3.12.3.0|nssutil3.pdb|271849D3653A4011AFF4DD803713F75E1|0x005b0000|0x005c3fff|0\\nModule|plc4.dll|4.8.0.0|plc4.pdb|0466C3D1BA904897B48B818A47271E3D1|0x005d0000|0x005d6fff|0\\nModule|plds4.dll|4.8.0.0|plds4.pdb|ADE9A225ED1E47189DCC30DFB885B9F31|0x005e0000|0x005e6fff|0\\nModule|ssl3.dll|3.12.3.0|ssl3.pdb|D2CBA6C4FEBA43069A78E69B1434DB131|0x005f0000|0x0060ffff|0\\nModule|xpcom.dll|1.9.1.3483|xpcom.pdb|2CD83B094C064BA4B1936C48EC3FA9E62|0x00610000|0x00616fff|0\\nModule|UnlockerHook.dll||||0x012c0000|0x012c3fff|0\\nModule|PowerMenuHook.dll|1.5.1.0|||0x012d0000|0x012e2fff|0\\nModule|browserdirprovider.dll|1.9.1.3483|browserdirprovider.pdb|C3E953EDEF68402183B21895E689408D2|0x01340000|0x01347fff|0\\nModule|idmmzcc.dll|5.17.3.0|||0x01450000|0x01480fff|0\\nModule|normaliz.dll|6.0.5441.0|normaliz.pdb|D0658E322B2D4DDCA57FB9C9715C6CAD1|0x01490000|0x01498fff|0\\nModule|urlmon.dll|8.0.6001.22867|urlmon.pdb|04FFFD62B65746BD856B698C3822F4652|0x014a0000|0x015d0fff|0\\nModule|GoogleDesktopMozilla.dll||GoogleDesktopMozilla.pdb|AEB53B67E2FF42E8A4ED5107357E98347|0x01950000|0x0196efff|0\\nModule|brwsrcmp.dll|1.9.1.3483|brwsrcmp.pdb|A5B4105204D34EF4BCED190336D634872|0x02200000|0x02223fff|0\\nModule|xpsp2res.dll|5.1.2600.5512|||0x02330000|0x02689fff|0\\nModule|xul.dll|1.9.1.3483|xul.pdb|9FCED407A8D3411DBF5E80A72845BD062|0x10000000|0x10a59fff|0\\nModule|wininet.dll|8.0.6001.22873|wininet.pdb|2ED0AC45A8584A6095BFE16577D154332|0x3d930000|0x3da15fff|0\\nModule|iertutil.dll|8.0.6001.22867|iertutil.pdb|A6E8574FA7054FDCA22D42F9946ADCCC2|0x3dfd0000|0x3e1b7fff|0\\nModule|dbghelp.dll|5.1.2600.5512|dbghelp.pdb|7FA1C63A9BF54470BCA31E35A94F49971|0x59a60000|0x59b00fff|0\\nModule|uxtheme.dll|6.0.2900.5512|uxtheme.pdb|E99E16308F094767B1F07FB5C3E5E2462|0x5ad70000|0x5ada7fff|0\\nModule|GoogleDesktopAPI2.dll||GoogleDesktopAPI2.pdb|16952BAF76A047D7A83483F202EE6A6A8|0x60000000|0x6001dfff|0\\nModule|GoogleDesktopResources_en.dll||GoogleDesktopResources_en.pdb|5158D620219E4E779E02BC472BD772BE2|0x62000000|0x62031fff|0\\nModule|lpk.dll|5.1.2600.5512|lpk.pdb|4B6570DF2CFF45AAB60E416993385EAC1|0x629c0000|0x629c8fff|0\\nModule|hnetcfg.dll|5.1.2600.5589|HNetCfg.pdb|C441D43BD4354A8E9F22229506BCBE591|0x662b0000|0x66307fff|0\\nModule|mswsock.dll|5.1.2600.5649|mswsock.pdb|93FEC2ABF4254F5AA4EBFE33B2DEBAD62|0x71a50000|0x71a8efff|0\\nModule|wshtcpip.dll|5.1.2600.5512|wshtcpip.pdb|DE2E52603FFB406D9052C8D884A1AD722|0x71a90000|0x71a97fff|0\\nModule|ws2help.dll|5.1.2600.5512|ws2help.pdb|6049CF5877C54E2AB512ABC1B4B2E7992|0x71aa0000|0x71aa7fff|0\\nModule|ws2_32.dll|5.1.2600.5512|ws2_32.pdb|A7605F8695A34329B38DDB8421A004CA2|0x71ab0000|0x71ac6fff|0\\nModule|wsock32.dll|5.1.2600.5512|wsock32.pdb|2B38FE8F84144DACB8A4FD07C05E49FC2|0x71ad0000|0x71ad8fff|0\\nModule|winspool.drv|5.1.2600.5512|winspool.pdb|5199B63B39904A05A517CEE5158071522|0x73000000|0x73025fff|0\\nModule|t2embed.dll|5.1.2600.5830|t2embed.pdb|82C3ABFC4D2349E0A74C50B18FC0D8EA1|0x73ce0000|0x73d00fff|0\\nModule|lz32.dll|5.1.2600.0|lz32.pdb|3B7D84BD1|0x73dc0000|0x73dc2fff|0\\nModule|MSCTF.dll|5.1.2600.5655|msctf.pdb|3DB44EF7B1F64554AA80C5F5116A5DFE2|0x74720000|0x7476bfff|0\\nModule|usp10.dll|1.420.2600.5512|usp10.pdb|0F289BC0C9A94139BC1C31EDEDBF52311|0x74d90000|0x74dfafff|0\\nModule|MSCTFIME.IME|5.1.2600.5768|msctfime.pdb|3C615F3A72FC4192A60AA2A1F52449AC1|0x755c0000|0x755edfff|0\\nModule|msimg32.dll|5.1.2600.5512|msimg32.pdb|D2E18526D8234F4BB5A85DE12E71DE812|0x76380000|0x76384fff|0\\nModule|imm32.dll|5.1.2600.5512|imm32.pdb|F7A5B5DB13324153B57AAF340C77EA512|0x76390000|0x763acfff|0\\nModule|comdlg32.dll|6.0.2900.5512|comdlg32.pdb|026A6FF770FD4E6186ADBBE96DFFA99C2|0x763b0000|0x763f8fff|0\\nModule|winmm.dll|5.1.2600.5512|winmm.pdb|90FC96D5AD8440A2B14855895BD92ED62|0x76b40000|0x76b6cfff|0\\nModule|psapi.dll|5.1.2600.5512|psapi.pdb|B9875A55C874489384EA8FB805322C312|0x76bf0000|0x76bfafff|0\\nModule|iphlpapi.dll|5.1.2600.5512|iphlpapi.pdb|9B09F073003F4CA48F9980B3C091448F2|0x76d60000|0x76d78fff|0\\nModule|dnsapi.dll|5.1.2600.5649|dnsapi.pdb|32D68E409B0B4F58968A103CB7CB8CA92|0x76f20000|0x76f46fff|0\\nModule|wldap32.dll|5.1.2600.5512|wldap32.pdb|AC04BCF6FF294FCEAC8B8D937CBA3A172|0x76f60000|0x76f8bfff|0\\nModule|winrnr.dll|5.1.2600.5512|winrnr.pdb|9FE1A4669B69400FAC821A4367AA9CC52|0x76fb0000|0x76fb7fff|0\\nModule|clbcatq.dll|2001.12.4414.700|clbcatq.pdb|8AE9C54730824764AAF39EA69F8D87582|0x76fd0000|0x7704efff|0\\nModule|comres.dll|2001.12.4414.700|COMRes.pdb|A02453A3EB42413FBFF95326893E977Df|0x77050000|0x77114fff|0\\nModule|oleaut32.dll|5.1.2600.5512|oleaut32.pdb|F2A209009B694EFCAD1A6CE9D992EBC12|0x77120000|0x771aafff|0\\nModule|comctl32.dll|6.0.2900.5512|MicrosoftWindowsCommon-Controls-6.0.2600.5512-comctl32.pdb|505057971C40416FB39FED1D39BED0571|0x773d0000|0x774d2fff|0\\nModule|ole32.dll|5.1.2600.5685|ole32.pdb|9A4C05DDE0EC40CBBB843A4AD8FEF3C42|0x774e0000|0x7761dfff|0\\nModule|setupapi.dll|5.1.2600.5603|setupapi.pdb|D4ED459F85A948E7A94E123D65DFCC332|0x77920000|0x77a12fff|0\\nModule|version.dll|5.1.2600.5512|version.pdb|EA3D1BD3FE65475C8449C8D8B00722962|0x77c00000|0x77c07fff|0\\nModule|msvcrt.dll|7.0.2600.5701|msvcrt.pdb|F46BE85D442A476EAADBC8CC2B727C681|0x77c10000|0x77c67fff|0\\nModule|advapi32.dll|5.1.2600.5755|advapi32.pdb|8F800AAE525541239E4110B8821F5ECD2|0x77dd0000|0x77e6afff|0\\nModule|rpcrt4.dll|5.1.2600.5795|rpcrt4.pdb|759EF1C510534614A5537861C559C4282|0x77e70000|0x77f01fff|0\\nModule|gdi32.dll|5.1.2600.5698|gdi32.pdb|005002194FA345B5957493744A01376E2|0x77f10000|0x77f58fff|0\\nModule|shlwapi.dll|6.0.2900.5512|shlwapi.pdb|8519E3403447478884CFFE7F1A91BAE02|0x77f60000|0x77fd5fff|0\\nModule|secur32.dll|5.1.2600.5753|secur32.pdb|F6CC06B49B764C5AA7C4C320ECB139F42|0x77fe0000|0x77ff0fff|0\\nModule|mozcrt19.dll|8.0.0.0|mozcrt19.pdb|06D6AEABD62C4346BF4F11E4D3BF37B61|0x78130000|0x781e0fff|0\\nModule|kernel32.dll|5.1.2600.5781|kernel32.pdb|F3F783A50DA64DD2AA9357ED6DAF9A252|0x7c800000|0x7c8f5fff|0\\nModule|ntdll.dll|5.1.2600.5755|ntdll.pdb|99192024C5EB4830AC602195086637082|0x7c900000|0x7c9b1fff|0\\nModule|shell32.dll|6.0.2900.5672|shell32.pdb|69B3829BB6884926A5B97BF04E812C6B2|0x7c9c0000|0x7e0f5fff|0\\nModule|user32.dll|5.1.2600.5512|user32.pdb|D18A41B74E7F458CAAAC1847E2D8BF022|0x7e410000|0x7e4aefff|0\\n\\n0|0|GoogleDesktopMozilla.dll||||0x5512\\n0|1|GoogleDesktopMozilla.dll||||0x4b7e\\n0|2|xul.dll||||0x30b591\\n0|3|xul.dll|CallPeekFunc|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsInputStreamPump.cpp:c6f51c76fb5d|125|0x10\\n0|4|xul.dll|nsPipeInputStream::ReadSegments(unsigned int (*)(nsIInputStream *,void *,char const *,unsigned int,unsigned int,unsigned int *),void *,unsigned int,unsigned int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/io/nsPipe3.cpp:c6f51c76fb5d|799|0x1c\\n0|5|xul.dll|nsFileChannel::QueryInterface(nsID const &,void * *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/protocol/file/src/nsFileChannel.cpp:c6f51c76fb5d|400|0x79\\n0|6|xul.dll|nsBaseChannel::GetStatus(unsigned int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsBaseChannel.cpp:c6f51c76fb5d|323|0xe\\n0|7|xul.dll|nsBaseChannel::OnStartRequest(nsIRequest *,nsISupports *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsBaseChannel.cpp:c6f51c76fb5d|665|0x23\\n0|8|xul.dll|nsInputStreamPump::OnStateStart()|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsInputStreamPump.cpp:c6f51c76fb5d|439|0x1c\\n0|9|xul.dll|nsInputStreamPump::OnInputStreamReady(nsIAsyncInputStream *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsInputStreamPump.cpp:c6f51c76fb5d|395|0x7\\n0|10|xul.dll|nsInputStreamReadyEvent::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/io/nsStreamUtils.cpp:c6f51c76fb5d|111|0x8\\n0|11|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|510|0x13\\n0|12|xul.dll|nsBaseAppShell::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:widget/src/xpwidgets/nsBaseAppShell.cpp:c6f51c76fb5d|170|0x23\\n0|13|xul.dll|nsAppStartup::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:toolkit/components/startup/src/nsAppStartup.cpp:c6f51c76fb5d|193|0xc\\n0|14|nspr4.dll||||0xbaff\\n0|15|firefox.exe|wmain|hg:hg.mozilla.org/releases/mozilla-1.9.1:toolkit/xre/nsWindowsWMain.cpp:c6f51c76fb5d|110|0xe5\\n0|16|firefox.exe|__tmainCRTStartup|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/crtexe.c:c6f51c76fb5d|591|0x18\\n0|17|kernel32.dll|BaseProcessStart|||0x22\\n1|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n1|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n1|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n1|3|kernel32.dll|WaitForSingleObject|||0x11\\n1|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95cv.c:c6f51c76fb5d|280|0xd\\n1|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|204|0x27\\n1|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|547|0xc\\n1|7|xul.dll|TimerThread::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/TimerThread.cpp:c6f51c76fb5d|345|0x12\\n1|8|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|510|0x13\\n1|9|xul.dll|nsThread::ThreadFunc(void *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|254|0xb\\n1|10|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/pruthr.c:c6f51c76fb5d|426|0x8\\n1|11|nspr4.dll|pr_root|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95thred.c:c6f51c76fb5d|122|0xc\\n1|12|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|348|0x8\\n1|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|326|0x4\\n1|14|kernel32.dll|BaseThreadStart|||0x36\\n2|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n2|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n2|2|kernel32.dll|CreateFileMappingA|||0x85\\n2|3|advapi32.dll|WmipEventPump|||0x1a6\\n2|4|kernel32.dll|BaseThreadStart|||0x36\\n3|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n3|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n3|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n3|3|kernel32.dll|WaitForSingleObject|||0x11\\n3|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95cv.c:c6f51c76fb5d|280|0xd\\n3|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|204|0x27\\n3|6|nspr4.dll|PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|547|0xc\\n3|7|xul.dll|XPCJSRuntime::WatchdogMain(void *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:js/src/xpconnect/src/xpcjsruntime.cpp:c6f51c76fb5d|823|0x12\\n3|8|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/pruthr.c:c6f51c76fb5d|426|0x8\\n3|9|msvcrt.dll|_fptrap|||0xa76e\\n3|10|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|326|0x4\\n3|11|kernel32.dll|BaseThreadStart|||0x36\\n4|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n4|1|ntdll.dll|ZwRemoveIoCompletion|||0xb\\n4|2|mswsock.dll|SockAsyncThread|||0x59\\n4|3|kernel32.dll|BaseThreadStart|||0x36\\n5|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n5|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n5|2|mswsock.dll|SockWaitForSingleObject|||0x39\\n5|3|mswsock.dll|SockReleaseRwLockExclusive|||0x40\\n5|4|ws2_32.dll|select|||0xa6\\n5|5|nspr4.dll|_PR_MD_PR_POLL|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w32poll.c:c6f51c76fb5d|279|0xe\\n5|6|nspr4.dll||||0xca1f\\n6|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n6|1|ntdll.dll|NtWaitForMultipleObjects|||0xb\\n6|2|kernel32.dll|CreateFileMappingA|||0x85\\n6|3|kernel32.dll|WaitForMultipleObjects|||0x17\\n6|4|xul.dll|nsNotifyAddrListener::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/system/win32/nsNotifyAddrListener.cpp:c6f51c76fb5d|185|0xe\\n6|5|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|510|0x13\\n6|6|xul.dll|nsThread::ThreadFunc(void *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|254|0xb\\n6|7|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/pruthr.c:c6f51c76fb5d|426|0x8\\n6|8|nspr4.dll|pr_root|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95thred.c:c6f51c76fb5d|122|0xc\\n6|9|mozcrt19.dll|_callthreadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|348|0x8\\n6|10|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|326|0x4\\n6|11|kernel32.dll|BaseThreadStart|||0x36\\n7|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n7|1|user32.dll|NtUserGetMessage|||0xb\\n7|2|GoogleDesktopMozilla.dll||||0x5cbe\\n7|3|GoogleDesktopMozilla.dll||||0xb87a\\n7|4|kernel32.dll|BaseThreadStart|||0x36\\n8|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n8|1|ntdll.dll|ZwWaitForSingleObject|||0xb\\n8|2|kernel32.dll|WaitForSingleObjectEx|||0x8a\\n8|3|kernel32.dll|WaitForSingleObject|||0x11\\n8|4|nspr4.dll|_PR_MD_WAIT_CV|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/md/windows/w95cv.c:c6f51c76fb5d|280|0xd\\n8|5|nspr4.dll|_PR_WaitCondVar|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/prucv.c:c6f51c76fb5d|204|0x27\\n8|6|nspr4.dll|PR_Wait|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/prmon.c:c6f51c76fb5d|184|0x19\\n8|7|xul.dll|nsAutoMonitor::Wait(unsigned int)|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/dist/include/xpcom/nsAutoLock.h:c6f51c76fb5d|340|0xb\\n8|8|xul.dll|nsThreadPool::Run()|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThreadPool.cpp:c6f51c76fb5d|210|0xd\\n8|9|xul.dll|nsThread::ProcessNextEvent(int,int *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|510|0x13\\n8|10|xul.dll|nsThread::ThreadFunc(void *)|hg:hg.mozilla.org/releases/mozilla-1.9.1:xpcom/threads/nsThread.cpp:c6f51c76fb5d|254|0xb\\n8|11|nspr4.dll|_PR_NativeRunThread|hg:hg.mozilla.org/releases/mozilla-1.9.1:nsprpub/pr/src/threads/combined/pruthr.c:c6f51c76fb5d|426|0x8\\n8|12|js3250.dll||||0x4a9f\\n8|13|mozcrt19.dll|_threadstartex|hg:hg.mozilla.org/releases/mozilla-1.9.1:obj-firefox/memory/jemalloc/src/threadex.c:c6f51c76fb5d|326|0x4\\n8|14|kernel32.dll|BaseThreadStart|||0x36\\n9|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n9|1|ntdll.dll|NtReplyWaitReceivePortEx|||0xb\\n9|2|rpcrt4.dll|RpcpPurgeEEInfoFromThreadIfNecessary(THREAD *)|||0x48\\n9|3|rpcrt4.dll|RecvLotsaCallsWrapper(LRPC_ADDRESS *)|||0xc\\n9|4|rpcrt4.dll|BaseCachedThreadRoutine(CACHED_THREAD *)|||0x52\\n9|5|rpcrt4.dll|ThreadStartRoutine(THREAD *)|||0x19\\n9|6|kernel32.dll|BaseThreadStart|||0x36\\n10|0|ntdll.dll|KiFastSystemCallRet|||0x0\\n10|1|ntdll.dll|ZwDelayExecution|||0xb\\n10|2|kernel32.dll|SleepEx|||0x50\\n10|3|kernel32.dll|Sleep|||0xe\\n10|4|ole32.dll|CROIDTable::WorkerThreadLoop(void *)|||0x13\\n10|5|ole32.dll|CRpcThread::WorkerLoop()|||0x1d\\n10|6|||||0x774dffff\\n10|7|kernel32.dll|BaseThreadStart|||0x36\", \"startedDateTime\": \"2011-03-02 18:07:40.147016\", \"product\": \"Firefox\", \"crashedThread\": 0, \"cpu_info\": \"AuthenticAMD family 16 model 6 stepping 2 | 1\", \"install_age\": 6246, \"distributor\": null, \"topmost_filenames\": [\"hg:hg.mozilla.org/releases/mozilla-1.9.1:netwerk/base/src/nsInputStreamPump.cpp:c6f51c76fb5d\"], \"id\": 225856774, \"user_comments\": \"\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n05\\r\\n\\r\\n\\r\\n.\\r\\n+\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\", \"build_date\": \"2009-07-15 09:00:00.0\", \"uptime\": 1, \"uuid\": \"48b5ddb1-6029-4375-84b0-5f8ab2110302\", \"flash_version\": \"[blank]\", \"os_version\": \"5.1.2600 Service Pack 3\", \"distributor_version\": null, \"truncated\": false, \"process_type\": null, \"processor_notes\": \"\", \"hangid\": null, \"version\": \"3.5.1\", \"build\": \"20090715094852\", \"addons_checked\": null, \"app_notes\": null, \"os_name\": \"Windows NT\", \"last_crash\": 1, \"date_processed\": \"2011-03-02 18:07:17.892535\", \"cpu_name\": \"x86\", \"reason\": \"EXCEPTION_ACCESS_VIOLATION_READ\", \"address\": \"0x9\", \"completeddatetime\": \"2011-03-02 18:07:42.889052\", \"signature\": \"GoogleDesktopMozilla.dll@0x5512\", \"addons\": [[\"jqs@sun.com\", \"1.0\"], [\"mozilla_cc@internetdownloadmanager.com\", \"6.4\"], [\"{972ce4c6-7e08-4474-a285-3208198ce6fd}\", \"3.5.1\"]]}" jdata <- fromJSON( x ) checkTrue( is.list( jdata ) ) }rjson/inst/unittests/test.array.r0000644000176200001440000000151513272714174016715 0ustar liggesusers.setUp <- function() {} .tearDown <- function() {} test.array <- function() { json <- "[]" x <- fromJSON( json ) checkIdentical( x, list() ) failing_json <- c( "[", "[12313", "[132,", "[132,1", "[1,5,4,3,", "[1,3}" ) for( bad_json in failing_json ) { x <- try( fromJSON( bad_json ), silent = TRUE ) checkTrue( any( class( x ) == "try-error" ) ) } json <- "[1]" x <- fromJSON( json ) checkIdentical( x, 1 ) json <- "[1,5,200]" x <- fromJSON( json ) checkIdentical( x, c(1,5,200) ) #multiple types are saved as a list json <- "[1,5,\"hello\"]" x <- fromJSON( json ) checkIdentical( x, list(1,5,"hello") ) ##test arrays with arrays #json <- "[[[]],[]]" #x <- fromJSON( json ) #checkIdentical( x, list( list(list()), list() ) ) json <- "[null,[]]" x <- fromJSON( json ) checkIdentical( x, list( NULL, list() ) ) } rjson/inst/changelog.txt0000644000176200001440000000550213123775641015065 0ustar liggesusers0.2.17: Jun 25, 2017 Fixed examples that refferenced True/False instead of TRUE/FALSE 0.2.16: Nov 30, 2014 Added simplify=TRUE option to fromJSON, when True, lists are simplified into vectors (default is backwards compatible); when set to False, all json-encoded lists are kept as R lists. 0.2.15: Nov 2, 2014 bugfix: toJSON was not escaping control characters 0-0x1f, and 0x7f. (Thanks to Early Ehlinger for patch) 0.2.14: June 10, 2014 Fixed bug where fromJSON("{\"a\": 0,}") returned a list() rather than raising an error regarding the trailing comma. (Thanks Stavros Macrakis for the report) 0.2.12: Jan 14, 2013 Added unexpected.escape to the "C" fromJSON method. This allows users to parse invalid json containing bad escaped data. Defaults to raising an error as the old version did. Also added position to error/warning messages 0.2.11: Nov 29, 2012 Fixed toJSON bug where factors were saved as integers rather than strings 0.2.10: Sep 30, 2012 Fixed precission issue in toJSON's C implementation where doubles only had 6 digits (as the std::iostream default specified). Now it should be the full precission. (Thanks Michael) Fixed issue where toJSON(..., "R") never passed the "R" value on recursive calls (so it ended up calling the (potentially buggy) C version 0.2.9: July 22, 2012 Fixed vector toJSON bug where toJSON(numeric(0)) would return "" instead of "[]" (thanks Diego Forteza) 0.2.8: Mar 18, 2012 Changed ordering of includes in dump.cpp to fix compilation issue on OSX (thanks Rob) 0.2.7: Mar 12, 2012 rewrote toJSON to use a C implementation which is much faster. Thanks to Simon for the reminder. 0.2.6: Oct 17, 2011 bufix: fromJSON('["A",["B","C"]]') incorrectly returned "A" "B" (thanks Brad Friedman for reporting it) bufix: fromJSON('["A", null]', method="R") was using NA rather than NULL (missed case from version 0.1.6) 0.2.4: June 26, 2011 bugfix: too hasty with the previous release, and introduced a bug for characters greater than 512 bytes (was blindly doubling the buffer size when sometimes it needed more) 0.2.4: June 25, 2011 bugfix: memory issue when parsing strings with mostly (or only) escaped characters greater than 256bytes 0.2.3: Dec 12, 2010 bugfix: allow '\r' to b whitespace rather than just use '\n' 0.2.2: Nov 29, 2010 bugfix: protection stack overflow - now uses PROTECT_WITH_INDEX() rather pushing far too many protects on to the stack bugfix: added missing protects to SET_LENGTH calls 0.2.1: unknown (missing entry) 0.2.0: unknown (missing entry) introduced a C based parser for reading JSON 0.1.7: August 28, 2009 fixed toJSON bug: named vectors are now treated as json lists 0.1.6: August 23, 2009 fixed toJSON bug: NA, NaN, Inf, -Inf are not converted to strings fromJSON: null used to be returned as NA, but now is returned as NULL (but will still have the associated key displayed in the list) rjson/inst/doc/0000755000176200001440000000000013306330736013133 5ustar liggesusersrjson/inst/doc/json_rpc_server.pdf0000644000176200001440000017075113306330736017044 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 3 0 obj << /Length 1711 /Filter /FlateDecode >> stream xÚ­XKsÛ6¾ûWðjÆ‚ à㘸ÍLrHRÛ·$˜”,6©Š²Uÿûî $e³ÍtÚƒhp±XìãÛýîîâê½I#«T;Ý­£4M•1y”i§L™Fwuô5þ¸Ðñígx|Z,M’Ä7_®yѯ€xxZ¤YL+¤êx Ëî ¬‹ïw¯Þë2ÒZ•Î¥x‰ÉTit´L U”šïx»…S«?áTêâë^áw”¿¿|‡Ï~[”i«tê@ŒQ&w¢*r·( %eqËKš&°Öð+X'S¢c3Òi©M©2gSU%‹Ó‹¥†;â$Õ°B‡m‹ëÇ ßšŽöHd•ªÌÒ & ˜VER°¤›ÕÝr ª¹xOÚb™æq…¶­j´÷xl\ù-™«ãž}Kšqó×ð¢™o”¢žP«zÒ´‹´ ÍWȳœ¹¸ïå¾n·CæÇV<]ù£¬º–YN$TȵaŠß.)`1™-Þ}NÀ¦ËxOw>àÓïz¦Y \Sé…ü´aPœ~#þÆã}OA xAe[2J-–Ö” _ø‚—ì:>Ýô,Ý£!I<Ý"'‘ݬuU·åˆÜ D›-ÝO4ö•cóöB[3"Ï´Q¼÷qF=`e†Â¢*PðÌÔR˜FÄŸßããy¢ï‘kÎÀ°ö“£µÜò-цvWÂü7ÑõíZî@%ƒ-yQ’m~·Ø‚dk ÒáV%×X!pQÑEÌx|È·üwðا%Aÿšŧ ”P©´S$“Ÿ¨¶Oý;ëP~«1Vý^襵çÑý4|yYþêØø#»n:›áf% `dß¡ëC©cóAS2Ýÿ(Çûaö [ÇÐØá²C#åü‡°ãûz¢ÕxëŒ/ê«*xp:Óî‡fùœÖôE±C/:9#h}2ã÷’Ó!éM<ÕNÏÅšGäU¡è«½ jÂ.L_ôw¾@I“ŒÜN#µç5'Ww évDRv®MƳŠãnIÆ,¹[ÒîÜ ÓŒ³µä3*åékxó,\úã“˜áÆ€ 5ýùÖŠ_+O8Ád‚1ñÝC‰ý& ¶À¼÷ƒroKm‘6NHðaìÒ;^úaÔíšZHa äìœ|˜ÄŽ1†íê…<þ¿‡ÙnÆArrju;Iùnœøžα’Y©Læ@\‘¼"ü+EúÉ_¯$W× endstream endobj 16 0 obj << /Length1 1622 /Length2 8581 /Length3 0 /Length 9637 /Filter /FlateDecode >> stream xÚµT”k6 "ÝÝ2”4C—ÒÒÝ9032Ä Cw—JH£ÒÒ%-"Ý ""!%Ý-žsÞsÎûþÿZß·f­™çÚûÚûÞ{?×¾‡YGŸOŒ°…(#à(>A~)€‚¦¼‰ @@@˜_@@݆r‚üÇŽÇnAºÁp©1êΦBÝ5p€š»@P (&%(.% ü”(‚<``€&?@ ‡¸á±+ \¼‘°gö¨»sþóà´ãJJŠóþs† av 8@„²‡8ßhrè#ì`”÷¥à”¶G¡\¤€@OOO~³?ùL†‹à CÙô n¤ øÝ2@ ä ù«5~Šò!!€;ƒÌw» q‡ƒ!HÀÝé}U €¶ þ'YãO/à¯áùÿN÷WôïD0øÁ ;;„³ î ƒ?@aN€¶²?Ê Å ÁÁ¿‰ '7Ä]<ÈsÙÞþ(P–Ó€î:ü«?7;$ÌåÆïsúÝ#ðwš»1+ÁÁ ggå†÷»>Ebw7woà_/׎ð„ûþAap0ôw`w !æêQUü‹sgÂûÇö ‚ˆ ˆ‹I ®ˆ—=ð÷Þ.?œ‚¿Íw=øûº \л6 þ0(äîÏ× ä îß;þá À0;Àò Çû'ûýß½$Ì `.p'?A€ÀïÏßO–w #àNÞÿÐÿxÅ@3C=]3ž¿ZþÛ)/ðøò‰ ø„D‚‚Â’qQ€ÿçÑÁþªCàŸXU8ü³Ü»9ý§d¿4Àùׂpþ;—âN¹ç?B·°»ûü–û!ÿ*ÿåÿ*ôÿ­HÙÝÉé?矄ÿä sòþ‹q§\wÔÝh"îvþ¿TcÈŸ«+pÿ¯OºÛ9ø3§¿ÇsS†yAÀ:0”ýŸrùÓnø{Ñœ`pˆ öûjð üïn»ìï®·;Mþá‚Ü-Ï©·C€o™¨„D‚¼ñî¤$$* ð¼[G0Äë€üpê.pל?Š@âý~£bâ ÂoÓH\TýIÜ!ý¿‘äô’íþF¿+‚ÿ@È¿ (û”þïR9ÿïRÁÿïR!þ†"wÜ»ûô_n!Ðå_PDþ Š€¨¿áÝ (OÄ¿Üw-¹ÿÿk¦vîHäÝÍò‡êïþüÇ5xAìð¾Ì ì…9¼k9¯’£÷ä[y<ɾjœÆÅçûÙê~I„ÌUù:ä;òT.¹¿‹d~E‰óäÉÓïVS-vä‡WºÍW~×Ö zã«Íx³cT½£ù[r5qø ž¬ùݸú;b4¡·«±g»ºKéä’Ÿ{ö¨xÕ|,ù:1³ª»V)¦Ž]2Á÷Âð¹Epá{Ží›i,#7Ù¾ñÔÉé$YÖè-“Zžÿö á_³E¡—Ó>ßÊ „Ü:hÙhÍh1NȆÆúÊo¤¨Qö-z§ûÊh5Ó ÓJ r©fnÿ"]28º4H³i¬PB¼2g§»Ì.߿餟ÕFC–]#^8q#h‡ç¦Û¶~Cå[>õ*ÛëˆÚÑŠLïNtzvÂ)‹Õ¶¹‘òYl–6·÷£dÀGmâmà“„Y!Û”y§/È‹p§ížøùÿè¨ ç­ù±éŽŒÁC?+h@О9ë–ÍÎ[ã¾Þ ²[Gtúâã÷Ô†ª¿«µûÝvk½Ý² •³’^»xBpoñ³«Áª{Ø,¸Ä2þ2ÃAJ­~Pý*†UH?·ÊþÀ3Xb¤Lm·&üQ¸jö“„ãG|ûmkÌ,§fÊu98NüwPÆj]HéVÇ'©v©ýœBót¶á,°ÔÌŽr&ÝáFáJSè‡Í(²B#îH*æGM~ßåbyÛpÀâ/»l²Ïš6¸E‹ÑäÌPIkŸ•þ8Êùŧå2˜³kiäÉõiØ«8"¯Z%| ÷ qxÔhv0/hIi ¤exŸTX•ö¡ÊT’-pÝ—¤NQÉ⣰ãŠÄJ:o‰w΀­]Œ¼DCV'o”1+ÝZ}9,±¬c†î¼Åê QÔ9Ï(Šû@Ÿt!ùÎã±½R‡µ g¯w|„Öy6§$]á:5XtF:wÁD¤³Y”œ9nŸÀD!«JéÚéËÒ¶‹Ù)K“ š)j+2¯¿8q7N ÑK™2ÔñÉ0¸ô‹Ÿ&7j|¸ªý4köö“B@Í'§“‹“²²fpº`þ°0øðŒ™—â^ë¼ÿ‹"Ýž}lIa#_@[²î §™-•ŠºúeBq4æGL÷н]y–ÖJ'Ôj“å¶0±p×<΀ȱé¹×¡fŒ:$\"UÐmë(T@4Å[aÁ3­•éàJDGŽ<ÉÓÞ¶=ðé…0LÉ?,¤Îœ¸ÀyÛç,YòœqòÃ\)[Ä—<¼ÇÅGh|±IćÛ\²VÅ\«{ålÿª=ähi Z7wÍl(Äá3£ àÎ`˜{ƸÝú°dõ+¯Ü8®' H ÛBÌDS~ÚcÖ Èunã{-JÑ•¨ûÖý|j­IŸðmGò"óŽÌÀqûÅö‘)ñïcãzd¼´vŠs\VâÜ0Þ½iRÑú¢]`/s”5‰xq<¹•]ô†®mNíѾ…3Þƒí•Í@—#-ùËç`I,-€âD§yë>`Ã^ÌÓWŽØNúñB…‡æ±šBÁwœ î?7¹Ï©ÛPõ^žãrAæàò…¯ôáùWX_Z“rGX2¾­³€í3S^¨ Ã^¸¦9«ÔkÐÖì(oný t"ÿÓh˜Š‘˜'¨z‰Íù}„‡4‰™.½•Æôº€ÖO=׌Sæ¯ÜâýîÚ-#m‡v¯­¿©áÞ(„¨ÊJ‹`âø¸Öîø»kؤhΕ´±ˆ¿Uo›ÄÇØ=[o>üñMÂ[ë{xŸï—íaÃõ ‹_1‚A8çËZ²:[2-EÞnz €W8ð}FÊÄ7·î7ŠÔÍ‹“z·Ñ¯ º 냆쪱K…¶BÙƒ¯½-4kIõ%ŸÎîë¾h™~ƒ„«Z][ˆŠF&³®|ñ 47­å¢\§Rÿ¡_`ÅPoJ/פ3¹â•x˜'"ì³ýJý–Œo…“Ïz¶¶÷Ð╉4êªûr}y<Œn¬Ø–iFÐA~Ιeº|I¦ƒ…ñAˆŸè$jÜÚÆù•²º`²ˆµ«¿ Ò`Ò1üîcKô.Ë,ÂnâÌÿ6x‡‹ZcVª-Dü­"xyÀ©5Uk_ÉW ¹mEf=?t'Ð+mò~nàèD%ócñýÓI‚Éñ¾$®‹ö+÷j¼w §ZðÉ‘ºÍFŸb; ·ÈWTçjXæR˜e#t×ákÏe£µÎc5)¹?ViaÂöv5 GPå)`¡,~ÚP‚ddÈ4Ìœ=O¸,ÿeyâbÑJ‰Y¶¤LGŠäomlQi^¥PM£e~Vö ìÛƒˆr¼´< ¬5ëÐ~àÒ‡þòóçúwÈJÙ>xPX?ñˆÆ+> úx£v”¤%±ógÂ*þè´ës9qðÖ>+™{qÙ3Ù|™÷ƒ‚æ•ÏÛ<5µ â+ÝÔÒué?Ô^v†úbã^·,´5 UÑ&Th¹}ŸxyuHØÆ.:gÿüð+ÃgÞ¥#™¬µHº#ĦzêËÓ7£•DSÄÙ€ÆR¡y’"ÃaqµjÎú½fÆO™ã‡åv‚:ªßâ—Îø²u§Ðú•Ù²Štjñw›}l…ú+ªƒ4yœÕšz?AyYæÂy=•®NSÄsâå|ëzìA1k‹ð5ùz†'ð5ô[19Í.û =eɪ,ƒßxÎ܇iûlßÃã¥íÛéÎnOâ4o:Ö±‹²fé·Ùã•ïQ…ÝÎE©,÷y4„`ÉÚèK-nI©A\ôz‡êû‰Ï—%3KÑžg~“6=3‡÷¥Ö—Z¸÷r ‡br±mi&Tâ'Ûe;+ gì1Ù´##>ãt–“÷V#mÉ™oÛ*RE—¶iÚ}É'»{bùˆïh‹ KÅ_ŸíÈàl Að¹ÞÑcÏ3“ä¦2Õ;MùgZØ‚Kw­ÐЦW=þªÜ µÔò £2Þ²ÚÖýè˜-"©d×RËÉÕ¶JëÙF–a‚õFû¶¼¡,‘êe°m<ˆîÃ6ííPÖTDÅj¨Ì1‘Ów½{Xj'½îׂ%D­aÖ–.yÐ.xZ–²:ëzȾÿ̇l$70æ²×ºÎ-óm¯þ{ê7Œ¼ T‘7 ½ú`|ù«‰½öPY˜öúIAVÁBìÃ\MÿÙ¯E}ÂYŠŽ}ö6/,²î`™ïÎ`MrôÖm»Ñ”xeëñt;Ç­Ì©Øs&¸Mî¥ÇgÊi.¡Œä¯é‰?ØXwÅ.Æ}íá\—®/WÔ[({œn3â·9íâ±{aš?«"Ù w ( SÀŸ¢œgIL´rtRx¿çMüažá×;¼ÞxZùµ6B“$Ý»<°Ÿbj=àÈ̵u§xŽ ¦šÌö.KaÐ “Û+´ä£åUÉz ×1, %b–™b„6eé¼l4‰–0§}õ*8¨â¤…ëìWÞ!;ß=5ÃÞlsh•‰øŸ.Ü.’*6Çð~øž„f®ÈèO\Ÿ I©•¡š%‡_ÎH“Lã—¬„2‰Ù8¶A^‡Í+ÖgÍï5º{²ð½K#J^…VŠë=úB·tüKÁ8}ŸOfW5›Ì•"Í7Yãñ'ÍÏ¡:yˆ† vÍI+Þ4¢]1kàWc_ûÙáþ½~`ôxÆÏ!‡õ}ÿ‰_;j‘>øãn1Óõ?b–f¨q‹j|25|]å,Ðô&ìÙ¸b¥|´ôÕ4¾y38X½íIú”ÈX‡ßËð€kÂ`,`LÝ CŽòRG3.KM‡*€S&@rùawÁ‚Gç²Õ- N(fWk¤‰è:ýc{ ­‰Éìûbö‚˜Ë3X‚óÏ8·V ¥Fœ]\ƒ””ˆæEXÚßI›ÿì/óÇgŸý¾äR­wŒæ(/ôİ•’O&;õûôÈt9¿¢Ý©CÙw¶„—òôõZ$9¯L¨ÓCž™«ë“*ªh …ت]^"1Ú9¿CCÚ÷æBŸŠ}χV×|­kbîÄíô¦Å¼ƒó$m^©l%<þõÃZuf~Ô&WYA< tÿdzêH<ë¥Ó8½D¬Â½PÓ›ÂæÞ ðx¤ÅQ»âEÚNåÔlÇFR—šÊ´9É9´¶ÐûI¸‰y6I,:ö&˜Ì˜C¬YM®èJåD ¸‡Ï Àø’¹vÙ?›p%辦z ¾\ƒ™Ôi6m['aBŸb¨BY7gA*Vÿ9Õ«{}lª‘µ9¦› Ã>K­ð>Š™½úxBcI—gÝ–ÎÙoÊjwвo'Ô‡5ßÂ0íø¼¾§’]¾ ýë™ÚäšðŒä“ÈÞØ)Át^jäîØ'Y¾ÜU¢ áïKêô'vùؽ¤Ë&f]hlȸggš€©YÏBeS»bn’ æJÀ´ÈB§Â˜z)§MöQbé{" Gô[£A$£ˆ'tpç‡îEdªöÖI_)¥c¹a¤g÷ñÉi¹·ŽiYðñ7y¢XÓJpe‹zx÷^M6‘Š[[ŠîåD©–û®‹‰Fœ¯iq+öFé÷ÎuX²k#ŽŸEyúmÓHFÜýçÚá_°.˜4Ës5ÑûëŽãÇÑ_í17¸Aú øÉ·rFÑ1R’»È¤âПÓ®™[oêÚÎü å>±mŽ)Œ=´{ª0¶âr+ÇÃ=N~Ûüãñv¬¤Y 9ºLRï¼@~ìvGêîfu6W ŒdÉáÆŸõÊIT?NŠ®»‡L¨N´¯¬êƒ"…%ð_ÓCRO–ÌJrE×émŽÉ§ÉƾR´[¨âÜJñÄÄSŒ¬æäÑߪÉó’ûÇÝÏë^Ä~eH˜)‹Ru‘7®XZmž+*²5=ç(TíÆrrñ¶¥?‹¦%?[Œ-Ù¿E9udœ2E£Ò;=ñÈ j,÷.n…çªÊ¶î²–’o@+L£ÌÅ9péìº:^L[¾ SWuŸhbêE’m_Û@ä{,ÅFÊ*¹¦ýH¶'éé¬ELYþžOd°ýÓ}rŽñÂBa®Ç@.¬Ù)úõir—´Zsry1±¥ß.@§¡kæ'ÌúúùÕEá–ßB×|óXzïç¾­ÌÌ'<ç ,¬<Æ6£rkê!¯YÂ:´¶Ø[P@âp®ç8Lú¸´¢„œçãL˜¸ª n”°Æ¨[}òzrðú.w€Ôª%ÜTj¬ˆ…N‡„t ÷ *;ÐLï–²“µiþù°Á+,åzI.GP烶èN%VóTW ö‰… _-¢þc­§AüKr­ ú¦!_öÉ'èFIü6ð¼°ç‚¾-¿oÌá°²þНÄ"¢QŠl1«Qï6*´ÃõBÊ•¿#dwYˆP;¹üfA¿óa}u½9 ¸jt+5Z¿u³Á®Ì)\ÊÈÁi §7¹Í)¼½š±œ0öÂCk S¼À~Îx$ Fߟú4Û;KÃÐòÀ©‹š~Ù …Õ¸?ãPÈrÂZ¾’W\p÷d+®Û ›"U5 nŒ[7ñ*ÌLó¾&Z³‹3FöSaå×öz¿)Lù陯š¾+ŒzuóMŸƒBR¦P05Ñ8FSx]?eMÖk²‰çl¾¯µø|±_u\'9ÎÓ"Ò jÛ ù•ñô‚ì+Ãb­9|X>49­pv«k]Ôò—uT-Á”ÖV€¾±®å'—BRâj]Ò¦ž,;‰HقΣOã‚2›Ô¹øDëÌ ]¬ý÷i£”¿Š¾~àK)/Ÿ“¨Pðþ\Yfƒ”?ºUâFnJ?x¯„uýgú‰ÇçE¾æp¿!˜bàÙáf×}è»íkDÉØâC›žïÀ™É—m²Ñ\Ülš;cêËçâ‚u) s&Fgåû(†¤«òU{çè¬.ódzãŸÑ 4ÑO^ .bû*½y´GÙ?àéRÊgEƒP-Žwó¸Ñà^0R*=ÇhÛ¨öºLUHú+ÜþR¬À.®Gñ¤'Ý*— wS~ãÒÑ·לßúµÁÙª„bš'úé|_âàN®áJ]y´ªÆ«±misÁg5Æ„P|®s ^š•©6êd£A¤cæ,¯²7iÑgNÞp“@´…qÝ/ænÚ xX§T|¥¡Z¹t Pôný~$黡»šHq¶öZÌòÍ C¦f´ªØü âÇõ¥Ü)»Cœ!Äò;•*‘Í 4]Z#£ß[0¬YåãÁ75%o‡[Çš[ÙHöùBY?‡¥F¦ï¿Írs†-;Ltê~/îα0zH–Y¤­Jªð Fñ|ò ˜N" ÕéïÁè<0ÜžR•3VÐR{)o溕wÉyV¥ÚƒkÛû…¾(å"º¼ï+WC?ç>!Îx©ˆcñÉ« ŽgT§OÂì|—gçûV K¿ö\¿6 .æÆh§L¯îg:zb=¬QX.;‡aìIÔLZ¯z Ïp"äÐ3-Ë»ƒŸìMÂŒ>¤kI\¹?â ~þ4Ïm[Ëg—þ´?ètï˜ì|$ ‘mñ¬‡4ÿõsLª®€å¥f¬œlñ}ª7Éò´ßǯꄱÎçê:ˆ]ö£ÓãjZ“Äl‰¿ö lŸ0½x-(¡B`Ó%®$®µÒªǽ@©‘Yt8Z~1{°¦³Û˜¿F¢Èwàñž—‡ŒÉ³{¾¿ !êm-XéfKD M]˜ÙïüxvÄ.J÷ëûzâ c@½c¡CFG~\ÌùÄ­‡¿i›9úI)¿ö†w² ô >5Ø]Ž¢¿QY_ÏÔµs5œïséwûªA»í4Éå$aqf"¬aé¹3Î/VMK4þš[xÄ"Ùty³ˆÉ 3õD+óÄ7;uU¬€’(Eúzkûj¡ÓõæŠÔ<É£Œ‘ŸŸp_f¥RÝÄŸù i\÷b£}j“ÉMÿ kkŸ›z‚„͟ªÔ7ªsú>•´õôrœq&¾c®]#.;cà=u®>ó¯¥þä¡Ô¼5FmRµmTŸétôáxÙA)E_ªY2‡Æãßy#ŽcÝà13 ٠)UlÄÎ&»F Rr-v\ƒ/¯Š½Ì™~MØóWZ}}çz.¼¦ÌòïÕíâ>^]?U> stream xÚŒ·p¤k×.œLl[LlÛ¶mulÛšd21'¶­™Ø¶mN4±s²ñ½{¿ßÿWS]Õý\Ë׺׺»›ŒXQ…NÈÔÞ(noçBÇDÏÈ ‘Sfb02²Ð322Ã’‘©ZºØÿÃ’©œ-íí¸ÿe â4rù‰¹|ØÉÙÛ¤]mL,&vn&nFF3##×ÿÚ;qDÜ,Mrôi{; 3,™ˆ½ƒ§“¥¹…ËGšÿyPšP˜¸¸8hÿtÙ,MŒìrF.@ÛŒ&F6{K ‹ç… äµpqqàf`pww§7²u¦·w2ç§¢¸[ºX”Î@'7 )àÂy#[à_Ìèaɪ–ÎÉUìÍ\Üœ€€¥ ÐÎùÃÃÕÎèøHP‘’(8íþ2–ýË€ðwoLôLÿ ÷·÷,íþt621±·u0²ó´´3˜YÚ â²ô..´#;Ó? lœí?üÜŒ,mŒŒ? þ¬Ü .¤0ú ø7=g'KgzgK›?(2üæ£Ëbv¦"ö¶¶@;gØ?êµtš|´Ý“ᯓµ¶³w·óþ˜YÚ™šýAÂÔÕAÍÎÒÑ(%ú·É‡ö™9ÐÀÆÈÈÈÁÅ:€& „Wõtþ©dúCüÁÀ×ÛÁÞ`öAèkiüø€õv6r\œ\¾ÞÿVü7‚eb˜Zš¸Œæ–v°ÿDÿÍþ‡ïdéÐaü˜=&ã¯ÿ<é}Œ—©½ç?æž/ƒ”¤¶Œ– Í_Œÿ£¶÷xÓ±2è˜ÙL Çǃï‡Q4²ü»ŒùJÙ™Ù¸þªö£MÿS±Ûß@ù÷rPþ;–¼ýÇÔ”ÿ ¹.#£ÉÇÓÿó¨ÿéòÿ7áDù¿ ùÿ.HÜÕÆæO5åŸúÿÚÈÖÒÆóoƒ¡uuùX9û5°ûߦÀ¿–Vhjéjû¿µR.F‹ dgnóŸ6Z:‹[zM-]L,þš–¿äjl™¥PÑÞÙòk@÷q4ÿK÷±Z&ÖW‡óÇHþ©~lΧ³3±7ýcÅ˜ÙØFNNFž°‡üØÞL»h ôøsˆ ôvö..€z¾3{'Ø?N” À ô‡è/Ä`ùqDÿƒ8 âÿ –yû±¤ÿA~òÿ .ƒÂçGÅ3€AùôSåôSõ?ˆë£2£ÐGãÐG“ÿ Ö¿›Çöë?úÊ`ú/È`þ ~aöüPšý þ¡´ü—ñGæÿ‚É,þIýÑL O‹ó‹Ù¿ýÙ Vÿ‚´¬ÿ?xÙü ~³ýWe4þùJíÿÉýaûñ-ó/õGåÿ¨?|>nz; ™Ë?R¦¿¥méÄE:|ì¦ý?Mcùïèjÿ±ÿeÉÄôѧÁ¶ÎÿÄù`çlcälñ/ƒÐÿvÿ°pýüàïö/ø‘Ôý_GñÁÁã_ð£xÏ?ám„‰«Ó!—?ï¬uùüç7è4]^°7á ±ª i{¨Âs§ÛŸà›%Û×H¥¢ó^vjw}B„J¢ªÎÚtºJîA^Û£¼\!zõþõ£*üg‚Rë³Ï‹Aœòô~+ìÒæÀdÁ/¡ú~|:UÁŸWGõ@k° Òd9Ž®œˆŠyhî}õýe«ca ûJÕì2p/e3tÑj_u‹çÈr3ç±I ]è ©Q/=ænïfQ³'߉¤ãh`}O£Y ½µ·˜¿=Î{­W¨2;wáâhc€Ý¢ŽM“{ %Kc-z—® ,yüà-$ÊF MY£C¦?bþ^m©e×Ü[ë6¶ÜÁ´—“¡À@ÛK¨-mF7p"QÀ¨n5ˆBs©e±u˜ ¯·Ý©w›Y¥à¯pÍÔ¿æ´,~´t{?78® Ð݇¥ü|nÙíöÕ(èÀ7wg¢³Ð‰\[åþNQæ2þ©K(…ŽL»â–ÄùaÊëô[ø —i§€‘Q›¢t ÿœ-Çç÷7ßÊÆKùŽ­9”EwT½à÷`vùwãΔËË 1ÃŒ0ÊÜïbÝ_r7b(”xê€sÁe —[•˜ô¢¥žD²ñ;lK¿I Y¥$z÷«†#uƒ<­¹òéÏÕ+ÕZcÙò•ˆ÷N£èƇ„ƒCû¸îLvîÊË…õ1ŽíÕ/+Ý#„‡¿m«r„ä~éPÈîrVH“ŠúTt¿;ß cüùLUØØ¶9IC•ïiw¼«èŶLJ”Œ¢pY®_æ˜7ÜgYoI´°§&@óËmss]»Â%|òú7²ŒƒU°ÏíÃÍê¿ßp…ñTTò>{mô.ÎŒïNï’zÛTê³öµxؾ¦ÙÄ‘/î¤_oòQ~|3‹lÙPsjXÁ¯ý>7Ü<þ ÕΈÎ?q* ((¥ÈØ-¤A_HȲÚñÊ|"Šiá«rÖ­Û@¿å -çÓíÒ%݈P;™:xaOÊžñÈU²,ÇKÄÙ³¬&[HÌ"^œ†•eÁªÕÉJG¹Ù-ô§"þjªmr„ ²Ë;O>T“ü[M‘E,—8„Ž»…eëmJQ©šb¹¯NDzDÚ¥ „¼×›2–½ös úTïTׯùÉy¼„ë(†ÒDñEswq¶Ä÷ß*¤>ÕïöJ¼‡)ppÓ†~M¼™„LŒ¥>ÐiMǶ ÍK×9!›•ÇÐ55߆q ®9’aÂŒå@è$u\sz(ò²2Í\ó¹L>H‚¬ !ð°§ýhñu’qe:fyNW°LÇlt©¬›žõ½óÄ&\xó3!$ÓÝt¼Ðýùó€UÕXç»Á½Ôϼš‹úꌓ(\ÆM‚ò+9éG¹l-ÆŠ±7oöMìÄ݇^À'§lÇát¾{°ÄLÕ-ú5ì“aªnZ,‰o£ma‰¬vXBÏUJÄHа^fÆYõ”*v)ERR›çã§Šº¬-.ì_sÀñᨇA\h™±Erf2óDãj¯ð{é1œ4ZW{?¹ æ>l¯ ×ø´œð9vêôVê"„þ„òéw®Î‰’M¾|™DL*ìÑÉûmÝKól—JrÒÝo“}7Ïvª¿ÜÛÚHsLåuEZ¾L¬(Ü-L j0{q:ËšÎTíâÙÿòÛcRgø:$Ì'X{ótFÌß­•kïõHzö8u?@ÖWÙ9=Œá¾½±Í¬g_Ö» ¨2x²Er=ʶ=‡ÄândB„^J6….òd¿êZÙˆ#”„`ËÚ±©\¹“—Òýš­©Î’ðz(á:Á梈ߣ{m“z±jXðÞS@ ¦2ɺ™ÌÛb@X6u‘‘ÈžØö 6k̇UbTÚ®“1.§BP?¦ÿ‚êËMØL`0»íÍ´i'ScÎå&T¢R–e8à-Ã¥»O‹rÏ@ãò“±Ð›¿Œ½œÚÂlŠÊæ~\;‚çžÜÑ;{@yN­~û½‘K´ Ó¯\†LñßD‰M,ž„ŸÓvMää§$úµ_×uÀl+ÞzM~÷‡„Aµ){,'鑿¯‚/© ÇhãûªSÅ‚¯© ­ZâÐæ^n_(£b¶`¶·ŠG‚•µ+fҵ˂Ox<€aèLhªG ` ^ß(åT#¨*¾ßºç<ÂGhãÞVpƒü-žZ\1dž|5¤±ñÆ…¾*Ý/Äša±³àJn*¹M{á¨cÔd£h—3R—í F£VÇÈÑ ;„ñx¯—ÁV*±`©«ó,å¶GÌ"" V)Ð+dmYÒ¶qr–/Ÿö†…šgóéòm ’ˆo=Ɉ?¨æ?§Æu¨~³¡´1¯êÎ\1ž©Œ^'n9*›OžÕÝ~}4bUbªó”sí8ª¶âõ­ÏòœM¿}·CôŠë††ªÌ?,à^À—ÍòÂÑû†rYæY˜Wì&/Ú%'ÁÁE*%kùFž ´dŽ·mgÃî . #®ÐxÅ+³ÿKq¼@á›öˆ[X‚ÿÆŒMùaãƒÖþbÅòˆÆÊÔ~0yWc  à #ÁÆryÆÆ8 ·G–s°ÏKH²p>›Ö“þJ'ÇãÇκ “keY&¼ƒÐ$½k¾Ê³±{" À¥´à\ˆ‹m/:V·×O’FLè·WÎCÃá [àµ#«¿Î&V5¾v”€ŠŸm°ö#Y¢ñ~ûò8€’PÞ¦múœÉpÓ•þÚ•æ|w™ä隟ç’Ößk¸aš Ö¾µz3Çlˆ1Õ9eaUƒIÜcò|î(e`þfÝè¡îyÛ¸‚2I¢÷ÙË;¥ØÁíª!“ ,.ín©¿„ÞI˜ë )†]‹–H¥ÓSŸK™©àçûN)kùð¹(™МYžü®“¹›@ñ'JH¸¥¯òבE <[Û…¦o=Ïg ñ•È/›Ôm‘¼E¹I»ýh!he`Î]E\¼1"b†¡êÇy[íÃ}dJ â…öŠí};Ó(Áþ¤e±í$Ó,,m÷Š\‹\§ÚÑÎ\á †»•„§N+Üò‰…§Cγ·ƒ‰ÍD‚fÁðúë¡ä̬6^p¤sÌhuîë¡§ \Æïùû$ EÙh#ã½Ôâ¨zë E†že_•ja"†u•’zðÄ©ËÖ,U1GéËîL òå ƒ ÂTÈTëåÊpÄTCÓ(§-œê8~ÒºíG;Órú¶Õ.áÃFÝ/i…+>ÝÀNˆƒª‰å^¿}½œ• îšG’üJQ×Ȫ­$8$µ¼åB–¿÷žœÑ¥SBÅÑGÞñ’c1a— _‹s¬E1·jÔÓ¤Úû›BÓÉn3ÁÎÀ. LZ6š2Y¶î0gt*¶²QžÀ[F¼qsõRßú»ñF݉晡lu¾ôªQZ.è~ï—T· Ù͵Ÿy¬ 7L©¤þhN¶BïçÎIè=×WvÚ›`Ôi­|¥÷#η—ößѽã<à ‰EDˆ¢¼±L é5üµ›N/±ìà¶ŒBÍSMIé¦uïª'澓Ëò:t‚£¶ Ù ÁûüðûÞÀyôD?Ü—ÜDc61èåYâL´mP'ìU5žvÃ,à6× ùéäºív1¼WÔ(Ÿ˜g¾À6y5ÛÜ}™ úc_FKÐSEÏïwhö§´ÊG{á…㊢äL7bÆÇ£æHñÄ øõͧóR±M#ˆ ³EÖÉÐ Ÿ(—žU Âtd-4á¶åë—ƒ‡mI]’ÙrȦ䉴36ù®2~féVá×ëFg°óÈ&sÊ›R %ZD~ªÎñ çþ–@n"eR.=vtòˆ'[Ï**ËFœH·ác«ž;’(Ù>ea}ea#›Î_õ9‹Z™ÜulrÅÕà›ç«è‘PhßZ+‘ñüKž¬ B·ú—s‰}7 ω’kà •í-(iþ …”Ü,>Ds‘*¨lƒñš§_ÖÂÿ-¸d‡Qlpsj·ØСð²ë"$A'‹`—•"a°©oºjŽßè—…9ÃmHX3uV"#¾qÉìkê^#ªŽkåO<²éTrˆ Ã-ÏóŸ¥ê kÊ|l,¼bˆæRÁ¡€×ÿq˽ç.]k%x‚îQ^,FÉ(1Â3ñcUÉñÓ·ÒÁDkUŠ—YÈÇ™Â@½¨)/&š.ü|E¦^?Bàð'æq8–réd¹•‘$Êß³¤Ð„?ÃJû ¶òl2 ¯ÀHªÞÕ¥ £HÉäÊ-í³Õ¬®Ñj¾ý}‡½7%èj€iâÑd­¤ÓGâ9P)è9­ý’Ùl²#“B±ê–SÂçï|ÂËcRzx*L÷€Ï׳?Q,Çt”Âd-Ê´èöƒüTœÞ<ØrŠZ¥óS<„\àÑøzà¥ÓXZ ˜Q¡‚lñë›Ó”¸°qüp™½ÁÍâ’VáyÈ»ÎNAkɰô=ü+S ÕÕ¹“Ö)U+6}<äÉÕŸyWÒk®€±TfÓ{â^ß ››òv¥L@U$É“yß!ÚâÏÁnv œh™âAøº»êµe,ý×F•BÄžžm»Ü¿giгLˆó=.!’ƒŒ'åÞ¾l3˜ù²l&ÿ5Z4¸K"QšŒRyHa&ç< 5G¤©¡öêûrרܢÕ×­0·Hf5>H,Ùq¥ ù=<þÈà±)Šç(¼nâÊ?nGºÅ-±.Poí3,é2TÒ*…ˆ…@ [oˆ ö+AëÙhM÷oÁ„JìL˜t£Š†:ô4!“Ȱc{ Ð9Ê«H'æâÏ«†‹SvZÞV«†,>6ŸÜª RHÙä¼úoÕï7¼äÞÎ*öŒœz'æAŠU§^ðM8éÃ.YüR°3Ìl>ÿ¾ëðð_Ééê¹Fêt•¼~ä kækâØKÃÖíéGüº®7Ÿù„÷ÐuЍF[ Úá’Cu`É-y•Ó¡Ú·JYeT<&Wïxsœ‚Ää¯p=Úê£“àŽØþÝçœú]R[—,FíÌm© „aÊkW{kT8Ú“,@^u§¥‰…»Jó×–@›-ºtü&Ý,KÈ=åàZl Ùdð«u‹2ý¯ï·¯nƒ¶ô¨ã*»=¢­cË6ž/DØ ˜yðZ· "õ•ý¶ÇúMÕ®lß¡—™Šž‘\¾ÎÁ½mEí\Ân±~©eª´‹0xå÷u€¤90+3ç² %x*éÕ¼{4\ÒŸù!!sÇÃVYà>ø«|OÊÉñB¨„ÅL(hS ÅÒµ" g}¯÷ª}úâtUË ù˜@ôöŽ;&zÅ”J¹l ä‚ÿ‹®,–jç§QYÁðO‹I.¹b×wh•Cl.™xœ”>U™R#MÒ=wóá„&…`OQxŽƒÁùžàR”ÉïmVÈl²ÅeR]&¾>„]¤q^¢;hj“=±î­ZÑ4í¯Ú܇}“ýLW6þËÀ.¼APC×ÁO¸>à§D kG éú+ìxç YžÓφF—¹¨EC‘:Õ‘Ȇ3cbYù=î¸Ý§F„xð¹^–W²F!X¨¾V#5‡Ã‚Ïù‘û¾ýþHMPiûváÎßRí¨½«m´K½®£’FP£ø[9ψèd§É‡òŸÁ.d ù† %d=†ÉyçëÃÎe?ÝF[ôu_¾PÇc,¼*l—È›…Ò¬¶ul„dÙ“ÀD/«Á´yM_›Ÿ˜í}‹umÏ™NãíEÓ|ò\o)«˜úôDÝöiÈüîU@“Y¯'–µD2}<ïûâUº~÷”£,о.#UíìÚþ¾0>~Šƒÿ”j à:MÒ.6ëÓÏ’J!’coÑ0e^f—W¹þÁ›Gçý¢€gk.)Í›x³üÒŒi°÷É×g´å"M±Óâdä!ú“m⮩^jéUÄ®-Âjhü#ˆ «Uò™e¡#ixšòƒˆÎ­Ð¨+¨|·Éò¹û¤ìnu*¸ªZ(_>¯bWɦ¼³NŸ |™¤¸;½ï}ôÇ2U—] ¥9Ätƨx+ØÒgh)ulè¾µøÚTñø¨MXá"Zê"ÏrDMÿž}$·$ÈoEÅ«aa¸'×Áÿ¾˜7üî· Ü:S•ž÷IùùSÉwºXÄ)rk@uHhèÎ ûõSj~|¢¢/D$Él›ÌÝìç‰8ÕœfDñû'ÝCÜ×{ý¹0\08ž4˜.Ÿe€¨n_‚¤ëû»RÿëT*E¦Ë1Çç–oD,×D*cÜeVÆ(g«d-.ÒqP ü#¹ ïçNê=8z5? Ûø©v.²»õl2ÁØì;us§ÄyiåÉK(Ð,K#uk啺¥®$çÆo¦ˆºT¹Ï—Ä/°åßá T4»×ky+¨Z-¶4 ÛYÍ~ˆ‹6[ĬÒ/Õ«~¢ÒW˜¦# µs÷}¥…‹Ð–oؽ©¾‡Ó‚‹V†6zõÌÝ]²´ÍèÂ6-¹œ½½im³Æ`‰û|÷èŽSËò‰¢ÐŒo ‘DR[@f—‚Ó%J 9\»ãáV7xþ4Ì?_ÄE-Åè‹9Û¨K⽄}Á¢¶â5ð{ØuO<à ll¹ ôVq³d„J,6‚)èE­0ãɪêÒ-rÃqŽ{ËÔêsáê5Œ (ÇA¸ÂŒ6g{º‚ñ°2`1»$•>JSáŸÊžöÚW^Î>¡A¾ù}²ó *h‘…Üfeó¶mÅ=B,1 —*pÌ}|8q :õ¦ÍK /Òºkõ˜„•øW˜&§+Ø/H>£.VLÓß…Þ"1ªº¦«ÞpƤÝzheˆ|@a®B'“Ô7bc3`S_¾+…4è¬mðªukrロ¬ ˜ÐÜ‘mÕœɷ® «°q…=w׃F—e‘ô.ôeÔ›©·­ïé—jôCC®RÖQ“¾ºCV<QaD~MØ ÕG—'vªìÕò*ä- #ÇrJá2•Á3dˆô…¥³€²{éŽÚ\!½FfȰâRÊÐá,®kªì+FW •IP÷aö­=aÕOÍŒ‰]0/MI*rtcUžiíi ÓÕ‰£ŠÉÅ-ê¥ ÙÉ&EÑûÍLÆ«ôã`ÇïÌB›p÷xì´Æ?ðóÊ ·i‘ƒûtˆå“å ‘=4—S¸š·×¨/»ŠÞ5Ÿ¢Áîfà—FU@›’ªƒR¡¼²Nq佂}Á«†{½éÀv%® ñábÊ‘>nÖ¡ \ÕšH3™ËÚØBh+Ä M‹F7‚N Z.á¼õ„¤ðgãYFX"?‰G81žoe„Ciàò)3âm]7{¦öý¢Kž "Í’,Jv;û°c{´cˆ:˜"ä0MýÙ –Ù>oo×Àãg>6 \‘¾ gž4¦0LáC·ZyZ¨< E3’øús&ÍC¶‰Ÿ/xÔÀÜðµ%*·Ûs'*ºŽ¿˜¼¨[AWFª\´àøfÕ)Vû˜Æoô„æž®§$ ¸ŸÄ@ñ–“[ÖQŸvÂGJ2M^)uÊØÊòÄ$/Bx„›Òú?{Ú»ÕpV»&Ü\ÕQŸ5jP;š+A{ƒ‚Ôr&¥FÎL߬14@ 挰“(&€{åªn¼¾%xÌ( %¦&-8Í9°÷ŸqZ½[ïнSepxXrÛ«=¨ù–ý238Ô+-ÎÅNÖÑZª6m&)(Fúry¤GX²8 ÿpjšÖ2nÚßt³Íb©÷üšáV*¯eãnÌ(Ì{],ºOçÁ†B Ýì¸ÂÝíÆieÞRàiêݶ OáöÅGŽrÊ?,pÏ/´Îl}Y—ªQÇóN‰É‰8ÌZÂ`:dbCãÆÐH¨zŒÎÓJþuÒ­­·GB´ÕŒûÒ1ƒ‹X–ïR©ÃœD;&RàÕe¼æl’èaчCó5g®¥%¡»{R ó:þôÙv×´F5¬)wŸ#ù™÷ÍR×WþKb9Ö.žf·n—Í¡N—&’k}û"r%–qÒŠ"Y¤â”¡qcÝjOÄÀFDH´dñq¤Ç£Þ©æ’Äðx‘ƒ0 á]wø-:}Ú|9œâÕ„¨O§º‹¡u—íë{OqÌàözRæÀŠÃ]{3õ¹ªŒ¡†bã)Î.A#ÀŒ ÂZ¡£Þ3õ·RÐn¯*,.¥÷S(üVYÌà°Š£:)Eþ‚S%:§çrk´2åµlJŠŸÝôˆbõÈ•_QÞ~B&שØ1n»FQñ[;᢭åa N=¢ÑÅFåÍAøõjQƒíhÍËn%˜RÚž¾Ž¤Ø%ûÑîôqYò3Ì\õXÐùξÉ5ñEÔšP°e*¹L®î1ê–18Ó þDnnª!ç‰Ò=87™X~÷.üù˜ì:W•b÷9m &~1ÆuðU3JA6(ÚÿA,»i­UùíºhÎ/iµÇŒ9:24ÅZ—µß§åªæ8ÑÆ ´ÚWÉ?lföí;SÛÚ@ØŠtæçˆ˜Ï½¼&zø‡à=âåWSsdÉ%…ewòs Þ¹Pr_‹jfå K 8ZÎ*å6{Éò·>(ñ)Ö)å’*äè1x‡U$ƒ=!N³¨ºRÛýÏ(çgK'‰G¦¦Ži¬ ¬´agÞeEÖbÞ²Lw}#ÝzzÞ…¢ò?„5éêülpÕ¾ù "tVU*AɹDg@ëT$m±üöì¥ø¼¨lsŽ…oñhÒŠàø<ÛìÙ¶JÞÊ ·%v‡š‚‡Ø©µ;ød½ š‹â_V Ö‡”Ô›ˆœnXÖfÌHͬª:šÖKƒ2ÒóP6‘Igd•jpˆØYéj´ù–UjÒñå l)ËM^Ü1(úQ:‹ÊC(öÆ~☒· dŸË¦\ùpúa‚öEjë- n˜š¥Á Ã;ÁèËž¼ìâ©O²Nm|“™$®!íeæO¹*sÇcÈs ë,Ùú¼&*Um4˜*Ö yŸ+Ï,×/¢Y×Ú¢ÐÐßh¾ªÌ²:;Lô›âqcipF>~3ùŽY4xÇaV0ÔÚ<ÿ( zÅÖ'ÈóÌÉÆqžîy* ~|ôb{tYokʦ»â }…«>æ’-~O|Ú9œ· ÂŽ?ŸðkEg f•—é€jc³ÂÌ8´ü"B‘©0£)–Å”/ð;çSb4lr ÛLhhÓ|œÉÙà}Ñ–BÑu.^ÝsˆÝjt=tÊæ½çM[¬X\´ÚóùPax³›ßYÙ’Š9Õ•’p®óhîmþQÍ<1ÄSí—˜Ö䑨ß;б_d†Êm/(aö‚¦ËȧžJ\¥Nö£éíUŽcm׆1D~zÍÝX÷ S>`ä8: àÈq‡Ï‘E U¶ë{âY KfÜu2ÏäÑÅ"Þ¸dhwtŠCœ8à-Aþ&Í÷Ž—çbÂÂ@c¯»Ï±¬|c„ŽSš#¯Ç§À*K{Ñ–¶YÏÍ ÍWy^¨ Úc2Qï„,Åf2Qh..¹ òeåÛ’‹Ð¿¸FÏçÿ)Ò8òUYÞ*x?£hÔíáTn_% ÿâ8ŒÐˆ¶ ™Ä¢ˆ'0!…èsÊŽ¤dÆÙ2Üá  MŸV<:a^÷{ý~ÔÀ:*•ÅY£FIÓGPŒlÃ(Zòâ]+b ãÖí<°ÖénÓTÇ?යpâh²ŽfLI—ÿ¾uÚ]q&£v°b¹@7BÒPþ]}Ì<-‡ê~²j%ñ"w7`b*¼i­6-$ùRq•m›JˆV`ñ@·[œÆ‡?ð¼4@XíqÊf¬ žJ¨¦AéšPº´<‚Ãmžúeå!ÿ Lvh*§JýFÆo–Ïê…Ì÷`“Vg’:*¦´¤Y=kaÚãCXÀëÂöeHÿig¾ÂKŽ|„œ/D%z;GÖ áz£…æ9ùþ‰ð™Fáûéœ]6¹N¯Z”9¦\¸ýÐD9|“°ioÂùŒ“®Ú#UãØá–3Ç’ØqZÜ×–úQ‘üõÀŽw[Næ<,"®Þ¼ËiNçÜó9¨j¤ßÉ¡ÓBÝ"¿x£%Ì3œÊTÚü@”¥w]ûslú½–&2xkÉlü\ Ÿì#«ÁÐq@6íçк_è6¼F57k¤ú»E>"¸ŒïPBå 0Ƕ#•u" C`!>fûß÷ùWêWjšGTˆ ðÓeê½ë§ãŒ\OkÊà:°¯¤Hjluù-ƒl’Ü.2!µž›%@ÉùäªKi8Zïèg.¨Oáe-!i¦N9Nf=MÖæÀê䔘––qð¼‚LÀ5w÷»)°ª&K·uõru<å\äpØÓ¯5cgzÀ‹¨R ‡áŠÄK¥Å(j®·éð~iî÷q.t«T:ì¼vœët®+ ²£­°-DÇó¸+ /)´™–¾““ÆÔˆ›-jÆÐH†‰Ö"IÒù_µ±˜ïˆ¦‚L»VÛF¢5¢'NÑË!,<„eŸOL]à pl¤Âw*lßó¸ˆ ¿†HaNkö9žâ`‰dEl³lß}'ËMikÙWÅYB"ôaV®Gaë’;(JÛFÖ@-o ªˆ¿zqÁ\õŒ¬Ø–±$q˜sÍx ÍíïéÚQµ8§÷!… Жj6-2ËFâK¤ðç·CÄÅwê?Y\K{ž2cƒ)†*ôª  åOòlÕë| %æ*™kÄý(0¿@ìbpT­lb¹—­ÁÜC† J ƒ3ü¶Ž¬Ü£`…JütÓ²×·bàÚ´uô»X!“ä%Öbõ`>¡J77:Æw ó¾¸'ìÄÓqôW™:©ª Ò˜M"#j‘qEyÆI­›zùêñbUNJÒMÁŠ$êõ‹(ý*#B“:Ë.(ÙÎÞ¡‰…íÅz”½@wr½š‘ÖwïÖ@î Ÿ#JÏ­îÛ‰ÉÜ¡“§;%×)ŸÈž¡„ʃp3£üoWÔ©'¨½Ïw±hÕ¬È{HM5|Odn´éµa¹s’&.@,.÷,‡;ÞøSﶯgÝ?p÷-6„EÜøÌ¸õN6§z¨üÝ™`¡½„ø5©<‚-)[Â45HTEuŸËg>=»]Á5hÝ¿ò ¯`A`îÈ1EEîP¬•àâsfö«å l*ˆÊ èD|QÐvõÆpGʺüaXh•ÅÅ8=qA;Uü8µ [ ©v³ü®z¹ c¼’”<#ˆ¾ÃÍÒ+¥Nà…#¨?ÑU†æ)?ïÇ–¡ßn÷¿Iùõ«ʼôbW1á—ÉîÄQi âø'o4Õ&qXuPì0M™-r4É‘iq“ó8‰^,¤B8þžô„„oGŒ¦ëŽ2‘&ÇQ_m3ÍÛd²+BÍ娿7Ÿô~Í‚ÐT«)œÐÁ@ e¡SéMÙh’V’w=Ù‡ cE½ëë2 „X0ºày°ß¶¶œÅj•‹±ÿžøšúˆ¹‰©¦(l3'|ëñS[«xÁ=½þ+kÕu¬"5.Æ´$x_,-síº¡ß$Xñù‘½" æjœc À œ/à\Ù˜êÍñ†ê5A§ÙŸ™ií~àÛÁŒF˜Bµ>•Bü5O±™¨ÚÍ0z@oÇÙ°ì³ï[61É8Íi ÝÙ67Ê…3!3eú}æd7À°ä…0PlÓ«ÃBýÓi÷áU&æUÐn5ŸyðáTŸ½ËÖY¬Î¼ÌcLw4u¨zÇUÅ[²|qVG”K`½õUZlÃ}›àÉO±®—–£äáõ}+E"%ÿN­@çÔ\J2$ÿvѨõ\7¡Õ‹P9:{j‰Ë5Á]¥.kEÊ-dÙõ‹ãµ”Z±mÊu-ûf:SÛ·¿l©µ!±€8žÜ S?Ú¬œb[èb$&i"âj7 mìä !é~)楷ôþM¶ÕO¡ã—ÊÑŒ”˜ðð´ìjÒWpk²@QžOºNa:Nª.c]ºÔr‘OyŸø¡]+Ä2oD…ë2·Û~u Ékµ»©{¾6J#u õ,6¨Ï!‚T¢žÁXÁR*…;`ÕHgNWóc’x"På úÉÈ7ÅÌL4c#ˆËl<ÃÞ &-"@”6RuiP„šð®ä?ûêyÌ×*a~«ù2 ë…s”!·O‰ À«áOñpÖ¥V­ßÍ8eô‚#›Ï!`Õnv~~WSø¼þˆ)hº²AÙ…øYÿ˜ŠŽgœN¡ÉWÞD€wI^û VÆ(zÎ<×Ï‘AúåU²÷6ÞW™Ý—‹¾zzb²»AýÙ›ÇÿE3%¦´jAuÌÚæn±àõSÀæ”u騍(kK¦rHÄgç¸#Ú“<¿OF‚ï÷!®`_‰Qî¤Qtkˆ—ˆ¨¢ö‡<^Ví…Ö#^_C( Ÿ;@7:ðè­C<›LÏ{‰´/”F$uìMì¤JaõÜ¡ò­®ÍP’Óìu:Z¬Òø^dÜtÒÊÛÁ“´š°ÐƒÖýßÕ«[ýI-8[4|´jÎ$4«©TÂÆ^Ñ—†„í®s÷DQ&>þɯÏV¸¥ÈW>,Öfæ¬p/ºi"íwn¿Xr “‘¡»„†û`Õ-I‚¿Å2Þò*’äx)åCwî#ë&­Þá¡y°÷•S~o¿˜ÛÁQá?ŸéÖî1Wr ¢ü¼࿚ Ø+‚ÄC”#ßTaJªOÝ+˵ Ž u’§&  9”µˆæ‚:”%4³Ö7/aFÖ¾­“þt$¸2 |>ú¬Š!*1[±—rm‰²$?Jð(S8ϱ™ ||é Þ!Ž£Ô2DÐuoøPÝphÅšÆ ã×ÚRt Ç«0¥5òÑa¨úÍ@#ë„„ðÍλa”¤¼}¼Á@4ÞÆ|b霌`á'ƒã°¯»á‰‹i$jÑïÜm\_ÃeŒõî·ë+ƒ¥¦!Xá êé@Ùä¹â|ŽÇU^f+Q‰'©“¸ŒÃû`ïÅV~~^ÊèYÝÕœTˆ·û!F‡ ã_†ût‰'#¬$Õ2'ŠWÁ+ï˜÷ûÝoú¾ _ÆŒôדUôàÓʘ]ÏŽÖëx׽ЇéÞ¶ÑÓf¶”™3‘ñŽM“Ë;™Š0ïÑ_…O¨”‡¡û9§QKL‘˜XžcÕ›:GÓ†Â4Ÿgü|º& ±y8œ’ÚÙ zV‰‰rÄOUÕÑÛVx°9½îñ»§œÆA2Ë”s ëd :`~Æ EEàè~À0va¨¦»éužJX@/\ÊSýn×XÅq ß ]jú²ÐÐT×D0˜ôÄ!Çì׿æÒ~?7“SÑ3Ù¹cÊà*ÉgÁ¨dFÅë.FÀ#_WNk¡³ZTcg^àºÁfbbCõÕÆUC7Qè(ú»6 woë ð*’ItÀsèJ޾uŽ—Y#ñæFY£qÆ#ñ ˆוy~+‰ÔC;°gd;‰8¡¢gGIèƒß9ïS†Çï¤Á;R1ém0ôïí…®N4eÊ8Ð"¦/Ÿkµ\V½wÙÖq a“vº5ŽSµOO¼ñ £]ÌŽÕ6¿IJ&ÞužAç”Ùê£!Òßx]L?­%·F–)-ƒö Ɇë7ÚZûà­|GyÆãںݑßI·…ý=¬¿@…@ñó@·vE …w;¸XCŸ´°C”QËf%i7#dz¹bŠUvƼ„â&kÊ–(Ë^è^åbû0â0”˜!(èñhCÇrT¹é÷Æ ¶±—`ã¦é¡+5'G 0»AYm iÍ’®ŒW³ÎÇfV?ÌI%8ðèÎÎÑu€ˆo7²ÔË×åæˆ^äv»õ'~ h¦ ¨ÕÌò „1cF„©¦ë²ÕèòêÙ éSíápùˆ´)j’bÉònØRÏæB˜Ÿ¥±"0[Y½vjŸ´¹Z™8úÑóáºÌÿ\s^r Ñ¥˜ùA'1Âx–ubXX=·¥Ú73ø.ob9#ÅdŠêÎ+…Œ]ùK™}|A&››­î6z<õÈý­?Pg=ê îì‰t$‘š+³™%ô°Þ6zšhÌïÚJ½œÑAóìÈÁ7p£Êµ¥]i­!µ¾±±èŸÂ>Tg6ÝçÅ-Xgµ4~/µX“Ä´#4£K»/{••å&ÚWÜbbÁO°¸Å‚Œú$Ç~³´‘–:™o Z1žç_ÆýY“7b'µŽTtéC|càñÍ¢Ž+H‰-d~޵ '†‚ouš ÐÊz]GŠ¢Ì3óȶG‰O{w9Oí¡=~ÏÞöHz#Ëf.Í ‹­r9$×øžo5pºfpèZ™“¯6Ëaw‘‚>ÜN˜Ôl¢énËø^[÷£éã÷z:ê×–;.•¡_Uˆ²õrîäØYÙ´ k—™ÐÖn·]©­¬Ü®‘–Ý)2~¢b›…‹ý¹õW7rbÄ$+™v̉ÑP På¢Jijgì¿ýÚáÆëÏÆ¶7 ¿0Í­{‘pF³ÜXD4˜ ¦cÓÁ-ó¼¦x¥uª€Ãg£õ¼é٬ŗ·/Ã}yóΕ.t2»¸AT%XÛLMˆ"2ôÞ…ßoÐ…ƒh¾Ï´rû’NÜ=H2çÛÐÇ<1»Þr=µ¡ÙÕ8¬*øÝô‚¯ß7ÌCÁð…íBŸ‚±øaÈhiœcÔ"”8i7èˆÚjbhþä-Ô®y±Aˋ㥠VÍÔ2¨“]—Šx”*ë²%“¥ÞÍ'~›tŽÍ‡õñ#ÃíÃeUIMvƒÅåd:h&ò½žhlTßd}©²ˆ^Ñ:ôºô•Aí~–ë£dÖËí¢-r\ÃA¡¨_½¢aÿZ¤¸ŠóÕýø‰RIÛ™P¾km RÑWÖœÿÌÕü#ã‡}æZZ\®¦ªek+õ¤2´†ÂkhõWX£•B:ÆräÞ@œÜ¡%‰žcÒ¨½Ê¨î^%+Ân¹ºÉmSٺÑñ¥æ~²¼¨¸[PiÈy‰¹ÝÒX,SÓÃåW8²ÊãžO°…ÀQU0þb&éÌBÎ#osFŠ©éV`ô]øp±ë²¹ºö´Ã‹oDV9x …¹^[Ÿ¿9¦['«±hm]ÿa*wpqÜ[´ ^ðÝ0)š®üÀ§ÒtéJxÎ~F”;š”‹"¥¨%a¤pÛ™z( µ‘YP˜kY 5˜–Ý%¹R}){Y3ö6rDÿéÃï3´ jºÆ²°Ÿg¦üB\éD’ãQ¦ €Â,abŠeÁZ¬éò âH'o×FÓ ¨†iêLI:YÐKíàMH8Þ$0``Ü„®»Ø^~I€ŸrŸT­4CagWÝ $¾mGq NȲsÐ_<ôŸßV@wõé´£ÿ¨‚ÙrEf_}»~‘wNÀg¨0ìӠoÏmj¾«ÒÝgú,© ƒî*ÝÝ,¿˜ 3àŽäW´ã§ªOF6“YsS@­ W¼ß Ú\õt$żǑSÞ·â!!Æã/qe8å˜&^;‰¹"ªŽÈÈeÅÁÀŒ©az¹Ði •7@7DÙbä·hà ·9ê;ãhskĺõîË¡ø­c„ýÅŸ|vÇ…éw²Õ‚×ÏÍù]zÎB ?µŠ‚zpW鬨ÁÄ,jÙ´ÙíX©X\Çy t¢ûç GmÌ!c“Dß.ƒ Ÿ)FóæQhÌ3’¤CwT†ä *ŸÎž ^Ötψ€ „Ýg\‡a5øK•à%¹Eˆiö˜Ý»LˆŸ=ž¿Kßé,M׉ñãpcm´ÙÜ=Ó„ž2¼~ºîóÊØ€ÏÅUR_¿¬0HÚz´ ·ÒGë—uQIðö´‡wÕ£´7“ÈJfÔOXgÒ‡®Ñ9Ö’5xO+†ñ®Uä3alOøâ;(Ýß™…a/õTU~ƒTš1UÜÈb:ô˜±´ñw=³¯‘Û¯®Ö¡HÑõ–;4c´N­ªybæ¶WÆ­yû‚›ì Ÿ²\zT´*6yÈ`>ˆ@Dl åfÈLjáßëYoÉPÇu£yn@£c±NÁä|—M‹ìá;¸†iñ´¬cq X‡•±~†0¢M©ðDõÒ8ÐœÃÆÏ»Î² Áƒ•ø B'˜ËˆÆW¿FÙÙq¦™ Ö+jýŽÏ@Bàæ!M éÓž\Ù€n¬wïøÓ¿‹D×ç÷CðUt~—%t·­ïÒ'Shx}žá\lM…ž®ì0è¢9ó^¯¾î:õ%•¤Š²QÀp£||V¼"ѳ‚ïz”ªíê/»¢ †öl#A2Z¯1–+°»å9xäÑ%䬾o于7 ¨½/†ëáô…¨p(ÞÅgJ9o3|OÈ%nEldÝX§Teú߯2 ²öL-¸»5–4Q} Rŧ¢«õè”d¶‰’£€²¹¡x/DÏFDaç·ºúWꑱ&ËMýÁð’’ùĦÜš„¹…•’z“$jX‡I.ZøœîZ‹.7¸º'‡ƒâÞIå{»Šj(Kî'´µó-”_‹¡$ä †íw!Ü™áü=ð"~øÈþ6§F]—0^W5 ±–yÅ<'§w™ëMê‡o;„Ó;ÑÎEú³_è qÔå_± n`”¿½2{Ji›ëDLɳ¯7OGιá—OŒncS™‰}íöæWoýŒD³pàUÚ›Àò¡5 •Ê~Il'Í Q^‰c—r.ûÙÀlí&ÅPÍõ·ñ±ë$y£-¨j£”¶v§î… “¿¾ÐzûNîÃ29Úcù¢€ü¨Hnª!o—w -e]O;†Ú.€ ]7O bÉd¦›j ‚“¶ÌË<`à'µ^ïfþò!# o‘T´Å’ckVXS6ŽÍé+ ê©Mñab$ß76RiÜóN{BÎÝïÇÑÁÏD´eŒ¨Òë'ˆ»0åkE8á¢Û÷T0!"šü„™Ïk®ÖH¡-ý ÔcèNv´ƒÈĽ«',ëŽcÏÎ0Ä mnC= ¹+S *]­rÛY_ŽÐô1vâ *yî¾®¿øÌ7à_é+MäÕþ.²ÉǨ ùÊ—®êf~ab´®Î­÷ 07Ûc0õ„6cÔoà’pu¤¿‹*¼ªW›úu€oo?2fáÐ]b5·õm˜Î¯BüGRîV%5~:krŠAÕælqP§9Ó^v$z"äò¡ÆxödtMtŸ[­Z"lˆWžíÊÎ]`T4¸w Py&Ê·¡ù]æ63ìp¶²©Çv©\èùp:bT¬ýäÀàbdd {Õ™ûyɪüRn>ZŸççâf¸mÆWHµí©p=ø.•Ñ’·O9m¹Éž16†ªºíœ)*ÕíÒÞG¼‡¥x÷º]]\¾Üa‡[Œ/G?‘­H¦Ä”AÝ8‘4¢ÈaM&ÙÛ_ÏóÈ'RU¹€ãÖøK/ךȶDëίu]r¯rñ8ú=âPF`v9¤ÃEÞtÛ©õ[Ïý.±jãB~%G-&›½ ¥.ïýE ]Ÿ|Þ‹Õ³§$ F²÷ =|Öžg*ÕÍ#†§ÌT†-¬â«ÒÝES$@R­w)·¬Ùö \ó8RÞ7ƒ‰tÜ‚îßÒÈÊR—ÈìÕ†‡öb”„mÈ÷ÕðÉ ®ÝÚIÉö¹ âä‡Óø•S:Æá£û…ÀŸ²YÖ×@È¡¥/é¡5€"楓Ôaì[}¥f¯w©#ÝOOØâô¹UƒÓê9L‡ÔT—hØ nÕ{M­,#yÐdJ GËøOâÛ>µ]^ƃ×ï…R°{鎽êÔ"ëÊhBÚ Ë–:-6øgʱ#lvøj.Ï<©Õiôß»fw¡Šø²pu²µÓˆø91`u{s?ƒº¢ Ñy †9 ¿w¹kë0ø·YÊĘî‘$@¿ÖSö)tG»a]±6Û¥x ¢–’Z*‰Å–ÒÂa–ÃÌ꘣Ô-XT%ï=PÂà ¹ÝãZû/¡@°~Y…t&<)Mß™óITwJù ;§Û)¤9B ¡èâ¤ø&}29­‰–Š%ëQÔ¹Pað¢6²œÐÔZÅ‘0éh'ˆoTºæSÓÏ_ºÌìEŽ©¸Ë0¶ $i`WyÒ¶ƒd8õ@]—¯ÞMçiílHålؘ`«~ïC({­(A³(oðÏ0ZÁÌ]I‹A Õ !ZS¹,·ÓnÃ[Ô¿\[hHk™*­Û‚Û™iŠíÃäŸÏ"G¿U¾)½qO®á ÍvÉÔuqe½÷sÑ?½¤o9frÜ */q0 ñŠ.Æî¯.hW$ )üá2 6ê±€wú¨¢yØ«Lä2ÿædü³%Üܲ¢¾ëIt|£oMÛz· j{PBë„õÊæETݺPYRZÖ;‰ý;QÚÖ!çäÀüø½_ÝÝúÆ™X5÷Åq¸¦ðLÅd¹}èy‡öBí»“ ‡,>æb÷»_±%xkgìÞ¯c‡¬•žŒ\ägPâ$Ž÷V!Ý£ƒýA³H«ng]¶–­–˜¸ã cðU‰åâoÿ'äüRIÆ¥½½K»‘—ù-çýP£aÐ{‚aýè Üj¯ú`• xñìY|ÛÆeb~i,ü\b ÚçP®ÀÔË7Ýü„ŠRÒÕõc®b÷)ûÀ/ŽPJN¬ª˜ÖZ[˜×uwYŸOøãßZ䘇޼+‚TfqogÕ3¼Í àY72v}ª¶h)ï¬'ßãižê'Yùd—çØ¿ i? ›k>)œ›üã¼(x8E&Þ4¸wøÒ®)­cR[÷¨… =t5×µðò,êi½KT4¹Ë .'D9@ð>4Û·ec¡†Ðå‘g¼Ýg|a¥V¦ãÖˆñZ$ë#úÜžœp’ЋSl탣ÂÝ Qa&8Àûmi/Ä€Hu/ÐÀ Ö¬è)k$Ó º†Ïz<²Ëû>3Zè­éM_k6;Ÿúl·Ì;ön€§¢•"²fSæ™§Á‰P¦ÖS.Qޱ~ð#1_¹†û?¡ÑiQå¨lÒSÊ“&ë©›r¦¾s/ÝàÏRecÂñÍ’åÎoÑK¹O´„[;ÂÞ?z'ÄÊRïÊÙáôkbˆ%R¼äE3¸ óB½aH‰+#3 búOR@Ëç:ºí¥÷Þz*…_×2Ÿ’à轫ø˜ˆD‚jÀ®xϘÛþöÝ|Hg‰Ë’Gšì,¦Vt_R¡3å2K ÁÛÎo5ùég>Ô9êS¹  “|ÀÄ*m"¯ùÔG³Ý|.š a/Å“2šTàâ‡Pçù’RüEêaøic™=4N ;bà¾ùlWÖôÚk‹?>¦lÖZìíCK›[Éò»û®^·ÑÐcºQø¬\ Væ‘NÔ3%ȲY°‚¹¸ÏO~(R½jV¹jµ[MsHó9ªŒÎ:K}Y(M„r¸"õ ía\ùÁaJ¹˜ö@®rÎ.%ë&ÅÞ¨§ýô9·)°²öà­ý¦áÞãy¦Î !ÔX •ìÃXÔT\p±$çY§‚Óâ2<\É,äÒ!uðF®û4¹oú”í\—h0,&6³ƒDÃŽÁ¼xsÒúa—½v/"±ø¨tlËYTŽåÚüAùü;ßÖøo؆Ÿ0„ኦ£ZÐ×ñ¾€z7;_±GÃVÏÙqhgÊGD5¹^ Ó4ŸÀµÈ•9ÿª-P DýR¡ÀŠ‹Æ’Ù‰âîÒå(vÊr­a/#K Ñ`°ŸŒYhÖàÅrHUAòè’•í1ŠTE±4«Lˆ”¸c?ì AuG¿¼6ê}ʧ(S"Æ/ endstream endobj 20 0 obj << /Length1 1661 /Length2 8963 /Length3 0 /Length 10043 /Filter /FlateDecode >> stream xÚ·Pj6L#ÝÒ°(À.]ÒHH·H/ ,±ÀÒÝ)tƒ(ÝHK§„tIIHJw}xÎyÏ9ïûÿ3ß7;Ãîuw\÷3ª»„™)ä•̉ÄH)©ƒ¸@ 7È…ÉÀ  u²ü%ÆdІÀ¡v0¡HÁ!&N2i§G;%;@ÁÙâ€ø„@üB@ € ü¡\ mâ5(qì`GL);{w8ÔÂÒé1Í~˜Á,  ÿ‹?ܶ8l(™8YBl3‚Mlv`(ÄÉý¿B0‹X:9Ù qrºººr˜Ø:rØÁ-DY^\¡N–uˆ#î1ün lb ù³3L€¦%ÔñO¹†¹“« xØ@Á˜ã£‡3Ì <&hÈ+Tì!°?ÿ4xøk6èïpyÿ…ýálÛÙÚ›ÀÜ¡0 €9ÔPy¥Èáäæô`3ûmhbãh÷èoâbµ11}4ø£rÀ+ 5€Écƒµç†Cí9¡6¿[äüæqÊ203);[[ÌÉów}ÒP8ü8vwÎ?7k ³s…yþÌ¡03óßM˜9ÛsjÁ Îyé¿LE˜ÿÈ, N^ È/È€8 n`KÎßá5Ýí!(A¿Åx{ÚÛÙÌ›€xCÍ!_˜žŽ&.€ÜâíùoÅ#L`;L!Pæ?ÑÅó?ñãòáP7À[à#÷@àïÏß¿ éef³qÿÇüýr*)*¼RQcû³ã¿u’’vnOvn;/ ( àç¼ÿ;Šª ô¯*€ÿ¸ÊÃÌí‚û8¥ÿìò×þ™ÿº ÀÇR¶{$-ÀüÇõ¼@ðãÐÿ3Óÿpùÿ#øï(ÿ7ŽÿoA¯œmlþP3ÿ¡ÿÿ¨Ml¡6—à z2è¿ €Óæ8ÿeüx6œvÿ„|D0È¿Ô%ÁÿÉÿÙâòïd Ç’þ)çq¢œN®vÿR?¶ëüäzÔ»ý“í±2üOóÿÚØ|ƒþ¸‘ÇõüÿñàA n0æÜ´X8Ȫ:¨å²R‚Ò•}cäåÆN »ç¼Õù=‘¥"#`~.‘8Љÿ}M†ùL|žöÎs·±=´)A­ùÆëÖ(N}l£söÛÓÞÑ»5=ÔTìšâ›^w^ÚþÖȈm 9θªyD—®Ý²n5=Å C!Ój›|¯±n‹ÇÙ£´"õý?M2äšfN‘=Csb§~ÂJxè†7yv>A˜=ú@«džé½Å]à©·Â}5å±XªÉåØNNO®GF|F84Æè)¹•¤@:ãYX° JžzÚ:¼jûd³Å챡¬~ ß>6ddb&'ãD&–¹Ü$oû‰.'óð»Â²›ü1£©ã •x胊  ¯:–àFÇuvÇ:3Iµ.k¨º%Ib -¬‹7”1»†7,âï6ŠtI¿¼8¸H\× ˆk,CÝØê÷Ã"£ÚÕ{Q“nà»[¿üä‘‚Çx˜Ëö« ñá)8Ý®·msØÑÌ–Ü1‘¡®.àåVeSb¶4å»§5™ÔÎç‚”¨QÏ3Òr¹ëT±úŒ ª7v±XÒ+¶š{\1/ÃzvÖˆ‹µŠ$*Êr2>`È¡ÇD_Õ#…®;?•ý¶*$½Dºª}Ï’w¢SÖy2üåäÀ Ÿ(ÂQl¡!‰‡­lóžH/K%Vñ`"7š—ÒP°¶‹ø^èÓë&VT¯_¯0‚<»Âó¡~ÅÓ2/–ɳnZHE[­€†Én»IÕj=÷Lº]Ûû¾ÛÁá-Prìarw½Õ3§”µ<¤§¢U³ßíÒ€ü5´+½cú„>¶/›œ˜-»g<}}ElѦ¸\÷‡²“®CH‚-x{}’ú0¯©(e,ý"}F÷O&YD¸5ÆÈp‚ÍÚJº¦IiXßµ1P¯‰¸2rýO •¥]ò?GfágpÈv×jÀZÜô~}ˆê1‘~Ñ©ñ.Aé”–%dAd >ò—Ëê„¥ßsüs£ ÇÅÍÝý¯.,œ+»ÖöŸš®X-°9¡…\>$ÄçÞàdÛª–°¸1]¯Å0rñyÛ›O[â…“^ŒÞâ£GAQî,ލ•JFõ›•ÑKOphªÄ´Ó ÇIÝÆÓu!¿À”öЃ¯±;Rñ¶“ù¿wŠ©¥0>MçAêÖëždI¾ÿÀFn«ÖÍD$È·:+Ï–g"°Á$4öŒV˜4ØvŶ3j¶h ¹D<Ž#ÖoñÉÄýóÄÇê1Ãõúbc´˜3Á§i¼ÛÐD¶ÀÈ/ ¨nØBù›ßGÞx«ÿµèÛô©ø¶í´m£uMâAWlÀ »c5§]¾ôŠ:cΓ9•íèmGmÆ&€Y§ûxlAöç#zòUÎE»–Ö²"k$²Y²FRJBßvc 5—§Qk…w½¼Cu?ˆ"ã=#±Ø ž­uÑpLÄØli*$Š `Jb_I/ª Js’pcʧ_¥ûnA«ŽL&ç§@U"¬Þ¡°¯µâ·'Fgó1Ji®tŒË‚Hekƒ8X³›?ìú³ëh‚/‹X#rÔ“åœ$mSb~ÃÖéYEg Â¥`Låö÷¬'8sQ²Tí?¬Ìy¥ÇOvÑ„i}x—/çmáÚLú®&ð[¦ñ¡¾Åàš[®û–KC«·â¢ušöæEÕ‹E»¯×ö°i¦$“šð%c‹ æÏÒ§§ Ñ]Ž)AFÔùCÕñ©¨îѾs^žêyQ|ݵYƒÉ’É1üVòèþ¤¡~ý)\Éw5&Äá·Ÿ°RÄùy°ÄHvx˜ã©Z8^"þ Óg[2Ù—Ž¯±¹%º ëz‡T‹½"æ&¦J0üS—;‘ËÊØÈsd? ÿáu»Ê A¦É‰1´ÄK·?Ò0ŠÞ •²14DòžÿÌî (Þ4¶ yX¯j¾ÿˆžSïáªO .«’0¯g‰X 4£W'ó÷Éq&ä×ó$«ÏË‘5ó~)›ðC›ÞЪ#™yñŠÊk˜õ{`d2Qi„ í†}8.Y ²ö··tŒe¨D±T=ô¾^S¶ H¢š­£Ö•«O¶áÎÁ•oÄ•`õÎ#:Æ bxjÔ§®²ÜÔ~÷Â-Xfh ßmí0†)¹î°´VOΜÛù~¤HM¿c èy£yƤ~ÙGa5Žm7 ¢V*†y+Þǰ!&©Ü×q_ˆþœÈžˆÞ A àiˆ®-QÀÄ ’Ä~7ÔO_òÆdªRŽC"Î×øT^í=ù‰È’0Zò‹—È>ú¤ìܺ¸S”ƒnH¤èê@Œ½’¦$òÝoÜß­Y5±?3—duáññªÏ²¿í`–)Û“P ãvB…°Jäí|ÏÂFÕ»/î—q¬U‹´­+>âàX¸Åí ›8ÎUk el¤Lês+ߨjô€¥à¶……XKVš;è°Ï%Þò9„Û¡³¦Ø³qœ[XÙèåÀi,(cFĸ…¸ œæŽæÜ)_¥Ò¹Šœ;ÐàîW6¿âPšÀõ$+ZN“®MãËÅ\º‰Þ(°)$÷®Uõð1æÐï¥ßÄŠ`¹î<·Ç»­D†QžZUrh®'b!œ…’m1–„ lLf{TõdÊÚ… ¶M>3$-»òSÇÿ@äê¥Gg؃÷ÅUÆdƼjü×@=Ôö!#Ї‡’Ó´\ùa‰"õùõB'÷F+ÁÑñv•‰Šå¨‚D_jZM‹¨á'BA—ì‰XwVJt&y[§†‰r!3åçÉùï'(7MÔÝrºè‚oÍèZձߧû†¥Õ±å ù·­ næj”÷H›YÏvQÄ›ÒW^kõ…:%ñx[òBâ–ä”ÃàÝreò/TêÑù˜V ÈWG lòjhCÒ1ƒB”UvÈæŸ»™ ` ªhf=ÑÞ`of®§S¨«×ûâ®»ŒÑZHgPá1ó]|†ã³_Ñ 6ï~8Â({L‚´b-¯|Nnc»ÌÁ"àS' üç§ü-‹á U†„wn€R³¶¤v·œI‰;ðnOÊ`ÓhnÞí³Eæ V¡¬K»(3ã°¼< ¥kUÓ Èv؇¸Ðí '”xƒçuá½6ŒÂä2¼­$S^3¢1V ÞXœ*-MËkòE—6ÁfJ#Ä«Iò!z{©ô´Þ]j|¶!æ¥hŒ©–yÕíwñ*ö¹ƒ}N`)㦩œÀôèîj¿rÞÒ7Ì=LÛña …4,lŠ ¢÷/ab2öÑÑ«&yúW;L,_x樿x¿~“[ÁVg6-j^Ò~Ç×K”ÑëuzÑGLDÎR =G†øThkÊ&²ya)¡’¼÷¬›½AÉn+°VqÚ™$iÕѦ=±üÙžal®ÝëM±(Éenžõó•rW±û®Õڇᄮ»U§ºÌ§Ô ítF @ËD·¼Ú³àÖ ;~íE¸ø±Ûìç¸Ö©<Æ3'Ê6P}O«¼íõQ$Õ Æ)ÿùmJÚJ}ŠÞ²Øïëßò@Š’•%£„ÏÖ«ëÛO¨íII$Ãb„Ý`B‚¸×üzŠÒÏLòOÍ7åA…Tb“VN]LBœÌ‘òY²¹Ùóèhƒu|}(ä¡)8"l¹ÕEðsÀe†[Ö¬•ÿ×—aµ¾Í‚m]ò_èP>ö~†@d•Ût•í%“xд L…-âi¢Ø…~F^p’”ΗÙ™Ì&=ÁZûr»ê{Ü¿n‡¦ÝžxÄ(#ƒ”í/öŒO†;}IŒ-µÜ—ÊÏ_ÍnÜ7GRQ¦ä²Œ¾C½óÔ«&˜Ñ±;r»œO—®Ûâ9Ìl4ôm‚+Áz?Œ9Èl.:ÙnÒŽöâ“QðÞ{;.Ü5‘Åæb ¤°*ª>œ<$šP7¥Xù6CÌÖÓ²·ôfÒš;zÓøWØã]VÝõ+ P/ŽŸ2‚®¦HMŽ=’豫Óiýµtui\‡H¦o‰ù ñW†MÑÁðÚÆã…8 ®¯Ä³e˜nÞШ±™'çÿšºCEŠý©²DÑêKAR Þ—û:†nÃC̨nþµÝóY2¾4•óN¤øÞÊÙ§ÓòÑÒƒAïãSÂÛJÒ hÛèücÉ–Pýžx#~~EÜÖÓ7'£IÄÕo«ÁøØ ç6y ìÛí¡£1ÿß·…Ú¡‘Á¨Câ©M9P޶`ô€SŒ»Òý©Ž39UŒé³J˜åÍv¨¡äÄnšFÓnZ«øt:÷©±ëØ? ŸÕð•7ís1lUÊÍè?v´ÛŸ$ Û.«Ã÷ñO^¹Pi÷hÃ_Îrà£ë3½É;ï>Õ ˆÈ&Š¢›öÚ$dDÏhíÁ]2‡óã­~öSkñÕ³yÃÕ7ö9ßF µR‘½MðSQw†|"½ÝíÅ*ð@¸®°RýZñÂJç§ÿû§êóåÎüµ8{Í—V¶6˜!iÜÙtßÉáñA»QPŒm|cçnºj^zŠ0Já•–Vê­Ê °÷B!^Á¥™hPD?Å“AÜ¡¤+Z‹¦/計6Z·v.wÙl5ÏÔ<^vÓj! :‹Ô“(ð©Ë&ŸÖ~ u±]Z¯!e8»êjή'6(}©*åtû݈ë{ߤõÝ1ãn/Ö¶0¤J–&µ@>é2²¨fÞÁÙwŽqCK¾|ž¡ÓøáÅðê›pÔt,ŒÄ[èLÖ*6ô‚ÅÇ:1mhN‰IâݧuQ)ª¦e%Cïkƒ3EIçf×”þFÀ”¬+ÞÁä( ñ–”[¯][T9Òﵸ²xJä.qÊ…yE÷úâU ×Rå‡Nè4<— 5„*È-bl˜§€ÿݾÀ×úý ¿ªÐþ<^kŸ)¡ûÖLiWûg%ÂVG•(×e#ÆêúŸß àVqŒ»*¯ÞIUÅYo¸•ø,9Ë=ßfÀU毸à-sÊ“Ò`Yo%•Ì)-˜_ا£gv‚[‡‰Å/™½÷ÒÉnÃ7Ÿjf ib)%g©–UØO†å{DzÞ3¥g„¹a‡°¥Åc~%ù%â4/¨œ6×1´l#/G³è˜ÙõòÀ‚W9ôc…ôÜ÷Ha¤¸ˆ5j¦²­Hñmj}w”#+ØâL|ÖÇÖÚÜ¥PJ`q°((GPÓ^O<Æ p¨ùSP”ß¾¾„ësb€šbI õûvœú§fâ?YÔ :,ÅæßÚÛ‹=ßsËO¾@qݳó¨9N¯ÿþDþ‡³²¤ÓbÍa4i¶N1I$.ß$$M·ù„Ó×ÛñÒ}83mŸyÁ[¾ß l_wœK ëF»pF ß<%ýY騗/‹ã¦ÿTêX!‡ÅŸq¹ÝV)œe-g¨ =ME¢­ãÛÐ1¿½TiN¾â'ÂÉFàÙ9ÁYººÏU¾íŸp`t†‹ê"ÙŠÛµ U2¼js†'ߘÆ52ó kô¹„¢ÓÙÁ«u´ÞŸÅÃŒFë«×P‹Ntˆ² >¿™ñ«L‹œ¾aË%¥ˆåÚ„¥Ifz¸ SHm÷€Ù¶üüÇ"›‚jQY¯êÊ7”(-!¹3úÃý÷hv½´ 'Ñ'¶MÚ˜E/ 4ß¶œ åÏM›0õÀ£ç¿ÌÕ¼dËáØv2ªÁä÷±S•eþäÛ§,8ëÁ*N°ý }•–'5{äç±ÉpÊ@vd…Ã|Nj¦‰±Ê—ÃZ¸Y jîÒê÷6òDWýêç‰×¸’úu=»q$åJv‘0ߦҵWOv—…ϱßÅ€sñÛ*›cf»–¹´I ŠT¼=ׄú†Žé 6¿H_ûS³ù]âi]gZâ¼,Y¬FS.%$HÎF8+dfærª¾ ë&Ð(±•,Ó LÔW'ÉEËqO–™XÅóOïDNí ¤´½Õ‘¨&|‚W|ž;5Ðôês¦z¬è(Ehü|Y›€|£D\¤·N¿J¿ïŽz™Œz±Õ=uI+‘?ý*sÖº–ÓTÿlm«ÚE~ñbs© 9Wp‰ð$QºjrçäÆúÒ1)ÏRôsšqp\¶IT‘j%³ƒjyHCÿ€(f¬ŽM¢¢ÿ˜RjfèzÝáÕÇs”Ÿ"ÆŽKç3ÆV ÄzüÈ€¨I†ëhA°¾*ö3YægKØ=?НîÎêBV÷PÚ;ˆÇñ<‚Q¨"³“Ùž%¬ûQ6Ï7kÿ‹H?›'¯‹ÉÎg_ȹEüxƒ×²­Y=<^2€èËÞe¯‰VÒ!USã „€,(裨OxzHU!‡6‰¹«4iLsl²­h>7¾5~6 ðÇ赎˰æ’HÝ`¤ 4¬^Ü"W÷{iN¾Äria%±˜Àäj*©j&R±V`8ýb‚¯+×ejÃvK.®ŠU¤¼ŠS£©¿é¥Ò ·.õÛuîÕk .6å@³Ýg?\^ñaȜſ=àÀË™ÐSV¦¤^ëüIkIF™ïEKxøú§(ïø;^æ×«×$¢lè!l<ÍîSâ…$K¨™Ñß$§~½}CÛÐòþ £”šÝø– 21ü}ÜÑp]Á'v¯¢3um%8†=UÔE‰k9„"»©,jŸ™Ã˜ãüÇ©=Ó˜ì¨ß7,kë¼6Ú°àÁ<Æ ê™+~ÏaW¶ëÄK*•H÷s!d®®*άÊ}—¸ÖnàˆÌÔíüÉÁR¹NJ®£ÜGy#ÇÇ3¾Sé§yþihlý¤âŒx­qúÝc홦:˹tyÊKös$&]¿€ñæ1-61‹°æ Lé(ìZ{ô-)¸ÐQå 5ÁÆäž>ÊËüu„¸-âC™:u”ÈOa:beóéWó# q„¤QöÁ‹J¼Ñsí,byô²Í¨z6„s²ÇêÛ7·¯ Üïÿ w¸‹³~ÃíFøí–K-açÔú—†:äI Q²iS£Ù1=ÀQÙæ-щ¦!gãUIt/Ãqû¹èãï¶ •y|(?"´0×P¸³,N½ÊîøŠ7.ʯ¡½àsß‹LLvêmÙ ½×?Mâí¼áßD£‰z¶Ê©EÞTÿâ_Ž,mUþVÖ¼uñ+j›ù,9>ôüBPGáZh ªóGú¹ôÏꤤ k<¥"º-„CU"ªæ"³Ä®Uu Å#%íe/º™áÒ‹j†]ˆ.óʵ‡³m,KH ùÈ–7XeJ¤ÊÕ7æ”\ü'8qÖ;C7jKÜ w5ðuEš‘18Þ9% ì¥`t•},<4^|*xk„w6“xšëR³]Ä‹ž8425ÐÜÇ”G[?ªI?Gµîc¹¬«²@€"Ò‡Þ‰Ä:Ü‹÷ºÿåw®BJÓîÍUqµÁŠ×ìßN2eV“øjã u{Ž’Ö+FꃻH¡‰’I˜Ve=Ôò„ot/ÚQc3 q‹éW´‘Ÿ/©¿:H˜]× Ø3¶³;¨5[/æžCR×Åû*eJáèøxxSå’ØÊY†ƒû»Åû"öD¥©ÚÅ61 KyÔ˜erÖÑèùWÀŸ"}é8ÅB.É“6ñÍgŠ/”êy¤¸²ÛªÀ,Ѓ¤›pñVsS¿›B\]¤CDî/¸·Š ¦ÍØÓÇì ½ø29 š`S¼ì¥èæ;䅌اס‘Á—i|ÃÚÄuõ2i !ÿ‹†èÀÓ{ØaËé«zî/ÌÃ{ùêv)‚îÎ/.cÒä$˜ð¥w‚ß—­ ³wÎņµJI‡ä&.9vUo¼Äñæ¢!Õo9¤rQÊàäaõ—â›ëà‡ŽØˆƒÁۙ˾K)Gb “ð© UDï»Hý ,YVj„±]ãç6“AEyOgK:U¬%ñ»µ•f‡M§—JðÚ‘‚_r-“hÛ»»¤;އ¤{¡éFú*Kº*MÜÀ3 Ñ|w&o|Û û†d¡taê5µ –oo|>—®®F¯™£–Vý“©{b¿iUxD.ÿ  ûMy ÛX,È5òvg?úJ›éÄ3¶R"¤Ný½%Ò¨ïQIÝ ; >˜Õó(¶¿²œ9Là=súÕžœ-®pÏlãû„¥“e:•JuË‹×Ï}PÂQš'½™l7V¯Ygµ ³ŒB⪬2c‹Ž½‚aß±" Vs<¥ƒ>tרgÎ` é©í®Ûô(´p%'Œˆ“%¸_ó‚>ß]°(Ëê6Ó+<™s¾oQŒõîJSdèYgÊ/QYž¸"ãð®Þ±—~Â@ÆEçJÕðËòË&5ôyQ tá”ØùÚÏçŸÎ’ÂgmŽ,f5’ÜáŽGþ-cà¿P!¿b ‡2€‰>9{6‰ Ñ×§¯Äå­&ÐAõu°©®M?:Ú¦a~™„é à6Ò%(<Ó'n eò^ãÛ¨Å`UÒ]«Ê2õ¡·±;fkÙê5õoѯ±Ï P: m&µJI:ÓI\”ÍÎw(.‹N1hî“9*ùªüÈXOd7ìµSL_¸¨‰0·IÖÊO¾+ŠìÕþÓþh°žµð.~,Übå+‡â–"x—&¢uO®ŸÓ$ v{"]è©xÁÅW/Üøƒ ù›ñ‘C­t+×/wŸðŽ^*6Bõ0{¯A¡ç xòüÑvbŽô߃¹Kƒ è¶s*^‘<¹¹m>-bb~úD•@¿”  Œ²–×±3f?ÿ² Rú¤Ê/p-ß+ÄÛÀ¥vÝ o©Á ÄI,W†Bž©õþ7²')ü8ÿú+˜„8çsBå‡omຄà¹aÁ4Ø»#6.VÒw£ã¾üS²,¨ÝQKïž.`®÷Ò€¦H>Ÿ÷Ú÷6ò=©ë¹ÜŒNŸDýáH ãþÀD§•þö…;oÍBT‚ºWùsœ4‘9•AöT¡ñ✞ Ö}¿¯Tt2 O$ëim)ù> stream xÚ·T›ë. E ×b¡¸&Xqw(îZ,@ în-R(VÜ­¸Kq(îŠ[)ÅåÒî}Î>çüÿZ÷®¬•|ÏØ;3ï3“„žFM“]Âf–…A]Ù99@‚)e N>ÄÍqaÐÓkA\íÁ‹1èuÀÎ.Tð? ¤œÁf®2i3×G;e ·pr8_ rò ‚@.Hà_†0gA€´™Ä ÌP„AÁ.ôR0GOgˆµëã1ÿz0Y08øØþ¸$ÀÎ 3(@ÙÌÕìðx¢…™=@f»zþW&aWWGA ÐÝÝÃÌÁ…æl-ÊÌp‡¸Ú4À.`g7°%àwÁ3ð_•q`дl .É5aV®îfÎ`À£Àb†º^Ø ö°°þ¯åéþ£äü-~¬À×Ûæ°z,ì ±?~`x»˜¹®Îp°¯÷*þapr,!®s°5ŠñOôG1Øê/üxù΀!è‘{œÐï׿ŸŒée ƒÚ{þcþç~Š :*r*¬Uüo¤$ÌàÍÎÍ `çâxx|<ßÿŽ¢fù; Ð?® P+@à¯d»ô¯„Ýþ¾¦¿gƒðß±T`¤˜þḈdñøÆùÿÌô?.ÿÿåÿÆñÿMHnoÿGÍôGÿÿQ›9@ì=ÿ6xä,Üõ‘ÿʰÇ)€þ¯©.ø¯™U[Bàÿ«Up5{œ ¨µý¿Ûq‘…x€-Õ ®6‘å/¹öï!³‡@Áj0Èï­`çþG÷8Yv›Ãå‘‘TàÇÁùï#e 0Ë߯Åû`æìlæ‰z$//À›óq-Á8 r@a®.€Çò|V0gŒß7ú’”ú-úƒøxIôâUþA ê¿?Tûq€ÿ nPó߈ó‘µ@ðÀG[«àã,aÿ3pþÈ ºü|ÌÈíü¯&XÀ×Àš>vè_øÏ΃=À s0 ¡Ûš¶ë* rwöí1‘iúmÝfvïçvøOl´$æÊA«Î—IŸ»q—6e˜.Ä©ï½4ס…·¼So½õ¹{¯1¹ÝŠ1?AÜ?žÿC¢¶ò)»–øŽÏ½“N R3â'Eúl'8?¶Z.Áµ{¯œGm_éב°¹mõÊ—J˜w¥Sìo´cŒ‹fèsÌ3fI_ º²S¢³à{àÌ\\Nãg?P+Ƴbøî¿á.ð6Xãz{3ëµ\®ÅåÒIFGf@J‰t?2Éà-¹û^‘ä‹wqa4nÇ0Wî½b†ñ~$Ƽ" “Év@·í˜RšôþåZƒ8¬}xç*ÀýØK¶Mª=zG7T_ΣK¤ÅA–øÃâ ®Áå'ŸëYøâdQ1Ä<àÙ¨c¥9ê-‘s2!“ ŽAfiœ/ÜCs>¿«ãØ:W¦/Ò¹‡¿^RO{oUmZ,In17å«Z*_Îrz×N²¨iôkôÓ¶V2ü7BØAÂ×1s²ZÊ·ã:ÅÊòOÖi·¾Lzȵ'ZœÄÐhUé­'_ùZÛ9 dÈã“ì?#Ž¿ð®¸JxG\‹^‡i„ܾïfØÔÝ»à ܽdñذ™j[å ¯§Tpïøl(A8SšîXŸ[‡d×-m`òã½Ç]èlb9B»ÆXY¶§ínuo E·#&ø„M«v–Ú|Ýt…cHË •üåO<&ËŸ âÂÌ¥swy¿ØB(:5cÞ]Ô±fY›-j¾x'|ì ÁìO1½^‹ó¼¼ûµAŸG¥ „ÒˆCÆzÿtªîð[úP¤šË7!$ëêʶý‡‹2š±©‰ç¾¹tÖqâVÍ*Ðyìô ³BR@3›~÷.XU }›I׆oõ`¶öG aî“¶ëëoTíjû 0—ñè&¿ÀÓ(¯cê ¤åYû³x£~Ìû‚wñÞQrƒWCQ78"n 좟Ÿ âÜáû‰7¡E[à¦+>_%~Û^'ò”#ûdÞrü…JþYÑE±JW¸Ù…Œ¥ÕQxtT® iƬô :î8»·§I’z aâ¦u€{œ¶Œÿ–`ûn†ÏsÁN“%¢ Y¯× îÙCóVâ·;kþwôÂɱº•²íÆa Uãç}ä7/ñ&£Ç\ÜiÆåIñUY”‡¦^<©Îq“$ˆ¹øØ·.ÊlUôjìk9)¹Xûò«šÅ8G o+”ã §P Ñô%Ú õ/É%5ÉGlÅ÷æO6£/­Tõz[Ý %OZèƒñ¦É›ÞQ»Ü·Úµ>"çù9°×±Ëp/¯#´ùv2ìLÁ,ÿö ‘ý8S J<®B!µ;éFîôqWùP”çS®Æ„v]Úâ™™|VÜŽFÊÒ‡èØã2Ô†vA8¥Õìc?¤ä9ÅÉeUE11Ï´«§@ï‡ë4æ°6^銎Ÿ•“h¿<ÄÆ‰Ï+øÜšTì^¤«¯Õ½Ò¼pèJsê33f3ÈŠÆÂ6y?/€£gãÉ[æoÁM_€g“v@¾Âg˦ê1Þx±”¢hZìPêQWOòe<ÓSÐ.@ˆuô#)~0—ÔUrß?Õk½t\'WÞ tK¼…–.õÏî놇[¶9ס°ÏÄ”/’làÀ=CÒËý‡ß °Q…Æ+TQVvËÚ a]iPòÎ-Ê—ïùÄÀoЮö^ô l³äöë~) K‡i¥–aÖ.†ÈM Ÿ-iÍ%oÙ]£ò}é™aÏ)üÕ‰ô«^Õ*]’¹I{RÊJ†Ÿ£ö™‚.È{ec@n¦ð04q÷i=dõUÔh¨$™#­Më2*öÞ§ ¥×«áŸ”Ï/|´¥£VRËf£YFXúŽ»¦Ô<:2«œ©öˆÖ£ùÇzCZdD|í!’@8!–ûµWà•ŸîNt5 %ØäÊF²wZ×õ üZK¨Øp7³ƒjvSB¡C©€@ó¤êy%ȼUçix¢±~TßÿË/oxd )Fà–‘Õ¨¨±${Óql¯<^‘—·¬ ÕÚ ‰/.ÐZN¾"b\Š)ðíÂôíb]({޼ðú(N$«´âÊ‚ù|­¿ÜŒ‰*Cë!RPèç>ýþM‘5¼þ»/{Ï<Ñš(À_uLd–"EòC¨þ¼F)J³á¸<ºÝ–.d“.óˆë‰Lr[œ¶>,ó× ×m£Û½è¾¶–Ënµ $p÷jgozH2bDÊc‰_CÐ!EÐø´Á}›}aÀøŽüF} ¯o/ìA‰T¹öƒ%†ùHj{—@5bü]¤‹–þBÞš?•C¨±år·ðG,B|‚Љ‹Ò‹Øh‘_yÍ—™ðf½1 ØÙŒiÚ·•Œ:7³Ï L逢^ æ| ™÷Œ¶ßÈPÙ"é Û°]žÛÉÍîŽÅé®|fqÝŠg€Dö=–ŸD¿[0°o\9¹ Jjl„ ¿Ð¥Î;¶=+€%j/Î SÏZlíç×ßèQ¶s…¯Û=¶qô¤Ò²š”Ãõ^m¾è-IYÎAÊBFДÝy_ëO9å'¶SßXÀHV>…Úš·hL¶Ž›f'—½ó5&£ÆK‰òÈïÔd\àòÌ:"<þÂÝ ]äÚvm³E 8U/Òœ;8¨;¡;R¬–šéY>Uð}Õ©iØQñÓF)mu÷]1Ó«^ÊÃĽŠèd‚,Ž¢ò$| ,ûd[ñˆ–©°Â-›ÇP— ŸÏWï8ËM‰q¡sƒÎË*8Õ¶0;d‰ˆ†–úTê)€Øçqá ¯á2_út…åºQs;¸¨7éÌ{R+{]{KŽyÚxPᵪӅ~pÒBÅ’i(æµödšýó©|/_s)‹è’0(ùÓùL|ado](=Eø Q såÇ{z ¡±uDaÝjüÄÜ"\Ùñ\ýÆ<¨û{®Iý7ŽNæ¶w"FÖjòËO<™÷ëqIž6°`EˆvX¢Ÿx÷5úEä)`Ñ+Ê~ìk…×+‚”1Á[—"‹ö#Ôíd‘>O ƒU2Öµ#[,RàÜ´×´™¢pßd%›õõüÌÇþ¹Úä¹þ8³#šV÷ªinɨ7ž¶ÛÝNÃKqMM–تnIp´}êDÿåº ¿}`;Ü7ÁI–òx# €*^s¿õ 0:]BFêöU;\M?è`‰$ùæ¦'Çv×Ü«ç:y³ÏQ›Ö8‹0ƒrèש²tã#ð½AŽ–³tâi/Þ ²ô©Æ‚¾+‚‹ß5uw©d¨“Û­•í…ée¡Ø·\ê{Še¬/t(—Þ’¹±o.šT*€ ¦ØÉÑ“ÅÄêt°Þؗɾȕ¢ëôÏ)F-uEÙgªWŸ*ÀÇH˜âm[Ñ*;ë´¿i:O³‘PhE–DŸÎ½2JÅ_Ù⫊ÑѤÃê+;‘¼Ù~-gÚçazVKO¸E´ðÓеvæZqMEo-˜{ Ñ€<t—p4šÞàôÏðâF_¿¾œëØàJ¹>^ÄY›‘¾uQüÏ{$zÑšaÌPKö>Q'į|lªSßr‰LE>±1à©Û³7Q¦ñ mBú|VŠÄ®ínþOÃüÑÒqìÛPmN¹†¬W˜'Qãƒ%²K÷*b{Ÿ-Ä(_#5κ=»±p×õ²Õ‹h€X³ÈS5îB£[P# -mÇ)vÚuâÔÈøDÜ®–„ƒ·•Ž­ŽõKå©3¦éñT ?D'•6×›$ñÏ* ¨ʽÓ;i‡–Oçz_šì›oƒwõªŠ=nh? Nî:D¢’×”Ë(_×eK•z²Ø+™ü%—VÞâÁ2 Þ¼‡ÓÎñ¹Ü¹*õä±" &ßô3Ë0 ¢PݾÏ_ˆÂõ¨ I¢OùÜçn7Jù­‡¨d?±(<ÑùcEê9ºDhïl2†Qnpšß @{l˜”f«rguËÅ7Eì]EyÂdÂÁIáçrªÚ<¶–mµ–üŸ¥)¶ÔÖ!]eÜ‚Éj Ƀ*9|ÉWO¸¬ËJû*4jx«íÞ?o¡î½ˆ9 ›ù2³þÄ6µNµñ ]°yÉ!œáé|Jè|ïã3Ç×b™]nzlOGýl#!+ÙÔÂ…sl$”ÃÆ'Ú>©ç¢’Á¸š2Áî«A"_QèlV´Až¿¶¤Qzrìß ÚšæScëyh5`Œ´^Ùßu!#>ˆB.‰‡˜TD˜FÝ?x#ÄpNŸ›êÃÕ å~¼{I¯âè|ºn¸o7Þ{Ьž¶ÇæÌÞ¹¼“QEBm‰ül½Ž¨@úÇ*æû™Þ$ׯG “@ƒ]ÝZÍ>˜œÉÒ½šELÝ"¬Lº)ÀŒñl£ KóY è\åCñ$ª”X}óšŠV “ et½¥¬°p¿rüúî…O&Ÿ|ÈÊ\·8ÊÒb³è¡/0ªèàkÔþ3µ&ŽÄ¡™«Êe9©ì^bû¼D>õf6{²NøF¤Ú0 .Ó—úû”Ÿ„.‡4Ë@D¬Î`õWg#(–_¤›™båFj(K _Ÿj££ÔsÃêÞ*#`%#dü`œøèH¼¨G~úCñŒö|6ê•Æ°°(Ã6žc¹þ(äç¦cOz¬Çê†G™æwœ1ÛƒâM¶Y\›úzXb¯¨gc±Á5éÛnC Ψ]°„r÷ÓêùÀ>ä;u;¼P,WÉŸïv$Þf5Š_*º]°î¤;k§è^Ïz4¿Õôöoѹ÷%˼)"Ô_Ƕ—Cèÿq›šì·aóæEô·„šO:•‚ gµµ….JÕ^r>Ýl΋"sû¶6ÔÈ“ˆFÝáø®Ä„µñã^¤˜+äšåH½ ÈݼÎÍxO¾9ªyyVÊËXLù1ÿ0e²í6 fÐVkVŸ4Qäê9YNšÑZeê©p dô󶇴i“º»U±ãûvÙÒ¯M7¥´LŠoÄ‘|'ºE%©hLïN˜ò:¬U0‡B·È3ÛȺ¨àø{fÁ´ÃâaEÓ×Ü!Ó‘Ré•cØžÛÑbÔýš´Ø“O4õcòü ?òåmÇuÞôQå0Õœþ̵— §fíÖ±¼eçKkJìÊÒÏx”¼4ª‰Ho¼6uX/v!7sLݺ(’Á¬…T ©€ŸÇµdKÒéDÇùí¡Ðb(›h†H^EË’òs\/Ç0pZˆ…Ѧ“ÐD-IŠ VŸÿêßX0&¹ÿ.8„"ÇýY'픸ñõN9 tF}_Ñw,í£‰Vút=V­ÕéxEŸî¢¨‘óð-À!·1Ý>Q¢´†ýr:r43cjèeGÎ-‰|Çs6”ŠnÒ(æü¦½,CuÝ@…âOuÀZ³[®éGÓ°ËQ§[öWfS5×^~íãÉ3â°j}Nœ¬ÙŸnþ8>>e+57?Çm,ÏÅWJ/®. A3˜ZRx ÙÉ%‚1aE!ñ?¼S7£%ÚP5tkw’Œy_Dß;˸-lGÐþd¢X´9ÉùЫÕi¯…«¨×Ð"ÚN©é—ü“G2âÄi°„5ÅÓ.ÏŠlp‘%èÀ/³Ò‰FèÈÕ‰?H­µ~‚y¡¸ì9ºW™0`KÝŸ â(9¼ƒ˜õ”NKDEŠü˜yÆš4›åWGüÈ渚Ò5úó‡Îq Ó¦¥ž÷Žör©=×–œ‹k¯<³n¼ G×lßï$]µ™ˆÙŸ)…FN_o{iòr4ï4é4u££R>IòGpdv L½ê‰l1Úˆ*ÚÁÑ„!ß“Ÿ6Öˆ)wÇ5šÏ¼[×GñM$Ω_‰“—ÑrŒ…죛íµä~° )Bü„œs *ýBŸìÁOœ‘Båxv— üâàIS‘À‰ôÔ!Q·*åƒ8íä|ü/ƒP/5B‰Rtä°¬í~ã†:€@·hDÓIÌiïŃwÍCvÝlVÚ&Ô+Ã/ToL0fG#¦èï„5Œ‹¬häÅ\Ç?Jõ^~¢î@æ)øúë<çFf~¡0I5?·HD­ö ã(ì`,¡ 3¬•x8¤;Âû,áüÕˆë×) *ñD>>ÂCÚ—g±6ú2€ß Ý©SðÏÏÊ$ä*bóÀK0N¾!†Œó7YpÁnoU¹<Þ¬ô|æÚ{Ójê ŽØ©Î”'K—aOE“L”žž¯õjf*¥â £Ñʯ‚K 7T¾Pv+÷ŠêF«;¸á¶Mëþ¤ Ê•ƒŽ¦ãÛj8ÍPØ0|ÞQ–5BIRŸaêÓÄI¯=B¢Å<îxïrôÕÄI³äˆtèDº>±þÕҹ깇»y+ÓÎB|/O.›Løš÷Ò ›£ÖÄD¾þ«:­£Ž‰æ )“gõ ¿äK1eò¼´,ò"ÆØ³ãj®W s¦Z§×á0ÿÝ¢LxUÛòK¹¨gcÚ,YÆ¢¼µŸÞõÍ@쟟|, eθ5‚#þ šß¹ö´ó?º8eÈR*9 tÖÄŽáé}«‰>Þt1¸,bR­Æ=êT(K>¼‹¯"r}cGéÓnÔGm%¸\­›O1f½(Ÿœó~7"±õT9 ‡m˜„L7qºó-‚ê0ú%Má­‘¬saç+>  &“Nù•ö®ÞçèãXŠ¥µ7¿r¿Þ±hÚf ‰#sÖ&Ñl@ÂU“]îú› á$Ü“ d3»¸gó¬aŒ" ±€Þü¬­¯or~¢^|w7Ö‘™„«Ü>ï‹æDäW1ºŠ "kÿþr qþTj H8Fe8D횀Rçô³ÖŠ[RÙZ™tûâú­i–9S^Õ‘&C Qè(懇ô'GïDîà)yL.½¦@aDƒœc!caJ¬ïµ‘RfË.ÖÞþÀy……õð›aÖÑîAw«hdŸzÁ “#¬/¶â$Ï2n,ò³m£¶ä‘~v}~r9ÏEk·¸àÆ…!Âd)LXà?‹K-x²n®d`f.Ãz3”€M‘ÉøkE)õ`"é4_A àÞÄ ÔBƒt_žq¬ÓÉ!‘e1ì€A ‰ã#ã =ï Y*è í‹ÎH¶Åû¨<¸¤U£Æýg1Ûî“v¸œ– ë/«h“:C˧ª±;V’:Ô¢¼’§SõïŒqØxÊü1-ZÐÉ’dÃg5-mÓ[)¡=ªndÕê%±EiqÔ SH©jªHJ¿ÂÓ‘9_‹äëeŸ~Q§e%À'5åä;)?ߥ'ùVLžâl|h0Zc)Þb -ˆÊBà -l¾h>_ºº³µT0†‡ÎjE¼ŒI®`‰i'NäÞÑ£ðí aDàê[ïµnWæöŽeæ9áŠÝ§eä˜íèOß]›TÞÏ3þðèÞ¼IôÔè1ÎÞ è½2{í ‚´sý2Uÿ¤j¸33Q# …/-í¢–3£\†“~ºlØøÄ©‘©èy[Ãφ¥oûú<Έ®Ám–ÀÚÎçÞ±K¼þÛ¬ì†*ãÕ {Ïô'§\3NMÓÐÅñVüFµÜ2Ó²BëDçÐ u:ù•( ×)wbXÜ‚Ò7|TÓUß}ª¥$ùËQá„$×_-O#’zÂ+8ÐL¢ú5ÙzbáC*J8êe-þÞ³ÄëKóž•ÆX£6U‘†´¨œæ­Îòo#(luDGÙH7|¾»Ø°JŸph}›œIö„Ä|qšø(905~"Œô‚_†ŸèÁ•⬋ÖLaYmlzËp¹¨K™–tª”Ô÷(°ïD£ÒmÌA‡ïMgº©E[¨®¨¾®ˆ¼'iшhñÜ˦(§,K@ʆáìæÌ¬¹E{5žuWïF#®Õ€‘½RjíŒ5:æw ?M8±'‘¨VLHkÔP‰æ? ?u€ÏÈæ ©ŽÁDX‰ÉÆã–¿.¾|Êdß]Ã>Ž<Óm>c²èKrnÌüD@ö1µ =(´HÏ-áTGßËUrBÐR ¾Ðmˆ$O”{}­QÊeºíâA /)L£–ðâMÓöÑÖ"n ¼Ö,Ùe/ƳOó$ÃÂ-±l,uóã²\記3¹<:|èð#½žjžœ¶A)ù®ŸÜç«*YU–øU‘¢Û´E8ÿþצ…kÇv ¾èÚr×_ô/õbÉ¢6*S£{“Ÿ¶Øáv™ê­.¥ù?|ògÝ÷<ÿ¹W@=K\¢¡¨NÄåjÞ¦ç¯`ïÄVï3eè˜l`÷i÷Šø`¬ü#ÛÜÅæ."ØK_)Ò&…\Š˜šf@îû.SZœ“ =°ˆ[—£ãüU•ö¢‡¢L¿jŽi¢šª›ZC:õ±oÐp·ÏvY¡ßÍP>^ˆåwÒXðÇÅI¹ƒèˆarzi¢¸ÝÍk‹x«Òû"oV£ WÃ%ÌtÚ+ì†F|÷mˆáê$MEAjwSN{á¥Ù—´ý©a¥ÔhCm5}$S…;Ä3/±i›ó°‰…-éßagS²7=¥ßFÂÞxz¹çà ±Ž8Òo Hi9絨s²¯ªÀÖŽ†_Ok¼ÁÜ]=±j°Pë·ƒ7ê´å?>²Z`Hš.ÁʉMXÈÈà‘DümÖ‡nÇŠmÿý+×)‘ÇûT_}÷ ØÅPæ6´ÄâLÀÈòÖVÇ/Lñ‹Ø7­§ê蓉ÃóåÊoq±®ã÷\ð —.…÷çIž8@K*#i[³Æ¼çÉ"YZ(áó°RGÍË Špdˆâ{¢LãUTõ+QÛWlÔ´Þîf}(¦\ ÇjWÀYé³ïº=N h]A¬nà€kJnÂ¥ƒíùLK´Fñ ÷pQtáZ¤w¡™z±tMôYj›8i‡£ò§g¼_\wGõZ ·n«Æ–m4]`ZØâ‹Lâ!Wa®\ÒVÈÂi¾øˆ;|{ñ¶}.Ìç[êµÓ•S&:Ò"›OX’"xáââNb hxLôÏäí’2«”fÈbqक>lßiÍkTêu ögßGÔ*irùêÕ#\җ׆dÐ:UzƒAÖ¶ÍêýKâ^8¢›E\ÒJ0Ç‘Ëýò÷¤~]C™ï]±ÏGUuØQ4b½Y*{~ñjcÎКÀ·=—U%ixo«›az•ìnÝë†Ýú›ÏÒi-ƒ¡QâEÎ’ì·"Ÿm]<²ÙA]¹CŸ=ñ)E0PiÐÃ÷"ᨦ"¨x^.æÚü;Œ»7‰Õ½ì=z<«ÁÀà˜nMnø'¸ùpø9!  2ˆ=œ"Äa2Ü¥j”v8pNZM9¬‚ª¯ýö[ѰqU‚5¯›5¶²ˆ?"(;Ær‡ ùT½D_U“›3iîLÝamâó+¿’øà" ^9Án4;4´šQJ˜(ŠÄÄ~ûE+½`ì/¤ ˜[D,Ôy‡¾Bk_ŸâòÍb“·“(HûWJPCf™H#­ïÆÛª%N^3ÜÄû—\A¡b/Ûžqs"é:×Is’~-F¼Ê¤ìº*9J5r™PäX‚fÁ³È…6%o@ÄG¹/Ï~z[GÚ§m¥L+±ð¼äúfÜþ¶+)2çÉe%™VЯ"Âÿ»ÃÍJ endstream endobj 24 0 obj << /Length1 1621 /Length2 9626 /Length3 0 /Length 10686 /Filter /FlateDecode >> stream xÚ¶P\Ý-Œw×Ààƒ'ww`€AfÁ!Hp 8Áƒww˜µ-ùa½VŸçÙËI .—ãÍéôy1Öú²ß¥v‡lµ¿¸qQF¢£0(…„øpQÞ6K¥7—½ª”šœjQdv;y9²ÿTnç*µ{$°Öó½˜ ºšJ³»‹ç¬|–¾+‘²Ý!H­l1˜dÙ襼ùÀtÖôö »¥Û¶$“h†âÆØ‰ÂÉF´¢–m½Bï jw2ªôÊÆ£,©O^–lkf¢ÏZe ¿EÎ'êäùð °w””È“ˆËaátÍaÉÿz[Åý‰HÙO¥²<ÎLÇ-1c25k0¤VCûÔw–wÜ k0*Ø5Êõªùéz€V0Rf4†ý¬£ùRÐ(¢R7·©“@‡… òø†n)H/—ÖOpô`H^šM–\–ŒTÒn­*îªö8gN¨>ƒV32W©¿ÃÎùHÿIo^3Vrii„tRò…O°Ø=¹ppÄŸ¸Êýõçª&¤5ºÒõÏIÂç­›•Lêâ…6Ü–Ä'“}%ëÔxòt“¸u{E¿6ÞdO1*Ó¦!þ~ý©8VL5Q«~Ö²}¤™µ°ÿ •T´KžŸ”˜ŠÇˆydgÚÀƒú™þ;·è='÷ó°2,;ƒ{]Qê<în0ý ƒÞ ßת©>[ =8­:«‰çöù‰’]7OW?¢›aO«Ø•–åß("Èý ŸBÆ1ÖIY[¶¸¤4j/ ´Î~©y‹…UW×Ƕ¶¥m#5½­ÄÞÅ_~­fWÉÂshñ=L¦ts…3,Æåàø; W4x|aP“U˜®Šô ×ÓȺÊwØ¡•ú“‘“™]`ß;Aë÷AŒÅœ¼q ™×è­ª°kmï JÌgâ³µg,ñwŸ0}â>+ñÉI±ì½üà3A¿r:a D)1Í´=íz¼èÍ3¹‰`Yއ곓 ¸+’/³Nü°þ¬ˆ•k£_Ñ„(1M¾2EkÙåÑŸ£Xžìe¢éá£ÔŒk¿T?/*«ÁÛfM°¸Û±[1p“—b¬^gÙ"ˆíNf·;h{¨‰Ñ{ñ‚¸ÌŽ)+‘‰&Cgt42ûDE™Î6cê›–Ö_΂¿ª•¿EÇIRlîÝ›Tù¢r Ý8ÌÕtÆ«Z˜ 9Jaï;ÖÍ|õi£ ¯·õºhLoÕ´¬¶è³a¡Äѳ‚wqü#i(ƒv"¶4š¶s·Àµ•¤>aƦ=%omµŸ[W ¾ç¼œk€g0DmpxÇq›‰‘`Žï~z˜2³UsÔ9Þ}«€³xÍžKzM?nÏÌýá*–Dz¢_bâÒÚuƒ¨Í0Û§ƒ/aX†ÚŒ‘žýf©Ø;®H²¸|áÚ­)ÔMæ-%¢ŒŸN€C™öòrêÖÅ*/§@//¥nÏÿGo—ÆÂ "Û½–¬Ýâ·^Ô:ÚÆ@dƒóÁghcë;G¶Ü8‰HÐõ9~R+fÕw)õQÇø· @y.Sü5:®q#ÍàG·6zx.Ò·ÄÉÍxCùiàH@²ˆÿŠ~²kk Ã…‘˜=áFÕpÍ*ô‘D Þ´uõj2æRçý«­E²ò+}*Ö`ÅãàEZÅsç ©ó»g E€N.}´ŠÎm"š“ s‚Ü "]‡B}ÐŒ<ëf4Â!ŸÓNOŒ¹È\Ƕ@eo®ÖýîÉ™•°ä¡Ù×IïÛJvÑ/Ù ÊÅýݳ¡çs—¯_”Rt›ž¿Þu--`ÕLœå1nI—R5Í´™6ø)YëeJm¸LýyÓ•¸>|“³È2PÇ>Þ¦#Kœ:ÌMŠæUyÂýÕ³v  ù¡PZr¿ó›I:ú¹…­85F™Í¶N|•¬|hÀM$MÑ]–4.)Gc‹3)Úî&\ûþ+>CàÙ˜¼¡kgóLöOÀá§S•¶îKÒf¡x;‘=û§P¬t™M+Ú0!ZîËÇýò?G?"¢XÜ¢j`ÉåâGQ¶Tv†©Ö*ì÷dåÔ%¶£I—ôí\àŠÈçÄÕwél~Ï'Ý‚¼CÈf!ëƒ2 ô¢ÙˆÑá*¾ïÉøyù9´‰—]<9‰0úoE¥ïŸ1XðБok9A(C¯WG[]û9D•D>އ¯(jv'¼M¹y¯0×‘Ø 9ïØx¶¶L w‰U›"´ïߨ¶-÷ôlËq:íº&ðÍW=#E ”iܵPUè³Ðf÷‚ óº_Mñ#o>‰Òp"Ì貋€8nÜ·—Z Ôÿ¸RÓ*r}ۈɣL½rØË½ÞóËR¨K''UÚ7’KƒÌ}_ç #vKO/ñp×Ü7¢3³ e]"ÅŸ†ÂOó6W«Un[äH­lE©rPOyVЀe•Œ˜Á{‚ó1…‘ß­¨S“A'8Éü¡'”4ÝS¬«ŒS]¾“~—솎‡£8K:ÐUÀQƒ“‚}¯¿Ë]c‰¹ˆÜo ,ô+¯ÿuøàC•Æê?ü*ß|o+Œð횸ø&Y4ÖijžGÚTlØi4áiIÿò°Х®€qƒù$þ.Nû8ÇÎ]Üi`õz Häᮞw*šÐ²O&_øŽÂPÎ" u¦µ”ç·ÕVÝ,Gk1¸Mñ"Üù«7T[rÈGÀ_­mírò9ƒF>àif(é Æ¬æ¦JÀ·¬ ãã½ò¦:#ýQæûVUMѦ¡6“ƒ¶Ïü‹Fà©ÇKûzñ‘‡s•Ä—¡y¿‹=;Õ&êÑßúË-Zˆb6ÄDxFõþ<aùV-´êÌ ØæÐ[ZÒ(s’¥¥\~”ØØiż%l·@{ˆ Û&U!˜…#CÙ<£·p0¿˜=Ó'ÉIW楇GÀko"WŸâ'&8€¨8¾²BH®É‚9羆ün±½ÿœŽs÷ðv·…¡Êö+^ ›M§¤Kµgcb6]9Çhúñûœm%‹KŒ éŽcÍ0…Ë'åªÛ'j¬5 ãg~9 /Cb.RoVmEu¨>£³ûè- Áé ¬åÊ[¸¼îz{[AòR:ŒÇ,£Q»ú eÆ“5¬Œ >ôn%°}U}Ã8½\ðûPÆæ’aeYÜ/*®Hsu]äö8ž½Ë8²óu¡s.!MÆ1÷ÉøÇá6ËŸßng@ÄmTüzœû+p¨ 3Y‹‹ºâºEE8â šƒ‡6DÊMÕœnÙ2>Y ·ãn´ÂûÚ]~Îö€––ˆM )X€óµpf¾žÕà!fª?o){A'†ë¥Npˆ¨g Îýï¢)ªOÅ>}M“+䣻>éߘ¨KqVâ>½Gçà+‹i fФ þ.¢kìѨb…yy³t SÿAÿn|àvkÄVà™e7*¥ð­ÚZ?jôWÖ©rÿïuLÏ0±g^\‡Šo…ý®k¤ó @éSƒúäm žRÉ¿húúÙtTÅ^j½.kvв¡*i,Ù>- lê •5«[­Ê­&xËO£™“§æû#gçö+U´Õð:äÄpDô00Í !Cüúç†ã§l+ÑÍÕÊf4QêIÎE¨³ 3 ÐÒãLt¥n[cЬÅ^šS |]*;Â^Õ{+ªšõcDÀq¢êt˜Tí¹oV Ÿ«4Ýó„:µowª d_¬Zå«Ög9HÄ)(–P ÜhÍË+Íov €¹¤‹ G, £˜6ñ¦æÄ¸Œ!«È38…eÇ&ˆA:]Cõ}?¥¿Ũ7‡VO“”M^âL Ù^‰‡‰½\©©ð÷˜µ¢¶LÀPÌ¢…VHùBÚŽJRÖ.òżë¼ö¬7ouê²ٽîÜ\jöõ;Ö«1—lKVè³~aÓ™³M©Ã»õöÙ ¤qI¹õ†´¹ØZ÷yHf¯W®ï1šn šš*/öIæO^œ²MÇòbãfZ.:ÝH±ìüªçG¼ã·"j—4 Z­ð€ÿJít|6™5Ò½§ߎ ºŠ.¿U$„^¾v|?^® ™Œ|-ŽÓÙbÈA—jwQêRþ}ƒ ö›&¦ésö>U±ßÖFÏÙ¹~§"¹áä‹QÝ×Í¥çæíhZ‡l}'(‹²_ÜzrUzF­оtšãàNø·ƒ×Ó€oœ;p#x%:’¼?Ÿsçè÷بʲ:×?Ô|(S͆û$Ñ Ãm™%]1ƒ¤ö._…øh×!Cw“C¼ÏƒÑtÕ±Œº²ä%3œPÇ¿¨ôKúmnŸF­e*Ð0 ®‰ÓM¬2âì[8ø¼Y`wlޤ²eõ‚ër'-R“%Eg(™úk‰1Û—† ‰œÔãÂwkõ³uñ<ý_«Ÿ8½Ä¿(ïÇ ¹¨àÂwI’êïˆ_D‘Ù‹hØáW{UìŽyÒ¶î ó1uþÒÐWÀ˜“Ä-Ù17^>\t\4v\bMß"¥&ŽÐzý^ßóÃ糸ß70Ó!NEOCS’ŪfQ]ÆÞú³à•wjT”í‹hÄ Gü'i¡£KϖлÎÅ}2~é ¾‡sª° /‰ßU\2Y«=úƒ‰ÜýK\Ü*‚Ú ¹4×*äÊ%µZäÀéh­—‹ÐêÍLIo\ïÛ=Ë`¯1] •ïõ‰4ç¾$Õ]|.XYØ™oøÆ©H^Ý“ˆ8bз¡òì9¨s’Rj TY=[o@½3š6WYP?ÎÏýí­ôE3žƒ¶M„Ä,fÐÛdÇ&¥NWñdŒ ?ý€þ¡š\ fŒ>*Òûþà0×!Ñ–öæB·—Œ^‚m÷Jð°Ú̾aç;­×»I KÉ *Å/qê!üpÜgkêJ…G¿s/ªï·¢]“§&eP#DB{…èîA’a”:©O¸®5ó ·°nvÞV¿’ÝASjaum2²Ä"¨P×îzí"'lÕÇt™_be•Lõm&µÅZ¥7×’§'i°•(êã»n£Ù£*­`R¥‚^€Ä³)ùb¹÷óTë¾¢ÒlGE+'Wú\˜`ÎL*ëZެSò)ŒêI4·–üúðT(¤ªø-Rowî(Uÿ©¶²hr%FÑ8  OÕëÃ׆+²œ˜^\<Õa©óÔ)Ñòßs½‘þø–ë|x-9@ÐÂûp73’ÂÅ'Ћ¢¤Qé¼dZÝsçöQÊ²^Ú÷±õÛô¶üôãUüŽÀön-TÎ1?EË·¾Ùv#¸²ÙáA¦ÁÆ0®4?!Sºré,.ЦWÓÈzýŒÏÔ‚òŒ¦êzû“mÊ<³ø*y»ð##O#4RGúmcæÉ)‡Ê´¬ÌwŽʼnCjmí$85BÝ2«Øä#†Ž8pþæì&Эo¼û¼»>ê¢Q")_­a#GQpñqk‘¼ŸÄ.Í0·Œ,cÙ~ŽI;”†.[äE=oϲ_?n¸ßÝq¨¬Ç{’ý#i+hè€xÙ’Å- prå)Ö© @Âyn¥àwŸäÂE*w×5?dUØÕYJÅÄ¡Ð~*úEd÷PÚI!•ª¶†O¦ñKM‡Süþ(û Ú”Œo×÷Jª7”fãH™Dø “»r-V]ßÕdȤ~Ì @éwÜâÇÖßÖ&RV…£Œ– I &$(©ÚÑ$9Éþ–w6ȜʺXÏ2m¤ÞpJD˜³¶â4U•™¬%geH¤?´P¦ÅßÛ{ÒXšJøY<ÜÒ~ê—sÛ’ÿ]+ó}*ÃwÃg,‹¼IÌùý4ÈQ€Å8ÜÊŒÚù]3ýbÔÅZ ™½î¹…åšóÓ‡'=ö‘ÁÇ|ú?Û´(žÜHœÝËfá[†Øà÷›pøZ4ÖèØ!w/\¼aw|’‰’9~Ev¸®\ûT„Cj%]Z¤ÊhžûŽºžBêÚ¹)j“üvJðZ¼ÕƒÑС 7“áèÔWspƒ³Ë&›ÈÖ°ñ:‡1:—ý,½× É3¼€üIRØ’øòã›ÕÐ>b/ ÓÊ.”ˆz.ßxòã6hŒíÐèW ¢Ÿ«ì%Jâ’›‘¾0yE¢QÝK/}F®ÊÚ„2±ÄÕPáÄËXðBZmêùNO-iâVúÇ-‘ü…F-hb{Ûç›(ѯLý sÅÄ«wç3¶¬Kâ¦Ãhp,™^¥¤‹ágüæ…¡ynIJõOqgEm¿¬©JÍK%lÞ²X™7qóÐ3!~ñe,"# Lî’¿lÓ°÷ÅŸÍdÆLçN¯øF¡@3{?´ÅqjäÔ;š©ö$@v<+ú™)“a)×™–;L“¼ÑBÕ7öUp3OšMe¬µ™½;OkÙº¶àˆ›Æ£]éZ‰_Z“ܹ çš§O„¿|Œ¾ÅõÍ&›z7•I6wfTÓâÁCñEÖ{3aiíáÀR“„•Þœ‚ êÂo•‘–MŠ*ØD*bVÏû6Y¹>ðê=~ p(ìZ×U·.Ò ´úwSœ¡b8ôE¼¶6 îo†…¾ÏÐÖCX 4Ѻ.¿( ZB~3qML×€èV£'²*Í´›ê×Wm«Ñ‚·À&æ#Ë¿ª×1 zæªuž›É)é^_ÔËMÏB‘1ךêr2ñÉoŠA8Š^€+3T_šhá&’€±´‰5‰.Ã}/¢¤gc‘$xžoN½ÊrPâã^`‡fìû»`ëç¦i·Q›PªH¶žyEàDo ^UÔäo¥¨ŽŸ¦²ªÓìJJ3Þ‚óžÃmZÄVB^ ·=˜(Ž—¦ÚÛ–`‘Ή‡¤£—¦¶‚—b(èŸ\¬ZwH91ͯ:@rµ@6LXï£ìùÚ0`̪”'ÈΈÀ&…RŒ_?÷˜ íI/ʪúÎß»î`)ËgC#Êu„ ‹5¤]<8ðÇÐ|]ï^ ž‹Qþvð.Áàv–r› +k£A5ò¡¦ŸÌÝ|Î"ý Å·3ÂÓТ'6rÀÈŒO©è{w4$ûYûk€9½åøWa?¡R– ¤­;ý;?ñ×—LßÔê7¤¥ùÆ,T3®µÄó9Ó¼Ÿ²·ã×Þ1¾7Ics‰÷zËèîü4½ÂÓ)ÿ.äª,Ä×xtò!5~°i#l…£¢yµ¼þmkªâ°ÊÖAÖ¬ÌP*ϧY2F:,6•T)FÓÊ¿ 9ØemÒã¢Qc#‡ûô×åÌT8\…ez§{1 ¿ RÔBüÌ¢÷p­çÛU_è½Ê8½eAÙá®G< Ä ÉH5—é£ÊγfWŸ`çmE ½ñ-ööKÇ]Mݾò“4'“,Ñé°kÓùðVŽÜã—}·ûÞÖ ¡¼unŧÔª'|æw´]Ч%æ!E#'ÈHSéî³Õ¼Ÿ!WÌÖn† 5§Û ÊzóH'ªÓ¶K0Õx6Ýû•û;œA±ý1׉W<‰òÑYÝæÌ×AV˜¹™:²lüÁÍ̧sÛå2ïô8ÝÆÛc›§ M&sÍe·¡ïoxÀJïtËWjúe3Ø÷ì÷ƒÚèâ=¥ÕÍtó:ÝvÞõÌEªGxK©¬uJŽ}÷Û^¥rèÈœ»À®ÜÀžÈ(ÄöÃr”2ËζIçI±q\®\§c•çÍêËÚì¯ûøD q óÙ[ÚFÓzÇÆÉá—Ux•ý\®þ6¯à¼µÔ‘¥§4aØ¿àãœCŒ«1“çrF ëmh gÐvûÓü¡Ï¾Ì¨ePÌPa´7%ÒWÁCw\ÚFVp€¬oê½Å¡n¡5ïGÌÀß.”¢<À󙚖+¸ª>ºÒ1;bË{÷0Ø™Ìö`rÉÒÕL†ŽVå…óÅ:‘d8I&EùËjÎÒä+ij#;Cõ¦©·eY`:"vjxŸ¤Ìžµ´Ì‹%5GWšü ½Ü ¶`ª_ç¾øÔ”E3ÚîåÃëùΩÌÝ9¨‚ó알“#õÑx avÙŸ:]Êù^à[”·*¨Æ=^èfñXšÑÛ½²3¾‘Z­‡•àɇ(ˆcÃè¢_‡.,˜$Ù/†ÿÀ·æ÷}~ù…§Ïd‘hMœTî’ãRfžíBÍr¦"«yÕiSÚ*wüJKÕ-é[¥±Ì®ÂÓ’óÛÑÍÕü, ÎÁ¶šëàR‚œ1Ç*N\i9wï‰d`8ëæ¬Êر¿ÖlËÂBß©WMŦX]´%¥ÔE•E4|®š”™pî›}N{¯"3>¶·<5W_E$I)åb×î„Ät-”i™i'jÿ*z¿àPA}W½J##W£li¿Ui›¡ñÿ\oˆM\^³üÄp%p>SPiM­ŽÍ…‹‰%T®*iË`}9õ2<ÕQ‰b!0B»ˆ{sÁ÷aÄJ²Æ}á×ËÅšÛ¨6áç)B*MÕìkðtQ‘ÊÍ ]àÁ`>ÃR¼ö¹5LÈ‹®òB—Í¡Ý_þ8ðÁAz b}œ ¼L;Ò-õd|3 õÖ“é]¾À:)ýFÌ’žq{ Âúizeð£cÛÙ—k:ç8‘zf½+ÒÕ®æ¸ùbfgmB£´Y@@“¶dBwøífjÊØÇ”«oNx¡‹8}@¼ÐW,>½ãÂ)S¯…÷˜S4Å ²P'ÒóYOx¦0º¯Š}k-”a›ÑB ÷‰T:GÔ}Ø23F6ÒÙ•N”¶­Hôü⮎鬲D± ô½Rx¿ó§EmÔq‰²´oQÅ~âç· °Nÿ¶e ¦Ë‰Îµ9*‘´«ñ^“C”páUÔ0ï³m€·rå/˜ÓÑüâÎtý@;9m“nmÙ0#ÿ4ô¥”'« ªÉ—ÌvÙ[Oa!Ÿ}¶ Í'˜ì|9•yl½ù}U..Üi Œ¡³K\õ½»õsÏüðžb>Ñ­ð^Ì úpnãt¨…î˜ëCÅB‘ò´hÝŒÕØÃA#ô–½;ѵ}«£üÁ'å™*Y‹ÉZ#6"'âÎûìóÑÒKr[nìÞñWi´)•ØWßRP¯T¥='Y`òºzæg8h›Ø= vM+u#1»ù˜öÏ~>\ýËñ±²þÁÈ„zäV=Ì¡÷`î÷`õ“JÛ;?#så õ/œ xPåk?šoj#1dç]S¯ß+ûÚ|â¯<»U¸q·r2Ñ ’÷³™+²m½ˆX2'yaG?*L1H|*‚“VÓ `²UÄa•œ§t”?C•צ0}”ôÙ’ŒÏSYïÍ£xµî”Æ‚jlÛê_ÁÈrÊ™_’¥­¢úoø@5à{©öá:¥ƒÁé(™äòÄZ窚h“ ÄÒ!knûZdŽ:ÐŒ¦ˆúZºÇ¯Ìä‰/,ï<‘ï¨<_qÏàR~ަcI}Xk7n\³:?ç•ìdøEùuü *…–ÉõgòvO­œß‚¶ª¾|áˆä2%š8/º® êcñ>$"cž»¬¼ ɵTQPªÎSoŒW_c«L0/ {̾xFžªNZh6Ûôδ®>¤V€u=^è¡ÿ»ïC‚Ü µü zÕæûÖSaɦÁ¬§ÕÀÂe§DÞWºÈÁ££ØõK*;¾‹]^óB8œý’%“ÛÔò8 ;ÔÌ쿾Rbq nš¡Û“øÄ,(ºt¶bHná{ÒPPè5ý^¦A¯†W1 s—û*S¿ÍÑ·'D!L ‚1òJ§„¤Œç‰[zzãöZ2Un*Þ ( ô!‰5ÈeÐïÈñ¢–äQŽ$[Ož÷zÀïéÐ Œcøù1`‘Ö1Vùã4I^ˆm”=žìy°„vG:cZ«ÊÈW=ôW\hÉÞò“buÌ ½Õ© ù¯nÔ”¢`¢ç¶œÈX(ÚÆÂ}œ70hª±šõ”®}âÓ>Úçß[É ªÔF¸èÈîï­?Œç#£¬†e w߀–éë¿Ú“èÿ¸Ÿ^•¬ Ð+Z¥L‰rdƒ¥m}ÊfúÑ@ÔÌÃû6Þpû+\åºùãî.³Ôf¡ŽGÖ¹bW)¡’JJÇrZá~ŽpåÚAwq¾¯Q´ïíõÑ”4'Z‘)Ò¬6Ù;¥¼ßæýO<º :ô8³ïïxüÐw¸8b/,ãS j£K›ÂnȨ“ž§Íº%Z‚…°÷£‹S°xнóó¹³”¨í7Æk|¨o::ë#¬Ú$´Ì6†+„äÃ’r^´÷žHÇ1YÈß4 µòÌžª~8‡„_•-¼Æ}ׯEœŽì±Ðü݉7+çµç´"}(ÄÏX$\õRBÇÐsiv•ü‰Ÿbøù†­èëÔt"›¼Ý`‡‡;X·skŒŒà·Ù˜æF!ÏOR§bIqè=&R©–&ŶʼnÁÄÝ–u'’uj"HJ™mvïkš—Ï‹~;è WëIô|¯SÚÿ¸™Éý”JýÉ[1Rî Ië^ÿOþ/5B:ýUa†¢oÞgoˆøÞ*Wöpë°þ,uÝ›“1ùþ\Kâi³ˆ³I ^8 Ú§oA²(ý]*•†{¹2ª˜KHZXüK©7|VÚŸ‘ä™Ýc·0øy{Ž}àbÉ&3×5ž##¸žÉ^¡c¸ÃÚgÝ”¬åè«8‡_bjI±Ü¨ôBQ„d(GxÓBЋÞeÓå‡|ý{}³ð‘ã©OíþË"Çy€3dÞj!‚’…ûxN©÷AÄ*‡l¤¶Q<,ZÓl`A3=Vlù´VÑ^}âÏð!‰¼„|r3ÞKTRN݉xL´õC ŠøQŸ9[ëk€W8Bθ÷Å­ÙÒE»¡Ù¸\›£¨eŽäûlÖÑÈò‚«_‘-ŒØ~ÆÌXÖÊÛ0Ú @ò}ªaËüŠžöCÛoŠÐqÍ`ãăŒ«D¦T§f?ÝËì cJH׿´Sþd»5 endstream endobj 27 0 obj << /Producer (pdfTeX-1.40.18) /Creator (TeX) /CreationDate (D:20180607222950Z) /ModDate (D:20180607222950Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj 9 0 obj << /Type /ObjStm /N 19 /First 138 /Length 1527 /Filter /FlateDecode >> stream xÚ­X[S[7~÷¯Ðc;¬ûm†ÉL u $!4IaxpÌ v ص Iúëûíê`ËvhBÒÕj¯ß®dÙF(¡EÆ …NAh#‚ÁË‚¢·:h¼½0Ê€…±ï,ŒN-LÖ¶ƒ%«#„¼°6g„ Ή(l Y€™²N8I8íàM gBðâ¬JííŽ<þ…Ù'±GØrÖÄö¶=kV@j ­–b.dBØ…rÁ #òåt'Y·¶É2bóxʵÐÕêYu9¢‹Ì“f6˜Ž&óñ´\lûWX99þýèÕÉ/»;ï´ÁÂeÿb&\‘Øá{Ò–·bËxܽ4õ¢W¸-=ž è¶2$wû“§Íèbˆi InhmKÓâÞ¼9<¾¾¸l„êÈ×óæê z/wä»V G.l ûSº&ý$wåž|-ûr Ïe#GòR^Ék9–ãëFNäTÎåüãXÞü\"ì`W‡úÎöµ„÷žž<ûã>ÒêËù:EùÒ÷ŠúZ¾ö›ò uºV×é>FÂOdIïËCùB¾”GHÿ¼ƒñÕUŸø ?à3’r(‡Ÿ'ÃæØü)ÿZÃgB·ØËæÃ¼PSr)'Ít4>—ߌçMáLåLÎ.û³!༑·ò£ü$?¯@šéÁóýÞ‹W é=-„3†[(§ôÿ êÿÑ`ºßb×HZbv¹@ 4·àµþi¦ã£‚ÂþÞ›Ãß…x ¶4Vv8 \þfü=(x[£ V·QÝOÔ?c®úíJ~æ!ù¼ýµ·÷ùïÝ·s¬owŽ6îG꼥ݢÒéÞJ—=ÒðF(eÜõzÝà·«­mÜ—“†Ã›÷sžžvú³†n’+ÑÏ[þiÙMgs O8løçýv¢©ÞŽÎçÃýB~°óµkÍw^÷­uíÛè¥oópßk;{Õ·Ñy»ßjéû;@_ÛOk¾íºïW0OKßþ; ¾ÖëkÎýFâá>Ðõ¦sú§bFUÜÐùlt>§\³UÉÝ>6Åø¢STª?'þJo% endstream endobj 28 0 obj << /Type /XRef /Index [0 29] /Size 29 /W [1 2 1] /Root 26 0 R /Info 27 0 R /ID [ ] /Length 88 /Filter /FlateDecode >> stream xÚÉ»@P„á]¯ëz]t!ЙfÌhAú!’J°'øæŸÙðEðjF*©¥å5ÙÞI$±$’JFWÛç8ÖœËcõÜvkÁãµ–ÒóœÁ{Å»à ) endstream endobj startxref 61591 %%EOF rjson/inst/doc/json_rpc_server.Rnw0000644000176200001440000000262713273117664017043 0ustar liggesusers\documentclass[letter]{article} %\VignetteIndexEntry{JSON RPC server for R} %\VignettePackage{rjson} \begin{document} \title{JSON RPC server for R} \author{Alex Couture-Beil} \maketitle \section{Introduction} Remote proceedure calls (RPC) provide inter-process communication which allow programs to call other program's subroutines. JSON-RPC is a RPC protocol built on top of JSON. JSON-RPC provides a nice way to interface different languages. Sample code for creating an JSON-RPC server for R is supplied with the rjson library. For this example, a client wishing to execute R code will first execute a new instance of R, and will communicate over standard IO (stdin/stdout). After the client executes any number of calls, it will terminate the R session with an end of file (ctrl-D). \section{Sample Code} Sample code can be found in the {\it ..../library/rjson/rpc\_server} directory. The server is started with {\it ./start\_server} (unix), or with {\it start\_server.bat} (windows). An optional paramater specifies a user supplied source file to be loaded by the server, thus allowing the client to execute some user supplied functions. Note that this code posses serious security risks if the client accecpts input from anyone. (i.e. the client redirects IO from some tcp port to the R json-rpc interface). If this is the case, you'll likely want to avoid allowing anyone to pass anything to eval. \end{document} rjson/src/0000755000176200001440000000000013306330736012200 5ustar liggesusersrjson/src/register.c0000644000176200001440000000103113306330736014163 0ustar liggesusers#include #include #include #include #include "funcs.h" static const R_CMethodDef cMethods[] = { {"fromJSON", (DL_FUNC) &fromJSON, 3}, {"toJSON", (DL_FUNC) &toJSON, 1}, {NULL, NULL, 0} }; void R_init_rjson(DllInfo* info) { R_registerRoutines(info, cMethods, NULL, NULL, NULL); // TODO this should be changed to FALSE to disable // as per note on https://www.r-project.org/nosvn/R.check/r-devel-linux-x86_64-debian-clang/rjson-00check.html R_useDynamicSymbols(info, TRUE); } rjson/src/funcs.h0000644000176200001440000000016413306330736013470 0ustar liggesusersSEXP fromJSON( SEXP str_in, SEXP unexpected_escape_behavior, SEXP simplify ); SEXP toJSON( SEXP obj, SEXP indent ); rjson/src/parser.c0000644000176200001440000005141113306330736013642 0ustar liggesusers#include #include #define DEFAULT_VECTOR_START_SIZE 10 /* allocate vectors this size to start with, then grow them as needed */ #define MAX_NUMBER_BUF 256 #define UNEXPECTED_ESCAPE_ERROR 1 /* issue an error and stop */ #define UNEXPECTED_ESCAPE_SKIP 2 /* skip the unexpected char and move to the next character */ #define UNEXPECTED_ESCAPE_KEEP 3 /* include the unexpected char as a regular char and continue */ typedef struct ParseOptions { int unexpected_escape_behavior; int simplify_lists; } ParseOptions; SEXP parseValue ( const char *s, const char **next_ch, const ParseOptions *parse_options ); SEXP parseNull ( const char *s, const char **next_ch, const ParseOptions *parse_options ); SEXP parseTrue ( const char *s, const char **next_ch, const ParseOptions *parse_options ); SEXP parseFalse ( const char *s, const char **next_ch, const ParseOptions *parse_options ); SEXP parseString ( const char *s, const char **next_ch, const ParseOptions *parse_options ); SEXP parseNumber ( const char *s, const char **next_ch, const ParseOptions *parse_options ); SEXP parseArray ( const char *s, const char **next_ch, const ParseOptions *parse_options ); SEXP parseList ( const char *s, const char **next_ch, const ParseOptions *parse_options ); SEXP mkError( const char* format, ...); int getUnexpectedEscapeHandlingCode( const char *s ); #define TRYERROR_CLASS "try-error" SEXP mkError( const char* format, ...) { SEXP p, classp; char buf[ 256 ]; va_list args; va_start( args, format ); vsnprintf( buf, 256, format, args ); va_end( args ); PROTECT( p = allocVector(STRSXP, 1) ); SET_STRING_ELT( p, 0, mkCharCE( buf, CE_UTF8 ) ); PROTECT( classp = allocVector(STRSXP, 1) ); SET_STRING_ELT( classp, 0, mkChar( TRYERROR_CLASS ) ); SET_CLASS( p, classp ); UNPROTECT( 2 ); return p; } #define INCOMPLETE_CLASS "incomplete" SEXP addClass( SEXP p, const char * class ) { SEXP class_p; PROTECT( class_p = GET_CLASS( p ) ); unsigned int size = GET_LENGTH( class_p ); PROTECT( SET_LENGTH( class_p, size + 1 ) ); SET_STRING_ELT( class_p, size, mkChar( class ) ); SET_CLASS( p, class_p ); UNPROTECT( 2 ); return p; } int hasClass( SEXP p, const char * class ) { int i; SEXP class_p; PROTECT( class_p = GET_CLASS( p ) ); unsigned int size = GET_LENGTH( class_p ); for( i = 0; i < size; i++ ) { const char *s = CHAR(STRING_ELT(class_p, i)); if( strcmp( s, class ) == 0 ) { UNPROTECT( 1 ); return TRUE; } } UNPROTECT( 1 ); return FALSE; } #define MASKBITS 0x3F #define MASKBYTE 0x80 #define MASK2BYTES 0xC0 #define MASK3BYTES 0xE0 #define MASK4BYTES 0xF0 int UTF8EncodeUnicode( unsigned long input, char * s ) { /* 0xxxxxxx */ if( input < 0x80 ) { s[ 0 ] = input; return 1; } /* 110xxxxx 10xxxxxx */ else if( input < 0x800 ) { s[ 0 ] = (MASK2BYTES | ( input >> 6 ) ); s[ 1 ] = (MASKBYTE | ( input & MASKBITS ) ); return 2; } /* 1110xxxx 10xxxxxx 10xxxxxx */ else if ( input < 0x10000 ) { s[ 0 ] = (MASK3BYTES | ( input >> 12 ) ); s[ 1 ] = (MASKBYTE | ( ( input >> 6 ) & MASKBITS ) ); s[ 2 ] = (MASKBYTE | ( input & MASKBITS ) ); return 3; } /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ else { s[ 0 ] = (MASK4BYTES | ( input >> 18 ) ); s[ 1 ] = (MASKBYTE | ( input >> 12 ) & MASKBITS ); s[ 2 ] = (MASKBYTE | ( ( input >> 6 ) & MASKBITS ) ); s[ 3 ] = (MASKBYTE | ( input & MASKBITS ) ); return 4; } } int readSequence( const char* s, int i, unsigned short* unicode ) { for( int j = 1; j <= 4; j++ ) if( ( ( s[ i + j ] >= 'a' && s[ i + j ] <= 'f' ) || ( s[ i + j ] >= 'A' && s[ i + j ] <= 'F' ) || ( s[ i + j ] >= '0' && s[ i + j ] <= '9' ) ) == FALSE ) { return j - 1; } char unicode_buf[ 5 ]; /* to hold 4 digit hex (to prevent scanning a 5th digit accidentally */ strncpy( unicode_buf, s + i + 1, 5 ); unicode_buf[ 4 ] = '\0'; sscanf( unicode_buf, "%hx", unicode); return 4; } /* Attempts to parse a javascript escaped UTF-16 sequence into a unicode codepoint from a buffer. If the sequence is invalid no unicode value will be set. The function will return the number of read bytes as an indicator of whether input was successfully parsed */ int parseUTF16Sequence( const char* s, int i, unsigned long* unicode) { int read_bytes = 0; unsigned short high; read_bytes += readSequence( s, i, &high ); if ( read_bytes != 4 ) return read_bytes; /* check if this is a UTF-16 surrogate pair */ if ( ( high >= 0xD800 && high <= 0xDBFF ) && ( s[ i + read_bytes + 1 ] == '\\' && s[ i + read_bytes + 2 ] == 'u' ) ) { read_bytes += 2; i += read_bytes; /* parse the next UTF-16 sequence, we are now pointing at the next 'u' */ unsigned short low; read_bytes += readSequence( s, i, &low ); if ( read_bytes != 10 ) return read_bytes; *unicode = ((unsigned long)( high - 0xD800 )) * 0x400 + ( low - 0xDC00 ) + 0x10000; /* Decode the surrogate pair into a unicode codepoint */ } else *unicode = high; return read_bytes; } int getUnexpectedEscapeHandlingCode( const char *s ) { if( s != NULL ) { if( strcmp( s, "skip" ) == 0 ) { return UNEXPECTED_ESCAPE_SKIP; } else if( strcmp( s, "keep" ) == 0 ) { return UNEXPECTED_ESCAPE_KEEP; } } /* in all other cases, just use the standard original error */ return UNEXPECTED_ESCAPE_ERROR; } SEXP fromJSON( SEXP str_in, SEXP unexpected_escape_behavior, SEXP simplify ) { const char *s = CHAR(STRING_ELT(str_in,0)); const char *next_ch; SEXP p, next_i, list; ParseOptions parse_options; parse_options.unexpected_escape_behavior = getUnexpectedEscapeHandlingCode( CHAR(STRING_ELT(unexpected_escape_behavior,0))); parse_options.simplify_lists = LOGICAL(simplify)[0]; PROTECT( p = parseValue( s, &next_ch, &parse_options ) ); PROTECT( list = allocVector( VECSXP, 2 ) ); PROTECT( next_i = allocVector( INTSXP, 1 ) ); SET_VECTOR_ELT( list, 0, p ); INTEGER( next_i )[ 0 ] = next_ch - s; SET_VECTOR_ELT( list, 1, next_i ); UNPROTECT( 3 ); return list; } SEXP parseValue( const char *s, const char **next_ch, const ParseOptions *parse_options ) { /* ignore whitespace */ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '{' ) { return parseList( s, next_ch, parse_options ); } if( *s == '[' ) { return parseArray( s, next_ch, parse_options ); } if( *s == '\"' ) { return parseString( s, next_ch, parse_options ); } if( ( *s >= '0' && *s <= '9' ) || *s == '-' ) { return parseNumber( s, next_ch, parse_options ); } if( *s == 't' ) { return parseTrue( s, next_ch, parse_options ); } if( *s == 'f' ) { return parseFalse( s, next_ch, parse_options ); } if( *s == 'n' ) { return parseNull( s, next_ch, parse_options ); } if( *s == '\0' ) { return addClass( mkError( "no data to parse\n" ), INCOMPLETE_CLASS ); } return mkError( "unexpected character '%c'\n", *s ); } SEXP parseNull( const char *s, const char **next_ch, const ParseOptions *parse_options) { if( strncmp( s, "null", 4 ) == 0 ) { *next_ch = s + 4; return R_NilValue; } /* TODO should really look at subset of "null" (e.g. "nul", "nu" ), so that "not" fails before reaching 4 digits */ if( strlen( s ) < 4 ) return addClass( mkError( "parseNull: expected to see 'null' - likely an unquoted string starting with 'n', or truncated null.\n" ), INCOMPLETE_CLASS ); return mkError( "parseNull: expected to see 'null' - likely an unquoted string starting with 'n'.\n" ); } SEXP parseTrue( const char *s, const char **next_ch, const ParseOptions *parse_options) { SEXP p; if( strncmp( s, "true", 4 ) == 0 ) { *next_ch = s + 4; PROTECT( p = NEW_LOGICAL( 1 ) ); LOGICAL( p )[ 0 ] = TRUE; UNPROTECT( 1 ); return p; } if( strlen( s ) < 4 ) return addClass( mkError( "parseTrue: expected to see 'true' - likely an unquoted string starting with 't', or truncated true.\n" ), INCOMPLETE_CLASS ); return mkError( "parseTrue: expected to see 'true' - likely an unquoted string starting with 't'.\n" ); } SEXP parseFalse( const char *s, const char **next_ch, const ParseOptions *parse_options ) { SEXP p; if( strncmp( s, "false", 5 ) == 0 ) { *next_ch = s + 5; PROTECT( p = NEW_LOGICAL( 1 ) ); LOGICAL( p )[ 0 ] = FALSE; UNPROTECT( 1 ); return p; } if( strlen( s ) < 5 ) return addClass( mkError( "parseFalse: expected to see 'false' - likely an unquoted string starting with 'f', or truncated false.\n" ), INCOMPLETE_CLASS ); return mkError( "parseFalse: expected to see 'false' - likely an unquoted string starting with 'f'.\n" ); } SEXP parseString( const char *s, const char **next_ch, const ParseOptions *parse_options ) { SEXP p, error_p; /* assert( s[ 0 ] == '"' ); */ int i = 1; /* skip the start quote */ int buf_size = 256; char *buf = (char*) malloc( buf_size ); buf[0] = '\0'; int buf_i = 0; if( buf == NULL ) { error_p = mkError( "error allocating memory in parseString" ); goto error; } if( sizeof( char ) != 1 ) { error_p = mkError( "parseString sizeof(char) != 1" ); goto error; } int copy_start = i; int bytes_to_copy; while( 1 ) { while( s[ i ] != '\\' && s[ i ] != '"' && s[ i ] != '\0' ) i++; if( s[ i ] == '\0' ) { error_p = addClass( mkError( "unclosed string\n" ), INCOMPLETE_CLASS ); goto error; } if( s[ i ] == '\\' ) { if( s[ i + 1 ] == '\0' ) { error_p = addClass( mkError( "unclosed string\n" ), INCOMPLETE_CLASS ); goto error; } /* TODO couldn't this be caught above (where s[ i ] == '\0') */ if( s[ i + 2 ] == '\0' ) { error_p = addClass( mkError( "unclosed string\n" ), INCOMPLETE_CLASS ); goto error; } /* grow memory */ if( buf_size - 1 <= i ) { buf_size = 2 * ( buf_size + i ); buf = realloc( buf, buf_size ); if( buf == NULL ) { error_p = mkError( "error allocating memory in parseString" ); goto error; } } /* save string chunk from copy_start to i-1 */ bytes_to_copy = i - copy_start; if( bytes_to_copy > 0 ) { memcpy( buf + buf_i, s + copy_start, bytes_to_copy ); buf_i += bytes_to_copy; } i++; /* save s[i] */ switch( s[ i ] ) { case '"': case '\\': case '/': buf[ buf_i ] = s[ i ]; break; case 'b': buf[ buf_i ] = '\b'; break; case 'f': buf[ buf_i ] = '\f'; break; case 'n': buf[ buf_i ] = '\n'; break; case 'r': buf[ buf_i ] = '\r'; break; case 't': buf[ buf_i ] = '\t'; break; case 'u': ; unsigned long unicode; int read_bytes = parseUTF16Sequence( s, i, &unicode); if ( read_bytes != 4 && read_bytes != 10 ) { /* In case of surrogate pairs read_bytes will be 10 */ error_p = mkError( "unexpected unicode escaped char '%c'; 4 hex digits should follow the \\u (found %i valid digits)", s[ i + read_bytes + 1], read_bytes); goto error; } i += read_bytes; /* skip the UTF16 sequence(s) - actually point to last digit, which is then incremented outside of switch */ buf_i += UTF8EncodeUnicode( unicode, buf + buf_i ) - 1; /* -1 due to buf_i++ out of loop */ break; default: if( parse_options->unexpected_escape_behavior == UNEXPECTED_ESCAPE_SKIP ) { /* skip the character (by decreasing the buffer index as it will be increased below. in actuality we dont want it to change). */ buf_i--; Rf_warning( "unexpected escaped character '\\%c' at pos %i. Skipping value.", s[ i ], i ); } else if( parse_options->unexpected_escape_behavior == UNEXPECTED_ESCAPE_KEEP ) { /* treat a "\y" as simply 'y' */ buf[ buf_i ] = s[ i ]; Rf_warning( "unexpected escaped character '\\%c' at pos %i. Keeping value.", s[ i ], i ); } else { /* case of UNEXPECTED_ESCAPE_ERROR, or any other bad enum values */ free( buf ); error_p = mkError( "unexpected escaped character '\\%c' at pos %i", s[ i ], i ); goto error; } break; } i++; /* move to next char */ copy_start = i; buf_i++; } else { /* must be a quote that caused us the exit the loop, first, save remaining string data */ if( buf_size - 1 <= i ) { /* grow memory */ buf_size = 2 * ( buf_size + i ); buf = realloc( buf, buf_size ); if( buf == NULL ) { error_p = mkError( "error allocating memory in parseString" ); goto error; } } bytes_to_copy = i - copy_start; if( bytes_to_copy > 0 ) { memcpy( buf + buf_i, s + copy_start, bytes_to_copy ); buf_i += bytes_to_copy; } buf[ buf_i ] = '\0'; break; /* exit the loop */ } } *next_ch = s + i + 1; PROTECT(p=allocVector(STRSXP, 1)); SET_STRING_ELT(p, 0, mkCharCE( buf, CE_UTF8 )); free( buf ); UNPROTECT( 1 ); return p; error: if( buf ) { free( buf ); } return error_p; } void setArrayElement( SEXP array, int unsigned i, SEXP val ) { if( IS_LOGICAL( array ) ) LOGICAL( array )[ i ] = LOGICAL( val )[ 0 ]; else if( IS_INTEGER( array ) ) INTEGER( array )[ i ] = INTEGER( val )[ 0 ]; else if( IS_NUMERIC( array ) ) REAL( array ) [ i ] = REAL( val )[ 0 ]; else if( IS_CHARACTER( array ) ) SET_STRING_ELT( array, i, STRING_ELT(val, 0) ); /* TODO fixme val must be a single char, not vector */ /* else if( IS_COMPLEX( array ) ) COMPLEX( array [ i ] = COMPLEX( val )[ 0 ]; */ else Rprintf( "unsupported SEXPTYPE: %i\n", TYPEOF( array ) ); } SEXP parseArray( const char *s, const char **next_ch, const ParseOptions *parse_options ) { PROTECT_INDEX p_index = -1, array_index = -1; SEXP p = NULL, array = NULL; /* assert( *s == '[' ) */ s++; /* move past '[' */ int objs = 0; int is_list = FALSE; SEXPTYPE p_type = -1; unsigned int array_i = 0; int trailing_comma = 0; while( 1 ) { /* ignore whitespace */ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete array\n" ), INCOMPLETE_CLASS ); } if( *s == ']' ) { if( trailing_comma ) { UNPROTECT( objs ); return addClass( mkError( "trailing comma found in array\n" ), INCOMPLETE_CLASS ); } *next_ch = s + 1; return allocVector(VECSXP, 0); } trailing_comma = 0; /* parse element (and protect pointer - ugly) */ if( p == NULL ) { PROTECT_WITH_INDEX( p = parseValue( s, next_ch, parse_options ), &p_index ); objs++; } else { REPROTECT( p = parseValue( s, next_ch, parse_options ), p_index ); } s = *next_ch; /* check p for errors */ if( hasClass( p, TRYERROR_CLASS ) == TRUE ) { UNPROTECT( objs ); return p; } if( array == NULL ) { if( !parse_options->simplify_lists ) { p_type = VECSXP; is_list = TRUE; } else if( GET_LENGTH( p ) != 1 ) { p_type = VECSXP; is_list = TRUE; } else if( TYPEOF( p ) == VECSXP ) { p_type = VECSXP; is_list = TRUE; } else { p_type = TYPEOF( p ); is_list = FALSE; } PROTECT_WITH_INDEX( array = allocVector( p_type, DEFAULT_VECTOR_START_SIZE ), &array_index ); objs++; } /* check array type matches */ if( is_list == FALSE && ( TYPEOF( p ) != TYPEOF( array ) || GET_LENGTH( p ) != 1 ) ) { REPROTECT( array = coerceVector( array, VECSXP ), array_index ); is_list = TRUE; } /* checksize */ unsigned int array_size = GET_LENGTH( array ); if( array_i >= array_size ) { REPROTECT( SET_LENGTH( array, array_size * 2 ), array_index ); } /* save element */ if( is_list == TRUE ) SET_VECTOR_ELT( array, array_i, p); else setArrayElement( array, array_i, p ); array_i++; /* ignore whitespace */ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete array\n" ), INCOMPLETE_CLASS ); } /* end of array */ if( *s == ']' ) { break; } /* more elements to come */ if( *s == ',' ) { s++; trailing_comma = 1; } else if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete array\n" ), INCOMPLETE_CLASS ); } else { UNPROTECT( objs ); return mkError( "unexpected character: %c\n", *s ); } } /* trim to the correct size - no need to protect here */ SET_LENGTH( array, array_i ); *next_ch = s + 1; UNPROTECT( objs ); return array; } SEXP parseList( const char *s, const char **next_ch, const ParseOptions *parse_options ) { PROTECT_INDEX key_index, val_index, list_index, list_names_index; SEXP key = NULL, val = NULL, list, list_names; /* assert( *s == '{' ) */ s++; /* move past '{' */ int objs = 0; unsigned int list_i = 0; PROTECT_WITH_INDEX( list = allocVector( VECSXP, DEFAULT_VECTOR_START_SIZE ), &list_index ); PROTECT_WITH_INDEX( list_names = allocVector( STRSXP, DEFAULT_VECTOR_START_SIZE ), &list_names_index ); objs += 2; while( 1 ) { /* ignore whitespace */ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete list\n" ), INCOMPLETE_CLASS ); } if( *s == '}' && list_i == 0 ) { UNPROTECT( objs ); *next_ch = s + 1; return allocVector(VECSXP, 0); } /* get key */ if( *s != '\"' ) { UNPROTECT( objs ); return mkError( "unexpected character \"%c\"; expecting opening string quote (\") for key value\n", *s ); } if( key == NULL ) { PROTECT_WITH_INDEX( key = parseString( s, next_ch, parse_options ), &key_index ); objs++; } else { REPROTECT( key = parseString( s, next_ch, parse_options ), key_index ); } s = *next_ch; /* check key for errors */ if( hasClass( key, TRYERROR_CLASS ) == TRUE ) { UNPROTECT( objs ); return key; } if( IS_CHARACTER( key ) == FALSE ) { UNPROTECT( objs ); return mkError( "list keys must be strings\n" ); } /* ignore whitespace */ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s != ':' ) { UNPROTECT( objs ); if( *s == '\0' ) return addClass( mkError( "incomplete list - missing :\n" ), INCOMPLETE_CLASS ); return mkError( "incomplete list - missing :\n" ); } s++; /* move past ':' */ /* ignore whitespace */ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete list\n" ), INCOMPLETE_CLASS ); } /* get value */ if( val == NULL ) { PROTECT_WITH_INDEX( val = parseValue( s, next_ch, parse_options ), &val_index ); objs++; } else { REPROTECT( val = parseValue( s, next_ch, parse_options ), val_index ); } s = *next_ch; /* check val for errors */ if( hasClass( val, TRYERROR_CLASS ) == TRUE ) { UNPROTECT( objs ); return val; } /* checksize */ unsigned int list_size = GET_LENGTH( list ); if( list_i >= list_size ) { REPROTECT( SET_LENGTH( list, list_size * 2 ), list_index ); REPROTECT( SET_LENGTH( list_names, list_size * 2 ), list_names_index ); } /* save key and value */ SET_STRING_ELT( list_names, list_i, STRING_ELT(key, 0) ); SET_VECTOR_ELT( list, list_i, val ); list_i++; /* ignore whitespace */ while( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) s++; if( *s == '\0' ) { UNPROTECT( objs ); return addClass( mkError( "incomplete list\n" ), INCOMPLETE_CLASS ); } /* end of list */ if( *s == '}' ) { break; } /* more elements to come */ if( *s == ',' ) { s++; } else { UNPROTECT( objs ); return mkError( "unexpected character: %c\n", *s ); } } /* trim to the correct size */ REPROTECT( SET_LENGTH( list, list_i ), list_index ); REPROTECT( SET_LENGTH( list_names, list_i ), list_names_index ); /* set names */ setAttrib( list, R_NamesSymbol, list_names ); *next_ch = s + 1; UNPROTECT( objs ); return list; } SEXP parseNumber( const char *s, const char **next_ch, const ParseOptions *parse_options ) { SEXP p; const char *start = s; char buf[ MAX_NUMBER_BUF ]; int digits_before_period = 0; int exponent_digits = 0; if( *s == '-' ) { s++; } if( *s == '\0' ) { return addClass( mkError( "parseNumer error\n", *s ), INCOMPLETE_CLASS ); } if( *s == '0' ) { digits_before_period++; s++; if( ( *s >= '0' && *s <= '9' ) || *s == 'x' ) { return mkError( "hex or octal is not valid json\n" ); } } while( *s >= '0' && *s <= '9' ) { digits_before_period++; s++; } if( *s == '.' ) { if( digits_before_period == 0 ) { return mkError( "numbers must start with a digit\n" ); } s++; while( *s >= '0' && *s <= '9' ) { s++; } } /* exponential */ if( *s == 'e' || *s == 'E' ) { s++; if( *s == '+' || *s == '-' ) { s++; } while( *s >= '0' && *s <= '9' ) { s++; exponent_digits++; } if( exponent_digits == 0 ) { return mkError( "missing exponent\n" ); } } unsigned int len = s - start; if( len >= MAX_NUMBER_BUF ) { return mkError( "buffer issue parsing number: increase MAX_NUMBER_BUF (in parser.c) current value is %i\n", MAX_NUMBER_BUF ); } /* copy to buf, which is used with atof */ strncpy( buf, start, len ); buf[ len ] = '\0'; *next_ch = s; PROTECT( p = allocVector( REALSXP, 1 ) ); REAL(p)[ 0 ] = atof( buf ); UNPROTECT( 1 ); return p; } rjson/src/dump.cpp0000644000176200001440000001304013306330736013647 0ustar liggesusers#include #include #include #include //must include these after STL files due to length macro in Rinternals being seen by a STL on OSX. #include #include extern "C" { #include "funcs.h" } std::string escapeString( const char *s ) { std::ostringstream oss; oss << '"'; while( *s ) { switch( *s ) { case '"': oss << "\\\""; break; case '\\': oss << "\\\\"; break; case '\n': oss << "\\n"; break; case '\r': oss << "\\r"; break; case '\t': oss << "\\t"; break; default: unsigned char ch = static_cast(*s); if (( ch <= 0x1F ) || (ch == 0x7F)) { unsigned short val = ch; oss << "\\u" << std::setfill('0') << std::setw(4) << std::hex << val << std::dec; } else if( ch < 0x80 ) { // 0xxxxxxx oss << *s; } else if( (ch & 0xE0) == 0xC0 && s[1] ) { // 110xxxxx 10xxxxxx unsigned short val = (s[1] & 0x3F) + ((s[0] & 0x1F) << 6); oss << "\\u" << std::setfill('0') << std::setw(4) << std::hex << val << std::dec; s += 1; } else if( (ch & 0xF0) == 0xE0 && s[1] && s[2] ) { // 1110xxxx 10xxxxxx 10xxxxxx unsigned short val = (s[2] & 0x3F) + ((s[1] & 0x3F) << 6) + ((s[0] & 0x0F) << 12); oss << "\\u" << std::setfill('0') << std::setw(4) << std::hex << val << std::dec; s += 2; } else { error("unable to escape string. String is not utf8\n"); } } s++; } oss << '"'; return oss.str(); } #define NO_CONTAINER 0 #define ARRAY_CONTAINER 1 #define OBJECT_CONTAINER 2 std::string toJSON2( SEXP x, int indent, int indent_amount ) { if( x == R_NilValue ) return "null"; int i = 0; int n = length(x); SEXP names = GET_NAMES(x); //int container = NO_CONTAINER; std::string container_closer; std::ostringstream oss; if( names != NULL_USER_OBJECT ) { oss << "{"; container_closer = "}"; if( indent_amount > 0 ) { oss << "\n"; } indent += indent_amount; if( length(names) != n ) error("number of names does not match number of elements\n"); } else if( n != 1 || TYPEOF(x) == VECSXP ) { oss << "["; container_closer = "]"; indent += indent_amount; if( indent_amount > 0 ) { oss << "\n"; } } SEXP levels; PROTECT( levels = GET_LEVELS(x)); switch( TYPEOF(x) ) { case LGLSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) { oss << ","; if( indent_amount > 0 ) { oss << "\n"; } } oss << std::setw(indent) << ""; if( names != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; if( LOGICAL(x)[i] == NA_INTEGER ) oss << "\"NA\""; else if( ISNAN( LOGICAL(x)[i] ) ) oss << "\"NaN\""; else if( LOGICAL(x)[i] ) oss << "true"; else oss << "false"; } break; case INTSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) { oss << ","; if( indent_amount > 0 ) { oss << "\n"; } } oss << std::setw(indent) << ""; if( names != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; if( INTEGER(x)[i] == NA_INTEGER ) oss << "\"NA\""; else if( ISNAN( INTEGER(x)[i] ) ) oss << "\"NaN\""; else if( levels != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(levels, INTEGER(x)[i] - 1 ))); else oss << INTEGER(x)[i]; } break; case REALSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) { oss << ","; if( indent_amount > 0 ) { oss << "\n"; } } oss << std::setw(indent) << ""; if( names != NULL_USER_OBJECT ) { oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; } if( ISNA(REAL(x)[i]) ) { oss << "\"NA\""; } else if( ISNAN(REAL(x)[i]) ) { oss << "\"NaN\""; } else if( R_FINITE(REAL(x)[i]) ) { oss << std::setprecision( std::numeric_limits::digits10 ) << REAL(x)[i]; } else { oss << (REAL(x)[i] > 0 ? "\"Inf\"" : "\"-Inf\""); } } break; case CPLXSXP: { SEXP p, p_names; PROTECT( p = allocVector( REALSXP, 2 ) ); PROTECT( p_names = allocVector( STRSXP, 2 ) ); SET_STRING_ELT( p_names, 0, mkChar("real") ); REAL(p)[0] = COMPLEX(x)[i].r; SET_STRING_ELT( p_names, 1, mkChar("imaginary") ); REAL(p)[1] = COMPLEX(x)[i].i; setAttrib( p, R_NamesSymbol, p_names ); oss << toJSON2(p, indent, indent_amount); UNPROTECT(2); } break; case STRSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) { oss << ","; if( indent_amount > 0 ) { oss << "\n"; } } if( names != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; if( STRING_ELT(x,i) == NA_STRING ) oss << "\"NA\""; else oss << escapeString(CHAR(STRING_ELT(x,i))); } break; case VECSXP: for( i = 0; i < n; i++ ) { if( i > 0 ) { oss << ","; if( indent_amount > 0 ) { oss << "\n"; } } oss << std::setw(indent) << ""; if( names != NULL_USER_OBJECT ) oss << escapeString(CHAR(STRING_ELT(names, i))) << ":"; oss << toJSON2( VECTOR_ELT(x,i), indent, indent_amount ); } break; default: error("unable to convert R type %i to JSON\n", TYPEOF(x)); } UNPROTECT(1); if( !container_closer.empty() ) { indent -= indent_amount; if( indent_amount > 0 ) { oss << "\n"; } oss << std::setw(indent) << ""; oss << container_closer; } return oss.str(); } extern "C" { SEXP toJSON( SEXP obj, SEXP indent ) { int indent_amount = INTEGER(indent)[0]; std::string buf = toJSON2( obj, 0, indent_amount ); SEXP p; PROTECT(p=allocVector(STRSXP, 1)); SET_STRING_ELT(p, 0, mkCharCE( buf.c_str(), CE_UTF8 )); UNPROTECT( 1 ); return p; } } rjson/NAMESPACE0000644000176200001440000000004713123762200012621 0ustar liggesusersexport(toJSON, newJSONParser, fromJSON)rjson/R/0000755000176200001440000000000013306330707011610 5ustar liggesusersrjson/R/json.R0000644000176200001440000002501413306327646012716 0ustar liggesuserstoJSON <- function( x, indent = 0, method = "C" ) { if( method == "C" ) { return( .Call("toJSON", x, as.integer(indent), PACKAGE="rjson")[[ 1 ]] ) } else if( method != "R" ) { stop("bad method - only R or C" ) } #convert factors to characters if( is.factor( x ) == TRUE ) { tmp_names <- names( x ) x = as.character( x ) names( x ) <- tmp_names } if( !is.vector(x) && !is.null(x) && !is.list(x) ) { x <- as.list( x ) warning("JSON only supports vectors and lists - But I'll try anyways") } if( is.null(x) ) return( "null" ) #treat named vectors as lists if( is.null( names( x ) ) == FALSE ) { x <- as.list( x ) } #named lists only if( is.list(x) && !is.null(names(x)) ) { if( any(duplicated(names(x))) ) stop( "A JSON list must have unique names" ); str = "{" first_elem = TRUE for( n in names(x) ) { if( first_elem ) first_elem = FALSE else str = paste(str, ',', sep="") str = paste(str, deparse(n), ":", toJSON(x[[n]], "R"), sep="") } str = paste( str, "}", sep="" ) return( str ) } #treat lists without names as JSON array if( length(x) != 1 || is.list(x) ) { if( !is.null(names(x)) ) return( toJSON(as.list(x), "R") ) #vector with names - treat as JSON list str = "[" first_elem = TRUE for( val in x ) { if( first_elem ) first_elem = FALSE else str = paste(str, ',', sep="") str = paste(str, toJSON(val, "R"), sep="") } str = paste( str, "]", sep="" ) return( str ) } if( is.nan(x) ) return( "\"NaN\"" ) if( is.na(x) ) return( "\"NA\"" ) if( is.infinite(x) ) return( ifelse( x == Inf, "\"Inf\"", "\"-Inf\"" ) ) if( is.logical(x) ) return( ifelse(x, "true", "false") ) if( is.character(x) ) return( gsub("\\/", "\\\\/", deparse(x)) ) if( is.numeric(x) ) return( as.character(x) ) stop( "shouldnt make it here - unhandled type not caught" ) } #create an object, which can be used to parse JSON data spanning multiple buffers #it will be able to pull out multiple objects.. e.g: "[5][2,1]" is two different JSON objects - it can be called twice to get both items newJSONParser <- function( method = "R" ) { if( method == "R" ) { buffer <- c() return( list( "addData" = function( buf ) { chars = strsplit(buf, "")[[1]] for( ch in chars ) buffer[ length(buffer) + 1 ] <<- ch }, "getObject" = function() { tmp <- .parseValue( buffer, 1) if( is.null( tmp$incomplete ) == FALSE ) return( NULL ) if( tmp$size > length(buffer) ) buffer <<- c() else buffer <<- buffer[ tmp$size : length(buffer) ] return( tmp$val ) } ) ) } else if( method == "C" ) { buffer <- "" return( list( "addData" = function( buf ) { buffer <<- paste( buffer, buf, sep="" ) }, "getObject" = function() { tmp <- .Call("fromJSON", buffer, PACKAGE="rjson") if( any( class( tmp[[ 1 ]] ) == "incomplete" ) ) return( NULL ) size <- tmp[[ 2 ]] + 1 buffer <<- substring( buffer, size, nchar( buffer ) ) return( tmp[[ 1 ]] ) } ) ) } stop("bad method - only R or C" ) } fromJSON <- function( json_str, file, method = "C", unexpected.escape = "error", simplify = TRUE ) { if( missing( json_str ) ) { if( missing( file ) ) stop( "either json_str or file must be supplied to fromJSON") json_str <- paste(readLines( file, warn=FALSE ),collapse="") } else { if( missing( file ) == FALSE ) { stop( "only one of json_str or file must be supplied to fromJSON") } } if( method == "R" ) return( .fromJSON_R( json_str ) ) if( method != "C" ) stop( "only R or C method allowed" ) x <- .Call("fromJSON", json_str, unexpected.escape, simplify, PACKAGE="rjson")[[ 1 ]] if( any( class(x) == "try-error" ) ) stop( x ) return( x ) } .fromJSON_R <- function( json_str ) { if( !is.character(json_str) ) stop( "JSON objects must be a character string" ) chars = strsplit(json_str, "")[[1]] tmp <- .parseValue( chars, 1) if( is.null( tmp$incomplete ) ) return( tmp$val ) else return( NULL ) } .parseValue <- function( chars, i ) { if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } ch = chars[i] if( ch == "{" ) { return( .parseObj( chars, i ) ) } if( ch == "[" ) { return( .parseArray( chars, i ) ) } if( ch == "\"" ) { return( .parseString( chars, i ) ) } if( any(grep("[0-9\\-]", ch)) ) { return( .parseNumber( chars, i ) ) } if( ch == "t" ) { return( .parseTrue( chars, i ) ) } if( ch == "f" ) { return( .parseFalse( chars, i ) ) } if( ch == "n" ) { return( .parseNull( chars, i ) ) } #stop("shouldnt reach end of parseValue") err <- paste( "unexpected data:", paste( chars[ i:length(chars)], collapse = "" ) ) stop( err ) } .parseObj <- function( chars, i ) { obj <- list() if( chars[i] != "{" ) stop("error - no openning tag") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) first_pass <- TRUE while( TRUE ) { #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } #look out for empty lists if( chars[i] == "}" && first_pass == TRUE ) { i = i + 1 break } first_pass <- FALSE #get key str = .parseString( chars, i ) if( is.null( str$incomplete ) == FALSE ) return( str ) key = str$val i = str$size if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } #verify seperater if( chars[i] != ":" ) stop("error - no seperator") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } #get value val = .parseValue( chars, i ) if( is.null( val$incomplete ) == FALSE ) return( val ) obj[key] <- list(val$val) i = val$size if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } if( chars[i] == "}" ) { i = i + 1 break } if( chars[i] != "," ) stop("error - no closing tag") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } return( list(val=obj, size=i) ) } .parseArray <- function( chars, i ) { useVect <- TRUE arr <- list() if( chars[i] != "[" ) stop("error - no openning tag") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( TRUE ) { #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } #look out for empty arrays if( chars[i] == "]" ) { i = i + 1 useVect <- FALSE #force an empty list instead of NULL (i.e. value = vector("list",0)) break } #get value val = .parseValue( chars, i ) if( is.null( val$incomplete ) == FALSE ) return( val ) arr[length(arr)+1] <- list(val$val) if( is.list(val$val) || length(val$val) > 1 || is.null(val$val) ) useVect <- FALSE i = val$size if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) #ignore whitespace while( chars[i] == " " || chars[i] == "\t" || chars[i] == "\n" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } if( chars[i] == "]" ) { i = i + 1 break } if( chars[i] != "," ) stop("error - no closing tag") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } if( useVect ) arr <- unlist(arr) return( list(val=arr, size=i) ) } .parseString <- function( chars, i ) { str_start = i if( chars[i] != "\"") stop("error") i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( TRUE ) { while( chars[i] != "\\" && chars[i] != "\"" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } if( chars[i] == "\\" ) { i = i + 2 #skip the next char if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } else break } str_end = i i = i + 1 return(list( val=eval(parse( text=paste(chars[str_start:str_end], collapse="") )), size=i )) } .parseNumber <- function( chars, i ) { str_start = i if( chars[i] == "-" ) i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) if( chars[i] == "0" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) if( any(grep("[1-9]", chars[i])) ) stop("JSON specs don't allow a number like \"012\"") } else if( any(grep("[1-9]", chars[i])) ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( any(grep("[0-9]", chars[i])) ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } } else { stop( "doesn't look like a valid JSON number" ) } if( chars[i] == "." ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( any(grep("[0-9]", chars[i])) ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } } if( chars[i] == "e" || chars[i] == "E" ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) if( chars[i] == "-" || chars[i] == "+" ) i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) while( any(grep("[0-9]", chars[i])) ) { i = i + 1 if( i > length( chars ) ) return( list( "incomplete" = TRUE ) ) } } str_end = i-1 return(list( val=eval(parse( text=paste(chars[str_start:str_end], collapse="") )), size=i )) } .parseTrue <- function( chars, i ) { if( paste(chars[i:(i+3)], collapse="") == "true" ) return( list(val=TRUE,size=i+4) ) stop("error parsing true value (maybe the word starts with t but isnt true)") } .parseFalse <- function( chars, i ) { if( paste(chars[i:(i+4)], collapse="") == "false" ) return( list(val=FALSE,size=i+5) ) stop("error parsing false value (maybe the word starts with f but isnt false)") } .parseNull <- function( chars, i ) { if( paste(chars[i:(i+3)], collapse="") == "null" ) return( list(val=NULL,size=i+4) ) stop("error parsing null value (maybe the word starts with n but isnt null)") } rjson/R/zzz.R0000644000176200001440000000010313123762200012554 0ustar liggesusers.onLoad <- function(lib, pkg) { library.dynam("rjson", pkg, lib) }rjson/vignettes/0000755000176200001440000000000013306330736013421 5ustar liggesusersrjson/vignettes/json_rpc_server.Rnw0000644000176200001440000000262713273117664017331 0ustar liggesusers\documentclass[letter]{article} %\VignetteIndexEntry{JSON RPC server for R} %\VignettePackage{rjson} \begin{document} \title{JSON RPC server for R} \author{Alex Couture-Beil} \maketitle \section{Introduction} Remote proceedure calls (RPC) provide inter-process communication which allow programs to call other program's subroutines. JSON-RPC is a RPC protocol built on top of JSON. JSON-RPC provides a nice way to interface different languages. Sample code for creating an JSON-RPC server for R is supplied with the rjson library. For this example, a client wishing to execute R code will first execute a new instance of R, and will communicate over standard IO (stdin/stdout). After the client executes any number of calls, it will terminate the R session with an end of file (ctrl-D). \section{Sample Code} Sample code can be found in the {\it ..../library/rjson/rpc\_server} directory. The server is started with {\it ./start\_server} (unix), or with {\it start\_server.bat} (windows). An optional paramater specifies a user supplied source file to be loaded by the server, thus allowing the client to execute some user supplied functions. Note that this code posses serious security risks if the client accecpts input from anyone. (i.e. the client redirects IO from some tcp port to the R json-rpc interface). If this is the case, you'll likely want to avoid allowing anyone to pass anything to eval. \end{document} rjson/MD50000644000176200001440000000331213306535564011726 0ustar liggesusersffff663ec536ef7db8e2dbb2c1b891ab *DESCRIPTION 34551522533d48d0a968454bea1b4d30 *NAMESPACE c335f0dddbd0b0204bd5cfa9355f00c0 *R/json.R 0489b313250de174ca1d68cbf67f9000 *R/zzz.R ddee8e54f131ce90f35676b8f24300ae *build/vignette.rds 3d5b4e4226d0991bf95efa1bce1f1ab1 *inst/changelog.txt 475d7413bdebc23bc88ca5e2176721d5 *inst/doc/json_rpc_server.Rnw 0bf598dbccd48f62313b42f8d7ca839f *inst/doc/json_rpc_server.pdf cee224c8dc417dece605178406f9b2d5 *inst/rpc_server/server.r ce0131b40a9fe6dbd17ac5e623c438e9 *inst/rpc_server/some_script.r e29f8f1f26f017f214682f36e42db7e6 *inst/rpc_server/start_server 73af6807a8fbffa9294a857fbe1e9142 *inst/rpc_server/start_server.bat d6a2d5044743f5f4235bdd72e4d87cd7 *inst/unittests/runtests.r 53d51f59838c16022f293e07e700d08b *inst/unittests/test.array.r c1a9ccb854491a312e8afde84e3e8cf4 *inst/unittests/test.big.r d9da76109062c8e9b65807c53053e784 *inst/unittests/test.factors.r 32416767cfe1768135f47529976f691d *inst/unittests/test.list.r 9bbd49e1b8d8d9a446a7b5caaae8e751 *inst/unittests/test.number.r 3ba186f308594cf58f9257b54d0d36d8 *inst/unittests/test.strings.r f5bc8385d4462948bd04504b5be58ac1 *inst/unittests/test.tojson.r c5f5cfe0694454ace3e4dc27bf36441e *inst/unittests/test.twitter.r c476a5783dbc6ac2f2d23429255b15f8 *inst/unittests/test.unicode.r 0ba9ffb968a00204c06ebbc4d59b2bca *man/fromJSON.Rd b84795a61a8fa36f040a15e5e164e64c *man/newJSONParser.Rd 3125920a7f681fd8670e16a21ccead94 *man/rjson.Rd ff2f8e8ab06f34554d18135ce45d172b *man/toJSON.Rd 03d61bc0461d4ac25fdce77313ac8c4b *src/dump.cpp 153eaf540a186337afb167fae3aab570 *src/funcs.h f81bfd4c645d6f520c8535813fdab806 *src/parser.c a7be366e1ce0ef75d876f96e955024c2 *src/register.c 475d7413bdebc23bc88ca5e2176721d5 *vignettes/json_rpc_server.Rnw rjson/build/0000755000176200001440000000000013306330736012510 5ustar liggesusersrjson/build/vignette.rds0000644000176200001440000000032413306330736015046 0ustar liggesusers‹‹àb```b`faa`b2™… 1# 'Î*ÎÏ‹/*HŽ/N-*K-Ò Ê+GS"êìï§à¬Q¢–_¤DÈœ‚”44% ׃ùq `aB’gÍKÌM-FÓÄî’Zš—þ‡]?ã4-Þ©•åùE0=(jØ jXÜ2sRaö†d–À9Ì.nP&cº0ÌGq?gQ~¹Ì¼ ß6‰ÿ@€îÑäœÄbtr¥$–$ê¥õƒÜ )·2\½rjson/DESCRIPTION0000644000176200001440000000060113306535564013122 0ustar liggesusersPackage: rjson Version: 0.2.20 Date: 2018-05-18 Title: JSON for R Author: Alex Couture-Beil Maintainer: Alex Couture-Beil Depends: R (>= 3.1.0) Description: Converts R object into JSON objects and vice-versa. License: GPL-2 Repository: CRAN Date/Publication: 2018-06-08 17:23:00 UTC Packaged: 2018-06-07 22:29:50 UTC; root NeedsCompilation: yes rjson/man/0000755000176200001440000000000013306330707012162 5ustar liggesusersrjson/man/rjson.Rd0000644000176200001440000000054513123762200013602 0ustar liggesusers\name{rjson} \docType{package} \alias{rjson} \alias{rjson-package} \title{JSON for R} \description{ JSON (JavaScript Object Notation) is a lightweight data-interchange format. This package converts JSON objects into R objects and vice-versa. See json.org for an overview of JSON. Unicode is unfortunately not supported at the moment. } \keyword{package} rjson/man/toJSON.Rd0000644000176200001440000000231313306330313013555 0ustar liggesusers\name{toJSON} \alias{toJSON} \title{Convert R To JSON} \description{ Convert an R object into a corresponding JSON object. ***Lists with unnamed components are not currently supported*** } \usage{toJSON( x, indent=0, method="C" )} \arguments{ \item{x}{a vector or list to convert into a JSON object} \item{indent}{an integer specifying how much indentation to use when formatting the JSON object; if 0, no pretty-formatting is used} \item{method}{use the \code{C} implementation, or the older slower (and one day to be depricated) \code{R} implementation} } \value{a string containing the JSON object} \seealso{ \code{\link{fromJSON}} } \examples{ x <- list( alpha = 1:5, beta = "Bravo", gamma = list(a=1:3, b=NULL), delta = c(TRUE, FALSE) ) json <- toJSON( x ) fromJSON( json ) #named vectors are treated as JSON objects (lists) toJSON(islands[1:4]) #data.frames must be converted into a list before converting into JSON plot(cars, pch=2) json_cars <- toJSON(as.list(cars)) points( data.frame( fromJSON( json_cars ) ), col="red", pch=3 ) #special R types are encoded as strings testString <- c(1,2,3,4,NA,NaN,Inf,8,9); toJSON(testString); } %TODO find better keyword \keyword{interface} rjson/man/fromJSON.Rd0000644000176200001440000000272413123775422014117 0ustar liggesusers\name{fromJSON} \alias{fromJSON} \title{Convert JSON To R} \description{ Convert a JSON object into an R object. } \usage{fromJSON( json_str, file, method = "C", unexpected.escape = "error", simplify = TRUE )} \arguments{ \item{json_str}{a JSON object to convert} \item{file}{the name of a file to read the json_str from; this can also be a URL. Only one of json_str or file must be supplied.} \item{method}{use the \code{C} implementation, or the older slower (and one day to be depricated) \code{R} implementation} \item{unexpected.escape}{changed handling of unexpected escaped characters. Handling value should be one of "error", "skip", or "keep"; on unexpected characters issue an \code{error}, \code{skip} the character, or \code{keep} the character} \item{simplify}{If TRUE, attempt to convert json-encoded lists into vectors where appropriate. If FALSE, all json-encoded lists will be wrapped in a list even if they are all of the same data type. } } \value{R object that corresponds to the JSON object} \seealso{ \code{\link{toJSON}} } \examples{ fromJSON('[1,2,3]', simplify=TRUE) # returns c(1,2,3) fromJSON('[1,2,3]', simplify=FALSE) # returns list(1,2,3) #As a result, this will output "1" toJSON(fromJSON('[1]', simplify=TRUE)) #Compared with this which will output "[1]" as expected toJSON(fromJSON('[1]', simplify=TRUE)) #R vs C execution time x <- toJSON( iris ) system.time( y <- fromJSON(x) ) system.time( y2 <- fromJSON(x,method = "R") ) } \keyword{interface} rjson/man/newJSONParser.Rd0000644000176200001440000000245113123762200015105 0ustar liggesusers\name{newJSONParser} \alias{newJSONParser} \title{Convert buffered JSON objects To R } \description{ Convert a collection of JSON objects into R objects. } \usage{newJSONParser(method = "R")} \arguments{ \item{method}{use the \code{C} implementation, or the slower original \code{R} implementation} } \value{A list of functions used for parsing objects} \seealso{ \code{\link{toJSON}} } \examples{ sample_json <- ' { "breakfast" : [ "milk", "fruit loops", "juice" ], "lunch" : [ "left over sushi" ] } ' parser <- newJSONParser() parser$addData( sample_json ) food <- parser$getObject() print( food ) #This is equivalent to using FromJSON( sample_json ) #However, sample_json can be split into several parts: ### EXAMPLE 2: part_1 <- '{ "breakfast" : [ "milk", "fruit loops", "juice" ], ' part_2 <- '"lunch" : [ "left over sushi" ]' # close off the first object, and create a 2nd JSON object, which is simply an # array part_3 <- '} [1,2,3,4,5]' parser <- newJSONParser() parser$addData( part_1 ) parser$getObject() #returns NULL - since part_1 isn't complete parser$addData( part_2 ) parser$getObject() #returns NULL - since part_2 still isn't complete parser$addData( part_3 ) parser$getObject() #returns the first food object parser$getObject() #returns the second array } \keyword{interface}