diff --git a/README.md b/README.md index 210b949..f395309 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,55 @@ -## **Paleoecological Analysis in R** +# **Paleoecological Analysis in R** - - -|Open the Gitbook to get started: [johannabosch/Paleoecological Analysis in R](https://johannabosch.github.io/Paleolimnological_Analysis_in_R/)| -|--| -|This is a tutorial-based review of the analysis from Bosch et al. 2024 (see below), hosted by Github pages. It includes a total of 5 chapters, each pertaining to a specific analysis conducted in R using the data found in this repository| - -### Study overview +## Study overview This is a public repo that can be used to learn how to conduct a paleoecological analysis in R. The project methods described here are formally reviewed and cited in the following paper. Please use this citation to cite this repository: Bosch J, Álvarez-Manzaneda I, Smol J, Michelutti N, Robertson GJ, Wilhelm SI, Montevecchi WA. 2024 Blending census and paleolimnological data allows for tracking the establishment and growth of a major gannet colony over several centuries. Proceedings of the Royal Society B [in review]. + -### Accessing the data +## Accessing the data A list of each of the data files from the `/data` folder and their contents: -* `FileS1_ColonialSeabirdDatabase_WilhelmSI.csv` : Historical population reports collected for seabird species nesting in Cape St. Mary’s Ecological Reserve from 1883-2018. A blank cell indicates that population counts were not collected for that year. + +| File name | Descriptions | +|----|---| +|`FileS1_ColonialSeabirdDatabase_WilhelmSI.csv`| Historical population reports collected for seabird species nesting in Cape St. Mary’s Ecological Reserve from 1883-2018. A blank cell indicates that population counts were not collected for that year. | +|`FileS2_MonitoringData.csv`|Raw monitoring data from File S1 used to align population data to the proxies.| +|`FileS3_Dating_CSM-IMP.csv` and `File S4_Dating_CSM-REF.csv`| Table containing 210Pb dating profiles over the depth of the impact core (CSM-IMP) and reference core (CSM-REF).| +|`FileS5_ProxyData_CSM-IMP.csv` and `FileS6_ProxyData_CSM-REF.csv`| Table containing the isotope, metal(loid), chlorophyll a, and diatom count data for the depths of the sediment core collected from the reference pond.| +|`File S7_Metalloids_CSM-IMP.csv` and `File S8_Metalloids_CSM-REF.csv`|Table of all metal(loid)s analyzed for the impact core and reference core.| +|`FileS9_ZScores_CSM-IMP.csv` | Z-score data for the isotope, metal(loid)s, chlorophyll a, and diatom count for the depths of the sediment core collected from the impact pond.| -* `FileS2_MonitoringData.csv` : Raw monitoring data from File S1 used to align population data to the proxies. +## Scripts and Figures +Here is a description of all the scripts used in this analysis (see `/scripts`) and the final figures produced by each script. -* `FileS3_Dating_CSM-IMP.csv` and `File S4_Dating_CSM-REF.csv` : Table containing 210Pb dating profiles over the depth of the impact core (CSM-IMP) and reference core (CSM-REF). +### **Proxy Alignment with Population Data** +- **Script:** See `scripts/Z_score_analysis.R` +![Proxy Alignment with Population Data](figs/proxy_alignment_populations.png) +### **Broken Stick Analysis for Metals** +- **Script:** See `scripts/breakpoint_analysis_metals.R` +![Broken Stick Analysis for Metals](figs/broken_stick_metals.png) -* `FileS5_ProxyData_CSM-IMP.csv` and `FileS6_ProxyData_CSM-REF.csv` : Table containing the isotope, metal(loid), chlorophyll a, and diatom count data for the depths of the sediment core collected from the reference pond. +### **Core Activity** +- **Script:** See `scripts/dating_profiles.R` +![Core Activity](figs/core_activity.png) +### **Core Age Model** +- **Script:** See `scripts/dating_profiles.R` +![Core Age Model](figs/core_age.png) -* `File S7_Metalloids_CSM-IMP.csv` and `File S8_Metalloids_CSM-REF.csv` : Table of all metal(loid)s analyzed for the impact core and reference core. +### **GAM Depth Plot** +- **Script:** See `scripts/GAM_depth.R` +![GAM Depth Plot](figs/GAM_depth.png) +### **Nested Metals Plot** +- **Script:** See `scripts/breakpoint_analysis_metals.R` +![Nested Metals Plot](figs/nested_metals.png) -* `FileS9_ZScores_CSM-IMP.csv` : Z-score data for the isotope, metal(loid)s, chlorophyll a, and diatom count for the depths of the sediment core collected from the impact pond. \ No newline at end of file +### **Paleostratigraphies** +- **Script:** See `scripts/paleostratigraphies.R` +![Paleostratigraphies](figs/paleostratigraphies.png) diff --git a/data/FileS4_Dating_CSM-REF.csv b/data/FileS4_Dating_CSM-REF.csv index f849453..69508f4 100644 --- a/data/FileS4_Dating_CSM-REF.csv +++ b/data/FileS4_Dating_CSM-REF.csv @@ -1,4 +1,4 @@ -midpoint,Total 210Pb_activity (Bq/kg),Error Total 210Pb_activity (Bq/kg),Sed. Rate (cm/y),Error Sed. Rate (cm/y),Year (CRS),Age (CRS),Error (CRS) +depth,Total 210Pb_activity (Bq/kg),Error Total 210Pb_activity (Bq/kg),Sed. Rate (cm/y),Error Sed. Rate (cm/y),Year (CRS),Age (CRS),Error (CRS) 0,,,,,2021.68,0,0 0.25,572.38,39.95,0.0359,0.003,2015.39,6.3,0.68 0.75,644.69,39.98,0.019,0.0016,1996.48,25.21,1.89 diff --git a/data/FileS5_ProxyData_CSM-IMP.csv b/data/FileS5_ProxyData_CSM-IMP.csv index 2855294..e4602ba 100644 --- a/data/FileS5_ProxyData_CSM-IMP.csv +++ b/data/FileS5_ProxyData_CSM-IMP.csv @@ -1,83 +1,83 @@ -midpoint,chla,Al,P,Zn,Cd,d15N,d13C,S.cons,S.exi -0.125,0.145270351,,,,,,,99.36170213,0 -0.375,0.137215245,9700,8700,100,2,,,, -0.625,0.114581613,,,,,10.91,-27.05,, -0.875,0.125933135,,,,,,,, -1.125,0.10597335,,,,,,,98.9626556,0.829875519 -1.375,0.095384889,12000,8600,140,2.6,,,, -1.625,0.098482268,,,,,10.52,-27.24,, -1.875,0.101783636,,,,,,,, -2.125,0.11823101,,,,,,,98.43400447,1.342281879 -2.375,0.113150233,11000,9100,140,2.6,,,, -2.625,0.127812676,,,,,10.97,-26.65,, -2.875,0.122760865,,,,,,,, -3.125,0.10051457,,,,,,,99.5584989,0 -3.375,0.110048778,12000,9400,140,2.5,,,, -3.625,0.095809123,,,,,10.81,-26.68,, -3.875,0.078333919,,,,,,,, -4.125,0.089725407,,,,,,,96.98681733,1.506591337 -4.375,0.092749386,12000,9300,140,2.4,,,, -4.625,0.063825771,,,,,9.88,-26.87,, -4.875,0.066423368,,,,,,,, -5.125,0.057837761,,,,,,,99.19224556,0 -5.375,0.038124295,7600,1900,70,0.69,,,, -5.625,0.021130601,,,,,6.6,-27.14,, -5.875,0.018618849,,,,,,,, -6.125,0.019621569,,,,,,,91.92825112,7.623318386 -6.375,0.012173345,7500,1900,57,0.61,,,, -6.625,0.011422115,,,,,2.03,-26.84,, -6.875,0.012290873,,,,,,,, -7.125,0.009889201,,,,,,,67.32673267,30.44554455 -7.375,0.010313611,8300,1900,46,0.55,,,, -7.625,0.008518601,,,,,1.56,-26.63,, -7.875,0.008423684,,,,,,,, -8.125,0.008307514,,,,,,,48.26789838,45.72748268 -8.375,0.008086348,7700,1500,28,0.39,,,, -8.625,0.007920309,,,,,1.31,-26.66,, -8.875,0.008470573,,,,,,,, -9.125,0.009500857,,,,,1.1,-26.57,63.57466063,34.61538462 -9.375,0.008822984,8200,1500,27,0.42,,,, -9.625,0.008322194,,,,,,,, -9.875,0.007737618,,,,,,,, -10.125,0.009139681,,,,,1.19,-26.66,38.18181818,60.77922078 -10.375,0.008866411,7300,1000,22,0.36,,,, -10.625,0.009233503,,,,,,,, -10.875,0.009553048,,,,,,,, -11.125,0.008989856,,,,,0.63,-26.51,48.8700565,51.1299435 -11.375,0.00830988,6500,970,17,0.34,,,, -11.625,0.007843139,,,,,,,, -11.875,0.008911591,,,,,,,, -12.125,0.006402951,,,,,0.59,-26.53,36.99059561,62.69592476 -12.375,0.007844279,4500,700,11,0.25,,,, -12.625,0.006342522,,,,,,,, -12.875,0.00582727,,,,,,,, -13.125,0.004688441,,,,,1.02,-26.76,38.56041131,59.89717224 -13.375,0.005974773,3900,590,8.8,0.23,,,, -13.625,0.006078542,,,,,,,, -13.875,0.005798085,,,,,,,, -14.125,0.005294491,,,,,0.88,-26.9,26.83615819,71.18644068 -14.375,0.006329112,3800,560,7.4,0.16,,,, -14.625,0.005333492,,,,,,,, -14.875,0.005979681,,,,,,,, -15.25,0.00732149,,,,,0.16,-26.75,26.39296188,71.5542522 -15.75,0.005624772,,,,,,,, -16.25,0.005426568,,,,,0.79,-26.85,93.33333333,4.761904762 -16.75,0.004616399,,,,,,,, -17.25,0.005131782,,,,,1.46,-27.29,, -17.75,0.006898658,,,,,,,, -18.25,0.006522627,,,,,1.36,-26.71,, -18.75,0.005801503,,,,,,,, -19.25,0.006620656,,,,,1.81,-27.27,, -19.75,0.004970344,,,,,,,, -20.25,0.005253386,,,,,1.49,-26.56,, -20.75,0.005709259,,,,,,,, -21.25,0.005876788,,,,,1.81,-27.24,, -21.75,0.005570214,,,,,,,, -22.25,0.005648216,,,,,0.2,-26.37,, -22.75,0.005321178,,,,,,,, -23.25,0.005717279,,,,,1.15,-27.29,, -23.75,0.004890984,,,,,,,, -24.25,0.004610089,,,,,1.05,-27.25,, -24.75,0.004503866,,,,,,,, -25.25,0.004808118,,,,,1.22,-27.28,, -25.75,0.004901238,,,,,,,, +midpoint,year,chla,Al,P,Zn,Cd,d15N,d13C,S.cons,S.exi +0.125,2021.04,0.145270351,,,,,,,99.36170213,0 +0.375,2019.42,0.137215245,9700,8700,100,2,,,, +0.625,2017.8,0.114581613,,,,,10.91,-27.05,, +0.875,2016.17,0.125933135,,,,,,,, +1.125,2014.55,0.10597335,,,,,,,98.9626556,0.829875519 +1.375,2012.22,0.095384889,12000,8600,140,2.6,,,, +1.625,2009.89,0.098482268,,,,,10.52,-27.24,, +1.875,2007.56,0.101783636,,,,,,,, +2.125,2005.23,0.11823101,,,,,,,98.43400447,1.342281879 +2.375,2003.23,0.113150233,11000,9100,140,2.6,,,, +2.625,2001.22,0.127812676,,,,,10.97,-26.65,, +2.875,1999.22,0.122760865,,,,,,,, +3.125,1997.21,0.10051457,,,,,,,99.5584989,0 +3.375,1994.62,0.110048778,12000,9400,140,2.5,,,, +3.625,1992.03,0.095809123,,,,,10.81,-26.68,, +3.875,1989.43,0.078333919,,,,,,,, +4.125,1986.84,0.089725407,,,,,,,96.98681733,1.506591337 +4.375,1981.23,0.092749386,12000,9300,140,2.4,,,, +4.625,1975.62,0.063825771,,,,,9.88,-26.87,, +4.875,1970,0.066423368,,,,,,,, +5.125,1964.39,0.057837761,,,,,,,99.19224556,0 +5.375,1956.29,0.038124295,7600,1900,70,0.69,,,, +5.625,1948.19,0.021130601,,,,,6.6,-27.14,, +5.875,1940.08,0.018618849,,,,,,,, +6.125,1931.98,0.019621569,,,,,,,91.92825112,7.623318386 +6.375,1928.17,0.012173345,7500,1900,57,0.61,,,, +6.625,1924.36,0.011422115,,,,,2.03,-26.84,, +6.875,1920.54,0.012290873,,,,,,,, +7.125,1916.73,0.009889201,,,,,,,67.32673267,30.44554455 +7.375,1908.49,0.010313611,8300,1900,46,0.55,,,, +7.625,1900.26,0.008518601,,,,,1.56,-26.63,, +7.875,1892.02,0.008423684,,,,,,,, +8.125,1883.78,0.008307514,,,,,,,48.26789838,45.72748268 +8.375,1874.78,0.008086348,7700,1500,28,0.39,,,, +8.625,1866.37,0.007920309,,,,,1.31,-26.66,, +8.875,1857.72,0.008470573,,,,,,,, +9.125,1848.83,0.009500857,,,,,1.1,-26.57,63.57466063,34.61538462 +9.375,1839.7,0.008822984,8200,1500,27,0.42,,,, +9.625,1830.33,0.008322194,,,,,,,, +9.875,1820.73,0.007737618,,,,,,,, +10.125,1810.89,0.009139681,,,,,1.19,-26.66,38.18181818,60.77922078 +10.375,1800.81,0.008866411,7300,1000,22,0.36,,,, +10.625,1790.49,0.009233503,,,,,,,, +10.875,1779.94,0.009553048,,,,,,,, +11.125,1769.14,0.008989856,,,,,0.63,-26.51,48.8700565,51.1299435 +11.375,1758.11,0.00830988,6500,970,17,0.34,,,, +11.625,1746.84,0.007843139,,,,,,,, +11.875,1735.33,0.008911591,,,,,,,, +12.125,1723.59,0.006402951,,,,,0.59,-26.53,36.99059561,62.69592476 +12.375,1711.6,0.007844279,4500,700,11,0.25,,,, +12.625,1699.38,0.006342522,,,,,,,, +12.875,1686.92,0.00582727,,,,,,,, +13.125,1674.23,0.004688441,,,,,1.02,-26.76,38.56041131,59.89717224 +13.375,1661.29,0.005974773,3900,590,8.8,0.23,,,, +13.625,1648.12,0.006078542,,,,,,,, +13.875,1634.71,0.005798085,,,,,,,, +14.125,1621.06,0.005294491,,,,,0.88,-26.9,26.83615819,71.18644068 +14.375,1607.17,0.006329112,3800,560,7.4,0.16,,,, +14.625,1593.04,0.005333492,,,,,,,, +14.875,1578.68,0.005979681,,,,,,,, +15.25,1556.69,0.00732149,,,,,0.16,-26.75,26.39296188,71.5542522 +15.75,,0.005624772,,,,,,,, +16.25,,0.005426568,,,,,0.79,-26.85,93.33333333,4.761904762 +16.75,,0.004616399,,,,,,,, +17.25,,0.005131782,,,,,1.46,-27.29,, +17.75,,0.006898658,,,,,,,, +18.25,,0.006522627,,,,,1.36,-26.71,, +18.75,,0.005801503,,,,,,,, +19.25,,0.006620656,,,,,1.81,-27.27,, +19.75,,0.004970344,,,,,,,, +20.25,,0.005253386,,,,,1.49,-26.56,, +20.75,,0.005709259,,,,,,,, +21.25,,0.005876788,,,,,1.81,-27.24,, +21.75,,0.005570214,,,,,,,, +22.25,,0.005648216,,,,,0.2,-26.37,, +22.75,,0.005321178,,,,,,,, +23.25,,0.005717279,,,,,1.15,-27.29,, +23.75,,0.004890984,,,,,,,, +24.25,,0.004610089,,,,,1.05,-27.25,, +24.75,,0.004503866,,,,,,,, +25.25,,0.004808118,,,,,1.22,-27.28,, +25.75,,0.004901238,,,,,,,, diff --git a/data/FileS9_ZScores_CSM-IMP.csv b/data/FileS9_ZScores_CSM-IMP.csv index 512775e..5515ac1 100644 --- a/data/FileS9_ZScores_CSM-IMP.csv +++ b/data/FileS9_ZScores_CSM-IMP.csv @@ -1,4 +1,4 @@ -Depth (cm),year,z_d15N,z_chla,z_P,z_Zn,Z_Cd,z_S.cons,mean +depth,year,z_d15N,z_chla,z_P,z_Zn,Z_Cd,z_S.cons,mean 0,2021.04,1.992103479,2.597660062,1.271586818,0.879950296,1.245704793,1.099482742,1.514414698 1,2014.55,1.891685372,1.692550449,1.2454153,1.205447201,1.382974468,1.080630792,1.416450597 2,2005.23,2.007552419,1.97487545,1.37627289,1.459776775,1.640943262,1.064315478,1.587289379 @@ -7,7 +7,7 @@ 5,1964.39,0.882354655,0.583865737,-0.508076402,0.616473453,-0.265623675,1.087713003,0.399451129 6,1931.98,-0.294339573,-0.296350093,-0.508076402,0.230274953,-0.389469585,0.863554095,-0.065734434 7,1916.73,-0.415356266,-0.520511212,-0.508076402,-0.263185703,-0.586816908,0.109522398,-0.364070682 -8,1910.092734,-0.479726848,-0.556941481,-0.612762473,-0.720190995,-0.791333939,-0.411644981,-0.595433453 -9,1879.731084,-0.533798136,-0.529455775,-0.612762473,-0.80260441,-0.783866603,-0.011418306,-0.545650951 -10,1845.706634,-0.510624727,-0.537774561,-0.743620063,-0.869503856,-0.808808869,-0.798077547,-0.711401604 -11,1808.019384,-0.654814829,-0.541225414,-0.751471519,-0.965018144,-0.769614842,-0.465192048,-0.691222799 \ No newline at end of file +8,1883.78,-0.479726848,-0.556941481,-0.612762473,-0.720190995,-0.791333939,-0.411644981,-0.595433453 +9,1848.83,-0.533798136,-0.529455775,-0.612762473,-0.80260441,-0.783866603,-0.011418306,-0.545650951 +10,1810.89,-0.510624727,-0.537774561,-0.743620063,-0.869503856,-0.808808869,-0.798077547,-0.711401604 +11,1769.14,-0.654814829,-0.541225414,-0.751471519,-0.965018144,-0.769614842,-0.465192048,-0.691222799 diff --git a/docs/404.html b/docs/404.html deleted file mode 100644 index 99d3b94..0000000 --- a/docs/404.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - Page not found | Multi-Proxy Paleoecological Analysis Using R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
-
- - -
-
- -
-
-

Page not found

-

The page you requested cannot be found (perhaps it was moved or renamed).

-

You may want to try searching to find the page's new location, or use -the table of contents to find the page you are looking for.

-
-
- -
-
-
- - -
-
- - - - - - - - - - - - - diff --git a/docs/breakpoint-analysis.html b/docs/breakpoint-analysis.html deleted file mode 100644 index f8b5a35..0000000 --- a/docs/breakpoint-analysis.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - - 2 Breakpoint Analysis | Multi-Proxy Paleoecological Analysis Using R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
-
- - -
-
- -
-
-

2 Breakpoint Analysis

-

This is a breakpoint analysis in R for metal(loid) data obtained from individual coring sites. I used data containing more than 20 metals, and their concentrations at each depth of the impacted core.

-

My data files can be found in the Github repo, called FileS7_Metalloids_CSM-IMP.csv and FileS8_Metalloids_CSM-REF.csv. Access the files here.

-
-

2.1 Getting Started

-

Begin by installing all the required packages using install/packages() if you haven’t already.

-

Once installed, load the packages in R

-
#load the tidy libraries
-
-library(tidyverse)
-library(tidypaleo)
-library(vegan)
-
-
-

2.2 Load and prepare the data

-

Load your data for impact and reference sites into R

-
metals_IMP <- read.csv("Data/FileS6_Metalloids_CSM-IMP.csv")
-metals_REF <- read.csv("Data/FileS7_Metalloids_CSM-REF.csv")
-

Transform the data into long format

-
metals_long_IMP <- metals_IMP %>%
-  pivot_longer(!depth, names_to = "metals", values_to = "concentration")
-

Make sure depth column is numeric

-
metals_long_IMP$depth <- as.numeric(metals_long_IMP$depth)
-
-
-

2.3 Plot the data

-
-

2.3.1 Plot CONISSS

-

Run the stratigraphically constrained cluster analysis on your data (CONISS)

-
nested_coniss_IMP <- metals_long_IMP %>%
-  nested_data(depth, metals, concentration) %>%
-  nested_chclust_coniss()
-

Plot the cluster analysis results

-
plot(nested_coniss_IMP)
-
-
-

2.3.2 Plot a broken stick diagram

-
broken_stick_plot <- nested_coniss_IMP %>%
-  select(broken_stick) %>%
-  unnest(broken_stick) %>%
-  tidyr::gather(type, value, broken_stick_dispersion, dispersion) %>%
-  ggplot(aes(x = n_groups, y = value, col = type)) +
-  geom_line() +
-  geom_point()
-
-
-
-

2.4 Final Figure

-
-[Bosch et al. 2024]: Dendrogram (LEFT) showing the distinct breakpoints in the metal(loid)s data across the core depth (cm) of CSM-IMP-2, and a line plot (RIGHT) showing the broken stick dispersion plot for the breakpoint analysis, where value is a measure of the magnitude of the variable being analyzed. Created using the tidyverse and tidypaleo packages available in R (v.4.2.1) software. -

-Figure 2.1: [Bosch et al. 2024]: Dendrogram (LEFT) showing the distinct breakpoints in the metal(loid)s data across the core depth (cm) of CSM-IMP-2, and a line plot (RIGHT) showing the broken stick dispersion plot for the breakpoint analysis, where value is a measure of the magnitude of the variable being analyzed. Created using the tidyverse and tidypaleo packages available in R (v.4.2.1) software. -

-
- -
-
-
- -
-
-
- - -
-
- - - - - - - - - - - - - diff --git a/docs/dating-profiles.html b/docs/dating-profiles.html deleted file mode 100644 index e5a7180..0000000 --- a/docs/dating-profiles.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - - 1 Dating Profiles | Multi-Proxy Paleoecological Analysis Using R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
-
- - -
-
- -
-
-

1 Dating Profiles

-
-

1.1 Getting Started

-

Load the following packages

-
library(ggplot2)
-library(dplyr)
-library(viridis)
-library(ggpubr)
-
-
-

1.2 Load the data

-

I used data from the following files found in the Github repo FileS3_Dating_CSM-IMP.csv and FileS4_Dating_CSM-REF.csv. Access the files here.

-

Load your data for impact and reference sites into R

-
dp_IMP2 <- read.csv("Data/FileS2_Dating_CSM-IMP.csv") 
-dp_REF3 <- read.csv("Data/FileS3_Dating_CSM-REF.csv") 
-

Define columns for core depth/year, activity, sedimentation rate (with error) in both files

-
#core depth
-depth_IMP2 <- dp_IMP2$midpoint
-depth_REF3 <- dp_REF3$midpoint
-
-#core year
-year_IMP <- dp_IMP2$year
-year_REF <- dp_REF3$year
-
-#210-Pb activity
-act_IMP2 <- dp_IMP2$activity
-act_REF3 <- dp_REF3$activity
-
-# sedimentation rate
-sed_IMP2 <- dp_IMP2$sedimetation_rate
-sed_REF3 <- dp_REF3$sedimetation_rate
-
-error_IMP <- dp_IMP2$sr_error
-error_REF <- dp_REF3$sr_error
-
-
-

1.3 Plot 210-Pb dating profiles

-

Plot the activity and sedimentation rate

-
activity <- ggplot() +
-  geom_point(data = dp_IMP2, (aes(x= depth_IMP2, y=act_IMP2)), shape=22, fill="paleturquoise4", size=3, color = "paleturquoise4", alpha=0.5) +
-  geom_line(data = dp_IMP2, (aes(x = depth_IMP2, y=act_IMP2)), color="paleturquoise4") +
-  geom_point(data = dp_REF3, (aes(x = depth_REF3, y=act_REF3)), size =3, color="palegreen3") +
-  geom_line(data = dp_REF3, (aes(x = depth_REF3, y=act_REF3)), color="palegreen3") +
-  labs(x="Midpoint depth (cm)", y="Pb-210 Activity (Bq/kg)") +
-  scale_x_continuous(breaks=seq(0,19, by= 1), limits = c(0,19)) +
-  theme_classic()+
-  theme(text = element_text(size = 12), panel.grid.major.x=element_line(), axis.text.y = element_text(size=12), axis.title.y = element_text(margin = margin(t=0, r= 20, b=0, l=0)))
-
-activity
-
sed.rate <- ggplot() +
-  geom_point(data = dp_IMP2, (aes(x = depth_IMP2, y=sed_IMP2)),shape=21, color = "paleturquoise4") +
-  geom_line(data = dp_IMP2, (aes(x = depth_IMP2, y=sed_IMP2)), color="paleturquoise4") +
-  geom_point(data = dp_REF3, (aes(x = depth_REF3, y=sed_REF3)), color="palegreen3") +
-  geom_line(data = dp_REF3, (aes(x = depth_REF3, y=sed_REF3)), color="palegreen3") +
-  labs(x = "Core Depth (cm/yr)", y = "Sedimentation rate (cm/yr)") +
-  scale_x_continuous(breaks=seq(0,19, by= 1), limits = c(0,19)) +
-  theme_classic() +
-  theme(panel.grid.major.x=element_line(), text = element_text(size = 12), axis.text.y = element_text(size=12), 
-        axis.text.x = element_text(size=12), axis.title.y = element_text(margin = margin(t=0, r= 20, b=0, l=0)))
-
-par(mar = c(10, 10,10,10))
-

Plot year based on core depth

-
year <- ggplot() +
-  geom_point(data = dp_IMP2, (aes(x = year_IMP, y= depth_IMP2)), na.rm=TRUE, shape=22, fill="paleturquoise4", size=3, color = "paleturquoise4", alpha=0.5) +
-  geom_line(data = dp_IMP2, (aes(x = year_IMP, y= depth_IMP2)), na.rm=TRUE, color = "paleturquoise4") +
-  stat_smooth(dp_IMP2, mapping=aes(year_IMP, depth_IMP2), method="lm") +
-  geom_errorbar(aes(x=year_IMP, xmin=year_IMP-error_IMP, xmax=year_IMP+error_IMP, y=depth_IMP2, ymax=NULL, ymin=NULL), width=.2) +
-  labs(x = "Year (CRS model)", y = "Midpoint depth (cm)") +
-  scale_x_continuous(breaks=seq(1800,2023, by= 20)) +
-  scale_y_reverse(breaks=seq(0,15, by=1), expand=c(0,0)) +
-  theme_classic() +
-  theme(panel.grid.major.x=element_line(), text = element_text(size = 12), axis.text.y = element_text(size=12), axis.text.x = element_text(size=12))
-
-year
-
-
-

1.4 Final Figure

-
ggarrange(activity, year, ncol = 1, nrow = 2, common.legend=TRUE,legend=c("top"))
-
-[Bosch et al. 2024]: 210-Pb activity (Bq/kg) over the depth of the impact core (CSM-IMP-2, blue squares) and the reference core (CSM-REF-3, green circles). The 210-Pb dates assigned to the midpoint depth of the cores using a constant rate of supply (CRS) dating model are shown in the smaller, inset graph, where pink trend lines represent the second order polynomial regression for each core. -

-Figure 1.1: [Bosch et al. 2024]: 210-Pb activity (Bq/kg) over the depth of the impact core (CSM-IMP-2, blue squares) and the reference core (CSM-REF-3, green circles). The 210-Pb dates assigned to the midpoint depth of the cores using a constant rate of supply (CRS) dating model are shown in the smaller, inset graph, where pink trend lines represent the second order polynomial regression for each core. -

-
- -
-
-
- -
-
-
- - -
-
- - - - - - - - - - - - - diff --git a/docs/generalized-additive-models.html b/docs/generalized-additive-models.html deleted file mode 100644 index 0b9d272..0000000 --- a/docs/generalized-additive-models.html +++ /dev/null @@ -1,666 +0,0 @@ - - - - - - - 4 Generalized Additive Models | Multi-Proxy Paleoecological Analysis Using R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
-
- - -
-
- -
-
-

4 Generalized Additive Models

-

Data used in this analysis can be found in the github repo in the following files: FileS4_Impact_ProxyData.xlsx, FileS5_Reference_ProxyData.xlsx. Access the files here. Each proxy should have a seperate file containing z_score data, which I used in the analysis.

-
-

4.1 Getting Started

-

Install the following packages

-
mgcv, analogue, ggplot2, mvnfast, gratia, viridis
-

If you’re using ubuntu, run this first to install the dependency RCPArmadillo and mvnfast for gratia

-
sudo apt-get update -y 
-sudo apt-get install -y r-cran-rcpparmadillo
-sudo apt-get install -y r-cran-mvnfast
-

Load packages

-
library(mgcv) # For gams
-library(ggplot2) # For plotting
-library(analogue) # For general use and support of other packages
-library(gratia) # For derivatives to identify significant periods of change
-library(viridis) # Package to use colours
-
-
-

4.2 Fitting GAMs using mgcv

-

Here I use the mixed model approach via restricted maximum likelihood (REML).

-

Start by loading a local function for first derivatives

-
signifD <- function(x, d, upper, lower, eval = 0) {
-  miss <- upper > eval & lower < eval
-  incr <- decr <- x
-  want <- d > eval
-  incr[!want | miss] <- NA
-  want <- d < eval
-  decr[!want | miss] <- NA
-  list(incr = incr, decr = decr)
-}
-
-

4.2.1 Chlorophyll a data

-

Read the chlorophyll a data into R:

-
pd_chlA <-read.csv("chlA.csv")
-head(pd_chlA)
-

Check that data looks correct

-
-

4.2.1.1 Apply the REML function to your data

-
chlA_gam<-gam(chlA~s(year, k = 26), data= pd_chlA, method="REML") 
-gam.check(chlA_gam)
-

Plot your results

-
plot(chlA_gam)
-

And now add standard error

-
fit_gcv<- predict(chlA_gam, data = pd_chlA, se.fit = TRUE, length.out=200)
-crit.t <- qt(0.975, df.residual(chlA_gam))
-chlA_new <- data.frame(Year = pd_chlA[["year"]],
-                        fit = fit_gcv$fit,
-                        se.fit = fit_gcv$se.fit)
-
-chlA_new <- transform(chlA_new,
-                       upper = fit + (crit.t * se.fit),
-                       lower = fit - (crit.t * se.fit))
-
-
-

4.2.1.2 Transform your data

-

You need equal lengths everywhere (i.e., 200 rows) for the following functions to work

-
chlA_new_sigperiod<-data.frame(approx(chlA_new$Year, chlA_new$fit, n=200)) 
-
-colnames(chlA_new_sigperiod)<-c("Year", "fit")
-

Check that it looks right using head(chlA_new_sigperiod)

-
-
-

4.2.1.3 Identify significant changes

-

Identify derivatives of significant value

-
chlA_der<-derivatives(chlA_gam, type="central", n=200)
-draw(chlA_der)
-
-chlA_sig<-signifD(chlA_new_sigperiod$fit, d= chlA_der$derivative, chlA_der$upper, chlA_der$lower)
-
-chlA_sig
-
-
-

4.2.1.4 Plot the results

-
chlA<-ggplot()+
-  geom_ribbon(data=chlA_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+
-  geom_line(data= chlA_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+
-  geom_line(data= chlA_new_sigperiod, mapping=aes(y=BTP_chlA_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase
-  geom_line(data=chlA_new_sigperiod, mapping=aes(y=BTP_chlA_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease
-  geom_point(data=pd_chlA, aes(y=chlA, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+
-  scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+
-  ylim(c(-0.01, 0.16))+
-  labs(x=NULL, y=NULL) +
-  theme_classic() + 
-  theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold"))
-
-chlA
-

Now do the same for every other proxy, here my dataset includes data for d15N, d13C, Phosphorus, Zinc/Al, Cadmium/Al, and relative abundance of two dominant diatom species.

-
-
-
-

4.2.2 d15N

-
pd_d15N <-read.csv("d15N.csv")
-head(pd_d15N) #Check that data looks correct
-
-d15N_gam<-gam(d15N~s(year, k = 20), data= pd_d15N, method="REML") 
-gam.check(d15N_gam)
-plot(d15N_gam)
-
-fit_gcv<- predict(d15N_gam, data = pd_d15N, se.fit = TRUE, length.out=200)
-crit.t <- qt(0.975, df.residual(d15N_gam))
-d15N_new <- data.frame(Year = pd_d15N[["year"]],
-                      fit = fit_gcv$fit,
-                      se.fit = fit_gcv$se.fit)
-
-d15N_new <- transform(d15N_new,
-                     upper = fit + (crit.t * se.fit),
-                     lower = fit - (crit.t * se.fit))
-
-
-d15N_new_sigperiod<-data.frame(approx(d15N_new$Year, d15N_new$fit, n=200)) 
-colnames(d15N_new_sigperiod)<-c("Year", "fit")
-head(d15N_new_sigperiod) # Check that it looks right. 
-
-BTP_d15N_der<-derivatives(d15N_gam, type="central", n=200)
-draw(BTP_d15N_der)
-
-BTP_d15N_sig<-signifD(d15N_new_sigperiod$fit, d= BTP_d15N_der$derivative, BTP_d15N_der$upper, BTP_d15N_der$lower)
-BTP_d15N_sig
-
-d15N<-ggplot()+
-  geom_ribbon(data=d15N_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+
-  geom_line(data= d15N_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+
-  geom_line(data= d15N_new_sigperiod, mapping=aes(y=BTP_d15N_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase
-  geom_line(data=d15N_new_sigperiod, mapping=aes(y=BTP_d15N_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease
-  geom_point(data=pd_d15N, aes(y= d15N, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+
-  scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+
-  ylim(c(-2, 13))+
-  labs(x=NULL, y=NULL) +
-  theme_classic() + 
-  theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold"))
-
-d15N
-
-
-

4.2.3 d13C

-
pd_d13C <-read.csv("d13C.csv")
-head(pd_d13C) #Check that data looks correct
-
-d13C_gam<-gam(d13C~s(year, k = 19), data= pd_d13C, method="REML") 
-gam.check(d13C_gam)
-plot(d13C_gam)
-
-fit_gcv<- predict(d13C_gam, data = pd_d13C, se.fit = TRUE, length.out=200)
-crit.t <- qt(0.975, df.residual(d13C_gam))
-d13C_new <- data.frame(Year = pd_d13C[["year"]],
-                        fit = fit_gcv$fit,
-                        se.fit = fit_gcv$se.fit)
-
-d13C_new <- transform(d13C_new,
-                       upper = fit + (crit.t * se.fit),
-                       lower = fit - (crit.t * se.fit))
-
-d13C_new_sigperiod<-data.frame(approx(d13C_new$Year, d13C_new$fit, n=200)) 
-colnames(d13C_new_sigperiod)<-c("Year", "fit")
-head(d13C_new_sigperiod) 
-
-BTP_d13C_der<-derivatives(d13C_gam, type="central", n=200)
-draw(BTP_d13C_der)
-
-BTP_d13C_sig<-signifD(d13C_new_sigperiod$fit, d= BTP_d13C_der$derivative, BTP_d13C_der$upper, BTP_d13C_der$lower)
-BTP_d13C_sig
-
-d13C<-ggplot()+
-  geom_ribbon(data=d13C_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+
-  geom_line(data= d13C_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+
-  geom_line(data= d13C_new_sigperiod, mapping=aes(y=BTP_d13C_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase
-  geom_line(data=d13C_new_sigperiod, mapping=aes(y=BTP_d13C_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease
-  geom_point(data=pd_d13C, aes(y= d13C, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+
-  theme(text = element_text(size = 10, face = "bold")) +
-  ylab("d13C")+
-  xlab("year Year (cm)")+
-  scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+
-  ylim(c(-28, -23))+
-  labs(x=NULL, y=NULL) +
-  theme_classic() + 
-  theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold"))
-
-d13C
-
-
-

4.2.4 Phosphorus

-
pd_metals <-read.csv("metals.csv")
-head(pd_metals) 
-
-P_gam<-gam(P~s(year, k = 15), data= pd_metals, method="REML") 
-gam.check(P_gam)
-plot(P_gam)
-
-fit_gcv<- predict(P_gam, data = pd_metals, se.fit = TRUE, length.out=200)
-crit.t <- qt(0.975, df.residual(P_gam))
-P_new <- data.frame(Year = pd_metals[["year"]],
-                        fit = fit_gcv$fit,
-                        se.fit = fit_gcv$se.fit)
-
-P_new <- transform(P_new,
-                       upper = fit + (crit.t * se.fit),
-                       lower = fit - (crit.t * se.fit))
-
-P_new_sigperiod<-data.frame(approx(P_new$Year, P_new$fit, n=200)) 
-colnames(P_new_sigperiod)<-c("Year", "fit")
-
-BTP_P_der<-derivatives(P_gam, type="central", n=200)
-draw(BTP_P_der)
-
-BTP_P_sig<-signifD(P_new_sigperiod$fit, d= BTP_P_der$derivative, BTP_P_der$upper, BTP_P_der$lower)
-BTP_P_sig
-
-P<-ggplot()+
-  geom_ribbon(data=P_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+
-  geom_line(data= P_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+
-  geom_line(data= P_new_sigperiod, mapping=aes(y=BTP_P_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase
-  geom_line(data=P_new_sigperiod, mapping=aes(y=BTP_P_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease
-  geom_point(data=pd_metals, aes(y=P, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+
-  theme(text = element_text(size = 10, face = "bold")) +
-  ylab("")+
-  xlab("year")+
-  scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+
-  ylim(c(-3000, 15000))+
-  labs(x=NULL, y=NULL) +
-  theme_classic() + 
-  theme(text = element_text(size = 10, face = "bold"))
-
-P
-
-
-

4.2.5 Zinc/Al and Cd/Al

-
pd_metals <-read.csv("metals.csv")
-head(pd_metals)
-
-Zn_gam<-gam(Zn~s(year, k = 15), data= pd_metals, method="REML") 
-gam.check(Zn_gam)
-plot(Zn_gam)
-
-fit_gcv<- predict(Zn_gam, data = pd_metals, se.fit = TRUE, length.out=200)
-crit.t <- qt(0.975, df.residual(Zn_gam))
-Zn_new <- data.frame(Year = pd_metals[["year"]],
-                     fit = fit_gcv$fit,
-                     se.fit = fit_gcv$se.fit)
-
-Zn_new <- transform(Zn_new,
-                    upper = fit + (crit.t * se.fit),
-                    lower = fit - (crit.t * se.fit))
-
-
-Zn_new_sigperiod<-data.frame(approx(Zn_new$Year, Zn_new$fit, n=200)) 
-colnames(Zn_new_sigperiod)<-c("Year", "fit")
-head(Zn_new_sigperiod)
-
-BTP_Zn_der<-derivatives(Zn_gam, type="central", n=200)
-draw(BTP_Zn_der)
-
-BTP_Zn_sig<-signifD(Zn_new_sigperiod$fit, d= BTP_Zn_der$derivative, BTP_Zn_der$upper, BTP_Zn_der$lower)
-BTP_Zn_sig
-
-Zn <-ggplot() +
-  geom_ribbon(data=Zn_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5) +
-  geom_line(data= Zn_new, mapping=aes(y= fit, x= Year), colour="lightblue4") +
-  geom_line(data= Zn_new_sigperiod, mapping=aes(y=BTP_Zn_sig$decr, x=Year), colour="deepskyblue4", size=1) + ## Periods of increase
-  geom_line(data=Zn_new_sigperiod, mapping=aes(y=BTP_Zn_sig$incr, x=Year), colour="deepskyblue4", size=1) + ## Periods of decrease
-  geom_point(data=pd_metals, aes(y= Zn, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5) +
-  theme(text = element_text(size = 10, face = "bold")) +
-  ylab("")+
-  xlab("")+
-  scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+
-  ylim(c(0.00006, 0.015)) +
-  labs(x=NULL, y=NULL) +
-  theme_classic() +
-  theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold"))
-
-Zn
-
-pd_metals <-read.csv("metals.csv")
-head(pd_metals)
-
-Cd_gam<-gam(Cd~s(year, k = 15), data= pd_metals, method="REML") 
-gam.check(Cd_gam)
-plot(Cd_gam)
-
-fit_gcv<- predict(Cd_gam, data = pd_metals, se.fit = TRUE, length.out=200)
-crit.t <- qt(0.975, df.residual(Cd_gam))
-Cd_new <- data.frame(Year = pd_metals[["year"]],
-                      fit = fit_gcv$fit,
-                      se.fit = fit_gcv$se.fit)
-
-Cd_new <- transform(Cd_new,
-                     upper = fit + (crit.t * se.fit),
-                     lower = fit - (crit.t * se.fit))
-
-Cd_new_sigperiod<-data.frame(approx(Cd_new$Year, Cd_new$fit, n=200)) 
-colnames(Cd_new_sigperiod)<-c("Year", "fit")
-head(Cd_new_sigperiod) 
-
-BTP_Cd_der<-derivatives(Cd_gam, type="central", n=200)
-draw(BTP_Cd_der)
-
-BTP_Cd_sig<-signifD(Cd_new_sigperiod$fit, d= BTP_Cd_der$derivative, BTP_Cd_der$upper, BTP_Cd_der$lower)
-BTP_Cd_sig
-
-Cd<-ggplot()+
-geom_ribbon(data=Cd_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+
-  geom_line(data= Cd_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+
-  geom_line(data= Cd_new_sigperiod, mapping=aes(y=BTP_Cd_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase
-  geom_line(data=Cd_new_sigperiod, mapping=aes(y=BTP_Cd_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease
-  geom_point(data=pd_metals, aes(y= Cd, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+
-  theme(text = element_text(size = 10, face = "bold")) +
-  scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+
-  ylim(c(0.05e-05, 3e-04))+
-  labs(x=NULL, y=NULL) +
-  theme_classic()+
-  theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold"))
-
-
-Cd
-
-
-

4.2.6 Diatom (S.construens)

-
pd_diatoms <-read.csv("diatoms.csv")
-head(pd_diatoms)
-
-S.cons_gam<-gam(S.construens~s(year, k = 17), data= pd_diatoms, method="REML") 
-gam.check(S.cons_gam)
-plot(S.cons_gam)
-
-fit_gcv<- predict(S.cons_gam, data = pd_diatoms, se.fit = TRUE, length.out=200)
-crit.t <- qt(0.975, df.residual(S.cons_gam))
-S.cons_new <- data.frame(Year = pd_diatoms[["year"]],
-                         fit = fit_gcv$fit,
-                         se.fit = fit_gcv$se.fit)
-
-S.cons_new <- transform(S.cons_new,
-                        upper = fit + (crit.t * se.fit),
-                        lower = fit - (crit.t * se.fit))
-
-S.cons_new_sigperiod<-data.frame(approx(S.cons_new$Year, S.cons_new$fit, n=200)) 
-colnames(S.cons_new_sigperiod)<-c("Year", "fit")
-head(S.cons_new_sigperiod) 
-
-BTP_S.cons_der<-derivatives(S.cons_gam, type="central", n=200)
-draw(BTP_S.cons_der)
-
-BTP_S.cons_sig<-signifD(S.cons_new_sigperiod$fit, d= BTP_S.cons_der$derivative, BTP_S.cons_der$upper, BTP_S.cons_der$lower)
-BTP_S.cons_sig
-
-S.cons<-ggplot()+
-  geom_ribbon(data=S.cons_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+
-  geom_line(data= S.cons_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+
-  geom_line(data= S.cons_new_sigperiod, mapping=aes(y=BTP_S.cons_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase
-  geom_line(data=S.cons_new_sigperiod, mapping=aes(y=BTP_S.cons_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease
-  geom_point(data=pd_diatoms, aes(y= S.construens, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+
-  scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+
-  ylim(c(-15, 115))+
-  labs(x=NULL, y=NULL) +
-  theme_classic()+
-  theme(text = element_text(size = 10, face = "bold"))
-        
-S.cons
-
-
-
-

4.3 Plotting the final GAM

-
library(ggpubr)
-ggarrange(chlA, Zn, d13C, Cd, d15N, P, S.cons, ncol = 2, nrow = 4, heights=5, widths=5)
-
-
-

4.4 Final Figure

-
-[Bosch et al. 2024]: Proxy data from the impact core fitted with a generalized additive model (GAM) and aligned with extrapolated 210Pb-dates. Bolded blue lines represent significant periods of change and shaded blue areas represent the confidence intervals. -

-Figure 4.1: [Bosch et al. 2024]: Proxy data from the impact core fitted with a generalized additive model (GAM) and aligned with extrapolated 210Pb-dates. Bolded blue lines represent significant periods of change and shaded blue areas represent the confidence intervals. -

-
- -
-
-
- -
-
-
- - -
-
- - - - - - - - - - - - - diff --git a/docs/images/Cover-photo.png b/docs/images/Cover-photo.png deleted file mode 100644 index 7c5568d..0000000 Binary files a/docs/images/Cover-photo.png and /dev/null differ diff --git a/docs/images/Dating-profiles.png b/docs/images/Dating-profiles.png deleted file mode 100644 index 074d7a2..0000000 Binary files a/docs/images/Dating-profiles.png and /dev/null differ diff --git a/docs/images/Fig1_stratigraphy.png b/docs/images/Fig1_stratigraphy.png deleted file mode 100644 index 2c24c60..0000000 Binary files a/docs/images/Fig1_stratigraphy.png and /dev/null differ diff --git a/docs/images/Fig2_ZScore.png b/docs/images/Fig2_ZScore.png deleted file mode 100644 index 0eb7ec9..0000000 Binary files a/docs/images/Fig2_ZScore.png and /dev/null differ diff --git a/docs/images/FigureS1.png b/docs/images/FigureS1.png deleted file mode 100644 index 496605f..0000000 Binary files a/docs/images/FigureS1.png and /dev/null differ diff --git a/docs/images/FigureS3.png b/docs/images/FigureS3.png deleted file mode 100644 index 9af21ba..0000000 Binary files a/docs/images/FigureS3.png and /dev/null differ diff --git a/docs/images/FigureS4.png b/docs/images/FigureS4.png deleted file mode 100644 index bd9350d..0000000 Binary files a/docs/images/FigureS4.png and /dev/null differ diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index b3c5c19..0000000 --- a/docs/index.html +++ /dev/null @@ -1,347 +0,0 @@ - - - - - - - Multi-Proxy Paleoecological Analysis Using R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
-
- - -
-
- -
- -
-

Welcome!

-

This book can be used to learn how to conduct a paleoecological analysis in R. The project methods described here are formally reviewed and cited in the following paper:

-

Bosch J, Álvarez-Manzaneda I, Smol J, Michelutti N, Robertson GJ, Wilhelm SI, Montevecchi WA. 2024 Blending census and paleolimnological data allows for tracking the establishment and growth of a major gannet colony over several centuries. Proceedings of the Royal Society B [in review].

-
-

0.1 Study Methods

-

For this study, we gathered sediment records from a pond situated 240m upwind of the northern gannet (Morus bassanus) colony in Cape St Mary’s Ecological Reserve (Newfoundland, CA) that receives seabird nutrients. We reconstructed the population trends of the gannets using multiple proxies (δ15N, chlorophyll a, phosphorus, cadmium, zinc, ornithogenic diatoms) related to seabird nutrient inputs into freshwater catchments. By aligning shifts in seabird-related proxies to historical census data, we reveal how paleo-reconstructions can accurately follow known population counts.

-
-
-

0.2 Study Site Description

-

Samples were taken from Cape St. Mary’s Ecological Reserve, in Newfoundland. The main nesting site within the Reserve is named Bird Rock. A review of the paleolimnological process at play are shown in the graphical abstract below. Two sediment cores were obtained for the study, one from the impacted pond (ID: CSM-IMP-2) ~240 m away from the colony, and another from a reference pond (study control, ID: CSM-REF-3) more than 1 km away from the colony.

-
-[Bosch et al. 2024]: Seabird nutrient transfer from Bird Rock, in Cape St. Mary’s Ecological Reserve (Newfoundland) to a pond nearby the seabird colony. Seen in the illustration are northern gannets (Morus bassanus) and black-legged kittiwakes (Rissa tridactyla), which both nest within the Reserve on an annual basis. -

-Figure 0.1: [Bosch et al. 2024]: Seabird nutrient transfer from Bird Rock, in Cape St. Mary’s Ecological Reserve (Newfoundland) to a pond nearby the seabird colony. Seen in the illustration are northern gannets (Morus bassanus) and black-legged kittiwakes (Rissa tridactyla), which both nest within the Reserve on an annual basis. -

-
-
-[Bosch et al. 2024]: Map of sampling locations relative to Bird Rock -

-Figure 0.2: [Bosch et al. 2024]: Map of sampling locations relative to Bird Rock -

-
-
-
-

0.3 Resources

-
-

0.3.1 Download data

-

Download some of the example data from my github repo - Paleo_Analysis_Using_R

-
-
-

0.3.2 Install packages

-

Install all of the packages used in this analysis:

-

REQUIRED:

- -

Note that installation may differ depending on the type of operating system you’re using.

-
# to install the tidy packages on Ubuntu, start by opening your terminal and installing Libcurl and Vegan
-
-sudo apt-get install -y libxml2-dev libcurl4-openssl-dev libssl-dev libv8-dev
-sudo apt-get install -y r-cran-vegan 
- -
-
-
-
- -
-
-
- - -
-
- - - - - - - - - - - - - diff --git a/docs/libs/anchor-sections-1.1.0/anchor-sections-hash.css b/docs/libs/anchor-sections-1.1.0/anchor-sections-hash.css deleted file mode 100644 index b563ec9..0000000 --- a/docs/libs/anchor-sections-1.1.0/anchor-sections-hash.css +++ /dev/null @@ -1,2 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section::before {content: '#';font-size: 80%;} diff --git a/docs/libs/anchor-sections-1.1.0/anchor-sections.css b/docs/libs/anchor-sections-1.1.0/anchor-sections.css deleted file mode 100644 index 041905f..0000000 --- a/docs/libs/anchor-sections-1.1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -.hasAnchor:hover a.anchor-section {visibility: visible;} -ul > li > .anchor-section {display: none;} diff --git a/docs/libs/anchor-sections-1.1.0/anchor-sections.js b/docs/libs/anchor-sections-1.1.0/anchor-sections.js deleted file mode 100644 index fee005d..0000000 --- a/docs/libs/anchor-sections-1.1.0/anchor-sections.js +++ /dev/null @@ -1,11 +0,0 @@ -document.addEventListener('DOMContentLoaded', function () { - // If section divs is used, we need to put the anchor in the child header - const headers = document.querySelectorAll("div.hasAnchor.section[class*='level'] > :first-child") - - headers.forEach(function (x) { - // Add to the header node - if (!x.classList.contains('hasAnchor')) x.classList.add('hasAnchor') - // Remove from the section or div created by Pandoc - x.parentElement.classList.remove('hasAnchor') - }) -}) diff --git a/docs/libs/gitbook-2.6.7/css/fontawesome/fontawesome-webfont.ttf b/docs/libs/gitbook-2.6.7/css/fontawesome/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2..0000000 Binary files a/docs/libs/gitbook-2.6.7/css/fontawesome/fontawesome-webfont.ttf and /dev/null differ diff --git a/docs/libs/gitbook-2.6.7/css/plugin-bookdown.css b/docs/libs/gitbook-2.6.7/css/plugin-bookdown.css deleted file mode 100644 index ab7c20e..0000000 --- a/docs/libs/gitbook-2.6.7/css/plugin-bookdown.css +++ /dev/null @@ -1,105 +0,0 @@ -.book .book-header h1 { - padding-left: 20px; - padding-right: 20px; -} -.book .book-header.fixed { - position: fixed; - right: 0; - top: 0; - left: 0; - border-bottom: 1px solid rgba(0,0,0,.07); -} -span.search-highlight { - background-color: #ffff88; -} -@media (min-width: 600px) { - .book.with-summary .book-header.fixed { - left: 300px; - } -} -@media (max-width: 1240px) { - .book .book-body.fixed { - top: 50px; - } - .book .book-body.fixed .body-inner { - top: auto; - } -} -@media (max-width: 600px) { - .book.with-summary .book-header.fixed { - left: calc(100% - 60px); - min-width: 300px; - } - .book.with-summary .book-body { - transform: none; - left: calc(100% - 60px); - min-width: 300px; - } - .book .book-body.fixed { - top: 0; - } -} - -.book .book-body.fixed .body-inner { - top: 50px; -} -.book .book-body .page-wrapper .page-inner section.normal sub, .book .book-body .page-wrapper .page-inner section.normal sup { - font-size: 85%; -} - -@media print { - .book .book-summary, .book .book-body .book-header, .fa { - display: none !important; - } - .book .book-body.fixed { - left: 0px; - } - .book .book-body,.book .book-body .body-inner, .book.with-summary { - overflow: visible !important; - } -} -.kable_wrapper { - border-spacing: 20px 0; - border-collapse: separate; - border: none; - margin: auto; -} -.kable_wrapper > tbody > tr > td { - vertical-align: top; -} -.book .book-body .page-wrapper .page-inner section.normal table tr.header { - border-top-width: 2px; -} -.book .book-body .page-wrapper .page-inner section.normal table tr:last-child td { - border-bottom-width: 2px; -} -.book .book-body .page-wrapper .page-inner section.normal table td, .book .book-body .page-wrapper .page-inner section.normal table th { - border-left: none; - border-right: none; -} -.book .book-body .page-wrapper .page-inner section.normal table.kable_wrapper > tbody > tr, .book .book-body .page-wrapper .page-inner section.normal table.kable_wrapper > tbody > tr > td { - border-top: none; -} -.book .book-body .page-wrapper .page-inner section.normal table.kable_wrapper > tbody > tr:last-child > td { - border-bottom: none; -} - -div.theorem, div.lemma, div.corollary, div.proposition, div.conjecture { - font-style: italic; -} -span.theorem, span.lemma, span.corollary, span.proposition, span.conjecture { - font-style: normal; -} -div.proof>*:last-child:after { - content: "\25a2"; - float: right; -} -.header-section-number { - padding-right: .5em; -} -#header .multi-author { - margin: 0.5em 0 -0.5em 0; -} -#header .date { - margin-top: 1.5em; -} diff --git a/docs/libs/gitbook-2.6.7/css/plugin-clipboard.css b/docs/libs/gitbook-2.6.7/css/plugin-clipboard.css deleted file mode 100644 index 6844a70..0000000 --- a/docs/libs/gitbook-2.6.7/css/plugin-clipboard.css +++ /dev/null @@ -1,18 +0,0 @@ -div.sourceCode { - position: relative; -} - -.copy-to-clipboard-button { - position: absolute; - right: 0; - top: 0; - visibility: hidden; -} - -.copy-to-clipboard-button:focus { - outline: 0; -} - -div.sourceCode:hover > .copy-to-clipboard-button { - visibility: visible; -} diff --git a/docs/libs/gitbook-2.6.7/css/plugin-fontsettings.css b/docs/libs/gitbook-2.6.7/css/plugin-fontsettings.css deleted file mode 100644 index 3fa6f35..0000000 --- a/docs/libs/gitbook-2.6.7/css/plugin-fontsettings.css +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Theme 1 - */ -.color-theme-1 .dropdown-menu { - background-color: #111111; - border-color: #7e888b; -} -.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner { - border-bottom: 9px solid #111111; -} -.color-theme-1 .dropdown-menu .buttons { - border-color: #7e888b; -} -.color-theme-1 .dropdown-menu .button { - color: #afa790; -} -.color-theme-1 .dropdown-menu .button:hover { - color: #73553c; -} -/* - * Theme 2 - */ -.color-theme-2 .dropdown-menu { - background-color: #2d3143; - border-color: #272a3a; -} -.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner { - border-bottom: 9px solid #2d3143; -} -.color-theme-2 .dropdown-menu .buttons { - border-color: #272a3a; -} -.color-theme-2 .dropdown-menu .button { - color: #62677f; -} -.color-theme-2 .dropdown-menu .button:hover { - color: #f4f4f5; -} -.book .book-header .font-settings .font-enlarge { - line-height: 30px; - font-size: 1.4em; -} -.book .book-header .font-settings .font-reduce { - line-height: 30px; - font-size: 1em; -} - -/* sidebar transition background */ -div.book.color-theme-1 { - background: #f3eacb; -} -.book.color-theme-1 .book-body { - color: #704214; - background: #f3eacb; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section { - background: #f3eacb; -} - -/* sidebar transition background */ -div.book.color-theme-2 { - background: #1c1f2b; -} - -.book.color-theme-2 .book-body { - color: #bdcadb; - background: #1c1f2b; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section { - background: #1c1f2b; -} -.book.font-size-0 .book-body .page-inner section { - font-size: 1.2rem; -} -.book.font-size-1 .book-body .page-inner section { - font-size: 1.4rem; -} -.book.font-size-2 .book-body .page-inner section { - font-size: 1.6rem; -} -.book.font-size-3 .book-body .page-inner section { - font-size: 2.2rem; -} -.book.font-size-4 .book-body .page-inner section { - font-size: 4rem; -} -.book.font-family-0 { - font-family: Georgia, serif; -} -.book.font-family-1 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal { - color: #704214; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a { - color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { - color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 { - border-color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { - color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr { - background-color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote { - border-color: #c4b29f; - opacity: 0.9; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { - background: #fdf6e3; - color: #657b83; - border-color: #f8df9c; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight { - background-color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td { - border-color: #f5d06c; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr { - color: inherit; - background-color: #fdf6e3; - border-color: #444444; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { - background-color: #fbeecb; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal { - color: #bdcadb; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a { - color: #3eb1d0; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { - color: #fffffa; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 { - border-color: #373b4e; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { - color: #373b4e; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr { - background-color: #373b4e; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote { - border-color: #373b4e; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { - color: #9dbed8; - background: #2d3143; - border-color: #2d3143; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight { - background-color: #282a39; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td { - border-color: #3b3f54; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr { - color: #b6c2d2; - background-color: #2d3143; - border-color: #3b3f54; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { - background-color: #35394b; -} -.book.color-theme-1 .book-header { - color: #afa790; - background: transparent; -} -.book.color-theme-1 .book-header .btn { - color: #afa790; -} -.book.color-theme-1 .book-header .btn:hover { - color: #73553c; - background: none; -} -.book.color-theme-1 .book-header h1 { - color: #704214; -} -.book.color-theme-2 .book-header { - color: #7e888b; - background: transparent; -} -.book.color-theme-2 .book-header .btn { - color: #3b3f54; -} -.book.color-theme-2 .book-header .btn:hover { - color: #fffff5; - background: none; -} -.book.color-theme-2 .book-header h1 { - color: #bdcadb; -} -.book.color-theme-1 .book-body .navigation { - color: #afa790; -} -.book.color-theme-1 .book-body .navigation:hover { - color: #73553c; -} -.book.color-theme-2 .book-body .navigation { - color: #383f52; -} -.book.color-theme-2 .book-body .navigation:hover { - color: #fffff5; -} -/* - * Theme 1 - */ -.book.color-theme-1 .book-summary { - color: #afa790; - background: #111111; - border-right: 1px solid rgba(0, 0, 0, 0.07); -} -.book.color-theme-1 .book-summary .book-search { - background: transparent; -} -.book.color-theme-1 .book-summary .book-search input, -.book.color-theme-1 .book-summary .book-search input:focus { - border: 1px solid transparent; -} -.book.color-theme-1 .book-summary ul.summary li.divider { - background: #7e888b; - box-shadow: none; -} -.book.color-theme-1 .book-summary ul.summary li i.fa-check { - color: #33cc33; -} -.book.color-theme-1 .book-summary ul.summary li.done > a { - color: #877f6a; -} -.book.color-theme-1 .book-summary ul.summary li a, -.book.color-theme-1 .book-summary ul.summary li span { - color: #877f6a; - background: transparent; - font-weight: normal; -} -.book.color-theme-1 .book-summary ul.summary li.active > a, -.book.color-theme-1 .book-summary ul.summary li a:hover { - color: #704214; - background: transparent; - font-weight: normal; -} -/* - * Theme 2 - */ -.book.color-theme-2 .book-summary { - color: #bcc1d2; - background: #2d3143; - border-right: none; -} -.book.color-theme-2 .book-summary .book-search { - background: transparent; -} -.book.color-theme-2 .book-summary .book-search input, -.book.color-theme-2 .book-summary .book-search input:focus { - border: 1px solid transparent; -} -.book.color-theme-2 .book-summary ul.summary li.divider { - background: #272a3a; - box-shadow: none; -} -.book.color-theme-2 .book-summary ul.summary li i.fa-check { - color: #33cc33; -} -.book.color-theme-2 .book-summary ul.summary li.done > a { - color: #62687f; -} -.book.color-theme-2 .book-summary ul.summary li a, -.book.color-theme-2 .book-summary ul.summary li span { - color: #c1c6d7; - background: transparent; - font-weight: 600; -} -.book.color-theme-2 .book-summary ul.summary li.active > a, -.book.color-theme-2 .book-summary ul.summary li a:hover { - color: #f4f4f5; - background: #252737; - font-weight: 600; -} diff --git a/docs/libs/gitbook-2.6.7/css/plugin-highlight.css b/docs/libs/gitbook-2.6.7/css/plugin-highlight.css deleted file mode 100644 index 2aabd3d..0000000 --- a/docs/libs/gitbook-2.6.7/css/plugin-highlight.css +++ /dev/null @@ -1,426 +0,0 @@ -.book .book-body .page-wrapper .page-inner section.normal pre, -.book .book-body .page-wrapper .page-inner section.normal code { - /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - /* Tomorrow Comment */ - /* Tomorrow Red */ - /* Tomorrow Orange */ - /* Tomorrow Yellow */ - /* Tomorrow Green */ - /* Tomorrow Aqua */ - /* Tomorrow Blue */ - /* Tomorrow Purple */ -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-comment, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-title { - color: #8e908c; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-tag, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, -.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, -.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, -.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, -.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, -.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, -.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, -.book .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, -.book .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, -.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, -.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, -.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, -.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, -.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, -.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { - color: #c82829; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-number, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-number, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-params, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-params, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-constant { - color: #f5871f; -} -.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, -.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { - color: #eab700; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-string, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-string, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-value, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-value, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-header, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-header, -.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, -.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, -.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, -.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { - color: #718c00; -} -.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, -.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { - color: #3e999f; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-function, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-function, -.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, -.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, -.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, -.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, -.book .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, -.book .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, -.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { - color: #4271ae; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, -.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, -.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { - color: #8959a8; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs, -.book .book-body .page-wrapper .page-inner section.normal code .hljs { - display: block; - background: white; - color: #4d4d4c; - padding: 0.5em; -} -.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, -.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, -.book .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, -.book .book-body .page-wrapper .page-inner section.normal code .javascript .xml, -.book .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, -.book .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, -.book .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, -.book .book-body .page-wrapper .page-inner section.normal code .xml .javascript, -.book .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, -.book .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, -.book .book-body .page-wrapper .page-inner section.normal pre .xml .css, -.book .book-body .page-wrapper .page-inner section.normal code .xml .css, -.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, -.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { - opacity: 0.5; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { - /* - -Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull - -*/ - /* Solarized Green */ - /* Solarized Cyan */ - /* Solarized Blue */ - /* Solarized Yellow */ - /* Solarized Orange */ - /* Solarized Red */ - /* Solarized Violet */ -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs { - display: block; - padding: 0.5em; - background: #fdf6e3; - color: #657b83; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template_comment, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template_comment, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-header, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-header, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctype, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctype, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pi, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pi, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-javadoc, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-javadoc { - color: #93a1a1; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-winutils, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-winutils, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .method, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .method, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-tag, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-tag, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-request, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-request, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-status, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-status, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .nginx .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .nginx .hljs-title { - color: #859900; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-command, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-command, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag .hljs-value, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag .hljs-value, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-rules .hljs-value, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-rules .hljs-value, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-phpdoc, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-phpdoc, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-hexcolor, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-hexcolor, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_url, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_url { - color: #2aa198; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-localvars, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-localvars, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-chunk, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-chunk, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-decorator, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-decorator, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-identifier, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-identifier, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .vhdl .hljs-literal, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .vhdl .hljs-literal, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-id, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-id, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-function, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-function { - color: #268bd2; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-body, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-body, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .smalltalk .hljs-number, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .smalltalk .hljs-number, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-constant, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-parent, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-parent, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .haskell .hljs-type, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .haskell .hljs-type, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_reference, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_reference { - color: #b58900; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor .hljs-keyword, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor .hljs-keyword, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-shebang, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-shebang, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol .hljs-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol .hljs-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-change, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-change, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-special, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-special, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr_selector, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr_selector, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-cdata, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-cdata, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .clojure .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .clojure .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-header { - color: #cb4b16; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-important, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-important { - color: #dc322f; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_label, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_label { - color: #6c71c4; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula { - background: #eee8d5; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { - /* Tomorrow Night Bright Theme */ - /* Original theme - https://github.com/chriskempson/tomorrow-theme */ - /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - /* Tomorrow Comment */ - /* Tomorrow Red */ - /* Tomorrow Orange */ - /* Tomorrow Yellow */ - /* Tomorrow Green */ - /* Tomorrow Aqua */ - /* Tomorrow Blue */ - /* Tomorrow Purple */ -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title { - color: #969896; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { - color: #d54e53; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-constant { - color: #e78c45; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { - color: #e7c547; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-value, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-value, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-header, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { - color: #b9ca4a; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { - color: #70c0b1; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-function, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-function, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { - color: #7aa6da; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { - color: #c397d8; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs { - display: block; - background: black; - color: #eaeaea; - padding: 0.5em; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .xml, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .javascript, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .css, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .css, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { - opacity: 0.5; -} diff --git a/docs/libs/gitbook-2.6.7/css/plugin-search.css b/docs/libs/gitbook-2.6.7/css/plugin-search.css deleted file mode 100644 index c85e557..0000000 --- a/docs/libs/gitbook-2.6.7/css/plugin-search.css +++ /dev/null @@ -1,31 +0,0 @@ -.book .book-summary .book-search { - padding: 6px; - background: transparent; - position: absolute; - top: -50px; - left: 0px; - right: 0px; - transition: top 0.5s ease; -} -.book .book-summary .book-search input, -.book .book-summary .book-search input:focus, -.book .book-summary .book-search input:hover { - width: 100%; - background: transparent; - border: 1px solid #ccc; - box-shadow: none; - outline: none; - line-height: 22px; - padding: 7px 4px; - color: inherit; - box-sizing: border-box; -} -.book.with-search .book-summary .book-search { - top: 0px; -} -.book.with-search .book-summary ul.summary { - top: 50px; -} -.with-search .summary li[data-level] a[href*=".html#"] { - display: none; -} diff --git a/docs/libs/gitbook-2.6.7/css/plugin-table.css b/docs/libs/gitbook-2.6.7/css/plugin-table.css deleted file mode 100644 index 7fba1b9..0000000 --- a/docs/libs/gitbook-2.6.7/css/plugin-table.css +++ /dev/null @@ -1 +0,0 @@ -.book .book-body .page-wrapper .page-inner section.normal table{display:table;width:100%;border-collapse:collapse;border-spacing:0;overflow:auto}.book .book-body .page-wrapper .page-inner section.normal table td,.book .book-body .page-wrapper .page-inner section.normal table th{padding:6px 13px;border:1px solid #ddd}.book .book-body .page-wrapper .page-inner section.normal table tr{background-color:#fff;border-top:1px solid #ccc}.book .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n){background-color:#f8f8f8}.book .book-body .page-wrapper .page-inner section.normal table th{font-weight:700} diff --git a/docs/libs/gitbook-2.6.7/css/style.css b/docs/libs/gitbook-2.6.7/css/style.css deleted file mode 100644 index cba69b2..0000000 --- a/docs/libs/gitbook-2.6.7/css/style.css +++ /dev/null @@ -1,13 +0,0 @@ -/*! normalize.css v2.1.0 | MIT License | git.io/normalize */img,legend{border:0}*{-webkit-font-smoothing:antialiased}sub,sup{position:relative}.book .book-body .page-wrapper .page-inner section.normal hr:after,.book-langs-index .inner .languages:after,.buttons:after,.dropdown-menu .buttons:after{clear:both}body,html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}.hidden,[hidden]{display:none}audio:not([controls]){display:none;height:0}html{font-family:sans-serif}body,figure{margin:0}a:focus{outline:dotted thin}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button{margin-right:10px;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}/*! - * Preboot v2 - * - * Open sourced under MIT license by @mdo. - * Some variables and mixins from Bootstrap (Apache 2 license). - */.link-inherit,.link-inherit:focus,.link-inherit:hover{color:inherit}/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('./fontawesome/fontawesome-webfont.ttf?v=4.7.0') format('truetype');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} -.book .book-header,.book .book-summary{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.book-langs-index{width:100%;height:100%;padding:40px 0;margin:0;overflow:auto}@media (max-width:600px){.book-langs-index{padding:0}}.book-langs-index .inner{max-width:600px;width:100%;margin:0 auto;padding:30px;background:#fff;border-radius:3px}.book-langs-index .inner h3{margin:0}.book-langs-index .inner .languages{list-style:none;padding:20px 30px;margin-top:20px;border-top:1px solid #eee}.book-langs-index .inner .languages:after,.book-langs-index .inner .languages:before{content:" ";display:table;line-height:0}.book-langs-index .inner .languages li{width:50%;float:left;padding:10px 5px;font-size:16px}@media (max-width:600px){.book-langs-index .inner .languages li{width:100%;max-width:100%}}.book .book-header{overflow:visible;height:50px;padding:0 8px;z-index:2;font-size:.85em;color:#7e888b;background:0 0}.book .book-header .btn{display:block;height:50px;padding:0 15px;border-bottom:none;color:#ccc;text-transform:uppercase;line-height:50px;-webkit-box-shadow:none!important;box-shadow:none!important;position:relative;font-size:14px}.book .book-header .btn:hover{position:relative;text-decoration:none;color:#444;background:0 0}.book .book-header h1{margin:0;font-size:20px;font-weight:200;text-align:center;line-height:50px;opacity:0;padding-left:200px;padding-right:200px;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.book .book-header h1 a,.book .book-header h1 a:hover{color:inherit;text-decoration:none}@media (max-width:1000px){.book .book-header h1{display:none}}.book .book-header h1 i{display:none}.book .book-header:hover h1{opacity:1}.book.is-loading .book-header h1 i{display:inline-block}.book.is-loading .book-header h1 a{display:none}.dropdown{position:relative}.dropdown-menu{position:absolute;top:100%;left:0;z-index:100;display:none;float:left;min-width:160px;padding:0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fafafa;border:1px solid rgba(0,0,0,.07);border-radius:1px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.open{display:block}.dropdown-menu.dropdown-left{left:auto;right:4%}.dropdown-menu.dropdown-left .dropdown-caret{right:14px;left:auto}.dropdown-menu .dropdown-caret{position:absolute;top:-8px;left:14px;width:18px;height:10px;float:left;overflow:hidden}.dropdown-menu .dropdown-caret .caret-inner,.dropdown-menu .dropdown-caret .caret-outer{display:inline-block;top:0;border-left:9px solid transparent;border-right:9px solid transparent;position:absolute}.dropdown-menu .dropdown-caret .caret-outer{border-bottom:9px solid rgba(0,0,0,.1);height:auto;left:0;width:auto;margin-left:-1px}.dropdown-menu .dropdown-caret .caret-inner{margin-top:-1px;top:1px;border-bottom:9px solid #fafafa}.dropdown-menu .buttons{border-bottom:1px solid rgba(0,0,0,.07)}.dropdown-menu .buttons:after,.dropdown-menu .buttons:before{content:" ";display:table;line-height:0}.dropdown-menu .buttons:last-child{border-bottom:none}.dropdown-menu .buttons .button{border:0;background-color:transparent;color:#a6a6a6;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.alert,.dropdown-menu .buttons .button:hover{color:#444}.dropdown-menu .buttons .button:focus,.dropdown-menu .buttons .button:hover{outline:0}.dropdown-menu .buttons .button.size-2{width:50%}.dropdown-menu .buttons .button.size-3{width:33%}.alert{padding:15px;margin-bottom:20px;background:#eee;border-bottom:5px solid #ddd}.alert-success{background:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-info{background:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-danger{background:#f2dede;border-color:#ebccd1;color:#a94442}.alert-warning{background:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.book .book-summary{position:absolute;top:0;left:-300px;bottom:0;z-index:1;width:300px;color:#364149;background:#fafafa;border-right:1px solid rgba(0,0,0,.07);-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book .book-summary ul.summary{position:absolute;top:0;left:0;right:0;bottom:0;overflow-y:auto;list-style:none;margin:0;padding:0;-webkit-transition:top .5s ease;-moz-transition:top .5s ease;-o-transition:top .5s ease;transition:top .5s ease}.book .book-summary ul.summary li{list-style:none}.book .book-summary ul.summary li.divider{height:1px;margin:7px 0;overflow:hidden;background:rgba(0,0,0,.07)}.book .book-summary ul.summary li i.fa-check{display:none;position:absolute;right:9px;top:16px;font-size:9px;color:#3c3}.book .book-summary ul.summary li.done>a{color:#364149;font-weight:400}.book .book-summary ul.summary li.done>a i{display:inline}.book .book-summary ul.summary li a,.book .book-summary ul.summary li span{display:block;padding:10px 15px;border-bottom:none;color:#364149;background:0 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}.book .book-summary ul.summary li span{cursor:not-allowed;opacity:.3;filter:alpha(opacity=30)}.book .book-summary ul.summary li a:hover,.book .book-summary ul.summary li.active>a{color:#008cff;background:0 0;text-decoration:none}.book .book-summary ul.summary li ul{padding-left:20px}@media (max-width:600px){.book .book-summary{width:calc(100% - 60px);bottom:0;left:-100%}}.book.with-summary .book-summary{left:0}.book.without-animation .book-summary{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.book{position:relative;width:100%;height:100%}.book .book-body,.book .book-body .body-inner{position:absolute;top:0;left:0;overflow-y:auto;bottom:0;right:0}.book .book-body{color:#000;background:#fff;-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book .book-body .page-wrapper{position:relative;outline:0}.book .book-body .page-wrapper .page-inner{max-width:800px;margin:0 auto;padding:20px 0 40px}.book .book-body .page-wrapper .page-inner section{margin:0;padding:5px 15px;background:#fff;border-radius:2px;line-height:1.7;font-size:1.6rem}.book .book-body .page-wrapper .page-inner .btn-group .btn{border-radius:0;background:#eee;border:0}@media (max-width:1240px){.book .book-body{-webkit-transition:-webkit-transform 250ms ease;-moz-transition:-moz-transform 250ms ease;-o-transition:-o-transform 250ms ease;transition:transform 250ms ease;padding-bottom:20px}.book .book-body .body-inner{position:static;min-height:calc(100% - 50px)}}@media (min-width:600px){.book.with-summary .book-body{left:300px}}@media (max-width:600px){.book.with-summary{overflow:hidden}.book.with-summary .book-body{-webkit-transform:translate(calc(100% - 60px),0);-moz-transform:translate(calc(100% - 60px),0);-ms-transform:translate(calc(100% - 60px),0);-o-transform:translate(calc(100% - 60px),0);transform:translate(calc(100% - 60px),0)}}.book.without-animation .book-body{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.buttons:after,.buttons:before{content:" ";display:table;line-height:0}.button{border:0;background:#eee;color:#666;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.button:hover{color:#444}.button:focus,.button:hover{outline:0}.button.size-2{width:50%}.button.size-3{width:33%}.book .book-body .page-wrapper .page-inner section{display:none}.book .book-body .page-wrapper .page-inner section.normal{display:block;word-wrap:break-word;overflow:hidden;color:#333;line-height:1.7;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}.book .book-body .page-wrapper .page-inner section.normal *{box-sizing:border-box;-webkit-box-sizing:border-box;}.book .book-body .page-wrapper .page-inner section.normal>:first-child{margin-top:0!important}.book .book-body .page-wrapper .page-inner section.normal>:last-child{margin-bottom:0!important}.book .book-body .page-wrapper .page-inner section.normal blockquote,.book .book-body .page-wrapper .page-inner section.normal code,.book .book-body .page-wrapper .page-inner section.normal figure,.book .book-body .page-wrapper .page-inner section.normal img,.book .book-body .page-wrapper .page-inner section.normal pre,.book .book-body .page-wrapper .page-inner section.normal table,.book .book-body .page-wrapper .page-inner section.normal tr{page-break-inside:avoid}.book .book-body .page-wrapper .page-inner section.normal h2,.book .book-body .page-wrapper .page-inner section.normal h3,.book .book-body .page-wrapper .page-inner section.normal h4,.book .book-body .page-wrapper .page-inner section.normal h5,.book .book-body .page-wrapper .page-inner section.normal p{orphans:3;widows:3}.book .book-body .page-wrapper .page-inner section.normal h1,.book .book-body .page-wrapper .page-inner section.normal h2,.book .book-body .page-wrapper .page-inner section.normal h3,.book .book-body .page-wrapper .page-inner section.normal h4,.book .book-body .page-wrapper .page-inner section.normal h5{page-break-after:avoid}.book .book-body .page-wrapper .page-inner section.normal b,.book .book-body .page-wrapper .page-inner section.normal strong{font-weight:700}.book .book-body .page-wrapper .page-inner section.normal em{font-style:italic}.book .book-body .page-wrapper .page-inner section.normal blockquote,.book .book-body .page-wrapper .page-inner section.normal dl,.book .book-body .page-wrapper .page-inner section.normal ol,.book .book-body .page-wrapper .page-inner section.normal p,.book .book-body .page-wrapper .page-inner section.normal table,.book .book-body .page-wrapper .page-inner section.normal ul{margin-top:0;margin-bottom:.85em}.book .book-body .page-wrapper .page-inner section.normal a{color:#4183c4;text-decoration:none;background:0 0}.book .book-body .page-wrapper .page-inner section.normal a:active,.book .book-body .page-wrapper .page-inner section.normal a:focus,.book .book-body .page-wrapper .page-inner section.normal a:hover{outline:0;text-decoration:underline}.book .book-body .page-wrapper .page-inner section.normal img{border:0;max-width:100%}.book .book-body .page-wrapper .page-inner section.normal hr{height:4px;padding:0;margin:1.7em 0;overflow:hidden;background-color:#e7e7e7;border:none}.book .book-body .page-wrapper .page-inner section.normal hr:after,.book .book-body .page-wrapper .page-inner section.normal hr:before{display:table;content:" "}.book .book-body .page-wrapper .page-inner section.normal h1,.book .book-body .page-wrapper .page-inner section.normal h2,.book .book-body .page-wrapper .page-inner section.normal h3,.book .book-body .page-wrapper .page-inner section.normal h4,.book .book-body .page-wrapper .page-inner section.normal h5,.book .book-body .page-wrapper .page-inner section.normal h6{margin-top:1.275em;margin-bottom:.85em;}.book .book-body .page-wrapper .page-inner section.normal h1{font-size:2em}.book .book-body .page-wrapper .page-inner section.normal h2{font-size:1.75em}.book .book-body .page-wrapper .page-inner section.normal h3{font-size:1.5em}.book .book-body .page-wrapper .page-inner section.normal h4{font-size:1.25em}.book .book-body .page-wrapper .page-inner section.normal h5{font-size:1em}.book .book-body .page-wrapper .page-inner section.normal h6{font-size:1em;color:#777}.book .book-body .page-wrapper .page-inner section.normal code,.book .book-body .page-wrapper .page-inner section.normal pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;direction:ltr;border:none;color:inherit}.book .book-body .page-wrapper .page-inner section.normal pre{overflow:auto;word-wrap:normal;margin:0 0 1.275em;padding:.85em 1em;background:#f7f7f7}.book .book-body .page-wrapper .page-inner section.normal pre>code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;font-size:.85em;white-space:pre;background:0 0}.book .book-body .page-wrapper .page-inner section.normal pre>code:after,.book .book-body .page-wrapper .page-inner section.normal pre>code:before{content:normal}.book .book-body .page-wrapper .page-inner section.normal code{padding:.2em;margin:0;font-size:.85em;background-color:#f7f7f7}.book .book-body .page-wrapper .page-inner section.normal code:after,.book .book-body .page-wrapper .page-inner section.normal code:before{letter-spacing:-.2em;content:"\00a0"}.book .book-body .page-wrapper .page-inner section.normal ol,.book .book-body .page-wrapper .page-inner section.normal ul{padding:0 0 0 2em;margin:0 0 .85em}.book .book-body .page-wrapper .page-inner section.normal ol ol,.book .book-body .page-wrapper .page-inner section.normal ol ul,.book .book-body .page-wrapper .page-inner section.normal ul ol,.book .book-body .page-wrapper .page-inner section.normal ul ul{margin-top:0;margin-bottom:0}.book .book-body .page-wrapper .page-inner section.normal ol ol{list-style-type:lower-roman}.book .book-body .page-wrapper .page-inner section.normal blockquote{margin:0 0 .85em;padding:0 15px;opacity:0.75;border-left:4px solid #dcdcdc}.book .book-body .page-wrapper .page-inner section.normal blockquote:first-child{margin-top:0}.book .book-body .page-wrapper .page-inner section.normal blockquote:last-child{margin-bottom:0}.book .book-body .page-wrapper .page-inner section.normal dl{padding:0}.book .book-body .page-wrapper .page-inner section.normal dl dt{padding:0;margin-top:.85em;font-style:italic;font-weight:700}.book .book-body .page-wrapper .page-inner section.normal dl dd{padding:0 .85em;margin-bottom:.85em}.book .book-body .page-wrapper .page-inner section.normal dd{margin-left:0}.book .book-body .page-wrapper .page-inner section.normal .glossary-term{cursor:help;text-decoration:underline}.book .book-body .navigation{position:absolute;top:50px;bottom:0;margin:0;max-width:150px;min-width:90px;display:flex;justify-content:center;align-content:center;flex-direction:column;font-size:40px;color:#ccc;text-align:center;-webkit-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;transition:all 350ms ease}.book .book-body .navigation:hover{text-decoration:none;color:#444}.book .book-body .navigation.navigation-next{right:0}.book .book-body .navigation.navigation-prev{left:0}@media (max-width:1240px){.book .book-body .navigation{position:static;top:auto;max-width:50%;width:50%;display:inline-block;float:left}.book .book-body .navigation.navigation-unique{max-width:100%;width:100%}}.book .book-body .page-wrapper .page-inner section.glossary{margin-bottom:40px}.book .book-body .page-wrapper .page-inner section.glossary h2 a,.book .book-body .page-wrapper .page-inner section.glossary h2 a:hover{color:inherit;text-decoration:none}.book .book-body .page-wrapper .page-inner section.glossary .glossary-index{list-style:none;margin:0;padding:0}.book .book-body .page-wrapper .page-inner section.glossary .glossary-index li{display:inline;margin:0 8px;white-space:nowrap}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-overflow-scrolling:auto;-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:none;-webkit-touch-callout:none}a{text-decoration:none}body,html{height:100%}html{font-size:62.5%}body{text-rendering:optimizeLegibility;font-smoothing:antialiased;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:.2px;text-size-adjust:100%} -.book .book-summary ul.summary li a span {display:inline;padding:initial;overflow:visible;cursor:auto;opacity:1;} -/* show arrow before summary tag as in bootstrap */ -details > summary {display:list-item;cursor:pointer;} diff --git a/docs/libs/gitbook-2.6.7/js/app.min.js b/docs/libs/gitbook-2.6.7/js/app.min.js deleted file mode 100644 index 643f1f9..0000000 --- a/docs/libs/gitbook-2.6.7/js/app.min.js +++ /dev/null @@ -1 +0,0 @@ -(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"'`]/g,reHasEscapedHtml=RegExp(reEscapedHtml.source),reHasUnescapedHtml=RegExp(reUnescapedHtml.source);var reEscape=/<%-([\s\S]+?)%>/g,reEvaluate=/<%([\s\S]+?)%>/g,reInterpolate=/<%=([\s\S]+?)%>/g;var reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/,rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;var reRegExpChars=/^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,reHasRegExpChars=RegExp(reRegExpChars.source);var reComboMark=/[\u0300-\u036f\ufe20-\ufe23]/g;var reEscapeChar=/\\(\\)?/g;var reEsTemplate=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;var reFlags=/\w*$/;var reHasHexPrefix=/^0[xX]/;var reIsHostCtor=/^\[object .+?Constructor\]$/;var reIsUint=/^\d+$/;var reLatin1=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;var reNoMatch=/($^)/;var reUnescapedString=/['\n\r\u2028\u2029\\]/g;var reWords=function(){var upper="[A-Z\\xc0-\\xd6\\xd8-\\xde]",lower="[a-z\\xdf-\\xf6\\xf8-\\xff]+";return RegExp(upper+"+(?="+upper+lower+")|"+upper+"?"+lower+"|"+upper+"+|[0-9]+","g")}();var contextProps=["Array","ArrayBuffer","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Math","Number","Object","RegExp","Set","String","_","clearTimeout","isFinite","parseFloat","parseInt","setTimeout","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap"];var templateCounter=-1;var typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=true;typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=false;var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[stringTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=true;cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[mapTag]=cloneableTags[setTag]=cloneableTags[weakMapTag]=false;var deburredLetters={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"};var htmlEscapes={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"};var htmlUnescapes={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"};var objectTypes={function:true,object:true};var regexpEscapes={0:"x30",1:"x31",2:"x32",3:"x33",4:"x34",5:"x35",6:"x36",7:"x37",8:"x38",9:"x39",A:"x41",B:"x42",C:"x43",D:"x44",E:"x45",F:"x46",a:"x61",b:"x62",c:"x63",d:"x64",e:"x65",f:"x66",n:"x6e",r:"x72",t:"x74",u:"x75",v:"x76",x:"x78"};var stringEscapes={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"};var freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports;var freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module;var freeGlobal=freeExports&&freeModule&&typeof global=="object"&&global&&global.Object&&global;var freeSelf=objectTypes[typeof self]&&self&&self.Object&&self;var freeWindow=objectTypes[typeof window]&&window&&window.Object&&window;var moduleExports=freeModule&&freeModule.exports===freeExports&&freeExports;var root=freeGlobal||freeWindow!==(this&&this.window)&&freeWindow||freeSelf||this;function baseCompareAscending(value,other){if(value!==other){var valIsNull=value===null,valIsUndef=value===undefined,valIsReflexive=value===value;var othIsNull=other===null,othIsUndef=other===undefined,othIsReflexive=other===other;if(value>other&&!othIsNull||!valIsReflexive||valIsNull&&!othIsUndef&&othIsReflexive||valIsUndef&&othIsReflexive){return 1}if(value-1){}return index}function charsRightIndex(string,chars){var index=string.length;while(index--&&chars.indexOf(string.charAt(index))>-1){}return index}function compareAscending(object,other){return baseCompareAscending(object.criteria,other.criteria)||object.index-other.index}function compareMultiple(object,other,orders){var index=-1,objCriteria=object.criteria,othCriteria=other.criteria,length=objCriteria.length,ordersLength=orders.length;while(++index=ordersLength){return result}var order=orders[index];return result*(order==="asc"||order===true?1:-1)}}return object.index-other.index}function deburrLetter(letter){return deburredLetters[letter]}function escapeHtmlChar(chr){return htmlEscapes[chr]}function escapeRegExpChar(chr,leadingChar,whitespaceChar){if(leadingChar){chr=regexpEscapes[chr]}else if(whitespaceChar){chr=stringEscapes[chr]}return"\\"+chr}function escapeStringChar(chr){return"\\"+stringEscapes[chr]}function indexOfNaN(array,fromIndex,fromRight){var length=array.length,index=fromIndex+(fromRight?0:-1);while(fromRight?index--:++index=9&&charCode<=13)||charCode==32||charCode==160||charCode==5760||charCode==6158||charCode>=8192&&(charCode<=8202||charCode==8232||charCode==8233||charCode==8239||charCode==8287||charCode==12288||charCode==65279)}function replaceHolders(array,placeholder){var index=-1,length=array.length,resIndex=-1,result=[];while(++index>>1;var MAX_SAFE_INTEGER=9007199254740991;var metaMap=WeakMap&&new WeakMap;var realNames={};function lodash(value){if(isObjectLike(value)&&!isArray(value)&&!(value instanceof LazyWrapper)){if(value instanceof LodashWrapper){return value}if(hasOwnProperty.call(value,"__chain__")&&hasOwnProperty.call(value,"__wrapped__")){return wrapperClone(value)}}return new LodashWrapper(value)}function baseLodash(){}function LodashWrapper(value,chainAll,actions){this.__wrapped__=value;this.__actions__=actions||[];this.__chain__=!!chainAll}var support=lodash.support={};lodash.templateSettings={escape:reEscape,evaluate:reEvaluate,interpolate:reInterpolate,variable:"",imports:{_:lodash}};function LazyWrapper(value){this.__wrapped__=value;this.__actions__=[];this.__dir__=1;this.__filtered__=false;this.__iteratees__=[];this.__takeCount__=POSITIVE_INFINITY;this.__views__=[]}function lazyClone(){var result=new LazyWrapper(this.__wrapped__);result.__actions__=arrayCopy(this.__actions__);result.__dir__=this.__dir__;result.__filtered__=this.__filtered__;result.__iteratees__=arrayCopy(this.__iteratees__);result.__takeCount__=this.__takeCount__;result.__views__=arrayCopy(this.__views__);return result}function lazyReverse(){if(this.__filtered__){var result=new LazyWrapper(this);result.__dir__=-1;result.__filtered__=true}else{result=this.clone();result.__dir__*=-1}return result}function lazyValue(){var array=this.__wrapped__.value(),dir=this.__dir__,isArr=isArray(array),isRight=dir<0,arrLength=isArr?array.length:0,view=getView(0,arrLength,this.__views__),start=view.start,end=view.end,length=end-start,index=isRight?end:start-1,iteratees=this.__iteratees__,iterLength=iteratees.length,resIndex=0,takeCount=nativeMin(length,this.__takeCount__);if(!isArr||arrLength=LARGE_ARRAY_SIZE?createCache(values):null,valuesLength=values.length;if(cache){indexOf=cacheIndexOf;isCommon=false;values=cache}outer:while(++indexlength?0:length+start}end=end===undefined||end>length?length:+end||0;if(end<0){end+=length}length=start>end?0:end>>>0;start>>>=0;while(startlength?0:length+start}end=end===undefined||end>length?length:+end||0;if(end<0){end+=length}length=start>end?0:end-start>>>0;start>>>=0;var result=Array(length);while(++index=LARGE_ARRAY_SIZE,seen=isLarge?createCache():null,result=[];if(seen){indexOf=cacheIndexOf;isCommon=false}else{isLarge=false;seen=iteratee?[]:result}outer:while(++index>>1,computed=array[mid];if((retHighest?computed<=value:computed2?sources[length-2]:undefined,guard=length>2?sources[2]:undefined,thisArg=length>1?sources[length-1]:undefined;if(typeof customizer=="function"){customizer=bindCallback(customizer,thisArg,5);length-=2}else{customizer=typeof thisArg=="function"?thisArg:undefined;length-=customizer?1:0}if(guard&&isIterateeCall(sources[0],sources[1],guard)){customizer=length<3?undefined:customizer;length=1}while(++index-1?collection[index]:undefined}return baseFind(collection,predicate,eachFunc)}}function createFindIndex(fromRight){return function(array,predicate,thisArg){if(!(array&&array.length)){return-1}predicate=getCallback(predicate,thisArg,3);return baseFindIndex(array,predicate,fromRight)}}function createFindKey(objectFunc){return function(object,predicate,thisArg){predicate=getCallback(predicate,thisArg,3);return baseFind(object,predicate,objectFunc,true)}}function createFlow(fromRight){return function(){var wrapper,length=arguments.length,index=fromRight?length:-1,leftIndex=0,funcs=Array(length);while(fromRight?index--:++index=LARGE_ARRAY_SIZE){return wrapper.plant(value).value()}var index=0,result=length?funcs[index].apply(this,args):value;while(++index=length||!nativeIsFinite(length)){return""}var padLength=length-strLength;chars=chars==null?" ":chars+"";return repeat(chars,nativeCeil(padLength/chars.length)).slice(0,padLength)}function createPartialWrapper(func,bitmask,thisArg,partials){var isBind=bitmask&BIND_FLAG,Ctor=createCtorWrapper(func);function wrapper(){var argsIndex=-1,argsLength=arguments.length,leftIndex=-1,leftLength=partials.length,args=Array(leftLength+argsLength);while(++leftIndexarrLength)){return false}while(++index-1&&value%1==0&&value-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function isStrictComparable(value){return value===value&&!isObject(value)}function mergeData(data,source){var bitmask=data[1],srcBitmask=source[1],newBitmask=bitmask|srcBitmask,isCommon=newBitmask0){if(++count>=HOT_COUNT){return key}}else{count=0}return baseSetData(key,value)}}();function shimKeys(object){var props=keysIn(object),propsLength=props.length,length=propsLength&&object.length;var allowIndexes=!!length&&isLength(length)&&(isArray(object)||isArguments(object));var index=-1,result=[];while(++index=120?createCache(othIndex&&value):null}var array=arrays[0],index=-1,length=array?array.length:0,seen=caches[0];outer:while(++index-1){splice.call(array,fromIndex,1)}}return array}var pullAt=restParam(function(array,indexes){indexes=baseFlatten(indexes);var result=baseAt(array,indexes);basePullAt(array,indexes.sort(baseCompareAscending));return result});function remove(array,predicate,thisArg){var result=[];if(!(array&&array.length)){return result}var index=-1,indexes=[],length=array.length;predicate=getCallback(predicate,thisArg,3);while(++index2?arrays[length-2]:undefined,thisArg=length>1?arrays[length-1]:undefined;if(length>2&&typeof iteratee=="function"){length-=2}else{iteratee=length>1&&typeof thisArg=="function"?(--length,thisArg):undefined;thisArg=undefined}arrays.length=length;return unzipWith(arrays,iteratee,thisArg)});function chain(value){var result=lodash(value);result.__chain__=true;return result}function tap(value,interceptor,thisArg){interceptor.call(thisArg,value);return value}function thru(value,interceptor,thisArg){return interceptor.call(thisArg,value)}function wrapperChain(){return chain(this)}function wrapperCommit(){return new LodashWrapper(this.value(),this.__chain__)}var wrapperConcat=restParam(function(values){values=baseFlatten(values);return this.thru(function(array){return arrayConcat(isArray(array)?array:[toObject(array)],values)})});function wrapperPlant(value){var result,parent=this;while(parent instanceof baseLodash){var clone=wrapperClone(parent);if(result){previous.__wrapped__=clone}else{result=clone}var previous=clone;parent=parent.__wrapped__}previous.__wrapped__=value;return result}function wrapperReverse(){var value=this.__wrapped__;var interceptor=function(value){return wrapped&&wrapped.__dir__<0?value:value.reverse()};if(value instanceof LazyWrapper){var wrapped=value;if(this.__actions__.length){wrapped=new LazyWrapper(this)}wrapped=wrapped.reverse();wrapped.__actions__.push({func:thru,args:[interceptor],thisArg:undefined});return new LodashWrapper(wrapped,this.__chain__)}return this.thru(interceptor)}function wrapperToString(){return this.value()+""}function wrapperValue(){return baseWrapperValue(this.__wrapped__,this.__actions__)}var at=restParam(function(collection,props){return baseAt(collection,baseFlatten(props))});var countBy=createAggregator(function(result,value,key){hasOwnProperty.call(result,key)?++result[key]:result[key]=1});function every(collection,predicate,thisArg){var func=isArray(collection)?arrayEvery:baseEvery;if(thisArg&&isIterateeCall(collection,predicate,thisArg)){predicate=undefined}if(typeof predicate!="function"||thisArg!==undefined){predicate=getCallback(predicate,thisArg,3)}return func(collection,predicate)}function filter(collection,predicate,thisArg){var func=isArray(collection)?arrayFilter:baseFilter;predicate=getCallback(predicate,thisArg,3);return func(collection,predicate)}var find=createFind(baseEach);var findLast=createFind(baseEachRight,true);function findWhere(collection,source){return find(collection,baseMatches(source))}var forEach=createForEach(arrayEach,baseEach);var forEachRight=createForEach(arrayEachRight,baseEachRight);var groupBy=createAggregator(function(result,value,key){if(hasOwnProperty.call(result,key)){result[key].push(value)}else{result[key]=[value]}});function includes(collection,target,fromIndex,guard){var length=collection?getLength(collection):0;if(!isLength(length)){collection=values(collection);length=collection.length}if(typeof fromIndex!="number"||guard&&isIterateeCall(target,fromIndex,guard)){fromIndex=0}else{fromIndex=fromIndex<0?nativeMax(length+fromIndex,0):fromIndex||0}return typeof collection=="string"||!isArray(collection)&&isString(collection)?fromIndex<=length&&collection.indexOf(target,fromIndex)>-1:!!length&&getIndexOf(collection,target,fromIndex)>-1}var indexBy=createAggregator(function(result,value,key){result[key]=value});var invoke=restParam(function(collection,path,args){var index=-1,isFunc=typeof path=="function",isProp=isKey(path),result=isArrayLike(collection)?Array(collection.length):[];baseEach(collection,function(value){var func=isFunc?path:isProp&&value!=null?value[path]:undefined;result[++index]=func?func.apply(value,args):invokePath(value,path,args)});return result});function map(collection,iteratee,thisArg){var func=isArray(collection)?arrayMap:baseMap;iteratee=getCallback(iteratee,thisArg,3);return func(collection,iteratee)}var partition=createAggregator(function(result,value,key){result[key?0:1].push(value)},function(){return[[],[]]});function pluck(collection,path){return map(collection,property(path))}var reduce=createReduce(arrayReduce,baseEach);var reduceRight=createReduce(arrayReduceRight,baseEachRight);function reject(collection,predicate,thisArg){var func=isArray(collection)?arrayFilter:baseFilter;predicate=getCallback(predicate,thisArg,3);return func(collection,function(value,index,collection){return!predicate(value,index,collection)})}function sample(collection,n,guard){if(guard?isIterateeCall(collection,n,guard):n==null){collection=toIterable(collection);var length=collection.length;return length>0?collection[baseRandom(0,length-1)]:undefined}var index=-1,result=toArray(collection),length=result.length,lastIndex=length-1;n=nativeMin(n<0?0:+n||0,length);while(++index0){result=func.apply(this,arguments)}if(n<=1){func=undefined}return result}}var bind=restParam(function(func,thisArg,partials){var bitmask=BIND_FLAG;if(partials.length){var holders=replaceHolders(partials,bind.placeholder);bitmask|=PARTIAL_FLAG}return createWrapper(func,bitmask,thisArg,partials,holders)});var bindAll=restParam(function(object,methodNames){methodNames=methodNames.length?baseFlatten(methodNames):functions(object);var index=-1,length=methodNames.length;while(++indexwait){complete(trailingCall,maxTimeoutId)}else{timeoutId=setTimeout(delayed,remaining)}}function maxDelayed(){complete(trailing,timeoutId)}function debounced(){args=arguments;stamp=now();thisArg=this;trailingCall=trailing&&(timeoutId||!leading);if(maxWait===false){var leadingCall=leading&&!timeoutId}else{if(!maxTimeoutId&&!leading){lastCalled=stamp}var remaining=maxWait-(stamp-lastCalled),isCalled=remaining<=0||remaining>maxWait;if(isCalled){if(maxTimeoutId){maxTimeoutId=clearTimeout(maxTimeoutId)}lastCalled=stamp;result=func.apply(thisArg,args)}else if(!maxTimeoutId){maxTimeoutId=setTimeout(maxDelayed,remaining)}}if(isCalled&&timeoutId){timeoutId=clearTimeout(timeoutId)}else if(!timeoutId&&wait!==maxWait){timeoutId=setTimeout(delayed,wait)}if(leadingCall){isCalled=true;result=func.apply(thisArg,args)}if(isCalled&&!timeoutId&&!maxTimeoutId){args=thisArg=undefined}return result}debounced.cancel=cancel;return debounced}var defer=restParam(function(func,args){return baseDelay(func,1,args)});var delay=restParam(function(func,wait,args){return baseDelay(func,wait,args)});var flow=createFlow();var flowRight=createFlow(true);function memoize(func,resolver){if(typeof func!="function"||resolver&&typeof resolver!="function"){throw new TypeError(FUNC_ERROR_TEXT)}var memoized=function(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key)){return cache.get(key)}var result=func.apply(this,args);memoized.cache=cache.set(key,result);return result};memoized.cache=new memoize.Cache;return memoized}var modArgs=restParam(function(func,transforms){transforms=baseFlatten(transforms);if(typeof func!="function"||!arrayEvery(transforms,baseIsFunction)){throw new TypeError(FUNC_ERROR_TEXT)}var length=transforms.length;return restParam(function(args){var index=nativeMin(args.length,length);while(index--){args[index]=transforms[index](args[index])}return func.apply(this,args)})});function negate(predicate){if(typeof predicate!="function"){throw new TypeError(FUNC_ERROR_TEXT)}return function(){return!predicate.apply(this,arguments)}}function once(func){return before(2,func)}var partial=createPartial(PARTIAL_FLAG);var partialRight=createPartial(PARTIAL_RIGHT_FLAG);var rearg=restParam(function(func,indexes){return createWrapper(func,REARG_FLAG,undefined,undefined,undefined,baseFlatten(indexes))});function restParam(func,start){if(typeof func!="function"){throw new TypeError(FUNC_ERROR_TEXT)}start=nativeMax(start===undefined?func.length-1:+start||0,0);return function(){var args=arguments,index=-1,length=nativeMax(args.length-start,0),rest=Array(length);while(++indexother}function gte(value,other){return value>=other}function isArguments(value){return isObjectLike(value)&&isArrayLike(value)&&hasOwnProperty.call(value,"callee")&&!propertyIsEnumerable.call(value,"callee")}var isArray=nativeIsArray||function(value){return isObjectLike(value)&&isLength(value.length)&&objToString.call(value)==arrayTag};function isBoolean(value){return value===true||value===false||isObjectLike(value)&&objToString.call(value)==boolTag}function isDate(value){return isObjectLike(value)&&objToString.call(value)==dateTag}function isElement(value){return!!value&&value.nodeType===1&&isObjectLike(value)&&!isPlainObject(value)}function isEmpty(value){if(value==null){return true}if(isArrayLike(value)&&(isArray(value)||isString(value)||isArguments(value)||isObjectLike(value)&&isFunction(value.splice))){return!value.length}return!keys(value).length}function isEqual(value,other,customizer,thisArg){customizer=typeof customizer=="function"?bindCallback(customizer,thisArg,3):undefined;var result=customizer?customizer(value,other):undefined;return result===undefined?baseIsEqual(value,other,customizer):!!result}function isError(value){return isObjectLike(value)&&typeof value.message=="string"&&objToString.call(value)==errorTag}function isFinite(value){return typeof value=="number"&&nativeIsFinite(value)}function isFunction(value){return isObject(value)&&objToString.call(value)==funcTag}function isObject(value){var type=typeof value;return!!value&&(type=="object"||type=="function")}function isMatch(object,source,customizer,thisArg){customizer=typeof customizer=="function"?bindCallback(customizer,thisArg,3):undefined;return baseIsMatch(object,getMatchData(source),customizer)}function isNaN(value){return isNumber(value)&&value!=+value}function isNative(value){if(value==null){return false}if(isFunction(value)){return reIsNative.test(fnToString.call(value))}return isObjectLike(value)&&reIsHostCtor.test(value)}function isNull(value){return value===null}function isNumber(value){return typeof value=="number"||isObjectLike(value)&&objToString.call(value)==numberTag}function isPlainObject(value){var Ctor;if(!(isObjectLike(value)&&objToString.call(value)==objectTag&&!isArguments(value))||!hasOwnProperty.call(value,"constructor")&&(Ctor=value.constructor,typeof Ctor=="function"&&!(Ctor instanceof Ctor))){return false}var result;baseForIn(value,function(subValue,key){result=key});return result===undefined||hasOwnProperty.call(value,result)}function isRegExp(value){return isObject(value)&&objToString.call(value)==regexpTag}function isString(value){return typeof value=="string"||isObjectLike(value)&&objToString.call(value)==stringTag}function isTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[objToString.call(value)]}function isUndefined(value){return value===undefined}function lt(value,other){return value0;while(++index=nativeMin(start,end)&&value=0&&string.indexOf(target,position)==position}function escape(string){string=baseToString(string);return string&&reHasUnescapedHtml.test(string)?string.replace(reUnescapedHtml,escapeHtmlChar):string}function escapeRegExp(string){string=baseToString(string);return string&&reHasRegExpChars.test(string)?string.replace(reRegExpChars,escapeRegExpChar):string||"(?:)"}var kebabCase=createCompounder(function(result,word,index){return result+(index?"-":"")+word.toLowerCase()});function pad(string,length,chars){string=baseToString(string);length=+length;var strLength=string.length;if(strLength>=length||!nativeIsFinite(length)){return string}var mid=(length-strLength)/2,leftLength=nativeFloor(mid),rightLength=nativeCeil(mid);chars=createPadding("",rightLength,chars);return chars.slice(0,leftLength)+string+chars}var padLeft=createPadDir();var padRight=createPadDir(true);function parseInt(string,radix,guard){if(guard?isIterateeCall(string,radix,guard):radix==null){radix=0}else if(radix){radix=+radix}string=trim(string);return nativeParseInt(string,radix||(reHasHexPrefix.test(string)?16:10))}function repeat(string,n){var result="";string=baseToString(string);n=+n;if(n<1||!string||!nativeIsFinite(n)){return result}do{if(n%2){result+=string}n=nativeFloor(n/2);string+=string}while(n);return result}var snakeCase=createCompounder(function(result,word,index){return result+(index?"_":"")+word.toLowerCase()});var startCase=createCompounder(function(result,word,index){return result+(index?" ":"")+(word.charAt(0).toUpperCase()+word.slice(1))});function startsWith(string,target,position){string=baseToString(string);position=position==null?0:nativeMin(position<0?0:+position||0,string.length);return string.lastIndexOf(target,position)==position}function template(string,options,otherOptions){var settings=lodash.templateSettings;if(otherOptions&&isIterateeCall(string,options,otherOptions)){options=otherOptions=undefined}string=baseToString(string);options=assignWith(baseAssign({},otherOptions||options),settings,assignOwnDefaults);var imports=assignWith(baseAssign({},options.imports),settings.imports,assignOwnDefaults),importsKeys=keys(imports),importsValues=baseValues(imports,importsKeys);var isEscaping,isEvaluating,index=0,interpolate=options.interpolate||reNoMatch,source="__p += '";var reDelimiters=RegExp((options.escape||reNoMatch).source+"|"+interpolate.source+"|"+(interpolate===reInterpolate?reEsTemplate:reNoMatch).source+"|"+(options.evaluate||reNoMatch).source+"|$","g");var sourceURL="//# sourceURL="+("sourceURL"in options?options.sourceURL:"lodash.templateSources["+ ++templateCounter+"]")+"\n";string.replace(reDelimiters,function(match,escapeValue,interpolateValue,esTemplateValue,evaluateValue,offset){interpolateValue||(interpolateValue=esTemplateValue);source+=string.slice(index,offset).replace(reUnescapedString,escapeStringChar);if(escapeValue){isEscaping=true;source+="' +\n__e("+escapeValue+") +\n'"}if(evaluateValue){isEvaluating=true;source+="';\n"+evaluateValue+";\n__p += '"}if(interpolateValue){source+="' +\n((__t = ("+interpolateValue+")) == null ? '' : __t) +\n'"}index=offset+match.length;return match});source+="';\n";var variable=options.variable;if(!variable){source="with (obj) {\n"+source+"\n}\n"}source=(isEvaluating?source.replace(reEmptyStringLeading,""):source).replace(reEmptyStringMiddle,"$1").replace(reEmptyStringTrailing,"$1;");source="function("+(variable||"obj")+") {\n"+(variable?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(isEscaping?", __e = _.escape":"")+(isEvaluating?", __j = Array.prototype.join;\n"+"function print() { __p += __j.call(arguments, '') }\n":";\n")+source+"return __p\n}";var result=attempt(function(){return Function(importsKeys,sourceURL+"return "+source).apply(undefined,importsValues)});result.source=source;if(isError(result)){throw result}return result}function trim(string,chars,guard){var value=string;string=baseToString(string);if(!string){return string}if(guard?isIterateeCall(value,chars,guard):chars==null){return string.slice(trimmedLeftIndex(string),trimmedRightIndex(string)+1)}chars=chars+"";return string.slice(charsLeftIndex(string,chars),charsRightIndex(string,chars)+1)}function trimLeft(string,chars,guard){var value=string;string=baseToString(string);if(!string){return string}if(guard?isIterateeCall(value,chars,guard):chars==null){return string.slice(trimmedLeftIndex(string))}return string.slice(charsLeftIndex(string,chars+""))}function trimRight(string,chars,guard){var value=string;string=baseToString(string);if(!string){return string}if(guard?isIterateeCall(value,chars,guard):chars==null){return string.slice(0,trimmedRightIndex(string)+1)}return string.slice(0,charsRightIndex(string,chars+"")+1)}function trunc(string,options,guard){if(guard&&isIterateeCall(string,options,guard)){options=undefined}var length=DEFAULT_TRUNC_LENGTH,omission=DEFAULT_TRUNC_OMISSION;if(options!=null){if(isObject(options)){var separator="separator"in options?options.separator:separator;length="length"in options?+options.length||0:length;omission="omission"in options?baseToString(options.omission):omission}else{length=+options||0}}string=baseToString(string);if(length>=string.length){return string}var end=length-omission.length;if(end<1){return omission}var result=string.slice(0,end);if(separator==null){return result+omission}if(isRegExp(separator)){if(string.slice(end).search(separator)){var match,newEnd,substring=string.slice(0,end);if(!separator.global){separator=RegExp(separator.source,(reFlags.exec(separator)||"")+"g")}separator.lastIndex=0;while(match=separator.exec(substring)){newEnd=match.index}result=result.slice(0,newEnd==null?end:newEnd)}}else if(string.indexOf(separator,end)!=end){var index=result.lastIndexOf(separator);if(index>-1){result=result.slice(0,index)}}return result+omission}function unescape(string){string=baseToString(string);return string&&reHasEscapedHtml.test(string)?string.replace(reEscapedHtml,unescapeHtmlChar):string}function words(string,pattern,guard){if(guard&&isIterateeCall(string,pattern,guard)){pattern=undefined}string=baseToString(string);return string.match(pattern||reWords)||[]}var attempt=restParam(function(func,args){try{return func.apply(undefined,args)}catch(e){return isError(e)?e:new Error(e)}});function callback(func,thisArg,guard){if(guard&&isIterateeCall(func,thisArg,guard)){thisArg=undefined}return isObjectLike(func)?matches(func):baseCallback(func,thisArg)}function constant(value){return function(){return value}}function identity(value){return value}function matches(source){return baseMatches(baseClone(source,true))}function matchesProperty(path,srcValue){return baseMatchesProperty(path,baseClone(srcValue,true))}var method=restParam(function(path,args){return function(object){return invokePath(object,path,args)}});var methodOf=restParam(function(object,args){return function(path){return invokePath(object,path,args)}});function mixin(object,source,options){if(options==null){var isObj=isObject(source),props=isObj?keys(source):undefined,methodNames=props&&props.length?baseFunctions(source,props):undefined;if(!(methodNames?methodNames.length:isObj)){methodNames=false;options=source;source=object;object=this}}if(!methodNames){methodNames=baseFunctions(source,keys(source))}var chain=true,index=-1,isFunc=isFunction(object),length=methodNames.length;if(options===false){chain=false}else if(isObject(options)&&"chain"in options){chain=options.chain}while(++index0||end<0)){return new LazyWrapper(result)}if(start<0){result=result.takeRight(-start)}else if(start){result=result.drop(start)}if(end!==undefined){end=+end||0;result=end<0?result.dropRight(-end):result.take(end-start)}return result};LazyWrapper.prototype.takeRightWhile=function(predicate,thisArg){return this.reverse().takeWhile(predicate,thisArg).reverse()};LazyWrapper.prototype.toArray=function(){return this.take(POSITIVE_INFINITY)};baseForOwn(LazyWrapper.prototype,function(func,methodName){var checkIteratee=/^(?:filter|map|reject)|While$/.test(methodName),retUnwrapped=/^(?:first|last)$/.test(methodName),lodashFunc=lodash[retUnwrapped?"take"+(methodName=="last"?"Right":""):methodName];if(!lodashFunc){return}lodash.prototype[methodName]=function(){var args=retUnwrapped?[1]:arguments,chainAll=this.__chain__,value=this.__wrapped__,isHybrid=!!this.__actions__.length,isLazy=value instanceof LazyWrapper,iteratee=args[0],useLazy=isLazy||isArray(value);if(useLazy&&checkIteratee&&typeof iteratee=="function"&&iteratee.length!=1){isLazy=useLazy=false}var interceptor=function(value){return retUnwrapped&&chainAll?lodashFunc(value,1)[0]:lodashFunc.apply(undefined,arrayPush([value],args))};var action={func:thru,args:[interceptor],thisArg:undefined},onlyLazy=isLazy&&!isHybrid;if(retUnwrapped&&!chainAll){if(onlyLazy){value=value.clone();value.__actions__.push(action);return func.call(value)}return lodashFunc.call(undefined,this.value())[0]}if(!retUnwrapped&&useLazy){value=onlyLazy?value:new LazyWrapper(this);var result=func.apply(value,args);result.__actions__.push(action);return new LodashWrapper(result,chainAll)}return this.thru(interceptor)}});arrayEach(["join","pop","push","replace","shift","sort","splice","split","unshift"],function(methodName){var func=(/^(?:replace|split)$/.test(methodName)?stringProto:arrayProto)[methodName],chainName=/^(?:push|sort|unshift)$/.test(methodName)?"tap":"thru",retUnwrapped=/^(?:join|pop|replace|shift)$/.test(methodName);lodash.prototype[methodName]=function(){var args=arguments;if(retUnwrapped&&!this.__chain__){return func.apply(this.value(),args)}return this[chainName](function(value){return func.apply(value,args)})}});baseForOwn(LazyWrapper.prototype,function(func,methodName){var lodashFunc=lodash[methodName];if(lodashFunc){var key=lodashFunc.name,names=realNames[key]||(realNames[key]=[]);names.push({name:methodName,func:lodashFunc})}});realNames[createHybridWrapper(undefined,BIND_KEY_FLAG).name]=[{name:"wrapper",func:undefined}];LazyWrapper.prototype.clone=lazyClone;LazyWrapper.prototype.reverse=lazyReverse;LazyWrapper.prototype.value=lazyValue;lodash.prototype.chain=wrapperChain;lodash.prototype.commit=wrapperCommit;lodash.prototype.concat=wrapperConcat;lodash.prototype.plant=wrapperPlant;lodash.prototype.reverse=wrapperReverse;lodash.prototype.toString=wrapperToString;lodash.prototype.run=lodash.prototype.toJSON=lodash.prototype.valueOf=lodash.prototype.value=wrapperValue;lodash.prototype.collect=lodash.prototype.map;lodash.prototype.head=lodash.prototype.first;lodash.prototype.select=lodash.prototype.filter;lodash.prototype.tail=lodash.prototype.rest;return lodash}var _=runInContext();if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){root._=_;define(function(){return _})}else if(freeExports&&freeModule){if(moduleExports){(freeModule.exports=_)._=_}else{freeExports._=_}}else{root._=_}}).call(this)}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],3:[function(require,module,exports){(function(window,document,undefined){var _MAP={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"};var _KEYCODE_MAP={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"};var _SHIFT_MAP={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"};var _SPECIAL_ALIASES={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"};var _REVERSE_MAP;for(var i=1;i<20;++i){_MAP[111+i]="f"+i}for(i=0;i<=9;++i){_MAP[i+96]=i}function _addEvent(object,type,callback){if(object.addEventListener){object.addEventListener(type,callback,false);return}object.attachEvent("on"+type,callback)}function _characterFromEvent(e){if(e.type=="keypress"){var character=String.fromCharCode(e.which);if(!e.shiftKey){character=character.toLowerCase()}return character}if(_MAP[e.which]){return _MAP[e.which]}if(_KEYCODE_MAP[e.which]){return _KEYCODE_MAP[e.which]}return String.fromCharCode(e.which).toLowerCase()}function _modifiersMatch(modifiers1,modifiers2){return modifiers1.sort().join(",")===modifiers2.sort().join(",")}function _eventModifiers(e){var modifiers=[];if(e.shiftKey){modifiers.push("shift")}if(e.altKey){modifiers.push("alt")}if(e.ctrlKey){modifiers.push("ctrl")}if(e.metaKey){modifiers.push("meta")}return modifiers}function _preventDefault(e){if(e.preventDefault){e.preventDefault();return}e.returnValue=false}function _stopPropagation(e){if(e.stopPropagation){e.stopPropagation();return}e.cancelBubble=true}function _isModifier(key){return key=="shift"||key=="ctrl"||key=="alt"||key=="meta"}function _getReverseMap(){if(!_REVERSE_MAP){_REVERSE_MAP={};for(var key in _MAP){if(key>95&&key<112){continue}if(_MAP.hasOwnProperty(key)){_REVERSE_MAP[_MAP[key]]=key}}}return _REVERSE_MAP}function _pickBestAction(key,modifiers,action){if(!action){action=_getReverseMap()[key]?"keydown":"keypress"}if(action=="keypress"&&modifiers.length){action="keydown"}return action}function _keysFromString(combination){if(combination==="+"){return["+"]}combination=combination.replace(/\+{2}/g,"+plus");return combination.split("+")}function _getKeyInfo(combination,action){var keys;var key;var i;var modifiers=[];keys=_keysFromString(combination);for(i=0;i1){_bindSequence(combination,sequence,callback,action);return}info=_getKeyInfo(combination,action);self._callbacks[info.key]=self._callbacks[info.key]||[];_getMatches(info.key,info.modifiers,{type:info.action},sequenceName,combination,level);self._callbacks[info.key][sequenceName?"unshift":"push"]({callback:callback,modifiers:info.modifiers,action:info.action,seq:sequenceName,level:level,combo:combination})}self._bindMultiple=function(combinations,callback,action){for(var i=0;i-1){return false}if(_belongsTo(element,self.target)){return false}return element.tagName=="INPUT"||element.tagName=="SELECT"||element.tagName=="TEXTAREA"||element.isContentEditable};Mousetrap.prototype.handleKey=function(){var self=this;return self._handleKey.apply(self,arguments)};Mousetrap.init=function(){var documentMousetrap=Mousetrap(document);for(var method in documentMousetrap){if(method.charAt(0)!=="_"){Mousetrap[method]=function(method){return function(){return documentMousetrap[method].apply(documentMousetrap,arguments)}}(method)}}};Mousetrap.init();window.Mousetrap=Mousetrap;if(typeof module!=="undefined"&&module.exports){module.exports=Mousetrap}if(typeof define==="function"&&define.amd){define(function(){return Mousetrap})}})(window,document)},{}],4:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;var splitPath=function(filename){return splitPathRe.exec(filename).slice(1)};exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i1){for(var i=1;i= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode,key;function error(type){throw RangeError(errors[type])}function map(array,fn){var length=array.length;var result=[];while(length--){result[length]=fn(array[length])}return result}function mapDomain(string,fn){var parts=string.split("@");var result="";if(parts.length>1){result=parts[0]+"@";string=parts[1]}string=string.replace(regexSeparators,".");var labels=string.split(".");var encoded=map(labels,fn).join(".");return result+encoded}function ucs2decode(string){var output=[],counter=0,length=string.length,value,extra;while(counter=55296&&value<=56319&&counter65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value);return output}).join("")}function basicToDigit(codePoint){if(codePoint-48<10){return codePoint-22}if(codePoint-65<26){return codePoint-65}if(codePoint-97<26){return codePoint-97}return base}function digitToBasic(digit,flag){return digit+22+75*(digit<26)-((flag!=0)<<5)}function adapt(delta,numPoints,firstTime){var k=0;delta=firstTime?floor(delta/damp):delta>>1;delta+=floor(delta/numPoints);for(;delta>baseMinusTMin*tMax>>1;k+=base){delta=floor(delta/baseMinusTMin)}return floor(k+(baseMinusTMin+1)*delta/(delta+skew))}function decode(input){var output=[],inputLength=input.length,out,i=0,n=initialN,bias=initialBias,basic,j,index,oldi,w,k,digit,t,baseMinusT;basic=input.lastIndexOf(delimiter);if(basic<0){basic=0}for(j=0;j=128){error("not-basic")}output.push(input.charCodeAt(j))}for(index=basic>0?basic+1:0;index=inputLength){error("invalid-input")}digit=basicToDigit(input.charCodeAt(index++));if(digit>=base||digit>floor((maxInt-i)/w)){error("overflow")}i+=digit*w;t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias;if(digitfloor(maxInt/baseMinusT)){error("overflow")}w*=baseMinusT}out=output.length+1;bias=adapt(i-oldi,out,oldi==0);if(floor(i/out)>maxInt-n){error("overflow")}n+=floor(i/out);i%=out;output.splice(i++,0,n)}return ucs2encode(output)}function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,output=[],inputLength,handledCPCountPlusOne,baseMinusT,qMinusT;input=ucs2decode(input);inputLength=input.length;n=initialN;delta=0;bias=initialBias;for(j=0;j=n&¤tValuefloor((maxInt-delta)/handledCPCountPlusOne)){error("overflow")}delta+=(m-n)*handledCPCountPlusOne;n=m;for(j=0;jmaxInt){error("overflow")}if(currentValue==n){for(q=delta,k=base;;k+=base){t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias;if(q0&&len>maxKeys){len=maxKeys}for(var i=0;i=0){kstr=x.substr(0,idx);vstr=x.substr(idx+1)}else{kstr=x;vstr=""}k=decodeURIComponent(kstr);v=decodeURIComponent(vstr);if(!hasOwnProperty(obj,k)){obj[k]=v}else if(isArray(obj[k])){obj[k].push(v)}else{obj[k]=[obj[k],v]}}return obj};var isArray=Array.isArray||function(xs){return Object.prototype.toString.call(xs)==="[object Array]"}},{}],8:[function(require,module,exports){"use strict";var stringifyPrimitive=function(v){switch(typeof v){case"string":return v;case"boolean":return v?"true":"false";case"number":return isFinite(v)?v:"";default:return""}};module.exports=function(obj,sep,eq,name){sep=sep||"&";eq=eq||"=";if(obj===null){obj=undefined}if(typeof obj==="object"){return map(objectKeys(obj),function(k){var ks=encodeURIComponent(stringifyPrimitive(k))+eq;if(isArray(obj[k])){return map(obj[k],function(v){return ks+encodeURIComponent(stringifyPrimitive(v))}).join(sep)}else{return ks+encodeURIComponent(stringifyPrimitive(obj[k]))}}).join(sep)}if(!name)return"";return encodeURIComponent(stringifyPrimitive(name))+eq+encodeURIComponent(stringifyPrimitive(obj))};var isArray=Array.isArray||function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function map(xs,f){if(xs.map)return xs.map(f);var res=[];for(var i=0;i",'"',"`"," ","\r","\n","\t"],unwise=["{","}","|","\\","^","`"].concat(delims),autoEscape=["'"].concat(unwise),nonHostChars=["%","/","?",";","#"].concat(autoEscape),hostEndingChars=["/","?","#"],hostnameMaxLen=255,hostnamePartPattern=/^[a-z0-9A-Z_-]{0,63}$/,hostnamePartStart=/^([a-z0-9A-Z_-]{0,63})(.*)$/,unsafeProtocol={javascript:true,"javascript:":true},hostlessProtocol={javascript:true,"javascript:":true},slashedProtocol={http:true,https:true,ftp:true,gopher:true,file:true,"http:":true,"https:":true,"ftp:":true,"gopher:":true,"file:":true},querystring=require("querystring");function urlParse(url,parseQueryString,slashesDenoteHost){if(url&&isObject(url)&&url instanceof Url)return url;var u=new Url;u.parse(url,parseQueryString,slashesDenoteHost);return u}Url.prototype.parse=function(url,parseQueryString,slashesDenoteHost){if(!isString(url)){throw new TypeError("Parameter 'url' must be a string, not "+typeof url)}var rest=url;rest=rest.trim();var proto=protocolPattern.exec(rest);if(proto){proto=proto[0];var lowerProto=proto.toLowerCase();this.protocol=lowerProto;rest=rest.substr(proto.length)}if(slashesDenoteHost||proto||rest.match(/^\/\/[^@\/]+@[^@\/]+/)){var slashes=rest.substr(0,2)==="//";if(slashes&&!(proto&&hostlessProtocol[proto])){rest=rest.substr(2);this.slashes=true}}if(!hostlessProtocol[proto]&&(slashes||proto&&!slashedProtocol[proto])){var hostEnd=-1;for(var i=0;i127){newpart+="x"}else{newpart+=part[j]}}if(!newpart.match(hostnamePartPattern)){var validParts=hostparts.slice(0,i);var notHost=hostparts.slice(i+1);var bit=part.match(hostnamePartStart);if(bit){validParts.push(bit[1]);notHost.unshift(bit[2])}if(notHost.length){rest="/"+notHost.join(".")+rest}this.hostname=validParts.join(".");break}}}}if(this.hostname.length>hostnameMaxLen){this.hostname=""}else{this.hostname=this.hostname.toLowerCase()}if(!ipv6Hostname){var domainArray=this.hostname.split(".");var newOut=[];for(var i=0;i0?result.host.split("@"):false;if(authInHost){result.auth=authInHost.shift();result.host=result.hostname=authInHost.shift()}}result.search=relative.search;result.query=relative.query;if(!isNull(result.pathname)||!isNull(result.search)){result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")}result.href=result.format();return result}if(!srcPath.length){result.pathname=null;if(result.search){result.path="/"+result.search}else{result.path=null}result.href=result.format();return result}var last=srcPath.slice(-1)[0];var hasTrailingSlash=(result.host||relative.host)&&(last==="."||last==="..")||last==="";var up=0;for(var i=srcPath.length;i>=0;i--){last=srcPath[i];if(last=="."){srcPath.splice(i,1)}else if(last===".."){srcPath.splice(i,1);up++}else if(up){srcPath.splice(i,1);up--}}if(!mustEndAbs&&!removeAllDots){for(;up--;up){srcPath.unshift("..")}}if(mustEndAbs&&srcPath[0]!==""&&(!srcPath[0]||srcPath[0].charAt(0)!=="/")){srcPath.unshift("")}if(hasTrailingSlash&&srcPath.join("/").substr(-1)!=="/"){srcPath.push("")}var isAbsolute=srcPath[0]===""||srcPath[0]&&srcPath[0].charAt(0)==="/";if(psychotic){result.hostname=result.host=isAbsolute?"":srcPath.length?srcPath.shift():"";var authInHost=result.host&&result.host.indexOf("@")>0?result.host.split("@"):false;if(authInHost){result.auth=authInHost.shift();result.host=result.hostname=authInHost.shift()}}mustEndAbs=mustEndAbs||result.host&&srcPath.length;if(mustEndAbs&&!isAbsolute){srcPath.unshift("")}if(!srcPath.length){result.pathname=null;result.path=null}else{result.pathname=srcPath.join("/")}if(!isNull(result.pathname)||!isNull(result.search)){result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")}result.auth=relative.auth||result.auth;result.slashes=result.slashes||relative.slashes;result.href=result.format();return result};Url.prototype.parseHost=function(){var host=this.host;var port=portPattern.exec(host);if(port){port=port[0];if(port!==":"){this.port=port.substr(1)}host=host.substr(0,host.length-port.length)}if(host)this.hostname=host};function isString(arg){return typeof arg==="string"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isNull(arg){return arg===null}function isNullOrUndefined(arg){return arg==null}},{punycode:6,querystring:9}],11:[function(require,module,exports){var $=require("jquery");function toggleDropdown(e){var $dropdown=$(e.currentTarget).parent().find(".dropdown-menu");$dropdown.toggleClass("open");e.stopPropagation();e.preventDefault()}function closeDropdown(e){$(".dropdown-menu").removeClass("open")}function init(){$(document).on("click",".toggle-dropdown",toggleDropdown);$(document).on("click",".dropdown-menu",function(e){e.stopPropagation()});$(document).on("click",closeDropdown)}module.exports={init:init}},{jquery:1}],12:[function(require,module,exports){var $=require("jquery");module.exports=$({})},{jquery:1}],13:[function(require,module,exports){var $=require("jquery");var _=require("lodash");var storage=require("./storage");var dropdown=require("./dropdown");var events=require("./events");var state=require("./state");var keyboard=require("./keyboard");var navigation=require("./navigation");var sidebar=require("./sidebar");var toolbar=require("./toolbar");function start(config){sidebar.init();keyboard.init();dropdown.init();navigation.init();toolbar.createButton({index:0,icon:"fa fa-align-justify",label:"Toggle Sidebar",onClick:function(e){e.preventDefault();sidebar.toggle()}});events.trigger("start",config);navigation.notify()}var gitbook={start:start,events:events,state:state,toolbar:toolbar,sidebar:sidebar,storage:storage,keyboard:keyboard};var MODULES={gitbook:gitbook,jquery:$,lodash:_};window.gitbook=gitbook;window.$=$;window.jQuery=$;gitbook.require=function(mods,fn){mods=_.map(mods,function(mod){mod=mod.toLowerCase();if(!MODULES[mod]){throw new Error("GitBook module "+mod+" doesn't exist")}return MODULES[mod]});fn.apply(null,mods)};module.exports={}},{"./dropdown":11,"./events":12,"./keyboard":14,"./navigation":16,"./sidebar":18,"./state":19,"./storage":20,"./toolbar":21,jquery:1,lodash:2}],14:[function(require,module,exports){var Mousetrap=require("mousetrap");var navigation=require("./navigation");var sidebar=require("./sidebar");function bindShortcut(keys,fn){Mousetrap.bind(keys,function(e){fn();return false})}function init(){bindShortcut(["right"],function(e){navigation.goNext()});bindShortcut(["left"],function(e){navigation.goPrev()});bindShortcut(["s"],function(e){sidebar.toggle()})}module.exports={init:init,bind:bindShortcut}},{"./navigation":16,"./sidebar":18,mousetrap:3}],15:[function(require,module,exports){var state=require("./state");function showLoading(p){state.$book.addClass("is-loading");p.always(function(){state.$book.removeClass("is-loading")});return p}module.exports={show:showLoading}},{"./state":19}],16:[function(require,module,exports){var $=require("jquery");var url=require("url");var events=require("./events");var state=require("./state");var loading=require("./loading");var usePushState=typeof history.pushState!=="undefined";function handleNavigation(relativeUrl,push){var uri=url.resolve(window.location.pathname,relativeUrl);notifyPageChange();location.href=relativeUrl;return}function updateNavigationPosition(){var bodyInnerWidth,pageWrapperWidth;bodyInnerWidth=parseInt($(".body-inner").css("width"),10);pageWrapperWidth=parseInt($(".page-wrapper").css("width"),10);$(".navigation-next").css("margin-right",bodyInnerWidth-pageWrapperWidth+"px")}function notifyPageChange(){events.trigger("page.change")}function preparePage(notify){var $bookBody=$(".book-body");var $bookInner=$bookBody.find(".body-inner");var $pageWrapper=$bookInner.find(".page-wrapper");updateNavigationPosition();$bookInner.scrollTop(0);$bookBody.scrollTop(0);if(notify!==false)notifyPageChange()}function isLeftClickEvent(e){return e.button===0}function isModifiedEvent(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function handlePagination(e){if(isModifiedEvent(e)||!isLeftClickEvent(e)){return}e.stopPropagation();e.preventDefault();var url=$(this).attr("href");if(url)handleNavigation(url,true)}function goNext(){var url=$(".navigation-next").attr("href");if(url)handleNavigation(url,true)}function goPrev(){var url=$(".navigation-prev").attr("href");if(url)handleNavigation(url,true)}function init(){$.ajaxSetup({});if(location.protocol!=="file:"){history.replaceState({path:window.location.href},"")}window.onpopstate=function(event){if(event.state===null){return}return handleNavigation(event.state.path,false)};$(document).on("click",".navigation-prev",handlePagination);$(document).on("click",".navigation-next",handlePagination);$(document).on("click",".summary [data-path] a",handlePagination);$(window).resize(updateNavigationPosition);preparePage(false)}module.exports={init:init,goNext:goNext,goPrev:goPrev,notify:notifyPageChange}},{"./events":12,"./loading":15,"./state":19,jquery:1,url:10}],17:[function(require,module,exports){module.exports={isMobile:function(){return document.body.clientWidth<=600}}},{}],18:[function(require,module,exports){var $=require("jquery");var _=require("lodash");var storage=require("./storage");var platform=require("./platform");var state=require("./state");function toggleSidebar(_state,animation){if(state!=null&&isOpen()==_state)return;if(animation==null)animation=true;state.$book.toggleClass("without-animation",!animation);state.$book.toggleClass("with-summary",_state);storage.set("sidebar",isOpen())}function isOpen(){return state.$book.hasClass("with-summary")}function init(){if(platform.isMobile()){toggleSidebar(false,false)}else{toggleSidebar(storage.get("sidebar",true),false)}$(document).on("click",".book-summary li.chapter a",function(e){if(platform.isMobile())toggleSidebar(false,false)})}function filterSummary(paths){var $summary=$(".book-summary");$summary.find("li").each(function(){var path=$(this).data("path");var st=paths==null||_.contains(paths,path);$(this).toggle(st);if(st)$(this).parents("li").show()})}module.exports={init:init,isOpen:isOpen,toggle:toggleSidebar,filter:filterSummary}},{"./platform":17,"./state":19,"./storage":20,jquery:1,lodash:2}],19:[function(require,module,exports){var $=require("jquery");var url=require("url");var path=require("path");var state={};state.update=function(dom){var $book=$(dom.find(".book"));state.$book=$book;state.level=$book.data("level");state.basePath=$book.data("basepath");state.innerLanguage=$book.data("innerlanguage");state.revision=$book.data("revision");state.filepath=$book.data("filepath");state.chapterTitle=$book.data("chapter-title");state.root=url.resolve(location.protocol+"//"+location.host,path.dirname(path.resolve(location.pathname.replace(/\/$/,"/index.html"),state.basePath))).replace(/\/?$/,"/");state.bookRoot=state.innerLanguage?url.resolve(state.root,".."):state.root};state.update($);module.exports=state},{jquery:1,path:4,url:10}],20:[function(require,module,exports){var baseKey="";module.exports={setBaseKey:function(key){baseKey=key},set:function(key,value){key=baseKey+":"+key;try{sessionStorage[key]=JSON.stringify(value)}catch(e){}},get:function(key,def){key=baseKey+":"+key;if(sessionStorage[key]===undefined)return def;try{var v=JSON.parse(sessionStorage[key]);return v==null?def:v}catch(err){return sessionStorage[key]||def}},remove:function(key){key=baseKey+":"+key;sessionStorage.removeItem(key)}}},{}],21:[function(require,module,exports){var $=require("jquery");var _=require("lodash");var events=require("./events");var buttons=[];function insertAt(parent,selector,index,element){var lastIndex=parent.children(selector).length;if(index<0){index=Math.max(0,lastIndex+1+index)}parent.append(element);if(index",{class:"dropdown-menu",html:''});if(_.isString(dropdown)){$menu.append(dropdown)}else{var groups=_.map(dropdown,function(group){if(_.isArray(group))return group;else return[group]});_.each(groups,function(group){var $group=$("
",{class:"buttons"});var sizeClass="size-"+group.length;_.each(group,function(btn){btn=_.defaults(btn||{},{text:"",className:"",onClick:defaultOnClick});var $btn=$("'; - var clipboard; - - gitbook.events.bind("page.change", function() { - - if (!ClipboardJS.isSupported()) return; - - // the page.change event is thrown twice: before and after the page changes - if (clipboard) { - // clipboard is already defined but we are on the same page - if (clipboard._prevPage === window.location.pathname) return; - // clipboard is already defined and url path change - // we can deduct that we are before page changes - clipboard.destroy(); // destroy the previous events listeners - clipboard = undefined; // reset the clipboard object - return; - } - - $(copyButton).prependTo("div.sourceCode"); - - clipboard = new ClipboardJS(".copy-to-clipboard-button", { - text: function(trigger) { - return trigger.parentNode.textContent; - } - }); - - clipboard._prevPage = window.location.pathname - - }); - -}); diff --git a/docs/libs/gitbook-2.6.7/js/plugin-fontsettings.js b/docs/libs/gitbook-2.6.7/js/plugin-fontsettings.js deleted file mode 100644 index a70f0fb..0000000 --- a/docs/libs/gitbook-2.6.7/js/plugin-fontsettings.js +++ /dev/null @@ -1,152 +0,0 @@ -gitbook.require(["gitbook", "lodash", "jQuery"], function(gitbook, _, $) { - var fontState; - - var THEMES = { - "white": 0, - "sepia": 1, - "night": 2 - }; - - var FAMILY = { - "serif": 0, - "sans": 1 - }; - - // Save current font settings - function saveFontSettings() { - gitbook.storage.set("fontState", fontState); - update(); - } - - // Increase font size - function enlargeFontSize(e) { - e.preventDefault(); - if (fontState.size >= 4) return; - - fontState.size++; - saveFontSettings(); - }; - - // Decrease font size - function reduceFontSize(e) { - e.preventDefault(); - if (fontState.size <= 0) return; - - fontState.size--; - saveFontSettings(); - }; - - // Change font family - function changeFontFamily(index, e) { - e.preventDefault(); - - fontState.family = index; - saveFontSettings(); - }; - - // Change type of color - function changeColorTheme(index, e) { - e.preventDefault(); - - var $book = $(".book"); - - if (fontState.theme !== 0) - $book.removeClass("color-theme-"+fontState.theme); - - fontState.theme = index; - if (fontState.theme !== 0) - $book.addClass("color-theme-"+fontState.theme); - - saveFontSettings(); - }; - - function update() { - var $book = gitbook.state.$book; - - $(".font-settings .font-family-list li").removeClass("active"); - $(".font-settings .font-family-list li:nth-child("+(fontState.family+1)+")").addClass("active"); - - $book[0].className = $book[0].className.replace(/\bfont-\S+/g, ''); - $book.addClass("font-size-"+fontState.size); - $book.addClass("font-family-"+fontState.family); - - if(fontState.theme !== 0) { - $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, ''); - $book.addClass("color-theme-"+fontState.theme); - } - }; - - function init(config) { - var $bookBody, $book; - - //Find DOM elements. - $book = gitbook.state.$book; - $bookBody = $book.find(".book-body"); - - // Instantiate font state object - fontState = gitbook.storage.get("fontState", { - size: config.size || 2, - family: FAMILY[config.family || "sans"], - theme: THEMES[config.theme || "white"] - }); - - update(); - }; - - - gitbook.events.bind("start", function(e, config) { - var opts = config.fontsettings; - if (!opts) return; - - // Create buttons in toolbar - gitbook.toolbar.createButton({ - icon: 'fa fa-font', - label: 'Font Settings', - className: 'font-settings', - dropdown: [ - [ - { - text: 'A', - className: 'font-reduce', - onClick: reduceFontSize - }, - { - text: 'A', - className: 'font-enlarge', - onClick: enlargeFontSize - } - ], - [ - { - text: 'Serif', - onClick: _.partial(changeFontFamily, 0) - }, - { - text: 'Sans', - onClick: _.partial(changeFontFamily, 1) - } - ], - [ - { - text: 'White', - onClick: _.partial(changeColorTheme, 0) - }, - { - text: 'Sepia', - onClick: _.partial(changeColorTheme, 1) - }, - { - text: 'Night', - onClick: _.partial(changeColorTheme, 2) - } - ] - ] - }); - - - // Init current settings - init(opts); - }); -}); - - diff --git a/docs/libs/gitbook-2.6.7/js/plugin-search.js b/docs/libs/gitbook-2.6.7/js/plugin-search.js deleted file mode 100644 index 747fcce..0000000 --- a/docs/libs/gitbook-2.6.7/js/plugin-search.js +++ /dev/null @@ -1,270 +0,0 @@ -gitbook.require(["gitbook", "lodash", "jQuery"], function(gitbook, _, $) { - var index = null; - var fuse = null; - var _search = {engine: 'lunr', opts: {}}; - var $searchInput, $searchLabel, $searchForm; - var $highlighted = [], hi, hiOpts = { className: 'search-highlight' }; - var collapse = false, toc_visible = []; - - function init(config) { - // Instantiate search settings - _search = gitbook.storage.get("search", { - engine: config.search.engine || 'lunr', - opts: config.search.options || {}, - }); - }; - - // Save current search settings - function saveSearchSettings() { - gitbook.storage.set("search", _search); - } - - // Use a specific index - function loadIndex(data) { - // [Yihui] In bookdown, I use a character matrix to store the chapter - // content, and the index is dynamically built on the client side. - // Gitbook prebuilds the index data instead: https://github.com/GitbookIO/plugin-search - // We can certainly do that via R packages V8 and jsonlite, but let's - // see how slow it really is before improving it. On the other hand, - // lunr cannot handle non-English text very well, e.g. the default - // tokenizer cannot deal with Chinese text, so we may want to replace - // lunr with a dumb simple text matching approach. - if (_search.engine === 'lunr') { - index = lunr(function () { - this.ref('url'); - this.field('title', { boost: 10 }); - this.field('body'); - }); - data.map(function(item) { - index.add({ - url: item[0], - title: item[1], - body: item[2] - }); - }); - return; - } - fuse = new Fuse(data.map((_data => { - return { - url: _data[0], - title: _data[1], - body: _data[2] - }; - })), Object.assign( - { - includeScore: true, - threshold: 0.1, - ignoreLocation: true, - keys: ["title", "body"] - }, - _search.opts - )); - } - - // Fetch the search index - function fetchIndex() { - return $.getJSON(gitbook.state.basePath+"/search_index.json") - .then(loadIndex); // [Yihui] we need to use this object later - } - - // Search for a term and return results - function search(q) { - let results = []; - switch (_search.engine) { - case 'fuse': - if (!fuse) return; - results = fuse.search(q).map(function(result) { - var parts = result.item.url.split('#'); - return { - path: parts[0], - hash: parts[1] - }; - }); - break; - case 'lunr': - default: - if (!index) return; - results = _.chain(index.search(q)).map(function(result) { - var parts = result.ref.split("#"); - return { - path: parts[0], - hash: parts[1] - }; - }) - .value(); - } - - // [Yihui] Highlight the search keyword on current page - $highlighted = $('.page-inner') - .unhighlight(hiOpts).highlight(q, hiOpts).find('span.search-highlight'); - scrollToHighlighted(0); - - return results; - } - - // [Yihui] Scroll the chapter body to the i-th highlighted string - function scrollToHighlighted(d) { - var n = $highlighted.length; - hi = hi === undefined ? 0 : hi + d; - // navignate to the previous/next page in the search results if reached the top/bottom - var b = hi < 0; - if (d !== 0 && (b || hi >= n)) { - var path = currentPath(), n2 = toc_visible.length; - if (n2 === 0) return; - for (var i = b ? 0 : n2; (b && i < n2) || (!b && i >= 0); i += b ? 1 : -1) { - if (toc_visible.eq(i).data('path') === path) break; - } - i += b ? -1 : 1; - if (i < 0) i = n2 - 1; - if (i >= n2) i = 0; - var lnk = toc_visible.eq(i).find('a[href$=".html"]'); - if (lnk.length) lnk[0].click(); - return; - } - if (n === 0) return; - var $p = $highlighted.eq(hi); - $p[0].scrollIntoView(); - $highlighted.css('background-color', ''); - // an orange background color on the current item and removed later - $p.css('background-color', 'orange'); - setTimeout(function() { - $p.css('background-color', ''); - }, 2000); - } - - function currentPath() { - var href = window.location.pathname; - href = href.substr(href.lastIndexOf('/') + 1); - return href === '' ? 'index.html' : href; - } - - // Create search form - function createForm(value) { - if ($searchForm) $searchForm.remove(); - if ($searchLabel) $searchLabel.remove(); - if ($searchInput) $searchInput.remove(); - - $searchForm = $('
', { - 'class': 'book-search', - 'role': 'search' - }); - - $searchLabel = $('",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 - - - - - - 3 Multi-Site Stratigraphy | Multi-Proxy Paleoecological Analysis Using R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
- - -
-
- -
-
-

3 Multi-Site Stratigraphy

-

Build a plot containing data for multiple proxies aligned by depth or year.

-

Methods based off of - https://cran.r-project.org/web/packages/tidypaleo/vignettes/strat_diagrams.html

-
-

3.1 Data Specifications

-

Data used in this analysis can be found in the github repo in the following files: FileS5_Impact_ProxyData.csv, FileS6_Reference_ProxyData.csv. Access the files here.

-
-
-

3.2 Getting Started

-

Install and load these packages

-
library(ggplot2)
-library(tidyverse)
-library(tidypaleo)
-library(ggh4x)
-

Optional - set a theme

-
theme_set(theme_paleo(8))
-

Set your working directory

-
setwd("FILEPATH")
-
-
-

3.3 Formatting proxydata file

-

For this analysis there should be two separate files for each site.

-

View these example datasets to see how your data should be set up:

-
# two spreadsheets in .csv format:
-  #1) a spreadsheet containing all the geochem data, like this
-      view(alta_lake_geochem)
-
-  #2) a spreadsheet containing all the abundance data, like this
-      view(keji_lakes_plottable)
-

For the impact site I arranged my proxy data into geochem and abundance files according to the formatting from the example data and saved them as proxydata_geochem_IMP.csv and proxydata_abundance_IMP.csv. I did the same for the reference core.

-
-
-

3.4 Plot the geochemical data

-

Begin with the impacted site

-
geochem_IMP2 <- read.csv("proxydata_geochem_IMP2.csv")
-

Plot the base stratigraphic diagram for your geochem data

-
geo_strat_IMP2 <- ggplot(geochem_IMP2, aes(x = value, y = depth)) +
-  geom_lineh() +
-  geom_point() +
-  facet_geochem_gridh(vars(param)) +
-  labs(x = NULL, y = "Depth (cm)") +
-  facetted_pos_scales(x = list(scale_x_continuous(limits = c(0,0.00025)),
-                               scale_x_continuous(limits = c(0,0.15)),
-                               scale_x_continuous(limits = c(-2,11)),
-                               scale_x_continuous(limits = c(0,10000)),
-                               scale_x_continuous(limits = c(0,0.025))),
-                               scale_y_reverse(breaks=seq(0,17, by=1), limits = c(17,0)))
-
-geo_strat_IMP2
-

Now load data and plot the reference site

-
geochem_REF3 <- read.csv("proxydata_geochem_REF3.csv")
-

Plot the base straitgraphic diagram for your geochem data

-
geo_strat_REF3 <- ggplot(geochem_REF3, aes(x = value, y = depth)) +
-  geom_lineh() +
-  geom_point() +
-  facet_geochem_gridh(vars(param)) +
-  labs(x = NULL, y = "Depth (cm)") +
-  facetted_pos_scales(x = list(scale_x_continuous(limits = c(0,0.00025)),
-                               scale_x_continuous(limits = c(0,0.15)),
-                               scale_x_continuous(limits = c(-2,11)),
-                               scale_x_continuous(limits = c(0,10000)),
-                               scale_x_continuous(limits = c(0,0.025))),
-                      scale_y_reverse(breaks=seq(0,17, by=1), limits = c(17,0)))
-
-geo_strat_REF3
-
-
-

3.5 Plot the diatom abundance data

-

For the impact site:

-
diatoms_IMP2 <- read.csv("proxydata_diatoms_IMP2.csv")
-
-#plot the base straitgraphic diagram for your geochem data
-diatom_strat_IMP2 <- ggplot(diatoms_IMP2, aes(x = rel_abund, y = depth)) +
-  geom_areah() +
-  geom_col_segsh() +
-  facet_abundanceh(vars(taxon), grouping = vars(location), rotate_facet_labels = 0) + 
-  labs(x = NULL, y = "Depth (cm)") +
-  facetted_pos_scales(x = list(scale_x_abundance(limits = c(0,100)),
-                               scale_x_abundance(limits = c(0,100))),
-                      scale_y_reverse(limits = c(17,0)))
-diatom_strat_IMP2
-

Load the abundance data for the REF3 site

-
diatoms_REF3 <- read.csv("proxydata_diatoms_REF3.csv")
-

Plot the base straitgraphic diagram for your geochem data

-
diatom_strat_REF3 <- ggplot(diatoms_REF3, aes(x = rel_abund, y = depth)) +
-  geom_areah() +
-  geom_col_segsh() +
-  facet_abundanceh(vars(taxon), grouping = vars(location), rotate_facet_labels = 0) + 
-  labs(x = NULL, y = "Depth (cm)") +
-  facetted_pos_scales(x = list(scale_x_abundance(limits = c(0,100)),
-                               scale_x_abundance(limits = c(0,100))),
-                      scale_y_reverse(limits = c(17,0)))
-
-diatom_strat_REF3
-
-
-

3.6 Arrange multiple stratigraphies

-

Use patchwork to put all the plots together on the same figure

-
library(patchwork)
-

Plot the abundance and geochem data together for the IMP2 site

-
strat_final_IMP2 <- wrap_plots(geo_strat_IMP2 + 
-    theme(strip.background = element_blank(), strip.text.y = element_blank()),
-    diatom_strat_IMP2 +
-    theme(axis.text.y.left = element_blank(), axis.ticks.y.left = element_blank()) +
-    labs(y = NULL), nrow = 1, widths = c(3, 1))
-
-strat_final_IMP2
-

Plot the abundance and geochem data together for the REF3 site

-
strat_final_REF3 <- wrap_plots(geo_strat_REF3 + 
-     theme(strip.background = element_blank(), strip.text.y = element_blank()),
-     diatom_strat_REF3 +
-     theme(axis.text.y.left = element_blank(), axis.ticks.y.left = element_blank()) +
-     labs(y = NULL), nrow = 1, widths = c(3, 1))
-
-strat_final_REF3
-

Plot all of the sites together

-
final_strat <- wrap_plots(strat_final_IMP2,strat_final_REF3, nrow=2, ncol=1)
-  
-final_strat
-

After plotting, make sure that all your data is aligned properly with the depth axis, make sure you have set your limits in the scale_y_reverse(limits = c()) argument to be fixed to the max scale depth

-
-
-

3.7 Adding points of interest

-
strat_final <- strat_final +
-  geom_hline(yintercept = c(0, 4, 8, 12, 16), col = "red", lty = 2, alpha = 1)
-
-
-

3.8 Change facets

-

If you want to change the position of facets in any of the datasets use mutate

-
geo_strat %>%
-  mutate(param = fct_relevel(param, "chla", "Cd/Al", "Zn/Al")) %>%
-  ggplot(aes(x = value, y = depth)) +
-  ...
-
-
-

3.9 Secondary axes

-

If you want to add year as secondary y-axis create an age-depth model

-
geo_adm <- age_depth_model(geochem, depth = depth, age = age)
-
-geo_strat +
-  scale_y_depth_age(geo_adm, age_name = "year")
-
-
-

3.10 Final Figure

-
-[Bosch et al. 2024]: Multi-proxy stratigraphy of the impact pond core [A] and reference pond core [B]. The secondary y-axis shows the 210Pb dates that were assigned to selected layers of the core using the CRS model, and the dates are aligned by midpoint depth (cm). Grey shaded bars across the stratigraphy represent the period gannets are known to be nesting in Cape St. Mary’s, based on the data found in File S1. -

-Figure 3.1: [Bosch et al. 2024]: Multi-proxy stratigraphy of the impact pond core [A] and reference pond core [B]. The secondary y-axis shows the 210Pb dates that were assigned to selected layers of the core using the CRS model, and the dates are aligned by midpoint depth (cm). Grey shaded bars across the stratigraphy represent the period gannets are known to be nesting in Cape St. Mary’s, based on the data found in File S1. -

-
- -
-
-
- -
-
-
- - -
-
- - - - - - - - - - - - - diff --git a/docs/multiproxy-analysis-vs.-nesting-pairs.html b/docs/multiproxy-analysis-vs.-nesting-pairs.html deleted file mode 100644 index 2cc3033..0000000 --- a/docs/multiproxy-analysis-vs.-nesting-pairs.html +++ /dev/null @@ -1,487 +0,0 @@ - - - - - - - 5 Multiproxy Analysis vs. Nesting Pairs | Multi-Proxy Paleoecological Analysis Using R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
- - -
-
- -
-
-

5 Multiproxy Analysis vs. Nesting Pairs

-

Data used in this analysis can be found in the github repo in the following files: FileS2_MonitoringData.csv and FileS9_ZScores_CSM-IMP.csv.

-
-

5.1 Getting Started

-

Required pkgs for the analysis:

-
library(ggplot2)
-library(dplyr)
-library(viridis)
-library(ggpubr)
-library(tidyverse)
-
-
-

5.2 Example for calculating Z-Scores

-

Here is one example of how you can calculate the average d15N and standard deviation of d15N:

-
# Define your data
-
-d15N <- IMP2_isotopes$d15N
-percentN <- IMP2_isotopes$N.percent
-
-d13C <- IMP2_isotopes$d15N
-percentC <- IMP2_isotopes$C.percent
-
# calculate z-scores for d15N and d13C
-
-Zscore_isotopes <- IMP2_isotopes %>% 
-  mutate(d15N_z = (d15N - mean(d15N))/sd(d15N), 
-         d13C_z = (d13C - mean(d13C))/sd(d13C),
-         percentN_z = (percentN - mean(percentN))/sd(percentN),
-         percentN_z = (percentN - mean(percentN))/sd(percentN))
-

Export the values to a .csv or excel file

-
write.csv(Zscore_isotopes, "filename")
-
-
-

5.3 Load the data

-

Here I load data for the impact site only. After calculating z-scores for the d15N, d15C, chlorophyll a, phosphorus, cadmium , zinc and diatom abundance data (only for S.construens), I arranged it into a file called z-scores.csv.

-

The .csv file I am working is called z-scores.csv, set up like this:

- - - - - - - - - - - - - - - - - - - - - - - -
midpointd15Nz_d15Nchlaz_chlaetc…Mean
-------
-

NOTE: Make sure the file contains a column to plot arithmetic mean.

-

Load the data in R

-
zscores <- read.csv("Data/FileS7_ZScores_CSM-IMP.csv")
-

The colony population data can be found in the Census data file, and contains counts for each species by year.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
YearNorthern gannetBlack-legged kittiwakeCommon murre
1883
2023
-

Read the population data into R from another .csv file, mine is in a file called /Data

-
popn <- read.csv("Data/FileS2_MonitoringData.csv")
-
-
-

5.4 Plot the proxy data

-

Plot each of your proxies using both geom_line and geom_point to plot a line graph for your data.

-
z_plot <- ggplot() +
-  geom_smooth(zscores, mapping=aes(x=year, y=mean), method="lm", na.rm=TRUE, formula = y ~ poly(x, 2), color="lightgrey", fill="lightgrey", linetype = 0) +
-  scale_x_continuous(breaks=seq(1800,2023, by=10), limits = c(1800,2025), position="top") +
-  
-  #plot mean line (move this to the last line if you want the mean line to lay overtop your proxy data)
-  geom_line(data=zscores[!is.na(zscores$mean),], mapping=aes(x=year, y=mean), color="black", linewidth=1,) +
-  
-  #plot chlorophyll data 
-  geom_line(data=zscores[!is.na(zscores$z_chla),], mapping=aes(x=year, y=z_chla), color="green") +
-  geom_point(data=zscores, mapping=aes(x=year, y=z_chla), color="green", shape=16, size=2) + 
-  
-  #plot d15N data
-  geom_line(data=zscores[!is.na(zscores$z_d15N),], mapping=aes(x=year, y=z_d15N), color="blue3") +
-  geom_point(data=zscores, mapping=aes(x=year, y=z_d15N), color="blue3", shape=4, size=2) +
-  
-  #plot Phosphorus data
-  geom_line(data=zscores[!is.na(zscores$z_P),], mapping=aes(x=year, y=z_P), color="orange") +
-  geom_point(data=zscores, mapping=aes(x=year, y=z_P), color="orange", shape=15, size=2) +
-  
-  #plot Zinc data
-  geom_line(data=zscores[!is.na(zscores$z_Zn),], mapping=aes(x=year, y=z_Zn), color="firebrick1") +
-  geom_point(data=zscores, mapping=aes(x=year, y=z_Zn), color="firebrick1", shape=25, size=2) +
-  
-  #plot Cadmium data
-  geom_line(data=zscores[!is.na(zscores$Z_Cd),], mapping=aes(x=year, y=Z_Cd), color="red4") +
-  geom_point(data=zscores, mapping=aes(x=year, y=Z_Cd), color="red4", shape=17, size=2) +
-  
-  #plot diatom data
-  geom_line(data=zscores[!is.na(zscores$z_S.cons),], mapping=aes(x=year, y=z_S.cons), color="mediumaquamarine") +
-  geom_point(data=zscores, mapping=aes(x=year, y=z_S.cons), color="mediumaquamarine", shape=20, size=2) +
-  
-  #set a theme
-  theme_classic()+
-  theme(panel.grid.major.x=element_line(), 
-        text = element_text(size = 12),
-        axis.text.x.top= element_text(vjust=0.5, angle=90, color = "black"),
-        axis.text.y = element_text(color = "black"),
-        axis.title.x = element_blank())+
-  
-  #set axis labels
-  xlab(NULL)+
-  ylab("z-score")
-

Run z_plot to view the figure. Here I used !is.na to ignore all NA values in the dataset. -You can use HTML color codes in place for R colors for more options.

-
-
-

5.5 Plot the population data

-

Define each variable

-
NOGA <- popn$Northern.gannet
-COMU <- popn$Common.murre
-BLKI <- popn$Black.legged.kittiwake
-year <- popn$Year
-

Plot using ggplot

-
popn_plot <- ggplot(popn, (aes(x=year))) +
-
-  geom_point(aes(y=BLKI), width=1, color="hotpink3", size=2) +
-  geom_line(aes(y=BLKI), position = "stack", color = "hotpink3", size = 0.5, linetype="dotted") +
-
-  geom_point(aes(y=NOGA), width=1, color="slateblue4", size=2) +
-  geom_line(aes(y=NOGA), position = "stack", color = "slateblue4", size = 0.5, linetype="dotted") +  
-  
-  geom_point(aes(y=COMU), width=1, color="olivedrab4", size=2) +
-  geom_line(aes(y=COMU), position = "stack", color = "olivedrab4", size = 0.5, linetype="dotted") +
-  
-  scale_x_continuous(breaks=seq(1800,2023, by=10), limits = c(1800,2025), position="bottom") +
-  scale_y_continuous(breaks=seq(0,16000, by=4000)) +
-  
-  ylab("nesting pairs")+
-  
-  theme_classic()+
-  theme(panel.grid.major.x=element_line(), 
-        text = element_text(size = 12, color = "black"), 
-        axis.text.x = element_text(margin = margin(t=1), color = "black"),
-        axis.text.y = element_text(margin = margin(t=1), color = "black"),
-        axis.title.x = element_blank(), 
-        axis.text.x.bottom = element_text(vjust=0.5, angle=90))
-
-
-

5.6 Arrange the figures together

-

Plot both your population counts and proxy data onto the same figure

-
ggarrange(z_plot, popn_plot, 
-          ncol = 1, nrow = 2,
-          heights=c(15,12),
-          align="hv")
-
-
-

5.7 Final Figure

-
-[Bosch et al. 2024]: Summary of ornithogenic proxies measured in the impact pond, with Z-score values represented as points [top figure]. X-axis dates are extrapolated from 210Pb dates via polynomial regression. The thick black line shows the calculated arithmetic mean, fitted with a polynomial regression using ggplot2 in R. and the shaded grey area represents the confidence interval. A cut-off was set at ca. 1808 CE (~11.25 cm) to ensure data continuity due to variations in proxy data depth. Historical monitoring data for Northern gannets (Morus bassanus), common murres (Uria aalge) and black-legged kittiwakes (Rissa tridactyla) nesting on Bird Rock and surrounding mainland areas (File S1) [bottom figure]. -

-Figure 5.1: [Bosch et al. 2024]: Summary of ornithogenic proxies measured in the impact pond, with Z-score values represented as points [top figure]. X-axis dates are extrapolated from 210Pb dates via polynomial regression. The thick black line shows the calculated arithmetic mean, fitted with a polynomial regression using ggplot2 in R. and the shaded grey area represents the confidence interval. A cut-off was set at ca. 1808 CE (~11.25 cm) to ensure data continuity due to variations in proxy data depth. Historical monitoring data for Northern gannets (Morus bassanus), common murres (Uria aalge) and black-legged kittiwakes (Rissa tridactyla) nesting on Bird Rock and surrounding mainland areas (File S1) [bottom figure]. -

-
- -
-
-
- -
-
-
- - -
-
- - - - - - - - - - - - - diff --git a/docs/reference-keys.txt b/docs/reference-keys.txt deleted file mode 100644 index 20ccebc..0000000 --- a/docs/reference-keys.txt +++ /dev/null @@ -1,58 +0,0 @@ -fig:fig1 -fig:fig2 -fig:fig3 -fig:fig4 -fig:fig5 -fig:fig6 -fig:fig7 -study-methods -study-site-description -resources -download-data -install-packages -dating-profiles -getting-started -load-the-data -plot-210-pb-dating-profiles -final-figure -breakpoint-analysis -getting-started-1 -load-and-prepare-the-data -plot-the-data -plot-conisss -plot-a-broken-stick-diagram -final-figure-1 -multi-site-stratigraphy -data-specifications -getting-started-2 -formatting-proxydata-file -plot-the-geochemical-data -plot-the-diatom-abundance-data -arrange-multiple-stratigraphies -adding-points-of-interest -change-facets -secondary-axes -final-figure-2 -generalized-additive-models -getting-started-3 -fitting-gams-using-mgcv -chlorophyll-a-data -apply-the-reml-function-to-your-data -transform-your-data -identify-significant-changes -plot-the-results -d15n -d13c -phosphorus -zincal-and-cdal -diatom-s.construens -plotting-the-final-gam -final-figure-3 -multiproxy-analysis-vs.-nesting-pairs -getting-started-4 -example-for-calculating-z-scores -load-the-data-1 -plot-the-proxy-data -plot-the-population-data -arrange-the-figures-together -final-figure-4 diff --git a/docs/search_index.json b/docs/search_index.json deleted file mode 100644 index 1178044..0000000 --- a/docs/search_index.json +++ /dev/null @@ -1 +0,0 @@ -[["index.html", "Multi-Proxy Paleoecological Analysis Using R Welcome! 0.1 Study Methods 0.2 Study Site Description 0.3 Resources", " Multi-Proxy Paleoecological Analysis Using R Johanna Bosch 2024-03-05 Welcome! This book can be used to learn how to conduct a paleoecological analysis in R. The project methods described here are formally reviewed and cited in the following paper: Bosch J, Álvarez-Manzaneda I, Smol J, Michelutti N, Robertson GJ, Wilhelm SI, Montevecchi WA. 2024 Blending census and paleolimnological data allows for tracking the establishment and growth of a major gannet colony over several centuries. Proceedings of the Royal Society B [in review]. 0.1 Study Methods For this study, we gathered sediment records from a pond situated 240m upwind of the northern gannet (Morus bassanus) colony in Cape St Mary’s Ecological Reserve (Newfoundland, CA) that receives seabird nutrients. We reconstructed the population trends of the gannets using multiple proxies (δ15N, chlorophyll a, phosphorus, cadmium, zinc, ornithogenic diatoms) related to seabird nutrient inputs into freshwater catchments. By aligning shifts in seabird-related proxies to historical census data, we reveal how paleo-reconstructions can accurately follow known population counts. 0.2 Study Site Description Samples were taken from Cape St. Mary’s Ecological Reserve, in Newfoundland. The main nesting site within the Reserve is named Bird Rock. A review of the paleolimnological process at play are shown in the graphical abstract below. Two sediment cores were obtained for the study, one from the impacted pond (ID: CSM-IMP-2) ~240 m away from the colony, and another from a reference pond (study control, ID: CSM-REF-3) more than 1 km away from the colony. Figure 0.1: [Bosch et al. 2024]: Seabird nutrient transfer from Bird Rock, in Cape St. Mary’s Ecological Reserve (Newfoundland) to a pond nearby the seabird colony. Seen in the illustration are northern gannets (Morus bassanus) and black-legged kittiwakes (Rissa tridactyla), which both nest within the Reserve on an annual basis. Figure 0.2: [Bosch et al. 2024]: Map of sampling locations relative to Bird Rock 0.3 Resources 0.3.1 Download data Download some of the example data from my github repo - Paleo_Analysis_Using_R 0.3.2 Install packages Install all of the packages used in this analysis: REQUIRED: Tidyverse - Wickham H, Averick M, Bryan J, Chang W, McGowan LD, François R, Grolemund G, Hayes A, Henry L, Hester J, Kuhn M, Pedersen TL, Miller E, Bache SM, Müller K, Ooms J, Robinson D, Seidel DP, Spinu V, Takahashi K, Vaughan D, Wilke C, Woo K, Yutani H (2019). “Welcome to the tidyverse.” Journal of Open Source Software, 4(43), 1686. Tidypaleo:Dunnington DW, Libera N, Kurek J, Spooner IS, Gagnon GA (2022). “tidypaleo: Visualizing Paleoenvironmental Archives Using ggplot2.” Journal of Statistical Software, 101(7), 1–20. Vegan- Oksanen J, Simpson G, Blanchet F, Kindt R, Legendre P, Minchin P et al. (2022). vegan: Community Ecology Package. R package version 2.6-4 Ggplot2and Ggpubr- Wickham H (2016). ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. ISBN 978-3-319-24277-4, Dplyr- Wickham H, François R, Henry L, Müller K, Vaughan D (2023). dplyr: A Grammar of Data Manipulation. R package version 1.1.4 Viridis- Garnier, Simon, Ross, Noam, Rudis, Robert, Camargo, Pedro A, Sciaini, Marco, Scherer, Cédric (2024). viridis(Lite) - Colorblind-Friendly Color Maps for R. doi:10.5281/zenodo.4679423, viridis package version 0.6.5 Note that installation may differ depending on the type of operating system you’re using. # to install the tidy packages on Ubuntu, start by opening your terminal and installing Libcurl and Vegan sudo apt-get install -y libxml2-dev libcurl4-openssl-dev libssl-dev libv8-dev sudo apt-get install -y r-cran-vegan "],["dating-profiles.html", "1 Dating Profiles 1.1 Getting Started 1.2 Load the data 1.3 Plot 210-Pb dating profiles 1.4 Final Figure", " 1 Dating Profiles 1.1 Getting Started Load the following packages library(ggplot2) library(dplyr) library(viridis) library(ggpubr) 1.2 Load the data I used data from the following files found in the Github repo FileS3_Dating_CSM-IMP.csv and FileS4_Dating_CSM-REF.csv. Access the files here. Load your data for impact and reference sites into R dp_IMP2 <- read.csv("Data/FileS2_Dating_CSM-IMP.csv") dp_REF3 <- read.csv("Data/FileS3_Dating_CSM-REF.csv") Define columns for core depth/year, activity, sedimentation rate (with error) in both files #core depth depth_IMP2 <- dp_IMP2$midpoint depth_REF3 <- dp_REF3$midpoint #core year year_IMP <- dp_IMP2$year year_REF <- dp_REF3$year #210-Pb activity act_IMP2 <- dp_IMP2$activity act_REF3 <- dp_REF3$activity # sedimentation rate sed_IMP2 <- dp_IMP2$sedimetation_rate sed_REF3 <- dp_REF3$sedimetation_rate error_IMP <- dp_IMP2$sr_error error_REF <- dp_REF3$sr_error 1.3 Plot 210-Pb dating profiles Plot the activity and sedimentation rate activity <- ggplot() + geom_point(data = dp_IMP2, (aes(x= depth_IMP2, y=act_IMP2)), shape=22, fill="paleturquoise4", size=3, color = "paleturquoise4", alpha=0.5) + geom_line(data = dp_IMP2, (aes(x = depth_IMP2, y=act_IMP2)), color="paleturquoise4") + geom_point(data = dp_REF3, (aes(x = depth_REF3, y=act_REF3)), size =3, color="palegreen3") + geom_line(data = dp_REF3, (aes(x = depth_REF3, y=act_REF3)), color="palegreen3") + labs(x="Midpoint depth (cm)", y="Pb-210 Activity (Bq/kg)") + scale_x_continuous(breaks=seq(0,19, by= 1), limits = c(0,19)) + theme_classic()+ theme(text = element_text(size = 12), panel.grid.major.x=element_line(), axis.text.y = element_text(size=12), axis.title.y = element_text(margin = margin(t=0, r= 20, b=0, l=0))) activity sed.rate <- ggplot() + geom_point(data = dp_IMP2, (aes(x = depth_IMP2, y=sed_IMP2)),shape=21, color = "paleturquoise4") + geom_line(data = dp_IMP2, (aes(x = depth_IMP2, y=sed_IMP2)), color="paleturquoise4") + geom_point(data = dp_REF3, (aes(x = depth_REF3, y=sed_REF3)), color="palegreen3") + geom_line(data = dp_REF3, (aes(x = depth_REF3, y=sed_REF3)), color="palegreen3") + labs(x = "Core Depth (cm/yr)", y = "Sedimentation rate (cm/yr)") + scale_x_continuous(breaks=seq(0,19, by= 1), limits = c(0,19)) + theme_classic() + theme(panel.grid.major.x=element_line(), text = element_text(size = 12), axis.text.y = element_text(size=12), axis.text.x = element_text(size=12), axis.title.y = element_text(margin = margin(t=0, r= 20, b=0, l=0))) par(mar = c(10, 10,10,10)) Plot year based on core depth year <- ggplot() + geom_point(data = dp_IMP2, (aes(x = year_IMP, y= depth_IMP2)), na.rm=TRUE, shape=22, fill="paleturquoise4", size=3, color = "paleturquoise4", alpha=0.5) + geom_line(data = dp_IMP2, (aes(x = year_IMP, y= depth_IMP2)), na.rm=TRUE, color = "paleturquoise4") + stat_smooth(dp_IMP2, mapping=aes(year_IMP, depth_IMP2), method="lm") + geom_errorbar(aes(x=year_IMP, xmin=year_IMP-error_IMP, xmax=year_IMP+error_IMP, y=depth_IMP2, ymax=NULL, ymin=NULL), width=.2) + labs(x = "Year (CRS model)", y = "Midpoint depth (cm)") + scale_x_continuous(breaks=seq(1800,2023, by= 20)) + scale_y_reverse(breaks=seq(0,15, by=1), expand=c(0,0)) + theme_classic() + theme(panel.grid.major.x=element_line(), text = element_text(size = 12), axis.text.y = element_text(size=12), axis.text.x = element_text(size=12)) year 1.4 Final Figure ggarrange(activity, year, ncol = 1, nrow = 2, common.legend=TRUE,legend=c("top")) Figure 1.1: [Bosch et al. 2024]: 210-Pb activity (Bq/kg) over the depth of the impact core (CSM-IMP-2, blue squares) and the reference core (CSM-REF-3, green circles). The 210-Pb dates assigned to the midpoint depth of the cores using a constant rate of supply (CRS) dating model are shown in the smaller, inset graph, where pink trend lines represent the second order polynomial regression for each core. "],["breakpoint-analysis.html", "2 Breakpoint Analysis 2.1 Getting Started 2.2 Load and prepare the data 2.3 Plot the data 2.4 Final Figure", " 2 Breakpoint Analysis This is a breakpoint analysis in R for metal(loid) data obtained from individual coring sites. I used data containing more than 20 metals, and their concentrations at each depth of the impacted core. My data files can be found in the Github repo, called FileS7_Metalloids_CSM-IMP.csv and FileS8_Metalloids_CSM-REF.csv. Access the files here. 2.1 Getting Started Begin by installing all the required packages using install/packages() if you haven’t already. Once installed, load the packages in R #load the tidy libraries library(tidyverse) library(tidypaleo) library(vegan) 2.2 Load and prepare the data Load your data for impact and reference sites into R metals_IMP <- read.csv("Data/FileS6_Metalloids_CSM-IMP.csv") metals_REF <- read.csv("Data/FileS7_Metalloids_CSM-REF.csv") Transform the data into long format metals_long_IMP <- metals_IMP %>% pivot_longer(!depth, names_to = "metals", values_to = "concentration") Make sure depth column is numeric metals_long_IMP$depth <- as.numeric(metals_long_IMP$depth) 2.3 Plot the data 2.3.1 Plot CONISSS Run the stratigraphically constrained cluster analysis on your data (CONISS) nested_coniss_IMP <- metals_long_IMP %>% nested_data(depth, metals, concentration) %>% nested_chclust_coniss() Plot the cluster analysis results plot(nested_coniss_IMP) 2.3.2 Plot a broken stick diagram broken_stick_plot <- nested_coniss_IMP %>% select(broken_stick) %>% unnest(broken_stick) %>% tidyr::gather(type, value, broken_stick_dispersion, dispersion) %>% ggplot(aes(x = n_groups, y = value, col = type)) + geom_line() + geom_point() 2.4 Final Figure Figure 2.1: [Bosch et al. 2024]: Dendrogram (LEFT) showing the distinct breakpoints in the metal(loid)s data across the core depth (cm) of CSM-IMP-2, and a line plot (RIGHT) showing the broken stick dispersion plot for the breakpoint analysis, where value is a measure of the magnitude of the variable being analyzed. Created using the tidyverse and tidypaleo packages available in R (v.4.2.1) software. "],["multi-site-stratigraphy.html", "3 Multi-Site Stratigraphy 3.1 Data Specifications 3.2 Getting Started 3.3 Formatting proxydata file 3.4 Plot the geochemical data 3.5 Plot the diatom abundance data 3.6 Arrange multiple stratigraphies 3.7 Adding points of interest 3.8 Change facets 3.9 Secondary axes 3.10 Final Figure", " 3 Multi-Site Stratigraphy Build a plot containing data for multiple proxies aligned by depth or year. Methods based off of - https://cran.r-project.org/web/packages/tidypaleo/vignettes/strat_diagrams.html 3.1 Data Specifications Data used in this analysis can be found in the github repo in the following files: FileS5_Impact_ProxyData.csv, FileS6_Reference_ProxyData.csv. Access the files here. 3.2 Getting Started Install and load these packages library(ggplot2) library(tidyverse) library(tidypaleo) library(ggh4x) Optional - set a theme theme_set(theme_paleo(8)) Set your working directory setwd("FILEPATH") 3.3 Formatting proxydata file For this analysis there should be two separate files for each site. View these example datasets to see how your data should be set up: # two spreadsheets in .csv format: #1) a spreadsheet containing all the geochem data, like this view(alta_lake_geochem) #2) a spreadsheet containing all the abundance data, like this view(keji_lakes_plottable) For the impact site I arranged my proxy data into geochem and abundance files according to the formatting from the example data and saved them as proxydata_geochem_IMP.csv and proxydata_abundance_IMP.csv. I did the same for the reference core. 3.4 Plot the geochemical data Begin with the impacted site geochem_IMP2 <- read.csv("proxydata_geochem_IMP2.csv") Plot the base stratigraphic diagram for your geochem data geo_strat_IMP2 <- ggplot(geochem_IMP2, aes(x = value, y = depth)) + geom_lineh() + geom_point() + facet_geochem_gridh(vars(param)) + labs(x = NULL, y = "Depth (cm)") + facetted_pos_scales(x = list(scale_x_continuous(limits = c(0,0.00025)), scale_x_continuous(limits = c(0,0.15)), scale_x_continuous(limits = c(-2,11)), scale_x_continuous(limits = c(0,10000)), scale_x_continuous(limits = c(0,0.025))), scale_y_reverse(breaks=seq(0,17, by=1), limits = c(17,0))) geo_strat_IMP2 Now load data and plot the reference site geochem_REF3 <- read.csv("proxydata_geochem_REF3.csv") Plot the base straitgraphic diagram for your geochem data geo_strat_REF3 <- ggplot(geochem_REF3, aes(x = value, y = depth)) + geom_lineh() + geom_point() + facet_geochem_gridh(vars(param)) + labs(x = NULL, y = "Depth (cm)") + facetted_pos_scales(x = list(scale_x_continuous(limits = c(0,0.00025)), scale_x_continuous(limits = c(0,0.15)), scale_x_continuous(limits = c(-2,11)), scale_x_continuous(limits = c(0,10000)), scale_x_continuous(limits = c(0,0.025))), scale_y_reverse(breaks=seq(0,17, by=1), limits = c(17,0))) geo_strat_REF3 3.5 Plot the diatom abundance data For the impact site: diatoms_IMP2 <- read.csv("proxydata_diatoms_IMP2.csv") #plot the base straitgraphic diagram for your geochem data diatom_strat_IMP2 <- ggplot(diatoms_IMP2, aes(x = rel_abund, y = depth)) + geom_areah() + geom_col_segsh() + facet_abundanceh(vars(taxon), grouping = vars(location), rotate_facet_labels = 0) + labs(x = NULL, y = "Depth (cm)") + facetted_pos_scales(x = list(scale_x_abundance(limits = c(0,100)), scale_x_abundance(limits = c(0,100))), scale_y_reverse(limits = c(17,0))) diatom_strat_IMP2 Load the abundance data for the REF3 site diatoms_REF3 <- read.csv("proxydata_diatoms_REF3.csv") Plot the base straitgraphic diagram for your geochem data diatom_strat_REF3 <- ggplot(diatoms_REF3, aes(x = rel_abund, y = depth)) + geom_areah() + geom_col_segsh() + facet_abundanceh(vars(taxon), grouping = vars(location), rotate_facet_labels = 0) + labs(x = NULL, y = "Depth (cm)") + facetted_pos_scales(x = list(scale_x_abundance(limits = c(0,100)), scale_x_abundance(limits = c(0,100))), scale_y_reverse(limits = c(17,0))) diatom_strat_REF3 3.6 Arrange multiple stratigraphies Use patchwork to put all the plots together on the same figure library(patchwork) Plot the abundance and geochem data together for the IMP2 site strat_final_IMP2 <- wrap_plots(geo_strat_IMP2 + theme(strip.background = element_blank(), strip.text.y = element_blank()), diatom_strat_IMP2 + theme(axis.text.y.left = element_blank(), axis.ticks.y.left = element_blank()) + labs(y = NULL), nrow = 1, widths = c(3, 1)) strat_final_IMP2 Plot the abundance and geochem data together for the REF3 site strat_final_REF3 <- wrap_plots(geo_strat_REF3 + theme(strip.background = element_blank(), strip.text.y = element_blank()), diatom_strat_REF3 + theme(axis.text.y.left = element_blank(), axis.ticks.y.left = element_blank()) + labs(y = NULL), nrow = 1, widths = c(3, 1)) strat_final_REF3 Plot all of the sites together final_strat <- wrap_plots(strat_final_IMP2,strat_final_REF3, nrow=2, ncol=1) final_strat After plotting, make sure that all your data is aligned properly with the depth axis, make sure you have set your limits in the scale_y_reverse(limits = c()) argument to be fixed to the max scale depth 3.7 Adding points of interest strat_final <- strat_final + geom_hline(yintercept = c(0, 4, 8, 12, 16), col = "red", lty = 2, alpha = 1) 3.8 Change facets If you want to change the position of facets in any of the datasets use mutate geo_strat %>% mutate(param = fct_relevel(param, "chla", "Cd/Al", "Zn/Al")) %>% ggplot(aes(x = value, y = depth)) + ... 3.9 Secondary axes If you want to add year as secondary y-axis create an age-depth model geo_adm <- age_depth_model(geochem, depth = depth, age = age) geo_strat + scale_y_depth_age(geo_adm, age_name = "year") 3.10 Final Figure Figure 3.1: [Bosch et al. 2024]: Multi-proxy stratigraphy of the impact pond core [A] and reference pond core [B]. The secondary y-axis shows the 210Pb dates that were assigned to selected layers of the core using the CRS model, and the dates are aligned by midpoint depth (cm). Grey shaded bars across the stratigraphy represent the period gannets are known to be nesting in Cape St. Mary’s, based on the data found in File S1. "],["generalized-additive-models.html", "4 Generalized Additive Models 4.1 Getting Started 4.2 Fitting GAMs using mgcv 4.3 Plotting the final GAM 4.4 Final Figure", " 4 Generalized Additive Models Data used in this analysis can be found in the github repo in the following files: FileS4_Impact_ProxyData.xlsx, FileS5_Reference_ProxyData.xlsx. Access the files here. Each proxy should have a seperate file containing z_score data, which I used in the analysis. 4.1 Getting Started Install the following packages mgcv, analogue, ggplot2, mvnfast, gratia, viridis If you’re using ubuntu, run this first to install the dependency RCPArmadillo and mvnfast for gratia sudo apt-get update -y sudo apt-get install -y r-cran-rcpparmadillo sudo apt-get install -y r-cran-mvnfast Load packages library(mgcv) # For gams library(ggplot2) # For plotting library(analogue) # For general use and support of other packages library(gratia) # For derivatives to identify significant periods of change library(viridis) # Package to use colours 4.2 Fitting GAMs using mgcv Here I use the mixed model approach via restricted maximum likelihood (REML). Start by loading a local function for first derivatives signifD <- function(x, d, upper, lower, eval = 0) { miss <- upper > eval & lower < eval incr <- decr <- x want <- d > eval incr[!want | miss] <- NA want <- d < eval decr[!want | miss] <- NA list(incr = incr, decr = decr) } 4.2.1 Chlorophyll a data Read the chlorophyll a data into R: pd_chlA <-read.csv("chlA.csv") head(pd_chlA) Check that data looks correct 4.2.1.1 Apply the REML function to your data chlA_gam<-gam(chlA~s(year, k = 26), data= pd_chlA, method="REML") gam.check(chlA_gam) Plot your results plot(chlA_gam) And now add standard error fit_gcv<- predict(chlA_gam, data = pd_chlA, se.fit = TRUE, length.out=200) crit.t <- qt(0.975, df.residual(chlA_gam)) chlA_new <- data.frame(Year = pd_chlA[["year"]], fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) chlA_new <- transform(chlA_new, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) 4.2.1.2 Transform your data You need equal lengths everywhere (i.e., 200 rows) for the following functions to work chlA_new_sigperiod<-data.frame(approx(chlA_new$Year, chlA_new$fit, n=200)) colnames(chlA_new_sigperiod)<-c("Year", "fit") Check that it looks right using head(chlA_new_sigperiod) 4.2.1.3 Identify significant changes Identify derivatives of significant value chlA_der<-derivatives(chlA_gam, type="central", n=200) draw(chlA_der) chlA_sig<-signifD(chlA_new_sigperiod$fit, d= chlA_der$derivative, chlA_der$upper, chlA_der$lower) chlA_sig 4.2.1.4 Plot the results chlA<-ggplot()+ geom_ribbon(data=chlA_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+ geom_line(data= chlA_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+ geom_line(data= chlA_new_sigperiod, mapping=aes(y=BTP_chlA_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase geom_line(data=chlA_new_sigperiod, mapping=aes(y=BTP_chlA_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease geom_point(data=pd_chlA, aes(y=chlA, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+ scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+ ylim(c(-0.01, 0.16))+ labs(x=NULL, y=NULL) + theme_classic() + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold")) chlA Now do the same for every other proxy, here my dataset includes data for d15N, d13C, Phosphorus, Zinc/Al, Cadmium/Al, and relative abundance of two dominant diatom species. 4.2.2 d15N pd_d15N <-read.csv("d15N.csv") head(pd_d15N) #Check that data looks correct d15N_gam<-gam(d15N~s(year, k = 20), data= pd_d15N, method="REML") gam.check(d15N_gam) plot(d15N_gam) fit_gcv<- predict(d15N_gam, data = pd_d15N, se.fit = TRUE, length.out=200) crit.t <- qt(0.975, df.residual(d15N_gam)) d15N_new <- data.frame(Year = pd_d15N[["year"]], fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) d15N_new <- transform(d15N_new, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) d15N_new_sigperiod<-data.frame(approx(d15N_new$Year, d15N_new$fit, n=200)) colnames(d15N_new_sigperiod)<-c("Year", "fit") head(d15N_new_sigperiod) # Check that it looks right. BTP_d15N_der<-derivatives(d15N_gam, type="central", n=200) draw(BTP_d15N_der) BTP_d15N_sig<-signifD(d15N_new_sigperiod$fit, d= BTP_d15N_der$derivative, BTP_d15N_der$upper, BTP_d15N_der$lower) BTP_d15N_sig d15N<-ggplot()+ geom_ribbon(data=d15N_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+ geom_line(data= d15N_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+ geom_line(data= d15N_new_sigperiod, mapping=aes(y=BTP_d15N_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase geom_line(data=d15N_new_sigperiod, mapping=aes(y=BTP_d15N_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease geom_point(data=pd_d15N, aes(y= d15N, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+ scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+ ylim(c(-2, 13))+ labs(x=NULL, y=NULL) + theme_classic() + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold")) d15N 4.2.3 d13C pd_d13C <-read.csv("d13C.csv") head(pd_d13C) #Check that data looks correct d13C_gam<-gam(d13C~s(year, k = 19), data= pd_d13C, method="REML") gam.check(d13C_gam) plot(d13C_gam) fit_gcv<- predict(d13C_gam, data = pd_d13C, se.fit = TRUE, length.out=200) crit.t <- qt(0.975, df.residual(d13C_gam)) d13C_new <- data.frame(Year = pd_d13C[["year"]], fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) d13C_new <- transform(d13C_new, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) d13C_new_sigperiod<-data.frame(approx(d13C_new$Year, d13C_new$fit, n=200)) colnames(d13C_new_sigperiod)<-c("Year", "fit") head(d13C_new_sigperiod) BTP_d13C_der<-derivatives(d13C_gam, type="central", n=200) draw(BTP_d13C_der) BTP_d13C_sig<-signifD(d13C_new_sigperiod$fit, d= BTP_d13C_der$derivative, BTP_d13C_der$upper, BTP_d13C_der$lower) BTP_d13C_sig d13C<-ggplot()+ geom_ribbon(data=d13C_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+ geom_line(data= d13C_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+ geom_line(data= d13C_new_sigperiod, mapping=aes(y=BTP_d13C_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase geom_line(data=d13C_new_sigperiod, mapping=aes(y=BTP_d13C_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease geom_point(data=pd_d13C, aes(y= d13C, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+ theme(text = element_text(size = 10, face = "bold")) + ylab("d13C")+ xlab("year Year (cm)")+ scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+ ylim(c(-28, -23))+ labs(x=NULL, y=NULL) + theme_classic() + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold")) d13C 4.2.4 Phosphorus pd_metals <-read.csv("metals.csv") head(pd_metals) P_gam<-gam(P~s(year, k = 15), data= pd_metals, method="REML") gam.check(P_gam) plot(P_gam) fit_gcv<- predict(P_gam, data = pd_metals, se.fit = TRUE, length.out=200) crit.t <- qt(0.975, df.residual(P_gam)) P_new <- data.frame(Year = pd_metals[["year"]], fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) P_new <- transform(P_new, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) P_new_sigperiod<-data.frame(approx(P_new$Year, P_new$fit, n=200)) colnames(P_new_sigperiod)<-c("Year", "fit") BTP_P_der<-derivatives(P_gam, type="central", n=200) draw(BTP_P_der) BTP_P_sig<-signifD(P_new_sigperiod$fit, d= BTP_P_der$derivative, BTP_P_der$upper, BTP_P_der$lower) BTP_P_sig P<-ggplot()+ geom_ribbon(data=P_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+ geom_line(data= P_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+ geom_line(data= P_new_sigperiod, mapping=aes(y=BTP_P_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase geom_line(data=P_new_sigperiod, mapping=aes(y=BTP_P_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease geom_point(data=pd_metals, aes(y=P, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+ theme(text = element_text(size = 10, face = "bold")) + ylab("")+ xlab("year")+ scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+ ylim(c(-3000, 15000))+ labs(x=NULL, y=NULL) + theme_classic() + theme(text = element_text(size = 10, face = "bold")) P 4.2.5 Zinc/Al and Cd/Al pd_metals <-read.csv("metals.csv") head(pd_metals) Zn_gam<-gam(Zn~s(year, k = 15), data= pd_metals, method="REML") gam.check(Zn_gam) plot(Zn_gam) fit_gcv<- predict(Zn_gam, data = pd_metals, se.fit = TRUE, length.out=200) crit.t <- qt(0.975, df.residual(Zn_gam)) Zn_new <- data.frame(Year = pd_metals[["year"]], fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) Zn_new <- transform(Zn_new, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) Zn_new_sigperiod<-data.frame(approx(Zn_new$Year, Zn_new$fit, n=200)) colnames(Zn_new_sigperiod)<-c("Year", "fit") head(Zn_new_sigperiod) BTP_Zn_der<-derivatives(Zn_gam, type="central", n=200) draw(BTP_Zn_der) BTP_Zn_sig<-signifD(Zn_new_sigperiod$fit, d= BTP_Zn_der$derivative, BTP_Zn_der$upper, BTP_Zn_der$lower) BTP_Zn_sig Zn <-ggplot() + geom_ribbon(data=Zn_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5) + geom_line(data= Zn_new, mapping=aes(y= fit, x= Year), colour="lightblue4") + geom_line(data= Zn_new_sigperiod, mapping=aes(y=BTP_Zn_sig$decr, x=Year), colour="deepskyblue4", size=1) + ## Periods of increase geom_line(data=Zn_new_sigperiod, mapping=aes(y=BTP_Zn_sig$incr, x=Year), colour="deepskyblue4", size=1) + ## Periods of decrease geom_point(data=pd_metals, aes(y= Zn, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5) + theme(text = element_text(size = 10, face = "bold")) + ylab("")+ xlab("")+ scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+ ylim(c(0.00006, 0.015)) + labs(x=NULL, y=NULL) + theme_classic() + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold")) Zn pd_metals <-read.csv("metals.csv") head(pd_metals) Cd_gam<-gam(Cd~s(year, k = 15), data= pd_metals, method="REML") gam.check(Cd_gam) plot(Cd_gam) fit_gcv<- predict(Cd_gam, data = pd_metals, se.fit = TRUE, length.out=200) crit.t <- qt(0.975, df.residual(Cd_gam)) Cd_new <- data.frame(Year = pd_metals[["year"]], fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) Cd_new <- transform(Cd_new, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) Cd_new_sigperiod<-data.frame(approx(Cd_new$Year, Cd_new$fit, n=200)) colnames(Cd_new_sigperiod)<-c("Year", "fit") head(Cd_new_sigperiod) BTP_Cd_der<-derivatives(Cd_gam, type="central", n=200) draw(BTP_Cd_der) BTP_Cd_sig<-signifD(Cd_new_sigperiod$fit, d= BTP_Cd_der$derivative, BTP_Cd_der$upper, BTP_Cd_der$lower) BTP_Cd_sig Cd<-ggplot()+ geom_ribbon(data=Cd_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+ geom_line(data= Cd_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+ geom_line(data= Cd_new_sigperiod, mapping=aes(y=BTP_Cd_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase geom_line(data=Cd_new_sigperiod, mapping=aes(y=BTP_Cd_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease geom_point(data=pd_metals, aes(y= Cd, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+ theme(text = element_text(size = 10, face = "bold")) + scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+ ylim(c(0.05e-05, 3e-04))+ labs(x=NULL, y=NULL) + theme_classic()+ theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x=element_blank(), text = element_text(size = 10, face = "bold")) Cd 4.2.6 Diatom (S.construens) pd_diatoms <-read.csv("diatoms.csv") head(pd_diatoms) S.cons_gam<-gam(S.construens~s(year, k = 17), data= pd_diatoms, method="REML") gam.check(S.cons_gam) plot(S.cons_gam) fit_gcv<- predict(S.cons_gam, data = pd_diatoms, se.fit = TRUE, length.out=200) crit.t <- qt(0.975, df.residual(S.cons_gam)) S.cons_new <- data.frame(Year = pd_diatoms[["year"]], fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) S.cons_new <- transform(S.cons_new, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) S.cons_new_sigperiod<-data.frame(approx(S.cons_new$Year, S.cons_new$fit, n=200)) colnames(S.cons_new_sigperiod)<-c("Year", "fit") head(S.cons_new_sigperiod) BTP_S.cons_der<-derivatives(S.cons_gam, type="central", n=200) draw(BTP_S.cons_der) BTP_S.cons_sig<-signifD(S.cons_new_sigperiod$fit, d= BTP_S.cons_der$derivative, BTP_S.cons_der$upper, BTP_S.cons_der$lower) BTP_S.cons_sig S.cons<-ggplot()+ geom_ribbon(data=S.cons_new, mapping= aes(x= Year, ymax= upper, ymin=lower), fill="#b3e0ff", inherit.aes = FALSE, alpha=0.5)+ geom_line(data= S.cons_new, mapping=aes(y= fit, x= Year), colour="lightblue4")+ geom_line(data= S.cons_new_sigperiod, mapping=aes(y=BTP_S.cons_sig$decr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of increase geom_line(data=S.cons_new_sigperiod, mapping=aes(y=BTP_S.cons_sig$incr, x=Year), colour="deepskyblue4", size=1)+ ## Periods of decrease geom_point(data=pd_diatoms, aes(y= S.construens, x= year), shape= 21, fill= "#0099cc", colour="lightblue4", size = 0.5)+ scale_x_continuous(breaks=seq(1000,2022, by= 100), limits = c(1000,2022))+ ylim(c(-15, 115))+ labs(x=NULL, y=NULL) + theme_classic()+ theme(text = element_text(size = 10, face = "bold")) S.cons 4.3 Plotting the final GAM library(ggpubr) ggarrange(chlA, Zn, d13C, Cd, d15N, P, S.cons, ncol = 2, nrow = 4, heights=5, widths=5) 4.4 Final Figure Figure 4.1: [Bosch et al. 2024]: Proxy data from the impact core fitted with a generalized additive model (GAM) and aligned with extrapolated 210Pb-dates. Bolded blue lines represent significant periods of change and shaded blue areas represent the confidence intervals. "],["multiproxy-analysis-vs.-nesting-pairs.html", "5 Multiproxy Analysis vs. Nesting Pairs 5.1 Getting Started 5.2 Example for calculating Z-Scores 5.3 Load the data 5.4 Plot the proxy data 5.5 Plot the population data 5.6 Arrange the figures together 5.7 Final Figure", " 5 Multiproxy Analysis vs. Nesting Pairs Data used in this analysis can be found in the github repo in the following files: FileS2_MonitoringData.csv and FileS9_ZScores_CSM-IMP.csv. 5.1 Getting Started Required pkgs for the analysis: library(ggplot2) library(dplyr) library(viridis) library(ggpubr) library(tidyverse) 5.2 Example for calculating Z-Scores Here is one example of how you can calculate the average d15N and standard deviation of d15N: # Define your data d15N <- IMP2_isotopes$d15N percentN <- IMP2_isotopes$N.percent d13C <- IMP2_isotopes$d15N percentC <- IMP2_isotopes$C.percent # calculate z-scores for d15N and d13C Zscore_isotopes <- IMP2_isotopes %>% mutate(d15N_z = (d15N - mean(d15N))/sd(d15N), d13C_z = (d13C - mean(d13C))/sd(d13C), percentN_z = (percentN - mean(percentN))/sd(percentN), percentN_z = (percentN - mean(percentN))/sd(percentN)) Export the values to a .csv or excel file write.csv(Zscore_isotopes, "filename") 5.3 Load the data Here I load data for the impact site only. After calculating z-scores for the d15N, d15C, chlorophyll a, phosphorus, cadmium , zinc and diatom abundance data (only for S.construens), I arranged it into a file called z-scores.csv. The .csv file I am working is called z-scores.csv, set up like this: midpoint d15N z_d15N chla z_chla etc… Mean - - - - - - - NOTE: Make sure the file contains a column to plot arithmetic mean. Load the data in R zscores <- read.csv("Data/FileS7_ZScores_CSM-IMP.csv") The colony population data can be found in the Census data file, and contains counts for each species by year. Year Northern gannet Black-legged kittiwake Common murre 1883 … 2023 Read the population data into R from another .csv file, mine is in a file called /Data popn <- read.csv("Data/FileS2_MonitoringData.csv") 5.4 Plot the proxy data Plot each of your proxies using both geom_line and geom_point to plot a line graph for your data. z_plot <- ggplot() + geom_smooth(zscores, mapping=aes(x=year, y=mean), method="lm", na.rm=TRUE, formula = y ~ poly(x, 2), color="lightgrey", fill="lightgrey", linetype = 0) + scale_x_continuous(breaks=seq(1800,2023, by=10), limits = c(1800,2025), position="top") + #plot mean line (move this to the last line if you want the mean line to lay overtop your proxy data) geom_line(data=zscores[!is.na(zscores$mean),], mapping=aes(x=year, y=mean), color="black", linewidth=1,) + #plot chlorophyll data geom_line(data=zscores[!is.na(zscores$z_chla),], mapping=aes(x=year, y=z_chla), color="green") + geom_point(data=zscores, mapping=aes(x=year, y=z_chla), color="green", shape=16, size=2) + #plot d15N data geom_line(data=zscores[!is.na(zscores$z_d15N),], mapping=aes(x=year, y=z_d15N), color="blue3") + geom_point(data=zscores, mapping=aes(x=year, y=z_d15N), color="blue3", shape=4, size=2) + #plot Phosphorus data geom_line(data=zscores[!is.na(zscores$z_P),], mapping=aes(x=year, y=z_P), color="orange") + geom_point(data=zscores, mapping=aes(x=year, y=z_P), color="orange", shape=15, size=2) + #plot Zinc data geom_line(data=zscores[!is.na(zscores$z_Zn),], mapping=aes(x=year, y=z_Zn), color="firebrick1") + geom_point(data=zscores, mapping=aes(x=year, y=z_Zn), color="firebrick1", shape=25, size=2) + #plot Cadmium data geom_line(data=zscores[!is.na(zscores$Z_Cd),], mapping=aes(x=year, y=Z_Cd), color="red4") + geom_point(data=zscores, mapping=aes(x=year, y=Z_Cd), color="red4", shape=17, size=2) + #plot diatom data geom_line(data=zscores[!is.na(zscores$z_S.cons),], mapping=aes(x=year, y=z_S.cons), color="mediumaquamarine") + geom_point(data=zscores, mapping=aes(x=year, y=z_S.cons), color="mediumaquamarine", shape=20, size=2) + #set a theme theme_classic()+ theme(panel.grid.major.x=element_line(), text = element_text(size = 12), axis.text.x.top= element_text(vjust=0.5, angle=90, color = "black"), axis.text.y = element_text(color = "black"), axis.title.x = element_blank())+ #set axis labels xlab(NULL)+ ylab("z-score") Run z_plot to view the figure. Here I used !is.na to ignore all NA values in the dataset. You can use HTML color codes in place for R colors for more options. 5.5 Plot the population data Define each variable NOGA <- popn$Northern.gannet COMU <- popn$Common.murre BLKI <- popn$Black.legged.kittiwake year <- popn$Year Plot using ggplot popn_plot <- ggplot(popn, (aes(x=year))) + geom_point(aes(y=BLKI), width=1, color="hotpink3", size=2) + geom_line(aes(y=BLKI), position = "stack", color = "hotpink3", size = 0.5, linetype="dotted") + geom_point(aes(y=NOGA), width=1, color="slateblue4", size=2) + geom_line(aes(y=NOGA), position = "stack", color = "slateblue4", size = 0.5, linetype="dotted") + geom_point(aes(y=COMU), width=1, color="olivedrab4", size=2) + geom_line(aes(y=COMU), position = "stack", color = "olivedrab4", size = 0.5, linetype="dotted") + scale_x_continuous(breaks=seq(1800,2023, by=10), limits = c(1800,2025), position="bottom") + scale_y_continuous(breaks=seq(0,16000, by=4000)) + ylab("nesting pairs")+ theme_classic()+ theme(panel.grid.major.x=element_line(), text = element_text(size = 12, color = "black"), axis.text.x = element_text(margin = margin(t=1), color = "black"), axis.text.y = element_text(margin = margin(t=1), color = "black"), axis.title.x = element_blank(), axis.text.x.bottom = element_text(vjust=0.5, angle=90)) 5.6 Arrange the figures together Plot both your population counts and proxy data onto the same figure ggarrange(z_plot, popn_plot, ncol = 1, nrow = 2, heights=c(15,12), align="hv") 5.7 Final Figure Figure 5.1: [Bosch et al. 2024]: Summary of ornithogenic proxies measured in the impact pond, with Z-score values represented as points [top figure]. X-axis dates are extrapolated from 210Pb dates via polynomial regression. The thick black line shows the calculated arithmetic mean, fitted with a polynomial regression using ggplot2 in R. and the shaded grey area represents the confidence interval. A cut-off was set at ca. 1808 CE (~11.25 cm) to ensure data continuity due to variations in proxy data depth. Historical monitoring data for Northern gannets (Morus bassanus), common murres (Uria aalge) and black-legged kittiwakes (Rissa tridactyla) nesting on Bird Rock and surrounding mainland areas (File S1) [bottom figure]. "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] diff --git a/figs/GAM_depth.png b/figs/GAM_depth.png new file mode 100644 index 0000000..a5ecc47 Binary files /dev/null and b/figs/GAM_depth.png differ diff --git a/figs/broken_stick_metals.png b/figs/broken_stick_metals.png new file mode 100644 index 0000000..34c54c8 Binary files /dev/null and b/figs/broken_stick_metals.png differ diff --git a/figs/core_activity.png b/figs/core_activity.png new file mode 100644 index 0000000..ba703b3 Binary files /dev/null and b/figs/core_activity.png differ diff --git a/figs/core_age.png b/figs/core_age.png new file mode 100644 index 0000000..6dfbc2b Binary files /dev/null and b/figs/core_age.png differ diff --git a/figs/nested_metals.png b/figs/nested_metals.png new file mode 100644 index 0000000..0c9ca25 Binary files /dev/null and b/figs/nested_metals.png differ diff --git a/figs/paleostratigraphies.png b/figs/paleostratigraphies.png new file mode 100644 index 0000000..0bb49f1 Binary files /dev/null and b/figs/paleostratigraphies.png differ diff --git a/figs/proxy_alignment_populations.png b/figs/proxy_alignment_populations.png new file mode 100644 index 0000000..68d0745 Binary files /dev/null and b/figs/proxy_alignment_populations.png differ diff --git a/scripts/GAM_depth.R b/scripts/GAM_depth.R new file mode 100644 index 0000000..b0598ae --- /dev/null +++ b/scripts/GAM_depth.R @@ -0,0 +1,125 @@ +####################################################### +# GENERALIZED ADDITIVE MODELS: PROXY DATA VS CORE DEPTH + +# Run a GAM on your sediment core proxy data according to depths of the core. + +# I use files found in the /data folder of this repo: +# https://github.com/johannabosch/Paleolimnological_Analysis_in_R + +setwd("Paleolimnological_Analysis_in_R/") + +library(mgcv) # For GAMs +library(ggplot2) # For plotting +library(analogue) # For general use and support of other packages +library(gratia) # For derivatives to identify significant periods of change +library(viridis) # For colors +library(ggpubr) # For arranging plots + +signifD <- function(x, d, upper, lower, eval = 0) { + miss <- upper > eval & lower < eval + incr <- decr <- x + want <- d > eval + incr[!want | miss] <- NA + want <- d < eval + decr[!want | miss] <- NA + list(incr = incr, decr = decr) +} + +# Load the proxy data +pd <- read.csv("data/FileS5_ProxyData_CSM-IMP.csv") + +# Create new columns for Zn/Al, Cd/Al, and Phosphorus (P) +pd$Zn_Al <- pd$Zn / pd$Al +pd$Cd_Al <- pd$Cd / pd$Al + +# Create individual data frames for each variable and remove NA values +chla_df <- pd[, c("midpoint", "chla")] +chla_df <- chla_df[complete.cases(chla_df), ] + +d15N_df <- pd[, c("midpoint", "d15N")] +d15N_df <- d15N_df[complete.cases(d15N_df), ] + +Cd_Al_df <- pd[, c("midpoint", "Cd_Al")] +Cd_Al_df <- Cd_Al_df[complete.cases(Cd_Al_df), ] + +Zn_Al_df <- pd[, c("midpoint", "Zn_Al")] +Zn_Al_df <- Zn_Al_df[complete.cases(Zn_Al_df), ] + +S_cons_df <- pd[, c("midpoint", "S.cons")] +S_cons_df <- S_cons_df[complete.cases(S_cons_df), ] + +P_df <- pd[, c("midpoint", "P")] +P_df <- P_df[complete.cases(P_df), ] + +# Function to run GAM analysis on the cleaned data +run_gam_analysis <- function(data, response_var, k_value) { + print(paste("Running GAM for:", response_var)) # Debugging output + print(head(data)) # Check the data being used + + if (nrow(data) == 0) { + warning(paste("No data available for", response_var)) + return(NULL) + } + + gam_model <- gam(as.formula(paste(response_var, "~ s(midpoint, k =", k_value, ")")), data = data, method = "REML") + gam.check(gam_model) + + fit_gcv <- predict(gam_model, newdata = data, se.fit = TRUE) + crit.t <- qt(0.975, df.residual(gam_model)) + + new_data <- data.frame(midpoint = data$midpoint, fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) + new_data <- transform(new_data, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) + + derivatives_data <- derivatives(gam_model, type = "central", n = length(data$midpoint)) + sig_data <- signifD(new_data$fit, d = derivatives_data$.derivative, upper = derivatives_data$.upper_ci, lower = derivatives_data$.lower_ci) + + new_data$incr <- as.numeric(sig_data$incr) # Ensure numeric + new_data$decr <- as.numeric(sig_data$decr) # Ensure numeric + + # Debugging output + print(head(new_data)) + + return(list(new_data = new_data, original_data = data)) +} + +# Function to create plots +create_plot <- function(new_data, original_data, response_var, y_label) { + print(paste("Creating plot for:", response_var)) # Debugging output + + if (nrow(new_data) == 0 || all(is.na(new_data$fit))) { + warning(paste("All", response_var, "values are NA or no data after filtering. Skipping plot.")) + return(NULL) + } + + plot <- ggplot() + + geom_ribbon(data = new_data, aes(x = midpoint, ymax = upper, ymin = lower), fill = "#b3e0ff", alpha = 0.5) + + geom_line(data = new_data, aes(y = fit, x = midpoint), colour = "lightblue4") + + geom_line(data = new_data, aes(y = incr, x = midpoint), colour = "deepskyblue4", size = 1) + + geom_line(data = new_data, aes(y = decr, x = midpoint), colour = "deepskyblue4", size = 1) + + geom_point(data = original_data, aes_string(y = response_var, x = "midpoint"), shape = 21, fill = "#0099cc", colour = "lightblue4", size = 0.5) + + scale_x_reverse(limits = c(26, 0), breaks = seq(26, 0, by = -1)) + # Enforce x-axis limits + labs(x = NULL, y = y_label) + + theme_classic() + + theme(text = element_text(size = 10, face = "bold")) + + return(plot) +} + +# Run the analyses for each cleaned data frame +chla_results <- run_gam_analysis(chla_df, "chla", 82) +d15N_results <- run_gam_analysis(d15N_df, "d15N", 26) +Cd_Al_results <- run_gam_analysis(Cd_Al_df, "Cd_Al", 15) +Zn_Al_results <- run_gam_analysis(Zn_Al_df, "Zn_Al", 15) +S_cons_results <- run_gam_analysis(S_cons_df, "S.cons", 17) +P_results <- run_gam_analysis(P_df, "P", 15) + +# Create the plots +chla_plot <- if (!is.null(chla_results)) create_plot(chla_results$new_data, chla_results$original_data, "chla", "Chlorophyll-a") else NULL +d15N_plot <- if (!is.null(d15N_results)) create_plot(d15N_results$new_data, d15N_results$original_data, "d15N", "d15N") else NULL +Cd_Al_plot <- if (!is.null(Cd_Al_results)) create_plot(Cd_Al_results$new_data, Cd_Al_results$original_data, "Cd_Al", "Cd/Al") else NULL +Zn_Al_plot <- if (!is.null(Zn_Al_results)) create_plot(Zn_Al_results$new_data, Zn_Al_results$original_data, "Zn_Al", "Zn/Al") else NULL +S_cons_plot <- if (!is.null(S_cons_results)) create_plot(S_cons_results$new_data, S_cons_results$original_data, "S.cons", "S.cons") else NULL +P_plot <- if (!is.null(P_results)) create_plot(P_results$new_data, P_results$original_data, "P", "Phosphorus") else NULL + +# Combine the plots +ggarrange(chla_plot, d15N_plot, Zn_Al_plot, Cd_Al_plot, S_cons_plot, P_plot, ncol = 2, nrow = 3, heights = 5, widths = 5) diff --git a/scripts/GAM_year.R b/scripts/GAM_year.R new file mode 100644 index 0000000..4e97479 --- /dev/null +++ b/scripts/GAM_year.R @@ -0,0 +1,130 @@ +####################################################### +# GENERALIZED ADDITIVE MODELS: PROXY DATA VS CORE DEPTH +# Run a GAM on z-scores of sediment core proxy data using midpoint for GAM fitting and year for plotting. + +setwd("Paleolimnological_Analysis_in_R/") + +library(mgcv) # For GAMs +library(ggplot2) # For plotting +library(analogue) # For general use and support of other packages +library(gratia) # For derivatives to identify significant periods of change +library(viridis) # For colors +library(ggpubr) # For arranging plots + +signifD <- function(x, d, upper, lower, eval = 0) { + miss <- upper > eval & lower < eval + incr <- decr <- x + want <- d > eval + incr[!want | miss] <- NA + want <- d < eval + decr[!want | miss] <- NA + list(incr = incr, decr = decr) +} + +# Load the proxy data +pd <- read.csv("data/FileS5_ProxyData_CSM-IMP.csv") + +# Create new columns for Zn/Al, Cd/Al, and Phosphorus (P) +pd$Zn_Al <- pd$Zn / pd$Al +pd$Cd_Al <- pd$Cd / pd$Al + +# Calculate z-scores for each proxy variable +pd$chla_z <- scale(pd$chla) +pd$d15N_z <- scale(pd$d15N) +pd$S_cons_z <- scale(pd$S.cons) +pd$Zn_Al_z <- scale(pd$Zn_Al) +pd$Cd_Al_z <- scale(pd$Cd_Al) +pd$P_z <- scale(pd$P) + +# Create individual data frames for each z-scored variable and remove NA values +chla_df <- pd[, c("midpoint", "year", "chla_z")] +chla_df <- chla_df[complete.cases(chla_df), ] + +d15N_df <- pd[, c("midpoint", "year", "d15N_z")] +d15N_df <- d15N_df[complete.cases(d15N_df), ] + +Cd_Al_df <- pd[, c("midpoint", "year", "Cd_Al_z")] +Cd_Al_df <- Cd_Al_df[complete.cases(Cd_Al_df), ] + +Zn_Al_df <- pd[, c("midpoint", "year", "Zn_Al_z")] +Zn_Al_df <- Zn_Al_df[complete.cases(Zn_Al_df), ] + +S_cons_df <- pd[, c("midpoint", "year", "S_cons_z")] +S_cons_df <- S_cons_df[complete.cases(S_cons_df), ] + +P_df <- pd[, c("midpoint", "year", "P_z")] +P_df <- P_df[complete.cases(P_df), ] + +# Function to run GAM analysis using midpoint and map results to year +run_gam_analysis <- function(data, response_var, k_value) { + print(paste("Running GAM for:", response_var)) # Debugging output + print(head(data)) # Check the data being used + + if (nrow(data) == 0) { + warning(paste("No data available for", response_var)) + return(NULL) + } + + gam_model <- gam(as.formula(paste(response_var, "~ s(midpoint, k =", k_value, ")")), data = data, method = "REML") + gam.check(gam_model) + + fit_gcv <- predict(gam_model, newdata = data, se.fit = TRUE) + crit.t <- qt(0.975, df.residual(gam_model)) + + new_data <- data.frame(year = data$year, midpoint = data$midpoint, fit = fit_gcv$fit, se.fit = fit_gcv$se.fit) + new_data <- transform(new_data, upper = fit + (crit.t * se.fit), lower = fit - (crit.t * se.fit)) + + derivatives_data <- derivatives(gam_model, type = "central", n = length(data$midpoint)) + sig_data <- signifD(new_data$fit, d = derivatives_data$.derivative, upper = derivatives_data$.upper_ci, lower = derivatives_data$.lower_ci) + + new_data$incr <- as.numeric(sig_data$incr) # Ensure numeric + new_data$decr <- as.numeric(sig_data$decr) # Ensure numeric + + # Debugging output + print(head(new_data)) + + return(list(new_data = new_data, original_data = data)) +} + +# Function to create plots using year for the x-axis +create_plot <- function(new_data, original_data, response_var, y_label) { + print(paste("Creating plot for:", response_var)) # Debugging output + + if (nrow(new_data) == 0 || all(is.na(new_data$fit))) { + warning(paste("All", response_var, "values are NA or no data after filtering. Skipping plot.")) + return(NULL) + } + + plot <- ggplot() + + geom_ribbon(data = new_data, aes(x = year, ymax = upper, ymin = lower), fill = "#b3e0ff", alpha = 0.5) + + geom_line(data = new_data, aes(y = fit, x = year), colour = "lightblue4") + + geom_line(data = new_data, aes(y = incr, x = year), colour = "deepskyblue4", size = 1) + + geom_line(data = new_data, aes(y = decr, x = year), colour = "deepskyblue4", size = 1) + + geom_point(data = original_data, aes_string(y = response_var, x = "year"), shape = 21, fill = "#0099cc", colour = "lightblue4", size = 0.5) + + scale_x_continuous(limits = c(1557, 2021), breaks = seq(1557, 2021, by = 20)) + # Adjust x-axis limits and breaks + labs(x = NULL, y = y_label) + + theme_classic() + + theme(text = element_text(size = 10, face = "bold"), + axis.text.x = element_text(angle=90, hjust=1)) + + return(plot) +} + +# Run the analyses for each cleaned data frame with z-scores +chla_results <- run_gam_analysis(chla_df, "chla_z", 16) +d15N_results <- run_gam_analysis(d15N_df, "d15N_z", 16) +Cd_Al_results <- run_gam_analysis(Cd_Al_df, "Cd_Al_z", 15) +Zn_Al_results <- run_gam_analysis(Zn_Al_df, "Zn_Al_z", 15) +S_cons_results <- run_gam_analysis(S_cons_df, "S_cons_z", 16) +P_results <- run_gam_analysis(P_df, "P_z", 15) + +# Create the plots +chla_plot <- if (!is.null(chla_results)) create_plot(chla_results$new_data, chla_results$original_data, "chla_z", "Chlorophyll-a") else NULL +d15N_plot <- if (!is.null(d15N_results)) create_plot(d15N_results$new_data, d15N_results$original_data, "d15N_z", "d15N") else NULL +Cd_Al_plot <- if (!is.null(Cd_Al_results)) create_plot(Cd_Al_results$new_data, Cd_Al_results$original_data, "Cd_Al_z", "Cd/Al") else NULL +Zn_Al_plot <- if (!is.null(Zn_Al_results)) create_plot(Zn_Al_results$new_data, Zn_Al_results$original_data, "Zn_Al_z", "Zn/Al") else NULL +S_cons_plot <- if (!is.null(S_cons_results)) create_plot(S_cons_results$new_data, S_cons_results$original_data, "S_cons_z", "S.cons") else NULL +P_plot <- if (!is.null(P_results)) create_plot(P_results$new_data, P_results$original_data, "P_z", "Phosphorus (Z-Score)") else NULL + +# Combine the plots +ggarrange(chla_plot, d15N_plot, Zn_Al_plot, Cd_Al_plot, S_cons_plot, P_plot, ncol = 2, nrow = 3, heights = 5, widths = 5) diff --git a/scripts/Z_score_analysis.R b/scripts/Z_score_analysis.R new file mode 100644 index 0000000..88407b0 --- /dev/null +++ b/scripts/Z_score_analysis.R @@ -0,0 +1,99 @@ +####################################################### +# Plotting proxy data (z-scored) with population counts + +#Getting started + +library(ggplot2) +library(dplyr) +library(viridis) +library(ggpubr) +library(tidyverse) + +setwd("Paleolimnological_Analysis_in_R/") + +# Loading data + +zscores <- read.csv("data/FileS9_ZScores_CSM-IMP.csv") + +popn <- read.csv("data/FileS2_MonitoringData.csv") + +# Plot proxy data +z_plot <- ggplot() + + geom_smooth(zscores, mapping=aes(x=year, y=mean), method="lm", na.rm=TRUE, formula = y ~ poly(x, 2), color="lightgrey", fill="lightgrey", linetype = 0) + + scale_x_continuous(breaks=seq(1800,2023, by=10), limits = c(1800,2025), position="top") + + + #plot mean line (move this to the last line if you want the mean line to lay overtop your proxy data) + geom_line(data=zscores[!is.na(zscores$mean),], mapping=aes(x=year, y=mean), color="black", linewidth=1,) + + + #plot chlorophyll data + geom_line(data=zscores[!is.na(zscores$z_chla),], mapping=aes(x=year, y=z_chla), color="green") + + geom_point(data=zscores, mapping=aes(x=year, y=z_chla), color="green", shape=16, size=2) + + + #plot d15N data + geom_line(data=zscores[!is.na(zscores$z_d15N),], mapping=aes(x=year, y=z_d15N), color="blue3") + + geom_point(data=zscores, mapping=aes(x=year, y=z_d15N), color="blue3", shape=4, size=2) + + + #plot Phosphorus data + geom_line(data=zscores[!is.na(zscores$z_P),], mapping=aes(x=year, y=z_P), color="orange") + + geom_point(data=zscores, mapping=aes(x=year, y=z_P), color="orange", shape=15, size=2) + + + #plot Zinc data + geom_line(data=zscores[!is.na(zscores$z_Zn),], mapping=aes(x=year, y=z_Zn), color="firebrick1") + + geom_point(data=zscores, mapping=aes(x=year, y=z_Zn), color="firebrick1", shape=25, size=2) + + + #plot Cadmium data + geom_line(data=zscores[!is.na(zscores$Z_Cd),], mapping=aes(x=year, y=Z_Cd), color="red4") + + geom_point(data=zscores, mapping=aes(x=year, y=Z_Cd), color="red4", shape=17, size=2) + + + #plot diatom data + geom_line(data=zscores[!is.na(zscores$z_S.cons),], mapping=aes(x=year, y=z_S.cons), color="mediumaquamarine") + + geom_point(data=zscores, mapping=aes(x=year, y=z_S.cons), color="mediumaquamarine", shape=20, size=2) + + + #set a theme + theme_classic()+ + theme(panel.grid.major.x=element_line(), + text = element_text(size = 12), + axis.text.x.top= element_text(vjust=0.5, angle=90, color = "black"), + axis.text.y = element_text(color = "black"), + axis.title.x = element_blank())+ + + #set axis labels + xlab(NULL)+ + ylab("z-score") + +# Define some vals for pop counts +NOGA <- popn$Northern.gannet +COMU <- popn$Common.murre +BLKI <- popn$Black.legged.kittiwake +year <- popn$Year + +# plot population counts + +popn_plot <- ggplot(popn, (aes(x=year))) + + + geom_point(aes(y=BLKI), width=1, color="hotpink3", size=2) + + + geom_point(aes(y=NOGA), width=1, color="slateblue4", size=2) + + + geom_point(aes(y=COMU), width=1, color="olivedrab4", size=2) + + + scale_x_continuous(breaks=seq(1800,2023, by=10), limits = c(1800,2025), position="bottom") + + scale_y_continuous(breaks=seq(0,16000, by=4000)) + + + ylab("nesting pairs")+ + + theme_classic()+ + theme(panel.grid.major.x=element_line(), + text = element_text(size = 12, color = "black"), + axis.text.x = element_text(margin = margin(t=1), color = "black"), + axis.text.y = element_text(margin = margin(t=1), color = "black"), + axis.title.x = element_blank(), + axis.text.x.bottom = element_text(vjust=0.5, angle=90)) + + +# Plot pop counts and proxy data together +ggarrange(z_plot, popn_plot, + ncol = 1, nrow = 2, + heights=c(20,15), + align="hv") + diff --git a/scripts/breakpoint_analysis_metals.R b/scripts/breakpoint_analysis_metals.R new file mode 100644 index 0000000..edaf559 --- /dev/null +++ b/scripts/breakpoint_analysis_metals.R @@ -0,0 +1,54 @@ +################## +# RUN A BREAKPOINT ANALYSIS ON METAL(LOID)S + +# This is a breakpoint analysis for metal(loid) data obtained from individual coring sites. +# I used data containing more than 20 metals, and their concentrations at each depth of the impacted core. +# Data files can be found in the GitHub repo: +# `FileS7_Metalloids_CSM-IMP.csv` and `FileS8_Metalloids_CSM-REF.csv` + +# Access the files [here](https://github.com/johannabosch/Paleo_Analysis_Using_R). + +# Libraries +library(tidyverse) +library(tidypaleo) +library(vegan) + +# Load and prepare the data +metals_IMP <- read.csv("data/FileS7_Metalloids_CSM-IMP.csv") + +# Convert to long format +metals_long_IMP <- metals_IMP %>% + pivot_longer(-depth, names_to = "metals", values_to = "concentration") + +# Check the structure of the data +str(metals_long_IMP) + +# Check for NA values +sum(is.na(metals_long_IMP)) + +# Ensure depth column is numeric +metals_long_IMP$depth <- as.numeric(metals_long_IMP$depth) + +# Remove rows with missing values in either depth or concentration +metals_long_IMP <- metals_long_IMP %>% + filter(!is.na(depth) & !is.na(concentration)) + +# Perform a cluster analysis using CONISS (Constrained Incremental Sum of Squares) +nested_coniss_IMP <- metals_long_IMP %>% + nested_data(depth, metals, concentration) %>% + nested_chclust_coniss() + +# Plot the cluster analysis results +plot(nested_coniss_IMP) + +# Plot a broken stick diagram +broken_stick_plot <- nested_coniss_IMP %>% + select(broken_stick) %>% + unnest(broken_stick) %>% + tidyr::gather(type, value, broken_stick_dispersion, dispersion) %>% + ggplot(aes(x = n_groups, y = value, col = type)) + + geom_line() + + geom_point() + +# Display the broken stick plot +print(broken_stick_plot) diff --git a/scripts/dating_profiles.R b/scripts/dating_profiles.R new file mode 100644 index 0000000..5516375 --- /dev/null +++ b/scripts/dating_profiles.R @@ -0,0 +1,86 @@ +################################### +# PLOT CORE 210-PB ACTIVITY AND AGE + +# Use this script to make plots of: + # a sediment core's lead-210 activity over depth + # a sediment core's depth related to year (based on a CRS dating model) + +# I used data from the following files found in the Github repo +# (https://github.com/johannabosch/Paleo_Analysis_Using_R) + + # FileS3_Dating_CSM-IMP.csv + # FileS4_Dating_CSM-REF.csv. + +#Load the following packages +library(ggplot2) +library(dplyr) +library(viridis) +library(ggpubr) + +#Load your data for impact and reference sites into R + +setwd("Paleolimnological_Analysis_in_R") + +dp_IMP2 <- read.csv("data/FileS3_Dating_CSM-IMP.csv") +dp_REF3 <- read.csv("data/FileS4_Dating_CSM-REF.csv") + +# Define columns for core depth/year, activity, sedimentation rate + error + +depth_IMP2 <- dp_IMP2$depth +year_IMP <- dp_IMP2$Year..CRS. +act_IMP2 <- dp_IMP2$Total.210Pb_activity..Bq.kg. +sed_IMP2 <- dp_IMP2$Sed..Rate..cm.y. +error_IMP <- dp_IMP2$Error.Sed..Rate..cm.y. + +depth_REF3 <- dp_REF3$depth +year_REF <- dp_REF3$Year..CRS. +act_REF3 <- dp_REF3$Total.210Pb_activity..Bq.kg. +sed_REF3 <- dp_REF3$Sed..Rate..cm.y. +error_REF <- dp_REF3$Error.Sed..Rate..cm.y. + +# Plot the activity +activity <- ggplot() + + + geom_point(data = dp_IMP2, (aes(x= depth_IMP2, y=act_IMP2)), shape=22, fill="paleturquoise4", size=3, color = "paleturquoise4", alpha=0.5) + + geom_line(data = dp_IMP2, (aes(x = depth_IMP2, y=act_IMP2)), color="paleturquoise4") + + + geom_point(data = dp_REF3, (aes(x = depth_REF3, y=act_REF3)), size =3, color="palegreen3") + + geom_line(data = dp_REF3, (aes(x = depth_REF3, y=act_REF3)), color="palegreen3") + + + labs(x="Midpoint depth (cm)", y="Pb-210 Activity (Bq/kg)") + + + scale_x_continuous(breaks=seq(0,19, by= 1), limits = c(0,19)) + + + theme_classic()+ + + theme(text = element_text(size = 12), panel.grid.major.x=element_line(), axis.text.y = element_text(size=12), axis.title.y = element_text(margin = margin(t=0, r= 20, b=0, l=0))) + +activity + + +# Fix the plot margins +par(mar = c(10, 10,10,10)) + + +# Plot year based on core depth + +year <- ggplot() + + + geom_point(data = dp_IMP2, (aes(x = year_IMP, y= depth_IMP2)), na.rm=TRUE, shape=22, fill="paleturquoise4", size=3, color = "paleturquoise4", alpha=0.5) + + geom_line(data = dp_IMP2, (aes(x = year_IMP, y= depth_IMP2)), na.rm=TRUE, color = "paleturquoise4") + + stat_smooth(dp_IMP2, mapping=aes(year_IMP, depth_IMP2), method="lm", color = "paleturquoise4", fill = "paleturquoise4", alpha = 0.3) + + geom_errorbar(aes(x=year_IMP, xmin=year_IMP-error_IMP, xmax=year_IMP+error_IMP, y=depth_IMP2, ymax=NULL, ymin=NULL), width=.2) + + + geom_point(data = dp_REF3, (aes(x = year_REF, y= depth_REF3)), na.rm=TRUE, shape=22, fill="palegreen3", size=3, color = "paleturquoise4", alpha=0.5) + + geom_line(data = dp_REF3, (aes(x = year_REF, y= depth_REF3)), na.rm=TRUE, color = "palegreen3") + + stat_smooth(dp_REF3, mapping=aes(year_REF, depth_REF3), method="lm", color = "palegreen3", fill = "palegreen3", alpha = 0.3) + + geom_errorbar(aes(x=year_REF, xmin=year_REF-error_REF, xmax=year_REF+error_REF, y=depth_REF3, ymax=NULL, ymin=NULL), width=.2) + + + labs(x = "Year (CRS model)", y = "Midpoint depth (cm)") + + scale_x_continuous(breaks=seq(1800,2023, by= 10)) + + scale_y_reverse(limits=c(10,0), breaks=seq(10,0, by=-0.5)) + + theme_classic() + + theme(panel.grid.major.x=element_line(), text = element_text(size = 12), axis.text.y = element_text(size=10), axis.text.x = element_text(size=12)) + +year + diff --git a/scripts/paleostratigraphies.R b/scripts/paleostratigraphies.R new file mode 100644 index 0000000..1cf6c65 --- /dev/null +++ b/scripts/paleostratigraphies.R @@ -0,0 +1,146 @@ +########################################## +# PLOTTING MULTI-SITE PALEOSTRATIGRAPHIES + +# Use this script to plot a stratigraphy of proxy values from one or more sediment coring site(s). +# I arranged my proxy data into geochemical and abundance plots + +# Load necessary libraries +library(ggplot2) +library(tidyverse) +library(tidypaleo) +library(ggh4x) +library(patchwork) + +theme_set(theme_paleo(8)) + +# Load the geochem data for your coring sites +pd_IMP2 <- read.csv("data/FileS5_ProxyData_CSM-IMP.csv") +pd_REF3 <- read.csv("data/FileS6_ProxyData_CSM-REF.csv") + +# Calculate Cd/Al and Zn/Al ratios +pd_IMP2 <- pd_IMP2 %>% + mutate(Cd_Al = Cd / Al, + Zn_Al = Zn / Al) + +pd_REF3 <- pd_REF3 %>% + mutate(Cd_Al = Cd / Al, + Zn_Al = Zn / Al) + +# Reshape the geochem data to long format for the required parameters +pd_IMP2_long <- pd_IMP2 %>% + pivot_longer(cols = c(chla, d15N, Cd_Al, Zn_Al, P), + names_to = "param", + values_to = "value") %>% + select(param, value, midpoint) %>% + drop_na() + +pd_REF3_long <- pd_REF3 %>% + pivot_longer(cols = c(chla, d15N, Cd_Al, Zn_Al, P), + names_to = "param", + values_to = "value") %>% + select(param, value, midpoint) %>% + drop_na() + +# Plot the geochem stratigraphic diagram for the Impact Site +geo_strat_IMP2 <- ggplot(pd_IMP2_long, aes(x = value, y = midpoint)) + + geom_lineh() + + geom_point() + + facet_geochem_gridh(vars(param)) + + labs(x = NULL, y = "Midpoint Depth (cm)") + + facetted_pos_scales( + x = list(scale_x_continuous(limits = c(0, 0.00025)), # Cd/Al + scale_x_continuous(limits = c(0, 0.16)), # chlA + scale_x_continuous(limits = c(-2, 11)), # d15N + scale_x_continuous(limits = c(0, 10000)), # P + scale_x_continuous(limits = c(0, 0.025))), # Zn/Al + scale_y_reverse(breaks = seq(0, 26, by = 1), limits = c(26, 0))) + +geo_strat_IMP2 + +# Plot the geochem stratigraphic diagram for the Reference Site +geo_strat_REF3 <- ggplot(pd_REF3_long, aes(x = value, y = midpoint)) + + geom_lineh() + + geom_point() + + facet_geochem_gridh(vars(param)) + + labs(x = NULL, y = "Midpoint Depth (cm)") + + facetted_pos_scales( + x = list(scale_x_continuous(limits = c(0, 0.00025)), # Cd/Al + scale_x_continuous(limits = c(0, 0.16)), # chlA + scale_x_continuous(limits = c(-2, 11)), # d15N + scale_x_continuous(limits = c(0, 10000)), # P + scale_x_continuous(limits = c(0, 0.025))), # Zn/Al + scale_y_reverse(breaks = seq(0, 26, by = 1), limits = c(26, 0)) + ) + +geo_strat_REF3 + +# Reshape the abundance data to long format +abundance_IMP2_long <- pd_IMP2 %>% + pivot_longer(cols = c(S.cons, S.exi), + names_to = "abundance_type", + values_to = "abundance") %>% + select(abundance_type, abundance, midpoint) %>% + drop_na() + +abundance_REF3_long <- pd_REF3 %>% + pivot_longer(cols = c(S.cons, S.exi), + names_to = "abundance_type", + values_to = "abundance") %>% + select(abundance_type, abundance, midpoint) %>% + drop_na() + +# Plot the abundance stratigraphic diagram for the Impact Site +abundance_strat_IMP2 <- ggplot(abundance_IMP2_long, aes(x = abundance, y = midpoint)) + + geom_areah() + + geom_col_segsh() + + facet_abundanceh(vars(abundance_type)) + + labs(x = NULL, y = "Midpoint Depth (cm)") + + facetted_pos_scales( + x = list(scale_x_abundance(limits = c(0, 100), breaks = seq(0,100, by =20)), + scale_x_abundance(limits = c(0, 100), breaks = seq(0,100, by =20))), + scale_y_reverse(limits = c(17, 0)) + ) + +abundance_strat_IMP2 + +# Plot the abundance stratigraphic diagram for the Reference Site +abundance_strat_REF3 <- ggplot(abundance_REF3_long, aes(x = abundance, y = midpoint)) + + geom_areah() + + geom_col_segsh() + + facet_abundanceh(vars(abundance_type)) + + labs(x = NULL, y = "Midpoint Depth (cm)") + + facetted_pos_scales( + x = list(scale_x_abundance(limits = c(0, 100), breaks = seq(0,100, by =20)), + scale_x_abundance(limits = c(0, 100), breaks = seq(0,100, by =20))), + scale_y_reverse(limits = c(17, 0)) + ) + +abundance_strat_REF3 + +# Arrange multiple stratigraphies (Impact Site) +strat_final_IMP2 <- wrap_plots(geo_strat_IMP2 + + theme(strip.background = element_blank(), strip.text.y = element_blank()), + abundance_strat_IMP2 + + theme(axis.text.y.left = element_blank(), axis.ticks.y.left = element_blank()) + + labs(y = NULL), nrow = 1, widths = c(3, 1)) + +strat_final_IMP2 + +# Arrange multiple stratigraphies (Reference Site) +strat_final_REF3 <- wrap_plots(geo_strat_REF3 + + theme(strip.background = element_blank(), strip.text.y = element_blank()), + abundance_strat_REF3 + + theme(axis.text.y.left = element_blank(), axis.ticks.y.left = element_blank()) + + labs(y = NULL), nrow = 1, widths = c(3, 1)) + +strat_final_REF3 + + +# Combine the plots with more space for the x-axis +final_strat <- wrap_plots(strat_final_IMP2, strat_final_REF3, nrow = 2, ncol = 1) + + plot_layout(heights = c(1, 1)) + # Ensure equal space for both plots + theme(plot.margin = margin(t = 10, r = 10, b = 50, l = 10)) # Add space at the bottom for x-axis labels + +# Save the plot with increased width +ggsave("figs/paleostratigraphies.png", plot = final_strat, width = 12, height = 8) +