From 7176d82515c0cc1c652c7cdc66b97fcb75a08051 Mon Sep 17 00:00:00 2001 From: Pratik Gupte Date: Tue, 20 Jan 2026 12:02:08 +0000 Subject: [PATCH 1/9] Separate plotting code from data prep --- R/plotting.R | 237 +++++++++++++++++++------------------------- R/plotting_prep.R | 247 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 347 insertions(+), 137 deletions(-) create mode 100644 R/plotting_prep.R diff --git a/R/plotting.R b/R/plotting.R index aefd4ed..440a2f0 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -1,4 +1,3 @@ -# TODO: add documentations for these functions #' Plotting theme for vimcheck #' #' @description @@ -17,6 +16,8 @@ #' #' @return A `ggplot2` theme that can be added to `ggplot2` plots or objects. #' +#' @keywords plotting +#' #' @export theme_vimc <- function(x_text_angle = 45, y_text_angle = 0, ...) { ggplot2::theme_bw() + @@ -44,45 +45,36 @@ theme_vimc <- function(x_text_angle = 45, y_text_angle = 0, ...) { #' Plotting functions for burden and impact diagnostics. This documentation #' holds all plotting functions for now. #' -#' @param d +#' @param data A `` that gives the comparison between VIMC-provided +#' and modeller-used demography values, in long-format. This is primarily +#' expected to be the output of `check_demography_alignment()` processed by +#' `prep_plot_demography()`. #' -#' @param fig_number +#' @param fig_number The figure number. #' #' @return A `` object that can be printed to screen in the plot frame #' or saved to an output device (i.e., saved as an image file). #' -#' @examples +#' @keywords plotting #' #' @export -plot_compare_demography <- function(d, fig_number) { - num_countries <- length(unique(d$country)) - names_melting_data <- c( - "scenario", - "age", - "year", - "expected", - "provided", - "difference" - ) - names_melting_by <- c("scenario", "age", "year") - - # TODO: use tidyr; BIG PICTURE: NO DATA PREP IN PLOTTING FUNCTIONS! - tot <- reshape2::melt(d[, names_melting_data], id.vars = names_melting_by) - dat <- tot %>% - dplyr::group_by(variable, scenario, year, age) %>% - dplyr::summarise(value = sum(value)) %>% - dplyr::mutate(millions = value / 1e6) %>% - dplyr::arrange(age) +plot_compare_demography <- function(data, fig_number) { + # NOTE: not implementing a lot of checks on inputs + checkmate::assert_tibble(data) + checkmate::assert_count(fig_number, positive = TRUE) # no zeros allowed # TODO: use .data and .vars, import or namespace functions - g <- ggplot(data = dat, aes(x = year, y = millions, fill = age)) + - geom_bar(stat = "identity") + + g <- ggplot( + data = data, + aes(x = year, y = millions, fill = age) + ) + + geom_col() + facet_wrap(~ scenario + variable, ncol = 3) + scale_fill_distiller(palette = "PuOr") + - geom_hline(yintercept = 0, color = 'red') + + geom_hline(yintercept = 0, colour = "red") + labs( x = "calendar year", - y = glue::glue("people (in millions"), + y = "people (in millions", title = glue::glue( "Fig. {fig_number}. Comparison between interpolated population and \\ cohort size ({num_countries} countries)." @@ -95,23 +87,24 @@ plot_compare_demography <- function(d, fig_number) { #' @name plotting #' -#' @param burden +#' @param burden_age A `` with the minimum column names +#' "age", "millions" #' #' @export -plot_age_patterns <- function(burden, fig_number) { - # TODO: REMOVE DATA PREP FROM PLOTTING FNS - d <- burden %>% - group_by(scenario, burden_outcome, age) %>% - summarise(millions = sum(value) / 1e6) +plot_age_patterns <- function(burden_age, fig_number) { + checkmate::assert_tibble(burden_age) + checkmate::assert_count(fig_number, positive = TRUE) # no zeros allowed - g <- ggplot(d, aes(x = age, y = millions)) + - geom_bar(stat = "identity") + + max_age <- max(burden_age$age) + 1 + + g <- ggplot(burden_age, aes(x = age, y = value_millions)) + + geom_col() + facet_grid( burden_outcome ~ scenario, scales = "free_y", labeller = labeller(scenario = label_wrap_gen(10)) ) + - coord_cartesian(xlim = c(0, max(d$age) + 1)) + + coord_cartesian(xlim = c(NA_real_, max_age)) + # no lower limit, expect > 0 labs( y = "people (in millions)", title = glue::glue( @@ -125,29 +118,16 @@ plot_age_patterns <- function(burden, fig_number) { #' @name plotting #' -#' @param year_max +#' @param burden_decades A `` giving the burden by decade, up to +#' `year_max`. This should be the output of [prep_plot_burden_decades()]. #' #' @export -plot_global_burden_decades <- function(burden, year_max, fig_number) { - # TODO: prefer moving these conditional checks elsewhere - # TODO: prefer moving data prep outside plotting fn - stopifnot(year_max %% 10 == 0) - d <- burden %>% - filter(year <= year_max) %>% - mutate(year2 = ifelse(year == year_max, year_max - 1, year)) %>% - mutate(decade = floor(year2 / 10) * 10) %>% - mutate( - decade_label = ifelse( - decade == year_max - 10, - paste0(decade, "-", decade + 10), - paste0(decade, "-", decade + 9) - ) - ) %>% - group_by(scenario, burden_outcome, decade_label) %>% - summarise(millions = sum(value) / 1e6) - - g <- ggplot(d, aes(x = scenario, y = millions, fill = scenario)) + - geom_bar(stat = "identity") + +plot_global_burden_decades <- function(burden_decades, fig_number) { + g <- ggplot( + burden_decades, + aes(x = scenario, y = millions, fill = scenario) + ) + + geom_col() + facet_grid(burden_outcome ~ decade_label, scales = "free_y") + labs( y = "people (in millions)", @@ -169,33 +149,38 @@ plot_global_burden_decades <- function(burden, year_max, fig_number) { #' @name plotting #' -#' @param d -#' -#' @param outcome +#' @param burden_data This is expected to be a `` from a +#' nested-`` constructed using [prep_plot_global_burden()]. #' #' @export -plot_global_burden <- function(d, outcome, fig_number) { - data_ <- dplyr::filter( - d, - .data$burden_outcome == outcome +plot_global_burden <- function(burden_data, outcome_name, fig_number) { + checkmate::assert_tibble(burden_data) + checkmate::assert_subset( + outcome_name, + burden_outcome_names ) + checkmate::assert_count(fig_number) + + scenarios_per_gridcol <- 10 g <- ggplot( - data, - aes(x = year, y = millions, fill = age) + burden_data, + aes(year, millions, fill = age) ) + - geom_bar(stat = "identity", aes(fill = age)) + + geom_col() + facet_grid( ~scenario, scales = "free_y", - labeller = labeller(scenario = label_wrap_gen(10)) # TODO: avoid magic numbers + labeller = labeller( + scenario = label_wrap_gen(scenarios_per_gridcol) + ) ) + scale_fill_distiller(palette = "Spectral") + labs( x = "calendar year", - y = paste(outcomes_list[i], "(in millions)"), # TODO: where is outcomes_list!? + y = glue::glue("{outcome_name} (in millions)"), title = glue::glue( - "Fig. {fig_number}: Global trends of disease burden ({outcome})." + "Fig. {fig_number}: Global trends of disease burden ({outcome_name})." ) ) + theme_vimc(x_text_angle = 90) @@ -205,43 +190,43 @@ plot_global_burden <- function(d, outcome, fig_number) { #' @name plotting #' -#' @param cov +#' @param coverage_set A `` that is the output of +#' [prep_plot_coverage_set()]. #' #' @export -plot_coverage_set <- function(cov, figure_number) { - # TODO: remove data prep - no_vacc <- expand_grid( - year = unique(cov$year), - country = unique(cov$country) - ) %>% - mutate( - coverage = 0, - delivery = "none", - scenario_description = "No vaccination" - ) +plot_coverage_set <- function(coverage_set, figure_number) { + checkmate::assert_tibble(coverage_set) + checkmate::assert_count(figure_number) + + dodge_width <- 0.9 + col_opacity <- 0.7 + scenarios_per_gridcol <- 10 - cov1 <- cov %>% - mutate(delivery = paste(vaccine, activity_type, sep = "-")) %>% - select(scenario_description, delivery, country, year, coverage) %>% - bind_rows(no_vacc) + disease_name <- unique(coverage_set$disease) # expecting a single value - g <- ggplot(cov1, aes(x = year, y = coverage, fill = delivery)) + - geom_bar( - stat = "identity", - position = position_dodge(width = 0.9), - alpha = 0.7 + g <- ggplot( + coverage_set, + aes(x = year, y = coverage, fill = delivery) + ) + + geom_col( + # TODO: check if dodging is really needed + position = position_dodge(dodge_width), + alpha = col_opacity ) + facet_grid( - "country ~ scenario_description", + rows = vars(country), + cols = vars(scenario_description), scales = "free_y", - labeller = labeller(scenario_description = label_wrap_gen(10)) + labeller = labeller( + scenario_description = label_wrap_gen(scenarios_per_gridcol) + ) ) + - scale_x_continuous(breaks = pretty(unique(cov1$year))) + + scale_x_continuous() + labs( x = "calendar year", y = "Proportion of target population", title = glue::glue( - "Fig. {figure_number}: Coverage sets for {cov$disease[1]}" + "Fig. {figure_number}: Coverage sets for {disease_name}" ) ) + theme_vimc(90) @@ -251,63 +236,41 @@ plot_coverage_set <- function(cov, figure_number) { #' @name plotting #' -#' @param fvp -#' -#' @param year_min -#' -#' @param year_max +#' @param fvp_data A `` of estimates of fully-vaccinated persons (FVPs) per +#' scenario, with scenarios as factors in order of the number of adjusted-FVPs. +#' Expected to be the output of [prep_plot_fvp()]. #' #' @export -plot_fvp <- function(fvp, year_min, year_max, figure_number) { - # TODO: PREFER TO REMOVE DATA PREP CODE - no_vacc <- expand_grid( - year = unique(fvp$year), - country = unique(fvp$country) - ) %>% - mutate(fvps_adjusted = 0, scenario_description = "No vaccination") - - fvp_final <- bind_rows(fvp, no_vacc) %>% - filter(year >= year_min & year <= year_max) %>% - mutate(scenario = as.factor(scenario_description)) +plot_fvp <- function(fvp_data, figure_number) { + checkmate::assert_tibble(fvp_data) + checkmate::assert_count(figure_number) - fvp_final$scenario <- relevel(fvp_final$scenario, "No vaccination") - fvp_final$scenario <- gsub(tolower(fvp$disease[1L]), "", fvp_final$scenario) - fvp_final$scenario <- gsub("-", " ", fvp_final$scenario) + scenarios_per_gridcol <- 10 + scale_millions <- 1e-6 + disease_name <- unique(fvp_data$disease) - scenario_order <- c(names(sort(tapply( - fvp_final$fvps_adjusted, - fvp_final$scenario, - sum, - na.rm = TRUE - )))) - - fvp_final$scenario <- forcats::fct_relevel(fvp_final$scenario, scenario_order) - - fvp_agg <- - fvp_final %>% - dplyr::group_by(year, scenario, disease) %>% - dplyr::summarise(fvp = sum(fvps_adjusted, na.rm = TRUE)) - - # TODO: prefer to use a scale transform rather than touching data - g <- ggplot(fvp_agg, aes(x = year, y = fvp / 1e6, fill = scenario)) + - geom_bar( - stat = "identity", - colour = "midnightblue", + g <- ggplot( + fvp_data, + aes(x = year, y = fvp, fill = scenario) + ) + + geom_col( fill = "midnightblue" ) + facet_grid( ~scenario, scales = "free_y", - labeller = labeller(scenario = label_wrap_gen(10)) + labeller = labeller(scenario = label_wrap_gen(scenarios_per_gridcol)) + ) + + scale_x_continuous() + + scale_y_continuous( + labels = scales::label_number(scale = scale_millions) ) + - scale_x_continuous(breaks = pretty(unique(fvp_agg$year))) + - ylab(paste("FVP (in millions)")) + labs( x = "calendar year", y = "FVP (in millions)", title = glue::glue( "Fig. {figure_number}: Fully Vaccinated Persons at global level by \\ - scenario for {fvp$disease[1L]}" + scenario for {disease_name}" ) ) + theme_vimc(90, legend.position = "none") diff --git a/R/plotting_prep.R b/R/plotting_prep.R new file mode 100644 index 0000000..37c3780 --- /dev/null +++ b/R/plotting_prep.R @@ -0,0 +1,247 @@ +#' Prepare data for plotting +#' +#' @name plotting_prep +#' @rdname plotting_prep +#' +#' @description +#' Convert the output of [check_demography_alignment()] to a long-format tibble. +#' +#' @param data For `prep_plot_demography()`, a `` output from +#' [check_demography_alignment()]. +#' +#' @param burden For `prep_plot_age()`, +#' +#' @return +#' +#' - For `prep_plot_demography()`: a `` in long-format, with the +#' identifier-columns, "scenario", "age", and "year", with the added column +#' "value_millions". +#' +#' - For `prep_plot_age()`: +#' +#' @export +prep_plot_demography <- function(data) { + checkmate::assert_tibble(data) + + # NOTE: this data is expected to come from `check_demography_alignment()` + # there are expected to be more colnames: abs_diff, prop_diff + names_melting_data <- c( + "scenario", + "age", + "year", + "expected", + "provided", + "difference" + ) + + checkmate::assert_names( + colnames(data), + must.include = names_melting_data + ) + + num_countries <- length(unique(data$country)) + + names_melting_by <- c("scenario", "age", "year") + + data <- dplyr::select( + data, + {{ names_melting_data }} + ) + + data <- tidyr::pivot_longer( + data, + !{{ names_melting_by }} + ) + + data <- dplyr::summarise( + data, + value = sum(.data$value), + .groups = c("variable", "scenario", "year", "age") + ) + data <- dplyr::mutate( + data, + value_millions = .data$value / 1e6 + ) + data <- dplyr::arrange( + data, + "age" + ) + + data +} + +#' @name plotting_prep +#' +#' @export +prep_plot_age <- function(burden) { + checkmate::assert_tibble(burden) + + data <- dplyr::summarise( + burden, + value_millions = sum(.data$value) / 1e6, + .groups = c("scenario", "burden_outcome", "age") + ) + + data +} + +#' @name plotting_prep +#' +#' @export +prep_plot_burden_decades <- function(burden, year_max) { + # TODO: add colnames check + # TODO: general: make validator for burden data + checkmate::assert_tibble(burden) + + is_decade <- year_max %% 10 == 0 + if (!is_decade) { + cli::cli_abort( + "Expected {.code year_max} to be a multiple of 10, but got value \\ + {.code year_max}." + ) + } + + last_decade <- year_max - 10 + + data <- data[data$year <= year_max, ] + data <- dplyr::mutate( + data, + year = pmin( + .data$year, + .data$year_max - 1 + ), + decade = floor(.data$year / 10) * 10, + decade_label = dplyr::if_else( + .data$decade == last_decade, + glue::glue("{.data$decade}-{.data$decade + 10}"), + glue::glue("{.data$decade}-{.data$decade + 9}") + ) + ) + + data <- dplyr::summarise( + data, + value_millions = sum(.data$value) / 1e6, + .groups = c("scenario", "burden_outcome", "decade_label") + ) + + data +} + +#' @name plotting_prep +#' +#' @export +prep_plot_global_burden <- function(burden) { + # TODO: add colnames check + checkmate::assert_tibble(burden) + + nesting_cols <- "outcome" + + # create a nested tibble with a list column named "burden_data" + burden_nested <- tidyr::nest( + burden, + .by = {{ nesting_cols }}, + .key = burden_data + ) + + burden_nested +} + +#' @name plotting_prep +#' +#' @export +prep_plot_coverage_set <- function(coverage) { + checkmate::assert_tibble(coverage) + + years <- unique(coverage$year) + countries <- unique(coverage$country) + coverage_level <- 0 + delivery <- "none" + scenario_description <- "No vaccination" + + no_vax <- tidyr::crossing( + year = years, + country = countries, + coverage = coverage_level, + delivery = delivery, + scenario_description = scenario_description + ) + + coverage_set <- dplyr::mutate( + coverage, + delivery = glue::glue("{.data$vaccine}-{.data$activity_type}") + ) + cols_to_select <- c( + "scenario_description", + "delivery", + "country", + "year", + "coverage" + ) + coverage_set <- dplyr::select( + coverage_set, + {{ cols_to_select }} + ) + coverage_set <- dplyr::bind_rows( + coverage_set, + no_vax + ) + + coverage_set +} + +#' @name plotting_prep +#' +#' @export +prep_plot_fvp <- function(fvp, year_min, year_max) { + checkmate::assert_tibble(fvp) + checkmate::assert_count(year_min) + checkmate::assert_count(year_max) + + years <- unique(coverage$year) + countries <- unique(coverage$country) + fvps_adjusted <- 0 + scenario_description <- "No vaccination" + + no_vax <- tidyr::crossing( + year = years, + country = countries, + fvps_adjusted = fvps_adjusted, + scenario_description = scenario_description + ) + + fvp_final <- dplyr::bind_rows(fvp, no_vax) + fvp_final <- dplyr::filter( + fvp_final, + dplyr::between(.data$year, year_min, year_max) + ) + fvp_final <- dplyr::mutate( + fvp_final, + scenario = forcats::fct_relevel( + .data$scenario_description, + "No vaccination" + ) # convert characters to factors and set first level + ) + + # TODO: need to see an example to figure this out + fvp_final$scenario <- gsub(tolower(fvp$disease[1L]), "", fvp_final$scenario) + fvp_final$scenario <- gsub("-", " ", fvp_final$scenario) + + # determine scenario order in terms of total adjusted FVPs per scenario + scenario_order <- names(sort( + tapply( + fvp_final$fvps_adjusted, + fvp_final$scenario, + sum, + na.rm = TRUE + ) + )) + + fvp_final$scenario <- forcats::fct_relevel(fvp_final$scenario, scenario_order) + + fvp_agg <- dplyr::summarise( + fvp = sum(.data$fvps_adjusted, na.rm = TRUE), + .groups = c("year", "scenario", "disease") + ) + + fvp_agg +} From 23a1703adab625d084f9b97a4a5d2a783f2b554f Mon Sep 17 00:00:00 2001 From: Pratik Gupte Date: Thu, 22 Jan 2026 14:58:28 +0000 Subject: [PATCH 2/9] MInor fixes to burden diagnostics --- R/burden_diagnositics.R | 57 +++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/R/burden_diagnositics.R b/R/burden_diagnositics.R index 4d37a6a..3c00a09 100644 --- a/R/burden_diagnositics.R +++ b/R/burden_diagnositics.R @@ -76,7 +76,7 @@ validate_file_dict_template <- function( checkmate::assert_data_frame( sce, any.missing = TRUE, # allowing missing as contained in examples - min.cols = length(scenario_data_colnames), + min.cols = length(scenario_data_colnames) ) checkmate::assert_names( colnames(sce), @@ -170,10 +170,13 @@ validate_complete_incoming_files <- function( ) if (!are_good_scefiles) { + # prevent linting as lintr cannot see usage inside glue::glue() + # nolint start extra_files <- setdiff(sce_files, scenario_filenames) n_extra_files <- length(extra_files) missing_files <- setdiff(scenario_filenames, sce_files) n_missing_files <- length(missing_files) + # nolint end cli::cli_abort( c( @@ -186,7 +189,7 @@ validate_complete_incoming_files <- function( {cli::no(n_missing_files)} missing files{? /} \\ {.file {basename(missing_files)}}", i = "Directory searched: {.file {path_burden}}" - ), + ) ) } } else { @@ -244,13 +247,9 @@ validate_template_alignment <- function(burden_set, template) { missing_grid_in_burden <- dplyr::setdiff(template_grid, burden_grid) extra_grid_in_burden <- dplyr::setdiff(burden_grid, template_grid) - burden_grid_matches_template <- all( - c( - nrow(missing_grid_in_burden), - nrow(extra_grid_in_burden) - ) == - 0L - ) + burden_grid_matches_template <- nrow(missing_grid_in_burden) + + nrow(extra_grid_in_burden) == + 0L list( missing_cols_in_burden = missing_cols_in_burden, @@ -286,24 +285,21 @@ check_demography_alignment <- function( wpp, gender = c("Both", "Male", "Female") ) { - # TODO: input checks checkmate::assert_data_frame(burden_set) checkmate::assert_data_frame(wpp) gender <- rlang::arg_match(gender) - cols_to_select <- c("country", "year", "age", "cohort_size") + cols_to_select <- c("country", "year", "age", "cohort_size", "scenario") provided <- dplyr::select( burden_set, {{ cols_to_select }} ) provided <- dplyr::mutate( provided, - provided = cohort_size + provided = .data$cohort_size ) - # TODO: explain what expected is - # TODO: replace with a right-join? expected <- dplyr::filter( wpp, gender == {{ gender }} @@ -315,9 +311,10 @@ check_demography_alignment <- function( expected, {{ cols_to_select }} ) + expected <- dplyr::rename( expected, - expected = value + expected = value # nolint due to tidyselect conventions ) # return left join @@ -328,9 +325,9 @@ check_demography_alignment <- function( ) alignment <- dplyr::mutate( alignment, - difference = provided - expected, - abs_diff = abs(difference), - prop_diff = difference / expected + difference = .data$provided - .data$expected, + abs_diff = abs(.data$difference), + prop_diff = .data$difference / .data$expected ) alignment @@ -352,13 +349,14 @@ check_demography_alignment <- function( #' @export basic_burden_sanity <- function(burden) { # TODO: expectations on burden - mes <- "Basic sanity check for burden estimates:" + mes_start <- "Basic sanity check for burden estimates:" + mes <- mes_start value_col <- "value" value <- burden[[value_col]] - if (is.numeric(burden$value)) { - if (anyNA(burden$value)) { + if (is.numeric(value)) { + if (anyNA(value)) { mes_any_missing <- glue::glue( "Warning: Burden estimates should not have missing values, but some \\ values are missing. Fix missing values by converting to zeros!" @@ -367,7 +365,7 @@ basic_burden_sanity <- function(burden) { mes <- c(mes, mes_any_missing) } - if (any(burden$value < 0, na.rm = TRUE)) { + if (any(value < 0, na.rm = TRUE)) { mes_any_negative <- glue::glue( "Warning: Burden estimates should all be positive or zero, but found \\ some negative estimates!" @@ -384,7 +382,7 @@ basic_burden_sanity <- function(burden) { mes <- c(mes, mes_not_numeric) } - if (length(mes) == 1L) { + if (mes == mes_start) { mes <- c(mes, "PASS.") } @@ -417,7 +415,7 @@ transform_coverage_fvps <- function(coverage, wpp) { cols_to_select <- c("age_from", "age_to", "gender") todo_list <- dplyr::select( coverage, - cols_to_select + {{ cols_to_select }} ) todo_list <- dplyr::distinct(todo_list) todo_list <- dplyr::mutate( @@ -429,23 +427,22 @@ transform_coverage_fvps <- function(coverage, wpp) { # TODO: clarify structure of `coverage` and mapping of gender to age pop_all <- list() for (i in seq_along(todo_list$age_from)) { - pop_all[[i]] <- wpp %>% - x <- dplyr::filter( + x <- dplyr::filter( wpp, - .data$age >= todo_list$age_from[i], - .data$age <= todo_list$age_to[i], + dplyr::between(.data$age, todo_list$age_from[i], todo_list$age_to[i]), .data$gender == todo_list$gender[i] ) - x <- dplyr::group_by(x, .data$country, .data$year) x <- dplyr::summarise( x, target_wpp = sum(.data$value), - .groups = "drop" + .by = c("country", "year") ) x <- dplyr::mutate( x, job = todo_list$job[i] ) + + pop_all[[i]] <- x } pop_all <- dplyr::bind_rows(pop_all) From e9b6838e5b56d59f4961df1487ce90be1ed17503 Mon Sep 17 00:00:00 2001 From: Pratik Gupte Date: Thu, 22 Jan 2026 14:59:02 +0000 Subject: [PATCH 3/9] Edits to plotting prep fns --- R/plotting_prep.R | 86 ++++++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/R/plotting_prep.R b/R/plotting_prep.R index 37c3780..8c29546 100644 --- a/R/plotting_prep.R +++ b/R/plotting_prep.R @@ -6,10 +6,14 @@ #' @description #' Convert the output of [check_demography_alignment()] to a long-format tibble. #' -#' @param data For `prep_plot_demography()`, a `` output from +#' @param burden For `prep_plot_demography()`, a `` output from #' [check_demography_alignment()]. #' -#' @param burden For `prep_plot_age()`, +#' For `prep_plot_age()`, ... ADD DETAILS. +#' +#' For `prep_plot_burden_decades()`, ... ADD DETAILS. +#' +#' For `prep_plot_global_burden()`, ... ADD DETAILS. #' #' @return #' @@ -20,8 +24,8 @@ #' - For `prep_plot_age()`: #' #' @export -prep_plot_demography <- function(data) { - checkmate::assert_tibble(data) +prep_plot_demography <- function(burden) { + checkmate::assert_tibble(burden) # NOTE: this data is expected to come from `check_demography_alignment()` # there are expected to be more colnames: abs_diff, prop_diff @@ -31,43 +35,49 @@ prep_plot_demography <- function(data) { "year", "expected", "provided", - "difference" + "difference", + "country" ) checkmate::assert_names( - colnames(data), + colnames(burden), must.include = names_melting_data ) - num_countries <- length(unique(data$country)) - - names_melting_by <- c("scenario", "age", "year") + names_melting_by <- c("scenario", "age", "year", "country") - data <- dplyr::select( - data, + burden <- dplyr::select( + burden, {{ names_melting_data }} ) - data <- tidyr::pivot_longer( - data, - !{{ names_melting_by }} + burden_long <- tidyr::pivot_longer( + burden, + !{{ names_melting_by }}, + names_to = "variable" ) - data <- dplyr::summarise( - data, + burden_long <- dplyr::summarise( + burden_long, value = sum(.data$value), - .groups = c("variable", "scenario", "year", "age") + .by = c("variable", "scenario", "year", "age", "country") ) - data <- dplyr::mutate( - data, + burden_long <- dplyr::mutate( + burden_long, value_millions = .data$value / 1e6 ) - data <- dplyr::arrange( - data, + burden_long <- dplyr::arrange( + burden_long, "age" ) - data + # set factor levels for variable + burden_long$variable <- forcats::fct_relevel( + burden_long$variable, + c("expected", "provided", "difference") + ) + + burden_long } #' @name plotting_prep @@ -76,13 +86,13 @@ prep_plot_demography <- function(data) { prep_plot_age <- function(burden) { checkmate::assert_tibble(burden) - data <- dplyr::summarise( + burden_summary <- dplyr::summarise( burden, value_millions = sum(.data$value) / 1e6, .groups = c("scenario", "burden_outcome", "age") ) - data + burden_summary } #' @name plotting_prep @@ -103,9 +113,9 @@ prep_plot_burden_decades <- function(burden, year_max) { last_decade <- year_max - 10 - data <- data[data$year <= year_max, ] - data <- dplyr::mutate( - data, + burden_data <- burden[burden$year <= year_max, ] + burden_data <- dplyr::mutate( + burden_data, year = pmin( .data$year, .data$year_max - 1 @@ -118,13 +128,13 @@ prep_plot_burden_decades <- function(burden, year_max) { ) ) - data <- dplyr::summarise( - data, + burden_data <- dplyr::summarise( + burden_data, value_millions = sum(.data$value) / 1e6, .groups = c("scenario", "burden_outcome", "decade_label") ) - data + burden_data } #' @name plotting_prep @@ -140,7 +150,7 @@ prep_plot_global_burden <- function(burden) { burden_nested <- tidyr::nest( burden, .by = {{ nesting_cols }}, - .key = burden_data + .key = "burden_data" ) burden_nested @@ -148,6 +158,8 @@ prep_plot_global_burden <- function(burden) { #' @name plotting_prep #' +#' @param coverage +#' #' @export prep_plot_coverage_set <- function(coverage) { checkmate::assert_tibble(coverage) @@ -191,14 +203,20 @@ prep_plot_coverage_set <- function(coverage) { #' @name plotting_prep #' +#' @param fvp +#' +#' @param year_min +#' +#' @param year_max +#' #' @export prep_plot_fvp <- function(fvp, year_min, year_max) { checkmate::assert_tibble(fvp) checkmate::assert_count(year_min) checkmate::assert_count(year_max) - years <- unique(coverage$year) - countries <- unique(coverage$country) + years <- unique(fvp$year) + countries <- unique(fvp$country) fvps_adjusted <- 0 scenario_description <- "No vaccination" @@ -224,7 +242,7 @@ prep_plot_fvp <- function(fvp, year_min, year_max) { # TODO: need to see an example to figure this out fvp_final$scenario <- gsub(tolower(fvp$disease[1L]), "", fvp_final$scenario) - fvp_final$scenario <- gsub("-", " ", fvp_final$scenario) + fvp_final$scenario <- gsub("-", " ", fvp_final$scenario, fixed = TRUE) # determine scenario order in terms of total adjusted FVPs per scenario scenario_order <- names(sort( From a90723b91d5bb8dd316a111727444cad35b10edb Mon Sep 17 00:00:00 2001 From: Pratik Gupte Date: Thu, 22 Jan 2026 14:59:14 +0000 Subject: [PATCH 4/9] Edits to plotting fns --- R/plotting.R | 130 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 48 deletions(-) diff --git a/R/plotting.R b/R/plotting.R index 440a2f0..0519329 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -3,21 +3,36 @@ #' @description #' A simple plotting theme building on [ggplot2::theme_bw()]. #' -#' #' @name plotting_theme #' @rdname plotting_theme #' -#' @param x_text_angle +#' @param x_text_angle The angle for X-axis labels. Defaults to 45 degrees. #' -#' @param y_text_angle +#' @param y_text_angle The angle for Y-axis labels. Defaults to 0 degrees. #' #' @param ... <[`dynamic-dots`][rlang::dyn-dots]> Other arguments passed to -#' [ggplot2::theme()]. +#' [ggplot2::theme()]. These will be applied in addition to, or in place of, +#' pre-existing elements defined by this theme. See the examples for this +#' theme's appearance. #' #' @return A `ggplot2` theme that can be added to `ggplot2` plots or objects. #' #' @keywords plotting #' +#' @examples +#' # using an inbuilt dataset +#' data(mtcars) +#' +#' # standard theme +#' ggplot2::ggplot(mtcars, ggplot2::aes(disp, mpg)) + +#' ggplot2::geom_point() + +#' theme_vimc() +#' +#' # with X-axis suppression +#' ggplot2::ggplot(mtcars, ggplot2::aes(disp, mpg)) + +#' ggplot2::geom_point() + +#' theme_vimc_noxaxis() +#' #' @export theme_vimc <- function(x_text_angle = 45, y_text_angle = 0, ...) { ggplot2::theme_bw() + @@ -34,24 +49,41 @@ theme_vimc <- function(x_text_angle = 45, y_text_angle = 0, ...) { ) } +#' @name plotting_theme +#' +#' @importFrom ggplot2 '%+replace%' +#' +#' @export +theme_vimc_noxaxis <- function() { + theme_vimc() %+replace% + ggplot2::theme( + axis.title.x = ggplot2::element_blank(), + axis.text.x = ggplot2::element_blank(), + axis.ticks.x = ggplot2::element_blank() + ) +} + #' Plot burden and impact diagnostics #' #' @name plotting #' @rdname plotting #' -#' @importFrom ggplot2 ggplot +#' @importFrom ggplot2 ggplot aes geom_col geom_hline facet_wrap facet_grid +#' scale_fill_distiller scale_x_continuous scale_y_continuous labs vars +#' labeller label_wrap_gen #' #' @description -#' Plotting functions for burden and impact diagnostics. This documentation -#' holds all plotting functions for now. +#' Plotting functions for burden and impact diagnostics. All functions operate +#' on data prepared for plotting by a corresponding +#' [plotting-preparation function][plotting_prep]. +#' +#' @param fig_number The figure number displayed in the plot title. #' #' @param data A `` that gives the comparison between VIMC-provided -#' and modeller-used demography values, in long-format. This is primarily -#' expected to be the output of `check_demography_alignment()` processed by +#' and modeller-used demography values, in long-format. This is expected to be +#' the output of `check_demography_alignment()` processed by #' `prep_plot_demography()`. #' -#' @param fig_number The figure number. -#' #' @return A `` object that can be printed to screen in the plot frame #' or saved to an output device (i.e., saved as an image file). #' @@ -63,18 +95,21 @@ plot_compare_demography <- function(data, fig_number) { checkmate::assert_tibble(data) checkmate::assert_count(fig_number, positive = TRUE) # no zeros allowed + n_cols_allowed <- 3 + num_countries <- length(unique(data$country)) + # TODO: use .data and .vars, import or namespace functions g <- ggplot( - data = data, - aes(x = year, y = millions, fill = age) + data, + aes(.data$year, .data$value_millions, fill = .data$age) ) + geom_col() + - facet_wrap(~ scenario + variable, ncol = 3) + + facet_wrap(vars(.data$scenario, .data$variable), ncol = n_cols_allowed) + scale_fill_distiller(palette = "PuOr") + geom_hline(yintercept = 0, colour = "red") + labs( x = "calendar year", - y = "people (in millions", + y = "people (in millions)", title = glue::glue( "Fig. {fig_number}. Comparison between interpolated population and \\ cohort size ({num_countries} countries)." @@ -88,7 +123,8 @@ plot_compare_demography <- function(data, fig_number) { #' @name plotting #' #' @param burden_age A `` with the minimum column names -#' "age", "millions" +#' "age", "value_millions", "burden_outcome", and "scenario"; expected to be the +#' output of [prep_plot_age()]. #' #' @export plot_age_patterns <- function(burden_age, fig_number) { @@ -97,14 +133,16 @@ plot_age_patterns <- function(burden_age, fig_number) { max_age <- max(burden_age$age) + 1 - g <- ggplot(burden_age, aes(x = age, y = value_millions)) + + g <- ggplot(burden_age, aes(.data$age, .data$value_millions)) + geom_col() + facet_grid( - burden_outcome ~ scenario, + vars(.data$burden_outcome), + vars(.data$scenario), scales = "free_y", labeller = labeller(scenario = label_wrap_gen(10)) ) + - coord_cartesian(xlim = c(NA_real_, max_age)) + # no lower limit, expect > 0 + # TODO: check if needed if max age comes from data + ggplot2::coord_cartesian(xlim = c(NA_real_, max_age)) + labs( y = "people (in millions)", title = glue::glue( @@ -119,30 +157,27 @@ plot_age_patterns <- function(burden_age, fig_number) { #' @name plotting #' #' @param burden_decades A `` giving the burden by decade, up to -#' `year_max`. This should be the output of [prep_plot_burden_decades()]. +#' `year_max`; expected to be the output of [prep_plot_burden_decades()]. #' #' @export plot_global_burden_decades <- function(burden_decades, fig_number) { g <- ggplot( burden_decades, - aes(x = scenario, y = millions, fill = scenario) + aes(.data$scenario, .data$value_millions, fill = .data$scenario) ) + geom_col() + - facet_grid(burden_outcome ~ decade_label, scales = "free_y") + + facet_grid( + vars(.data$burden_outcome), + vars(.data$decade_label), + scales = "free_y" + ) + labs( y = "people (in millions)", title = glue::glue( "Fig. {fig_number}. Global disease burden trends" ) ) + - - # TODO: reconcile with theme_vimc() or make new theme - theme_bw() %+replace% - theme( - axis.title.x = element_blank(), - axis.text.x = element_blank(), - axis.ticks.x = element_blank() - ) + theme_vimc_noxaxis() g } @@ -165,11 +200,11 @@ plot_global_burden <- function(burden_data, outcome_name, fig_number) { g <- ggplot( burden_data, - aes(year, millions, fill = age) + aes(.data$year, .data$value_millions, fill = .data$age) ) + geom_col() + facet_grid( - ~scenario, + cols = vars(.data$scenario), # this plot facets as cols only, w/ 1 row scales = "free_y", labeller = labeller( scenario = label_wrap_gen(scenarios_per_gridcol) @@ -194,9 +229,9 @@ plot_global_burden <- function(burden_data, outcome_name, fig_number) { #' [prep_plot_coverage_set()]. #' #' @export -plot_coverage_set <- function(coverage_set, figure_number) { +plot_coverage_set <- function(coverage_set, fig_number) { checkmate::assert_tibble(coverage_set) - checkmate::assert_count(figure_number) + checkmate::assert_count(fig_number) dodge_width <- 0.9 col_opacity <- 0.7 @@ -206,16 +241,16 @@ plot_coverage_set <- function(coverage_set, figure_number) { g <- ggplot( coverage_set, - aes(x = year, y = coverage, fill = delivery) + aes(.data$year, .data$coverage, fill = .data$delivery) ) + geom_col( # TODO: check if dodging is really needed - position = position_dodge(dodge_width), + position = ggplot2::position_dodge(dodge_width), alpha = col_opacity ) + facet_grid( - rows = vars(country), - cols = vars(scenario_description), + vars(.data$country), + vars(.data$scenario_description), scales = "free_y", labeller = labeller( scenario_description = label_wrap_gen(scenarios_per_gridcol) @@ -226,7 +261,7 @@ plot_coverage_set <- function(coverage_set, figure_number) { x = "calendar year", y = "Proportion of target population", title = glue::glue( - "Fig. {figure_number}: Coverage sets for {disease_name}" + "Fig. {fig_number}: Coverage sets for {disease_name}" ) ) + theme_vimc(90) @@ -236,14 +271,14 @@ plot_coverage_set <- function(coverage_set, figure_number) { #' @name plotting #' -#' @param fvp_data A `` of estimates of fully-vaccinated persons (FVPs) per -#' scenario, with scenarios as factors in order of the number of adjusted-FVPs. -#' Expected to be the output of [prep_plot_fvp()]. +#' @param fvp_data A `` of estimates of fully-vaccinated persons (FVPs) +#' per scenario, with scenarios as factors in order of the number of +#' adjusted-FVPs. Expected to be the output of [prep_plot_fvp()]. #' #' @export -plot_fvp <- function(fvp_data, figure_number) { +plot_fvp <- function(fvp_data, fig_number) { checkmate::assert_tibble(fvp_data) - checkmate::assert_count(figure_number) + checkmate::assert_count(fig_number) scenarios_per_gridcol <- 10 scale_millions <- 1e-6 @@ -251,17 +286,16 @@ plot_fvp <- function(fvp_data, figure_number) { g <- ggplot( fvp_data, - aes(x = year, y = fvp, fill = scenario) + aes(.data$year, .data$fvp) ) + geom_col( fill = "midnightblue" ) + facet_grid( - ~scenario, + cols = vars(.data$scenario), scales = "free_y", labeller = labeller(scenario = label_wrap_gen(scenarios_per_gridcol)) ) + - scale_x_continuous() + scale_y_continuous( labels = scales::label_number(scale = scale_millions) ) + @@ -269,7 +303,7 @@ plot_fvp <- function(fvp_data, figure_number) { x = "calendar year", y = "FVP (in millions)", title = glue::glue( - "Fig. {figure_number}: Fully Vaccinated Persons at global level by \\ + "Fig. {fig_number}: Fully Vaccinated Persons at global level by \\ scenario for {disease_name}" ) ) + From cc69283874928907835737ec2b220459b69cb718 Mon Sep 17 00:00:00 2001 From: Pratik Gupte Date: Thu, 22 Jan 2026 14:59:24 +0000 Subject: [PATCH 5/9] Add constants --- R/constants.R | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/R/constants.R b/R/constants.R index f435b5d..a504312 100644 --- a/R/constants.R +++ b/R/constants.R @@ -21,3 +21,22 @@ scenario_data_colnames <- c( "scenario", "scenario_description" ) + +#' @name constants +burden_outcome_names <- c( + "cases", + "deaths", + "dalys", + "yll" +) + +#' @name constants +colnames_plot_demog_compare <- c( + "variable", + "scenario", + "year", + "age", + "country", + "value", + "value_millions" +) From 0e2ccaf4d0aa9a10bc972bc89d4fb79493dbe4fa Mon Sep 17 00:00:00 2001 From: Pratik Gupte Date: Thu, 22 Jan 2026 15:00:02 +0000 Subject: [PATCH 6/9] Add scenario colm to burden example --- data-raw/eg_burden_template.R | 16 ++++++++++++++-- data/eg_burden_template.rda | Bin 1735 -> 97771 bytes 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/data-raw/eg_burden_template.R b/data-raw/eg_burden_template.R index 8a01443..fd6079f 100644 --- a/data-raw/eg_burden_template.R +++ b/data-raw/eg_burden_template.R @@ -1,7 +1,19 @@ ## code to prepare `eg_burden_template` dataset goes here -library(readr) +eg_burden_template <- readr::read_csv( + "inst/extdata/central-burden-template.csv" +) -eg_burden_template <- read_csv("inst/extdata/central-burden-template.csv") +# assign dummy cohort size value from random draw +# 10e6 is the value in `eg_wpp`, allow negative differences +eg_burden_template$cohort_size <- withr::with_seed( + 1, + rnorm(nrow(eg_burden_template), 10e6, 1e4) +) + +eg_burden_template <- tidyr::crossing( + eg_burden_template, + scenario = c("disease_rout", "No vaccination") +) usethis::use_data(eg_burden_template, overwrite = TRUE) diff --git a/data/eg_burden_template.rda b/data/eg_burden_template.rda index 0619a98058705c301756ab0378f76f9be2a49fcb..20407a8e0ce89f972ce0cf4c8db8e6f07f6f1237 100644 GIT binary patch literal 97771 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≶j4Wsi#qBu%aV}SBwMxB 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 SK(d(kD?bqi? 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 ZJH(ri)v9l~v~fT9yOJrwgn~RkL_lfSs8Ij_ literal 1735 zcmb_bdr%W+5I-V8U|<9^i6T?eo1DXiSBN+kP#S1Xj~Ib)MC7GN1BLh+5U|7tNI}6< zn~QM-6H!BWgjX?uJVdZGI>85Gh%kz+h<1>d)(2{(gm3-i9E;+6>?pOgfwE_3_r!_C1Eidtoq9VmBjJcqcfQu%O1So{Zi!v!lt^yx zyw!?lwCARjR3y) zG0IquTqn|=Y+i&HgC=6PBzBap#?OLJ(YA0;H6D(bi3~}!-Xn$Hj`t85+PEyn2snXW z;(D2oX|ywo@dBKYY%$~0M7F}~4RW8@DT&e1pCKx+huFo68Kuu4uT5vg@Nn5`NyTyH z`|c2%(C@$@w8NLt4L(9Uq8PWpVYEf>{wqBX{}y~N*%FIS68m3zy5J|sgGNbg6kUlQ z1N(@tjBQ-65<~~~5>jJFA-$1wA2+r-c^dG5TSO9i@uf#2z74#O>iyI-qFzJ&QZ;aoZ#%nm zI!?>0^K!`-i{*K42Y6MdZeF*hy=_lQcT0q*zV)`cbSX1({dp0kL8Z`8w`J2;x3R6e zknrkqWq*z+iCq?M!W_fa>IXfv6&v6xwzUas8c4c*z7;NWaC1`2Ojsd&t4WXfISY0Q zwri+TavBtvQ!(TX_lqd4N?xr(MdCuCAOTBnRGKiSBBh}m3J4+RCIMrWLtH_ovp_nB zz2V6OELf;0Qg*Yif(9Zp&Dics|0~7fP2dgrDCFzUFX!h@lD=fPj~C3v{!fLn5#m4z z*guGH738N1M{5;Dwz?hAsxq!Z9lQbZQI5t7$n4cB*MreEF$$I9w3bZ%!}M2?*~4>x zAXCcR2(8X{aATg-W2}nMdJ(0=R6uKVYB8xyrxhiyVA$LZ>oGQ2E%Mt`bUtqi-arN` zhCYAjS3v83pnRYluRIthc5tiKV}n1D1$#81q3$J{v@DY5;MO}(Y$nTU=G7g+DmB#f zCP5msqL6QE!fG_sj26=FmCCohovEQ7Sn1#(9*8Y#1PSs|8kIwA1-pa|;RQR0c?%?+>#V9GIfyB7&7xDGQ1!{#0 zZJL|6f;m6+YRvxMa)m?~agr7h=9jgLb?9m1nIY<@ztpT}3mkX0K6V+FZn6U}cAW#y zN!uR>O$eRW9ZoYW*nV*Gi;Z^A?HcwjCpeBwx#lWLrCzSyxA2h7ns0)SrL7No1sC<~ g7Fp6{yxf9irEfxbyV0_vyR-3DQ0 Date: Thu, 22 Jan 2026 15:00:31 +0000 Subject: [PATCH 7/9] Update docs and data desc --- R/example_data.R | 3 ++- man/constants.Rd | 10 ++++++++ man/eg_burden_template.Rd | 3 ++- man/plotting.Rd | 44 +++++++++++++++++++------------- man/plotting_prep.Rd | 53 +++++++++++++++++++++++++++++++++++++++ man/plotting_theme.Rd | 27 +++++++++++++++++--- 6 files changed, 118 insertions(+), 22 deletions(-) create mode 100644 man/plotting_prep.Rd diff --git a/R/example_data.R b/R/example_data.R index 391eee0..c62f89a 100644 --- a/R/example_data.R +++ b/R/example_data.R @@ -24,7 +24,7 @@ #' groups. #' #' @format ## `eg_burden_template` -#' A data frame with 10,201 rows and 10 columns: +#' A data frame with 10,201 rows and 11 columns: #' \describe{ #' \item{disease}{Disease name} #' \item{year}{Year} @@ -36,6 +36,7 @@ #' \item{deaths}{Deaths averted}. #' \item{yll}{Years of life-loss averted}. #' \item{cohort_size}{Population size of the country in a year}. +#' \itme{scenario}{Vaccination scenario.} #' } #' #' @keywords data diff --git a/man/constants.Rd b/man/constants.Rd index f941ee0..05e15b7 100644 --- a/man/constants.Rd +++ b/man/constants.Rd @@ -5,16 +5,26 @@ \alias{constants} \alias{file_dict_colnames} \alias{scenario_data_colnames} +\alias{burden_outcome_names} +\alias{colnames_plot_demog_compare} \title{Package constants} \format{ An object of class \code{character} of length 5. An object of class \code{character} of length 4. + +An object of class \code{character} of length 4. + +An object of class \code{character} of length 7. } \usage{ file_dict_colnames scenario_data_colnames + +burden_outcome_names + +colnames_plot_demog_compare } \description{ Package constants diff --git a/man/eg_burden_template.Rd b/man/eg_burden_template.Rd index 2e30c00..d8aba86 100644 --- a/man/eg_burden_template.Rd +++ b/man/eg_burden_template.Rd @@ -7,7 +7,7 @@ \format{ \subsection{\code{eg_burden_template}}{ -A data frame with 10,201 rows and 10 columns: +A data frame with 10,201 rows and 11 columns: \describe{ \item{disease}{Disease name} \item{year}{Year} @@ -19,6 +19,7 @@ A data frame with 10,201 rows and 10 columns: \item{deaths}{Deaths averted}. \item{yll}{Years of life-loss averted}. \item{cohort_size}{Population size of the country in a year}. +\itme{scenario}{Vaccination scenario.} } } } diff --git a/man/plotting.Rd b/man/plotting.Rd index 49a6f7a..fe1abc0 100644 --- a/man/plotting.Rd +++ b/man/plotting.Rd @@ -10,40 +10,50 @@ \alias{plot_fvp} \title{Plot burden and impact diagnostics} \usage{ -plot_compare_demography(d, fig_number) +plot_compare_demography(data, fig_number) -plot_age_patterns(burden, fig_number) +plot_age_patterns(burden_age, fig_number) -plot_global_burden_decades(burden, year_max, fig_number) +plot_global_burden_decades(burden_decades, fig_number) -plot_global_burden(d, outcome, fig_number) +plot_global_burden(burden_data, outcome_name, fig_number) -plot_coverage_set(cov, figure_number) +plot_coverage_set(coverage_set, fig_number) -plot_fvp(fvp, year_min, year_max, figure_number) +plot_fvp(fvp_data, fig_number) } \arguments{ -\item{d}{} +\item{data}{A \verb{} that gives the comparison between VIMC-provided +and modeller-used demography values, in long-format. This is expected to be +the output of \code{check_demography_alignment()} processed by +\code{prep_plot_demography()}.} -\item{fig_number}{} +\item{fig_number}{The figure number displayed in the plot title.} -\item{burden}{} +\item{burden_age}{A \verb{} with the minimum column names +"age", "value_millions", "burden_outcome", and "scenario"; expected to be the +output of \code{\link[=prep_plot_age]{prep_plot_age()}}.} -\item{year_max}{} +\item{burden_decades}{A \verb{} giving the burden by decade, up to +\code{year_max}; expected to be the output of \code{\link[=prep_plot_burden_decades]{prep_plot_burden_decades()}}.} -\item{outcome}{} +\item{burden_data}{This is expected to be a \verb{} from a +nested-\verb{} constructed using \code{\link[=prep_plot_global_burden]{prep_plot_global_burden()}}.} -\item{cov}{} +\item{coverage_set}{A \verb{} that is the output of +\code{\link[=prep_plot_coverage_set]{prep_plot_coverage_set()}}.} -\item{fvp}{} - -\item{year_min}{} +\item{fvp_data}{A \verb{} of estimates of fully-vaccinated persons (FVPs) +per scenario, with scenarios as factors in order of the number of +adjusted-FVPs. Expected to be the output of \code{\link[=prep_plot_fvp]{prep_plot_fvp()}}.} } \value{ A \verb{} object that can be printed to screen in the plot frame or saved to an output device (i.e., saved as an image file). } \description{ -Plotting functions for burden and impact diagnostics. This documentation -holds all plotting functions for now. +Plotting functions for burden and impact diagnostics. All functions operate +on data prepared for plotting by a corresponding +\link[=plotting_prep]{plotting-preparation function}. } +\keyword{plotting} diff --git a/man/plotting_prep.Rd b/man/plotting_prep.Rd new file mode 100644 index 0000000..c127fc3 --- /dev/null +++ b/man/plotting_prep.Rd @@ -0,0 +1,53 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plotting_prep.R +\name{plotting_prep} +\alias{plotting_prep} +\alias{prep_plot_demography} +\alias{prep_plot_age} +\alias{prep_plot_burden_decades} +\alias{prep_plot_global_burden} +\alias{prep_plot_coverage_set} +\alias{prep_plot_fvp} +\title{Prepare data for plotting} +\usage{ +prep_plot_demography(burden) + +prep_plot_age(burden) + +prep_plot_burden_decades(burden, year_max) + +prep_plot_global_burden(burden) + +prep_plot_coverage_set(coverage) + +prep_plot_fvp(fvp, year_min, year_max) +} +\arguments{ +\item{burden}{For \code{prep_plot_demography()}, a \verb{} output from +\code{\link[=check_demography_alignment]{check_demography_alignment()}}. + +For \code{prep_plot_age()}, ... ADD DETAILS. + +For \code{prep_plot_burden_decades()}, ... ADD DETAILS. + +For \code{prep_plot_global_burden()}, ... ADD DETAILS.} + +\item{year_max}{} + +\item{coverage}{} + +\item{fvp}{} + +\item{year_min}{} +} +\value{ +\itemize{ +\item For \code{prep_plot_demography()}: a \verb{} in long-format, with the +identifier-columns, "scenario", "age", and "year", with the added column +"value_millions". +\item For \code{prep_plot_age()}: +} +} +\description{ +Convert the output of \code{\link[=check_demography_alignment]{check_demography_alignment()}} to a long-format tibble. +} diff --git a/man/plotting_theme.Rd b/man/plotting_theme.Rd index 80fcf2e..c2c49e0 100644 --- a/man/plotting_theme.Rd +++ b/man/plotting_theme.Rd @@ -3,17 +3,22 @@ \name{plotting_theme} \alias{plotting_theme} \alias{theme_vimc} +\alias{theme_vimc_noxaxis} \title{Plotting theme for vimcheck} \usage{ theme_vimc(x_text_angle = 45, y_text_angle = 0, ...) + +theme_vimc_noxaxis() } \arguments{ -\item{x_text_angle}{} +\item{x_text_angle}{The angle for X-axis labels. Defaults to 45 degrees.} -\item{y_text_angle}{} +\item{y_text_angle}{The angle for Y-axis labels. Defaults to 0 degrees.} \item{...}{<\code{\link[rlang:dyn-dots]{dynamic-dots}}> Other arguments passed to -\code{\link[ggplot2:theme]{ggplot2::theme()}}.} +\code{\link[ggplot2:theme]{ggplot2::theme()}}. These will be applied in addition to, or in place of, +pre-existing elements defined by this theme. See the examples for this +theme's appearance.} } \value{ A \code{ggplot2} theme that can be added to \code{ggplot2} plots or objects. @@ -21,3 +26,19 @@ A \code{ggplot2} theme that can be added to \code{ggplot2} plots or objects. \description{ A simple plotting theme building on \code{\link[ggplot2:ggtheme]{ggplot2::theme_bw()}}. } +\examples{ +# using an inbuilt dataset +data(mtcars) + +# standard theme +ggplot2::ggplot(mtcars, ggplot2::aes(disp, mpg)) + + ggplot2::geom_point() + + theme_vimc() + +# with X-axis suppression +ggplot2::ggplot(mtcars, ggplot2::aes(disp, mpg)) + + ggplot2::geom_point() + + theme_vimc_noxaxis() + +} +\keyword{plotting} From fd17892a03db2a1ad3eabd63b574f1cd1ac06120 Mon Sep 17 00:00:00 2001 From: Pratik Gupte Date: Thu, 22 Jan 2026 15:00:58 +0000 Subject: [PATCH 8/9] Initial tests for plotting prep and plots --- .../testthat/_snaps/plotting/a-blank-plot.svg | 61612 ++++++++++++++++ tests/testthat/test-burden_diagnostics.R | 3 +- tests/testthat/test-plotting.R | 12 + tests/testthat/test-plotting_prep.R | 43 + 4 files changed, 61669 insertions(+), 1 deletion(-) create mode 100644 tests/testthat/_snaps/plotting/a-blank-plot.svg create mode 100644 tests/testthat/test-plotting.R create mode 100644 tests/testthat/test-plotting_prep.R diff --git a/tests/testthat/_snaps/plotting/a-blank-plot.svg b/tests/testthat/_snaps/plotting/a-blank-plot.svg new file mode 100644 index 0000000..218fd5f --- /dev/null +++ b/tests/testthat/_snaps/plotting/a-blank-plot.svg @@ -0,0 +1,61612 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +disease_rout + + + + + + + + + + +expected + + + + + + + + + + +disease_rout + + + + + + + + + + +provided + + + + + + + + + + +disease_rout + + + + + + + + + + +difference + + + + + + + + + + +No vaccination + + + + + + + + + + +expected + + + + + + + + + + +No vaccination + + + + + + + + + + +provided + + + + + + + + + + +No vaccination + + + + + + + + + + +difference + + + + + + + +2000 +2025 +2050 +2075 +2100 + + + + + +2000 +2025 +2050 +2075 +2100 + + + + + +2000 +2025 +2050 +2075 +2100 +0 +250 +500 +750 +1000 + + + + + +0 +250 +500 +750 +1000 + + + + + +calendar year +people (in millions) + +age + + + + + + + + + + + +0 +25 +50 +75 +100 +Fig. 1. Comparison between interpolated population and cohort size (1 countries). + + diff --git a/tests/testthat/test-burden_diagnostics.R b/tests/testthat/test-burden_diagnostics.R index 074fae2..be94ae2 100644 --- a/tests/testthat/test-burden_diagnostics.R +++ b/tests/testthat/test-burden_diagnostics.R @@ -244,7 +244,8 @@ test_that("`check_demography_alignment()` works", { "expected", "difference", "abs_diff", - "prop_diff" + "prop_diff", + "scenario" ) checkmate::expect_tibble( diff --git a/tests/testthat/test-plotting.R b/tests/testthat/test-plotting.R new file mode 100644 index 0000000..dc8d6d6 --- /dev/null +++ b/tests/testthat/test-plotting.R @@ -0,0 +1,12 @@ +test_that("plot_compare_demography() works", { + burden <- eg_burden_template + + burden <- check_demography_alignment(burden, eg_wpp) + burden <- prep_plot_demography(burden) + + p <- plot_compare_demography(burden, 1) + + checkmate::expect_class(p, "ggplot") + + vdiffr::expect_doppelganger("A blank plot", p) +}) diff --git a/tests/testthat/test-plotting_prep.R b/tests/testthat/test-plotting_prep.R new file mode 100644 index 0000000..900047b --- /dev/null +++ b/tests/testthat/test-plotting_prep.R @@ -0,0 +1,43 @@ +test_that("prep_plot_demography() works ", { + burden <- eg_burden_template + + x <- check_demography_alignment(burden, eg_wpp) + y <- prep_plot_demography(x) + + checkmate::expect_tibble(y) + checkmate::expect_names( + colnames(y), + must.include = colnames_plot_demog_compare + ) +}) + +skip("Skipped while tests are written") +test_that("prep_plot_age() works ", { + checkmate::expect_tibble( + prep_plot_age(x) + ) +}) + +test_that("prep_plot_burden_decades() works ", { + checkmate::expect_tibble( + prep_plot_burden_decades(x) + ) +}) + +test_that("prep_plot_global_burden() works ", { + checkmate::expect_tibble( + prep_plot_global_burden(x) + ) +}) + +test_that("prep_plot_coverage_set() works ", { + checkmate::expect_tibble( + prep_plot_coverage_set(x) + ) +}) + +test_that("prep_plot_fvp() works ", { + checkmate::expect_tibble( + prep_plot_fvp(x) + ) +}) From 1c10efbf9be5f700e8e9ea915e58a87340ea96fd Mon Sep 17 00:00:00 2001 From: Pratik Gupte Date: Thu, 22 Jan 2026 15:01:38 +0000 Subject: [PATCH 9/9] Update pkg infra --- DESCRIPTION | 3 ++- NAMESPACE | 20 ++++++++++++++++++++ NEWS.md | 12 ++++++++++++ _pkgdown.yml | 7 +++++-- 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4136b55..1f3b3cf 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: vimcheck Title: Diagnostics for Vaccine Impact Modelling Consortium Burden and Impact Estimates -Version: 0.0.1 +Version: 0.0.3 Authors@R: c( person("Pratik", "Gupte", , "p.gupte24@imperial.ac.uk", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-5294-7819")), @@ -38,6 +38,7 @@ Suggests: spelling, testthat (>= 3.0.0), tibble, + vdiffr, withr VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index cb081b7..1701229 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -10,10 +10,30 @@ export(plot_coverage_set) export(plot_fvp) export(plot_global_burden) export(plot_global_burden_decades) +export(prep_plot_age) +export(prep_plot_burden_decades) +export(prep_plot_coverage_set) +export(prep_plot_demography) +export(prep_plot_fvp) +export(prep_plot_global_burden) export(theme_vimc) +export(theme_vimc_noxaxis) export(transform_coverage_fvps) export(validate_complete_incoming_files) export(validate_file_dict_template) export(validate_template_alignment) importFrom(dplyr,.data) +importFrom(ggplot2,'%+replace%') +importFrom(ggplot2,aes) +importFrom(ggplot2,facet_grid) +importFrom(ggplot2,facet_wrap) +importFrom(ggplot2,geom_col) +importFrom(ggplot2,geom_hline) importFrom(ggplot2,ggplot) +importFrom(ggplot2,label_wrap_gen) +importFrom(ggplot2,labeller) +importFrom(ggplot2,labs) +importFrom(ggplot2,scale_fill_distiller) +importFrom(ggplot2,scale_x_continuous) +importFrom(ggplot2,scale_y_continuous) +importFrom(ggplot2,vars) diff --git a/NEWS.md b/NEWS.md index b12099e..7f633fc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,15 @@ +# vimcheck 0.0.3 + +- Separated data-prep for plotting from plotting functions. + +- Added tests for plotting preparation and plotting functions. + +# vimcheck 0.0.2 + +- Added initial data validation functions and some tests. + +- Added VIMC _ggplot2_ theme. + # vimcheck 0.0.1 - Added GHA workflows to notify of changed dependencies, auto-render `README.md` from `README.Rmd`, and update the copyright year annually. diff --git a/_pkgdown.yml b/_pkgdown.yml index e6c1415..bbc0826 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -1,6 +1,5 @@ # NOTE: Update the `url` field as needed -# e.g. "https://vimc.github.io/vimpact/" -url: ~ +url: "https://vimc.github.io/vimcheck/" template: bootstrap: 5 @@ -12,6 +11,10 @@ reference: desc: Package diagnostic functions. contents: - has_keyword("diagnostics") + - title: Plotting prepartion + desc: Prepare validated data for plotting. + contents: + - plotting_prep - title: Plotting functions desc: Package plotting functions. contents: