snakecase/0000755000176200001440000000000013472343233012213 5ustar liggesuserssnakecase/inst/0000755000176200001440000000000013472330271013166 5ustar liggesuserssnakecase/inst/doc/0000755000176200001440000000000013472330271013733 5ustar liggesuserssnakecase/inst/doc/introducing-the-snakecase-package.R0000644000176200001440000000220413472330271022503 0ustar liggesusers## ----setup, include=FALSE------------------------------------------------ knitr::opts_chunk$set(echo = TRUE, comment = "#>", collapse = TRUE ) ## ------------------------------------------------------------------------ string <- c("lowerCamelCase", "ALL_CAPS", "IDontKNOWWhat_thisCASE_is") ## ------------------------------------------------------------------------ library(snakecase) to_snake_case(string) ## ------------------------------------------------------------------------ to_mixed_case(string, sep_out = " ") ## ------------------------------------------------------------------------ to_snake_case(string, sep_out = ".") to_snake_case(string, sep_out = "-") ## ------------------------------------------------------------------------ to_screaming_snake_case(string, sep_out = "=") ## ------------------------------------------------------------------------ to_upper_camel_case(string) ## ------------------------------------------------------------------------ library(magrittr) to_any_case(c("SomeBAdInput", "someGoodInput")) %>% dput() snakecase/inst/doc/caseconverters.Rmd0000644000176200001440000000305213420607650017426 0ustar liggesusers--- title: "Case converters" author: "Malte Grosser" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Caseconverters} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ## Basic examples Default case is snake case ```{r, collapse = TRUE} library(snakecase) to_any_case("veryComplicatedString") ``` Of course other cases are supported (`case`) and separators can be adjusted (`sep_out`) ```{r, collapse = TRUE} to_any_case(names(iris), sep_in = "\\.", case = "upper_camel", sep_out = " ") ``` And you might want to remove special characters along the way ```{r, collapse = TRUE} to_any_case("Doppelgänger is originally german", transliterations = "german", case = "upper_camel") ``` All of the cases like: snake, lower_camel, upper_camel, all_caps, lower_upper, upper_lower, mixed and sentence are based on parsed case ```{r, collapse = TRUE} to_any_case("THISIsHOW IAmPARSED!", case = "parsed") ``` Shortcut wrappers like `to_snake_case`, `to_lower_camel_case` etc. are available. Be aware that automatic case conversion depends on the input string and it is recommended to verify the results. So you might want to pipe these into `dput()` and hardcode name changes instead of blindly trusting `to_any_case()`'s output: ```{r, collapse = TRUE} dput(to_any_case(c("SomeBAdInput", "someGoodInput"))) ``` If you are interested in the design of this package, you can find more information on its [github page](https://github.com/Tazinho/snakecase).snakecase/inst/doc/introducing-the-snakecase-package.Rmd0000644000176200001440000000660413471335326023041 0ustar liggesusers--- title: "Introducing the snakecase package" author: "Malte Grosser" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Introducing the snakecase package} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, comment = "#>", collapse = TRUE ) ``` There are many style guides out there which recommend specific naming conventions for programming languages. At 2017’s useR conference Rasmus Bååth showed quite impressively the variety of cases which even exist within base R in his talk ["The current state of naming conventions in R"](https://www.youtube.com/watch?v=Pv5dfsHBBKE). However, consistent style is not only about naming new objects. ## Import When you do a data analysis, most of the data already exists and you import it from disk, an API or a database. Here is the first moment in your data analysis when you have to decide if you want to rename your data or leave it as it is. Let’s say you have some data named in any of the following conventions ```{r} string <- c("lowerCamelCase", "ALL_CAPS", "IDontKNOWWhat_thisCASE_is") ``` You can now easily convert this string for example to snake case via ```{r} library(snakecase) to_snake_case(string) ``` ## Graphics Whenever you want to construct a graphic and you don’t like your conventions to come up in it, you can easily convert strings to a more humanly readable output like ```{r} to_mixed_case(string, sep_out = " ") ``` You might have noticed the `sep_out` argument. This allows you to combine any case with any output separator to create other well known cases like ```{r} to_snake_case(string, sep_out = ".") to_snake_case(string, sep_out = "-") ``` or completely new ones like ```{r} to_screaming_snake_case(string, sep_out = "=") ``` ## Export Finally, when you are done with your analysis and want to write data back into a .CSV file or your customers database, which has a camel case convention, you can just use ```{r} to_upper_camel_case(string) ``` ## Further information The snakecase package goes quite deep into the little quirks which arise in automatic case conversion. However, it is well tweaked, to handle almost every edge case in an intuitive and elegant manner. To get a complete overview of its functionality like other cases, handling of abbreviations, special input characters, different parsing options, transliterations and more, I recommend you to have a look into the quite extensive [readme on its github repository](https://github.com/Tazinho/snakecase). As the package is relatively small and basically consists of its workhorse function `to_any_case()`, I can also react quite fast on new [issues](https://github.com/Tazinho/snakecase/issues). And of course I [tweet](https://twitter.com/malte_grosser) occasionally about new functionality. To round this up let me give you one advice about best practices: be aware that automatic case conversion depends on the input string and it is recommended to verify the results. Hence you might want to pipe them into `dput()` and hard-code name changes instead of blindly trusting the output ```{r} library(magrittr) to_any_case(c("SomeBAdInput", "someGoodInput")) %>% dput() ``` Happy snakecasing everyone ;)snakecase/inst/doc/caseconverters.R0000644000176200001440000000136513472330270017110 0ustar liggesusers## ---- collapse = TRUE---------------------------------------------------- library(snakecase) to_any_case("veryComplicatedString") ## ---- collapse = TRUE---------------------------------------------------- to_any_case(names(iris), sep_in = "\\.", case = "upper_camel", sep_out = " ") ## ---- collapse = TRUE---------------------------------------------------- to_any_case("Doppelgänger is originally german", transliterations = "german", case = "upper_camel") ## ---- collapse = TRUE---------------------------------------------------- to_any_case("THISIsHOW IAmPARSED!", case = "parsed") ## ---- collapse = TRUE---------------------------------------------------- dput(to_any_case(c("SomeBAdInput", "someGoodInput"))) snakecase/inst/doc/caseconverters.html0000644000176200001440000002723213472330270017654 0ustar liggesusers Case converters

Case converters

Malte Grosser

2019-05-25

Basic examples

Default case is snake case

library(snakecase)
to_any_case("veryComplicatedString")
## [1] "very_complicated_string"

Of course other cases are supported (case) and separators can be adjusted (sep_out)

to_any_case(names(iris), sep_in = "\\.", case = "upper_camel", sep_out = " ")
## [1] "Sepal Length" "Sepal Width"  "Petal Length" "Petal Width" 
## [5] "Species"

And you might want to remove special characters along the way

to_any_case("Doppelgänger is originally german", 
            transliterations = "german", case = "upper_camel")
## [1] "DoppelgaengerIsOriginallyGerman"

All of the cases like: snake, lower_camel, upper_camel, all_caps, lower_upper, upper_lower, mixed and sentence are based on parsed case

to_any_case("THISIsHOW IAmPARSED!", case = "parsed")
## [1] "THIS_Is_HOW_I_Am_PARSED"

Shortcut wrappers like to_snake_case, to_lower_camel_case etc. are available.

Be aware that automatic case conversion depends on the input string and it is recommended to verify the results. So you might want to pipe these into dput() and hardcode name changes instead of blindly trusting to_any_case()’s output:

dput(to_any_case(c("SomeBAdInput", "someGoodInput")))
## c("some_b_ad_input", "some_good_input")

If you are interested in the design of this package, you can find more information on its github page.

snakecase/inst/doc/introducing-the-snakecase-package.html0000644000176200001440000003574313472330271023264 0ustar liggesusers Introducing the snakecase package

Introducing the snakecase package

Malte Grosser

2019-05-25

There are many style guides out there which recommend specific naming conventions for programming languages. At 2017’s useR conference Rasmus Bååth showed quite impressively the variety of cases which even exist within base R in his talk “The current state of naming conventions in R”.

However, consistent style is not only about naming new objects.

Import

When you do a data analysis, most of the data already exists and you import it from disk, an API or a database. Here is the first moment in your data analysis when you have to decide if you want to rename your data or leave it as it is.

Let’s say you have some data named in any of the following conventions

string <- c("lowerCamelCase", "ALL_CAPS", "IDontKNOWWhat_thisCASE_is")

You can now easily convert this string for example to snake case via

library(snakecase)
to_snake_case(string)
#> [1] "lower_camel_case"              "all_caps"                     
#> [3] "i_dont_know_what_this_case_is"

Graphics

Whenever you want to construct a graphic and you don’t like your conventions to come up in it, you can easily convert strings to a more humanly readable output like

to_mixed_case(string, sep_out = " ")
#> [1] "lower Camel Case"              "All Caps"                     
#> [3] "I Dont Know What this Case is"

You might have noticed the sep_out argument. This allows you to combine any case with any output separator to create other well known cases like

to_snake_case(string, sep_out = ".")
#> [1] "lower.camel.case"              "all.caps"                     
#> [3] "i.dont.know.what.this.case.is"
to_snake_case(string, sep_out = "-")
#> [1] "lower-camel-case"              "all-caps"                     
#> [3] "i-dont-know-what-this-case-is"

or completely new ones like

to_screaming_snake_case(string, sep_out = "=")
#> [1] "LOWER=CAMEL=CASE"              "ALL=CAPS"                     
#> [3] "I=DONT=KNOW=WHAT=THIS=CASE=IS"

Export

Finally, when you are done with your analysis and want to write data back into a .CSV file or your customers database, which has a camel case convention, you can just use

to_upper_camel_case(string)
#> [1] "LowerCamelCase"          "AllCaps"                
#> [3] "IDontKnowWhatThisCaseIs"

Further information

The snakecase package goes quite deep into the little quirks which arise in automatic case conversion. However, it is well tweaked, to handle almost every edge case in an intuitive and elegant manner.

To get a complete overview of its functionality like other cases, handling of abbreviations, special input characters, different parsing options, transliterations and more, I recommend you to have a look into the quite extensive readme on its github repository.

As the package is relatively small and basically consists of its workhorse function to_any_case(), I can also react quite fast on new issues.

And of course I tweet occasionally about new functionality.

To round this up let me give you one advice about best practices: be aware that automatic case conversion depends on the input string and it is recommended to verify the results. Hence you might want to pipe them into dput() and hard-code name changes instead of blindly trusting the output

library(magrittr)
to_any_case(c("SomeBAdInput", "someGoodInput")) %>% dput()
#> c("some_b_ad_input", "some_good_input")

Happy snakecasing everyone ;)

snakecase/tests/0000755000176200001440000000000013420607650013354 5ustar liggesuserssnakecase/tests/testthat.R0000644000176200001440000000013113420607650015332 0ustar liggesuserslibrary("testthat") library("tibble") library("snakecase") test_check("snakecase")snakecase/tests/testthat/0000755000176200001440000000000013472343233015215 5ustar liggesuserssnakecase/tests/testthat/test-to_title_case.R0000644000176200001440000000074213467512544021145 0ustar liggesuserscontext("to_title_case") test_that("title case", { expect_equal( to_title_case(c("on_andOn", "AndON", " and on", "and so on", "seems like it works", "also abbreviations ETC"), abbreviations = "ETC"), c("On and on", "And on", "And on", "And so on", "Seems Like it Works", "Also Abbreviations ETC") ) }) test_that("title case and abbreviations", { expect_equal( to_title_case("so sieht es aus", abbreviations = "ES"), "So Sieht ES Aus" ) })snakecase/tests/testthat/test-to_parsed_case_internal.R0000644000176200001440000000147613472126201023166 0ustar liggesuserscontext("to_parsed_case_internal") test_that("condition 6", { expect_error(to_parsed_case_internal("bla", parsing_option = 7), "parsing_option must be between -4 and +4.", fixed = TRUE)} ) test_that("parsing_option -1", { expect_equal(to_parsed_case_internal("look_AfterThe-hyphen andThe.dot", parsing_option = -1, numerals = "asis", abbreviations = NULL, sep_in = NULL), "look_After_The-hyphen and_The.dot")} ) test_that("all", { expect_equal(to_parsed_case_internal(string = "bla", numerals = "asis", parsing_option = 2, sep = "_", abbreviations = NULL), "bla") } ) test_that("split", { expect_equal(to_parsed_case_internal("bla_ lbla", abbreviations = NULL, sep_in =NULL, numerals = "middle") , "bla_ _lbla") } )snakecase/tests/testthat/test-to_lower_camel_case.R0000644000176200001440000000236713472123712022311 0ustar liggesuserscontext("to_lower_camel_case") test_that("examples", { expect_equal(to_lower_camel_case(cases[["examples"]]), cases[["small_camel_case"]])} ) test_that("rules",{ examples <- cases[["examples"]] expect_equal(to_lower_camel_case(to_snake_case(examples)), to_lower_camel_case(examples) ) expect_equal(to_lower_camel_case(to_lower_camel_case(examples)), to_lower_camel_case(examples) ) expect_equal(to_lower_camel_case(to_upper_camel_case(examples)), to_lower_camel_case(examples) ) expect_equal(to_lower_camel_case(to_screaming_snake_case(examples)), to_lower_camel_case(examples) ) expect_equal(to_lower_camel_case(to_parsed_case(examples)), to_lower_camel_case(examples) ) }) test_that("preserve-name-attribute",{ labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal( to_lower_camel_case(labs), structure(c("abcDef", "bbccEe", "teEStIt"), .Names = c("a", "b", "c")) ) }) test_that("abbreviations", { expect_equal(to_lower_camel_case("t2d_status", abbreviations = "t2d"), "t2dStatus") })snakecase/tests/testthat/test-to_screaming_snake_case.R0000644000176200001440000000224213420607650023142 0ustar liggesuserscontext("to_screaming_snake_case") test_that("examples", { expect_equal(to_screaming_snake_case(cases[["examples"]]), cases[["screaming_snake_case"]])} ) test_that("rules",{ examples <- cases[["examples"]] expect_equal(to_screaming_snake_case(to_snake_case(examples)), to_screaming_snake_case(examples) ) expect_equal(to_screaming_snake_case(to_lower_camel_case(examples)), to_screaming_snake_case(examples) ) expect_equal(to_screaming_snake_case(to_upper_camel_case(examples)), to_screaming_snake_case(examples) ) expect_equal(to_screaming_snake_case(to_screaming_snake_case(examples)), to_screaming_snake_case(examples) ) expect_equal(to_screaming_snake_case(to_parsed_case(examples)), to_screaming_snake_case(examples) ) }) test_that("preserve-name-attribute",{ labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal( to_screaming_snake_case(labs), structure(c("ABC_DEF", "BBCC_EE", "TE_E_ST_IT"), .Names = c("a", "b", "c")) ) })snakecase/tests/testthat/test-to_any_case.R0000644000176200001440000016053413472265400020611 0ustar liggesuserscontext("to_any_case") test_that("examples", { examples <- cases[["examples"]] expect_equal(to_any_case(examples, case = "snake"), cases[["snake_case"]]) expect_equal(to_any_case(examples, case = "small_camel"), cases[["small_camel_case"]]) expect_equal(to_any_case(examples, case = "big_camel"), cases[["big_camel_case"]]) expect_equal(to_any_case(examples, case = "screaming_snake"), cases[["screaming_snake_case"]]) expect_equal(to_any_case(examples, case = "parsed"), cases[["parsed_case"]]) expect_equal(to_any_case("R.Studio", case = "big_camel", sep_out = "-"), "R-Studio") expect_equal(to_any_case("HAMBURGcity", case = "parsed", parsing_option = 0), "HAMBURGcity") expect_equal(to_any_case(c("RSSfeedRSSfeed", "USPassport", "USpassport"), abbreviations = c("RSS", "US")), c("rss_feed_rss_feed", "us_passport", "us_passport")) expect_equal(to_any_case("NBAGame", abbreviations = "NBA", case = "parsed"), "NBA_Game") expect_equal(to_any_case("NBAGame", abbreviations = "NBA", case = "mixed"), "NBA_Game") expect_equal(to_any_case("NBAGame", abbreviations = "NBA", case = "snake"), "nba_game") expect_equal(to_any_case("NBAGame", abbreviations = "NBA", case = "screaming_snake"), "NBA_GAME") expect_equal(to_any_case("NBAGame", abbreviations = "NBA", case = "internal_parsing"), "NBA_Game") expect_equal(to_any_case("NBAGame", abbreviations = "NBA", case = "upper_camel"), "NBAGame") expect_equal(to_any_case("nba_game", abbreviations = "NBA", case = "lower_camel"), "nbaGame") expect_equal(to_any_case("NBA_game", abbreviations = "NBA", case = "upper_camel"), "NBAGame") expect_equal(to_any_case("nba_game", abbreviations = "NBA", case = "upper_camel"), "NBAGame") expect_equal(to_any_case("NBA_game_NBA", abbreviations = "NBA", case = "lower_camel"), "nbaGameNBA") expect_equal(to_any_case("NBA_game_NBA", abbreviations = "NBA", case = "lower_upper"), "nbaGAMEnba") expect_equal(to_any_case("NBA_game", abbreviations = "NBA", case = "mixed"), "NBA_game") expect_equal(to_any_case("NBA_game_NBA", abbreviations = "NBA", case = "mixed"), "NBA_game_NBA") expect_equal(to_snake_case(c("NBAGame", "NBAgame"), abbreviations = "NBA"), c("nba_game", "nba_game")) expect_equal(to_upper_camel_case(c("nba_game", "nba_game"), abbreviations = "NBA"), c("NBAGame", "NBAGame")) } ) test_that("numerals_tight", { expect_equal(to_any_case("bla_la_123_123_1_bla", numerals = "tight"), "bla_la123_123_1bla") }) test_that("attributes", { expect_equal( {strings <- c("this Is a Strange_string", "AND THIS ANOTHER_One"); names(strings) <- c("String A", "String B"); attr(strings, "test.attr") <- "test"; strings}, structure(c(`String A` = "this Is a Strange_string", `String B` = "AND THIS ANOTHER_One"), test.attr = "test")) } ) test_that("numerals", { expect_equal(to_any_case("123bla123bla_434bla"), "123_bla_123_bla_434_bla") expect_equal(to_any_case("123bla123bla_434bla", numerals = "asis"), "123bla123bla_434bla") expect_equal(to_any_case("123bla123bla_434bla", numerals = "left"), "123_bla123_bla434_bla") expect_equal(to_any_case("123bla123bla_434bla", numerals = "right"), "123bla_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "middle"), "123_bla_123_123_bla_434_bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "asis"), "123bla123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "left"), "123_bla123_123_bla434_bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "right"), "123bla_123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "right"), "123bla_123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "right"), "123bla_123_123bla_434bla") expect_equal(to_upper_camel_case("123bla123_123bla_434bla"), "123Bla123_123Bla434Bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "upper_camel", numerals = "middle"), "123Bla123_123Bla434Bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "upper_camel", numerals = "asis"), "123Bla123_123Bla434Bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "upper_camel", numerals = "left"), "123Bla123_123Bla434Bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "upper_camel", numerals = "right"), "123Bla123_123Bla434Bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "parsed", numerals = "middle"), "123_bla_123_123_bla_434_bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "parsed", numerals = "asis"), "123bla123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "parsed", numerals = "left"), "123_bla123_123_bla434_bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "parsed", numerals = "right"), "123bla_123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "none", numerals = "middle"), "123bla123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "none", numerals = "asis"), "123bla123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "none", numerals = "left"), "123bla123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", case = "none", numerals = "right"), "123bla123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "middle"), "123_bla_123_123_bla_434_bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "asis"), "123bla123_123bla_434bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "left"), "123_bla123_123_bla434_bla") expect_equal(to_any_case("123bla123_123bla_434bla", numerals = "right"), "123bla_123_123bla_434bla") expect_equal(to_any_case("species42value 23month", numerals = "asis"), "species42value_23month") expect_equal(to_any_case(c("HHcity", "IDtable1", "KEYtable2", "newUSelections"), parsing_option = 2, numerals = "middle"), c("hh_city", "id_table_1", "key_table_2", "new_us_elections")) expect_equal(to_any_case(c("HHcity", "IDtable1", "KEYtable2", "newUSelections"), parsing_option = 2, numerals = "asis"), c("hh_city","id_table1", "key_table2", "new_us_elections")) expect_equal(to_any_case(c("HHcity", "IDtable1", "KEYtable2", "newUSelections"), parsing_option = 2, numerals = "left"), c("hh_city", "id_table1", "key_table2","new_us_elections")) expect_equal(to_any_case(c("HHcity", "IDtable1", "KEYtable2", "newUSelections"), parsing_option = 2, numerals = "right"), c("hh_city", "id_table_1", "key_table_2", "new_us_elections")) }) test_that("preserve-names-attribute", { labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal( to_any_case(labs, case = "snake"), structure(c("abc_def", "bbcc_ee", "te_e_st_it"), .Names = c("a", "b", "c")) ) expect_equal( to_any_case(labs, case = "upper_camel"), structure(c("AbcDef", "BbccEe", "TeEStIt"), .Names = c("a", "b", "c")) ) expect_equal( to_any_case(labs, case = "lower_camel"), structure(c("abcDef", "bbccEe", "teEStIt"), .Names = c("a", "b", "c")) ) expect_equal( to_any_case(labs, case = "parsed"), structure(c("abc_DEF", "bbcc_EE", "Te_E_St_it"), .Names = c("a", "b", "c")) ) expect_equal( to_any_case(labs, case = "mixed"), structure(c("abc_Def", "bbcc_Ee", "Te_E_St_it"), .Names = c("a", "b", "c")) ) expect_equal( to_any_case(labs, case = "none", sep_in = NULL), structure(c("abcDEF", "bbccEE", "TeESt it"), .Names = c("a", "b", "c")) ) expect_equal( to_any_case(labs, case = "all_caps"), structure(c("ABC_DEF", "BBCC_EE", "TE_E_ST_IT"), .Names = c("a", "b", "c")) ) expect_equal( to_any_case(labs, case = "upper_lower"), structure(c("ABCdef", "BBCCee", "TEeSTit"), .Names = c("a", "b", "c")) ) expect_equal( to_any_case(labs, case = "lower_upper"), structure(c("abcDEF", "bbccEE", "teEstIT"), .Names = c("a", "b", "c")) ) }) test_that("uniqe_sep", { expect_equal( to_any_case(c("bla", "bla"), unique_sep = "_"), c("bla", "bla_1") ) expect_equal( to_any_case(c("bla", "bla"), unique_sep = NULL), c("bla", "bla") ) }) test_that("sentence_case", { expect_equal( to_sentence_case("this_is_a_sentence", sep_out = " ", postfix = "."), "This is a sentence.") }) test_that("janitor-pkg-tests",{ skip_if_not( l10n_info()$`UTF-8`) clean_names3 <- function(old_names, case = "snake"){ new_names <- gsub("'", "", old_names) # remove quotation marks new_names <- gsub("\"", "", new_names) # remove quotation marks new_names <- gsub("%", ".percent_", new_names) new_names <- gsub("#", ".number_", new_names) new_names <- gsub("^[[:space:][:punct:]]+", "", new_names) new_names <- make.names(new_names) new_names <- to_any_case(new_names, case = case, sep_in = "\\.", transliterations = c("Latin-ASCII"), parsing_option = 1, numerals = "asis") # Handle duplicated names - they mess up dplyr pipelines # This appends the column number to repeated instances of duplicate variable names dupe_count <- vapply(1:length(new_names), function(i) { sum(new_names[i] == new_names[1:i]) }, integer(1)) new_names[dupe_count > 1] <- paste(new_names[dupe_count > 1], dupe_count[dupe_count > 1], sep = "_") new_names } expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143")), c("sp_ace", "repeated", "a", "percent", "x", "x_2", "d_9", "repeated_2", "cant", "hi_there", "leading_spaces", "x_3", "acao", "faroe", "r_studio_v_1_0_143")) expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143"), case = "parsed"), c("sp_ace", "repeated", "a", "percent", "X", "X_2", "d_9", "REPEATED", "cant", "hi_there", "leading_spaces", "X_3", "acao", "faroe", "r_studio_v_1_0_143")) expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143"), case = "screaming_snake"), c("SP_ACE", "REPEATED", "A", "PERCENT", "X", "X_2", "D_9", "REPEATED_2", "CANT", "HI_THERE", "LEADING_SPACES", "X_3", "ACAO", "FAROE", "R_STUDIO_V_1_0_143") ) expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143"), case = "small_camel"), c("spAce", "repeated", "a", "percent", "x", "x_2", "d9", "repeated_2", "cant", "hiThere", "leadingSpaces", "x_3", "acao", "faroe", "rStudioV1_0_143" ) ) expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143"), case = "big_camel"), c("SpAce", "Repeated", "A", "Percent", "X", "X_2", "D9", "Repeated_2", "Cant", "HiThere", "LeadingSpaces", "X_3", "Acao", "Faroe", "RStudioV1_0_143" ) ) expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143"), case = "lower_upper"), c("spACE", "repeated", "a", "percent", "x", "x_2", "d9", "repeated_2", "cant", "hiTHERE", "leadingSPACES", "x_3", "acao", "faroe", "rSTUDIOv1_0_143" ) ) expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143"), case = "upper_lower"), c("SPace", "REPEATED", "A", "PERCENT", "X", "X_2", "D9", "REPEATED_2", "CANT", "HIthere", "LEADINGspaces", "X_3", "ACAO", "FAROE", "RstudioV1_0_143" ) ) expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143"), case = "mixed"), c("sp_ace", "repeated", "a", "percent", "X", "X_2", "d_9", "Repeated", "cant", "hi_there", "leading_spaces", "X_3", "acao", "faroe", "r_studio_v_1_0_143") ) expect_equal(clean_names3(c("sp ace", "repeated", "a**^@", "%", "*", "!", "d(!)9", "REPEATED", "can\"'t", "hi_`there`", " leading spaces", "\u20AC", "a\u00E7\u00E3o", "far\u0153", "r.st\u00FCdio:v.1.0.143"), case = "none"), c("sp_ace", "repeated", "a", "percent", "X", "X_2", "d_9", "REPEATED", "cant", "hi_there", "leading_spaces", "X_3", "acao", "faroe", "r_studio_v_1_0_143") ) }) # test_that("rules",{ # examples <- cases[["examples"]] # # expect_equal(to_snake_case(to_snake_case(examples)), # to_snake_case(examples) # ) # expect_equal(to_snake_case(to_small_camel_case(examples)), # to_snake_case(examples) # ) # expect_equal(to_snake_case(to_big_camel_case(examples)), # to_snake_case(examples) # ) # expect_equal(to_snake_case(to_screaming_snake_case(examples)), # to_snake_case(examples) # ) # }) test_that("random examples", expect_equal(to_any_case("string123", case = "snake"), "string_123")) # test_that("deprecated", # expect_warning(to_any_case("bla", protect = "_"), # "argument protect is deprecated; If you really need this argument, pls submit an issue on https://github.com/Tazinho/snakecase") # ) test_that("transliterations", { skip_if_not( l10n_info()$`UTF-8`) expect_equal(to_any_case("Älterer Herr", transliterations = c("german", "Herr" = "Mann")), "aelterer_mann") expect_equal( to_any_case("Älterer Herr", transliterations = c( "Herr" = "Mann", "german")), "aelterer_mann") }) test_that("transliterations_error", expect_error(to_any_case("bla", transliterations = "bla"), "Input to `transliterations` must be `NULL`, a string containing elements from the internal lookup dictionaries or from `stringi::stri_trans_list()` or a named vector.", fixed = TRUE)) test_that("empty_fill", expect_equal(to_any_case("", empty_fill = "bla"), "bla")) test_that("sentence", expect_equal(to_any_case("bla bla_bal", case = "sentence"), "Bla bla bal")) test_that("flip and swap", { expect_equal(to_any_case("rSTUDIO", case = "flip"), "Rstudio") expect_equal(to_any_case("rSTUDIO", case = "swap"), "Rstudio") }) test_that("complex strings", { skip_if_not( l10n_info()$`UTF-8`) strings2 <- c("this - Is_-: a Strange_string", "\u00C4ND THIS ANOTHER_One") expect_equal(to_any_case(strings2, case = "snake", sep_in = "-|\\:"), c("this_is_a_strange_string", "\u00E4nd_this_another_one")) expect_equal(to_any_case("MERKWUERDIGER-VariablenNAME mit.VIELENMustern_version: 3.7.4", case = "snake", sep_in = "-|:|(?% dput c(NA, "", "s_na_k_er", "SNAKE_SNAKE_CASE", "snake_Snak_E_Case", "SNAKE_snak_E_case", "ss_R_Rss", "ss_RRRR", "this_Is_Some_Camel_Case", "this.text", "final_count", "Bob_Dylan_USA", "Mikhail_Gorbachev_USSR", "Helpful_Stack_Overflow_People", "Im_A_Tall_Drink_Of_Water", "ICU_Days", "Sex_Code", "MAX_of_MLD", "Age.Group", NA, "", "s_na_k_er", "snake_snake_case", "snake_snak_e_case", "snake_snak_e_case", "ss_r_rss", "ss_rrrr", "this_is_some_camel_case", "this.text", "final_count", "bob_dylan_usa", "mikhail_gorbachev_ussr", "helpful_stack_overflow_people", "im_a_tall_drink_of_water", "icu_days", "sex_code", "max_of_mld", "age.group", NA, "", "sNaKEr", "snakeSnakeCase", "snakeSnakECase", "snakeSnakECase", "ssRRss", "ssRrrr", "thisIsSomeCamelCase", "this.Text", "finalCount", "bobDylanUsa", "mikhailGorbachevUssr", "helpfulStackOverflowPeople", "imATallDrinkOfWater", "icuDays", "sexCode", "maxOfMld", "age.Group", NA, "", "SNaKEr", "SnakeSnakeCase", "SnakeSnakECase", "SnakeSnakECase", "SsRRss", "SsRrrr", "ThisIsSomeCamelCase", "This.Text", "FinalCount", "BobDylanUsa", "MikhailGorbachevUssr", "HelpfulStackOverflowPeople", "ImATallDrinkOfWater", "IcuDays", "SexCode", "MaxOfMld", "Age.Group", NA, "", "S_NA_K_ER", "SNAKE_SNAKE_CASE", "SNAKE_SNAK_E_CASE", "SNAKE_SNAK_E_CASE", "SS_R_RSS", "SS_RRRR", "THIS_IS_SOME_CAMEL_CASE", "THIS.TEXT", "FINAL_COUNT", "BOB_DYLAN_USA", "MIKHAIL_GORBACHEV_USSR", "HELPFUL_STACK_OVERFLOW_PEOPLE", "IM_A_TALL_DRINK_OF_WATER", "ICU_DAYS", "SEX_CODE", "MAX_OF_MLD", "AGE.GROUP", NA, ".end", "s_na_k_er.end", "SNAKE_SNAKE_CASE.end", "snake_Snak_E_Case.end", "SNAKE_snak_E_case.end", "ss_R_Rss.end", "ss_RRRR.end", "this_Is_Some_Camel_Case.end", "this.text.end", "final_count.end", "Bob_Dylan_USA.end", "Mikhail_Gorbachev_USSR.end", "Helpful_Stack_Overflow_People.end", "Im_A_Tall_Drink_Of_Water.end", "ICU_Days.end", "Sex_Code.end", "MAX_of_MLD.end", "Age.Group.end", NA, ".end", "s_na_k_er.end", "snake_snake_case.end", "snake_snak_e_case.end", "snake_snak_e_case.end", "ss_r_rss.end", "ss_rrrr.end", "this_is_some_camel_case.end", "this.text.end", "final_count.end", "bob_dylan_usa.end", "mikhail_gorbachev_ussr.end", "helpful_stack_overflow_people.end", "im_a_tall_drink_of_water.end", "icu_days.end", "sex_code.end", "max_of_mld.end", "age.group.end", NA, ".end", "sNaKEr.end", "snakeSnakeCase.end", "snakeSnakECase.end", "snakeSnakECase.end", "ssRRss.end", "ssRrrr.end", "thisIsSomeCamelCase.end", "this.Text.end", "finalCount.end", "bobDylanUsa.end", "mikhailGorbachevUssr.end", "helpfulStackOverflowPeople.end", "imATallDrinkOfWater.end", "icuDays.end", "sexCode.end", "maxOfMld.end", "age.Group.end", NA, ".end", "SNaKEr.end", "SnakeSnakeCase.end", "SnakeSnakECase.end", "SnakeSnakECase.end", "SsRRss.end", "SsRrrr.end", "ThisIsSomeCamelCase.end", "This.Text.end", "FinalCount.end", "BobDylanUsa.end", "MikhailGorbachevUssr.end", "HelpfulStackOverflowPeople.end", "ImATallDrinkOfWater.end", "IcuDays.end", "SexCode.end", "MaxOfMld.end", "Age.Group.end", NA, ".end", "S_NA_K_ER.end", "SNAKE_SNAKE_CASE.end", "SNAKE_SNAK_E_CASE.end", "SNAKE_SNAK_E_CASE.end", "SS_R_RSS.end", "SS_RRRR.end", "THIS_IS_SOME_CAMEL_CASE.end", "THIS.TEXT.end", "FINAL_COUNT.end", "BOB_DYLAN_USA.end", "MIKHAIL_GORBACHEV_USSR.end", "HELPFUL_STACK_OVERFLOW_PEOPLE.end", "IM_A_TALL_DRINK_OF_WATER.end", "ICU_DAYS.end", "SEX_CODE.end", "MAX_OF_MLD.end", "AGE.GROUP.end", NA, "start.", "start.s_na_k_er", "start.SNAKE_SNAKE_CASE", "start.snake_Snak_E_Case", "start.SNAKE_snak_E_case", "start.ss_R_Rss", "start.ss_RRRR", "start.this_Is_Some_Camel_Case", "start.this.text", "start.final_count", "start.Bob_Dylan_USA", "start.Mikhail_Gorbachev_USSR", "start.Helpful_Stack_Overflow_People", "start.Im_A_Tall_Drink_Of_Water", "start.ICU_Days", "start.Sex_Code", "start.MAX_of_MLD", "start.Age.Group", NA, "start.", "start.s_na_k_er", "start.snake_snake_case", "start.snake_snak_e_case", "start.snake_snak_e_case", "start.ss_r_rss", "start.ss_rrrr", "start.this_is_some_camel_case", "start.this.text", "start.final_count", "start.bob_dylan_usa", "start.mikhail_gorbachev_ussr", "start.helpful_stack_overflow_people", "start.im_a_tall_drink_of_water", "start.icu_days", "start.sex_code", "start.max_of_mld", "start.age.group", NA, "start.", "start.sNaKEr", "start.snakeSnakeCase", "start.snakeSnakECase", "start.snakeSnakECase", "start.ssRRss", "start.ssRrrr", "start.thisIsSomeCamelCase", "start.this.Text", "start.finalCount", "start.bobDylanUsa", "start.mikhailGorbachevUssr", "start.helpfulStackOverflowPeople", "start.imATallDrinkOfWater", "start.icuDays", "start.sexCode", "start.maxOfMld", "start.age.Group", NA, "start.", "start.SNaKEr", "start.SnakeSnakeCase", "start.SnakeSnakECase", "start.SnakeSnakECase", "start.SsRRss", "start.SsRrrr", "start.ThisIsSomeCamelCase", "start.This.Text", "start.FinalCount", "start.BobDylanUsa", "start.MikhailGorbachevUssr", "start.HelpfulStackOverflowPeople", "start.ImATallDrinkOfWater", "start.IcuDays", "start.SexCode", "start.MaxOfMld", "start.Age.Group", NA, "start.", "start.S_NA_K_ER", "start.SNAKE_SNAKE_CASE", "start.SNAKE_SNAK_E_CASE", "start.SNAKE_SNAK_E_CASE", "start.SS_R_RSS", "start.SS_RRRR", "start.THIS_IS_SOME_CAMEL_CASE", "start.THIS.TEXT", "start.FINAL_COUNT", "start.BOB_DYLAN_USA", "start.MIKHAIL_GORBACHEV_USSR", "start.HELPFUL_STACK_OVERFLOW_PEOPLE", "start.IM_A_TALL_DRINK_OF_WATER", "start.ICU_DAYS", "start.SEX_CODE", "start.MAX_OF_MLD", "start.AGE.GROUP", NA, "start..end", "start.s_na_k_er.end", "start.SNAKE_SNAKE_CASE.end", "start.snake_Snak_E_Case.end", "start.SNAKE_snak_E_case.end", "start.ss_R_Rss.end", "start.ss_RRRR.end", "start.this_Is_Some_Camel_Case.end", "start.this.text.end", "start.final_count.end", "start.Bob_Dylan_USA.end", "start.Mikhail_Gorbachev_USSR.end", "start.Helpful_Stack_Overflow_People.end", "start.Im_A_Tall_Drink_Of_Water.end", "start.ICU_Days.end", "start.Sex_Code.end", "start.MAX_of_MLD.end", "start.Age.Group.end", NA, "start..end", "start.s_na_k_er.end", "start.snake_snake_case.end", "start.snake_snak_e_case.end", "start.snake_snak_e_case.end", "start.ss_r_rss.end", "start.ss_rrrr.end", "start.this_is_some_camel_case.end", "start.this.text.end", "start.final_count.end", "start.bob_dylan_usa.end", "start.mikhail_gorbachev_ussr.end", "start.helpful_stack_overflow_people.end", "start.im_a_tall_drink_of_water.end", "start.icu_days.end", "start.sex_code.end", "start.max_of_mld.end", "start.age.group.end", NA, "start..end", "start.sNaKEr.end", "start.snakeSnakeCase.end", "start.snakeSnakECase.end", "start.snakeSnakECase.end", "start.ssRRss.end", "start.ssRrrr.end", "start.thisIsSomeCamelCase.end", "start.this.Text.end", "start.finalCount.end", "start.bobDylanUsa.end", "start.mikhailGorbachevUssr.end", "start.helpfulStackOverflowPeople.end", "start.imATallDrinkOfWater.end", "start.icuDays.end", "start.sexCode.end", "start.maxOfMld.end", "start.age.Group.end", NA, "start..end", "start.SNaKEr.end", "start.SnakeSnakeCase.end", "start.SnakeSnakECase.end", "start.SnakeSnakECase.end", "start.SsRRss.end", "start.SsRrrr.end", "start.ThisIsSomeCamelCase.end", "start.This.Text.end", "start.FinalCount.end", "start.BobDylanUsa.end", "start.MikhailGorbachevUssr.end", "start.HelpfulStackOverflowPeople.end", "start.ImATallDrinkOfWater.end", "start.IcuDays.end", "start.SexCode.end", "start.MaxOfMld.end", "start.Age.Group.end", NA, "start..end", "start.S_NA_K_ER.end", "start.SNAKE_SNAKE_CASE.end", "start.SNAKE_SNAK_E_CASE.end", "start.SNAKE_SNAK_E_CASE.end", "start.SS_R_RSS.end", "start.SS_RRRR.end", "start.THIS_IS_SOME_CAMEL_CASE.end", "start.THIS.TEXT.end", "start.FINAL_COUNT.end", "start.BOB_DYLAN_USA.end", "start.MIKHAIL_GORBACHEV_USSR.end", "start.HELPFUL_STACK_OVERFLOW_PEOPLE.end", "start.IM_A_TALL_DRINK_OF_WATER.end", "start.ICU_DAYS.end", "start.SEX_CODE.end", "start.MAX_OF_MLD.end", "start.AGE.GROUP.end", NA, "", "s_na_k_er", "SNAKE_SNAKE_CASE", "snake_Snak_E_Case", "SNAKE_snak_E_case", "ss_R_Rss", "ss_RRRR", "this_Is_Some_Camel_Case", "this.text", "final_count", "Bob_Dylan_USA", "Mikhail_Gorbachev_USSR", "Helpful_Stack_Overflow_People", "Im_A_Tall_Drink_Of_Water", "ICU_Days", "Sex_Code", "MAX_of_MLD", "Age.Group", NA, "", "s_na_k_er", "snake_snake_case", "snake_snak_e_case", "snake_snak_e_case", "ss_r_rss", "ss_rrrr", "this_is_some_camel_case", "this.text", "final_count", "bob_dylan_usa", "mikhail_gorbachev_ussr", "helpful_stack_overflow_people", "im_a_tall_drink_of_water", "icu_days", "sex_code", "max_of_mld", "age.group", NA, "", "sNaKEr", "snakeSnakeCase", "snakeSnakECase", "snakeSnakECase", "ssRRss", "ssRrrr", "thisIsSomeCamelCase", "this.Text", "finalCount", "bobDylanUsa", "mikhailGorbachevUssr", "helpfulStackOverflowPeople", "imATallDrinkOfWater", "icuDays", "sexCode", "maxOfMld", "age.Group", NA, "", "SNaKEr", "SnakeSnakeCase", "SnakeSnakECase", "SnakeSnakECase", "SsRRss", "SsRrrr", "ThisIsSomeCamelCase", "This.Text", "FinalCount", "BobDylanUsa", "MikhailGorbachevUssr", "HelpfulStackOverflowPeople", "ImATallDrinkOfWater", "IcuDays", "SexCode", "MaxOfMld", "Age.Group", NA, "", "S_NA_K_ER", "SNAKE_SNAKE_CASE", "SNAKE_SNAK_E_CASE", "SNAKE_SNAK_E_CASE", "SS_R_RSS", "SS_RRRR", "THIS_IS_SOME_CAMEL_CASE", "THIS.TEXT", "FINAL_COUNT", "BOB_DYLAN_USA", "MIKHAIL_GORBACHEV_USSR", "HELPFUL_STACK_OVERFLOW_PEOPLE", "IM_A_TALL_DRINK_OF_WATER", "ICU_DAYS", "SEX_CODE", "MAX_OF_MLD", "AGE.GROUP", NA, ".end", "s_na_k_er.end", "SNAKE_SNAKE_CASE.end", "snake_Snak_E_Case.end", "SNAKE_snak_E_case.end", "ss_R_Rss.end", "ss_RRRR.end", "this_Is_Some_Camel_Case.end", "this.text.end", "final_count.end", "Bob_Dylan_USA.end", "Mikhail_Gorbachev_USSR.end", "Helpful_Stack_Overflow_People.end", "Im_A_Tall_Drink_Of_Water.end", "ICU_Days.end", "Sex_Code.end", "MAX_of_MLD.end", "Age.Group.end", NA, ".end", "s_na_k_er.end", "snake_snake_case.end", "snake_snak_e_case.end", "snake_snak_e_case.end", "ss_r_rss.end", "ss_rrrr.end", "this_is_some_camel_case.end", "this.text.end", "final_count.end", "bob_dylan_usa.end", "mikhail_gorbachev_ussr.end", "helpful_stack_overflow_people.end", "im_a_tall_drink_of_water.end", "icu_days.end", "sex_code.end", "max_of_mld.end", "age.group.end", NA, ".end", "sNaKEr.end", "snakeSnakeCase.end", "snakeSnakECase.end", "snakeSnakECase.end", "ssRRss.end", "ssRrrr.end", "thisIsSomeCamelCase.end", "this.Text.end", "finalCount.end", "bobDylanUsa.end", "mikhailGorbachevUssr.end", "helpfulStackOverflowPeople.end", "imATallDrinkOfWater.end", "icuDays.end", "sexCode.end", "maxOfMld.end", "age.Group.end", NA, ".end", "SNaKEr.end", "SnakeSnakeCase.end", "SnakeSnakECase.end", "SnakeSnakECase.end", "SsRRss.end", "SsRrrr.end", "ThisIsSomeCamelCase.end", "This.Text.end", "FinalCount.end", "BobDylanUsa.end", "MikhailGorbachevUssr.end", "HelpfulStackOverflowPeople.end", "ImATallDrinkOfWater.end", "IcuDays.end", "SexCode.end", "MaxOfMld.end", "Age.Group.end", NA, ".end", "S_NA_K_ER.end", "SNAKE_SNAKE_CASE.end", "SNAKE_SNAK_E_CASE.end", "SNAKE_SNAK_E_CASE.end", "SS_R_RSS.end", "SS_RRRR.end", "THIS_IS_SOME_CAMEL_CASE.end", "THIS.TEXT.end", "FINAL_COUNT.end", "BOB_DYLAN_USA.end", "MIKHAIL_GORBACHEV_USSR.end", "HELPFUL_STACK_OVERFLOW_PEOPLE.end", "IM_A_TALL_DRINK_OF_WATER.end", "ICU_DAYS.end", "SEX_CODE.end", "MAX_OF_MLD.end", "AGE.GROUP.end", NA, "start.", "start.s_na_k_er", "start.SNAKE_SNAKE_CASE", "start.snake_Snak_E_Case", "start.SNAKE_snak_E_case", "start.ss_R_Rss", "start.ss_RRRR", "start.this_Is_Some_Camel_Case", "start.this.text", "start.final_count", "start.Bob_Dylan_USA", "start.Mikhail_Gorbachev_USSR", "start.Helpful_Stack_Overflow_People", "start.Im_A_Tall_Drink_Of_Water", "start.ICU_Days", "start.Sex_Code", "start.MAX_of_MLD", "start.Age.Group", NA, "start.", "start.s_na_k_er", "start.snake_snake_case", "start.snake_snak_e_case", "start.snake_snak_e_case", "start.ss_r_rss", "start.ss_rrrr", "start.this_is_some_camel_case", "start.this.text", "start.final_count", "start.bob_dylan_usa", "start.mikhail_gorbachev_ussr", "start.helpful_stack_overflow_people", "start.im_a_tall_drink_of_water", "start.icu_days", "start.sex_code", "start.max_of_mld", "start.age.group", NA, "start.", "start.sNaKEr", "start.snakeSnakeCase", "start.snakeSnakECase", "start.snakeSnakECase", "start.ssRRss", "start.ssRrrr", "start.thisIsSomeCamelCase", "start.this.Text", "start.finalCount", "start.bobDylanUsa", "start.mikhailGorbachevUssr", "start.helpfulStackOverflowPeople", "start.imATallDrinkOfWater", "start.icuDays", "start.sexCode", "start.maxOfMld", "start.age.Group", NA, "start.", "start.SNaKEr", "start.SnakeSnakeCase", "start.SnakeSnakECase", "start.SnakeSnakECase", "start.SsRRss", "start.SsRrrr", "start.ThisIsSomeCamelCase", "start.This.Text", "start.FinalCount", "start.BobDylanUsa", "start.MikhailGorbachevUssr", "start.HelpfulStackOverflowPeople", "start.ImATallDrinkOfWater", "start.IcuDays", "start.SexCode", "start.MaxOfMld", "start.Age.Group", NA, "start.", "start.S_NA_K_ER", "start.SNAKE_SNAKE_CASE", "start.SNAKE_SNAK_E_CASE", "start.SNAKE_SNAK_E_CASE", "start.SS_R_RSS", "start.SS_RRRR", "start.THIS_IS_SOME_CAMEL_CASE", "start.THIS.TEXT", "start.FINAL_COUNT", "start.BOB_DYLAN_USA", "start.MIKHAIL_GORBACHEV_USSR", "start.HELPFUL_STACK_OVERFLOW_PEOPLE", "start.IM_A_TALL_DRINK_OF_WATER", "start.ICU_DAYS", "start.SEX_CODE", "start.MAX_OF_MLD", "start.AGE.GROUP", NA, "start..end", "start.s_na_k_er.end", "start.SNAKE_SNAKE_CASE.end", "start.snake_Snak_E_Case.end", "start.SNAKE_snak_E_case.end", "start.ss_R_Rss.end", "start.ss_RRRR.end", "start.this_Is_Some_Camel_Case.end", "start.this.text.end", "start.final_count.end", "start.Bob_Dylan_USA.end", "start.Mikhail_Gorbachev_USSR.end", "start.Helpful_Stack_Overflow_People.end", "start.Im_A_Tall_Drink_Of_Water.end", "start.ICU_Days.end", "start.Sex_Code.end", "start.MAX_of_MLD.end", "start.Age.Group.end", NA, "start..end", "start.s_na_k_er.end", "start.snake_snake_case.end", "start.snake_snak_e_case.end", "start.snake_snak_e_case.end", "start.ss_r_rss.end", "start.ss_rrrr.end", "start.this_is_some_camel_case.end", "start.this.text.end", "start.final_count.end", "start.bob_dylan_usa.end", "start.mikhail_gorbachev_ussr.end", "start.helpful_stack_overflow_people.end", "start.im_a_tall_drink_of_water.end", "start.icu_days.end", "start.sex_code.end", "start.max_of_mld.end", "start.age.group.end", NA, "start..end", "start.sNaKEr.end", "start.snakeSnakeCase.end", "start.snakeSnakECase.end", "start.snakeSnakECase.end", "start.ssRRss.end", "start.ssRrrr.end", "start.thisIsSomeCamelCase.end", "start.this.Text.end", "start.finalCount.end", "start.bobDylanUsa.end", "start.mikhailGorbachevUssr.end", "start.helpfulStackOverflowPeople.end", "start.imATallDrinkOfWater.end", "start.icuDays.end", "start.sexCode.end", "start.maxOfMld.end", "start.age.Group.end", NA, "start..end", "start.SNaKEr.end", "start.SnakeSnakeCase.end", "start.SnakeSnakECase.end", "start.SnakeSnakECase.end", "start.SsRRss.end", "start.SsRrrr.end", "start.ThisIsSomeCamelCase.end", "start.This.Text.end", "start.FinalCount.end", "start.BobDylanUsa.end", "start.MikhailGorbachevUssr.end", "start.HelpfulStackOverflowPeople.end", "start.ImATallDrinkOfWater.end", "start.IcuDays.end", "start.SexCode.end", "start.MaxOfMld.end", "start.Age.Group.end", NA, "start..end", "start.S_NA_K_ER.end", "start.SNAKE_SNAKE_CASE.end", "start.SNAKE_SNAK_E_CASE.end", "start.SNAKE_SNAK_E_CASE.end", "start.SS_R_RSS.end", "start.SS_RRRR.end", "start.THIS_IS_SOME_CAMEL_CASE.end", "start.THIS.TEXT.end", "start.FINAL_COUNT.end", "start.BOB_DYLAN_USA.end", "start.MIKHAIL_GORBACHEV_USSR.end", "start.HELPFUL_STACK_OVERFLOW_PEOPLE.end", "start.IM_A_TALL_DRINK_OF_WATER.end", "start.ICU_DAYS.end", "start.SEX_CODE.end", "start.MAX_OF_MLD.end", "start.AGE.GROUP.end")) } ) test_that("sep_out", { paste_along <- function(x, along = "_") { if (length(x) <= 1L) return(x) if (length(along) == 1L) return(paste0(x, collapse = along)) along <- c(along, rep_len(along[length(along)], max(length(x) - length(along), 0L))) paste0(paste0(x[seq_len(length(x) - 1)], along[seq_len(length(x) - 1)], collapse = ""), x[length(x)]) } expect_equal(to_any_case("a", sep_out = "-"), "a") expect_equal(to_any_case(""), "") expect_equal(to_any_case("a"), "a") expect_equal(to_any_case(c("bla_bla_bla"), sep_out = c("-", "_")), "bla-bla_bla") expect_equal(to_any_case(c("2018_01_01_bla_bla_bla"), sep_out = c("-", "_")), "2018-01_01_bla_bla_bla") expect_equal(to_any_case(c("2018_01_01_bla_bla_bla"), sep_out = "-"), "2018-01-01-bla-bla-bla") expect_equal(to_any_case(c("2018_01_01_bla_bla"), sep_out = c("-", "-", "_", "_", "_", "_", "_")), "2018-01-01_bla_bla") expect_equal(to_any_case(character(0), sep_out = c("_", "_")), character(0)) }) test_that("random case", { expect_equal( {suppressWarnings(RNGversion("3.1")); set.seed(123); to_any_case("almost RANDOM", case = "random")}, "AlMosT raNdOm" ) }) test_that("title case", { expect_equal( to_any_case(c("on_andOn", "AndON", " and on", "and so on", "seems like it works", "also abbreviations ETC"), case = "title", abbreviations = "ETC"), c("On and on", "And on", "And on", "And so on", "Seems Like it Works", "Also Abbreviations ETC") ) }) test_that("case none", { expect_equal( to_any_case(c("blabla", "blablub", "blaBlub"),case = "none", transliterations = c(blab = "blub")), c("blubla", "blublub", "blaBlub") ) }) test_that("special_input", { expect_identical(to_any_case(NA_character_), NA_character_) expect_equal(to_any_case(character(0)), character(0)) }) test_that("special_input_2", { skip_if(getRversion() < 3.4) # atomics expect_equal(to_any_case(character()), character()) expect_error(to_any_case(logical()), "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(integer()), "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(double()), "argument is not a character vector", fixed = TRUE) # data structures expect_error(to_any_case(data.frame()), "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(list()) , "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(matrix()) , "argument is not a character vector", fixed = TRUE) # special input or wrong type expect_error(to_any_case(NA) , "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(NA_integer_) , "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(NA_real_) , "argument is not a character vector", fixed = TRUE) expect_equal(to_any_case(NA_character_) , NA_character_) expect_error(to_any_case(TRUE) , "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(1.0) , "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(1L) , "argument is not a character vector", fixed = TRUE) expect_equal(to_any_case(c("a", 1L)) , c("a", "1")) expect_error(to_any_case(NULL) , "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(NaN) , "argument is not a character vector", fixed = TRUE) expect_error(to_any_case(Inf) , "argument is not a character vector", fixed = TRUE) }) test_that("abbreviations", { expect_equal(to_any_case("IDENTICALid3", abbreviations = "iD3"), "identical_id3") }) test_that("parsing_options", { expect_equal(to_any_case("RRRStudioSStudioStudio", case = "parsed", parsing_option = 1), "RRR_Studio_S_Studio_Studio" ) expect_equal(to_any_case("RRRStudioSStudioStudio", case = "parsed", parsing_option = -1), "RRR_Studio_S_Studio_Studio" ) expect_equal(to_any_case("RRRStudioSStudioStudio", case = "parsed", parsing_option = 2), "RRRS_tudio_SS_tudio_Studio" ) expect_equal(to_any_case("RRRStudioSStudioStudio", case = "parsed", parsing_option = -2), "RRRS_tudio_SS_tudio_Studio" ) expect_equal(to_any_case("RRRStudioSStudioStudio", case = "parsed", parsing_option = 3), "RRRStudio_SStudio_Studio" ) expect_equal(to_any_case("RRRStudioSStudioStudio", case = "parsed", parsing_option = -3), "RRRStudio_SStudio_Studio" ) }) test_that("individual abbreviations", { expect_equal( to_any_case("NBAGame", abbreviations = "NBA", case = "mixed"), "NBA_Game" ) expect_equal( to_any_case("NBAGame", abbreviations = "NBa", case = "mixed"), "NBa_Game" ) expect_equal( to_any_case("NBAGame", abbreviations = "baa", case = "mixed"), "Nba_Game" ) expect_equal( to_any_case("GameMVP", abbreviations = "MVP", case = "mixed"), "Game_MVP" ) expect_equal( to_any_case("GameMVP", abbreviations = "MVp", case = "mixed"), "Game_MVp" ) expect_equal( to_any_case("GameMVP", abbreviations = "mvp", case = "mixed"), "Game_mvp" ) expect_equal( to_any_case("GameMVP", abbreviations = "mvp", case = "upper_camel"), "GameMvp" ) expect_equal( to_any_case("GameMVP", abbreviations = "MVP", case = "upper_camel"), "GameMVP" ) expect_equal( to_any_case("GameMVP", abbreviations = "MVp", case = "upper_camel"), "GameMVp" ) expect_equal( to_any_case("GameMVP", abbreviations = "mvp", case = "title"), "Game Mvp" ) expect_equal( to_any_case("GameMVP", abbreviations = "MVP", case = "title"), "Game MVP" ) expect_equal( to_any_case("GameMVP", abbreviations = "MVp", case = "title"), "Game MVp" ) expect_equal( to_any_case("UserID", abbreviations = "id", case = "title"), "User Id" ) expect_equal( to_any_case("UserID", abbreviations = "ID", case = "title"), "User ID" ) expect_equal( to_any_case("UserID", abbreviations = "id", case = "upper_camel"), "UserId" ) expect_equal( to_any_case("UserID", abbreviations = "ID", case = "upper_camel"), "UserID" ) expect_equal( to_any_case("UserID", abbreviations = "id", case = "mixed"), "User_id" ) expect_equal( to_any_case("UserID", abbreviations = "ID", case= "mixed"), "User_ID" ) expect_equal( to_any_case("UserID", abbreviations = "Id", case = "mixed"), "User_Id" ) expect_equal( to_any_case("GameMVP", abbreviations = "mvp", case = "lower_camel"), "gameMvp" ) expect_equal( to_any_case("GameMVP", abbreviations = "MVP", case = "lower_camel"), "gameMVP" ) expect_equal( to_any_case("GameMVP", abbreviations = "MVp", case = "lower_camel"), "gameMVp" ) expect_equal( to_any_case("GameMVP", abbreviations = "GAME", case = "lower_camel"), "gameMvp" ) expect_equal( to_any_case("GameMVP", abbreviations = "game", case = "lower_camel"), "gameMvp" ) expect_equal( to_any_case("GameMVP", abbreviations = "gGame", case = "lower_camel"), "gameMvp" ) expect_equal( to_any_case("GameMVP", abbreviations = "Game", case = "lower_camel"), "gameMvp" ) expect_equal( to_any_case("nba_finals_mvp", abbreviations = c("nba", "MVP"), case = "upper_camel"), "NbaFinalsMVP" ) expect_equal( to_any_case("nba_finals_mvp", abbreviations = c("nba", "MVp"), case = "upper_camel"), "NbaFinalsMVp" ) }) test_that("parsing_option 2", { expect_equal(to_any_case("blaBLA", abbreviations = "BLA", parsing_option = 2), "bla_bla") }) test_that("parsing_option 3", { expect_equal(to_any_case("blaBLA", abbreviations = "BLA", parsing_option = 3), "bla_bla") })snakecase/tests/testthat/test-to_parsed_case.R0000644000176200001440000000220513420607650021266 0ustar liggesuserscontext("to_parsed_case") test_that("examples", { expect_equal(to_parsed_case(cases[["examples"]]), cases[["parsed_case"]])} ) test_that("rules",{ examples <- cases[["examples"]] # note that to parsed case has a little bit different rules than the other converters expect_equal(to_parsed_case(to_parsed_case(examples)), to_parsed_case(examples)) expect_equal(to_parsed_case(to_snake_case(examples)), to_snake_case(examples)) #expect_equal(to_parsed_case(to_small_camel_case(examples)), # to_small_camel_case(examples)) # #expect_equal(to_parsed_case(to_big_camel_case(examples)), # to_big_camel_case(examples)) expect_equal(to_parsed_case(to_screaming_snake_case(examples)), to_screaming_snake_case(examples)) }) test_that("preserve-name-attribute",{ labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal( to_parsed_case(labs), structure(c("abc_DEF", "bbcc_EE", "Te_E_St_it"), .Names = c("a", "b", "c")) ) })snakecase/tests/testthat/test-to_lower_upper_case.R0000644000176200001440000000071313420607650022355 0ustar liggesuserscontext("to_upper_lower_case") test_that("random stuff", { expect_equal(to_lower_upper_case("RStudioRRRStudio"), "rSTUDIOrrrSTUDIO") } ) test_that("preserve-name-attribute",{ labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal( to_lower_upper_case(labs), structure(c("abcDEF", "bbccEE", "teEstIT"), .Names = c("a", "b", "c")) ) })snakecase/tests/testthat/test-to_upper_lower_case.R0000644000176200001440000000112113420607650022347 0ustar liggesuserscontext("to_upper_lower_case") test_that("random stuff", { expect_equal(to_upper_lower_case("RStudioRRRStudio"), "RstudioRRRstudio") expect_equal(to_upper_lower_case(c("R.aStudio", NA, NA, NA, NA)), c("RaSTUDIO", NA, NA, NA, NA)) } ) test_that("preserve-name-attribute",{ labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal( to_any_case(labs, case = "upper_lower"), structure(c("ABCdef", "BBCCee", "TEeSTit"), .Names = c("a", "b", "c")) ) })snakecase/tests/testthat/test-to_random_case.R0000644000176200001440000000024513467441350021276 0ustar liggesuserstest_that("random_case", { expect_equal( {suppressWarnings(RNGversion("3.1")); set.seed(123); to_random_case("almost RANDOM")}, "AlMosT raNdOm" ) })snakecase/tests/testthat/test-to_sentence_case.R0000644000176200001440000000131013420607650021610 0ustar liggesuserscontext("to_sentence_case") test_that("basic_example",{ expect_equal( to_sentence_case("bla bla_bal"), "Bla bla bal") expect_equal(to_sentence_case("the_boy_likes_snake_case", transliterations = c("boy" = "baby", "snake" = "screaming__snake"), sep_out = " "), "The baby likes screaming snake case") expect_equal(to_sentence_case("the_boy_likes_snake_case", transliterations = c("boy" = "baby", "snake" = "screaming__snake")), "The baby likes screaming snake case") })snakecase/tests/testthat/helper-examples.R0000644000176200001440000002365613420607650020446 0ustar liggesusers# cases for examples cases <- tibble::tribble( ~nr, ~ examples ,~parsed_case , ~snake_case , ~small_camel_case , ~big_camel_case , ~screaming_snake_case , #--|-----------------------------,--------------------------------|------------------------------|------------------------------|------------------------------|-----------------------| 1 , NA , NA , NA , NA , NA , NA, 2 , "snake_case" , "snake_case" , "snake_case" , "snakeCase" , "SnakeCase" , "SNAKE_CASE", 3 , "snakeCase" , "snake_Case" , "snake_case" , "snakeCase" , "SnakeCase" , "SNAKE_CASE", 4 , "SnakeCase" , "Snake_Case" , "snake_case" , "snakeCase" , "SnakeCase" , "SNAKE_CASE", 5 , "_" , "" , "" , "" , "" , "", 6 , "snake_Case" , "snake_Case" , "snake_case" , "snakeCase" , "SnakeCase" , "SNAKE_CASE", 7 , "_" , "" , "" , "" , "" , "", 8 , "SNake" , "S_Nake" , "s_nake" , "sNake" , "SNake" , "S_NAKE", 9 , "Snake" , "Snake" , "snake" , "snake" , "Snake" , "SNAKE", 10 , "s_nake" , "s_nake" , "s_nake" , "sNake" , "SNake" , "S_NAKE", 11 , "sn_ake" , "sn_ake" , "sn_ake" , "snAke" , "SnAke" , "SN_AKE", 12 , "_" , "" , "" , "" , "" , "", 13 , "SNaKE" , "S_Na_KE" , "s_na_ke" , "sNaKe" , "SNaKe" , "S_NA_KE", 14 , "SNaKEr" , "S_Na_K_Er" , "s_na_k_er" , "sNaKEr" , "SNaKEr" , "S_NA_K_ER", 15 , "s_na_k_er" , "s_na_k_er" , "s_na_k_er" , "sNaKEr" , "SNaKEr" , "S_NA_K_ER", 16 , "_" , "" , "" , "" , "" , "", 17 , "SNAKE SNAKE CASE" , "SNAKE_SNAKE_CASE" , "snake_snake_case" , "snakeSnakeCase" , "SnakeSnakeCase" , "SNAKE_SNAKE_CASE", 18 , "_" , "" , "" , "" , "" , "", 19 , "snakeSnakECase" , "snake_Snak_E_Case" , "snake_snak_e_case" , "snakeSnakECase" , "SnakeSnakECase" , "SNAKE_SNAK_E_CASE", 20 , "SNAKE snakE_case" , "SNAKE_snak_E_case" , "snake_snak_e_case" , "snakeSnakECase" , "SnakeSnakECase" , "SNAKE_SNAK_E_CASE", 21 , "_" , "" , "" , "" , "" , "", 22 , "ssRRss" , "ss_R_Rss" , "ss_r_rss" , "ssRRss" , "SsRRss" , "SS_R_RSS", 23 , "ssRRRR" , "ss_RRRR" , "ss_rrrr" , "ssRrrr" , "SsRrrr" , "SS_RRRR", 24 , "thisIsSomeCamelCase" , "this_Is_Some_Camel_Case" , "this_is_some_camel_case" , "thisIsSomeCamelCase" , "ThisIsSomeCamelCase" , "THIS_IS_SOME_CAMEL_CASE", 25 , "this.text" , "this_text" , "this_text" , "thisText" , "ThisText" , "THIS_TEXT", 26 , "next.text" , "next_text" , "next_text" , "nextText" , "NextText" , "NEXT_TEXT", 27 , "zip code" , "zip_code" , "zip_code" , "zipCode" , "ZipCode" , "ZIP_CODE", 28 , "state" , "state" , "state" , "state" , "State" , "STATE", 29 , "final count" , "final_count" , "final_count" , "finalCount" , "FinalCount" , "FINAL_COUNT", 30 , "BobDylanUSA" , "Bob_Dylan_USA" , "bob_dylan_usa" , "bobDylanUsa" , "BobDylanUsa" , "BOB_DYLAN_USA", 31 , "MikhailGorbachevUSSR" , "Mikhail_Gorbachev_USSR" , "mikhail_gorbachev_ussr" , "mikhailGorbachevUssr" , "MikhailGorbachevUssr" , "MIKHAIL_GORBACHEV_USSR", 32 , "HelpfulStackOverflowPeople", "Helpful_Stack_Overflow_People", "helpful_stack_overflow_people", "helpfulStackOverflowPeople" , "HelpfulStackOverflowPeople" , "HELPFUL_STACK_OVERFLOW_PEOPLE", 33 , "IAmATallDrinkOfWater" , "I_Am_A_Tall_Drink_Of_Water" , "i_am_a_tall_drink_of_water" , "iAmATallDrinkOfWater" , "IAmATallDrinkOfWater" , "I_AM_A_TALL_DRINK_OF_WATER", 34 , "ICUDays" , "ICU_Days" , "icu_days" , "icuDays" , "IcuDays" , "ICU_DAYS", 35 , "SexCode" , "Sex_Code" , "sex_code" , "sexCode" , "SexCode" , "SEX_CODE", 36 , "MAX_of_MLD" , "MAX_of_MLD" , "max_of_mld" , "maxOfMld" , "MaxOfMld" , "MAX_OF_MLD", 37 , "Age.Group" , "Age_Group" , "age_group" , "ageGroup" , "AgeGroup" , "AGE_GROUP", 38 , "ThisText" , "This_Text" , "this_text" , "thisText" , "ThisText" , "THIS_TEXT", 39 , "NextText" , "Next_Text" , "next_text" , "nextText" , "NextText" , "NEXT_TEXT", 40 , "test_123_ 1 1" , "test_123_1_1" , "test_123_1_1" , "test123_1_1" , "Test123_1_1" , "TEST_123_1_1" ) # dat for arguments of to_any_case(). test non NULL arguments via dat. # test other three special case via specific examples string <- c(NA, "_", "s_na_k_er", "SNAKE SNAKE CASE", "snakeSnakECase", "SNAKE snakE_case", "ssRRss", "ssRRRR", "thisIsSomeCamelCase", "this.text", "final count", "BobDylanUSA", "MikhailGorbachevUSSR", "HelpfulStackOverflowPeople", "ImATallDrinkOfWater", "ICUDays", "SexCode", "MAX_of_MLD", "Age.Group") case <- c("parsed", "snake", "small_camel", "big_camel", "screaming_snake") prefix <- c("", "start.") postfix <- c("", ".end") transliterations <- c("german", "Latin-ASCII") dat <- expand.grid(string = string, case = case, postfix = postfix, prefix = prefix, transliterations = transliterations, stringsAsFactors = FALSE) # code to generate new results. # purrrlyr::invoke_rows(snakecase::to_any_case, dat, # preprocess = NULL, # postprocess = NULL, # .collate = "cols", # .to = "output") %>% .$output %>% dput() # Some Benchmarks: # devtools::install_github("Tazinho/snakecase", force = TRUE) # library(snakecase) # # string_gen <- function(times){paste0("str", 1:times)} # other_gen <- function(times){paste0("other", 1:times)} # # str10 <- string_gen(10) # str1000 <- string_gen(1000) # oth10 <- other_gen(10) # oth1000 <- other_gen(1000) # # microbenchmark::microbenchmark( # to_any_case(string = str10, case = "snake", preprocess = oth10), # to_any_case(string = str1000, case = "snake", preprocess = oth1000) # ) # # microbenchmark::microbenchmark( # to_any_case(string = str10, case = "snake", postprocess = oth10), # to_any_case(string = str1000, case = "snake", postprocess = oth1000) # ) # # microbenchmark::microbenchmark( # to_any_case(string = str10, case = "snake", prefix = oth10), # to_any_case(string = str1000, case = "snake", prefix = oth1000) # ) # # microbenchmark::microbenchmark( # to_any_case(string = str10, case = "snake" , postfix = oth10), # to_any_case(string = str1000, case = "snake", postfix = oth1000) # ) # # microbenchmark::microbenchmark( # to_any_case(string = str10, case = "snake" , protect = oth10), # to_any_case(string = str1000, case = "snake", protect = oth1000) # )snakecase/tests/testthat/test-to_upper_camel_case.R0000644000176200001440000000422213470313655022311 0ustar liggesuserscontext("to_upper_camel_case") test_that("examples", { expect_equal(to_upper_camel_case(cases[["examples"]]), cases[["big_camel_case"]])} ) test_that("rules",{ examples <- cases[["examples"]] expect_equal(to_upper_camel_case(to_snake_case(examples)), to_upper_camel_case(examples) ) expect_equal(to_upper_camel_case(to_lower_camel_case(examples)), to_upper_camel_case(examples) ) expect_equal(to_upper_camel_case(to_upper_camel_case(examples)), to_upper_camel_case(examples) ) expect_equal(to_upper_camel_case(to_screaming_snake_case(examples)), to_upper_camel_case(examples) ) expect_equal(to_upper_camel_case(to_parsed_case(examples)), to_upper_camel_case(examples) ) }) test_that("preserve-names-attribute",{ labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal(to_upper_camel_case(labs), structure(c("AbcDef", "BbccEe", "TeEStIt"), .Names = c("a", "b", "c"))) }) test_that("parsing_options",{ expect_equal(to_upper_camel_case("look_AfterThe-hyphen andThe.dot", parsing_option = 1, numerals = "asis", sep_in = NULL), "LookAfterThe-HyphenAndThe.Dot") expect_equal(to_upper_camel_case("look_AfterThe-hyphen andThe.dot", parsing_option = -1, numerals = "asis", sep_in = NULL), "LookAfterThe-hyphenAndThe.dot") expect_equal(to_upper_camel_case("look_AfterThe-hyphen andThe.dot", parsing_option = 2, numerals = "asis", sep_in = NULL), "LookAfterThe-HyphenAndThe.Dot") expect_equal(to_upper_camel_case("look_AfterThe-hyphen andThe.dot", parsing_option = -2, numerals = "asis", sep_in = NULL), "LookAfterThe-hyphenAndThe.dot") expect_equal(to_upper_camel_case("look_AfterThe-hyphen andThe.dot", parsing_option = 3, numerals = "asis", sep_in = NULL), "LookAfterThe-HyphenAndThe.Dot") expect_equal(to_upper_camel_case("look_AfterThe-hyphen andThe.dot", parsing_option = -3, numerals = "asis", sep_in = NULL), "LookAfterThe-hyphenAndThe.dot") })snakecase/tests/testthat/test-to_swap_case.R0000644000176200001440000000022613420607650020763 0ustar liggesuserscontext("to_swap_case") test_that("minimal test",{ expect_equal( to_swap_case(c("abCD", "RStudio")), c("ABcd", "rsTUDIO") ) })snakecase/tests/testthat/test-to_mixed_case.R0000644000176200001440000000070613420607650021122 0ustar liggesuserscontext("to_mixed_case") test_that("random stuff", { expect_equal(to_mixed_case("RStudioRRRStudio"), "R_Studio_Rrr_Studio") } ) test_that("preserve-name-attribute",{ labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal( to_mixed_case(labs), structure(c("abc_Def", "bbcc_Ee", "Te_E_St_it"), .Names = c("a", "b", "c")) ) })snakecase/tests/testthat/test-to_snake_case.R0000644000176200001440000000204513420607650021113 0ustar liggesuserscontext("to_snake_case") test_that("examples", { expect_equal(to_snake_case(cases[["examples"]]), cases[["snake_case"]])} ) test_that("rules",{ examples <- cases[["examples"]] expect_equal(to_snake_case(to_snake_case(examples)), to_snake_case(examples) ) expect_equal(to_snake_case(to_lower_camel_case(examples)), to_snake_case(examples) ) expect_equal(to_snake_case(to_upper_camel_case(examples)), to_snake_case(examples) ) expect_equal(to_snake_case(to_screaming_snake_case(examples)), to_snake_case(examples) ) expect_equal(to_snake_case(to_parsed_case(examples)), to_snake_case(examples) ) }) test_that("preserve-name-attribute",{ labs <- c(a = "abcDEF", b = "bbccEE", c = "TeESt it") expect_equal( to_snake_case(labs), structure(c("abc_def", "bbcc_ee", "te_e_st_it"), .Names = c("a", "b", "c")) ) })snakecase/NAMESPACE0000644000176200001440000000057713472267031013444 0ustar liggesusers# Generated by roxygen2: do not edit by hand export(to_any_case) export(to_lower_camel_case) export(to_lower_upper_case) export(to_mixed_case) export(to_parsed_case) export(to_random_case) export(to_screaming_snake_case) export(to_sentence_case) export(to_snake_case) export(to_swap_case) export(to_title_case) export(to_upper_camel_case) export(to_upper_lower_case) snakecase/NEWS.md0000644000176200001440000004230013472270604013311 0ustar liggesusers# snakecase 0.11.0 (25.05.19) **Changes in 0.10.0 and 0.10.0.9000** New functionality: * **abbreviations**: Abbreviations are now ... * ... matched case-insensitive inside of groups of connected lower/upper case sequences. * ... consistently formatted according to the supplied case. * ... formatted exactly as supplied for the cases title, mixed, lower and upper camel. * ... protected from the parsing. This means that * special characters in abbreviations don't need to be taken care of anymore. The formatting of digits or special characters like hyphens, colons etc. will be formatted as specified. * **parsing_option**: * new parsing option 3 parses "SOmeNIceSTUFf". * parsing options starting with a minus (-1, -2, -3) interprete non-alphanumeric characters as word boundaries. E.g. "This.text" will stay "This.text" in upper camel case. * **cases** * **title**: New case which should be especially useful for automatic generation of proper labels within graphics or business reports. Builds up on sentence case which is wrapped within `tools::toTitleCase()`. * **random**: New case, which will randomly convert letters into upper or lower case. * **numerals**: new alignment option `"tight"` which allows to suppress all underscores between numerals and letters. * **sep_out**: `sep_out` gets proper vectorization. In case of `length(sep_out) > 1` differing substrings are connected by the (possibly) differing elements of `sep_out`. Therefore, `sep_out` gets accordingly shortened or the last element of `sep_out` gets recycled to match the number of needed separators for each element of `string`. * **UTF8 Conversion**: Input is now always converted to UTF-8 and returned as UTF8. Also the `transliterations` argument is now aware of non-UTF8 encoded input. Infrastructure: * **CII best practices badge**: Achieved the criteria for the best practices badge. Current status is under https://bestpractices.coreinfrastructure.org/de/projects/2475 * **R Version**: Increase from 3.1 to 3.2 regarding the usage of `tools::toTitleCase()` inside `to_title_case()`. * **Vignettes**: The blog article "Introducing the snakecase package" was added as a vignette. * **Documentation**: The readme, the examples and the function documentation were updated according to the new functionality. * **Resolve CRAN notes**: * **Tests**: Skip `to_any_case()` tests (janitor-pkg-tests, transliterations and complex strings) when platform charset is not UTF-8 to resolve CRAN notification regarding character encoding. * **Vignettes**: Build the package with new version of knitr to resolve CRAN notification regarding vignette encoding. # snakecase 0.10.0.9000 * **cases**: Title case now builds up on sentence case (instead of parsed_case). * **abbreviations**: Abbreviations are now * matched case-insensitive * formatted as they are supplied for title-, upper-camel-, lower-camel- and mixed case. Apart of that abbreviations are still formatted according to the specified case. * protected from the parsing. This means that * special characters in abbreviations don't need to be excluded via a regex in the `sep_in` parameter * the formatting of digits or special characters like hyphens, colons etc. will be formatted as specified. * **parsing_option**: * new parsing option 3 implemented which parses "SOmeNIceSTUFf". * each parsing option can now be prefixed by a minus (-1, -2, -3). In this way # snakecase 0.10.0 (16.05.19) * CRAN release # snakecase 0.9.2.9002 * **numerals**: new alignment option `"tight"` which allows to suppress all underscores between numerals and letters. * **improved speed**: time of internal parsing could be reduced about a factor of ten, due to some `vapply()` replacements. * **UTF8 Conversion**: Input is now always converted to UTF-8 and returned as UTF8. Also the `transliterations` argument is now aware of non-UTF8 encoded input. * **Improved vecorisation of `sep_out`**: `sep_out` now behaves better for vector input (length > 1). Instead of returning different strings, the return is now one string, which uses separators according to the supplied order. When `length(sep_out) > 1`, the last element of `sep_out` gets recycled. * **random_case**: added `to_random_case()`, which will randomly convert letters into upper or lower case. * **title_case**: added `to_title_case()`, which is basically `to_parsed_case()` with `sep_out = " "` wrapped within `tools::toTitleCase()` and should be especially useful for proper labels within graphics or business reports. * increase R Version dependency from 3.1 up to 3.2 regarding the usage of `tools::toTitleCase()`. * skip `to_any_case()` tests (janitor-pkg-tests, transliterations and complex strings) when platform charset is not UTF-8. # snakecase 0.9.2 * **cases**: added `to_sentence_case()` (same as snake, but first letter is uppercase and default sep_out is space). * **numerals**: added `numerals` argument to all caseconverters including `to_any_case()` to format the alignment of digits (`middle`, `left`,`right`, `asis`). Therefore `parsing_option` nr 4 might be removed in later releases, as it is the same as `parsing_option = 1` and `numerals = "asis"`. * **transliterations**: When named character elements are supplied as part of `transliterations`, anything that matches the name is replaced by the corresponding value. * attributes are now preserved (not only names as before) # snakecase 0.9.1 * CRAN release * Change default `sep_in` from `NULL` to `"[^[:alnum:]]"`. This will make it easier for beginners and in general also faster to modify cases from names like `names(iris)`. Updated the regarding sections in the vignette and readme. # snakecase 0.9.0 * CRAN release * Changes since last update: * parsing_options: * old parsing_options 3 and 4 are replaced now by new * parsing_option 3, which suppresses case conversion around alpha numerics * parsing_option 4, which introduces less formatting of numerals in the output, and leaves them very close to the way that they appeared in the input strings. * abbreviations: * they work now more consistent with cases like lower- and upper camel case * new converters: * `to_swap_case()` is new. Within `to_any_case()` this conversion can be called also via `case = "flip"`. * removed deprecated arguments * `replace_special_characters`, which is now called `transliterations` * `preprocess`, which is now called `sep_in` * `postprocess`, which is now called `sep_out` * removed dependencies: * purrr and magrittr are not longer dependencies * stringr is the only dependency now (including stringi of course). # snakecase 0.8.4 * Introduced `to_swap_case()`, which is also available in `to_any_case()` via `case = "swap"` or `case = "flip"` # snakecase 0.8.3.1 * abbreviations work now also in conversions to lower- and upper camel case. # snakecase 0.8.3 * replaced `parsing_option`s 3 and 4 with 5 and 6. * removed __purrr__ dependency * removed __magrittr__ dependency # snakecase 0.8.2.9002 * remove `replace_special_characters`, `preprocess` and `postprocess`. # snakecase 0.8.2.9001 * added parsing option 6, which doesn't surround digits with separators. # snakecase 0.8.1 * CRAN releases # snakecase 0.8.0.9000 * some breaking changes: * reordering of the arguments of all `to_xxx_case()` functions * renaming `preprocess` to `sep_in`, `postprocess` to `sep_out`, `replace_special_characters` to `transliterations`. # snakecase 0.7.1 * CRAN update * for changes see V 0.7.0 * additionally fixed obvious bug and forwarded to_xxx_case args to to_any_case # snakecase 0.7.0 * changes since last CRAN submission include: * to_xxx_case shortcuts are now exact wrappers around to_any_case * `process` is deprecated after changing implementation and setting a reasonable default. * added `abbreviations` argument to `any_case()` * case none is now a lot more general for formatting * added `abbreviation` specific behaviour for mixed case * new parsing_option 5, which suppresses conversion after ., @, etc * renaming of: * to_small / to_big_camel_case have been renamed to to_lower / to_upper_camel_case. The old names are and will still be supported in to_any_case * `parsingoption` to `parsing_option` * introduced rule that parsing_option <= 0 suppresses parsing from now on * lots of additional tests and smaller bugfixes * several documentation updates including help, examples, readme and vignette # snakecase 0.6.2.9000 * all to_xxx_case functions are now exact wrappers of to_any_case * to_small / to_big_camel_case have been renamed to to_lower / to_upper_camel_case * minimal vignette update # snakecase 0.6.1.9000 * more consistency for case none * bugfix for parsing option 5 # snakecase 0.6.0.9000 * overhaul readme * renamed `parsingoption` argument to `parsing_option` * `process` argument: changed implementation in `to_any_case`, set a reasonable default, implemented the behaviour also in to_xxx shortcut functions, deprecated `process` argument * make modifications to case none, which allows now more parsing options # snakecase 0.5.4.9000 * added special behaviour for abbreviations within "mixed_case" # snakecase 0.5.3.9000 * added abbreviations argument for better mixed case handling # snakecase 0.5.2.9000 * improve consistency with stringr pkg regarding special input handling `if(identical(stringr::str_length(string), integer())){return(character())}` # snakecase 0.5.1 * Changes since last update: * `to_any_case()` and shortcuts (`to_xxx_case()` functions) preserve name attribute now * R dependency lowered to 3.1 # snakecase 0.5.0.9001 * `to_any_case()` and the other converter function now preserve the names attribute. (Thanks to @strengejacke) # snakecase 0.5.0 * CRAN update * Changes since last CRAN submission include: * string transliteration via updated `replace_special_character` argument * some new cases: "none", "mixed", "upper_lower", "lower_upper" * aliases: "all_caps", "lower_camel", "upper_camel" * different parsing options * several bugfixes * improved internal testing * internal modularisation # snakecase 0.4.0.9016 * `case == "none"` works now with `preprocess`. # snakecase 0.4.0.9015 * fixed bug so that `case = upper_lower` no also works for `NA`'s. # snakecase 0.4.0.9014 * added shortcutfunctions `to_mixed_case()`, `to_lower_upper_case()` and `to_upper_lower_case()`. # snakecase 0.4.0.9013 Implemented two further parsing options: * 3: parses the first UPPER letter group like parsing option 2 and the rest like option 1 * 4: parses the first UPPERlowercase letter group like parsingoption 1 and the rest like option 2 # snakecase 0.4.0.9012 bug fix in dev version: protect works now for beginning and end of substrings and not anymore only for complete substrings. # snakecase 0.4.0.9011 Fix bug for `character(0)` in combination with `postprocess` # snakecase 0.4.0.9010 Input of `replace special character` is now a character vector. It's entries have to be elements of `stringi::stri_trans_list()` or names of the transliteration dictionary list, which comes with this package. This update enables users to transliterate strings from different encodings, in a flexible way. For example UTF8 to Ascii, ... . # snakecase 0.4.0.9009 * provided aliases `"all_caps"`, `"lower_camel"` and `"upper_camel"` for `"screaming_snake"`, `"small_camel"` and `"big_camel"`. # snakecase 0.4.0.9008 * small bug fix for upper_lower/lower_upper regarding the behaviour for the combination of preprocess and protect (similar to an earlier bug in the camel cases). # snakecase 0.4.0.9007 * small bug fix for behaviour of upper_lower/lower_upper. Now substrings with without alphabetical characters are ignored. # snakecase 0.4.0.9006 * new implemented cases: "none", "mixed", "upper_lower", "lower_upper". # snakecase 0.4.0.9005 * empty_fill runs again in the end, before the pre and postprocess * fixed bug: `to_any_case("r.aStudio", protect = "a", postprocess = "-", case = "big_camel")` will now correctly return "R-.AStudio" (so the protection will be triggered by the input and not by the output). In contrast `protect = A` will yield in unprotected output (`-A-`) # snakecase 0.4.0.9004 * empty_fill runs now at the beginning of to any case function (after the first parsing) and a second parsing is introduced in case anything is filled. # snakecase 0.4.0.9003 * fixed bug in camelcases, for letters after protected symbols (usually one wouldn't protect in these cases anyway...) # snakecase 0.4.0.9002 * implemented `check_design_rule()` (not exported) * resolved bugs in other design options (also deleted one which is not valid for screaming snake case) # snakecase 0.4.0.9001 * included several parsingoptions for `to_any_case()`. __1:__ "RRRStudio" -> "RRR_Studio" stays as default __2:__ "RRRStudio -> RRRS_tudio" __any other number__ will suppress the parsing (only spaces will be converted into "_") # snakecase 0.4.0.9000 * This is the (stable) development version now. You can find snakecase on cran [here](https://CRAN.R-project.org/package=snakecase) # snakecase 0.4.0 * CRAN submission # snakecase 0.3.5.3 * changed order of the customizing arguments of `to_any_case()` # snakecase 0.3.5.2 * fixed bug for combination of protect and postprocess. Therefore clarified and rewrote the internal order of `to_any_case()` * resolved all internal build warnings and notes # snakecase 0.3.5.1 * fixed bug in replace_special_characters combined with screaming snake case. # snakecase 0.3.5 * any local special characters are now supported. * added 2 arguments to `to_any_case()`: empty_fill, which allows to fill strings matching to "" with the supplied string. unique_sep adds an integer suffix separated with the supplied string, when not `NULL`. * fixed a bug in to_snake_case_internal(). groups of digits are not separated in between anymore. * digits that are not direct next to each other, will be split via "_" in both camel case versions. This is a meaningful exception. Otherwise information would be lost and also the consistency rules in the readme wouldn't hold in this case. # snakecase 0.3.4 * any_case() is now vectorised over pre-/postprocess, pre-/postfix for all case arguments * introduces protect as (vectorised) argument to to_any_case(). it accepts regular expressions and cleans "_" or whatever the preprocessing did, between matches. * some more tests, documentation and fixes. # snakecase 0.3.3 * introduced case = "parsed" in to_any_case() * introduced to_parsed_case() # snakecase 0.3.2 * finished vignette (title: Caseconverters) and replaced the usage part in readme with it. * changed behaviour in snake_case_internal to always treat whitespaces as underscores. for whitespaces in output postprocess = " " is recommended. # snakecase 0.3.1 * started testing `to_any_case` and removed a bug. * added vignette # snakecase 0.3.0 * supports behaviour for german umlauts on all platforms * introduced internal function `to_snake_case_internal()` which does the preprocessing and simplifies all other functions (especially `to_any_case()`) a little bit. * introduced `to_screaming_snake_case()` * added arguments prefix, postfix and replace_special_characters to `to_any_case()`. * completely renewed readme * updated tests and highly modularized all tests. (just to_any_case lacks some tests now and in general more examples test cases have to be written) # snakecase 0.2.2 * introduced `to_any_case()` (all functionality and documentation provided, but implementation has to be cleaned and also tests have to be written) # snakecase 0.2.1 * fixed bug: `to_snake_case_dev(c("ssRRss"))` returns now `ss_r_rss` instead of`"ss_r_r_ss"` * `to_snake_case()` now treats only spaces like underscores now (not dots anymore) * functionality to treat different stuff like dots will be added via a new function: `to_any_case()`, which will wrap the other three and will have pre- and postprocess arguments # snakecase 0.2.0 * renamed the single input parameters consistent to `string` (without deprecating the old name before, since the package was in early dev-stage anyway). * started a to develop and implement consistent logic (which still has to be better documented in the readme) * introduced tests for more hard coded examples and the logic behind it (still more hardcoded examples and a third part of the logic have to be tested) * internal logic has been simplified and modularized a lot, which makes it easier to maintain and introduce more high-level features in the future * added integrated tests via AppVeyor on windows * added badges for cran status and code coverage to readme # snakecase 0.1.0 * Introduced `to_snake_case()` which converts strings to snake_case. * added functions `to_small_camel_case()` and `to_big_camel_case()` which internally build up on `to_snake_case()` and convert to the appropriate target case. * added basic hard coded tests * added integrated tests on linux via travis.ci snakecase/R/0000755000176200001440000000000013472230504012410 5ustar liggesuserssnakecase/R/parsing_helpers_internal.R0000644000176200001440000000553513471620610017624 0ustar liggesusers#' Parsing helpers #' #' Mainly for usage within \code{to_parsed_case_internal} #' #' @param string A string. #' #' @return A partly parsed character vector. #' #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' #' @keywords utilities #' #' @name parsing_helpers #' #' @rdname parsing_helpers #' parse1_pat_cap_smalls <- function(string) { # Inserts underscores around groups of one upper case followed by lower case letters (or digits) # RStudio.V11 -> R_Studio_.V11 pat_cap_smalls <- "([:upper:][:lower:]+)" string <- stringr::str_replace_all(string, pat_cap_smalls, "_\\1_") string} #' @rdname parsing_helpers parse2_pat_digits <- function(string) { # Inserts underscores around groups of digts # RStudio.V11 -> RStudio.V_11_ pat_digits <- "(\\d+)" string <- stringr::str_replace_all(string, pat_digits, "_\\1_") string} #' @rdname parsing_helpers parse3_pat_caps <- function(string) { # Inserts underscores around all capital letter groups with length >= 2 # RStudio.V11 -> _RS_tudio.V11 pat_caps <- "([:upper:]{2,})" string <- stringr::str_replace_all(string, pat_caps, "_\\1_") string} #' @rdname parsing_helpers parse4_pat_cap <- function(string) { # Inserts underscores around all capital letter groups with length = 1 that # don't have a capital letter in front of them and not a capital or small letter behind them # RStudio.V11 -> RStudio._V_11 pat_cap <- "((? RStudio_._V11 pat_non_alnums <- "([^[:alnum:]])" string <- stringr::str_replace_all(string, pat_non_alnums, "_\\1_") string} #' @rdname parsing_helpers parse6_mark_digits = function(string) { # Inserts _ and space between non-alphanumerics and digits digit_marker_before <- "(?<=[^_|\\d])(\\d)" digit_marker_after <- "(\\d)(?=[^_|\\d])" string <- stringr::str_replace_all(string, digit_marker_before, "_ \\1") string <- stringr::str_replace_all(string, digit_marker_after , "\\1 _") string } #' @rdname parsing_helpers parse7_pat_caps_smalls = function(string) { # Inserts underscores around of one or more upper case letters possibly followed by lower case letters pat_caps_smalls <- "([:upper:]+[:lower:]*)" string <- stringr::str_replace_all(string, pat_caps_smalls, "_\\1_") string } #' @rdname parsing_helpers parse8_pat_smalls_after_non_alnums = function(string) { # Inserts underscores around of one or more upper case letters possibly followed by lower case letters pat_smalls_after_non_alnums <- "((? RRR_Studio}} #' \item{2: \code{RRRStudio -> RRRS_tudio}} #' \item{3: parses like option 1 but suppresses "_" around non alpha-numeric characters. In this way this option suppresses splits and resulting case conversion after these characters.} #' \item{any other integer <= 0: no parsing"} #' } #' @param numerals A character specifying the alignment of numerals (\code{"middle"}, \code{left}, \code{right} or \code{asis}). I.e. \code{numerals = "left"} ensures that no output separator is in front of a digit. #' @param abbreviations A character string specifying abbreviations that should be marked to be recognized by later parsing. #' @param sep_in A character (regular expression) used to specify input separators. #' #' @return A character vector separated by underscores, containing the parsed string. #' #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' @keywords utilities #' to_parsed_case_internal <- function(string, parsing_option = 1L, numerals, abbreviations, sep_in){ ### input checking if (parsing_option >= 4L | parsing_option <= -4) { stop("parsing_option must be between -4 and +4.", call. = FALSE) } ### applying parsing functions # case: 1 RRRStudioSStudioStudio -> RRR_Studio_S_Studio_Studio parsing_option_1 <- function(string, numerals, sep_in) { string <- preprocess_internal(string, sep_in) if (numerals == "asis") { string <- parse6_mark_digits(string) } string <- parse1_pat_cap_smalls(string) # RStudio.V11 -> R_Studio_.V11 string <- parse2_pat_digits(string) # RStudio.V11 -> RStudio.V_11_ string <- parse3_pat_caps(string) # RStudio.V11 -> _RS_tudio.V11 string <- parse4_pat_cap(string) # RStudio.V11 -> RStudio._V_11 string <- parse5_pat_non_alnums(string) # RStudio.V11 -> RStudio_._V11 string } parsing_option_1_abbr <- function(string, numerals, sep_in) { string <- stringr::str_split(string, "_\\sl|r\\s_") string <- lapply(string, function(x) ifelse(stringr::str_detect(x, "^[^\\sl]"), parsing_option_1(x, numerals = numerals, sep_in = sep_in), x) ) string <- vapply(string, function(x) stringr::str_c(x, collapse = "_"), "", USE.NAMES = FALSE) string <- stringr::str_replace_all(string, "\\sl|r\\s", "") string } if ((parsing_option == 1 | parsing_option == -1) & is.null(abbreviations)) { string <- parsing_option_1(string = string, numerals = numerals, sep_in = sep_in) } if ((parsing_option == 1 | parsing_option == -1) & !is.null(abbreviations)) { string_index <- stringr::str_detect(string, pattern = "\\s") string[string_index] <- parsing_option_1_abbr(string = string[string_index], numerals = numerals, sep_in = sep_in) string[!string_index] <- parsing_option_1(string = string[!string_index], numerals = numerals, sep_in = sep_in) } # case: 2 RRRStudioSStudioStudio -> RRRS_tudio_SS_tudio_Studio parsing_option_2 <- function(string, numerals, sep_in) { string <- preprocess_internal(string, sep_in) if (numerals == "asis") { string <- parse6_mark_digits(string) } string <- parse3_pat_caps(string) string <- parse1_pat_cap_smalls(string) string <- parse2_pat_digits(string) string <- parse4_pat_cap(string) string <- parse5_pat_non_alnums(string) string } parsing_option_2_abbr <- function(string, numerals, sep_in) { string <- stringr::str_split(string, "_\\sl|r\\s_") string <- lapply(string, function(x) ifelse(stringr::str_detect(x, "^[^\\sl]"), parsing_option_2(x, numerals = numerals, sep_in = sep_in), x) ) string <- vapply(string, function(x) stringr::str_c(x, collapse = "_"), "", USE.NAMES = FALSE) string <- stringr::str_replace_all(string, "\\sl|r\\s", "") string } if ((parsing_option == 2 | parsing_option == -2) & is.null(abbreviations)) { string <- parsing_option_2(string = string, numerals = numerals, sep_in = sep_in) } if ((parsing_option == 2 | parsing_option == -2) & !is.null(abbreviations)) { string_index <- stringr::str_detect(string, pattern = "\\s") string[string_index] <- parsing_option_2_abbr(string = string[string_index], numerals = numerals, sep_in = sep_in) string[!string_index] <- parsing_option_2(string = string[!string_index], numerals = numerals, sep_in = sep_in) } # case: 3 RRRStudioSStudioStudio -> RRRStudio_SStudio_Studio parsing_option_3 <- function(string, numerals, sep_in) { string <- preprocess_internal(string, sep_in) if (numerals == "asis") { string <- parse6_mark_digits(string) } string <- parse7_pat_caps_smalls(string) string <- parse8_pat_smalls_after_non_alnums(string) string <- parse2_pat_digits(string) string <- parse4_pat_cap(string) string <- parse5_pat_non_alnums(string) string } parsing_option_3_abbr <- function(string, numerals, sep_in) { string <- stringr::str_split(string, "_\\sl|r\\s_") string <- lapply(string, function(x) ifelse(stringr::str_detect(x, "^[^\\sl]"), parsing_option_3(x, numerals = numerals, sep_in = sep_in), x) ) string <- vapply(string, function(x) stringr::str_c(x, collapse = "_"), "", USE.NAMES = FALSE) string <- stringr::str_replace_all(string, "\\sl|r\\s", "") string } if ((parsing_option == 3 | parsing_option == -3) & is.null(abbreviations)) { string <- parsing_option_3(string, numerals, sep_in = sep_in) } if ((parsing_option == 3 | parsing_option == -3) & !is.null(abbreviations)) { string_index <- stringr::str_detect(string, pattern = "\\s") string[string_index] <- parsing_option_3_abbr(string = string[string_index], numerals = numerals, sep_in = sep_in) string[!string_index] <- parsing_option_3(string = string[!string_index], numerals = numerals, sep_in = sep_in) } # case:6 email1_2 -> email 1_2 # if (parsing_option == 4) { # string <- parse5_mark_digits(string) # string <- parse1_pat_cap_smalls(string) # string <- parse2_pat_caps2(string) # string <- parse3_pat_cap_lonely(string) # string <- parse4_separate_non_alnums(string) # } ### customize the output # remove more than one "_" and starting/ending "_" string <- stringr::str_replace_all(string, "_+", "_") string <- stringr::str_replace_all(string, "^_|_$", "") if (parsing_option %in% c(-1, -2, -3)) { string <- stringr::str_replace_all(string, "_(?![:alnum:])|(? RRR_Studio}} #' \item{2: \code{RRRStudio -> RRRS_tudio}} #' \item{3: parses at the beginning like option 1 and the rest like option 2.} #' \item{4: parses at the beginning like option 2 and the rest like option 1.} #' \item{5: parses like option 1 but suppresses "_" around non special characters. #' In this way case conversion won't apply after these characters. See examples.} #' \item{6: parses like option 1, but digits directly behind/in front non-digits, will stay as is.} #' \item{any other integer <= 0: no parsing"} #' } #' #' @return A character vector separated by underscores, containing the parsed string. #' #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' @keywords utilities #' check_design_rule <- function(string, sep_in = NULL, transliterations = NULL, sep_out = NULL, prefix = "", postfix = "", unique_sep = NULL, empty_fill = NULL, parsing_option = 1){ test_c <- function(string, case){ to_any_case(string = string, case = case, sep_in = sep_in, transliterations = transliterations, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option) } all( # snake test_c(string, case = "snake") == test_c(test_c(string, case = "snake"), case = "snake"), test_c(string, case = "snake") == test_c(test_c(string, case = "small_camel"), case = "snake"), test_c(string, case = "snake") == test_c(test_c(string, case = "big_camel"), case = "snake"), test_c(string, case = "snake") == test_c(test_c(string, case = "screaming_snake"), case = "snake"), # small_camel test_c(string, case = "small_camel") == test_c(test_c(string, case = "snake"), case = "small_camel"), test_c(string, case = "small_camel") == test_c(test_c(string, case = "small_camel"), case = "small_camel"), test_c(string, case = "small_camel") == test_c(test_c(string, case = "big_camel"), case = "small_camel"), test_c(string, case = "small_camel") == test_c(test_c(string, case = "screaming_snake"), case = "small_camel"), # big_camel test_c(string, case = "big_camel") == test_c(test_c(string, case = "snake"), case = "big_camel"), test_c(string, case = "big_camel") == test_c(test_c(string, case = "small_camel"), case = "big_camel"), test_c(string, case = "big_camel") == test_c(test_c(string, case = "big_camel"), case = "big_camel"), test_c(string, case = "big_camel") == test_c(test_c(string, case = "screaming_snake"), case = "big_camel"), # screaming_snake test_c(string, case = "screaming_snake") == test_c(test_c(string, case = "snake"), case = "screaming_snake"), test_c(string, case = "screaming_snake") == test_c(test_c(string, case = "small_camel"), case = "screaming_snake"), test_c(string, case = "screaming_snake") == test_c(test_c(string, case = "big_camel"), case = "screaming_snake"), test_c(string, case = "screaming_snake") == test_c(test_c(string, case = "screaming_snake"), case = "screaming_snake") ) } snakecase/R/preprocess_internal.R0000644000176200001440000000140213471754746016633 0ustar liggesusers#' Internal function that replaces regex matches with underscores #' #' @param string A string. #' @param sep_in (short for separator input) A regex supplied as a character (if not \code{NULL}), which will be wrapped internally #' into \code{stringr::regex()}. All matches will be replaced by underscores (additionally to #' \code{"_"} and \code{" "}, for which this is always true). Underscores can later turned into another separator via \code{postprocess}. #' #' @return A character containing the parsed string. #' #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' @keywords utilities #' preprocess_internal <- function(string, sep_in){ if(!is.null(sep_in)){ string <- stringr::str_replace_all(string, sep_in, "_") } string }snakecase/R/replace_special_characters_internal.R0000644000176200001440000000633413420646202021746 0ustar liggesusers#' Internal helper to replace special characters. #' #' @param string A string (for example names of a data frame). #' @param transliterations A character vector (if not \code{NULL}). The entries of this argument #' need to be elements of \code{stringi::stri_trans_list()} (like "Latin-ASCII", which is often useful) or names of lookup tables (currently #' only "german" is supported). In the order of the entries the letters of the input #' string will be transliterated via \code{stringi::stri_trans_general()} or replaced via the #' matches of the lookup table. When named character elements are supplied as part of `transliterations`, anything that matches the names is replaced by the corresponding value. #' You should use this feature with care in case of \code{case = "parsed"}, \code{case = "internal_parsing"} and #' \code{case = "none"}, since for upper case letters, which have transliterations/replacements #' of length 2, the second letter will be transliterated to lowercase, for example Oe, Ae, Ss, which #' might not always be what is intended. In this case you can make usage of the option to supply named elements and specify the transliterations yourself. #' #' @param case Length one character, from the input options of \code{to_any_case}. #' #' @return A character vector. #' #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' @keywords utilities #' replace_special_characters_internal <- function(string, transliterations, case){ dictionary <- list( german = c("\u00C4" = "Ae", "\u00D6" = "Oe", "\u00DC" = "Ue", "\u00E4" = "ae", "\u00F6" = "oe", "\u00FC" = "ue", "\u00DF" = "ss"), danish = c("\u00C6" = "Ae", "\u00E6" = "ae", "\u00D8" = "Oe", "\u00F8" = "oe", "\u00C5" = "Aa", "\u00E5" = "aa"), finnish = c("\u00C6" = "A", "\u00E6" = "a", "\u00D8" = "O", "\u00F8" = "o"), swedish = c("\u00C6" = "A", "\u00E6" = "a", "\u00D8" = "O", "\u00F8" = "o", "\u00C5" = "A", "\u00E5" = "a") ) for (i in seq_along(transliterations)){ if(isTRUE(!is.null(names(transliterations)[i]) & names(transliterations)[i] != "")){ names(transliterations)[i] <- enc2utf8(names(transliterations))[i] string <- stringr::str_replace_all(string, transliterations[i]) } else if(transliterations[i] %in% names(dictionary)){ names(dictionary[[transliterations[i]]]) <- enc2utf8(names(dictionary[[transliterations[i]]])) string <- stringr::str_replace_all(enc2utf8(string), dictionary[[transliterations[i]]]) } else if(transliterations[i] %in% stringi::stri_trans_list()){ string <- stringi::stri_trans_general(string, transliterations[i]) } else { stop("Input to `transliterations` must be `NULL`, a string containing elements from the internal lookup dictionaries or from `stringi::stri_trans_list()` or a named vector.", call. = FALSE) } } # "\u0025" = "_percent_", # "\\`" = "", # "\\'" = "", # "\\@" = "_at_") string }snakecase/R/abbreviation_internal.R0000644000176200001440000000631413472123712017102 0ustar liggesusers#' Internal abbreviation marker, marks abbreviations with an underscore behind. #' Useful if \code{parsing_option} 1 is needed, but some abbreviations need \code{parsing_option} 2. #' #' @param string A string (for example names of a data frame). #' @param abbreviations character with (uppercase) abbreviations. This marks #' abbreviations with an underscore behind (in front of the parsing). #' Useful if \code{parsing_option} 1 is needed, but some abbreviations need \code{parsing_option} 2. #' #' @return A character vector. #' #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' @keywords utilities #' abbreviation_internal <- function(string, abbreviations = NULL){ if (!is.null(abbreviations)) { abbreviations_upper <- stringr::str_to_upper(abbreviations) if (length(abbreviations_upper)) { # replace at start pattern_start <- stringr::str_c("(", stringr::str_c("^", abbreviations_upper, collapse = "|"), ")", "(?=[^[:upper:]])") string <- stringr::str_replace_all(string, pattern_start, replacement = "_ l l\\1r r _") # replace in the middle pattern_middle <- stringr::str_c("(?<=[^[:upper:]])(", stringr::str_c(abbreviations_upper, collapse = "|"), ")", "(?=[^[:upper:]])") string <- stringr::str_replace_all(string, pattern_middle, replacement = "_ l l\\1r r _") # replace in the end pattern_end <- stringr::str_c("(?<=[^[:upper:]])(", stringr::str_c(abbreviations_upper, "$", collapse = "|"), ")") string <- stringr::str_replace_all(string, pattern_end, replacement = "_ l l\\1r r _") # replace from start to end pattern_start_to_end <- stringr::str_c("^(", stringr::str_c(abbreviations_upper, "$", collapse = "|"), ")") string <- stringr::str_replace_all(string, pattern_start_to_end, replacement = "_ l l\\1r r _") } abbreviations_lower <- stringr::str_to_lower(abbreviations) if (length(abbreviations_lower)) { # replace at start pattern_start <- stringr::str_c("(", stringr::str_c("^", abbreviations_lower, collapse = "|"), ")", "(?=[^[:lower:]])") string <- stringr::str_replace_all(string, pattern_start, replacement = "_ l l\\1r r _") # replace in the middle pattern_middle <- stringr::str_c("(?<=[^[:lower:]])(", stringr::str_c(abbreviations_lower, collapse = "|"), ")", "(?=[^[:lower:]])") string <- stringr::str_replace_all(string, pattern_middle, replacement = "_ l l\\1r r _") # replace in the end pattern_end <- stringr::str_c("(?<=[^[:lower:]])(", stringr::str_c(abbreviations_lower, "$", collapse = "|"), ")") string <- stringr::str_replace_all(string, pattern_end, replacement = "_ l l\\1r r _") # replace from start to end pattern_start_to_end <- stringr::str_c("^(", stringr::str_c(abbreviations_lower, "$", collapse = "|"), ")") string <- stringr::str_replace_all(string, pattern_start_to_end, replacement = "_ l l\\1r r _") } } string <- stringr::str_replace_all(string, "(_\\sl\\sl)+", "_ l l") # string <- stringr::str_replace_all("_ l l_ l lRSSr r _r r _feed_ l lRSSr r _feed", "(_\\sl\\sl)+", "_ l l") string <- stringr::str_replace_all(string, "(r\\sr\\s_)+", "r r _") string } snakecase/R/caseconverters.R0000644000176200001440000004322013471106767015576 0ustar liggesusers#' Specific case converter shortcuts #' #' Wrappers around \code{to_any_case()} #' #' @param string A string (for example names of a data frame). #' #' @param abbreviations character. (Case insensitive) matched abbreviations are surrounded by underscores. In this way, they can get recognized by the parser. This is useful when e.g. \code{parsing_option} 1 is needed for the use case, but some abbreviations but some substrings would require \code{parsing_option} 2. Furthermore, this argument also specifies the formatting of abbreviations in the output for the cases title, mixed, lower and upper camel. E.g. for upper camel the first letter is always in upper case, but when the abbreviation is supplied in upper case, this will also be visible in the output. #' #' Use this feature with care: One letter abbreviations and abbreviations next to each other are hard to read and also not easy to parse for further processing. #' #' @param sep_in (short for separator input) if character, is interpreted as a #' regular expression (wrapped internally into \code{stringr::regex()}). #' The default value is a regular expression that matches any sequence of #' non-alphanumeric values. All matches will be replaced by underscores #' (additionally to \code{"_"} and \code{" "}, for which this is always true, even #' if \code{NULL} is supplied). These underscores are used internally to split #' the strings into substrings and specify the word boundaries. #' #' @param parsing_option An integer that will determine the parsing_option. #' \itemize{ #' \item{1: \code{"RRRStudio" -> "RRR_Studio"}} #' \item{2: \code{"RRRStudio" -> "RRRS_tudio"}} #' \item{3: \code{"RRRStudio" -> "RRRSStudio"}. This will become for example \code{"Rrrstudio"} when we convert to lower camel case.} #' \item{-1, -2, -3: These \code{parsing_options}'s will suppress the conversion after non-alphanumeric values.} #' \item{0: no parsing} #' } #' #' @param transliterations A character vector (if not \code{NULL}). The entries of this argument #' need to be elements of \code{stringi::stri_trans_list()} (like "Latin-ASCII", which is often useful) or names of lookup tables (currently #' only "german" is supported). In the order of the entries the letters of the input #' string will be transliterated via \code{stringi::stri_trans_general()} or replaced via the #' matches of the lookup table. When named character elements are supplied as part of `transliterations`, anything that matches the names is replaced by the corresponding value. #' You should use this feature with care in case of \code{case = "parsed"}, \code{case = "internal_parsing"} and #' \code{case = "none"}, since for upper case letters, which have transliterations/replacements #' of length 2, the second letter will be transliterated to lowercase, for example Oe, Ae, Ss, which #' might not always be what is intended. In this case you can make usage of the option to supply named elements and specify the transliterations yourself. #' #' @param numerals A character specifying the alignment of numerals (\code{"middle"}, \code{left}, \code{right} or \code{asis}). I.e. \code{numerals = "left"} ensures that no output separator is in front of a digit. #' #' @param sep_out (short for separator output) String that will be used as separator. The defaults are \code{"_"} #' and \code{""}, regarding the specified \code{case}. When \code{length(sep_out) > 1}, the last element of \code{sep_out} gets recycled and separators are incorporated per string according to their order. #' #' @param unique_sep A string. If not \code{NULL}, then duplicated names will get #' a suffix integer #' in the order of their appearance. The suffix is separated by the supplied string #' to this argument. #' #' @param empty_fill A string. If it is supplied, then each entry that matches "" will be replaced #' by the supplied string to this argument. #' #' @param prefix prefix (string). #' #' @param postfix postfix (string). #' #' @return A character vector according the specified parameters above. #' #' @note caseconverters are vectorised over \code{string}, \code{sep_in}, \code{sep_out}, #' \code{empty_fill}, \code{prefix} and \code{postfix}. #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' @keywords utilities #' #' @name caseconverter #' @return A character vector according the specified target case. #' #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' @keywords utilities #' #' @examples #' strings <- c("this Is a Strange_string", "AND THIS ANOTHER_One", NA) #' #' to_snake_case(strings) #' to_lower_camel_case(strings) #' to_upper_camel_case(strings) #' to_screaming_snake_case(strings) #' to_lower_upper_case(strings) #' to_upper_lower_case(strings) #' to_parsed_case(strings) #' to_mixed_case(strings) #' to_swap_case(strings) #' to_sentence_case(strings) #' to_random_case(strings) #' to_title_case(strings) #' #' #' @rdname caseconverter #' @seealso \href{https://github.com/Tazinho/snakecase}{snakecase on github}, \code{\link{to_any_case}} for flexible high level conversion and more examples. #' @export to_snake_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "snake", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_lower_camel_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "lower_camel", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_upper_camel_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "upper_camel", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_screaming_snake_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "screaming_snake", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_parsed_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "parsed", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_mixed_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "mixed", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_lower_upper_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "lower_upper", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_upper_lower_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "upper_lower", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_swap_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "swap", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_sentence_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "sentence", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_random_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "random", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } #' @rdname caseconverter #' @export to_title_case <- function(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ to_any_case(string = string, case = "title", sep_in = sep_in, transliterations = transliterations, numerals = numerals, sep_out = sep_out, prefix = prefix, postfix = postfix, unique_sep = unique_sep, empty_fill = empty_fill, parsing_option = parsing_option, abbreviations = abbreviations) } snakecase/R/to_any_case.R0000644000176200001440000006123113472260261015025 0ustar liggesusers#' General case conversion #' #' Function to convert strings to any case #' #' @param string A string (for example names of a data frame). #' #' @param case The desired target case, provided as one of the following: #' \itemize{ #' \item{snake_case: \code{"snake"}} #' \item{lowerCamel: \code{"lower_camel"} or \code{"small_camel"}} #' \item{UpperCamel: \code{"upper_camel"} or \code{"big_camel"}} #' \item{ALL_CAPS: \code{"all_caps"} or \code{"screaming_snake"}} #' \item{lowerUPPER: \code{"lower_upper"}} #' \item{UPPERlower: \code{"upper_lower"}} #' \item{Sentence case: \code{"sentence"}} #' \item{Title Case: \code{"title"} - This one is basically the same as sentence case, but in addition it is wrapped into \code{tools::toTitleCase} and any \code{abbreviations} are always turned into upper case.} #'} #' #' There are five "special" cases available: #' \itemize{ #' \item{\code{"parsed"}: This case is underlying all other cases. #' Every substring a string consists #' of becomes surrounded by an underscore (depending on the \code{parsing_option}). #' Underscores at the start and end are trimmed. No lower or #' upper case pattern from the input string are changed.} #' \item{\code{"mixed"}: Almost the same as \code{case = "parsed"}. Every letter which is not at the start #' or behind an underscore is turned into lowercase. If a substring is set as an abbreviation, it will be turned into upper case.} #' \item{\code{"swap"}: Upper case letters will be turned into lower case and vice versa. Also \code{case = "flip"} will work. #' Doesn't work with any of the other arguments except \code{unique_sep}, \code{empty_fill}, \code{prefix} and \code{postfix}.} #' \item{\code{"random"}: Each letter will be randomly turned into lower or upper case. Doesn't work with any of the other arguments except \code{unique_sep}, \code{empty_fill}, \code{prefix} and \code{postfix}.} #' \item{\code{"none"}: Neither parsing nor case conversion occur. This case might be helpful, when #' one wants to call the function for the quick usage of the other parameters. #' To suppress replacement of spaces to underscores set \code{sep_in = NULL}. #' Works with \code{sep_in}, \code{transliterations}, \code{sep_out}, \code{prefix}, #' \code{postfix}, #' \code{empty_fill} and \code{unique_sep}.} #' \item{\code{"internal_parsing"}: This case is returning the internal parsing #' (suppressing the internal protection mechanism), which means that alphanumeric characters will be surrounded by underscores. #' It should only be used in very rare use cases and is mainly implemented to showcase the internal workings of \code{to_any_case()}} #' } #' #' @param abbreviations character. (Case insensitive) matched abbreviations are surrounded by underscores. In this way, they can get recognized by the parser. This is useful when e.g. \code{parsing_option} 1 is needed for the use case, but some abbreviations but some substrings would require \code{parsing_option} 2. Furthermore, this argument also specifies the formatting of abbreviations in the output for the cases title, mixed, lower and upper camel. E.g. for upper camel the first letter is always in upper case, but when the abbreviation is supplied in upper case, this will also be visible in the output. #' #' Use this feature with care: One letter abbreviations and abbreviations next to each other are hard to read and also not easy to parse for further processing. #' #' @param sep_in (short for separator input) if character, is interpreted as a #' regular expression (wrapped internally into \code{stringr::regex()}). #' The default value is a regular expression that matches any sequence of #' non-alphanumeric values. All matches will be replaced by underscores #' (additionally to \code{"_"} and \code{" "}, for which this is always true, even #' if \code{NULL} is supplied). These underscores are used internally to split #' the strings into substrings and specify the word boundaries. #' #' @param parsing_option An integer that will determine the parsing_option. #' \itemize{ #' \item{1: \code{"RRRStudio" -> "RRR_Studio"}} #' \item{2: \code{"RRRStudio" -> "RRRS_tudio"}} #' \item{3: \code{"RRRStudio" -> "RRRSStudio"}. This will become for example \code{"Rrrstudio"} when we convert to lower camel case.} #' \item{-1, -2, -3: These \code{parsing_options}'s will suppress the conversion after non-alphanumeric values.} #' \item{0: no parsing} #' } #' #' @param transliterations A character vector (if not \code{NULL}). The entries of this argument #' need to be elements of \code{stringi::stri_trans_list()} (like "Latin-ASCII", which is often useful) or names of lookup tables (currently only "german" is supported). In the order of the entries the letters of the input #' string will be transliterated via \code{stringi::stri_trans_general()} or replaced via the #' matches of the lookup table. When named character elements are supplied as part of `transliterations`, anything that matches the names is replaced by the corresponding value. #' You should use this feature with care in case of \code{case = "parsed"}, \code{case = "internal_parsing"} and #' \code{case = "none"}, since for upper case letters, which have transliterations/replacements #' of length 2, the second letter will be transliterated to lowercase, for example Oe, Ae, Ss, which #' might not always be what is intended. In this case you can make usage of the option to supply named elements and specify the transliterations yourself. #' #' @param numerals A character specifying the alignment of numerals (\code{"middle"}, \code{left}, \code{right}, \code{asis} or \code{tight}). I.e. \code{numerals = "left"} ensures that no output separator is in front of a digit. #' #' @param sep_out (short for separator output) String that will be used as separator. The defaults are \code{"_"} #' and \code{""}, regarding the specified \code{case}. When \code{length(sep_out) > 1}, the last element of \code{sep_out} gets recycled and separators are incorporated per string according to their order. #' #' @param unique_sep A string. If not \code{NULL}, then duplicated names will get #' a suffix integer #' in the order of their appearance. The suffix is separated by the supplied string #' to this argument. #' #' @param empty_fill A string. If it is supplied, then each entry that matches "" will be replaced #' by the supplied string to this argument. #' #' @param prefix prefix (string). #' #' @param postfix postfix (string). #' #' @return A character vector according the specified parameters above. #' #' @note \code{to_any_case()} is vectorised over \code{string}, \code{sep_in}, \code{sep_out}, #' \code{empty_fill}, \code{prefix} and \code{postfix}. #' #' @author Malte Grosser, \email{malte.grosser@@gmail.com} #' @keywords utilities #' #' @examples #' ### abbreviations #' to_snake_case(c("HHcity", "newUSElections"), abbreviations = c("HH", "US")) #' to_upper_camel_case("succesfullGMBH", abbreviations = "GmbH") #' to_title_case("succesfullGMBH", abbreviations = "GmbH") #' #' ### sep_in (input separator) #' string <- "R.St\u00FCdio: v.1.0.143" #' to_any_case(string) #' to_any_case(string, sep_in = ":|\\.") #' to_any_case(string, sep_in = ":|(?")) #' #' ### prefix and postfix #' to_upper_camel_case("some_path", sep_out = "//", #' prefix = "USER://", postfix = ".exe") #' #' @seealso \href{https://github.com/Tazinho/snakecase}{snakecase on github} or #' \code{\link{caseconverter}} for some handy shortcuts. #' #' @export #' to_any_case <- function(string, case = c("snake", "small_camel", "big_camel", "screaming_snake", "parsed", "mixed", "lower_upper", "upper_lower", "swap", "all_caps", "lower_camel", "upper_camel", "internal_parsing", "none", "flip", "sentence", "random", "title"), abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = c("middle", "left", "right", "asis", "tight"), sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = ""){ ### ____________________________________________________________________________ ### Argument matching case <- match.arg(case) numerals <- match.arg(numerals) ### ____________________________________________________________________________ ### Set encoding to utf8 string <- enc2utf8(string) ### ____________________________________________________________________________ ### Argument checking (check input length -> necessary for NULL and atomic(0)) if (identical(stringr::str_length(string), integer())) {return(character())} ### ____________________________________________________________________________ ### Save attributes string_attributes <- attributes(string) ### ____________________________________________________________________________ ### Handle aliases case[case == "all_caps"] <- "screaming_snake" case[case == "lower_camel"] <- "small_camel" case[case == "upper_camel"] <- "big_camel" case[case == "flip"] <- "swap" ### ____________________________________________________________________________ ### Prepare abbreviations if(!is.null(abbreviations)) { abbreviations <- abbreviations[!is.na(abbreviations)] abbreviations <- unique(abbreviations) names(abbreviations) <- stringr::str_to_lower(abbreviations) } ### ____________________________________________________________________________ ### Prepare title case title <- if (case == "title") TRUE else FALSE case[case == "title"] <- "sentence" ### ____________________________________________________________________________ ### Handle swap case if (case == "swap") { string <- gsub(pattern = "([[:upper:]])|([[:lower:]])", perl = TRUE, replacement = "\\L\\1\\U\\2", string)} ### ____________________________________________________________________________ ### Handle random case if (case == "random") { random_case <- function(string) { upper_or_lower <- function(string) { if(sample(c(TRUE, FALSE), 1)) {return(stringr::str_to_upper(string))} stringr::str_to_lower(string) } unlist( lapply( strsplit(string, split = character(0)), function(x) paste0(unlist(lapply(x, upper_or_lower)), collapse = "") ) ) } string <- random_case(string) } ### ____________________________________________________________________________ ### Match abbreviations # mark abbreviation by placing an underscore behind them (in front of the parsing) if (!case %in% c("swap", "random", "none")) { string <- stringr::str_replace_all(string, "[:blank:]", "_") # important, as I'd like to use sth like "_ l abbr r_" around abbreviations string <- abbreviation_internal(string, abbreviations) } ### ____________________________________________________________________________ ### Preprocessing: ## Turn mateches of `sep_in` into "_" and ## surround matches of the parsing by "_" (parsed_case) if (!case %in% c("swap", "random")) { if(case == "none") { string <- preprocess_internal(string, sep_in = sep_in) } if (case != "none") { string <- to_parsed_case_internal(string, parsing_option = parsing_option, numerals = numerals, abbreviations = abbreviations, sep_in = sep_in) } else { string <- vapply(string, stringr::str_replace_all, "","_+", "_", USE.NAMES = FALSE) string <- vapply(string, stringr::str_replace_all, "","^_|_$", "", USE.NAMES = FALSE) } ### ____________________________________________________________________________ ### "mixed", "snake", "small_camel", "big_camel", "screaming_case", "parsed" if (case %in% c("mixed", "snake", "small_camel", "big_camel", "screaming_snake", "parsed", "lower_upper", "upper_lower", "sentence")) { ### split----------------------------------------------------------------------- if (case %in% c("mixed", "snake", "screaming_snake", "parsed", "lower_upper", "upper_lower", "sentence")) { string <- stringr::str_split(string, "_") } #. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if (case %in% c("small_camel", "big_camel")) { string <- stringr::str_split(string, pattern = "(? %\VignetteIndexEntry{Caseconverters} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ## Basic examples Default case is snake case ```{r, collapse = TRUE} library(snakecase) to_any_case("veryComplicatedString") ``` Of course other cases are supported (`case`) and separators can be adjusted (`sep_out`) ```{r, collapse = TRUE} to_any_case(names(iris), sep_in = "\\.", case = "upper_camel", sep_out = " ") ``` And you might want to remove special characters along the way ```{r, collapse = TRUE} to_any_case("Doppelgänger is originally german", transliterations = "german", case = "upper_camel") ``` All of the cases like: snake, lower_camel, upper_camel, all_caps, lower_upper, upper_lower, mixed and sentence are based on parsed case ```{r, collapse = TRUE} to_any_case("THISIsHOW IAmPARSED!", case = "parsed") ``` Shortcut wrappers like `to_snake_case`, `to_lower_camel_case` etc. are available. Be aware that automatic case conversion depends on the input string and it is recommended to verify the results. So you might want to pipe these into `dput()` and hardcode name changes instead of blindly trusting `to_any_case()`'s output: ```{r, collapse = TRUE} dput(to_any_case(c("SomeBAdInput", "someGoodInput"))) ``` If you are interested in the design of this package, you can find more information on its [github page](https://github.com/Tazinho/snakecase).snakecase/vignettes/introducing-the-snakecase-package.Rmd0000644000176200001440000000660413471335326023327 0ustar liggesusers--- title: "Introducing the snakecase package" author: "Malte Grosser" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Introducing the snakecase package} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, comment = "#>", collapse = TRUE ) ``` There are many style guides out there which recommend specific naming conventions for programming languages. At 2017’s useR conference Rasmus Bååth showed quite impressively the variety of cases which even exist within base R in his talk ["The current state of naming conventions in R"](https://www.youtube.com/watch?v=Pv5dfsHBBKE). However, consistent style is not only about naming new objects. ## Import When you do a data analysis, most of the data already exists and you import it from disk, an API or a database. Here is the first moment in your data analysis when you have to decide if you want to rename your data or leave it as it is. Let’s say you have some data named in any of the following conventions ```{r} string <- c("lowerCamelCase", "ALL_CAPS", "IDontKNOWWhat_thisCASE_is") ``` You can now easily convert this string for example to snake case via ```{r} library(snakecase) to_snake_case(string) ``` ## Graphics Whenever you want to construct a graphic and you don’t like your conventions to come up in it, you can easily convert strings to a more humanly readable output like ```{r} to_mixed_case(string, sep_out = " ") ``` You might have noticed the `sep_out` argument. This allows you to combine any case with any output separator to create other well known cases like ```{r} to_snake_case(string, sep_out = ".") to_snake_case(string, sep_out = "-") ``` or completely new ones like ```{r} to_screaming_snake_case(string, sep_out = "=") ``` ## Export Finally, when you are done with your analysis and want to write data back into a .CSV file or your customers database, which has a camel case convention, you can just use ```{r} to_upper_camel_case(string) ``` ## Further information The snakecase package goes quite deep into the little quirks which arise in automatic case conversion. However, it is well tweaked, to handle almost every edge case in an intuitive and elegant manner. To get a complete overview of its functionality like other cases, handling of abbreviations, special input characters, different parsing options, transliterations and more, I recommend you to have a look into the quite extensive [readme on its github repository](https://github.com/Tazinho/snakecase). As the package is relatively small and basically consists of its workhorse function `to_any_case()`, I can also react quite fast on new [issues](https://github.com/Tazinho/snakecase/issues). And of course I [tweet](https://twitter.com/malte_grosser) occasionally about new functionality. To round this up let me give you one advice about best practices: be aware that automatic case conversion depends on the input string and it is recommended to verify the results. Hence you might want to pipe them into `dput()` and hard-code name changes instead of blindly trusting the output ```{r} library(magrittr) to_any_case(c("SomeBAdInput", "someGoodInput")) %>% dput() ``` Happy snakecasing everyone ;)snakecase/MD50000644000176200001440000000611413472343233012525 0ustar liggesusers8891cdf5cff8a15c4cf40f12a7b1536b *DESCRIPTION 6426c25a3ae2976c65061d638bafb47e *NAMESPACE 58a480f99ba5dafbbd095140b14487cf *NEWS.md 318bfc11a7a5b9218519bdc0beff0721 *R/abbreviation_internal.R 0cc2c6f503a283072788227e3d48a57e *R/caseconverters.R 89cd34d099ee9163e986d5c2381f3d17 *R/check_design_rule.R 1061b55c06af44c7685a325a8ba19533 *R/parsing_helpers_internal.R f90f0f9ea5343a5bf71f3a6d9f3bf534 *R/preprocess_internal.R f91fc95fd7cc4dc63e0d9575e0218aae *R/relevant.R f0e9b0160882fa6038dd048981c048e8 *R/replace_special_characters_internal.R 9bf9dd9abf50e46f7662d009fba05e8c *R/to_any_case.R 8b1a3f01126297a7aa268e12c39551b7 *R/to_parsed_case_internal.R ef479212e1fef27cd56c3216ed40d835 *build/vignette.rds 5fac1b30c9c28ee0a45fdec21256336a *inst/doc/caseconverters.R 107033a90ad1266083fd92f59444a2ab *inst/doc/caseconverters.Rmd f1e63b7cd96c7eece3676f3c63fdf1c7 *inst/doc/caseconverters.html e83af1e0a830052205999b6b44b3c400 *inst/doc/introducing-the-snakecase-package.R 0137bc2384cf1e57a083a4fb5ba58bd1 *inst/doc/introducing-the-snakecase-package.Rmd 271b1ba436ca15d876d8c8fb4e9dd9c9 *inst/doc/introducing-the-snakecase-package.html 71a19974365c42c73e43cddc4ea4c9d2 *man/abbreviation_internal.Rd a646f5d6f29210095358fd88e4cb978a *man/caseconverter.Rd 4da9aef1b3c10185e550f8d8e48cdba0 *man/check_design_rule.Rd 83e2a828dda785f39338287ca2e4d96b *man/figures/Workflow01.PNG 7b513dcead06bad1930da8815f272a32 *man/figures/Workflow02.PNG 0039b3cf48c3f6aa41f5ab851b8c5fe5 *man/figures/snakecase05.png 0c6e666ac3b9155037b31187b9a904d2 *man/parsing_helpers.Rd 6a1bf1cf0b4620ba7c4cd11f23223dae *man/preprocess_internal.Rd 37d653618cae4805f91e2e6fa5a3aa51 *man/relevant.Rd e4182b789b2ea25a92dc4b75eb229943 *man/replace_special_characters_internal.Rd 7d80a86aac41e43a7fea5eaf61f21219 *man/to_any_case.Rd 5d972fe31425d257b79b3cfafab5ce5a *man/to_parsed_case_internal.Rd 8bfea527c40e1c17308d8b48b36bab5d *tests/testthat.R 543f9c4d2c976822d1679029d1e41668 *tests/testthat/helper-examples.R 594c2035d0e5f19d4504ab3809444dc1 *tests/testthat/test-to_any_case.R 97563ef453d1b4a2a04c60135229235c *tests/testthat/test-to_lower_camel_case.R d267da929f4936b49183d3a062eeb526 *tests/testthat/test-to_lower_upper_case.R 33749b1426a953ccd9bc1462e527f3dd *tests/testthat/test-to_mixed_case.R 1e89fa4003ff9a63200c9a948ccb0ccb *tests/testthat/test-to_parsed_case.R 1244e2949f281f1aa676541d55a1dbf9 *tests/testthat/test-to_parsed_case_internal.R 54b8f212ab6d3acd9b7f2da42aecb24f *tests/testthat/test-to_random_case.R fd40b77e091bcdeb976902fe7e3d516f *tests/testthat/test-to_screaming_snake_case.R a5912e660571ea6458106fc92d6e2e75 *tests/testthat/test-to_sentence_case.R 50a7ef6349ded06ce9d39e3a79a801f9 *tests/testthat/test-to_snake_case.R d9548ba4a694a8902bcf7480d47dd48e *tests/testthat/test-to_swap_case.R d0778b5f3ab5cee6c1ad85b4881d6bfb *tests/testthat/test-to_title_case.R b80f98ee27cc193dbf6ac4470ed936f3 *tests/testthat/test-to_upper_camel_case.R f8d61497211f9e20a3f120636e4eccaf *tests/testthat/test-to_upper_lower_case.R 107033a90ad1266083fd92f59444a2ab *vignettes/caseconverters.Rmd 0137bc2384cf1e57a083a4fb5ba58bd1 *vignettes/introducing-the-snakecase-package.Rmd snakecase/build/0000755000176200001440000000000013472330271013310 5ustar liggesuserssnakecase/build/vignette.rds0000644000176200001440000000040113472330271015642 0ustar liggesusersϊ0پ@E־"^5T';ND/3o&u1F 6(uu1 AdeQgK(b -Şo P>jjg҄Z׶*pP&7Y)QHn5hES45[$8;ͭp~fs:6  #o82uuQWe.,]0y~; ֑{7<(I x=snakecase/DESCRIPTION0000644000176200001440000000145313472343233013724 0ustar liggesusersPackage: snakecase Version: 0.11.0 Date: 2019-05-25 Title: Convert Strings into any Case Description: A consistent, flexible and easy to use tool to parse and convert strings into cases like snake or camel among others. Authors@R: c( person("Malte", "Grosser", , "malte.grosser@gmail.com", role = c("aut", "cre"))) Maintainer: Malte Grosser Depends: R (>= 3.2) Imports: stringr, stringi Suggests: testthat, covr, tibble, purrrlyr, knitr, rmarkdown, magrittr URL: https://github.com/Tazinho/snakecase BugReports: https://github.com/Tazinho/snakecase/issues Encoding: UTF-8 License: GPL-3 RoxygenNote: 6.1.1 VignetteBuilder: knitr NeedsCompilation: no Packaged: 2019-05-25 21:16:42 UTC; MGO Author: Malte Grosser [aut, cre] Repository: CRAN Date/Publication: 2019-05-25 22:50:03 UTC snakecase/man/0000755000176200001440000000000013472235220012762 5ustar liggesuserssnakecase/man/caseconverter.Rd0000644000176200001440000001773713471106767016147 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/caseconverters.R \name{caseconverter} \alias{caseconverter} \alias{to_snake_case} \alias{to_lower_camel_case} \alias{to_upper_camel_case} \alias{to_screaming_snake_case} \alias{to_parsed_case} \alias{to_mixed_case} \alias{to_lower_upper_case} \alias{to_upper_lower_case} \alias{to_swap_case} \alias{to_sentence_case} \alias{to_random_case} \alias{to_title_case} \title{Specific case converter shortcuts} \usage{ to_snake_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_lower_camel_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_upper_camel_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_screaming_snake_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_parsed_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_mixed_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_lower_upper_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_upper_lower_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_swap_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_sentence_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_random_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") to_title_case(string, abbreviations = NULL, sep_in = "[^[:alnum:]]", parsing_option = 1, transliterations = NULL, numerals = "middle", sep_out = NULL, unique_sep = NULL, empty_fill = NULL, prefix = "", postfix = "") } \arguments{ \item{string}{A string (for example names of a data frame).} \item{abbreviations}{character. (Case insensitive) matched abbreviations are surrounded by underscores. In this way, they can get recognized by the parser. This is useful when e.g. \code{parsing_option} 1 is needed for the use case, but some abbreviations but some substrings would require \code{parsing_option} 2. Furthermore, this argument also specifies the formatting of abbreviations in the output for the cases title, mixed, lower and upper camel. E.g. for upper camel the first letter is always in upper case, but when the abbreviation is supplied in upper case, this will also be visible in the output. Use this feature with care: One letter abbreviations and abbreviations next to each other are hard to read and also not easy to parse for further processing.} \item{sep_in}{(short for separator input) if character, is interpreted as a regular expression (wrapped internally into \code{stringr::regex()}). The default value is a regular expression that matches any sequence of non-alphanumeric values. All matches will be replaced by underscores (additionally to \code{"_"} and \code{" "}, for which this is always true, even if \code{NULL} is supplied). These underscores are used internally to split the strings into substrings and specify the word boundaries.} \item{parsing_option}{An integer that will determine the parsing_option. \itemize{ \item{1: \code{"RRRStudio" -> "RRR_Studio"}} \item{2: \code{"RRRStudio" -> "RRRS_tudio"}} \item{3: \code{"RRRStudio" -> "RRRSStudio"}. This will become for example \code{"Rrrstudio"} when we convert to lower camel case.} \item{-1, -2, -3: These \code{parsing_options}'s will suppress the conversion after non-alphanumeric values.} \item{0: no parsing} }} \item{transliterations}{A character vector (if not \code{NULL}). The entries of this argument need to be elements of \code{stringi::stri_trans_list()} (like "Latin-ASCII", which is often useful) or names of lookup tables (currently only "german" is supported). In the order of the entries the letters of the input string will be transliterated via \code{stringi::stri_trans_general()} or replaced via the matches of the lookup table. When named character elements are supplied as part of `transliterations`, anything that matches the names is replaced by the corresponding value. You should use this feature with care in case of \code{case = "parsed"}, \code{case = "internal_parsing"} and \code{case = "none"}, since for upper case letters, which have transliterations/replacements of length 2, the second letter will be transliterated to lowercase, for example Oe, Ae, Ss, which might not always be what is intended. In this case you can make usage of the option to supply named elements and specify the transliterations yourself.} \item{numerals}{A character specifying the alignment of numerals (\code{"middle"}, \code{left}, \code{right} or \code{asis}). I.e. \code{numerals = "left"} ensures that no output separator is in front of a digit.} \item{sep_out}{(short for separator output) String that will be used as separator. The defaults are \code{"_"} and \code{""}, regarding the specified \code{case}. When \code{length(sep_out) > 1}, the last element of \code{sep_out} gets recycled and separators are incorporated per string according to their order.} \item{unique_sep}{A string. If not \code{NULL}, then duplicated names will get a suffix integer in the order of their appearance. The suffix is separated by the supplied string to this argument.} \item{empty_fill}{A string. If it is supplied, then each entry that matches "" will be replaced by the supplied string to this argument.} \item{prefix}{prefix (string).} \item{postfix}{postfix (string).} } \value{ A character vector according the specified parameters above. A character vector according the specified target case. } \description{ Wrappers around \code{to_any_case()} } \note{ caseconverters are vectorised over \code{string}, \code{sep_in}, \code{sep_out}, \code{empty_fill}, \code{prefix} and \code{postfix}. } \examples{ strings <- c("this Is a Strange_string", "AND THIS ANOTHER_One", NA) to_snake_case(strings) to_lower_camel_case(strings) to_upper_camel_case(strings) to_screaming_snake_case(strings) to_lower_upper_case(strings) to_upper_lower_case(strings) to_parsed_case(strings) to_mixed_case(strings) to_swap_case(strings) to_sentence_case(strings) to_random_case(strings) to_title_case(strings) } \seealso{ \href{https://github.com/Tazinho/snakecase}{snakecase on github}, \code{\link{to_any_case}} for flexible high level conversion and more examples. } \author{ Malte Grosser, \email{malte.grosser@gmail.com} Malte Grosser, \email{malte.grosser@gmail.com} } \keyword{utilities} snakecase/man/to_parsed_case_internal.Rd0000644000176200001440000000275113472123712020127 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/to_parsed_case_internal.R \name{to_parsed_case_internal} \alias{to_parsed_case_internal} \title{Internal parser, which is relevant for preprocessing, parsing and parsing options} \usage{ to_parsed_case_internal(string, parsing_option = 1L, numerals, abbreviations, sep_in) } \arguments{ \item{string}{A string.} \item{parsing_option}{An integer that will determine the parsing option. \itemize{ \item{1: \code{RRRStudio -> RRR_Studio}} \item{2: \code{RRRStudio -> RRRS_tudio}} \item{3: parses like option 1 but suppresses "_" around non alpha-numeric characters. In this way this option suppresses splits and resulting case conversion after these characters.} \item{any other integer <= 0: no parsing"} }} \item{numerals}{A character specifying the alignment of numerals (\code{"middle"}, \code{left}, \code{right} or \code{asis}). I.e. \code{numerals = "left"} ensures that no output separator is in front of a digit.} \item{abbreviations}{A character string specifying abbreviations that should be marked to be recognized by later parsing.} \item{sep_in}{A character (regular expression) used to specify input separators.} } \value{ A character vector separated by underscores, containing the parsed string. } \description{ Internal parser, which is relevant for preprocessing, parsing and parsing options } \author{ Malte Grosser, \email{malte.grosser@gmail.com} } \keyword{utilities} snakecase/man/figures/0000755000176200001440000000000013421570725014434 5ustar liggesuserssnakecase/man/figures/Workflow02.PNG0000644000176200001440000074163213421570725016773 0ustar liggesusersPNG  IHDR҃ IDATx˖uQH"xYY2I"]]=stV\N>'__q1~td}''_.}2ptd'Kd* td=( '}ACA tMZ GzcCC `tM{[. Cz3Í@ nny&,=o9C@^[z҃<)y]MKDz#}!kJoVJ_Rct7)ä/`)1Py= Jw FJw} sG@^Kzs]tNkIoLI_PAtOu7%]/R(I yHsf nO@ބ4(`F>YG3Vi(nK@tH_4JH[g77S=]v7YqZ>t߻XUX`U,-nC@>NzS>ZKe{-?^H{mRH/MZ}6ҽr I/ Vt﹅t' /ťRj<(>8KKKw[TM]Vg^lIHwIwҋl!`Ut)Y@Yz- }"ݕ.!7 ;J/9ݤ%;gy'5to:t, &>x_?Vw7^LJ\Q dIIDISIwҋ^}Azcto+"Ċyz4p_Z@^ 7.p?L.g qEY) O/F @Z$K:JX@%&떵l@~E7"Hzh;!t[Ryax/tw\$D@~Ť7 .)JL^!ܓBq=N-eʀ<ЊHo$0:ҽ˘* O?H` 6)(Atg;u"rpd8/ݡAnX@.oh*=pLO\842Hz҃c6Q/+"o  jIwopP7#"oBgfҗ>gJ? /eK5 .t\3"% Oѝ*I_~HIwFO l&җ-SJ}ކI>kDGXz!J)]Ť?yk(XXjh'+q@ dY9_F E/G6zg{AF?b E`=n{=!KIc" BbbKt)!2t, ?(p(,}!Z鮑=BB! eA}t2$eh# %/.)pVK[J$*K o-},$=pFzs JwkKID-N@_HzAZJ:|$ݵ-%[2\^> O >,@zt{2&C; z!"=HR.nN!yGa` KwsKHt?މ/~8tw5XZ礛t=e@ }N(}.KwSJw4 ? Ӊ/kq4^@鞆ҝҝT'ͤ)DC,Fzs '](7K٥ ҇cQKU,^^zHߟ_Y^ҝvɀx$'}tW'&EgQS#.Iw|<ݷ:/j?steH>UP]y!Aaӗ/4~QXMƶ ɧ+) 'xbf/>K%V!k 3h<}i2K$&&/{Yˏ#} vƅK@{n.zwN!z5 8O_f\(=LHR\dDc(?~k{Ѹp+WQݡ1wcW 89K{,Y>&OwB. m7@0JNQH~_ـⴗ~{ Kw} Ʌacҋ~p<}i#=ݤbK/y*`{PDҽBr1ygҋxp<}pƹLz0K@k^{7Iw ^WJHH.ݏl!Aqtgؙ\Hވ}*/'}qFz0Re*Hw>uÎB ^R`w +IB{Ď"(/#}Im)=r;$qy-N!\@>s<./+=h= =;&ayN_@H." DžI_8KNKt%,'76$$ +qPz0֗٢c#Br<`Qd#Br!yz1 E3 * q\}dBr&yz Eդ@ZmIw7op\0$C,=X@J_bq.~_ҝ {1e=t=u@.Oobx#V,po:K !}t=e@>k+E3.=4- =䋶Jw%OHw9KHaab_C#x| B4YZ MP ,HLHEF%a',= hEL+}!y|p|x<};K*Og{LMgȇNd@> Ƿ`pX܁(=o'$/THݗrhP1ҝct*"/ K*/?K@ލRת7w-ܹBZ1[ oɗcx<.}/[9,OwBCr xLsF [ NyKs|و|x@. ӗJHգt7:&Os"e.O_q"V}ߨ4 #Ooբ(z.70+D~uL;ۅ;G]rpp<} MX_ff=a<{K/ŹI 1 ;C!|!yz8~[<^q8I@t7CLAy;쑧țqp\4;!w>Istq<ӊx\8B8. ]Hi鞈AyOȫDuB^2Oqx]顶 E\AyWlm!y\<. EC3/pNWqa7'$E7qp< kdyIT.$8$)"i_xP4h8AO_(w6br!yUD>&"/  G6^5tIh.&2$_1&#w|]@^=0/oƋa@ 3KAbJ1bD>,$}uf8>,OE㋅bC/E70L#tw[TFCb| 5%VH9鮁}.Ayoˆorh|h<=D~qXUYHg$*/ ;%#x|x\8>2t/6R&GG{x'$mќ IDATh|`0`HC_$S(K BL!`@~(,O ;+~mE)/0B^tgU *䣿J^)$kC">!y\P ;JwE;Q1!|a@~계~Jh|X<=KwIWH^b Cry:">$?]_ 7 C=I,·_Kw :BCpw;EDȿ= gUX46a,47~qU JwB#kɫD\D~ x4 !77 ǗӃX<#r]ԅҝY*&OwBmA@o #xpCH."Oq_*O}wwޞ'7/ߞ~_ߝ>W|4XD ɻGCr%o"%Cx|l<^$opwzMruMi\D'"og?}wzu|s / G6o|ƴkH."DA X<ӳo<{W{lD D?mq_Xm_!u[7WoyMTD>qD~, mUUD>iD~}@.7ڸN}w?hՐ++D_F@_}lH^1"Ew/+/^ߝ~A@ϿzQO*"(", /_=xK9*|#mGa<_~{߿D~@>ID^-$Jr׾>{RF\<r5=֕No[q9zε""rx& T_:ED~qH."oǫOml9.LE+D+:. X5iۯypx\@k{ӶyB@>CD>E@. s9׋q9zv""_r , Xѭ|∼l@. ӢA׉ȯ|y@V<>: oiա~ԷV ɫ"bx|h<. XOUD^#"׋iݣȧȋH<. XO&UDț5q9zzu")"p@>4kݧ  ;FMr`=#Uyو|@._;gT*"/rxx\@< rUE"^B_3 oވoO/^@՛LZ)" $"8 _;~\D~0"? GB`=sFzJyǖ{|@./ PS*"_;"0  ٻ cݒbdJDgu}*J ڷVKh110b0b1KIh !#;378yq9@,Ԕ#"F@ňPx|u"Gȋw1 o1bmi|^y! *TD{ygmspKZC}qI"Nrߓ * /R.PS|^*"Ow "/P@."OTD^<yŋX[Z#Briԗ K ʧƴ\<^x\@P>v"EG?s֟z@./E<. o*qXmX閱coZ=Vw[cq@΋o7gh(~pUW?e|N/w0#+woLy_`k qqM#`8ZǾsmWn֒?7Jk*"/[D~Frx*Vk[_NDvb`U/{pczҲ/w0^sͺز=tۑk=?/Tou'|`u,w$|4yW㹈3Ȼ {AxƱb3z+.$~ye쵻.'(Ə?3sơ?[bvP-b|a @eD9s>U<. _u ΈG.;/҈߼%^;x;gæ8i fu׮ā84/<<^kKx|1o\|hO3<ˈ< yÀxy:y^ȷ _z^x|'h^6Ӷ?J5y<=׫omsmLZM 5ۙfg.9"@Ӝx\@HN"Uj!}`ULOVV%{|`g_HMU;%[ݶ#YКVZSy/=g(_:Yft,f&jJЅgD->%{6d%+=?u\ӓGw %?z蛪Kn^<o䔽oǿMsy)"z]m"v2D %9Z>Հ]~⊋<{񘙨֡||^1=YoJ7>]X!gǿ5y }8˳kzrߓ&"ϺM/Pw3"U@qxO仆gxfD-pckٛczqx v4ڹ[gǿ:} WGT5~@sjJE=B~X@.AxkFbf]xv U]~AL[}fWӓxUɃV=z`LOV?m8-jSMU%[UsKMUw&4Lc<7w+G䅋sg7s{+ ـg<oՓW^3qg-Ukcz?<oՓd%nx5 7Uݐ<oUۢo'|pu{ @cv ȋgByQ{- ـ'[՗D-5. _ӓxAx;ӓ#o]}SXMɃVgGMUO[pyue_!> A<:_z&0yުg3zPLOV[zvlϟOv~ǿoMMUrAxj}1݂;$ PD^ y",/d}\<ZL8yގ?vebzc8yގJLOV4x$ﶧ7Uj9?b@sZME)"Dy:xyY@^$938!Q@~k|?'+q$Wfrk9f@^7"Ϻ]D^2^u7U_۔>o{vDT5Np{ @c;RyN"Fun'{- ӆـg<oՓW^3qg썿6'+ɃV=ypLOV[>uo/ۻ!yުET5NnIubyqM_3:?tɃV=v13QoKv~WӓxUɃV=z`LOV?-݂6ET5N}] U;DT5{h{ @c{<=B޽xhxcf?Ax옙uǶd%Ax~|1=YuymjAxN}]MUWmL~hlTD3yrxKxGobfxɣVl>*󑁘ē'[d%mOz~'~b8wۓG8C7U_ٱ#z]SyO9ǻ1ŀ}bf?Qx򢘙]c?^&'+ɣf=qPLOVzj;MK/ۻ!yެET5^@skKx:"8 _R ?bxOd%u(yȳVw>3[vmM~vG}n0Qqx#ozƶg@s:="/ R9Հ+;<o3|G׿r]LOV_H7g]Cm^qv 7U߿&мfB$yKcfb97?=Jzوg%ȟx܉d%f>'ȟ;?@LOV9\uk7DT5Na0*wmMwG7UߟNw7 ?("E@bDр;{s>×x+.Ϛ]X-[LZgo["W]ǟm(}*.ww["_oSol<}Sx_đ6Rӎ䅌 Bz@#-\D?]}mcqth[^v."U]ip~q`1Gކ;w-_MsƑc^@޽dy." /ޙP\@DsN\Y8+._p{⇻W\q.Wceԩs;Wl_rܵ5p|7ɷX>?߯Otᝥȭw< >xŀ|)W@^׶{6vygēW^ܱp/.:{ߟ+?;ӷ]v ~ ǟ;ްjo^!{wʯ-N\[Fm ܱnR5]){9K[țhgBޑLYYw /v?|y՗?{x Ί3oXh f5׬+ i0;r4-,OOV׭{mA!XM1pjQsc޴.w;B݈+ ;<޾@ϙ=#}~vXތ/k֍;Z\v _ › \>7?ȑZ7/p5qcް>xΚZkjJ{~|Iܭ0EsBށ;7M' 3S+^Dޝ޵.tV˰Bh@>Q' ri@yVמ^< Lcڝ{y~Ws)>U<. (f;S+%\!/F@ޣ]JkZ yx'.\h9@ڛ" /TDj@ށ|iyZO]!?[DLxNsyE >Eޑ|xGq#䥍 ȭ2o0"/e@LDޝx ySx~峿#- yyN<7 Ow2 o<. ([FK KBZ@x<yArߓv- YDޓ+ ȋ% _|jy"G㥍PSZ"EFy7)T@엺B]@P6MDK Ȼw# _,". >x\@+:[!/ yxA;/Ͳzy#r+9 %Y gGڱ+= w-yGw1|nIB}DՀ73'-NDn|yL7 BxPSZyEM{&O" Gir F@ swu<_y 'Ө/eDkyfyWxyf)yL+⯐> >. -4Vm9{|}\@P>K {yy&yyx<yǗ nKZ6 yyW[ ȭg} - (v"r+^!|wVy_OkyspKj\@ޡxyKx򢮏|3'- y6yw"E ȭ zWwr+=wx~=o&]@P: 5K ȓ';Qd@^^@ yy"򮭐w7 o56 % ]t9@J;[!X@ޱ\@z@^q9@y\@a@]V[j3{1 >q9@,- Bl;yxr㙯 ʧQ_jމx\@P>4V;B^xq9mI%"/ A"佺>D@NRr+=wpb]@ޕq9@t. og\@䈼tyx[O+iyWȳ ȻB|׷ȭ Kw;/1_r@ʅNi#ry7NT򒯏 ʧyQWȋ& S4IW3 ȋg Ȼ>. nIVw$ zL ]:9Yg7- _ y< _n ʧy yfy# &@g-+eț []" o! (LVw2 g}\@P>;­="6 B( wr}|q9@ܒfgB^|qy'r> p\@f@~z'rxkxy[̖gBB+"?4"5 _˞r}\@P>{njy G S/ fYyry!.tȳZ!I@ y+bw" hG}@\@. /t@V<.  ȋB. o# p@^x<{r9%MBՀAwh񲬏 ʧb {$ wU? j\@. [@΄}&yӁ* (=iyy<~< yyW[husB^.N@>_!o]@pDPSÀH-rߓ B. _b. (F [{> oB2 &o" xr^ЕaD^ y~S\@ـ|. (z]\@^ 򅿬mm䭯 ʧ|y^yh^t[V#j/%o" l}|ြ~< o9o׻r??,bmiGyֶySy<yfл>^<rzgn{H@ S^!/}@d|fy+xxQ@r [% (ߒ?tJ3iGyvIyyaQyvy񈈝{ސwb}"*(BBTS߀=p?` X[ZLcY(҇2ZibBA,N5O«9'ٝQ|R= *Ɉ7x\@^9@ViJUW!? Ԉyx<= x@@oOmO\ǷFZ.OyLC\k@CuԈ̀S>>% /O sE <y "OkXD@^*>. $ IDAT/Kdk(yl&U 9ll7cp:x|noZ۞ny0 3M̓{qolfnKSs|<<~:q olF?>? yK [@>mWw` vm|c%=j}\cL<~|{ܿ~zr̽y0L<pny/mZ &'OmW{׹?7I=_<ۮ%&/rH$Wͻdk(9c{<^y7Y?m}@l} yGy[@^C<; /p<>- yR r@>n ~^늾My0;՛wԬ|xcC VQmWe~l;WU޼Ioέlnݞ׏?E C%@H<W ȧFEyU[sA j@>Y9JMW aFm 7*"qQp_`[֏yF^Eטv+뺑$Iyqz؜xߪtո#*#c>. 7yçߦl_qiwjD+(xw;b*oQz[/?~+iysXKqX swZ #U5"l{=߾:Ȼ țZ}|J@'x|J@^8<dc^2rZ|76牢eػO?~J^ylMݟ[i6}%x c_yW׭?%Ϸ_g:?91U߾'Ϸ_'F+/Q( sP:I"y/yzX _ɓg۩5zz,<#4ˌ/A<W ȧFMnLD^5 7g# os"ywWzY{ԱPh$Wmxѣ\w<ıY+$9.i+2+6dRc2nH{H/g0}y"4s̱ eq]& O^bXhuq<tޖ߫׾ W]@~^(LjgWջVv{\V27V>|icZ$VMр<zl PvV.iPx0KK~Xaxcsb, ZF?_ GmRe걪_Fؾ}1b s|=$I} yȻǧu~ P4 2d?~*} aQd0EVSEb= IʭR)/sj{PtP̾u~zD^%  ǧxMyx̀<B:>'2tUV3/ϒPwes<ۮ>#U+Bcc6^y]o1.IU#e"Ԉ^% s@ qv5n?'o|PjշFgbeVVJt=򮨜JtU tL^yvUzݴGS+?~]ynEæy8"o3 yS|2KGȳ&yb$ohE2s%Om'>&-ϫyq`ѣYFT,=`l%Ϸ_'>WWy$0?nԺϱΑb/o'ȋB^S@cN# ONnqyqUe ɫ7+h}U ˬ+ }~l~lZ +Ϻll U^E>?2~~M4n$[Gɫ7QH{ț|9M<7#0YZ@WU#9 ȳVBp{ξ_}.{@>Fܫ]IRJ١y$I\:GnoZ'sx4`OZ," Fy_yx򲫏 ȋk* Fik_ɘcB@ڷo*B|ձlX>~uΗ~Rwon}̭~2meW"Ԉ^}0>D<~. /.2Q FEߴ]+F}cp,kV&oRue4yT`<>c_Eg_}/6v@2\yim0 G} țY}|f\4 d@~D@^X(Bb?^8-H-yƼ? ׬iu֏kLiw%4g΋?M|Q[y5zTiFY cKkQ+thۑyUȧuȫw- ό''I iV.ғ*m5 ǫ7ƨ˃ԡ5o݇?>ssgpc\ Ѽ2?%Ϸ_Z =Q4O_}/| ɃOUΕ5՛w_m6yԈ\@l@^ryxy ȋK[x5>x4ؼH9D|0z<bnlKoIg6E_}O<~:fC( ͻyտ+H_?~jx%k\ {ɃO'Yh{0H=>|MF˃ar{k<~  5z4q,SeWO s.x ol^i% w}<QWuk˾>t2U\ =hy ]& #  k ,)?yyDEUb~x|J}hh 苼Ub_Rz cUFyU\ ޼k}@LS\! cB. @ ȳjy%˃aHL@>V6|:Jo  ӴK@_}o6ec^/|jEm>O<۞8GCdyfͻ׏*]BÍʫ}1=r=;8>?~$̭#WK\@. o% ϚY3n$?M޾kUQ`l%ǒT?|M<~:Nϊ~<~` V{@fpD. gMT9o@^dry=yxDj& 8Z<%#hyΈSya K>. "r|0̞-iz@. w4 /l|yxb@^pq9 W!O[sEq91y8"w3 w" Ϛx\@t+ / y[y\@. P\@~xxs'`I F"r<ljWpq9I 3#<-\@^{@^tx` +"Y c+ sE,uG\yz<. [f5 G y`@~dLzcrַ ;K_g}g> E{.7[r9Y\xx,Y{q$x_6?ݟ1q\N^?v5 ȋBV@  KYç݉çַ `%KVwYyfwsء N?s .&7n]A璓MsYJN^?,\66յ19zuscrg)Yߙόƻv_z  ȫD"r;yJ<. g-Qַmr t}"od %+wf>f8m%ý.\HΏN$7Ќ˅槀9ly/\HSҭq]ڱ ,ZI?r•黋ɥ |r~t8Htk%8UG:Z{q$YT~wڋ#ɟXk7$˽ ;ɅjS[{(f@;}w1=@v@ x.;T7ϏNcg/͍+3YXs#wxb=<յ(6+'+Y{q$}3[{J@U_@g5 g rЫmj&9 Š W.Za1XL轛;KP*XǵαW겎},"+^Z:aG'2̀|lőwdJc] LʊsDxLrYJ JeV!/OrCI@>cַ 4 8sprHgiOYPv1}>J@|.bik/nY47\w sN[R9]U|Lw-3g=0?L}(B̀{9\@. Co ȁ<H]sҭDf3ˬ'.fF)G%KV+p g9~bu"b_KV,e^$8-gוYvn5=~̳yl|:ѫkg +wR*mȳZz|ősWגwSF1*2xLrRtv1soɊVH݅+śg^5fK@. g.]@ yt% v,\>oi!ht<>pF@>cלs)y\se<{TxL}&mi+5E IDAT^.zCWenKk/$+wJˣWR7.2tk%{e}g>jeV3?y+? W.g}gCMn31OMlʝZ{u ȋDryx\@Y@} DzV([@e8mS0vj@>SJ ^T}v=o ~>̍.NDiǢm,:N18kiHxY;g^+w1d' j4  O9y|3@} VNΏN߫HҶW:C9fmoS_t= [iѫkW/|j;nB^!̗^.o<7~8tu/^45iU;GCu |̕뚛mA;~rр< M@D& s@_)Z4k/]yYƮ9}VW-.Oۑp\'yWK tem΍F.^sC_` 74:iߋEy 䙫i[,0dk(yl{ѣdc^<} ȇ76'ik(l}<&O{>yI9 [;u%߶5OUH1ms黋-ZI v1Yyfߘ~ЪU% [M_6xu1f= O{˄ߡȶh'm͍+'z|]u/aFM<ۑ&VjWեյ{6B+w5%+w&>' ;|yMyY@~HBxŀm%Qؼ3ʾ<.5>NY '϶?enÏWo%Fm(i7cy/y}l;jНw`8u课_6kChˎEYiAVLE)v=y\rr!Y}BյD0 黋GD} ֕;Kטo EЪбP?䡨v}g{㕱gQ[s8}NW{mʳw1NO6Mahۺ-">*uר~.}`0w'?^\y|jD.  jxc3{p+ZS@$W>50^EȫB۷K؋~? OOj@vLTe/<<6ȳ-\<5X%t) _r9uiwk r򴹑Rb̅P8V"i+$Ez@ӾcuH nӮm,͍׵}(wWeȧm׻}CUeorUr!yrZꟿы_z{N y8w& O;5zT(z̾Uƪ6y5z.[;y]}{ȫ=Հ/_(Ln^t W.<^I QcKb*e] Ӯ_]X%kW^\ټkf= /}ayهssc.;Kmva.·تd){|_kiץ[+V_i"+ jK '"xȁS@> ͩOdTs/|pB"PD@nӉKv#no2w6+j|v= OY*t# K"c͓4utycő1-t] ӎkbHyP㱶wj^UcЃ=E}5yZx. !i7[ [՛wɏ~^YBi`mLno&ict{kjlC>"&_Wowy0L<$I p}}18m{C@>Yh>+.2bfJ"ѫkc ;YqbpޣW2cPYEW]] )+tΕ[i+mۄYȋ#jZZ&F(]Ҿ18-}7~?k_miCrg)phյx˅Թprrbww yeE+-N[̕щNmgU V]{qdjLgs%ŢwɴU+cpڷ7~g^xx,s]\xx,-i^KJ;WBJt*rI'-2\NJ޹z?>t][@ygpD.  T|w?)~˃ak+n͊vw?)Ʀ퀼Ht}1{Vl//mwW`ra}gcɳJڋ#ϵmgU B+Gf6Ǯx̭V[m;Y ?Uwc1^Y+Ƽ^V/^ߙv'0ywkgCawCMG}ȹ5-g=&Lg %KV WK/3=`an5zd՝ه|y3ͭśg ѫkCIڜ]R$ \giPؚD@>̗N:ǯ]L,j8Grb?{Tr!Xrg=q#@}=C:OXf]{Lۗ\y|jD}rai7Z6ۯ `X~lKs\>EH]s31EVcőZWuiUP?kUwȔypA [@>ϭ{N]xx,zZwB=F}3AtՀ<4Ggy׃qBw- ?[+2fWBϺg\{q6e=cDr!9}w4Ǟ{<·Ǟ=v?]=i獀/\@ޅ|" oX[qkZ;n>&m<ކp#^}鮲QHVRg<ݤ+/™:"YMΏ2S6 d_xx;d \e#f" 'mBheѢ[(,4D ӮKz5NVw- HƸOU.f>)T ɗnLN_xU:B&Y=mb9:VY?`26: Y'Vfl}V[m7 5ymX Kmo'K@N"?#YT*m8zu-9?:Q)Xq }F CMX e2B<㘦iL@>Yzm1hSizTY^\7fyׅ+'q\ nh:V@Hr(-Z\|dJAڋ#S#FWJYߑEQunhM\C~֗ x|  KWt^?~J<~Z:֍%V\T(z~]kn? ˘T@NUCJ+>•ҭ1ڋ#"79?ʼOـ<4+wJmCZsB_% h+Jjx\xx,V%=?:>m"{.x5Օm^\NN^?*5h^ߙ/+/<k ȧ씀|J@ӐWocɃOsEŊrlV@K3<ێϷ_wOUc߬@յAyސJ`159?ʼOـpHkhȳ黋ɟFW_rwPw /\煺ytk%9y\i*u;BJpoC]e5м=Np5"ry< 񸀜Hd`z~;*جuB&$=~V ~FW ȩ"Edǯ]Ln:84ʧ31^]t! ob "*1X3v5 Oެ}JV ^./M ȵ&oP8Ծ|Nk׽.NއWגśgRwkOeM#7e[yM5Y&v@ @ 3#r\@. g~lղ]WQ6zna C+ *QGZ+ 髓ϥ;169?ʼOZ1{Zi.ܣX|Ǘu\BV@r-Q|Ԡ՛w>U@>{'O@~}#Xy&>1V쳴j0S&ji_6,I;1ǫ|gwXWBw~ӅV>{϶zof9 O HnL VK=l`;z`F]e1յd}g~}\u48Ƽh+ ozBlмp\@. ̶{a`sڊ[[GQh;W(L ʱE0䡀l@^6l"3dcE:UGy GM\( ܬ|n9Z:5Mt! oƶk٬uihzV,u!4U ثwԈ\@h@ë7O[q< IR?~x/y>E+KZZ]0ŀ|!-Z}bc-HS@]O3VXۙge"+ϪYȋ3|r~t""ݶ c1^r90x4} V >m|GtW tFc}䡕˄3G'&~c%C+?=.y) _Ϳbl_(zZ`:Hf= }Xսz8~UՅ>c0tC;+=]wspD.  [q81ǯ]Lk i u&%UԽkS6V[m7N]w>ci)1'u/C.㲫vOvGsy_;!~㹾3_(Ϻ'ҽS i@);# 3k ȧrrxl? cX1Et= E1ǥ+ɃOslTQGDX*8YߙON]5x13[Gy㦴q(2i%L[y9xc1csHpCѫkRCR! o{/BcAeOǮH8mֱ iȼH;wc/sڼ):>.&Gqͺy:Ƹ*:&iBXߙ7VN;.oSy|P+[+ickҮyttީG|zӘe@r9ǽ_}O<~{UЪ@?~}iQ#ե֨qR@>^~<מ&[GƤk`|XAׇOɓg]@NU4ikUȧ]wXdº3\xx|{-<85N-dI[oLVF.YHnAxBMyarD Uc̛oICgNϭf?$7 x_YJBJ[Jom|Q:s UM]+OZYxŎs#Ucb*u]̍z;V@^Ux|nyb ȉ)f@^G<>w<=5jT[fLB9n<&s ȉ.F{iQm#Xߙe5*K*;6/Pَx;BQUSsg ʝ(alM;cǹeO쀭ˑmXg_xx𵽮wr{kwmotE|]@. @yV@~D@NdFK<~}=5u;6~=t5 ߻}޼KoLF ͟S@~B?$gJnTcPXT=_(zF!+zBns$FlvZߙ ^u̍j]3^]KV,ENX}3 / xLt?Tǯ]L?U9&??:{75 ~Ҽ]ߙOΏNT~ҭJ˅SEww擕;KצH@ <<+y89 /r@YO@ؼ:y\+Vhin9\uv5b|o}0H}=~bմ9g~,<\xx,?8щZrZxLspnW{5}s'?}wk3Y`}g>XrbԱ_HV,>`0ܘ;ɶ bpDH@cDD.  i8wZ ]֧UhO]@ݚb =8zuͽ`mWo޵Mr\@pk"  7Z.>֨m 1BK76'߾]mlw9Ԉ\@.  WoMϷ_]LZ ?ѣַ $Z@+" {q9@W R5z4'I ol_7n${v[.#r\@{$I߾'?MÍ\`< no&V{<m5rq9@ߍxnoۯ߾?ç݉%l}#ry[@̈P@^/co{?Zy2Lrbqn 7~oߓ[ַ N@. ?`z.Wpk+Vt؃Oѣַp9#r\@ɃOWo%>vWo%[Gq`r93B@. ڀ~ #\@. o- Nj)*gFEE"B@. 8\\@. r rfF@ަ< r+ r\@@gyxD@~S@@yEԈ\@. oz@^xq9 N=vqmrv2<-"& r9Aray|ەm&(D@|""I@iqKgx4:oq4i# `@9" %DG;nտ1r|{rc??L[hŵmW?f9#r\@>gTd`4Ƿ]ٛ ?\\@.  ȹ춎GGֿAr\@Gg=KON9d &-mo{rۏ? yƈ\@. Ax<흧y%  huvO(!& 37kɕۏGmwϲo[@ S"NeV șۏFy ȧFrY@k yDArh\@ր<#   ǖ.{vqmrە:Ԉ< gOy[? mW&ŵ:L@޶< s5񸀜: ·nI׈kA@7" tR|4 _?o{6:N@. 7" pȩr4 жmo? \@>߀|r"> O@Ngm< ,ُl!0lo?f5&k憹anƤycz57 s07Ƥycz57 s07Ƥycz57 s07Ƥycz57 s07Ƥycz57 s07Ƥycz57 s#fyyΈ7Ijn憹anT57Ijn憹anT57Ijn憹anT57Ijn憹anT57Ijn憹anT57IjnF޹̜Ԉ\@. SYW}^'h-憹an1iޘ^ s07̍1iޘ^ s07̍1iޘ^ s07̍1iޘ^ s07̍1iޘ^ s07̍1iޘ^ s;7 r@Gr9#rrrfm<.=o~0mKh@> 93' '(|([?\"[r;r\@N,^|\"r\@q+{Zx䶽.\@ކl;mF=I@)" rot4 8ou<.\@. ŵ a\Yًo?흧\2r\@a+{Qxlۏ&m pr9mO=vKH@.  !ll4 {趛/re  a\(w p ry7Lr"r\@. Ar r:B@. * r\@. ob@r 3Fr\@@r9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@Mkɕۏ+ɕn?J,ʝm׿Rr\@'ŵk۶%(0)f4rdp+{ݳTq;gq48yR՜L;18-} U  ײ8`*\@. WN[z<8E@>TeD%.b" (u|1_4mpNV{r?{olaTr\@,6^ǐU, _?A(?-""m'XiM>T`q-gcm{=ӎ?/\;KpZ|cG# rY?BcۮMeWžX'f]?]di0 EWyeZH1GPh?VYݳ|Y6 seX@9r9s1| ߱m7&#Һ?*˱lL vCħY W)/e@/Ϊ<|-f0>(x `*\@. bg g祪|a)]!ŵx( WV ԎYV4|M]پ|M{øy,blr@@.  !PmhdP' ÕCQsQU@4{y:g=Y# ߬sh@ۗ,c TB@.  !(yuH(n{: 8 _ѕC10 eV;2 _+V+R# =!g CG(3rێ%Bm2tH|~7b4U6y# _X pQ<6?Iӽa IDATpr9Z\iƃmm> C6xyy -T+ tϲR{<4&>pr9EP='MȳY"󬚲yhϕɇ8d 䡕w?pr9g?'EP]4(EmŸWde*2!8=y3 99:J@.  a<9)ooe/,'ߣ6*2!;͌ Cq;o@F:F 3\@. Qh@Z5a2}Uqz8AmT/ bP6C{}΀|ai9y*s r9dvcsh+l7Ey,=^;si{䏬 ǃ"Qu(rEu9}ހ<uwrmWMQU@]$&mߧgǂ`XDg3-(8yǺ= o@qއ& rn<:o;tZ|tUع?fds3U0$m4p|xiQ~[Y% pހ<+0A@.  !Pw lb:hzeo2wpq38mX\r/<0ː 5{ YR r9dܟCc!go;Jm ȫP$"^\ ״s]U@{6XyqQ*,oMn۞nyy\@. CFplJuV߬+N]E@s:OeVOј<Ȫ)yZr\@ٌim2 `L< P0,?_\ce/AY}[?vOyXu 2r\@ٌGigGUǸV& 9w++{O}:r\@.  (n ] {ﺏ=X@^d0Y#oeټEgWkU K &><  \@. CVgѤ$p*y؃ V?69 rOӤ<_W%*euH 󫜟M &_{ހ|?c@nr\@i"ݪ+yet=\; Uqp46oy1]Y^@ r9ȧiJ@q4۱V靧e { C??J@.  !x{vx)>@u>y@(8N_v |ZW{lrH%  nt48ouAP&՝˼DU KUX|>v5Ԁ<4[ϧlJ@.  !.Bt, UŷukB@ˆG7gC+`?aqM;y49 |(2bJU\@. Cx`sv|:VJ+ǎ+mbT`/ b}{MchZ" rWN[ExxtUct/˿w(NYEV!Y«W=Mc^U@|<@nr\@aUVMx? g!{1mg;Oë獔{ۃ&/ϯbLbXa4M̱ۗ${p;mUyxVR r9me6CA׽U3 m(XW/[|Vv<t% =LL==RT5rW{UuUתy*#*b"vNiݶ|a) wfu$pI r9L J YײmVg@ o1UC,򼫐/ q0yܜR@bxy6"!|5\@. Y\\Urhߛ/d?A)geo` <8  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr9!  t\@. r\@@Gr94ϓ|~{a{pbϵe`bL$IV7Ծou\y:o?vhrs~`Vג+wEwN'Qgu?L1O& \@. Fv9$Iu{apL\@/HmoF\Fƛޝ~frqm䵍7k?O0S=~0{㬄†XpSֻF- F~4ou͉;OŕMux.鯏okH@]K+#bAvoJ䭏~zaf[:~K[:WU>\}7[y?ϫWkoT17Gi/'?0Og}8D=]ɕC4׼Ww~.t.e'8a[#4Uu~g82Gs0:9Duﯹ1S\\%ks>e߷~U9_z_GPWWۤʀ{y~\܇?yeJr 0}qmr6:=nhr@>>ed v34-B@vmץa2<-~>)󻶋c?-5-VBD޶eg\Ysx/ڴhulG˛$I'/ 90Cr\@& np Y4% jƛQ߿55~˗_V} )W{7Fp䱈/_J~kq|+r (!;/ edfV{8=hjiKg }y?yx{ٌi>Hu닲M W(l[ ۊM߷Վoh45 EEC9iO*+{s9k%5\]ߗO>)k lo;6ܗ7I2?90F@.  ȡ ! W~~Zx(WU*jܟ~xv7@>kѤ<6CmZ1i"Pyqjz@4B7,&&D8eYF\(&^7/ _X sZ8gՔ`.|ᾼI& fH@.  ȡ ! 6:g?̪EzpE]sʁi+J† Y# KȣmQWhŕkژ ȳWqnPw$<Gc"sc;rh71 ͱ0ܗ~/}p_$v3$  [o^rɓgG~{Ⱦ={w/ s`y:-yl< )HxvN 844Ց/싫P71 =`}ʣ)kuj}y4) m>61\O;a`1~O>Y#  0Uo^x䫯Oy" ~䫯OJ/Sǟ~N_i&_}}zN?!y?} ϴg?$>/u^&O&3~xW2C#iY]Ç|q\^|]87~{BiyY*،ˬǕ?q>ޟXQoJ~?>:=]@ W[?o;dWڬbXԖUAc?ʜQlQ˝i|_/~FUǓ\+"r>.^/,]ZŵA?}{6=PEDZ0w-z@Abu͍ŵ5Āy% fH@.  !ރs}7~Wx鴀Ǚ$Eٴ||C%ps7U$ҽ7a2塟+2r_$Eq]YueRk8sZ@̐\@. CT9*@ޗ" ȳzϥ#(~t_C1eW )y:?|j%s0.=Z玿f1^ԫo|p=s󭹞>>Wku by  _ߦ-_lEY# O, l^@zF^Xm c5HmC@>-*jYl4]o\| p͵yn??Y58bg?o?l7"[l5%me߲ysǟ~PК'ŎϑW86eVh^|<_eHګuZ@~2?$_D>W[ɴ﮼allbs>Zt玿i9z_[|i?ƛjO\ƥ@d&E۴"hh æg m ȧYmXu1˘75 kmC:-bC+Bas9 ]CaCPצPscZM cw\FSc WHڇ^EGUdy{=B yF\@. O'Fϫq?k,_'{?[]ǟ~L̴ǟ~N>}<{>0."3;{htcQlڹ4y㯬`\\k՞W7$|zU}woy IDATrQto^a4&Uǎ}(4_<;sCE[kf}Ʈ$ w7~=GF6ľ ?8u_&}?kҾ#fc. ׭^.vm܇w|):]@d&mW?Y†Wj?˘P0\];Ҥ<66;Y\,aKc׋;?'zi}>5@N |<>x,fݏM3pV>wF+i,߃G{TjU1EUylGFow|)7_M~[Rf*TY\m "wXSVe+/߻hp6=$wVm r* yǴ/]W]:~;|^-yeopa2Ϋ{j}ykO~Yz M2̃.buc<BwYEkZr9\hڬe,Z̺R~2|,˻:s(VNb]^ߟ0ӰYGx5tJ~4) Bp|9|?"h븚y&G@^Zx̊\+E4wBCb0ɿR?]B@.  aDHʲrv( <{9CwU+^ 'H ,a5q*#*7~W}/[@^bg}XDU$<ֿ?F1|Rx7g݇*B+v!90r?{ ZU UʸΕ-ÁmV.[@ *BV(,Usy~m|PJh< M :}/ g=K٤|Gx_VwM2<w,=U`(}TE; \@. " /3K4 'F;^1i%qq(XzeP5^/;VC@g?LնC Ͽ"ZvJEU*W\/m]}wy?ڏ_VrsRA[tKvh UvQFpYϫ]sZ|2h|b|}*×y6;W͢[<\ :tl]Y7~yr_Ѵv>̨rEM/oys_v\C>me5tB]4LZr9䲺 9y'3L@^&f-u]y9t^YW$.0T6Xi ǟ~[5q8מ<;L>8Ǜ% fxvu\B:wߏ?pUW6ޜ>^~#[(&˗JGWAoo}6_ķʪ 3/*BAP'|VBcՀ|>V%sW,,W4*VeZ)6?quAб~we籎d}< |~l۽i{ۃ/[/ܗ7<Y|M;q/t lxeB@.  a{σnW]yp:" uz{>,eyBgY9r-{f9N?X]% ϧD\.:_C"vـB8ɳZOU+W<޻ L^|~[ o}ro1xH硪&2Gw$/+>OU"ϬWHhU:Uٶ< ȋ8<'Gɟ+󠄶z:6ys#toEkwG"6ޗ/ C ſ/oY;OyB:2Biġ]dyi@-rRn>4,qpL(~+pBY;W9:쇩?'?7_VsK@OI$ g0Iͣ?eVs=QyiBv-o7+s?ko$7_Mӎ ʧE\hV ۵?Cgq-ݗ!-Z"(7xx9,RV5a->OZO,+B.;AtDZ'YNiJ@w R-!` "rF"$<l4 "ȁ<)XB R &Q,D># an~6}fvk|۝yf|=P?Dn\]W(OWU5/o*$2o0IҜ쀼K@.  !C,"yCh8ش>IzD,ARlzfU~^=D ȳ=GGu?xRڝ/}i$6_G>nݽ7| Ky6UEm)zv'wHnPlMiQ4?FϞ'b#Okێ"6"+dZ .k lW4UqJѕ0wR@^v& 9yZf4 Ń |hytfUйƀ|n>|-UȻ8/[zyy˗t]M?`G r ŕQ4I{LU$:# OߺT =u>lW8o޾O7~UIBI 4* ȳ" im)z<_Xnݽ=~|c"*MiQ4 sD{Z3Z2 5~ۯ'nuA_xsEN Vmi^=q9 /y"  +?wQYΑRh1^Z} rC?[ ȴ\:/+uoG6/iN|yo;\@. ØPE+:'); /Rt(K-|ozdWV26s{Kͫoe>( ȋ?w\@^C´㶬WU@>`]]]~ĠyIc#oh|i-yٛ?77?sIyt= W6?;VE]wWyJ4\}}b^&MuyĜ;ۮ r9 tju \$ / 'Ci߼}_xvglBqih|WVy s=_hȳ ݤ5 G-._O6MiQV=Wi}6x@_ۯP%.()+f/eiDq/w§*bi 㮅iO@}υV \Wu= 2:f.7ϔvZty^ކ[[T^i _=:K@.  ãO""`he"y=R=*华V'κZt`h?uHxڕT E_U%q|uN ݈cCϦ([wkYcGyZrsP#K@"U&5&%Ew.yWESVye}Z9:OD,:1;lؿ!AUQo(EΕWs_yv͖=֬B. Z-%Ebmz+ U ?N^|򸘡IE\׀P:My+V.3<~= |WU`7]#v HϞ <_;a_U~yyYy5^ʜGgVqkW? r9)3 %: [$܎[9_̼_& =+Ň@ii(9y+YVr{7G:kyVf@~CY>ێkjߎvbTiuζ<~gLZ!7n5J+; ž;-z΀|T9#.TNEV $6EUyC7`}[ DžY>k! {|Yu$t 臮~o~i'Dѡ$5'4˼ֶM[F[C8yyܬb^&u1;U׺oEV:t\@. ØPX6TZ5w֤uę~S?Ǥpתiț^-C(ҎA5[w0g]9$>s*FS բau7Pjq#=&( Eϑ#)6_G˴ ˱ЦQE|W!(Y4k=s,6>[W ?/\,Zݼ M~@k/^4.a*BS/YQ64ng"q`ƅeX4 ".6<|-%GYhz]s'(7V˼Eyf $*Y"' '^|Jw`]|9Nh+{͢ U\ĭ[g}47JSp>.^]ϓn R4D56Wf@>݋Oͻ'&Ӵt[qese6㒴siE]k奍W7VDףڝ2ү> GcoKϋzaD ½u^0:/,x(-# Oڶ؆5icfTaysQ487m;zhuNpl>~X9nW]~*nmI燏y6vlm˺/B<|ً/kc7tk"P" sDtLDž_f>>6DQ?v?}63 3KFD~ q; (ZgIA(^hzP➯$)@|0~;ϯ"[*~eq%znoߥQ}{ic{8|e5$oĔE\ri#<~ӳCʕwsak97?ń",q*E9~w"I+8L7U݀bT8keUvU)z Ks.}L/5\ 6芷F~UAۤՔ=>֖yyҼ`&php.L˼- gO%ÛAn X7]o)8ٛcnx#7r1[zXC@D@.  !`rwpżAj(Xu^FmʳphFiEW ='IagGU+ eSyKQƱI1GU^kISIq[tȋM[w'BIvq9vÃO'Uxy[׉[>ozPmW@.LUYW!=GY|"?ݹGr?v! 5Kѣ?[GTT$=wl RAF]|RMrvmB'snU_yU>Ӹo|v! _0gZ64f&* m'm[U[ܪPc#6Y?Oۢ-"s̤s6K<>{jmPw@>{j/xT$ovQJr\@g/^F׷=OhE4Aj(XQ曷3F׹ѫשV^O#hjWY~t#Z]SZ}jj_3SYór\ <6Uy3<|=*[{YEkn8Q5 wf_o_8&?/{XY4:PL~h:ބE@#B1BφV.B, U^<)f)h+]ڨK_/ zgo#FWu{t;F.v3"cQt?d}Kh{՜ίǿNj542.L̺BnckXRV*׳wUF:e!O >NJλV 4Цy`vIre<}Mk" bײ{f8w͕lGyso|0:/o%r\@,._<|y>zIbط1ebѭjYmzFW3~eܫO^1u^Hًѯ*5ݖИ[ puu-8^Fy³9+O Wri`݉<|*#/,%G> Ϗ2y,._=~11z ɅsD?拉̱wf/0>ȍҧEtё/0:nk3'>k6euζk؃5~ z+ϻ?nY.?s{׽\n/9⶯in~;^F"s|4*եa5)h)Exg`;꛴_oi0C>g~waQe]o{K~eM&w|3u}}c<.yϯ7 /?Gmyx/99ʻnr~18- ϙꚓocKWy6t{\gtϑ@r2;GUG:VAt5O_/mNBH[_uǏgn"d1:/0r\@@A{r7  mO&`g r X\>zƷ ؙrGo޾r\ڈvի"  ?h| Dt\@. ڝ`<~o| Dt\@. /_7]frLVϳ6 r9zhqz0J@.  \@. #r r:B@.  \@. #r r:B@.  \@. #r r:B@.  \@. #r r:B@.  \@. #r r:B@.  \@. #rto޾Fk|/0ڦm9rc=ў'G0MB'>+?ʞhO]?D]|ٕw?{~mGE/?V5&K.rt/. -ya3ǢO.|@t̿}@ T2 5Fp[j~ ₓPm7: ϲnn~p>ܘ8{s|u f|Wَ틾c>vDLɅC?Go޾X\^\\> o޾"<{6Ss#tm`FI^"~{|<ϳX]1(|ݥtPшb\` 7E2yŸ[寷TNze3FY}ȫݗe" f Icg/]>sQw/19˚^Mϼ:/%Zy7خyyotu:M@rtrD@>Y¾ј}_$ f?Ə_{EX{]]3 6_7~ # B~tmjrI_|^/"Or9{3ʆucV>~q7xcykHixd' 'ɹێ9\+Oؘt,{>Z$RnRWe&\s1 i' *$  {XpunG<OtW㓢/_bvG{Nh|'cM4jvLJufOEGn{V!76O@@eN9 s?;ͫΞJ79 F M"]W6ghR\Ӆ|Ug ]Avv! 'I.Iʻ>[b.D66lo;:Js͝ƹhW&G[״&vy^&:S r9t|þHoTz?DĮ&̱ھؘUۤJը+ {Xe烱~r*s~}Ҭ_7'Cy(I^Ӛ϶n"]=> R|zygR*c?\|28Ȳm?Dy#J@TH@.  5V?ݡJ_sk8B:ԵU wZi ufOEUw(9]7ii#S0"sUi?.m*n*C\',O@<yBRY;. Os9{3ykTf4Hh 1+^o6@lK@>{*yi3¶A-k@yw4ik@>e $^/m *go24+Yι|c]cczyi9d8sA~ѹlo)g4ۤ>~r`\@. @ 'k* ŇGUEsD0US< t_{>Go޾ێ w͞?]ٍ P+_^>R7 6hS@wҾ|TxUϛ?ie^l\y7 ui|  r9t|¾k^wf$wq/._oJJuGn{26:N@@%FWLZQ264eHI- =<- xf5 kSѮOGvuWv#:\=FH_W5ykՖyysqx4 6O79P!\@. Gkw_ov'Z\^[/FǶcqz/ֺOյmquu`|յ;QamzɚB+y}wi,}Zx{wZi:19beuR9alJ I1hѕP/mƀsMK<7_<"|`}{?goN}rvѴq+fY\@NQMGu{CCuko]ySMoSmպo5-6iS@[ֹ[ Qg|U?90B@.  !յ;ѳ/♸ǫѯbW'nó/յ;^o4\]q=~QvIhEФG١Wh%ш+x}SDžqmg>OUyi";ݡ/i#77M{_ٶ:zk" }|] }ٕ6mƀ<.pUA㶿}lEI(p4[_e_[:i gOʻviZ0.Z,<.M9~Lؘ?m մ\/2/oõ-62̪9KoiR}h>0nJVcN[+k\@. C*TPv_Zro˴^Ċmcxt#:7_)_[P@=tC&¾]qkj|w(x1 5{*xӏoq~Nv%=|m& 66G@@fUV 5*^Ϟ^igOKDu!y+C ~vӅ:qVeT7Myܵ0 ëBq Wmێ:W>/S`L{N|w(v9UCt^1QJӓc}}ї?뾦|;}l6qNӊ;<MW ^c(35 [Uq55H W5><h=| z }lˡxmyM,h˼+^A9ȷc/Cjzߦ_X=Ui=ƀ 9xoޢ<@?wJݎ&W\4]ehIZQݩ"I+qM C06y;LJx41DǬUǭ,&$:b׈2W%HDž-4ۤVڹhS82;!VJڕ'\ޕ98\@. XUxD5m<ƭb6N uFK{`%dMYIh\UO='OL\E09Ny(-;~.K\6 MGC9V۸f>|ߺ{ocQgD܍%I+nQ;qlZ0gC+|MS6e*q_~*lJRu|^|2W1z@ 3l?"~3}Zv% O3Ҭ"״]G/>y"1.{Ic;4 \WSuMZJx7 VneզyyϵKp]yyVq=q<B;I=";2I:׺4B@.  !V$eס6D/ P\/6~m䏟f*MOU뎩ț^q=:gE>rczk3|Խmjyx2&И `X%){Ɋ*sX([&`Rric/N ¹E&^c0qײ4) O[y>C4iu=N;CqiW*j⽆?IQG@zeϲ:i^&1NYmI]y&DywiY)҄:{/]L!  < 'ƅy%=ݺ;e_k؉ ȯezkc1- ȧҧѱ>7 ?`Z*yU,}\9?}T[@p['צN]y牻QATg@Ʌςqk`po9?j~ :ڂ|n)n2_cfb[G@^טIcv+\T]L\Rĥ\y|p`EN CAEUC4q+ ʊsyvV>B!WcDۡ뒀:ӄm ȇ|8//wixm뼼MC+nI7<(5%nN|;s>Fr9Z] ksx9E#PtvgƞƏw >z4N9y":hwp"!w܊՚ߊCZ!t3'PМ$!yu9֥|' F,EsMo++T92%sWKc]+b^7|O3h[@ՅߧfFmc*i1_mۼMCq UV.^C/i1NL!  _ o޾nݽ+}cqz6ANXZ@ӥ΀ھhfk}HXvnS_>飱}Ovܺ;hgώee;U烰oC,N Wh%)(z̺^ Ifw̞_ѼXe;3*Rlsw] [+u::I{:8Agz1|4{K'E[mRG@^ŵ(6qĺ_X;3 h\@. CӍ{Qqڝhqznտ yW އMj* Os,CB!ԩ΀v* j;B/h]_etC4xvҗܿq.mKϓYW彟WHhUڿe9my\ ' +ri :͏NM[͇7k4E8/?_PqHH55/okѹۃ+4?O/Γx/"4NwB㶋i@#rg/^ًFܯWHju( /|^#hzB{Nn3*[W>ݡ.#j'4]v@z@St^Kq+Vڗ5NA ~x>,-ktھZBߴؿm C+MFh2>C+ ȍ +VJZ9,nayzE+(( yvR@ ӎϪO_v2{j:kU+yu¤1 )]ӆy cl^V)mȳ&um^7r:yy˗4NC盀h)\@. VɟxS| _XתL5 țL۰m{N|w(:C߮?D͔y+7Ǯo޾4(ír#& 5s+*EWEXJ;) /;NINx*F\zoc@>7O*]ǭ yQռMK.f r9d_Xnݽ=~\m1%"O7y=BGjݶ":rcpc}PIA{WJ{cQ3suz@.Aiǿ1 7uLRvT1/oyėg r9v׏EkbPaMGy6z)K'iS+[oD~C>f>m|_5!47hbOѕCcH@ 8FW튾Ccm_YV u,F~/?Iy\iȋ>h_oNyCK{n >Kͻy( 8x(꼣jUSB][6i* }Γ&\e)tve4N@.  ȡt^qs[e{/,7~" =ڀ|'>Sk=s,:rc{R펎}:{|#7~α#7oz`ltg ۯP%.()+f/eiDq/w§*bi 㮅iO@}υV \Wu= 2:f.ܔ:N@^Xk.p}kK]+B[ 6#@g r9T'5mzԽPyVW7鶕?FBW[O(_':hco{B6_׾ϠI̕9X@ձ6HltɮBM(3 }>nuѝy,Fep) "X\Peky+]g}6JCUg} E{Nh|j5{uN/?;z\;s,}X@~F^c:+%Eb+CW~ q1CYϓ&9{y@uWd ]fH5-yseYZ@lF0kNISk'쫪߯V /2?W8:{u^˺86gq9/k  qQ]ّM(iVu䳧qr("j븈;oHF,o\qZ2gyT(nVӕ|ؖNC@SBmxиi7i:- q98?|ycKenoelic@tV9Oj>m˼mL":/6.{_q$>{sGgz#7${Nı>qscqzP,)X OX˪ڲa F,₯AٛYѣB1J0nɴQDsRQveSs$/3m{@Ve䓅VDnX3-72j˼`[xOEiIyǍg#6\ rBEa9m\]]K(<,Dյ;ѭ<_X-EK[VxǍϲ?hzm;}]еt m 'mEscazJ>gCC7Ly}=s,?T7_:)o06JL)4\GWSen>[\9i @EJ[V;cD\(o]P*.Ȯ*0(F͇Wκq1_ڐ/Ǻz2_#.<؊Ce+ qO'A4AphV q4ho)|+\;M]/m E2#iا[噗f{<0yy]pdn~0ΗsϝfŭȞ6OK@gr9Fӯ6_Go޾ϼ+ϳ_\mi㤀1zC<};BsGq!ѵ}ׄO.|W&.$quH|vx,/KخPeTӰhxq BHi\PjE,bϓRr%W%?|r<>_k\1Vqm1dT?$t/?{iI+>ٛ}vIrS845&ĭ볾H8tcQ~/I7)Ayk$e߽$ۼkn0M7h˼|t;l,s,siE]k奍W7)"vh_,-_\-XӨ_}>E׃ܬ@@δKZ8|lV,Y41lj*z}eU*3u4 V4?Xȍҧ'>>Yt7U䇾?0zGn76JI&u]"ni"_6O BB5U*UW=w{<<>"ΤU6/> QK߾Kţp!kHވ)Fxd gO%+sn~< E.YUzH+]&\uHylHkXsd|ׯJqEWs:6&"  o r&ݨQ~h0Z3ą?Ds9|gZmQg@>{* "tc/JW ^17 eUܘt~=|B! J"  kҪY>ɽ-{Ĉ拉'9|m&:ր\<d[%HC <1~ǞF|iX|lJӽbZiϗ7"?/5U{k :6B&]1G%|BkҗGQY UDZm'D*nߦ^ok(y3<69 ymc&YS5/oS}U%Y]ވ|xV ruuu-zt#ߤ} IDAT|]]]+u߼}=x$ve卜/3#9ԫ|WJ3ib7_4~O%j|B7)5Ybյ;o#nrpCWGnoUȏAƏEZ$#ٛ?[tXUL*佥h+]ڨK_/ zgo#FWuyٛv^]!g07Yy7E^~6ط9/_6mWq>=:V܅9Xyʻ4/.>)v\ly4˛D@>Ůebqv+]\^`t.^J#rRY\r?zt#z:6_g/,GOϳh)) 5;Xrվeѭy61&Oi2 ^<\E i3bWn[ϒ?sW?8D_cr˟?}@xt|ǞN":|m&=#7}S4bJe忹AA@si#>1ݮ?^:{s;m_! v֥bEVnhTtyK_kRR$VIʻv== [6U<,moip^ׯlD[?W_~s\|Rk}ly\_o^_~>oNۢ^sCswݰzcpZM3[5':ƾ.&m4ùWù#Z r9/F_Xnt{۶yR@M'I w͆W!{X#bk{f?>M{Xttm߿pǃO>Xi:t#2WnJmY}`h4o@F#4 0-^(|u7Dbt^arH!K@0mC5TV>׺xf m\}`htuum r9貦]㫐;sDZizoGh.>YW76X\m|6@rHA@tY='OD 9QEo޾}_m ʻ=6]*d?;Uoi᥍hו񿣶Lػ8OK\tYP<>inatb:$0<]^Ń|s#`i0nwDuCc["wFf ^rUf'##KK@a N^]?t޷ 49コnd'oc[`8yCpyvcqw=Y7}ARgۜb;md7v9 4Nlg'O{][?dQ_߇ο8;od쾷{{y }N/fvlB'oN{«j<<ț;>4jVD>O/gc!$2^;?m>LۯAqY}r}}1x)>sb5[g,9];v30yu"ϣO;ַ}ܳme7#>8WcUʜ?M4a߳R 9@!ϒl u_e?``\e߻rգOoE' {7 AHރʺv #@>>C L/ u,no~Uצ{i<0n6-R}UǢM]G M&>=۝ϑ<>Sٕ랻49@'@qO~J*-@3O-[\1,obcS mrQVijsͺ:桕bx&CUׯA\M={=ȳl2{hV0l_㟻/l6Fnr.5 z,>|"{Ǥcjrofc=n tN\\\q_}_   |_Y?W 4ls.:9y_wݪC] ~s<<]^y>Pyӽ*t.[\Ow_޿*|U'TVu_껽GИz,cg6։+ŎG>Uo:ʯٵ?^5ty)u7ZTApܳc:oq_xzؖ GCr  4?οE#@РIy.W}*:9yy~|X;|ySEU"*!6]}0v[H? Nu^/v}zMƫ<ac'޷[H".OឭN;>-WT}hkr|(@9rrrrC䐦y8~߳Kn_?0r-Nz88yhCNM%@~l|,D>ɽՊ뮌v,86 7۾CQk2@n*P6{x>g=<ŝa& K͋[\(pagFPq];ˁؘkbhA!BD[^}Rg UW2Td tN\\\9WOEA3R<sUVK(șeSXl*)r= _?Pk+6U;@o=8Ԯw_RT[ǎb>{Pig|1lM9@ ð heI}oNM-@~vs>P:ȫ _OmȚCc+ RuuL543.}@6zO횸6֡qϳC Rg =Y6f|1lM9@ȡ'ϿN^f'Oy??'?eޏ|;_^۾ޓVI*ǤkV\usT])ż-:&E]67H9@]:_=.d12IE'Ǧ :R[A]a(n ؙcrE>b 엚Ccqyǐ` @^i& Rg|^R&}&:M-t[?&trdV]>X}woNo?r CP(;y}}gA?/nÍ[ŗܜlg'O߾n_hOه wnNFkw,_n/Fm}N^^k+id;{,|e}|ӯ*Ǩ̫@{ Jphq%ݓ{'i}cS ¹ϲ$]oG(Ѵ:Ǥ~ՙEvѧ|x~;ڟ2Ǻ Esrcb<*ӇC09&BeOsKQuZ =c5ɶ]o~u;{s5.Miܽ| /2moG|?X~U9@!('ϿTϿ }}V+0= _OWCqs]*Lz}j)ȫ7RemP$:$O~|wT{6 fmo0,MfBcB PB}[=)UE')@> ﺆmN1<fYtۺ\a/}O1@~vOa_"YF+"4 _VY-vsjGo,@WO6ֱͪ=[hQ_ROc?`{?8Zuc"R }QoG7v?m{ tN\\\Bӟ/d1Ϗ+xUBī. _}&Mh{nNsՋz"!])@~4yXu] b|U@+χ-{j#Ѕ2Q-ȇW} 9@E䡕LN?fu aw̅?xqc/5on&.uj<Q^c(X)v]{PvM{7sɶj]l1޻۩)/^'D;Ȼ"/_jtN\\\B~ c+)_eW"{Yvxrepq08&j|zx0|,w__;1{zx]=ڶV (C!/d{NK#d{8C O1ot?wXܦϢWz }FS/oَPݞ6F_F_Y:rȋ))c?E&VォWYY[Ƅ&W.趤 ͣOؙO츆xmA~=<׻/+4,cj #C'←ygH+Ɩ!@>ʴ5ͻolb|(@9rrrrZWW{ &W=<~Y)4[j07 >wJCA":./Pw__}/{A,ZخZyh1-R7'ǿ2+$VeV38JEV.ﻦ(L\\\e`m\(P^(W%t}V8@>}J!f*Y;@^nN9(ϿblU2X}~䁛` CjLۆϙu 67KB'O/ †6>%Mb֡&_gE'~fcV?+Mޯ?mXAߺCwΏi܅6EW<Z*ԗWCm<c8 Vٍ]0:z[qydvW<>" krϖwqj*c"D ~{jQ~Lx|.x{ر( εk !(/@>/YM]ޓm{ mjӘ>e7n~=gB6µY6yXV \BOkFq^Y:$I67+kTc(@мŕ&.N-#nPlc'Wջu;iLAҹǕvp߾? ~֐M>,gjJ P7(y^]}5R 4oqRIA.zbAjzWWՋotp޻V[y(QeXdhPjM~Vʚ ,j#l:W~f~C+Ֆ;BQf! _u䱚h%]]C}ӪvX&@컇u}Z}xU<8>*Tb* et1U5,򰃦=qfm/w.؉o5@a K?Vm{Ewpn,@^veڥ0*}ț8E?'"Ͳ7nRw IDATWVJ p6 M"|vx!c+U] p~BL!^oC}x#c|Uh-@ }f-j;@>9X ϋ\Tk5E^0X=ۭfU=4}wMP9qUCߡտ\GźbA*6 z nǿnm ~^p~]#-@zmto0| =)>7X?tM_&1`+ ԙ,^ or}U~^,8Jh)@>b] i܌(zM,Sm]Mz, z4{>ͮM>h+{Y ?4ޱFXp-:oՃB]5Lo|0xꪡu@iǟ"o߯xo>_| ˯u z ҿ{IMh*m^5LV@}F[|zՆtKa+޵LXWM}=`26U5Ԋ ߜePE )@ݺ_|>S|Û_j\YQ4 Ɇ>S E}!FDY=,[%L>gEUݺϻ_j랳M/߿{ֱ3 Yeڡ~Yp5󪯦MV>wv4SyW*}VG-0yxvyzx\6 }^ѕס= =8b˻M|} S[oT;rXזm=9mce!V:ʿcɇ㭒6M>hah9 W^}|˄ȯ~>muuu V  oͫ_gzՆtKiV MW:Aix}Al_y(Ygu>fZE}hfh (-r>lUИrZ=NNEj:m}E1Nھg+S_{9    TO!q4{zx?)W(p8>~{b߾g{OZٮu [cQ3ڞFWm.u9@ ]NMa BuWEX lH5@tQLMR Eem=8[>.w_wOߏ.Pb-t |Ү65W%H51%$\c!>mݳ[~l}h bdr%@.@.@.@A)oN߾CzVz¹)|'`P>j+D.@^mR:^Cy O6Bڰv곶[; XlVmKb\yh:ȗwiJ5@ {6uB΋AQW1 Mcy^NޅձjcUࡵu.}=[Y_|_c|0hBe0vx69@kÓק+/4)M_V\<km^}an%@TP,bڣO_i~:c៪ =@^Cwl+-1y=!hBaP?6[ 8ŇVč=Ph(++S]uy|n't6٪S鷍qh k_MX0rrrr  >~Y~M߼}_}NSܡȯlgoߟE~UC1 :a+ښFEQyB}Gr̺S v_kN<}MbA/>5@Dy0ZۡpK򡬂YgS Ǯ)+v N2Qf+N/ßF˸3kuSmք`х6٪H%ݖqA&}X2y0ErP95 /Kjd;? *_ֺCPuE'h<uGe׆y/r'kwq:ڶ&b@Oc W]Y>tPtHP96TjW]ˬT>VL13 ZT[oW!MMcțoǪM7oG+}9@e W M^Vgʏw1@;OކyX!v,nN+}^aUk-_F՘ƺȩOVJHwO߇h2( WW)T~|UЇ ozEu j}V>}PX:' E|4/r|4߄E wcRG=c} CP,o?+ZfἷςW 4S^ҿr|j7'_9[A Y=ƭaȿ~6!@N1@~s>>_|ǹYZ"4M 9ƢX(Ϋ4< ߺL}ĂEMM|xO/U:}fP>4gis_ TWϟg?7c$@^b]6l{1zHuPd[}<{*B1=ȦEFx]h_~8BiwCA    XȸJp*}NUe~,~ o2,ACa֯߾6 ૴v`~,@}š}9ڻsk]jCmSd;߾ òzQ^`qq2:tP,^UCثfu?3O(Z$}U( Qsb5Uv~֛8=Ucoګ k#eemJ3 B|탳~Vm[,Y acoΑynz9nvmjȋ =Y6-4ֱu=[YP.PDнcףPmw05o3_`!(/Zf:aU{}z7< & h\)z^ phZ>{Oj,J,cm[e%6tc'r^c:G'sk@r}d:x(:v[߳~˼^Mk\}Rm]uT7w]XyT=Cl{g`!(/@Kchu,+ ?wXZev0(Zt2BS5R4U+Uߜl멏jBp$x#u/4rBǩP_d5 t _uȲrMhϼߋu%붴*rڜ'O/Qb:[FV [溫5}w5PDZR{!}7vfA؃ Uױ&* Uc mU6OmE:w&vnk |{7ZUV!OmwVM)GMj|Ǔgh6+R*u9ȋb!UڹoNbd1{oby+]]_O[߾7])A'ʲY嵶lg?ZR<.YV{=eC^<ˊcBQVmjS rJ}&YքVOM| xLfY[AD!8ѧ٤!1m; R7@\F,lS89?ˊOo#,\;o@^ir0<}{9bm/f[ůn5@uhЪCfa Y_Zu]c-j՘슮c27宅 _ Oicyr϶[}r2ıy"gS:NEer-"άƯ~Ưچݓck !( _ }=;y}z-8_FCN_}/[_ySoah5+߸F|Xz[vxrxܜl,+"sYyϲHjAXiՔqpC'jcC'K&W><~/GsX) TkCu߂&ݶ8zb0'obi]\mj+(֪_m v>4߻/C'IBX`z9ƭhS%}w_,ogٖ g [GZlPHS,<\?sErv] 7m,tRjE:g^Hc҇UAgY՗K`x C py-tM}@96u6 _^?8}^h}4qzX@Sg[5fZU6ߌ޻Y,ΏZe7Wېw|cUx])     P??FW-*k"gU6ZΫʿu ^EgAмPpkCƭ,Vh0ȫ/=mޓJRK67HK0ԭgN-&/Nj1emc+F"*SV-M:_ez_]lphj⫶#mb2.)@^eEEm6ϗ>YQK|]W u{[C + C=W ǎs?{΍6:}W׺Ǯ6y]S&@.@.@.@AyR˪ʝՠe(%@vx|.okf2_OKV8^>du/VnU SUU۲]QX^}wԗrƭYh!@$/z͛|Wyr; (<8k'lVgxWw5**mtu;_[*ǫlis_ C=@>V +u,>_!c Y#c 3j UX΁EO=W >Y#rVwN}ɭm;'?pJ `Qv^߄c5@a ߸5 /Y__V ~?RyC0>~&v_j.cw)FYW_I=@h&޻uTl8 *䓃괫V\yѫ~QU_?gCuT|cߵ,ϲjb+.^!ȧz{7;m:]/]{p1]Șo`sUm=,'%;aUd;1샳+?h3@^vT6xp޻﮾zmbu;>N_Ӭxs#4>껦(L\\\Wߓ$yUcBY6[)ߢ~v:a>m=~U@o]:;?*Ϗ+CMjOjpUX϶F_FϛX9y}BdX6`_Voߟ];_w&IiؙzGC`O:Mhm_7vfC2ȣOv0V0!@rw_ y>;B ]0cvk˃ccm"L74z>1_S7v7>nprP`1c?BvMZ)R)ܳMf{{bG~7mj~Lzͫ<0op#w`}     "d4w-p\c K6am:\v6jf]H!%@C}o4a񞩯,>a, T6@Գd|r!Z}޷ 4 C9t_^-soߟ]C$@?x;<~6rrrr n}t==<}H~ŗ޷ t C9l_߾}t}}[\}Wǹr`~R޷ *<,ֽW7 QG6Ԇڨc}Fm6N C93-evsܜlYe?z"y~[\} Cws}|+rd p8_Q 6X@m5 C9 -ivx2?޾?˾~ iB)@^-ȁ9N^6Ox(FHXm QVBt8jI\\\ȡPh_Zrm!d Rq@!Hi"@.<^[C?\+%@.@.@.@APW ˫a,ȁlgM{'@.@.@.@APקهϳ?t.}=ϏٯeO{ޱ ` 09#!@.@.@.@H 09#!@.@.@.@H 095p IDAT#!@.@.@.@H 09#!@.@.@.@H 09#!@.@.@.@H 09T79n{uN;0"PIvY2ޭ}@%P݃gs>02Pz(|$GFF\\\ٜ^?f-ލn02P@2ޭN##@.@.@.@<8p7S#$@.@.@.@L/wO}|q^0BPz Y6oN{y#$@.@.@.@\O/b9@H Cyή߻{0RpNv|w>(޾N\\\zK}; 9\'@%@.@.@.@ ` u0XPt99 wcg[G9{r=>wh9@> Cqή߻{0rPz(|${U#'@.@.@.@lNŸez`w0rP@{XumBm(v!0i;19(mƎPjCmW$6q 6Ԇh6Izm|UjCm Tmh6ԆPj&鵉Um 6FSMkPjCmjC&W6FZ'@.@.@.@<<{޻}pur()eޫvyzhʽW嶣6)s36ԆPekC&W6ԆPMՆ6IMjCm 6 m^8_ՆPjCm4U$6q 6Ԇh6Izm|UjCm Tmh6Ԇ([@ȡA>ݓ.7-׹iQjCm굡MkPjCmjC&W6ԆPMՆ6IMjCm 6 m^8_ՆPjCm4U$6q 6Ԇh6Izm|UjCm uݘi1'˃/:Z~Iܴ\Em 6׆6IMjCm 6 m^8_ՆPjCm4U$6q 6Ԇh6Izm|UjCm Tmh6ԆPj&鵉Um Q6 C{}rr6Ԇڨ^$6q 6Ԇh6Izm|UjCm Tmh6ԆPj&鵉Um 6FSMkPjCmjC&W6FZ'@.@.@.@0 @#!@.@.@.@0o1\"ݓ^F!ߣOC{F!ncz Y:zy'rrrr:Zo߻9]~}5"@.@.@.@q\?>` CܣOC{f!lcz Y:w_f!lh9{f!{u/~XCz(ޫ{_޻֐9,\?˲w߻޻/XC9#!@.@.@.@H 09#!@.@.@.@H 09#!@.@.@.@H 09#!@.@.@.@H 09#!@.@.@.@H 09#!@.@.@.@H 09#!@.@.@.@H 09#!@.@.@.@H 09@9^e7e{vnN۲9/ߝo{p\;.Ýkfm=:K)m>{ ݸb[Oi͘aR:{ȁ&Lf{=AؔcvsF?r )@=\x|] f~_Tv9=}gcgb9C͑#:*y;cIa͘e ,$@.@.@.@Mofc7;ivc]ݓaAiˏM:u?NI|Qh6>>mX 孂9]ͩ/Ôo=cXm|gsxiojo l\^mR~]]kj?54})+e[mJbofn1qUju>j#؜u{8Gm]}Ri|[^.@qyF1ŃO}{}Z}x^wg{u~ѬnG6u͟$j_᭣f֓+Eq7ϧ149G<1`hv k@\\\=YwhyՓۚ69hfb Щ / Wuþ^ȋؙW0I> C?x⤎} ~t&Chz*˫c[Z}q}ȋ ئ2&K:Vmy9j#HH6ʅ?˫ 62Q}߫|f!/fj#~~,V=GeWypV/О+Eqy(_Qhh%@!ȡu{U?"nr0Q =rx;NM]qT^|O/jc'7Ň7y 2IV6V^ c`(Ѯ&*W6ΣT ;ᄎ] ئ4ku }OH66㮍jzcwlqy}U]F{Upg6 ooT1ntVr+ݟ0JI}z\9u (L\\\[ɼsE~||1-:d9)iwuӜڤb'8UUf/4kRF `|B{6ER.\c1D&&5WǦϣO!j =ez~ulS5f<< MmXuqFF:ѧyk"h\^mAFQ'G]d{݊o6я7X-zwx edcgϲeՃțSt=ϝz)@~r6     jm2o'obĝc6)GÏ* F;N0D_Ð5^ sm-m%cP]~*}poo(V^]J} a"Zp9Ϳr,WR{2+WM~x$-ETp:_mסViԆyj#ژ cvOo QTmtYC 8qxp~-mNCuGQm}b-_Iާ}br0ۏТ3)]C6 nPkr rrrrf&ƞWe{MIq?y~T!N0q!rfyrJ$cɀ]M&Ie"Z~E|(V^]*} a"ZRp F6uz};vm"o{_rw4j#wL/g}U=㮍4jce/`\^mAF ?={8UÃ;rv9H:n*SNbU~'عۋysR/Y6}(fn/V!    ji2oS<LT!N0q!r?:|qo&%bon_h^;P&u% &ˎ7bmGfc/F"mE-Se=QTmtY>:Zw2+N8O=@~l\ YE.E|}\[mQ;E|ܵ"mˬnzvxT7j(6"5}τ~/ޜ u;*zqlۇ 2qqy} 04c9nyCO8fLpÏ; 0G,B174oYZRhPݗ]c0hn'=ʅܮ2.M~[yu)c5h]Iunf,Rת\:jcX_FF  U]Ը> jg-yh:۔zmti]&Qg*,p&WGrh!CV3P:M!!`vn~1)nqY{fJ6vf[G?49]{f}wClr|Ǩmkl?;gl|B4YG)Q/0.߻ru-\77Y{5_k{B{ '&)VjD{w{_}m(n)]^>ݭW4 N8Je1qn1/jkj: U~O =Ȭ˫ H6YR 1Һn]I/`6Wu Gv1|3joyd5@o_0HP:MػWƕ8Yᕊ U ,)*-())(..]piia`M_'M_7kkynI̡ b 1ֽ1/uysװvƠ5j|7I>/a>N^WBuj~t:z@qRN6ߥl[wzx:w~j9up_qXSu\ܾx:wzw9Bgv ʞ#s|)9tx.36{yc7MGso9?]Sm^ܗ[3vP}e=VRwZ>iii&m>,S BYu:}J NmSmI\m Mm[PW}|Fݗ[GAP[msfo/}H_ }+tPÑۊui2`Pm=7֯CGTFˇ/ϥ^\};k&Uplmv8R"uO<C_C-ImWmWm/jchjcccׇLQTmVc=GV˔{m izض(mHۭus]M3`ÇmK ]Oy%Xrrrr8ִhJc{HhBa&3 zH" Og/C:7 o:^v{6qG˶r|oyvݶ6 }nÍ돟w$,f>U.G5v/b}Fz JSQ@?ț[j<'tZ,=ymyb2:/FS!->vu6b[}ܗ[9țUWl[U !}nۧ*<~W8OU+SL B\\\ =ݾJgߏѺR4t̳E}w ?=|MJS[j{Qwv\c`sUUcfXCϿ5649}xZGj2}yVC?uj,6dFX9nFlr쇖ε5m ڨs&3 miFj =g9~߉ s 1XRuD=,e;QN1C uiOx Fuۜbf5oj9 g\Mڗ]NyQk{n! b!gBX\pdٲ3 ')~Pm em \bؾeXɱ_6Pw:MC^Zfl    .7oB7Mx9){`9|p{=y[u_rcӇ2;9uRC\tޘB=M:1&eM6cț/]_wu0ejɾY7t=iA0vZЬφ3zU%{R46K)EGYn<LWN1K W?럏SK8wt scK ]\CK>/r4 P BK}Lېb@Y!䗛Wϻߏ}V$oiSx=^=מVg퇏]547T.b^&ՄZu'+K1iRSf`ȡ%w捅b6|^ӇCXQۋwr=uk{- {1M;vi;3:6=sRr: *1UWSـB?z-'.K =tvwBk2xyʥ>fi{NdS i`zަ ^];ȉI5Tcya)R@esuf*}PPCo  / <~ ZAGMy=^(rɆz/ji{vX;wgжڟl]Zk rrrrIg 94FcmnuH CxO|x9mC 8u;^s ojvF 6~{zӴ>B瘱N)^29qGhpJNU#GhvCU<|L{Sɡ>fis|Xzj9(0yZq+@NL}vs_; snGu ȁCCW~97]?cyɭ>6 elF:>އx/Z/Z%tmj G"׵ͱ;sy=P B\\\әw96i]]:L9H!@'@>z6m;:_ sj11sh3@f۷X\F)F }ʑf"Vm~pa:B9ͩmay.?R=MQlw~nYZT>tR\c mӶsPFXlY]l_'@{N%t 8p쒅/uMȁC}?νLnC?8(uj.>|tn<=v ߽;V`]3e uOB6L? 2 I    zy?]Rgm#ť|]|'NCulw!r]c9t)@^vmRQFlMPPeԡ,emĶkzWm t+ -SP=?ǿkkl):ݽcinYRD䘋 ԰^ϡ{zy*^:;yܼ}ʩmaY02=7=e(?"}9,W_3sf۬CnLqLӜ\ /^c+{c ä ð7Ecbꎦr +Nc~i$h'@^]wf>!@G}?T9.v/nV 1gksMMFҩ1/syΩmagzάS[JXg׍|tmYRgB箦/9c8N&KMCC0+fn# v-%@.@.@.@C uz{Ür +N9ޛun"_RK1Y?u\y>t޽yi!!UÄ4 TLy79- f= #E-8rK}̒䡙^X[gw]йl.W3C>Y|̱>|,\d+;fC oCA|h?)yr䝣PfUig]ߡeI]Ut)@}?T]3b}z8 F};jM;~F]ơ:]Fr{:*Pj01G S#m֥>fIBȻ~h'c9+Z$,]C/+T7KyAP[妺͠!g&2DoC83:̵>.fr_14V|erlKjL=^ к}/@~j)؈)k}Z~#XI9els~O(#@MNm 9?C]/bԥmn6)E?H5yNOvƠ!:߇R~vkM-@\BáwU_SbzBOX&öCAk\Cᄈ^P^!cK¥i%ud 9+>u,1,y_9u( X`Ce`Nk&MX7l 䱺n j^n¿?{%ekQxo @ eKRf˩m!g:+MG1G.Ɛ#j~n_cvuz]HxJ+g}1)cAuȩMf*gB ywk+|țq.F|9;C;I]IVLỹy31v{rrשBiS|~vcj.M3!Ng~u;|nB/د_Y^|˜:yOM׆T>6zݿiPqamv OP7ju-2a}:Fަ]eC6@zġ{IOAN/^CPWǚ1z~%K]cnJq͈ Y}#\Z;V۞oben_mۙJ{b5{9dI<@9.KK cT clw vvwssQO({X -e\14P^_ϙcKä+֡c.mٗ3庴 =Fh7$Y{bpiKy76B$jcx\F\螥Yhб9'/? wj#,^նZ9]3n6`1O_xuhy;9)t/1{гA@}Yձz{Brrrrәw-Cin#C졹Kߝrys% UжokҘ 7$kBRc5$ 5T< 5=~֯F!iuZJQmglߦ8Ct3n/nYrͤom]nȵƱ9GSuJ /<ƶg㰯MlOIMS|(Et/?ۛ=hoCmSlQb}.9؅}ȳ]Tm /TuiVsnno ~3ڶs zK x2HCXo:G|=P:9L9̻pۍ}l&euBb#l 55 kX-Ih5}2HBhO c&/{ Mՙ2x>DC`X@6 P>>ۥB׾)_ or{bҪ MV([W|>Sg:bc넞 S?GݾugmTϘcէTh:yelUIs5v퇾ڧt|*dcWV@;نޕnuT[GʪywMߗɶ ђeB5x-Xm469TéߘSKmۮce]OFm3!Umg僸̩}ڠc:F9˶Nf۽YlSu}}ZֻUj_uCu{6hҧC@0Sִ3hZLb Mt:zr6?mB 6s(d;ulU=~U=jnmvYڎv^l6۲8EHR^_s ]l߸~Xo>=o͗?ր?ř^ngoxuj_ޖ@X^7l7K皺bβ9>:A춞P-#XmC({N[n_&}Oj|W?gm+)nmOHu~sAεm6v>ӡ.7y-jlزS=͹-k]s-:_&74j#ݶuTmS5(׼ljT,Ru%P65K//}m yoMOM3~չ?{l6:r<{cen- ]M]C.D?6o.svǟ~|| ve]}03Ғ[(rrrr u}vyv>v-/o Mc ś!ịUR/K,vdS&"iBush ?NGEp~_]mcv/-eژ,:z._e IDAT.#]z xNhQ8eo϶m8bϠg\nLJ'65ڧ>:žkudy%v2e3,SQu4,۽U=!bh,k dX6;C682TSy[cϿNZuJU+퀦[jm y.FHkRRkc.[ E^=?_u∥ݗYBm }ȋO ds y3\}b~]}?T]c=~uy&) 092'C.m?PH>}B螺ɹ}f_nYCQwە=4=GΟs;W CμئO{v"nDer CXbjK.ƾhhu~u6#u>:(VA˴m0BNiH-@_6!}Mw1Nmq7ǎ0Ŷ{;U5+kg}FHy_lcޑhg<[Oͱnm+4KjmjomYwMr u+(Vɲ}WRm>PxeLi.Ͷ`6-:_sRFf Wu׻2f Wg}`c4v>iٮ1{㹿:4t|3k?gi/6Yȫcri[omsϿyiҮU\qr|P6Ӧz)R9RsvikiN*eo^_-6FS"SZm4צ]cus䡲J|aJPK_nlw%)vr۟ۻ~v>~m՛d 66R"tO;L9j{{bCC[?/oxH7#@[m`T{ux ׿j}?4&]how:C>$[|~wH]7 5vCC3Vo޾;N`.ul;n5FlI~^+CYX'7cmc]8|GmSArsZ)s{S*\_lo_C΄]I<uܷAs9=NIۜXu>d2dIaɵQMm^}y@mkIߗ3nkjLؽry׶U6¾ȒϡgĹLkM׾Fhfձ_R e5rhwuIun߿;ۯ>^/7cI+L90%M: /B {DΡk[ђ;B]Ĩ b1jcǻSˉQPh:TҟX_jd S$@KI|",EYp LSqȥX!Ĩ b1jĨ c/f>g Oq1 S"@.7ǥŎ,^4Yǚ<:^h bk|puA Fm㾜Z02*Ht N6QĨ Bܗ6b@ p8 @*)t4"@.@.@.@L9st~~Ь{O_Y^/r*t|I PZP뿇Pu@m7Ĩ U=TK ǟAQ<7 S"@C)uG ty}uD9@B/^&s9d5`O;\Q }s_ڀV]ue&t~z^=\@c0GY?wAݿ]=g~/΂pϽ9@V]gC:|/}iՑ۷_ \Q }s_ڀmAL_\]=6( L90%Q(@f%\^B,ճ4(TqGm6P}9j[ u<|dF"@.@.@.@L9s"@.<>/uo/+@3wl:]q~Sjq'Fm6Q/'Fm@=oX _'?    D9:߽@len7/'@.wIyu {9 gĨ b1jĨ v~t~?@~M43r S"@]nv/ ov!Pݿ_0WϿ J\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `&ȡ>Z?Z~~u    n^{gO_9Њ9w~{ǟ>|03f{ y?038Ϯ֧z`fȡ@fi|`fȡ@{?c    v6Pkǟ{    .7ǁ }~0Cq |4@>L Cswǁgoߎ?3%@.@.@.@V*o}ٱ&N\\\}u'@.@.@.@`9L9     .7Mg_1rrrr8?{| __1rrrr8~g`ȡ8~g`ȡq kB=?_̜9sz4@>wZB}h,Cl0M?q~l9'PjCmWI~6ԆPj#Um'ǫPjCmTaOjCm 6RՆ}>q 6ԆHUI~6ԆPj#Um'ǫPjim    z~=߾?{vٻ񗿫oNC4YYC*7[II6ԆhZI~6ԆPj#Um'ǫPjCmTaOjCm 6RՆ}>q 6ԆHUI~6ԆPj#Um'ǫPjim    z7u/>~uC1-jCm Ѿ6Um 6FڰO'W6ԆPj>o8^ՆPjCm $}xUjCm 6Um 6FڰO'W6Fz'@.@.@.@_nbn^Oo_Ÿz>k^<Т6ԆPk>o8^ՆPjCm $}xUjCm 6Um 6FڰO'W6ԆPj>o8^ՆPjCm $}xUjCm4 wߍp1yh9Em 6׆}>q 6ԆHUI~6ԆPj#Um'ǫPjCmTaOjCm 6RՆ}>q 6ԆHUI~6ԆhZ@AfB\\\`&AfB\\\叟޼v`Aȡq(ǟgޏ?{> Cj}97,9]=Wg/7=`A!ǟ@G7ǟ}`a!8Owǟ}`a!l>?}}w|/,9]=c,9s7ᅬ?9 Cq(g= $@.@.@.@O__}j}H\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `& rrrrfB\\\    `&ȁᅬݼjoKw.pv￿z^^^nv]}'5rrrrh4 =֧=R|_=}U{}rf?ܾ}V{Ͽw:Nk7w}Vvny tu<ֻlznnMR:z犇ݶk[eos@^1l?{|: :~m]w!!l]?m&!]SwͿX]Uޛk~Tr C{ŰmLŠKpWpjlFͶ Ua6%7 fO1{lYf8Sp ZC#9oߺv㫪6oߚ9@ȡbx5bǟ񗿋:3?|삕{eaxlB\ o$m=ꊅBs M5ZUMUsggnUmn9@ȡi06 j-, KбWF&o Pgp/dO\\\)7gC63lfAkpl( UWJWx( ߾5M}} W],;vM֭ ycf6zɛr jQj ?~D\\\)NoYsP]ñoYcP7DZ'@6 7 -ft0^ۇ +9 Gxq3yq&MĎ: 7r C;Y"&3$L>uo:K|(}Uτ Osylԙ=$4Stݙ _U'  ݆c;Mڇb~ܮ6C{TsCm7:    抳\] *O5h oי8Xǟvw. fh3Eyl{T-H(L :13/= dO\\\ֻibP-e{cb!gW΀[oYx44yٖ,E8ffwKYPmD` }S3:[Vs> Ȟ9Q0mmĂ] GC:Ar6ylB&%N}f tlt=U6:/@=rrrr8&@~ǟ֙];Pȹ6 Q7U  ^n;n^ucaȁ3tˀjݾ6C~o9 ? L},C ^=7LS ]xn݂}3.ۡwVfh۷I 1SfN-4[g#@~vq n<43{mp})@:VMgSAl]ֿ1ٖj.@=rrrr/4[&̶WCЁ>!.ӳz}gyhͶ6{?:mَ)ǩ/ζxmoʃ}3fp޲ Ȟ9W, m+{,x\'<fo֭n<U4x=y:ݖ{cW/P>yٱR'@gl7    5߽?{6a,tچ 6>@PlU]>}Ϡ\o^^S y[n?m߿~i=V!C~)B    AӲg@pNڄ66\\~ymm~9қnȻxl>xt +cdO\\\ cf k-BYݚlP fnX.ێ] q op},Uw!@~,?v9S9>PS'$@~Ix4TW֭-x_uwt&?wP`8zWmCB13v rrrr}w/[׫ֿS ]C"@=9~ݻzN= ?t2 fI} ?u~v@PO10xlq6!CɩCQ:E<}8A:5@^-wl6ۿ uujJo    ]ۯp07{!@ v]PkM3 0Ql]<}fo [3u|~< BgNQ/zN[c89@!2^G(` }h;ۄGaK CPvr"",LOx<2DP~lSCW Ȟ9Wc6ᦆ WۄGCZ6 ͷo>W.vT!،۩fFK0ܝ6Wq$@=rrrr o}RY,} \m}<*Z~OhfЀʻj#Eb/~fۭƺ϶Áj3Eڼ};    *0萳31sfn -~PpglZ³%ToSߧ?gp ZI Cb14g7?P*&m 5:އDcچGC}09zkxv{o /[f!j"|RU]j}~r Ce3T߽ m`m(vO_f m:m* ^0ocNk)ȋçjKm^ճ9 C\(Lz|1\nXHw`m(6 ._wuãln=bw`N<K 5🢖3wt.@0w|\ß ͐;FOWݩfn g/M£ſ/TSC>*enX} = ylRo}SnqRvfC"@rrrr"8n!NA! Q AP*&BdIa&H Ҙ&E\xVAmuzaX2pDkB9rҁ~6,z⢨!ɵ8UBuЪž]nU ˘a5r3u6gw}o,ArU=k]e}3{xg?HF]Ԧj_ r 2i٩ 'Vgv2k;LkkB[ru5ҟEVjuj6kL#@چi\Q>6 'Zt/i~LǺn"@/"@N9r@&T[)`h,: ۰;x:jPI7-й|F߫ Fnripߑ6 @|ViW\V8Hɵ8^Q&˒imERWeMZo9r~@0R\>yKu@Xav eH7Mi WH "жE,MmtBҁ,iiA!@N9r@ G&!SW3;n>SVPw O݇t͚lMS,BGvAeЉ5*@>2o 9rȁ^ͪ0XoMg .5 ^}w>\*@>2v -&ZjF,#q=Ͻ&o6b|d<^]m|hߦ u< 3  Jc1zνCjwlǟwvY}o"ǝpuZ$Ƣyv\q  FoV2}ͯ<*|9zkE' {щ0㻻err|>r0F9rPJe o?).Fzm?}}"prsW{Ň .^^)|ynވ^ ,ӹ+[޷(S\Z; X+:|~Tq[{g縙wvsPv<@_-4cM촡U С|w\3S/lz!@>2;že`9rȁLoFK0F\sn%zvP.zPȁ0z6wKa_~6 ՙW6z l ϵW~'r Iܼ F_R~ҵWOgKΗh2]w1-td9Z,Ň=@=a'ڽ-|/z /b'y.լN6)}wv묡{|JAժu 1YǼ۵vtbyG|siy6Fص1ю6[>QaX+^U[>۔".ᅫCDm_ {O>763Zw-ſ%Pp߾F\{>^"m0>6< +|vx>*eoU '@N0vь<ۉ>~E ׷"j9&7|l GǙWSrCw'3G'!7ˏgZkgJ'@FF:BK_\;gbLѤ`wvClT:5a%/WNȋݶtDyyyB8χ6:(Om66y\ۭ#APjGmt&|~_|øRmǷEat,d;MgVYh+XuԆ]}TqM]wOr .r9ͯPaDyk#DFX1bn REFW/8kQ u}{׵jS'c-nOB :}]j;ѫ#OoӺS\Z-6   GRO,Ǘ BGh뷞yb7"@ҬyrF_yw ܼ}1f* 78nވ.>opʙ>/:f2J[EeVP;bުsMtL{HqvDx.,i:$#x,Y: Tv0nPCmn#ZQBpjypNmXc vޒ"PF нnڐߟ%u:6Nuw?n/6z!I;Hk?Y:VTd͚U3glf= eūc\`jr  !aPt rHnPťtpw5DCvvd ,#hklQCj υ%!ͦQe62JhY_|ML!6ܪ*KG<x|] "BBynvSaXK/!/ȫ]!6׆dvӑq)=֑ (Qdm{F_</@>2.ϊtPMKuUWruAm9 IDAT: Wk@?G  '@N0F0e@ CyC2toX9vy>o)o.CDt֨A9HB>RԩFx.,!Mgt md\LܺѤiBܪ*KG qjBYW[ֱm7QڐFѨ 1֒) \ۭ#APj#{faOnB K3fYkHuo'eogQ\n +54V!@N9rXY|t}3~?O8_G=]M/?(zl2<+ͧ=d}iaP:[h! X7܊Uv#A9ͯm9#@m/E3`(:7{li;}kg ܾ}?нxt՞vՀw]~|^Vv '@>97֊vF*ByێʮA::)N|)#*Z5:~K-6kq{lWg2uD+B g4i}.T8ۭcnj\!/ȩQ~kcjCn lHu:6B g>~/!j Fz^:\&rukwZ^&ڽg-,y2] (%  zV%[|}:w9k*:(ve9~}-uy^]Oɧ/oREȥK{^WehFOhǧN:!#/"~ь_~s~&_SIF_.>fSvEMqh /T]5ߝYjۆ5fϲny!@N}$;al69#AJSuvS)bQ@!Y:cXթΥ,>>_eꈦimM;RtG4U{UzKZmb{6%\p>\4Ge ~%mJq]n.˥v>j,:aW1 ؔ~v^ݽ,ߓg;V͗ߢ'ϲHsbm (_am9BF|Q ,g_^5Rh\춛i-FŷMǓ:U1@XCw]hEy#~}ytI6Km RB(6aO=Ge ru$JmV~$ۣdh+e 6TtW-TEn k-X>twrMw߫k|d\~_L '@N9#W܊uP7ϿfN:aͧҜ[,ߛ|c^6utlfVv#)@^#my?o? C7f!pN\ϿDhQqy>I"@N֊~x[soȥ M^#H:1yvEwDf7qL OG̽^ٖM5?e7ZNx\1my-ov8/[\uWy~%DvF8j_m_yFjHԆP >&]S'I@j@ vH6|Y:8]soz&*Q޷WYʆx+zSe㺼r6\>6W<縪singiwyAwZ)5{m A9r@G0ݓg;}a;K~2M4Vm?G =h}2hTj}7*O*^>hF7o-:.:@ޜ[Qּ*{WAoWm/_E_*ͧ`j1Fq4Z<7YFs^\/m/0ZE[^Fsި]7Ǘګԙnވ +g U}5:7{EImͳI27o-OڻdtᠸN}8s=uIouwߝ,4 CAy 7Wt|DzG'q}_Zhw8d{5?&?_:HO4{m- Ph.Ewm79~hRٙ][ WNV\C:\UX>Tw\SGBe눖P;-@H)8K]ubNԆȺlrF ar\6UUu:6B${`!Z{#Yo^E}{cQNm>-u:.w_mgƢ|ڽ6ULgucQ^:p wv'ힽZ)56  퐂7i9K|mU G~(Lҙ9"~9/.ix;Y:oE}*@]EQZojcP4fKG*Jh}>Y؋;RjP=Vu͕ͣ~ɺ=FaxZmU \ǥ.ޗ'm.Ґ@}(߹PnEȓf[-"@>іgĝڈ_u?V"}{{ ˇo tZuk\Q,vSb{F6X/;j[ l6y;J0 '@N0b&XÓg;=n2ceRhfЂ+eϯ7ԩÅ8,rѴA$K-JFlamS.m; >ukϯ"@N9rXhrP/̵&Ee3[4هe /v_]h4/_9.NMg_,O9/ւlY?KzіQsyR\ź np .^L})}q*=?muy8D\V S|]凐zsH#_V6rt,U-BG(T3UK5Ϳ_.[\ >lןr([|d%@i`ӶO P RP VD|{_P/y(۫Ա|/Wi3X:s|WsQ窱ݽ>?}5;T{(ϵ կ C9r䀱6?Wڄ}h9Ҿp1#K*Mq=mfO[vYi7F(˳iJoF@^@*U3 oKUwz7NfZifw^ X^ R~ՈhU~K<6@]G; dVD[ADAȥSǛ4pFRMnUى;%R@܄" ȁ P$SDq?5@ ~"@N9rXhFs61!fg jC}|OYW|n@7m^ey^sZR".hˁ^e ڮO$@.y*zlIoF?m;i$72P  p54ˬSVC):-I>r;R6ݞE2uҠ7YnUٻy;e:|Kd5.uhFH r>t&^t:2Ȼq~c 6twcc1%оDZREȥg&YK癴LlʺimE ":@ '@N9`,޶ÅF3Z|G?AѵW!٬B_|\GG_yOg+aC䡶`aCŴ0@2\\u KFqg!9_c].:-1cGL66L^ WU-x$-oc5SJZ9&!%/?0 P^ -3{[׳EUز+}8n&o|lmcq2}:_:mQH۶LB9r䀱Yg81(}1tgnesԔf~~َ6rwvG4(Kw[6BY)"6}ylr[hsW:,N<3.W[ʥDw=z^r@|Y$cf穎ri?';̽}폺\dl 4Yw;hc wlf;67kQ|_fw'Wj pAFgpd$/ȁ @ oy0 6֊Uj ƖWۏu}}6u?nES[%ݿO"GٖarMvHYHϛtOrG9r䀱Yf?Rv/~4txь?|/؜[l|kuunPGz=yfG ig\:娷"(D2AʩJ OqQ]K/c J9rcu Ͽ/G}I/3ߎ+3Rezb|%hC˩jZFqˑ6r3K;gG@<۹@ '@N0V*3ҫ-s+ѓg;џG?e  w_c^?)v#mkyW69bgk.PYBߝ 9YH_< &2to*\=`(P=@wv7e.nRșCP`y~ fz]py/-5z-@ȡC ,^̆$/ȁ0H6]-3kfT%J[u26aUzTrҎYi @ '@N0V{=뷨9byҫؖf?_My_:sWAIڍ𶍯^Y>_5H>v?Ж]syBhw\5gܾ[x(!7e鷏Ulǃ Ge φZc1D3\g e#Zcm܆d:UlG =@D-@a]Q c-N`t/n[ :&+hg"g&"y+(ęag1E?SwL5 T-m,ǖf鞦 W  '@[o=߻T3?{C3 IDATؖ+i-}-'!%i76N?_ yYBX&C>Kͺ |"n>i G φ-y(:?wpSuNd&JtёrNOg;cP8zFz l,ȡKH JعT #/?z1i-M{:_[@ }\^ϙp,V,ifr '@N9`NFs^ ~LjY|Gٙ(Y<Ӭ%C9r䀱:ȥf1P,-uܟڍ>֟'u>̻-G K,߭):r o\5%7tou f ԩjC#u]mI C ˸Y=t.nrgf!xJ>GOl}YҀ e >|Dg)S\n= ZVgzڗȏ˰k(@ }{a_'&}禦 tߨ}dYA5rO3h#@N9rr ϙU Jːe&׾uLo͹o9 +?{>ֿ߶nmLϿ݀Uh;/iW3}w[zR\5St,C_; ~0|G_}U| ^ x_i}icס 遪le҃WL3ձg3)숦 `V-TXשZ>:K3۽upqΐ:Pvzf 9W".1m{/U;'A׶ȳj9M}f~5DwS4}[@kCuaz~Pݛ@\CڐIgB jKEm{kۿ3b(>VmӪ޷~SXi𴪵[.o;}("@.|ԵE׵y. ݣ (3 F9r1)@YB XT F~CaѼ?߄ЋRv}muk7B 2|M=HEQt}S>Z[z -@>gfE'3fZ"Y}F<&nˏ|w'אɱ E?#r^L`!9@d..wzUH#u@pљWEvnuøKա*&r2:n'Zց2|CN 9_Nή;ywΓfOjre1(ޖhewrj"DA:.F6IۤNrjTAjCMf1m& :V \'Agw7a/3!UP1֒wڏ*3x~%_=X]ڪW"6I_m`W!\EzQkB '@N0?z:Uκ\9/v"7BE8ҫ,2IrT fZ"#˶aft6O[!F~k|fҠ_~~Y:7ӷF?}ksnP>"0:xY=6p @U!iUypR{~J9rcOxT+(뷞5 JW_f :點Mw>fƕf.*ỳ~3M=FK 17äsrJ/K[ ?12.P/?>o?2<"0z ݤm[B\=T?mU}' }LA6ϊe c"?}k41HSSY9R7abAr:Pu8ѱY(Cܛl#ޫ&Rdž:UK8+Xh: 3uZwm!G5󞋎jpyu )c2/V3;J35RM|6&j"Du:ϧjpf[>%Jmmc =76zBiUT?U^`P'Ԇ> ~~d<}*ߐ~k'Uj]}ܷnl[>:uځQ|ei69u5׳UX+_!pϺgl;o@R(E{Ti  '@N0 l J3GQ=yGy9`zH/۲3ѓg;F܊ LfͲQEЀFS\BiVNUɳBI ԭ6lۗߢ܊f"Q &Lz٬K]rԗgy>}k4}q'GZu<0W}v 0w'6sWę;gS˪0w'gj?}kٙWsWTC3 ,6>Wr(tEni6VUg avU:RR:˺SigU#K9ST U?&舦 VkWUdm,nV܎:'}~^3j{ }7&[i1J8̻-Pu9wi4m;uZijPu@, ۶MuUWU}u:ϧ:JmTݠ6mG =itT)FmRU]g M\^Fjÿ:;]3>ig͛N*P'valb=Ic94ynvTmy**@>2Mtw^Yl5yOm?u]oe\Kp P7R[ '@N" uf4U  6bH.@Өќ/4=qHIݙm)0m?_<=:PM:/` V\/*P n>^ߢ__L=f]kuYs+4 PGQ!!F^膟UζNFs>Z| Gf{ե-G}JZ Q1 Nnވ/k`撴K:ҶOgSG'(L\^YMnMS?ct`Ͼ\]|83B%y#;A{ǖkptyu ûN\(r "~AɇiJo M uƢܛ!*_셽'?g?N2ܭ4[ᥬ|T-<MQ;KTJqt/19i|\vOaiv7Wi 7ջ|wwZK;o? 8ѬDZ4|^59uB{ӻm'm]U4ѯݪ=`t*ץN%Et_k5RImK'xg[Zu ι.ۢ1֒gF'CS鿯Lhu.OSo#@\] dU <˩P;_Mv_}tW+&2P Pd"#(D~ ]Smiϛ;0Lmcx0W@z2-+3;J"Uk "@N9rjVmk_AЬyufѝ_yǶL Rڼ--,ravaFs{nL#F?OX-Ižl/eԖ ?BUaZٷS[RufXG'^%qmֺ -@нL2p07X'Fv!@UP߬EuD >,4yPr;Hkޑ&hN]eog& ù,&ljGYwLսEwiҘ,KL񗇴AZlU%@>> r}u:Q 6L09:2{ni'@=> }iZyר5G{Uխ{Y6WY]eYJٌz׹%C9r5ۀhY7gLKg\c[ 8lέZ0Bw>ycw-h7¬lwvNEGvsm{cytA&\=K)SUm@ '@N9M@#v/{Bw7~-oF)|:>j-_^М[1 m +̯<=w6g#h}UXv#w&4@ީOVj[ֵ-G}~ 6^|8{UPګ\.>4n@m=BͳߝN^{EW!@@QSzCfwv>,Y~;N .: |Ѫ: ymX+Ÿ:c]Fo?J_r$ߗgYn,3vfw5#f!De /? *I =l_>Pȩ S1:Ն}Ini3t.7Zkv[0뽷Q|3侨Ӑw4kK) 隠w '@NBo>^ ╽Foѓg;f6(~:_}?G͹h~R}3zvo=f?}u|َVX/,톏Щr6V_BjPֶvnJI7oDٙ{nJt1.gZ>1y/?>Zaټ[! =sv֨=gn_zWCա_~!uHۆ_~!SeTc>y_&@i?Vam'ywӇc_:9D2tnpi ]ˇ1mmYu^oRՎž!gj#ntڶՌZv-ݜފysAw:Fg8֊^z ݏ_U~ W\dQdr->K\Y^7j#?[ǯ &=W2uX UڐMյϝ~o+mwֹ  %No_&BoXq繍*۩ݸF]mcwv;$M2[A~tjgWٶw7>qs{uh:@ '@N9͹FsXI2_ڍ%<Жܾ_]7X {O/.NIu,FJ3Uμ@%-G]Bm@ڀ .{8rP:@ e% `c9G/ivk@i '@N9P{ou @$;e ugx_&Б3P6Bm@ڀ P6&zgL@hZg{^Qr1J9r~Xx=J,f@W :&Ƿ\Xڠ#/rݥ(yP6@m o\썵бt xB9r@o>/8Ͽ܊e #:](ˇtT8Cڀ jˡBmz|?V0 ~g# D9r@h~6v܁r!<j*T p]j诱ݍ!ݍNL_j9rP  '@ @N9rTr " '@NA9r  @E '@N9*9rP  '@ @N9rTr " '@NA9r  @E '@N9*9rP  '@ @N9rT } IDATr " '@NA9r  O87{r@ME'V#3w,kwYfoCD'6zDr@99pfGXх=˥"]^&LZщ>Aό2\J>Kiu{#@N9rPq @e Krg6Vtbz!IClwg-4cM촡U @fC{f  N( '@N9a_~A rIS\;(mvo$o˩dޣK5ӄ)UցdCi׊6юN̽wiy۶m:l+yu,SRլv|aM`[yFصfmQMi,~ֱrkbaO~ϽQi9op\؋u _h7ҵWB.oWe<\ZVj9rDi~ HK_\;gb$ >٨htDS:~<ԱAm[<jEWgZ>*F(h7ʵW(B.ڰkWʦ.r;'@tb9rDi~ 6Z`p:HɪÌ3=jyhv6hۥnm-n:v8'@yu,SR宍]36BDmUmG7u:6,텯{0}l>Uu;Jauh7]^! \vϽm۴ oz>9rDi~ 4}z>[3XR`Yꘟ쯢U E tD.U렚\imܖ|ao/erN9SaF5 vm6A7˰#vH(6}:˛.~o;uPW(:֡wBu\|5"^u |F9r "@z`?J\SG󞁹H!H>^T헡BBl K:%6jhֱγ:^&y<Vm bm4W|_ef[Xr]nu.6©2ȥG%.^>[lj|ݰ[:ru,\ (FҀ\Br *9#@(9bLvDx.,3`QIyH!v6hۥjTJ[EvXY$Mj:֡6¨ U} vm6T3 p:˳0W:Ṱ?Z~Gv/K煢:ouPKmnUіۭc:g6UvX6Zz3JjF ! >2A\nrOruu9Nm̎;@./h gE_:(gmv*\ۭ#rei˥Ul/ "@N9r@ GZ=c$ghvz\υ%!սlYym;/%FMTj^Bhsn<䶩Bp[:FjCjSE6XKn LHdV#p]nu.6U {rb\42^E݀ vH>_xW  '@d6(m?yͨ96VG=߻e4(j4 |2o>Wy'+нc GfD7oN/,˙WssWzhP.ۡ 7sWCǶr 0N {MTŎ kdf;~`mj#!遼mGeW Ÿ>efMȗP;5Hwv!@޻?Ԇܱ(6kqEjLfC4βyùs][v3m\׊=\˯s"yuCMm69Q4jomLmm,~\ۭc˩rՆyG% W Q(Rۍ<'M{ =J;[u:5@D:fg-,:mkg_@) '@N9`e}i_o{C͹ɳk}oEѧ{۽o_ѓg;ΗGwtEzR|p4b\{5]~|>\d}:뤳L^ DClsWˏm]ܾ]wR\ӷFkhvj@0g|XETTc{ػ99VAPА\\r se.9d \<<(DO!#{@a~h6_gLBy7mA)W¡ ]/%J!v>f4<^tݜdu/%?;YI @ƣDŽ:G9(:ggZ <{mo[eH:MaYeMSz+" +O(tE}] vau4m8I26ugaim|ﰺsl<_l bbYIEWm4WEjnj?;~;?Tt]^lAFjh6ymj{mԩ Ǎ<_,vxT90!{.f?纼zX6j2̯>f'5@~\~3 C&ɣ'CI2 <3/ᯥfB?5H翕eRۤWtZNAgCUl2?k Ƕexw^/]P:¹U6[UljckNj,o$kеDl@"ˋ- h[m4 y<cPۻRujqk\>el勗<[4;h|Qx|Vp,ϣgm@-a'ɧDvq9ٿp*\&@$$|0;Ѷmñ3?o:5s={S=9?ڿ}CuũFr*:@Ӛ Boy=ywwo&oy=yǗ* O_J+ ǒ?^j;/HN쾙>ONGe;eB۱eJ&'v,ry~u6GzNVDã聾FA@|izr}8]o:1!m[NPym}>tϮUT<֩l|̜hg鸖wYҶQ]hl{ãr!6ۤy;q ynYc?+iǏ|enCŗ!t,.Ym4[eWUoQ'\m vζ-j⺼2 F{QWigk{mԩ Ǎj~gE׵Q;wO?Xvq]^u~wyCmyvv m[׃xp^ܚ̾ZiX^ãd&@.@.@.@^0p${N 6|. Ҏu2i3Y=r BGsф/_蕏V2{?H? PdP9->׃o'ECΡvKg _Fx<]~rj}  ϯyNV狌?DPjr{"[Z(1<7;`7C 0tyƝ& ßmK<Lk;ǃهcy/ 6]Y*g.[u? $g_Gs:fd}ho\ /Z CԩyʳƳ5)~ wrw;ePl,yK/<>˅H08-@uv~05 zٿCB3o YW&<X Ox|,4NRf͈}6$j>ȫihr{f1n6EQ++'OgeBw}:^/:38sn~2t~u\w:;f=u̳?xbRl%WWU3t>t/y0Ls%@ }>6jaxF G6XgS1hX =;+r6z [ydށB[y6I/3µPTa0P[v"6v-o;B\*g 0ظxݥ oP8ozmK\o*dvd f^/}oљ׹zoB my#:cvu"[y[ZݶX;o]:\ٟB-]VAnjpaO}> }.LM>WWOvmп> 64w_¶˙s2tۣ&:5POb瑺-@0Ut Rt}Teu,#4CޙvƮߟlX֖yC5#kOBY 9Hk,a6m~9F5>61pXh, B<X}?H}km:7    ſx( ן޺ ޮmcwpCEgC|cg%o}F3oym4r5Ż6} fX-:|WG; LuDBt[Vf`Bhd=Y]e K$@:%OTy\˴-@>{نTpuNzE[ʮNEu "vR!(nԟ޺ Wg'@A;~g"Y kz۲^l0/%?;Yj ?ON'o}F)yȢr}32i3 /J2;caZ`6\} :6kj{u@ŽEsBOϦ;)@;Vut< wFRt()]˾Uױ:VYv8u{YP Lrs g?(^ e#@3=yK[~nznv# XPೱ hERG ظ]|[wJ=g럗Χ-J{Wӟ U BUUMaej/HRfw/7^@/F'RucU,9ݺucuJyvd$?2P|Yu߽9}*wK~(@^t*o}F䋼Keb-zi M,C|}$eC!T@, 8)ev oT,>댹yJwR<}EqY+-)y S= ȡ?(?\v;\3Cj[cgwvG/ oO;ǡڰ-$ybeH:@^ m!@.Ԧ`kUX:O|ߣ'f' g OzON6ȫu|Yض?TևFOi<6FHW:Y5@>CI;'feKgZ>1\ &hP H:&  \k@-+@>{L{vնs myn'D>]W`yCGϹޞGziǞлga CP[ş޺vgɧ$[2 6.'=l# sՊy' ~r Oy_J/?y -3@>^ϡVfemrKӦ_P>ϜutoaHdpUGhZdu vG~(קyNk2Et`e5\9w_:& 4|2t}g̠ б+KkgvЦo!U7HŻŃמWfȫvy:%@.@.@.@AmlD>!95}ve:5H>u'CyB#^zۿ>~79䝯^MRCmBRr#CoSskm/@=&@^Nҽ V" okհ9ytAsQ!>C3Hڱ<1U7˶/P׮\0ofEt`e5B4W3ٰBy[ٮWIf?3,̡yFw`wt/8_sAziǞб@:9}M7|lGٻǖ ع|ͽz0uvPl ~}3y7߾znC;}nHz=?l{c]&r&;, Wmr{TݡaYG8ۧy#Z W=@^C%-vnҋ,c!Pg9BucYp3qg?3vv 4ymƙY޶muxEarE*I ׽m:Bǒ>ȫ^R CPˡ'_f3_lۧљԳ.Oh]1,@]kt䕏f6C!쓟.Ԇ>~w)X;6{B r rȳx7Ѧ>Mn/_h{-6Guy /),9ut([fǹgd?sιo > `5iЬF`hb3Ο/yϖB3Ʈ󫜥X-w*>3뾏<3}jSi<_;4pTVU_л CP(jm/εh`#^v|lcz0Ddۇ?4^'u cNf|tt{҉7k aаia@_f gm3>kDym VYp|xT7 wTegPU :UǿZuG\[| ]с',3癩~Ճ'K'v]u;R%@hwssE˜ݶsxNR2|:ح`}a CЗ ilC;+@~L<|jQo翍 ,C(pod}̹/ި=@~̹w/,#:(ԩ?mT_:KP茚mLU3UEVG3gO^c,~&g+{ J=?˾uJ.1zA)I6+t?yuO ?@TVFA<Z7nzvdگy[uCύ(zwۧgmL\\\6vη|][ ?zrx:Ks/%? o{o`#ٿ0$IH=9p;B/Tc/C/MzkL[grFIMͤªwD`wG먏ղ:]U3b3dYURca:U^cBECҵQLvԽxv5.RegY?㤰oC1d/6bBǧ? ^pgCLt]Ne=W*Aг*u`msãv|ۖi՟6ǮVs+;PG-BZuDCgTmKro CԳw.᯵~_ٺg 6.+Io}Hs=߆B. ի^.'?9lXZ,3}3yON7^kmtjyu_ye#dtXoyT+ +? :xxrdx#e{5y_|ͽ9+I䧟5F(mM [f$ uhksA;K^WYYh ZWq[}.3:g9oByyNSyUi:*Vy\ϼa3zf:mum#q4]]о1 r6>ƴXPex`}j> e>up2\OoXv>Uz:{4}l.7V}( ]z"ڼO:ߩ[ϹCǫ|γma CPhؙQvc ~?sޢ ^dB3WlPWPg. ȪwD[W7ffsXhCWڷbՁLǧy d=o>SuPЪ;(: (ł*]H6X_BBCAl6f e樍]loJ[X_j#ߺxaF]j#>pX{йgvMq]>--Էȿn>>T 33qAƺ: y/-0-@cϒ\t~]p]<m|}d ԯiã    TY$I}C`r$>{꧷7K`#y`.h=/k[&ã'Zm|IS֝ŠMof>\>~72~Ǘr جݧ?;o_\`;^,SzڶɺOl{=+MNv3j%@^thlB]\}x4z^uz^}@,Ti3joyEV3牝;:V6 ˚,>MvJP ur\F;B];e #t-ĔEF*':/:.UFwPէ[E]_v u uqCm[7]:.bI] yʢ.:|ڢ> 6򯛦cU{`tLs<3=TݥfWLWM>ht͗&[>w8:;W>:}3yљ'!@Ggq'?? ulؙsONG'wĂ:9`^4 Ks }9rm_;e T9g)xͰ/C}Ũ߳>NUe;m͝ǣ[yCLlŦkNBtJh?n퇗 *#i3,m?H?vVa.ޝoէ;>}mgvm547.y-ioز hڢw7z+֡rM͜6 <@6.w]=9@6Μ _w]O.ݣ.&eəsW<꺼̺+ۆKyj6痹    n0ww?fͼ; Pelx|M͋kX}UȋǏiOؙra߽<5Ky3?r ӟ3's9++K{:.w"Kg2/* l"@z)ӡN$} />LMKW /3[&YM.h?+R7Eo8X丞-k;v7<>vvzƦה"tscz+TEum35otOhZj#E} 6E|uȢL׮3Fy}gmsL,vw%@^4<~\K-6g9מo3y]{>ZջUzst92ظal$>aᬰ=zrPhڵa`7{s 8fW Ц3󮏿\8^\TUؙsk|)sؙs+-=;_t]ENXY^=>dcև靏zY{^Y_o,pvE;5Ti/.u^wt*;c6wwvէqh\}g1w8>w\/ږbҶkF̱.ȳ/=7 #, G6][.I =n7߾6F^9*SmysyOIi3t vIja5h}|3-,fENh^=O-3Pa?e̚IކoG窢?.3*ߥ5AﰂȡSo%/&$|]޺u=Mo{q9ٿpʗl\Nn:gO 6[wN=9XoqM;_z24K$?;OvrjԅGgӟ4^N^'R9Xqk1~Y;}^!&QK}:>|,40[{#5[/]1u~էcXmҙomƏW{ܼxw ksѵ-.3T?eŻ;6Um1;st,(tpuκ9y~^:Z<rhi=6e4ljcy.ޝֻrпu6^83=p֧Aib~]9=C|6և˹Xصr߻1mޣ͚ %yOGQfy7w%.4Rmj<1jAq8u91j-mӖg `n3-}Lk2h? ?o-0ltץ{u6d1;Mgayb1jArb,vM fmsz|f3rrrrZ꧟Mo6Y> 'B}86QĨ b\6 ف̪ f2HvW7    ? rkmEf;I B&a<1jA u91j hH" tv 2_~s/w獷  u1 9ku1<M `79vQ 1yj.Gm@qg,Q];|$7 Ӆ +K\\\l[worn :{ IDAT" jes]ڀ6 Y\{nh9-㏞$ X;G:]cޡ;؝/t9䷵??{|@G C~WWy<٫Oo?t9L[Lnx4 ya6aӁ:5a9,rrrr&@+K\\\     ևakpe    ãg/ܞm6 aݕ@gwO'@.@.@.@ C[Nҽ'@.@.@.@٬7`wo6 qt |0ًwMQ~c6Y.|X6YTjCmՆmҾmbUjCm QUm&&W6ԆPUՆmҾmbUjCm QUm&&W6ԆPUՆmҾmbUjCm QUm&&W6FN\\\t:8ٝӟr|:s>_o6n9@9wiu`4}?MGͷ+ `;V49wҽwtL\\\EKm[v#[ȥ{~6c o*S0G\\\ο ] vms4Ա0kG*^Yul;l-G.X&vQ/?Ⱥyϐ]?sje8ϓ{|Gҭm]]\vRbx^e004{~0z& G;ONX Cq[G^=pU: LQed疦D}YeNװNAt()e++\uy/y,;#@?0mO ~>CbE> ]Q:KM4y5sUv#@yn{Ty}}@ȡt2@>ٙ旭tph u60):h%ŖQ U5;a xo,ޱ8 vtiH좬\\ޮ7ѽm uͷ謁>vP\_:.#@3rD1i+!8.%ŖQ U>?:دmvg?tg-;@>;$}Uok?Ri]1OLi.tYEOG\g=f4vPL:[#!_= /zI3Etp"@sOb(X*Tp{\ꝏYĽcqCYOLĄ6G?cc(zhj e'cpTn@h]!`[ɬ*9ӧμy[[QϽ NhBPRlXEf \{|rg vOLŻfmgyb6g!p]ZBw|4Qfj/.z<am3~l~63GׇN\\\Sg*g΍^B:yVK'I[ 4qt()eg'Yf; w)qav.ѡ2 jLƳDžUr_^nk e/vشg}Ǟ4񌘑1~첟[#@/Eߡ˾du4 kPM6}d6)tݞv]Tg \>M0Ц닶-,'}g> C~}[u<6!W^,c=]<{[GSv m*U-+9z隥>G/gQd-bX֥{v<.ꮍ,/KCWYױmߜ jI5uӡ2%XY]_>Jkq=_޳: vˏ]9p6;VyL׫OX<뺮<]|wYv{3GϺܲmfCUs`מ7U q!onA5 ~peM3*'sF{n eQgK}5zZkeRߍwǸ.~}s*9L4fgg_}e:@,/^8*>bkKnWf/~cãbA, Ydm3[G$Dm^̿}Ѧmv\ ^7ڏvm%ŖQ6 fg/UQ|~rtmسe'oӽc|H^s =ӶU oٖX7f9B-lvB*%tYuT~n[ oX]o?bǤ&gYMl{P}7}O6螴u{kbuY^nxz0Μkw-}7ܷm?fPr&Ch[9L#]'Mȫ>eG5u^osb&YU$UyݵwLdmWMFxD"Xn$¸m gBmP6Dw#Yu()I@]UVZ|Z̽*#,ooӽcWV    iIїw`fKI^ ^tϾ6rjKE6GŪw٪;* o6˲?LWbrUj#BҽX4"|>m 5u,oжu蘬slcy,]شPzt()y6MCgG{Q{U /+.Yc2f>[yM>A6=k5-p)S[ߗgPU"iuڟbU?X{P{u*#sƅkEg=r]6wc=l g7XU;0M<:).%ˌm|eQ[ NE%uq ѲmOwiXvV&^BF{ynl3 o6b Xg/ zHk`7%k(w}~ m iYU?q,o,cqf5,ĶTtИ6С2 &4}gCF{{}`wªcՋ̹ѽ=poӽcg מgms]k m}c;L }iŲclM}ΐP{o-T;SD ڦǪߊߊX;͠cK1hslY.g>ڳs]C_wSB3}:(zU! C}ڙ7Uj;PfhlcSC5`P')ΐrvyk#>i]F3KN'g뛮_ܯCun-vPRh6TAtST_ǻ ľm瞩R WL虳l)?+g}ϱ6w=OrzLMϘ;%@royt٤zl *{nSߌJ<5vFb ߦסCI    3o˗1'o3vm 5t+ԉ,&U>iF.#,ňCǮ9^u Su׵GNdNs]kyN! mMf:CV gj٤R?CUB Sc l ͨv6Tg#{Рuϓ޿$6!tPx Ů/ -7a;@~zWǦ37N>~3 xOl:;Ԟ۵r[y#@.@.@.@sgަ Mqkgƫ<ech5uPG)HjA$T): ϡ6BCܚt wǎQUu Îs{6!a.n[ֻkG:s9ՆܯCJY:T' kq`(噌]{v)kmS<4Oc@wyK:}%x-';+hSw):uCM;B _Pnx\fCn9 f [3[=st/rh?9鶅 ؠ} `ȡrHμVj]4]V7<7մ*(}ܯp8DVo.~m;(f dj#yNζq:@~r|H;Ze}Xgs,l:1۬^\k7˗C O]g)C]??.6BA:rzPJom#N 'bͥ/㩿{pCryf [cOĮnm6rrrrI::GU4bnxib,Qhu: /R1CFj#e'>jsy! ]~C-Ϩ U;$ =:vwtOS8({@pIewku}< Q5@F( &cMa__n9cfoKA`?2}CY?xbc?z%@.@.@.@Edh6We/_\28/QʻjӘ4x񻿑Շhʥ2CR:7هijsY!.49_cB O}:_5ɩjvNlYNM@B~@1C糧<1@؇L]d}poB\2hs>Ĝo s}ÔզU3[yE'gyc-rrrr1e 9ȫ~EdU`jP.WÇ_D\!s1yun؝mr)yʡf q3 B:RuLAFa>37}él}667oNȏGc+;~bm/o+#@^պyCbةݦ-g}Gtȡ},yL9KVm3ֵ|HBR}&Bg&@>=lu.S)@{/v{BȻ~~hyw8UǤ  nv Mm%t ύ _~]&4xyy"@޷!Wshj#61B.s(P>>rh?9gЯTA^z6rrrr ?$ylD򶍘C4]:R7jb>tr @>=-sD'݀[S ˶};TsS=欏w8߹GNr|/4h(\rF &m(&7BQefBߟc;PSi63!{9{}>r%@08rrrrVn(39C3tiꣳaT рanBD6B)j#yN!@V!mGCCS 8.{{=1:4W@Bwc۾h~5{sceؠs 8A޿Mf*+:ֱ{MmBCLy3MλMMk[luwB(sCY2T[)Ύ5@mP<3LU\; Oggg6TV{3ٶ\C;@Cm ϩ6Z>vXKCu(Ъ)wES!@~Ln`gX5ywm}I]WsC;$o9 Ŷ Pn4țӹ26:6t[h?q!νg.Aimo&p0)3oanX͡;lP s:Òԧl;4]9s a%slYkLAuBoz^m\Soh0W>qgϿrDCOY c#}ڷVI;6:uϓ޿,ϟ;cOĎwӰ]l !C59v{KTTLMN .7C1v|նio"@W69( C\μC7%yDbRvflMfJ;s Y{FNjcԵ9>}Cb3~wT*x{H~jЌMߋBu?'>o9K]}/ؖj2|l8ku?{VǎGu[BX{;Lr @^zݽ}Χs[la\oWwsms#@^_~-̡}" Tbйo|X_c?0rrrrәCX|nVf)4| pH*X 묝ⳇ~v =/59Gy"\M]ߡ純%mש] ʇjٚJm}=vF/swc?8rrrrәC<֨ܤbզn۟b{f;諡5֡.b):\ZԳuYskc_ׁܯCQb3yChϪ{T%@^y5t*=ƳccVMֹlCߕ;Rc\P(qUb&b49OryO?E(tcXcWͲ9dS;)gZ x.ֻ>VOv vڭ>b7rߵm\n)9_Ϝuj?_7Pc?rrrrkڙ7uLNr;aYPCuIl|Nb3U7/_v;N)@Yоxn-_6 );K~6r RO[us*@s3Fwv?R;ޫ"t_ =ۤ>!2>h +lgX|<7y z7XVس[Zuj*4u:6wǤ%o C)űC ԽoػC])bcӤ(h ]yo\,?~O2fXhj9b3E}7NϰMl,~u6hbm`!,(; ~uzߐq>|/~qklج/N oiZM#?w,8&]B9d/lB gk u c c<ژB|~5ܯC 5"t ߪGuk} yxlcϭ={pȐώ'g]ߟh.U6SBǧ+OwUaպvnN)9 ;&u;UO}FsvoSp(3ϙ?Oow[s d99b6v&5ccbm)}.VŶh۴~mL=$K|{^7q9Ð\nT~ݝ-ݛ]gU߾~ϑ93vMP9\'gg̩cy#ԠYSTN4MA˾jӸ]5{OS팔VRwRl{̦PǮ)ȫH]S%dh;D_\;6SmUݓӦ|92}C|v<9t^gOR8 QmWw)75췭`M17y\I/rWgF9 -u]~Xg ?9+]`ؘc\m˹[|c]<}~_.}7Rvw]!^:vMP93oNe1]u;8 U/]U̩OΊx)f۴j#1Y&3kPB}GUHd T=zNWώ._?C{ΆW/_owy=g}7Y϶(ھ\acoC;_5 Ų;qHyM>|>Tuc`LŽ3ٟ:t5ԳY<~?9m@&xty;:ݼg:*1/ ]jb۾ͻ9XS޻>fi 6j]9_+cm)B=Ħ-%vv*>=1ޗouȡ}~|XgM{lzx/@R\Y~w}R_n2|<އ;8G`X[]^R:U>upari-n?v_fG\\\@V-?V@VȎ9o}xpwweow}`ȡz7~_{w_!rrrrh|)-o̐94w_^^)rrrrhs7~_cw?_)rrrrصXxZo?>~_vm    ]ϻ!0qK&K\\\v d .r,rrrr|>_],|`ȡ@j_e?@X 0cPn 30sPj ~/?̜9s ?Z~ًfN\\\~ ?~Ǘz]-EMu sg=NG_dTjCmj18_ՆPjCm $c|UjCm 6Um 6FpL;&W6ԆPj18_ՆPjCm $c|UjCm4 wPϟۏ}]]~.{6we6Ԇh_I~6ԆPj#Um8&PjCmTwLjCm 6RՆc1q 6ԆHUI~6ԆPj#Um8&Pjim    _MZMkx˗e=e6Ԇh_I~6ԆPj#Um8&PjCmTwLjCm 6RՆc1q 6ԆHUI~6ԆPj#Um8&Pjim    nS߰C.-jCm Ѿ6Um 6FpL;&W6ԆPj18_ՆPjCm $c|UjCm 6Um 6FpL;&W6Fz'@.@.@.@0 @3!@.@.@.@0P./{j=    j_w}pD!n ?|/Z.{66    ˗b^|GD\\\nw_ev} Cn(=?rrrr[,wO??._˗z C~(_ϯU^o﷾sW>X,Y׍|Ŏͱ#01~,4\,JO;_??qZ^~e.|o|PqϿ|k:~Ǯ⹨:t׭z5=N}Kc>׍lQU! }vqk `9w0-{8jVۮRW}ϯv_[!w4yH`~=59] x.w?|u}/mǡhs]N zlR_Gȡweˡ͇׿>u1kuZ,[..f0*t8yc>W_B4駟קM}Kq~4ߧeBF    _Wö!C?W]x[7PXMku>?\wuqh=Wk{wS ~;uA19"@Z7?R P>oKhȡ~X,6bPW,pxV_K?k"/}K<& E@jb=CWOwHl~Nl{rpvx&Z Ų:eеjA6UO]M/W}pQ}-E~1isnQgPXBh.οcs>0rrrrhm?d[e?Xvf1Mqoplgca2nX63V/EroRc[ϩ6}uiH|mظ<- kUbYn燐5vǨImLtF5QWA N%0rrrrh8/[1cI>9+š0k f,[7iI`16l-qȻFuɱ mwAn?6._C<mۮߚ <1Ɛo \5&@    v!Ѫ a9tF㱥 螜zuܧi°WϹzm R)!6wZ[ba&!K p`m1, {Ї4yHef%|^ fV_ft1FP֝)α1HN\\\+2\5su9*7!PPX0νyOB졠bݐ oS!YUDtXٱ=_ [cC?5x׍s޵]z6:    ]e3>ǂO?grOi׍cv(t}c׌*I    ]Ich槟YfC?~wۮ:~ o?~~ޏ̺nj#:סkFg }nW;*=Pblj]]M-u Ȏ9wl JfQYʀn,w( &H{H,XVm_Ŭw7 o[}5q&+m= ]/_ rO1d|N1@޴6RwV SyKqۄW4KO1F<4{     zʁۏ}] Ei౏`^yЇz'uL)@޶6Rد1rՀ}=@m?P:ucYmD-Fc)@    zʡ˳ٶ K@[3SeSS~T[x\|ol}& |$1>$XйUm]=rrrr(f|x~ B^/{챷6BA߮X04±} /  6b6 x)wc:Yf{+@~rρM>WF!@.@.@.@fMmm#pرx4U UXq#3owl%@^U'O?!CX׍1A\zIq  @~H!}+@^OCGoBaۡƜ'gL]$1cGMq6r9CH8vNfhߡ~eTB3wk,oWېkl r>9_,< 1\7 lf\ou848Cm Q !9q7y7PQ|ur;qP˾m A9s };@fGmp@9V5[0Z.r 6mC gt_>غgo736E? :W _aˡͻ?B'g١>ƒm eBxA)^r:q99 1Cu}n}C3JmP!&|/_81ur gUnYa} S}ț^YCDzmm䬸vecձ9sn _,v}c6rȆ9=|՟[`4g97bú3Ɔf)_}Z% )n e>;{xy6\"?/n >vMgLSn m76CsD!@.@.@.@aYNe^߆Tr ouBW~Kb.ŒMjn3.[nTR]b񦳏omW xNRaж}Z0O7ۄ^wXv t8Wf6˗s Q'|VH5+}4]5H)/]r9g q]f Q!Ძ4:a:">f g *:t],mic.9]7 ?&]jN?(P9g ƕMCɹ!$rZچ|; u.:S WotݘKz%ͱ@@/a}bl3I)pձl/EKp.”eG}X7zYm~>=o__n ?9+7]K׍9ȫhh ?9+gpȁC"Wg_oEh]U7C Wc7{Nß4H 1L}.oZX:mjv}s2t>|w^5um#+z93 @.@.@.@L 0̄93!@.@.@.@L 0̄93!@.@.@.@L 0̄93!@.@.@.@{Wv(~E`A/ ,,^ X~I RpbAFF<& *[[l0–+9w{Gii9q2{ \@. 'r rzB@.   \@. 'r rzB@.   \@. 'r rzB@.   \@. 'r rzB@.   \@. 'r rJ(6C~ϒso]/_,?~2󸵽Yo%INvP_?WEve9]1n[o0_Ws__5s@Fr\@@ rM@^̧k_&'[ Uw@ ?9a8j{bC,x;v'.wmo퍉KwNXG;~`NZ4n-@r̛IBk_zOy~m21# lo羊{c9t@nwWFg_E`xVFɹg?" _<rl2߹_5>/pklT5W?ůWgl,kO_;Q0oؿC*'   gȻ*~Z@|O~. QNA 9Y\wlG@NLy_^BQۿc#YZWuh}>-vW' j$  u;i# J>]2;?:s_H=Uo}^r-]8` _ݵ'oY/ _\s/ F@xt{Ńؾճss m]q[a};9P#\@. Fr|{-r@Z}~ hc_h_^=`T@Vҽ~/+S8V<>:_ c>D66lo{㘘"rMi[@r yϿ9s,~O9BKw~yy}(#k* _\ȡ,y?[$\'H8x0|e(ccm8W&+q(#I90?@r y}3?9^7mi# rf' o} eC_>Fget<>Є9h@r yuXht/Oړ,9ȋu~ܷ*Zcauh|~o{>6#kc ͑XM@H@.  w[֬~yyef? / gyqrNOY.DMo8]m06W>ieԽ|BxU/?s& j$  H@NȻ B@@kWL[Q~~Y@,tkq 7aIxWN(ul\?kOykB!曀\@. Cidcvh>xlln};0'V-۵uv>Kww|dcvk|{ sWVrs{\M% O?}|e}vʧk_&?WL*i1~F/뇧]?>O{eT ϞKwNKw«.B@>&>&2}>EWl|\SՄ*ϋ6{?.LMMjr^<|4uj{^%] c.+NÚhk( r9ml>>;;~w d'?Hvw܎?ɻ{Nmᰒ|{s1پ/+Cd{~pzY[3JE*Yѓ?sҠn?}?O~OlǴ?E U*2V&,/._ٍ} hC_6|/{/O2f9~hMsu>wa( r9 =&8 .Jw- i'h>ґqr~00^# ɟ/k C?u_\1}<܀?/I:cA@UbBadidy[u. O~|yJYs|'[e'֞T?y޻|!kTWs[bQe̍UUWvvbao>ؗ}c<4w&Ӯ_{Tyű1}/~`B.nS羭y{>ONZV4=/|uyyqTݽlYQy@Wr`\@. CP( ~b?9t!ybPmHky(wcvp7z]*N ׅ+9.Iys`:S;\p)}rϊOYX&"{ϓsK{zB+W|,jU3Wd?|:1|_?AO|QYD. ?=! &7OXxhM"y 5f8i|1+>5 g9' ]gC_''}{{:v/?4O\PT}C䘌ſmCᮍ{H>еiA c+sɴi+ƂI]8 =hd{~4T 7G{_Ew?$O_';g;ɷ?Vz-~fcdfy FU,z@?}O1'C}GɏU|eԯw~vԿ9)6zP0_?ϼ ?o* rgu ȯGn~x'QXk~/]GWvOGye4~P0Y];1-EĢ/ïzz VyPdU=hgŎ{h mKnB[_c_? 3.罷Ǯq|[fKw?yӲC翫>{krӟe}K ˫$6t2.:'js^%kn䍦梓SyͿăxwNܥ9`5# &   Olܟ;{Acy(=?ZY|Uhbp}+q"p 9_\8cQ+*WB޹9z;W{V?EEd@[;?xسχЗͯ<%<8ڛP#\Ď絃j?t-u|V̲GTyϬ#-:оV:*V>kܿB H*s]:qǣy>gC wal+J@ gӶ}^=/Ϳu"Í{]UD4GE,r5e/j_WoBާ~gWt- ?iI?>ڞ?;7?]wIy(.н$mV.@2 rE(W<\|e>EAS@^et!yb>Vӟae#t}/=Vnշ}BY}?^Mtu7 6AY6CqGmcqTa>Ety^%Mu܋&v]4}2@@.  !(z]-1dcv)`Xjd9U 7/w?<;Sd^u;yMe0 /_$}Yk?B@@$sWv &֞ g֞㙦E ȫWv۟WH(*dք:iUۡ2K<ǵ'-c5<-R{7yc#tnI˫k3-wa^Z{bthEC㮌/3㛣?;*oImu?~cƄ(\3d*V]4>+uJnO:eV:\>uUޫ+?w0At{M}x5ͳx؉P++OD~=8ys" 9Y[<%; IDAT+m !`MXezbE C!7%>e}hufyvN@-ЌҝSw :ok%tBpx5167|K+]ȧ벋.W/mNו9 @r\@A'yIݏ7w۩_.uwUغ|A1dvV`8q:F({b@*]/yZbY5ѵyyȫv_m?` r9 # oq~0L޽{s]f14n$;/|g"X轈,TF@>txӵ'v"f?m~wի'vQchZ+ eCD躨{ھ䡱?N1bth*m(VVUwl?el4=Go$}z(;um˻ ]m\]d  Է` @g]3 NƫmE/qV3s@~`<}$)7M@>ꎦsPPW@,jy ȋDP%=v=CǷoJSsnI#ty,+0BPxj}D'Wϔ&B6k]7؃#ԼKWFݸv \@. .W?I2Wu|y5ou]]Rw@tȓI]d  ԕ<َX;u>|W$"2N- ?]g_t(l{ǢȱPPMnWtI+gd@z,QDhˢP4Oy*٥sCǰh ^'BU0*~B糩Uj/].,^cU ü˗WݦpR缼KȻ.Ϯ2 rJ@^v<}_(i+ mK$`ћqGswlT{n|9LٿYe;ݰs?9|o;B_};Bn-yUɀ<y_#*g9UçW "xWelu^ضcBǬϑظ*: 2U~-B s֞{횮ڡq6h]8UcoA+|2 rJ@>\ߪ$h EY^g̀<:?}Q˒'y~_g0V$|!4z&Z.ӵ/˿׏*}3w.j}Oj@_?oش)$I;oܙ+&!T銺PQ$*rdޘ!ef}X|>,utU[VT8*SGm mG1UׅJ3dtv$<8q4UyеRux;}1] cAgCU[k^%Mkc+s@r[ ;3Wn3 =\8Rcbc#\:χ^vlo|¹ _V0?[?? [?6m=fB1XhdZ8"C׾t'@!Cf(9-̨z|B*W0~F$-Z^ձP>t,GbsnCqh<>]Fk9G(~yުib+۹G= {`ͼ>L=[缼KcCb'M?+s@r>k;\ߊ>$6رxC|<};k+ y :ymUȷw'0'[hw$=B+K~R|/*Y <"|b>Nhϴr̋>*e_/4"X]W`P&X^ wc1_֐/u{U`c66zVW-]6-sT16b.kOY^d,f$چ8˃61^+vڼO= v0eW0N Am˞򜏮˻{!w|~0Lw:?mˡյ%O\?&_?,B@?~^e ȟhx yZ=9^6.!]ۡJ<q?0U"^]hH,62zlyX;:NxU fPJ%UNYsrVz8ߍw*dؾ|b 7ݮ"qRHi$0uڷ1Ko?/㋷u&'3<&9.z :/ {嵃^__ou;>֞W_szd=v] rR@~~0o&v3fOx<=9'[τԃFu;} 'ył7Go 7n'R!yW4O[|OcOs8?$IoɗUȳt\G3/_$?oݧk_&;?K~Oj [ܿI}|eTͳ,>zaiQۡJx\ ӡGgil=o}XznߵQKlO[WK2B秎Y&Vd nBy2\^=ń":BGδ+P/Ưure7|M^#5^>^;էςY&~Y|UZqsv?_v쪾we9OU}]Ooړ=OmmCՙ+IY?WӎA]d@t!< "tO{!td\svq\F]ue!  ԥR|,?3ݬB@~nBsHis5\ߚ|s$(re~_t!OԸҧ|Q8?i},U oi_bG P tyZU y}*YZE2yhb|=^yk.I{eN^+UK ':KW#W rqjc򮎍YÿڞW}Nb;e1/g>t9qcץ9 @\@. CPsKYlh;fOW2?m"ʄ8u~BNۛ'zo+ ӦOI}~ SzgvE?w״/EWOۡJT\W|z ͚ cOnGS*7;>Dбd82gp\Y{v9mule"|1kPu屑yӮj{^^9)ywA҅}8˃7~K.r9u1 ?/}T gOsKahJ܇^'weO@Q(;g@9P &!D֟^U, .~d#fC(ҝ=WγEx}5me/0*2>Wdx]x}r$սsǮ.4U+j]ӿڞ_-?>ni^޶6cX\ێ=\x]  0wÍ3a8,Cϳas?S@m~RdWNU 6nGŶuVr$;:NgO_%}P=~$gb'/YeI)V'C_H~ǧ1SO_췾M@ /=E\;MK|,!^Z^M׵rE^#ޅbyuWg-ekt8Kwc'tM9'_?<{?+:qu=uqrq_߳jUo'G=dJڸlwFLu~_NI:>ơϴϑ29.'58r~~'65ϛ̍~X`I@.  ȁo2n g ?L6O_ ȷwM@#-]34FI>FW5?M?PYw-=?mlg `r`{T@~~0l}`B@.  v흊ǟo}$\@. 2غL o$   ?w]0.J}47#+7,\@. R>;]0D0?\@߈169\@. w'oasOtHc r 3ַ r9s?&ַ f r dcvY r9=!  \@. r\@@Or9=!  \@. r\@@Or9=!  \@. r\@@Or9=!  \@. r\@@Or9=!  \@. r\@@Or9=!  \@. [ɹoӮTWϾ{]={NFoW̵{V̗{gu͇)\@. [y(PȖWڝxkߵ}7&.9=&~8c!9iѸj5 rj6n$o/'߹SBڗg~R}zxt re7+AI_F/H_0_<+M/9]6\ݏ~p/Yh56sy*˫Ck׫36`'ٯr7OߋmX rju;yb?|aD{Q@ h:"/_! 'N_@|I:1}>˫PH2jul>K_cn#'ҝb׎j@rllNM@^lWL[ӿ/#+t.|xzv<G '֟n s8.x+y' j$  @@4y}Ys ˫gwW JWEve7]1~*ϊGkAz܇|Fuo}CD΢ ;:t\@. P9Q@ f:K .9eq|q ȋ; 4op֞#6Ϣf8\`>ơxl[̏X$x5 rj g> `Lzt49 ȋu~E7>?tf=( _malLߟb=WsW2:mghB|\4rFr\@@ LG9,#K_ݵ'oYrf' 4o_;U.9꾝N&~}lLG{[2ڛ#(!曀\@. P9Q@ det+6y9ȋu~Gw!n8 |cǩmzO+K«_y&C79P#\@. r ȋʁi+J^/: șE@^-#&= j EW߿w?b@cmCh9|5 r(lcvs?}wdcvr~0ld;Ídcغ ars{vi|;t~0L6n'w< )r ȋt?g:o}~x[y1 dWFtyt'"kcr-n\ǥ;߻=N_YM=!hslLqb@zTԤ&ϓgJS]ҥ `OqnwWK@v@{ }|῟7C h17r\*3UG-cm=UOcTx8z IDAT}R\7uoO{x|/?0-EYǍ4O"V _V}ȗW6׋Y_ҝmճs.c5˗W}z\zϯVr79/<󜼪6skO:xVQǜ s@90E@.  !VX;q~0L=/Egw<̵^jEۅ?^^@μG9dP5Ykڥ;wVe&_6_^=R|=)e $VFC鉵'O; x+_5mՕnܖXTsgU|XϨ*%tߩ= ݾI/FzyktqlL˦ŀTok^~^ϓ֟?&M˻~)3_]^-~^nUw/lwԵj.Е9"  0ʂ2QEĞ$IUcyx|d(z,y}@O2u ߆F@?ܝ.+e_@2*/?_@zF^{FM]۱y*Z^^RE״:V sey+@<6BO_cPL}sXoc^^kyyTUQT6e]κwLB rH5\ߚ~)iwxC8|:wF䡀<܎m~Cշ`Vb1⍣71Ԙ~ŚQĬx|t<\VG׀|V}j0<}*. F4~s6 G{,}Ch/olݎ~7g_bpN0>o܏>`\v@>n$8|:oSXb( gu ȯGn~x'QXk~/]GWvOGye4~P0Y];1-EĢ/ïzz VyPdU=hgŎ{h mKnB[_c_? 3.罷Ǯq|[fKw?yӲC翫>{krӟe}K ˫$6t2.:'js^%kn䍦梓SyͿăxwNܥ9`5# &  5nڼw lGZĞC?ކ$Y֧/?L%9c|g^3Ϙ'M8|>l~/.W޼@%v<Tkە<`UEgX=w|f=i]AlWYWjex(YڞX@UԱU>}C=+tBXX c#^ nWX8yyhUdI[tNyyTu:ugpgNwB1ҕ9 @ \@. gͼDTd56$Ix|"bv֕0Ű YM=v,h`aV:n( bR/Os ʬ[/b@:7״q=oy,f/_^:Qc8.B:"]lӶe ,ot!|wu塸q-:K <*Y?cu"Gd9Mf r2-:?YCOĂpg;7wI@^O_#šUBȵ'K U E cc2o8L- N"1T,x)duUshlly*Wy{@Ucbcާx,oϮ~ߏW(ޣ<-qԟϲMh.i|>w>%6o*oбwe0\@. CTy(M+~O;?yw?dX@^d[B+}Pӗ0gBqV,P KՊE}JӄAWE CAEU.y c+ 檊,`"ӕP1פ=ोBI3o]#u}=[+tqbv) lړ~=yy9yy4yWβݳo>Y!{Wr9DmY*z]Y <wP@^4ahm1Qnn_`X\ `LY:ڗU6BU蚲hyh< C0OyX>XGtEuhHU&ݖݞy{HVӟae#t}/]1>kEщQcsS<ڷzjr_Ь㼉* V0c.k㕪WP>I@ލiCǰJK7xw;<'eǢW]if](!}k>ǫ}ly>SOmyеHy҅buWyl{^޵V@q\2@@.  aɟ7Go - q(mOƖ# Z2ʷWaCRח~>O2mY="䡐]>:7"ު6]!2@@.  !CWawSywF ׷Zy" Zt_8']ۡJ]c̗h8s^h4y5v&?Тq9Z:C+ wMc#wu1 _^ ײB޵HyaZbY5ּkc#D@^bo M@.  !Vr7Gom'OD. :w?zMyw4;ӥPkW+=?) 0ۅiȫ^=Cʬc@5X6/O2+f<4c:]ilVx+Ѓ&5#u.y[kA|Bw]" ^ڜ+s@ rJ;?&7w{gO_|)X@> ǡl`* zzG@>th*m(VVUwl?el4=Go$}z(;um˻ ]m\]d  Px3n|Voڧ*Wގp}s7Ǽ,1}U& 璘wg^B.Z^GpU5 /EBPLXS@߾*uNϹ'͟}o籬P Ca= \1>>S ouݼ/? "tbZS.; _uںۍ+s@ rj~0̲pz~0le_ Ȼzh¯w|qX(_Nt@ 5T钕Q8VWmEWx-ETSy CL ;UPf.iwIT^ysseCdc|>|y5ou]]Rw@tȓI]d  PPx5 GшIغhؿs?zE9) y.mKWv߇PK^9&XPd"B+XBy ȫW'W.M:EP: ʬW:MR|Bua"W@>}^6:]D@ޕt|ve\@. CBtֈ6O_T( /NAg+a8l/zU_UڡmH_&@D ұ/|VmrպE3J4#kB,#jY"*W|^ 6Vp[U9WE^?t>^'Wfu ¸ECa{ړz]ձP;4u|a^:M>P`PǺ} ]M=he־Օ9 @r\@ E~ 7a`~tv_$>?&8ZYWoemCי ߽M?iЕ]A\tE]j((TgZ92o2N,>l?nucVQ Unb#϶阪BABhh2:m;ld8|llݮX ׷2F'Oۗ$)%\@-ȴ`q:O~8AW3r9D>[!N$IE#`lO>xcy$_c\4-rיȻyz]|L~8V iq5}UZ_&h LUEޱ L^1;6b!_ߡ=bll ZR9:.Z,mZ:bl\ӟמнXH8ֵ qm 6c{W9]wISyT#˫9[ BWhGnW[p8ʇӂTyB:oؘʀ|Wǟy[AhzE}wzx=]wES҅AƯ7l:ۃ-].=txz2Hq: ؟ \@N b;>Knn ÍN~4ͺZX|$Iw`u;޹<}9z{o?&7wNE߿ksdީq~096[ =I>}ll9㴽s?uwھiysaiQۡJx\ ӡGgil=o}XznߵQKlO[WK2B秎Y&Vd nBy2\^=ń":BGδ+P/Ưure7|M^#5^>^;էςY&~Y|UZqsv?_v쪾we9OU}]Ooړ=OmmCՙ+IY?WӎA]d@t!< "tO{!td\svq\F]ueQ& r\@N?Zu;O@x"-X.S& ~?{w"Gv0zx? u`5 0 A%  NO8Pf3֙N 6ha1 vgA_ϩSuNU? Ob~u!V_cpٝ O+@o4A|G s;T)AUUE׋BTHv9S}W`n%Z$uqO.cud赒b_.`^뺂jR#W Oy1vXsPKސ{^t]<c^^ e>|n9q}W @@.  !*e@>$_?kmW7?{ե?rP j_ԭlo3Zߔoh/ `QBkM) e2fU6(4*܎>O0'~K7W׸7 Z;wH:ePςp<5KmmHD>փ/c\%uJȻ~*<1=n.L߹[m1{x~,Jl rW_2n/?(noN >jE߰ǟ~ßq֯$Z)Y9 *c?{|WeWPbzO?̽_@/ڇ}z͆QEnv f;*0}Mh-0s~BA IDATcCU]K{U=qm EocAckfsNhf޵ݒ/䞗?~~>{7캙Ӽ<:\Y_öaW:ηlIs@ r|)y\@N?O7oow+Nߝ>?򛷭~򛷽. NQ_~6ou?ُX?ß^xweOo;O?`mr ófoEU!ml yAk={7,*؎j;O!QYs赺Yn E ]Cɣ׻X1qXWcu1L-x~8!+u唟^}:>^ڥ1k(}xq^GG;8q3s$98yy.i׏Vϓ6gwݨi?zv_4# hUr- gOo~qɗY症?ٞmS@^S)8Ln;P3(cjs:~~APYNvO؞lfK*  @Dr r9s  @ r@@.  ȁr~rhA@9 !79s0J@ަ r9%  @ r@@. . Ѓ9 9_aro@]}\@.  C@.  X\@. `!r ȧ k#rM\@@#yr|O݈| 9*/ & [rxy\@@<y r ȗ3\@0E俚A@޵_π!" |ny'yI5"0YM]ox\@>kD. !yZ@>!"PX@.  K@. . r7 [Dr99򾫏 rjr9 ! q@ i?ǟ~yX@. >wٷ ;r\@NgOO} K [GO}:\@. ! _*_}췲\@. > u7]@ ܽ?Z(|y|H@O?[(|yH~םUٷ Ox\@. k@9". /'_}SW@.  ȧv"Oor.y_~6vG@. O7DrN@os ý|/򚈼U@_~睈F@r|_v?u\@. z' ?e.`r9 <;?}"  $;'_f6`\@. S?N@ξ]/, ҂ s_;7oo?Zm8yV@.  K \@. 'o}\@̀uD. '9-?{_~6vmg*  4x;:vC@.  I$/}! y@ /y~-b\@NN<o_ryhI;5vK<. + o ?yx\@. _߉\@sb櫯oWٷ ?a|v}uOM* /6  ȗ◇w];viyS+  S?߼;]~ rx;ٷ Ory<wȓ |N<]e.`-/ wmv=|U, |Rەt C<ryfr?8Paor|?]~@qiƈ;_@ [D]ʀ| 9I;IVyM3=4 Ӏ os@& c\@@7Y_ r9 H@N®s9i\SMnx\@.  J@. w",yMD. mh<^T@|/j &O<. _X@^7Ȏ\> 0y@w6sx|y<"D je\@. }vro/ s9{^ܶum˳wE`46mk/) ow98"r9L@ؿ|xU@^J ED ! g <Ԥ-|\@8 Y\@ ?S5^2gs:&yw gTs|h0ݙDu+ 4 wEMB7 ?P!g}$ ; ߷x}wFFsţu@Ꚍ?V7m<.  )^}zUggȿK3[Wo0O@Ngؼyަ9ງ?:z ˹QqcymPrt'  r5V ߾ۿ9BUP'׍r9~Dj3c" _Q>¹>M-w@slajϽq J@. w 'uڽA4v_K#m' }&R; =!-oND@\}^K=M{[2"9'+ _kMὈ}tz{-^. zmTyS+ i@^7Ў. Gr_Ljet76Hm/ל"#o5^n5sɷ}_չp|Q/spR= n|weɺkr  R yS_- w k"ry۫RխHͧ?C_Mڏ^F@>>9m5 ȗ.^?*U;ZyGs97ǧX:ocI;~9@T]@"i\@^egc7৕3  -! }&RS2rӫjwBҎl^;E})΍`NŶqЖ9ļ & IqXy<{@"vo wVƕ&vE)A\@N_5ͪʹ#)Vusc{~zzU|_X{*M3bQx|>y-' iW!/`#soҔ|w)A\@N_5cZV7R/4cbH9ļ `yʀ \@>ӫq!+yɷUe}VMޥUu?zуW}}c>]mˏeهzOŲRU~XVb^pݞ5ctfx>'9ύ>PMmӔB9u!B'Cyy)JB踬Tpp=a9q9X^y5U@.: 3_B@5" ȇڎ-^v67oR]T1P^i7yo*%Ool~~3'նM`dL^~CoT@׉)uSשǻóܪ;W7{ Rhs}M¹%_%6cƳwc l^NP ;t}u,= &<]zq[]oXr/w6뾚B B^  _Msj^^йRڝcENq~]as9X-g|x@""?-"ryzјvo ]-B`g7#M?Tv_VB@on~^}|.B\1;Z rℶ' w4gJ=&GnQqA sg{)o ͍SMKCU=*9=%ǹqpٲkR6 ݠgNIϓ1s榞t+;'^?\YP@,H, @* gD_oE}CqMM7?vޫZ& ﷏b7?/AyAm޷} y}߿^hu6cK)h?_ϑR\'wVWmپnr߮X)|̕זw7=#ǹpkzċj<} n03˵2uR^9%)5 fkxa%yyǞ6Y@>B<.  duWLI@on~^R@ٻO-"]^5??+7i5_sCpL¡M8Mԍ]sCqh:˒gj(߾CY9.X)mϼ6bsnp|^!>4z.sm>'+Ko^ݜok^^.sعyNs`k} %yy!"#rJϪ_n2tz5|UȹGԀb~m}Ms6o꽗vcJfr&J CGەVG3B%9GVI\gdHشjenEڶWl{bSƐ1<6ƜChsc; =%|_XϵBRszo[zxV0mFls>//Ŕ[}Go;7_CkjM_`_R_wȧ;G/lGu7MVYrIuSmU`7ỏ>zq,YݵfMswB!xS)򥃪 IDATXr~br]Ѫ27SP`%\}uuN - ˧WO,a Kc_gC\5P'}~庇_w{Q% ۦC6ߔ>//Ŕ[`MU~V>WC;mե,x€E,  ۭB{ӫ7n;mgMSC7!?~CQ,$"vⶩVkk< ]?bI E.}>;bªIsˊuǣ}k躛}RŮyP]ϵY|I+{|iz/ԅu|ϲ˃cRXRLuR6!-CWow]9 ¥_}\@. /9 o ٰ}SnqX7gW :^-'sCBXpD|+ǔLyMNO \N,?R}LBgV2/Ͼ!Ul{ߡ1V zh@r1j8% z6Į>3)\SQh9 χ MO+epJb-+n7mwM>z@>v<. O7Dyn6SnY۫Lژ EJsֺE핽nrްzn Ĕf܏{B7O"YuSĂM Y.)g؋agh) !LǢ6519ZB:볲_ҹzB14㱶%)k(m{peu-Vrߡkg;t)e^>yqeo })MaBcб+eF5m@j~Gȧ;Gy("=Bozu!ymB@onۊfCBӫj̱D<,S@ &f*zuLRF=?Bqu37÷|9 hoxGs? mJNW xeskbiyN9v651I:XwydʹɷimKm5{}fv#n=imSڇ|3Ƽ|"6+ ϱ_چwϗpf*ry1"Owrdjc?;fyxV[E. %(&о:E]cMWlkk"w@ ,zqLBQ@>ι~ʒ.yh?V )΍x5L;F,yV@gL /n]u?_#>. Q= ?vo YPM¡/ 9]^WuRGS^P $ OvixD1;3Vq_KcXc`IFl{/ mS}Uo)#.a^^ 8bP` kx\@. _@ B^B@9GfM:n wBB@T7Jpk"w@z!cQ(t{@>ؔWncԟQo@^|jաqbkbyhUUp8"uFlӔ+geN%szm5//E<:S_-e6Pk:( xc@oxQޫ 4ۮ n^R" ﷏P{/ó435|E^?}ws SȾclCoKO"0BP']"Cʾf^S^ }1El91dPx16Ǫ}ϩ|}V>ߗ]V*Omyw|R?t]/m"{^^):ܔP%fK:,O7uȧryIjWpr3EukhUMuRW # ﷏@@>~LXLyMb>cA("n؊s CH(dsPx}y O[&lˡ9*KSFKWc_|9 m9//[(5N@. A@3"P$V?7^ɼγwU{_$ ﷏P<+goH.6#jxϩ c)WڌE}qYZP51 W}~\o;n}gМx0nQtlNuЃ^ s mγsK.7漼Sm!<4{~^qȍaw?z= ƥG9}" Och5tM}GЊ]ǩP"'vۆjv<cd9UYɃWibm59b҅v>/nNsG^}U9{h<\s9<>g֟yFL)63O~pN)s@KyWm"Xg"MupR<=t?nR> B<95䊄cQv}ԍu.6vG ٥7惓5cSHZ΀|ګt;IgoRLó~m~:WtkoCZ+],gնm]Is@ S#yCD. t}Cמ9 cN S1^}Cu_4g嶮1E 1eub>(nu=zcƝ.]luMu 2|C#j^Vvnk9Zz%|xl:Ǥ zem ]uuun'ӫXgA,8ۖr^۴CKӊ۩}x6E|S?qJ=W/hz!pzq=6?z:?r(! >.T]>NoGRLyG}cc{{_hq>zA}W`yxuH@.biź:}£*mW:Emwhq~7e[brfc2\CJ}Q(9zh_XsI5SC-!s|%s RE7uݎ!󯘮9    ]%Gc ӆ*cE*'}b#4u~ In˃W#1dɦ8&}^c3tLqܹ[ SGwK,h:Ni_HiƚtݤJ>7^ew.' ߹;yy rmCَigߕ2X##ryED. .Tg/v,{'~h#y5>^ ίNڭoxtp~%Mrlxwp>ގΣ>7>޿k{cr|>zWdv_WRb̵JF+=cg; LjOK?7^λ3 ?ZUϐ˼<\[sίBa:<U5}AIs@HVyπ|x\@>N@ !\7yU=)ыǎqeD^5U0urxVWV {Y:]t}ߏ^WflG㳽!CѣU֝LuL _+?TE~NkkiGPNƛ{8Rϕfڱk!LJ݇ӹ~kgq^ϽbɷãSL}1ü<1zSL Byqn~7j=PkIs@W@ovIޫw ț"/,AUB@N°Ȓy:Z8Fɦ~B?ȱ>ʶ=@2x|`@7^>}"% YPC|%}cK9i 4V!|V׎y:6ٻn"0ī [Gy|7"3{G8 mMi#y΀|7"Cf2VO7y' O7D/jyM@ 9s' H@nyi7VW@Kg^o@>xr9S>3 5 ȧ\}|y|o݈<@ZV߳m, + ir9 ! pqy<*}2 -"r9Z־ySo: x<}D|7"& bX@^H+㟏x|K ȓ#ryUT}WgX}\@>r@ <x+ ߻|g@{y\@䁆u<#䑈<@ZVS@cySF ;dy\@@€|x|!yS/=y<=  \@@<o݈_D{ $x1yW@~[5KD\@@b6wmz@>*=ޫ Hly7Ey눼aLsM`% ȇS}QW䣮>. /$ /`i|79\@. y0 ߍ`9yW@|2 /n)6|uD. | "E y瀼)"oyA }<ȇy]N@>m- )"oF򌫐HknxoXg@^ ޫțh> y瀼)"x1 |6y<"Ȼy€<* Қ> xg@j3B>4 /fr9S@> 6 o\@ozݪg@#"ߎ|+"`w@~% 7Cw\@3 G@5d}\@. [DcB@ IDAT[D~{* ? V7$ dF@*7ȗȏȷ"r9v]ǏrFD< 7">hf@~]6 >>o@#"?8[!{@t}@@~ V[[`fyyFSfD. ߻B}V=xY@V& B! ? {DrUu O3mph+xɀ|O<4 ]!z""xj+;y@[؀\@>$ B}Vh@("ȻVӋ 7C}qֻY@y~@ߍ#nʀ~>) _!?3]e|~<J+G^+Ͼriݏ{G;C _ En `ZM=kx|ڀ{O +mY%?>. /7\!>h+\@^3 /B. λxhx|x|w@㉀ yӀqDjB}֘V@{}\@>8 ϹB}Vqyd@."oB~) oB}V\. 7 ?>. o_\!JـL+ oS ȿLt<+ >>,o +m\_l- DG@g}@@~= ?>- w G@Z<" B>& B}|y yPD~ n6~}p@~*gȻgVȷx#gjx y| y@[䳯 ȓVȣ ڲ>|@G"ty>y~Ψyx|H@~:_[!Bg?Bo\OG[!fg-Ay@@>j+9,Y>ĺ!~) ŋ/v.w 3 /VȯD/_SA@//˭F7Y!S+}RǛo+9@u/x-w}\@# ?7Z| |Oɛ9w}y˦Y<^0 Bq +U%KVȫ>yQbyV{˿Pﭏ ȏg"~^* B# B."?iY? >. OB~C}]@^|&^:w ;sg"VC">D{7OP+j}<[yx\@gX!?_~O<}=||_|O/^}z^/Tj}@<. $ /BWo~O|>yo>O/_ƭ g"Ȁ6܉7xxSyV;_ȅKr9PRtװ! GF㫆 xyCDkEH>J:(/{ ѽl`S8Qu Ǯ++ w\Dy*yxP^>8SGFr3x ywLJ#GS#y+5?=ȅMbA|)p_twPBt:OǬ_wv}7rV""C1A`0' Ӭ DyP@~;"_!>FCyʐ|UUr98ѝxp|J'ow]?ؿLJyt@>d|DDBnDf|uX~OC `c+Mxp"xր[<̀ y|! "ѿWɇGk}E-ZQ]Ot4Ⱥ&$|y"KyѽC;ph6/? Wǭ3* X!_ c#+D'CyU YDL),~L! !Lb(2o?څk|@f Fxak<>̀tD/ B8"ϸB^2"OF!$ H»q$OwʅDK`P80Ҥ X\/' GE"R| / ȫEB!1(*g=" sU$xtD>i@."."W~brah"/w gxP8.;_( oO E"!|P.0?(a'H. xx݀L<}@." ObrqyoI~nfh\8'k}{@n \D4" 3~{IE/%xK w FBy5Br1â{x^pE<^o}YkD8$ ~T݇0A4J8&G[xx<_@!"uJDȅCQ1@kѽT4?qp\<6dCyr+"_v<0" D?yEw: xY@=>>> BnhD>, EB1urK/g`C`Y4b8~3XM! ?W E#!|ڐ|\P*Ȩ`|h<{8 yo~JW3"_f< "($ʅDsӢIOtX(  3G"cD;"ɫr9T įsEJv@>e,.uD,Ybxt<>0/?Ovyx<& ? #WDr."_>$wDqyWяA a~q$>$?{azy|r||DLc_X40/*! s ć⧢-ӎjp\]DmGH)&%(O˅ŵѝKX|`d4\[ګ&]/B~*"/B."߈WX#/믔 ̅@UE@Աxh|p3Ͼ>~9 ||ʈT@."Y#/_\*/׈Ea(+MXT8%ǯU=WYVE5"3!|!yhP^8.7<@`VL`g8:.' ǏVE+F Kc蠼CXX\Jh'S(u ƫDeq+;#]|||PL^6(WDwS27g ,x"+"|pD"$o4[H^1&&(x`|T4j8 uxH<& ك7 ȭ/?>D䋅McrAyڸ\t0ƨ.$WWǃǓǻV#+_b<~||pL~*( ˅X|x08"\;YcǛ䳭GWE1y|tP^1*O (ѽX<$0/sVE "!y!ΘyPu[1(4<@=*xh|o5 +o)qxxy@~9"?2"oO"r!ytL_Z*_%.+5]hm;Axp\<>< \?_ [_ ȭV[E'B\H.&ocD? 4g;~2m<~8  ȓrcT..%a 3E&gg x_\ ȓD#Sy`@jD&$W 3Irq9f㙣x4*H'@w5OoDG&oǓK"r5,yҐ|*yژ<{P.0?$q- IDAT">g`i4>zm6 g|PF#!yUC1*Ayɨ\x0^t/'#ƣ_x8@<(  ȓ E+WbSDwixxqxx0&/wʗ {~Dw Ąw?xp`' x(*Eݷ2"A^*"oocAQy@l.8c%♂V6Û%oqVǻAÀsN@^2""!||tPlT>00vw-bvxh|p|_'N>> # OB."ϷF^4$ɭy a\to!g 3 EI"_*kIrQA@Ɏ(, Wx|p<.  "r!y\T>@/Ƥ*Cxp\<> ?jVGFw>"Iȧ+QyEu}ͥOqx|t<= dz? Wȿz. \D*y\Tqя[It'@4x`d8-OǬ?W EkFBVg Ep^G0~2 k#B2k!1\TfÃɢxxu)?׍ȅC1娼OX~:*]v&U(" Kk%ɿQ/|<<$J(&ʻbs _R⩂x&x\<= O>; ?׈ȅc^bfayQX\.2XCpҫ˙'W_+.* o"|wL8(Oϣ,._5Wqxn@޻Ͻ7h3 \D^`4" $?W kEE?2`E=`ѽHX|`Z4[S#||ŠRT^tl|,#HOyP0.:.>2 O؀\D.$ɋ]GD?v;'* wx|H@B&"B^>"OF/$?7ɗE<0^N'27 ㍻TxxuD.$ ʻD e?'xLm<ݻ0i{/x\<>o<|! ȳEeCr1\\KCD' ݟֹK:Iw]5qx|p<. sA|@L>$(_{{FgZ~kpH<>: ț""rks%bA|.я-%d ]qxxhG*6o<]DE`D,./bND~!$/O/F1T5/w''{N|x|y/:!y頼AT=,D@Cx`\8>xxY@g4r\H.&-*0-ʱxh|p\<.> *"?׊ȅ QѢ{ֱxtT)ǫI>||ƐKD~<&oɧ g ˅kW56pc'/7"VS؈y͐*1QD$نͲ6nu]8x|By\H.&O%5.[tEƅ-"L<^o}|RD>  DB1RAy\xAC'w(fT7GF޳D<, _=/ G ɭO ݷDm;4xqDFDGӄYbAye+ ݛ+K>|`#]. '|_L.(-"!!]t!op0~>_Wq\D>AD^l\H1$ ;~8 u:wcpm<F~" !\XEC`u}ɂ"Uy_6# y@."wȅbra9HuPt%m<}D>< ($y.9.w_ЄYx|xa@> VD 1 [ufSFqxxQ@)>~;  G]#r!y_P}x˖lh'GMqx~@-"2 o[#SEGqE[À\D." ʅ3=Q@(>E0z8.A\D.$OW s8.JO \DXD $OFq1ʈzEN-&]G4\D."_v|ِ]PETFp|qxx<"_3e#Br1y'їJ9ID/ xx<[@ޱnE#r!<{PXT.<OtNt:'D]8^uu\( +/WdzUxxEkBr1y<*<`>eP<$Z׌"5f!&sD"9X/xÀ||LJKD~1$gZ#Ʌ ~EkO ;u{`\D^2"'$ D\./0RT/ƅWǟWVE1DwVqxp|p@~nȧ3;Ȱ|UcrayCя V3wSqxxX@."dž#!\X^Y`5=Ģ;(xp|qxxx@<"GG䓆]3 'SpYt״T4}mS8"/g]saD^)$%JgяD ΁;hEBxp|x|@."."'$>z~41/,;m]ppY<ު;׌ǯ"\k;BskbrAy#]Qt7Utg6y4;.oW:Ey"uB$1|2dTݑ+qxxy@>0"7 ?gȗ +䉂ra5nh!ө* 'ƅ&8m@~6''_#wɻ cray_їy(ƻ:Zxxc*Ǜ"i#r!\X>cE,+Dq:\D>>"gȇb!y\XS#_Dw&Vt-p\ѝT`K4.3-xQ+ +"!|Ҩ\X=Ugӆ= x|\<~$ +GCv1y°|\Xk]6~0wǻGЀ<<"wȅcA%wƃqxP<sg#|痤\D<$;pF_ f'+5_oq|∼GH}xs\ \tr,.OX8./ D!y<$&#"!,, -Dw:BFlxl8>$8B1y<ҖTE5Dw4iEwW"Z5kx<{8.oE䫄'b!yPL^&*>;"[-xp\<.ȅWb6!ypL^**>p2яw8n$AFEqG@v3*xsŊ0>ܖN.ƛtWX-/_c*JȋKo' I/>Jw!{, 3xKZ0o |||<O/`Ф+=0@_j:uLxf<COH^4$,&_6,O@t { ƅ㻆x<4B/MDaD[H.&,*Pz]AK4x8.!oxǀ\D>ODUH^+&0tst58? "rȅccmR(YѸp|x</WDUC1y?KKԔjJRu/l) x^\D^0$U1|᰼\\~"1.e1iPxx|p\0  g ubţray Iw tEG\D>oD}H.&ZTzaJSJwG*xp\ 7F.$*&_+,8.PM)EW\D.$OD31Qy\l,ҝM0k,u4~'-?;|8<~3  ]%/{I/ܖN]qa4.wO#3EوjH.(Sa` 32f w SCـ%tIDAT\PĠ/I7bY U/_ȅBAy]Tz@$Z⻙1W OOO\}v/Oꎯ}sзk?Ǔ~:F\v;cvw]?@7n`t2^PzֳG{}kvg{ƗZ#ekڏT[{{]^L+|O~þD#Q!y!Ș\PF\kX-Hw7IwMJx2_1?_FW|YFɏtz#cQy229dXEY)OuXWd3^*!xu|xрM F0|GHϼkTxUʱxGD3㣮p< ,!PoIENDB`snakecase/man/figures/snakecase05.png0000644000176200001440000021537113420607650017252 0ustar liggesusersPNG  IHDRXٹptRNSTC pHYs.#.#x?v IDATxwu?g&=YҤ+ 6{zy;*XQ+HY" H& ,loG-ɦ&cL&yͧ$Y!m!T 7ב Ei< . f5WAH+'JH+FҶtik(H[{ vP$/,A -:SʅaH[@jE"NҊQ$V( w UH Jw(H+Cգ~u?50VJ 5hK3H@@Zf(HKCN*w^{ڧ=\ eucXK>.rz oŢ3 : !=9"B vTS]!e{}N޹F% @,F1Sy4n *Mk9 '?r_V/: Ja1O3'Csq8]Dx&{}Dž. #}# o;{i 5/P3rD1lpQiByϗ,Gq:4 \PV V5+8U\Z wc7"X=Yxid~bCYeg;;|2KAOC PZ*Ϻx'$'?r_6(rO0(@}bh?t蹰҄5[m.aѩzwŀ v.: PO7bp Z .8}>s7I8tNi\,E-%c0p`|B,~:2-1Z ]M>n<Ǫ8p& 0v&_y`ۑ=G.9څZ52R}h+lN~Q;mS#1uߋk.zJGߍwl'>ss7%Ƶ-Cc2\j3߆A6/wnf@_={gW+oŝ-qJ66>viNk]FŴ=V0sr0/gtN8AA*S><]ؚ-jƿnWͫ_u As|G~? Q;<`y[x.|--'yaШ V"y# '.BS#繤,Rea[TupۮsI0̥|Ht_1Re *F_7旃hV` υWD\di<.&p\xz# '5u)n|$PD`K v KAQfo},LMj>q8υ W5c3sWvk(]&\x4~ T PO~ؿ9[/ˍ F(\2 wgajsuJA*գܠkSwx>':x^/D^Pkw`׳нXcR=ԻW'?_pҐ\C 9|sI/=b$jEj+=PMIЫs%FMPvzbv߱Z?%^- ;F3:'׸kucS4-rυY8t c۾z} -m|dfЅ]1'u@,t0h!dXm2n 9o)kw ^Puӝ;Nע=arF焓Q5kAӝò >z[0C>/ȾޏaLxU! A斒iAS{.l3<<2Lmll5ĩpw3:')` p98 #}R?LƅƼڔc ;Ox{gJMiI陼-]J~9sIHQs/F cQrF焓H縧${W1{qٸ^~6F@R2 WCBN~9$ dwa.tmQce UeⅇYj ޴|݁[u/N^m")>xK~M-/Fƹs`ߦԤE1 SuG4O~X9$(өs8u~K{a`\GS;L66Uz{.YxP͞:MrF焓HAzUe.\p|_"A0kmVgh\ƇjxW70(tH7N""!?Ƒ<` '!~9sI$P$Os},9v2{aǣKv Gk؎a:dC}| '@sNkrL}N!wwxڥ][UDF U| '@s|^ݚw^r?Ri›yvI쐉{ՙ C u G 5u9N""! ^0Z >y]5{^t0pz.p5v yINS^$N~_Ψpv %#M\x&?ȔCf':>Y &ӭ%wy?=K{GSW{BR9!}9sIQ$DI`IAAxw7x/>xIGvEOH&ⱛb^3KxQ#QQ :-2S< 3 n.cX ]=-|>T~_2{^P߮CV%C. \{g$DGNˆ*qxq\fפajUKQama VH2f-g?8`g \6s|15pDO~D9$(!'ZIƊ+8\T(^xO6~aϲop`OLhx}1 nOfȏ5t/gtN8 _Q9VxǓG58ًX o~{E"X(.Ö=AV!#ܶ pJHI Ze<8?cqArr<B@RDa!- [F [jGqc%](/Z|,ޒ ێGᔐ28o|"t#+:'wd_uܹѬjaҒ$4P)ahFIN +QHMV  a҄2x*6蘅$RB`9`„RgltDj Z(%2 |L8`o>rF̪F@!mB0@m B(!Q$BqH F@!č"BE!7B!n B(!Q$BqH F@!č"BE!7B!n B(!Q$BqH F@!č"BE!7B!n B(!Q$BqH F@!č"BE!7B!n B(!Q$BqH F@!č"BE!7B!n \٪W;=Q8BHKA[ʷ;' ҦQ$Ģoܻ侥ٰC? B&[B0s= %Y fMsiTqw":;cC^~pVjI7\{#~T3@QTJE& 8~O;j>ͫqy(2*(HF2+l>V5tkè,/V҉%o}S8T*Ms !HY~xu9IJWC|dMC)NIR⍟w\ft5I(L ݾرR^zhluٰivj! %Ĩoܼj~+mhw[ߠZ,Sk9n`]9TѸ|7J]mʲ7%(-o$s\gT8(ƹ^*M%5ք~ݱϵ)}@uͼ:$οCH{f G?+'O7n7$<[MgYa,\~HRT{%2~30. ( P.h{ddm޿d>vx[|PQ2aFx ~Q(Wn5JBOu2t#A֧`H`A=ݢٝJIVڹϵ\Õw9l'U6ze;%\;mDk;mQAK[QmHi=s|WpZLe!s˵l?+K;+஖d]B:>䲵C6J1iZ}~S-I9p(cތ{./2HuիٵzRQ OzZ-@V SR|\ߍy mRZG4'`uٲ9CyjSU JG}׈[h+G;ONe0wZ|4E逤7i{(GrZD5R|>Fw{MwGZfO  H>Ti⯽sdWܼj>evj3FlBmz' &gOx֬D9u_UljVL'Nx觻"xܤMHh/l^ 0݈ɒTuffoq͝>'?hh%3YUEDũ WU Gஉ4y}HhF0|$)8c_rνk̵c*F-~ˈ?G-ʥEV"9INWv'~\\kgo$5 c{P-ղz)RQeVU3& < l9˂>ÌrkҐ?L^a'o&|g>ijs3Ic-1ܶjG7ZQv(<1c` 88 (t@u=G\/I}=L`ogwvܠ?b rh5LJG#Af2\Y3$gà O2; [dY~;m!4!(SikKH3[zu=w*ۧd @LFuk%g/}y?|6ʌ~cժ pku DAԌ%SiS4yesx;1cВ53GI%àw9]d@`\vx\cq<@;WS$,(G3-۸|Ӊf(9;4 ToZwjF IDAT/h%v @;<\()OIڼ}O5{dQ3/j q.eiu\o*,$.mehyc 6] KŞ  !-@]T7*dmjarftUB9s-Տ>1{F}+NcYL7<,:'>oBjtZ9O-3eclſ}nsUc'ޮ{`Y}uvN8Ol*,ɊH}|l>9#!`1$mْEסH$:F3ҖӘnOyYƌZ891cJKv;Z6G=`M[YߥhS_ces`ytEtݴvV)O5G_qޙ^Ty12muu5X Sw%ԥu0VOI[L$PS:%DDBeX61{8NWZ0G`\ U ! BW|/]:epp Ayq;6elWIqR'?bϏ'H np\9e&â=Uj^ TP;J6A\]ꪐo #{s0rkL[M//A,^k*܈#dƉB۳Iƴ-3 r}bZ7~ROTxq{ƃ.;v1jڸmް~p|c!w] A\5ِg/k԰ n"Wۺ7!'2ڒopHL~ڡ%֝Tg5{cxԪCpc^>Gyiv 7WÃ,KH%Ikx cLfp !qq>+?**L]p~GKڄw{gSx"4z]6?@YU.5WA Y:..69 %'"܃0.Yo\}d.'*|C:$$mm QUVm^`nQ}|peًX){\]rȇ01뗋nا}O۰}?QA E@zg=n|֐K$Am8NfvcV2 :CrN}2OLcTP*5 mEBXqSqv9bLf=okܷgh7 B%~C8XL,9za|aLvcF[nv?xͩ 7d3ɺU֤ELdΥtw;Grψ]+}bƌ/ݬRmu3 (s0 4 y Qẘ.=GkjkKQ)˖>!$SՐ?5cْiߤuX+KfN݇Mrwv&g㖆kL|(:՛l HJ~l_/?j} IT@f oBofZr.<|IS6p6,?n(Y sq u9  ?Ses"^5`] s,xpy0p< NKeǕ$ȣ63H*CY(140]CjVi`1c"6&xBfvM/t[l,Ƴ+y/}p1exYǠT5VB5cM^L@JV>D/}!j/䚿tDWx`* %Ago/ODM`bӌE PjL_AH] fe ˎWM*7{jގUw3&hۿ'w̒lldJYq7RB\9S!dIp%;&/x2Q?"~waՉQvCieFV)]; -:9%:q5?-[U4/`wZoeU[*}53i\Ý8g%?uGp]x5esrK3xE~F 3W`ݗfq?s+ja1xm6\j^bݮe2Z%r~SKYY{ c'U\P(d'έw>cc5jWe@Br1M 6;=УE)"aC91b\SR ljJ yhB\*n1g2&HlOz1u筳WVOxY>I*5hޕIƜsHȨ2kdf\>")rGsXnМvs%+r$%\u|ܬY4-ʾnRd; i5/G^]髉,֝7Jْ#ݒi:eΧH ̜d$Zdw!2wg JZA֪D͆5; K%aؕ éj2y)]-YUx3^ʚKJxyr`Fmףu-QK5ofH[zl/{Q9?א~mXi+Ps6 yJ QeŹf0޿v⒙ku2/' 0k_-h =ʭ63tHL2J>qU(3gVvP +Dg/7Leiða{޹sg>L{pGi)w]+)*RT%';6||V%1~vKEפ~<4K@]nS WKb޹m_->:G@.$6mѯ+ ;9D i9-y;u/8R vJsrq~+\\ g\2)rI. "Ow_ܫ &Z2/Rkzh.~ra=2\Ȟ4!AR7gGL|@g#wN-k;9(άv?}1WOX3Sxܺ*Nq*7"-%4?i_7 i&ݮhP}lGY-1!7ΟVh߾݉S'EQD> >|XAN'wkǏ>|)98~5M;x 3*'{V'~hX2*=PZӞlek nm1p.3V*Me_ۥTj$~Z%apםs?{vI)|5%( P"ܝC˷K~c lXe%Pp,HdJ\KP+'?:C>D OPg/dA+Y ,ˮ# ^yfׅB.9^x_JVUȲeYeI⊟Fnp:=zd:uJRAyQ# s_m׏4}Ru\FWNK篁(+g/ޓ'3-,̢a$ }Jm2$Mu-58STiOM,:sIՐXxKT< ٦ஶhWӺ4vz[^Y<,gKW&kWe[>f=VΝÙ{>C ފlTqT]u = EEp׻dffnܸ?9 j굜wYeFq8*U;4|͛7$} K.VιxQBrhQ.HdRYSgg:ȑJ%<ǀz/מ"e7HTM!;M骺A"pQruܠ>OL̜61uRvȮCJ ^5dP;u\Q 3CP N݄`>גMuDQ81n=s\hؑ:3&㞺 *V' aB|HGAAfc9NZݩS'{ &0ciV ^0]ǏذaCvv9:NSN:u.,,رcFF?`SKi*Յ eLa~KxuUa\tvցǩve3HG]qeT k>A'%I@A:)T:E}7r쿤y# A\OYfޢdo_\dԗݮ,zYǗ 'w$-EBYQ#_V`G1˯ީs\͵wN뙚YAX1T*&68p`>}l6믿ޭ[oEQs~h\_@™;]k_sGX:_yI<$lY&Z(I:v^87:U|qȒYS:Sf;D΃ie׽X~4gRsuks3D]uP5zCw?dH2 teРA$];x?] ɤh\EQeYwiƳp;t0iL>~g( l5FVfwr,G}r|].^z_ uih CNW/y3!N\mD)t&qF;@ 9,##ˌu*k0<鯻 4&- h6qO^DI|fu/9TE)cL$QKJiQkNʦR]fY+ V[YY}qUUUt:p8c>{OxJkQMLlZWhuGrnkE'ߵ| . p ܷ~nM(X> SHL%.rXPljSp(?Ojh,MoR7uyׯtڅ lZ?C2! tHb hUURW, OE5tZeI\ZƲ3Gjd9!eit y@񢭼9$QDNgz!/@٪4.Lw  Sʘ&N,$I+ ƘԩSny>g2 R 5vYTֳWPAdQOi?{q2sKn@Ymg`X[bv(ክE@eW]~8~^O[lj$Q$4DL4ݔ5zυɾi0sqڊ, E(4X9@pLt+` TTgK%AJ*@i:8>3w?,\_t,=o\Ӥ>I>QU#t IDATNf J]QC2߻o[<ʙ~,v+%&-8N=ױWod }`w*GX?'1 E 73kjol=44Ee;KdN7>D0E8M_RW^+sӨ6_\lFԌGp|>pMz=%%]a5KlJvO3!a6O[¦UuA[ ukk&{վMR;rUr&Vqn=Mp.1tI'&ݥifEoJw(p!!)RVH4=|_ij:~v{+t6ÑXGd[G\wU)kgby< ׽ؔҸbZs_7<γ &2z 8D;d ӪFHKw2Gw2LP(R#YU 1gr؅ӆӍWs(Y[P@PyGilucsTՆU 2-7)8R0|y,l;Th[i^ӹ(S))\'fX%O,L70@9)MAN*{JJ8O6μYVHh~y`9 \pW+RO(VXMdsu+8+bH}$ɨ'B5T SG;hG:38/رq Sb=0}goMV1eM! &"jT"Mf^զ j/c襇]82XC0M yiLPZlwfWg0UfL3LR~zo{7X2d9ͩkū'tNYH\ zdIS>,iF /1J%ȲAJ? $_?nQhUL1gnYknm .,+,8Ϛj\Ҹ 1"dz7_^&>-}jgۜz=uiܪ2 s^$>UE)4\ckU2WfDC<[kG.ٹbdW0@ ̪O!ThmtI[d:T:Tٿ7]+Y5{܋)(ry승CO' 'Cm ͣk[rd=Ƙ 8pE~#2oXGv@!Pݗ{H"gޡt$' C9 8`O*T؄]=6QM#s~;OhuJ{!;M=oȘD ~ ==[Ny!KakӞĸ'F=3ڗWoT{K2ΖW89WKr0<M):(|us4Zj FG.\MOhv{F!hӣc=4f+J⋲H*2 PF/ }V=!j# YqU5ߗ .[<6AcwXHo+Q3Uee㋗$x&ׯ>z͞6iy;lF^7\WdJ)rO}isޅ$X4{RY5n ԧkȟDqc4UyjSA*w7տ[v\tm]Pp@TVR*'/&:3x4)b ~ߩ>6;Fb EBD/?}9*?/?!)k6X2)0cN9s!X:]NOP>X8A;3xVw|T?3lO6=!{UP^Qr{~zO;6TTB/" J UJh =ۙI6ɦnΙ3gN6sf<^M9ͳA=_a^QN;: Ώ-{ϖ!RFB-ٕD0'l8MO.X[p7O׮0yy#]+1FOkdt#tqUi_ȗ*}}m[iĐ$ @;j"@ɇJuf'8Yw ;aQo*6׾ 9mdF/V g\a~XDŽ7 S Gu #q=;rf|ɾ]nSn*O$VU ;' ƯG#uD;sq)hEY) y GT&aZ 0PY/-Z0-*+Ҹ)%Px3KW}!Hhߐo>Z627k \TyWWn& ͋/C{ >C?Qk8O >/Žah#FE@2~W'\KWCZy_̚ATꎕyj^hQ` KFD,va۴UJSwt _z=}n-{sZ`24(8eSޗ>5BC^뒆>W9!@%OY@Xs՘셫]hT1tETossN4A1{ m*\pOĭ֗~3;u*#0tz mC/[Dc%[:uҔ+K޺#M|(z MeƩk#%Nn륁Ž2jkκB%z&aF*2SQ@ǒ1+5,`V@of݆#1յވ༎O6k5ZQDxfGOp!@PUZַ _/٫K u4hIxR,‚ro]1J镜|P9ɺqwm*B[ 奇Z[m8aeffop % G[:W)7L+Y˞pX҇ﮋ EY{97MEba'[/z~n7:%|w?kGXE]%m}ygOH]g>3Kp_4FQUw2{L]H@(L11X_`UgXDC%.ۓ+wMރd~mI |қwBѦ}Zhxi}fg#F J*r[PCB 6P\$Hr%%͛XjbCMB%8զ#XpMmq6.mFGɞ3gci=]D;#Y}'x8j$52ڳ3(J>yӼ+y{&5" K{ "bcΣ}:}Uہw :$>j `P|SXˡQ,ETݞZSԢ;6ܫAxa=kq.;2!e>{|kp3T{W`&[JB OڔqZAHK "Hu)tTڇ{R dؓm0 dFyZbN3sgv #>V %9W7&jۿ<ϚعN3+—?֭[B"kD_pQSR?G cJlўz1Vc*ia{dyxK3:s/h^3|P+BD,OoCnJ !YQT0D(**ՑP]8TNfïZjzߋ̠ j6]Tж@|۟ZnRE1 h_qbo좫UW Qݦ |F}j&{աDYw}Ұޱ>ņώFhI~s >ssK~j%_,Zn8z&ݣ,zJ+EDd8So SHKsߝOXٚ M͡y3Z+Tq}^/TA5j *SZUI-kO)`AJ2\7r0P{K*8r"l1zUқRAT5_ OMY zh{SčYA@; 24i3ӠHfJ9{(d;cʩUMȚ(|W:@%%Vr * )t3Ǣߖo<.KV.0͉ם,f />6j[S5pBB P/U9@Uݺf X؀P@3:mVrdjT[ČM zrA`졯PhԷfZpru<942\b;tٜ(L>Il:S* /v=392 0k릕Y󐊯^3OkJՇj1# 'Z"*KԴ/wو:S ú!YPj-Ӛ#PhpI*N9H◭v4Pr#-Y|YZzmj K$V,~yf݂z"-h2iNbs0]^ ^Ar BPc' ?(^݌ ( !Wկ? 0M\yW;Ǎ;oY阸o/!Rh3hple>9Bj=) W: IDAT_UV,9 mS$MӌWs:V&=_5ww,X^\} `DOץ\m;GRBD ҏC{Y5'AhCT9-{n}a!WQ/QWOp!(0{x cw*(?n[hqK;X? qz3EQDM™g{\-GݷaC+jk`6N_܄[B3vޜCg0ts?q(ylذONoNN1h9F,):I)CR/v3~qzWGnk*p,\^'SO#L*x+ TǒH>1wݣE_2Yދ0\S\LyBOQA^ԐrKipF&ʿez, p*A)rBxApFM쪐8,>Rc1EzG))wO[Xe<8ȸ |) dBdxgoiz0U}t" (2Qpi5>]C+f}ZɇQq\n?Ԟ=yNjFJ Yߨ̒c?å|O$s`IL{Y"ۃj$.Y]ւK+=W$wrd UKT>S;8{?pkKD* hjOΡin$<" >gv $MK_i,p IOBj ]Kڵ<GneD#7HQCWImk&JO>dzʢ+ufE9׈U,yǬ?W7fgwHjM Se0=&M6V[n]6w<钞 ?8vcYZaw=|KIÊ 1nxiܰa{4J7y D)4`$dq)WKF.sy F8-¹NKMw'G+}?7z! :3!T!~q\{sG6 }nB 0I 0oCisjr-CetUPI~|aWӅ29̨hB^n{dB@"k ԠX7Ipԫ'z{mmxUܴe9}.ٯoٳg9Nq--'vC=k&ِX?勭E_w;'߲ۅ<_7`T10[O5J7=7%j>qwؓ^ ܝ[e of;T"D( q+Gb isb Q^ndV< FI,1 D#Dr:s/Zq+cj+\@[L擅>@\?wӥZJ$TZKw%xN#29\jج^ZWD*ꎪV{A@M#P/t9N0tʠ=6RuQ*U`<}c# v'F/6c^v*4fBzQ)}?WTsK`\6lUSiL|};vUwv7].9m޶x&)0Y^)H_ 0Y1LsƗE7DcReN}⟞7YIB*2EkXe!<5SyqZt֚p*\Ո{6CZE~YRזf5)Y4J#7sƅcBPQ2{;OU[UHxkoZmP';V7xkIң^(UϤdxV ^kJZfA[E^g߉cbIefYM Ĥ)+ }}N~*Sʀc8_h7Lox"x).P-75&/Me9ABBI?U%JZOFS|h}y)-5NN`pI?.$Y…4 t甁w_٥o?({g"4+=We*O5+lAP|p)3h6wرVBT8pdT&wÕElW/IxP:D>Oq´hќo tU@ʄ'r#i.YM;ºlY*5S )m|bo]M̰B+>lt):_b]6~;o,շH\:=;t j=-;#&*7d:eD7>u4GA}3 ¥{ wh.rwPO7R'H 1^_ )EuĈO]wuN[Nz5 9mZֽɖlv{T#w VGloݤ:qUo\5ђ!6>:!ī]9CQl_a9cgx8c k|[ 9^wr5(v3w:b`& m*' J߲}&ANHdFH$o:깽 < B+ F!noKV_A*Vnbd3{3)ۭ,-M߉/ut0Eu!Erݯu;wl~w@O8uxU3^{{GHp1{V(uˠi׷);>YMכӟV`zcXa,G0Q[";5iڰs\ DZ]\S$-wR.rQui ~<:- ^t oQJom(gI}r޻iF=bZg6_!ߨsįN1Ys㷸()y$߸;1-eON󇊷ݝ{s)V9Vx< >BXZY;pm{oƒ od'8%TxwΫLVB xuZmlSA:(z-ZUOW-BVCrS⠯زMGE~UQ`D7]l9kK1WNӴ:w|ݤ=(9=>A6mNړؠ󰪂; NU{f`:m -,͹EYM(I0O2 NM &iR Wj "q)dCA-wY3!_'M& {u)9i3g[>'i ro x n۶mBDDMY%bACd~4н#z%B`XnW>^*gDR; < @CNm){cnI>>H|A*|g[DUboWi=@I$# J9;ȷ`GmC X3dPYQfMmG,k28& dy֑viͼW/u6ype(эhW65{Ȣ* G^Z#9Ԭc?'=AG6VT]qK"~0Mt'^Y%ߕVl.edȱA`n#N0dષ bjx\d@QCvVF!O},e7᧍{[trRKR@׬>gʔ%\/1j<,m;nDgV>GT٠%oG+.#:=0]F֤+QǗ0bS^.z̙ehR)|r-ge"%Ü[:%?S/K4( Qp6+ޥ/$ sw!4#.x*G3"eu.v" nY:ZflI(?P绾w"` eyeVW5q U.P|CA5}HP^eη2:tc4ëKEUb8\ Dʬi})LG[v_MNv =.X}oK\zG߯zc:! ~+9dMC$0m qJLV%Hv:کg @$37g:˓*w4Hsyﯟs{VNRI܂I  &l7h=}lsqIiY‰:+v?w4y_>^P3$1uH@pFR#OkC03UQ (]!'Iztk=^K KuLڐi=7o`DŲJN(˥f/"v旰PI+wA]ǸiԊ De 7ZTiq)7O+3Sau媻 } ,&em_θ& +彶6E-`Ӝ:u"p:5 g./} y{Vw-%RDKBW 3\Ns,*sG+̺ʴ>t;jզ>{ A%fYj c'5%Ptt99W\q@n/xarJKNIZw;nh8"U BYW 7PkdBV FP#ӽxQMՃIEz,Nvmyv4:$Tκ#i[ kK"cШ@$:wf}Xt%_d'&<@r_\1Ls&lKK-Z=揞«HN9Է?|E5qF|h :@)S|naͶqfs&p])Q!Fcx~_0t,ښߞ҅9/# ;Խ M`{}5-Ač#CeiK`5;IeZJ+&X]Ocf=fֵɃ{ ! ~3m-,)hvӢy &%cͤӿnUI&4BSfhF,O0ƯO M@|J{ϗ= UзahX_]@guܕ g嫦c:ec)=o|۰+)h%nqӮHS_ +eP/Z+W`e<#~ !j|@鑢ԁLyULUާJB&!ܑ[[DJC܂z *#V/_ɓwj+rîB"Q{qP(m532߼{:ŀ=4S{hR^?(Q^[> GR'E:3^nǜmznzÜmL{@sX󦥓KiJ`u%&;-&̻5mƒ1< P…tcvy0}N ԝ[NYn(@X.Gq~tzmq%cۗ~`ݜ[e,B\3%z}-XMScMY[*v-LKP/5Ϋ0bjV[cpbO #\(s$3ez2LmJV؃?ttbG-6ʹLtw7,4 qn6n^ >y;ozӆoѭW/\ZӷX٢zŻEҮ,!=<^нE8 ϠD{b1 "oQIڦ"={_RWEf:LfQW~28(Z,(P+@eʑ8;+%Bػ{Ⱥѭ[q5k  Z)*C[TwoLyʍ®g~f1!1a$$W#/=(8$w'W8Y1Eg9ipVf9wc=Nh/Prֈai Ny$u cǯ2!esߺa}އ<Ϥ@%Ibmnjv9KVn[gܳf㚰H$()=\!#V|w ݺ_oxҼ˿sSL4;vC'"h)(LNrO#'<ԊIVKҪ-ՁBH+o͍7XK(S#0>%5D8B"hc=BsB frVMIρɉ SOZo2z1~շm&H$ ݔ;o.}zTuapwpyvrd?vUO4)ǸBRV5_6Ml{ q`Op%I=bJR'WjʰJ$ϯ|sW~A|O ༎= xfQ/YFxXǃK܂2h,&@,l4VͧNN|S+H+*G֛pWU3NP-#zXffWazHgX3Xyqὦwf k$zCvzBt:!DIey幹&L1bDu[+5 6ֽa׵´'zf™xs:UDlu&?C<3Z&yįV~ݫj=$IO=k=pAIt@$yPY^3#S1qES9ce/ W^S AxPh}qiM ҏ;#p/,~bc{>\3Ҿ$¤pԲ=_ V-l44p2 x1rh= pVѮ螚2~p:A6@e-|1A9D@pyf0nIgJsCt0p{ ##C.Iرcc_|w)(jxQ&Oϟrv\krTC? {Sn6#a/}67m^nz[Fa[٧L|w3Z3dOzsS2 w}.JVMDP" Ds {B0wO!e[xwM^\fR}jw*;pPH(рut;~{I={x׃0F @5UZ`S^qsIc.v5=Rqt:ϧnI#b;0gn0LiJWn0ee_ѧٹ\oʝű>et"+r]^N7<-L6r`M=y} Jya4ʊG1(vvZLNAj/_L*a]@/,Ф%@Nb菲lU8]0dp7?#䖆93p@kk1S>YO۾]NKTR !kՊ߶o߾~KzD9? ZVP Y^®=w202\m1_s*#V37]kq h>}G??o=z9 ]q]_utFݠnTjN$;pB B`ӶY嘃$jU+5(d k9AD쁎㮯[.uXcAqAR gFG}z[%7}C~wŮ;ye`<0qÒ4vȒyDz`ܱ|M;\/ *P5J~pڿ>|ƥ? o%Ah`GFΛVӔ?a?ך$k`P1A J5SӻzkG9w~7<߫(ƞxbN@3M[t|0ߏR.W¯ڙ‰Օ7p I%v!גScXOQ .I}@og8/j,48! XgnL`d GrQ&G~N<&&fӏ? 8mnf]'Ϸep>X :kŀYI]aR9"8@_7޴KN$jK5qZNp!ަNl$(3@3Oݧ+P nIDRеkVU>?ut= "g?sc.'T`xێ~St~$LN _Zq!XDbA.I&L* k6 ^c5tq`gBFԪ* s4OCvFF:ldРV(J3Ŵ.Du?Еt?txKVj_-<>]_/r /=7ѽI\ JIpG\Xi.@E$[J3N!8;Bh,ENn5m?8tؗ 4&]Aw(4^Yтglgώx:~(g*!#Ȳodsqlٌ1W%tx<FL0oSr ƨ{>yx̪*SmIYlP}T]@7=;8#h wcB|ev?n!V~qPZy#vxN "gF6E49`4ue(g@_"/G@}mJaVAEbd&;KO01{Y 8Lhtg:!iy 2-( XVBo6llQE9W| k׮E DKDMBnf-θj ǞcWާz6WoYz\N%U3)'0x$e^buO)lG(;:c7=^ό !Xyqɫ̓PtrHE6'!hʙA5@HG533_X6Xz޽gs0QQ工cQܖ|ТpQ Qϩ?8q~zOzМKn@T^эݣ÷N?'gEG*S[=p0!DRL=bVW pTx@iC*5pӅS;z={kXAz6%D Y4;J0ˉ:]ӱL0),+>\\MEhT[w͵rF*H;~휾A v>HAǿ`˾d{jQcgF9{֎H0*uQ┹-E jD23@vإgjA4/F Y(>5mϦUpRB0CEa$2koK0y-J~?ugCBvxaW+ qP;pgr2[mM_%7Z13hɄW"؃0$RY [Qu\{UVf)s5 Q~ֽgّg,ywxG~+w/ۭ.=IB4!joh}Nc7kA)[o iW#fBX t0n`1 v=5|u_} QhvF@@@9d>qMəa,j.waKjΝ۵M>uՈh?'Q̳3kǔ+ Ƃ٫8#s;Nؙ}gBdByE "8HI%ҙ@+4Ô3;FزthInJ)!Grz+ V&!ʙDm\lζ¥~1\9ov(z#X+-$H1=Sۜw7W@@UoruMi@Ll١w:"KVd٭ٌkpn-{_Jb-FA(r)*} L")!A PKW'̹P@mqdڵtZ:A"Y;t3@4(ʙd՗gP+9˔A]DTkU8:{L(+qPةS)‘iP~5[\zEBy;\rsy;gpS1aF UˬJdE|0(>f@o3>?'Tw$o߾uwFW2UB3ڷcFE^0xkoڜ+ngn`ǯ ̗$voW_^z@bgƣ,=Jx".WǮfmL*!g\}{)T)Op|_-gtk+* $V) m> L-ʂHGOi{Ů_9|C.FO?EQ~sIrXoR[K݈钿~ʷ}~<ùTƄ#l/ם Wb^SA "`uYr$^KVO0 ~}W޴u;F&A0f@)iZ d̅䖔*5/S%B,@GLEpF7>eLu[҇j-ؿg͚x,999VDFWXTHv%u;5%In#jb>rrg=ӌ۳*I10@6-v+41y{F^WZտ+W(gIش(}k· HOUwOOYX, Y@2&@A9;O=xzz詠r&DPDA"9y6LG..TWyߪ7<%0꺠82u3!BmP! n{#91V%uWN*0~3dU,N&i]9k?*ISpxs9_n<7peP7]۬w*O7{9 ǂwlZYX^CQM5!\RW70Qu<;RjgV$%Tf1>b?u'zg_A&;u]Z s q)$V[hz@TMN9>s0Tl uVhҧÑ`v(&''_9DKl9"2|YD#|)\-߶ TDXuMMq~̫?86fWC-hV.thN;śtK; 7(kʬ3r]f޸6>hI5jSЋ;ݻfʔ) 0F5E`ݥ鞧* b8"L`'@jN#hBt 3)`@ 6uO<_ _8bak,EN~4hv_*=c45l>Ixeb)fQ5pLC9&Ѵ"5VpF :7o~V8̦v^ȓl4sm@ԅԊ􍳏dM+ jtHԫ6ӊeVVe # c>T\NE{%c} [H\>C-`1y}a=PPUF8*! wc|wѷ>!(9FL.=: K6/ 6ddҥX=Ī3HCuW<G۬p\!#T},)+sxḍ-ˤI͋ӏ][[lRrumeS]qUR+ @Ub+UĽ4lmB08gMfk itAԗE}qjۄ#GZ" $Ld%qG(-N*. p߮Kp~f{c/ٓyB(*k<#vE:NO2;Jw8*WU~;Yl. :K[\lnZsMAbw*VL]ӄBUߟ']'bGƍWGZ2!$??_~u zA3(FVrÇO˫OQ(=]}ˀ֑ 5vuI)q<"q/\DS,/YsפPTw+Rh]U!|u.zuV&Rm#lh3~"? 7Q571ٵ[,nYnT9ZrVQZakfrYݽfS4)?,ժYW\W; u9$=%K=ɓ'\+n ¼FI*!Cp7-5wRІ@wxe\ݩS<⸾M3ַBHS2p>;CƍcA)}=Vƹ$\,VmQb8|+-hrKʑAk3KP-jxOL өK7vۢ #N]M'B;|xDi^O:k#tׯ_^[Ж-[j_a޼y&MzW^~DAO4駟x<6&MEHOB|d܋׀{94YeJ=&dc=(b {Sŗa W8$*tɮ#VtjX0)NGqa{̞ FvI .s5[Ho4+f$u!`@Ii1a"8eeYZElNbA@>?$_{WbHKBAΝ;?h` kOx[T%U Q ٷSeg O S {MƧ8brIW1`Zдg)``3l|]0#_/$\pÀBz=\B: lx_1`iB{?ٓ0Φ @n 7: ΄RӚXQ2ۗWNcF:ք!k)дLYw;d EaƩ);ꙣg2!xW{}w'MΪ/ φܠL½lφJ"2L?8UvV@X6/{QH*9Bp ZںrD%r;l1K,}GÉeri[e6gpe̛^ [pCq)`M D]H;QM rnrGj1gA/*h0!fzyN_ͼd'Zx|1WFFݞ2tvwΝ:u9r$¢p((~ADQD%/8m(`4KfRL1.nda sz=ڜّrKy%}A]W-Tnb:$aBxdZh!D!I0A?x63kR0iR{Q+"]RdGsu-ay25 E ʪ}q>'x⮻/2\/ZhԨQ5 ԩӁ.n6F ETKGQ?rL~ni U6)IݛߐrWB8( 'z ]*R+P_EM~ӣ}׎ĭ$wPvhOm6!AY'4X\)&R 'HI.=f a"Lc]9|,!پZ?uzfO*@S+e rsv}*pg B*?S}ոvn:tgy}>'|r}Id\{a0틦2U QT,yMhP, Po}Y!fٵ׶%1Қ6C~S]2Az IDATBV-EKd~r}lе˜3M 1 fp)C .ZbZ8&.]SFn?,n㸎'欁{ߘ ةY쫲 *vƠl|kk7VРƿ*R3:7˫TUqjk_dI=)Su6lxg{W}9h( QE >w࿖@ +gJddRcz gr¯ҹds9X_mo* Y&05= ?gH.|ɼaF&tujTI5Hx,I+@`$<)w 閸*¤Ia~LЬ8k3o(I19&ҫϰDFp&R13U.nx|3 |KK/{5w,\^ BpC"J\|ﶝݘx4Gz }ছn#8qAg؅-[ַoz[7DQ4*~]~QTaϮלX*ޔSI=nvtn8DV@DzMGsN&T 4+N6fI}jNo'4T#'sn۝]}JΈ%zT[:M#krI,y߳+9 dOؤ7'?֡(,,m#4g"Sۼf^ִس M>C }$B+@{rɪXD$nؖͶPء]}qc_AA;`t9d']4s D$O?PnXگ QE+?mgjUaz#,@`_{Ɉ69 ٨oD`BN_J 7V96&gL|- @k-?2 C#`MMH=Vt\j˛Y{E1p]U k%W;@`Aʥޫ\+bG'(;ݕ92 A kRZYbٻ&-k3ؓUR9CG$â}mRxz )o{pl|"gIZ Ў37w.۽~J\: (!U1NnYmDUB)?"{H0Q"__hߤU m%8浵;ﳋIiyrrW,OӶ&?m&L.l{?kXʩ%GKNaafҨ\;7旫gYe9PJ&Z.)'9c ! \-wwބ{Hz{>j.mieI,GmlTBW&M~fq@{Ķrcy#fI< D>ϚW7DfIR(vj$D[AT%ܰ*m۶mݺu޽/_~iRUUW\\$_kYm-yUY7m܋O4Ld$(z'j&*rEϽ; 񁁔Y_jUdtus+d}ux: D'.U1Tn *\hQg2g#LP\qʺ 1U5;@%>ŧȗ>y~j^@ 'X5p@-&Ŕ3jJ7 fU T&U)#mv^iwD{RoO*?~|+CT%L}x}>(UU' -/r&:ATU,: ղĢ K=q gk@u9b!*"P*/&<< 唛`eIjӰ3ԲW,|oH~MM$@Сz%]481c(okc.[9H%v/*@&g397W1h֤MlSN]0wDh6bQtDUE\c󚦝mgX}s-` oӪTJa!o0iRT[⯲zD/>nιVX"7pϴ#׌e9(p_K&VhBty q.)/^RHڢ* "{B8pu+eP 8ר&77Y,V8'H5)%D'(8a&M<9^gɤӚNΝ."E=J5CX]vAT:.0֧bn?kw- M?<Ҕقe;uj8]JQpk1_-Qߒ;ܽ{7Ș/vWw}y n>t#N_!^j܎ᶕwkzC=(̚oP\S,z$ST݄ R: Jv$Ƃ7NXS ]Af\l* '," |?z(d*3BΕ%N9quQR("[vB pBj$D-ȧÈwB,4;3ޘy>^2!¶m[~5(&40\;>}vΟrn0LZrvQs{ `X4!]tѣL@x&O)R)BvA_Z:8%FkQL9xQli}K'}UVM>IpHD}öSo[$lTlH%{S1!Q$E wcRkvjf6Hu E*C LDq 7p@4))Ii%\*iVh#[qO5O3g7nzb}8➺4Gޥ-a1ִV7x#Z0Ty1'Q<œm&M i$y{FiJ>  0 ŗOtRHd @]m B4eQ]hd[*58AxѲp$Ӧ΃b]v*> 2 7lذkc,3ze{S 1)=h9C5L'+X5Р&mV'NT/p| ;2rռ_68M Ai''s <,驷s<91W f-9TpM^DUŐ!C'FDm[? /Ӻ5ׇ2M{ sTFHS͠Eݺ|@?1gΌ?V57$c>(CCBN1Γ:bmĘZ @p:@((7&0".uF nsYBsu< 0fF =N!& ZQa e1]kLXb8uYJ̡{2Pv#q7\fw[Og>v@t] }`tSNˌSJ:>¹ j[nbR'<* uw rѦ"."Q9_lYvvvII9rM6оˆ}PO柈((:9ta|?C PE:㕩w%,I9J&ȻNY8 >*5N~ڛs]L3T_lj!ZLK_Pfu#M l۷;Mʉ}7GUjuIv"TBX!ȪldQ`qZẗ́ORC&)N$Ru#\9'"OYGbJ$t]5d׃,] Qzu||PG)AO)(T 4;1Cv7mԗNvluw&Wv\hï Qpy;0sm1o޼⤤-Z={ 8O>ÇLIoW~sӳ߭\ QW̻%4L`nyމML)sI;!b$"j +YM8夓29tiz#(ZJ#b>ySK|I]e\5X~[ {eW/;6&6wf9R٥SV1!ݓК8"s;`Ǯt{ ;b>Vf+}oߦTݺf׮;.0O\>%)n[Bs]caQe_C5usv5>:GUU]K.,,16}Y?K3Cx8W8,n4'?~܉.Zh۶mLEcgo=%4>fNzw7o޼fiiivt:ov۽~zwABȠA cKq0a¦M3dAZ8աĴ݇84P[t]N%KL ┑A5󶧎K(JCY%׏tm@8[py ńCbB !_˒4PqBG|0D7-n& W$F_&4o݉G* ^f*3N^-jז>LV:mqlIo2}eBӬѳ`9ZFe:,Cb, HrHvuK]}FظY5.jH~?W8ݸqTp_~؄}tסYkMra͛7߶-/po4A^嘘3ghժɓ''OMp:eb!K18带KNs2tg'u>MeRW Ep,?|N*̾-@xSTऍc/MrJB6wzd{WLPf2^{vp kwκ2SFE^ڒ ٬iάryFf+ 3|vSpy= GK_?ZJTe/o.Lr&u۝6pӧeX񺣯]8X1H.DO -W:udYwVj---U7rpMOci&EvLt.x9 P9%D-=;KWn@gU-e{F$BU«q~]tzy Nha.ݢ"#ڭuu8Zq,BHGp]w'bo * 2w6-O T˯;\@Sulo0N9swE&\+:MN *K8XTnȱF|Y%4>F'5ǯ;{} ?A/!j8j4^=[n7et4@d2p:AKz!N P걡ƮcIԨI5U*gTg_;)wiʩ9 Ir|-R3 CŔΉdҜB9qbʑwB;X ج'3 m `Lbv;o2o|&S OóG\2aP[wDM d9a^zNH  p N}I}Hcye@U2_׻qQ sN@]tf{amw:QRFÁ_GpŘK/@>}d?<>om G~Yby|+>IeFSaIMֿN77A岎]fwipFCʪ9lZ]yK ][,+U% 98@/آ,e K@TU1Hp%$aꪬ7sr  & ҄!k:ܱW_wˌjvlcY3`ҢQ* QMĊs%9/߾uq}VO v7|ˍoq1J4bބ?\]y!KhL\ {ь3rrr.^QQѮ];TQ5} t?lYx˨;.o1zéoT`.fzS`'J<BGO7x)cPp$ #ҷfӰ(o0Ɉg%x.e/gf}30Hes63H)DC Gk*­R}:DpŕsF١FPTܸ㣩[6~ECSf>f['#x=%4vA =7V$1Wڶj龯(賬Ҽvh;hjML~/FO},AaJ.z4L\FDx7si<u—VV~q%w^\ɱ&91:d{}Alԅ=p4/ 1^>w)Q ŹDa`5=/h9UtA E5֤$~Ƶ#iropv+bw"0A`gŒ3{罶᷂K]j^mj 7u1NײOF^E(H|p.ӢeGEET%4CzzzƞN-~uEm۶BHvU[Vu) [ۗlլ5aY^u ww^)ş$2F8 CQ+ނf3%8ljui22|mi9ܪi\aYݜ9@f*BebQ1߹ "نHt_q+XV#s]431_w7oӽ-N?D{OVմ1tHs[b6:6u!0 *B '֨;[ }pm+8~(jmظe%1`GS4rVd2]JvD8 f4Lh0 GbTWQ޲r{ie_zl>;cAA-00o13?{rT>Hg*{}o=R9>+(>q ^|p\L*9tHm?TLg+?>Nje 8 urg!ԭ҈hZ':[Yb/cDճ EepSN؏8էdF& e$FrJ,|㳗E@ ˱c{)3('"W̹dpi3 hET ]s@N#S(5? fl#};s?WiIrE¾A+aXbQTe,Zvf9(@8Mŧ=f>mw/;DU¯F;`[w^ÏC ަݕg8]U)P+cet? (^~jf}w&z8U(,PhC aנ2,!&_pȐYsكx E+kT'7IW*.,rGK+<_#QyݼsXqJ%v#GkT>u@/rR wQ{~4?uA Y>jP&NqzRZ @n8ȩ)`*_swxΦRg' RhVlJEP,vZ^"01ݚZҴpm~&XQN؎+2isy5e߂EjM֛ˋ>xRoF Qf@&<2Bռ@lW#esX*fOg>]ܰ1~M0T;%"?%8RoKS&5ǜ]U9Ute6u4@=m F5F5\ A7?kfr(O,iF᫋2f2l$Ϣ/n {̵Ҋ*}67m1Z˘S^|OԈ8Uy'9TA = kEheQ(>pj߲a֤ۗ WVP/Ilж: ΣٵC0IiEOt!_ǯj6t\~H,.KOg{,Uja,<%K$_x&#FC˵6#_ ۪I BvgBŴ'b>V 9\ .(>o]rSϖc.ͯ1ӏhTCxűKuoo˝ΰQKy{_Xfg@}y@tUeq?kCK>iqbŗ.E^aV MG9&F&q <:nӚ5k^U-ۗ2ŪbT౸Q.KFɌM<=|Fxd]OriHl;)M\^au%yNVXR@ꯤO|QσJho *P)p |=uS*jr&=rۮ~V]肢 }_YQTr@@s [ oKr&=26;Wҥ^QZIF3msS Kcf_ĐS5=á'CW;HvIRq[V/jVow 0&O?_vi @dMJ*O=97;BcN؀}c.5\3A9&KEYޮ=f&7kSo'5L,w/= C~U%u9@qtNw?tsv;C@%V.* 0!0SG38 嶚 Xx` *H-RYN^R" mvD")x,xoX/?'W Hj ΏMH?'a,p@N{f>5!ݸ{AAʉe_UISL$OZ%{8 ?xn~ʋ~%ߴBX1vlwU =o1>r58@5/խЬGOPQ{ {~ntvmcQYS#U-퓼HUSXt|[w{uK. cQ"T!(+?NG[S7\{V~S*`KӔ7Jᨶʢib9@#^."aS^~: p;P &9zÉ =k@^znJ !USQ]6iS/)ߺ7_=*qм'nZ#O 3f >${A=[kjsC/Jbv˴UIEBe-ͤKCj*eF7Fٶ Zp T1Dp]]a+sYr3weq:"9cނK@?W e\$$P@S>(Mc UO` >EVfSU aP$FeV wGjҢwɇ!ъ?EԗhW-W\qE޽ 1!9&SiY3۸n]m`nSRoޓ#8 fD3h_5i0fVBrFdP "h-F T8EPT.E@`DVefɊmyVQ#r ٢[gW#wNa5n"|^rN ET|HЏ[.ُ~#'#? of̧9m&$c~9U ~CIU a$GSS/V.nd>K쵯HvfY˔h@|@mjPQ&0SkuH HuېW/&&F")**e@fU9ʝ []6N8Q{À%ZAa]돧tNIqO{g1, RMF QYZG՜:l~h&oűAQb7,k,v0z/=Ƅ[I鶽Kǎ oz݉S _OwWj9sub+[5 wbcz8)G-eҦ@u 7)jHlXsNZ`DMHFnZ+-#Ȫ%3g5Q/uZƧ}gy@C' :b(@uї2@9g0A7)4!`<Ƀ>G0߅g"k@N-M8XZT-@A>!i9 4w_;A影nH.[Jz&ՎR(W"B=Kڌ0\ uAAB@3:JzAko* PbƝ39a /ibԝ׵ۣ*rKhfj93T:pb ' ]PzڸL޹ p4bP3U<cƅsr{bbC{:+&߹Ni9M ,wF3z(Qv/= *1rV|ɜ;^PU6r-fR-/\ܽ @A.i R0׈~=M3]]~$WIuLȩ% &ggے?e_.Fz޽(- w*R-)Bʞ[Ӓu!qYd$?EI3#rvUW} CFn .07>tVdk#Lȩ^p %߭VcD@ XAk惠d.\pO~N;Rظҩ+%婣ӗʺ(.2DOJJڲ5t_*Gvx$@9--uQ345yN?p1xT݁vG0Dm>zu;wBhw$CRk =߷#0; L-*@zQlAҸmoq}׎ nyQN(qDNJ{mSH{FQDAXu]Y,u"* t[ dʝ{9w2L:Ld3sL}lҴbˁDaհ_bMɅ\Wj8:x-bϰ;K5NkXVYB0V%}cכ!SBpXuQ&ݯFa15@)UNnc3i[DLxTƠgb8 #Íǁ ^KOٳߺ]9f|u1]=bϥ%;F9Ǐ&gJ,h˗^v䄎G"S! 50_Zuoy[OUw1!ΛJ0, Xk#N]37+:S:W>BQB ڥ_>\&f+ Ax~D}kxώjjO-\}bqN GE(U(y"8 |[ehf4|tVJ+6˂[B#\L]/q~lx{CB%ȩepDb B˭pVOݝ"ںCjzkOVTXg>}}J\-ېfǹWbADҚd@$| BzF$3fnUcy "+a=_oIRn^nq3y;1bA<j\Rrx@*$Ξ;93P33.Tl.>UvY}vGOڍN1,= #}Zan~T[sqՍiQ ˨/݆ow)TKtˌ1uh8m)ͬ }z7N"bmڏd j }yl T7%@`⨙Eg.k_rA9 @LXXhOấZn1j̸ [aTDw{ݾY0j~/7U/w]R_a*Ok 7Њs֝E XW, @) fެF "mXco1L AJ;=8m顁XL/{;}'|ƹT聹uIJ"o/X\rzo~ݩPeIxj@RQp"Qp[]"nՙ]ϤE)xW`%ͅy*M&rK}SG0*RlIDtm[:;{"ebYa?-۵.픕)'\tnʧC.8lv.CJm2߼_4a[ VAYda(.„HuZi|[$w4︹ |6$E*]ߊH=KIzT9@.7&tKD˽c|rt,qn⫽;↪_9 b{4\VU"@!GL5JUKt ]#(4rWpQ_qmxXveGj4Vbxg?JcGleA X_l7B64O'wvݞ'ٯҦnTX|淭9]#-WmxĢח<~˭<Ĵn P^ uKd儻gcg7ـU{[>=wn{nlHI$Eµ5)2GT;I_9!D[}z)~ʛAy7xb3Tb.$ `QcQ eѲ{_ϟ4zGj~"aQBp8d͂FnT)+󵡪KImΐz/JX1vP ȿΎ[2L9+nm{"S/︸SÖӾ}Hh#]#Eڟuu4D.'LM[hg5Ufp>NU=aE6Z RoN>9񹶂t`.z2ˆկ}% КODM(>Pݫ}XBz3#Y-Ew*S?Cl^w Z邅(""96i?nMMݢB,46}+ 4Ǖ8Mx>9BiA`Pk::pYiq ͥ]kٽ3|TzCT?_|趻LmCn/,+OJK9{}na/E8j`խ=ccOLZX =R@WE;l0MD~Ad(bVⴀY*q&=3:  纶cΦCq㘿DѡbQ{Js90z~IN @P$ @ @skGe{o @TiTԞV2;=PyVp 2x82ϙQ2s*0Cr P%ʪ'B%F'P\yhRкP'/8:~#0%>7LN ѼM@@D"8~n:ݴ{IP"Wf)ioT1iOg7<%FgzLg\m%ƒcIĵ sl.S/i5;DDHJ@ ?&o9oHTv%/?Y?bbRY`yx%`s&Zayq/~HBGp}7ގf ֞wbSd$c*Ki=NPRUp>},0.ӧyTb"*qݷi!E`30b!!'yЩ#PTn:I*ϸY,w_ρi]Fn-{h{j€,rνcQ $'YL5(=/tc;Dc.<=A HٰP7NỲ[g.muzka/6u+Zl8i|Wcg[~8*P{m<>~;oh<YA_%xxZV- <F٭l5z͖ .<\>!qts9Gd;+}ö5;yNU8b2iQ |AVq TKIгg~Q70cEBTsAL9WL j "تx۩73d0pS?clI$Gox[HE]uJgom4 Jk$rCQ &m)#;!(VL1 أH~c +G6䴺:R%clTʱa%F'QKso9wu` epxw8 a{$2޹̱\S4Ϲ™[檛cGD *)ÝUХ_/q̸!Ij3BNab=O7iyh;{b2|y0GhW4@i i '_:Yߥe}{ң<|KԶuc]x,^$ U׶cE2u`̀{I1@)"V#%+Y]s[eHĘjEEK %ZKv󋏽 zpp" i Joq)Y .ûMЄZx&GP\q7&vMȎ({BPEpC\{J B6.i2ĸCn؞il~@}- ׎ |ˆn7A1뛖 $X?s_y\c&NctB8rlΔw˫@bßOqH O!)"(|f-o_W.Aef[* \d-,2#Qdpʕ*c[iF_b_Q칷˂xE8s̝I씜P]RJW I§V| K+C{ jTT Sdo,NфΩn^gFz8~Ӎ܌ SB_l&fږ~7ׄ>}ṇ>yE33 y$G RE4p"|?QVU5A+`v]Q6(4_X @[).@9}`ހMͿq/#`6H@笔s~ͼʫxM,76%- F][NpQw?}~Y[ 5z`DM]R;˧xhjeQc_&BkP(2v]cŘ}/D50E*.+{8hN^⋣,yhsNɏOM<8zCי\w7׸N*^kܔ8s;EOITA0^7s!B .=36yNd;4!:K}̧Fo.@ܤSJ9D.mT081r;J=o a3@Hs2=yV㴤sh#7c3Uӭ1.{oE/*`" HL;?(]Ʈ*YRCy9IiZ:ԡn ֜h.'2*o] 80@by$fbtB{LQ♶m_*1V{bRNL9MѨDp5$HՎ֕ <z!KDgQSW !/CUϾ7ECnS]ma%0)6 *=M>}CH(0pikSVAMFYp^WD;M_Q1O68F@*O ٦u+?v0I6,c zY5sFًRJ Zm. S #r\lEOdqC6gώ?)w>uװtgTi HC}jŧrq#I b^:g"-"k*DR#;ZKr>:?DZJS0 I8 x M͖oBޭL)x.jߓ= 1 JymO%H'Kxeϒ'&24,J~>'v=@ p]IDܴ ?bk}qTYM3wŻpY l,zSzaQzgO֩SX}RFT@q<#oRΈE{V?̨|-mF'Pu kVWl\vSaw/u+RJ9.[΁8 c.j&T_803l=^#1/;Q{Q/|;JPP훿3|`]%J`J&Qـpl,N; 2Xj:ܴEuwɈ]N9ĉ&%_M4Р,a~063 =-K`?Bm/nhTx9Iino)yw$@%T%fϴF8ٜ_A,@1# SkAXܖ%u}1̓]o )حHgQ%Էʗ&`Mj˂DP5}сG_qLD%_:&TʑepfT.T!bB)xqE%]Wl.R* Sdv[*QY9)r$E@# NaҌ|}x/HQ=/]͸em{j7Ve䈄 V@1Z_E|~wɽw@?d_/v`BW6`rE.ߘR} eNa؜?^Kj;O}˕mLӇh"SoI,8 jeJs/0q1v@(Ȃ &;]9{g?WpL?N3Sm,+ Vڱ^K{SQYSfsA%4,6LUthV4I*n'ggWh[]Xta)^.wBr⪎N0l4R{%+LQB{)+ A" |c#䥮PjV-ƞ0 X4(n7uȲdy7A t]DM!ǠAg|~/({|L WNn}toM֧vWN|.&)Mi>l.򽞋6]Sp(e$ݲv=!bqi~Se.8ײ oI]u@Ԇ\y ms_H?{(ֽ g⢧[]ˢ/y}C1k~^ZW#4)4AY*.Z8(cV؟ \G̰YTCF}Q cF_i5òKǾ}^y{NE]Ri4y3_C-4)$uG}O,R;%Hīdˡۻ]{]loE<[&~5޻f Zh/5RꟀz\1KoPJA\.]`;(@$W_cet/553Ua{=2imVYlu[vX#Iz_v\~,;*= {ZEy-S U^[z>[É{HeID$HQr/_zv鵞 ̊2}_ (;|M>87Ebbлi~C-PM}u?uuI2AM0xVݢbjXEm;?Ϡ/38X,lǾ=ΙX"6䭐k#b>2aD| "FZsM.%+pJYQL,FH^GMTžcD ϟ_w9IDATvmaaaG}}ctwn#z޷yw{r{kBhέа$ecܲ(I/}&;eۮOo)= @fvacM~*5ε׷luWXR( $5!d$M:-^E"Q9 :Nuk4aM$肽i3F[#D#j^e7?Mn9˪AY?j(Q@ z,zyy Y۪U*GvܹvZ4M88E)_it:+?wI/||~A5 ?>g37)aPIWm{`Xh^X*s4)H}5Owڍ)/lXwt/4N<UEc4?6\9E`Mkn.C촘|kMEa_6ё@|=V0E<Q8W3Q~:QJ)Ӗx=ӱvr5ܚ+,,O815kΞ=sB̙37}R m\oys#xX=NQO"Ԑ@VqO ωӘ(cw{U!~\,=ׇ,6>~zV!!ERz#Dr ƩçͼᲶ2~Np,^V8Z|e"UbSUG|Xk|(PlymT ;wرg>|xϞ=g~W F\b&Un_1 f<5츙%SBcsÓ煉n=??scb,]bпjBVMr$KeK1E>@ PG||0nL ?3@"DkeT+$ԮjDU2F.Iva V"Hzk9;o^x\˗oܸqsߘ;s]Cp#{ꥪܹsDQ ECƷ%H9wqډ BGƎ?t?JRy!!p*u)~^R\E+?i3d)Q1+(v3%#PwqWҵ+ќ'#(Tc2 } Va й'*=p3]WJ"]xTۃ]hYMm(a&h<2juTCpnyr]긍ŗfJngx^|mϋdGf'Hse%)j2PDwjs~(`/;$bv/m NNٰ$]<#Mͷr #P9% k<y)F(gURrKQʕad7ی4p)A̹ BA( +?aFPGC :L e;փ)j34d7W1h? /*:@%?WqQPC띏.`sY\ nW'xWq'I+ֳ0^U FՇ>1^9J~]D̘~7 L@|jO+za2JX,mݔ] Ҿ}k:Ş1\┠,V}`199(=c E}c xz&%4^csl=wZ~&Ռ_:ۚ^! _A6r>!GlWTǶr]a9b:XTӮEU}ȻڍO8wmh0*sq2йx%01F( e㰷F4 y,;Q5ֵzЇ!,8;;1~?`"9/ew '8I"XkOwp\0;qոhO\p1Ш1!&\tˇN|xG+}ɱvAW_'6:7+zl֫gOGd*e^5.(B"@$]@8˘|pCAʕ@#aI.ю&*o5+9tyͨ., Vk5ct:u¶#R$Е]n{ c*3iYnUv|E9"EUvE5?CPͽ5겥?oLJ]& ؐT]R#TPYZAA=^+ʫ2`Z6AѸfBqrǬ?9׃F\OR`=VZcƍu@L*1Q@*ׁ5M,eْYO '*hX!`J*l_ew;[fv\ h`bhevx$pE{M>J)`bC_ݘZP'`C')vDt5_Sa"=:TF)B1D8"~RK_2A5SɯCs TѺ~=}Qy0_6$70}>%01,?-C+W,j.ۄs0R11!bX #,\i=uwPƨTVCH#1U#n D$ڀDd' (_(@Aq:jL= u멊*5LUf qԸ|!1I6\2ЩZ :L =ퟛw]~B`]5n@/B)n%PsX1"5J )P@*. =!5Oʒ#EH"UʮxU1) X}MEpt?:InXG:5)AY3guzCAQ)7!ePҗ]+T޲4D0?\m"\6cߥ5 4JabA {5y)%8ҕ Ck;^3rJ7,7N\鑮U1Xme&N=jq[^})Th Dǯ. SB肈)1k>XtInjP:VCHqab׉W@)L'JHU=c@umb}Q&ŚG97VE[璊X3@ۙ$.DB.Z>ç1esJf#12˛TS"!δOݎyM P[(Zw @))f? 0= !@O[^50j(T"@@DY-qL"f)fIeó%'&u%(A!0KkD#վs^_);<{v❷q@(MꕙQ@$^9ޒ 1ĸ<^au}lW4_y,DH:2йT%01dl;7OIX QAHM$  pr۹wo tpe`!ish315ۂ'FE(qR]SÝ 5G :,j$1p{ܴI"kPZ[k7& B^eo9OUQ -};8Mn3O2|{JTכm8izkyfC3`*X"IrA7Ey߂ThNiM5mS<ՎH;a{{6 ڨ;!C+ [ޯ>LCVO XDaF8x+rm,t8 +AEa?4O\m˵ 2 ]6x9}{<*ZAZA6mC65bj!"r2[_kџ% p*j~x 0KIB\: &Cxeup6@:i6&mрmܲ+4LwGwik~<_ cvQh۽o~F,dӀJa -xZR[l.33b7*FD14ÇYh~bY @h0iV?CD)WԆC{7څnkUbG?DuqK>;:aXbH4zU.1hWA4 -C7"(K$,xQR)%"(LOTZMMSMSg~:T(x '$0?^qSZ!1qm=wQ,`ԛfh %010BsN)A`1W:6`05mP%M`#{pɔ`05a#&Vhv tB"@pEpN QH # W脖t F2 E%010%@'$M00PB9J$(4%010F@(A`4(-V:;P%l`4-,\`0A@*A`\"L4o%010ɠ2l.J/UQ.0Za2R&Z C%Z ß0 XpPY :L FɠtR&6hZ FXÂK)A3 B U06`4_شApaJ` aACP,`2h8ab`0B&&cjM%T ɠ`J& a2hd04 l.N 1a>h*XP?X`4(LM S`&P)ab`0A.6`\:!  aJL Fa2Y K` Kg0%.0U‚Ї)`b`0|04&F ɠy F˄M4; .0Z,8h0%4*L ɠYÔ010&0)` pML M a  La2?B&F3 \aɱCj\`>cXrp0=L ! #`2h!0%4L &ɠEB6hZZ,Jhp0LL Fɠ%Ô`b`4L 6` ,Jhְp >=L ɀSBRm3 Kgͨ SBFa: &F 00j)!Nj||t48'ho.(ckTYsxCU\^5ܻQ㲏f u>!{W4s^㚏{tW~ѠqBF۸G76iAnܽьw[Qk>hCW<hÕ;4G]ck[TZ?7TqY TR?WUpJ.^*qOM]#jjUnM\Ҁ unQ *T_z?sTRTSC:TEe}S)q=SqgOkFwJe01 (B!$>`0z6(h)h)h)h)h wAAEPB!qC`xQ-!BH|W!?D û"(h !B⃸ Q'e0mAAK!U?-----.(h ZB! B$((h)h)h)h)h wAAEPB!q#ODAAKAKAKAKA`0 (B!$>" Z Z Z Z Z]PFB!A\(HQPRRRR2 6%B*DG⟈`xQ-!BH|W!?D û"(h !B⃸ Q'e0ma%hL_W\>+FO/|e"8K5 bZ~kAg6n?Ϛש{\.l-îK> &x&p`>/HC/y,}AE2vȧ6| OoE=?O1xw:vWx1pSr֮(^s[_Cd>#kDPχ1'5Y-_?_= {te]mӀx}]d~{yc]~d$+k(tBa޸ Q'e0m̳D|x7D_ߦW >ۻC^ۆ!r~W 9n=G]9&~-); V\Mؘdqj-qҳ| |I -g" Z Z Z Z Z]PF=#h`ʾ>*lVi_2zwEAHg~qraYfF![D,h_q,"[x71 ~+3D]O-2aCArP3.cwW۰4`Fqu!w֘DJӳA+ֳzfC]\kO Ad/yM̀aښp?Jbn߷B)> O~ouˀ ڍ9Yʵ_:?)=ڃToBAK♈`xQ͛lI07o!n>_9aW9&Fxw:ISA[Z3捫" Z Z Z Z Z]PFVU 7:Kٹ3땠Qq).9e]q>s*)9Q6$SƜ~`Q(ej :1u_cxVƙ3,ӱ6>rԚ5Cv ·-9.Lk z,xIqȭM瑠ф㌯?YEөY;\(Xfͳl͟)sxqRuW=xn|;OQιՋ U?-----.(h+AgoFA7tkR CAPfKsE{LۛT ֵ"qO=]mL(:4_T|D?-^v;^;|Q1eW>g0zAO9'b;מ1 XtF>U5&;App5~+,r]a8K] x3_s/l: P0r8_ ƏQR&2!5%) #3m||)P47~S[2]/QPRRR-yw) AV`ӌ~r$r.P2qQ5Ԟ3ԋ7r)魠2-sr^|eQ񌽠U+dC曍94s2VL&sv%R((3:Y-ܣWTTt[Xm8ߣ7ٯF)=cӺu5nNr(<!|,ib4մNEPr2fȦSpߟ*\\3*D'Je @d$qޡpI2]/Q$mލr)h)h\~ o)ؘA}a^W`i Z#6 Y( ٵMa?g/(fY`t(H'.L <|w.LNmDWoP?A|9w/!p5LdzG1Q1cq(̟U1{h˔>U.Jddec(s*f"|U,: 6XQERa;A&OM {|_yo, bZ'瞈?]/]τnW+0sa[ц]+]8=i迤sCv|^S0dŗءuq}`tIs\(\j[Y3??$_FȞM(KvBoQBA{ Z D6/]6A,FnK Z#6OzvaIQWM=Q | I8qA[q:tdy3 7WPA5X٫7;zIІdQKk2+ 9Nkn$k 2N=/my'@PZОف w#JO-^o Lb_^ W gFYNwyAkT9|T6ھSetQ; NTW.G/(v.SRCcKtJN \uM/~Fhk$=B&귍nDţ@^/hlrKM:0 q=Q$hVY Z Z Dg?]vE;.Ik~7IN lS2qQD\ K0o6+/!*w}AKA[W`Qp[K_D (y߿Gu-嗘a g=y ZӠy c ,jڽ,eD-hM׍_ N_> _>>gBA^ )>[9c- Q؀4?"~ `~s܌(tּ& @KL2om{-((h)h)h)h{I]kʞU;*+A[QӍӧe0)(hx%oa`\I|&`2??,LAkk7_M8$E#?EʦUEAH %UڧAqn3(Z eI42.o.At 6k<ϢiO暯" Yl~EꃡUذ d>B  !{(,#cr&Ṙl-"q[2' J/1ojt[>Bc=Rԯml㱐mY@퓧VVbx2e4;Q8A< v xM_Ų vT2]ZQPRRRGgSRFaŞ+6'ߟi'e0((h5H(7s9l)k{/lW~~'q h1S7s.)k(RA[{Q``9g'iB ?\6DB h;b< [Tձ0 Zv|sA[[;LЖr/YQA&z쥝4ǯ? [7! * ۭem[a%[Mb?d&fv;gRjl~ZAk,Ԝ᪐)9o!tHqAm---m/ 1Mg§-QQ2qQD Z+M=?⯿Ĝ^26g~}6+.rc) gS.@\02AkhsԳʶw/ Zw):4Q[V!u66tat,ʀnϟʺ2Ë+u=A$W &g:A"hàQ? cA[c_Y0br,># / וߘqON ,Æ1z@@i)H2Nņ|!sZ~8~r-0ӕ FL;?&=.Wiw ha4 Ɖ^7~O?X)#0x^0xxd.~EmGnƊy0|UQ>%?%?w.h7cYTrİIxV ﱷ`=fNA> M8VNЖ}aUDU8A[qjS2qQD< Z? ibSZlӆy7\ h#Fp!QL7 /fﺔu$F%xfjǂu~ii55陠2JG| z>lߌœ)҆_~%Ͽm'Fnb-ʘX=D)Ϟ1d[!|b5bAEM֪*L3p&Jq yx^ "Cv\݇…#C䦜~f./uAt|)f"9i4E"haQS&A[_dcl[NVy'l* چoׂr: \ #hϖSː:SeۛqTd܄gkr{. R֒~ÐN:ay`*g Z|jih-'AAE)t(}~M}W8L=>IӁYZrۂ|3:y0 eףkґ{QК͂Jv0r>`_Z t1 >L[\QAFO''1Ӄ\6♠94>eQ";26e>|,4[?^zQ7`V^%ό-H#. ku=8j>3e!h7U$"0e0j_OGqr@I۾߀œW1HV.+%H~Atb-2] ,X_|$hFl4?KrQ8п[:{j%>i`:1tV%.NJ.$j;\g!38`PҚm٧ocdG y V =d0xJ'= C杅N:.+_y Q2qQD VrbLpy'K_)1mAC05Wpw`Z UZn#,ϙ@ 1K 2L4Yhj0Hsˡ\Ъ-3͂6쵦 rG}ga2$q򰽔M[?>2Yks̜,hvBt~4Jz~}QI@m7CgQi/edʴ7gNAI?FI(P/1d([vTiN%wqA{],j AWl #$ӾU_eEyiPՓ5ho'E"gubPA{ifGu,`q-߁Q-7fTġOt-gu/؅6E~uA[:~Z)-AAEċU));d GIQw e0Ī^o hJ x hM7KoMs VgqL֜khβujrD#PõN^\![=aA`|( PZЪ(B9=$iaǖSsN2mTAVP+ G} ڭ!5U 9k|U|5:OimȓQI6CY68$O >u6> 0ռ ׷ĭ?OЪAȗfۇ,Z=ec9j y藳peGA_nRy޼ь q ۶Jʮ:$Ml%(,kDM*h5.?榇N? 3045G]qz2AA`APF&hU?ӔOȝկ)^Pgj_y-ztu{ĻH} _?swޅbKnuhkѪ~[ ,q8dЌVR sx0S5u`d5^4Q}:f٤:pX`&J$(Tށ%2!?q\YЪ|\lJͧz.AT ;sF|EO rV-A&vЊPApj}tfA{u$Ӫe*$8>aViS O=k! }r6D*} CFb܌xݭع++ KkP^l  f3C/0d=^:X b1HэgZ:mQS'oL gV }Xy92v.qq"O*ԝxs6oBG< ͳhumj/a$̘}+ǃI{IК%j?҄ײ(IkAkia _M^kI}쓌.9qܡ7+Vfs 6=|zX]:PS* AkVFh0AL!KBI'@dXuCOooDeld9ౝ ]I!`КO49{A;?UPl,m?:rXOI ڶH"*h7H}qmi^y򮵠m{74䃄]@>b#hSF/Ŷ|frSⶵt1ϓy_ s;eNeV]:EA`zPFq)h>97v̯Fuk* 5 Zgs",_"abEְf4"AU[Hu_c]v^(hnގ 1<_FdagݨÕk }pP7-iAÐBQtSUƯMYnɟ)]ڒq{pwtP6yHAI6߷|K8:8X 5 #NArL^ݹYFBF)h~> U9FжQyCMcS _dcՃWUl;c-h#B6,Kp(h/(xgX*)o}[="h |:~c|`AkQG*_%a+8R~Xv:;A{Q1Ι ;A;[(h^ ("^WM AT퇹4T6x{d^dY rӉ3dtSt< 'X3A<.]]9&d פ/y B|1mAh58 j=YJFLLazQ Z} YWY-GUfG$M,P:DMma{?ǭJC oSܩHms^o_>7d~|Rк"\6i.ȶ~Ҧ梺I%jCk'`x h{c{#dQ8Q2(pߒ̟2%$hۮFAZ|*2GDZȺIp%h@Yb!L |) !)o0pEAA[dAeĺڋ&w&A"hw`L,Iq3xN.C=$ˈq8#A[yi* F<mVidgNO3Mrwc2xt!hYa{C*K~6e_IΉLІgͲRmE?q|G|<]WTКJjAѕ! s>7)|eǕ )Lc!ZYdz!hǢ懃ڵGJ9Ksb/Rae1|*c|.K4(߳:a/Aۍ2Oi3ۑbxPwF*i*٪S[=kîO?@!^wc1#O:DD.hG~Pm6G,h_c,e:FuQq lVʿ-3T!fR؜=b O5 Ak<7>ɵ'>]mR1ώCmv7A+}k\y}W<ˠ4GI : a?gy|bw6~ ß7YgaNP{ Y!'8X^+ yiwݧ&s&H~;f~f!9noKiJ_CP:>8 '>%=mz zRf2%obb2*02sW|yГk HFA vLL(%Bd;9B֒l~!W6]/ G,ǘy2=s͟ 59ۃ֢ā'5hOc$;9auxc(eں[|\xc!.dP, ZiPFq/hR*X;广R1ֻ3Rgf_zC_6FYܿInԭM?(U).~/D҆sa UrV,hFdǂe Z{fGZJew7]Ъ4adCjٴ7.Ât qg~7 'lN-a0˶=hؾCF#ÔD(H2o P:"\6±\Zy߇?_w`[lˎ4LYiX'J(QhPL_ç`p>P7~ZB2} bN gO-5=/h .E)h?ɶ8sviTP iÕ;_`dz'}Ԫ]ß㽼%6. .L3}$¥\sGuI5Sbw躩e([m FmV_=̙!?f7ol&KxuKJ5CY" % 4QoB_7z 2ZAJ }٨fl9{aAacԂ6t09W($U%W< V [JJHٿ Z}ۧi;XvlY`*e-'lv qx- o`!jK$mthָ% NEaro8F53(hc&rI6y „;Ϗ`scƩ2:U,7e , HNAtd߹jI_ FoثX c!燏ԩ8IM&=[o27.7M2p>_aͫ1lY.6>eըl5fI:/=DX*J3._edUAA[%,Ķ "Oƅ,#eLP2QDbZGE(haGd>Jrc? 삺+XW- Sk~9Ӎ#^y:ͧA᫧m AG۶,ς,VGVG6m_8b*hF-)Ć/8_/$-s ڱ ӆz{zօ|{Zƥذn+Qs0/.kAv @Yq*:YuHQyZل\<8!}~x\}maxufm0A9g} b{˄# ZW\ۀƣȔM(4n~?:A&boH HdA;~ Z\)&C;A=JrCKͧj49KA 0„eo!hVj}TQ0y5WM൐IIIGkA[CQxe>A[ K>}3c!h$y*a;#C:}aX4G(Vj^~ +Asf}s FmAK!BW!.0lReЪe rF1(c`AmEb͒lPXe!h۫QL&ZSMRA[+FdhzԋV֢A{g?-IL$,p2|X]k SV`,Px` Ti6e:6+(\$_fрSi'Xj9fMwFe?a{ h*YKPX&'gc+0,,\U-;*|/?`$G\qz2Ʈ,e0 (h ZB! B&(O5YWƠ`.Ű^ "5[e]b=iP&@} ZcQ8mBFU^D˅ػb^hJ쾨ٞql\h}6UW^5,G\J'߯ 6ƽ^wdn/p*gob!.ߦ^ߖ:| |s 5>1{ 9 N$h,+ᡐ:3Wp^Wۣzp/ 5h/]iB"6eL8;Uߟƞl '6% /H53 2g* 0͟7_e0 (h ZB! B&MtZ$ө4n {{𙂹$*h׼& @Kgׂ"1-\VmAж_C_(ɎrufHGM;L?d:퓳'hn'Ʌ3bZ aW!iݒ orl:NºdÅE.`NH3hgC(  < lK1VbuY踺 G"M:~9or/g{\ОÁ%Cg 5{wTƅ}r̯2pNܽ'VZHUZ!\{7B}\kE%DL@Χ5|.]; ճ$|rlZ ZKU% $̼Qznk8_]mr9Kv: I="OR2Q-!BH|W!&uڴ e\TR Ki{#x҈C(Z&& 2 3q\ Z9k!h}EcÒi>D /Q8-N AOƟm{|]u0;hq7@xA@> (h}49V*7UVE L$F3.\ĭSS׈Z a~n%]:J;gv7fS2Q-!BH|W!?D= h-J \UY ڧNОGM4{4Zv8GA`MPFB!A\(HQPRZ~f$ ûǫ)hZAp]5=e+hwnK FmAAK!U?-n\<>9[[vCdMXQ>Ղ| f㈕= _U9ΕS2Q-!BH|W!?D956ȕlW(V`l~X(h{Q*]c2 +ɍsGU9KA`SPFB!A\(HQPRz)h`|D.ݎ 6XQ"hKt.]&g)hx (B!$>" Z Z/Al$6?0|&oF+-8d&K9(8ac̴LA`aPFB!A\(HQPRz)hȚ _خ2UZO}~9KAKA ڪ8v|EX(f٦cΦ8=-AAEPB!q#ODAAJr֏:HJ>4Z4UWPU#A[Ye F|mAAK!U?-----.(h ZB! B$((h)h)h)h)h wAAEPB!q#ODAAKAKAKAKA`0 (B!$>" Z Z Z Z Z]PFB!A\(HQPRRRR2 6%B*DG⟈`xQ-!BH|W!?D û"(h !Bg`x `0 `0 KAA`0 `0 `0 `0 `0 KAA`0 `0 `0 `0 `0 KAA`0 `0 `0 `0 `0 KAA`0 `0 `0 `0 `0 KAA`0 `0 `0 `0 `0 KAA`0 `0 `0ږB!B!xB!B!A۰BId?B!A$$z[((h !cM!BH$Ao-!""v !BY?̞[n8^.ޮ $uPp ^198宣Dz{ Z ZBQPB!"bSE4lan;3m)N3*a;/"L Z' ] ;\SZ 0GQ[ ٖ5]yiRUTǒ Cn]6|`ݹ'^:*q]6Dq}0Hw X]o37a`"goU/mI$t AAKAKq= ZB!DDX@ֹJǠAiS^R-^谞mܸ4裂'vVJ9AxI5ջZ){=!3A+{LK QE) {X^cNA'gKӥ4oM%]^lUqΙ>$~>wӖ ڧY_5~&!$yۺGAAK!k:OQ 2f0Rq$FEC'g( q;: c9Xk?ekVkCNFs=3yfUnC4q-h26moXsC (Kmx!hWF@=8:4AVulg>~'.fF)̈́sr_jVH26VGPQ/ׂVlsg8'+ޔN]u]Cnm4BR(mu$h]T.eb^'5:A[W%<siUpwԢ1F"hA[klW3Zk7ȜZ\j dkBܬk^NW j{mAo-!""v] ?UD# 5ý&l(@躵Efhp^(`v '+?QC5ȅdF'OkK=ڶ;th1k]!6R-T2x'\pMP_^z࿖.;-5֦nf64376޲PZm܁;.%5)@sIIQPB!"bSEĂtq e9ɔԁ櫸_~u3ACB22py;C{Lr_6HUQ :Q!۶xq ޴/s f {>ڿǂV/bsUڀr^Sm3]CQ!gqoC{p1LTӳMӈ hׅ^?ʗģ@AfOepv5AQ6^AA~&!$yۺGAAK!k:O.YŒa<4 bln{^&i DW;:Us*zP^Ǐ"'?6Ue=u¼8I @ A; ˏ$"Y'w[9ĠNǂf}t$q${m>*"hl,YE#h磿DXn2"ܿ-Fߩ\;mުeHtA.-!l[7ؚ }ueq?="dAKMhY@|}+(pZV)mAo-!""v] ?UD+ȺZV: =,;Z6ihbdWw)zGx/kʍqs Zgl@VeR9cANx\'ttV4u*loOZfNϿ^GWed&  Zs4HoĹ ؔC<8:|/ٷ!%a ʞ-qP^RMMA~&!$yۺGAA ZYKDzr$Q1"iXkP:*"|?b8['_Nj`Ia$uH/DX@ֹp-I8Uc'7qåફX]i &' ]/KA+h}f\ONHV5XAچ= +#wQN"{uhsVH ǙUR֥b嵁mb Z]8:/Ii7$L^''QgsnȪ;A[U9?_ϊq.+<s(VYl#62J6/ZSlw$.apDxQ~XC_ެh㓳P!|n1};[q+sP5v۩`p1e*qVhGU*ϔY?_j$bSEĂ^nю7XS5:x ࿄-pv 2R% qx|rjohm2 XE,i_e7 7n hU׭<[\L]_m[Ft^V5M*켸B2@ОVoCiꃕI?dVaW6R#۬EfD?J뢅̋f2]WK5vNkvzϰ2o#5Ά=(z~ M0f5wI~fnNv4\۔;e^5(h@$$z[((h@A%D 4uoLC0mĂV!e:|U3 ׼-/Vj\ N>x"Fks6/4L~k:O2,8pͥ?:Х>p3NT"X7W?_ b j4T_>MLWK?d6tDvt(g)<~NtKA` Vxxa?uݒ V<fdFk7|eɗeOz"|ydw*tVuEU]J1&6X~+/C}En1jqÑ+4=Gf +#u2b0uTY$ ~ꙅajMJF'5hrQmM~ChPQGWe"+ Avt6=}#2YrQ2PvXd U3pxǧ,=8Xg5m+!3AKPQ]ӵd6 ;fϔ@;O3,bn; PۦYo3}yե IĎ dhO%B_v&h}As6:1he0ݘgf3BBˢRŨK.ːmfeYh3A m2"F:j7RznBۥ*~.3CO*e٥AU:~%kMIhblr2m^ӏGT4^ > ]x\:%mUQkz;$o1Po?ۮ֗uٞm5u2xY?>2Pk^g56_؏wnUl"߭bvѣVz]0I$4FU)_tD=OnV~cOUyOĬQ>P3jIˈĎX7X&>GQ鍲ShS믲\u0,Zq=.S\1rox MN76c7ƷN:ԁXH?OkmAoE ږOE܀XS0e'QY8c9Ni^7ۿ :QBe(Z5 '4Ұa߶m6L LXmޱ?h<\WXNЖNôw`NSK[c0S۰w|[,F_ KQS\9 O ZWD"h(>HMEyӕK<7\p:smR!eLɚ;ηj2 ;.u !BH!F$$z[(Th.W2ף@ʔh0}ni+!2eϱ̬lht@T1UL,yyAIÏoX <_,4{ׇ8P4HPkZA> kը_3t*BSiK$+q`.YM[#i<R:Qg63aĊn%nYB&xp\(]> iˀJٵM^xQ Xd(kI"v] B!CsIIQħ'i4#I4 ѾXTlCtmsoYa[RGL@j4}8JY}bQoо,5NO Ij)hbAj 3~p[eE*hEAlMdL,墠Q4F%#pry X~G!Yb`M_)ґʢ(JSdNk O)b=!BI0a:z)2X`|,TZĞKA2FNqv廅"Mo-Wd`VLtԼS!+8~\a`tk:B!$\#gB{ &hL+^a LreH>B>hm!jqD>2@%%! 'YqWsz<^}X59,5UŪy;.u !p xoHߥtX_ S3dAY_5~&!$yۺG߂~9nS L3-a0i9.cT 7 QWHjkٚJ*ŒVVЮLDa=BP::VၠuF=},й(/$b=!BI2h[f-Fь Z$ފ+$V7s6?:V䵑ME 9KI< Z4b`r& j ՟8<SA݀muo șՠc$I;.u !BH!F$$z[(!3?2WMljcp|.U0RˠKMeM/ ƚh`UtĖAri*_'NK}cNO mZ?ٽ!3////uL  1 ֱyTò(;.c)vкQ ZD su L2D"h}; ?\2MӾ1>p~ɣN@X42jy7)HEK'H/ Q0 de`vު0$=b=!BI(ُ3p3^m_e,[?Aeخu e=fe@ЪPؕXkgp(dH 5J[q.,h+sΗ;B;wt"v] B!CsIIQı%BzcYB!$kdLBHuB;.u !BH!F$$z[((h !cYB!$kdLBHuB;.u !BH!F$$z[((h !cM!BH$Ao-!""v !BY?eJ uat+{hq*_0_9v?@|[)v:;wK_םoB6oLGH<ξk`MH}K%&\#gB{BرvsD h щ6JPUTmMMtq+_lDE8ߣ!9)SVP09u]q ڊxb|;Y1Ԧ}Wm)*_\>%Akè w2=Ã4~PFG۟kv EĆ*)_z-'q"gB{Bرvs7Yxp8Y 4NtTf>MFr3fI=@1S)] -%5BA^Ъc!/ 9bX~dh= _61BPЖCh~zm9MU$ˈ ܨkDatmǼ=a(h G|֦j<m%ʑ,SH+Mt*: Y3h u v6[C m+цG=!i7Uجj4ǦBOzRdLBHuB;.uofB-= MF]+Kunx[k,^[syxމӓLILAۃa53 wd-^g&lfwz&h'} ͜zن=ffAcЋBЪQ/mJW㠝fUqv@RDGYa>c1m $U~+q";!;?G;;f魋^<-*pVRdLBHuB;.u(n27UD)kԾ n) ZAt Xbczx$h={*5DdeL탺JQPjam2t(ZW37a`Upwdψ&_ʱ^Ű-2W˗Ǔ2ك5iy`v l[K rRdLBHuB;.un^lUqO AQ: hŃPІ!VV%3-41ۼ^_-T峱k,HUK>WЏߠ;%؆,HرvsDs%F˹WװPj>}FLC獒kz'h͵+;rY[ɾ -r/hCkd#V"fԊ#)gY2E\Oy QGxHu tato½ƫX^ Z,mN#"~~j˯sxRd` vۭl{t:NV߸"!fȊYٞ2piC+hڔC;/Wn˄rhei^0tm%Ua*tR4y<0X5/knt4(mY?ӄx_ԗ1r+="NB˿qpђPwEhe'd8q|~!5olTlPA{T)xTub凔lI)ۺGAAPК7h )ӦΞPy$F.f2fL:^b#hb`c8OGUE[mp]jᇫ%+Ohu#&\C(hkĎ d$RAkt{s YwI)ݻe#;IWh6*"}PW_'b+A+^h\k9r_ [ NnTɦ%56wA|b՝5 GsuWoqm)n6lrsl {:aJI#Fٛr2c)h&%m 2CI;+XZCQxܙm:ƇI G(} .h5R_}_֧{$> O^i5g6' R0y?d' ֒5},A9sC{A۱kMD /c'hղfTVazE_jm='hZY[x-:F81h n^ՠAX9GR6)cA뤍qNVlBtw1q_Dl؃g{C/b[WJz:gvm:-E]nucM6$~:-JX㵣r} n|k(XZ%l2AA@4a+v~=("[8X#[=1*C*|:>웱 }!h}8طO%z[((hI \HtxriK͙+G6 3Pt:F$e=U1C.,Qܼ6:(,_oʶ>wCxAl˾|#?=TAEoCO%cY>1LҞٵbb(34-{|_~puBEA+֩qhc<odGh?ay ecшk͟A2cQ56ЉFn`Fcf0&|J4 .hEf.,BtβjEK^B{*^*iC Ei9pZ y,z1X\Q$ ߀R3M.4*&M9T 1 Ҥ+X?D>_K$$U = Z',Ŏ7 ?8(\֞nE^mY+̴ r_W;aiMҮPpH0⬐ЬT}ljx/LÕ}pA /dbIaZBTĎ dD!xĈo!;Iםf7( z* ۶ \AA{&N $d[eq.G ڄA,s!)s fTJ]!<KdD9j>zQXVS% A+\[9b'}ъ:0ԓ6?z`N->aCa 5gB{L6TWo NiMyMGMX1 M4ht06iRXJ(g<+-Ʃܽyv]d9X/M四Xm] ԯƭcYm#7ȩP1nޘ[h]ZAoX Z}nZȟjNMz7I=ufxdFSG+7kp)Lyyd 202= aX7v~k;1 1?&dNW=$zv \ܴa꾚<B0_Рե,QaXA[3 K)#Gk:y(ζ_)ʏLIX<6@A+[g}D|<|.Rڟ5:q3et/X]ڦDZSرvs8T˜ooو歽=ٳp je#%A+G*hOv_&&IЊ՜\S׵Azx9$7\ЊCKx+hUĒ Bc8P}aPJ"Ȟ KTA(eeW""Z c<_sXXI~ 6P3M"yx)f\٩hb$ՓfBjGT6^%~rdTLiᥣa\މ"h 1M^fRccmݣ_A[KRd`U!q`O0YDwz]~\mTa;arl#MqsK[Yc6́ XZЪ}1h(l[kzƩ[<GLD3q`~WR:m_ƌLlu*uR-$G2h c5ie9 k:CAƹ'F>T l< } dtI*A+ր4'^ Rq`">Flq(–6^КkP;mq# ŏ3$yx(d{`[J3s R(hY_5~Jp܏P\$oZi%7gz#hg\#cPM88b?j<(h iٛO-z[(T`>Rjc !dHZ4|O*Æ!B\V?_#7m?L\:][8Q0r/HQQX?e'X0:a_,}V ?2V7ALi3cJ ;}z7lK(?^<}1r$|qxU$Ξ-@#Ď dąUQGPי _D;:8W Z% N"NeX{0DZfnÀa\"SVYⵠ/|KiDs~|q(_%+z8ť yH\O${j hfQ~Vu:htS[_ Lڴnq[@|FA@4=P@:6,3AZ~Zy "gVÉ+hmtط"Qħ=>?o,5*T;Y2V3jDEoĢ!2bVˈpp8*uOX}Zřgk: ~rbJVt@.e& T 5} V@wq;)B^=dGM `֮,W&O2b}bR*T)7x\֯zx3ueFm ZLӺ$Lˍs4Ƽ ;'O&hZ Jv<˙^ Zq@!hFD9}hoڙ}IjX:nBy_;Q# #N8(VmEx՛VRրs[V$L gBЊ"q([&4 %:N,>Qr&+Y*XdU ԡu">m2ȪS #aǢA(HKGib-Tn$2lX8vٱ…2>9#̏9S{TZ8sT|q87acxjYU/$v5 p6X@*Yca$.(xc AX@ֹOL ZۛW]xGSnB݌l.d&"xt()aX',;Ac#Vā:F 3qi,mr= OX X㹠C]j^ǡ^K7^ %q@%'u s͉ VBG_i@^9OWxf%3ůDŽkCNESb܌zjG?>K[zrrn_wVm~>"ٹzm9mY?ӄ:ـbQ"hJ4*n^yLZ c{`"~9NرVt&"w(I=zʐ(6ZQ XgϱLꖤ5|jaO"PǙ, N^%VxBbRFAp2 4X^VA.ual1BB;.uHBNep5Ri) n)\MA4M ʺ4 k]Rs%hMb*FXWb&h3ǠQiit qMrxPT9sAk|bupPMa̽#ENdRj ׆'Qgs*  C9F 42oiH$(7щQ`c iV[P|6pe6~%@iٻ8X֘&i)h&65h l*{,swo^܈u"Sǁ׭T3 ,RMZMtAk]{ϞZQi ZE&eW:QyOLX_֒x| JpIht3E3Ak6_#K3SߘvPnq@0|p:q*E@v c 6F냟YP^RrH;.uBUipNFAܨ/lK^ ~PpFKUڟm0X[Qu>>X +(ܵbaM-_z+N*e#ٛkA;6x@4ʾ/XM/ъ;$41s?m 9+A{YH2{GОbu}D*#]D/w T'ebZe{ZѴs I\*4]g]gޚ]ËQ9ͼu6dMjE[Tɶnsq2{pM[gm^@N|`+1μ>jP3MD'hP?TJ1MDdj泉mj*_ӱft)Q/߇صq~mt{)hmO'Ӏ=8 uQ4+b>D( W=3A FAch_óu>6e4 McTb A X綮kpWiWam^qe1b}bej #b[ >胺C-:|~P1GW3ZY8.LeGeWӈ#L?Z&USxܢXF:Zt&ݏh]QVU=roۚ*4JT(LQBOId`qF*hM'3l2N$nD">װOCJ8A*jS6r8-M Q]І3m- (Xa;_dښ*,!^#v] '&Zͥͫ^QUTdžV~P,[|,ECn͡e@2Gվ H]h.9w/hUTmF=#*.P=G|1ƞP[Y.,NHЪTs'&e٥ *hUoʵqehvD/LYgNEU ;)[kWnW?eI8nC68N,ZYn'LG ܴ+ۭql Ãu6i"fR2z(Vٲ́7c'hcf2`M23a⪹,hcxBu"'EY*-q0#AI?78S] )mg4[M,^ЎGzAoׅM]!єe sĎ d$JAly 5;\{OB:گ7<<͍˹^:YUyYζ6wu$P7h/-5[V~\Q%G&h/jVTgU? 5d7ȍ7Nל$5"$ևustIe'6rlm 39s6QxLYzrm\o?#}eOqJcYB!$kdL=/hm^[ѓpVݑ ZXh:{jV`욅ކk" u >mݣ6 /h<=#a OaF$$n;.u !BH!F42K# MEc苅Z:uŀRā$[ Z!>vba#رvsO!BY_5~>ER@> +,2.Sm0 z!hÖ:=R#oyzDփ%2%#jQPB!"b=!BIGե:ք;e'o4oMGsIIQPB!"bν7nčcAxb@՝)_5h-*R[yǷT_Z=*(h]G \FSzDU6$e >.Ag@ ɢO*szUoyP[\v6;´F/ʐ1={kœnfGzC(_z-'q%x= ZB!DDX@ֹ7#P>TG؏Z?2wNzDyWx"&B͠yG~TBخ_*BA-n?L?F,*!:\`#iYveø$[SCԝa%.hrw|R&T37YGEtɇAy6Ņl[5:j)ߪSx,>j.xDO3p^{(m$dwM96v25V hgTV(h !uB;.uD&^W 7O&IC ?<$7K{ɮ WT&&n%2nB=ַ.ڕ36^!&mk 1kITO9ՀkϓlU#LSe܇pAOQFf.-6aڜZg<`x ܳPB'=LVh#eqs&$رvso&JeWWTn B,xKCAb'hUJD!IuO\/ xAxX&9kGGq#ٲbt *ДvsOe794bߎȈiR/Ͷ2\5Oz mY_5~&!$yۺGAAPkpXA3 Z8>R/I!v] ܛ o*E\Oh/vLO,$yqp,_0/\œ@]?e46wAi#r?6|x|a?TSb+hB^-k2M<苂Ѻ-hݕi<@<nA>];'Q'&@46h@f@,m^뙅xm886E ']FІ=?w#D5*`Hu})Z:wa~ߴMh$׮&4[< Jz@$ǹ=hg~+@o]Wp;FF% bo?=N:@DAf6ZkAz h3p~64߸'H4V!Cb{+tjtjƖ8ru;wO:%Pq%c_4zz̅eO0aX~$:Aks.7VΏvTF%7냢6םèMd?N~M5hv E*={jPR9ŕXr=!uw.I$:j(:`uX>UEĥ%D=%EODzɞ4d.o+B5QAE2FOoM2a=(k~:n8w_&aW04P{SnDYuA[?kSQbf`dǶEJ8oqve?cAZ5 1y=e AvŠaay,G?& cB:F2P[6qՠm;{W DŽa/#Uw^fM#!G@djߩ4r~_ꋑjmپ$$;.u͈7DSջ}y@OJGzLЦ +A;0Ϋ#+7I Z'8yz.#pՍlq/V$%nN4V & $;}I8== k86ex >r%\R R{o*7,oCy&&{kRBFoE9~?# CHMm!Py$F R֊P-Ȟ7̯nŒV_OY]+Cé=k1U >s!q1ڿc(hQ8S2e0Wv%NKj苑 fx0%u( G*i׎t,$;.uDtC8<S` ꏩ##ˢNjF ZZ4@3sZq#(53Aǝ$6o֥PQq4܊D6RJ Bڷq)&=7 b+i}8=} [ We\oE!ڕ(CD1Ǐ1@G0qiL8Oʽ8O(p7͠%D=CEXjFىeqb!X'X&JZ>hcM\ coXLFIȆ3ÿ eUp'VX.a8vx{:OÑMW e?\5'۱e& slQGӨٍ~bxX_biǢpB\֏ü#dhۿ?DxŴkpGxK[ kSrdTCu@z^-KO2`M& +NPo].œ=zΚR(hI"v] ܛo(\PxTfwD\]⍹7pGUSݯ܉q+736;/N q&hVHnye+1.q > a^RaF;j=Dg9c!ZS\Kjmۊ;eeTL=@:{7VvRBDoE ZԡZz[LӅ^EєVYǧfNDsq=e1edj *[T4iB:*VQ5 0b"M]ZΡ~9Ygץ#cqt_v<]8KdaNJRs"8Xc\6Rd *3%9MPU9&K$JWrq8ygBAKcYތk@xRӫٳa+eu~vyŠ *"G@FFOZa7: !h_DrL5cbKR\%.bw]cm)~pz( : Zh 4N<>"Z^]3b\K\vI'ڼcp(h !Qu"!,Oe? |vi6N~àY@PAkwiuMσaZ ܬu>y#G 9Xy(s +ߛ}&پ5YXO A[?k叞rR M dYvU\ƜMG*hPccMQ&;c?(O/|X Ev@A@H  (M:F@0) 1N1kwg=iz<%;Wi;kѧhIIu4Au{;D(}ѭ+#i+T=ٶ mn Z>rj&"h-s;@M?[Hk<6ɀ෡grdAT}Tҵ^`L@! m4]=qe*mhUк4Iq:Uz薴/A"5lrug_ꑨ;YTZ7QuAT6ߧǨRM[S>ew'^g -h Hv}ז7otM5\*^ùA8Z(hV>W/ 2'ˌ'빩Z VMm' y?W~_\&+<[3#T>O]5vl>Xs#Sodސ8o-x:@`5etAZ'A88{L- Mc=daL%8<囆9oۘ s=i5>W':N'<ǗuN]Y5ww0Gl/h~$d4w}m4CA4LVv/ay~+-tqo'dϔ (2δk L Zޖ}ـ #AZ^R_$C¬~b\2MFjf2K[O*0B=sMmMBuiLH?Oëju9Sy?Tچ䩌|(݁` Z@zH~A)uܧ(PY֏>:uk|}t)Mkm{p`:rXU=oF?$ƍz|`u) ڠiB HvR,GdomTD[j4/|䷄0Ł8e׾>oN/–A gY?43ltxMIIo?TO}xg_tExR2s}a2Yf>P ->?Berds>O3DmcI8?OSdސ:o\Kp*j\ZG j#te@QVJ /ʴ:_[>!hi!%ZvbYSOjߎzz ߧiF?|AEϣi^᛭'sZ_MM"}Am@!hA_X@dɧkW40KT5a9;[H/I>-}H[IFUAoNgt@Jn<4s}TVMJΟW%ّh6YB9gR*w?7\[wS* E3=<L:GC9XY7L:74y9yKܥKf?Oӯ _;FSnj'~7D-utOcjdܳ[7/&.w>S+Ya~6T @D?CJ Z/_wBqŅ`co4Wisq"m?4UAAC_VJyHŏ3a\}>ڟX;ѧZжSV@ݙ^L~J?J;1w{0_ hA_X@Ηk먏z;هE&Cbvb$U9&r'6nRȿo^_ݵTnWJI[ZGi_~yNo|A1PˣkTs8~pzp'%q/aT&nAT]2,ԝQD]]ј4=LS=5:M7[qd<z,5 Z[?ߡ Tt^эA#K$~}@M{-N#3UoXa=x}>p܋KUsPv]-UQo :~ؼvk瑱r!hi!%m4髩2ևsE'跧IG=ut+?A{e]רs[$b3)ht|LZ^wieݍ!zLey|ҬUʾ*htmC37 BZ%갋m6A :Ž\[GD1rЌ"gG5͵oDg|h$F)֧ƥZMHA*}}NzP6 ' z,K=nM~k+cX{"FCb.(?JZGj'E;7α,ơ\K](J[!DyO_zmD/0J _V{Y:CZrGwӯ;t kc4яFX2U_cV 5sA[w#&65AGeLZL Zk9Һ6eJ#3t0Uj)Ziu][L+Mu߾G\e4ty }m)=Z;X_ҰEZ_ .6;"xxQ :p.U8CwPX=5ܡjtϗAڅJk=җAo}6g݋UωC02G\JWcu1Q1]Y}9ms/3#28o` Ȯn8ϜMPZFygçsmG#h)UBulV.>љt&>nFF]"&RUH S ty(8%Zu/B22 F+?#Z3 uKplJ) +LۮW|7Gs3Fntq?6hqFߦKA>|=Em3I&[U;9c(UZ=MeцF_k2z~qT,s: sQYQ?˃Z@_X@MZ/0u& wЏ Z{PGO2y4h:P6YL>ƕ<(YeZjFS8wimű]Pu<|ӧ0%Vhbj7}4TLgx[J ZA @v/ ]t:;zHiVj-_GIHW.4a·Taz9^meV0跧Ѷv[*.N#FڳQQAiOF*ož4 }=vpDlCBg:U@ӵb'}|@O:j5{?жoz=1j])l:qq<oNgIO*VJ6~@PzЇh۷S- tqҵ^`L@!Zy.ܯ.@C t c=@<Ҥm4 QҚ&ֹ- H=%?,d'h3cÀ|\4@x?4- Xnzkyb&0\jD{ImiF?5`jAo RyZ( 93kdy(#]grX)9XZNb]vzIs VE'.{-,@2tqy h>6+F t c=@6..jΑڥ )N&eMiŨ:oNd/ ]t:;zHmL҉ ID.hZOi h_X@MZ/0u& wЏAl(_Sԣc^bjikҭ h~a4=kHיA?CJ ZQ.@C t c=@~a4=kHיA?C -.@C t c=@~a4=kHיA?C -.@C t c=@~a4=kHיA?C -.@C t c=@~a4=kHיA?C -t c=@~a @*HיA?C -t c=@~a @*HיA?C -t c=@~a @*HיA?C -t c=@~a @*HיA?C -t c=@~a @*HיA?C -t c=@~a @*HיA?CJ8  :{p-    $rGHEAAAAi@"    4R hAAAAA)     ZAAAAAF -     H#AAAAAA  dM=zAAq-  Q!'Mvg)M]YNhLvd)3G nא ZAAѣPC$KW IfF$ (I*% I-]iAAA  4zy!UWWk26H"4韘m,R2{jXX۲d.+Kcǵ:!hAD-  ihhtURBml$降H4m,b2{$jXX+b5)6uqou# ZAAѣͽ{ٳTyNIFIF]zf+v#&E$ֶ"]ƺ8-k\X; A  r hAAF.hO>M*'IL Il.@I*&I-"6U" ZAAg6b`Ĥhc`ك$PږUĺ "Kw ZAAg6bNĤhcaك$Qږ_TRnZA-  I]J3 lag0bR1JAaam*belT:XZv~- xAAix ZIzf#vMOL6V1=H5,mAel] ZAAc;Iن$AUJf@ k[V.cؠ26 0F@" G hAAFOv ZIf j]$&E $ֶؠ26 _ƚ"6I\;_A  EAA=#h% um R2{jXX۲ؠ2YX2V^翅EA@"  $A}ULfD k[XwDĆ/cX/ ZA-  ɬ$h6gbR1JAaam*bXgT&XEbd΃cz;ZA-   GJ4[P'1)XXd I԰uAD,cgT,G?X|)- xAAiTSwq1}h(݊ھ4=cΟV^^ %_ͣWxY2zh=9-BVv >U{M6g#}-c6"Vݣb%k@+翇EA@"  gA+IlA'L•eutkzZzl*JIAډ54A;z,be4Grjbel A  EAA=VAd!X 4Ӂ3$Aqj5j*U I־SȂv`z$bXE0EMuT$c1 ZA- ie˖B HxA?<4hIFI&6%hS%+:jpAk9OS9K:WlmcLzXQRfp>ZA- iEVQEvD]x Kvg0mRyfc*vE" "bkTSލqB)-AEvA - i%&(ۓ'|"=? mEx{͉vip&S$a4MjNkȉ1?hM]Y226>"V)Fʂv%\:MQ0Q7*6.c"6#1JYA <"R oO,~Naۊ"=?y(ۓ2Q''W9/ݻӺIgvMD"GDaS9F ߤu?'yAzWZۊשb#cbiKZelXgAdzYm,bDlxbelbEΝN];s(ۓo(ۓ…(ۓo$X hI+,ÄEx{R@Q'd oOO,hw#JҨXIz& 8ofб3_kejs4NbXqedl|4,h?#"VҨXY~!HXQo:J6Qq,c8Ex{R@Ex{R@4 - itoOh"÷AIU\EF Aժv~uT}!].gT;XU=9oEl$,G /HXM vUL2V$he h.bX N] A Dv"=? \"=? v@AO :Lx[Q'4O~Ex{R@ *I6&H$YfvVk. I]1.^uY2G`X"v(hW;XEh˂v,au"6mb2ɽ_BoOoO`E$tVI_Dޞy6"=?Jf$BAA흤-c ѰMWhf.Fʂv&yX.b$m9YƱ*hX'{' h|;Dޞ.|}Gޞ |; A HZ'`&(ۓ'|"=? mEx{Rr$AAF+_PيAԿӾ>*cB6*g! 4p2I! `2V&b+ QsuT"*cMd{"|;Dޞ.|}Gޞ |; A HZ'`&(ۓ'|"=? mEx{Rr lBaam˜:EË_R14wX>uy-h#3-.'^A6}&dxUȂvyXq#aeAc;FPZ/IX1*V&,ػEx{R@Ex{R@4 - itoOh"÷AIUvj$ֶDqYAAp]{pWqz՗M4o_Ja%فD,* گl2V:Q\m+IT8w-!p;h ZA ?K'0mEޞ*nXrl|P:x|pW|~XYЎ]:QN֟e(xUȂvՑibdl h|;Dޞ.|}Gޞ |; A HZ'`&(ۓ'|"=? mEx{Rr@ k["];*)usшޭ͋hf}zW${/0Ĭ>W A+XVD}dGnqձ]@#mu(LA|G:j gb߻Ex{R@Ex{R@4 - itoOh"÷AIUD k[2YƱF#Yؾ`QGZGjlT^ Ibg: "VaM+ 9LVa+6yT,h%D$c(X'A+ XNXSƚ5yZ ·CIwI,~Naۊ"=?y(ۓ2Q''W _J5,mؠ26yz8iQ~,|Ż c Q%tfQЉY*D}T4 AL&X.beulYЮ$>*K6QU\>-po(ۓ…(ۓo$X hI+,ÄEx{R@Q'd oOO$jXXrADUGsDt)bґ染˶/XFɣbgl)tAL&F beA;7!aX+XYnEl\: -F:Xn"|;Dޞ.|}Gޞ |; A HZ'`&(ۓ'|"=? mEx{RrVaam]n"VS\(-Et_ [.-/'S+A>Ѱ΂V:Vkv$clF+V-tmNb9\ƹ`ޯ!hQ' _Q'DH@"V X:A o+ /oO<|Dޞԟ\%YJ5, "KEUZ&P$uC?j)H6\Aa$ گ2.bbfb95-po(ۓ…(ۓo$X hI+,ÄEx{R@Q'd oOO "cX/kV&be>O쭲h@t㩶ht&eb8Z]:Dl2Ħ]$,Qms$c9՗b A Dv"=? \"=? v@AO :Lx[Q'4O~Ex{R@ *mM8yb*_B;{6ZS6ԋ/S7ߦO>@+&f-2V+VsJu^أvsBIbT]ƚ\6(߻Ex{R@Ex{R@4 - itoOh"÷AIUdAۼFźX\NSıؘXF:X+\ >5\QX>*:2]n"6=D*X7+q ݻEx{R@Ex{R@4 - itoOh"÷Ag1~|2z/}1]X_9nW *cD$cT"UXE"6 "bXIr;*6HUzE" "bAdV~58{0\1~^N}d1.gp:rK#s,08,َy8sX:|LGW|F?{~3 Ex{R@Ex{R@4 - itoOh"÷2ك}J0evDĦ'cDlPD*XXY*GZe,`9Adl:"bdl"cX5{v_J~pz .ǨvᆅKoڸ/1n۸cp16\Ϩp>Ts6 g~I'ӱ[觢t`L7? : :}f*R kIwI,~Naۊ"=?y(ۓ2dUJf@ -wTƦ.bdl"cXUzXg-cXE:2V\kE" "bAdd+bAd)b2V.bXg"*cEB UT&b'*.OK-yiǘ޴+6uocО^M_)iR kIwI,~Naۊ"=?y(ۓ2|h6! ԰.cd *cXEk1+KX7+ XNŨX/D* "V.c1*6=E,ce Mޠdz43Z5=Zا-#}?ь٭ZڿҒN+;VGl^v?>:|}Gޞ |; A HZ'`&(ۓ'|"=? m0rAel"K 26UXEu26U#c% 26U"*cEbe,V,bUXD78r<}{7_ZH?AB=ACчO4K#4/=M~hHZ3k]6_c-p(ۓo$X hI+,ÄEx{R@Q'd $ֶeluAel"c-"6&ce &ce "c%cXED*elvk*belŕ!ڼ+ZV0f CcL=4MF=&41!/ 6ZVMkhWb>NsLbZ wI,~Naۊ"=?y(ۓ2[ϣ%tI3sH5L̶ElPuI2V:AdlXw&belHGJQ26 *cXED*Xwk"VQ2XM Y*,"VQ厛U>qv*//y|DLCD诏}ؿ1;ѱkF~Tϱi =/1YEx{R@Ex{R@4 - itoOh"÷i4qD4q-;֮Ml-+uTW"<# ԰.cdX.bel"c-"6&ce &ce "cAe *cElPDAD" "b2b Y2V:d{MCbTTA_[~K?P?'7 y2>]g/nbSLiTO4ͿPkF^w*G*P~OT X%c"6.cuQ' _Q'DH@"V X:A o+ /oO<||W_В%KhSAAM:&MD&LiŒMf)=a$Pl]X/Q-bX"VD 2]zXMDGŞTbwӗO>iX3*65p;h ZA ?K'0mEޞ|~oiΝi&m'ъmv)=\DX "bAdAD"u+WFAD"u2bƨ 9<*65p;h ZA ?K'0mEޞl1*v`3kۓ…(ۓo$X hI+,ÄEx{R@Q'd K[Mec=F_E*vFŦE:' _Q'DH@"V X:A o+ /oO<|Ѷ/b^xvk_*5JZ}WXjTFiy}bm HgGO?.׊ED* "V&ceX.belL 26UX`"65Adl:"y=mڵ-^!6*֘+;ϵjUQo=lG!Wp;h ZA ?K'0mEޞI[KoKV_z.FQ1*64|ۓ…(ۓo$X hI+,ÄEx{R@Q'd oҿ/jjTFi9vw} LfO7Ls?{%;bd,FAD" "b2E* *cMDmbO_Ke'/Ҟ?mi٪h4y0a4m41cFA/BoʨX.cy[L&.p;h ZA ?K'0mEޞsaTl#?oOoO`E$tVI_Dޞy6"=?Am4m>ۚVC;}BGv/_OHHd+ X]JQ~E"ŨXUXD78xZ[˨f=*vǎTRRB履~~g:}4]x~W7oҝ;wbb|饗b`Tl?oOoO`E$tVI_Dޞy6"=?a mmY?+!}a&.[GHHXIbT &cXUĺ "V.c]Dؠ2֔Nf:*#ezZ>s*֟^mݎ=+QΝK.ѵk״㠚n߾Mݣ:ߩ>F< xϻ(ۓ…(ۓo$X hI+%QDjNIA mEx{R2$mmq>,˧w',ce 2bssTlPk*wD詋oei#iR7OĎ{@PgהG޿4DlCCCGӘY`·CIwI,~(" 'H#Hf jGnV tTs;9z)_BO=c?''+1QtÿQ/SFҺ/ҡPB2MADlP.b "Va26U`"65Adl:"yvvPNKVoqSfP6ڱgu\[Jƪ^;'w]"X) 4.QDjDC ,DQDjNGf$i[]ڶh@bIDAT"&ny晘}''=A] %f?#&jQ蔴U"GI]*y/Խ4j Zp*޹V|$cؠ26E"mb˱XE;n"VKbg.XFCGnoSPNKQI"kT:~Qǻ:|y"QA"@EvA4D]и A  d4\G)FǩQrwލSܒjI5csO9(\jNJ57RUdɒՓާNJ&M=}hq*T~[r0I26E"QElP+ XN2MADlPk*wDU)VVBKWRٱhĉ4eʔ5k,7o-^8vYF;6o}ѡCb/\\ \A  D]ŭ=TsL&՜jJ|rlNJ57eyy9ݻi֭~ؓ iܹ4sՓ'L@SL?ի]tU_Rbؠ2N`TEl==:tڽ0mؾ-SƎueƌ4gZpaxZj[lBTZZj+ٳboݺ%ݹbAAAɚH>V m-[6n\M}.]*TD"ŨXUXD7Hm/O7lKWЌYጊr o  !AAGJD3v2_0V^Nwl|CoUgR uAD"uAe)\X;AdU&3ݧChô16*+3!M: bAAAiV5.[D6~I%#?K'l"beI]ƺؠ26 *cXUQbGk6;W,F" HAAəH:͟KEkVhoTy*g+d,auX7Tƚ DZElUbNB{~8Lw|+vBEA -  V9,[L7o+ O%bd,_9ElPD*DUb%ŨXAi~EAAet!ۨF*;Z]D[vl'S26upADlPD*XMƨQ+V;F" ZAAI1\6ѶjT}}m;,[FHʎ3.e *cؠ26UX1*h͆bg2*vƨEъ+0*AA@"  H.nF۪Qj>VT)ըJ5RT-F۪m_@֬-;vұgR)dX "b "VDZE$cOi+v7bM|T)bQK.]v-m޼vE}]l;9rN8Q 8AAA";VL}lZl9ݸ~,?N/]-b "6 "b"_}G*hq+.[Ib=vUTTbǨXAA@"  H#EsեmGNQm,/|Ew( *cXEkZ].X:WQKl\~bAI)  eҖLm~v~=E.WQT /-Ok6lE˾HktGB" ZAAiK̏F5kioGKE"XYF8J_,aT,  M2  ҄å-sZ mtRu`QbO\  H.AAAr,\$riѶSp\QB%p+؟N_j5hVbA@"  H3 \fz)Si9aя'.Pŵ;tPbW0*AAZAAi႒KLUVUUƨXAAs hAAI \܆1V X5vɒ%  H-   'AF1FݻbAiEAA$piŭh۫WFܪcT,  9  .TU`U#b1*AAAAA,AAAAAAAA     HEAAAAi@"    4R hAAAAA)@vBr ;wzX Iʝ }kM@a0#_krX+-HZ+zX h@ך\A? -`A G V hZ>& WЏA @5~Z| c=@ }kM@a0#_krX+-HZ+zX h@ך\A? -`A G V hZ>& WЏA @5~Z| c=@ }kM@a0#_krX+-HZ+zX h@ך\A? -`A G V hZ>& WЏA @5~Z| c=@ }kM@a0#_krX+-HZ+zX h@ך\A? -`A G V hZ>& WЏA @D˖-SFrZ+zX $@R 7R= -/zDj H@#_krX+-~TO#/z@j 0tC/R}^HԦR=~6& WЏA$( x6^LI5Cқ2ylk9橿oMjS羗X'Sa;שx3M0zuDZvݨ9T8e)}>kٕ˶CBRXY?(6on5v7IEЮCݽ[E梨Q:TMqT~K~OK!6J?_>B_5k؆9TxZ#mo/m5c]#}~~l;i=x!R[^H8S:XIRn?'|y>/xL T_ܐu@SF V[VTВYk͊m7D$q/ h#) eC!uVlhE-$,‰}4epW3pu;e%4ah&{i$SVoq'>SK=~v>ɍt/kwv=JGwӵ-uXȧ_t]i^Xﴽ>R:_B|N^۴yt0:mH~#mߧx}{|i' _MZ*NNM7xYn;|y>/xy;mOW潇4ܥK!>7:ri=x!dT#/;& WЏ54}ts!uAljB8&~A!MUОC;؏,[fQXޤ.6JJT P6=h r;|Im2.F鮕ԯY&/}4k5-y6W@͡o5Ov9Iڦ*hѝ=kҍ}t׭B,TW>(8xYA#d%߿VPf UtIA)|Π}${_so4x B>mU:փMOж/_(hz['?9ì/:NM/xy{|y>7xYoЧj`zB|;8J7[2ὛtT -Ҽ!?/z@i}ّ5~L@к Zw I+E!ڒS[ZA\O:u[08-ߣ)K'Q+0l5=!/F9QKmSi!g;S\0Uѻ䈴\؂M s3#]A@P$ʩ\Ϭ𶤾)hKjO,3#638q\[NٖDmoOi{{ *h1 }4u"Z}J%h_sגF粠=z>N7w[TwCKNM/xy{|y>7xYnΡBXW̥2_btn CSDt%ͫЎԟHEn4h?REwnATd^iy!գ8j#_i"Ib?ټ6k!sqBZ_vk \R5ug4o7ܑ tkߕ:B-;/45%?X|8tuLOֹpe_Ro(8]?eؾKVј- \C:5,;M>% JԡcN!V h/_FcJ9G{/u|yI=O{:2}\~殭8H 72~i笃>.i&S_ Z4b}o FOJ˛D(h>ZʭB% ^6|gذ3Җġ_RiaY?a9(S^::cJ(f h;nVX ZR;~vA :~+yNeuZ9UwYy ZJ_OH=tN';E^R{FhAv~tK {@O&z֟^Kҝ/дnNaCZ_vkM?Tڢ94 B6jOiZ52nK-K[=MXwIw(;%:}r+ ԧxgl٦(h_g8i&zXm@`* 5p%mymBЦͮ#J_]LS%ދW@ݵ=gIztdjx=O|OJq4/ }'$`CofOgm!bAqDY-6QoKl}d t N]Kb_(S^:3'hva#oerFޢKe=4B Z~.$G!uC 6):sV^ZJ"/eAk* 7?YI>)/xyN.h/NjFVW0j2UKM:#?/xxoS5ߏ^euY.LCӢm=I`bNshd"SF^h*Rn# wa{qSPvϡUe3Y#6AtsVOкuJ>E‹X]&< hMQmi}w04|L\ &47}/7m~Xu{[N.~];}6{D?;njLHT4>I*ޖ7xX};+hE 6ߧE ?Ӏ^.y]iJ'hsB9 tנh@. c Nn Z}AzXA;b&v˖Q4NHps)ЛfN_ 2+hKK'c$BW8&h'y(u N[ >NL:ѺbZG/r.9{z*ؖzMwP+y~0;''t7‹ظ0 AFW?m$˱M\"Vv4 ~;HނdF$\GCV\&mn ڳǘźx[R_ec.1՝k~}LJ&׳7QD4%5CڂvXvѝDaӃoOi{{̴ -(.ؗ ߧ0Gv_ Z?w2.%tAg|yA;y*>:+g҂]I,kNM/xyk2|y>7xYN%E쇾T-ڠMrQw~s9r)/xym>[q*-N>*y(nɤ2S/_?󂗏י5OxtW!=9g ?IIgK_#K%~XI}e5MpK@kVy(~hzY=-֟&6DY`ē hz]$孨9TD}i4?em݁:tTui/zn^M)Jw@~{RlbzVa©Y(Q%?Yz΢N֣LYN_}O-y 4әMLEzik aA6GҊx6,YcZ:elyűn*̛dAjw}A-QH'YQQ!Ôv |9[A?}30 8|0y BVfں$}l-.!Nr{hLN=I;1#sAG^}ñt48TasoSQCJ6UQ&Y^mI}q7nK4ѭ2<->4%F+CDjd-#(0jjT j:۾`\uTwpbnMeaӇoOi{{̼H5BՓmgmI{wTѥ.%[e'VNu6y9/h4it79s5ǭt_?GV|j(Lsr#?΃{pmBc8Hu'Y1vfGZ^:!hueG|ЮN_}w>Mqx+]A`ϓiX;Z{=ąwOXv5{u2߃.^~lUdS^:#}c;XG2rA[:*:A{͸ۜc%uA{1ӟpc’R􂗷_^ ^֬S?n멾.> A˧6PJKSZ^zi Z˹Q:#-$l} ߿Dճg^~^vx\"{eǩ=j?Ԝw}SP+trc1ݻ~ÜH]ܠ3zը)^.NO!hl/U(J/~N7O>2c4Ki Լw~-{-{'h ^ "h 2́蕿7=ASz`5 p=m,uc=䄠m7>/ţ{W5ש2V_R{|v5t+Ƀ. s߅57e+oW.;3t3?H2,AW{oZoN` i-[fQDI#`~"YSNbwh.׃:ɫQQ%uSG)ɼ+tܵx )QnǓ§M\">9Qdъir߬Κׁ8_HiЈth ݶ:ӭyYt|IyXATs./+l-糞&Yc (h-#-y޿1LVk\)mo/xx|eJ/ $Oi=xa}Hci;/@usV{m= #nyR^K˚u.SՊ A#~֖ӥ)3Bsd<}J ^^3-A;ȜZatVeΟCL|H l*ؚ2U/c^5T[6EM[T,eӘi7d5mq]p"qa'tm4suG\E"LgP ~]*VL\O 6d3B?JNK&@ Y. VTS@ -%_s}+l0-;qzJeم4,8pܙI 6<+9Aڹ S'_s2~fRZc > y]i6qEW*'s񶤾=4q&U_2G8 S[PrVWNkIL;{XAG9>$Z` ߞ A+aOҏlĶ4|yX; \M uJmz')s궐mAg"*N-解ji2;jUSZ^zC_4G?NlN}ByXd&GZ^e_iZ#vi$xTso-WU~jﳳ^o:jZj%T">mQC-]NSvܪS[EuƵC4v7-x *8?(+ȃns:nqɴݾ[s9́]qoS hHNT=wtr;|T_Ӻ~+܏nB)uA?m_1>#gRD;~vh@>};sHyN`4c ?'>!߹,}ǶQ]!4xrZ+km̋͹>_\H8 v;؏L Ў|sb aJf۴9GuVqUu>oKTwATњ|u.LBTS:ATF(h+EY[A0P >ת8N =/3+> >E_m6\5|V ^3p8yR^Im e- h3֑>Z:Q#څCLYdn#X3hmFGZ^:}|}&vNI:W~Lg#MiWSz?M<<6þL :Uz6 T=pFJszѸm:Qw1sh3_,Ϡ1oVuhDjNTZgu(i Z~0~ L7i„KmD2I"eӖ/ \&VnK `4KfZ@#Y߆oQQA_,RޡNLH' iȇ h[5#conmӎmc?tE?Hr/I%{wZ瓲_[zDItO\"zt9w -/nRjsw8:o4NVJK7_к?'i)·ufbN>Ea A+/A+oT:Lm?zmj >/LоBGI|y<"_c4^>@Ga׏uz}`S5\)ż,߁f;CܶF1z|tՂ.bZQZ>BXϱp~úRQ+s8=cpA:z/:]/ӁM#sX+9 h%9GlLblҖ2 KzGN3sJ Zk;^ˤtJk,ewyC!Z9+h-:mlױ&lx+Ti2uRO[Ns7uArۍ).ayZT_/1]МWOCvojEb @]eܫ<]mI}q_QL5byL HM^ɬ#H`)mo/xxQZކ4&"hy?[Ӄo@upXSJm=q]8yZdc=Rh|;Led880@4l4[ t#k9/Ӂnp~_ͻ4djZ$m&Җ2No'|$Ӄ!&)/ٕVfGӊ:/Y4ŁH%ںNN:5{N K`93/'߶(cxY$hCzMs7O1qŽдM.o}AQI9"i4y4x[R_e}3t>cCЦ ߞɷ[-d"hˏNA+/Ϗ}_ sNM/xyK{e-(3K:dSUlPF>/יU)Oދt` UU԰jO=_@|ן~|H ^>^g>wYI U\8u7<уR3~FZ$çɼu|R@q Î﫧GY0|$MwwY}g!>`L1s|grrX+9.hٜ.'4:uڲ|!Foe 㯥u ?,pCǼ m!adkʔPI#2nL%yvZsD/$ضqW᷐xVڷL `9PH~X9tc\vc~+i#͍h!7f'{9*h^mI}qqUsvyf}}a¿/ףA88LbT_9JAdoOi{{̼Ol#e/b/rn|?sSj ^Ҟ|y>7xYn ~It^b9Ϟp"]1?փ̪;iڡå2yj }Ԏ~^270{OM5ewZ *"#y(;7.$OAGtd^:њwh !aǺE"hץgtRj^W :Hck,!8Da%-:iaIB%])V=5wY$2#hXiNWiq`SwFa(G>'q[q6C@;⯧+h}QmwkJE}ID;۩Z>>>eZky ]%AE)!=G3Vsi9i&s4tBrMj؟n4% ^z˞[m/\o>N휖 njZ0>ns]bօ%࢛㒗iB5XSҽZN7xy~?Dlcm}NM/xyޞ|y>7xYn : Z >'?z["):ø/0z֛C?+\'O ~GZ^:?Sl8Y>R;uiA{&6볐w7l hwa+ȶx<{&4~N;?p<ߓܪ8> a͹%hzLB~&!hEGqz`0/^R8;>r!Z O̝齥X54͟"imm4-\^ʩ+S3Xo Z>Q]5AZ ¶MJڊ Z8WA+~Xge Ci1ֺoJa kE=g;h38_689ӯ|_y[R_es~j4>#)O@\&7_N\4L]H[߳Ak}X늏#„oOi{{̬= G$hc7}37hbۿEZN7xy<#Kvn5_uJmz[۔KJu[%h?_4'}J ^^o˯U$`?Z+g) 7#?/xx:#_k금T+qn Z4X)6w*h=k';+Msu&0j{q`?SbAf!#c;ejw`^?ۉ=x+?Y{8V9m6Z+nTXߖϘ:^ChBcۂY`ۃ []:vi[>}_sodXzyNnfMuA1Vʿ}+ 6ے/:y6ʦw;˫$ ڡNHƽ%-x&ЗmTyռUa3h_nl"QQ|{J ^>^gب4MKc~k Qqx_ h:r."}c=dyJKjmaq /4|4Gi(RFtFӒEꂶt4'*aWu7w0MOAF`GkZ5WVڶ׶(wmĝ<*i Z4L._S/&%ZCK/3F*K &^A/[1*Ÿʚ0m=x6C7#G/Z]@ 8YE3Ǵ/2B{M8򶤾Ӿi_BnѤT]a^ZL %lDRy {=tGJB|{J ^>^g؂6ϜF܌מ_qߧp\s9m@u˫HuGq)#yR^M'R}nR| tv'ڹ"w>/Lj$=Ïl$eN">"R3Uo&֯5/mH㎒!7kpmudQunF/U/-/nF{cݻ\ꩧ5zGq`Kj+ZU/[FX81_Dg4u}CL8_mh[>%5S*?j0k0Aa®-]wpMt/מf6E|Πbk/Sc^CP?n6SZ^ Zm}"x_rUvb///s;L oAǷKlNM/xy^|y>7xYn pnP OQK5$z ,hK,#]!>C7})/mSd^~/gZz`K#tec)ZPIwa?Q6~iAy`=0ne$OE!| Z=ݿV:JA.4Nt׺ >"AkY/wÃi"]VԴ+=D~@D-h5\򶤾Z4]%|S#I^_u=$%mg|=(h-_#5myTs3E`A4+X7xYn !h5he㭥CRu#.>/יU+دJ ҙ H- W7顶e$,d3T/_?󂗏ucm²~Ldo\KݦK?&ag`]u O_lHIhAG.+cs-QTU\·u+hc}n8M4MPZou V ^ެW;הuqF~X>V<.yR^:e _^ ^)HV\jq; Mۨz>/י4"OK66y9g<{)Ј}ǩiyqcxb5ۈw]Q֩8@EԃS+?4Tѝ5vIkJ%MwvNSC7ը(i0z&"gu8MoyJX_2M@*6NYv h0HEfޖ7xYnдS^Rz[%ӂ/NM7xYn;|y>/xy{Ə3G!#˥tU/:Sj ^>^gsoWip )/xyΔ 7SbOq%z֟|N??J\.[֣N2,;@nYVR5YjۣpuNZvc"ilwj}$ZW/L8g_)ݫ6aszmf}Il9`_V}hq\t(h5v7H-TGljM)h"Vk=Yp09wE hӏQA =//՟+)/ heS)/6ujD4SZ^zZuȫ$sNb|Nr|H ^>^߻mQݙE(QDxo=P>]>c}=n5cT|y om8 VsfA8e\Ъ$I?,+o'N&t?WLq 5׼AA @ЂoOi{{K }J ZgxYn;|y>/xyTuJmzKKJu }J ^^3=A1re^WO3+Tgfᇕs5GZ^:N4Z~j#AG[yN({jZ&f}`ď F=up iLOV= Nihިb 8s-;Er'xyK[Q?Re_Ǿ(GMIjTn,Zh\@? -`A =//՟+)/ heS)//o///+՝+)/xy_?󂗗on!/;򵦝K4oh/U'r:hٔ.e[v~s?lLt# P)wظ`KAGeHdޣ) u8Fr:Mc=@ ;S^Rz^V_^ ^^?xR^RvR}nRݹzo#?/xy_#_k x/xyTuJmzKKJu }J ^^׏|}Hˎ|)Sze'FmB[Ix 3MB:V[o[fyv ,hoӗ\$cR# SAIm-h5<:R8яA @ЂoOi{{K }J ZgxYn;|y>/xyTuJmzKKJu }J ^^׏|}Hˎ|MsWthw1 27hfc4o:{Kxʿ?AFw.4n;R]4P֕&*h5ܧ:hE8GЏA @ЂoOi{{K }J ZgxYn;|y>/xyTuJmzKKJu }J ^^׏|}Hˎ|Nm4u/Z|?=B^G4e{F Z#[iTiJ?.FްuK,FSCsʤr~Zd'|{J ^^?WSZ^@:E ^^z/􂗗×sփTsiyK77֗Zv$z}KS6TT\F >@^4dr8A}jTGm8=ns:єTFoMAZ7]c=@mH}qCB'בփR=a TOHm!>/xyISj ^^_^ ^V;WSZ^R~//CZ_vk TҎ4uӳu QizX){WH-+ i!ԽkWjg#WoiiNfG;wfq) }?>R}0QM]jOuЙFOE\7Mc=@ R= -/zDj Hy!&R^HE \GZ^Pk#?/xy_#_krX+-~TO#/a@j3&R^HE \GZ^Pk#?/xy_#_krX+yR^HE \GZ^Hiy!Hˎ| c=@@SAg@FZ^H8#_krX+-T֟R= ך\A? -`A G V hZ>& WЏA @5~Z| c=@ }kM@a0#_krX+-HZ+zX h@ך\A? -`A G V hZ>& WЏA @5~Z| c=@ }kM@a0#_krX+-HZ+zX h@ך\A? -`Oжl2R>A 4-ަDj3 lBsHmz!>/zҺT_SDzo?GZ_vkM@a0م]"[HmԖR=a"T/R}~ M/z"TOs@Z~kHﭱHˎ| c=@ kPz"{ 0BǙ6E5Hm:!T ;{>t,/E266TR=nFx=ݿ }eQT]ͫd`_E! H5EXHqeGLGo ^rVoyy/:Pݨ14jzZ2nX+ApAcdކ?:6Rf[tMxz)qQN+~5 jy-MڮAןMj7Z[z=mZzi41qjkm}R_7//9TXJu qSj ^.(R}~uphbݯѭG7JP{W:6uK- I7o%s\{bM.-.ᥥ,wȣ藱ry^u^N6.ƂP+TW[Zk:/9S~=?ׇך:iEޝDم~Z֋ckJAB$^_ Z(hĮaA+k//^QX8fQ5W*lP=n֧0zKyK IULy;t@+O\:v)UZ~vxߥX~ `MIM Zo>*1ЏA @z.BZgx}6 hEG-欠mAΚRCݻ ڃ,:6yNc K7oqIX\tvb9m~v>/yg}]Wi]co#}[c+&՞( =ۆMuJX+MS6-vkPx}R{)AHϧ_z0DrU~VLoaf|T {)/oiTT?Tmv#qq٧}9viҨeu^u^).ƂK륳ůݗoym D*h郢sI5V hZ/ h3nv Oj/e hI߼Yo :#& S&䪠audt.j-xR^6eR}^CgR(.Uݸ zRT{g>}n#'Htsu^u^).ƂKk.}JD'hPFzmm uQ:}Sig1K=euڏ9eRD~Z ÷]K\ݷ1:4hOWtwCvTZnΊ䤠} _rn}&~n)/s///شԠ4qaSOFv_ ZO(Lȸ4) 7/oT_YJ&&v 7!\UB:6Kyzsݣ_ڷPZ6AL/Ak遾 ={օ_x=?V~ON/RWk,-^ۗCb9}wڷY=Y%,M"uyzڹSix[{ - _cQWbwjnPMtqZ3F J||nNG}~>6/\;jQ8 h#mA8HzIeX+Av~/e/lKHx7zv^KJ0$%%A9cmX"KL-^_ _rvڴ}־OnubC"|mKڻ]Z`2GK/&4nyy%tqZK.h' FzyN ;uJmz' _^ ^*cQ3Bֹmըf߫. hIW he{]MEokC3FhڻY12 maߦ답!h݂fBU+CٺEqkm?Xi=O mxM#JA[:p>ӽ4k6^{۴낖;Цy-Sj ^>dR}^RVRc&rcSAу(Ι\mlJ/5>_J]$/ћO~z 4:q΋/"ωg7عNk_4=:ԯ5/k魃1}<]};]hc'6mF, wRRXꩮ|a-lyGw.8>;cSítsn_ynݍ-A sh@ŐhX̣a0HS*^y&ͿoCx?ݦI@^ښeT2sυ'hm(7G4Tѝ5O>la ړ_T;mÌA跫L֞_ ).WH5(X)*x\f;F v2/¨mQy=G[뼍Hmæ\9ѝOjN m'ӗ,+T=9w^Ԧ|r"hڕ>OmeħEg3 ^E*t[OX lz+ FQu|r>[c:U_7[e? Yũ[t]RY mz'ho&ay@? -`Jކ?:{KbԐDm뚼\t?x^2,gu^ $hTK5qHyi|I5(XnV]Z"aՈOZ'S$ ڧhz;u%= ._okD+hp+%%nH߼& ~u;9\?C(Dd|eLKgڳ9F~Nwo^_Ro7ikQ>MS).܅F ۴\ZmS:F˷jAEuhD/h+ak({-~6%0ŁtNbyLq O]K4:ZT4J/}9W-h^ϧķh}Ƴ; ZH>C_/{ 5_z_ݯ A 's9\X~ح) g}twF@ *A{n3} եA<G? -`}>(A;`%ay2~Z ?9,y̓\|hz7kI~?xR$}F&>9Z#>$:A{ܰF2IxgK`!mנbmZ#}&h9S(~kJNnyy^H Z>R=vQxR^m&×󂗗SzMmAkYi=* z,糤9z?Cۛ,hEӴAn<2|J|95_z_]?J 6]BiR{A\tiaA+/I hhLr]&ނ}^s2ʋ[_"!h!hMu)Y1RKzXy".h/pЦ.nPENM/x6R}^RV| Zs-y߫. ,h|34 N+gY׶}[.c'iݛ^ezS_{k,xBNf hM hAaA+/I hhLh_&w M׾l)2yZn) :gK*hDMBoik#)?l,$P4#8ukJ䧅+7/o;|Zc ~n)/s////o3T>1{-g7_Lwz{nO^J>OZۄ+/R;沼n5_z_]?7Mit}{b!hS'Q Z|?~Z$hne#Ie:'hФZѰea -mECl|H.~?6qk e&@F~gסh4A˟ݠ?OO߼$r^ZGԻ??A*yR^6eR}^RV| Sy;!9ՇkSٴ2֎ ƹn6_UZ~!h-{<=}XZ%Bnyy~ @)%.9P~NM/xyK~ᷩ;S-ycv`jRD-16|vUZ~^^z\V'齶/Q~Ivw1ϱo夠mOWO(&ߏޡtwk#Y}}ުDCVm'3^_X$5mz*h̢R]?^zX,) 87eac Zsi?fH < DrWrƿJ` >Z-|w뗠di_tE{KV-t0T;1h$ݼeD_ ikEZ/|y?E%S$ i|ko'iQGszRI5o|_}~][nyy~ Aj烫 AgmEt)jZG:6yN4B\[u^se9n~.* z}>i3w %^HoIiT%6,--n?(,}$8}/pL[iO^4ytu-e?arcg;]P@ЦGvr]~ X+Y.hӖmiwS{}a+j?N[M_.IPqG@!6ZD-QI_]f+~-T elϚD}zvzm:Qhʆ *d[0K[aޝ4e (}PeML4^ضuCĺJحD=N7:;i0:@w׻{եmŴ/ ​7){L/c®"HFjA$I{xi1rϫ%8ye}+Y@]5QI5[7MڮAp3Y*= SK歾 A}镗i8q5]_0 ~FI?(hqѕnyy~ BjՎc UM[\zztΰ>/^ި2—7sƙsW^bTYZNWi]d5L:?zn|#ϳ15Ptͧz1>:k\*n;i_ wFH#ƮXOu'IZ{T h#uz҈ʖZIw89m$QyZx$іz>(YoC/B. ,$?؄d ԉ Q}i蠽qӚyAAn4zzيr]%qyږK.AkDvyY]k ൗ +#=܉ G>5/a!rzߠ'7TQ|-ly)O/U NXt G 旪N&_v'.P]Ҧ$ibnpbm Zy[\l?ym6>t 'iMi" b֥P#ʜl޸6 {|y>?:x݇fl@эR:7,7ꅠhAJR=?8hvKr-}F "h`~ЂF M˹s]߅OZht\74߽kgC+X~}ڱZiC-];@ձw5}Vo>/ɮ~rcʛT܍}ov=A #=44VTЖѤަ`mX;Z$m*>\^O(GҰۖz]N 6MhBv[FKډdvs`fyE3X,JwOaD!ߩʟ#־ht':A=}bMx㋓!F;vmޥ!ӊ?k9rU6-d)صzBlG&k,YckI9'Akٮ#giѨE@ }$iW^oXE]&bvr {5FĿB :{/jN}( .hڗ3uʣ_z+BBڮA6Vyjez˳4QȓE"j4}o+ϗilAk}<ЌmAo}=SPts-qxR^FF <d2:-Hs^u^O AgiɉV/PE\GNNP<_FzoW?VqhFݻ婜GwӯCR/4ܥe4&Ǿ>L֤h&7w3G^SޔIHeX+Y)hw-i|y0j#mF9n/gv4dƹ%Vs׊48љ|^xբ<-ݵ8lkc}]3}P$V v|'bڗChͻ־؉}r?3W6񅽞j*//ނ6QW)^}?% 8MYK} ]?N7w + ݤ^_ ?6ƓG es+/SZЬ^{>M_w}OI߼T*:6UЦSj ^^_^ ^^?UZ~1=EkވMU.uoiaɝ纖Z_TK>miHﭱWyN({oP=3%>WT8q#Q}u]λJ^?&G7Lmz/h+i,Ҡ/D?J Z.~9G﷥]QQimoWhԹk'j~2/da?!m6&)60vQ,he˔RFE)En dg#tYjrQsbT h |ݱ˶S:a2.T]䬥޼i$l_!?((ZT-ކ?:6@v·]fx!hӃ)/'k//^F*:6s ^u^N6.ƂKwsi}ّ5m%Vl6Qa%푯h@K~8'$~Lf G ;$ʾCw謘-,{W;_HJ/~j"p %9$QGYVRX9;1,Y-h|vkPx}R{ ;mz:6zH^ԦTTT.߫.fxߥX~Inn!/;fAQr6mT Zc=d2:'7gˤ@O9H?_\H'7stN+jc J+jXPeCŢ94x;ԩS_ y}ucn OR}F4>|I5(>l6=xRNrRvR}~uHmSj ^^_^ ^^?UZ~Hd3{k,x~77֗Z3_]~iல@zGN?VzV,cqi-I]-nfPD6VZ]0/IJVч<^Mr;EH`@恠nv Oj/}M^ԦTTxR􂗗×󂗗%{օ_x=R;  / >eG m?[@va%i.q -8Ѩy[iEɤ͓ϓ[%ںNN:ɪߤO˱V!Ղu*>-,LgY6mA{d+ 3$hEi)vri>+>Z = +@4>|I5(>l6=xRNrRvR}~uHmSj ^^_^ ^^?UZ~Hd3{k,x~77֗Z3TжD~FV|@D~AK^ [7?؍:OJ4Z4B@AۍlqVM7O6=g1^[0Zi1͔$^H*NM?EECŴݼ`p-yix}mYS_j>2譴d1LyJ5@4>|I5(>l6=xRNrRvR}~uHmSj ^^_^ ^^?UZ~Hd3{k,x~77֗Z+zX>A%j?9JΟiJ?}lmWL+M_{}QmR~#}w-iHwx|mqe{i9vΣWwH-6Y`[Nn˱i fgej? ]~ mKv6i@#A ݤ^^6ANM'x9^;|y>?:6R)//o////՟K* zvw5_R|}Hˎ| c=dMۗ~lTY|(q!q<4i"hޅpӚ}mVQL#ӘM|-ϡU2MS4m'S(ݵF[^KW[(FЖF#z9jZ-Lq- 6a_qC:_V&`NwlbBIu4l4Wj6~7$ =FWӪ+enFm_VF{m\vu(;uv;WiAɕžjjFd?jjXOy o[g SDkyv-h_H+~;"a.q$~8RvHw?7H THqTHy΅[uDVHbHˊ<tTگrڸ^0egO34^޶Yq`N>@ZTӂw !ʪm;7F]ٴ״t\5t+7?hƉsO[Y_{ᬙ>ؓ3v.?M_:rˑ8i܌rZSoC" HfA  %p+E*! X,a Djy3`u(`9+G~d(\8kFnYH-~DB.,G QrN:# W;b"6 3~۪# | hAAQu?ݼy}9 + XQ:q>$X Xs#KXgH-圑%$YGJ5|@ ]X'/F㨢EAA  6ŋwgH5H-圳GYpuIEgdk V QDY*D9,\iFܠߞm!hA$@"  ܹsշ)p8@^9gdˑ%UՎf$Qr@n#c%Qrd k XI{dM3t"6dw4ڷUEAA  6MMMtYu;2IEs#KX?2VN5#IV,` $?"V!JV#KX(_9'7՞)Eqm!hA$@"  cx8@^9gdˑ%SXYH-~d$X]#W,a D9i,\(]eL"֣M- d:  H-圳GYtJ{F`u%Kdˑ%BՎfjύDZ= hA$EAA|'IО/b58,`9UtJ8#KXIŏkDʑ%(`9'푅7IĦp$b +A  -  ;\~wluBs#KXN)c@n#bdu,`9UsYqӌ \A*;A&s5 - d6  x58,`9UtJ8#KXIŏ[dʑ%(`9'푅7͈M)cujI*$jGL|ZAl hAAߑ(`9+GسH-58# XIŏUH-V!WIgdjM3pL"V,c\Ҹ[ZA` hAA߱ Z"V! X,aXY3`u(`9gd k IV`u,_95,=pQc)e.\0X$\"b1+A  -  ;I\"V=kF^YH-~DBn,G QrN:#KW;n=7 - d0  Xm(2IJM4+=.I1JJ6㲄UEvDl*?GU\])m{AZ*`Q7Ṝ=*`V~G 7Ѧ#KWOV;V XxP6 JJU 7e k Xe{lD.  @"  c# W'ΚkjNӫ scLϯ"V`i3rOӺÅ}l$nB%hMK(N%hcI%2&b9>엛fęZ`UP { Unj%#VkG̒oURqڿЄRS}2՗dmA,gv6!cxoz2ӄ:Cr-:R Z$gcUv,gİ\ǏUՎ LU۪K}?hˆ.h[ˆ.0" } h $`aDj0" ږ"ݞ1 ڳe(`9ge,'&Z~Vidx5F%Z䶺>Kt hA[߃a'~Jg&8 Ip5lN]BNj"'A˗)JN^vT=mӗ'X;H)u͞[|MU'=?=z]ZMYyձ7ͣ1cki._7J6Uu{jX8d~oO:,|ޞt< u@A@ai-h {0CXL6"A;zqӮteIqmTUA[oWGn6T}DIIXfjt͞"g:O<[CZqY#v6V9ZҟWH [r(*]7xC/Riy J`"V! W;-Z!u#=x@Fx{pqZA A:Hx[-0ۓa# e VckuKf](|OTUZܖZvq|flel]m'-b WeBT 4cIҥ'o1ĬNʪXկ%==u+RU)60eElLJ@ЂLCI0ۓ@"H , Aۂmޞt< u+EJ-50WZyCUi ]M['1=4cHzvz1.4(` հ*.Sq.uSU]/]D%)WhEX,hwqxR.mv\_Ѽ 62'-ƱKҕpuBQ\X; hA!wI_} h $| mAЂoO::,h%,`95aO]ɒx;U?CWҀs'KK?CٺMxllkk=m3ltXJ-w'-?,}_дw21s4e"V"*`72i#U m/hYxrOVDIU+ _A2"֣[ fAЂCI0ۓ@"H , Aۂmޞt< u+U@e4KT}+X7:Wɕ.ք.]\E8 _q:.]Wqmx8.ם4CYvNJU4^G\Ц\*x^Z'8t^3i[(Q%A+ W'd ŏU"Z)u#=x@Fx{pqZA A:Hx[-0ۓa ZYrd k X%,4xj -cqtm\MJObm&"B;hǮ{k> 8Ĭ(h :^ KUbVNQn&e\*߸+*Ver7-CU]eY-T퓘>!\9}Պ `fQ 5OGyd~oO:,|ޞt< u@A@ai-h {0CX騂vsu&btHTk/n/ӢWB{KZ" EfNr%n)Jk+t%m5dEzWS4j1};VBa{.ht\\ f SUݡKY|ĥ!+-m ]ŪF[AkZ@W~Fs֐+_,a IE{ SFx{`;>>Kt hA[߃a'~JiؓH՞xd7ҚNǺxN.{zV^Y|~=#4嵴v1ĐƆ"<;*b9V+^*l3sztu<|.ƾT$ccK$h5M^^/EEkAGbV)Ǻ]TIIY^+jj7OO@D/UIm7jQA\AEX+A 2a'~oO:: A H ჰ4H o =Fx{p!thA{ҏU4#W;MֈLoNb6<ޕL@"֑ÇheD'L~,c%$ASEop9Nv_tsOH6{LfBzI~bmMb4Os(A+-O"$Aߋ=eFfN@ЂLCI0ۓ@"H , Aۂmޞt< u+YUA:,c\g\mGsf@N]Mw5ҝM%>M__ v.iCh4O۷nݩzazZf ;AV9$T\Gbך4̂XvCڂ?N[*^D=|\v&]p$b5L*Dj,a |XIe8eFA!X^Ǜ6'seUmh7Xnt8]I˞( W`#{eَ|+LReW˴{p=gw&8a'~oO:: A H ჰ4H o =Fx{tTծ1OЗC;?E;^~v,,J]nݻWh;IqmGn+_r#tqՉfj7n/"c8# X]a 2VN\p&]#cE,aDBnEƞ2#W \Ѕ\8nfٓl++G=rn';>ʷ|yЖ;0 cO/J__/f}i?D?gt*s0ۓ ?a'~E$AXA  #=x:178qxЇC%ن~EӍ.N/AWg?/9JJ S*d k XՎf7{_2֋U\GΤ+bpCvDBX(\%/+ V"b̈#HW;%Ap"Vq̌(` d kO1# X.]%t+X2V8ؔ"Vc{gѶ2zdzY<⏴~^Y>g[9NI0ۓ@"H , Aۂmޞt< }1qtcQ9~~ҫ~Is~ANKz?B_ҒYqj>m}Ըv,TD{$Y@Չfj7n/"c8# X]a 2VN\p&]#cE,aDBnEƞ2#W \ЅfW3# X,aDQՎ]f Y*2]ʹuI58 F=~ U3U}}~U3X}+I٬>g5- ~oO:: A H ჰ4H o =Fx{t*h%Z~A/K{[ˤbYi֟~F%O?ig=F#QeK譭ӧ{ސ[dˑ%(` N:# W;ndug|X/"VqQr.;U]a Y&bpCd$XݲߋU2# X ]ZX135%?{Č(`9t,bXYHGĪOlVWB5P߲~&F>+g~T٪>cݠ}^C΢d ~oO:: A H ჰ4H o =Fx{t I]V*u>Xjg۰Ė;U䒞F+=s}ٜuYNzhc&~y#hTh'8rQ IzA5,=puAM*K*+35Ѕ& cEg ?2VNVK*$^d)3|]a~e13VO*.]e&}%"U;ߤJZ 4o z)ISyO}B8ClE?+g\վj-gUJʪu15hA&;>>Kt hA[߃a'OGB}3P_O)U;U3V}&lLb6l9s0ۓ ?a'~E$AXA  #=x::6&nwj_IUݣ|ڵ۟16/zڜ_F֫wyӟ'*z*,Bo~Gc/~O4i߇SWnkK$ XYsY:qӌ \&b%bLƊsQUxpu3X+ W'd %bdu~/2Qrj.\0X2Qrd 'bG̈@v2UVBf]h7[^[LLsG ž?$٤>gR]3L}~hm3N}֩ϼzO}K}6H2V}RI*s0ۓ ?a'~E$AXA  #=x:+K!mC+>UT@+jw݇ؓՎf7{_2X Yr# Xeg Qڡ W;L"V!KXDBv[{SfDk W'%Ap"Vq̌(` d kO1# X.]%t+X2Vis*vF*v_iҟX/9NI0ۓ@"H , Aۂmޞt<6&n3]m;9Bis]M)ceM3pÛU\ǗU0$^\qFp$bd(\`#cE,aDAza{ʌ(`9pCvE_{̌(`9U# Dѥ̤/bU|,` "ֻ.*vը047xDb8a'~oO:: A H ჰ4H o =Fx{SC]m//~ܹsi4b!-^Vo?-oEk*ndug|X&b5d˹b(`9IW*DjgX?"V! W;d kKJ-X)35_ 88fF5'c,GEW+KXIrXU[ҦڕؿǪbQ> #=x@Fx{pqZA A:Hx[-0ۓ$KۘMW'򗿤kҊ+*++͛GsјKU5dkwi/gG/%cXu{|X|\qFp$bd(\`#cE,aD,bcՎcfDˑ%ŸUI W.]e&}%"U;w_{U~ 8a'~oO:: A H ჰ4H o =Fx{o/uSm~o~}޵>3h˖-oP]]^-[F/ ն j*Z&zOg}LjsQr.;UՎ ~DBv[{SfDk W'%Ap"Vq̌(` d kO1# X.]%t+X2V*RmjZZ+v *6d'wI_} h $| mAЂoO:diO~._LϟSNw}G={_|A}yfzmgϙK jhm`er-c}X|\qFp$bd(\`#cE,am&bSfDp,bcfDˑ%ŸUI W.]e&}%"U_~>|ڼa+˖RקBUl8a'~oO:: A H ჰ4H o =Fx{L/?޽{ty&]z.\@gϞǏÇi>mW艅4t1->LjsQr.;UՎ ~DBv m[{SfDk W'%Ap"Vq̌(` d kO1# X.]%t+X2V*m;ІޤUkh_Z[Z5u_-*VGps0ۓ ?a'~E$AXA  #=x@8(ƯOpu=~DUEG+ V/"cO,Gv+c,G "Vq$(_9tcEB Ir"ֻݱm'Z)̧9¬Ҹct I?ϣ7]MMM_(_*(k|Uc4p!wI_} h $| mAЂoO::>|?ET?U$պjD˸۸j?'MESN+I>CtG*Dj,a  Ie8eFpukY'b̈@d3UB*ce k Xb?jx6.SUi߇Ӵ/c[5樱GA3O4G~_]+X1]A8Fx{`;>>Kt hA[߃ .}ʕ+ƵƚJ*inlm&mU[a4{h+h۩qqY*X+ W;dk`e$Xߋ=eFAڡ W;"֯=fFY*Xő|Վ]f Y*$1X2VUžSb+ZUOSƈ0Ukcm,QctmlE5樱6im/c~荻?Db Q!4fzeΝ1 \uϷJ1oO:: A H ჰ4H oK LKZ`eс_v$pm'?hZnOxa<(/A>- XN`"V!JW;d kUH-X)35_ 88@YG̈KW ]"֫%$`9~Dl*vhUlU Mzb#?%jLQccX=j RcMv؊ q| Su>V}4qZA D%ӒDj|xtA= ZdiV?ն[>Ͽ|XQ! X(c%^d)3]a~e13VO*$+Gv2UV!WYz_|b7P}QUBUj QcSآ5֨1G51ImܸK-On&AA~s?*: A H p@Ђ$H킶%HmgC 6Uɦ*]vz|Oo~zǢEu#j/~AoϿ˿Do,zgvů~Խg1&RNKWA[Y Ie8eFpukY'b#KX2Qrt* XYz5,ǏUU[|-^I^I#͢_~껪۪b5&AjPc1~U >HcAmKFvAۂ- D 5hFvAVÂ!X qOG%Z/R~O#>C/>c>ꃪ/>꣪>kXާAL hAA .jhմ7iӖm_ю cO,Gv+c,G "Vq$(`9tc"VAJc ',bw|b?M*vU-YXAyA  I 2mնh]mPն5ҧJeJ*%Ap"Vq,(_95'c.\,bSX"V! X{D!c?hU믾]JQ  t hAAv.0mg͚M TU7hSÇ]sQYڡ W;"֯=fFY* ]ڱˌk c%1XM;?Coūb/kP  )  HL vT]]M .Dm|ZV ol>|2Q:q,(_95O]"6 bL2wMﱵbt^)bAqZAAC )ZMӧm?czE,Z.[Iֽ=pNrd13VUCx|EI&*vǴY5ZZ,V,bAZAAS+C:U^x1vUV-Uv[kd8@Y'cuj.`eBz Ir܋X &b ֪ŨEA$#EAA:}2 qkqF`նJUTTҥ+W7Ӷm;˝ߒ,bU'btc"VAJc ',bw|}֊UUh^bA #  #.Ÿ5m2Rm;o^)UUЪJ5;oD}AJՉ#fDk W;t+2փUH^j0kO>>Xu-XuԵRL];T" F hAA 41j[iEBZm׮MҶ>/wХ3Վ]f\X+WY*d bUU*v[Ѫإ5˩ZZk*V]cT" t hAAEl6նjmj۵ǻIpCM!c=X$`9EUUjX^׊u[*V]C^1bA :  f3&ê]mҺͷiї(c9AJc +/TU֏UkUUVlUYbEA$EAA%WJUӪڵ-ۨ]Ѫb?~hUb٪׊EU,  !  B31í]NukaVquUltحћZKP  #ZAAip9ȥmmUEjբjZY6&>5n)Xkk#cZEAIAAAYH4<êUKkѺկ7жw>e bUo_+6Z[VXAA@"  H \fX&v躰4|iW7r1U  A   8\PգaT* @U,  @"  H' \QmfZreQ  ~ hAA FUj:ն;w(*AA$@"  #.Im]F.]~!P  ^ hAAI F+UVXAAEAAu|   AAAAAA     FEAAAAi@"    Q hAAAAA(     m@/:   fVn: <y0zP|b @:HL@A`5 3Z'4tT hX<y0zP|b @:HL@A`5 3Z'4tT hX<y0zP|b @:HL@A`5 3Z'4ϴ2{d7- "=Oヤ{0]HE3Z ol*(o"gܡTXXIU5 >h{ 'ݭ; ^(}HRa.}=@ > y@$+&MzQYxz6+"۞e HnMT]T@k{fY*Q A 2׃ -kAgZ RA{usKyrJ E6l]NŃyA{KNZT hXS{%UMu\!;Yrݵ|v}=@ > y@K8j筡\7\V,a}(MrX wf>e qU}[ 0*ZZ'4ϴO*d@ԗLFW shZ39W|΀I퓘; W.vZZ'4ϴ_nSG,ηnpN8e/oϊGm[uk~]A^1zP|b @:HL+A /O! 4D^ALJ9eӰlx@}=@ > yVrm୊Wc~1 ʥybˊZ@}=@ > ya Hͱl?lOyŴز'*s5aoTf{6 G/TҢE+F_*OHiişm\HWΠZRqFdT9.iroyv7/-"sdPb9{- MZZ'^j "3xhuhF Mz.^vȗ6XI6;` j)1hEkB}=cA;-n2A|`3` ȷ940_Gҳie[O"M@DEgZ~y$IrgS_Ц!uV<IEs7w -׃ Z1෤A&.Hc ee+i{G5ġW7YK)(ɥ3B[$ggxy4 􈞛 >2+2;t$[(kY |bib:&|-4iii%8A>Cҩt9M'=7XH۵4ڊjB!ZPVa-׃ -mv@ІAQ 5sh~OAW=H=HL+ =RNヤ;t"M̟G ܬ{V%e 0i}:l*hK!d|@}=@B&Akm$ 4H? +tL[y[A=sFEzH ]ÿY/!-)m^KA4TxN hWT:(1ucӀ5BUV`_F,5;B1(;FzRAh%YhKI 4(ǟ?guesi/׷/^4;" ǎW#C9)5^ucXsG8Lôm.:@=Wik,Dfϊ>Yƀ{țE ŶjOnݳi@D*r{>Sn}$]?l:?h9G1?kjr_%YI|0BЂO"M@DEgZI|=S,YV0Dا~7+b<*ʛ] g2Uv)XPBLO] Z`׃JN\ 94:31/ybLЎ/Osc&dc)UMrڀ*-EUMI}iT%Hq&hSHZ} /¤EhKuUppe b[YSߏf>FOS\lA ڴQ .h_s|F;>4iiiN f0AjfLk +PAO2w؞ⶑasie[g-N h);*={4sJZp-VL&7EdcgEX+nʘTP hFyT0$"Fp4,ϛKmB/5Y֓)Sǵfe"uNˋ=Wk̫i +VK7C鯷fqќM%^ fŞ]f7Gr<USq^Lma/§,?Esֲk^_ZLϱyj;=9&7*%jdoQcS8FlM~%6$>hs#.hk5J(,\G~yK@['^&c""3Irp =+RaMdMw"V{kI%bћBЂ00zPVuzjKk,6pf=\R-:&.Ԓh&Ia~c~ c lҢOsgPq%h27yaE 3*-}d /*Jyى4̐aTM5h_mޓ+|BS۰}؜HBE8'*6smރUshqMu@kH{Йx}|"<6?pUqKҍɅry7=qtCНש5ڒ.ѽkX`98=PjX Dw&QsfѕçǦfz{*=lM?^Es@B9fZo~Ig;| -߯Q[y;)ɥ־4Vy;L׭ߩ5֫p2QA ASZRINBв#2d@QO%CtaюTE_6@U$:6rbT+*ؒE4yP-Yc8< a*yc4Ђ 8Iy3͏'X4Z΋gX%YksD=rK&?dKg@z_y#X6s7+W-kH{9ػގi)% he h3D^ݸiH ڼ!t̝ zn~F~~{z[ѕm?BЕJ7< 8hH~-Ӂu4s4ϴb'3)hj{-^éH*2@KNPū &-IyG1fݵv}=t A븘,hڣKe7?H1P$"W8/@%C} A+U73(y}̏KO~&mb-[0m.M-=Eu|d>4gv@@f"v E=C?n++QHyp%3璥tNB]ā+&ٜj8whZtkzqI>~bv-Eu-}~>5|-;519Cm/m`ınEIKDѨVio 8>gL+|J@кFEgZI|aAX}7$H\-~$ݵH<}=@:Z2Yc+~XKp')4:wJ1A^ra]Uڟ_'A߯HTۿNפ)h:G3'^&sA۱ U\FC׮뻥[t"gvWci;oHx+~+hMKA$G침o ޷M!aN?BкFEgZI|Uz9:z 7Z@yI&gvaAk5˹ 4㴝 ʡ4XǶCZu8.h='^&sA۱9tuO^ L%@A1+c|pj}5m+^_=i ZA9qO-;r>Ow/%Wq'˿Ķ{u6쾲YWxokDŔDNi]㩵Ik41tC"wb+}|ݺx)qX[KձGl_9c^;VX*G|5zpbMәz:9N"q8y_}/m ?T@98 A˗6Pg/ao ]>~oߦkx6PJ}>w/ЕےԟcI))0Dd}K[Auj>>ϭMDH(:ϩ;nΟޗ%ӘB>>L6{nV-(hnǫ,PրT4lj6ftGCϥjbXZ~ UT hi\}ilc Or6hrU 7.s#= NV>SZDe jXQq'A,Nq37K%.i\ԧw_ʝ$i ڠ- W=pA.ZnEV!=qs%wq鋴YR%'s:I5-":WЪu=]MgZ&RZ!Mv }n6[A7.ՓRZ+2*p}" T0Ρ7?dJp&PWQ%m~>j^/m|WWkvOҫuO}GWב<5ݷ?*]J՟^[$8>y SZf:> p9~7K1wCl?G0eæthIScq~;>cSkp[ώ h{n΃׃ ц(PqQM#%m}i1=g,C3MՓ ڄf[A[_YaY=Z ;=*ɑc3$o7YJ+f,F ۰kY[IyYh3*49'qT8P[~xt+p0jbc|m9NwbҺn# LКDEݷT*.Lwsū5kZ܎WI2Tu&EV NtuB{,h2O ]3)úҹSt^3vTȄtmoIS^titf>ݬF:*?HUK}5O.:) "3cOߟ0LM cI>|K2S#1Z ":ybb6*6y]B짤nZG[y&` Zj3VhEMB䫱댥ϫy#]#dkcx\MKh<8c]NEƏ51$mv~1 2_kXE\13 un˪i ]s}\jjt? fZc$iro}^ch~nWnL[8fΎ`=x6\9vZ{9|<(Sm&pm?7{جع\:;- W=/2Qw6xjUҝ'NOGڞu{?uI-LMmċ"VҕLn҅hϘ*^6QLN$$B~AXȄ] vOwItGn}*ZDZZX>`Lmn_6fh]潯XP}@G{Zo\tI96?hR*M˥\lyoA4s4tTqA/M?n0`r6j0!ȦaK",NveUMD[Dz44A;&t8ܑӱCS-M`}bs몒ݼM7~!U%?.C%u\LUqMRt+p̂iڠ$![iJ\ ;ը)1?)o a2 WUz-s]\̐ A}ncx6Ki҃fOGǛ{ĝe"ݸn>R=8—8q;æ'}n|\JG_r/Z/ϭq m{,qDUf7 ]/9+яTuDEg:F_*XЂr"-RpWRfh+p0_,3)F6_Ӎt~}lhH7_ٗoǵxotnIwEWwL+ѴW1sqs7Ο?d2!h/qЦKͥ5A>m2]h)69/DL764#D%{+wDZ!/c~prm\۩).husS+!h{n΃׃ -94[7>5 }[V>i@#|bib8\%wЕn?D&Iy;j64Ad/L&'h߻]+&y4+iOӅ]/2g/l̜$NI&-{ѵJ.,m`U%H1M18K_Ìަ[x'hzkn{7;Y ^oWەY^C׎f{Y( H=HL@Ai4x*0(U7G/H-='^&Ƃ3t.8Dw?}p>F- ZKK[oAx.q6l~}v7J1tE B# VMB7m|Rtkd?}16zѷjU- aa{ER̭<7Ƶ%) h{n΃׃ -h3 h>4$h+`ZeD Z&a\Dz| Oǻ넶gᬥ> ˤmgZYb}/mㇶލL]so׎Mj#ndQt' }'mc~Y5=$qii <}=@Ђ6kH{ _Оq+Lҝ9N_Ƚ dY*ytsVً5Iy}yi|K8btx1 Öz:55M&HuH{&7how$ZM~wqYaR~S[+IĿRB6=8ERUdc|p~ wY:85ٖ+)EWm/i}|oA/Ƒt\\tt~Xo+ZG[y&`A 0+pꋿSuLN4鋱 > {DR6%_H2ߴNyEtfb^72"]ltBZJ\>k گJT Y(Z*CZ '6&*2Q- ZTwzOߋA @WkКV7x>1dڝ}No]c72F{_9IJ^f#q=c$~M`c7Jq=$tIq! Z .lۨ-Iۛ~8xMNkQPB׮מj=3]_ۦ;; _SF]]\!Éë溺N6B.G9H)}VКe klHJYX㞶ZV8B?N??ԯB0cy #|-<y0zP|bib8m h5LGJn;~f\bOG&^rM\}WFt#]QEo7#kFř,>L"C{N-tEj5|m^ĻsMtKm>--L;y=خtZ;n[{#(Yj-z/uS+X{70Z#o. M/kՕ6 $4S9_-bVehu!/l@ Z%?>V;{;BZde?%55]mzm-nZnB_wv\n~58mϙ|oG,!ү+ly}>; h{n΃׃ -kH{iAM_nPV}oI:W q%h#]Cc~4sjrs~ÎrK/C:""3Z'^&V6ƾ5*5/ӭ:5n )$"~*4iii%mA+ʥI^h'A&a )*=7l* Sӽh*zdJ7l*\,s+0Z|'"5`h`Aۦ@@{O"M@DEgZ RA;H䖟qIDAT ^hGI[_YA{VJe bi3R'1kE;yiN T<8[xי$! 0zPmS h'^&c""3/h4z nXLUZJ|JQ S\ T5y0u#Kio+A[K/ /cD|?<:}=[AⲁV̙ErPVDٔ;WET4b0˵#=r2*< `kot96DtZ|>ix VA iĠ^9 T Zbk8#qc_VĠH%֮ͥ)s~a9:ZX[ks0)XB3('~d !R2ckH{1{nV2#h5"chfffokvԗs H.m\:7m*)~it+;F_*@Ж:ECfTOy)bɡ8 MÒ"rsٽU>$Ei_VΥuWU&$Z] l?u^TԎ/& &xɽ@sF%j${h8}=IMSk fn{T4MƢ,*Z`G8?2*| h8-g2!|lكZi?7(v=?-${| H'^&c""3xZ:ud8jS!vnM)u(L5\,SPW6YK׃u4 :`m hgSО+] ڝaT\)<A ZƩ9loӗ&i̝JPT-22J۰}DQzS%^I-?\j,(ٯ@UcȔW-[CdMq^{\:RmE1-6=gy5"-O"M@DEgZ'hTb+J' {xN~bĖN`" v& /+"ڮ1Y_W^}W4ġs}$w|QZD;eINQES'gP-4=H*&6DN=%}P@ >4iiiſJk!J# ZOZasi +P/2ǹ6 {/o3%h'8=ND h˦o&oåy<_U$gߓ*?T+nC}8 ڴ1.#\Z֑IccF$lI〠'^&c""3!hyQ ReƂLM+>ɿcѝ=W|@8WBDtkr—bK9'p׃J2-!hV9j$ʧsw{~VtR{Cm0陞8u+^nXvKi~,*7r{&`uic%{i앴ZX"cc(O_ hW=H=HL+ͥ%lDgOʛ)7sslkH{1{nV ZTiK_鮤|@{,E`ZF26Paᥖc19AʱpvNk:ʡkN׃ YAC}@kQX$/9Wr_;epMfO!}{|~!h'4ϴYn Ѣ%4{9 SP'2Jm_-l usmb( Rc  YA+i!s\;({VL/1ݯҔRu[r&T[{KE(_7X<ӊXK΋M|@y%B4ugL⻾"bUғd^ny1zPy9(BE cj+)Z./ J4~gAo1qT4=Le^}>~rD9={ɀݾ- 8tV2"h#Th[AZ9 Z2?dQQyQ{t0zPyV/ |RzXvQ%gH(*T|ȰZׯۮVݠ+F{N1K6?wXU2UcX!׾*K dj&6JӤ)ote+i\B8\6Q6QuQ N{?2~.U/hbA 0tV:HAJU //)weeehb: |-<y0zP|bib:&|-<y0zP|bib:&|-<y0zP|bib:&|-<y0zP|bib:&|-<y0zP|bib:&|-<y0zP|bib:&|-<y0zP|bib:&|-<y0zP|bib:&|-<y0zP|bib:&|-<y0zP|bib@thc#nXwLN{k+Qˁ)6HAW:qP?8?{̢+SKS3=BoӏB3sdoj]D*ݙsU0.8Dͷ.\=DF>9gLS!ty}Gb_Q Wii <}=@ >4૒rqNL'A m{kA&OW:B?(ɜ+7[ Ù&}_Z\}Gy<ΖV҉WeiCt$ hii <}=@ >4@X hM}PA'l+^;D7vK;LR>׎"v Uz8W&tzv40qf#ȓ~˻v>q1}#=CAH=HL@A`W=Uvj hEΠOb7iMtokڦ+zdZ'%tzlaD|u 8)t㖾'A61ތWtxq I~yK9@ж5|-<y0zP|bibm;:{଼@@Ȟ~::"gv+i_ n㕃~@k]Wq8W{6!o5qa(G}3j9@Kۀ/Cж5|-<y0zP|bibm;VGݼnݻ+K[뉥$9?zselRkN˷tΩk箛'}x~0WbiVj>mbrmbsun,q hA{n΃׃ -kH{KZ/uz_Ӳ>Ow_J{=]Y~Bgʒ-:w i8]y}[Yw6K۸ y>[v,m]zlUo~!ܦ֖+)k_URN]j+=hD,#9wfcuk7Q.\=@.WVCN`>R?zոw_b;r܋'1~>lN7б m[#"3Z'^& $ݑ(<N-Y=]n~B?.7vֲgRZ̺h`Ӎϕ^=y%m[ykVSEQ1M:rzPVDΩ}0WLg,~djy,ߥ=쾔y֙Ru!F_*h")kG@|'^& $Pu{]{tk^ȋW1\ȮNrTr+)*:۩xBSi` Uz &j6nUqo,3w>sw67ru{W ^Ñ-nͻۘXq4mI=5t{_|ѼoÏO| `c ˜at-.ޫs ^/Hӂq=qD9ncm.l¸whDQim a:t٣?Aж |-<ӉET4Yn|tK~4"p%j;M&KVBԂv׃ -pICBykH{&A&Da"g窢Q=xZnO Q~驄0^RlNZE8.vҹS K| ?wIеcZZ:UA߽<%7hծOeG3 )KE_kJ#h{*Z<%DKSNQq3u_[]NziiME$`?GQ*[I똖8Cm|A -{nv*ɧJYDq :5\B˄Z2QL΍[dTysR! iy1m4>!kH{Kzʛes%: ڗy7WJeb.dIJk {AkB[: a{6^5PW?I7W0s&`AX-OwA+.m`GК*y|푪$hE}wEOG H^U7HJv ?qϲFR.*!hii)vDS5fWVXLUw XT hK:eYc+cdsW&?'%-wժ+FK+DB)FotU/^{ә-,"F!l۩VO$*n]{AkקE龾956.m🐧u;@&`2~w.[Zb ?qtsxov*k @n"{1槃EI'͉%Dx?w3Ƙhtn%MSU?Aж|-<3J Ȑ9Jj+JebA \ҁrrȔWc7ͺVԁ}ƥ/k'= hW= %\y4H!/r'UxZާ6˶4Ic+h|'&7h==&ٛXe?7?}^GBtO,h=/qЦKkj19+Qq(ތH =}T8WC?~'_ {'- O6s-ܾo~DqSǔ7Tzڶ@EgZYV0$}2yf,7%uZ>F;UMy3:o+hmF}M-_Әezzqd-h҂4sa';/Ms{QBlem)Vm{nf43^q%7a6Τ_U鈂V@U6~'B#_ <bNm-M4z>o͟/԰-#B3=&VSz~Y5\*$o\jfeSvt4pt~Ki i`w}/\34.B\ht? עh85I'h7jY4R?Ů:Z/U! ZH>4!O?YI~.hׁڴ/@ж|-<ӌ]1{qY}ǖw*hK GڏqBA} "waRkUM2cƾlk_W_1FqH ,$"%UWXc14xT3hX8QAk.XLNrZ+2X{E؃`_]Uޗ͛ $\.^xQ_SQ8.[A˟w{`ϱA.nڃZ/fuå;&hAM){\= m h ͫש^=tu#9h1!WR tnTI۹${ߠ\{$n7m[y4Lo>^;JS Q 0zPi6^iٓ&,aP9tϦރhl~#(lh=ª#u,yv> vM_ 98-1=n-t+DoAMJ45ާ$p!W >[ ko9?'x\tW8\.-F%6D/D6A3޻M-?6^azu ~cjxz;{&o]B|KR-+.m>J]D:3.?~KAFWN~E;mI^S SVFZkS?x?6nwjC׮҃z{*7g%:4M/m4s44Ӡ}Y J; -)㖎-hH A} Zށ{ w k̡QR/M͞cK l|ҏ/`YIy̵, A kH{KzPU{7LWm>ԶENIt'QX&?'zpvJWFx:`/h|\8*JoL˜@`p}bmG{8UV~U1p% Vl]Ăk|XmћZcJߟ`m[yz;ͯL7WL3g!l;Bf׃J;]JXIsQ h{:-/^IX+ՎJ70ISj/qc_IA;gqX'^& $2!h-8%^ܽ՛e%I[XԒgMq\LG]_b^jTOqM%J]h)&޻>~b$h|fr :{}>+-$^j5ڗȀH'7y5.ӮtqBO]m!h5~B-,}IYS.xu0ޙHbXm hU."ׯ'n$SU\*VJ1F:VKI|,ϕAH=HdqOyB%UX^5*h?kl=A ZeKhHN\ZdҘ2(Qe|tq*g> n;Z;R}8W=Zyj:M 6u<& R]-矯r]vD-rq]ShWo⠕Zn&' 'hom#A1\{bm^;|yКpsn:7MFPfsbN΂6׮9.kkWו9ahU8fV?;Qm~ϴ҃ƎX_hs}?6-773FVNps~OЏxOy8>㝹4k>׸2.ܢu>j^3wnWtl0ݼIq-G|sdcyxQ׎)\Uƪx{m4s4;j)Yfڎ.h0LLa~mZ[QMFQnr'>+hfJA@ N'hӽ6.$yz@kH{*ʿiK*_XeBRsG.pyTrĩbota_hݒUH%hڗvںGN*A@gM}|}fz*֟Ig ZwI{p>UкOZRvdƻru=n%KPO}捧u\ q<7:1ѨsN;Ǥ:!hiiiKr*v(PsG8V8.ىmKNv.hѢ%T0t0:bT4cptR3qiM pJ&=:X{E؃Șw,r85߾Kx|~sBLI, S;yr7ƥgb۸Qj 5҅辘ĆA`ln5t%r 76Ή]{uľ%x &z6dLƈ穥)QMK#?Ϡ {_J3ԍ>sIy%;ލ}Hw.jc^3x߫Ѝ^ZcvUA~<ϑAW:n ݹz=u<7э'GP!hiiL߄=}eJܿ ڌydT:5l Xrij9LN~KRsWD-z{m t)W$vM08jc*q_\ +ES X{E4s4tK݂j?MGF6n0zPivዣ(weu:Cy,Pq㯬I4ϩ Azsh%{,og!jH}ȗ6ۤ ikIGN4yyqjȈV-t+tL[yfZ,{͘EFQnKaI%U¾mƾc ZI1zPi6~.)bY`|c6JbӴw\傶[$ ::%4ĥ@MʼY*'S_:2u/<~P[G,h1:3|bib:&|-<3kVSEQ1I) ֡׃J\⠶ -B}L34VM"d@b b${(MzEN%›"Cͣ>f珥l7-Yk<USz-e43o$數=/\f2$$hiro}ec'^&c""3VOwxB[GKX/}A}=5hMUD.=*ɘh^dM vY+U`!mPy:3[iyL&4KU1܈ #|bib:&|- ؠQW6&,]rv9E +zZ1MD}K3deys&qW.S{PApyxIjԮWFfw'o>4iiV4NĿ[脂vKclR `Ҿmb6:|bib:&|-<3OM =|,t:AfKȝAsF_*6@ X{E4s4L@GF[dk~I;a`Ak-==sz20W35Oֈh;osǺ+h?w&"8uW"""*X#""""LDq EDDTTFDDDD,Fߙx;]A@aX31wQQmg"cXwV= !"""""""V@osǺ+Z` !hFZ` !hFZ\:-^G&m9a@uC@ [kؖ&T70X&m9a@uC@ [kؖ&T70X&m9a@uC@ [kؖ&T70X&m9a@uC@ [kؖ&T70X&m9a@uC@ [kؖ&T70X&m9a@uC@ [kؖ&T70X&m9a@uC@ [kؖ&T70X&m9a@uC@ [kؖ&T70X&m9a@uC@ [kؖ&T70-/ɳ3Kmmm3KC69puǤ}ΒL_&Ej?Ϟ!wM=)~cth9Z:C)yqc.I`[NݾBYO>1{{iٞV>M*4N9NSnhc `TOwgRJc']gӚݾBf(Ӧ"',Fjps9o6:Uoi$->Xi,˲o\mX?ұH])i|?1kZ!tH}p6gjs2uP=#+9gʝ}oؖSv9B7GsvK0͇sevg,8EvU1ꆀ1f˲g0JjA8}v氼 }5gkWqճ'ڟ~Swt.VY])z7 l)Moys(==+^֏)<,Z%!T70Z ix=ժ٥Mjbϫ2+kWH 4Â%WճK˲)U;~;هnXx\oؖSv h*N9kk;gI}b@uC@ [1к .65CQ45E V&m9ev(큵s5_hoeߪRө@uC@ [1v@;}ճMAZ!S2cAֿ}B7X=:`Lry/֛0I85Cf{IVo:,:72[f[?Н9Oão-P3e|@`k5ٖ{|h -clLF}ОpR(G-*sEA{['ju++Jh$-t/oGas+Ҿ笣sUBҫ [~`v!p-tԂ@٥MϫR=;蹃FRw H9NYzg)MrJzkчqSOʥX?ΗKc,v}ڞfJwΪϴ6K}Z7 -cl̠S z}+jaWz69|^da1\sy)h^v <~Y.!K5ZY=[hD"MrJ/m1Β; *7 vtk`?KvEZ!tH}jE\ճ"dlHB M3^zvLr?꠩ˤ㣓~/v#6,&M~Uڻ\%=~ h$,S^.7փMnhc `TOwg򅴩yuV|zqY=kNkm󆴖WvJcg}be] ZQYp;+]fubv 3.F W@eGP8?~X$Μ>L9_Z YrgC?JyBl =\{Ri{[5WwRճI`[Nq7-lwKSHmv~U"5Vj@k \/,mC 盒;-m-@uC@ [SZ9?Yufz5ftdؖS!ZPSWڂar4J hfFk5x~)P8oz}JüY2=Y oJ/"TTruZgW}f?9Bj̮]o)W?,V`մ%-]tU\Y2m$%Z Z[6DZQSҴ=|4~d~n |S2keG~8j_1毞 j$1rgQ~Sgڐ 4J_1%+whꆀ1&g/;!,P>àses[v`Q?S3dmыlY]ˍmߪϗԭCؖS;^MYg4bobڗwYai=%k{vq-" Wa"ֿ}6(T704gkeq^={gI= ZU TwKyzY־M7!ճ3V5s *lMrmeJ:gUp-X1"6xz~r4.Z k?-WZXa5$ BfTZ@ m7VBèBnt7f@{ێڞ.+.ƐX46>g_ଖ۰7 3d h?goi \/,mC=E^4QEnhc `{NTz7 Z76J1 VճZAk .kjAU5-/ۃMxgjﳄr:^)y}% l;޾Bf{8},μÆ~WHEnhc `"zEm1zvЪ6}*eI9G.4?;6gyQ"\eu}r^/llz4νM|(pI֫2;Oȡk &OeVٺGV5_ާɯ:xAZꆀ1&|=zJ i]fni~Iwf~CؠTؠ+/}歚TLrJRe F6_ 5|֠zfEz><&T704[!]iKWSd/r`"Ii-y5"-D.ggYȹs%|~2I`[NޒtҍRy'}u]5T'W-4O?< V՜6PX6PHP86,P9Ӳ(YJ.4{y{櫞4Ҧ s=5lؖs'.ͧ֏$o!V@=sX:^zRM}NVwZ3-~Ê]rҗgco,RMcom-MfT705C<} T8dr6HXR?.! lqfr`SZ '˫kޓxsf\d eS3d}w|i4S~?o&.v@뭣oz%Ӈ|iX&{́e־&ۢRvF~@ -clL~ճs 1aףޔLiFXz6^uQ>߱Q?-~iMr*ڂoh;*T70X&m9-Z퐖gZeOA!p-5 l˩h h=IRcUcmyQm=+T70X&m9-\m̐ ̮:Z\69>^x>!p-5 l˩h h hV[!]ET@uC@ [kؖS*^Yz+kVڦōiMt!p-5 l˩h hu{dLe]Եʞ~be=oC1ꆀ1+$-1Lnhc `rMrꆀ1+$-1Lnhc `rMrꆀ1+$-1Lnhc `rMrꆀ1+$-1LnhFZ` !hFZ` !hFZ`pОoX]C@Q""""""""""F5u -"""""""""bD]C@Q""""""""""F5u -"""""""""bD]C@Q""""""""""F5u -"""""""""bD]C@q72yg>.Ng?yC?쐏Ñvbel,M_vK,kp.o.ﶵCS'1;N~{gL__v:]Y[i/{/iz&{wtL8nh>nLo;){LeOܯ#5Ȥ^47w=ӶCg\ܗ̸xv#Y<53DD\]C@zO:xS2٧}N@HYǖ*T"$M# et꯲cLT+dWmHҟeݜR|Hw[jx]ǜʆ9fXwU3RлfF5_ǤdY׃!EDٻ={Sr43o:=UzvȔ!m;d&zxt-h,-@-d`]ǘmBwUJX%n`h=/Gv#"^skλY :h69J!l˚X6J\weUW#zuRWv~rk//ȶSاQ-G@k652u5M͵SVI'}hѐ6YߤګR.d]+Ɂ@R9%n`I7-_k[ϲ;hV|M0!ݻ!5yЀF 芷ߒm7fdikh17gڱgBnJ_%Sodt)c@ꒀֹ}}Rk g} hu<,g<ѭ||?|X~ᬯVyWJ@[ Ɲ>*ceLjhm<4B@{.E:|S1ZK8"beZDDt3\ {&K@E6 !muIN6#3Nj0iT_{첶Sܘ+vś,{\l}8}j5¡bo¡tFyM_ꇮ%68Hy*h|<3AӞ]}B, C ˑ(b奔Ȳ+e)2yzN7>.穠pgz|Ƞ?IK5u@:)n&n'~yq{7 zكvmk Wαkrd]yQ6;[&}Oo5'~rvwYHsUY>%ze_F Q "B X̍wZ䡩o3A&N{MeE h q]lڔ qr7n-W6=ف@WٻC?vL%dvI>ۮW߻_^YMP*"N#[΄kxMx/ƨ⽻^Pk[]m3eWf'U1]=.O MwԨ1O 1|]֌1?Tcs2d j!{C侉?s=.1=>ISZdهdҮ/*~m=.l0ImoϚrnVCa-ksm:eJH~4ϞS T+5O#LۜڐJ@~U7E:vnƣ?h|㸴k{seDY)ζSפ%V%mdT廹ph'Su\*@=ݩ{d-C@{Ļ?v\+Z3]E nS tr})Β8şD`yײ۬%q_^w`gCk_{DDtkh#ȿDRUPg@@T.\b}oG?_e׺T``7-Y_w8- nʹ΂ 7z׷U)cRl]#=Mѷ5Ez<hՋtΪE3jah=~oW,eT?^-hkt DZ+v[߮+ (KY}7~fLmL:gIݛb}BօbRJʅ]洵%3"":5U&-rU|Op@:->K#n[o*MWJXYS>(&\ieMɳs[ 5f.rl@{Q)=S׸_v纴U<)F%`¯6[}R>[/^wW+jkĐqyB.ޱG9.ۿsΰ<.kdb߼ro@efP6⫶z7Sᘽ{hK1]~dtS{ϣ o)\U zۂ=C;dc?vowCwi|P.4k"חbU_fv)|V-&v9K燺 q=<Z 8X.]C@X^`F|-Gm=AʨJU}UvmՃs'_3]:m*!'s73~ܽ iW_6L:F|QB_ߦ^#B7EiPpڼF,[uxGłiQM{Ty޽YvY%aMAwL6$sjj;14p8.*8/~=-xn Hgk,2Kh.(F߳F69Y(lծ }-H=Dr[.et:XZDjorn: @nz N,'J15duym[U@@qMLPs@>\d@k7jiUx 3PY崏!yXumPc,įt vs [ cȤZ{W^׺gutmGC0^U5d _4QB'u})֨%c [ ;ǭ&&y͹I: +i[9] " ]C@X+}v+2SJ_ k_5ڻ}gmWM hjǨA畣Rݰ#oHg˽ʼ `U!y@ex8AQi 犅.wa[F=^?zZ^y(V3Umh,kRחbx]ҫ㜿4V}]MZc=XZDĪxU+WentK hR_Aͼn,jsZs(oт3P).Ճq#Pg7e{էѷ95F}פa;}`Z"#yc.@: h?=6ȡ'e" hlS#urUZ?]m)}B)c#tb=H|-UʲEuۛ}[l,|~})a}@@;м;""[]C@X6p:xKH5&F8|ڴY/6 hKiwCjx7M[w Jug(練!w@kvSOHc`r~QB ZWielHmu,Rt]0wD΃A@KkhQc~7au0Hqעɀ k Oh};r@jXF6-4 ӫo hq¦m շal/wl>:eZ3}LjOx #<2ι+݉YQYJyem2 >X2A$~^)_8ev[P tR_\JyArQړ{cZDĪnnkF}dt6y{A#p1bڍ5,*6ȱ-w.ewyNзji^#dL2r@헺Hחbx]hP+z^<Sᘽ]@ZycZD*UǢ*F@cd7lW{+׳I潼Hs5Mn h#fh|Dy?0hOqmje>wV^/"fO]Q6رmI&52)2iSĊD^OhUL =,,ӕ22"L:|9=zx9ݮ5ٸj{.S <>!c9Į/W9{qudҝS侧W#W<$w|_e#- ""5Ux7 K;K<{ I7«ZsO +O~E W+ Hw2{@;&%҅m:Ca>O!3^*Ξ9~q_&F3 U#_j`$,G@k5A~+KZ} 9ϻۥqwl8b#3xӝLbחbz]2σߧ/'|YroG#/ɜ[i<^̲֓tt -"bzMZS+^kdowz|m] vk-w})~>Zߐ*BL!;c|aզǀ|R52!ʫzM.;rYy9*=&g:)<;6ߕDQn^;iP{uҔ'x4M3֔LUH>57BD5(2߬V:N4O z߶Ɇe h}FgOamgB^}jևﯲ#XEлm̄z`UF;bhqr3{J h}י?,c~bWFd̐/>Q3ml+=a{d+v#ǚy'1F<VC@뛾85F޿^6$K Η9kғRח^QC߰0![#n΃kN'+r#Dv9xw]swO)'aɿ!udԧd~[ok砮/-&ͪ'ޢ)ww<M;Ernߝ߳=疤ZmΊx6]C@ժ,,mQykp=~I "RRR_Studio"}} \item{2: \code{"RRRStudio" -> "RRRS_tudio"}} \item{3: \code{"RRRStudio" -> "RRRSStudio"}. This will become for example \code{"Rrrstudio"} when we convert to lower camel case.} \item{-1, -2, -3: These \code{parsing_options}'s will suppress the conversion after non-alphanumeric values.} \item{0: no parsing} }} \item{transliterations}{A character vector (if not \code{NULL}). The entries of this argument need to be elements of \code{stringi::stri_trans_list()} (like "Latin-ASCII", which is often useful) or names of lookup tables (currently only "german" is supported). In the order of the entries the letters of the input string will be transliterated via \code{stringi::stri_trans_general()} or replaced via the matches of the lookup table. When named character elements are supplied as part of `transliterations`, anything that matches the names is replaced by the corresponding value. You should use this feature with care in case of \code{case = "parsed"}, \code{case = "internal_parsing"} and \code{case = "none"}, since for upper case letters, which have transliterations/replacements of length 2, the second letter will be transliterated to lowercase, for example Oe, Ae, Ss, which might not always be what is intended. In this case you can make usage of the option to supply named elements and specify the transliterations yourself.} \item{numerals}{A character specifying the alignment of numerals (\code{"middle"}, \code{left}, \code{right}, \code{asis} or \code{tight}). I.e. \code{numerals = "left"} ensures that no output separator is in front of a digit.} \item{sep_out}{(short for separator output) String that will be used as separator. The defaults are \code{"_"} and \code{""}, regarding the specified \code{case}. When \code{length(sep_out) > 1}, the last element of \code{sep_out} gets recycled and separators are incorporated per string according to their order.} \item{unique_sep}{A string. If not \code{NULL}, then duplicated names will get a suffix integer in the order of their appearance. The suffix is separated by the supplied string to this argument.} \item{empty_fill}{A string. If it is supplied, then each entry that matches "" will be replaced by the supplied string to this argument.} \item{prefix}{prefix (string).} \item{postfix}{postfix (string).} } \value{ A character vector according the specified parameters above. } \description{ Function to convert strings to any case } \note{ \code{to_any_case()} is vectorised over \code{string}, \code{sep_in}, \code{sep_out}, \code{empty_fill}, \code{prefix} and \code{postfix}. } \examples{ ### abbreviations to_snake_case(c("HHcity", "newUSElections"), abbreviations = c("HH", "US")) to_upper_camel_case("succesfullGMBH", abbreviations = "GmbH") to_title_case("succesfullGMBH", abbreviations = "GmbH") ### sep_in (input separator) string <- "R.St\\u00FCdio: v.1.0.143" to_any_case(string) to_any_case(string, sep_in = ":|\\\\.") to_any_case(string, sep_in = ":|(?")) ### prefix and postfix to_upper_camel_case("some_path", sep_out = "//", prefix = "USER://", postfix = ".exe") } \seealso{ \href{https://github.com/Tazinho/snakecase}{snakecase on github} or \code{\link{caseconverter}} for some handy shortcuts. } \author{ Malte Grosser, \email{malte.grosser@gmail.com} } \keyword{utilities} snakecase/man/abbreviation_internal.Rd0000644000176200001440000000203013420607650017610 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/abbreviation_internal.R \name{abbreviation_internal} \alias{abbreviation_internal} \title{Internal abbreviation marker, marks abbreviations with an underscore behind. Useful if \code{parsing_option} 1 is needed, but some abbreviations need \code{parsing_option} 2.} \usage{ abbreviation_internal(string, abbreviations = NULL) } \arguments{ \item{string}{A string (for example names of a data frame).} \item{abbreviations}{character with (uppercase) abbreviations. This marks abbreviations with an underscore behind (in front of the parsing). Useful if \code{parsing_option} 1 is needed, but some abbreviations need \code{parsing_option} 2.} } \value{ A character vector. } \description{ Internal abbreviation marker, marks abbreviations with an underscore behind. Useful if \code{parsing_option} 1 is needed, but some abbreviations need \code{parsing_option} 2. } \author{ Malte Grosser, \email{malte.grosser@gmail.com} } \keyword{utilities} snakecase/man/preprocess_internal.Rd0000644000176200001440000000160713420607650017341 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocess_internal.R \name{preprocess_internal} \alias{preprocess_internal} \title{Internal function that replaces regex matches with underscores} \usage{ preprocess_internal(string, sep_in) } \arguments{ \item{string}{A string.} \item{sep_in}{(short for separator input) A regex supplied as a character (if not \code{NULL}), which will be wrapped internally into \code{stringr::regex()}. All matches will be replaced by underscores (additionally to \code{"_"} and \code{" "}, for which this is always true). Underscores can later turned into another separator via \code{postprocess}.} } \value{ A character containing the parsed string. } \description{ Internal function that replaces regex matches with underscores } \author{ Malte Grosser, \email{malte.grosser@gmail.com} } \keyword{utilities} snakecase/man/check_design_rule.Rd0000644000176200001440000000516513420607650016720 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check_design_rule.R \name{check_design_rule} \alias{check_design_rule} \title{Internal helper to test the design rules for any string and setting of \code{to_any_case()}} \usage{ check_design_rule(string, sep_in = NULL, transliterations = NULL, sep_out = NULL, prefix = "", postfix = "", unique_sep = NULL, empty_fill = NULL, parsing_option = 1) } \arguments{ \item{string}{A string (for example names of a data frame).} \item{sep_in}{String that will be wrapped internally into \code{stringr::regex()}. All matches will be treated as additional splitting parameters besides the default ones (\code{"_"} and \code{" "}), when parsing the input string.} \item{transliterations}{A character vector (if not \code{NULL}). The entries of this argument need to be elements of \code{stringi::stri_trans_list()} (like "Latin-ASCII", which is often useful) or names of lookup tables (currently only "german" is supported). In the order of the entries the letters of the input string will be transliterated via \code{stringi::stri_trans_general()} or replaced via the matches of the lookup table.} \item{sep_out}{String that will be used as separator. The defaults are \code{"_"} and \code{""}, regarding the specified \code{case}.} \item{prefix}{prefix (string).} \item{postfix}{postfix (string).} \item{unique_sep}{A string. If it is supplied, then duplicated names will get a suffix integer in the order of their appearance. The suffix is separated by the supplied string to this argument.} \item{empty_fill}{A string. If it is supplied, then each entry that matches "" will be replaced by the supplied string to this argument.} \item{parsing_option}{An integer that will determine the parsing_option. \itemize{ \item{1: \code{RRRStudio -> RRR_Studio}} \item{2: \code{RRRStudio -> RRRS_tudio}} \item{3: parses at the beginning like option 1 and the rest like option 2.} \item{4: parses at the beginning like option 2 and the rest like option 1.} \item{5: parses like option 1 but suppresses "_" around non special characters. In this way case conversion won't apply after these characters. See examples.} \item{6: parses like option 1, but digits directly behind/in front non-digits, will stay as is.} \item{any other integer <= 0: no parsing"} }} } \value{ A character vector separated by underscores, containing the parsed string. } \description{ Internal helper to test the design rules for any string and setting of \code{to_any_case()} } \author{ Malte Grosser, \email{malte.grosser@gmail.com} } \keyword{utilities}