From 0fb064eda04a6a84752b5756c7055ddc77d5924a Mon Sep 17 00:00:00 2001 From: Snook Date: Thu, 5 Jan 2023 11:42:21 +0000 Subject: [PATCH 01/85] corrected spelling mistakes in documentation --- R/plot.R | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/R/plot.R b/R/plot.R index 6914a2f..17d68a3 100644 --- a/R/plot.R +++ b/R/plot.R @@ -6,7 +6,7 @@ #'Incomplete validation checks: some combinations of number of plots and number of rows/columns will fail: #'Each column should contain at least two charts. #' -#'@param data Frequency table (data frame). Expects a tidy dataset with 3 columns: factor 1 (categorical axes), factor 2 (one plot per factor level) and values. +#'@param data Frequency table (data frame). Expects a tidy data set with 3 columns: factor 1 (categorical axes), factor 2 (one plot per factor level) and values. #'@param xlab X axis title #'@param ylab Y axis title #'@param height plot height in pixels @@ -16,13 +16,14 @@ #'@param x_margin margin between columns (chart proportion). 0.1 by default. #'@param bar_colour Colour name. Defaults to blue (see carsurvey2::get_gradient()) #'@param font_size minimum font size for the plot (numeric). -#'@param orientation plot orientation ("h" = horizontal, "v" = verical). Vertical by default +#'@param orientation plot orientation ("h" = horizontal, "v" = vertical). Vertical by default #' #'@return subplots #' #'@export -freq_subplots <- function(data, xlab, ylab, height, width, bar_colour, nrows = 3, y_margin = .1, x_margin = .1, font_size = 12, orientation = "h") { +freq_subplots <- function(data, xlab, ylab, height, width, bar_colour, nrows = 3, + y_margin = .1, x_margin = .1, font_size = 12, orientation = "h") { if (nrows == 1) { stop("Unexpected input: n_rows should be 2 or greater.") @@ -118,7 +119,7 @@ freq_subplots <- function(data, xlab, ylab, height, width, bar_colour, nrows = 3 #'@param xlab X axis title (optional) #'@param ylab Y axis title (optional) #'@param font_size minimum font size for the plot (numeric). -#'@param orientation plot orientation ("h" = horizontal, "v" = verical). Vertical by default +#'@param orientation plot orientation ("h" = horizontal, "v" = vertical). Vertical by default #'@param ... additional plotly_ly arguments #' #'@return bar chart @@ -228,7 +229,7 @@ plot_freqs <- function(data, n, bar_colour, break_q_names_col, max_lines = 2, x #'@param colour_scale type of colour scale ("gradient", "scale" or "2gradients"). See get_gradient(), get_2colour_scale() and get_2colour_gradients(). #'@param font_size minimum font size for the plot (numeric). #'@param neutral_mid whether the midpoint of the colour scale should be neutral ("2gradients" scale only). TRUE by default -#'@param orientation plot orientation ("h" = horizontal, "v" = verical). Vertical by default +#'@param orientation plot orientation ("h" = horizontal, "v" = vertical). Vertical by default #'@param ... additional plotly_ly arguments #' #'@return bar chart @@ -356,7 +357,7 @@ plot_stacked <- function(data, n, break_q_names_col, max_lines = 2, xlab = "", y #'@param xlab X axis title #'@param ylab Y axis title #'@param font_size minimum font size for the plot (numeric). -#'@param orientation plot orientation ("h" = horizontal, "v" = verical). Vertical by default. +#'@param orientation plot orientation ("h" = horizontal, "v" = vertical). Vertical by default. #'@param ... additional plotly_ly arguments #' #'@return bar chart From 3ea3e2807d8abbf437a6ae2f226f6367ac0efe39 Mon Sep 17 00:00:00 2001 From: Snook Date: Thu, 5 Jan 2023 14:27:38 +0000 Subject: [PATCH 02/85] added basic output tests for freq_subplots --- R/plot.R | 5 +++-- tests/testthat/test-freq_subplots.R | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 tests/testthat/test-freq_subplots.R diff --git a/R/plot.R b/R/plot.R index 17d68a3..8f9c5ac 100644 --- a/R/plot.R +++ b/R/plot.R @@ -16,7 +16,7 @@ #'@param x_margin margin between columns (chart proportion). 0.1 by default. #'@param bar_colour Colour name. Defaults to blue (see carsurvey2::get_gradient()) #'@param font_size minimum font size for the plot (numeric). -#'@param orientation plot orientation ("h" = horizontal, "v" = vertical). Vertical by default +#'@param orientation plot orientation ("h" = horizontal, "v" = vertical). Horizonal by default #' #'@return subplots #' @@ -126,7 +126,8 @@ freq_subplots <- function(data, xlab, ylab, height, width, bar_colour, nrows = 3 #' #'@export -plot_freqs <- function(data, n, bar_colour, break_q_names_col, max_lines = 2, xlab = "", ylab = "", font_size = 12, orientation = c("v", "h"), ...) { +plot_freqs <- function(data, n, bar_colour, break_q_names_col, max_lines = 2, + xlab = "", ylab = "", font_size = 12, orientation = c("v", "h"), ...) { # Set default bar colour if (missing(bar_colour)) { diff --git a/tests/testthat/test-freq_subplots.R b/tests/testthat/test-freq_subplots.R new file mode 100644 index 0000000..eb94bc3 --- /dev/null +++ b/tests/testthat/test-freq_subplots.R @@ -0,0 +1,29 @@ +levels1 <- c("test1", "test2", "test3") +levels2 <- c(1, 2, 3) + +dummy_data <- data.frame(Q1 = factor(c(rep("test1", 3), + rep("test2", 3), + rep("test3", 3)), + levels = levels1), + Q2 = factor(c(rep(c(1,2,3), 3)), + levels = levels2), + n = c(0, 0, 1, 1, 0, 0, 0, 1, 0)) + + +testthat::test_that("validity check works", + { + testthat::expect_error( + freq_subplots(dummy_data, xlab = "x", ylab = "y", + height = 20, width = 20, nrows = 1)) + }) + + +got <- freq_subplots(dummy_data, xlab = "x", ylab = "y", + height = 500, width = 300, nrows = 3, + y_margin = .3, x_margin = .3, orientation = "v") + +testthat::test_that("expected outputs achieved", + { + testthat::expect_equal(c(got$x$data[[1]]$x), factor(levels1, levels = levels1)) + testthat::expect_equal(c(got$x$data[[1]]$y), dummy_data[dummy_data$Q2 == 1, "n"]) + }) From aed0326f9afd53d19fc58a0b8ba9cfcaa7fa733f Mon Sep 17 00:00:00 2001 From: Snook Date: Thu, 5 Jan 2023 16:00:45 +0000 Subject: [PATCH 03/85] added tests for valid checks for plot_freqs --- tests/testthat/test-plot_freqs.R | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/testthat/test-plot_freqs.R diff --git a/tests/testthat/test-plot_freqs.R b/tests/testthat/test-plot_freqs.R new file mode 100644 index 0000000..50922c7 --- /dev/null +++ b/tests/testthat/test-plot_freqs.R @@ -0,0 +1,30 @@ +levels1 <- c("test1", "test2", "test3") + +dummy_data <- data.frame(Q1 = factor(c("test1","test2","test3"), + levels = levels1), + n = c(0.5, 0.2, 0.8)) + + +testthat::test_that("validity checks work", + { + testthat::expect_error(plot_freqs(dummy_data, bar_colour = c("blue", "green"))) + testthat::expect_error(plot_freqs(dummy_data, bar_colour = 1)) + testthat::expect_error(plot_freqs(as.list(dummy_data))) + testthat::expect_error(plot_freqs(dplyr::mutate(dummy_data, Q2 = Q1))) + testthat::expect_error(plot_freqs(dplyr::mutate(dummy_data, n = as.character(n)))) + testthat::expect_error(plot_freqs(dummy_data, xlab = 1)) + testthat::expect_error(plot_freqs(dummy_data, ylab = 1)) + testthat::expect_error(plot_freqs(dummy_data, xlab = c("1", "2"))) + testthat::expect_error(plot_freqs(dummy_data, ylab = c("1", "2"))) + testthat::expect_error(plot_freqs(dummy_data, font_size = "x")) + }) + + + +# got <- plot_freqs(dummy_data, xlab = "x", ylab = "y") +# +# testthat::test_that("expected outputs achieved", +# { +# testthat::expect_equal(c(got$x$data[[1]]$x), factor(levels1, levels = levels1)) +# testthat::expect_equal(c(got$x$data[[1]]$y), dummy_data[dummy_data$Q2 == 1, "n"]) +# }) From 18eba6b6a218b227d550560be1138c18c07afb3c Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Tue, 28 Feb 2023 14:47:23 +0000 Subject: [PATCH 04/85] Updated plot_freqs unit test and documentation --- DESCRIPTION | 2 +- R/derive_vars.R | 4 +-- tests/testthat/test-plot_freqs.R | 61 +++++++++++++++++++++----------- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1aa8ad4..cf07dc4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -30,5 +30,5 @@ Suggests: Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) -RoxygenNote: 7.1.2 +RoxygenNote: 7.2.3 Config/testthat/edition: 3 diff --git a/R/derive_vars.R b/R/derive_vars.R index 4125340..158ad5e 100644 --- a/R/derive_vars.R +++ b/R/derive_vars.R @@ -35,9 +35,9 @@ derive_language_status <- function(data) { lang_list <- gsub("access_", "", lang_list) new_vars <- sapply(lang_list, function(lang) { - access_col <- data[paste0("access_", lang)] + access_col <- data[[paste0("access_", lang)]] - knowledge_col <- data[paste0("knowledge_", lang)] + knowledge_col <- data[[paste0("knowledge_", lang)]] dplyr::case_when(access_col == "Yes" & knowledge_col == "Yes" ~ "Both", access_col == "Yes" & knowledge_col != "Yes" ~ "Access Only", diff --git a/tests/testthat/test-plot_freqs.R b/tests/testthat/test-plot_freqs.R index 50922c7..f52c4ad 100644 --- a/tests/testthat/test-plot_freqs.R +++ b/tests/testthat/test-plot_freqs.R @@ -1,30 +1,51 @@ -levels1 <- c("test1", "test2", "test3") -dummy_data <- data.frame(Q1 = factor(c("test1","test2","test3"), - levels = levels1), +dummy_data <- data.frame(Q1 = factor(c("This is test number one", "This is test 2", "test3"), + levels = c("This is test number one", "This is test 2", "test3")), n = c(0.5, 0.2, 0.8)) testthat::test_that("validity checks work", { - testthat::expect_error(plot_freqs(dummy_data, bar_colour = c("blue", "green"))) - testthat::expect_error(plot_freqs(dummy_data, bar_colour = 1)) - testthat::expect_error(plot_freqs(as.list(dummy_data))) - testthat::expect_error(plot_freqs(dplyr::mutate(dummy_data, Q2 = Q1))) - testthat::expect_error(plot_freqs(dplyr::mutate(dummy_data, n = as.character(n)))) - testthat::expect_error(plot_freqs(dummy_data, xlab = 1)) - testthat::expect_error(plot_freqs(dummy_data, ylab = 1)) - testthat::expect_error(plot_freqs(dummy_data, xlab = c("1", "2"))) - testthat::expect_error(plot_freqs(dummy_data, ylab = c("1", "2"))) - testthat::expect_error(plot_freqs(dummy_data, font_size = "x")) + testthat::expect_error(plot_freqs(dummy_data, bar_colour = c("blue", "green")), "Unexpected input - bar_colour should be a single colour name.") + testthat::expect_error(plot_freqs(dummy_data, bar_colour = 1), "Unexpected input - bar_colour should be a single colour name.") + testthat::expect_error(plot_freqs(as.list(dummy_data)), "Unexpected input - data is not a data.frame.") + testthat::expect_error(plot_freqs(dplyr::mutate(dummy_data, Q2 = Q1)), "Unexpected input - data does not contain two columns.") + testthat::expect_error(plot_freqs(dplyr::mutate(dummy_data, n = as.character(n))), "Unexpected input - data column 2 is not numeric.") + testthat::expect_error(plot_freqs(dummy_data, xlab = 1), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_freqs(dummy_data, ylab = 1), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_freqs(dummy_data, xlab = c("1", "2")), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_freqs(dummy_data, ylab = c("1", "2")), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_freqs(dummy_data, font_size = "x"), "Unexpected input - font_size is not numeric.") }) +got <- plot_freqs(dummy_data, n = 100, xlab = "x", ylab = "y", break_q_names_col = TRUE) +testthat::test_that("expected outputs achieved", + { + # x and y values + testthat::expect_equal(c(got$x$attrs[[1]][[1]]), factor(c("This is test
number one", "This is test
2", "test3"), + levels = c("This is test
number one", "This is test
2", "test3"))) + testthat::expect_equal(c(got$x$attrs[[1]][[2]]), c(0.5, 0.2, 0.8)) + + # Bar colors + testthat::expect_equal(got$x$attrs[[1]][[3]][[1]], "#004556") + + # Plot orientation + testthat::expect_equal(got$x$attrs[[1]][[4]], "v") + + # Sample size + testthat::expect_equal(got$x$layoutAttrs[[1]][[5]][[3]], "Sample size = 100") -# got <- plot_freqs(dummy_data, xlab = "x", ylab = "y") -# -# testthat::test_that("expected outputs achieved", -# { -# testthat::expect_equal(c(got$x$data[[1]]$x), factor(levels1, levels = levels1)) -# testthat::expect_equal(c(got$x$data[[1]]$y), dummy_data[dummy_data$Q2 == 1, "n"]) -# }) + # Axis labels + testthat::expect_equal(got$x$layoutAttrs[[1]][[1]][[1]], "x") + testthat::expect_equal(got$x$layoutAttrs[[2]][[1]][[1]], "y") + + # Font sizes + testthat::expect_equal(got$x$layoutAttrs[[1]][[1]][[2]][[1]], 12) + testthat::expect_equal(got$x$layoutAttrs[[1]][[1]][[3]][[1]], 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]][[2]][[2]][[1]], 12) + testthat::expect_equal(got$x$layoutAttrs[[1]][[2]][[3]][[1]], 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]][[4]][[2]][[1]], 12) + testthat::expect_equal(got$x$layoutAttrs[[1]][[5]][[11]][[1]], 12) + + }) From 53f8c88665095b8107244da20977ddf665fb729a Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Tue, 28 Feb 2023 16:49:13 +0000 Subject: [PATCH 05/85] Updated freq_subplots unit test --- tests/testthat/test-freq_subplots.R | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/tests/testthat/test-freq_subplots.R b/tests/testthat/test-freq_subplots.R index eb94bc3..b59c76c 100644 --- a/tests/testthat/test-freq_subplots.R +++ b/tests/testthat/test-freq_subplots.R @@ -14,7 +14,8 @@ testthat::test_that("validity check works", { testthat::expect_error( freq_subplots(dummy_data, xlab = "x", ylab = "y", - height = 20, width = 20, nrows = 1)) + height = 20, width = 20, nrows = 1), + "Unexpected input: n_rows should be 2 or greater.") }) @@ -22,8 +23,23 @@ got <- freq_subplots(dummy_data, xlab = "x", ylab = "y", height = 500, width = 300, nrows = 3, y_margin = .3, x_margin = .3, orientation = "v") -testthat::test_that("expected outputs achieved", - { - testthat::expect_equal(c(got$x$data[[1]]$x), factor(levels1, levels = levels1)) - testthat::expect_equal(c(got$x$data[[1]]$y), dummy_data[dummy_data$Q2 == 1, "n"]) - }) +for(i in 1:length(unique(dummy_data[[2]]))){ + j = 2*i - 1 + testthat::test_that("expected outputs achieved", + { + # x values + testthat::expect_equal(c(got$x$data[[j]]$x), factor(levels1, levels = levels1)) + + # y values + testthat::expect_equal(c(got$x$data[[j]]$y), dummy_data[dummy_data$Q2 == i, "n"]) + + # Bar colors + testthat::expect_equal(got$x$data[[j]]$marker$color, "#004556") + + # Plot orientation + testthat::expect_equal(got$x$data[[j]]$orientation, "v") + + # Title + testthat::expect_equal(got$x$data[[j]]$title, factor(i, levels = c(1, 2, 3))) + }) +} From ba2c026972a5e4800d93d04264baabbbf6a74e65 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Wed, 1 Mar 2023 14:51:32 +0000 Subject: [PATCH 06/85] Added unit test for plot_stacked --- R/plot.R | 2 +- tests/testthat/test-plot_freqs.R | 26 +++++++-------- tests/testthat/test-plot_stacked.R | 52 ++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 tests/testthat/test-plot_stacked.R diff --git a/R/plot.R b/R/plot.R index 6d4ea88..b72119b 100644 --- a/R/plot.R +++ b/R/plot.R @@ -243,7 +243,7 @@ plot_stacked <- function(data, n, break_q_names_col, max_lines = 2, xlab = "", y if (!is.data.frame(data)) { stop("Unexpected input - data is not a data.frame.") } else if (ncol(data) != 3) { - stop("Unexpected input - data should have three columns") + stop("Unexpected input - data should have three columns.") } # Validate labels diff --git a/tests/testthat/test-plot_freqs.R b/tests/testthat/test-plot_freqs.R index f52c4ad..d732a86 100644 --- a/tests/testthat/test-plot_freqs.R +++ b/tests/testthat/test-plot_freqs.R @@ -23,29 +23,29 @@ got <- plot_freqs(dummy_data, n = 100, xlab = "x", ylab = "y", break_q_names_col testthat::test_that("expected outputs achieved", { # x and y values - testthat::expect_equal(c(got$x$attrs[[1]][[1]]), factor(c("This is test
number one", "This is test
2", "test3"), + testthat::expect_equal(c(got$x$attrs[[1]]$x), factor(c("This is test
number one", "This is test
2", "test3"), levels = c("This is test
number one", "This is test
2", "test3"))) - testthat::expect_equal(c(got$x$attrs[[1]][[2]]), c(0.5, 0.2, 0.8)) + testthat::expect_equal(c(got$x$attrs[[1]]$y), c(0.5, 0.2, 0.8)) # Bar colors - testthat::expect_equal(got$x$attrs[[1]][[3]][[1]], "#004556") + testthat::expect_equal(got$x$attrs[[1]]$marker$color, "#004556") # Plot orientation - testthat::expect_equal(got$x$attrs[[1]][[4]], "v") + testthat::expect_equal(got$x$attrs[[1]]$orientation, "v") # Sample size - testthat::expect_equal(got$x$layoutAttrs[[1]][[5]][[3]], "Sample size = 100") + testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$text, "Sample size = 100") # Axis labels - testthat::expect_equal(got$x$layoutAttrs[[1]][[1]][[1]], "x") - testthat::expect_equal(got$x$layoutAttrs[[2]][[1]][[1]], "y") + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$title, "x") + testthat::expect_equal(got$x$layoutAttrs[[2]]$annotations$text, "y") # Font sizes - testthat::expect_equal(got$x$layoutAttrs[[1]][[1]][[2]][[1]], 12) - testthat::expect_equal(got$x$layoutAttrs[[1]][[1]][[3]][[1]], 14.4) - testthat::expect_equal(got$x$layoutAttrs[[1]][[2]][[2]][[1]], 12) - testthat::expect_equal(got$x$layoutAttrs[[1]][[2]][[3]][[1]], 14.4) - testthat::expect_equal(got$x$layoutAttrs[[1]][[4]][[2]][[1]], 12) - testthat::expect_equal(got$x$layoutAttrs[[1]][[5]][[11]][[1]], 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$titlefont$size, 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$tickfont$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$yaxis$titlefont$size, 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]]$yaxis$tickfont$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$hoverlabel$font$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$font$size, 12) }) diff --git a/tests/testthat/test-plot_stacked.R b/tests/testthat/test-plot_stacked.R new file mode 100644 index 0000000..64c39ac --- /dev/null +++ b/tests/testthat/test-plot_stacked.R @@ -0,0 +1,52 @@ + +dummy_data <- data.frame(Q1 = rep(c("test1", + "test2", + "test3"), each = 3), + Q2 = factor(rep(c(1, 2, 3), 3), + levels = c(1, 2, 3)), + n = c(0.2, 0.3, 0.4, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) + + +testthat::test_that("validity checks work", + { + testthat::expect_error(plot_stacked(as.list(dummy_data)), "Unexpected input - data is not a data.frame.") + testthat::expect_error(plot_stacked(dplyr::mutate(dummy_data, Q3 = Q1)), "Unexpected input - data should have three columns.") + testthat::expect_error(plot_stacked(dummy_data, xlab = 1), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_stacked(dummy_data, ylab = 1), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_stacked(dummy_data, xlab = c("1", "2")), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_stacked(dummy_data, ylab = c("1", "2")), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_stacked(dummy_data, font_size = "x"), "Unexpected input - font_size is not numeric.") + }) + +got <- plot_stacked(dummy_data, n = 100, xlab = "x", ylab = "y") + +testthat::test_that("expected outputs achieved", + { + # x and y values + testthat::expect_equal(c(got$x$attrs[[1]]$y), factor(rep(c("test1", "test2", "test3"), each = 3), + levels = c("test3", "test2", "test1"))) + testthat::expect_equal(c(got$x$attrs[[1]]$x), c(0.2, 0.3, 0.4, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) + + # Bar colors + testthat::expect_equal(got$x$attrs[[1]]$marker$color, c("#004556", "#004556", "#004556", "#AFAFAF", "#AFAFAF", "#AFAFAF", "#FF6900", "#FF6900", "#FF6900")) + + # Plot orientation + testthat::expect_equal(got$x$attrs[[1]]$orientation, "h") + + # Sample size + testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$text, "Sample size = 100") + + # Axis labels + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$title, "y") + testthat::expect_equal(got$x$layoutAttrs[[2]]$annotations$text, "x") + + # Font sizes + testthat::expect_equal(got$x$layoutAttrs[[1]]$legend$font$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$titlefont$size, 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$tickfont$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$yaxis$titlefont$size, 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]]$yaxis$tickfont$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$hoverlabel$font$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$font$size, 12) + + }) From 83b3b17270defab4e66901c1b5df68de1ef4c271 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Wed, 1 Mar 2023 16:48:28 +0000 Subject: [PATCH 07/85] Added unit test for plot_grouped --- R/plot.R | 2 +- tests/testthat/test-plot_grouped.R | 48 ++++++++++++++++++++++++++++++ tests/testthat/test-plot_stacked.R | 5 ++-- 3 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 tests/testthat/test-plot_grouped.R diff --git a/R/plot.R b/R/plot.R index b72119b..c39664e 100644 --- a/R/plot.R +++ b/R/plot.R @@ -351,7 +351,7 @@ plot_stacked <- function(data, n, break_q_names_col, max_lines = 2, xlab = "", y #' #' @description Produce bar chart (plotly) for frequency data with grouping variable. #' -#' @param data Frequency data (data frame). 3 columns - cateogry names, groups and frequencies. +#' @param data Frequency data (data frame). 3 columns - category names, groups and frequencies. #' @param n sample size #' @param break_q_names_col applies break_q_names to the column. Not applied by default #' @param max_lines maximum number of lines. Int, defaults to 2/ See carsurvey::break_q_names() diff --git a/tests/testthat/test-plot_grouped.R b/tests/testthat/test-plot_grouped.R new file mode 100644 index 0000000..aab2c06 --- /dev/null +++ b/tests/testthat/test-plot_grouped.R @@ -0,0 +1,48 @@ +levels1 = c("test1", "test2", "test3", "test4", "test5") + +dummy_data <- data.frame(Q1 = factor(levels1, + levels = levels1), + Q2 = c(1, 1, 1, 2, 2), + n = c(0.2, 0.5, 0.3, 0.8, 0.6)) + + +testthat::test_that("validity checks work", + { + testthat::expect_error(plot_grouped(as.list(dummy_data)), "Unexpected input - data is not a data.frame.") + testthat::expect_error(plot_grouped(dplyr::mutate(dummy_data, Q3 = Q1)), "Unexpected input - data does not contain 3 columns.") + testthat::expect_error(plot_grouped(dplyr::mutate(dummy_data, n = as.character(n))), "Unexpected input - data column 3 is not numeric.") + testthat::expect_error(plot_grouped(dummy_data, xlab = 1), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_grouped(dummy_data, ylab = 1), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_grouped(dummy_data, xlab = c("1", "2")), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_grouped(dummy_data, ylab = c("1", "2")), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_grouped(dummy_data, font_size = "x"), "Unexpected input - font_size is not numeric.") + }) + +got <- plot_grouped(dummy_data, n = 100, xlab = "x", ylab = "y") + +testthat::test_that("expected outputs achieved", + { + # x and y values + testthat::expect_equal(c(got$x$attrs[[1]]$x), factor(levels1, + levels = levels1)) + testthat::expect_equal(c(got$x$attrs[[1]]$y), c(0.2, 0.5, 0.3, 0.8, 0.6)) + + # Bar colors + testthat::expect_equal(got$x$attrs[[1]]$marker$color, c("#004556", "#004556", "#FF6900", "#FF6900", "#FF6900")) + + # Sample size + testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$text, "Sample size = 100") + + # Axis labels + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$title, "x") + testthat::expect_equal(got$x$layoutAttrs[[2]]$annotations$text, "y") + + # Font sizes + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$titlefont$size, 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$tickfont$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$yaxis$titlefont$size, 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]]$yaxis$tickfont$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$hoverlabel$font$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$font$size, 12) + + }) diff --git a/tests/testthat/test-plot_stacked.R b/tests/testthat/test-plot_stacked.R index 64c39ac..3a6a050 100644 --- a/tests/testthat/test-plot_stacked.R +++ b/tests/testthat/test-plot_stacked.R @@ -4,8 +4,7 @@ dummy_data <- data.frame(Q1 = rep(c("test1", "test3"), each = 3), Q2 = factor(rep(c(1, 2, 3), 3), levels = c(1, 2, 3)), - n = c(0.2, 0.3, 0.4, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) - + n = c(0.1, 0.3, 0.6, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) testthat::test_that("validity checks work", { @@ -25,7 +24,7 @@ testthat::test_that("expected outputs achieved", # x and y values testthat::expect_equal(c(got$x$attrs[[1]]$y), factor(rep(c("test1", "test2", "test3"), each = 3), levels = c("test3", "test2", "test1"))) - testthat::expect_equal(c(got$x$attrs[[1]]$x), c(0.2, 0.3, 0.4, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) + testthat::expect_equal(c(got$x$attrs[[1]]$x), c(0.1, 0.3, 0.6, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) # Bar colors testthat::expect_equal(got$x$attrs[[1]]$marker$color, c("#004556", "#004556", "#004556", "#AFAFAF", "#AFAFAF", "#AFAFAF", "#FF6900", "#FF6900", "#FF6900")) From c8d60995c46f12728aa9c78d6de8e35d4557f92e Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Thu, 2 Mar 2023 15:29:24 +0000 Subject: [PATCH 08/85] Added plot_likert unit test and removed depreciated tidyselect usage --- R/derive_vars.R | 4 +-- R/frequency-tables.R | 22 ++++++------ R/plot.R | 14 ++++---- man/plot_grouped.Rd | 2 +- tests/testthat/test-plot_grouped.R | 1 - tests/testthat/test-plot_likert.R | 55 ++++++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 22 deletions(-) create mode 100644 tests/testthat/test-plot_likert.R diff --git a/R/derive_vars.R b/R/derive_vars.R index 158ad5e..65c2598 100644 --- a/R/derive_vars.R +++ b/R/derive_vars.R @@ -115,8 +115,8 @@ derive_basic_rap_scores <- function(data) { .x %in% high_vals ~ 1, TRUE ~ 0), .names = "{.col}_score")) %>% - mutate(doc_score = as.integer(.data$doc_comments_score & .data$doc_readme_score)) %>% - select(-c(.data$doc_comments_score, .data$doc_readme_score)) %>% + mutate(doc_score = as.integer(doc_comments_score & doc_readme_score)) %>% + select(-c(doc_comments_score, doc_readme_score)) %>% rename_with(~ score_col_names[which(paste0(prac_cols, "_score") == .x)], .cols = paste0(prac_cols, "_score")) %>% diff --git a/R/frequency-tables.R b/R/frequency-tables.R index e53ebf4..85161e2 100644 --- a/R/frequency-tables.R +++ b/R/frequency-tables.R @@ -196,13 +196,13 @@ summarise_where_learned_code <- function(data){ "Other") data <- data %>% - select(.data$first_learned, .data$prev_coding_experience, .data$code_freq) %>% + select(first_learned, prev_coding_experience, code_freq) %>% mutate( first_learned = case_when((data$other_coding_experience == "No" | data$prev_coding_experience == "No") & data$code_freq != "Never" ~ "In current role", !is.na(data$first_learned) & !(data$first_learned %in% levels) ~ "Other", - TRUE ~ .data$first_learned)) + TRUE ~ first_learned)) data$prev_coding_experience[data$other_coding_experience == "No"] <- "No" @@ -466,8 +466,8 @@ summarise_rap_comp <- function(data) { components <- calculate_freqs(data, questions, levels, labels) components <- components %>% - mutate(name = factor(.data$name, levels = labels)) %>% - arrange(.data$name) %>% + mutate(name = factor(name, levels = labels)) %>% + arrange(name) %>% mutate(value = c(rep("Basic", 6), rep("Advanced", 7))) %>% mutate(n = colSums(data[questions], na.rm = TRUE) / sum(data$code_freq != "Never")) @@ -913,13 +913,13 @@ calculate_freqs <- function(data, questions, levels, labels = NULL, prop = TRUE) } else { frequencies <- selected_data %>% - pivot_longer(cols = questions, + pivot_longer(cols = all_of(questions), names_to = "name", values_to = "value") %>% - group_by(.data$name) %>% - count(.data$value, .drop=FALSE) %>% - mutate(name = recode(.data$name, !!!labels_list)) %>% - arrange(.data$name, by_group=TRUE) %>% + group_by(name) %>% + count(value, .drop=FALSE) %>% + mutate(name = recode(name, !!!labels_list)) %>% + arrange(name, by_group=TRUE) %>% drop_na() %>% data.frame() @@ -957,7 +957,7 @@ calculate_multi_table_freqs <- function(data, col1, col2, levels1, levels2, prop selected_data[col2] <- factor(selected_data[[col2]], levels = levels2) frequencies <- selected_data %>% - count(across(c(col1, col2)), .drop=FALSE) %>% + count(across(all_of(c(col1, col2))), .drop=FALSE) %>% drop_na() %>% data.frame() @@ -981,7 +981,7 @@ prop_by_group <- function(data) { data %>% group_by_at(1) %>% - mutate(n = .data$n / ifelse(sum(.data$n)==0, 1, sum(.data$n))) %>% + mutate(n = n / ifelse(sum(n)==0, 1, sum(n))) %>% data.frame() } diff --git a/R/plot.R b/R/plot.R index c39664e..4111021 100644 --- a/R/plot.R +++ b/R/plot.R @@ -506,20 +506,20 @@ plot_likert <- function(data, mid, n, break_q_names_col, max_lines = 2, xlab = " n_questions <- length(unique(data[[1]])) n_answers <- length(unique(data[[2]])) + # Validate neutral mid + if (!is.logical(neutral_mid)) { + stop("Unexpected input - neutral_mid is not logical.") + } + # Validate mid if (!is.numeric(mid)) { stop("Unexpected input - mid is not numeric.") } else if (mid < 2) { - stop("Unexpected inout - mid is smaller than 2.") - } else if (neutral_mid & mid > n_answers) { + stop("Unexpected input - mid is smaller than 2.") + } else if (neutral_mid & mid >= n_answers) { stop("Unexpected input - mid >= the number of answers.") } - # Validate neutral mid - if (!is.logical(neutral_mid)) { - stop("Unexpected input - mid is not logical (TRUE/FALSE)") - } - # Apply break_q_names to a column if(!missing(break_q_names_col)) { data[[break_q_names_col]] <- break_q_names(data[[break_q_names_col]], max_lines) diff --git a/man/plot_grouped.Rd b/man/plot_grouped.Rd index a498cbd..b0cc32a 100644 --- a/man/plot_grouped.Rd +++ b/man/plot_grouped.Rd @@ -17,7 +17,7 @@ plot_grouped( ) } \arguments{ -\item{data}{Frequency data (data frame). 3 columns - cateogry names, groups and frequencies.} +\item{data}{Frequency data (data frame). 3 columns - category names, groups and frequencies.} \item{n}{sample size} diff --git a/tests/testthat/test-plot_grouped.R b/tests/testthat/test-plot_grouped.R index aab2c06..6c48f72 100644 --- a/tests/testthat/test-plot_grouped.R +++ b/tests/testthat/test-plot_grouped.R @@ -10,7 +10,6 @@ testthat::test_that("validity checks work", { testthat::expect_error(plot_grouped(as.list(dummy_data)), "Unexpected input - data is not a data.frame.") testthat::expect_error(plot_grouped(dplyr::mutate(dummy_data, Q3 = Q1)), "Unexpected input - data does not contain 3 columns.") - testthat::expect_error(plot_grouped(dplyr::mutate(dummy_data, n = as.character(n))), "Unexpected input - data column 3 is not numeric.") testthat::expect_error(plot_grouped(dummy_data, xlab = 1), "Unexpected input - labels should be single character strings.") testthat::expect_error(plot_grouped(dummy_data, ylab = 1), "Unexpected input - labels should be single character strings.") testthat::expect_error(plot_grouped(dummy_data, xlab = c("1", "2")), "Unexpected input - labels should be single character strings.") diff --git a/tests/testthat/test-plot_likert.R b/tests/testthat/test-plot_likert.R new file mode 100644 index 0000000..ca13a44 --- /dev/null +++ b/tests/testthat/test-plot_likert.R @@ -0,0 +1,55 @@ + +dummy_data <- data.frame(Q1 = rep(c("test1", + "test2", + "test3"), each = 3), + Q2 = factor(rep(c(1, 2, 3), 3), + levels = c(1, 2, 3)), + n = c(0.1, 0.3, 0.6, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) + +testthat::test_that("validity checks work", + { + testthat::expect_error(plot_likert(as.list(dummy_data)), "Unexpected input - data is not a data.frame.") + testthat::expect_error(plot_likert(dplyr::mutate(dummy_data, Q3 = Q1)), "Unexpected input - data should have at three columns.") + testthat::expect_error(plot_likert(dummy_data, xlab = 1), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_likert(dummy_data, ylab = 1), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_likert(dummy_data, xlab = c("1", "2")), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_likert(dummy_data, ylab = c("1", "2")), "Unexpected input - labels should be single character strings.") + testthat::expect_error(plot_likert(dummy_data, font_size = "x"), "Unexpected input - font_size is not numeric.") + testthat::expect_error(plot_likert(dummy_data, neutral_mid = "x"), "Unexpected input - neutral_mid is not logical.") + testthat::expect_error(plot_likert(dummy_data, mid = "2"), "Unexpected input - mid is not numeric.") + testthat::expect_error(plot_likert(dummy_data, mid = 1), "Unexpected input - mid is smaller than 2.") + testthat::expect_error(plot_likert(dummy_data, mid = 3), "Unexpected input - mid >= the number of answers.") + }) + +got <- plot_likert(dummy_data, mid = 2, n = 100, xlab = "x", ylab = "y") + + +testthat::test_that("expected outputs achieved", + { + # x and y values + testthat::expect_equal(c(got$x$attrs[[1]]$y), factor(rep(c("test1", "test2", "test3"), each = 3), + levels = c("test3", "test2", "test1"))) + testthat::expect_equal(c(got$x$attrs[[1]]$x), c(0.1, 0.3, 0.6, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) + + # Bar colors + testthat::expect_equal(got$x$attrs[[1]]$marker$color, c("#004556", "#004556", "#004556", "#AFAFAF", "#AFAFAF", "#AFAFAF", "#FF6900", "#FF6900", "#FF6900")) + + # Plot orientation + testthat::expect_equal(got$x$attrs[[1]]$orientation, "h") + + # Sample size + testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$text, "Sample size = 100") + + # Axis labels + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$title, "x") + testthat::expect_equal(got$x$layoutAttrs[[2]]$annotations$text, "y") + + # Font sizes + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$titlefont$size, 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]]$xaxis$tickfont$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$yaxis$titlefont$size, 14.4) + testthat::expect_equal(got$x$layoutAttrs[[1]]$yaxis$tickfont$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$hoverlabel$font$size, 12) + testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$font$size, 12) + + }) From dc409422b6488f7d2971050beb39975d3a14e806 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Fri, 3 Mar 2023 10:03:12 +0000 Subject: [PATCH 09/85] Added unit tests for plot utility functions --- R/plot.R | 5 +++- tests/testthat/test-plot_utils.R | 49 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/testthat/test-plot_utils.R diff --git a/R/plot.R b/R/plot.R index 4111021..06d41dc 100644 --- a/R/plot.R +++ b/R/plot.R @@ -652,7 +652,10 @@ calculate_bases <- function(data, mid, neutral_mid) { } } - negative_bases <- data %>% dplyr::group_by_at(1) %>% dplyr::mutate_at(3, get_neg_bases, mid = mid, neutral_mid = neutral_mid) %>% data.frame + negative_bases <- data %>% + dplyr::group_by_at(1) %>% + dplyr::mutate_at(3, get_neg_bases, mid = mid, neutral_mid = neutral_mid) %>% + data.frame() bases <- bases - negative_bases[[3]] diff --git a/tests/testthat/test-plot_utils.R b/tests/testthat/test-plot_utils.R new file mode 100644 index 0000000..27355a9 --- /dev/null +++ b/tests/testthat/test-plot_utils.R @@ -0,0 +1,49 @@ + + +testthat::test_that("expected outputs achieved", { + + dummy_data <- data.frame(Q1 = rep(c("test1", + "test2", + "test3"), each = 3), + Q2 = factor(rep(c(1, 2, 3), 3), + levels = c(1, 2, 3)), + n = c(0.1, 0.3, 0.6, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) + + testthat::expect_equal(calculate_bases(dummy_data, mid = 2, neutral_mid = TRUE), c(-0.250, -0.150, 0.150, -0.625, -0.125, 0.125, -0.495, -0.165, 0.165)) + +}) + + +testthat::test_that("expected outputs achieved", { + testthat::expect_equal(create_y_lab("y", 12), + list(text = "y", + y = 1, + x = "min", + showarrow = FALSE, + yshift = 30, + xref = "paper", + yref = "paper", + font = list(size = 12 * 1.2))) + +}) + + +testthat::test_that("expected outputs achieved", { + testthat::expect_equal(axis_settings("x", "y", 12), + list( + scale_axis = list( + title = "y", + tickfont = list(size = 12), + titlefont = list(size = 12 * 1.2), + tickformat = ".0%", + title = "Percent" + ), + cat_axis = list( + title = "x", + tickfont = list(size = 12), + titlefont = list(size = 12 * 1.2) + ) + ) + ) + +}) From 4c6b715541aaf0d341594414cf02858a02473f20 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Fri, 3 Mar 2023 10:41:30 +0000 Subject: [PATCH 10/85] Added set_axis_range unit test --- tests/testthat/test-plot_utils.R | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-plot_utils.R b/tests/testthat/test-plot_utils.R index 27355a9..8e514e4 100644 --- a/tests/testthat/test-plot_utils.R +++ b/tests/testthat/test-plot_utils.R @@ -7,9 +7,28 @@ testthat::test_that("expected outputs achieved", { "test3"), each = 3), Q2 = factor(rep(c(1, 2, 3), 3), levels = c(1, 2, 3)), - n = c(0.1, 0.3, 0.6, 0.5, 0.25, 0.25, 0.33, 0.33, 0.34)) + n = c(0.1, 0.3, 0.6, 0.5, 0.25, + 0.25, 0.33, 0.33, 0.34)) - testthat::expect_equal(calculate_bases(dummy_data, mid = 2, neutral_mid = TRUE), c(-0.250, -0.150, 0.150, -0.625, -0.125, 0.125, -0.495, -0.165, 0.165)) + testthat::expect_equal(calculate_bases(dummy_data, mid = 2, neutral_mid = TRUE), + c(-0.250, -0.150, 0.150, -0.625, -0.125, + 0.125, -0.495, -0.165, 0.165)) + +}) + + +testthat::test_that("expected outputs achieved", { + + dummy_data <- data.frame(Q1 = factor(c("test1", "test2", "test3"), + levels = c("test1", "test2", "test3")), + n = c(0.5, 0.2, 0.8)) + + got <- plot_freqs(dummy_data, n = 100, xlab = "x", ylab = "y") + + axis_got <- set_axis_range(got, min = 0.1, max = 0.8, axis = "y") + + testthat::expect_equal(axis_got$x$layoutAttrs[[3]]$yaxis$range[[1]], 0.1) + testthat::expect_equal(axis_got$x$layoutAttrs[[3]]$yaxis$range[[2]], 0.8) }) From 2328c4dc96e3342ffec1d0db33f9ab66d82aab41 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Tue, 5 Sep 2023 11:26:38 +0100 Subject: [PATCH 11/85] Add github action for coverage --- .github/workflows/test-coverage.yaml | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .github/workflows/test-coverage.yaml diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml new file mode 100644 index 0000000..2c5bb50 --- /dev/null +++ b/.github/workflows/test-coverage.yaml @@ -0,0 +1,50 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: test-coverage + +jobs: + test-coverage: + runs-on: ubuntu-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v3 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::covr + needs: coverage + + - name: Test coverage + run: | + covr::codecov( + quiet = FALSE, + clean = FALSE, + install_path = file.path(Sys.getenv("RUNNER_TEMP"), "package") + ) + shell: Rscript {0} + + - name: Show testthat output + if: always() + run: | + ## -------------------------------------------------------------------- + find ${{ runner.temp }}/package -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash + + - name: Upload test results + if: failure() + uses: actions/upload-artifact@v3 + with: + name: coverage-test-failures + path: ${{ runner.temp }}/package From 87b9ec9577ba595d01674ba64a233167174af5ce Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Wed, 6 Sep 2023 14:36:32 +0100 Subject: [PATCH 12/85] Fix depricated dpylr function --- R/frequency-tables.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/frequency-tables.R b/R/frequency-tables.R index 974a6e6..7d6ae9d 100644 --- a/R/frequency-tables.R +++ b/R/frequency-tables.R @@ -1285,7 +1285,7 @@ calculate_multi_table_freqs <- function(data, col1, col2, levels1, levels2, prop selected_data[col2] <- factor(selected_data[[col2]], levels = levels2) frequencies <- selected_data %>% - count(across(c(col1, col2)), .drop=FALSE) %>% + count(across(all_of(c(col1, col2))), .drop=FALSE) %>% drop_na() %>% data.frame() From 142592c75b12d5fe363968d32a7fa5f14dec8c7d Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Wed, 6 Sep 2023 14:37:32 +0100 Subject: [PATCH 13/85] Add test for summarise_cap_change_by_line_manage --- ...test-summarise_cap_change_by_line_manage.R | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 tests/testthat/test-summarise_cap_change_by_line_manage.R diff --git a/tests/testthat/test-summarise_cap_change_by_line_manage.R b/tests/testthat/test-summarise_cap_change_by_line_manage.R new file mode 100644 index 0000000..84fca20 --- /dev/null +++ b/tests/testthat/test-summarise_cap_change_by_line_manage.R @@ -0,0 +1,49 @@ + +dummy_data <- data.frame(management = c(NA, + rep("Yes", 5), + rep("No - I manage people who do not write code", 5), + rep("No - I don't line manage anyone", 5)), + coding_ability_change = c(NA, + rep(c("Significantly worse", + "Slightly worse", + "No change", + "Slightly better", + "Significantly better"), + times=3))) + +test_that("summarise_cap_change_by_line_manage missing data is handled correctly", { + + got <- summarise_cap_change_by_line_manage(dummy_data) + + expect_false(any(is.na.data.frame(got))) + +}) + +test_that("summarise_cap_change_by_line_manage output is as expected", { + + got <- summarise_cap_change_by_line_manage(dummy_data) + + expected <- data.frame(management = factor(rep(c("Yes", + "No - I manage people who do not write code", + "No - I don't line manage anyone"), + each=5), + levels = c("Yes", + "No - I manage people who do not write code", + "No - I don't line manage anyone")), + coding_ability_change = factor(rep(c("Significantly worse", + "Slightly worse", + "No change", + "Slightly better", + "Significantly better"), 3), + levels = c("Significantly worse", + "Slightly worse", + "No change", + "Slightly better", + "Significantly better")), + n = c(0.20, 0.20, 0.20, 0.20, 0.20, + 0.20, 0.20, 0.20, 0.20, 0.20, + 0.20, 0.20, 0.20, 0.20, 0.20)) + + expect_equal(got, expected) + +}) From db57d2142fb9cf310e4de4a90109ec9b76dfca74 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Wed, 6 Sep 2023 15:51:32 +0100 Subject: [PATCH 14/85] Add test for summarise_open_source_by_prof --- .../test-summarise_open_source_by_prof.R | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 tests/testthat/test-summarise_open_source_by_prof.R diff --git a/tests/testthat/test-summarise_open_source_by_prof.R b/tests/testthat/test-summarise_open_source_by_prof.R new file mode 100644 index 0000000..e8024a2 --- /dev/null +++ b/tests/testthat/test-summarise_open_source_by_prof.R @@ -0,0 +1,74 @@ +# Coding tools frequency tables (access or knowledge) + +dummy_data <- data.frame( + prac_use_open_source = c(NA, + rep(c("I don't understand this question", + "Never", + "Rarely", + "Sometimes", + "Regularly", + "All the time"), 2)), + prac_open_source_own = rep("Sometimes", 13), + prac_version_control = rep("Sometimes", 13), + prac_review = rep("Sometimes", 13), + prac_functions = rep("Sometimes", 13), + prac_unit_test = rep("Sometimes", 13), + prac_package = rep("Sometimes", 13), + prac_dir_structure = rep("Sometimes", 13), + prac_style = rep("Sometimes", 13), + prac_automated_QA = rep("Sometimes", 13), + prac_AQUA_book = rep("Sometimes", 13), + prof_DS = c(NA, rep(c("Yes", "No"), each=6)), + prof_DDAT = c(NA, rep(c("Yes", "No"), each=6)), + prof_GAD = c(NA, rep(c("Yes", "No"), each=6)), + prof_GES = c(NA, rep(c("Yes", "No"), each=6)), + prof_geog = c(NA, rep(c("Yes", "No"), each=6)), + prof_GORS = c(NA, rep(c("Yes", "No"), each=6)), + prof_GSR = c(NA, rep(c("Yes", "No"), each=6)), + prof_GSG = c(NA, rep(c("Yes", "No"), each=6))) + +test_that("summarise_open_source_by_prof missing data is handled correctly", { + + got <- summarise_open_source_by_prof(dummy_data) + + + expect_false(any(is.na.data.frame(got))) + +}) + +test_that("summarise_open_source_by_prof output is as expected", { + + got <- summarise_open_source_by_prof(dummy_data) + + expected <- data.frame(name = rep(c("Data scientists", + "Digital and data (DDAT)", + "Actuaries", + "Economists (GES)", + "Geographers", + "Operational researchers (GORS)", + "Social researchers (GSR)", + "Statisticians (GSG)"), each=6), + value = factor(rep(c("I don't understand this question", + "Never", + "Rarely", + "Sometimes", + "Regularly", + "All the time"), 8), + levels = c("I don't understand this question", + "Never", + "Rarely", + "Sometimes", + "Regularly", + "All the time")), + n = c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6, + 1/6, 1/6, 1/6, 1/6, 1/6, 1/6, + 1/6, 1/6, 1/6, 1/6, 1/6, 1/6, + 1/6, 1/6, 1/6, 1/6, 1/6, 1/6, + 1/6, 1/6, 1/6, 1/6, 1/6, 1/6, + 1/6, 1/6, 1/6, 1/6, 1/6, 1/6, + 1/6, 1/6, 1/6, 1/6, 1/6, 1/6, + 1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) + + expect_equal(got, expected) + +}) From 799986adacbb46b3d7e8a9d356ad5d9b8a9d6824 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Wed, 13 Sep 2023 15:03:03 +0100 Subject: [PATCH 15/85] Add unit test for summarise heard of RAP by prof --- R/frequency-tables.R | 3 ++ .../test-summarise_heard_of_RAP_by_prof.R | 49 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 tests/testthat/test-summarise_heard_of_RAP_by_prof.R diff --git a/R/frequency-tables.R b/R/frequency-tables.R index 7d6ae9d..89b869e 100644 --- a/R/frequency-tables.R +++ b/R/frequency-tables.R @@ -1125,6 +1125,9 @@ summarise_heard_of_RAP_by_prof <- function(data) { 1)) rownames(frequencies) <- NULL + names(frequencies$n) <- NULL + + frequencies$value <- recode(frequencies$value, !!!prof_names) return(frequencies) diff --git a/tests/testthat/test-summarise_heard_of_RAP_by_prof.R b/tests/testthat/test-summarise_heard_of_RAP_by_prof.R new file mode 100644 index 0000000..252b631 --- /dev/null +++ b/tests/testthat/test-summarise_heard_of_RAP_by_prof.R @@ -0,0 +1,49 @@ +# Coding tools frequency tables (access or knowledge) + +dummy_data <- data.frame( + workplace = rep(c("Civil service, including devolved administations", "Office for Students", "NHS"), each=4), + heard_of_RAP = rep(c("Yes", "Yes", "No", "No"), 3), + prof_DS = rep(c("Yes", "No"), 6), + prof_DDAT = rep(c("Yes", "No"), 6), + prof_GAD = rep(c("Yes", "No"), 6), + prof_GES = rep(c("Yes", "No"), 6), + prof_geog = rep(c("Yes", "No"), 6), + prof_GORS = rep(c("Yes", "No"), 6), + prof_GSR = rep(c("Yes", "No"), 6), + prof_GSG = rep(c("Yes", "No"), 6)) + +test_that("summarise_heard_of_RAP_by_prof missing data is handled correctly", { + + dummy_data[1, ] <- NA + + got <- summarise_heard_of_RAP_by_prof(dummy_data) + + expect_false(any(is.na.data.frame(got))) + +}) + +test_that("summarise_heard_of_RAP_by_prof output is as expected", { + + got <- summarise_heard_of_RAP_by_prof(dummy_data) + + expected <- data.frame(value = factor(c("Data scientists", + "Digital and data (DDAT)", + "Actuaries", + "Economists (GES)", + "Geographers", + "Operational researchers (GORS)", + "Social researchers (GSR)", + "Statisticians (GSG)"), + levels = c("Data scientists", + "Digital and data (DDAT)", + "Actuaries", + "Economists (GES)", + "Geographers", + "Operational researchers (GORS)", + "Social researchers (GSR)", + "Statisticians (GSG)")), + n = c(1/2, 1/2, 1/2, 1/2, 1/2, 1/2, 1/2, 1/2)) + + expect_equal(got, expected) + +}) From 0a83902994596d7e63de5cef4c81a98ab3d8a2e9 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Thu, 14 Sep 2023 15:41:19 +0100 Subject: [PATCH 16/85] Make calculate freqs unit test more robust --- tests/testthat/test-calculate_freqs.R | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/testthat/test-calculate_freqs.R b/tests/testthat/test-calculate_freqs.R index adc943f..3bdcc5f 100644 --- a/tests/testthat/test-calculate_freqs.R +++ b/tests/testthat/test-calculate_freqs.R @@ -17,6 +17,15 @@ expected <- data.frame(name = rep(c("Question 1", levels = c("test1", "test2", "test3")), n = c(1, 0, 0, 0, 1, 0, 0.5, 0, 0.5)) +test_that("create_tidy_freq_table validation works", { + + expect_error(calculate_freqs(data = dummy_data, + questions = questions, + levels = levels), + "Missing input: labels needed for mutli-column frequencies.") + +}) + test_that("create_tidy_freq_table missing data is handled correctly", { got <- calculate_freqs(data = dummy_data, @@ -52,3 +61,36 @@ test_that("create_tidy_freq_table count output is as expected", { expect_equal(got, expected) }) + +test_that("create_tidy_freq_table single question proportion output is as expected", { + + questions <- "Q1" + + got <- calculate_freqs(data = dummy_data, + questions = questions, + levels = levels) + + expected <- data.frame(value = factor(c("test1", "test2", "test3"), + levels = c("test1", "test2", "test3")), + n = c(1, 0, 0)) + + expect_equal(got, expected) + +}) + +test_that("create_tidy_freq_table single question count output is as expected", { + + questions <- "Q1" + + got <- calculate_freqs(data = dummy_data, + questions = questions, + levels = levels, + prop = FALSE) + + expected <- data.frame(value = factor(c("test1", "test2", "test3"), + levels = c("test1", "test2", "test3")), + n = c(1, 0, 0)) + + expect_equal(got, expected) + +}) From c634aa969e2a0cf295bbd1629e37c5d00673aead Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Wed, 20 Sep 2023 16:33:20 +0100 Subject: [PATCH 17/85] Add unit test for summarise_os_vs_prop --- tests/testthat/test-summarise_os_vs_prop.R | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/testthat/test-summarise_os_vs_prop.R diff --git a/tests/testthat/test-summarise_os_vs_prop.R b/tests/testthat/test-summarise_os_vs_prop.R new file mode 100644 index 0000000..4500aa6 --- /dev/null +++ b/tests/testthat/test-summarise_os_vs_prop.R @@ -0,0 +1,32 @@ + +dummy_data <- data.frame(year = rep(c(2020, 2021, 2022), each=32), + knowledge_python = rep(rep(c("Yes", "No"), each=16), times=3), + knowledge_R = rep(rep(c("Yes", "No"), each=8), times=6), + knowledge_SAS = rep(rep(c("Yes", "No"), each=4), times=12), + knowledge_SPSS = rep(rep(c("Yes", "No"), each=2), times=24), + knowledge_stata = rep(c("Yes", "No"), times=48)) + +test_that("summarise_os_vs_prop missing data is handled correctly", { + + dummy_data[1,2] <- NA + + got <- summarise_os_vs_prop(dummy_data) + + expect_false(any(is.na.data.frame(got))) + +}) + +test_that("summarise_os_vs_prop output is as expected", { + + got <- summarise_os_vs_prop(dummy_data) + + expected <- data.frame(lang_type = factor(rep(c("open source", "proprietary"), each=3), + levels = c("open source", "proprietary")), + year = rep(c("2020", "2021", "2022"), times=2), + Freq = rep(c(24, 28), each=3), + n = rep(32, times=6)) %>% + get_ci(freq_col = 3, n_col = 4) + + expect_equal(got, expected) + +}) From 4963804ad0a6054c86ddfd90ef5d844928f8c354 Mon Sep 17 00:00:00 2001 From: Rowley Date: Thu, 21 Sep 2023 13:30:54 +0100 Subject: [PATCH 18/85] fixed test-plot_grouped and test-plot_utils failure --- tests/testthat/test-plot_grouped.R | 2 +- tests/testthat/test-plot_utils.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-plot_grouped.R b/tests/testthat/test-plot_grouped.R index 6c48f72..861eed0 100644 --- a/tests/testthat/test-plot_grouped.R +++ b/tests/testthat/test-plot_grouped.R @@ -27,7 +27,7 @@ testthat::test_that("expected outputs achieved", testthat::expect_equal(c(got$x$attrs[[1]]$y), c(0.2, 0.5, 0.3, 0.8, 0.6)) # Bar colors - testthat::expect_equal(got$x$attrs[[1]]$marker$color, c("#004556", "#004556", "#FF6900", "#FF6900", "#FF6900")) + testthat::expect_equal(got$x$attrs[[1]]$marker$color, c("#FF6900", "#FF6900", "#FF6900", "#004556", "#004556")) # Sample size testthat::expect_equal(got$x$layoutAttrs[[1]]$annotations$text, "Sample size = 100") diff --git a/tests/testthat/test-plot_utils.R b/tests/testthat/test-plot_utils.R index 8e514e4..370f815 100644 --- a/tests/testthat/test-plot_utils.R +++ b/tests/testthat/test-plot_utils.R @@ -39,7 +39,7 @@ testthat::test_that("expected outputs achieved", { y = 1, x = "min", showarrow = FALSE, - yshift = 30, + yshift = 24, xref = "paper", yref = "paper", font = list(size = 12 * 1.2))) From c14c471fe1b142ec205a1c9e54e8d44261b1bbc3 Mon Sep 17 00:00:00 2001 From: ldavies99 Date: Thu, 21 Sep 2023 14:28:22 +0100 Subject: [PATCH 19/85] Update docs --- docs/data_collection.html | 10 +-- ...ent-fisheries-and-aquaculture-science.html | 84 +++++++++---------- ...nd-industrial-strategy-excl-agencies-.html | 84 +++++++++---------- ...t-for-digital-culture-media-and-sport.html | 84 +++++++++---------- .../departments/department-for-education.html | 84 +++++++++---------- ...food-and-rural-affairs-excl-agencies-.html | 84 +++++++++---------- ...and-rural-affairs-including-agencies-.html | 84 +++++++++---------- .../department-for-international-trade.html | 84 +++++++++---------- ...-levelling-up-housing-and-communities.html | 84 +++++++++---------- ...partment-for-transport-excl-agencies-.html | 84 +++++++++---------- .../department-for-work-and-pensions.html | 84 +++++++++---------- ...health-and-social-care-excl-agencies-.html | 84 +++++++++---------- docs/departments/forestry-commission.html | 84 +++++++++---------- .../government-actuary-s-department.html | 84 +++++++++---------- docs/departments/hm-revenue-and-customs.html | 84 +++++++++---------- docs/departments/ministry-of-defence.html | 84 +++++++++---------- .../ministry-of-justice-excl-agencies-.html | 84 +++++++++---------- .../national-records-of-scotland.html | 84 +++++++++---------- docs/departments/nhs.html | 84 +++++++++---------- ...reland-statistics-and-research-agency.html | 84 +++++++++---------- .../office-for-national-statistics.html | 84 +++++++++---------- docs/departments/public-health-scotland.html | 84 +++++++++---------- .../scottish-government-excl-agencies-.html | 84 +++++++++---------- .../uk-health-security-agency.html | 84 +++++++++---------- docs/departments/welsh-government.html | 84 +++++++++---------- docs/professions/data-scientists.html | 84 +++++++++---------- docs/professions/digital-and-data.html | 84 +++++++++---------- .../government-actuarys-department.html | 84 +++++++++---------- .../government-economic-service.html | 84 +++++++++---------- docs/professions/government-geography.html | 84 +++++++++---------- .../government-operational-research.html | 84 +++++++++---------- .../government-social-research.html | 84 +++++++++---------- .../government-statician-group.html | 84 +++++++++---------- .../htmlwidgets.js | 0 docs/summary.html | 74 ++++++++-------- 35 files changed, 1386 insertions(+), 1386 deletions(-) rename docs/site_libs/{htmlwidgets-1.6.2 => htmlwidgets-1.6.1}/htmlwidgets.js (100%) diff --git a/docs/data_collection.html b/docs/data_collection.html index 3b676ea..3d3b8f8 100644 --- a/docs/data_collection.html +++ b/docs/data_collection.html @@ -50,7 +50,7 @@ } - + @@ -267,7 +267,7 @@

Coding frequency

#code-freq-table {display: none;}
@@ -313,7 +313,7 @@

Coding frequency

- + @@ -348,7 +348,7 @@

Grade

#grades-by-year-table {display: none;}
@@ -394,7 +394,7 @@

Grade

- + diff --git a/docs/departments/centre-for-environment-fisheries-and-aquaculture-science.html b/docs/departments/centre-for-environment-fisheries-and-aquaculture-science.html index 8172575..40720e0 100644 --- a/docs/departments/centre-for-environment-fisheries-and-aquaculture-science.html +++ b/docs/departments/centre-for-environment-fisheries-and-aquaculture-science.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-business-energy-and-industrial-strategy-excl-agencies-.html b/docs/departments/department-for-business-energy-and-industrial-strategy-excl-agencies-.html index 5fc17af..0b4e73d 100644 --- a/docs/departments/department-for-business-energy-and-industrial-strategy-excl-agencies-.html +++ b/docs/departments/department-for-business-energy-and-industrial-strategy-excl-agencies-.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-digital-culture-media-and-sport.html b/docs/departments/department-for-digital-culture-media-and-sport.html index 2385f6a..98de4f2 100644 --- a/docs/departments/department-for-digital-culture-media-and-sport.html +++ b/docs/departments/department-for-digital-culture-media-and-sport.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-education.html b/docs/departments/department-for-education.html index 0fff675..8799ce5 100644 --- a/docs/departments/department-for-education.html +++ b/docs/departments/department-for-education.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-environment-food-and-rural-affairs-excl-agencies-.html b/docs/departments/department-for-environment-food-and-rural-affairs-excl-agencies-.html index c1cfdb6..c35ef03 100644 --- a/docs/departments/department-for-environment-food-and-rural-affairs-excl-agencies-.html +++ b/docs/departments/department-for-environment-food-and-rural-affairs-excl-agencies-.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-environment-food-and-rural-affairs-including-agencies-.html b/docs/departments/department-for-environment-food-and-rural-affairs-including-agencies-.html index 409d358..31580bf 100644 --- a/docs/departments/department-for-environment-food-and-rural-affairs-including-agencies-.html +++ b/docs/departments/department-for-environment-food-and-rural-affairs-including-agencies-.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-international-trade.html b/docs/departments/department-for-international-trade.html index ed44e6b..3f8429b 100644 --- a/docs/departments/department-for-international-trade.html +++ b/docs/departments/department-for-international-trade.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-levelling-up-housing-and-communities.html b/docs/departments/department-for-levelling-up-housing-and-communities.html index a22b3f1..031b5b2 100644 --- a/docs/departments/department-for-levelling-up-housing-and-communities.html +++ b/docs/departments/department-for-levelling-up-housing-and-communities.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-transport-excl-agencies-.html b/docs/departments/department-for-transport-excl-agencies-.html index c9b2317..3623be4 100644 --- a/docs/departments/department-for-transport-excl-agencies-.html +++ b/docs/departments/department-for-transport-excl-agencies-.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-for-work-and-pensions.html b/docs/departments/department-for-work-and-pensions.html index ef344eb..f88380d 100644 --- a/docs/departments/department-for-work-and-pensions.html +++ b/docs/departments/department-for-work-and-pensions.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/department-of-health-and-social-care-excl-agencies-.html b/docs/departments/department-of-health-and-social-care-excl-agencies-.html index 88b5536..7d45e1f 100644 --- a/docs/departments/department-of-health-and-social-care-excl-agencies-.html +++ b/docs/departments/department-of-health-and-social-care-excl-agencies-.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/forestry-commission.html b/docs/departments/forestry-commission.html index 50699e8..bb9496b 100644 --- a/docs/departments/forestry-commission.html +++ b/docs/departments/forestry-commission.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/government-actuary-s-department.html b/docs/departments/government-actuary-s-department.html index e8b79cf..7c11d13 100644 --- a/docs/departments/government-actuary-s-department.html +++ b/docs/departments/government-actuary-s-department.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/hm-revenue-and-customs.html b/docs/departments/hm-revenue-and-customs.html index 1ad35c6..f2ddc04 100644 --- a/docs/departments/hm-revenue-and-customs.html +++ b/docs/departments/hm-revenue-and-customs.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/ministry-of-defence.html b/docs/departments/ministry-of-defence.html index f4521ae..08b6346 100644 --- a/docs/departments/ministry-of-defence.html +++ b/docs/departments/ministry-of-defence.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/ministry-of-justice-excl-agencies-.html b/docs/departments/ministry-of-justice-excl-agencies-.html index edcc837..08a4f5a 100644 --- a/docs/departments/ministry-of-justice-excl-agencies-.html +++ b/docs/departments/ministry-of-justice-excl-agencies-.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/national-records-of-scotland.html b/docs/departments/national-records-of-scotland.html index 0577046..288273b 100644 --- a/docs/departments/national-records-of-scotland.html +++ b/docs/departments/national-records-of-scotland.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/nhs.html b/docs/departments/nhs.html index 013c31b..ca5e815 100644 --- a/docs/departments/nhs.html +++ b/docs/departments/nhs.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/northern-ireland-statistics-and-research-agency.html b/docs/departments/northern-ireland-statistics-and-research-agency.html index b5892ce..1b6de42 100644 --- a/docs/departments/northern-ireland-statistics-and-research-agency.html +++ b/docs/departments/northern-ireland-statistics-and-research-agency.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/office-for-national-statistics.html b/docs/departments/office-for-national-statistics.html index 41553a7..adcfd2d 100644 --- a/docs/departments/office-for-national-statistics.html +++ b/docs/departments/office-for-national-statistics.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/public-health-scotland.html b/docs/departments/public-health-scotland.html index f857d3b..cd7ca28 100644 --- a/docs/departments/public-health-scotland.html +++ b/docs/departments/public-health-scotland.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/scottish-government-excl-agencies-.html b/docs/departments/scottish-government-excl-agencies-.html index 43794d1..0491e60 100644 --- a/docs/departments/scottish-government-excl-agencies-.html +++ b/docs/departments/scottish-government-excl-agencies-.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/uk-health-security-agency.html b/docs/departments/uk-health-security-agency.html index d52a016..4aa5957 100644 --- a/docs/departments/uk-health-security-agency.html +++ b/docs/departments/uk-health-security-agency.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/departments/welsh-government.html b/docs/departments/welsh-government.html index 2ff91ed..794c322 100644 --- a/docs/departments/welsh-government.html +++ b/docs/departments/welsh-government.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/professions/data-scientists.html b/docs/professions/data-scientists.html index 5c52b01..bc18e31 100644 --- a/docs/professions/data-scientists.html +++ b/docs/professions/data-scientists.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/professions/digital-and-data.html b/docs/professions/digital-and-data.html index 0987a6b..4a3741d 100644 --- a/docs/professions/digital-and-data.html +++ b/docs/professions/digital-and-data.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/professions/government-actuarys-department.html b/docs/professions/government-actuarys-department.html index 9f2f96c..3e74868 100644 --- a/docs/professions/government-actuarys-department.html +++ b/docs/professions/government-actuarys-department.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/professions/government-economic-service.html b/docs/professions/government-economic-service.html index 8d7ebd7..db6e5a8 100644 --- a/docs/professions/government-economic-service.html +++ b/docs/professions/government-economic-service.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/professions/government-geography.html b/docs/professions/government-geography.html index 665e9b3..520ffd7 100644 --- a/docs/professions/government-geography.html +++ b/docs/professions/government-geography.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/professions/government-operational-research.html b/docs/professions/government-operational-research.html index 6315219..0beb21d 100644 --- a/docs/professions/government-operational-research.html +++ b/docs/professions/government-operational-research.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/professions/government-social-research.html b/docs/professions/government-social-research.html index bffee43..d6a629e 100644 --- a/docs/professions/government-social-research.html +++ b/docs/professions/government-social-research.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/professions/government-statician-group.html b/docs/professions/government-statician-group.html index b266ec7..89e4e35 100644 --- a/docs/professions/government-statician-group.html +++ b/docs/professions/government-statician-group.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -190,7 +190,7 @@

#coding-freq-table {display: none;}
@@ -229,7 +229,7 @@

- + @@ -265,7 +265,7 @@

What code is b #operations-table {display: none;}
@@ -320,7 +320,7 @@

What code is b

- + @@ -365,7 +365,7 @@

Access to coding to #access-table {display: none;}
@@ -452,7 +452,7 @@

Access to coding to

- + @@ -486,7 +486,7 @@

Coding tool knowledg #knowledge-table {display: none;}
@@ -573,7 +573,7 @@

Coding tool knowledg

- + @@ -615,7 +615,7 @@

Access to git

#git-access-table {display: none;}
@@ -646,7 +646,7 @@

Access to git

- + @@ -680,7 +680,7 @@

Git knowledge

#git-knowledge-table {display: none;}
@@ -711,7 +711,7 @@

Git knowledge

- + @@ -750,7 +750,7 @@

Good analys
@@ -912,7 +912,7 @@

Good analys #good-practices-table {display: none;}
@@ -1035,7 +1035,7 @@

Good analys

- +

@@ -1046,7 +1046,7 @@

Documentation

@@ -1076,7 +1076,7 @@

Documentation

#doc-table {display: none;}
@@ -1163,7 +1163,7 @@

Documentation

- +
@@ -1205,7 +1205,7 @@

Dependency Managemen #dependency-management-table {display: none;}
@@ -1236,7 +1236,7 @@

Dependency Managemen

- + @@ -1278,7 +1278,7 @@

Continuous integrat #ci-table {display: none;}
@@ -1309,7 +1309,7 @@

Continuous integrat

- + @@ -1351,7 +1351,7 @@

Reproducibl #rep-workflow-table {display: none;}
@@ -1382,7 +1382,7 @@

Reproducibl

- + @@ -1428,7 +1428,7 @@

Knowledge of RAP

#rap-knowledge-table {display: none;}
@@ -1467,7 +1467,7 @@

Knowledge of RAP

- + @@ -1502,7 +1502,7 @@

Knowledge of RAP #strategy-knowledge-table {display: none;}
@@ -1533,7 +1533,7 @@

Knowledge of RAP

- + @@ -1544,7 +1544,7 @@

Opinions on RAP

@@ -1574,7 +1574,7 @@

Opinions on RAP

#rap-opinions-table {display: none;}
@@ -1653,7 +1653,7 @@

Opinions on RAP

- +
@@ -1694,7 +1694,7 @@

RAP components

#rap-comp-table {display: none;}
@@ -1779,7 +1779,7 @@

RAP components

- + @@ -1813,7 +1813,7 @@

Basic RAP scores

#basic-rap-scores-table {display: none;}
@@ -1860,7 +1860,7 @@

Basic RAP scores

- + @@ -1894,7 +1894,7 @@

Advanced RAP scores
@@ -1945,7 +1945,7 @@

Advanced RAP scores

- + diff --git a/docs/site_libs/htmlwidgets-1.6.2/htmlwidgets.js b/docs/site_libs/htmlwidgets-1.6.1/htmlwidgets.js similarity index 100% rename from docs/site_libs/htmlwidgets-1.6.2/htmlwidgets.js rename to docs/site_libs/htmlwidgets-1.6.1/htmlwidgets.js diff --git a/docs/summary.html b/docs/summary.html index 0f85c16..4c5300b 100644 --- a/docs/summary.html +++ b/docs/summary.html @@ -48,7 +48,7 @@ "search-submit-button-title": "Submit" } } - + @@ -185,7 +185,7 @@

2022 data

#coding-freq-table {display: none;}
@@ -224,7 +224,7 @@

2022 data

- + @@ -258,7 +258,7 @@

Coding frequenc #code-freq-table {display: none;}
@@ -304,7 +304,7 @@

Coding frequenc

- + @@ -350,7 +350,7 @@

Grade

#grades-by-year-table {display: none;}
@@ -394,7 +394,7 @@

Grade

- + diff --git a/docs/departments/centre-for-environment-fisheries-and-aquaculture-science.html b/docs/departments/centre-for-environment-fisheries-and-aquaculture-science.html new file mode 100644 index 0000000..8af0cb9 --- /dev/null +++ b/docs/departments/centre-for-environment-fisheries-and-aquaculture-science.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Centre for Environment, Fisheries and Aquaculture Science + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Centre for Environment, Fisheries and Aquaculture Science

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 0%
Rarely 5.1%
Sometimes 23.1%
Regularly 23.1%
All the time 48.7%
Sample size = 39
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 89.5% 10.5%
Data cleaning 84.6% 15.4%
Data linking 84.6% 15.4%
Data transfer / migration 76% 24%
Data visualisation 86.8% 13.2%
Machine learning 81.8% 18.2%
Modelling 85.7% 14.3%
Quality assurance 69% 31%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 30.8% 64.1% 5.1%
Java / Scala 20.5% 76.9% 2.6%
Javascript / Typescript 20.5% 76.9% 2.6%
Matlab 35.9% 43.6% 20.5%
Python 89.7% 10.3% 0%
R 97.4% 2.6% 0%
SAS 2.6% 92.3% 5.1%
SPSS 5.1% 82.1% 12.8%
SQL 69.2% 28.2% 2.6%
Stata 10.3% 84.6% 5.1%
VBA 25.6% 74.4% 0%
Sample size = 39
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 12.8% 5.1% 82.1%
Java / Scala 0% 7.7% 92.3%
Javascript / Typescript 2.6% 5.1% 92.3%
Matlab 35.9% 2.6% 61.5%
Python 38.5% 2.6% 59%
R 87.2% 5.1% 7.7%
SAS 7.7% 7.7% 84.6%
SPSS 20.5% 10.3% 69.2%
SQL 41% 2.6% 56.4%
Stata 7.7% 10.3% 82.1%
VBA 15.4% 12.8% 71.8%
Sample size = 39
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 87.2%
No 2.6%
I don't know 10.3%
Sample size = 39
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 69.2%
No 30.8%
I don't know 0%
Sample size = 39
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 3.4%
Slightly worse 6.9%
No change 17.2%
Slightly better 34.5%
Significantly better 37.9%
Sample size = 29
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 25.6%
In education 59%
In private sector employment 2.6%
In public sector employment 0%
Self-taught 12.8%
Other 0%
Sample size = 39
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 76.9% 10.3% 5.1% 5.1% 0% 2.6%
Automated data quality assurance 5.1% 20.5% 17.9% 33.3% 15.4% 7.7%
Code review 0% 7.7% 30.8% 43.6% 15.4% 2.6%
Coding guidelines / Style guides 7.7% 20.5% 10.3% 35.9% 20.5% 5.1%
Functions 0% 7.7% 10.3% 23.1% 38.5% 20.5%
Open source own code 5.1% 23.1% 12.8% 43.6% 7.7% 7.7%
Packaging code 5.1% 46.2% 25.6% 17.9% 5.1% 0%
Standard directory structure 12.8% 20.5% 17.9% 17.9% 20.5% 10.3%
Unit testing 30.8% 10.3% 12.8% 33.3% 10.3% 2.6%
Use open source software 7.7% 0% 2.6% 10.3% 20.5% 59%
Version control 5.1% 23.1% 5.1% 33.3% 20.5% 12.8%
Sample size = 39
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 23.1% 46.2% 12.8% 15.4% 2.6% 0%
Code comments 2.6% 0% 7.7% 10.3% 25.6% 53.8%
Data or assumptions registers 25.6% 53.8% 7.7% 5.1% 7.7% 0%
Desk notes 23.1% 17.9% 15.4% 28.2% 12.8% 2.6%
Documentation for each function or class 7.7% 28.2% 17.9% 12.8% 28.2% 5.1%
Flow charts 5.1% 46.2% 20.5% 25.6% 2.6% 0%
README files 5.1% 20.5% 17.9% 15.4% 28.2% 12.8%
Sample size = 39
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 25.6%
No 53.8%
I don't know what dependency management is 20.5%
Sample size = 39
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 12.8%
No 53.8%
I don't know what continuous integration is 33.3%
Sample size = 39
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 2.6%
No 69.2%
I don't know what reproducible workflows are 28.2%
Sample size = 39
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 69.2%
I don't know what a RAP champion is 15.4%
I know what a RAP champion is but don't know who the RAP champion in my department is 10.3%
I know what a RAP champion is and there is no RAP champion in my department 2.6%
I know who the RAP champion in my department is 2.6%
Sample size = 39
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 50%
I have heard of the RAP strategy, but I haven't read it 50%
I have read the RAP strategy 0%
Sample size = 12
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 25% 16.7% 33.3% 25% 0%
I feel confident implementing RAP in my work 16.7% 33.3% 16.7% 33.3% 0%
I feel supported to implement RAP in my work 16.7% 33.3% 16.7% 33.3% 0%
I know where to find resources to help me implement RAP 25% 41.7% 8.3% 16.7% 8.3%
I or my team are planning on implementing RAP in the next 12 months 25% 0% 25% 50% 0%
I think it is important to implement RAP in my work 0% 0% 25% 50% 25%
I understand what the key components of the RAP methodology are 8.3% 8.3% 25% 58.3% 0%
Sample size = 12
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 79.5%
Documentation Basic 35.9%
Version control Basic 33.3%
Peer review Basic 17.9%
Team open source code Basic 15.4%
AQUA book guidance Basic 2.6%
Functions Advanced 59%
Function documentation Advanced 33.3%
Follow code style guidelines Advanced 25.6%
Dependency management Advanced 25.6%
Unit testing Advanced 12.8%
Continuous integration Advanced 12.8%
Code packages Advanced 5.1%
Sample size = 39
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 7.7%
1 41%
2 25.6%
3 12.8%
4 10.3%
5 2.6%
6 0%
Sample size = 39
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 23.1%
1 28.2%
2 20.5%
3 12.8%
4 10.3%
5 5.1%
6 0%
7 0%
Sample size = 39
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-business-energy-and-industrial-strategy-excl-agencies-.html b/docs/departments/department-for-business-energy-and-industrial-strategy-excl-agencies-.html new file mode 100644 index 0000000..349beb7 --- /dev/null +++ b/docs/departments/department-for-business-energy-and-industrial-strategy-excl-agencies-.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for Business, Energy and Industrial Strategy (excl. agencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for Business, Energy and Industrial Strategy (excl. agencies)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 15%
Rarely 10%
Sometimes 30%
Regularly 30%
All the time 15%
Sample size = 20
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 75% 25%
Data cleaning 94.4% 5.6%
Data linking 87.5% 12.5%
Data transfer / migration 63.6% 36.4%
Data visualisation 61.1% 38.9%
Machine learning 100% 0%
Modelling 69.2% 30.8%
Quality assurance 55.6% 44.4%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 0% 75% 25%
Java / Scala 0% 80% 20%
Javascript / Typescript 15% 70% 15%
Matlab 40% 50% 10%
Python 95% 0% 5%
R 100% 0% 0%
SAS 60% 35% 5%
SPSS 50% 30% 20%
SQL 90% 10% 0%
Stata 40% 50% 10%
VBA 80% 20% 0%
Sample size = 20
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 10% 0% 90%
Java / Scala 5% 0% 95%
Javascript / Typescript 5% 0% 95%
Matlab 10% 0% 90%
Python 50% 0% 50%
R 70% 0% 30%
SAS 15% 0% 85%
SPSS 45% 0% 55%
SQL 85% 0% 15%
Stata 15% 0% 85%
VBA 50% 0% 50%
Sample size = 20
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 90%
No 0%
I don't know 10%
Sample size = 20
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 70%
No 30%
I don't know 0%
Sample size = 20
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 0%
Slightly worse 12.5%
No change 6.2%
Slightly better 37.5%
Significantly better 43.8%
Sample size = 16
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 5.9%
In education 70.6%
In private sector employment 0%
In public sector employment 11.8%
Self-taught 11.8%
Other 0%
Sample size = 17
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 35.3% 5.9% 0% 17.6% 29.4% 11.8%
Automated data quality assurance 5.9% 11.8% 23.5% 35.3% 23.5% 0%
Code review 0% 0% 5.9% 11.8% 52.9% 29.4%
Coding guidelines / Style guides 5.9% 5.9% 11.8% 17.6% 41.2% 17.6%
Functions 0% 5.9% 5.9% 11.8% 41.2% 35.3%
Open source own code 23.5% 47.1% 11.8% 5.9% 5.9% 5.9%
Packaging code 5.9% 41.2% 17.6% 29.4% 5.9% 0%
Standard directory structure 35.3% 17.6% 5.9% 0% 29.4% 11.8%
Unit testing 41.2% 5.9% 5.9% 23.5% 23.5% 0%
Use open source software 5.9% 0% 5.9% 11.8% 29.4% 47.1%
Version control 5.9% 23.5% 5.9% 5.9% 23.5% 35.3%
Sample size = 17
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 11.8% 11.8% 23.5% 23.5% 23.5% 5.9%
Code comments 0% 0% 0% 5.9% 17.6% 76.5%
Data or assumptions registers 0% 11.8% 5.9% 17.6% 47.1% 17.6%
Desk notes 23.5% 5.9% 11.8% 5.9% 29.4% 23.5%
Documentation for each function or class 11.8% 11.8% 17.6% 11.8% 11.8% 35.3%
Flow charts 5.9% 29.4% 11.8% 17.6% 29.4% 5.9%
README files 5.9% 17.6% 0% 29.4% 29.4% 17.6%
Sample size = 17
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 35.3%
No 17.6%
I don't know what dependency management is 47.1%
Sample size = 17
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 17.6%
No 35.3%
I don't know what continuous integration is 47.1%
Sample size = 17
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 41.2%
I don't know what reproducible workflows are 58.8%
Sample size = 17
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 5%
I don't know what a RAP champion is 20%
I know what a RAP champion is but don't know who the RAP champion in my department is 45%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 30%
Sample size = 20
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 26.3%
I have heard of the RAP strategy, but I haven't read it 42.1%
I have read the RAP strategy 31.6%
Sample size = 19
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 10.5% 26.3% 15.8% 31.6% 15.8%
I feel confident implementing RAP in my work 5.3% 26.3% 26.3% 21.1% 21.1%
I feel supported to implement RAP in my work 5.3% 15.8% 10.5% 57.9% 10.5%
I know where to find resources to help me implement RAP 5.3% 26.3% 15.8% 36.8% 15.8%
I or my team are planning on implementing RAP in the next 12 months 5.3% 21.1% 15.8% 36.8% 21.1%
I think it is important to implement RAP in my work 5.3% 10.5% 10.5% 42.1% 31.6%
I understand what the key components of the RAP methodology are 5.3% 10.5% 15.8% 36.8% 31.6%
Sample size = 19
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Peer review Basic 82.4%
Use open source software Basic 76.5%
Version control Basic 58.8%
AQUA book guidance Basic 41.2%
Documentation Basic 41.2%
Team open source code Basic 11.8%
Functions Advanced 76.5%
Follow code style guidelines Advanced 58.8%
Function documentation Advanced 47.1%
Dependency management Advanced 35.3%
Unit testing Advanced 23.5%
Continuous integration Advanced 17.6%
Code packages Advanced 5.9%
Sample size = 17
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 0%
1 23.5%
2 11.8%
3 23.5%
4 11.8%
5 29.4%
6 0%
Sample size = 17
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 23.5%
1 17.6%
2 5.9%
3 11.8%
4 11.8%
5 23.5%
6 5.9%
7 0%
Sample size = 17
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-digital-culture-media-and-sport.html b/docs/departments/department-for-digital-culture-media-and-sport.html new file mode 100644 index 0000000..6fcedd2 --- /dev/null +++ b/docs/departments/department-for-digital-culture-media-and-sport.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for Digital, Culture, Media and Sport + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for Digital, Culture, Media and Sport

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 28%
Rarely 16%
Sometimes 28%
Regularly 20%
All the time 8%
Sample size = 25
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 52% 48%
Data cleaning 57.9% 42.1%
Data linking 75% 25%
Data transfer / migration 45.5% 54.5%
Data visualisation 47.8% 52.2%
Machine learning 80% 20%
Modelling 56.2% 43.8%
Quality assurance 32% 68%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 4% 76% 20%
Java / Scala 8% 72% 20%
Javascript / Typescript 8% 72% 20%
Matlab 0% 76% 24%
Python 76% 20% 4%
R 88% 12% 0%
SAS 4% 68% 28%
SPSS 40% 48% 12%
SQL 32% 48% 20%
Stata 12% 64% 24%
VBA 44% 48% 8%
Sample size = 25
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 12% 4% 84%
Java / Scala 0% 4% 96%
Javascript / Typescript 0% 4% 96%
Matlab 8% 8% 84%
Python 48% 4% 48%
R 68% 8% 24%
SAS 8% 4% 88%
SPSS 28% 4% 68%
SQL 48% 4% 48%
Stata 16% 4% 80%
VBA 28% 4% 68%
Sample size = 25
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 28%
No 12%
I don't know 60%
Sample size = 25
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 16%
No 72%
I don't know 12%
Sample size = 25
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 0%
Slightly worse 41.2%
No change 5.9%
Slightly better 47.1%
Significantly better 5.9%
Sample size = 17
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 20%
In education 60%
In private sector employment 10%
In public sector employment 5%
Self-taught 5%
Other 0%
Sample size = 20
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 22.2% 22.2% 16.7% 27.8% 5.6% 5.6%
Automated data quality assurance 16.7% 44.4% 16.7% 16.7% 0% 5.6%
Code review 0% 5.6% 11.1% 27.8% 22.2% 33.3%
Coding guidelines / Style guides 16.7% 22.2% 0% 27.8% 11.1% 22.2%
Functions 16.7% 16.7% 11.1% 16.7% 11.1% 27.8%
Open source own code 22.2% 61.1% 11.1% 5.6% 0% 0%
Packaging code 33.3% 50% 0% 0% 5.6% 11.1%
Standard directory structure 38.9% 22.2% 16.7% 0% 11.1% 11.1%
Unit testing 50% 16.7% 16.7% 5.6% 0% 11.1%
Use open source software 11.1% 11.1% 5.6% 11.1% 27.8% 33.3%
Version control 11.1% 61.1% 16.7% 5.6% 0% 5.6%
Sample size = 18
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 27.8% 11.1% 11.1% 27.8% 16.7% 5.6%
Code comments 5.6% 5.6% 0% 5.6% 27.8% 55.6%
Data or assumptions registers 16.7% 16.7% 16.7% 22.2% 11.1% 16.7%
Desk notes 33.3% 22.2% 5.6% 16.7% 11.1% 11.1%
Documentation for each function or class 27.8% 27.8% 16.7% 16.7% 5.6% 5.6%
Flow charts 11.1% 38.9% 22.2% 27.8% 0% 0%
README files 16.7% 33.3% 16.7% 16.7% 11.1% 5.6%
Sample size = 18
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 5.6%
No 33.3%
I don't know what dependency management is 61.1%
Sample size = 18
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 0%
No 61.1%
I don't know what continuous integration is 38.9%
Sample size = 18
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 38.9%
I don't know what reproducible workflows are 61.1%
Sample size = 18
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 40%
I don't know what a RAP champion is 28%
I know what a RAP champion is but don't know who the RAP champion in my department is 24%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 8%
Sample size = 25
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 40%
I have heard of the RAP strategy, but I haven't read it 46.7%
I have read the RAP strategy 13.3%
Sample size = 15
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 6.7% 46.7% 33.3% 0% 13.3%
I feel confident implementing RAP in my work 13.3% 20% 26.7% 20% 20%
I feel supported to implement RAP in my work 6.7% 33.3% 40% 13.3% 6.7%
I know where to find resources to help me implement RAP 13.3% 40% 26.7% 13.3% 6.7%
I or my team are planning on implementing RAP in the next 12 months 0% 13.3% 40% 26.7% 20%
I think it is important to implement RAP in my work 0% 6.7% 13.3% 46.7% 33.3%
I understand what the key components of the RAP methodology are 6.7% 26.7% 40% 20% 6.7%
Sample size = 15
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 61.1%
Peer review Basic 55.6%
Documentation Basic 16.7%
AQUA book guidance Basic 11.1%
Version control Basic 5.6%
Team open source code Basic 0%
Functions Advanced 38.9%
Follow code style guidelines Advanced 33.3%
Code packages Advanced 16.7%
Unit testing Advanced 11.1%
Function documentation Advanced 11.1%
Dependency management Advanced 5.6%
Continuous integration Advanced 0%
Sample size = 18
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 16.7%
1 38.9%
2 27.8%
3 11.1%
4 5.6%
5 0%
6 0%
Sample size = 18
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 44.4%
1 27.8%
2 11.1%
3 5.6%
4 5.6%
5 5.6%
6 0%
7 0%
Sample size = 18
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-education.html b/docs/departments/department-for-education.html new file mode 100644 index 0000000..0efae4d --- /dev/null +++ b/docs/departments/department-for-education.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for Education + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for Education

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 4.8%
Rarely 7.1%
Sometimes 9.5%
Regularly 42.9%
All the time 35.7%
Sample size = 42
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 90.2% 9.8%
Data cleaning 92.3% 7.7%
Data linking 94.1% 5.9%
Data transfer / migration 78.3% 21.7%
Data visualisation 81.6% 18.4%
Machine learning 100% 0%
Modelling 79.2% 20.8%
Quality assurance 80.5% 19.5%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 7.1% 66.7% 26.2%
Java / Scala 4.8% 81% 14.3%
Javascript / Typescript 2.4% 85.7% 11.9%
Matlab 7.1% 61.9% 31%
Python 57.1% 35.7% 7.1%
R 97.6% 0% 2.4%
SAS 9.5% 66.7% 23.8%
SPSS 52.4% 35.7% 11.9%
SQL 85.7% 9.5% 4.8%
Stata 23.8% 61.9% 14.3%
VBA 66.7% 28.6% 4.8%
Sample size = 42
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 7.1% 14.3% 78.6%
Java / Scala 2.4% 11.9% 85.7%
Javascript / Typescript 7.1% 14.3% 78.6%
Matlab 11.9% 16.7% 71.4%
Python 28.6% 7.1% 64.3%
R 83.3% 0% 16.7%
SAS 28.6% 4.8% 66.7%
SPSS 42.9% 9.5% 47.6%
SQL 76.2% 0% 23.8%
Stata 16.7% 7.1% 76.2%
VBA 26.2% 7.1% 66.7%
Sample size = 42
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 90.5%
No 0%
I don't know 9.5%
Sample size = 42
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 73.8%
No 23.8%
I don't know 2.4%
Sample size = 42
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 2.8%
Slightly worse 11.1%
No change 11.1%
Slightly better 41.7%
Significantly better 33.3%
Sample size = 36
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 14.3%
In education 54.8%
In private sector employment 4.8%
In public sector employment 9.5%
Self-taught 16.7%
Other 0%
Sample size = 42
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 22.5% 10% 2.5% 25% 25% 15%
Automated data quality assurance 5% 10% 15% 32.5% 30% 7.5%
Code review 0% 0% 10% 20% 35% 35%
Coding guidelines / Style guides 7.5% 10% 0% 25% 32.5% 25%
Functions 2.5% 10% 22.5% 10% 27.5% 27.5%
Open source own code 22.5% 42.5% 15% 2.5% 12.5% 5%
Packaging code 12.5% 47.5% 17.5% 7.5% 7.5% 7.5%
Standard directory structure 20% 17.5% 7.5% 17.5% 12.5% 25%
Unit testing 30% 15% 12.5% 27.5% 7.5% 7.5%
Use open source software 5% 12.5% 2.5% 5% 25% 50%
Version control 0% 25% 10% 17.5% 20% 27.5%
Sample size = 40
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 10% 10% 15% 32.5% 17.5% 15%
Code comments 0% 5% 0% 5% 17.5% 72.5%
Data or assumptions registers 5% 5% 12.5% 25% 27.5% 25%
Desk notes 25% 25% 7.5% 20% 7.5% 15%
Documentation for each function or class 12.5% 32.5% 12.5% 17.5% 15% 10%
Flow charts 5% 27.5% 35% 25% 5% 2.5%
README files 2.5% 22.5% 15% 27.5% 12.5% 20%
Sample size = 40
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 32.5%
No 32.5%
I don't know what dependency management is 35%
Sample size = 40
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 15%
No 27.5%
I don't know what continuous integration is 57.5%
Sample size = 40
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 65%
I don't know what reproducible workflows are 35%
Sample size = 40
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 19.5%
I don't know what a RAP champion is 24.4%
I know what a RAP champion is but don't know who the RAP champion in my department is 39%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 17.1%
Sample size = 41
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 32.4%
I have heard of the RAP strategy, but I haven't read it 38.2%
I have read the RAP strategy 29.4%
Sample size = 34
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 14.7% 14.7% 20.6% 23.5% 26.5%
I feel confident implementing RAP in my work 8.8% 17.6% 20.6% 35.3% 17.6%
I feel supported to implement RAP in my work 8.8% 11.8% 35.3% 17.6% 26.5%
I know where to find resources to help me implement RAP 5.9% 20.6% 26.5% 23.5% 23.5%
I or my team are planning on implementing RAP in the next 12 months 14.7% 5.9% 23.5% 26.5% 29.4%
I think it is important to implement RAP in my work 8.8% 5.9% 23.5% 20.6% 41.2%
I understand what the key components of the RAP methodology are 8.8% 11.8% 17.6% 38.2% 23.5%
Sample size = 34
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 75%
Peer review Basic 70%
Version control Basic 47.5%
AQUA book guidance Basic 40%
Documentation Basic 32.5%
Team open source code Basic 17.5%
Follow code style guidelines Advanced 57.5%
Functions Advanced 55%
Dependency management Advanced 32.5%
Function documentation Advanced 25%
Unit testing Advanced 15%
Code packages Advanced 15%
Continuous integration Advanced 15%
Sample size = 40
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 5%
1 27.5%
2 15%
3 15%
4 15%
5 15%
6 7.5%
Sample size = 40
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 30%
1 17.5%
2 15%
3 7.5%
4 15%
5 7.5%
6 5%
7 2.5%
Sample size = 40
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-environment-food-and-rural-affairs-excl-agencies-.html b/docs/departments/department-for-environment-food-and-rural-affairs-excl-agencies-.html new file mode 100644 index 0000000..e389f76 --- /dev/null +++ b/docs/departments/department-for-environment-food-and-rural-affairs-excl-agencies-.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for Environment, Food and Rural Affairs (excl. agencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for Environment, Food and Rural Affairs (excl. agencies)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 22.9%
Rarely 11.4%
Sometimes 11.4%
Regularly 31.4%
All the time 22.9%
Sample size = 35
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 79.3% 20.7%
Data cleaning 77.8% 22.2%
Data linking 76.5% 23.5%
Data transfer / migration 80% 20%
Data visualisation 76.7% 23.3%
Machine learning 100% 0%
Modelling 82.4% 17.6%
Quality assurance 73.1% 26.9%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 5.7% 71.4% 22.9%
Java / Scala 17.1% 62.9% 20%
Javascript / Typescript 14.3% 57.1% 28.6%
Matlab 8.6% 45.7% 45.7%
Python 60% 31.4% 8.6%
R 91.4% 8.6% 0%
SAS 11.4% 65.7% 22.9%
SPSS 25.7% 57.1% 17.1%
SQL 54.3% 34.3% 11.4%
Stata 22.9% 57.1% 20%
VBA 48.6% 42.9% 8.6%
Sample size = 35
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 11.4% 8.6% 80%
Java / Scala 5.7% 14.3% 80%
Javascript / Typescript 8.6% 11.4% 80%
Matlab 17.1% 11.4% 71.4%
Python 45.7% 8.6% 45.7%
R 80% 0% 20%
SAS 2.9% 14.3% 82.9%
SPSS 14.3% 11.4% 74.3%
SQL 51.4% 8.6% 40%
Stata 5.7% 11.4% 82.9%
VBA 20% 14.3% 65.7%
Sample size = 35
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 62.9%
No 11.4%
I don't know 25.7%
Sample size = 35
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 71.4%
No 28.6%
I don't know 0%
Sample size = 35
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 13.3%
Slightly worse 13.3%
No change 6.7%
Slightly better 46.7%
Significantly better 20%
Sample size = 30
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 6.5%
In education 64.5%
In private sector employment 0%
In public sector employment 3.2%
Self-taught 22.6%
Other 3.2%
Sample size = 31
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 29.6% 14.8% 18.5% 18.5% 18.5% 0%
Automated data quality assurance 3.7% 22.2% 18.5% 29.6% 22.2% 3.7%
Code review 0% 14.8% 14.8% 25.9% 33.3% 11.1%
Coding guidelines / Style guides 3.7% 18.5% 7.4% 18.5% 37% 14.8%
Functions 0% 7.4% 11.1% 14.8% 33.3% 33.3%
Open source own code 0% 37% 14.8% 25.9% 18.5% 3.7%
Packaging code 7.4% 29.6% 22.2% 22.2% 18.5% 0%
Standard directory structure 25.9% 3.7% 14.8% 18.5% 29.6% 7.4%
Unit testing 22.2% 14.8% 14.8% 29.6% 11.1% 7.4%
Use open source software 3.7% 3.7% 0% 18.5% 18.5% 55.6%
Version control 3.7% 18.5% 7.4% 7.4% 40.7% 22.2%
Sample size = 27
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 18.5% 44.4% 7.4% 11.1% 14.8% 3.7%
Code comments 0% 3.7% 3.7% 3.7% 33.3% 55.6%
Data or assumptions registers 22.2% 40.7% 7.4% 14.8% 14.8% 0%
Desk notes 18.5% 7.4% 18.5% 29.6% 25.9% 0%
Documentation for each function or class 3.7% 22.2% 22.2% 7.4% 29.6% 14.8%
Flow charts 0% 55.6% 14.8% 25.9% 3.7% 0%
README files 0% 25.9% 3.7% 14.8% 44.4% 11.1%
Sample size = 27
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 33.3%
No 37%
I don't know what dependency management is 29.6%
Sample size = 27
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 18.5%
No 48.1%
I don't know what continuous integration is 33.3%
Sample size = 27
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 7.4%
No 59.3%
I don't know what reproducible workflows are 33.3%
Sample size = 27
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 14.3%
I don't know what a RAP champion is 17.1%
I know what a RAP champion is but don't know who the RAP champion in my department is 37.1%
I know what a RAP champion is and there is no RAP champion in my department 5.7%
I know who the RAP champion in my department is 25.7%
Sample size = 35
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 23.3%
I have heard of the RAP strategy, but I haven't read it 46.7%
I have read the RAP strategy 30%
Sample size = 30
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 10% 20% 20% 43.3% 6.7%
I feel confident implementing RAP in my work 10% 16.7% 23.3% 33.3% 16.7%
I feel supported to implement RAP in my work 16.7% 20% 43.3% 16.7% 3.3%
I know where to find resources to help me implement RAP 10% 30% 16.7% 40% 3.3%
I or my team are planning on implementing RAP in the next 12 months 10% 6.7% 30% 46.7% 6.7%
I think it is important to implement RAP in my work 6.7% 6.7% 13.3% 40% 33.3%
I understand what the key components of the RAP methodology are 10% 10% 20% 53.3% 6.7%
Sample size = 30
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 74.1%
Version control Basic 63%
Documentation Basic 51.9%
Peer review Basic 44.4%
Team open source code Basic 22.2%
AQUA book guidance Basic 18.5%
Functions Advanced 66.7%
Follow code style guidelines Advanced 51.9%
Function documentation Advanced 44.4%
Dependency management Advanced 33.3%
Unit testing Advanced 18.5%
Code packages Advanced 18.5%
Continuous integration Advanced 18.5%
Sample size = 27
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 11.1%
1 18.5%
2 11.1%
3 22.2%
4 22.2%
5 11.1%
6 3.7%
Sample size = 27
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 11.1%
1 14.8%
2 25.9%
3 22.2%
4 14.8%
5 7.4%
6 3.7%
7 0%
Sample size = 27
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-environment-food-and-rural-affairs-including-agencies-.html b/docs/departments/department-for-environment-food-and-rural-affairs-including-agencies-.html new file mode 100644 index 0000000..8dee199 --- /dev/null +++ b/docs/departments/department-for-environment-food-and-rural-affairs-including-agencies-.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for Environment, Food and Rural Affairs (including agencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for Environment, Food and Rural Affairs (including agencies)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 8.9%
Rarely 10.4%
Sometimes 17%
Regularly 29.6%
All the time 34.1%
Sample size = 135
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 84.9% 15.1%
Data cleaning 81.1% 18.9%
Data linking 82% 18%
Data transfer / migration 68.6% 31.4%
Data visualisation 82.7% 17.3%
Machine learning 92.5% 7.5%
Modelling 87.4% 12.6%
Quality assurance 69.2% 30.8%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 16.3% 65.9% 17.8%
Java / Scala 15.6% 68.9% 15.6%
Javascript / Typescript 13.3% 68.1% 18.5%
Matlab 15.6% 50.4% 34.1%
Python 70.4% 23.7% 5.9%
R 92.6% 6.7% 0.7%
SAS 11.1% 75.6% 13.3%
SPSS 14.1% 71.1% 14.8%
SQL 57% 37% 5.9%
Stata 11.1% 72.6% 16.3%
VBA 34.1% 59.3% 6.7%
Sample size = 135
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 11.1% 4.4% 84.4%
Java / Scala 3.7% 6.7% 89.6%
Javascript / Typescript 8.1% 5.2% 86.7%
Matlab 23.7% 5.9% 70.4%
Python 39.3% 3.7% 57%
R 80.7% 1.5% 17.8%
SAS 7.4% 6.7% 85.9%
SPSS 20.7% 8.1% 71.1%
SQL 48.1% 4.4% 47.4%
Stata 7.4% 7.4% 85.2%
VBA 19.3% 8.9% 71.9%
Sample size = 135
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 65.9%
No 8.9%
I don't know 25.2%
Sample size = 135
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 58.5%
No 41.5%
I don't know 0%
Sample size = 135
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 7.3%
Slightly worse 13.8%
No change 12.8%
Slightly better 38.5%
Significantly better 27.5%
Sample size = 109
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 16.4%
In education 57%
In private sector employment 2.3%
In public sector employment 4.7%
Self-taught 17.2%
Other 2.3%
Sample size = 128
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 56.9% 13.8% 8.1% 11.4% 8.9% 0.8%
Automated data quality assurance 6.5% 19.5% 14.6% 34.1% 18.7% 6.5%
Code review 0% 15.4% 18.7% 35.8% 25.2% 4.9%
Coding guidelines / Style guides 4.9% 20.3% 6.5% 30.1% 26.8% 11.4%
Functions 2.4% 12.2% 8.9% 24.4% 29.3% 22.8%
Open source own code 4.1% 35.8% 14.6% 30.9% 8.9% 5.7%
Packaging code 7.3% 41.5% 23.6% 14.6% 10.6% 2.4%
Standard directory structure 17.1% 17.9% 12.2% 22% 22% 8.9%
Unit testing 24.4% 17.1% 10.6% 30.9% 12.2% 4.9%
Use open source software 4.1% 4.9% 5.7% 13% 20.3% 52%
Version control 6.5% 29.3% 8.9% 18.7% 22.8% 13.8%
Sample size = 123
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 17.9% 45.5% 10.6% 14.6% 5.7% 5.7%
Code comments 0.8% 4.9% 4.9% 11.4% 26% 52%
Data or assumptions registers 22% 48.8% 10.6% 11.4% 6.5% 0.8%
Desk notes 14.6% 17.9% 13% 30.1% 17.1% 7.3%
Documentation for each function or class 5.7% 27.6% 19.5% 16.3% 22% 8.9%
Flow charts 2.4% 48% 19.5% 22.8% 6.5% 0.8%
README files 2.4% 22% 11.4% 25.2% 26.8% 12.2%
Sample size = 123
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 26%
No 43.9%
I don't know what dependency management is 30.1%
Sample size = 123
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 15.4%
No 45.5%
I don't know what continuous integration is 39%
Sample size = 123
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 5.7%
No 65.9%
I don't know what reproducible workflows are 28.5%
Sample size = 123
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 42.5%
I don't know what a RAP champion is 17.9%
I know what a RAP champion is but don't know who the RAP champion in my department is 17.9%
I know what a RAP champion is and there is no RAP champion in my department 6%
I know who the RAP champion in my department is 15.7%
Sample size = 134
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 38.5%
I have heard of the RAP strategy, but I haven't read it 34.6%
I have read the RAP strategy 26.9%
Sample size = 78
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 14.1% 19.2% 26.9% 32.1% 7.7%
I feel confident implementing RAP in my work 12.8% 20.5% 20.5% 33.3% 12.8%
I feel supported to implement RAP in my work 15.4% 25.6% 34.6% 21.8% 2.6%
I know where to find resources to help me implement RAP 14.1% 35.9% 14.1% 28.2% 7.7%
I or my team are planning on implementing RAP in the next 12 months 11.5% 6.4% 28.2% 38.5% 15.4%
I think it is important to implement RAP in my work 2.6% 6.4% 19.2% 41% 30.8%
I understand what the key components of the RAP methodology are 9% 16.7% 20.5% 46.2% 7.7%
Sample size = 78
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 72.4%
Version control Basic 36.6%
Documentation Basic 35%
Peer review Basic 30.1%
Team open source code Basic 14.6%
AQUA book guidance Basic 9.8%
Functions Advanced 52%
Follow code style guidelines Advanced 38.2%
Function documentation Advanced 30.9%
Dependency management Advanced 26%
Unit testing Advanced 17.1%
Continuous integration Advanced 15.4%
Code packages Advanced 13%
Sample size = 123
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 13.8%
1 31.7%
2 21.1%
3 15.4%
4 12.2%
5 4.9%
6 0.8%
Sample size = 123
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 22.8%
1 24.4%
2 22%
3 12.2%
4 9.8%
5 5.7%
6 2.4%
7 0.8%
Sample size = 123
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-international-trade.html b/docs/departments/department-for-international-trade.html new file mode 100644 index 0000000..0fa70c3 --- /dev/null +++ b/docs/departments/department-for-international-trade.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for International Trade + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for International Trade

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 28.4%
Rarely 13.6%
Sometimes 13.6%
Regularly 22.7%
All the time 21.6%
Sample size = 88
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 65.5% 34.5%
Data cleaning 75.8% 24.2%
Data linking 66.7% 33.3%
Data transfer / migration 51.4% 48.6%
Data visualisation 57.9% 42.1%
Machine learning 71.4% 28.6%
Modelling 65.8% 34.2%
Quality assurance 44% 56%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 6.8% 71.6% 21.6%
Java / Scala 6.8% 71.6% 21.6%
Javascript / Typescript 8% 71.6% 20.5%
Matlab 2.3% 71.6% 26.1%
Python 59.1% 33% 8%
R 90.9% 4.5% 4.5%
SAS 11.4% 68.2% 20.5%
SPSS 20.5% 58% 21.6%
SQL 55.7% 31.8% 12.5%
Stata 29.5% 52.3% 18.2%
VBA 26.1% 60.2% 13.6%
Sample size = 88
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 4.5% 10.2% 85.2%
Java / Scala 3.4% 11.4% 85.2%
Javascript / Typescript 2.3% 11.4% 86.4%
Matlab 14.8% 10.2% 75%
Python 35.2% 9.1% 55.7%
R 65.9% 4.5% 29.5%
SAS 8% 11.4% 80.7%
SPSS 29.5% 9.1% 61.4%
SQL 35.2% 8% 56.8%
Stata 25% 8% 67%
VBA 8% 8% 84.1%
Sample size = 88
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 52.3%
No 5.7%
I don't know 42%
Sample size = 88
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 46.6%
No 43.2%
I don't know 10.2%
Sample size = 88
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 6.8%
Slightly worse 15.3%
No change 25.4%
Slightly better 32.2%
Significantly better 20.3%
Sample size = 59
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 26%
In education 44.2%
In private sector employment 1.3%
In public sector employment 22.1%
Self-taught 5.2%
Other 1.3%
Sample size = 77
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 22.2% 22.2% 14.3% 19% 17.5% 4.8%
Automated data quality assurance 7.9% 34.9% 19% 20.6% 12.7% 4.8%
Code review 4.8% 14.3% 6.3% 25.4% 34.9% 14.3%
Coding guidelines / Style guides 12.7% 17.5% 14.3% 11.1% 36.5% 7.9%
Functions 7.9% 11.1% 7.9% 19% 27% 27%
Open source own code 31.7% 36.5% 11.1% 11.1% 7.9% 1.6%
Packaging code 22.2% 49.2% 11.1% 9.5% 3.2% 4.8%
Standard directory structure 31.7% 15.9% 14.3% 11.1% 20.6% 6.3%
Unit testing 39.7% 15.9% 12.7% 15.9% 3.2% 12.7%
Use open source software 19% 9.5% 9.5% 11.1% 25.4% 25.4%
Version control 15.9% 31.7% 6.3% 11.1% 20.6% 14.3%
Sample size = 63
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 25.4% 33.3% 11.1% 17.5% 7.9% 4.8%
Code comments 7.9% 9.5% 4.8% 6.3% 17.5% 54%
Data or assumptions registers 11.1% 30.2% 4.8% 11.1% 30.2% 12.7%
Desk notes 30.2% 31.7% 12.7% 14.3% 11.1% 0%
Documentation for each function or class 19% 34.9% 7.9% 9.5% 17.5% 11.1%
Flow charts 15.9% 41.3% 12.7% 17.5% 9.5% 3.2%
README files 14.3% 36.5% 7.9% 14.3% 14.3% 12.7%
Sample size = 63
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 15.9%
No 31.7%
I don't know what dependency management is 52.4%
Sample size = 63
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 11.1%
No 39.7%
I don't know what continuous integration is 49.2%
Sample size = 63
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 1.6%
No 39.7%
I don't know what reproducible workflows are 58.7%
Sample size = 63
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 16.3%
I don't know what a RAP champion is 16.3%
I know what a RAP champion is but don't know who the RAP champion in my department is 19.8%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 47.7%
Sample size = 86
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 28.4%
I have heard of the RAP strategy, but I haven't read it 51.4%
I have read the RAP strategy 20.3%
Sample size = 74
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 25.7% 21.6% 21.6% 21.6% 9.5%
I feel confident implementing RAP in my work 21.6% 17.6% 24.3% 21.6% 14.9%
I feel supported to implement RAP in my work 10.8% 16.2% 31.1% 29.7% 12.2%
I know where to find resources to help me implement RAP 10.8% 17.6% 20.3% 33.8% 17.6%
I or my team are planning on implementing RAP in the next 12 months 12.2% 12.2% 29.7% 31.1% 14.9%
I think it is important to implement RAP in my work 5.4% 2.7% 39.2% 29.7% 23%
I understand what the key components of the RAP methodology are 18.9% 23% 23% 23% 12.2%
Sample size = 74
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 50.8%
Peer review Basic 49.2%
Version control Basic 34.9%
Documentation Basic 25.4%
AQUA book guidance Basic 22.2%
Team open source code Basic 9.5%
Functions Advanced 54%
Follow code style guidelines Advanced 44.4%
Function documentation Advanced 28.6%
Unit testing Advanced 15.9%
Dependency management Advanced 15.9%
Continuous integration Advanced 11.1%
Code packages Advanced 7.9%
Sample size = 63
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 22.2%
1 23.8%
2 20.6%
3 17.5%
4 7.9%
5 4.8%
6 3.2%
Sample size = 63
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 31.7%
1 22.2%
2 15.9%
3 11.1%
4 7.9%
5 7.9%
6 3.2%
7 0%
Sample size = 63
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-levelling-up-housing-and-communities.html b/docs/departments/department-for-levelling-up-housing-and-communities.html new file mode 100644 index 0000000..67bdac2 --- /dev/null +++ b/docs/departments/department-for-levelling-up-housing-and-communities.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for Levelling Up, Housing and Communities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for Levelling Up, Housing and Communities

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 14.3%
Rarely 17.9%
Sometimes 17.9%
Regularly 25%
All the time 25%
Sample size = 28
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 85.2% 14.8%
Data cleaning 79.2% 20.8%
Data linking 88.2% 11.8%
Data transfer / migration 72.7% 27.3%
Data visualisation 83.3% 16.7%
Machine learning 75% 25%
Modelling 75% 25%
Quality assurance 71.4% 28.6%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 0% 75% 25%
Java / Scala 3.6% 75% 21.4%
Javascript / Typescript 14.3% 71.4% 14.3%
Matlab 0% 53.6% 46.4%
Python 89.3% 7.1% 3.6%
R 96.4% 0% 3.6%
SAS 17.9% 57.1% 25%
SPSS 64.3% 25% 10.7%
SQL 78.6% 14.3% 7.1%
Stata 46.4% 39.3% 14.3%
VBA 50% 39.3% 10.7%
Sample size = 28
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 3.6% 7.1% 89.3%
Java / Scala 0% 7.1% 92.9%
Javascript / Typescript 7.1% 10.7% 82.1%
Matlab 25% 7.1% 67.9%
Python 39.3% 7.1% 53.6%
R 82.1% 3.6% 14.3%
SAS 17.9% 7.1% 75%
SPSS 42.9% 3.6% 53.6%
SQL 57.1% 3.6% 39.3%
Stata 25% 7.1% 67.9%
VBA 32.1% 10.7% 57.1%
Sample size = 28
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 75%
No 0%
I don't know 25%
Sample size = 28
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 46.4%
No 50%
I don't know 3.6%
Sample size = 28
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 13.6%
Slightly worse 9.1%
No change 4.5%
Slightly better 59.1%
Significantly better 13.6%
Sample size = 22
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 25.9%
In education 51.9%
In private sector employment 3.7%
In public sector employment 11.1%
Self-taught 7.4%
Other 0%
Sample size = 27
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 37.5% 16.7% 8.3% 16.7% 16.7% 4.2%
Automated data quality assurance 0% 25% 8.3% 25% 33.3% 8.3%
Code review 0% 4.2% 20.8% 41.7% 12.5% 20.8%
Coding guidelines / Style guides 8.3% 8.3% 16.7% 29.2% 29.2% 8.3%
Functions 0% 8.3% 12.5% 25% 33.3% 20.8%
Open source own code 20.8% 41.7% 8.3% 8.3% 12.5% 8.3%
Packaging code 8.3% 54.2% 8.3% 16.7% 4.2% 8.3%
Standard directory structure 16.7% 16.7% 12.5% 16.7% 25% 12.5%
Unit testing 37.5% 8.3% 8.3% 16.7% 20.8% 8.3%
Use open source software 12.5% 16.7% 0% 8.3% 25% 37.5%
Version control 4.2% 37.5% 8.3% 12.5% 20.8% 16.7%
Sample size = 24
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 16.7% 20.8% 12.5% 33.3% 16.7% 0%
Code comments 4.2% 8.3% 0% 12.5% 25% 50%
Data or assumptions registers 8.3% 25% 16.7% 20.8% 20.8% 8.3%
Desk notes 12.5% 20.8% 8.3% 29.2% 25% 4.2%
Documentation for each function or class 8.3% 25% 16.7% 25% 20.8% 4.2%
Flow charts 4.2% 29.2% 37.5% 25% 4.2% 0%
README files 8.3% 33.3% 16.7% 16.7% 16.7% 8.3%
Sample size = 24
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 25%
No 20.8%
I don't know what dependency management is 54.2%
Sample size = 24
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 16.7%
No 33.3%
I don't know what continuous integration is 50%
Sample size = 24
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 50%
I don't know what reproducible workflows are 50%
Sample size = 24
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 14.8%
I don't know what a RAP champion is 7.4%
I know what a RAP champion is but don't know who the RAP champion in my department is 44.4%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 33.3%
Sample size = 27
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 25%
I have heard of the RAP strategy, but I haven't read it 45.8%
I have read the RAP strategy 29.2%
Sample size = 24
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 16.7% 12.5% 25% 29.2% 16.7%
I feel confident implementing RAP in my work 12.5% 16.7% 20.8% 29.2% 20.8%
I feel supported to implement RAP in my work 8.3% 16.7% 25% 41.7% 8.3%
I know where to find resources to help me implement RAP 8.3% 16.7% 8.3% 62.5% 4.2%
I or my team are planning on implementing RAP in the next 12 months 8.3% 8.3% 29.2% 37.5% 16.7%
I think it is important to implement RAP in my work 4.2% 8.3% 12.5% 37.5% 37.5%
I understand what the key components of the RAP methodology are 8.3% 16.7% 8.3% 50% 16.7%
Sample size = 24
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 62.5%
Version control Basic 37.5%
Peer review Basic 33.3%
Documentation Basic 25%
Team open source code Basic 20.8%
AQUA book guidance Basic 20.8%
Functions Advanced 54.2%
Follow code style guidelines Advanced 37.5%
Unit testing Advanced 29.2%
Function documentation Advanced 25%
Dependency management Advanced 25%
Continuous integration Advanced 16.7%
Code packages Advanced 12.5%
Sample size = 24
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 29.2%
1 29.2%
2 8.3%
3 0%
4 16.7%
5 12.5%
6 4.2%
Sample size = 24
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 25%
1 16.7%
2 33.3%
3 8.3%
4 4.2%
5 4.2%
6 4.2%
7 4.2%
Sample size = 24
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-transport-excl-agencies-.html b/docs/departments/department-for-transport-excl-agencies-.html new file mode 100644 index 0000000..4d2b596 --- /dev/null +++ b/docs/departments/department-for-transport-excl-agencies-.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for Transport (excl. agencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for Transport (excl. agencies)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 7.5%
Rarely 12.5%
Sometimes 15%
Regularly 40%
All the time 25%
Sample size = 40
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 84.6% 15.4%
Data cleaning 94.3% 5.7%
Data linking 86.7% 13.3%
Data transfer / migration 95% 5%
Data visualisation 76.9% 23.1%
Machine learning 100% 0%
Modelling 73.7% 26.3%
Quality assurance 70% 30%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 5% 57.5% 37.5%
Java / Scala 7.5% 55% 37.5%
Javascript / Typescript 12.5% 50% 37.5%
Matlab 0% 55% 45%
Python 75% 20% 5%
R 100% 0% 0%
SAS 7.5% 47.5% 45%
SPSS 10% 57.5% 32.5%
SQL 77.5% 20% 2.5%
Stata 15% 52.5% 32.5%
VBA 70% 22.5% 7.5%
Sample size = 40
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 17.5% 10% 72.5%
Java / Scala 5% 7.5% 87.5%
Javascript / Typescript 7.5% 12.5% 80%
Matlab 10% 7.5% 82.5%
Python 50% 5% 45%
R 80% 2.5% 17.5%
SAS 20% 10% 70%
SPSS 30% 7.5% 62.5%
SQL 75% 0% 25%
Stata 15% 10% 75%
VBA 45% 10% 45%
Sample size = 40
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 95%
No 0%
I don't know 5%
Sample size = 40
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 62.5%
No 30%
I don't know 7.5%
Sample size = 40
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 3.3%
Slightly worse 6.7%
No change 20%
Slightly better 40%
Significantly better 30%
Sample size = 30
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 26.3%
In education 44.7%
In private sector employment 2.6%
In public sector employment 10.5%
Self-taught 15.8%
Other 0%
Sample size = 38
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 21.6% 16.2% 10.8% 13.5% 32.4% 5.4%
Automated data quality assurance 0% 16.2% 27% 29.7% 21.6% 5.4%
Code review 0% 5.4% 8.1% 35.1% 24.3% 27%
Coding guidelines / Style guides 0% 13.5% 18.9% 18.9% 29.7% 18.9%
Functions 10.8% 0% 13.5% 24.3% 21.6% 29.7%
Open source own code 24.3% 37.8% 18.9% 10.8% 5.4% 2.7%
Packaging code 13.5% 51.4% 13.5% 16.2% 0% 5.4%
Standard directory structure 18.9% 13.5% 21.6% 16.2% 13.5% 16.2%
Unit testing 24.3% 24.3% 21.6% 16.2% 8.1% 5.4%
Use open source software 10.8% 10.8% 2.7% 13.5% 29.7% 32.4%
Version control 2.7% 18.9% 18.9% 16.2% 18.9% 24.3%
Sample size = 37
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 13.5% 27% 10.8% 27% 18.9% 2.7%
Code comments 0% 0% 5.4% 2.7% 37.8% 54.1%
Data or assumptions registers 13.5% 24.3% 10.8% 13.5% 24.3% 13.5%
Desk notes 16.2% 8.1% 13.5% 24.3% 32.4% 5.4%
Documentation for each function or class 10.8% 18.9% 21.6% 21.6% 10.8% 16.2%
Flow charts 2.7% 40.5% 18.9% 27% 8.1% 2.7%
README files 5.4% 18.9% 13.5% 18.9% 27% 16.2%
Sample size = 37
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 37.8%
No 35.1%
I don't know what dependency management is 27%
Sample size = 37
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 13.5%
No 59.5%
I don't know what continuous integration is 27%
Sample size = 37
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 2.7%
No 59.5%
I don't know what reproducible workflows are 37.8%
Sample size = 37
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 12.8%
I don't know what a RAP champion is 17.9%
I know what a RAP champion is but don't know who the RAP champion in my department is 33.3%
I know what a RAP champion is and there is no RAP champion in my department 2.6%
I know who the RAP champion in my department is 33.3%
Sample size = 39
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 42.9%
I have heard of the RAP strategy, but I haven't read it 42.9%
I have read the RAP strategy 14.3%
Sample size = 35
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 11.4% 25.7% 28.6% 20% 14.3%
I feel confident implementing RAP in my work 8.6% 20% 17.1% 40% 14.3%
I feel supported to implement RAP in my work 5.7% 8.6% 20% 51.4% 14.3%
I know where to find resources to help me implement RAP 2.9% 22.9% 14.3% 54.3% 5.7%
I or my team are planning on implementing RAP in the next 12 months 5.7% 14.3% 42.9% 22.9% 14.3%
I think it is important to implement RAP in my work 5.7% 0% 17.1% 48.6% 28.6%
I understand what the key components of the RAP methodology are 5.7% 25.7% 17.1% 40% 11.4%
Sample size = 35
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 62.2%
Peer review Basic 51.4%
Version control Basic 43.2%
Documentation Basic 43.2%
AQUA book guidance Basic 37.8%
Team open source code Basic 8.1%
Functions Advanced 51.4%
Follow code style guidelines Advanced 48.6%
Dependency management Advanced 37.8%
Function documentation Advanced 27%
Unit testing Advanced 13.5%
Continuous integration Advanced 13.5%
Code packages Advanced 5.4%
Sample size = 37
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 8.1%
1 32.4%
2 16.2%
3 13.5%
4 10.8%
5 16.2%
6 2.7%
Sample size = 37
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 29.7%
1 18.9%
2 13.5%
3 13.5%
4 16.2%
5 5.4%
6 0%
7 2.7%
Sample size = 37
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-for-work-and-pensions.html b/docs/departments/department-for-work-and-pensions.html new file mode 100644 index 0000000..49608fa --- /dev/null +++ b/docs/departments/department-for-work-and-pensions.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department for Work and Pensions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department for Work and Pensions

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 0%
Rarely 15.2%
Sometimes 24.2%
Regularly 30.3%
All the time 30.3%
Sample size = 33
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 96.7% 3.3%
Data cleaning 100% 0%
Data linking 100% 0%
Data transfer / migration 77.8% 22.2%
Data visualisation 40.6% 59.4%
Machine learning 0% 0%
Modelling 69.2% 30.8%
Quality assurance 62.5% 37.5%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 0% 30.3% 69.7%
Java / Scala 15.2% 27.3% 57.6%
Javascript / Typescript 6.1% 33.3% 60.6%
Matlab 0% 24.2% 75.8%
Python 27.3% 18.2% 54.5%
R 42.4% 15.2% 42.4%
SAS 97% 0% 3%
SPSS 24.2% 33.3% 42.4%
SQL 63.6% 24.2% 12.1%
Stata 21.2% 36.4% 42.4%
VBA 60.6% 15.2% 24.2%
Sample size = 33
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 15.2% 0% 84.8%
Java / Scala 6.1% 3% 90.9%
Javascript / Typescript 6.1% 0% 93.9%
Matlab 36.4% 0% 63.6%
Python 36.4% 0% 63.6%
R 39.4% 0% 60.6%
SAS 97% 0% 3%
SPSS 30.3% 6.1% 63.6%
SQL 72.7% 3% 24.2%
Stata 6.1% 0% 93.9%
VBA 36.4% 0% 63.6%
Sample size = 33
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 27.3%
No 42.4%
I don't know 30.3%
Sample size = 33
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 36.4%
No 63.6%
I don't know 0%
Sample size = 33
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 10.7%
Slightly worse 21.4%
No change 14.3%
Slightly better 39.3%
Significantly better 14.3%
Sample size = 28
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 15.2%
In education 42.4%
In private sector employment 6.1%
In public sector employment 18.2%
Self-taught 18.2%
Other 0%
Sample size = 33
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 9.1% 9.1% 12.1% 39.4% 24.2% 6.1%
Automated data quality assurance 6.1% 18.2% 9.1% 42.4% 18.2% 6.1%
Code review 0% 3% 6.1% 18.2% 42.4% 30.3%
Coding guidelines / Style guides 0% 9.1% 0% 36.4% 39.4% 15.2%
Functions 6.1% 12.1% 9.1% 33.3% 33.3% 6.1%
Open source own code 3% 87.9% 3% 3% 0% 3%
Packaging code 21.2% 48.5% 3% 15.2% 6.1% 6.1%
Standard directory structure 27.3% 18.2% 3% 27.3% 12.1% 12.1%
Unit testing 33.3% 18.2% 18.2% 6.1% 9.1% 15.2%
Use open source software 0% 72.7% 3% 12.1% 6.1% 6.1%
Version control 6.1% 72.7% 6.1% 6.1% 0% 9.1%
Sample size = 33
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 15.2% 18.2% 6.1% 27.3% 24.2% 9.1%
Code comments 3% 3% 0% 9.1% 33.3% 51.5%
Data or assumptions registers 15.2% 27.3% 9.1% 12.1% 30.3% 6.1%
Desk notes 42.4% 12.1% 15.2% 6.1% 21.2% 3%
Documentation for each function or class 15.2% 21.2% 15.2% 24.2% 18.2% 6.1%
Flow charts 9.1% 36.4% 21.2% 24.2% 6.1% 3%
README files 6.1% 24.2% 12.1% 33.3% 15.2% 9.1%
Sample size = 33
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 6.1%
No 51.5%
I don't know what dependency management is 42.4%
Sample size = 33
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 3%
No 51.5%
I don't know what continuous integration is 45.5%
Sample size = 33
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 57.6%
I don't know what reproducible workflows are 42.4%
Sample size = 33
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 6.1%
I don't know what a RAP champion is 18.2%
I know what a RAP champion is but don't know who the RAP champion in my department is 57.6%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 18.2%
Sample size = 33
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 19.4%
I have heard of the RAP strategy, but I haven't read it 45.2%
I have read the RAP strategy 35.5%
Sample size = 31
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 41.9% 25.8% 19.4% 6.5% 6.5%
I feel confident implementing RAP in my work 12.9% 45.2% 16.1% 22.6% 3.2%
I feel supported to implement RAP in my work 22.6% 19.4% 32.3% 22.6% 3.2%
I know where to find resources to help me implement RAP 12.9% 38.7% 12.9% 29% 6.5%
I or my team are planning on implementing RAP in the next 12 months 25.8% 16.1% 38.7% 9.7% 9.7%
I think it is important to implement RAP in my work 6.5% 9.7% 32.3% 29% 22.6%
I understand what the key components of the RAP methodology are 9.7% 29% 9.7% 41.9% 9.7%
Sample size = 31
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Peer review Basic 72.7%
AQUA book guidance Basic 30.3%
Documentation Basic 24.2%
Use open source software Basic 12.1%
Version control Basic 9.1%
Team open source code Basic 3%
Follow code style guidelines Advanced 54.5%
Functions Advanced 39.4%
Unit testing Advanced 24.2%
Function documentation Advanced 24.2%
Code packages Advanced 12.1%
Dependency management Advanced 6.1%
Continuous integration Advanced 3%
Sample size = 33
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 18.2%
1 39.4%
2 24.2%
3 12.1%
4 3%
5 3%
6 0%
Sample size = 33
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 24.2%
1 30.3%
2 27.3%
3 3%
4 6.1%
5 9.1%
6 0%
7 0%
Sample size = 33
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/department-of-health-and-social-care-excl-agencies-.html b/docs/departments/department-of-health-and-social-care-excl-agencies-.html new file mode 100644 index 0000000..305645a --- /dev/null +++ b/docs/departments/department-of-health-and-social-care-excl-agencies-.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Department of Health and Social Care (excl. agencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Department of Health and Social Care (excl. agencies)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 20%
Rarely 13.3%
Sometimes 20%
Regularly 21.3%
All the time 25.3%
Sample size = 75
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 76.1% 23.9%
Data cleaning 78% 22%
Data linking 82.4% 17.6%
Data transfer / migration 71% 29%
Data visualisation 67.2% 32.8%
Machine learning 90% 10%
Modelling 71.1% 28.9%
Quality assurance 48.4% 51.6%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 4% 62.7% 33.3%
Java / Scala 4% 65.3% 30.7%
Javascript / Typescript 5.3% 65.3% 29.3%
Matlab 1.3% 60% 38.7%
Python 52% 33.3% 14.7%
R 93.3% 6.7% 0%
SAS 13.3% 62.7% 24%
SPSS 21.3% 56% 22.7%
SQL 56% 32% 12%
Stata 40% 38.7% 21.3%
VBA 46.7% 37.3% 16%
Sample size = 75
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 8% 4% 88%
Java / Scala 6.7% 2.7% 90.7%
Javascript / Typescript 8% 2.7% 89.3%
Matlab 20% 4% 76%
Python 28% 1.3% 70.7%
R 73.3% 0% 26.7%
SAS 21.3% 2.7% 76%
SPSS 29.3% 2.7% 68%
SQL 57.3% 1.3% 41.3%
Stata 25.3% 0% 74.7%
VBA 32% 2.7% 65.3%
Sample size = 75
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 72%
No 4%
I don't know 24%
Sample size = 75
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 54.7%
No 45.3%
I don't know 0%
Sample size = 75
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 4.9%
Slightly worse 21.3%
No change 23%
Slightly better 23%
Significantly better 27.9%
Sample size = 61
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 17.1%
In education 54.3%
In private sector employment 1.4%
In public sector employment 15.7%
Self-taught 8.6%
Other 2.9%
Sample size = 70
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 21.7% 16.7% 6.7% 33.3% 16.7% 5%
Automated data quality assurance 3.3% 20% 28.3% 20% 18.3% 10%
Code review 1.7% 13.3% 3.3% 21.7% 36.7% 23.3%
Coding guidelines / Style guides 8.3% 15% 11.7% 33.3% 21.7% 10%
Functions 5% 13.3% 5% 26.7% 23.3% 26.7%
Open source own code 11.7% 46.7% 18.3% 15% 1.7% 6.7%
Packaging code 10% 51.7% 21.7% 6.7% 3.3% 6.7%
Standard directory structure 26.7% 20% 6.7% 21.7% 15% 10%
Unit testing 25% 31.7% 11.7% 16.7% 10% 5%
Use open source software 3.3% 15% 5% 16.7% 16.7% 43.3%
Version control 5% 25% 13.3% 20% 15% 21.7%
Sample size = 60
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 21.7% 25% 11.7% 15% 16.7% 10%
Code comments 3.3% 11.7% 0% 5% 23.3% 56.7%
Data or assumptions registers 16.7% 35% 20% 10% 10% 8.3%
Desk notes 25% 25% 11.7% 16.7% 18.3% 3.3%
Documentation for each function or class 11.7% 31.7% 8.3% 25% 11.7% 11.7%
Flow charts 10% 30% 23.3% 28.3% 6.7% 1.7%
README files 6.7% 28.3% 8.3% 30% 18.3% 8.3%
Sample size = 60
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 13.3%
No 40%
I don't know what dependency management is 46.7%
Sample size = 60
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 15%
No 35%
I don't know what continuous integration is 50%
Sample size = 60
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 55%
I don't know what reproducible workflows are 45%
Sample size = 60
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 22.7%
I don't know what a RAP champion is 16%
I know what a RAP champion is but don't know who the RAP champion in my department is 45.3%
I know what a RAP champion is and there is no RAP champion in my department 4%
I know who the RAP champion in my department is 12%
Sample size = 75
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 21.1%
I have heard of the RAP strategy, but I haven't read it 63.2%
I have read the RAP strategy 15.8%
Sample size = 58
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 15.5% 27.6% 19% 27.6% 10.3%
I feel confident implementing RAP in my work 10.3% 19% 24.1% 36.2% 10.3%
I feel supported to implement RAP in my work 8.6% 25.9% 25.9% 29.3% 10.3%
I know where to find resources to help me implement RAP 6.9% 31% 25.9% 29.3% 6.9%
I or my team are planning on implementing RAP in the next 12 months 8.6% 13.8% 31% 31% 15.5%
I think it is important to implement RAP in my work 6.9% 6.9% 13.8% 44.8% 27.6%
I understand what the key components of the RAP methodology are 3.4% 19% 22.4% 41.4% 13.8%
Sample size = 58
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 60%
Peer review Basic 60%
Version control Basic 36.7%
Documentation Basic 25%
AQUA book guidance Basic 21.7%
Team open source code Basic 8.3%
Functions Advanced 50%
Follow code style guidelines Advanced 31.7%
Function documentation Advanced 23.3%
Unit testing Advanced 15%
Continuous integration Advanced 15%
Dependency management Advanced 13.3%
Code packages Advanced 10%
Sample size = 60
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 13.3%
1 30%
2 20%
3 15%
4 13.3%
5 6.7%
6 1.7%
Sample size = 60
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 36.7%
1 20%
2 15%
3 16.7%
4 3.3%
5 5%
6 3.3%
7 0%
Sample size = 60
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/forestry-commission.html b/docs/departments/forestry-commission.html new file mode 100644 index 0000000..a115e48 --- /dev/null +++ b/docs/departments/forestry-commission.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Forestry Commission + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Forestry Commission

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 8.6%
Rarely 22.9%
Sometimes 17.1%
Regularly 31.4%
All the time 20%
Sample size = 35
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 76.5% 23.5%
Data cleaning 66.7% 33.3%
Data linking 70.8% 29.2%
Data transfer / migration 48.1% 51.9%
Data visualisation 78.8% 21.2%
Machine learning 90% 10%
Modelling 88.9% 11.1%
Quality assurance 61.5% 38.5%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 20% 68.6% 11.4%
Java / Scala 11.4% 77.1% 11.4%
Javascript / Typescript 5.7% 82.9% 11.4%
Matlab 8.6% 60% 31.4%
Python 62.9% 31.4% 5.7%
R 88.6% 8.6% 2.9%
SAS 20% 68.6% 11.4%
SPSS 8.6% 77.1% 14.3%
SQL 34.3% 57.1% 8.6%
Stata 0% 80% 20%
VBA 17.1% 71.4% 11.4%
Sample size = 35
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 11.4% 0% 88.6%
Java / Scala 2.9% 0% 97.1%
Javascript / Typescript 11.4% 0% 88.6%
Matlab 11.4% 2.9% 85.7%
Python 22.9% 0% 77.1%
R 68.6% 0% 31.4%
SAS 11.4% 0% 88.6%
SPSS 17.1% 0% 82.9%
SQL 34.3% 2.9% 62.9%
Stata 11.4% 2.9% 85.7%
VBA 17.1% 0% 82.9%
Sample size = 35
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 48.6%
No 11.4%
I don't know 40%
Sample size = 35
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 28.6%
No 71.4%
I don't know 0%
Sample size = 35
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 8.3%
Slightly worse 20.8%
No change 12.5%
Slightly better 37.5%
Significantly better 20.8%
Sample size = 24
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 25%
In education 46.9%
In private sector employment 3.1%
In public sector employment 3.1%
Self-taught 18.8%
Other 3.1%
Sample size = 32
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 71.9% 15.6% 3.1% 6.2% 3.1% 0%
Automated data quality assurance 12.5% 18.8% 12.5% 28.1% 25% 3.1%
Code review 0% 28.1% 15.6% 43.8% 12.5% 0%
Coding guidelines / Style guides 6.2% 28.1% 3.1% 25% 28.1% 9.4%
Functions 9.4% 18.8% 9.4% 25% 18.8% 18.8%
Open source own code 3.1% 46.9% 21.9% 18.8% 6.2% 3.1%
Packaging code 15.6% 50% 12.5% 0% 12.5% 9.4%
Standard directory structure 18.8% 28.1% 3.1% 28.1% 12.5% 9.4%
Unit testing 31.2% 25% 9.4% 18.8% 6.2% 9.4%
Use open source software 0% 9.4% 15.6% 12.5% 21.9% 40.6%
Version control 12.5% 40.6% 18.8% 6.2% 12.5% 9.4%
Sample size = 32
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 15.6% 50% 3.1% 21.9% 3.1% 6.2%
Code comments 0% 15.6% 3.1% 25% 12.5% 43.8%
Data or assumptions registers 25% 53.1% 15.6% 6.2% 0% 0%
Desk notes 6.2% 31.2% 6.2% 37.5% 9.4% 9.4%
Documentation for each function or class 6.2% 46.9% 15.6% 15.6% 9.4% 6.2%
Flow charts 3.1% 46.9% 21.9% 21.9% 6.2% 0%
README files 0% 21.9% 12.5% 46.9% 12.5% 6.2%
Sample size = 32
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 18.8%
No 40.6%
I don't know what dependency management is 40.6%
Sample size = 32
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 15.6%
No 31.2%
I don't know what continuous integration is 53.1%
Sample size = 32
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 6.2%
No 65.6%
I don't know what reproducible workflows are 28.1%
Sample size = 32
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 55.9%
I don't know what a RAP champion is 14.7%
I know what a RAP champion is but don't know who the RAP champion in my department is 0%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 29.4%
Sample size = 34
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 37.5%
I have heard of the RAP strategy, but I haven't read it 6.2%
I have read the RAP strategy 56.2%
Sample size = 16
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 18.8% 18.8% 18.8% 31.2% 12.5%
I feel confident implementing RAP in my work 18.8% 12.5% 12.5% 37.5% 18.8%
I feel supported to implement RAP in my work 12.5% 31.2% 31.2% 25% 0%
I know where to find resources to help me implement RAP 18.8% 31.2% 6.2% 31.2% 12.5%
I or my team are planning on implementing RAP in the next 12 months 12.5% 6.2% 18.8% 25% 37.5%
I think it is important to implement RAP in my work 0% 6.2% 12.5% 37.5% 43.8%
I understand what the key components of the RAP methodology are 18.8% 18.8% 0% 43.8% 18.8%
Sample size = 16
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 62.5%
Version control Basic 21.9%
Documentation Basic 15.6%
Peer review Basic 12.5%
Team open source code Basic 9.4%
AQUA book guidance Basic 3.1%
Functions Advanced 37.5%
Follow code style guidelines Advanced 37.5%
Code packages Advanced 21.9%
Dependency management Advanced 18.8%
Unit testing Advanced 15.6%
Function documentation Advanced 15.6%
Continuous integration Advanced 15.6%
Sample size = 32
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 28.1%
1 31.2%
2 31.2%
3 6.2%
4 3.1%
5 0%
6 0%
Sample size = 32
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 34.4%
1 25%
2 21.9%
3 3.1%
4 3.1%
5 6.2%
6 3.1%
7 3.1%
Sample size = 32
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/government-actuary-s-department.html b/docs/departments/government-actuary-s-department.html new file mode 100644 index 0000000..3bb3c00 --- /dev/null +++ b/docs/departments/government-actuary-s-department.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Government Actuary’s Department + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Government Actuary’s Department

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 29.7%
Rarely 16.2%
Sometimes 10.8%
Regularly 27%
All the time 16.2%
Sample size = 37
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 62.5% 37.5%
Data cleaning 61.5% 38.5%
Data linking 66.7% 33.3%
Data transfer / migration 62.5% 37.5%
Data visualisation 50% 50%
Machine learning 87.5% 12.5%
Modelling 60% 40%
Quality assurance 35.7% 64.3%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 2.7% 54.1% 43.2%
Java / Scala 0% 56.8% 43.2%
Javascript / Typescript 16.2% 54.1% 29.7%
Matlab 2.7% 43.2% 54.1%
Python 89.2% 8.1% 2.7%
R 91.9% 2.7% 5.4%
SAS 86.5% 8.1% 5.4%
SPSS 2.7% 48.6% 48.6%
SQL 45.9% 37.8% 16.2%
Stata 0% 54.1% 45.9%
VBA 89.2% 8.1% 2.7%
Sample size = 37
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 13.5% 2.7% 83.8%
Java / Scala 10.8% 2.7% 86.5%
Javascript / Typescript 10.8% 2.7% 86.5%
Matlab 21.6% 5.4% 73%
Python 32.4% 0% 67.6%
R 62.2% 5.4% 32.4%
SAS 29.7% 5.4% 64.9%
SPSS 8.1% 2.7% 89.2%
SQL 29.7% 2.7% 67.6%
Stata 10.8% 2.7% 86.5%
VBA 56.8% 2.7% 40.5%
Sample size = 37
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 37.8%
No 5.4%
I don't know 56.8%
Sample size = 37
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 24.3%
No 67.6%
I don't know 8.1%
Sample size = 37
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 12.5%
Slightly worse 16.7%
No change 12.5%
Slightly better 37.5%
Significantly better 20.8%
Sample size = 24
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 34.4%
In education 43.8%
In private sector employment 3.1%
In public sector employment 3.1%
Self-taught 15.6%
Other 0%
Sample size = 32
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 46.2% 19.2% 7.7% 11.5% 11.5% 3.8%
Automated data quality assurance 15.4% 19.2% 26.9% 26.9% 7.7% 3.8%
Code review 0% 7.7% 15.4% 19.2% 38.5% 19.2%
Coding guidelines / Style guides 11.5% 19.2% 0% 26.9% 34.6% 7.7%
Functions 15.4% 3.8% 11.5% 15.4% 26.9% 26.9%
Open source own code 15.4% 65.4% 7.7% 3.8% 7.7% 0%
Packaging code 23.1% 30.8% 15.4% 19.2% 11.5% 0%
Standard directory structure 15.4% 23.1% 11.5% 15.4% 30.8% 3.8%
Unit testing 23.1% 15.4% 11.5% 30.8% 11.5% 7.7%
Use open source software 15.4% 11.5% 7.7% 26.9% 19.2% 19.2%
Version control 26.9% 30.8% 19.2% 7.7% 11.5% 3.8%
Sample size = 26
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 23.1% 15.4% 3.8% 34.6% 15.4% 7.7%
Code comments 0% 3.8% 11.5% 7.7% 38.5% 38.5%
Data or assumptions registers 42.3% 34.6% 11.5% 3.8% 7.7% 0%
Desk notes 23.1% 23.1% 7.7% 34.6% 11.5% 0%
Documentation for each function or class 19.2% 15.4% 7.7% 30.8% 23.1% 3.8%
Flow charts 15.4% 26.9% 19.2% 23.1% 15.4% 0%
README files 23.1% 15.4% 15.4% 23.1% 19.2% 3.8%
Sample size = 26
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 15.4%
No 34.6%
I don't know what dependency management is 50%
Sample size = 26
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 7.7%
No 46.2%
I don't know what continuous integration is 46.2%
Sample size = 26
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 53.8%
I don't know what reproducible workflows are 46.2%
Sample size = 26
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 56.8%
I don't know what a RAP champion is 18.9%
I know what a RAP champion is but don't know who the RAP champion in my department is 8.1%
I know what a RAP champion is and there is no RAP champion in my department 5.4%
I know who the RAP champion in my department is 10.8%
Sample size = 37
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 25%
I have heard of the RAP strategy, but I haven't read it 56.2%
I have read the RAP strategy 18.8%
Sample size = 16
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 31.2% 6.2% 43.8% 12.5% 6.2%
I feel confident implementing RAP in my work 25% 18.8% 50% 0% 6.2%
I feel supported to implement RAP in my work 18.8% 12.5% 43.8% 18.8% 6.2%
I know where to find resources to help me implement RAP 25% 18.8% 37.5% 6.2% 12.5%
I or my team are planning on implementing RAP in the next 12 months 25% 6.2% 37.5% 25% 6.2%
I think it is important to implement RAP in my work 0% 6.2% 56.2% 25% 12.5%
I understand what the key components of the RAP methodology are 18.8% 6.2% 43.8% 25% 6.2%
Sample size = 16
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Peer review Basic 57.7%
Use open source software Basic 38.5%
Documentation Basic 19.2%
Version control Basic 15.4%
AQUA book guidance Basic 15.4%
Team open source code Basic 7.7%
Functions Advanced 53.8%
Follow code style guidelines Advanced 42.3%
Function documentation Advanced 26.9%
Unit testing Advanced 19.2%
Dependency management Advanced 15.4%
Code packages Advanced 11.5%
Continuous integration Advanced 7.7%
Sample size = 26
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 19.2%
1 38.5%
2 23.1%
3 11.5%
4 3.8%
5 3.8%
6 0%
Sample size = 26
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 23.1%
1 26.9%
2 26.9%
3 7.7%
4 7.7%
5 3.8%
6 3.8%
7 0%
Sample size = 26
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/hm-revenue-and-customs.html b/docs/departments/hm-revenue-and-customs.html new file mode 100644 index 0000000..39a0936 --- /dev/null +++ b/docs/departments/hm-revenue-and-customs.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: HM Revenue and Customs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: HM Revenue and Customs

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 8.2%
Rarely 12.9%
Sometimes 24.7%
Regularly 29.4%
All the time 24.7%
Sample size = 85
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 88.6% 11.4%
Data cleaning 91.5% 8.5%
Data linking 88.1% 11.9%
Data transfer / migration 73.9% 26.1%
Data visualisation 67.1% 32.9%
Machine learning 81% 19%
Modelling 85.4% 14.6%
Quality assurance 71.1% 28.9%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 5.9% 40% 54.1%
Java / Scala 1.2% 42.4% 56.5%
Javascript / Typescript 9.4% 40% 50.6%
Matlab 2.4% 40% 57.6%
Python 36.5% 27.1% 36.5%
R 92.9% 3.5% 3.5%
SAS 89.4% 3.5% 7.1%
SPSS 31.8% 38.8% 29.4%
SQL 64.7% 20% 15.3%
Stata 22.4% 47.1% 30.6%
VBA 63.5% 24.7% 11.8%
Sample size = 85
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 7.1% 3.5% 89.4%
Java / Scala 3.5% 2.4% 94.1%
Javascript / Typescript 10.6% 1.2% 88.2%
Matlab 20% 3.5% 76.5%
Python 32.9% 5.9% 61.2%
R 69.4% 1.2% 29.4%
SAS 72.9% 2.4% 24.7%
SPSS 22.4% 3.5% 74.1%
SQL 67.1% 2.4% 30.6%
Stata 5.9% 2.4% 91.8%
VBA 25.9% 7.1% 67.1%
Sample size = 85
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 62.4%
No 14.1%
I don't know 23.5%
Sample size = 85
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 48.2%
No 45.9%
I don't know 5.9%
Sample size = 85
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 7.5%
Slightly worse 17.9%
No change 17.9%
Slightly better 34.3%
Significantly better 22.4%
Sample size = 67
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 17.3%
In education 49.4%
In private sector employment 2.5%
In public sector employment 13.6%
Self-taught 17.3%
Other 0%
Sample size = 81
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 29.5% 5.1% 11.5% 20.5% 25.6% 7.7%
Automated data quality assurance 2.6% 17.9% 15.4% 26.9% 26.9% 10.3%
Code review 0% 1.3% 9% 25.6% 30.8% 33.3%
Coding guidelines / Style guides 0% 3.8% 10.3% 30.8% 41% 14.1%
Functions 0% 6.4% 3.8% 26.9% 32.1% 30.8%
Open source own code 9% 55.1% 16.7% 15.4% 3.8% 0%
Packaging code 9% 38.5% 15.4% 20.5% 15.4% 1.3%
Standard directory structure 19.2% 15.4% 9% 24.4% 19.2% 12.8%
Unit testing 24.4% 11.5% 10.3% 32.1% 17.9% 3.8%
Use open source software 5.1% 21.8% 7.7% 19.2% 24.4% 21.8%
Version control 5.1% 39.7% 14.1% 10.3% 16.7% 14.1%
Sample size = 78
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 16.7% 17.9% 17.9% 28.2% 12.8% 6.4%
Code comments 1.3% 2.6% 1.3% 11.5% 20.5% 62.8%
Data or assumptions registers 16.7% 23.1% 24.4% 15.4% 11.5% 9%
Desk notes 24.4% 23.1% 14.1% 15.4% 19.2% 3.8%
Documentation for each function or class 10.3% 19.2% 15.4% 21.8% 17.9% 15.4%
Flow charts 7.7% 32.1% 15.4% 26.9% 15.4% 2.6%
README files 7.7% 19.2% 10.3% 25.6% 21.8% 15.4%
Sample size = 78
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 25.6%
No 47.4%
I don't know what dependency management is 26.9%
Sample size = 78
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 10.3%
No 52.6%
I don't know what continuous integration is 37.2%
Sample size = 78
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 5.1%
No 66.7%
I don't know what reproducible workflows are 28.2%
Sample size = 78
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 13.3%
I don't know what a RAP champion is 8.4%
I know what a RAP champion is but don't know who the RAP champion in my department is 34.9%
I know what a RAP champion is and there is no RAP champion in my department 1.2%
I know who the RAP champion in my department is 42.2%
Sample size = 83
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 24.3%
I have heard of the RAP strategy, but I haven't read it 47.3%
I have read the RAP strategy 28.4%
Sample size = 74
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 14.9% 21.6% 25.7% 18.9% 18.9%
I feel confident implementing RAP in my work 5.4% 18.9% 21.6% 37.8% 16.2%
I feel supported to implement RAP in my work 6.8% 8.1% 27% 37.8% 20.3%
I know where to find resources to help me implement RAP 5.4% 16.2% 10.8% 43.2% 24.3%
I or my team are planning on implementing RAP in the next 12 months 13.5% 8.1% 29.7% 29.7% 18.9%
I think it is important to implement RAP in my work 2.7% 4.1% 18.9% 43.2% 31.1%
I understand what the key components of the RAP methodology are 5.4% 8.1% 17.6% 47.3% 21.6%
Sample size = 74
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Peer review Basic 64.1%
Use open source software Basic 46.2%
Documentation Basic 35.9%
AQUA book guidance Basic 33.3%
Version control Basic 30.8%
Team open source code Basic 3.8%
Functions Advanced 62.8%
Follow code style guidelines Advanced 55.1%
Function documentation Advanced 33.3%
Dependency management Advanced 25.6%
Unit testing Advanced 21.8%
Code packages Advanced 16.7%
Continuous integration Advanced 10.3%
Sample size = 78
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 17.9%
1 19.2%
2 25.6%
3 17.9%
4 7.7%
5 10.3%
6 1.3%
Sample size = 78
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 21.8%
1 19.2%
2 14.1%
3 20.5%
4 10.3%
5 10.3%
6 2.6%
7 1.3%
Sample size = 78
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/ministry-of-defence.html b/docs/departments/ministry-of-defence.html new file mode 100644 index 0000000..1cf4934 --- /dev/null +++ b/docs/departments/ministry-of-defence.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Ministry of Defence + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Ministry of Defence

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 15.2%
Rarely 15.2%
Sometimes 39.4%
Regularly 24.2%
All the time 6.1%
Sample size = 33
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 73.3% 26.7%
Data cleaning 80.8% 19.2%
Data linking 76.2% 23.8%
Data transfer / migration 72.2% 27.8%
Data visualisation 50% 50%
Machine learning 75% 25%
Modelling 70% 30%
Quality assurance 45.2% 54.8%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 6.1% 54.5% 39.4%
Java / Scala 9.1% 60.6% 30.3%
Javascript / Typescript 18.2% 60.6% 21.2%
Matlab 9.1% 51.5% 39.4%
Python 66.7% 15.2% 18.2%
R 87.9% 0% 12.1%
SAS 12.1% 48.5% 39.4%
SPSS 51.5% 24.2% 24.2%
SQL 75.8% 12.1% 12.1%
Stata 12.1% 63.6% 24.2%
VBA 69.7% 21.2% 9.1%
Sample size = 33
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 9.1% 0% 90.9%
Java / Scala 3% 0% 97%
Javascript / Typescript 12.1% 0% 87.9%
Matlab 12.1% 3% 84.8%
Python 18.2% 0% 81.8%
R 57.6% 0% 42.4%
SAS 18.2% 3% 78.8%
SPSS 36.4% 0% 63.6%
SQL 63.6% 0% 36.4%
Stata 12.1% 0% 87.9%
VBA 48.5% 0% 51.5%
Sample size = 33
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 72.7%
No 15.2%
I don't know 12.1%
Sample size = 33
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 48.5%
No 48.5%
I don't know 3%
Sample size = 33
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 4.5%
Slightly worse 4.5%
No change 27.3%
Slightly better 40.9%
Significantly better 22.7%
Sample size = 22
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 27.6%
In education 31%
In private sector employment 3.4%
In public sector employment 10.3%
Self-taught 27.6%
Other 0%
Sample size = 29
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 21.4% 25% 14.3% 10.7% 17.9% 10.7%
Automated data quality assurance 7.1% 17.9% 21.4% 25% 10.7% 17.9%
Code review 0% 7.1% 25% 39.3% 21.4% 7.1%
Coding guidelines / Style guides 3.6% 7.1% 28.6% 28.6% 10.7% 21.4%
Functions 0% 7.1% 14.3% 32.1% 21.4% 25%
Open source own code 7.1% 71.4% 3.6% 14.3% 0% 3.6%
Packaging code 17.9% 35.7% 21.4% 14.3% 10.7% 0%
Standard directory structure 17.9% 17.9% 10.7% 17.9% 17.9% 17.9%
Unit testing 21.4% 10.7% 21.4% 17.9% 17.9% 10.7%
Use open source software 10.7% 28.6% 14.3% 7.1% 17.9% 21.4%
Version control 3.6% 42.9% 7.1% 7.1% 28.6% 10.7%
Sample size = 28
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 21.4% 25% 17.9% 21.4% 3.6% 10.7%
Code comments 0% 3.6% 0% 10.7% 28.6% 57.1%
Data or assumptions registers 32.1% 32.1% 14.3% 7.1% 7.1% 7.1%
Desk notes 3.6% 14.3% 3.6% 25% 14.3% 39.3%
Documentation for each function or class 10.7% 21.4% 17.9% 21.4% 21.4% 7.1%
Flow charts 0% 28.6% 28.6% 32.1% 3.6% 7.1%
README files 3.6% 25% 7.1% 42.9% 17.9% 3.6%
Sample size = 28
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 14.3%
No 32.1%
I don't know what dependency management is 53.6%
Sample size = 28
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 17.9%
No 42.9%
I don't know what continuous integration is 39.3%
Sample size = 28
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 3.6%
No 46.4%
I don't know what reproducible workflows are 50%
Sample size = 28
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 32.3%
I don't know what a RAP champion is 22.6%
I know what a RAP champion is but don't know who the RAP champion in my department is 35.5%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 9.7%
Sample size = 31
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 26.1%
I have heard of the RAP strategy, but I haven't read it 56.5%
I have read the RAP strategy 17.4%
Sample size = 23
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 21.7% 17.4% 17.4% 30.4% 13%
I feel confident implementing RAP in my work 30.4% 17.4% 13% 21.7% 17.4%
I feel supported to implement RAP in my work 8.7% 4.3% 39.1% 30.4% 17.4%
I know where to find resources to help me implement RAP 17.4% 26.1% 13% 21.7% 21.7%
I or my team are planning on implementing RAP in the next 12 months 13% 4.3% 30.4% 26.1% 26.1%
I think it is important to implement RAP in my work 8.7% 4.3% 21.7% 26.1% 39.1%
I understand what the key components of the RAP methodology are 21.7% 26.1% 4.3% 26.1% 21.7%
Sample size = 23
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 39.3%
Version control Basic 39.3%
Peer review Basic 28.6%
AQUA book guidance Basic 28.6%
Documentation Basic 21.4%
Team open source code Basic 3.6%
Functions Advanced 46.4%
Follow code style guidelines Advanced 32.1%
Unit testing Advanced 28.6%
Function documentation Advanced 28.6%
Continuous integration Advanced 17.9%
Dependency management Advanced 14.3%
Code packages Advanced 10.7%
Sample size = 28
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 25%
1 28.6%
2 17.9%
3 17.9%
4 10.7%
5 0%
6 0%
Sample size = 28
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 21.4%
1 25%
2 28.6%
3 10.7%
4 10.7%
5 0%
6 3.6%
7 0%
Sample size = 28
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/ministry-of-justice-excl-agencies-.html b/docs/departments/ministry-of-justice-excl-agencies-.html new file mode 100644 index 0000000..5d38c20 --- /dev/null +++ b/docs/departments/ministry-of-justice-excl-agencies-.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Ministry of Justice (excl. agencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Ministry of Justice (excl. agencies)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 1.9%
Rarely 9.6%
Sometimes 15.4%
Regularly 30.8%
All the time 42.3%
Sample size = 52
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 96.1% 3.9%
Data cleaning 93.8% 6.2%
Data linking 92.3% 7.7%
Data transfer / migration 76.9% 23.1%
Data visualisation 74.4% 25.6%
Machine learning 100% 0%
Modelling 91.7% 8.3%
Quality assurance 70% 30%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 5.8% 59.6% 34.6%
Java / Scala 11.5% 59.6% 28.8%
Javascript / Typescript 15.4% 55.8% 28.8%
Matlab 1.9% 55.8% 42.3%
Python 90.4% 7.7% 1.9%
R 100% 0% 0%
SAS 42.3% 28.8% 28.8%
SPSS 3.8% 55.8% 40.4%
SQL 92.3% 3.8% 3.8%
Stata 5.8% 51.9% 42.3%
VBA 53.8% 34.6% 11.5%
Sample size = 52
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 9.6% 3.8% 86.5%
Java / Scala 0% 5.8% 94.2%
Javascript / Typescript 9.6% 3.8% 86.5%
Matlab 19.2% 5.8% 75%
Python 46.2% 1.9% 51.9%
R 90.4% 0% 9.6%
SAS 32.7% 1.9% 65.4%
SPSS 32.7% 9.6% 57.7%
SQL 86.5% 0% 13.5%
Stata 15.4% 5.8% 78.8%
VBA 26.9% 3.8% 69.2%
Sample size = 52
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 96.2%
No 1.9%
I don't know 1.9%
Sample size = 52
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 92.3%
No 7.7%
I don't know 0%
Sample size = 52
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 0%
Slightly worse 8.5%
No change 19.1%
Slightly better 38.3%
Significantly better 34%
Sample size = 47
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 11.5%
In education 40.4%
In private sector employment 1.9%
In public sector employment 23.1%
Self-taught 21.2%
Other 1.9%
Sample size = 52
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 27.5% 13.7% 11.8% 25.5% 15.7% 5.9%
Automated data quality assurance 2% 17.6% 23.5% 21.6% 21.6% 13.7%
Code review 0% 2% 5.9% 25.5% 45.1% 21.6%
Coding guidelines / Style guides 2% 9.8% 5.9% 31.4% 27.5% 23.5%
Functions 3.9% 3.9% 13.7% 25.5% 13.7% 39.2%
Open source own code 9.8% 37.3% 9.8% 25.5% 7.8% 9.8%
Packaging code 3.9% 49% 11.8% 19.6% 7.8% 7.8%
Standard directory structure 17.6% 15.7% 11.8% 21.6% 19.6% 13.7%
Unit testing 21.6% 19.6% 15.7% 15.7% 11.8% 15.7%
Use open source software 5.9% 2% 7.8% 17.6% 23.5% 43.1%
Version control 0% 5.9% 5.9% 11.8% 29.4% 47.1%
Sample size = 51
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 17.6% 9.8% 15.7% 21.6% 27.5% 7.8%
Code comments 2% 2% 0% 5.9% 41.2% 49%
Data or assumptions registers 9.8% 15.7% 11.8% 19.6% 27.5% 15.7%
Desk notes 29.4% 13.7% 15.7% 17.6% 21.6% 2%
Documentation for each function or class 9.8% 23.5% 13.7% 17.6% 19.6% 15.7%
Flow charts 2% 43.1% 23.5% 23.5% 7.8% 0%
README files 2% 5.9% 25.5% 19.6% 19.6% 27.5%
Sample size = 51
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 62.7%
No 15.7%
I don't know what dependency management is 21.6%
Sample size = 51
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 31.4%
No 23.5%
I don't know what continuous integration is 45.1%
Sample size = 51
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 3.9%
No 58.8%
I don't know what reproducible workflows are 37.3%
Sample size = 51
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 9.8%
I don't know what a RAP champion is 17.6%
I know what a RAP champion is but don't know who the RAP champion in my department is 41.2%
I know what a RAP champion is and there is no RAP champion in my department 2%
I know who the RAP champion in my department is 29.4%
Sample size = 51
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 25.5%
I have heard of the RAP strategy, but I haven't read it 46.8%
I have read the RAP strategy 27.7%
Sample size = 47
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 8.5% 19.1% 19.1% 34% 19.1%
I feel confident implementing RAP in my work 8.5% 21.3% 12.8% 38.3% 19.1%
I feel supported to implement RAP in my work 2.1% 14.9% 14.9% 48.9% 19.1%
I know where to find resources to help me implement RAP 2.1% 19.1% 23.4% 36.2% 19.1%
I or my team are planning on implementing RAP in the next 12 months 4.3% 6.4% 29.8% 42.6% 17%
I think it is important to implement RAP in my work 4.3% 2.1% 10.6% 53.2% 29.8%
I understand what the key components of the RAP methodology are 4.3% 27.7% 14.9% 38.3% 14.9%
Sample size = 47
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Version control Basic 76.5%
Use open source software Basic 66.7%
Peer review Basic 66.7%
Documentation Basic 47.1%
AQUA book guidance Basic 21.6%
Team open source code Basic 17.6%
Dependency management Advanced 62.7%
Functions Advanced 52.9%
Follow code style guidelines Advanced 51%
Function documentation Advanced 35.3%
Continuous integration Advanced 31.4%
Unit testing Advanced 27.5%
Code packages Advanced 15.7%
Sample size = 51
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 7.8%
1 7.8%
2 23.5%
3 19.6%
4 25.5%
5 13.7%
6 2%
Sample size = 51
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 19.6%
1 11.8%
2 21.6%
3 13.7%
4 9.8%
5 5.9%
6 11.8%
7 5.9%
Sample size = 51
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/national-records-of-scotland.html b/docs/departments/national-records-of-scotland.html new file mode 100644 index 0000000..8612f0f --- /dev/null +++ b/docs/departments/national-records-of-scotland.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: National Records of Scotland + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: National Records of Scotland

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 6.9%
Rarely 13.8%
Sometimes 20.7%
Regularly 51.7%
All the time 6.9%
Sample size = 29
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 81.5% 18.5%
Data cleaning 95.8% 4.2%
Data linking 92.9% 7.1%
Data transfer / migration 33.3% 66.7%
Data visualisation 76% 24%
Machine learning 100% 0%
Modelling 90.9% 9.1%
Quality assurance 57.7% 42.3%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 0% 48.3% 51.7%
Java / Scala 3.4% 51.7% 44.8%
Javascript / Typescript 3.4% 51.7% 44.8%
Matlab 0% 51.7% 48.3%
Python 37.9% 44.8% 17.2%
R 96.6% 0% 3.4%
SAS 100% 0% 0%
SPSS 17.2% 41.4% 41.4%
SQL 41.4% 41.4% 17.2%
Stata 10.3% 44.8% 44.8%
VBA 55.2% 27.6% 17.2%
Sample size = 29
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 6.9% 3.4% 89.7%
Java / Scala 10.3% 6.9% 82.8%
Javascript / Typescript 6.9% 6.9% 86.2%
Matlab 17.2% 3.4% 79.3%
Python 34.5% 3.4% 62.1%
R 82.8% 0% 17.2%
SAS 86.2% 0% 13.8%
SPSS 37.9% 13.8% 48.3%
SQL 27.6% 10.3% 62.1%
Stata 10.3% 6.9% 82.8%
VBA 24.1% 10.3% 65.5%
Sample size = 29
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 72.4%
No 6.9%
I don't know 20.7%
Sample size = 29
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 44.8%
No 44.8%
I don't know 10.3%
Sample size = 29
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 3.6%
Slightly worse 21.4%
No change 14.3%
Slightly better 32.1%
Significantly better 28.6%
Sample size = 28
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 3.4%
In education 79.3%
In private sector employment 0%
In public sector employment 3.4%
Self-taught 13.8%
Other 0%
Sample size = 29
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 77.8% 7.4% 3.7% 3.7% 7.4% 0%
Automated data quality assurance 7.4% 14.8% 22.2% 29.6% 22.2% 3.7%
Code review 0% 11.1% 11.1% 48.1% 29.6% 0%
Coding guidelines / Style guides 7.4% 14.8% 11.1% 29.6% 25.9% 11.1%
Functions 0% 3.7% 3.7% 48.1% 29.6% 14.8%
Open source own code 3.7% 59.3% 14.8% 14.8% 3.7% 3.7%
Packaging code 11.1% 59.3% 14.8% 14.8% 0% 0%
Standard directory structure 40.7% 11.1% 7.4% 18.5% 14.8% 7.4%
Unit testing 29.6% 11.1% 14.8% 33.3% 11.1% 0%
Use open source software 0% 11.1% 11.1% 37% 18.5% 22.2%
Version control 3.7% 48.1% 3.7% 18.5% 14.8% 11.1%
Sample size = 27
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 29.6% 37% 18.5% 7.4% 7.4% 0%
Code comments 3.7% 3.7% 3.7% 14.8% 29.6% 44.4%
Data or assumptions registers 25.9% 40.7% 11.1% 7.4% 11.1% 3.7%
Desk notes 0% 7.4% 11.1% 29.6% 37% 14.8%
Documentation for each function or class 18.5% 25.9% 14.8% 22.2% 18.5% 0%
Flow charts 3.7% 37% 22.2% 33.3% 3.7% 0%
README files 7.4% 18.5% 7.4% 25.9% 37% 3.7%
Sample size = 27
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 3.7%
No 37%
I don't know what dependency management is 59.3%
Sample size = 27
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 3.7%
No 33.3%
I don't know what continuous integration is 63%
Sample size = 27
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 55.6%
I don't know what reproducible workflows are 44.4%
Sample size = 27
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 7.4%
I don't know what a RAP champion is 18.5%
I know what a RAP champion is but don't know who the RAP champion in my department is 29.6%
I know what a RAP champion is and there is no RAP champion in my department 3.7%
I know who the RAP champion in my department is 40.7%
Sample size = 27
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 14.8%
I have heard of the RAP strategy, but I haven't read it 66.7%
I have read the RAP strategy 18.5%
Sample size = 27
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 14.8% 18.5% 22.2% 29.6% 14.8%
I feel confident implementing RAP in my work 7.4% 14.8% 22.2% 40.7% 14.8%
I feel supported to implement RAP in my work 3.7% 7.4% 25.9% 48.1% 14.8%
I know where to find resources to help me implement RAP 3.7% 11.1% 14.8% 51.9% 18.5%
I or my team are planning on implementing RAP in the next 12 months 11.1% 14.8% 11.1% 44.4% 18.5%
I think it is important to implement RAP in my work 3.7% 3.7% 18.5% 48.1% 25.9%
I understand what the key components of the RAP methodology are 7.4% 7.4% 22.2% 51.9% 11.1%
Sample size = 27
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 40.7%
Peer review Basic 29.6%
Documentation Basic 29.6%
Version control Basic 25.9%
Team open source code Basic 7.4%
AQUA book guidance Basic 7.4%
Functions Advanced 44.4%
Follow code style guidelines Advanced 37%
Function documentation Advanced 18.5%
Unit testing Advanced 11.1%
Continuous integration Advanced 3.7%
Dependency management Advanced 3.7%
Code packages Advanced 0%
Sample size = 27
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 25.9%
1 33.3%
2 18.5%
3 18.5%
4 3.7%
5 0%
6 0%
Sample size = 27
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 25.9%
1 44.4%
2 18.5%
3 7.4%
4 3.7%
5 0%
6 0%
7 0%
Sample size = 27
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/nhs.html b/docs/departments/nhs.html new file mode 100644 index 0000000..d80587e --- /dev/null +++ b/docs/departments/nhs.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: NHS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: NHS

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 7.4%
Rarely 0%
Sometimes 9.3%
Regularly 27.8%
All the time 55.6%
Sample size = 54
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 90.4% 9.6%
Data cleaning 88.2% 11.8%
Data linking 93.2% 6.8%
Data transfer / migration 80.6% 19.4%
Data visualisation 73.5% 26.5%
Machine learning 100% 0%
Modelling 100% 0%
Quality assurance 77.3% 22.7%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 5.6% 40.7% 53.7%
Java / Scala 9.3% 37% 53.7%
Javascript / Typescript 20.4% 31.5% 48.1%
Matlab 1.9% 37% 61.1%
Python 63% 18.5% 18.5%
R 98.1% 0% 1.9%
SAS 20.4% 27.8% 51.9%
SPSS 42.6% 14.8% 42.6%
SQL 77.8% 13% 9.3%
Stata 13% 37% 50%
VBA 51.9% 24.1% 24.1%
Sample size = 54
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 3.7% 1.9% 94.4%
Java / Scala 5.6% 1.9% 92.6%
Javascript / Typescript 7.4% 3.7% 88.9%
Matlab 5.6% 3.7% 90.7%
Python 37% 1.9% 61.1%
R 81.5% 0% 18.5%
SAS 18.5% 1.9% 79.6%
SPSS 46.3% 1.9% 51.9%
SQL 68.5% 1.9% 29.6%
Stata 9.3% 1.9% 88.9%
VBA 31.5% 1.9% 66.7%
Sample size = 54
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 88.9%
No 9.3%
I don't know 1.9%
Sample size = 54
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 70.4%
No 24.1%
I don't know 5.6%
Sample size = 54
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 0%
Slightly worse 7.5%
No change 5%
Slightly better 32.5%
Significantly better 55%
Sample size = 40
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 25.5%
In education 37.3%
In private sector employment 2%
In public sector employment 11.8%
Self-taught 21.6%
Other 2%
Sample size = 51
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 66% 12% 2% 12% 6% 2%
Automated data quality assurance 4% 18% 28% 32% 10% 8%
Code review 0% 2% 14% 34% 26% 24%
Coding guidelines / Style guides 2% 6% 6% 30% 42% 14%
Functions 2% 2% 8% 24% 28% 36%
Open source own code 12% 24% 20% 26% 10% 8%
Packaging code 10% 48% 8% 14% 18% 2%
Standard directory structure 22% 8% 4% 22% 30% 14%
Unit testing 14% 18% 22% 22% 24% 0%
Use open source software 10% 4% 2% 12% 20% 52%
Version control 4% 22% 8% 20% 16% 30%
Sample size = 50
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 36% 28% 12% 14% 10% 0%
Code comments 2% 4% 0% 12% 26% 56%
Data or assumptions registers 40% 36% 12% 6% 6% 0%
Desk notes 40% 18% 4% 16% 20% 2%
Documentation for each function or class 12% 22% 6% 28% 14% 18%
Flow charts 8% 36% 12% 34% 10% 0%
README files 6% 20% 18% 20% 22% 14%
Sample size = 50
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 30%
No 38%
I don't know what dependency management is 32%
Sample size = 50
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 20%
No 48%
I don't know what continuous integration is 32%
Sample size = 50
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 4%
No 62%
I don't know what reproducible workflows are 34%
Sample size = 50
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 27.1%
I don't know what a RAP champion is 14.6%
I know what a RAP champion is but don't know who the RAP champion in my department is 25%
I know what a RAP champion is and there is no RAP champion in my department 6.2%
I know who the RAP champion in my department is 27.1%
Sample size = 48
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 22.5%
I have heard of the RAP strategy, but I haven't read it 37.5%
I have read the RAP strategy 40%
Sample size = 41
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 9.8% 31.7% 9.8% 17.1% 31.7%
I feel confident implementing RAP in my work 9.8% 12.2% 12.2% 46.3% 19.5%
I feel supported to implement RAP in my work 12.2% 12.2% 9.8% 41.5% 24.4%
I know where to find resources to help me implement RAP 7.3% 14.6% 12.2% 39% 26.8%
I or my team are planning on implementing RAP in the next 12 months 7.3% 7.3% 22% 24.4% 39%
I think it is important to implement RAP in my work 4.9% 4.9% 7.3% 29.3% 53.7%
I understand what the key components of the RAP methodology are 4.9% 9.8% 12.2% 43.9% 29.3%
Sample size = 41
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 72%
Peer review Basic 50%
Version control Basic 46%
Documentation Basic 34%
Team open source code Basic 18%
AQUA book guidance Basic 8%
Functions Advanced 64%
Follow code style guidelines Advanced 56%
Function documentation Advanced 32%
Dependency management Advanced 30%
Unit testing Advanced 24%
Code packages Advanced 20%
Continuous integration Advanced 20%
Sample size = 50
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 14%
1 24%
2 22%
3 14%
4 16%
5 6%
6 4%
Sample size = 50
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 14%
1 18%
2 22%
3 24%
4 8%
5 4%
6 10%
7 0%
Sample size = 50
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/northern-ireland-statistics-and-research-agency.html b/docs/departments/northern-ireland-statistics-and-research-agency.html new file mode 100644 index 0000000..6d2e27a --- /dev/null +++ b/docs/departments/northern-ireland-statistics-and-research-agency.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Northern Ireland Statistics and Research Agency + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Northern Ireland Statistics and Research Agency

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 11.1%
Rarely 14.8%
Sometimes 18.5%
Regularly 18.5%
All the time 37%
Sample size = 27
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 70.4% 29.6%
Data cleaning 75% 25%
Data linking 77.8% 22.2%
Data transfer / migration 58.3% 41.7%
Data visualisation 66.7% 33.3%
Machine learning 0% 0%
Modelling 81.8% 18.2%
Quality assurance 60.9% 39.1%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 3.7% 48.1% 48.1%
Java / Scala 7.4% 40.7% 51.9%
Javascript / Typescript 18.5% 40.7% 40.7%
Matlab 3.7% 44.4% 51.9%
Python 37% 40.7% 22.2%
R 96.3% 0% 3.7%
SAS 48.1% 25.9% 25.9%
SPSS 88.9% 0% 11.1%
SQL 88.9% 11.1% 0%
Stata 18.5% 40.7% 40.7%
VBA 22.2% 51.9% 25.9%
Sample size = 27
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 3.7% 0% 96.3%
Java / Scala 0% 0% 100%
Javascript / Typescript 11.1% 0% 88.9%
Matlab 0% 0% 100%
Python 7.4% 0% 92.6%
R 77.8% 3.7% 18.5%
SAS 29.6% 0% 70.4%
SPSS 77.8% 0% 22.2%
SQL 55.6% 0% 44.4%
Stata 3.7% 0% 96.3%
VBA 14.8% 0% 85.2%
Sample size = 27
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 37%
No 22.2%
I don't know 40.7%
Sample size = 27
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 29.6%
No 66.7%
I don't know 3.7%
Sample size = 27
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 0%
Slightly worse 7.7%
No change 23.1%
Slightly better 46.2%
Significantly better 23.1%
Sample size = 13
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 52%
In education 24%
In private sector employment 0%
In public sector employment 8%
Self-taught 16%
Other 0%
Sample size = 25
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 70.8% 16.7% 4.2% 0% 8.3% 0%
Automated data quality assurance 0% 25% 16.7% 37.5% 12.5% 8.3%
Code review 0% 8.3% 20.8% 20.8% 33.3% 16.7%
Coding guidelines / Style guides 4.2% 20.8% 8.3% 33.3% 29.2% 4.2%
Functions 0% 16.7% 12.5% 33.3% 29.2% 8.3%
Open source own code 8.3% 70.8% 8.3% 4.2% 4.2% 4.2%
Packaging code 4.2% 50% 20.8% 25% 0% 0%
Standard directory structure 16.7% 25% 16.7% 12.5% 16.7% 12.5%
Unit testing 37.5% 16.7% 4.2% 16.7% 25% 0%
Use open source software 0% 12.5% 16.7% 12.5% 29.2% 29.2%
Version control 8.3% 58.3% 8.3% 16.7% 8.3% 0%
Sample size = 24
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 29.2% 37.5% 20.8% 12.5% 0% 0%
Code comments 0% 8.3% 0% 12.5% 41.7% 37.5%
Data or assumptions registers 25% 50% 12.5% 8.3% 4.2% 0%
Desk notes 20.8% 50% 12.5% 12.5% 4.2% 0%
Documentation for each function or class 12.5% 20.8% 4.2% 29.2% 25% 8.3%
Flow charts 8.3% 29.2% 12.5% 16.7% 29.2% 4.2%
README files 8.3% 54.2% 12.5% 20.8% 4.2% 0%
Sample size = 24
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 4.2%
No 41.7%
I don't know what dependency management is 54.2%
Sample size = 24
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 0%
No 37.5%
I don't know what continuous integration is 62.5%
Sample size = 24
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 41.7%
I don't know what reproducible workflows are 58.3%
Sample size = 24
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 20%
I don't know what a RAP champion is 12%
I know what a RAP champion is but don't know who the RAP champion in my department is 8%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 60%
Sample size = 25
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 18.2%
I have heard of the RAP strategy, but I haven't read it 59.1%
I have read the RAP strategy 22.7%
Sample size = 22
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 13.6% 9.1% 13.6% 27.3% 36.4%
I feel confident implementing RAP in my work 4.5% 18.2% 9.1% 54.5% 13.6%
I feel supported to implement RAP in my work 4.5% 9.1% 9.1% 59.1% 18.2%
I know where to find resources to help me implement RAP 0% 13.6% 22.7% 45.5% 18.2%
I or my team are planning on implementing RAP in the next 12 months 0% 9.1% 13.6% 22.7% 54.5%
I think it is important to implement RAP in my work 0% 0% 22.7% 31.8% 45.5%
I understand what the key components of the RAP methodology are 0% 22.7% 18.2% 50% 9.1%
Sample size = 22
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 58.3%
Peer review Basic 50%
Team open source code Basic 8.3%
Version control Basic 8.3%
AQUA book guidance Basic 8.3%
Documentation Basic 4.2%
Functions Advanced 37.5%
Function documentation Advanced 33.3%
Follow code style guidelines Advanced 33.3%
Unit testing Advanced 25%
Dependency management Advanced 4.2%
Code packages Advanced 0%
Continuous integration Advanced 0%
Sample size = 24
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 16.7%
1 45.8%
2 20.8%
3 16.7%
4 0%
5 0%
6 0%
Sample size = 24
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 41.7%
1 12.5%
2 25%
3 12.5%
4 8.3%
5 0%
6 0%
7 0%
Sample size = 24
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/office-for-national-statistics.html b/docs/departments/office-for-national-statistics.html new file mode 100644 index 0000000..df38b0b --- /dev/null +++ b/docs/departments/office-for-national-statistics.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Office for National Statistics + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Office for National Statistics

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 11.6%
Rarely 8.9%
Sometimes 17.3%
Regularly 31.1%
All the time 31.1%
Sample size = 225
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 84.8% 15.2%
Data cleaning 92.4% 7.6%
Data linking 92.9% 7.1%
Data transfer / migration 74.2% 25.8%
Data visualisation 69.8% 30.2%
Machine learning 93.2% 6.8%
Modelling 84.6% 15.4%
Quality assurance 76.8% 23.2%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 2.2% 67.1% 30.7%
Java / Scala 10.2% 64% 25.8%
Javascript / Typescript 6.2% 66.7% 27.1%
Matlab 5.8% 61.8% 32.4%
Python 93.3% 3.6% 3.1%
R 91.1% 5.3% 3.6%
SAS 45.8% 36% 18.2%
SPSS 40.4% 35.1% 24.4%
SQL 62.2% 28.4% 9.3%
Stata 25.3% 50.2% 24.4%
VBA 28.9% 53.8% 17.3%
Sample size = 225
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 7.6% 5.8% 86.7%
Java / Scala 6.2% 6.2% 87.6%
Javascript / Typescript 6.2% 5.8% 88%
Matlab 14.2% 7.1% 78.7%
Python 61.8% 0.9% 37.3%
R 62.2% 3.1% 34.7%
SAS 27.1% 6.7% 66.2%
SPSS 43.6% 4.4% 52%
SQL 48.4% 4.4% 47.1%
Stata 20% 4.9% 75.1%
VBA 17.3% 6.7% 76%
Sample size = 225
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 82.2%
No 2.7%
I don't know 15.1%
Sample size = 225
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 62.2%
No 35.1%
I don't know 2.7%
Sample size = 225
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 7%
Slightly worse 11%
No change 13.4%
Slightly better 27.9%
Significantly better 40.7%
Sample size = 172
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 21.6%
In education 50.2%
In private sector employment 1.4%
In public sector employment 13.1%
Self-taught 11.3%
Other 2.3%
Sample size = 213
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 43.7% 13.6% 9% 14.1% 15.6% 4%
Automated data quality assurance 5.5% 19.6% 15.1% 28.1% 23.1% 8.5%
Code review 1.5% 9% 5% 27.6% 33.2% 23.6%
Coding guidelines / Style guides 7% 12.1% 8.5% 19.6% 35.7% 17.1%
Functions 3% 8.5% 9% 22.6% 30.7% 26.1%
Open source own code 18.1% 46.2% 16.1% 7.5% 8% 4%
Packaging code 14.6% 40.7% 16.1% 16.1% 6.5% 6%
Standard directory structure 33.7% 14.6% 9% 12.6% 20.1% 10.1%
Unit testing 26.6% 17.6% 14.1% 18.1% 13.6% 10.1%
Use open source software 12.1% 7.5% 6% 11.1% 27.6% 35.7%
Version control 7.5% 24.6% 8.5% 13.1% 19.6% 26.6%
Sample size = 199
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 31.7% 36.7% 8.5% 12.6% 7% 3.5%
Code comments 3% 3.5% 1% 7.5% 28.1% 56.8%
Data or assumptions registers 29.6% 45.2% 6.5% 8% 6.5% 4%
Desk notes 12.1% 16.1% 11.1% 23.6% 23.1% 14.1%
Documentation for each function or class 13.6% 25.1% 11.1% 15.1% 19.1% 16.1%
Flow charts 7.5% 41.7% 16.1% 18.1% 13.6% 3%
README files 8.5% 27.1% 14.1% 21.6% 15.1% 13.6%
Sample size = 199
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 29.1%
No 30.7%
I don't know what dependency management is 40.2%
Sample size = 199
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 16.1%
No 40.7%
I don't know what continuous integration is 43.2%
Sample size = 199
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 4.5%
No 53.8%
I don't know what reproducible workflows are 41.7%
Sample size = 199
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 8.1%
I don't know what a RAP champion is 23.5%
I know what a RAP champion is but don't know who the RAP champion in my department is 47.5%
I know what a RAP champion is and there is no RAP champion in my department 1.4%
I know who the RAP champion in my department is 19.5%
Sample size = 221
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 23.2%
I have heard of the RAP strategy, but I haven't read it 53.6%
I have read the RAP strategy 23.2%
Sample size = 207
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 16.9% 20.3% 24.6% 21.7% 16.4%
I feel confident implementing RAP in my work 13% 25.1% 23.7% 24.2% 14%
I feel supported to implement RAP in my work 8.7% 10.1% 28.5% 34.3% 18.4%
I know where to find resources to help me implement RAP 8.7% 18.4% 21.3% 30.4% 21.3%
I or my team are planning on implementing RAP in the next 12 months 8.7% 11.1% 29% 28% 23.2%
I think it is important to implement RAP in my work 4.3% 2.9% 21.3% 36.7% 34.8%
I understand what the key components of the RAP methodology are 10.6% 18.4% 19.3% 34.8% 16.9%
Sample size = 207
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 63.3%
Peer review Basic 56.8%
Version control Basic 46.2%
Documentation Basic 26.6%
AQUA book guidance Basic 19.6%
Team open source code Basic 12.1%
Functions Advanced 56.8%
Follow code style guidelines Advanced 52.8%
Function documentation Advanced 35.2%
Dependency management Advanced 29.1%
Unit testing Advanced 23.6%
Continuous integration Advanced 16.1%
Code packages Advanced 12.6%
Sample size = 199
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 15.6%
1 23.6%
2 18.1%
3 18.1%
4 15.1%
5 7%
6 2.5%
Sample size = 199
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 22.1%
1 23.6%
2 13.1%
3 16.1%
4 8.5%
5 8.5%
6 5%
7 3%
Sample size = 199
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/public-health-scotland.html b/docs/departments/public-health-scotland.html new file mode 100644 index 0000000..a405484 --- /dev/null +++ b/docs/departments/public-health-scotland.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Public Health Scotland + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Public Health Scotland

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 0%
Rarely 0%
Sometimes 7.9%
Regularly 28.9%
All the time 63.2%
Sample size = 38
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 94.7% 5.3%
Data cleaning 94.7% 5.3%
Data linking 93.9% 6.1%
Data transfer / migration 66.7% 33.3%
Data visualisation 91.4% 8.6%
Machine learning 100% 0%
Modelling 92.9% 7.1%
Quality assurance 88.9% 11.1%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 5.3% 44.7% 50%
Java / Scala 2.6% 50% 47.4%
Javascript / Typescript 18.4% 50% 31.6%
Matlab 0% 39.5% 60.5%
Python 52.6% 23.7% 23.7%
R 100% 0% 0%
SAS 10.5% 39.5% 50%
SPSS 97.4% 0% 2.6%
SQL 89.5% 2.6% 7.9%
Stata 13.2% 31.6% 55.3%
VBA 55.3% 28.9% 15.8%
Sample size = 38
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 5.3% 5.3% 89.5%
Java / Scala 5.3% 2.6% 92.1%
Javascript / Typescript 13.2% 2.6% 84.2%
Matlab 23.7% 0% 76.3%
Python 31.6% 0% 68.4%
R 97.4% 0% 2.6%
SAS 15.8% 0% 84.2%
SPSS 52.6% 0% 47.4%
SQL 68.4% 0% 31.6%
Stata 13.2% 2.6% 84.2%
VBA 26.3% 0% 73.7%
Sample size = 38
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 97.4%
No 0%
I don't know 2.6%
Sample size = 38
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 78.9%
No 18.4%
I don't know 2.6%
Sample size = 38
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 3.1%
Slightly worse 6.2%
No change 18.8%
Slightly better 18.8%
Significantly better 53.1%
Sample size = 32
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 15.8%
In education 68.4%
In private sector employment 7.9%
In public sector employment 0%
Self-taught 5.3%
Other 2.6%
Sample size = 38
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 89.5% 10.5% 0% 0% 0% 0%
Automated data quality assurance 0% 7.9% 23.7% 31.6% 36.8% 0%
Code review 0% 2.6% 2.6% 23.7% 36.8% 34.2%
Coding guidelines / Style guides 0% 2.6% 5.3% 26.3% 55.3% 10.5%
Functions 2.6% 2.6% 7.9% 23.7% 28.9% 34.2%
Open source own code 7.9% 28.9% 18.4% 23.7% 13.2% 7.9%
Packaging code 10.5% 50% 13.2% 18.4% 2.6% 5.3%
Standard directory structure 13.2% 15.8% 0% 34.2% 26.3% 10.5%
Unit testing 26.3% 15.8% 15.8% 18.4% 18.4% 5.3%
Use open source software 2.6% 2.6% 0% 5.3% 18.4% 71.1%
Version control 2.6% 10.5% 13.2% 18.4% 21.1% 34.2%
Sample size = 38
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 28.9% 44.7% 7.9% 5.3% 7.9% 5.3%
Code comments 0% 0% 0% 0% 26.3% 73.7%
Data or assumptions registers 42.1% 47.4% 7.9% 2.6% 0% 0%
Desk notes 44.7% 26.3% 5.3% 13.2% 10.5% 0%
Documentation for each function or class 5.3% 23.7% 13.2% 28.9% 13.2% 15.8%
Flow charts 5.3% 55.3% 15.8% 21.1% 2.6% 0%
README files 0% 5.3% 34.2% 34.2% 13.2% 13.2%
Sample size = 38
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 21.1%
No 42.1%
I don't know what dependency management is 36.8%
Sample size = 38
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 15.8%
No 23.7%
I don't know what continuous integration is 60.5%
Sample size = 38
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 71.1%
I don't know what reproducible workflows are 28.9%
Sample size = 38
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 13.5%
I don't know what a RAP champion is 27%
I know what a RAP champion is but don't know who the RAP champion in my department is 40.5%
I know what a RAP champion is and there is no RAP champion in my department 8.1%
I know who the RAP champion in my department is 10.8%
Sample size = 37
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 27.3%
I have heard of the RAP strategy, but I haven't read it 45.5%
I have read the RAP strategy 27.3%
Sample size = 33
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 15.2% 18.2% 36.4% 9.1% 21.2%
I feel confident implementing RAP in my work 6.1% 18.2% 21.2% 33.3% 21.2%
I feel supported to implement RAP in my work 6.1% 12.1% 51.5% 24.2% 6.1%
I know where to find resources to help me implement RAP 6.1% 24.2% 33.3% 24.2% 12.1%
I or my team are planning on implementing RAP in the next 12 months 12.1% 15.2% 21.2% 27.3% 24.2%
I think it is important to implement RAP in my work 3% 6.1% 15.2% 39.4% 36.4%
I understand what the key components of the RAP methodology are 6.1% 12.1% 15.2% 54.5% 12.1%
Sample size = 33
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 89.5%
Peer review Basic 71.1%
Version control Basic 55.3%
Documentation Basic 26.3%
Team open source code Basic 21.1%
AQUA book guidance Basic 0%
Follow code style guidelines Advanced 65.8%
Functions Advanced 63.2%
Function documentation Advanced 28.9%
Unit testing Advanced 23.7%
Dependency management Advanced 21.1%
Continuous integration Advanced 15.8%
Code packages Advanced 7.9%
Sample size = 38
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 2.6%
1 21.1%
2 23.7%
3 23.7%
4 21.1%
5 7.9%
6 0%
Sample size = 38
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 10.5%
1 28.9%
2 23.7%
3 18.4%
4 7.9%
5 2.6%
6 5.3%
7 2.6%
Sample size = 38
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/scottish-government-excl-agencies-.html b/docs/departments/scottish-government-excl-agencies-.html new file mode 100644 index 0000000..453fa3c --- /dev/null +++ b/docs/departments/scottish-government-excl-agencies-.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Scottish Government (excl. agencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Scottish Government (excl. agencies)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 12.5%
Rarely 5%
Sometimes 15%
Regularly 37.5%
All the time 30%
Sample size = 40
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 87.5% 12.5%
Data cleaning 94.1% 5.9%
Data linking 100% 0%
Data transfer / migration 66.7% 33.3%
Data visualisation 71.1% 28.9%
Machine learning 66.7% 33.3%
Modelling 100% 0%
Quality assurance 83.8% 16.2%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 2.5% 70% 27.5%
Java / Scala 0% 75% 25%
Javascript / Typescript 5% 72.5% 22.5%
Matlab 10% 60% 30%
Python 47.5% 40% 12.5%
R 95% 5% 0%
SAS 70% 25% 5%
SPSS 35% 50% 15%
SQL 45% 52.5% 2.5%
Stata 7.5% 70% 22.5%
VBA 40% 55% 5%
Sample size = 40
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 10% 7.5% 82.5%
Java / Scala 5% 5% 90%
Javascript / Typescript 10% 7.5% 82.5%
Matlab 25% 0% 75%
Python 35% 0% 65%
R 75% 0% 25%
SAS 57.5% 0% 42.5%
SPSS 30% 2.5% 67.5%
SQL 37.5% 5% 57.5%
Stata 10% 2.5% 87.5%
VBA 22.5% 7.5% 70%
Sample size = 40
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 75%
No 5%
I don't know 20%
Sample size = 40
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 45%
No 50%
I don't know 5%
Sample size = 40
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 3.2%
Slightly worse 9.7%
No change 16.1%
Slightly better 38.7%
Significantly better 32.3%
Sample size = 31
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 18.9%
In education 40.5%
In private sector employment 2.7%
In public sector employment 16.2%
Self-taught 18.9%
Other 2.7%
Sample size = 37
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 48.6% 20% 8.6% 5.7% 14.3% 2.9%
Automated data quality assurance 0% 14.3% 22.9% 31.4% 28.6% 2.9%
Code review 0% 5.7% 40% 20% 31.4% 2.9%
Coding guidelines / Style guides 11.4% 2.9% 0% 25.7% 42.9% 17.1%
Functions 5.7% 8.6% 8.6% 17.1% 34.3% 25.7%
Open source own code 2.9% 40% 20% 20% 14.3% 2.9%
Packaging code 11.4% 40% 20% 8.6% 20% 0%
Standard directory structure 25.7% 5.7% 0% 8.6% 45.7% 14.3%
Unit testing 25.7% 17.1% 22.9% 14.3% 20% 0%
Use open source software 5.7% 5.7% 11.4% 11.4% 31.4% 34.3%
Version control 2.9% 48.6% 8.6% 17.1% 17.1% 5.7%
Sample size = 35
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 28.6% 31.4% 8.6% 14.3% 17.1% 0%
Code comments 0% 2.9% 2.9% 2.9% 31.4% 60%
Data or assumptions registers 25.7% 45.7% 8.6% 8.6% 8.6% 2.9%
Desk notes 11.4% 0% 11.4% 37.1% 28.6% 11.4%
Documentation for each function or class 17.1% 14.3% 14.3% 20% 28.6% 5.7%
Flow charts 5.7% 31.4% 20% 25.7% 14.3% 2.9%
README files 2.9% 20% 20% 17.1% 37.1% 2.9%
Sample size = 35
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 22.9%
No 40%
I don't know what dependency management is 37.1%
Sample size = 35
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 8.6%
No 48.6%
I don't know what continuous integration is 42.9%
Sample size = 35
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 65.7%
I don't know what reproducible workflows are 34.3%
Sample size = 35
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 10.3%
I don't know what a RAP champion is 17.9%
I know what a RAP champion is but don't know who the RAP champion in my department is 33.3%
I know what a RAP champion is and there is no RAP champion in my department 5.1%
I know who the RAP champion in my department is 33.3%
Sample size = 39
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 11.1%
I have heard of the RAP strategy, but I haven't read it 44.4%
I have read the RAP strategy 44.4%
Sample size = 36
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 16.7% 22.2% 22.2% 27.8% 11.1%
I feel confident implementing RAP in my work 5.6% 36.1% 13.9% 33.3% 11.1%
I feel supported to implement RAP in my work 8.3% 11.1% 33.3% 41.7% 5.6%
I know where to find resources to help me implement RAP 0% 19.4% 11.1% 50% 19.4%
I or my team are planning on implementing RAP in the next 12 months 2.8% 11.1% 38.9% 30.6% 16.7%
I think it is important to implement RAP in my work 0% 2.8% 22.2% 52.8% 22.2%
I understand what the key components of the RAP methodology are 5.6% 16.7% 19.4% 38.9% 19.4%
Sample size = 36
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 65.7%
Documentation Basic 40%
Peer review Basic 34.3%
Version control Basic 22.9%
Team open source code Basic 17.1%
AQUA book guidance Basic 17.1%
Functions Advanced 60%
Follow code style guidelines Advanced 60%
Function documentation Advanced 34.3%
Dependency management Advanced 22.9%
Unit testing Advanced 20%
Code packages Advanced 20%
Continuous integration Advanced 8.6%
Sample size = 35
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 14.3%
1 31.4%
2 25.7%
3 2.9%
4 22.9%
5 2.9%
6 0%
Sample size = 35
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 17.1%
1 20%
2 25.7%
3 11.4%
4 14.3%
5 8.6%
6 0%
7 2.9%
Sample size = 35
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/uk-health-security-agency.html b/docs/departments/uk-health-security-agency.html new file mode 100644 index 0000000..c9ebb74 --- /dev/null +++ b/docs/departments/uk-health-security-agency.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: UK Health Security Agency + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: UK Health Security Agency

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 0%
Rarely 12%
Sometimes 16%
Regularly 24%
All the time 48%
Sample size = 25
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 88% 12%
Data cleaning 81.8% 18.2%
Data linking 84.2% 15.8%
Data transfer / migration 86.7% 13.3%
Data visualisation 87.5% 12.5%
Machine learning 87.5% 12.5%
Modelling 83.3% 16.7%
Quality assurance 81.8% 18.2%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 44% 36% 20%
Java / Scala 20% 64% 16%
Javascript / Typescript 32% 52% 16%
Matlab 8% 60% 32%
Python 96% 0% 4%
R 96% 0% 4%
SAS 12% 64% 24%
SPSS 20% 56% 24%
SQL 88% 8% 4%
Stata 52% 40% 8%
VBA 52% 36% 12%
Sample size = 25
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 12% 4% 84%
Java / Scala 8% 4% 88%
Javascript / Typescript 16% 8% 76%
Matlab 16% 4% 80%
Python 80% 0% 20%
R 84% 0% 16%
SAS 12% 4% 84%
SPSS 20% 4% 76%
SQL 80% 0% 20%
Stata 24% 4% 72%
VBA 20% 4% 76%
Sample size = 25
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 92%
No 4%
I don't know 4%
Sample size = 25
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 80%
No 20%
I don't know 0%
Sample size = 25
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 0%
Slightly worse 18.2%
No change 4.5%
Slightly better 45.5%
Significantly better 31.8%
Sample size = 22
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 12%
In education 44%
In private sector employment 0%
In public sector employment 16%
Self-taught 24%
Other 4%
Sample size = 25
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 32% 20% 12% 16% 12% 8%
Automated data quality assurance 4% 24% 20% 28% 4% 20%
Code review 0% 0% 12% 40% 32% 16%
Coding guidelines / Style guides 4% 4% 4% 24% 52% 12%
Functions 4% 0% 4% 32% 28% 32%
Open source own code 4% 32% 24% 24% 16% 0%
Packaging code 4% 24% 28% 24% 16% 4%
Standard directory structure 8% 12% 0% 36% 24% 20%
Unit testing 8% 4% 36% 32% 16% 4%
Use open source software 0% 0% 4% 12% 20% 64%
Version control 0% 16% 8% 0% 16% 60%
Sample size = 25
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 24% 28% 20% 16% 8% 4%
Code comments 8% 0% 0% 8% 32% 52%
Data or assumptions registers 44% 28% 12% 12% 0% 4%
Desk notes 36% 12% 16% 16% 12% 8%
Documentation for each function or class 12% 20% 0% 28% 24% 16%
Flow charts 12% 24% 24% 32% 4% 4%
README files 8% 4% 12% 20% 32% 24%
Sample size = 25
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 52%
No 36%
I don't know what dependency management is 12%
Sample size = 25
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 32%
No 48%
I don't know what continuous integration is 20%
Sample size = 25
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 8%
No 80%
I don't know what reproducible workflows are 12%
Sample size = 25
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 28%
I don't know what a RAP champion is 20%
I know what a RAP champion is but don't know who the RAP champion in my department is 24%
I know what a RAP champion is and there is no RAP champion in my department 12%
I know who the RAP champion in my department is 16%
Sample size = 25
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 11.1%
I have heard of the RAP strategy, but I haven't read it 55.6%
I have read the RAP strategy 33.3%
Sample size = 18
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 5.6% 27.8% 33.3% 16.7% 16.7%
I feel confident implementing RAP in my work 5.6% 22.2% 27.8% 27.8% 16.7%
I feel supported to implement RAP in my work 11.1% 22.2% 22.2% 33.3% 11.1%
I know where to find resources to help me implement RAP 5.6% 22.2% 11.1% 44.4% 16.7%
I or my team are planning on implementing RAP in the next 12 months 5.6% 16.7% 22.2% 33.3% 22.2%
I think it is important to implement RAP in my work 5.6% 5.6% 0% 55.6% 33.3%
I understand what the key components of the RAP methodology are 5.6% 27.8% 16.7% 38.9% 11.1%
Sample size = 18
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 84%
Version control Basic 76%
Documentation Basic 56%
Peer review Basic 48%
AQUA book guidance Basic 20%
Team open source code Basic 16%
Follow code style guidelines Advanced 64%
Functions Advanced 60%
Dependency management Advanced 52%
Function documentation Advanced 40%
Continuous integration Advanced 32%
Unit testing Advanced 20%
Code packages Advanced 20%
Sample size = 25
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 4%
1 20%
2 12%
3 16%
4 32%
5 16%
6 0%
Sample size = 25
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 12%
1 12%
2 12%
3 36%
4 12%
5 4%
6 8%
7 4%
Sample size = 25
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/departments/welsh-government.html b/docs/departments/welsh-government.html new file mode 100644 index 0000000..369223e --- /dev/null +++ b/docs/departments/welsh-government.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Department summary: Welsh Government + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Department summary: Welsh Government

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 17.4%
Rarely 13%
Sometimes 21.7%
Regularly 30.4%
All the time 17.4%
Sample size = 23
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 90% 10%
Data cleaning 92.3% 7.7%
Data linking 92.3% 7.7%
Data transfer / migration 83.3% 16.7%
Data visualisation 64.7% 35.3%
Machine learning 0% 0%
Modelling 100% 0%
Quality assurance 63.2% 36.8%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 0% 60.9% 39.1%
Java / Scala 0% 60.9% 39.1%
Javascript / Typescript 0% 60.9% 39.1%
Matlab 0% 65.2% 34.8%
Python 82.6% 8.7% 8.7%
R 82.6% 8.7% 8.7%
SAS 69.6% 21.7% 8.7%
SPSS 56.5% 26.1% 17.4%
SQL 91.3% 8.7% 0%
Stata 26.1% 56.5% 17.4%
VBA 47.8% 34.8% 17.4%
Sample size = 23
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 4.3% 17.4% 78.3%
Java / Scala 21.7% 13% 65.2%
Javascript / Typescript 8.7% 13% 78.3%
Matlab 13% 13% 73.9%
Python 34.8% 4.3% 60.9%
R 52.2% 4.3% 43.5%
SAS 47.8% 4.3% 47.8%
SPSS 47.8% 8.7% 43.5%
SQL 69.6% 17.4% 13%
Stata 17.4% 8.7% 73.9%
VBA 34.8% 0% 65.2%
Sample size = 23
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 17.4%
No 39.1%
I don't know 43.5%
Sample size = 23
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 30.4%
No 69.6%
I don't know 0%
Sample size = 23
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 26.3%
Slightly worse 10.5%
No change 5.3%
Slightly better 31.6%
Significantly better 26.3%
Sample size = 19
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 9.5%
In education 81%
In private sector employment 0%
In public sector employment 4.8%
Self-taught 4.8%
Other 0%
Sample size = 21
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 36.8% 26.3% 10.5% 15.8% 5.3% 5.3%
Automated data quality assurance 5.3% 21.1% 31.6% 15.8% 21.1% 5.3%
Code review 0% 15.8% 15.8% 21.1% 36.8% 10.5%
Coding guidelines / Style guides 5.3% 10.5% 15.8% 26.3% 31.6% 10.5%
Functions 0% 31.6% 5.3% 36.8% 15.8% 10.5%
Open source own code 21.1% 63.2% 0% 15.8% 0% 0%
Packaging code 15.8% 52.6% 21.1% 5.3% 5.3% 0%
Standard directory structure 26.3% 15.8% 5.3% 15.8% 26.3% 10.5%
Unit testing 36.8% 31.6% 5.3% 21.1% 0% 5.3%
Use open source software 0% 26.3% 10.5% 15.8% 21.1% 26.3%
Version control 5.3% 68.4% 5.3% 10.5% 10.5% 0%
Sample size = 19
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 26.3% 42.1% 21.1% 0% 0% 10.5%
Code comments 5.3% 5.3% 0% 10.5% 31.6% 47.4%
Data or assumptions registers 42.1% 36.8% 15.8% 0% 0% 5.3%
Desk notes 5.3% 5.3% 0% 26.3% 42.1% 21.1%
Documentation for each function or class 15.8% 36.8% 15.8% 15.8% 10.5% 5.3%
Flow charts 15.8% 52.6% 10.5% 15.8% 5.3% 0%
README files 10.5% 47.4% 10.5% 10.5% 15.8% 5.3%
Sample size = 19
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 10.5%
No 31.6%
I don't know what dependency management is 57.9%
Sample size = 19
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 5.3%
No 47.4%
I don't know what continuous integration is 47.4%
Sample size = 19
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 47.4%
I don't know what reproducible workflows are 52.6%
Sample size = 19
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 8.7%
I don't know what a RAP champion is 8.7%
I know what a RAP champion is but don't know who the RAP champion in my department is 60.9%
I know what a RAP champion is and there is no RAP champion in my department 0%
I know who the RAP champion in my department is 21.7%
Sample size = 23
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 23.8%
I have heard of the RAP strategy, but I haven't read it 57.1%
I have read the RAP strategy 19%
Sample size = 21
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 19% 19% 19% 19% 23.8%
I feel confident implementing RAP in my work 4.8% 19% 23.8% 33.3% 19%
I feel supported to implement RAP in my work 0% 14.3% 14.3% 42.9% 28.6%
I know where to find resources to help me implement RAP 4.8% 14.3% 14.3% 47.6% 19%
I or my team are planning on implementing RAP in the next 12 months 14.3% 9.5% 14.3% 38.1% 23.8%
I think it is important to implement RAP in my work 0% 4.8% 19% 38.1% 38.1%
I understand what the key components of the RAP methodology are 4.8% 23.8% 23.8% 38.1% 9.5%
Sample size = 21
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 47.4%
Peer review Basic 47.4%
Documentation Basic 21.1%
Version control Basic 10.5%
AQUA book guidance Basic 10.5%
Team open source code Basic 0%
Follow code style guidelines Advanced 42.1%
Functions Advanced 26.3%
Function documentation Advanced 15.8%
Dependency management Advanced 10.5%
Unit testing Advanced 5.3%
Code packages Advanced 5.3%
Continuous integration Advanced 5.3%
Sample size = 19
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 26.3%
1 42.1%
2 15.8%
3 0%
4 15.8%
5 0%
6 0%
Sample size = 19
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 47.4%
1 26.3%
2 10.5%
3 5.3%
4 5.3%
5 5.3%
6 0%
7 0%
Sample size = 19
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/professions/data-scientists.html b/docs/professions/data-scientists.html new file mode 100644 index 0000000..548a53c --- /dev/null +++ b/docs/professions/data-scientists.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Profession summary: government data scientists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Profession summary: government data scientists

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 1.6%
Rarely 6%
Sometimes 13%
Regularly 28.3%
All the time 51.1%
Sample size = 184
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 92.2% 7.8%
Data cleaning 90.9% 9.1%
Data linking 88.6% 11.4%
Data transfer / migration 79% 21%
Data visualisation 87.1% 12.9%
Machine learning 91.9% 8.1%
Modelling 86.7% 13.3%
Quality assurance 76.8% 23.2%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 11.4% 51.6% 37%
Java / Scala 13.6% 50% 36.4%
Javascript / Typescript 23.4% 45.1% 31.5%
Matlab 7.1% 43.5% 49.5%
Python 78.8% 14.1% 7.1%
R 94.6% 2.2% 3.3%
SAS 24.5% 46.2% 29.3%
SPSS 29.9% 42.9% 27.2%
SQL 80.4% 13.6% 6%
Stata 17.4% 50.5% 32.1%
VBA 46.7% 40.8% 12.5%
Sample size = 184
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 7.6% 4.9% 87.5%
Java / Scala 8.2% 6.5% 85.3%
Javascript / Typescript 15.2% 3.3% 81.5%
Matlab 24.5% 3.3% 72.3%
Python 69% 1.6% 29.3%
R 84.8% 1.1% 14.1%
SAS 16.8% 4.9% 78.3%
SPSS 26.1% 4.3% 69.6%
SQL 77.2% 1.6% 21.2%
Stata 5.4% 6.5% 88%
VBA 23.9% 7.1% 69%
Sample size = 184
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 84.8%
No 7.6%
I don't know 7.6%
Sample size = 184
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 82.6%
No 15.8%
I don't know 1.6%
Sample size = 184
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 5.5%
Slightly worse 8.5%
No change 10.4%
Slightly better 35.4%
Significantly better 40.2%
Sample size = 164
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 10.4%
In education 58.5%
In private sector employment 2.7%
In public sector employment 7.7%
Self-taught 19.1%
Other 1.6%
Sample size = 183
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 33.7% 13.8% 9.4% 14.9% 18.8% 9.4%
Automated data quality assurance 3.9% 13.3% 20.4% 24.9% 22.1% 15.5%
Code review 0% 5.5% 9.4% 22.1% 33.1% 29.8%
Coding guidelines / Style guides 1.7% 5.5% 6.6% 18.8% 37% 30.4%
Functions 0.6% 5% 5% 17.1% 24.3% 48.1%
Open source own code 6.1% 30.9% 18.2% 25.4% 12.7% 6.6%
Packaging code 3.9% 29.3% 21% 26% 13.3% 6.6%
Standard directory structure 9.4% 10.5% 8.8% 22.7% 26.5% 22.1%
Unit testing 11.6% 13.3% 12.7% 29.3% 21% 12.2%
Use open source software 1.1% 5% 2.8% 5% 22.7% 63.5%
Version control 2.8% 12.2% 6.6% 13.3% 23.2% 42%
Sample size = 181
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 19.3% 27.1% 15.5% 18.8% 14.9% 4.4%
Code comments 0.6% 2.2% 1.7% 6.6% 25.4% 63.5%
Data or assumptions registers 20.4% 35.4% 15.5% 12.2% 11.6% 5%
Desk notes 22.1% 16% 16% 23.2% 16% 6.6%
Documentation for each function or class 2.8% 12.7% 12.7% 19.9% 28.7% 23.2%
Flow charts 2.2% 28.7% 24.9% 27.6% 12.7% 3.9%
README files 1.7% 8.8% 10.5% 24.9% 27.1% 27.1%
Sample size = 181
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 54.7%
No 28.2%
I don't know what dependency management is 17.1%
Sample size = 181
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 29.8%
No 43.1%
I don't know what continuous integration is 27.1%
Sample size = 181
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 8.3%
No 69.6%
I don't know what reproducible workflows are 22.1%
Sample size = 181
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 15.4%
I don't know what a RAP champion is 18.9%
I know what a RAP champion is but don't know who the RAP champion in my department is 35.4%
I know what a RAP champion is and there is no RAP champion in my department 5.1%
I know who the RAP champion in my department is 25.1%
Sample size = 175
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 24.2%
I have heard of the RAP strategy, but I haven't read it 42%
I have read the RAP strategy 33.8%
Sample size = 157
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 11.5% 15.9% 22.3% 24.2% 26.1%
I feel confident implementing RAP in my work 6.4% 10.8% 21% 32.5% 29.3%
I feel supported to implement RAP in my work 8.3% 10.2% 25.5% 32.5% 23.6%
I know where to find resources to help me implement RAP 6.4% 18.5% 17.2% 31.8% 26.1%
I or my team are planning on implementing RAP in the next 12 months 7.6% 6.4% 27.4% 27.4% 31.2%
I think it is important to implement RAP in my work 2.5% 1.9% 13.4% 41.4% 40.8%
I understand what the key components of the RAP methodology are 6.4% 8.9% 21.7% 36.3% 26.8%
Sample size = 157
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 86.2%
Version control Basic 65.2%
Peer review Basic 63%
Documentation Basic 51.4%
AQUA book guidance Basic 28.2%
Team open source code Basic 19.3%
Functions Advanced 72.4%
Follow code style guidelines Advanced 67.4%
Dependency management Advanced 54.7%
Function documentation Advanced 51.9%
Unit testing Advanced 33.1%
Continuous integration Advanced 29.8%
Code packages Advanced 19.9%
Sample size = 181
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 5%
1 15.5%
2 14.9%
3 19.9%
4 21%
5 18.2%
6 5.5%
Sample size = 181
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 11.6%
1 11.6%
2 13.3%
3 14.4%
4 16%
5 17.7%
6 12.7%
7 2.8%
Sample size = 181
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/professions/digital-and-data.html b/docs/professions/digital-and-data.html new file mode 100644 index 0000000..eb84820 --- /dev/null +++ b/docs/professions/digital-and-data.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Profession summary: digital and data profession (DDAT) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Profession summary: digital and data profession (DDAT)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 2.2%
Rarely 9.8%
Sometimes 19.6%
Regularly 31.5%
All the time 37%
Sample size = 92
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 89.8% 10.2%
Data cleaning 86.4% 13.6%
Data linking 85% 15%
Data transfer / migration 76.6% 23.4%
Data visualisation 77.6% 22.4%
Machine learning 91.7% 8.3%
Modelling 86.8% 13.2%
Quality assurance 79.8% 20.2%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 15.2% 48.9% 35.9%
Java / Scala 19.6% 50% 30.4%
Javascript / Typescript 30.4% 46.7% 22.8%
Matlab 5.4% 47.8% 46.7%
Python 84.8% 7.6% 7.6%
R 92.4% 3.3% 4.3%
SAS 27.2% 47.8% 25%
SPSS 34.8% 42.4% 22.8%
SQL 80.4% 13% 6.5%
Stata 17.4% 54.3% 28.3%
VBA 51.1% 37% 12%
Sample size = 92
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 16.3% 1.1% 82.6%
Java / Scala 5.4% 3.3% 91.3%
Javascript / Typescript 21.7% 3.3% 75%
Matlab 19.6% 2.2% 78.3%
Python 70.7% 0% 29.3%
R 69.6% 0% 30.4%
SAS 19.6% 5.4% 75%
SPSS 17.4% 2.2% 80.4%
SQL 78.3% 1.1% 20.7%
Stata 9.8% 3.3% 87%
VBA 33.7% 5.4% 60.9%
Sample size = 92
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 89.1%
No 6.5%
I don't know 4.3%
Sample size = 92
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 77.2%
No 16.3%
I don't know 6.5%
Sample size = 92
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 6.2%
Slightly worse 9.9%
No change 11.1%
Slightly better 37%
Significantly better 35.8%
Sample size = 81
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 13.2%
In education 62.6%
In private sector employment 4.4%
In public sector employment 3.3%
Self-taught 14.3%
Other 2.2%
Sample size = 91
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 33.3% 16.7% 14.4% 16.7% 15.6% 3.3%
Automated data quality assurance 2.2% 26.7% 13.3% 23.3% 27.8% 6.7%
Code review 0% 8.9% 12.2% 18.9% 31.1% 28.9%
Coding guidelines / Style guides 2.2% 5.6% 13.3% 16.7% 37.8% 24.4%
Functions 1.1% 6.7% 8.9% 17.8% 25.6% 40%
Open source own code 4.4% 34.4% 24.4% 18.9% 14.4% 3.3%
Packaging code 4.4% 28.9% 21.1% 27.8% 15.6% 2.2%
Standard directory structure 11.1% 13.3% 12.2% 16.7% 30% 16.7%
Unit testing 12.2% 13.3% 21.1% 31.1% 13.3% 8.9%
Use open source software 3.3% 8.9% 7.8% 4.4% 25.6% 50%
Version control 0% 15.6% 13.3% 4.4% 27.8% 38.9%
Sample size = 90
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 24.4% 26.7% 15.6% 23.3% 8.9% 1.1%
Code comments 1.1% 3.3% 5.6% 5.6% 36.7% 47.8%
Data or assumptions registers 24.4% 32.2% 20% 11.1% 10% 2.2%
Desk notes 23.3% 14.4% 12.2% 22.2% 18.9% 8.9%
Documentation for each function or class 6.7% 16.7% 14.4% 16.7% 28.9% 16.7%
Flow charts 3.3% 25.6% 26.7% 28.9% 11.1% 4.4%
README files 2.2% 10% 11.1% 23.3% 28.9% 24.4%
Sample size = 90
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 54.4%
No 28.9%
I don't know what dependency management is 16.7%
Sample size = 90
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 32.2%
No 46.7%
I don't know what continuous integration is 21.1%
Sample size = 90
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 13.3%
No 73.3%
I don't know what reproducible workflows are 13.3%
Sample size = 90
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 19.1%
I don't know what a RAP champion is 22.5%
I know what a RAP champion is but don't know who the RAP champion in my department is 33.7%
I know what a RAP champion is and there is no RAP champion in my department 3.4%
I know who the RAP champion in my department is 21.3%
Sample size = 89
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 21.3%
I have heard of the RAP strategy, but I haven't read it 53.3%
I have read the RAP strategy 25.3%
Sample size = 75
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 12% 17.3% 28% 24% 18.7%
I feel confident implementing RAP in my work 8% 14.7% 25.3% 32% 20%
I feel supported to implement RAP in my work 9.3% 16% 26.7% 33.3% 14.7%
I know where to find resources to help me implement RAP 8% 17.3% 12% 42.7% 20%
I or my team are planning on implementing RAP in the next 12 months 10.7% 8% 32% 32% 17.3%
I think it is important to implement RAP in my work 2.7% 5.3% 16% 48% 28%
I understand what the key components of the RAP methodology are 6.7% 10.7% 17.3% 45.3% 20%
Sample size = 75
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 75.6%
Version control Basic 66.7%
Peer review Basic 60%
Documentation Basic 48.9%
AQUA book guidance Basic 18.9%
Team open source code Basic 17.8%
Functions Advanced 65.6%
Follow code style guidelines Advanced 62.2%
Dependency management Advanced 54.4%
Function documentation Advanced 45.6%
Continuous integration Advanced 32.2%
Unit testing Advanced 22.2%
Code packages Advanced 17.8%
Sample size = 90
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 12.2%
1 13.3%
2 12.2%
3 24.4%
4 17.8%
5 14.4%
6 5.6%
Sample size = 90
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 15.6%
1 11.1%
2 16.7%
3 13.3%
4 16.7%
5 16.7%
6 4.4%
7 5.6%
Sample size = 90
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/professions/government-actuarys-department.html b/docs/professions/government-actuarys-department.html new file mode 100644 index 0000000..6c48ea2 --- /dev/null +++ b/docs/professions/government-actuarys-department.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Profession summary: government actuary’s department (GAD) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Profession summary: government actuary’s department (GAD)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 29.7%
Rarely 16.2%
Sometimes 10.8%
Regularly 27%
All the time 16.2%
Sample size = 37
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 62.5% 37.5%
Data cleaning 61.5% 38.5%
Data linking 66.7% 33.3%
Data transfer / migration 62.5% 37.5%
Data visualisation 50% 50%
Machine learning 87.5% 12.5%
Modelling 60% 40%
Quality assurance 35.7% 64.3%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 2.7% 54.1% 43.2%
Java / Scala 0% 56.8% 43.2%
Javascript / Typescript 16.2% 54.1% 29.7%
Matlab 2.7% 43.2% 54.1%
Python 89.2% 8.1% 2.7%
R 91.9% 2.7% 5.4%
SAS 86.5% 8.1% 5.4%
SPSS 2.7% 48.6% 48.6%
SQL 45.9% 37.8% 16.2%
Stata 0% 54.1% 45.9%
VBA 89.2% 8.1% 2.7%
Sample size = 37
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 13.5% 2.7% 83.8%
Java / Scala 10.8% 2.7% 86.5%
Javascript / Typescript 10.8% 2.7% 86.5%
Matlab 21.6% 5.4% 73%
Python 32.4% 0% 67.6%
R 62.2% 5.4% 32.4%
SAS 29.7% 5.4% 64.9%
SPSS 8.1% 2.7% 89.2%
SQL 29.7% 2.7% 67.6%
Stata 10.8% 2.7% 86.5%
VBA 56.8% 2.7% 40.5%
Sample size = 37
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 37.8%
No 5.4%
I don't know 56.8%
Sample size = 37
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 24.3%
No 67.6%
I don't know 8.1%
Sample size = 37
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 12.5%
Slightly worse 16.7%
No change 12.5%
Slightly better 37.5%
Significantly better 20.8%
Sample size = 24
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 34.4%
In education 43.8%
In private sector employment 3.1%
In public sector employment 3.1%
Self-taught 15.6%
Other 0%
Sample size = 32
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 46.2% 19.2% 7.7% 11.5% 11.5% 3.8%
Automated data quality assurance 15.4% 19.2% 26.9% 26.9% 7.7% 3.8%
Code review 0% 7.7% 15.4% 19.2% 38.5% 19.2%
Coding guidelines / Style guides 11.5% 19.2% 0% 26.9% 34.6% 7.7%
Functions 15.4% 3.8% 11.5% 15.4% 26.9% 26.9%
Open source own code 15.4% 65.4% 7.7% 3.8% 7.7% 0%
Packaging code 23.1% 30.8% 15.4% 19.2% 11.5% 0%
Standard directory structure 15.4% 23.1% 11.5% 15.4% 30.8% 3.8%
Unit testing 23.1% 15.4% 11.5% 30.8% 11.5% 7.7%
Use open source software 15.4% 11.5% 7.7% 26.9% 19.2% 19.2%
Version control 26.9% 30.8% 19.2% 7.7% 11.5% 3.8%
Sample size = 26
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 23.1% 15.4% 3.8% 34.6% 15.4% 7.7%
Code comments 0% 3.8% 11.5% 7.7% 38.5% 38.5%
Data or assumptions registers 42.3% 34.6% 11.5% 3.8% 7.7% 0%
Desk notes 23.1% 23.1% 7.7% 34.6% 11.5% 0%
Documentation for each function or class 19.2% 15.4% 7.7% 30.8% 23.1% 3.8%
Flow charts 15.4% 26.9% 19.2% 23.1% 15.4% 0%
README files 23.1% 15.4% 15.4% 23.1% 19.2% 3.8%
Sample size = 26
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 15.4%
No 34.6%
I don't know what dependency management is 50%
Sample size = 26
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 7.7%
No 46.2%
I don't know what continuous integration is 46.2%
Sample size = 26
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0%
No 53.8%
I don't know what reproducible workflows are 46.2%
Sample size = 26
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 56.8%
I don't know what a RAP champion is 18.9%
I know what a RAP champion is but don't know who the RAP champion in my department is 8.1%
I know what a RAP champion is and there is no RAP champion in my department 5.4%
I know who the RAP champion in my department is 10.8%
Sample size = 37
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 25%
I have heard of the RAP strategy, but I haven't read it 56.2%
I have read the RAP strategy 18.8%
Sample size = 16
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 31.2% 6.2% 43.8% 12.5% 6.2%
I feel confident implementing RAP in my work 25% 18.8% 50% 0% 6.2%
I feel supported to implement RAP in my work 18.8% 12.5% 43.8% 18.8% 6.2%
I know where to find resources to help me implement RAP 25% 18.8% 37.5% 6.2% 12.5%
I or my team are planning on implementing RAP in the next 12 months 25% 6.2% 37.5% 25% 6.2%
I think it is important to implement RAP in my work 0% 6.2% 56.2% 25% 12.5%
I understand what the key components of the RAP methodology are 18.8% 6.2% 43.8% 25% 6.2%
Sample size = 16
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Peer review Basic 57.7%
Use open source software Basic 38.5%
Documentation Basic 19.2%
Version control Basic 15.4%
AQUA book guidance Basic 15.4%
Team open source code Basic 7.7%
Functions Advanced 53.8%
Follow code style guidelines Advanced 42.3%
Function documentation Advanced 26.9%
Unit testing Advanced 19.2%
Dependency management Advanced 15.4%
Code packages Advanced 11.5%
Continuous integration Advanced 7.7%
Sample size = 26
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 19.2%
1 38.5%
2 23.1%
3 11.5%
4 3.8%
5 3.8%
6 0%
Sample size = 26
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 23.1%
1 26.9%
2 26.9%
3 7.7%
4 7.7%
5 3.8%
6 3.8%
7 0%
Sample size = 26
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/professions/government-economic-service.html b/docs/professions/government-economic-service.html new file mode 100644 index 0000000..040dc76 --- /dev/null +++ b/docs/professions/government-economic-service.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Profession summary: government economic service (GES) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Profession summary: government economic service (GES)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 33.9%
Rarely 17.4%
Sometimes 22.9%
Regularly 16.5%
All the time 9.2%
Sample size = 109
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 57.4% 42.6%
Data cleaning 68.8% 31.2%
Data linking 73.9% 26.1%
Data transfer / migration 40.6% 59.4%
Data visualisation 52.1% 47.9%
Machine learning 92.9% 7.1%
Modelling 56.5% 43.5%
Quality assurance 34.4% 65.6%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 2.8% 78.9% 18.3%
Java / Scala 4.6% 76.1% 19.3%
Javascript / Typescript 5.5% 75.2% 19.3%
Matlab 3.7% 72.5% 23.9%
Python 50.5% 38.5% 11%
R 87.2% 7.3% 5.5%
SAS 24.8% 56% 19.3%
SPSS 21.1% 63.3% 15.6%
SQL 35.8% 48.6% 15.6%
Stata 40.4% 43.1% 16.5%
VBA 31.2% 57.8% 11%
Sample size = 109
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 1.8% 5.5% 92.7%
Java / Scala 0.9% 6.4% 92.7%
Javascript / Typescript 2.8% 7.3% 89.9%
Matlab 9.2% 5.5% 85.3%
Python 24.8% 4.6% 70.6%
R 62.4% 1.8% 35.8%
SAS 12.8% 3.7% 83.5%
SPSS 11.9% 3.7% 84.4%
SQL 21.1% 4.6% 74.3%
Stata 51.4% 2.8% 45.9%
VBA 11.9% 3.7% 84.4%
Sample size = 109
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 41.3%
No 5.5%
I don't know 53.2%
Sample size = 109
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 25.7%
No 67.9%
I don't know 6.4%
Sample size = 109
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 8.5%
Slightly worse 15.5%
No change 21.1%
Slightly better 31%
Significantly better 23.9%
Sample size = 71
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 27%
In education 44.9%
In private sector employment 3.4%
In public sector employment 12.4%
Self-taught 11.2%
Other 1.1%
Sample size = 89
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 25% 25% 13.9% 22.2% 9.7% 4.2%
Automated data quality assurance 8.3% 43.1% 18.1% 18.1% 6.9% 5.6%
Code review 1.4% 8.3% 6.9% 31.9% 33.3% 18.1%
Coding guidelines / Style guides 8.3% 15.3% 12.5% 25% 26.4% 12.5%
Functions 8.3% 13.9% 11.1% 22.2% 23.6% 20.8%
Open source own code 34.7% 44.4% 5.6% 9.7% 4.2% 1.4%
Packaging code 29.2% 44.4% 13.9% 8.3% 2.8% 1.4%
Standard directory structure 29.2% 22.2% 11.1% 11.1% 19.4% 6.9%
Unit testing 44.4% 22.2% 18.1% 9.7% 5.6% 0%
Use open source software 20.8% 11.1% 8.3% 19.4% 19.4% 20.8%
Version control 18.1% 41.7% 16.7% 8.3% 11.1% 4.2%
Sample size = 72
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 22.2% 26.4% 8.3% 19.4% 18.1% 5.6%
Code comments 6.9% 8.3% 2.8% 9.7% 25% 47.2%
Data or assumptions registers 15.3% 25% 9.7% 12.5% 25% 12.5%
Desk notes 34.7% 25% 8.3% 13.9% 11.1% 6.9%
Documentation for each function or class 22.2% 34.7% 18.1% 12.5% 8.3% 4.2%
Flow charts 13.9% 40.3% 12.5% 23.6% 9.7% 0%
README files 16.7% 31.9% 19.4% 15.3% 11.1% 5.6%
Sample size = 72
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 6.9%
No 36.1%
I don't know what dependency management is 56.9%
Sample size = 72
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 8.3%
No 50%
I don't know what continuous integration is 41.7%
Sample size = 72
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 1.4%
No 37.5%
I don't know what reproducible workflows are 61.1%
Sample size = 72
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 33%
I don't know what a RAP champion is 22%
I know what a RAP champion is but don't know who the RAP champion in my department is 26.6%
I know what a RAP champion is and there is no RAP champion in my department 1.8%
I know who the RAP champion in my department is 16.5%
Sample size = 109
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 32.9%
I have heard of the RAP strategy, but I haven't read it 49.3%
I have read the RAP strategy 17.8%
Sample size = 73
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 23.3% 32.9% 24.7% 15.1% 4.1%
I feel confident implementing RAP in my work 12.3% 30.1% 24.7% 28.8% 4.1%
I feel supported to implement RAP in my work 9.6% 20.5% 45.2% 19.2% 5.5%
I know where to find resources to help me implement RAP 9.6% 26% 24.7% 28.8% 11%
I or my team are planning on implementing RAP in the next 12 months 6.8% 19.2% 37% 31.5% 5.5%
I think it is important to implement RAP in my work 1.4% 11% 30.1% 31.5% 26%
I understand what the key components of the RAP methodology are 11% 26% 24.7% 31.5% 6.8%
Sample size = 73
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Peer review Basic 51.4%
Use open source software Basic 40.3%
Documentation Basic 16.7%
Version control Basic 15.3%
AQUA book guidance Basic 13.9%
Team open source code Basic 5.6%
Functions Advanced 44.4%
Follow code style guidelines Advanced 38.9%
Function documentation Advanced 12.5%
Continuous integration Advanced 8.3%
Dependency management Advanced 6.9%
Unit testing Advanced 5.6%
Code packages Advanced 4.2%
Sample size = 72
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 22.2%
1 38.9%
2 20.8%
3 11.1%
4 5.6%
5 1.4%
6 0%
Sample size = 72
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 36.1%
1 33.3%
2 15.3%
3 8.3%
4 5.6%
5 0%
6 0%
7 1.4%
Sample size = 72
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/professions/government-geography.html b/docs/professions/government-geography.html new file mode 100644 index 0000000..afa84fb --- /dev/null +++ b/docs/professions/government-geography.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Profession summary: government geography profession + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Profession summary: government geography profession

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 4.5%
Rarely 9.1%
Sometimes 22.7%
Regularly 31.8%
All the time 31.8%
Sample size = 22
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 81.8% 18.2%
Data cleaning 90.5% 9.5%
Data linking 88.2% 11.8%
Data transfer / migration 80% 20%
Data visualisation 80% 20%
Machine learning 87.5% 12.5%
Modelling 77.8% 22.2%
Quality assurance 66.7% 33.3%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 18.2% 68.2% 13.6%
Java / Scala 18.2% 68.2% 13.6%
Javascript / Typescript 45.5% 50% 4.5%
Matlab 4.5% 63.6% 31.8%
Python 86.4% 9.1% 4.5%
R 90.9% 4.5% 4.5%
SAS 13.6% 77.3% 9.1%
SPSS 27.3% 63.6% 9.1%
SQL 72.7% 18.2% 9.1%
Stata 22.7% 68.2% 9.1%
VBA 45.5% 54.5% 0%
Sample size = 22
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 18.2% 0% 81.8%
Java / Scala 0% 4.5% 95.5%
Javascript / Typescript 27.3% 0% 72.7%
Matlab 18.2% 13.6% 68.2%
Python 72.7% 4.5% 22.7%
R 63.6% 4.5% 31.8%
SAS 13.6% 4.5% 81.8%
SPSS 18.2% 9.1% 72.7%
SQL 68.2% 4.5% 27.3%
Stata 0% 4.5% 95.5%
VBA 22.7% 9.1% 68.2%
Sample size = 22
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 72.7%
No 18.2%
I don't know 9.1%
Sample size = 22
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 81.8%
No 18.2%
I don't know 0%
Sample size = 22
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 10%
Slightly worse 10%
No change 0%
Slightly better 50%
Significantly better 30%
Sample size = 20
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 9.5%
In education 52.4%
In private sector employment 4.8%
In public sector employment 0%
Self-taught 28.6%
Other 4.8%
Sample size = 21
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 38.1% 14.3% 9.5% 23.8% 9.5% 4.8%
Automated data quality assurance 4.8% 19% 9.5% 33.3% 19% 14.3%
Code review 0% 14.3% 4.8% 28.6% 42.9% 9.5%
Coding guidelines / Style guides 4.8% 19% 0% 38.1% 38.1% 0%
Functions 4.8% 9.5% 4.8% 19% 23.8% 38.1%
Open source own code 4.8% 33.3% 19% 19% 14.3% 9.5%
Packaging code 9.5% 28.6% 19% 28.6% 14.3% 0%
Standard directory structure 28.6% 19% 9.5% 28.6% 14.3% 0%
Unit testing 28.6% 14.3% 0% 33.3% 14.3% 9.5%
Use open source software 4.8% 9.5% 0% 14.3% 33.3% 38.1%
Version control 0% 14.3% 23.8% 23.8% 33.3% 4.8%
Sample size = 21
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 28.6% 28.6% 14.3% 19% 0% 9.5%
Code comments 4.8% 0% 0% 4.8% 38.1% 52.4%
Data or assumptions registers 33.3% 19% 19% 14.3% 9.5% 4.8%
Desk notes 28.6% 4.8% 14.3% 9.5% 38.1% 4.8%
Documentation for each function or class 19% 9.5% 4.8% 28.6% 23.8% 14.3%
Flow charts 4.8% 33.3% 33.3% 14.3% 14.3% 0%
README files 4.8% 9.5% 0% 23.8% 42.9% 19%
Sample size = 21
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 38.1%
No 19%
I don't know what dependency management is 42.9%
Sample size = 21
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 33.3%
No 23.8%
I don't know what continuous integration is 42.9%
Sample size = 21
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 4.8%
No 42.9%
I don't know what reproducible workflows are 52.4%
Sample size = 21
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 18.2%
I don't know what a RAP champion is 22.7%
I know what a RAP champion is but don't know who the RAP champion in my department is 36.4%
I know what a RAP champion is and there is no RAP champion in my department 4.5%
I know who the RAP champion in my department is 18.2%
Sample size = 22
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 22.2%
I have heard of the RAP strategy, but I haven't read it 50%
I have read the RAP strategy 27.8%
Sample size = 18
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 11.1% 22.2% 33.3% 22.2% 11.1%
I feel confident implementing RAP in my work 5.6% 16.7% 27.8% 44.4% 5.6%
I feel supported to implement RAP in my work 11.1% 22.2% 27.8% 33.3% 5.6%
I know where to find resources to help me implement RAP 5.6% 27.8% 16.7% 38.9% 11.1%
I or my team are planning on implementing RAP in the next 12 months 5.6% 5.6% 44.4% 33.3% 11.1%
I think it is important to implement RAP in my work 0% 5.6% 16.7% 44.4% 33.3%
I understand what the key components of the RAP methodology are 5.6% 27.8% 5.6% 55.6% 5.6%
Sample size = 18
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 71.4%
Documentation Basic 61.9%
Peer review Basic 52.4%
Version control Basic 38.1%
Team open source code Basic 23.8%
AQUA book guidance Basic 14.3%
Functions Advanced 61.9%
Function documentation Advanced 38.1%
Follow code style guidelines Advanced 38.1%
Dependency management Advanced 38.1%
Continuous integration Advanced 33.3%
Unit testing Advanced 23.8%
Code packages Advanced 14.3%
Sample size = 21
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 9.5%
1 14.3%
2 23.8%
3 23.8%
4 14.3%
5 14.3%
6 0%
Sample size = 21
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 23.8%
1 9.5%
2 19%
3 14.3%
4 9.5%
5 23.8%
6 0%
7 0%
Sample size = 21
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/professions/government-operational-research.html b/docs/professions/government-operational-research.html new file mode 100644 index 0000000..c781e08 --- /dev/null +++ b/docs/professions/government-operational-research.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Profession summary: government operational research (GORS) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Profession summary: government operational research (GORS)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 7.9%
Rarely 7.9%
Sometimes 20.7%
Regularly 31.4%
All the time 32.1%
Sample size = 140
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 84.3% 15.7%
Data cleaning 87.7% 12.3%
Data linking 87% 13%
Data transfer / migration 77.5% 22.5%
Data visualisation 78.6% 21.4%
Machine learning 88.9% 11.1%
Modelling 80% 20%
Quality assurance 71.3% 28.7%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 5% 49.3% 45.7%
Java / Scala 8.6% 50.7% 40.7%
Javascript / Typescript 16.4% 49.3% 34.3%
Matlab 5.7% 40.7% 53.6%
Python 70.7% 11.4% 17.9%
R 95.7% 2.1% 2.1%
SAS 34.3% 38.6% 27.1%
SPSS 26.4% 51.4% 22.1%
SQL 69.3% 22.1% 8.6%
Stata 22.1% 55% 22.9%
VBA 70.7% 22.9% 6.4%
Sample size = 140
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 17.1% 2.9% 80%
Java / Scala 5.7% 3.6% 90.7%
Javascript / Typescript 10% 2.1% 87.9%
Matlab 32.9% 3.6% 63.6%
Python 56.4% 2.1% 41.4%
R 85.7% 0.7% 13.6%
SAS 34.3% 2.9% 62.9%
SPSS 17.1% 5% 77.9%
SQL 73.6% 1.4% 25%
Stata 6.4% 3.6% 90%
VBA 45.7% 4.3% 50%
Sample size = 140
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 78.6%
No 9.3%
I don't know 12.1%
Sample size = 140
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 68.6%
No 28.6%
I don't know 2.9%
Sample size = 140
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 7.3%
Slightly worse 11.3%
No change 16.1%
Slightly better 39.5%
Significantly better 25.8%
Sample size = 124
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 10.9%
In education 65.7%
In private sector employment 0.7%
In public sector employment 8.8%
Self-taught 13.1%
Other 0.7%
Sample size = 137
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 10.1% 7.8% 10.9% 29.5% 31% 10.9%
Automated data quality assurance 2.3% 17.8% 20.9% 29.5% 22.5% 7%
Code review 0% 6.2% 5.4% 15.5% 41.1% 31.8%
Coding guidelines / Style guides 6.2% 6.2% 10.9% 23.3% 35.7% 17.8%
Functions 0% 2.3% 9.3% 12.4% 32.6% 43.4%
Open source own code 8.5% 54.3% 20.2% 10.9% 6.2% 0%
Packaging code 6.2% 48.1% 17.8% 20.9% 4.7% 2.3%
Standard directory structure 19.4% 15.5% 14% 19.4% 20.2% 11.6%
Unit testing 17.8% 13.2% 18.6% 27.1% 14% 9.3%
Use open source software 4.7% 7% 4.7% 14% 27.1% 42.6%
Version control 3.1% 22.5% 10.9% 12.4% 20.9% 30.2%
Sample size = 129
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 6.2% 13.2% 15.5% 25.6% 27.1% 12.4%
Code comments 0.8% 3.1% 1.6% 8.5% 14.7% 71.3%
Data or assumptions registers 6.2% 15.5% 17.1% 20.2% 24% 17.1%
Desk notes 28.7% 14% 15.5% 15.5% 19.4% 7%
Documentation for each function or class 5.4% 16.3% 16.3% 21.7% 22.5% 17.8%
Flow charts 2.3% 22.5% 21.7% 34.9% 15.5% 3.1%
README files 2.3% 14.7% 11.6% 31% 19.4% 20.9%
Sample size = 129
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 35.7%
No 38%
I don't know what dependency management is 26.4%
Sample size = 129
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 17.8%
No 43.4%
I don't know what continuous integration is 38.8%
Sample size = 129
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 7%
No 59.7%
I don't know what reproducible workflows are 33.3%
Sample size = 129
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 11.6%
I don't know what a RAP champion is 18.8%
I know what a RAP champion is but don't know who the RAP champion in my department is 37.7%
I know what a RAP champion is and there is no RAP champion in my department 0.7%
I know who the RAP champion in my department is 31.2%
Sample size = 138
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 29%
I have heard of the RAP strategy, but I haven't read it 53.2%
I have read the RAP strategy 17.7%
Sample size = 124
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 18.5% 16.9% 22.6% 27.4% 14.5%
I feel confident implementing RAP in my work 12.9% 17.7% 13.7% 37.9% 17.7%
I feel supported to implement RAP in my work 12.1% 10.5% 24.2% 37.9% 15.3%
I know where to find resources to help me implement RAP 10.5% 16.9% 16.9% 37.1% 18.5%
I or my team are planning on implementing RAP in the next 12 months 12.1% 8.1% 35.5% 29.8% 14.5%
I think it is important to implement RAP in my work 8.9% 1.6% 17.7% 39.5% 32.3%
I understand what the key components of the RAP methodology are 8.9% 11.3% 14.5% 44.4% 21%
Sample size = 124
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Peer review Basic 72.9%
Use open source software Basic 69.8%
Version control Basic 51.2%
AQUA book guidance Basic 41.9%
Documentation Basic 37.2%
Team open source code Basic 6.2%
Functions Advanced 76%
Follow code style guidelines Advanced 53.5%
Function documentation Advanced 40.3%
Dependency management Advanced 35.7%
Unit testing Advanced 23.3%
Continuous integration Advanced 17.8%
Code packages Advanced 7%
Sample size = 129
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 9.3%
1 14%
2 17.1%
3 24%
4 20.9%
5 13.2%
6 1.6%
Sample size = 129
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 14%
1 14%
2 23.3%
3 22.5%
4 10.9%
5 11.6%
6 3.1%
7 0.8%
Sample size = 129
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/professions/government-social-research.html b/docs/professions/government-social-research.html new file mode 100644 index 0000000..bff8260 --- /dev/null +++ b/docs/professions/government-social-research.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Profession summary: government social research (GSR) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Profession summary: government social research (GSR)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 24.7%
Rarely 14.3%
Sometimes 20.1%
Regularly 21.4%
All the time 19.5%
Sample size = 154
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 74.2% 25.8%
Data cleaning 82.2% 17.8%
Data linking 84% 16%
Data transfer / migration 62.9% 37.1%
Data visualisation 55.7% 44.3%
Machine learning 85.7% 14.3%
Modelling 85.7% 14.3%
Quality assurance 62.4% 37.6%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 0.6% 73.4% 26%
Java / Scala 3.9% 74.7% 21.4%
Javascript / Typescript 3.2% 74.7% 22.1%
Matlab 5.2% 66.9% 27.9%
Python 64.9% 24.7% 10.4%
R 83.8% 9.1% 7.1%
SAS 32.5% 46.8% 20.8%
SPSS 48.1% 24.7% 27.3%
SQL 42.9% 46.8% 10.4%
Stata 23.4% 54.5% 22.1%
VBA 18.8% 63% 18.2%
Sample size = 154
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 3.2% 8.4% 88.3%
Java / Scala 2.6% 9.1% 88.3%
Javascript / Typescript 1.3% 9.7% 89%
Matlab 6.5% 9.7% 83.8%
Python 34.4% 3.9% 61.7%
R 51.9% 4.5% 43.5%
SAS 22.7% 7.1% 70.1%
SPSS 67.5% 6.5% 26%
SQL 29.9% 8.4% 61.7%
Stata 24% 5.8% 70.1%
VBA 10.4% 5.8% 83.8%
Sample size = 154
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 55.8%
No 7.1%
I don't know 37%
Sample size = 154
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 39%
No 57.8%
I don't know 3.2%
Sample size = 154
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 14.4%
Slightly worse 16.5%
No change 17.5%
Slightly better 22.7%
Significantly better 28.9%
Sample size = 97
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 28.9%
In education 43%
In private sector employment 3%
In public sector employment 17%
Self-taught 6.7%
Other 1.5%
Sample size = 135
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 50% 15.5% 6% 15.5% 9.5% 3.4%
Automated data quality assurance 8.6% 28.4% 11.2% 29.3% 15.5% 6.9%
Code review 1.7% 5.2% 5.2% 24.1% 37.1% 26.7%
Coding guidelines / Style guides 11.2% 16.4% 9.5% 19% 35.3% 8.6%
Functions 6.9% 14.7% 15.5% 27.6% 25.9% 9.5%
Open source own code 22.4% 58.6% 10.3% 4.3% 1.7% 2.6%
Packaging code 27.6% 46.6% 9.5% 9.5% 4.3% 2.6%
Standard directory structure 44.8% 17.2% 9.5% 8.6% 14.7% 5.2%
Unit testing 41.4% 19.8% 8.6% 15.5% 9.5% 5.2%
Use open source software 17.2% 20.7% 6.9% 14.7% 23.3% 17.2%
Version control 13.8% 40.5% 6% 14.7% 12.9% 12.1%
Sample size = 116
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 33.6% 40.5% 8.6% 8.6% 4.3% 4.3%
Code comments 3.4% 10.3% 1.7% 8.6% 27.6% 48.3%
Data or assumptions registers 29.3% 41.4% 2.6% 7.8% 8.6% 10.3%
Desk notes 14.7% 21.6% 11.2% 25% 15.5% 12.1%
Documentation for each function or class 23.3% 37.1% 11.2% 10.3% 12.9% 5.2%
Flow charts 14.7% 55.2% 11.2% 10.3% 7.8% 0.9%
README files 12.9% 37.9% 18.1% 20.7% 6.9% 3.4%
Sample size = 116
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 10.3%
No 31%
I don't know what dependency management is 58.6%
Sample size = 116
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 9.5%
No 37.9%
I don't know what continuous integration is 52.6%
Sample size = 116
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 0.9%
No 44%
I don't know what reproducible workflows are 55.2%
Sample size = 116
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 22.1%
I don't know what a RAP champion is 19.5%
I know what a RAP champion is but don't know who the RAP champion in my department is 39%
I know what a RAP champion is and there is no RAP champion in my department 1.3%
I know who the RAP champion in my department is 18.2%
Sample size = 154
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 31.1%
I have heard of the RAP strategy, but I haven't read it 57.1%
I have read the RAP strategy 11.8%
Sample size = 120
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 28.3% 28.3% 20% 17.5% 5.8%
I feel confident implementing RAP in my work 17.5% 35.8% 20.8% 22.5% 3.3%
I feel supported to implement RAP in my work 10% 18.3% 28.3% 36.7% 6.7%
I know where to find resources to help me implement RAP 10% 30.8% 19.2% 33.3% 6.7%
I or my team are planning on implementing RAP in the next 12 months 14.2% 19.2% 31.7% 24.2% 10.8%
I think it is important to implement RAP in my work 5.8% 4.2% 34.2% 38.3% 17.5%
I understand what the key components of the RAP methodology are 10.8% 35% 19.2% 27.5% 7.5%
Sample size = 120
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Peer review Basic 63.8%
Use open source software Basic 40.5%
Version control Basic 25%
AQUA book guidance Basic 12.9%
Documentation Basic 9.5%
Team open source code Basic 4.3%
Follow code style guidelines Advanced 44%
Functions Advanced 35.3%
Function documentation Advanced 18.1%
Unit testing Advanced 14.7%
Dependency management Advanced 10.3%
Continuous integration Advanced 9.5%
Code packages Advanced 6.9%
Sample size = 116
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 22.4%
1 36.2%
2 17.2%
3 15.5%
4 5.2%
5 2.6%
6 0.9%
Sample size = 116
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 37.1%
1 24.1%
2 14.7%
3 14.7%
4 6.9%
5 1.7%
6 0.9%
7 0%
Sample size = 116
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/professions/government-statician-group.html b/docs/professions/government-statician-group.html new file mode 100644 index 0000000..86dca3b --- /dev/null +++ b/docs/professions/government-statician-group.html @@ -0,0 +1,2035 @@ + + + + + + Coding in Analysis and Research Survey 2022 - Profession summary: government statistician group (GSG) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+
+ +

Profession summary: government statistician group (GSG)

+ +
+ +
+
+

How to use this research

+

Responding to CARS is voluntary. The results presented here are from a self-selecting sample of government analysts. We are unable to provide details about response rates by department or profession. Because respondents are self-selecting, the results we present reflect the views of the analysts who participated.

+

For more detail, see the data collection page.

+
+
+

Coding frequency and tools

+
+

How often analysts are using code at work

+

We asked respondents “In your current role, how often do you write code to complete your work objectives?”

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coding frequency Percent
Never 8.3%
Rarely 10.3%
Sometimes 19.6%
Regularly 35%
All the time 26.9%
Sample size = 506
+
+ +
+
+
+
+

What code is being used for

+

We asked respondents what data operations they carry out in their work, and whether they use code to do them. Please note, we did not ask how much of each data operation is done with code or how often.

+

Respondents who don’t do the operation at all have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation I do some or all of this by coding (%) I do this without coding (%)
Data analysis 86.8% 13.2%
Data cleaning 90.8% 9.2%
Data linking 90.9% 9.1%
Data transfer / migration 75.1% 24.9%
Data visualisation 68.4% 31.6%
Machine learning 91.4% 8.6%
Modelling 81.9% 18.1%
Quality assurance 67.5% 32.5%
+
+ +
+
+
+
+

Access to and knowledge of programming languages

+

Given a list of programming tools, we asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions;

+
    +
  • Is this tool available to use for your work?
    +
  • +
  • Do you know how to program with this tool to a level suitable for your work?
  • +
+

Access to tools does not necessarily refer to official policy. Some analysts may have access to tools others cannot access within the same organisation.

+

Please note that capability in programming languages is self-reported here and was not objectively defined or tested

+
+
+

Access to coding tools

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 4.5% 56.1% 39.3%
Java / Scala 7.7% 56.7% 35.6%
Javascript / Typescript 7.5% 57.7% 34.8%
Matlab 3.6% 52% 44.5%
Python 70.9% 16.6% 12.5%
R 93.1% 1.8% 5.1%
SAS 45.7% 32.4% 21.9%
SPSS 35.6% 35.8% 28.7%
SQL 75.3% 15.8% 8.9%
Stata 22.3% 45.8% 31.8%
VBA 54% 32% 14%
Sample size = 506
+
+ +
+
+
+
+

Coding tool knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programming tool Yes Don't Know No
C++ / C# 6.5% 5.7% 87.7%
Java / Scala 5.1% 5.9% 88.9%
Javascript / Typescript 4.7% 5.7% 89.5%
Matlab 18.6% 4.9% 76.5%
Python 39.1% 3.2% 57.7%
R 77.5% 1.8% 20.8%
SAS 39.9% 5.1% 54.9%
SPSS 41.5% 5.7% 52.8%
SQL 65.8% 3% 31.2%
Stata 12.6% 4.9% 82.4%
VBA 27.5% 6.5% 66%
Sample size = 506
+
+ +
+
+
+
+

Access to and knowledge of git

+

We asked respondents to answer “Yes”, “No” or “Don’t know” for the following questions:

+
    +
  • Is git available to use in your work?
  • +
  • Do you know how to use git to version-control your work?
  • +
+
+
+

Access to git

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git access Percent
Yes 74.5%
No 10.7%
I don't know 14.8%
Sample size = 506
+
+ +
+
+
+
+

Git knowledge

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
git knowledge Percent
Yes 58.9%
No 37.9%
I don't know 3.2%
Sample size = 506
+
+ +
+
+
+
+
+

Coding capability

+
+

Change in coding ability during current role

+

We asked “Has your coding ability changed during your current role?”

+

This question was only asked of respondents with coding experience outside of their current role. This means analysts who first learned to code in their current role are not included in the data.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ability change Percent
Significantly worse 7.6%
Slightly worse 14.8%
No change 12.9%
Slightly better 34.6%
Significantly better 30.1%
Sample size = 419
+
+ +
+
+
+
+

Where respondents first learned to code

+

Respondents with coding experience outside their current role were asked where they first learned to code. Those analysts who code in their current role but reported no other coding experience, are included as having learned ‘In current role’.

+

These data only show where people first learned to code. They do not show all the settings in which they had learned to code, to what extent, or how long ago.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Where learned Percent
In current role 18%
In education 50.4%
In private sector employment 1.4%
In public sector employment 17.4%
Self-taught 11.1%
Other 1.6%
Sample size = 494
+
+ +
+
+
+
+
+

Coding practices

+

We asked respondents who said they currently use code in their work, how often they carry out various coding practices. For more information on the practices presented below, please read our guidance on Quality Assurance of Code for Analysis and Research

+
+

Good analysis coding practices

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Apply AQUA book principles with analysis code 31.5% 13.4% 11.4% 19.6% 18.8% 5.4%
Automated data quality assurance 2.4% 16.6% 19.8% 27.2% 25% 9.1%
Code review 0.9% 6% 10.8% 30.2% 33.8% 18.3%
Coding guidelines / Style guides 5.2% 10.3% 9.7% 28% 31.5% 15.3%
Functions 3% 8.4% 8.8% 28.7% 28% 23.1%
Open source own code 13.4% 45.7% 15.5% 12.1% 8.6% 4.7%
Packaging code 10.8% 46.8% 16.4% 14.7% 7.3% 4.1%
Standard directory structure 26.1% 15.1% 8.6% 17.2% 20.7% 12.3%
Unit testing 27.8% 18.8% 13.6% 20.5% 12.1% 7.3%
Use open source software 5.6% 14.4% 7.1% 13.8% 22.4% 36.6%
Version control 3.7% 34.7% 9.9% 12.7% 19.4% 19.6%
Sample size = 464
+
+ +
+
+
+
+

Documentation

+

Embedded documentation is one of the components which make up a RAP minimum viable product. Documentation is important to help others be clear on how to use the product and what the code is intended to do.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement I don't understand this question (%) Never (%) Rarely (%) Sometimes (%) Regularly (%) All the time (%)
Analytical Quality Assurance (AQA) logs 22.2% 28.9% 14.4% 19.2% 10.6% 4.7%
Code comments 1.9% 2.4% 0.6% 8% 29.3% 57.8%
Data or assumptions registers 17.7% 35.3% 14% 13.8% 13.4% 5.8%
Desk notes 11.2% 14% 11.6% 23.1% 27.6% 12.5%
Documentation for each function or class 11.4% 23.3% 13.8% 21.3% 17.9% 12.3%
Flow charts 6% 38.8% 22% 22.8% 7.5% 2.8%
README files 5.4% 25.6% 14% 22.8% 20.5% 11.6%
Sample size = 464
+
+ +
+
+
+
+

Dependency Management

+

We provided examples of tools that may be used for dependency management:

+
    +
  • Requirements files, e.g. python requirements.txt or R DESCRIPTION files
    +
  • +
  • Virtual environments (e.g. venv or renv) or virtual machines
    +
  • +
  • Containers e.g. Docker
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use dependency management software Percent
Yes 22.4%
No 35.6%
I don't know what dependency management is 42%
Sample size = 464
+
+ +
+
+
+
+

Continuous integration

+

As above, respondents were provided with examples of continuous integration technologies:

+
    +
  • GitHub actions
    +
  • +
  • Jenkins
    +
  • +
  • Travis
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use continuous integration Percent
Yes 13.6%
No 41.2%
I don't know what continuous integration is 45.3%
Sample size = 464
+
+ +
+
+
+
+

Reproducible workflow packages

+

Respondents were asked whether they use reproducible workflow packages. Respondents were provided with the following examples:

+
    +
  • drake
    +
  • +
  • make
    +
  • +
  • pymake
  • +
+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Use reproduciable workflow packages Percent
Yes 2.6%
No 58.4%
I don't know what reproducible workflows are 39%
Sample size = 464
+
+ +
+
+
+
+
+

RAP knowledge and opinions

+

We asked respondents about their knowledge of and opinions on reproducible analytical pipelines (RAP). RAP refers to the use of practices from software engineering to make analysis more reproducible. These practices build on the advantages of writing analysis as code by ensuring increased quality, trust, efficiency, business continuity and knowledge management. The RAP champions are a network of analysts across government who promote and support RAP development in their departments.

+
+

Knowledge of RAP

+

We asked respondents:

+
    +
  • Have you heard of RAP?
  • +
  • Do you know what a RAP champion is?
    +
  • +
  • Do you know who the RAP champion in your department is?
  • +
+

Respondents who have neither access nor knowledge have been removed.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Knowledge Percent
Have not heard of RAP 4.4%
I don't know what a RAP champion is 15%
I know what a RAP champion is but don't know who the RAP champion in my department is 41.9%
I know what a RAP champion is and there is no RAP champion in my department 3.5%
I know who the RAP champion in my department is 35.2%
Sample size = 480
+
+ +
+
+
+
+

Knowledge of RAP strategy

+

We asked the respondents “What is your familiarity with the Analysis Function reproducible analytical pipelines (RAP) strategy?”.

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP strategy knowledge Percent
I have not heard of the RAP strategy 19.4%
I have heard of the RAP strategy, but I haven't read it 49.5%
I have read the RAP strategy 31.1%
Sample size = 485
+
+ +
+
+
+
+

Opinions on RAP

+

We asked respondents who had heard of RAP whether they agreed with a series of statements.

+
+
+ + + + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statement Strongly Disagree (%) Disagree (%) Neutral (%) Agree (%) Strongly Agree (%)
I and/or my team are currently implementing RAP 12.6% 19.4% 21.6% 27.8% 18.6%
I feel confident implementing RAP in my work 8.7% 18.8% 20% 34.6% 17.9%
I feel supported to implement RAP in my work 6.4% 13.2% 24.1% 37.7% 18.6%
I know where to find resources to help me implement RAP 4.9% 19.4% 15.3% 39.8% 20.6%
I or my team are planning on implementing RAP in the next 12 months 7.6% 8.7% 24.9% 34.2% 24.5%
I think it is important to implement RAP in my work 2.3% 3.7% 18.1% 39% 36.9%
I understand what the key components of the RAP methodology are 7% 15.9% 18.4% 40.4% 18.4%
Sample size = 485
+
+ +
+
+
+
+
+

RAP scores

+

In this section we present RAP components and RAP scores.

+

For each RAP component a percent positive was calculated. Positive responses were recorded where an answer of “regularly” or “all the time” was given. For documentation, a positive response was recorded if both code comments and README files questions received positive responses. For the continuous integration and dependency management components, responses of “yes” were recorded as positive.

+

RAP scores are then calculated for each respondent as the total of their positive responses. A score of 3 suggests that a respondent is implementing 3 components of RAP at least regularly.

+

“Basic components” are the components which make up the RAP MVP. “Advanced components” are components which help improve reproducibility, but are not considered part of the minimum standard.

+
+

RAP components

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RAP component Type Percentage of analysts who code in their work
Use open source software Basic 59.1%
Peer review Basic 52.2%
Version control Basic 39%
Documentation Basic 30.6%
AQUA book guidance Basic 24.1%
Team open source code Basic 13.4%
Functions Advanced 51.1%
Follow code style guidelines Advanced 46.8%
Function documentation Advanced 30.2%
Dependency management Advanced 22.4%
Unit testing Advanced 19.4%
Continuous integration Advanced 13.6%
Code packages Advanced 11.4%
Sample size = 464
+
+ +
+
+
+
+

Basic RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic RAP scores Percent
0 14%
1 26.7%
2 22%
3 14.2%
4 13.1%
5 7.1%
6 2.8%
Sample size = 464
+
+ +
+
+
+
+

Advanced RAP scores

+
+
+ + + + Show chart + Show table + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advanced RAP scores Percent
0 26.9%
1 22%
2 17.9%
3 13.4%
4 7.8%
5 7.8%
6 3%
7 1.3%
Sample size = 464
+
+ +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/site_libs/bootstrap/bootstrap-icons.css b/docs/site_libs/bootstrap/bootstrap-icons.css new file mode 100644 index 0000000..5ec3354 --- /dev/null +++ b/docs/site_libs/bootstrap/bootstrap-icons.css @@ -0,0 +1,1555 @@ +@font-face { + font-family: "bootstrap-icons"; + src: +url("./bootstrap-icons.woff?a97b3594ad416896e15824f6787370e0") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-1::before { content: "\f2a5"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-1::before { content: "\f68a"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-1::before { content: "\f68d"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-1::before { content: "\f690"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-1::before { content: "\f695"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-1::before { content: "\f698"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-mortorboard-fill::before { content: "\f6a2"; } +.bi-mortorboard::before { content: "\f6a3"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-1::before { content: "\f6b6"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash-1::before { content: "\f6c2"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perferated-fill::before { content: "\f6c9"; } +.bi-ticket-perferated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport-1::before { content: "\f6e0"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-ssd-fill::before { content: "\f6ed"; } +.bi-ssd::before { content: "\f6ee"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } diff --git a/docs/site_libs/bootstrap/bootstrap-icons.woff b/docs/site_libs/bootstrap/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..15e9b14db5544144ec5e18a98d24e4af1e2ecb4d GIT binary patch literal 123356 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

t7u-&wmZI6C>GV} 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

r$IgOl7&LC%!v&h-x9C9u> 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:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:#6c757d}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-bg: transparent;--bs-table-accent-bg: transparent;--bs-table-striped-color: #373a3c;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #373a3c;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #373a3c;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#373a3c;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #d4e6f9;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:#000;border-color:#bfcfe0}.table-secondary{--bs-table-bg: #d7d8d8;--bs-table-striped-bg: #cccdcd;--bs-table-striped-color: #000;--bs-table-active-bg: #c2c2c2;--bs-table-active-color: #000;--bs-table-hover-bg: #c7c8c8;--bs-table-hover-color: #000;color:#000;border-color:#c2c2c2}.table-success{--bs-table-bg: #d9f0d1;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:#000;border-color:#c3d8bc}.table-info{--bs-table-bg: #ebddf1;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:#000;border-color:#d4c7d9}.table-warning{--bs-table-bg: #ffe3d1;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:#000;border-color:#e6ccbc}.table-danger{--bs-table-bg: #ffccd7;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:#000;border-color:#e6b8c2}.table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg: #373a3c;--bs-table-striped-bg: #414446;--bs-table-striped-color: #fff;--bs-table-active-bg: #4b4e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #46494b;--bs-table-hover-color: #fff;color:#fff;border-color:#4b4e50}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#373a3c;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#373a3c;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#373a3c;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#373a3c;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#373a3c;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + 2px);padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em}.form-control-color::-webkit-color-swatch{height:1.5em}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#373a3c;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23373a3c' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #373a3c}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;color-adjust:exact;-webkit-print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input:disabled~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline,.shiny-input-container .checkbox-inline,.shiny-input-container .radio-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#373a3c;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:rgba(63,182,24,.9)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23373a3c' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.input-group .form-control.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:1}.was-validated .input-group .form-control:valid:focus,.input-group .form-control.is-valid:focus,.was-validated .input-group .form-select:valid:focus,.input-group .form-select.is-valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:rgba(255,0,57,.9)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23373a3c' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.input-group .form-control.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:2}.was-validated .input-group .form-control:invalid:focus,.input-group .form-control.is-invalid:focus,.was-validated .input-group .form-select:invalid:focus,.input-group .form-select.is-invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#373a3c;text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#373a3c}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-default{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-default:hover{color:#fff;background-color:#2f3133;border-color:#2c2e30}.btn-check:focus+.btn-default,.btn-default:focus{color:#fff;background-color:#2f3133;border-color:#2c2e30;box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-check:checked+.btn-default,.btn-check:active+.btn-default,.btn-default:active,.btn-default.active,.show>.btn-default.dropdown-toggle{color:#fff;background-color:#2c2e30;border-color:#292c2d}.btn-check:checked+.btn-default:focus,.btn-check:active+.btn-default:focus,.btn-default:active:focus,.btn-default.active:focus,.show>.btn-default.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-default:disabled,.btn-default.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-primary{color:#fff;background-color:#2780e3;border-color:#2780e3}.btn-primary:hover{color:#fff;background-color:#216dc1;border-color:#1f66b6}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#216dc1;border-color:#1f66b6;box-shadow:0 0 0 .25rem rgba(71,147,231,.5)}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#1f66b6;border-color:#1d60aa}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(71,147,231,.5)}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#2780e3;border-color:#2780e3}.btn-secondary{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-secondary:hover{color:#fff;background-color:#2f3133;border-color:#2c2e30}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#2f3133;border-color:#2c2e30;box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#2c2e30;border-color:#292c2d}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-secondary:disabled,.btn-secondary.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-success{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-success:hover{color:#fff;background-color:#369b14;border-color:#329213}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#369b14;border-color:#329213;box-shadow:0 0 0 .25rem rgba(92,193,59,.5)}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#329213;border-color:#2f8912}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(92,193,59,.5)}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-info{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-info:hover{color:#fff;background-color:#82479f;border-color:#7a4396}.btn-check:focus+.btn-info,.btn-info:focus{color:#fff;background-color:#82479f;border-color:#7a4396;box-shadow:0 0 0 .25rem rgba(168,110,197,.5)}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#7a4396;border-color:#733f8c}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(168,110,197,.5)}.btn-info:disabled,.btn-info.disabled{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-warning{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-warning:hover{color:#fff;background-color:#d96314;border-color:#cc5e13}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#fff;background-color:#d96314;border-color:#cc5e13;box-shadow:0 0 0 .25rem rgba(255,138,59,.5)}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#cc5e13;border-color:#bf5812}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(255,138,59,.5)}.btn-warning:disabled,.btn-warning.disabled{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-danger{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-danger:hover{color:#fff;background-color:#d90030;border-color:#cc002e}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#d90030;border-color:#cc002e;box-shadow:0 0 0 .25rem rgba(255,38,87,.5)}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#cc002e;border-color:#bf002b}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(255,38,87,.5)}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-dark:hover{color:#fff;background-color:#2f3133;border-color:#2c2e30}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#2f3133;border-color:#2c2e30;box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#2c2e30;border-color:#292c2d}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-outline-default{color:#373a3c;border-color:#373a3c;background-color:transparent}.btn-outline-default:hover{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:focus+.btn-outline-default,.btn-outline-default:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-check:checked+.btn-outline-default,.btn-check:active+.btn-outline-default,.btn-outline-default:active,.btn-outline-default.active,.btn-outline-default.dropdown-toggle.show{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:checked+.btn-outline-default:focus,.btn-check:active+.btn-outline-default:focus,.btn-outline-default:active:focus,.btn-outline-default.active:focus,.btn-outline-default.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-outline-default:disabled,.btn-outline-default.disabled{color:#373a3c;background-color:transparent}.btn-outline-primary{color:#2780e3;border-color:#2780e3;background-color:transparent}.btn-outline-primary:hover{color:#fff;background-color:#2780e3;border-color:#2780e3}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(39,128,227,.5)}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#2780e3;border-color:#2780e3}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(39,128,227,.5)}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#2780e3;background-color:transparent}.btn-outline-secondary{color:#373a3c;border-color:#373a3c;background-color:transparent}.btn-outline-secondary:hover{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#373a3c;background-color:transparent}.btn-outline-success{color:#3fb618;border-color:#3fb618;background-color:transparent}.btn-outline-success:hover{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.5)}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.5)}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#3fb618;background-color:transparent}.btn-outline-info{color:#9954bb;border-color:#9954bb;background-color:transparent}.btn-outline-info:hover{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(153,84,187,.5)}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(153,84,187,.5)}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#9954bb;background-color:transparent}.btn-outline-warning{color:#ff7518;border-color:#ff7518;background-color:transparent}.btn-outline-warning:hover{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,117,24,.5)}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,117,24,.5)}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#ff7518;background-color:transparent}.btn-outline-danger{color:#ff0039;border-color:#ff0039;background-color:transparent}.btn-outline-danger:hover{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.5)}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.5)}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#ff0039;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa;background-color:transparent}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#373a3c;border-color:#373a3c;background-color:transparent}.btn-outline-dark:hover{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#373a3c;background-color:transparent}.btn-link{font-weight:400;color:#2780e3;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:hover{color:#1f66b6}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:0}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#2780e3}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:0.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#373a3c;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#2780e3}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.nav{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#2780e3;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#1f66b6}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px}.nav-pills .nav-link{background:none;border:0}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#2780e3}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container-xxl,.navbar>.container-xl,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container,.navbar>.container-fluid{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;transition:box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-top,.navbar-expand-sm .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-top,.navbar-expand-md .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-top,.navbar-expand-lg .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-top,.navbar-expand-xl .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-top,.navbar-expand-xxl .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-top,.navbar-expand .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-light{background-color:#2780e3}.navbar-light .navbar-brand{color:#fdfeff}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:#fdfeff}.navbar-light .navbar-nav .nav-link{color:#fdfeff}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(253,254,255,.8)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(253,254,255,.75)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:#fdfeff}.navbar-light .navbar-toggler{color:#fdfeff;border-color:rgba(253,254,255,.4)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfeff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#fdfeff}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:#fdfeff}.navbar-dark{background-color:#2780e3}.navbar-dark .navbar-brand{color:#fdfeff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fdfeff}.navbar-dark .navbar-nav .nav-link{color:#fdfeff}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(253,254,255,.8)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(253,254,255,.75)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fdfeff}.navbar-dark .navbar-toggler{color:#fdfeff;border-color:rgba(253,254,255,.4)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfeff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#fdfeff}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fdfeff}.card{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-0.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:#adb5bd;border-bottom:1px solid rgba(0,0,0,.125)}.card-footer{padding:.5rem 1rem;background-color:#adb5bd;border-top:1px solid rgba(0,0,0,.125)}.card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:.75rem}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#373a3c;text-align:left;background-color:#fff;border:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#2373cc;background-color:#e9f2fc;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232373cc'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23373a3c'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.breadcrumb{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#2780e3;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#1f66b6;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#1f66b6;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#2780e3;border-color:#2780e3}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:0.875rem}.badge{display:inline-block;padding:.35em .65em;font-size:0.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:0 solid transparent}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{color:#212324;background-color:#d7d8d8;border-color:#c3c4c5}.alert-default .alert-link{color:#1a1c1d}.alert-primary{color:#174d88;background-color:#d4e6f9;border-color:#bed9f7}.alert-primary .alert-link{color:#123e6d}.alert-secondary{color:#212324;background-color:#d7d8d8;border-color:#c3c4c5}.alert-secondary .alert-link{color:#1a1c1d}.alert-success{color:#266d0e;background-color:#d9f0d1;border-color:#c5e9ba}.alert-success .alert-link{color:#1e570b}.alert-info{color:#5c3270;background-color:#ebddf1;border-color:#e0cceb}.alert-info .alert-link{color:#4a285a}.alert-warning{color:#99460e;background-color:#ffe3d1;border-color:#ffd6ba}.alert-warning .alert-link{color:#7a380b}.alert-danger{color:#902;background-color:#ffccd7;border-color:#ffb3c4}.alert-danger .alert-link{color:#7a001b}.alert-light{color:#959596;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#777778}.alert-dark{color:#212324;background-color:#d7d8d8;border-color:#c3c4c5}.alert-dark .alert-link{color:#1a1c1d}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress{display:flex;display:-webkit-flex;height:.5rem;overflow:hidden;font-size:0.75rem;background-color:#e9ecef}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#2780e3;transition:width .6s ease}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:.5rem .5rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#373a3c;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#2780e3;border-color:#2780e3}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{color:#212324;background-color:#d7d8d8}.list-group-item-default.list-group-item-action:hover,.list-group-item-default.list-group-item-action:focus{color:#212324;background-color:#c2c2c2}.list-group-item-default.list-group-item-action.active{color:#fff;background-color:#212324;border-color:#212324}.list-group-item-primary{color:#174d88;background-color:#d4e6f9}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#174d88;background-color:#bfcfe0}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#174d88;border-color:#174d88}.list-group-item-secondary{color:#212324;background-color:#d7d8d8}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#212324;background-color:#c2c2c2}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#212324;border-color:#212324}.list-group-item-success{color:#266d0e;background-color:#d9f0d1}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#266d0e;background-color:#c3d8bc}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#266d0e;border-color:#266d0e}.list-group-item-info{color:#5c3270;background-color:#ebddf1}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#5c3270;background-color:#d4c7d9}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#5c3270;border-color:#5c3270}.list-group-item-warning{color:#99460e;background-color:#ffe3d1}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#99460e;background-color:#e6ccbc}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#99460e;border-color:#99460e}.list-group-item-danger{color:#902;background-color:#ffccd7}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#902;background-color:#e6b8c2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#902;border-color:#902}.list-group-item-light{color:#959596;background-color:#fefefe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#959596;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#959596;border-color:#959596}.list-group-item-dark{color:#212324;background-color:#d7d8d8}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#212324;background-color:#c2c2c2}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#212324;border-color:#212324}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:0.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-header .btn-close{margin-right:-0.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6}.modal-header .btn-close{padding:.5rem .5rem;margin:-0.5rem -0.5rem -0.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:1rem}.modal-footer{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6}.modal-footer>*{margin:.25rem}@media(min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width: 1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000}.popover{position:absolute;top:0;left:0 /* rtl:ignore */;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2)}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#373a3c}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-0.5rem;margin-right:-0.5rem;margin-bottom:-0.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-default{color:#373a3c}.link-default:hover,.link-default:focus{color:#2c2e30}.link-primary{color:#2780e3}.link-primary:hover,.link-primary:focus{color:#1f66b6}.link-secondary{color:#373a3c}.link-secondary:hover,.link-secondary:focus{color:#2c2e30}.link-success{color:#3fb618}.link-success:hover,.link-success:focus{color:#329213}.link-info{color:#9954bb}.link-info:hover,.link-info:focus{color:#7a4396}.link-warning{color:#ff7518}.link-warning:hover,.link-warning:focus{color:#cc5e13}.link-danger{color:#ff0039}.link-danger:hover,.link-danger:focus{color:#cc002e}.link-light{color:#f8f9fa}.link-light:hover,.link-light:focus{color:#f9fafb}.link-dark{color:#373a3c}.link-dark:hover,.link-dark:focus{color:#2c2e30}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-top-0{border-top:0 !important}.border-end{border-right:1px solid #dee2e6 !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:1px solid #dee2e6 !important}.border-start-0{border-left:0 !important}.border-default{border-color:#373a3c !important}.border-primary{border-color:#2780e3 !important}.border-secondary{border-color:#373a3c !important}.border-success{border-color:#3fb618 !important}.border-info{border-color:#9954bb !important}.border-warning{border-color:#ff7518 !important}.border-danger{border-color:#ff0039 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#373a3c !important}.border-white{border-color:#fff !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.345rem + 1.14vw) !important}.fs-2{font-size:calc(1.3rem + 0.6vw) !important}.fs-3{font-size:calc(1.275rem + 0.3vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-light{font-weight:300 !important}.fw-lighter{font-weight:lighter !important}.fw-normal{font-weight:400 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:#6c757d !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:transparent !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:.25rem !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:.2em !important}.rounded-2{border-radius:.25rem !important}.rounded-3{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-end{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-start{border-bottom-left-radius:.25rem !important;border-top-left-radius:.25rem !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2.2rem !important}.fs-2{font-size:1.75rem !important}.fs-3{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}footer.footer .nav-footer,#quarto-header nav{padding-left:1em;padding-right:1em}#TOC{padding-left:.5em}#quarto-content>*{padding-top:14px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:transform 200ms linear;transition:position 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{text-overflow:ellipsis;overflow:hidden;max-width:calc(100% - 85px)}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar-brand>img{max-height:24px;width:auto;padding-right:6px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .sidebar-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{margin-left:0px}.sidebar-tools-main:not(.tools-wide){display:inline-block;vertical-align:middle}.sidebar-tools-main.tools-wide{padding-top:.3em}.sidebar-navigation .sidebar-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em}.sidebar-section{margin-top:.2em;padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 767.98px){.quarto-secondary-nav{display:block}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-secondary-nav .quarto-btn-toggle{color:#595959;padding-right:0}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.quarto-secondary-nav-title{color:#595959;padding-top:4px}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(27,88,157,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link{color:#1b589d}nav.sidebar.sidebar-navigation{background-color:#fff}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{transition:height .15s linear;width:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}#quarto-sidebar{width:100%;padding-right:1em;color:#595959}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section a .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-section a.collapsed .bi-chevron-right::before{transform:none}.sidebar-section .bi-chevron-right::before{font-size:.9em;transition:transform 200ms ease}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f66b6}.toc-actions{display:flex}.toc-actions p{margin-block-start:0;margin-block-end:0}.toc-actions a{text-decoration:none;color:inherit;font-weight:400}.toc-actions a:hover{color:#1f66b6}.toc-actions .action-links{margin-left:4px}.sidebar nav#TOC .toc-actions .bi{margin-left:-4px;font-size:.7rem;color:#6c757d}.sidebar nav#TOC .toc-actions>div:first-of-type{margin-top:-3px}.sidebar nav#TOC .toc-actions p{font-size:.875rem}.sidebar nav#TOC .header-section-number{display:none}.nav-footer{display:flex;justify-content:center;align-items:center;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}.nav-footer-left{margin-right:auto}.nav-footer-center{min-height:3em;position:absolute;text-align:center}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em}}.nav-footer-right{margin-left:auto}.navbar .quarto-reader-toggle{padding-left:.4em;padding-right:0}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#fdfeff;border-radius:3px}.quarto-reader-toggle.reader.sidebar-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle.sidebar-tool{padding-left:.3em}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.1em;padding-right:.3em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:1rem}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#fdfeff;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#fdfeff;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;color:#373a3c;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#373a3c;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#373a3c;font:inherit;height:calc(1.5em + (0.1rem + 2px));padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#373a3c;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#373a3c;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + (0.1rem + 2px))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#373a3c;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#373a3c;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + (0.1rem + 2px))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#373a3c;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}#quarto-search-results .aa-Panel{border:solid #ced4da 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.875em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3;color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#ced4da;color:#373a3c}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:4px;padding-right:6px}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;background-color:#fff;color:#373a3c;padding:12px 4px 2px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-top:8px;padding-bottom:8px;padding-right:8px;margin-left:32px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:32px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #ced4da}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#fdfeff}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(206,212,218,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #ced4da;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#373a3c;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{border-radius:6px;bottom:inherit;height:auto;margin:0 auto;max-width:850px;position:absolute;top:100px}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(55,58,60,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#373a3c;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item img.thumbnail-image{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item div.card-img-bg{background-color:#adb5bd;flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.2em;text-transform:uppercase;font-size:.65em;padding-left:3px;padding-right:3px;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(min-width: 992px){div.quarto-post{margin-right:2em}}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post a{color:#373a3c;display:flex;flex-direction:column;text-decoration:none}div.quarto-post a div.description{flex-shrink:0}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:var(--bs-font-sans-serif);flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.2em;text-transform:uppercase;font-size:.65em;padding-left:3px;padding-right:3px;cursor:pointer;margin-right:4px;margin-bottom:4px}div.jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%}div.jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.jolla img.round{border-radius:50%}div.jolla img.rounded{border-radius:10px}div.jolla h2,div.jolla .h2{border-bottom:none}div.jolla .about-sep{width:60%}div.jolla main{text-align:center}div.jolla .about-links{display:flex}@media(min-width: 992px){div.jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.jolla .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.jolla .about-link:hover{color:#2780e3}div.jolla .about-link i.bi{margin-right:.15em}div.solana{display:flex !important;flex-direction:column;padding-top:3em !important}div.solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.solana .about-entity .entity-contents{width:100%}}div.solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.solana .about-entity .about-image{margin-bottom:1.5em}}div.solana .about-entity img.round{border-radius:50%}div.solana .about-entity img.rounded{border-radius:10px}div.solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.solana .about-entity .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.solana .about-entity .about-link:hover{color:#2780e3}div.solana .about-entity .about-link i.bi{margin-right:.15em}div.solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.solana .about-contents main.content{margin-top:0}div.solana .about-contents h2,div.solana .about-contents .h2{border-bottom:none}div.trestles{display:flex !important;flex-direction:row;padding-top:3em !important}@media(max-width: 991.98px){div.trestles{flex-direction:column;padding-top:0em !important}}div.trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.trestles .about-entity{flex:0 0 42%}}div.trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.trestles .about-entity img.round{border-radius:50%}div.trestles .about-entity img.rounded{border-radius:10px}div.trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.trestles .about-entity .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.trestles .about-entity .about-link:hover{color:#2780e3}div.trestles .about-entity .about-link i.bi{margin-right:.15em}div.trestles .about-contents{flex-basis:0;flex-grow:1}div.trestles .about-contents h2,div.trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.trestles .about-contents main.content{margin-top:0}div.marquee .about-contents{display:flex;flex-direction:column}div.marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.marquee img.round{border-radius:50%}div.marquee img.rounded{border-radius:10px}div.marquee h2,div.marquee .h2{border-bottom:none}div.marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.marquee .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.marquee .about-link:hover{color:#2780e3}div.marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.marquee .about-link{border:none}}div.broadside{display:flex;flex-direction:column}div.broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.broadside h2,div.broadside .h2{border-bottom:none}div.broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.broadside .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.broadside .about-link:hover{color:#2780e3}div.broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;color:#373a3c;border-radius:.25rem;border:solid 1px #dee2e6;font-size:.875rem}.tippy-box[data-theme~=quarto] .tippy-arrow{color:#dee2e6}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:-1px}.tippy-box[data-placement^=bottom]>.tippy-content{padding:.75em 1em;z-index:1}.top-right{position:absolute;top:1em;right:1em}.hidden{display:none !important}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:inline-block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p{text-align:left}.quarto-figure-center>figure>p{text-align:center}.quarto-figure-right>figure>p{text-align:right}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link,div[id^=tbl-]>.anchorjs-link{position:absolute;top:0;right:0}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header>.quarto-title-block>div{display:flex}#title-block-header>.quarto-title-block>div>h1,#title-block-header>.quarto-title-block>div>.h1{flex-grow:1}#title-block-header>.quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header>.quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,.table{caption-side:top}caption,.table-caption{text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:transparent}.code-copy-button:focus{outline:none}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1200px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] 50px [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1200px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}#TOC{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;transform:translate3d(0, 0, 0);margin-bottom:1em}.zindex-content{z-index:998;transform:translate3d(0, 0, 0)}.zindex-modal{z-index:1055;transform:translate3d(0, 0, 0)}.zindex-over-content{z-index:999;transform:translate3d(0, 0, 0)}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 767.98px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;transform:translate3d(0, 0, 0)}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h2,.h2{margin-top:2rem;margin-bottom:1rem;border-bottom:1px solid #dee2e6;padding-bottom:.5rem}h3,.h3,h4,.h4{margin-top:1.5rem}.header-section-number{color:#747a7f}mark,.mark{padding:0em}.panel-caption,caption,.figure-caption{font-size:1rem}.panel-caption,.figure-caption,figcaption{color:#747a7f}.table-caption,caption{color:#373a3c}.quarto-layout-cell[data-ref-parent] caption{color:#747a7f}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#747a7f;font-size:.825rem}.column-margin.column-container>*{padding-top:.5em;padding-bottom:.5em;display:block}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.tab-content{margin-top:0px;border-left:#dee2e6 1px solid;border-right:#dee2e6 1px solid;border-bottom:#dee2e6 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:1em}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.25rem}pre.sourceCode{background-color:transparent}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}.callout pre.sourceCode{padding-left:0}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#747a7f}pre{background-color:initial;padding:initial;border:initial}p code:not(.sourceCode),li code:not(.sourceCode){background-color:#f7f7f7;padding:.2em}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;background-color:inherit;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:#6c757d;background-color:transparent;transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.margin-sidebar>*{padding-top:1em}.sidebar nav#TOC>h2,.sidebar nav#TOC>.h2{font-size:.875rem;font-weight:400;margin-bottom:.5rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar nav#TOC>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar nav#TOC ul{padding-left:0;list-style:none;font-size:.875rem;font-weight:300}.sidebar nav#TOC>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav#TOC ul>li>ul>li>a{padding-left:1.2em}.sidebar nav#TOC ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav#TOC ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav#TOC ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav#TOC ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav#TOC ul>li>ul>li>a.active{border-left:1px solid #2780e3;color:#2780e3 !important}.sidebar nav#TOC ul>li>a.active{border-left:1px solid #2780e3;color:#2780e3 !important}kbd,.kbd{color:#373a3c;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#dee2e6}div.hanging-indent{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.table a{word-break:break-word}.table>:not(:first-child){border-top-width:1px;border-top-color:#dee2e6}.table>thead{border-bottom:1px solid currentColor}.table>tbody{border-top:1px solid #dee2e6}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.25rem}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:1rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout.callout-captioned .callout-body{margin-top:.2em}.callout:not(.no-icon).callout-captioned.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-captioned .callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default div.callout-body{margin-top:.5em;padding-left:.5em;padding-right:.5em}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-captioned .callout-body>:last-child:not(.sourceCode),.callout.callout-captioned .callout-body>div>:last-child:not(.sourceCode){margin-bottom:.5rem}.callout:not(.callout-captioned) .callout-body>:last-child,.callout:not(.callout-captioned) .callout-body>div>:last-child{margin-bottom:.25rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-caption-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout .no-icon{display:none}div.callout.callout{border-left-color:#6c757d}div.callout.callout-style-default .callout-header{background-color:#6c757d}div.callout-note.callout{border-left-color:#2780e3}div.callout-note.callout-style-default .callout-header{background-color:#e9f2fc}div.callout-note:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#3fb618}div.callout-tip.callout-style-default .callout-header{background-color:#ecf8e8}div.callout-tip:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ff7518}div.callout-warning.callout-style-default .callout-header{background-color:#fff1e8}div.callout-warning:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#f0ad4e}div.callout-caution.callout-style-default .callout-header{background-color:#fef7ed}div.callout-caution:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#ff0039}div.callout-important.callout-style-default .callout-header{background-color:#ffe6eb}div.callout-important:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex}@media(min-width: 992px){.navbar .quarto-color-scheme-toggle{padding-left:.5rem;padding-right:.5rem}}@media(max-width: 767.98px){.navbar .quarto-color-scheme-toggle{padding-left:0;padding-right:0;padding-bottom:.5em}}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.navbar-collapse .quarto-color-scheme-toggle{padding-left:.6rem;padding-right:0;margin-top:-12px}.sidebar-navigation{padding-left:20px}.sidebar-navigation .quarto-color-scheme-toggle .bi::before{padding-top:.2rem;margin-bottom:-0.2rem}.sidebar-tools-main .quarto-reader-toggle .bi::before,.sidebar-tools-main .quarto-color-scheme-toggle .bi::before{padding-top:.2rem;margin-bottom:-0.2rem}.navbar .quarto-color-scheme-toggle .bi::before{padding-top:7px;margin-bottom:-7px;padding-left:2px;margin-right:2px}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#dee2e6;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#373a3c}.quarto-sidebar-toggle-icon{color:#dee2e6;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #dee2e6 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}#TOC{z-index:1020}#quarto-sidebar>*,#TOC>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,#TOC.slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #dee2e6}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnote],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}main.quarto-banner-title-block{padding-top:0 !important;margin-top:0;z-index:0}main.quarto-banner-title-block .quarto-title-banner{margin-bottom:1em}main.quarto-banner-title-block .quarto-title-banner.color-navbar{background-color:#2780e3;color:#fdfeff}main.quarto-banner-title-block .quarto-title-banner.color-body-bg{color:#fff}main.quarto-banner-title-block .quarto-title-banner.color-body{color:#373a3c}main.quarto-banner-title-block #title-block-header.quarto-title-block.default{margin-block-end:2em}main.quarto-banner-title-block #title-block-header.quarto-title-block.default .quarto-title-banner .quarto-title .title{font-weight:600}main.quarto-banner-title-block #title-block-header.quarto-title-block.default .quarto-categories{margin-top:.75em}p.subtitle{margin-top:.25em;margin-bottom:.5em}.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr)}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-5px}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-categories{display:flex;column-gap:.4em;padding-bottom:.5em;margin-top:.25em}#title-block-header.quarto-title-block.default .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.25rem;opacity:.6}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents a{color:#373a3c}#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .abstract .abstract-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}/*! light */a.external:after{display:inline-block;height:.75rem;width:.75rem;margin-bottom:.15em;margin-left:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}body{-webkit-font-smoothing:antialiased}.badge.bg-light{color:#373a3c}.progress .progress-bar{font-size:8px;line-height:8px}/*# sourceMappingURL=074493a5d2223aef5114433905f13b3d.css.map */ diff --git a/docs/site_libs/bootstrap/bootstrap.min.js b/docs/site_libs/bootstrap/bootstrap.min.js new file mode 100644 index 0000000..cc0a255 --- /dev/null +++ b/docs/site_libs/bootstrap/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=(t,e,i)=>{Object.keys(i).forEach((n=>{const s=i[n],r=e[n],a=r&&o(r)?"element":null==(l=r)?`${l}`:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(s).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}))},l=t=>!(!o(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),c=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},d=()=>{},u=t=>{t.offsetHeight},f=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},p=[],m=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",(()=>{p.forEach((t=>t()))})),p.push(e)):e()},_=t=>{"function"==typeof t&&t()},b=(e,i,n=!0)=>{if(!n)return void _(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),_(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},v=(t,e,i,n)=>{let s=t.indexOf(e);if(-1===s)return t[!i&&n?t.length-1:0];const o=t.length;return s+=i?1:-1,n&&(s=(s+o)%o),t[Math.max(0,Math.min(s,o-1))]},y=/[^.]*(?=\..*)\.|.*/,w=/\..*/,E=/::\d+$/,A={};let T=1;const O={mouseenter:"mouseover",mouseleave:"mouseout"},C=/^(mouseenter|mouseleave)/i,k=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function L(t,e){return e&&`${e}::${T++}`||t.uidEvent||T++}function x(t){const e=L(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function D(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;sfunction(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=S(e,i,n),l=x(t),c=l[a]||(l[a]={}),h=D(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=L(r,e.replace(y,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&j.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&j.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function I(t,e,i,n,s){const o=D(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function P(t){return t=t.replace(w,""),O[t]||t}const j={on(t,e,i,n){N(t,e,i,n,!1)},one(t,e,i,n){N(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=S(e,i,n),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void I(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach((i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach((o=>{if(o.includes(n)){const n=s[o];I(t,e,i,n.originalHandler,n.delegationSelector)}}))}(t,l,i,e.slice(1))}));const h=l[r]||{};Object.keys(h).forEach((i=>{const n=i.replace(E,"");if(!a||e.includes(n)){const e=h[i];I(t,l,r,e.originalHandler,e.delegationSelector)}}))},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=f(),s=P(e),o=e!==s,r=k.has(s);let a,l=!0,c=!0,h=!1,d=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(s,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach((t=>{Object.defineProperty(d,t,{get:()=>i[t]})})),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};class B{constructor(t){(t=r(t))&&(this._element=t,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach((t=>{this[t]=null}))}_queueCallback(t,e,i=!0){b(t,e,i)}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),c(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class W extends B{static get NAME(){return"alert"}close(){if(j.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=W.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(W,"close"),g(W);const $='[data-bs-toggle="button"]';class z extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function q(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}j.on(document,"click.bs.button.data-api",$,(t=>{t.preventDefault();const e=t.target.closest($);z.getOrCreateInstance(e).toggle()})),g(z);const U={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter((t=>t.startsWith("bs"))).forEach((i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=q(t.dataset[i])})),e},getDataAttribute:(t,e)=>q(t.getAttribute(`data-bs-${F(e)}`)),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},V={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(", ");return this.find(e,t).filter((t=>!c(t)&&l(t)))}},K="carousel",X={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},Y={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Q="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z},et="slid.bs.carousel",it="active",nt=".active.carousel-item";class st extends B{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return X}static get NAME(){return K}next(){this._slide(Q)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),V.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(s(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=V.findOne(nt,this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,et,(()=>this.to(t)));if(e===t)return this.pause(),void this.cycle();const i=t>e?Q:G;this._slide(i,this._items[t])}_getConfig(t){return t={...X,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(K,t,Y),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&j.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,"mouseenter.bs.carousel",(t=>this.pause(t))),j.on(this._element,"mouseleave.bs.carousel",(t=>this.cycle(t)))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>this._pointerEvent&&("pen"===t.pointerType||"touch"===t.pointerType),e=e=>{t(e)?this.touchStartX=e.clientX:this._pointerEvent||(this.touchStartX=e.touches[0].clientX)},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},n=e=>{t(e)&&(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((t=>this.cycle(t)),500+this._config.interval))};V.find(".carousel-item img",this._element).forEach((t=>{j.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()))})),this._pointerEvent?(j.on(this._element,"pointerdown.bs.carousel",(t=>e(t))),j.on(this._element,"pointerup.bs.carousel",(t=>n(t))),this._element.classList.add("pointer-event")):(j.on(this._element,"touchstart.bs.carousel",(t=>e(t))),j.on(this._element,"touchmove.bs.carousel",(t=>i(t))),j.on(this._element,"touchend.bs.carousel",(t=>n(t))))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?V.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===Q;return v(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),n=this._getItemIndex(V.findOne(nt,this._element));return j.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=V.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=V.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e{j.trigger(this._element,et,{relatedTarget:o,direction:d,from:s,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),u(o),n.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add(it),n.classList.remove(it,h,c),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(t,n,!0)}else n.classList.remove(it),o.classList.add(it),this._isSliding=!1,f();a&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?m()?t===Z?G:Q:t===Z?Q:G:t}_orderToDirection(t){return[Q,G].includes(t)?m()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const i=st.getOrCreateInstance(t,e);let{_config:n}=i;"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if("number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){st.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=n(this);if(!e||!e.classList.contains("carousel"))return;const i={...U.getDataAttributes(e),...U.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(i.interval=!1),st.carouselInterface(e,i),s&&st.getInstance(e).to(s),t.preventDefault()}}j.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",st.dataApiClickHandler),j.on(window,"load.bs.carousel.data-api",(()=>{const t=V.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;et===this._element));null!==s&&o.length&&(this._selector=s,this._triggerArray.push(e))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return rt}static get NAME(){return ot}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=V.find(ut,this._config.parent);e=V.find(".collapse.show, .collapse.collapsing",this._config.parent).filter((e=>!t.includes(e)))}const i=V.findOne(this._selector);if(e.length){const n=e.find((t=>i!==t));if(t=n?pt.getInstance(n):null,t&&t._isTransitioning)return}if(j.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach((e=>{i!==e&&pt.getOrCreateInstance(e,{toggle:!1}).hide(),t||H.set(e,"bs.collapse",null)}));const n=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[n]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const s=`scroll${n[0].toUpperCase()+n.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[n]="",j.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[n]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,u(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);const e=this._triggerArray.length;for(let t=0;t{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),j.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_getConfig(t){return(t={...rt,...U.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=r(t.parent),a(ot,t,at),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=V.find(ut,this._config.parent);V.find(ft,this._config.parent).filter((e=>!t.includes(e))).forEach((t=>{const e=n(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}))}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach((t=>{e?t.classList.remove(dt):t.classList.add(dt),t.setAttribute("aria-expanded",e)}))}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,"click.bs.collapse.data-api",ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this);V.find(e).forEach((t=>{pt.getOrCreateInstance(t,{toggle:!1}).toggle()}))})),g(pt);var mt="top",gt="bottom",_t="right",bt="left",vt="auto",yt=[mt,gt,_t,bt],wt="start",Et="end",At="clippingParents",Tt="viewport",Ot="popper",Ct="reference",kt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+Et])}),[]),Lt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+Et])}),[]),xt="beforeRead",Dt="read",St="afterRead",Nt="beforeMain",It="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",Bt=[xt,Dt,St,Nt,It,Pt,jt,Mt,Ht];function Rt(t){return t?(t.nodeName||"").toLowerCase():null}function Wt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function $t(t){return t instanceof Wt(t).Element||t instanceof Element}function zt(t){return t instanceof Wt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Wt(t).ShadowRoot||t instanceof ShadowRoot)}const Ft={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Rt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Rt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Ut(t){return t.split("-")[0]}function Vt(t,e){var i=t.getBoundingClientRect();return{width:i.width/1,height:i.height/1,top:i.top/1,right:i.right/1,bottom:i.bottom/1,left:i.left/1,x:i.left/1,y:i.top/1}}function Kt(t){var e=Vt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Xt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Yt(t){return Wt(t).getComputedStyle(t)}function Qt(t){return["table","td","th"].indexOf(Rt(t))>=0}function Gt(t){return(($t(t)?t.ownerDocument:t.document)||window.document).documentElement}function Zt(t){return"html"===Rt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||Gt(t)}function Jt(t){return zt(t)&&"fixed"!==Yt(t).position?t.offsetParent:null}function te(t){for(var e=Wt(t),i=Jt(t);i&&Qt(i)&&"static"===Yt(i).position;)i=Jt(i);return i&&("html"===Rt(i)||"body"===Rt(i)&&"static"===Yt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&zt(t)&&"fixed"===Yt(t).position)return null;for(var i=Zt(t);zt(i)&&["html","body"].indexOf(Rt(i))<0;){var n=Yt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function ee(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var ie=Math.max,ne=Math.min,se=Math.round;function oe(t,e,i){return ie(t,ne(e,i))}function re(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ae(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const le={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Ut(i.placement),l=ee(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return re("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ae(t,yt))}(s.padding,i),d=Kt(o),u="y"===l?mt:bt,f="y"===l?gt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=te(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,E=oe(v,w,y),A=l;i.modifiersData[n]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Xt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ce(t){return t.split("-")[1]}var he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function de(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:se(se(e*n)/n)||0,y:se(se(i*n)/n)||0}}(r):"function"==typeof h?h(r):r,u=d.x,f=void 0===u?0:u,p=d.y,m=void 0===p?0:p,g=r.hasOwnProperty("x"),_=r.hasOwnProperty("y"),b=bt,v=mt,y=window;if(c){var w=te(i),E="clientHeight",A="clientWidth";w===Wt(i)&&"static"!==Yt(w=Gt(i)).position&&"absolute"===a&&(E="scrollHeight",A="scrollWidth"),w=w,s!==mt&&(s!==bt&&s!==_t||o!==Et)||(v=gt,m-=w[E]-n.height,m*=l?1:-1),s!==bt&&(s!==mt&&s!==gt||o!==Et)||(b=_t,f-=w[A]-n.width,f*=l?1:-1)}var T,O=Object.assign({position:a},c&&he);return l?Object.assign({},O,((T={})[v]=_?"0":"",T[b]=g?"0":"",T.transform=(y.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",T)):Object.assign({},O,((e={})[v]=_?m+"px":"",e[b]=g?f+"px":"",e.transform="",e))}const ue={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Ut(e.placement),variation:ce(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,de(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,de(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var fe={passive:!0};const pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Wt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,fe)})),a&&l.addEventListener("resize",i.update,fe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,fe)})),a&&l.removeEventListener("resize",i.update,fe)}},data:{}};var me={left:"right",right:"left",bottom:"top",top:"bottom"};function ge(t){return t.replace(/left|right|bottom|top/g,(function(t){return me[t]}))}var _e={start:"end",end:"start"};function be(t){return t.replace(/start|end/g,(function(t){return _e[t]}))}function ve(t){var e=Wt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ye(t){return Vt(Gt(t)).left+ve(t).scrollLeft}function we(t){var e=Yt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Rt(t))>=0?t.ownerDocument.body:zt(t)&&we(t)?t:Ee(Zt(t))}function Ae(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Wt(n),r=s?[o].concat(o.visualViewport||[],we(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ae(Zt(r)))}function Te(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e){return e===Tt?Te(function(t){var e=Wt(t),i=Gt(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ye(t),y:a}}(t)):zt(e)?function(t){var e=Vt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Te(function(t){var e,i=Gt(t),n=ve(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ie(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ie(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ye(t),l=-n.scrollTop;return"rtl"===Yt(s||i).direction&&(a+=ie(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Gt(t)))}function Ce(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Ut(s):null,r=s?ce(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case mt:e={x:a,y:i.y-n.height};break;case gt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?ee(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Et:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?At:o,a=i.rootBoundary,l=void 0===a?Tt:a,c=i.elementContext,h=void 0===c?Ot:c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,m=re("number"!=typeof p?p:ae(p,yt)),g=h===Ot?Ct:Ot,_=t.rects.popper,b=t.elements[u?g:h],v=function(t,e,i){var n="clippingParents"===e?function(t){var e=Ae(Zt(t)),i=["absolute","fixed"].indexOf(Yt(t).position)>=0&&zt(t)?te(t):t;return $t(i)?e.filter((function(t){return $t(t)&&Xt(t,i)&&"body"!==Rt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Oe(t,i);return e.top=ie(n.top,e.top),e.right=ne(n.right,e.right),e.bottom=ne(n.bottom,e.bottom),e.left=ie(n.left,e.left),e}),Oe(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}($t(b)?b:b.contextElement||Gt(t.elements.popper),r,l),y=Vt(t.elements.reference),w=Ce({reference:y,element:_,strategy:"absolute",placement:s}),E=Te(Object.assign({},_,w)),A=h===Ot?E:y,T={top:v.top-A.top+m.top,bottom:A.bottom-v.bottom+m.bottom,left:v.left-A.left+m.left,right:A.right-v.right+m.right},O=t.modifiersData.offset;if(h===Ot&&O){var C=O[s];Object.keys(T).forEach((function(t){var e=[_t,gt].indexOf(t)>=0?1:-1,i=[mt,gt].indexOf(t)>=0?"y":"x";T[t]+=C[i]*e}))}return T}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?Lt:l,h=ce(n),d=h?a?kt:kt.filter((function(t){return ce(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Ut(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const xe={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=Ut(g),b=l||(_!==g&&p?function(t){if(Ut(t)===vt)return[];var e=ge(t);return[be(t),e,be(e)]}(g):[ge(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(Ut(i)===vt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,T=v[0],O=0;O=0,D=x?"width":"height",S=ke(e,{placement:C,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),N=x?L?_t:bt:L?gt:mt;y[D]>w[D]&&(N=ge(N));var I=ge(N),P=[];if(o&&P.push(S[k]<=0),a&&P.push(S[N]<=0,S[I]<=0),P.every((function(t){return t}))){T=C,A=!1;break}E.set(C,P)}if(A)for(var j=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Se(t){return[mt,_t,gt,bt].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Se(l),d=Se(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Ie={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=Lt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Ut(t),s=[bt,mt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Pe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Ce({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Ut(e.placement),b=ce(e.placement),v=!b,y=ee(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,T=e.rects.popper,O="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,C={x:0,y:0};if(E){if(o||a){var k="y"===y?mt:bt,L="y"===y?gt:_t,x="y"===y?"height":"width",D=E[y],S=E[y]+g[k],N=E[y]-g[L],I=f?-T[x]/2:0,P=b===wt?A[x]:T[x],j=b===wt?-T[x]:-A[x],M=e.elements.arrow,H=f&&M?Kt(M):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=B[k],W=B[L],$=oe(0,A[x],H[x]),z=v?A[x]/2-I-$-R-O:P-$-R-O,q=v?-A[x]/2+I+$+W+O:j+$+W+O,F=e.elements.arrow&&te(e.elements.arrow),U=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+z-V-U,X=E[y]+q-V;if(o){var Y=oe(f?ne(S,K):S,D,f?ie(N,X):N);E[y]=Y,C[y]=Y-D}if(a){var Q="x"===y?mt:bt,G="x"===y?gt:_t,Z=E[w],J=Z+g[Q],tt=Z-g[G],et=oe(f?ne(J,K):J,Z,f?ie(tt,X):tt);E[w]=et,C[w]=et-Z}}e.modifiersData[n]=C}},requiresIfExists:["offset"]};function Me(t,e,i){void 0===i&&(i=!1);var n=zt(e);zt(e)&&function(t){var e=t.getBoundingClientRect();e.width,t.offsetWidth,e.height,t.offsetHeight}(e);var s,o,r=Gt(e),a=Vt(t),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(n||!n&&!i)&&(("body"!==Rt(e)||we(r))&&(l=(s=e)!==Wt(s)&&zt(s)?{scrollLeft:(o=s).scrollLeft,scrollTop:o.scrollTop}:ve(s)),zt(e)?((c=Vt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=ye(r))),{x:a.left+l.scrollLeft-c.x,y:a.top+l.scrollTop-c.y,width:a.width,height:a.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Re(){for(var t=arguments.length,e=new Array(t),i=0;ij.on(t,"mouseover",d))),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Je),this._element.classList.add(Je),j.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(c(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){j.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._popper&&this._popper.destroy(),this._menu.classList.remove(Je),this._element.classList.remove(Je),this._element.setAttribute("aria-expanded","false"),U.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...U.getDataAttributes(this._element),...t},a(Ue,t,this.constructor.DefaultType),"object"==typeof t.reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ue.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(t){if(void 0===Fe)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:o(this._config.reference)?e=r(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find((t=>"applyStyles"===t.name&&!1===t.enabled));this._popper=qe(e,this._menu,i),n&&U.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains(Je)}_getMenuElement(){return V.next(this._element,ei)[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ri;if(t.classList.contains("dropstart"))return ai;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ni:ii:e?oi:si}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(l);i.length&&v(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=V.find(ti);for(let i=0,n=e.length;ie+t)),this._setElementAttributes(di,"paddingRight",(e=>e+t)),this._setElementAttributes(ui,"marginRight",(e=>e-t))}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t)[e];t.style[e]=`${i(Number.parseFloat(s))}px`}))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(di,"paddingRight"),this._resetElementAttributes(ui,"marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&U.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=U.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(U.removeDataAttribute(t,e),t.style[e]=i)}))}_applyManipulationCallback(t,e){o(t)?e(t):V.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const pi={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},mi={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},gi="show",_i="mousedown.bs.backdrop";class bi{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&u(this._getElement()),this._getElement().classList.add(gi),this._emulateAnimation((()=>{_(t)}))):_(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove(gi),this._emulateAnimation((()=>{this.dispose(),_(t)}))):_(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...pi,..."object"==typeof t?t:{}}).rootElement=r(t.rootElement),a("backdrop",t,mi),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),j.on(this._getElement(),_i,(()=>{_(this._config.clickCallback)})),this._isAppended=!0)}dispose(){this._isAppended&&(j.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){b(t,this._getElement(),this._config.isAnimated)}}const vi={trapElement:null,autofocus:!0},yi={trapElement:"element",autofocus:"boolean"},wi=".bs.focustrap",Ei="backward";class Ai{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),j.off(document,wi),j.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),j.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,wi))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const n=V.focusableChildren(i);0===n.length?i.focus():this._lastTabNavDirection===Ei?n[n.length-1].focus():n[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ei:"forward")}_getConfig(t){return t={...vi,..."object"==typeof t?t:{}},a("focustrap",t,yi),t}}const Ti="modal",Oi="Escape",Ci={backdrop:!0,keyboard:!0,focus:!0},ki={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},Li="hidden.bs.modal",xi="show.bs.modal",Di="resize.bs.modal",Si="click.dismiss.bs.modal",Ni="keydown.dismiss.bs.modal",Ii="mousedown.dismiss.bs.modal",Pi="modal-open",ji="show",Mi="modal-static";class Hi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new fi}static get Default(){return Ci}static get NAME(){return Ti}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(Pi),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),j.on(this._dialog,Ii,(()=>{j.one(this._element,"mouseup.dismiss.bs.modal",(t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)}))})),this._showBackdrop((()=>this._showElement(t))))}hide(){if(!this._isShown||this._isTransitioning)return;if(j.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(ji),j.off(this._element,Si),j.off(this._dialog,Ii),this._queueCallback((()=>this._hideModal()),this._element,t)}dispose(){[window,this._dialog].forEach((t=>j.off(t,".bs.modal"))),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_getConfig(t){return t={...Ci,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Ti,t,ki),t}_showElement(t){const e=this._isAnimated(),i=V.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),e&&u(this._element),this._element.classList.add(ji),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,e)}_setEscapeEvent(){this._isShown?j.on(this._element,Ni,(t=>{this._config.keyboard&&t.key===Oi?(t.preventDefault(),this.hide()):this._config.keyboard||t.key!==Oi||this._triggerBackdropTransition()})):j.off(this._element,Ni)}_setResizeEvent(){this._isShown?j.on(window,Di,(()=>this._adjustDialog())):j.off(window,Di)}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Pi),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,Li)}))}_showBackdrop(t){j.on(this._element,Si,(t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())})),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,n=e>document.documentElement.clientHeight;!n&&"hidden"===i.overflowY||t.contains(Mi)||(n||(i.overflowY="hidden"),t.add(Mi),this._queueCallback((()=>{t.remove(Mi),n||this._queueCallback((()=>{i.overflowY=""}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!m()||i&&!t&&m())&&(this._element.style.paddingLeft=`${e}px`),(i&&!t&&!m()||!i&&t&&m())&&(this._element.style.paddingRight=`${e}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,xi,(t=>{t.defaultPrevented||j.one(e,Li,(()=>{l(this)&&this.focus()}))}));const i=V.findOne(".modal.show");i&&Hi.getInstance(i).hide(),Hi.getOrCreateInstance(e).toggle(this)})),R(Hi),g(Hi);const Bi="offcanvas",Ri={backdrop:!0,keyboard:!0,scroll:!1},Wi={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},$i="show",zi=".offcanvas.show",qi="hidden.bs.offcanvas";class Fi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return Bi}static get Default(){return Ri}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new fi).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add($i),this._queueCallback((()=>{this._config.scroll||this._focustrap.activate(),j.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove($i),this._backdrop.hide(),this._queueCallback((()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new fi).reset(),j.trigger(this._element,qi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...Ri,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Bi,t,Wi),t}_initializeBackDrop(){return new bi({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_addEventListeners(){j.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}))}static jQueryInterface(t){return this.each((function(){const e=Fi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this))return;j.one(e,qi,(()=>{l(this)&&this.focus()}));const i=V.findOne(zi);i&&i!==e&&Fi.getInstance(i).hide(),Fi.getOrCreateInstance(e).toggle(this)})),j.on(window,"load.bs.offcanvas.data-api",(()=>V.find(zi).forEach((t=>Fi.getOrCreateInstance(t).show())))),R(Fi),g(Fi);const Ui=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Vi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Ki=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Xi=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!Ui.has(i)||Boolean(Vi.test(t.nodeValue)||Ki.test(t.nodeValue));const n=e.filter((t=>t instanceof RegExp));for(let t=0,e=n.length;t{Xi(t,r)||i.removeAttribute(t.nodeName)}))}return n.body.innerHTML}const Qi="tooltip",Gi=new Set(["sanitize","allowList","sanitizeFn"]),Zi={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Ji={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},tn={animation:!0,template:'

',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},en={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},nn="fade",sn="show",on="show",rn="out",an=".tooltip-inner",ln=".modal",cn="hide.bs.modal",hn="hover",dn="focus";class un extends B{constructor(t,e){if(void 0===Fe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return tn}static get NAME(){return Qi}static get Event(){return en}static get DefaultType(){return Zi}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains(sn))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ln),cn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.Event.SHOW),e=h(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(an).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const n=this.getTipElement(),s=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this._config.animation&&n.classList.add(nn);const o="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,r=this._getAttachment(o);this._addAttachmentClass(r);const{container:a}=this._config;H.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(a.append(n),j.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=qe(this._element,n,this._getPopperConfig(r)),n.classList.add(sn);const l=this._resolvePossibleFunction(this._config.customClass);l&&n.classList.add(...l.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>{j.on(t,"mouseover",d)}));const c=this.tip.classList.contains(nn);this._queueCallback((()=>{const t=this._hoverState;this._hoverState=null,j.trigger(this._element,this.constructor.Event.SHOWN),t===rn&&this._leave(null,this)}),this.tip,c)}hide(){if(!this._popper)return;const t=this.getTipElement();if(j.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove(sn),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains(nn);this._queueCallback((()=>{this._isWithActiveTrigger()||(this._hoverState!==on&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())}),this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove(nn,sn),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),an)}_sanitizeAndSetContent(t,e,i){const n=V.findOne(i,t);e||!n?this.setElementContent(n,e):n.remove()}setElementContent(t,e){if(null!==t)return o(e)?(e=r(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Yi(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return Ji[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach((t=>{if("click"===t)j.on(this._element,this.constructor.Event.CLICK,this._config.selector,(t=>this.toggle(t)));else if("manual"!==t){const e=t===hn?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i=t===hn?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;j.on(this._element,e,this._config.selector,(t=>this._enter(t))),j.on(this._element,i,this._config.selector,(t=>this._leave(t)))}})),this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ln),cn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?dn:hn]=!0),e.getTipElement().classList.contains(sn)||e._hoverState===on?e._hoverState=on:(clearTimeout(e._timeout),e._hoverState=on,e._config.delay&&e._config.delay.show?e._timeout=setTimeout((()=>{e._hoverState===on&&e.show()}),e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?dn:hn]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=rn,e._config.delay&&e._config.delay.hide?e._timeout=setTimeout((()=>{e._hoverState===rn&&e.hide()}),e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=U.getDataAttributes(this._element);return Object.keys(e).forEach((t=>{Gi.has(t)&&delete e[t]})),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),a(Qi,t,this.constructor.DefaultType),t.sanitize&&(t.template=Yi(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map((t=>t.trim())).forEach((e=>t.classList.remove(e)))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn={...un.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},pn={...un.DefaultType,content:"(string|element|function)"},mn={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class gn extends un{static get Default(){return fn}static get NAME(){return"popover"}static get Event(){return mn}static get DefaultType(){return pn}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=gn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(gn);const _n="scrollspy",bn={offset:10,method:"auto",target:""},vn={offset:"number",method:"string",target:"(string|element)"},yn="active",wn=".nav-link, .list-group-item, .dropdown-item",En="position";class An extends B{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,j.on(this._scrollElement,"scroll.bs.scrollspy",(()=>this._process())),this.refresh(),this._process()}static get Default(){return bn}static get NAME(){return _n}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":En,e="auto"===this._config.method?t:this._config.method,n=e===En?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),V.find(wn,this._config.target).map((t=>{const s=i(t),o=s?V.findOne(s):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[U[e](o).top+n,s]}return null})).filter((t=>t)).sort(((t,e)=>t[0]-e[0])).forEach((t=>{this._offsets.push(t[0]),this._targets.push(t[1])}))}dispose(){j.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...bn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=r(t.target)||document.documentElement,a(_n,t,vn),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t`${e}[data-bs-target="${t}"],${e}[href="${t}"]`)),i=V.findOne(e.join(","),this._config.target);i.classList.add(yn),i.classList.contains("dropdown-item")?V.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add(yn):V.parents(i,".nav, .list-group").forEach((t=>{V.prev(t,".nav-link, .list-group-item").forEach((t=>t.classList.add(yn))),V.prev(t,".nav-item").forEach((t=>{V.children(t,".nav-link").forEach((t=>t.classList.add(yn)))}))})),j.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){V.find(wn,this._config.target).filter((t=>t.classList.contains(yn))).forEach((t=>t.classList.remove(yn)))}static jQueryInterface(t){return this.each((function(){const e=An.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,"load.bs.scrollspy.data-api",(()=>{V.find('[data-bs-spy="scroll"]').forEach((t=>new An(t)))})),g(An);const Tn="active",On="fade",Cn="show",kn=".active",Ln=":scope > li > .active";class xn extends B{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Tn))return;let t;const e=n(this._element),i=this._element.closest(".nav, .list-group");if(i){const e="UL"===i.nodeName||"OL"===i.nodeName?Ln:kn;t=V.find(e,i),t=t[t.length-1]}const s=t?j.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(j.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const o=()=>{j.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),j.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,i){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?V.children(e,kn):V.find(Ln,e))[0],s=i&&n&&n.classList.contains(On),o=()=>this._transitionComplete(t,n,i);n&&s?(n.classList.remove(Cn),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove(Tn);const t=V.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove(Tn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add(Tn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),u(t),t.classList.contains(On)&&t.classList.add(Cn);let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&V.find(".dropdown-toggle",e).forEach((t=>t.classList.add(Tn))),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=xn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this)||xn.getOrCreateInstance(this).show()})),g(xn);const Dn="toast",Sn="hide",Nn="show",In="showing",Pn={animation:"boolean",autohide:"boolean",delay:"number"},jn={animation:!0,autohide:!0,delay:5e3};class Mn extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Pn}static get Default(){return jn}static get NAME(){return Dn}show(){j.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Sn),u(this._element),this._element.classList.add(Nn),this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.remove(In),j.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this._element.classList.contains(Nn)&&(j.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.add(Sn),this._element.classList.remove(In),this._element.classList.remove(Nn),j.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(Nn)&&this._element.classList.remove(Nn),super.dispose()}_getConfig(t){return t={...jn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},a(Dn,t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),j.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Mn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Mn),g(Mn),{Alert:W,Button:z,Carousel:st,Collapse:pt,Dropdown:hi,Modal:Hi,Offcanvas:Fi,Popover:gn,ScrollSpy:An,Tab:xn,Toast:Mn,Tooltip:un}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/site_libs/clipboard/clipboard.min.js b/docs/site_libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..98d4ccb --- /dev/null +++ b/docs/site_libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.6 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={134:(t,e,n)=>{"use strict";n.d(e,{default:()=>r});var e=n(817),o=n.n(e);function i(t){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(t,e){for(var n=0;n{var e;"undefined"==typeof Element||Element.prototype.matches||((e=Element.prototype).matches=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector),t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}},438:(t,e,n)=>{var a=n(828);function i(t,e,n,r,o){var i=function(e,n,t,r){return function(t){t.delegateTarget=a(t.target,n),t.delegateTarget&&r.call(e,t)}}.apply(this,arguments);return t.addEventListener(n,i,o),{destroy:function(){t.removeEventListener(n,i,o)}}}t.exports=function(t,e,n,r,o){return"function"==typeof t.addEventListener?i.apply(null,arguments):"function"==typeof n?i.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return i(t,e,n,r,o)}))}},879:(t,n)=>{n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},370:(t,e,n)=>{var u=n(879),s=n(438);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!u.string(e))throw new TypeError("Second argument must be a String");if(!u.fn(n))throw new TypeError("Third argument must be a Function");if(u.node(t))return c=e,l=n,(a=t).addEventListener(c,l),{destroy:function(){a.removeEventListener(c,l)}};if(u.nodeList(t))return r=t,o=e,i=n,Array.prototype.forEach.call(r,function(t){t.addEventListener(o,i)}),{destroy:function(){Array.prototype.forEach.call(r,function(t){t.removeEventListener(o,i)})}};if(u.string(t))return t=t,e=e,n=n,s(document.body,t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");var r,o,i,a,c,l}},817:t=>{t.exports=function(t){var e,n="SELECT"===t.nodeName?(t.focus(),t.value):"INPUT"===t.nodeName||"TEXTAREA"===t.nodeName?((e=t.hasAttribute("readonly"))||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),e||t.removeAttribute("readonly"),t.value):(t.hasAttribute("contenteditable")&&t.focus(),n=window.getSelection(),(e=document.createRange()).selectNodeContents(t),n.removeAllRanges(),n.addRange(e),n.toString());return n}},279:t=>{function e(){}e.prototype={on:function(t,e,n){var r=this.e||(this.e={});return(r[t]||(r[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var r=this;function o(){r.off(t,o),e.apply(n,arguments)}return o._=e,this.on(t,o,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),r=0,o=n.length;r{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r(134).default;function r(t){if(o[t])return o[t].exports;var e=o[t]={exports:{}};return n[t](e,e.exports,r),e.exports}var n,o}); \ No newline at end of file diff --git a/docs/site_libs/crosstalk-1.2.0/css/crosstalk.min.css b/docs/site_libs/crosstalk-1.2.0/css/crosstalk.min.css new file mode 100644 index 0000000..6b45382 --- /dev/null +++ b/docs/site_libs/crosstalk-1.2.0/css/crosstalk.min.css @@ -0,0 +1 @@ +.container-fluid.crosstalk-bscols{margin-left:-30px;margin-right:-30px;white-space:normal}body>.container-fluid.crosstalk-bscols{margin-left:auto;margin-right:auto}.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:inline-block;padding-right:12px;vertical-align:top}@media only screen and (max-width: 480px){.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:block;padding-right:inherit}}.crosstalk-input{margin-bottom:15px}.crosstalk-input .control-label{margin-bottom:0;vertical-align:middle}.crosstalk-input input[type="checkbox"]{margin:4px 0 0;margin-top:1px;line-height:normal}.crosstalk-input .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.crosstalk-input .checkbox>label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.crosstalk-input .checkbox input[type="checkbox"],.crosstalk-input .checkbox-inline input[type="checkbox"]{position:absolute;margin-top:2px;margin-left:-20px}.crosstalk-input .checkbox+.checkbox{margin-top:-5px}.crosstalk-input .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.crosstalk-input .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px} diff --git a/docs/site_libs/crosstalk-1.2.0/js/crosstalk.js b/docs/site_libs/crosstalk-1.2.0/js/crosstalk.js new file mode 100644 index 0000000..fd9eb53 --- /dev/null +++ b/docs/site_libs/crosstalk-1.2.0/js/crosstalk.js @@ -0,0 +1,1474 @@ +(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o b) { + return 1; + } +} + +/** + * @private + */ + +var FilterSet = function () { + function FilterSet() { + _classCallCheck(this, FilterSet); + + this.reset(); + } + + _createClass(FilterSet, [{ + key: "reset", + value: function reset() { + // Key: handle ID, Value: array of selected keys, or null + this._handles = {}; + // Key: key string, Value: count of handles that include it + this._keys = {}; + this._value = null; + this._activeHandles = 0; + } + }, { + key: "update", + value: function update(handleId, keys) { + if (keys !== null) { + keys = keys.slice(0); // clone before sorting + keys.sort(naturalComparator); + } + + var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys), + added = _diffSortedLists.added, + removed = _diffSortedLists.removed; + + this._handles[handleId] = keys; + + for (var i = 0; i < added.length; i++) { + this._keys[added[i]] = (this._keys[added[i]] || 0) + 1; + } + for (var _i = 0; _i < removed.length; _i++) { + this._keys[removed[_i]]--; + } + + this._updateValue(keys); + } + + /** + * @param {string[]} keys Sorted array of strings that indicate + * a superset of possible keys. + * @private + */ + + }, { + key: "_updateValue", + value: function _updateValue() { + var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys; + + var handleCount = Object.keys(this._handles).length; + if (handleCount === 0) { + this._value = null; + } else { + this._value = []; + for (var i = 0; i < keys.length; i++) { + var count = this._keys[keys[i]]; + if (count === handleCount) { + this._value.push(keys[i]); + } + } + } + } + }, { + key: "clear", + value: function clear(handleId) { + if (typeof this._handles[handleId] === "undefined") { + return; + } + + var keys = this._handles[handleId]; + if (!keys) { + keys = []; + } + + for (var i = 0; i < keys.length; i++) { + this._keys[keys[i]]--; + } + delete this._handles[handleId]; + + this._updateValue(); + } + }, { + key: "value", + get: function get() { + return this._value; + } + }, { + key: "_allKeys", + get: function get() { + var allKeys = Object.keys(this._keys); + allKeys.sort(naturalComparator); + return allKeys; + } + }]); + + return FilterSet; +}(); + +exports.default = FilterSet; + +},{"./util":11}],4:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.default = group; + +var _var2 = require("./var"); + +var _var3 = _interopRequireDefault(_var2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// Use a global so that multiple copies of crosstalk.js can be loaded and still +// have groups behave as singletons across all copies. +global.__crosstalk_groups = global.__crosstalk_groups || {}; +var groups = global.__crosstalk_groups; + +function group(groupName) { + if (groupName && typeof groupName === "string") { + if (!groups.hasOwnProperty(groupName)) { + groups[groupName] = new Group(groupName); + } + return groups[groupName]; + } else if ((typeof groupName === "undefined" ? "undefined" : _typeof(groupName)) === "object" && groupName._vars && groupName.var) { + // Appears to already be a group object + return groupName; + } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === "string") { + return group(groupName[0]); + } else { + throw new Error("Invalid groupName argument"); + } +} + +var Group = function () { + function Group(name) { + _classCallCheck(this, Group); + + this.name = name; + this._vars = {}; + } + + _createClass(Group, [{ + key: "var", + value: function _var(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name); + return this._vars[name]; + } + }, { + key: "has", + value: function has(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + return this._vars.hasOwnProperty(name); + } + }]); + + return Group; +}(); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./var":12}],5:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _selection = require("./selection"); + +var _filter = require("./filter"); + +var _input = require("./input"); + +require("./input_selectize"); + +require("./input_checkboxgroup"); + +require("./input_slider"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var defaultGroup = (0, _group2.default)("default"); + +function var_(name) { + return defaultGroup.var(name); +} + +function has(name) { + return defaultGroup.has(name); +} + +if (global.Shiny) { + global.Shiny.addCustomMessageHandler("update-client-value", function (message) { + if (typeof message.group === "string") { + (0, _group2.default)(message.group).var(message.name).set(message.value); + } else { + var_(message.name).set(message.value); + } + }); +} + +var crosstalk = { + group: _group2.default, + var: var_, + has: has, + SelectionHandle: _selection.SelectionHandle, + FilterHandle: _filter.FilterHandle, + bind: _input.bind +}; + +/** + * @namespace crosstalk + */ +exports.default = crosstalk; + +global.crosstalk = crosstalk; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.register = register; +exports.bind = bind; +var $ = global.jQuery; + +var bindings = {}; + +function register(reg) { + bindings[reg.className] = reg; + if (global.document && global.document.readyState !== "complete") { + $(function () { + bind(); + }); + } else if (global.document) { + setTimeout(bind, 100); + } +} + +function bind() { + Object.keys(bindings).forEach(function (className) { + var binding = bindings[className]; + $("." + binding.className).not(".crosstalk-input-bound").each(function (i, el) { + bindInstance(binding, el); + }); + }); +} + +// Escape jQuery identifier +function $escape(val) { + return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); +} + +function bindEl(el) { + var $el = $(el); + Object.keys(bindings).forEach(function (className) { + if ($el.hasClass(className) && !$el.hasClass("crosstalk-input-bound")) { + var binding = bindings[className]; + bindInstance(binding, el); + } + }); +} + +function bindInstance(binding, el) { + var jsonEl = $(el).find("script[type='application/json'][data-for='" + $escape(el.id) + "']"); + var data = JSON.parse(jsonEl[0].innerText); + + var instance = binding.factory(el, data); + $(el).data("crosstalk-instance", instance); + $(el).addClass("crosstalk-input-bound"); +} + +if (global.Shiny) { + var inputBinding = new global.Shiny.InputBinding(); + var _$ = global.jQuery; + _$.extend(inputBinding, { + find: function find(scope) { + return _$(scope).find(".crosstalk-input"); + }, + initialize: function initialize(el) { + if (!_$(el).hasClass("crosstalk-input-bound")) { + bindEl(el); + } + }, + getId: function getId(el) { + return el.id; + }, + getValue: function getValue(el) {}, + setValue: function setValue(el, value) {}, + receiveMessage: function receiveMessage(el, data) {}, + subscribe: function subscribe(el, callback) { + _$(el).data("crosstalk-instance").resume(); + }, + unsubscribe: function unsubscribe(el) { + _$(el).data("crosstalk-instance").suspend(); + } + }); + global.Shiny.inputBindings.register(inputBinding, "crosstalk.inputBinding"); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],7:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-checkboxgroup", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + var $el = $(el); + $el.on("change", "input[type='checkbox']", function () { + var checked = $el.find("input[type='checkbox']:checked"); + if (checked.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + checked.each(function () { + data.map[this.value].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],8:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-select", + + factory: function factory(el, data) { + /* + * items: {value: [...], label: [...]} + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + + var first = [{ value: "", label: "(All)" }]; + var items = util.dataframeToD3(data.items); + var opts = { + options: first.concat(items), + valueField: "value", + labelField: "label", + searchField: "label" + }; + + var select = $(el).find("select")[0]; + + var selectize = $(select).selectize(opts)[0].selectize; + + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + selectize.on("change", function () { + if (selectize.items.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + selectize.items.forEach(function (group) { + data.map[group].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6,"./util":11}],9:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; +var strftime = global.strftime; + +input.register({ + className: "crosstalk-input-slider", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var opts = {}; + var $el = $(el).find("input"); + var dataType = $el.data("data-type"); + var timeFormat = $el.data("time-format"); + var round = $el.data("round"); + var timeFormatter = void 0; + + // Set up formatting functions + if (dataType === "date") { + timeFormatter = strftime.utc(); + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "datetime") { + var timezone = $el.data("timezone"); + if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime; + + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "number") { + if (typeof round !== "undefined") opts.prettify = function (num) { + var factor = Math.pow(10, round); + return Math.round(num * factor) / factor; + }; + } + + $el.ionRangeSlider(opts); + + function getValue() { + var result = $el.data("ionRangeSlider").result; + + // Function for converting numeric value from slider to appropriate type. + var convert = void 0; + var dataType = $el.data("data-type"); + if (dataType === "date") { + convert = function convert(val) { + return formatDateUTC(new Date(+val)); + }; + } else if (dataType === "datetime") { + convert = function convert(val) { + // Convert ms to s + return +val / 1000; + }; + } else { + convert = function convert(val) { + return +val; + }; + } + + if ($el.data("ionRangeSlider").options.type === "double") { + return [convert(result.from), convert(result.to)]; + } else { + return convert(result.from); + } + } + + var lastKnownKeys = null; + + $el.on("change.crosstalkSliderInput", function (event) { + if (!$el.data("updating") && !$el.data("animating")) { + var _getValue = getValue(), + _getValue2 = _slicedToArray(_getValue, 2), + from = _getValue2[0], + to = _getValue2[1]; + + var keys = []; + for (var i = 0; i < data.values.length; i++) { + var val = data.values[i]; + if (val >= from && val <= to) { + keys.push(data.keys[i]); + } + } + keys.sort(); + ctHandle.set(keys); + lastKnownKeys = keys; + } + }); + + // let $el = $(el); + // $el.on("change", "input[type="checkbox"]", function() { + // let checked = $el.find("input[type="checkbox"]:checked"); + // if (checked.length === 0) { + // ctHandle.clear(); + // } else { + // let keys = {}; + // checked.each(function() { + // data.map[this.value].forEach(function(key) { + // keys[key] = true; + // }); + // }); + // let keyArray = Object.keys(keys); + // keyArray.sort(); + // ctHandle.set(keyArray); + // } + // }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +// Convert a number to a string with leading zeros +function padZeros(n, digits) { + var str = n.toString(); + while (str.length < digits) { + str = "0" + str; + }return str; +} + +// Given a Date object, return a string in yyyy-mm-dd format, using the +// UTC date. This may be a day off from the date in the local time zone. +function formatDateUTC(date) { + if (date instanceof Date) { + return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2); + } else { + return null; + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SelectionHandle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Use this class to read and write (and listen for changes to) the selection + * for a Crosstalk group. This is intended to be used for linked brushing. + * + * If two (or more) `SelectionHandle` instances in the same webpage share the + * same group name, they will share the same state. Setting the selection using + * one `SelectionHandle` instance will result in the `value` property instantly + * changing across the others, and `"change"` event listeners on all instances + * (including the one that initiated the sending) will fire. + * + * @param {string} [group] - The name of the Crosstalk group, or if none, + * null or undefined (or any other falsy value). This can be changed later + * via the [SelectionHandle#setGroup](#setGroup) method. + * @param {Object} [extraInfo] - An object whose properties will be copied to + * the event object whenever an event is emitted. + */ +var SelectionHandle = exports.SelectionHandle = function () { + function SelectionHandle() { + var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, SelectionHandle); + + this._eventRelay = new _events2.default(); + this._emitter = new util.SubscriptionTracker(this._eventRelay); + + // Name of the group we're currently tracking, if any. Can change over time. + this._group = null; + // The Var we're currently tracking, if any. Can change over time. + this._var = null; + // The event handler subscription we currently have on var.on("change"). + this._varOnChangeSub = null; + + this._extraInfo = util.extend({ sender: this }, extraInfo); + + this.setGroup(group); + } + + /** + * Changes the Crosstalk group membership of this SelectionHandle. The group + * being switched away from (if any) will not have its selection value + * modified as a result of calling `setGroup`, even if this handle was the + * most recent handle to set the selection of the group. + * + * The group being switched to (if any) will also not have its selection value + * modified as a result of calling `setGroup`. If you want to set the + * selection value of the new group, call `set` explicitly. + * + * @param {string} group - The name of the Crosstalk group, or null (or + * undefined) to clear the group. + */ + + + _createClass(SelectionHandle, [{ + key: "setGroup", + value: function setGroup(group) { + var _this = this; + + // If group is unchanged, do nothing + if (this._group === group) return; + // Treat null, undefined, and other falsy values the same + if (!this._group && !group) return; + + if (this._var) { + this._var.off("change", this._varOnChangeSub); + this._var = null; + this._varOnChangeSub = null; + } + + this._group = group; + + if (group) { + this._var = (0, _group2.default)(group).var("selection"); + var sub = this._var.on("change", function (e) { + _this._eventRelay.trigger("change", e, _this); + }); + this._varOnChangeSub = sub; + } + } + + /** + * Retrieves the current selection for the group represented by this + * `SelectionHandle`. + * + * - If no selection is active, then this value will be falsy. + * - If a selection is active, but no data points are selected, then this + * value will be an empty array. + * - If a selection is active, and data points are selected, then the keys + * of the selected data points will be present in the array. + */ + + }, { + key: "_mergeExtraInfo", + + + /** + * Combines the given `extraInfo` (if any) with the handle's default + * `_extraInfo` (if any). + * @private + */ + value: function _mergeExtraInfo(extraInfo) { + // Important incidental effect: shallow clone is returned + return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see + * {@link SelectionHandle#value}). + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any options that were + * passed into the `SelectionHandle` constructor). + */ + + }, { + key: "set", + value: function set(selectedKeys, extraInfo) { + if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo)); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any that were passed + * into the `SelectionHandle` constructor). + */ + + }, { + key: "clear", + value: function clear(extraInfo) { + if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo)); + } + + /** + * Subscribes to events on this `SelectionHandle`. + * + * @param {string} eventType - Indicates the type of events to listen to. + * Currently, only `"change"` is supported. + * @param {SelectionHandle~listener} listener - The callback function that + * will be invoked when the event occurs. + * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel + * this subscription. + */ + + }, { + key: "on", + value: function on(eventType, listener) { + return this._emitter.on(eventType, listener); + } + + /** + * Cancels event subscriptions created by {@link SelectionHandle#on}. + * + * @param {string} eventType - The type of event to unsubscribe. + * @param {string|SelectionHandle~listener} listener - Either the callback + * function previously passed into {@link SelectionHandle#on}, or the + * string that was returned from {@link SelectionHandle#on}. + */ + + }, { + key: "off", + value: function off(eventType, listener) { + return this._emitter.off(eventType, listener); + } + + /** + * Shuts down the `SelectionHandle` object. + * + * Removes all event listeners that were added through this handle. + */ + + }, { + key: "close", + value: function close() { + this._emitter.removeAllListeners(); + this.setGroup(null); + } + }, { + key: "value", + get: function get() { + return this._var ? this._var.get() : null; + } + }]); + + return SelectionHandle; +}(); + +/** + * @callback SelectionHandle~listener + * @param {Object} event - An object containing details of the event. For + * `"change"` events, this includes the properties `value` (the new + * value of the selection, or `undefined` if no selection is active), + * `oldValue` (the previous value of the selection), and `sender` (the + * `SelectionHandle` instance that made the change). + */ + +/** + * @event SelectionHandle#change + * @type {object} + * @property {object} value - The new value of the selection, or `undefined` + * if no selection is active. + * @property {object} oldValue - The previous value of the selection. + * @property {SelectionHandle} sender - The `SelectionHandle` instance that + * changed the value. + */ + +},{"./events":1,"./group":4,"./util":11}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.extend = extend; +exports.checkSorted = checkSorted; +exports.diffSortedLists = diffSortedLists; +exports.dataframeToD3 = dataframeToD3; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function extend(target) { + for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + for (var i = 0; i < sources.length; i++) { + var src = sources[i]; + if (typeof src === "undefined" || src === null) continue; + + for (var key in src) { + if (src.hasOwnProperty(key)) { + target[key] = src[key]; + } + } + } + return target; +} + +function checkSorted(list) { + for (var i = 1; i < list.length; i++) { + if (list[i] <= list[i - 1]) { + throw new Error("List is not sorted or contains duplicate"); + } + } +} + +function diffSortedLists(a, b) { + var i_a = 0; + var i_b = 0; + + if (!a) a = []; + if (!b) b = []; + + var a_only = []; + var b_only = []; + + checkSorted(a); + checkSorted(b); + + while (i_a < a.length && i_b < b.length) { + if (a[i_a] === b[i_b]) { + i_a++; + i_b++; + } else if (a[i_a] < b[i_b]) { + a_only.push(a[i_a++]); + } else { + b_only.push(b[i_b++]); + } + } + + if (i_a < a.length) a_only = a_only.concat(a.slice(i_a)); + if (i_b < b.length) b_only = b_only.concat(b.slice(i_b)); + return { + removed: a_only, + added: b_only + }; +} + +// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... } +// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ] +function dataframeToD3(df) { + var names = []; + var length = void 0; + for (var name in df) { + if (df.hasOwnProperty(name)) names.push(name); + if (_typeof(df[name]) !== "object" || typeof df[name].length === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof length !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item = void 0; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; +} + +/** + * Keeps track of all event listener additions/removals and lets all active + * listeners be removed with a single operation. + * + * @private + */ + +var SubscriptionTracker = exports.SubscriptionTracker = function () { + function SubscriptionTracker(emitter) { + _classCallCheck(this, SubscriptionTracker); + + this._emitter = emitter; + this._subs = {}; + } + + _createClass(SubscriptionTracker, [{ + key: "on", + value: function on(eventType, listener) { + var sub = this._emitter.on(eventType, listener); + this._subs[sub] = eventType; + return sub; + } + }, { + key: "off", + value: function off(eventType, listener) { + var sub = this._emitter.off(eventType, listener); + if (sub) { + delete this._subs[sub]; + } + return sub; + } + }, { + key: "removeAllListeners", + value: function removeAllListeners() { + var _this = this; + + var current_subs = this._subs; + this._subs = {}; + Object.keys(current_subs).forEach(function (sub) { + _this._emitter.off(current_subs[sub], sub); + }); + } + }]); + + return SubscriptionTracker; +}(); + +},{}],12:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Var = function () { + function Var(group, name, /*optional*/value) { + _classCallCheck(this, Var); + + this._group = group; + this._name = name; + this._value = value; + this._events = new _events2.default(); + } + + _createClass(Var, [{ + key: "get", + value: function get() { + return this._value; + } + }, { + key: "set", + value: function set(value, /*optional*/event) { + if (this._value === value) { + // Do nothing; the value hasn't changed + return; + } + var oldValue = this._value; + this._value = value; + // Alert JavaScript listeners that the value has changed + var evt = {}; + if (event && (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object") { + for (var k in event) { + if (event.hasOwnProperty(k)) evt[k] = event[k]; + } + } + evt.oldValue = oldValue; + evt.value = value; + this._events.trigger("change", evt, this); + + // TODO: Make this extensible, to let arbitrary back-ends know that + // something has changed + if (global.Shiny && global.Shiny.onInputChange) { + global.Shiny.onInputChange(".clientValue-" + (this._group.name !== null ? this._group.name + "-" : "") + this._name, typeof value === "undefined" ? null : value); + } + } + }, { + key: "on", + value: function on(eventType, listener) { + return this._events.on(eventType, listener); + } + }, { + key: "off", + value: function off(eventType, listener) { + return this._events.off(eventType, listener); + } + }]); + + return Var; +}(); + +exports.default = Var; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./events":1}]},{},[5]) +//# sourceMappingURL=crosstalk.js.map diff --git a/docs/site_libs/crosstalk-1.2.0/js/crosstalk.js.map b/docs/site_libs/crosstalk-1.2.0/js/crosstalk.js.map new file mode 100644 index 0000000..cff94f0 --- /dev/null +++ b/docs/site_libs/crosstalk-1.2.0/js/crosstalk.js.map @@ -0,0 +1,37 @@ +{ + "version": 3, + "sources": [ + "node_modules/browser-pack/_prelude.js", + "javascript/src/events.js", + "javascript/src/filter.js", + "javascript/src/filterset.js", + "javascript/src/group.js", + "javascript/src/index.js", + "javascript/src/input.js", + "javascript/src/input_checkboxgroup.js", + "javascript/src/input_selectize.js", + "javascript/src/input_slider.js", + "javascript/src/selection.js", + "javascript/src/util.js", + "javascript/src/var.js" + ], + "names": [], + "mappings": "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", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n", + "import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n", + "import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n", + "import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n", + "let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n", + "import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n", + "export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n", + "import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n" + ] +} \ No newline at end of file diff --git a/docs/site_libs/crosstalk-1.2.0/js/crosstalk.min.js b/docs/site_libs/crosstalk-1.2.0/js/crosstalk.min.js new file mode 100644 index 0000000..b7ec0ac --- /dev/null +++ b/docs/site_libs/crosstalk-1.2.0/js/crosstalk.min.js @@ -0,0 +1,2 @@ +!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e?@[\\\]^`{|}~])/g,"\\$1")+"']"),r=JSON.parse(n[0].innerText),i=e.factory(t,r);o(t).data("crosstalk-instance",i),o(t).addClass("crosstalk-input-bound")}if(t.Shiny){var e=new t.Shiny.InputBinding,u=t.jQuery;u.extend(e,{find:function(e){return u(e).find(".crosstalk-input")},initialize:function(e){var t,n;u(e).hasClass("crosstalk-input-bound")||(n=o(t=e),Object.keys(r).forEach(function(e){n.hasClass(e)&&!n.hasClass("crosstalk-input-bound")&&i(r[e],t)}))},getId:function(e){return e.id},getValue:function(e){},setValue:function(e,t){},receiveMessage:function(e,t){},subscribe:function(e,t){u(e).data("crosstalk-instance").resume()},unsubscribe:function(e){u(e).data("crosstalk-instance").suspend()}}),t.Shiny.inputBindings.register(e,"crosstalk.inputBinding")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],7:[function(r,e,t){(function(e){"use strict";var t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(r("./input")),n=r("./filter");var a=e.jQuery;t.register({className:"crosstalk-input-checkboxgroup",factory:function(e,r){var i=new n.FilterHandle(r.group),o=void 0,u=a(e);return u.on("change","input[type='checkbox']",function(){var e=u.find("input[type='checkbox']:checked");if(0===e.length)o=null,i.clear();else{var t={};e.each(function(){r.map[this.value].forEach(function(e){t[e]=!0})});var n=Object.keys(t);n.sort(),o=n,i.set(n)}}),{suspend:function(){i.clear()},resume:function(){o&&i.set(o)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],8:[function(r,e,t){(function(e){"use strict";var t=n(r("./input")),l=n(r("./util")),s=r("./filter");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var f=e.jQuery;t.register({className:"crosstalk-input-select",factory:function(e,n){var t=l.dataframeToD3(n.items),r={options:[{value:"",label:"(All)"}].concat(t),valueField:"value",labelField:"label",searchField:"label"},i=f(e).find("select")[0],o=f(i).selectize(r)[0].selectize,u=new s.FilterHandle(n.group),a=void 0;return o.on("change",function(){if(0===o.items.length)a=null,u.clear();else{var t={};o.items.forEach(function(e){n.map[e].forEach(function(e){t[e]=!0})});var e=Object.keys(t);e.sort(),a=e,u.set(e)}}),{suspend:function(){u.clear()},resume:function(){a&&u.set(a)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6,"./util":11}],9:[function(n,e,t){(function(e){"use strict";var d=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(n("./input")),a=n("./filter");var v=e.jQuery,p=e.strftime;function y(e,t){for(var n=e.toString();n.length {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n","import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n","import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n","import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n","let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n","import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n","export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n","import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"]} \ No newline at end of file diff --git a/docs/site_libs/crosstalk-1.2.0/scss/crosstalk.scss b/docs/site_libs/crosstalk-1.2.0/scss/crosstalk.scss new file mode 100644 index 0000000..3566561 --- /dev/null +++ b/docs/site_libs/crosstalk-1.2.0/scss/crosstalk.scss @@ -0,0 +1,75 @@ +/* Adjust margins outwards, so column contents line up with the edges of the + parent of container-fluid. */ +.container-fluid.crosstalk-bscols { + margin-left: -30px; + margin-right: -30px; + white-space: normal; +} + +/* But don't adjust the margins outwards if we're directly under the body, + i.e. we were the top-level of something at the console. */ +body > .container-fluid.crosstalk-bscols { + margin-left: auto; + margin-right: auto; +} + +.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: inline-block; + padding-right: 12px; + vertical-align: top; +} + +@media only screen and (max-width:480px) { + .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: block; + padding-right: inherit; + } +} + +/* Relevant BS3 styles to make filter_checkbox() look reasonable without Bootstrap */ +.crosstalk-input { + margin-bottom: 15px; /* a la .form-group */ + .control-label { + margin-bottom: 0; + vertical-align: middle; + } + input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px; + line-height: normal; + } + .checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; + } + .checkbox > label{ + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer; + } + .checkbox input[type="checkbox"], + .checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 2px; + margin-left: -20px; + } + .checkbox + .checkbox { + margin-top: -5px; + } + .checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer; + } + .checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; + } +} diff --git a/docs/site_libs/htmlwidgets-1.6.2/htmlwidgets.js b/docs/site_libs/htmlwidgets-1.6.2/htmlwidgets.js deleted file mode 100644 index 1067d02..0000000 --- a/docs/site_libs/htmlwidgets-1.6.2/htmlwidgets.js +++ /dev/null @@ -1,901 +0,0 @@ -(function() { - // If window.HTMLWidgets is already defined, then use it; otherwise create a - // new object. This allows preceding code to set options that affect the - // initialization process (though none currently exist). - window.HTMLWidgets = window.HTMLWidgets || {}; - - // See if we're running in a viewer pane. If not, we're in a web browser. - var viewerMode = window.HTMLWidgets.viewerMode = - /\bviewer_pane=1\b/.test(window.location); - - // See if we're running in Shiny mode. If not, it's a static document. - // Note that static widgets can appear in both Shiny and static modes, but - // obviously, Shiny widgets can only appear in Shiny apps/documents. - var shinyMode = window.HTMLWidgets.shinyMode = - typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings; - - // We can't count on jQuery being available, so we implement our own - // version if necessary. - function querySelectorAll(scope, selector) { - if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) { - return scope.find(selector); - } - if (scope.querySelectorAll) { - return scope.querySelectorAll(selector); - } - } - - function asArray(value) { - if (value === null) - return []; - if ($.isArray(value)) - return value; - return [value]; - } - - // Implement jQuery's extend - function extend(target /*, ... */) { - if (arguments.length == 1) { - return target; - } - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var prop in source) { - if (source.hasOwnProperty(prop)) { - target[prop] = source[prop]; - } - } - } - return target; - } - - // IE8 doesn't support Array.forEach. - function forEach(values, callback, thisArg) { - if (values.forEach) { - values.forEach(callback, thisArg); - } else { - for (var i = 0; i < values.length; i++) { - callback.call(thisArg, values[i], i, values); - } - } - } - - // Replaces the specified method with the return value of funcSource. - // - // Note that funcSource should not BE the new method, it should be a function - // that RETURNS the new method. funcSource receives a single argument that is - // the overridden method, it can be called from the new method. The overridden - // method can be called like a regular function, it has the target permanently - // bound to it so "this" will work correctly. - function overrideMethod(target, methodName, funcSource) { - var superFunc = target[methodName] || function() {}; - var superFuncBound = function() { - return superFunc.apply(target, arguments); - }; - target[methodName] = funcSource(superFuncBound); - } - - // Add a method to delegator that, when invoked, calls - // delegatee.methodName. If there is no such method on - // the delegatee, but there was one on delegator before - // delegateMethod was called, then the original version - // is invoked instead. - // For example: - // - // var a = { - // method1: function() { console.log('a1'); } - // method2: function() { console.log('a2'); } - // }; - // var b = { - // method1: function() { console.log('b1'); } - // }; - // delegateMethod(a, b, "method1"); - // delegateMethod(a, b, "method2"); - // a.method1(); - // a.method2(); - // - // The output would be "b1", "a2". - function delegateMethod(delegator, delegatee, methodName) { - var inherited = delegator[methodName]; - delegator[methodName] = function() { - var target = delegatee; - var method = delegatee[methodName]; - - // The method doesn't exist on the delegatee. Instead, - // call the method on the delegator, if it exists. - if (!method) { - target = delegator; - method = inherited; - } - - if (method) { - return method.apply(target, arguments); - } - }; - } - - // Implement a vague facsimilie of jQuery's data method - function elementData(el, name, value) { - if (arguments.length == 2) { - return el["htmlwidget_data_" + name]; - } else if (arguments.length == 3) { - el["htmlwidget_data_" + name] = value; - return el; - } else { - throw new Error("Wrong number of arguments for elementData: " + - arguments.length); - } - } - - // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex - function escapeRegExp(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - } - - function hasClass(el, className) { - var re = new RegExp("\\b" + escapeRegExp(className) + "\\b"); - return re.test(el.className); - } - - // elements - array (or array-like object) of HTML elements - // className - class name to test for - // include - if true, only return elements with given className; - // if false, only return elements *without* given className - function filterByClass(elements, className, include) { - var results = []; - for (var i = 0; i < elements.length; i++) { - if (hasClass(elements[i], className) == include) - results.push(elements[i]); - } - return results; - } - - function on(obj, eventName, func) { - if (obj.addEventListener) { - obj.addEventListener(eventName, func, false); - } else if (obj.attachEvent) { - obj.attachEvent(eventName, func); - } - } - - function off(obj, eventName, func) { - if (obj.removeEventListener) - obj.removeEventListener(eventName, func, false); - else if (obj.detachEvent) { - obj.detachEvent(eventName, func); - } - } - - // Translate array of values to top/right/bottom/left, as usual with - // the "padding" CSS property - // https://developer.mozilla.org/en-US/docs/Web/CSS/padding - function unpackPadding(value) { - if (typeof(value) === "number") - value = [value]; - if (value.length === 1) { - return {top: value[0], right: value[0], bottom: value[0], left: value[0]}; - } - if (value.length === 2) { - return {top: value[0], right: value[1], bottom: value[0], left: value[1]}; - } - if (value.length === 3) { - return {top: value[0], right: value[1], bottom: value[2], left: value[1]}; - } - if (value.length === 4) { - return {top: value[0], right: value[1], bottom: value[2], left: value[3]}; - } - } - - // Convert an unpacked padding object to a CSS value - function paddingToCss(paddingObj) { - return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px"; - } - - // Makes a number suitable for CSS - function px(x) { - if (typeof(x) === "number") - return x + "px"; - else - return x; - } - - // Retrieves runtime widget sizing information for an element. - // The return value is either null, or an object with fill, padding, - // defaultWidth, defaultHeight fields. - function sizingPolicy(el) { - var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']"); - if (!sizingEl) - return null; - var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}"); - if (viewerMode) { - return sp.viewer; - } else { - return sp.browser; - } - } - - // @param tasks Array of strings (or falsy value, in which case no-op). - // Each element must be a valid JavaScript expression that yields a - // function. Or, can be an array of objects with "code" and "data" - // properties; in this case, the "code" property should be a string - // of JS that's an expr that yields a function, and "data" should be - // an object that will be added as an additional argument when that - // function is called. - // @param target The object that will be "this" for each function - // execution. - // @param args Array of arguments to be passed to the functions. (The - // same arguments will be passed to all functions.) - function evalAndRun(tasks, target, args) { - if (tasks) { - forEach(tasks, function(task) { - var theseArgs = args; - if (typeof(task) === "object") { - theseArgs = theseArgs.concat([task.data]); - task = task.code; - } - var taskFunc = tryEval(task); - if (typeof(taskFunc) !== "function") { - throw new Error("Task must be a function! Source:\n" + task); - } - taskFunc.apply(target, theseArgs); - }); - } - } - - // Attempt eval() both with and without enclosing in parentheses. - // Note that enclosing coerces a function declaration into - // an expression that eval() can parse - // (otherwise, a SyntaxError is thrown) - function tryEval(code) { - var result = null; - try { - result = eval("(" + code + ")"); - } catch(error) { - if (!(error instanceof SyntaxError)) { - throw error; - } - try { - result = eval(code); - } catch(e) { - if (e instanceof SyntaxError) { - throw error; - } else { - throw e; - } - } - } - return result; - } - - function initSizing(el) { - var sizing = sizingPolicy(el); - if (!sizing) - return; - - var cel = document.getElementById("htmlwidget_container"); - if (!cel) - return; - - if (typeof(sizing.padding) !== "undefined") { - document.body.style.margin = "0"; - document.body.style.padding = paddingToCss(unpackPadding(sizing.padding)); - } - - if (sizing.fill) { - document.body.style.overflow = "hidden"; - document.body.style.width = "100%"; - document.body.style.height = "100%"; - document.documentElement.style.width = "100%"; - document.documentElement.style.height = "100%"; - cel.style.position = "absolute"; - var pad = unpackPadding(sizing.padding); - cel.style.top = pad.top + "px"; - cel.style.right = pad.right + "px"; - cel.style.bottom = pad.bottom + "px"; - cel.style.left = pad.left + "px"; - el.style.width = "100%"; - el.style.height = "100%"; - - return { - getWidth: function() { return cel.getBoundingClientRect().width; }, - getHeight: function() { return cel.getBoundingClientRect().height; } - }; - - } else { - el.style.width = px(sizing.width); - el.style.height = px(sizing.height); - - return { - getWidth: function() { return cel.getBoundingClientRect().width; }, - getHeight: function() { return cel.getBoundingClientRect().height; } - }; - } - } - - // Default implementations for methods - var defaults = { - find: function(scope) { - return querySelectorAll(scope, "." + this.name); - }, - renderError: function(el, err) { - var $el = $(el); - - this.clearError(el); - - // Add all these error classes, as Shiny does - var errClass = "shiny-output-error"; - if (err.type !== null) { - // use the classes of the error condition as CSS class names - errClass = errClass + " " + $.map(asArray(err.type), function(type) { - return errClass + "-" + type; - }).join(" "); - } - errClass = errClass + " htmlwidgets-error"; - - // Is el inline or block? If inline or inline-block, just display:none it - // and add an inline error. - var display = $el.css("display"); - $el.data("restore-display-mode", display); - - if (display === "inline" || display === "inline-block") { - $el.hide(); - if (err.message !== "") { - var errorSpan = $("").addClass(errClass); - errorSpan.text(err.message); - $el.after(errorSpan); - } - } else if (display === "block") { - // If block, add an error just after the el, set visibility:none on the - // el, and position the error to be on top of the el. - // Mark it with a unique ID and CSS class so we can remove it later. - $el.css("visibility", "hidden"); - if (err.message !== "") { - var errorDiv = $("
").addClass(errClass).css("position", "absolute") - .css("top", el.offsetTop) - .css("left", el.offsetLeft) - // setting width can push out the page size, forcing otherwise - // unnecessary scrollbars to appear and making it impossible for - // the element to shrink; so use max-width instead - .css("maxWidth", el.offsetWidth) - .css("height", el.offsetHeight); - errorDiv.text(err.message); - $el.after(errorDiv); - - // Really dumb way to keep the size/position of the error in sync with - // the parent element as the window is resized or whatever. - var intId = setInterval(function() { - if (!errorDiv[0].parentElement) { - clearInterval(intId); - return; - } - errorDiv - .css("top", el.offsetTop) - .css("left", el.offsetLeft) - .css("maxWidth", el.offsetWidth) - .css("height", el.offsetHeight); - }, 500); - } - } - }, - clearError: function(el) { - var $el = $(el); - var display = $el.data("restore-display-mode"); - $el.data("restore-display-mode", null); - - if (display === "inline" || display === "inline-block") { - if (display) - $el.css("display", display); - $(el.nextSibling).filter(".htmlwidgets-error").remove(); - } else if (display === "block"){ - $el.css("visibility", "inherit"); - $(el.nextSibling).filter(".htmlwidgets-error").remove(); - } - }, - sizing: {} - }; - - // Called by widget bindings to register a new type of widget. The definition - // object can contain the following properties: - // - name (required) - A string indicating the binding name, which will be - // used by default as the CSS classname to look for. - // - initialize (optional) - A function(el) that will be called once per - // widget element; if a value is returned, it will be passed as the third - // value to renderValue. - // - renderValue (required) - A function(el, data, initValue) that will be - // called with data. Static contexts will cause this to be called once per - // element; Shiny apps will cause this to be called multiple times per - // element, as the data changes. - window.HTMLWidgets.widget = function(definition) { - if (!definition.name) { - throw new Error("Widget must have a name"); - } - if (!definition.type) { - throw new Error("Widget must have a type"); - } - // Currently we only support output widgets - if (definition.type !== "output") { - throw new Error("Unrecognized widget type '" + definition.type + "'"); - } - // TODO: Verify that .name is a valid CSS classname - - // Support new-style instance-bound definitions. Old-style class-bound - // definitions have one widget "object" per widget per type/class of - // widget; the renderValue and resize methods on such widget objects - // take el and instance arguments, because the widget object can't - // store them. New-style instance-bound definitions have one widget - // object per widget instance; the definition that's passed in doesn't - // provide renderValue or resize methods at all, just the single method - // factory(el, width, height) - // which returns an object that has renderValue(x) and resize(w, h). - // This enables a far more natural programming style for the widget - // author, who can store per-instance state using either OO-style - // instance fields or functional-style closure variables (I guess this - // is in contrast to what can only be called C-style pseudo-OO which is - // what we required before). - if (definition.factory) { - definition = createLegacyDefinitionAdapter(definition); - } - - if (!definition.renderValue) { - throw new Error("Widget must have a renderValue function"); - } - - // For static rendering (non-Shiny), use a simple widget registration - // scheme. We also use this scheme for Shiny apps/documents that also - // contain static widgets. - window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || []; - // Merge defaults into the definition; don't mutate the original definition. - var staticBinding = extend({}, defaults, definition); - overrideMethod(staticBinding, "find", function(superfunc) { - return function(scope) { - var results = superfunc(scope); - // Filter out Shiny outputs, we only want the static kind - return filterByClass(results, "html-widget-output", false); - }; - }); - window.HTMLWidgets.widgets.push(staticBinding); - - if (shinyMode) { - // Shiny is running. Register the definition with an output binding. - // The definition itself will not be the output binding, instead - // we will make an output binding object that delegates to the - // definition. This is because we foolishly used the same method - // name (renderValue) for htmlwidgets definition and Shiny bindings - // but they actually have quite different semantics (the Shiny - // bindings receive data that includes lots of metadata that it - // strips off before calling htmlwidgets renderValue). We can't - // just ignore the difference because in some widgets it's helpful - // to call this.renderValue() from inside of resize(), and if - // we're not delegating, then that call will go to the Shiny - // version instead of the htmlwidgets version. - - // Merge defaults with definition, without mutating either. - var bindingDef = extend({}, defaults, definition); - - // This object will be our actual Shiny binding. - var shinyBinding = new Shiny.OutputBinding(); - - // With a few exceptions, we'll want to simply use the bindingDef's - // version of methods if they are available, otherwise fall back to - // Shiny's defaults. NOTE: If Shiny's output bindings gain additional - // methods in the future, and we want them to be overrideable by - // HTMLWidget binding definitions, then we'll need to add them to this - // list. - delegateMethod(shinyBinding, bindingDef, "getId"); - delegateMethod(shinyBinding, bindingDef, "onValueChange"); - delegateMethod(shinyBinding, bindingDef, "onValueError"); - delegateMethod(shinyBinding, bindingDef, "renderError"); - delegateMethod(shinyBinding, bindingDef, "clearError"); - delegateMethod(shinyBinding, bindingDef, "showProgress"); - - // The find, renderValue, and resize are handled differently, because we - // want to actually decorate the behavior of the bindingDef methods. - - shinyBinding.find = function(scope) { - var results = bindingDef.find(scope); - - // Only return elements that are Shiny outputs, not static ones - var dynamicResults = results.filter(".html-widget-output"); - - // It's possible that whatever caused Shiny to think there might be - // new dynamic outputs, also caused there to be new static outputs. - // Since there might be lots of different htmlwidgets bindings, we - // schedule execution for later--no need to staticRender multiple - // times. - if (results.length !== dynamicResults.length) - scheduleStaticRender(); - - return dynamicResults; - }; - - // Wrap renderValue to handle initialization, which unfortunately isn't - // supported natively by Shiny at the time of this writing. - - shinyBinding.renderValue = function(el, data) { - Shiny.renderDependencies(data.deps); - // Resolve strings marked as javascript literals to objects - if (!(data.evals instanceof Array)) data.evals = [data.evals]; - for (var i = 0; data.evals && i < data.evals.length; i++) { - window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]); - } - if (!bindingDef.renderOnNullValue) { - if (data.x === null) { - el.style.visibility = "hidden"; - return; - } else { - el.style.visibility = "inherit"; - } - } - if (!elementData(el, "initialized")) { - initSizing(el); - - elementData(el, "initialized", true); - if (bindingDef.initialize) { - var rect = el.getBoundingClientRect(); - var result = bindingDef.initialize(el, rect.width, rect.height); - elementData(el, "init_result", result); - } - } - bindingDef.renderValue(el, data.x, elementData(el, "init_result")); - evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]); - }; - - // Only override resize if bindingDef implements it - if (bindingDef.resize) { - shinyBinding.resize = function(el, width, height) { - // Shiny can call resize before initialize/renderValue have been - // called, which doesn't make sense for widgets. - if (elementData(el, "initialized")) { - bindingDef.resize(el, width, height, elementData(el, "init_result")); - } - }; - } - - Shiny.outputBindings.register(shinyBinding, bindingDef.name); - } - }; - - var scheduleStaticRenderTimerId = null; - function scheduleStaticRender() { - if (!scheduleStaticRenderTimerId) { - scheduleStaticRenderTimerId = setTimeout(function() { - scheduleStaticRenderTimerId = null; - window.HTMLWidgets.staticRender(); - }, 1); - } - } - - // Render static widgets after the document finishes loading - // Statically render all elements that are of this widget's class - window.HTMLWidgets.staticRender = function() { - var bindings = window.HTMLWidgets.widgets || []; - forEach(bindings, function(binding) { - var matches = binding.find(document.documentElement); - forEach(matches, function(el) { - var sizeObj = initSizing(el, binding); - - var getSize = function(el) { - if (sizeObj) { - return {w: sizeObj.getWidth(), h: sizeObj.getHeight()} - } else { - var rect = el.getBoundingClientRect(); - return {w: rect.width, h: rect.height} - } - }; - - if (hasClass(el, "html-widget-static-bound")) - return; - el.className = el.className + " html-widget-static-bound"; - - var initResult; - if (binding.initialize) { - var size = getSize(el); - initResult = binding.initialize(el, size.w, size.h); - elementData(el, "init_result", initResult); - } - - if (binding.resize) { - var lastSize = getSize(el); - var resizeHandler = function(e) { - var size = getSize(el); - if (size.w === 0 && size.h === 0) - return; - if (size.w === lastSize.w && size.h === lastSize.h) - return; - lastSize = size; - binding.resize(el, size.w, size.h, initResult); - }; - - on(window, "resize", resizeHandler); - - // This is needed for cases where we're running in a Shiny - // app, but the widget itself is not a Shiny output, but - // rather a simple static widget. One example of this is - // an rmarkdown document that has runtime:shiny and widget - // that isn't in a render function. Shiny only knows to - // call resize handlers for Shiny outputs, not for static - // widgets, so we do it ourselves. - if (window.jQuery) { - window.jQuery(document).on( - "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets", - resizeHandler - ); - window.jQuery(document).on( - "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets", - resizeHandler - ); - } - - // This is needed for the specific case of ioslides, which - // flips slides between display:none and display:block. - // Ideally we would not have to have ioslide-specific code - // here, but rather have ioslides raise a generic event, - // but the rmarkdown package just went to CRAN so the - // window to getting that fixed may be long. - if (window.addEventListener) { - // It's OK to limit this to window.addEventListener - // browsers because ioslides itself only supports - // such browsers. - on(document, "slideenter", resizeHandler); - on(document, "slideleave", resizeHandler); - } - } - - var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']"); - if (scriptData) { - var data = JSON.parse(scriptData.textContent || scriptData.text); - // Resolve strings marked as javascript literals to objects - if (!(data.evals instanceof Array)) data.evals = [data.evals]; - for (var k = 0; data.evals && k < data.evals.length; k++) { - window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]); - } - binding.renderValue(el, data.x, initResult); - evalAndRun(data.jsHooks.render, initResult, [el, data.x]); - } - }); - }); - - invokePostRenderHandlers(); - } - - - function has_jQuery3() { - if (!window.jQuery) { - return false; - } - var $version = window.jQuery.fn.jquery; - var $major_version = parseInt($version.split(".")[0]); - return $major_version >= 3; - } - - /* - / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's - / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now - / really means $(setTimeout(fn)). - / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous - / - / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny - / one tick later than it did before, which means staticRender() is - / called renderValue() earlier than (advanced) widget authors might be expecting. - / https://github.com/rstudio/shiny/issues/2630 - / - / For a concrete example, leaflet has some methods (e.g., updateBounds) - / which reference Shiny methods registered in initShiny (e.g., setInputValue). - / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to - / delay execution of those methods (until Shiny methods are ready) - / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268 - / - / Ideally widget authors wouldn't need to use this setTimeout() hack that - / leaflet uses to call Shiny methods on a staticRender(). In the long run, - / the logic initShiny should be broken up so that method registration happens - / right away, but binding happens later. - */ - function maybeStaticRenderLater() { - if (shinyMode && has_jQuery3()) { - window.jQuery(window.HTMLWidgets.staticRender); - } else { - window.HTMLWidgets.staticRender(); - } - } - - if (document.addEventListener) { - document.addEventListener("DOMContentLoaded", function() { - document.removeEventListener("DOMContentLoaded", arguments.callee, false); - maybeStaticRenderLater(); - }, false); - } else if (document.attachEvent) { - document.attachEvent("onreadystatechange", function() { - if (document.readyState === "complete") { - document.detachEvent("onreadystatechange", arguments.callee); - maybeStaticRenderLater(); - } - }); - } - - - window.HTMLWidgets.getAttachmentUrl = function(depname, key) { - // If no key, default to the first item - if (typeof(key) === "undefined") - key = 1; - - var link = document.getElementById(depname + "-" + key + "-attachment"); - if (!link) { - throw new Error("Attachment " + depname + "/" + key + " not found in document"); - } - return link.getAttribute("href"); - }; - - window.HTMLWidgets.dataframeToD3 = function(df) { - var names = []; - var length; - for (var name in df) { - if (df.hasOwnProperty(name)) - names.push(name); - if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") { - throw new Error("All fields must be arrays"); - } else if (typeof(length) !== "undefined" && length !== df[name].length) { - throw new Error("All fields must be arrays of the same length"); - } - length = df[name].length; - } - var results = []; - var item; - for (var row = 0; row < length; row++) { - item = {}; - for (var col = 0; col < names.length; col++) { - item[names[col]] = df[names[col]][row]; - } - results.push(item); - } - return results; - }; - - window.HTMLWidgets.transposeArray2D = function(array) { - if (array.length === 0) return array; - var newArray = array[0].map(function(col, i) { - return array.map(function(row) { - return row[i] - }) - }); - return newArray; - }; - // Split value at splitChar, but allow splitChar to be escaped - // using escapeChar. Any other characters escaped by escapeChar - // will be included as usual (including escapeChar itself). - function splitWithEscape(value, splitChar, escapeChar) { - var results = []; - var escapeMode = false; - var currentResult = ""; - for (var pos = 0; pos < value.length; pos++) { - if (!escapeMode) { - if (value[pos] === splitChar) { - results.push(currentResult); - currentResult = ""; - } else if (value[pos] === escapeChar) { - escapeMode = true; - } else { - currentResult += value[pos]; - } - } else { - currentResult += value[pos]; - escapeMode = false; - } - } - if (currentResult !== "") { - results.push(currentResult); - } - return results; - } - // Function authored by Yihui/JJ Allaire - window.HTMLWidgets.evaluateStringMember = function(o, member) { - var parts = splitWithEscape(member, '.', '\\'); - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i]; - // part may be a character or 'numeric' member name - if (o !== null && typeof o === "object" && part in o) { - if (i == (l - 1)) { // if we are at the end of the line then evalulate - if (typeof o[part] === "string") - o[part] = tryEval(o[part]); - } else { // otherwise continue to next embedded object - o = o[part]; - } - } - } - }; - - // Retrieve the HTMLWidget instance (i.e. the return value of an - // HTMLWidget binding's initialize() or factory() function) - // associated with an element, or null if none. - window.HTMLWidgets.getInstance = function(el) { - return elementData(el, "init_result"); - }; - - // Finds the first element in the scope that matches the selector, - // and returns the HTMLWidget instance (i.e. the return value of - // an HTMLWidget binding's initialize() or factory() function) - // associated with that element, if any. If no element matches the - // selector, or the first matching element has no HTMLWidget - // instance associated with it, then null is returned. - // - // The scope argument is optional, and defaults to window.document. - window.HTMLWidgets.find = function(scope, selector) { - if (arguments.length == 1) { - selector = scope; - scope = document; - } - - var el = scope.querySelector(selector); - if (el === null) { - return null; - } else { - return window.HTMLWidgets.getInstance(el); - } - }; - - // Finds all elements in the scope that match the selector, and - // returns the HTMLWidget instances (i.e. the return values of - // an HTMLWidget binding's initialize() or factory() function) - // associated with the elements, in an array. If elements that - // match the selector don't have an associated HTMLWidget - // instance, the returned array will contain nulls. - // - // The scope argument is optional, and defaults to window.document. - window.HTMLWidgets.findAll = function(scope, selector) { - if (arguments.length == 1) { - selector = scope; - scope = document; - } - - var nodes = scope.querySelectorAll(selector); - var results = []; - for (var i = 0; i < nodes.length; i++) { - results.push(window.HTMLWidgets.getInstance(nodes[i])); - } - return results; - }; - - var postRenderHandlers = []; - function invokePostRenderHandlers() { - while (postRenderHandlers.length) { - var handler = postRenderHandlers.shift(); - if (handler) { - handler(); - } - } - } - - // Register the given callback function to be invoked after the - // next time static widgets are rendered. - window.HTMLWidgets.addPostRenderHandler = function(callback) { - postRenderHandlers.push(callback); - }; - - // Takes a new-style instance-bound definition, and returns an - // old-style class-bound definition. This saves us from having - // to rewrite all the logic in this file to accomodate both - // types of definitions. - function createLegacyDefinitionAdapter(defn) { - var result = { - name: defn.name, - type: defn.type, - initialize: function(el, width, height) { - return defn.factory(el, width, height); - }, - renderValue: function(el, x, instance) { - return instance.renderValue(x); - }, - resize: function(el, width, height, instance) { - return instance.resize(width, height); - } - }; - - if (defn.find) - result.find = defn.find; - if (defn.renderError) - result.renderError = defn.renderError; - if (defn.clearError) - result.clearError = defn.clearError; - - return result; - } -})(); diff --git a/docs/site_libs/jquery-3.5.1/jquery-AUTHORS.txt b/docs/site_libs/jquery-3.5.1/jquery-AUTHORS.txt new file mode 100644 index 0000000..06df1a5 --- /dev/null +++ b/docs/site_libs/jquery-3.5.1/jquery-AUTHORS.txt @@ -0,0 +1,357 @@ +Authors ordered by first contribution. + +John Resig +Gilles van den Hoven +Michael Geary +Stefan Petre +Yehuda Katz +Corey Jewett +Klaus Hartl +Franck Marcia +Jörn Zaefferer +Paul Bakaus +Brandon Aaron +Mike Alsup +Dave Methvin +Ed Engelhardt +Sean Catchpole +Paul Mclanahan +David Serduke +Richard D. Worth +Scott González +Ariel Flesler +Cheah Chu Yeow +Andrew Chalkley +Fabio Buffoni +Stefan Bauckmeier  +Jon Evans +TJ Holowaychuk +Riccardo De Agostini +Michael Bensoussan +Louis-Rémi Babé +Robert Katić +Damian Janowski +Anton Kovalyov +Dušan B. Jovanovic +Earle Castledine +Rich Dougherty +Kim Dalsgaard +Andrea Giammarchi +Fabian Jakobs +Mark Gibson +Karl Swedberg +Justin Meyer +Ben Alman +James Padolsey +David Petersen +Batiste Bieler +Jake Archibald +Alexander Farkas +Filipe Fortes +Rick Waldron +Neeraj Singh +Paul Irish +Iraê Carvalho +Matt Curry +Michael Monteleone +Noah Sloan +Tom Viner +J. Ryan Stinnett +Douglas Neiner +Adam J. Sontag +Heungsub Lee +Dave Reed +Carl Fürstenberg +Jacob Wright +Ralph Whitbeck +unknown +temp01 +Colin Snover +Jared Grippe +Ryan W Tenney +Alex Sexton +Pinhook +Ron Otten +Jephte Clain +Anton Matzneller +Dan Heberden +Henri Wiechers +Russell Holbrook +Julian Aubourg +Gianni Alessandro Chiappetta +Scott Jehl +James Burke +Jonas Pfenniger +Xavi Ramirez +Sylvester Keil +Brandon Sterne +Mathias Bynens +Lee Carpenter +Timmy Willison <4timmywil@gmail.com> +Corey Frang +Digitalxero +David Murdoch +Josh Varner +Charles McNulty +Jordan Boesch +Jess Thrysoee +Michael Murray +Alexis Abril +Rob Morgan +John Firebaugh +Sam Bisbee +Gilmore Davidson +Brian Brennan +Xavier Montillet +Daniel Pihlstrom +Sahab Yazdani +avaly +Scott Hughes +Mike Sherov +Greg Hazel +Schalk Neethling +Denis Knauf +Timo Tijhof +Steen Nielsen +Anton Ryzhov +Shi Chuan +Matt Mueller +Berker Peksag +Toby Brain +Justin +Daniel Herman +Oleg Gaidarenko +Rock Hymas +Richard Gibson +Rafaël Blais Masson +cmc3cn <59194618@qq.com> +Joe Presbrey +Sindre Sorhus +Arne de Bree +Vladislav Zarakovsky +Andrew E Monat +Oskari +Joao Henrique de Andrade Bruni +tsinha +Dominik D. Geyer +Matt Farmer +Trey Hunner +Jason Moon +Jeffery To +Kris Borchers +Vladimir Zhuravlev +Jacob Thornton +Chad Killingsworth +Vitya Muhachev +Nowres Rafid +David Benjamin +Alan Plum +Uri Gilad +Chris Faulkner +Marcel Greter +Elijah Manor +Daniel Chatfield +Daniel Gálvez +Nikita Govorov +Wesley Walser +Mike Pennisi +Matthias Jäggli +Devin Cooper +Markus Staab +Dave Riddle +Callum Macrae +Jonathan Sampson +Benjamin Truyman +Jay Merrifield +James Huston +Sai Lung Wong +Erick Ruiz de Chávez +David Bonner +Allen J Schmidt Jr +Akintayo Akinwunmi +MORGAN +Ismail Khair +Carl Danley +Mike Petrovich +Greg Lavallee +Tom H Fuertes +Roland Eckl +Yiming He +David Fox +Bennett Sorbo +Paul Ramos +Rod Vagg +Sebastian Burkhard +Zachary Adam Kaplan +Adam Coulombe +nanto_vi +nanto +Danil Somsikov +Ryunosuke SATO +Diego Tres +Jean Boussier +Andrew Plummer +Mark Raddatz +Pascal Borreli +Isaac Z. Schlueter +Karl Sieburg +Nguyen Phuc Lam +Dmitry Gusev +Steven Benner +Li Xudong +Michał Gołębiowski-Owczarek +Renato Oliveira dos Santos +Frederic Junod +Tom H Fuertes +Mitch Foley +ros3cin +Kyle Robinson Young +John Paul +Jason Bedard +Chris Talkington +Eddie Monge +Terry Jones +Jason Merino +Dan Burzo +Jeremy Dunck +Chris Price +Guy Bedford +njhamann +Goare Mao +Amey Sakhadeo +Mike Sidorov +Anthony Ryan +Lihan Li +George Kats +Dongseok Paeng +Ronny Springer +Ilya Kantor +Marian Sollmann +Chris Antaki +David Hong +Jakob Stoeck +Christopher Jones +Forbes Lindesay +S. Andrew Sheppard +Leonardo Balter +Rodrigo Rosenfeld Rosas +Daniel Husar +Philip Jägenstedt +John Hoven +Roman Reiß +Benjy Cui +Christian Kosmowski +David Corbacho +Liang Peng +TJ VanToll +Aurelio De Rosa +Senya Pugach +Dan Hart +Nazar Mokrynskyi +Benjamin Tan +Amit Merchant +Jason Bedard +Veaceslav Grimalschi +Richard McDaniel +Arthur Verschaeve +Shivaji Varma +Ben Toews +Bin Xin +Neftaly Hernandez +T.J. Crowder +Nicolas HENRY +Frederic Hemberger +Victor Homyakov +Aditya Raghavan +Anne-Gaelle Colom +Leonardo Braga +George Mauer +Stephen Edgar +Thomas Tortorini +Jörn Wagner +Jon Hester +Colin Frick +Winston Howes +Alexander O'Mara +Chris Rebert +Bastian Buchholz +Mu Haibao +Calvin Metcalf +Arthur Stolyar +Gabriel Schulhof +Gilad Peleg +Julian Alexander Murillo +Kevin Kirsche +Martin Naumann +Yongwoo Jeon +John-David Dalton +Marek Lewandowski +Bruno Pérel +Daniel Nill +Reed Loden +Sean Henderson +Gary Ye +Richard Kraaijenhagen +Connor Atherton +Christian Grete +Tom von Clef +Liza Ramo +Joelle Fleurantin +Steve Mao +Jon Dufresne +Jae Sung Park +Josh Soref +Saptak Sengupta +Henry Wong +Jun Sun +Martijn W. van der Lee +Devin Wilson +Damian Senn +Zack Hall +Vitaliy Terziev +Todor Prikumov +Bernhard M. Wiedemann +Jha Naman +Alexander Lisianoi +William Robinet +Joe Trumbull +Alexander K +Ralin Chimev +Felipe Sateler +Christophe Tafani-Dereeper +Manoj Kumar +David Broder-Rodgers +Alex Louden +Alex Padilla +karan-96 +南漂一卒 +Erik Lax +Boom Lee +Andreas Solleder +Pierre Spring +Shashanka Nataraj +CDAGaming +Matan Kotler-Berkowitz <205matan@gmail.com> +Jordan Beland +Henry Zhu +Nilton Cesar +basil.belokon +Andrey Meshkov +tmybr11 +Luis Emilio Velasco Sanchez +Ed S +Bert Zhang +Sébastien Règne +wartmanm <3869625+wartmanm@users.noreply.github.com> +Siddharth Dungarwal +abnud1 +Andrei Fangli +Marja Hölttä +buddh4 +Hoang +Wonseop Kim +Pat O'Callaghan +JuanMa Ruiz +Ahmed.S.ElAfifi +Sean Robinson +Christian Oliff diff --git a/docs/site_libs/jquery-3.5.1/jquery.js b/docs/site_libs/jquery-3.5.1/jquery.js new file mode 100644 index 0000000..5093733 --- /dev/null +++ b/docs/site_libs/jquery-3.5.1/jquery.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " - + @@ -185,7 +185,7 @@

2022 data

#coding-freq-table {display: none;}
@@ -224,7 +224,7 @@

2022 data

- + @@ -258,7 +258,7 @@

Coding frequenc #code-freq-table {display: none;}
@@ -304,7 +304,7 @@

Coding frequenc

- + @@ -350,7 +350,7 @@