© 2016 Macmillan Publishers Limited, part of Springer Nature
This version available
http://nora.nerc.ac.uk/id/eprint/515294/
NERC has developed NORA to enable users to access research outputs
wholly or partially funded by NERC. Copyright and other rights for material
on this site are retained by the rights owners. Users should read the terms
and conditions of use of this material at
http://nora.nerc.ac.uk/policies.html#access
This document is the author’s final manuscript version of the journal
article following the peer review process. Some differences between
this and the publisher’s version may remain. You are advised to
consult the publisher’s version if you wish to cite from this article.
https://www.nature.com/
Article (refereed) - postprint
Crowther, T.W.; Todd-Brown, K.E.O.; Rowe, C.W.; Wieder, W.R.; Carey,
J.C.; Machmuller, M.B.; Snoek, B.L.; Fang, S.; Zhou, G.; Allison, S.D.; Blair,
J.M.; Bridgham, S.D.; Burton, A.J.; Carrillo, Y.; Reich, P.B.; Clark, J.S.;
Classen, A.T.; Dijkstra, F.A.; Elberling, B.; Emmett, B.A.; Estiarte, M.; Frey,
S.D.; Guo, J.; Harte, J.; Jiang, L.; Johnson, B.R.; Kröel-Dulay, G.; Larsen,
K.S.; Laudon, H.; Lavallee, J.M.; Luo, Y.; Lupascu, M.; Ma, L.N.; Marhan, S.;
Michelsen, A.; Mohan, J.; Niu, S.; Pendall, E.; Peñuelas, J.; Pfeifer-Meister, L.;
Poll, C.; Reinsch, S.; Reynolds, L.L.; Schmidt, I.K.; Sistla, S.; Sokol, N.W.;
Templer, P.H.; Treseder, K.K.; Welker, J.M.; Bradford, M.A.. 2016.
Quantifying global soil carbon losses in response to warming.
Nature
, 540
(7631). 104-108.
https://doi.org/10.1038/nature20150
Contact CEH NORA team at
noraceh@ceh.ac.uk
The NERC and CEH trademarks and logos (‘the Trademarks’) are registered trademarks of NERC in the UK and
other countries, and may not be used without the prior written consent of the Trademark owner
.
QUANTIFYING GLOBAL SOIL C LOSSES IN RESPONSE TO WARMING
1
2
Crowther, T.W.
1,2
, Todd-Brown, K.E.O.
3
, Rowe, C.W.
2
, Wieder, W.R.
4,5
, Carey, J.C.
6
,
3
Machmuller, M.B.
7
, Snoek, L.B.
1,8
,
Fang, S.
9,10
, Zhou, G.
9
, Allison, S.D.
11,12
, Blair,
4
J.M.
13
, Bridgham, S.D.
14
, Burton, A.J.
15
, Carrillo, Y.
15
, Reich, P.B.
16,17
,
Clark, J.S.
18
,
5
Classen, A.T.
19,20
, Dijkstra, F.A.
21
, Elberling, B.
22
, Emmett, B.
23
, Estiarte, M.
24, 25
, Frey,
6
S.D.
26
, Guo, J.
27
, Harte, J.
28
, Jiang, L.
29
, Johnson, B.R.
14
, Kröel-Dulay, G.
30
, Larsen,
7
K.S.
31
, Laudon, H.
32
, Lavallee, J.M.
7,33
, Luo, Y.
29
, Lupascu, M.
34
, Ma, L.N.
35
, Marhan,
8
S.
36
, Michelsen, A.
37
, Mohan, J.
38,39
,
Niu, S.
40
, Pendall, E.
16
, Peñuelas, J.
24
, Pfeifer-
9
Meister, L.
14
, Poll, C.
36
, Reinsch, S.
23
, Reynolds, L.L.
14
, Schmidt, I.K.
30
, Sistla, S.
41
,
10
Sokol, N.W.
3
, Templer, P.H.
42
, Treseder, K.K.
12
, Welker, J.M.
43
, & Bradford, M.A.
1,2
11
12
1.
Netherlands Institute of Ecology, Droevendaalsesteeg 10, 6708 PB Wageningen,
13
The Netherlands
14
2.
Yale School of Forestry & Environmental Studies, Yale University, 370 Prospect
15
St., New Haven, CT 06511, USA
16
3.
Pacific Northwest National Laboratory, Richland, WA, USA
17
4.
Climate & Global Dynamics Laboratory, National Center for Atmospheric
18
Research, Boulder, CO 80307, USA
19
5.
Institute for Arctic & Alpine Research, University of Colorado, Boulder, CO
20
80303, USA
21
6.
Marine Biological Laboratory, 7 MBL St., Woods Hole, MA 02543, USA
22
7.
Natural Resource Ecology Laboratory, 1499 Campus Delivery, Colorado State
23
University, Fort Collins, CO, 80523-1499, USA
24
8.
Laboratory of Nematology, Wageningen University, Droevendaalsesteeg 1, 6708
25
PB Wageningen, The Netherlands
26
9.
Chinese Academy of Meteorological Sciences, No.46 Zhongguancun South
27
Street, Beijing 100081, China
28
10.
Collaborative Innovation Center on Forecast Meteorological Disaster
29
Warning & Assessment, Nanjing University of Information Science &
30
Technology, Nanjing 210044, China
31
11.
Department of Earth System Science, University of California Irvine,
32
Irvine, CA 92697, USA
33
12.
Department of Ecology & Evolutionary Biology, University of California
34
Irvine, CA 92697, USA
35
13.
Division of Biology, Kansas State University, Manhattan, KS 66506, USA
36
14.
Institute of Ecology & Evolution, University of Oregon, Eugene, OR
37
97403, USA
38
15.
School of Forest Resources & Environmental Science, Michigan
39
Technological University, Houghton, MI 49931, USA
40
16.
Hawkesbury Institute for the Environment, Western Sydney University, Penrith,
41
2570 NSW, Australia
42
17.
Department of Forest Resources, University of Minnesota, St. Paul, MN 55108,
43
USA
44
18.
Nicholas School of the Environment, Duke University, Durham, NC 27708, USA
45
19.
Department of Ecology & Evolutionary Biology, University of Tennessee, 569
46
Dabney Hall, 1416 Circle Dr., Knoxville, TN 37996, USA
47
20.
The Natural History Museum of Denmark, University of Copenhagen,
48
Universitetsparken, 15, 2100, København Ø, Denmark
49
21.
Centre for Carbon, Water & Food, The University of Sydney, Camden, 2570
50
NSW, Australia
51
22.
Center for Permafrost (CENPERM), Department of Geosciences and Natural
52
Resource Management, University of Copenhagen, Øster Voldgade 10, 1350
53
Copenhagen K., Denmark
54
23.
Environment Centre Wales, Deiniol Rd, Bangor. LL57 2UW, UK
55
24.
CSIC, Global Ecology Unit CREAF-CSIC-UAB, Cerdanyola del Vallès, 08193
56
Catalonia, Spain
57
25.
CREF,
Cerdanyola del Vallès, 08193 Catalonia, Spain.
58
26.
Department of Natural Resources & the Environment, University of New
59
Hampshire, Durham, NH 03824, USA
60
27.
Key Laboratory of Vegetation Ecology, Ministry of Education, Northeast Normal
61
University, Changchun 130024, Jilin Province, China
62
28.
Energy & Resources Group, University of California at Berkeley, Berkeley, CA
63
94720, USA
64
29.
Department of Microbiology & Plant Biology, University of Oklahoma, Norman,
65
OK 73019, USA
66
30.
Institute of Ecology & Botany, MTA Centre for Ecological Research, 2-4.
67
Alkotmany U., Vacratot, 2163-Hungary
68
31.
Department of Geosciences & Natural Resource Management, University of
69
Copenhagen, Rolighedsvej 23, 1958 Frederiksberg C, Denmark
70
32.
Department of Forest Ecology & Management, Swedish University of
71
Agricultural Sciences, 90183 Umeå, Sweden
72
33.
Faculty of Life Sciences, University of Manchester, Dover Street, Manchester
73
M13 9PT, UK
74
34.
Department of Geography, National University of Singapore, 10 Kent Ridge
75
Crescent, 119260, Singapore
76
35.
State Key Laboratory of Vegetation & Environmental Change, Institute of
77
Botany, Chinese Academy of Sciences, Beijing, 100093, China
78
36.
Institute of Soil Science & Land Evaluation, University of Hohenheim, 70593
79
Stuttgart, Germany
80
37.
Department of Biology, University of Copenhagen, Universitetsparken 15, DK-
81
2100 Copenhagen, Denmark
82
38.
Odum School of Ecology, University of Georgia, Athens, GA 30601, USA
83
39.
Center for Permafrost, University of Copenhagen, Øster Voldgade 10, DK-1350
84
Copenhagen K, Denmark
85
40.
Key Laboratory of Ecosystem Network Observation & Modeling, Institute of
86
Geographic Sciences and Natural Resources Research, Chinese Academy of
87
Sciences, Beijing, 100101, China
88
41.
School of Natural Science, Hampshire College, 893 West St., Amherst MA
89
01002, USA
90
42.
Department of Biology, Boston University, Boston, MA 02215, USA
91
43.
Department of Biological Sciences, University of Alaska, Anchorage, Anchorage,
92
AK 99508, USA
93
Generating meaningful greenhouse gas (GHG) emission targets requires an
94
understanding of Earth system dynamics and projections about how they will
95
respond to global change
1–3
.
If anthropogenic warming stimulates the loss of carbon
96
from the Earth’s surface into the atmosphere, it could drive additional planetary
97
warming. Despite growing evidence that warming enhances soil carbon fluxes to and
98
from the soil
8,12
, the net global balance between these responses remains uncertain
1
.
99
Here we present a comprehensive analysis of warming-induced changes in soil
100
carbon stocks by assembling data from 49 field experiments located across North
101
America, Europe and Asia. We find that the effects of warming are contingent upon
102
the size of the initial soil carbon stock, with considerable carbon losses occurring in
103
high-latitude areas. By extrapolating this empirical relationship to the global scale,
104
we provide estimates of global soil carbon sensitivity that may help to constrain
105
Earth System Model projections. Our empirical relationship suggests that global
106
soil carbon stocks in the upper soil horizons will fall by 30 (± 30) to 203 (± 161) Pg C
107
for 1 degree of continuous warming, depending upon the potential acclimatization
108
rate of soil organic matter decomposition. An assumption of annual acclimation
109
yields a conservative estimate that soil C stocks will fall by 55 (± 50) Pg C from the
110
upper soil horizons by 2050, a value that is 12-17% of anthropogenic emissions over
111
this period. Despite the uncertainty in these estimates, the direction of the global soil
112
carbon response is consistent across all acclimatization scenarios. Our analysis
113
provides strong empirical support for the assumption that rising temperatures will
114
stimulate the net loss of soil carbon to the atmosphere, driving a positive land
115
carbon-climate feedback that could accelerate climatic change.
116
117
The majority of the Earth’s terrestrial C is stored in the soil and changes in the size of this
118
C stock represent a prominent control on atmospheric C concentrations
6–8
. If
119
anthropogenic warming stimulates the loss of even a small proportion of soil C, it could
120
drive substantive additional planetary warming
7,9
. Yet, despite considerable scientific
121
attention in recent decades, there remains no consensus on the direction or magnitude of
122
warming-induced changes in soil C
3,10
. Although there is growing confidence that
123
warming generally enhances fluxes to and from the soil
8,12
, the net global balance
124
between these responses remains uncertain and direct estimates of soil C stocks are
125
limited to single-site experiments that generally reveal no detectable effects
1,11–13
.
126
127
Given the paucity of direct measurements of soil C stock responses to warming, Earth
128
System Models (ESMs) must rely heavily on short-term temperature responses of soil
129
respiration (
Q
10
) to infer long-term changes in global C stocks. Without empirical
130
observations that capture longer-term C dynamics, we are limited in our ability to
131
evaluate model performance, or constrain the uncertainty in model projections
14
. As such,
132
the land C-climate feedback remains one of the largest sources of uncertainty in current
133
ESMs
1–3
, restricting our capacity to develop C emissions targets that are compatible with
134
specific climate change scenarios. Direct field measurements of warming-induced
135
changes in soil C stocks are urgently needed to increase confidence in future climate
136
projections
14
.
137
138
We take advantage of the growing number of climate change experiments around the
139
world to compile the first global database of soil C stock responses to warming. Soil
140
samples were collected from replicate plots in 49 climate change experiments conducted
141
across six biomes, ranging from arctic permafrost to dry Mediterranean forests (Extended
142
data Figure 1). We compared soil C stocks across ‘warmed’ (treatment) and ‘ambient’
143
(control) plots to explore the effects of temperature across sites. The measured
144
differences in soil C stocks represent the net result of long-term changes in soil C inputs
145
(plant production) and outputs (respiration) in response to warming. By linking these soil
146
C responses to climatic and soil characteristics we are able to generate a spatial
147
understanding of the temperature-sensitivity of soil C stocks at a global scale. To
148
standardise collection protocols and account for the considerable variability in soil
149
horizon depths, we focus on C stocks in the top 10 cm of soil. At a global scale, this
150
upper soil horizon contains the greatest proportion of biologically active soil C by depth
6
.
151
152
The effects of warming on soil C stocks were variable, with positive, negative and neutral
153
impacts observed across sites (Figure 1). However, the direction and magnitude of these
154
warming-induced changes were predictable (Figure 2), being contingent upon the size of
155
standing soil C stocks and the extent and duration of warming. The interaction between
156
‘control C stocks’ and ‘degree-years’ (the standardised metric to represent the
157
multiplicative product of the extent (
°
C) and duration (years) of warming) was a strong
158
explanatory variable when predicting warmed C stocks (additive model AIC=383 vs.
159
multiplicative model AIC=381; see SI and Equation 1). Specifically, the impacts of
160
warming were negligible in areas with small initial C stocks, but losses occured beyond a
161
threshold of 20 – 40 kg C m
-3
and were considerable in soils with
≥
60 kg C m
-3
(Figure
162
1). No other environmental characteristics
(mean annual temperature, precipitation, soil
163
texture or pH) significantly (
P
> 0.1) influenced the responses of soil C stocks to
164
warming in our statistical models (additive enviromental with degree-year model
165
AIC=388; see SI).
166
167
The dominant role of standing C stocks in governing the magnitude of warming-induced
168
soil C losses is in line with both empirical and theoretical expectations
2,15,16
. The thawing
169
of permafrost soils, where limited C decomposition has led to the accumulation of large
170
C stocks, will undoubtedly contribute to this phenomenon
17,18
. However, our analysis also
171
revealed considerable soil C losses in several non-permafrost regions, suggesting that
172
additional mechanisms may contribute to the vulnerability of large soil C stocks.
173
Presumably, the vulnerability of soils containing large C stocks stems from the high
174
temperature-sensitivity of C decomposition and biogeochemical restrictions on the
175
processes driving soil C inputs. In ecosystems with low initial soil C stocks, minor losses
176
that result from accelerated decomposition under warming may be offset by concurrent
177
increases in plant growth and soil C stabilization
12,19
. In contrast, in areas with larger
178
standing soil C stocks, accelerated decomposition outpaces potential C accumulation
179
from enhanced plant growth, driving considerable C losses into the atmosphere.
180
181
By combining our measured soil C responses with spatially-explicit estimates of standing
182
C stocks
17
and soil surface temperature change
20
(using Equation 2), we reveal the global
183
patterns in the vulnerability of soil C stocks (Figure 3). Given that high-latitude regions
184
have the largest standing soil C stocks
17
and the fastest expected rates of warming
15,20
,
185
our results suggest that the overwhelming majority of warming-induced soil C losses are
186
likely to occur in Arctic and sub-Arctic regions (Figure 3). These high-latitude C losses
187
drastically outweigh any minor changes expected in mid- and lower latitude regions,
188
providing additional support for the idea of Arctic amplification of climate change
189
feedbacks
15
(Figure 3). These warming-induced soil C losses need to be considered in
190
light of future changes in moisture stress and vegetation growth, which are also likely to
191
respond disproportionately to climate change in high-latitude areas
15
. Notably, the spatial
192
distribution of soil C changes from our extrapolation contradicts projections from the
193
CMIP5 archive of Earth system models
21
, which show increases in soil C at high
194
latitudes, presumably due to the increases in plant producitity
22
. The warming-induced
195
losses of soil C that we observe have the potential to offset these vegetation responses,
196
emphasizing the importance of representing soil C vulnerability in the process-based
197
models used in climate change projections.
198
199
We extrapolated this relationship over the next 35 years to indicate how global soil C
200
stocks might respond by 2050. The simple extrapolation of our empirical relationship
201
suggests that 1 degree of warming over 35 years would drive the loss of 203 (±161) Pg C
202
from the upper soil horizon (Figure 3). However, this approach implicitly assumes that
203
soil communities never acclimatize to changes in temperature, so are likely to drastically
204
over-estimate total soil C losses. Indeed, as with mechanistic models
23
, our assumptions
205
about the rate of soil C acclimatization will strongly influence the magnitude of our
206
predicted C losses (see Figure 3B). For example, a range of recent analyses suggest that
207
soil communities can acclimatize to warming within a year
24–26
. If we assume annual
208
acclimatization to warming in our extrapolation, then approximately 30 (± 30) Pg C
209
would be lost from the surface soil for 1 degree (ºC) of warming. Given that global
210
average soil surface temperatures are projected to increase by ~2 ºC over the next 35
211
years under a business-as-usual emissions scenario
16
, this annual time step extrapolation
212
would suggest that warming could drive the net loss of ~55 (± 50) Pg C from the upper
213
soil horizon. If, as expected, this C entered the atmospheric pool, it would increase the
214
atmospheric burden of CO
2
by approximately 25 ppm over this period.
215
216
The global extrapolation of our empirical data is broadly intended to contextualize our
217
measured changes in soil C stocks. We stress that such statistical approaches cannot be
218
used to project soil C losses far into the future because, unlike process-based models,
219
they cannot capture the complex processes that govern long-term C dynamics. For
220
example, extending the observed relationship over several centuries would lead to a
221
global convergence of soil C stocks. Conversely, soil C stocks would increase
222
exponentially in response to environmental cooling. Our linear extrapolation inherits
223
weaknesses from simple single pool models, which can over-predict the magnitude of
224
responses in the long term
2,27
. However, the value of such linear approximations lie in
225
their descriptive strength rather than their predictive capabilities: instead of using short-
226
term flux estimates to project long-term changes in C stocks, our approach allows the
227
scaling of measured C differences over time frames (i.e. decades) represented by the
228
experimental studies. Our results capture the realised temperature-sensitivity of current
229
soil C stocks and can serve as a guideline (or target) for multi-pool process-based models.
230
Specifically, these models can run forward simulations that attempt to reflect the
231
outcomes of the warming experiments that we present. Those models which accurately
232
capture the observed relationships between standing soil C stocks and losses under
233
gradual step increases in global temperature are likely to be the most successful at
234
projecting the land C-climate feedback into the future.
235
236
Our analysis reveals a number of outstanding challenges facing empiricists and modelers,
237
which currently limit the certainty of current land C-climate feedback predictions (see
238
Supplemenrary Table 1). These limitations fall into two distinct categories, as more data
239
are necessary to improve (i) our current global estimates of soil C temperature sensitivity,
240
and (ii) modelling efforts to project these soil C responses into the future. First, along
241
with the limited spatial and temporal scale of current warming experiments, perhaps the
242
most critical limitation to our present analysis is the paucity of information about the
243
responses of soil C stocks at depth (below 10 cm). Although the size of C stocks decrease
244
down the soil profile
28
, any additional C losses from these deeper soil horizons will
245
undoubtedly enhance the effects we present. Second, incorporating global soil C
246
information into modelling frameworks requires a mechanistic understanding of how
247
warming affects each of the individual components of the ecosystem C cycle. Now that
248
we are beginning to generate a global picture of the temperature-sensitivity of soil C
249
losses (respiration)
8
and total C stocks, our limited understanding of how warming
250
influences global soil C inputs remains a major outstanding source of uncertainty for
251
modelling efforts
1,22
. These efforts also require more information about the interacting
252
effects of other global change factors that may simultaneously influence soil C dynamics.
253
This non-exclusive set of practical challenges calls for concerted, coordinated investment
254
in multi-factor climate change experiments for an extended period of time to generate the
255
data necessary to improve confidence in future climate projections.
256
257
In conclusion, our global compilation of experimental data allows us to see past the
258
conflicting results from single-site studies and capture larger patterns in the sensitivity of
259
soil C to warming. The warming-induced changes in soil C stocks reflect the net result of
260
changes in C fluxes into and from the soil, which can augment modelling efforts to
261
project Earth system dynamics into the future. Ultimately, our analysis provides
262
empirical support for the long-held concern that rising temperatures stimulate the loss of
263
soil C into the atmosphere, driving a positive land C-climate feedback that could
264
accelerate planetary warming over the 21
st
century. Reductions in greenhouse gas
265
emissions are essential if we are to avoid the most damaging impacts of the land C-
266
climate feedback over the rest of this century.
267
268
REFERENCES
269
270
1.
Todd-Brown, K. E. O.
et al.
Changes in soil organic carbon storage predicted by
271
Earth system models during the 21st century.
Biogeosciences
11,
2341–2356
272
(2014).
273
2.
Jones, C.
et al.
Twenty-First-Century Compatible CO
2
Emissions and Airborne
274
Fraction Simulated by CMIP5 Earth System Models under Four Representative
275
Concentration Pathways.
J. Clim.
26,
4398–4413 (2013).
276
3.
Arora, V. K.
et al.
Carbon–Concentration and Carbon–Climate Feedbacks in
277
CMIP5 Earth System Models.
J. Clim.
26,
5289–5314 (2013).
278
4.
Ballantyne, A. P.
et al.
Audit of the global carbon budget: estimate errors and their
279
impact on uptake uncertainty.
Biogeosciences
12,
2565–2584 (2015).
280
5.
Riahi, K.
et al.
RCP 8.5-A scenario of comparatively high greenhouse gas
281
emissions.
Clim. Change
109,
33–57 (2011).
282
6.
Jobbágy, E. G. & Jackson, R. B. the Vertical Distribution of Soil Organic Carbon
283
and Its.
Ecol. Appl.
10,
423–436 (2000).
284
7.
Bellamy, P. H., Loveland, P. J., Bradley, R. I., Lark, R. M. & Kirk, G. J. D.
285
Carbon losses from all soils across England and Wales 1978-2003.
Nature
437,
286
245–8 (2005).
287
8.
Mahecha, M. D.
et al.
Global convergence in the temperature sensitivity of
288
respiration at ecosystem level.
Science
329,
838–40 (2010).
289
9.
Davidson, E.A., Janssens, I. A. Temperature sensitivity of soil carbon
290
decomposition and feedbacks to climate change.
Nature
440,
165–73 (2006).
291
10.
Crowther, T. W.
et al.
Biotic interactions mediate soil microbial feedbacks to
292
climate change.
Proc. Natl. Acad. Sci.
112,
7033–7038 (2015).
293
11.
Lu, M.
et al.
Responses of ecosystem carbon cycle to experimental warming: a
294
meta-analysis.
Ecology
94,
726–738 (2013).
295
12.
Day, T. a., Ruhland, C. T. & Xiong, F. S. Warming increases aboveground plant
296
biomass and C stocks in vascular-plant-dominated Antarctic tundra.
Glob. Chang.
297
Biol.
14,
1827–1843 (2008).
298
13.
Sistla, S. a
et al.
Long-term warming restructures Arctic tundra without changing
299
net soil carbon storage.
Nature
497,
615–8 (2013).
300
14.
Bradford, M. A., Wieder, W. R., Bonan, G. B., Fierer, N. Raymond, P. A. &
301
Crowther, T. W. Managing uncertainty in soil carbon feedbacks to climate change.
302
Nat. Clim. Chang.
(2016). doi:10.1038/NCLIMATE3071
303
15.
Serreze, M. C. & Barry, R. G. Processes and impacts of Arctic amplification: A
304
research synthesis.
Glob. Planet. Change
77,
85–96 (2011).
305
16.
Koven, C. D.
et al.
A simplified, data-constrained approach to estimate the
306
permafrost carbon–climate feedback.
Philos. Trans. R. Soc. A Math. Phys. Eng.
307
Sci.
373,
20140423 (2015).
308
17.
Hengl, T.
et al.
SoilGrids1km--global soil information based on automated
309
mapping.
PLoS One
9,
e105992 (2014).
310
18.
Schuur, E. A.
et al.
Climate change and the permafrost carbon feedback.
Nature
311
520,
171–179 (2015).
312
19.
Macias-Fauria, M., Forbes, B. C., Zetterberg, P. & Kumpula, T. Eurasian Arctic
313
greening reveals teleconnections and the potential for structurally novel
314
ecosystems.
Nat. Clim. Chang.
2,
613–618 (2012).
315
20.
Meehl, G. a.
et al.
Climate change projections in CESM1(CAM5) compared to
316
CCSM4.
J. Clim.
26,
6287–6308 (2013).
317
21.
Ciais, P.
et al.
in
Cli- mate Chang. 2013 Phys. Sci. Basis. Contrib. Work. Gr. I to
318
Fifth Assess. Rep. Intergov. Panel Clim. Chang.
(Stocker, T. F. et al.) (Cambridge
319
University Press, Cambridge, United Kingdom and New York, NY, USA., 2013).
320
22.
Koven, C. D.
et al.
Controls on terrestrial carbon feedbacks by productivity versus
321
turnover in the CMIP5 Earth System Models.
Biogeosciences
12,
5211–5228
322
(2015).
323
23.
Wieder, W. R., Bonan, G. B. & Allison, S. D. Global soil carbon projections are
324
improved by modelling microbial processes.
Nat. Clim. Chang.
3,
909–912 (2013).
325
24.
Crowther, T. W. & Bradford, M. A. Thermal acclimation in widespread
326
heterotrophic soil microbes.
Ecol. Lett.
16,
469–77 (2013).
327
25.
Bradford, M. A. Thermal adaptation of decomposer communities in warming soils.
328
Front. Microbiol.
(2013).
329
26.
Luo, Y., Wan, S.Q., Hui, D.F. & Wallace, L. L. Acclimatization of soil respiration
330
to warming in a tall grass prairie.
Nature
413,
622–625 (2001).
331
27.
Georgiou, K., Koven, C. D., Riley, W. J. & Torn, M. S. Toward improved model
332
structures for analyzing priming: potential pitfalls of using bulk turnover time.
333
Glob. Chang. Biol.
21,
4298–4302
334
28.
Conant, R. T.
et al.
Temperature and soil organic matter decomposition rates -
335
synthesis of current knowledge and a way forward.
Glob. Chang. Biol.
17,
3392–
336
3404 (2011).
337
338
339
340
341
AUTHOR CONTRIBUTIONS
342
The study was conceived and designed by TWC and NS. Statistical analysis was
343
performed by KEOTB , MAB, and BLS. Spatial scaling and mapping was performed by
344
WRW and CWR. The manuscript was written by TWC with assistance from CWR,
345
MAB, WRW, KEOTB, SDA and PBR. All other authors reviewed and provided input on
346
the manuscript. Measurements of soil carbon, bulk density and geospatial data from
347
climate change experiments around the world were provided by JCC, MBM, SF, GZ,
348
AJB, BE, SR, AJH, HL, YL, AM, JP, ME, SDF, GK, CP, PHT, LLR, EP, SS, JML,
349
SDA, KKT, BE, LNM, IKS, KSL, YC, FAD, SM, SN, ATC, JMB, SB, JSC, FAD, JG,
350
BRJ, JM, LPM and PBR.
351
352
ACKNOWLEDGEMENTS
353
We would like to thank the Global Soil Biodiversity Initiative (GSBI) for support during
354
this project. This project was largely funded by grants to TWC from Marie Sk
ł
odowska
355
Curie, the British Ecological Society and the Yale Climate and Energy Institute. MAB
356
and WRW were supported by grants from the US National Science Foundation and
357
WRW from the US Department of Energy and KEOTB by the Linus Pauling
358
Distinguished Postdoctoral Fellowship program.
The experiments that produced the data
359
were funded by grants too numerous to list here.
360
361
362
FIGURE LEGENDS
363
364
Figure 1:
The effect of warming on soil C losses depends on the initial standing soil
365
C stock.
The interaction between warming (degree-years) and standing C stocks is a
366
primary determinant of final warmed soil C stocks (estimated using a mixed effects
367
model; n = 229; see SI). Here, each point represents the difference (mean±SE) between
368
soil C stocks in warmed and ambient plots within an individual experiment. The size of
369
points represents the length of each individual study, and the colour indicates the amount
370
of warming. The shaded area represents the bootstraped 95% conficence interval (R
2
=
371
0.49: see supplemental for details).
372
373
Figure 2: Validation plots highlighting the predictive strength of the statistical
374
model.
Plate A: predicted vs. observed soil C stock values in warmed treatment plots
375
(estimated using statistical Equation 1: R
2
= 0.95 – high value is driven by the correlation
376
between C values in control and warmed plots). Black points represent mean values for
377
each study, and the coloured area represents the density of 1000 simulated points
378
randomly selected from within the normal distribution for each study. The 1:1 line is
379
included to highlight perfect correspondence between predicted and observed points and
380
distributions. Plate B: Bootstrapped estimates of model (Equation 2) slope values for
381
different sample sizes. Studies were removed at random, the slope coefficient was
382
calculated and this was repeated 1000 times. Each point represents a bootstrapped
383
estimate of slope for the model that included any given number of studies, and we include
384
the interquartile range and median slope estimates an each number. The average slope
385
value remains unchanged until >38 studies have been removed from the initial analysis
386
(with 49 studies), highlighting that the relationship we present is not disproportionately
387
influenced by the effects of warming in any specific study(s) or site(s).
388
389
Figure 3: Spatial and temporal extrapolation of the temperature-vulnerability of soil
390
C stocks.
Plate A: Map of soil C vulnerability to warming. This map was generated by
391
extrapolating Equation 2 (i.e. the no-acclimation scenario) using spatially explicit
392
estimates of soil C stocks
17
, and soil surface temperature change
20
, and reveals the spatial
393
variation in projected surface soil C stock changes (0-15 cm) expected under a 1ºC rise in
394
global average soil surface temperature. Panel B: Total reductions in the global C pool
395
under a 1, and 2ºC global average soil surface warming by 2050, as expected under a full
396
range of different soil acclimatization scenarios (x axis). Shaded areas indicate 95%
397
confidence intervals around the average C losses (dots) for each scenario. The rapid
398
acclimatization scenarios (e.g. 1 week – 1 year) result in lower total soil C losses than the
399
no acclimatization scenario, but all simulations reveal considerable global losses of soil C
400
under warming over the next 35 years. Note that our map predicts some C gains in desert
401
regions that currently contain almost no soil C. Removing these biochemically
402
questionable responses would marginally enhance the size of the global C losses reported
403
in Pannel B.
404
405
406
METHODS
407
408
Data collection and standardisation
409
Total percentage C and bulk density (BD) data (n=456) were collected from each of the
410
replicated warmed and ambient plots within 49 experimental warming studies located
411
across North America, Europe and Asia. In several of these sites, it was not possible to
412
access these data for deeper soil horizons. Therefore, we standardised collection
413
protocols and account for the considerable variability in soil horizon depths by focusing
414
on the top 10 cm of soil, which contains the majority of the biologically active C. Soil C
415
stocks were then calculated for each plot (percentage C * BD / 100), and expressed as the
416
total mass of C (kg m
-3
soil) in each plot. Metadata for each study included the mean
417
annual difference in soil surface temperature between warmed and ambient plots and the
418
duration of experimental warming. These were multiplied together to generate the
419
standardised metric ‘degree-years’, (reflecting the extent and duration of warming) to
420
permit the comparison of warming effects across sites. Other collected data included a
421
site-specific geospatial reference (latitude and longitude), which was linked to spatially-
422
explicit estimates of soil characteristics (pH and texture using the SoilGrids database
17
)
423
and climate (using the Bioclim database) following Crowther
et al.
29
. These climate and
424
soil characteristics were then used to explore the dominant controls on soil C stock
425
sensitivity to warming across our global compilation of experimental studies.
426
427
Some of the climate change studies in this analysis containted multiple separate warming
428
experiments. Degree-years and soil C were calculated independently for each study
429
within a site, but all other environmental data were shared. In addition, some sites
430
included multi-factor climate change studies. For these studies, ambient and warmed
431
plots were only compared under equivalent experimental conditions so that all other
432
conditions remained consistent between treatments.
433
434
Statistical analysis
435
We fitted linear mixed models (LMMs) to evaluate the factors that correlate with the
436
measured soil C stocks following warming. Study site was included as a random factor
437
because clustering replicates by location could introduce spatial autocorrelation
30
. The
438
LMMs were fit assuming a Gaussian error distribution in the “lme4” package for the R
439
statistical program
31
.
We constructed LMMs that included all of the putative explanatory
440
variables to explain warmed soil C stocks including treatment variables (degrees warmed
441
and degrees warmed across years of study (degree-years)), and environmental
442
characteristics (Standing soil C stocks (control C stocks), Mean Annual Temperature
443
(MAT), Mean Annual Precipitation (MAP), pH (as H
+
ion concentration) and soil texture
444
(with percentage clay as the representative variable)). Given the markedly different
445
ranges in magnitudes of the explanatory variables at a global scale, variables were
446
standardised using a z-transformation prior to use in final models
32
, though the response
447
variable (soil C stock) was not standardised. Further, given positive skew in the
448
distributions of degrees, degree-year and control soil C, these variables were also natural-
449
log transformed. Neither of these data transformations significantly altered the statistical
450
outputs, so were retained in final models. The only independent variables that were
451
strongly correlated (pairwise coefficients >0.4) were MAT and MAP, and MAT and
452
percentage clay.
453
454
Model selection was performed using maximum likelihood comparison of competing
455
models (see SI), using Akaike information criterion (AIC) and Bayesian information
456
criterion (BIC) approaches providing identical results.
Only warming (degrees and
457
degree-years) and standing C stock (control soil C) were the most parsimonious final
458
models, (full model AIC=381 vs. final model AIC=372; Tables S6, S7) and the best-fit
459
model included an interaction between these two variables (addItive model AIC=375 vs.
460
multiplicative model AIC=372; Table S7). All reported
P
-values are quasi-Bayesian,
461
rather than the classical frequentist
P
-values, but retain the same interpretation. We
462
considered coefficients with
P
<0.05 significant and coefficients with
P
<0.10 marginally
463
significant. Variance explained by the model was also estimated by calculating
R
2
values
464
for the minimally-adequate LMM following Nakagawa and Schielzeth to retain the
465
random effects structure.
466
467
The final statistical model was:
468
C
w
=
a
⋅
C
c
⋅ Δ
T
Δ
t
(
)
+
b
⋅
C
c
+
d
⋅ Δ
T
Δ
t
(
)
+
ε
Eqn 1
469
470
where
Cw
is the carbon stock in the warmed treatment, Cc the carbon stock in the control
471
plots,
Δ
T
Δ
t
the degree-years calculated by multiplying the degrees warmed times the
472
length of the treatment,
ε
the random effects term controlling for study site (see SI), and
473
(a, b, d
) represent fitted coefficients for the statistical model.
474
475
Statistical model development
476
To scale the changes in soil C stocks, we re-arranged our statistical equation in order to
477
describe the relationship between standing soil C stocks (control C stocks) and warming
478
(degree-years) over time:
479
480
C
w
−
C
c
Δ
T
⋅ Δ
t
=
f
⋅
C
c
+
g
Eqn 2
481
482
where
Cw
is the carbon stock in the warmed treatment, Cc the carbon stock in the control
483
plots,
Δ
T
Δ
t
the degree-years calculated by multiplying the degrees warmed times the
484
length of the tratement. This new model explained a considerable proportion (
R
2
=0.606;
485
SI Table 7) of the difference in soil C stocks between studies over treatment. This is
486
futher highlighted in Figure 2.
487
488
We used sample-based bootstrapping (as opposed to the study-based bootstrapping in
489
Figure 2b) to evaluate the strength of this simple statistical relationship and to generate a
490
margin of error for global soil C stock projections. Equation 1 was extrapolated with
491
95%CI bounds by randomly selecting 200 samples from all studies, randomising the
492
control-warmed pairings, and repeating the regression 1000 times. This resulted in
493
normally distributed parameters (see SI Table 4) with the following 95%CI. The
494
intercept-slope pairs were then sampled to create the grey margin of error seen in Figure
495
1.
496
497
The inclusion of a linear effect of ‘time’ in our analysis implicitly assumes that soils
498
never acclimatize to warming. However, recent studies suggest that soils can acclimatize
499
to warming within an annual time-frame
24–26
, so the assumption of no acclimatization is
500
likely to over-estimate total soil C losses. To explore the importance of this
501
acclimatization assumption in determining the magnitude of soil C losses in our
502
extrapolation, we repeated the analysis across a full range of acclimatization scenarios.
503
To simulate different acclimatization rates, we sucessively capped the study years (or
504
experiment duration) at 1 week, 1 month, 6 months, and 1, 5, 7, 8.75, 11.6, 17.5 years,
505
then re-ran the linear regression described above (Eqn 2) with the sample-based
506
bootstrapping. The resulting coefficients are in SI Table 4.
507
508
Extrapolation
509
To estimate changes in global soil C stocks under projected warming scenarios we
510
applied linear changes in soil temperature that result in 1 or 2
o
C mean warming by 2050
511
(35 years) that is spatially distributed in a manner consistent with surface soil temperature
512
projections from a single ensemble of the Community Earth System Model (CESM) that
513
was submitted to the CMIP5 archive under RCP8.5 run from 2005 to 2050. We estimated
514
initial soil C stocks in the upper soil horizon (0-15 cm) from the SoilGrids 50-
515
km
2
product
17
, that was regridded using bilinear interpolation to the same spatial scale of
516
soil surface temperature projections (roughly 1 degree).
517
518
The temporal extrapolations across the 35 years (until 2050) were applied separately for
519
each of the possible acclimatization scenarios described above. First, the single time step
520
approach used the coefficients listed above and illustrated in Figure 1 to generate a 95%
521
confidence interval for projected C losses. On average, roughly 17.5 degree-years and 35
522
degree-years were seen cumulatively across the globe for the 1 and 2
o
C warming
523
scenarios, respectively. The exact warming seen by any individual grid was determined
524
by their relative temperature shifts predicted by the CESM run described above. Each
525
subsequent acclimatization scenario was then extrapolated using a given time step for a
526
forward integration where the change in soil C over that time was based on the soil C
527
stock at the beginning and the degree-year change experienced by that site over the
528
duration of at respective time step. For example, the 1-year acclimation scenario used the
529
coefficients from the analysis where or experimental duration was capped at 1 year (see
530
SI, Table 4), and was extrapolated to 2050 using the sum of 35 annual time steps. The
531
predicted soil C losses for a global average warming of 1 and 2
C by 35 years, based on
532
each of the full range of acclimatization scenarios, is presented in Figure 3B. This reveals
533
how our assumption about acclimatization time influences the magnitude of our final
534
expected C losses.
535
536
The R code for the full analysis can be found in the Supplementary Material.
537
538
References
539
29.
Crowther, T. W.
et al.
Mapping tree density at a global scale.
Nature
525,
201–205
540
(2015).
541
30.
Bolker, B. M.
et al.
Generalized linear mixed models: a practical guide for ecology
542
and evolution.
Trends Ecol. Evol.
24,
127–135 (2009).
543
31.
Bates, D., Machler, M., Bolker, B. M. & Walker, S. C. Fitting Linear Mixed-
544
Effects Models using lme4.
J. Stat. Softw.
67,
1–48 (2014).
545
32.
Gelman, A. Scaling regression inputs by dividing by two standard deviations.
Stat.
546
Med.
27,
2865–2873 (2008).
547
548
549
550
Extended data table 1:
List of current limitations in the availability of global data that
551
restrict confidence in our current understanding of the land C-climate feedback. Each of
552
these limitations represents a practical challenge that can be adressed by empiricists to
553
improve the accuracy of benchmarking estimates or to perameterize process-based
554
models that project Earth system dynamics into the future.
555
556
Extended Data Figure 1:
Map of study locations.
The size of points represents the
557
number of separate warming experiments at that location and colour indicates the biome,
558
as delineated by The Nature Conservancy (http://www.nature.org).
559
560
Extended Data Figure 2:
Extended extrapolation of our linear model that illustrates
561
some of the limitations of this statistical scaling approach. Figures show soil C
562
projections for initial stocks under (A) 1 degree warming per decade, which converge on
563
the same soil C stocks; or (B) 2 degree cooling per decade, which show exponential
564
increases in soil C stocks. Although both of these responses are unrealistic, we note the
565
time scales (and amount of warming) needed to observe such dynamics are well outside
566
the range of observed manipulations or climate change projections. This highlights that
567
our extrapolation cannot represent a substitute for process-based models, which capture
568
long-term C dynamics. However, under more realistic warming (< 5 degrees C) our
569
extrapolation makes plausible projections over decadal time scale that represent the
570
current temperature sensitivity of soil C stocks.
571
572
573
574
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
−6
−3
0
3
6
0
25
50
75
100
125
Standing Carbon stock
(kg m
−
3
)
Ann
ual change in Carbon stock per
°
C
(kg m
−
3
°
C
−
1
y
e
a
r
−
1
)
Duration (years)
●
●
●
5
10
15
20
25
Warming (
°
C)
●
●
●
●
●
●
<1 1 2 3 4 5
−
0.050
−
0.025
0.000
0.025
0.050
1
10
20
30
40 43
Datapoints removed in bootstrap
Slope
Studies removed
Sl
op
e
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
10
30
50
70
100
10
30
50
70
100
Observed C stock (kg.m
−
3
)
Predicted C stock (kg.
m
−
3
)
2
4
6
Point density
A
B
b
a
●●
●●
●
●
●
●
● ●
●●
●●
●
●
●
●
●
●
−
400
−
200
0
0
10
20
30
Acclimation time
Extr
apolated Carbon loss b
y 2050 (Pg)
Warming
°
C
●
●
1
2
a
b
Supplemental for Crowther et al 2016
K Todd-Brown (
) with M Bradford, W Wieder, B Snoek and T
Crowther
July 19, 2016
Contents
2
8
CI for parameter range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
Global Extrapolations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
15
Change in carbon per degree year with bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
Model-data plot for interactive statisitcal model (Figure 2a) . . . . . . . . . . . . . . . . . . . . . .
17
Boot strap slope comparison (Figure 2b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
Global carbon vulnerability map (Figure 3a)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
Acclimatization assumptions affects soil carbon losses (Figure 3b) . . . . . . . . . . . . . . . . . . .
24
Data summary and basic visualizations
25
33
Bootstrap function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
Read data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
Construct study means and standard deviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
Convert R data.frame to netCDF file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
Main analysis script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
Extrapolation code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
List of Tables
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
. . . . . . . . . . .
7
1
. . . . . . . . . . .
8
The type key is as follows: dCperDegYr is the change in carbon stock regressed against the
. . . . . . . . . . . . . . . . . . . .
9
Time step is the size of the time step used in the numerical integration. dC is the change in the
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
Description of study sites including mean annual temperature (MAT), mean annual precipitation
(MAP), soil pH, and soil percent clay (perClay). For standardization purposes, all climate
data were collected from Bioclim and all soil data were collected from SoilGrids.
. . . . . . .
27
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
. .
30
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
LMER model selection
There were several LMER models which were considered as follows:
l_ply
(
names
(lmer.list), function(xx){
cat
(
'------------'
,xx,
'---------------\n'
)
(
summary
(lmer.list[[xx]]))
cat
(
'\n'
)})
## ------------ simple ---------------
## Linear mixed model fit by REML ['lmerMod']
## Formula: C.warmed ~ C.control + (1 | Study)
##
Data: data.sample.plus.rescaled
##
## REML criterion at convergence: 355.9
##
## Scaled residuals:
##
Min
1Q Median
3Q
Max
## -4.5629 -0.3810 0.0790 0.5306 3.5029
##
## Random effects:
## Groups
Name
Variance Std.Dev.
## Study
(Intercept) 0.008552 0.09248
## Residual
0.267455 0.51716
2
## Number of obs: 225, groups: Study, 47
##
## Fixed effects:
##
Estimate Std. Error t value
## (Intercept) 0.16748
0.05222
3.207
## C.control
0.83498
0.03683 22.671
##
## Correlation of Fixed Effects:
##
(Intr)
## C.control -0.696
##
## ------------ addative.dT ---------------
## Linear mixed model fit by REML ['lmerMod']
## Formula: C.warmed ~ C.control + Tdelta + (1 | Study)
##
Data: data.sample.plus.rescaled
##
## REML criterion at convergence: 360.5
##
## Scaled residuals:
##
Min
1Q Median
3Q
Max
## -4.5572 -0.3849 0.0793 0.5225 3.4958
##
## Random effects:
## Groups
Name
Variance Std.Dev.
## Study
(Intercept) 0.01022 0.1011
## Residual
0.26726 0.5170
## Number of obs: 225, groups: Study, 47
##
## Fixed effects:
##
Estimate Std. Error t value
## (Intercept) 0.178727
0.063246
2.826
## C.control
0.833247
0.037661 22.125
## Tdelta
-0.008932
0.038939 -0.229
##
## Correlation of Fixed Effects:
##
(Intr) C.cntr
## C.control -0.490
## Tdelta
-0.550 -0.151
##
## ------------ addative.all ---------------
## Linear mixed model fit by REML ['lmerMod']
## Formula: C.warmed ~ C.control + MAP + MAT + pH + degYr + perClay + (1 |
##
Study)
##
Data: data.sample.plus.rescaled
##
## REML criterion at convergence: 372.7
##
## Scaled residuals:
##
Min
1Q Median
3Q
Max
## -4.5934 -0.3706 0.0626 0.4693 3.5707
##
## Random effects:
## Groups
Name
Variance Std.Dev.
## Study
(Intercept) 0.01607 0.1268
3
## Residual
0.26328 0.5131
## Number of obs: 225, groups: Study, 47
##
## Fixed effects:
##
Estimate Std. Error t value
## (Intercept) 0.16429
0.10930
1.503
## C.control
0.81814
0.04336 18.867
## MAP
0.09615
0.08783
1.095
## MAT
-0.11018
0.07926 -1.390
## pH
0.02757
0.06851
0.402
## degYr
-0.04959
0.04116 -1.205
## perClay
0.05873
0.06837
0.859
##
## Correlation of Fixed Effects:
##
(Intr) C.cntr MAP
MAT
pH
degYr
## C.control -0.318
## MAP
-0.450 -0.327
## MAT
-0.004 0.237 -0.666
## pH
-0.638 -0.145 0.710 -0.268
## degYr
-0.313 -0.132 0.064 0.067 0.142
## perClay
0.236 0.256 -0.340 -0.251 -0.589 -0.318
##
## ------------ addative.enviro ---------------
## Linear mixed model fit by REML ['lmerMod']
## Formula: C.warmed ~ C.control + MAP + MAT + pH + perClay + (1 | Study)
##
Data: data.sample.plus.rescaled
##
## REML criterion at convergence: 369.5
##
## Scaled residuals:
##
Min
1Q Median
3Q
Max
## -4.5907 -0.3791 0.0774 0.4715 3.5187
##
## Random effects:
## Groups
Name
Variance Std.Dev.
## Study
(Intercept) 0.02268 0.1506
## Residual
0.25938 0.5093
## Number of obs: 225, groups: Study, 47
##
## Fixed effects:
##
Estimate Std. Error t value
## (Intercept) 0.14078
0.10887
1.293
## C.control
0.79712
0.04424 18.016
## MAP
0.11242
0.09108
1.234
## MAT
-0.11841
0.08329 -1.422
## pH
0.04011
0.07078
0.567
## perClay
0.03427
0.06789
0.505
##
## Correlation of Fixed Effects:
##
(Intr) C.cntr MAP
MAT
pH
## C.control -0.375
## MAP
-0.458 -0.317
## MAT
0.003 0.243 -0.662
## pH
-0.637 -0.124 0.710 -0.271
4
## perClay
0.165 0.222 -0.334 -0.260 -0.576
##
## ------------ addative.treat ---------------
## Linear mixed model fit by REML ['lmerMod']
## Formula: C.warmed ~ C.control + degYr + (1 | Study)
##
Data: data.sample.plus.rescaled
##
## REML criterion at convergence: 359.5
##
## Scaled residuals:
##
Min
1Q Median
3Q
Max
## -4.5558 -0.4998 0.0856 0.5315 3.5699
##
## Random effects:
## Groups
Name
Variance Std.Dev.
## Study
(Intercept) 0.005076 0.07125
## Residual
0.270188 0.51980
## Number of obs: 225, groups: Study, 47
##
## Fixed effects:
##
Estimate Std. Error t value
## (Intercept) 0.19959
0.06188
3.225
## C.control
0.84291
0.03613 23.329
## degYr
-0.04100
0.03625 -1.131
##
## Correlation of Fixed Effects:
##
(Intr) C.cntr
## C.control -0.560
## degYr
-0.563 -0.032
##
## ------------ interactive ---------------
## Linear mixed model fit by REML ['lmerMod']
## Formula: C.warmed ~ C.control * degYr + (1 | Study)
##
Data: data.sample.plus.rescaled
##
## REML criterion at convergence: 358.9
##
## Scaled residuals:
##
Min
1Q Median
3Q
Max
## -4.5838 -0.3893 0.0504 0.5100 3.4128
##
## Random effects:
## Groups
Name
Variance Std.Dev.
## Study
(Intercept) 0.006219 0.07886
## Residual
0.263818 0.51363
## Number of obs: 225, groups: Study, 47
##
## Fixed effects:
##
Estimate Std. Error t value
## (Intercept)
0.13997
0.06706
2.087
## C.control
0.91640
0.04852 18.887
## degYr
0.03077
0.04725
0.651
## C.control:degYr -0.08262
0.03538 -2.335
##
5
## Correlation of Fixed Effects:
##
(Intr) C.cntr degYr
## C.control
-0.644
## degYr
-0.648 0.411
## C.cntrl:dgY 0.392 -0.670 -0.643
##
## ------------ interactive.dT ---------------
## Linear mixed model fit by REML ['lmerMod']
## Formula: C.warmed ~ C.control * Tdelta + (1 | Study)
##
Data: data.sample.plus.rescaled
##
## REML criterion at convergence: 363.4
##
## Scaled residuals:
##
Min
1Q Median
3Q
Max
## -4.5711 -0.3686 0.0840 0.5444 3.5545
##
## Random effects:
## Groups
Name
Variance Std.Dev.
## Study
(Intercept) 0.005715 0.0756
## Residual
0.269722 0.5193
## Number of obs: 225, groups: Study, 47
##
## Fixed effects:
##
Estimate Std. Error t value
## (Intercept)
0.10244
0.07610
1.346
## C.control
0.89176
0.05028 17.737
## Tdelta
0.06505
0.06277
1.036
## C.control:Tdelta -0.05007
0.03434 -1.458
##
## Correlation of Fixed Effects:
##
(Intr) C.cntr Tdelta
## C.control
-0.702
## Tdelta
-0.738 0.483
## C.cntrl:Tdl 0.599 -0.684 -0.803
Comparing the BIC scores between the models, the simple regression between the carbon stock in the warmed
plots and the mean carbon stock of the control plots has the best score. The model with the addative
degree-years or degrees preforms best if we want more then just the basic correlation. There is no notable
difference between degree-years and degrees as a determinent for warmed soil carbon stocks.
pander
(
anova
(lmer.list$simple, lmer.list$addative.treat,
lmer.list$addative.dT, lmer.list$addative.enviro,
lmer.list$addative.all),
caption=
'Model fits comparing the statistical power
gained by of treatment (degree-Years, and degree; addative.treat and
addative.dT respectively) vs enviromental variables (MAT, MAP, and pH;
addative.enviro) vs all variables include (addative.enviro) to
explaining warmed soil carbon stocks.'
)
## refitting model(s) with ML (instead of REML)
6
Table 1: Model fits comparing the statistical power gained by
of treatment (degree-Years, and degree; addative.treat and adda-
tive.dT respectively) vs enviromental variables (MAT, MAP, and
pH; addative.enviro) vs all variables include (addative.enviro) to
explaining warmed soil carbon stocks.
Df
AIC
BIC
logLik
deviance
Chisq
Chi Df
Pr(>Chisq)
lmer.list$simple
4
354.4
368
-173.2
346.4
NA
NA
NA
lmer.list$addative.treat
5
355
372.1
-172.5
345
1.35
1
0.2453
lmer.list$addative.dT
5
356.3
373.4
-173.2
346.3
0
0
1
lmer.list$addative.enviro
8
360.3
387.6
-172.1
344.3
2.03
3
0.5663
lmer.list$addative.all
9
360.2
390.9
-171.1
342.2
2.097
1
0.1476
The interactive model has both a better AIC and BIC score then even the simple regression. Thus the
interative model is the most parsimonious.
pander
(
anova
(lmer.list$interactive, lmer.list$interactive.dT, lmer.list$addative.treat,
lmer.list$simple),
caption=
'Model fits comparing the statistical power gained by multiplicative
vs addative models using the controlled soil carbon stocks and degree-years or degrees
warmed to explain warmed soil carbon stocks. The interactive degree-years model
(interactive) signficantly better then the alternative models
(interactive.dT, addative.treat, and simple) considered.'
)
## refitting model(s) with ML (instead of REML)
Table 2: Model fits comparing the statistical power gained by multi-
plicative vs addative models using the controlled soil carbon stocks
and degree-years or degrees warmed to explain warmed soil carbon
stocks. The interactive degree-years model (interactive) signficantly
better then the alternative models (interactive.dT, addative.treat,
and simple) considered.
Df
AIC
BIC
logLik
deviance
Chisq
Chi Df
Pr(>Chisq)
lmer.list$simple
4
354.4
368
-173.2
346.4
NA
NA
NA
lmer.list$addative.treat
5
355
372.1
-172.5
345
1.35
1
0.2453
lmer.list$interactive
6
351.5
372
-169.8
339.5
5.466
1
0.01939
lmer.list$interactive.dT
6
356
376.5
-172
344
0
0
1
7
Linear regression models
pander
(
merge
(
subset
(modelFits, data==
'data.sample'
,
select=
-data),
subset
(modelFits, data==
'data.study'
,
select=
-data),
by=
c
(
'model'
),
suffixes=
c
(
'.sample'
,
'.study'
))[,
c
(
'model'
,
'adjR2.sample'
,
'pvalue.sample'
,
'adjR2.study'
,
'pvalue.study'
)] ,
caption=
'R2 and p-value of the control soil carbon stock and degree-years or degrees to
explain warmed soil carbon stocks, the difference between warmed and control soil carbon
stocks, and the rate of change of soil carbon stocks per degree-year across samples and
studies.'
)
Table 3: R2 and p-value of the control soil carbon stock and degree-
years or degrees to explain warmed soil carbon stocks, the difference
between warmed and control soil carbon stocks, and the rate of
change of soil carbon stocks per degree-year across samples and
studies.
model
adjR2.sample
pvalue.sample
adjR2.study
pvalue.study
(C.warmed - C.control)/(Years
* Tdelta) ~ C.control
0.139
4.16e-09
0.489
1.4e-08
(C.warmed - C.control)/Tdelta
~ C.control
0.123
3.38e-08
0.304
2.37e-05
C.warmed - C.control ~
C.control * degYr
0.421
6.13e-27
0.606
8.22e-10
C.warmed - C.control ~
C.control * Tdelta
0.374
3.28e-23
0.529
4.32e-08
C.warmed ~ C.control * degYr
0.765
1.61e-70
0.953
1.36e-30
C.warmed ~ C.control * Tdelta
0.746
8.98e-67
0.944
7.51e-29
CI for parameter range
ggplot
(
melt
(dCperDegYr.boot)) +
geom_histogram
(
aes
(
x=
value)) +
facet_wrap
(~variable,
scales=
'free'
) +
theme
(
axis.text=
element_text
(
angle =
45
,
hjust =
1
))
## No id variables; using all as measure variables
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
8
(Intercept)
C.control
p.value
adj.r.squared
r.squard
0
25
50
75
0
20
40
60
80
0
250
500
750
1000
0
25
50
75
0
25
50
75
100
0.75
1.00
1.25
−0.050 −0.045 −0.040 −0.035 −0.030
0.00000 0.00005 0.00010 0.00015
0.10
0.15
0.20
0.10
0.15
0.20
value
count
pander
(
subset
(parRange, type %in% resultsTable$type),
caption=
'95%CI of the coefficents and R2 of the change in soil carbon stocks
(warmed-controlled) per degree-year explained by the control soil carbon stock
[kg-C m^-3], constructed from samples. The type key is as follows: dCperDegYr is the
change in carbon stock regressed against the degree-year, dCperDeg is the change in
carbon stock regressed against the degrees warmed, and the time notates a dC per
degree-year regression where study times were capped at the stated time (ie for yr1 any
study that ran longer then a year was set to one year and then the change in carbon
stock agaist degree-year was calculated). '
)
Table 4: 95%CI of the coefficents and R2 of the change in soil
carbon stocks (warmed-controlled) per degree-year explained by the
control soil carbon stock [kg-C mˆ-3], constructed from samples.
The type key is as follows: dCperDegYr is the change in carbon
stock regressed against the degree-year, dCperDeg is the change in
carbon stock regressed against the degrees warmed, and the time
notates a dC per degree-year regression where study times were
capped at the stated time (ie for yr1 any study that ran longer then
a year was set to one year and then the change in carbon stock
agaist degree-year was calculated).
type
intercept
C
p.value
adj.r.squared
r.squard
qrt
1
dCperDegYr
0.8192
-0.04441
3.643e-10
0.1031
0.1076
0.05
2
dCperDegYr
1.034
-0.0384
4.189e-08
0.1379
0.1423
0.5
9
type
intercept
C
p.value
adj.r.squared
r.squard
qrt
3
dCperDegYr
1.255
-0.03213
2.344e-06
0.1777
0.1818
0.95
4
dCperDeg
2.774
-0.2133
8.372e-09
0.06361
0.06836
0.05
5
dCperDeg
4.874
-0.1824
4.51e-07
0.1175
0.122
0.5
6
dCperDeg
5.881
-0.1063
0.0001975
0.1518
0.1561
0.95
7
wk1
155.4
-11.08
9.189e-09
0.06995
0.07467
0.05
8
wk1
253.8
-9.541
4.464e-07
0.1176
0.1221
0.5
9
wk1
308.9
-5.75
9.814e-05
0.151
0.1553
0.95
10
mon1
35.1
-2.526
9.691e-09
0.06239
0.06715
0.05
11
mon1
58.24
-2.197
4.341e-07
0.1179
0.1224
0.5
12
mon1
70.01
-1.308
0.0002275
0.1502
0.1546
0.95
13
mon6
5.993
-0.4244
6.101e-09
0.06972
0.07444
0.05
14
mon6
9.759
-0.3667
3.105e-07
0.1206
0.1251
0.5
15
mon6
11.82
-0.2235
0.0001005
0.1544
0.1587
0.95
16
yr1
2.981
-0.2169
4.087e-09
0.06974
0.07446
0.05
17
yr1
4.985
-0.1872
2.859e-07
0.1214
0.1258
0.5
18
yr1
6.033
-0.1146
0.0001002
0.1577
0.162
0.95
22
yr5
0.9947
-0.05858
4.812e-10
0.09862
0.1032
0.05
23
yr5
1.345
-0.05089
2.455e-08
0.1425
0.1468
0.5
24
yr5
1.623
-0.03831
3.894e-06
0.1756
0.1798
0.95
25
yr7
0.9378
-0.05189
2.107e-10
0.1067
0.1113
0.05
26
yr7
1.191
-0.04502
1.102e-08
0.1494
0.1537
0.5
27
yr7
1.429
-0.03665
1.569e-06
0.1824
0.1865
0.95
31
yr8.75
0.8782
-0.04833
1.532e-10
0.1059
0.1104
0.05
32
yr8.75
1.108
-0.04217
1.219e-08
0.1485
0.1529
0.5
33
yr8.75
1.349
-0.03467
1.692e-06
0.1848
0.1889
0.95
37
yr11.6
0.8299
-0.04577
3.323e-10
0.1056
0.1102
0.05
10
type
intercept
C
p.value
adj.r.squared
r.squard
qrt
38
yr11.6
1.041
-0.03942
2.646e-08
0.142
0.1464
0.5
39
yr11.6
1.278
-0.03307
1.742e-06
0.1787
0.1828
0.95
43
yr17.5
0.8063
-0.04403
3.715e-10
0.09929
0.1039
0.05
44
yr17.5
1.033
-0.03833
3.842e-08
0.1388
0.1432
0.5
45
yr17.5
1.234
-0.0319
3.473e-06
0.1777
0.1819
0.95
55
yr35
0.8184
-0.04425
5.719e-10
0.1
0.1046
0.05
56
yr35
1.029
-0.0381
4.29e-08
0.1378
0.1422
0.5
57
yr35
1.249
-0.03161
3.368e-06
0.1736
0.1778
0.95
Global Extrapolations
temp <-
subset
(resultsTable, globalWarming %in%
c
(
1
,
2
),
c
(
'type'
,
'globalWarming'
,
'warmingDistribution'
,
'timeStep'
,
'dC_qrt05'
,
'dC_qrt50'
,
'dC_qrt95'
) )
row.names
(temp) <-
NULL
pander
(temp,
caption=
'Global soil carbon change across acclimatization assumptions. Type is analygous
to the key described above. Global warming is the average global warming applied
linearlly over 35 years. Time step is the size of the time step used in the numerical
integration. dC is the change in the soil carbon stock for the 5% quantile, 50% quantile,
and 95% quantile respectively calcuated form the parameter ranges described above.'
,
round=
c
(
1
,
1
,
1
,
3
,
0
,
0
,
0
))
Table 5: Global soil carbon change across acclimatization assump-
tions.
Type is analygous to the key described above.
Global
warming is the average global warming applied linearlly over 35
years. Time step is the size of the time step used in the numerical
integration. dC is the change in the soil carbon stock for the 5%
quantile, 50% quantile, and 95% quantile respectively calcuated
form the parameter ranges described above.
type
globalWarming
warmingDistribution
timeStep
dC_qrt05
dC_qrt50
dC_qrt95
dCperDeg
1
unif
NA
-131
-62
24
dCperDegYr
1
unif
0.019
0
0
0
dCperDegYr
1
unif
0.083
0
0
0
dCperDegYr
1
unif
0.5
0
0
0
dCperDegYr
1
unif
1
0
0
0
dCperDegYr
1
unif
10
-32
-19
-4
11
type
globalWarming
warmingDistribution
timeStep
dC_qrt05
dC_qrt50
dC_qrt95
dCperDegYr
1
unif
11.67
-44
-25
-6
dCperDegYr
1
unif
17.5
-99
-57
-13
dCperDegYr
1
unif
20
-129
-74
-17
dCperDegYr
1
unif
25
-201
-116
-27
dCperDegYr
1
unif
30
-290
-167
-39
dCperDegYr
1
unif
35
-394
-227
-53
dCperDegYr
1
unif
4
-5
-3
-1
dCperDegYr
1
unif
5
-8
-5
-1
dCperDegYr
1
unif
7
-16
-9
-2
dCperDegYr
1
unif
8
-21
-12
-3
dCperDegYr
1
unif
8.75
-25
-14
-3
mon1
1
unif
0.083
-58
-29
10
mon6
1
unif
0.5
-59
-30
10
wk1
1
unif
0.019
-59
-29
10
yr1
1
unif
1
-62
-31
10
yr11.6
1
unif
11.67
-125
-74
-19
yr17.5
1
unif
17.5
-177
-104
-27
yr35
1
unif
35
-392
-224
-48
yr5
1
unif
5
-74
-42
-3
yr7
1
unif
7
-87
-51
-12
yr8.75
1
unif
8.75
-100
-60
-14
dCperDeg
1
CESM
NA
-131
-62
24
dCperDegYr
1
CESM
0.019
0
0
0
dCperDegYr
1
CESM
0.083
0
0
0
dCperDegYr
1
CESM
0.5
0
0
0
dCperDegYr
1
CESM
1
0
0
0
dCperDegYr
1
CESM
10
-32
-19
-4
dCperDegYr
1
CESM
11.67
-44
-25
-6
dCperDegYr
1
CESM
17.5
-98
-57
-14
dCperDegYr
1
CESM
20
-127
-74
-18
dCperDegYr
1
CESM
25
-195
-112
-26
12
type
globalWarming
warmingDistribution
timeStep
dC_qrt05
dC_qrt50
dC_qrt95
dCperDegYr
1
CESM
30
-274
-157
-35
dCperDegYr
1
CESM
35
-360
-206
-43
dCperDegYr
1
CESM
4
-5
-3
-1
dCperDegYr
1
CESM
5
-8
-5
-1
dCperDegYr
1
CESM
7
-16
-9
-2
dCperDegYr
1
CESM
8
-21
-12
-3
dCperDegYr
1
CESM
8.75
-25
-14
-3
mon1
1
CESM
0.083
-57
-29
10
mon6
1
CESM
0.5
-58
-29
10
wk1
1
CESM
0.019
-58
-29
10
yr1
1
CESM
1
-61
-30
10
yr11.6
1
CESM
11.67
-121
-71
-17
yr17.5
1
CESM
17.5
-169
-98
-24
yr35
1
CESM
35
-358
-204
-37
yr5
1
CESM
5
-72
-41
-2
yr7
1
CESM
7
-85
-50
-11
yr8.75
1
CESM
8.75
-97
-58
-13
dCperDeg
2
unif
NA
-263
-125
49
dCperDegYr
2
unif
0.019
0
0
0
dCperDegYr
2
unif
0.083
0
0
0
dCperDegYr
2
unif
0.5
0
0
0
dCperDegYr
2
unif
1
-1
0
0
dCperDegYr
2
unif
10
-64
-37
-9
dCperDegYr
2
unif
11.67
-88
-50
-12
dCperDegYr
2
unif
17.5
-197
-113
-27
dCperDegYr
2
unif
20
-257
-148
-35
dCperDegYr
2
unif
25
-402
-232
-55
dCperDegYr
2
unif
30
-575
-334
-79
dCperDegYr
2
unif
35
-613
-419
-107
dCperDegYr
2
unif
4
-10
-6
-1
dCperDegYr
2
unif
5
-16
-9
-2
13
type
globalWarming
warmingDistribution
timeStep
dC_qrt05
dC_qrt50
dC_qrt95
dCperDegYr
2
unif
7
-32
-18
-4
dCperDegYr
2
unif
8
-41
-24
-6
dCperDegYr
2
unif
8.75
-49
-28
-7
mon1
2
unif
0.083
-111
-56
20
mon6
2
unif
0.5
-112
-57
19
wk1
2
unif
0.019
-111
-56
20
yr1
2
unif
1
-118
-59
19
yr11.6
2
unif
11.67
-228
-137
-35
yr17.5
2
unif
17.5
-317
-188
-49
yr35
2
unif
35
-612
-416
-95
yr5
2
unif
5
-139
-79
-5
yr7
2
unif
7
-162
-96
-22
yr8.75
2
unif
8.75
-185
-113
-27
dCperDeg
2
CESM
NA
-255
-120
49
dCperDegYr
2
CESM
0.019
0
0
0
dCperDegYr
2
CESM
0.083
0
0
0
dCperDegYr
2
CESM
0.5
0
0
0
dCperDegYr
2
CESM
1
-1
0
0
dCperDegYr
2
CESM
10
-65
-37
-9
dCperDegYr
2
CESM
11.67
-88
-51
-12
dCperDegYr
2
CESM
17.5
-191
-110
-26
dCperDegYr
2
CESM
20
-246
-141
-32
dCperDegYr
2
CESM
25
-366
-210
-43
dCperDegYr
2
CESM
30
-470
-277
-50
dCperDegYr
2
CESM
35
-525
-313
-45
dCperDegYr
2
CESM
4
-10
-6
-1
dCperDegYr
2
CESM
5
-16
-9
-2
dCperDegYr
2
CESM
7
-32
-18
-4
dCperDegYr
2
CESM
8
-41
-24
-6
dCperDegYr
2
CESM
8.75
-50
-29
-7
mon1
2
CESM
0.083
-107
-54
20
mon6
2
CESM
0.5
-109
-55
19
14
type
globalWarming
warmingDistribution
timeStep
dC_qrt05
dC_qrt50
dC_qrt95
wk1
2
CESM
0.019
-108
-54
20
yr1
2
CESM
1
-114
-57
20
yr11.6
2
CESM
11.67
-214
-127
-30
yr17.5
2
CESM
17.5
-282
-165
-37
yr35
2
CESM
35
-524
-310
-37
yr5
2
CESM
5
-133
-76
-4
yr7
2
CESM
7
-154
-91
-20
yr8.75
2
CESM
8.75
-175
-106
-23
Figures
Change in carbon per degree year with bootstrap
Fig1.theme <-
theme
(
axis.text.x=
element_text
(
size=
18
,
angle=
0
,
colour=
"black"
),
axis.text.y=
element_text
(
size=
18
,
angle=
0
,
colour=
"black"
),
axis.title=
element_text
(
size=
20
),
legend.text=
element_text
(
size=
12
),
axis.line.x=
element_line
(
color=
"black"
),
legend.position =
"top"
,
legend.key =
element_rect
(
fill=
"grey95"
,
size=
0
,
color=
"grey95"
),
legend.key.size =
unit
(
0.1
,
"cm"
),
legend.title =
element_text
(
size=
12
,
face=
"bold"
),
legend.background =
element_rect
(
fill=
"grey95"
,
color=
"black"
),
axis.line =
element_line
(
colour =
"black"
),
panel.grid.major =
element_blank
(),
panel.grid.minor =
element_blank
(),
strip.background =
element_rect
(
colour =
"black"
,
size =
0.5
),
panel.background =
element_rect
(
colour=
"black"
,
fill=
"white"
),
panel.border =
element_blank
(),
axis.ticks =
element_line
(
colour=
"black"
),
legend.box =
"horizontal"
,
axis.title.y=
element_text
(
vjust=
1.9
),
axis.title.x=
element_text
(
vjust=
-
0.4
))+
theme
(
legend.justification=
c
(
1
,
1
),
legend.position=
c
(
1
,
1
))
# set color gradient
ramp <-
colorRamp
(
c
(
"black"
,
"darkred"
,
"red"
))
use.col.points <-
c
(
rgb
(
ramp
(
seq
(
0
,
1
,
length =
500
)),
max =
255
))
# generate figure 1
Figure1 <-
ggplot
(data.study,
aes
(
x=
C.control,
y=
dC.perDegYr)) +
geom_abline
(
aes
(
intercept=
parBins$intercept,
slope=
parBins$slope),
colour=
"grey"
,
data=
parBins) +
geom_abline
(
intercept=
0
,
slope=
0
,
color=
"black"
) +
geom_errorbar
(
aes
(
ymax=
dC.perDegYr + dC.perDegYr.se,
ymin=
dC.perDegYr - dC.perDegYr.se),
width=
0
,
color=
"grey80"
,
size=
0.5
) +
geom_point
(
alpha=
1
,
aes
(
color=
Tdelta,
size=
Years)) +
15
scale_color_gradientn
(
limits=
range
(
c
(
0
,data.study$Tdelta)),
colours=
use.col.points,
space=
"Lab"
,
labels=
c
(
"<1"
,
1
,
2
,
3
,
4
,
5
))+
scale_size
(
range=
c
(
3
,
10
)) +
xlab
(
expression
(
atop
(
"Standing Carbon stock"
,
"(kg m"
^-
3
*
")"
))) +
ylab
(
expression
(
atop
(
"Annual change in Carbon stock per"
*
~
degree* C,
"(kg m"
^-
3
~degree*C^-
1
~year^-
1
*
")"
))) +
scale_x_continuous
(
limits=
c
(
0
,
0.130
*
1e3
),
expand =
c
(
0
,
0
)) +
scale_y_continuous
(
limits=
c
(-
6
,
6.25
),
expand =
c
(
0
,
0
)) +
geom_hline
(
yintercept=
6.25
) +
geom_vline
(
xintercept=
130
) +
guides
(
color =
guide_legend
(
by.row=
T,
nrow =
1
,
label.position =
"bottom"
,
label.hjust=
0.5
,
title.position=
"top"
,
title=
expression
(
"Warming ("
*degree*C*
")"
),
override.aes =
list
(
size =
5
),
legend.box =
"vertical"
))+
guides
(
size =
guide_legend
(
nrow =
1
,
label.position =
"bottom"
,
label.hjust=
0.5
,
title.position=
"top"
,
title=
expression
(
"Duration (years)"
),
legend.box =
"vertical"
)) +
Fig1.theme
(Figure1)
16
−6
−3
0
3
6
0
25
50
75
100
125
Standing Carbon stock
(kg m
−
3
)
Ann
ual change in Carbon stock per
°
C
(kg m
−
3
°
C
−
1
y
e
a
r
−
1
)
Duration (years)
5
10
15
20
25
Warming (
°
C)
<1 1 2 3 4 5
ggsave
(
plot =
Figure1,
filename=
'../figs/Figure01.pdf'
,
width=
7.5
,
height=
7.5
)
Model-data plot for interactive statisitcal model (Figure 2a)
(
summary
(lm.list$Cw.study))
##
## Call:
## lm(formula = C.warmed ~ C.control * degYr, data = data.study)
##
17
## Residuals:
##
Min
1Q
Median
3Q
Max
## -10.3269 -2.1202 -0.5347
0.8648 14.0377
##
## Coefficients:
##
Estimate Std. Error t value Pr(>|t|)
## (Intercept)
1.61837
1.56580
1.034
0.307
## C.control
0.96044
0.03789 25.350 < 2e-16 ***
## degYr
0.30065
0.12352
2.434
0.019 *
## C.control:degYr -0.01662
0.00321 -5.176 5.11e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.924 on 45 degrees of freedom
## Multiple R-squared: 0.9563, Adjusted R-squared: 0.9534
## F-statistic: 328.4 on 3 and 45 DF, p-value: < 2.2e-16
ramp <-
colorRamp
(
c
(
"white"
,
"blue"
,
"gold"
,
"orange"
,
"red"
))
use.fill <-
rgb
(
ramp
(
seq
(
0
,
1
,
length =
255
)),
max =
255
)
fig2aTheme <-
theme
(
axis.text.x=
element_text
(
size=
18
,
angle=
0
,
colour=
"black"
),
axis.text.y=
element_text
(
size=
18
,
angle=
0
,
colour=
"black"
),
axis.title=
element_text
(
size=
20
),
axis.line =
element_line
(
colour =
"black"
),
panel.grid.major =
element_blank
(),
panel.grid.minor =
element_blank
(),
strip.background =
element_rect
(
colour =
"black"
,
size =
0.5
),
panel.background =
element_rect
(
colour=
"black"
,
fill=
"white"
),
panel.border =
element_blank
(),
axis.ticks =
element_line
(
colour=
"black"
),
legend.box =
"vertical"
,
legend.justification=
c
(
0.9
,
1
),
legend.position=
c
(
0.3
,
1
),
legend.key =
element_rect
(
fill=
"grey95"
,
size=
0
,
color=
"grey95"
),
legend.key.size =
unit
(
0.5
,
"cm"
),
legend.title =
element_text
(
size=
12
,
face=
"bold"
),
legend.background =
element_rect
(
fill=
"grey95"
,
color=
"black"
))
figure2a <-
ggplot
(modelData.df,
aes
(
x=
rnd.data,
y=
rnd.model)) +
stat_density2d
(
geom =
"raster"
,
aes
(
fill =
..density..),
contour =
FALSE
,
interpolate =
TRUE
,
n=
200
,
show.legend=
T) +
geom_point
(
size=
0.15
,
alpha=
0.2
,
col=
"grey"
) +
geom_point
(
data=
summaryMD.df,
aes
(
x=
data.mean,
y=
model.mean),
color=
"black"
,
size=
2
) +
scale_fill_gradientn
(
colours =
use.fill) +
geom_abline
(
intercept=
0
,
slope=
1
,
size=
1
)+
scale_x_log10
(
limits=
c
(
10
,
0.12
*
1e3
),
expand =
c
(
0
,
0
),
breaks=
c
(
1
:
10
)*
10
,
labels=
c
(
10
,
""
,
30
,
""
,
50
,
""
,
70
,
""
,
""
,
100
)) +
scale_y_log10
(
limits=
c
(
10
,
0.12
*
1e3
),
expand =
c
(
0
,
0
),
breaks=
c
(
1
:
10
)*
10
,
labels=
c
(
10
,
""
,
30
,
""
,
50
,
""
,
70
,
""
,
""
,
100
)) +
xlab
(
bquote
(
"Observed C stock (kg "
*m^-
3
*
")"
)) +
ylab
(
bquote
(
"Predicted C stock (kg "
*m^-
3
*
")"
)) +
guides
(
fill =
guide_colourbar
(
label.position =
"bottom"
,
label.hjust=
0.5
,
title.position=
"top"
,
title=
expression
(
"Point density"
),
direction =
"horizontal"
)) +
fig2aTheme
18
(figure2a)
10
30
50
70
100
10
30
50
70
100
Observed C stock (kg m
−
3
)
Predicted C stock (kg
m
−
3
)
2.5 5.0 7.5
Point density
ggsave
(
plot=
figure2a,
file=
'../figs/Figure02a.pdf'
,
height=
7
,
width=
7
)
Boot strap slope comparison (Figure 2b)
ggplot
(selectSize.sample,
aes
(
x=
dim
(data.sample)[
1
]-sampleSize,
y=
C.control)) +
geom_jitter
(
alpha=
0.3
,
color=
"grey"
,
height=
0
,
size=
0.75
) +
scale_y_continuous
(
limits =
c
(-
0.05
,
0.025
)) +
geom_boxplot
(
aes
(
group =
cut_width
(
dim
(data.sample)[
1
]-sampleSize,
5
)),
19
outlier.size=
0
,
outlier.shape =
NA
,
fill=
"gold"
,
alpha=
0.5
,
color=
"black"
) +
geom_abline
(
intercept=
0
,
slope=
0
,
color=
"red"
) +
xlab
(
paste
(
"Samples removed from "
,
dim
(data.sample)[
1
])) +
ylab
(
"Slope"
)
−0.050
−0.025
0.000
0.025
0
50
100
150
200
Samples removed from 229
Slope
fig2b.pl <-
ggplot
(selectSize.study,
aes
(
x=
dim
(data.study)[
1
]-sampleSize,
y=
C.control)) +
geom_jitter
(
alpha=
0.3
,
color=
"grey"
,
height=
0
,
size=
0.75
) +
scale_y_continuous
(
limits =
c
(-
0.05
,
0.025
)) +
geom_boxplot
(
aes
(
group =
cut_width
(
dim
(data.study)[
1
]-sampleSize,
1
)),
outlier.size=
0
,
outlier.shape =
NA
,
fill=
"gold"
,
alpha=
0.5
,
color=
"black"
) +
geom_abline
(
intercept=
0
,
slope=
0
,
color=
"red"
) +
xlab
(
paste
(
"Studies removed from "
,
dim
(data.study)[
1
])) +
ylab
(
"Slope"
)
20
fig2bTheme <-
theme
(
axis.text.x=
element_text
(
size=
20
,
angle=
0
,
colour=
"black"
),
axis.text.y=
element_text
(
size=
20
,
angle=
0
,
colour=
"black"
),
axis.title=
element_text
(
size=
28
),
axis.line =
element_line
(
colour =
"black"
),
panel.grid.major =
element_blank
(),
panel.grid.minor =
element_blank
(),
strip.background =
element_rect
(
colour =
"black"
,
size =
0.5
),
panel.background =
element_rect
(
colour=
"black"
,
fill=
"white"
),
panel.border =
element_blank
(),
axis.ticks =
element_line
(
colour=
"black"
))
(fig2b.pl + fig2bTheme)
−0.050
−0.025
0.000
0.025
0
10
20
30
40
Studies removed from 49
Slope
21
ggsave
(
'../figs/Figure02b.pdf'
, fig2b.pl + fig2bTheme,
width=
7
,
height=
7
)
22
Global carbon vulnerability map (Figure 3a)
See Section “Global carbon loss map code”
23
Acclimatization assumptions affects soil carbon losses (Figure 3b)
degYrStepIntSimple.pl <-
ggplot
(
subset
(resultsTable, !
grepl
(
'dCperDeg'
, type) &
warmingDistribution ==
'CESM'
&
globalWarming %in%
c
(
1
,
2
))) +
geom_hline
(
yintercept=
0
,
col=
"grey"
,
size=
1
) +
geom_line
(
aes
(
x=
timeStep,
y=
dC_qrt50,
group=
warming,
fill=
globalWarming)) +
geom_point
(
aes
(
x=
timeStep,
y=
dC_qrt50,
fill=
globalWarming),
size=
4
,
shape=
21
) +
geom_ribbon
(
aes
(
x=
timeStep,
y=
dC_qrt50,
ymin=
dC_qrt05,
ymax=
dC_qrt95,
fill=
globalWarming,
guide=
NA
),
alpha=
0.2
) +
scale_x_continuous
(
limits=
c
(
0
,
35
),
expand=
c
(
0
,
0
))+
scale_fill_manual
(
values=
c
(
'#FF9900'
,
'#FF3300'
),
guide =
guide_legend
(
direction =
"horizontal"
,
title =
expression
(
"Warming"
*
~
degree*C))) +
labs
(
title=
''
,
x=
'Acclimation time'
,
y=
"Extrapolated Carbon loss by 2050 (Pg)"
) +
theme_bw
() +
theme
(
axis.title=
element_text
(
size=
16
),
axis.text=
element_text
(
size=
14
),
legend.position=
c
(
0.2
,
0.1
),
panel.grid.major=
element_line
(
color=
NA
),
panel.grid.minor=
element_line
(
color=
NA
),
panel.border=
element_rect
(
color=
"black"
,
fill=
NA
,
size=
1
),
axis.ticks=
element_line
(
size=
0.25
),
legend.key=
element_rect
(
color=
"black"
,
fill=
NA
,
size=
0.25
))
(degYrStepIntSimple.pl)
−400
−200
0
0
10
20
30
Acclimation time
Extr
apolated Carbon loss b
y 2050 (Pg)
Warming
°
C
1
2
24
ggsave
(degYrStepIntSimple.pl,
filename=
'../figs/Figure03b.pdf'
,
height=
4.5
,
width=
6.5
)
Data summary and basic visualizations
0
25
50
75
100
125
0
50
100
150
Control [kg−C m^−3]
W
ar
med [kg−C m^−3]
SOC samples by random within study sample pairs and study mean/sd
## No id variables; using all as measure variables
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
25
Tdelta
Years
C.warmed
C.control
degYr
MAP
MAT
pH
perClay
0
10
20
30
0
10
20
30
40
0
10
20
30
0
10
20
30
40
0
20
40
60
0
10
20
0
10
20
30
0
10
20
30
40
0
10
20
0
2
4
0
10
20
0
50
100
0
50
100
150
0
20
40
0
500
1000
−10
0
10
5
6
7
8
10
20
value
count
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
26
Tdelta
Years
C.warmed
C.control
degYr
MAT
MAP
pH
perClay
0
10
20
30
40
0
10
20
30
0
5
10
15
20
0
5
10
15
20
0
10
20
30
40
0
10
20
30
0
10
20
0
10
20
30
0
10
20
−1
0
1
2
3
−1
0
1
2
3
−2
0
2
−2
0
2
4
−1
0
1
2
3
−1
0
1
2
0
1
2
3
0
1
2
3
4
−1
0
1
2
3
value
count
Table 6: Description of study sites including mean annual tempera-
ture (MAT), mean annual precipitation (MAP), soil pH, and soil
percent clay (perClay). For standardization purposes, all climate
data were collected from Bioclim and all soil data were collected
from SoilGrids.
Study Description
MAP
MAT
pH
perClay
Delta Junction, AK, USA
298
-3.2
6.6
12
Ford Forest, MI, USA
824
4.4
5.3
8
Ford Forest, MI, USA [precipitation]
824
4.4
5.3
8
FRAGILE Experiment, Svalbard,
Norway [grazed]
226
-5.7
6
10
FRAGILE Experiment, Svalbard,
Norway
226
-5.7
6
10
INCREASE Clocaenog, Wales, UK
1215
7.1
5.2
11
Gucheng, Hebei, China
543
12.7
7
17
Soil Warming x Nitrogen Addition
Study, NH, USA
1142
6.8
4.9
7
Rocky Mountain Biological Laboratory,
CO, USA
519
0.5
5.8
14
INCREASE Kiskunsag, Hungary
536
10.9
7.1
18
Krycklan, Sweden
603
8.2
5.5
8
INCREASE Brandbjerg, Demark
609
1
4.6
5
Jasper Ridge, CA, USA
635
13.7
6.2
18
Jasper Ridge, CA, USA [CO2]
635
13.7
6.2
18
Oak Ridge, Tennessee, USA
1347
13.9
5.6
27
Oak Ridge, Tennessee, USA [CO2]
1347
13.9
5.6
27
27
Study Description
MAP
MAT
pH
perClay
Oklahoma Tall Grass Prairie, OK, USA
[clipped grass]
906
16.3
6.7
24
Oklahoma Tall Grass Prairie, OK, USA
906
16.3
6.7
24
Research Station of Songnen Grassland
Ecosystem, China
436
5.2
7.9
17
Duke Forest, NC, USA [3 degrees]
1161
14.4
4.9
22
Duke Forest, NC, USA [5 degrees]
1161
14.4
4.9
22
Konza Prarie, KS, USA
872
12
6.4
24
Whitehall, GA, USA [3 degrees]
1230
16.5
4.6
21
Whitehall, GA, USA [5 degrees]
1230
16.5
4.6
21
Dry Heath Env. Control, Sweden
390
-0.1
5.1
6
Prairie Heating and CO2 Enrichment,
CO, USA
384
7
7.4
23
INCREASE Garraf, Spain
632
15.5
6.8
25
HOCC-Experiment, Germany
729
8.9
6.3
20
HOCC-Experiment, Germany
[precipitation 1]
729
8.9
6.3
20
HOCC-Experiment, Germany
[precipitation 2]
729
8.9
6.3
20
HOCC-Experiment, Germany
[precipitation 3]
729
8.9
6.3
20
HOCC-Experiment, Germany
[precipitation 4]
729
8.9
6.3
20
BioCON, MN, USA [elevated C02,
ambient N, negative H20]
761
3.8
5.5
11
BioCON, MN, USA [elevated C02,
elevated N, negative H20]
761
3.8
5.5
11
BioCON, MN, USA [elevated C02,
elevated N, ambient H20]
761
3.8
5.5
11
BioCON, MN, USA [ambient C02,
ambient N, ambient H20]
761
3.8
5.5
11
BioCON, MN, USA [ambient C02,
elevated N, negative H20]
761
3.8
5.5
11
BioCON, MN, USA [ambient C02,
elevated N, ambient H20]
761
3.8
5.5
11
Heat of Prarie Species 1, OR, USA
1194
11.4
5.3
19
Heat of Prarie Species 1, OR, USA
[precipitation]
1194
11.4
5.3
19
Heat of Prarie Species 2, OR, USA
[precipitation]
1364
11.4
5.5
15
Heat of Prarie Species 3, WA, USA
[precipitation]
1199
10.1
5.3
18
Heat of Prarie Species 2, OR, USA
1364
11.4
5.5
15
Heat of Prarie Species 3, WA, USA
1199
10.1
5.3
18
INCREASE Mols, Denmark
592
7.4
5.3
6
Arctic LTER, AK, USA
237
-11.2
6
15
Hubbard Brook, NH, USA
1082
5.4
5
9
ITEX, Greenland
112
-11.3
NA
NA
ITEX, Greenland [vegetated]
112
-11.3
NA
NA
28
Table 7: Mean soil carbon [kg-C mˆ-3] values across control study
site with number of samples in each study for the control plots.
Study Description
count.control
C.control
C.sd.control
Delta Junction, AK, USA
5
32.05
NA
Ford Forest, MI, USA
3
36.19
NA
Ford Forest, MI, USA [precipitation]
3
50.72
NA
FRAGILE Experiment, Svalbard,
Norway [grazed]
5
58.64
NA
FRAGILE Experiment, Svalbard,
Norway
5
73.87
NA
INCREASE Clocaenog, Wales, UK
3
119.9
NA
Gucheng, Hebei, China
3
101.8
NA
Soil Warming x Nitrogen Addition Study,
NH, USA
6
119.6
NA
Rocky Mountain Biological Laboratory,
CO, USA
5
17.02
NA
INCREASE Kiskunsag, Hungary
3
5.32
NA
Krycklan, Sweden
6
10.13
NA
INCREASE Brandbjerg, Demark
9
44.85
NA
Jasper Ridge, CA, USA
4
14.04
NA
Jasper Ridge, CA, USA [CO2]
4
15.53
NA
Oak Ridge, Tennessee, USA
3
27.96
NA
Oak Ridge, Tennessee, USA [CO2]
3
27.32
NA
Oklahoma Tall Grass Prairie, OK, USA
[clipped grass]
6
27.42
NA
Oklahoma Tall Grass Prairie, OK, USA
6
25.27
NA
Research Station of Songnen Grassland
Ecosystem, China
6
20.29
NA
Duke Forest, NC, USA [3 degrees]
3
36.89
NA
Duke Forest, NC, USA [5 degrees]
3
36.89
NA
Konza Prarie, KS, USA
12
47.36
NA
Whitehall, GA, USA [3 degrees]
6
12.44
NA
Whitehall, GA, USA [5 degrees]
5
13.16
NA
Dry Heath Env. Control, Sweden
6
51.25
NA
Prairie Heating and CO2 Enrichment,
CO, USA
5
17.51
NA
INCREASE Garraf, Spain
3
24.42
NA
HOCC-Experiment, Germany
4
13.84
NA
HOCC-Experiment, Germany
[precipitation 1]
4
13.26
NA
HOCC-Experiment, Germany
[precipitation 2]
4
11.63
NA
HOCC-Experiment, Germany
[precipitation 3]
4
14.55
NA
HOCC-Experiment, Germany
[precipitation 4]
4
13.95
NA
BioCON, MN, USA [elevated C02,
ambient N, negative H20]
3
13.59
NA
BioCON, MN, USA [elevated C02,
elevated N, negative H20]
3
19.6
NA
BioCON, MN, USA [elevated C02,
elevated N, ambient H20]
3
14.91
NA
29
Study Description
count.control
C.control
C.sd.control
BioCON, MN, USA [ambient C02,
ambient N, ambient H20]
3
14.13
NA
BioCON, MN, USA [ambient C02,
elevated N, negative H20]
3
14.8
NA
BioCON, MN, USA [ambient C02,
elevated N, ambient H20]
3
13.54
NA
Heat of Prarie Species 1, OR, USA
5
42.6
NA
Heat of Prarie Species 1, OR, USA
[precipitation]
5
42.66
NA
Heat of Prarie Species 2, OR, USA
[precipitation]
5
31.82
NA
Heat of Prarie Species 3, WA, USA
[precipitation]
5
36.38
NA
Heat of Prarie Species 2, OR, USA
5
35.57
NA
Heat of Prarie Species 3, WA, USA
5
41.31
NA
INCREASE Mols, Denmark
3
47.64
NA
Arctic LTER, AK, USA
16
24.64
NA
Hubbard Brook, NH, USA
8
76.38
NA
ITEX, Greenland
1
2.071
NA
ITEX, Greenland [vegetated]
1
21.36
NA
Table 8: Mean soil carbon [kg-C mˆ-3] values across warmed study
site with number of samples in each study for the warmed plots,
their warming treatment [C], and length of treatment [years].
Study Description
Tdelta
Years
count.warmed
C.warmed
C.sd.warmed
Delta Junction, AK, USA
0.5
10.25
5
43.48
18.56
Ford Forest, MI, USA
4.581
5
3
30.27
6.201
Ford Forest, MI, USA
[precipitation]
4.581
5
3
27.59
5.819
FRAGILE Experiment,
Svalbard, Norway [grazed]
1
4
5
55.28
5.773
FRAGILE Experiment,
Svalbard, Norway
1
4
5
67.37
21.31
INCREASE Clocaenog, Wales,
UK
0.198
15
3
110.9
14.04
Gucheng, Hebei, China
2.34
0.6667
3
99.14
3.645
Soil Warming x Nitrogen
Addition Study, NH, USA
3.989
5
5
77.85
14.91
Rocky Mountain Biological
Laboratory, CO, USA
2
25
5
16.74
3.056
INCREASE Kiskunsag,
Hungary
0.44
14
3
5.227
1.773
Krycklan, Sweden
0.9
6
6
8.075
1.399
INCREASE Brandbjerg,
Demark
1
2
9
43.89
4.177
Jasper Ridge, CA, USA
1.773
2
4
13.09
2.205
Jasper Ridge, CA, USA [CO2]
1.773
2
4
15.65
3.289
Oak Ridge, Tennessee, USA
2.6
5
3
29.1
3.886
30
Study Description
Tdelta
Years
count.warmed
C.warmed
C.sd.warmed
Oak Ridge, Tennessee, USA
[CO2]
2.6
5
3
30.94
2.625
Oklahoma Tall Grass Prairie,
OK, USA [clipped grass]
1.479
10
6
21.78
11.09
Oklahoma Tall Grass Prairie,
OK, USA
1.479
10
6
23.69
12.93
Research Station of Songnen
Grassland Ecosystem, China
1.75
3
6
19.47
0.3409
Duke Forest, NC, USA [3
degrees]
3
4
3
47.34
18.54
Duke Forest, NC, USA [5
degrees]
5
4
3
42.64
3.876
Konza Prarie, KS, USA
1
4
12
47.61
6.327
Whitehall, GA, USA [3 degrees]
2.096
3
6
12.87
8.818
Whitehall, GA, USA [5 degrees]
4.27
4
6
10.05
4.062
Dry Heath Env. Control,
Sweden
1.5
14
6
50.53
4.366
Prairie Heating and CO2
Enrichment, CO, USA
2.8
6
5
20.03
2.494
INCREASE Garraf, Spain
0.94
4.5
3
24.81
8.746
HOCC-Experiment, Germany
1.954
3
4
15.47
2.457
HOCC-Experiment, Germany
[precipitation 1]
1.954
3
4
15.25
1.427
HOCC-Experiment, Germany
[precipitation 2]
1.954
3
4
14.28
2.466
HOCC-Experiment, Germany
[precipitation 3]
1.954
3
4
16.14
2.043
HOCC-Experiment, Germany
[precipitation 4]
1.954
3
4
14.81
2.861
BioCON, MN, USA [elevated
C02, ambient N, negative H20]
2.5
0.42
3
13.94
2.312
BioCON, MN, USA [elevated
C02, elevated N, negative H20]
2.5
0.42
3
20.74
11.53
BioCON, MN, USA [elevated
C02, elevated N, ambient H20]
2.5
0.42
3
13.82
0.1774
BioCON, MN, USA [ambient
C02, ambient N, ambient H20]
2.5
0.42
3
14.15
4.641
BioCON, MN, USA [ambient
C02, elevated N, negative H20]
2.5
0.42
3
15.35
4.115
BioCON, MN, USA [ambient
C02, elevated N, ambient H20]
2.5
0.42
3
13.9
2.389
Heat of Prarie Species 1, OR,
USA
2.75
2.2
5
38.6
4.242
Heat of Prarie Species 1, OR,
USA [precipitation]
2.75
2.2
5
41.04
4.821
Heat of Prarie Species 2, OR,
USA [precipitation]
2.98
2.16
5
32.97
2.909
Heat of Prarie Species 3, WA,
USA [precipitation]
2.94
1.75
5
40.8
6.846
Heat of Prarie Species 2, OR,
USA
2.98
2.16
5
34.42
8.201
31
Study Description
Tdelta
Years
count.warmed
C.warmed
C.sd.warmed
Heat of Prarie Species 3, WA,
USA
2.94
1.75
5
39.01
7.942
INCREASE Mols, Denmark
0.9
4
3
38.8
8.516
Arctic LTER, AK, USA
0.53
20
16
21.14
5.913
Hubbard Brook, NH, USA
4.83
0.8333
8
63.48
12.36
ITEX, Greenland
2
9
1
1.635
NA
ITEX, Greenland [vegetated]
2
9
1
20.02
NA
Table 9: Biome of study sites. For standardization purposes, biome
allocations were generated using the UNEP biomes map.
Study Description
Biome
Delta Junction, AK, USA
Boreal Forests/Taiga
Ford Forest, MI, USA
Temperate Broadleaf and Mixed Forests
Ford Forest, MI, USA [precipitation]
Temperate Broadleaf and Mixed Forests
FRAGILE Experiment, Svalbard, Norway
[grazed]
Tundra
FRAGILE Experiment, Svalbard, Norway
Tundra
INCREASE Clocaenog, Wales, UK
Temperate Broadleaf and Mixed Forests
Gucheng, Hebei, China
Temperate Broadleaf and Mixed Forests
Soil Warming x Nitrogen Addition Study,
NH, USA
Temperate Broadleaf and Mixed Forests
Rocky Mountain Biological Laboratory, CO,
USA
Temperate Conifer Forests
INCREASE Kiskunsag, Hungary
Temperate Broadleaf and Mixed Forests
Krycklan, Sweden
Temperate Broadleaf and Mixed Forests
INCREASE Brandbjerg, Demark
Boreal Forests/Taiga
Jasper Ridge, CA, USA
Mediterranean Forests, Woodlands and
Scrub
Jasper Ridge, CA, USA [CO2]
Mediterranean Forests, Woodlands and
Scrub
Oak Ridge, Tennessee, USA
Temperate Broadleaf and Mixed Forests
Oak Ridge, Tennessee, USA [CO2]
Temperate Broadleaf and Mixed Forests
Oklahoma Tall Grass Prairie, OK, USA
[clipped grass]
Temperate Grasslands, Savannas and
Shrublands
Oklahoma Tall Grass Prairie, OK, USA
Temperate Grasslands, Savannas and
Shrublands
Research Station of Songnen Grassland
Ecosystem, China
Temperate Grasslands, Savannas and
Shrublands
Duke Forest, NC, USA [3 degrees]
Temperate Broadleaf and Mixed Forests
Duke Forest, NC, USA [5 degrees]
Temperate Broadleaf and Mixed Forests
Konza Prarie, KS, USA
Temperate Grasslands, Savannas and
Shrublands
Whitehall, GA, USA [3 degrees]
Temperate Broadleaf and Mixed Forests
Whitehall, GA, USA [5 degrees]
Temperate Broadleaf and Mixed Forests
Dry Heath Env. Control, Sweden
Tundra
Prairie Heating and CO2 Enrichment, CO,
USA
Temperate Grasslands, Savannas and
Shrublands
INCREASE Garraf, Spain
Mediterranean Forests, Woodlands and
Scrub
32
Study Description
Biome
HOCC-Experiment, Germany
Temperate Broadleaf and Mixed Forests
HOCC-Experiment, Germany [precipitation
1]
Temperate Broadleaf and Mixed Forests
HOCC-Experiment, Germany [precipitation
2]
Temperate Broadleaf and Mixed Forests
HOCC-Experiment, Germany [precipitation
3]
Temperate Broadleaf and Mixed Forests
HOCC-Experiment, Germany [precipitation
4]
Temperate Broadleaf and Mixed Forests
BioCON, MN, USA [elevated C02, ambient
N, negative H20]
Temperate Broadleaf and Mixed Forests
BioCON, MN, USA [elevated C02, elevated
N, negative H20]
Temperate Broadleaf and Mixed Forests
BioCON, MN, USA [elevated C02, elevated
N, ambient H20]
Temperate Broadleaf and Mixed Forests
BioCON, MN, USA [ambient C02, ambient
N, ambient H20]
Temperate Broadleaf and Mixed Forests
BioCON, MN, USA [ambient C02, elevated
N, negative H20]
Temperate Broadleaf and Mixed Forests
BioCON, MN, USA [ambient C02, elevated
N, ambient H20]
Temperate Broadleaf and Mixed Forests
Heat of Prarie Species 1, OR, USA
Temperate Broadleaf and Mixed Forests
Heat of Prarie Species 1, OR, USA
[precipitation]
Temperate Broadleaf and Mixed Forests
Heat of Prarie Species 2, OR, USA
[precipitation]
Temperate Conifer Forests
Heat of Prarie Species 3, WA, USA
[precipitation]
Temperate Conifer Forests
Heat of Prarie Species 2, OR, USA
Temperate Conifer Forests
Heat of Prarie Species 3, WA, USA
Temperate Conifer Forests
INCREASE Mols, Denmark
Temperate Broadleaf and Mixed Forests
Arctic LTER, AK, USA
Tundra
Hubbard Brook, NH, USA
Temperate Broadleaf and Mixed Forests
ITEX, Greenland
Tundra
ITEX, Greenland [vegetated]
Tundra
Helper functions
Bootstrap function
(bootStrap.fn)
## function (data, myFormula, nRuns, sampleSize, lm.weights = NULL,
##
shuffleFn = NULL, numCoef, verbose = FALSE)
## {
##
sampleIndex <- matrix(NA, nrow = nRuns, ncol = sampleSize)
##
lmStats <- matrix(NA, nrow = nRuns, ncol = numCoef + 3)
##
for (ii in 1:nRuns) {
##
if (verbose)
33
##
cat(ii, "\n")
##
if (!is.null(shuffleFn))
##
data <- shuffleFn(data)
##
if (verbose)
##
print(head(data))
##
sampleIndex[ii, ] <- sample(1:(dim(data)[1]), size = sampleSize)
##
temp.lm <- lm(myFormula, data[sampleIndex[ii, ], ])
##
fstatArr <- summary(temp.lm)$fstatistic
##
if (verbose)
##
print(summary(temp.lm))
##
lmStats[ii, ] <- c(temp.lm$coefficients, pf(fstatArr[1],
##
fstatArr[2], fstatArr[3], lower.tail = FALSE), adj.r.squared = summary(temp.lm)$adj.r.squared,
##
r.squared = summary(temp.lm)$r.squared)
##
}
##
lmStats <- as.data.frame(lmStats)
##
names(lmStats) <- c(names(temp.lm$coefficients), "p.value",
##
"adj.r.squared", "r.squard")
##
if (verbose)
##
cat("\n")
##
if (verbose)
##
print(lmStats)
##
return(lmStats)
## }
Read data
(readSamples)
## function (useMeanBD = TRUE, readControlMeans = FALSE)
## {
##
data <- read.xlsx2("../data/Soil Data Compiled_January 26.xlsx",
##
sheetIndex = 1, colIndex = c(1, 7, 9, 10, 11, 12))
##
names(data) <- c("Study", "Treatment", "Tdelta", "Years",
##
"perC", "bulk_density")
##
data$Tdelta <- round(data$Tdelta, 3)
##
data$perC <- round(data$perC, 3)
##
data$bulk_density <- round(data$bulk_density, 3)
##
if (useMeanBD) {
##
study.bd <- ddply(data[, c("Study", "bulk_density")],
##
.(Study), summarize, bulk_density.sd = sd(bulk_density),
##
bulk_density = mean(bulk_density))
##
data$bulk_density.sd <- NULL
##
data$bulk_density <- NULL
##
data <- merge(study.bd, data)
##
}
##
data$C <- data$perC/100 * data$bulk_density
##
data.sample <- ddply(data, c("Study", "Tdelta", "Years"),
##
function(xx) {
##
warmed <- xx$C[xx$Treatment == "W"]
##
control <- xx$C[xx$Treatment == "C"]
##
if (readControlMeans) {
##
return(data.frame(C.warmed = warmed, C.control = mean(control)))
34
##
}
##
else {
##
mismatch <- length(warmed) - length(control)
##
if (mismatch > 0) {
##
control <- c(control, rep(NA, mismatch))
##
}
##
else {
##
warmed <- c(warmed, rep(NA, abs(mismatch)))
##
}
##
return(data.frame(C.warmed = warmed, C.control = sample(control)))
##
}
##
})
##
data.sample$degYr <- data.sample$Years * data.sample$Tdelta
##
return(data.sample)
## }
Construct study means and standard deviations
(readStudyMeans)
## function (includeBD.sd = FALSE, includeControl.sd = FALSE)
## {
##
data <- read.xlsx2("../data/Soil Data Compiled_January 26.xlsx",
##
sheetIndex = 1, colIndex = c(1, 7, 9, 10, 11, 12))
##
names(data) <- c("Study", "Treatment", "Tdelta", "Years",
##
"perC", "bulk_density")
##
data$Tdelta <- round(as.numeric(data$Tdelta), 3)
##
data$perC <- as.numeric(data$perC)
##
data$bulk_density <- as.numeric(data$bulk_density)
##
data.study <- ddply(data, .(Study, Tdelta, Years, Treatment),
##
summarize, bulk_density.sd = sd(bulk_density), bulk_density = mean(bulk_density),
##
perC.sd = sd(perC), perC = mean(perC), count = length(Treatment))
##
if (includeBD.sd) {
##
data.study$C.sd <- sqrt(data.study$perC/100^2 * data.study$bulk_density.sd^2 +
##
data.study$perC.sd/100^2 * data.study$bulk_density^2)
##
}
##
else {
##
study.bd <- ddply(data[, c("Study", "bulk_density")],
##
.(Study), summarize, bulk_density = mean(bulk_density))
##
data.study$bulk_density.sd <- NULL
##
data.study$bulk_density <- NULL
##
data.study <- merge(study.bd, data.study)
##
data.study$C.sd <- sqrt((data.study$perC.sd/100 * data.study$bulk_density)^2)
##
}
##
data.study$C <- data.study$perC/100 * data.study$bulk_density
##
data.study <- merge(subset(data.study, Treatment == "W",
##
select = -Treatment), subset(data.study, Treatment ==
##
"C", select = -Treatment), by = c("Study", "Years", "Tdelta"),
##
suffixes = c(".warmed", ".control"))
##
if (!includeControl.sd)
##
data.study$C.sd.control <- 0
##
data.study$degYr <- data.study$Years * data.study$Tdelta
35
##
data.study$dC <- data.study$C.warmed - data.study$C.control
##
data.study$dC.sd <- sqrt(data.study$C.sd.warmed^2 + data.study$C.sd.control^2)
##
data.study$dC.perDegYr <- data.study$dC/data.study$degYr
##
data.study$dC.perDegYr.sd <- data.study$dC.sd/data.study$degYr
##
if (!includeControl.sd)
##
data.study$C.sd.control <- NA
##
data.study$C.se.control <- data.study$C.sd.control/data.study$count.control
##
data.study$C.se.warmed <- data.study$C.sd.warmed/data.study$count.warmed
##
data.study$dC.perDegYr.se <- data.study$dC.perDegYr.sd/sqrt(rowMeans(data.study[,
##
c("count.warmed", "count.control")]))
##
return(data.study)
## }
Convert R data.frame to netCDF file
cat
(
readLines
(
'../R/Crowther_dSOC_35yr_makeNC.R'
),
sep =
'\n'
)
## # Crowther_dSOC_35yr_makeNC.r
## # Will Wieder
## # July 2016
## # converts .csv to .nc file
## # data reordered go give increasing lat & lon values
##
## library(ncdf)
## library(reshape2)
## library(raster)
## library(rgdal)
##
## #dir <- getwd() #"/Users/wwieder/Desktop/Working_files/Crowther_warming/KTB_results/"
## #setwd(dir)
## file
<- "../R/Crowther_dSOC_35yr_makeNC.R"
## fin
<- "../data/Crowther_dSOC_35yr.csv"
## Data <- read.csv(fin)
## names(Data)
##
## minLAT <- min(Data$lat)
## maxLAT <- max(Data$lat)
## minLON <- min(Data$lon)
## maxLON <- max(Data$lon)
##
## attach(Data)
## names(Data)
##
## #set up depth, lat, lon coordinates
## nLAT
<- length(as.numeric(levels(as.factor(lat))))
## nLON
<- length(as.numeric(levels(as.factor(lon))))
##
## #LAT
<- seq(minLAT,maxLAT,(90 - 89.05759))
## latDATA <- read.csv('../data/LAT.csv') # some rounding errors, read in CSV of LAT from CLM
## LAT <- latDATA$LAT
## LON
<- seq(minLON,maxLON,(360/nLON))
## nOBS
<- length(Data$dC.single)
36
## dims
<- c(nLAT, nLON)
##
## #something wrong w/ how lat values ordered in .csv file
## #rewrite lat so values have a regular step (as I thing they should...)
## lat2 <- rep(NA, length(lat))
## start <- 1
## for (i in 1:nLAT) {
##
end
<- start + nLON-1
##
lat2[start:end] <- LAT[i]
##
start
<- end + 1
## }
## #-------------------------------------------------------------
## #
Define Variables
## #-------------------------------------------------------------
##
## VARS <- c('SOC','landArea','dC.single','dC.multi')
## nVARS <- length(VARS)
##
# close VARS loop
## gridSOC <- rasterFromXYZ(data.frame(Data$lon,lat2,Data$SOC), digits=2)
## gridSOC <- t(flip(gridSOC, direction='y') )
##
## gridArea <- rasterFromXYZ(data.frame(Data$lon,lat2,Data$landArea), digits=2)
## gridArea <- t(flip(gridArea, direction='y') )
##
## gridSingle <- rasterFromXYZ(data.frame(Data$lon,lat2,Data$dC.single), digits=2)
## gridSingle <- t(flip(gridSingle, direction='y') )
##
## gridMulti <- rasterFromXYZ(data.frame(Data$lon,lat2,Data$dC.multi), digits=2)
## gridMulti <- t(flip(gridMulti, direction='y') )
##
## #-------------------------------------------------------------
## #---------------write out .nc file----------------------------
## #-------------------------------------------------------------
## # define the netcdf coordinate variables (name, units, type)
## lat
<- dim.def.ncdf("lat","degrees_north", as.double(LAT), create_dimvar=TRUE)
## lon
<- dim.def.ncdf("lon","degrees_east", as.double(LON), create_dimvar=TRUE)
## mv
<- -9999.
# missing value to use
## LATIXY
<- var.def.ncdf("LATIXY", "degrees N", list(lat), mv,
##
longname="latitude", prec="double")
## LONGXY
<- var.def.ncdf("LONGXY", "degrees E", list(lon), mv,
##
longname="longitude", prec="double")
## SOC_i
<- var.def.ncdf("SOC_i", units="kg C/m2", list(lon,lat), mv,
##
longname="Soil C", prec="double")
## area
<- var.def.ncdf("Area", units="m2", list(lon,lat), mv,
##
longname="grid_area", prec="double")
## dC_Single <- var.def.ncdf("dC_Single", units="kg C/m2", list(lon,lat), mv,
##
longname="Single Step", prec="double")
## dC_Multi <- var.def.ncdf("dC_Multi", units="kg C/m2", list(lon,lat), mv,
##
longname="Multi Step", prec="double")
##
## fname <- '../data/Crowther_dSOC_35y.nc'
## ncnew <- create.ncdf( fname, list(LATIXY, LONGXY, SOC_i, area, dC_Single, dC_Multi) )
##
## # Write some values to this variable on disk.
37
## put.var.ncdf( ncnew, LATIXY, LAT)
## put.var.ncdf( ncnew, LONGXY, LON)
## put.var.ncdf( ncnew, SOC_i,
as.array(gridSOC))
## put.var.ncdf( ncnew, area,
as.array(gridArea))
## put.var.ncdf( ncnew, dC_Single,as.array(gridSingle))
## put.var.ncdf( ncnew, dC_Multi ,as.array(gridMulti))
##
## att.put.ncdf( ncnew, 0, "created_on",date()
,prec=NA,verbose=FALSE,definemode=FALSE )
## att.put.ncdf( ncnew, 0, "created_by","Will Wieder",prec=NA,verbose=FALSE,definemode=FALSE )
## att.put.ncdf( ncnew, 0, "created_from",fin
,prec=NA,verbose=FALSE,definemode=FALSE )
## att.put.ncdf( ncnew, 0, "created_with",file
,prec=NA,verbose=FALSE,definemode=FALSE )
##
## close.ncdf(ncnew)
##
## print('-------Wrote out .nc files-----------')
## print(ncnew)
Main analysis script
sessionInfo
()
R version 3.2.2 (2015-08-14)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.10.5 (Yosemite)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats
graphics grDevices utils
datasets methods
base
other attached packages:
[1] ncdf4_1.15
xlsx_0.5.7
xlsxjars_0.6.1 rJava_0.9-7
[5] deSolve_1.12
lme4_1.1-10
Matrix_1.2-3
MASS_7.3-45
[9] reshape2_1.4.1 pander_0.6.0
plyr_1.8.3
ggplot2_2.0.0
loaded via a namespace (and not attached):
[1] Rcpp_0.12.2
knitr_1.11
magrittr_1.5
splines_3.2.2
[5] munsell_0.4.2
colorspace_1.2-6 lattice_0.20-33 minqa_1.2.4
[9] stringr_1.0.0
tools_3.2.2
grid_3.2.2
gtable_0.1.2
[13] nlme_3.1-122
htmltools_0.2.6 yaml_2.1.13
digest_0.6.8
[17] nloptr_1.0.4
formatR_1.2.1
evaluate_0.8
rmarkdown_0.8.1
[21] labeling_0.3
stringi_1.0-1
scales_0.3.0
cat
(
readLines
(
'../R/CrowtherFieldWarmingScript.R'
),
sep =
'\n'
)
library(ggplot2) #make pretty plots
library(plyr) #deal with data frames nicely
library(pander) #format tables
panderOptions('table.split.table', Inf) #do not let pander split tables because bad numbering
library(reshape2) #deal with data frames nicely
38
library(MASS) #model selection
library(lme4) #random vs fixed effects model
library(deSolve) #solve ode
library(xlsx) #read in excel files
source('../R/bootStrap.fn.R')
source('../R/readSamples.R')
source('../R/readStudyMeans.R')
verbose <- FALSE
##Helper functions
shuffle.sample <- function(data){
idCol <- setdiff(names(data), c('C.warmed', 'C.control'))
return(ddply(data, idCol, summarize,
C.warmed=sample(C.warmed, size=length(Study)),
C.control=sample(C.control, size=length(Study))))
}
pullPvalue <- function(temp.lm){
fstatArr <- summary(temp.lm)$fstatistic
return(pf(fstatArr[1], fstatArr[2], fstatArr[3], lower.tail = FALSE))
}
##Read in data
studyMeta <- read.xlsx2('../data/Soil Data Compiled_January 26.xlsx',
sheetIndex=2, colIndex=c(1, 9,10,11, 13, 16))
names(studyMeta) <- c('Study', 'MAP', 'MAT', 'Biome', 'pH', 'perClay')
studyMeta <- studyMeta[studyMeta$Study != '',]
studyNames <- read.xlsx2('../data/Soil Data Compiled_January 26.xlsx',
sheetIndex=7)
names(studyNames) <- c('Study', 'Study Description')
data.sample <- readSamples()
data.study <- readStudyMeans()
if(!identical( setdiff(studyMeta$Study, data.sample$Study),
setdiff(data.sample$Study, studyMeta$Study)) |
!identical(setdiff(studyMeta$Study, studyNames$Study),
setdiff(studyNames$Study, studyMeta$Study))){
stop('study names do not match')
}
##Convert from g cm^-3 to kg m^-3
data.sample[, c('C.warmed', 'C.control')] <- data.sample[, c('C.warmed', 'C.control')] * 1e3
data.study[, c('bulk_density.warmed', 'C.sd.warmed', 'C.warmed', 'bulk_density.control',
'C.sd.control', 'C.control', 'dC', 'dC.sd', 'dC.perDegYr', 'dC.perDegYr.sd',
'C.se.control', 'C.se.warmed', 'dC.perDegYr.se')] <-
data.study[,
c('bulk_density.warmed', 'C.sd.warmed', 'C.warmed', 'bulk_density.control',
'C.sd.control', 'C.control', 'dC', 'dC.sd', 'dC.perDegYr', 'dC.perDegYr.sd',
'C.se.control', 'C.se.warmed', 'dC.perDegYr.se')] * 1e3
39
##Rescale data
#There is clear skew in the histograms of the years, degree-years, and carbon stocks.
#We log-transformed these variables to normalize the distribution for statistical purposes.
data.sample.plus <- merge(data.sample, studyMeta[,c('Study', 'MAT', 'MAP', 'pH', 'perClay')],
by='Study', all=TRUE)
data.sample.plus$degYr <- data.sample.plus$Years*data.sample.plus$Tdelta
fullRows <- apply(subset(data.sample.plus, select=-Study), c(1),
function(xx){all(is.finite(xx))})
if(verbose) print(sprintf('Throwing out %d samples (rows) because of missing values somewhere.',
sum(!fullRows)))
data.sample.plus <- data.sample.plus[fullRows,]
ggplot(melt(subset(data.sample.plus, select=-Study))) +
geom_histogram(aes(x=value)) + facet_wrap(~variable, scale='free')
cor(subset(data.sample.plus, select=-Study))
data.sample.plus.rescaled <- data.sample.plus
data.sample.plus.rescaled$degYr <- log(data.sample.plus.rescaled$degYr)
data.sample.plus.rescaled$Years <- log(data.sample.plus$Years)
data.sample.plus.rescaled$C.control <- log(data.sample.plus$C.control)
data.sample.plus.rescaled$C.warmed <- log(data.sample.plus$C.warmed)
data.sample.plus.rescaled[,-1] <- as.data.frame(apply(
data.sample.plus.rescaled[, -1], c(2), function(xx){
return((xx-mean(xx, na.rm=TRUE))/sd(xx, na.rm=TRUE)+1)
}))
##Construct LMER
lmer.list <- list(simple = lmer(C.warmed ~ C.control + (1|Study),
data=data.sample.plus.rescaled),
addative.dT = lmer(C.warmed~C.control+Tdelta + (1|Study),
data=data.sample.plus.rescaled),
addative.all = lmer(C.warmed~C.control+MAP+MAT+pH+degYr + perClay + (1|Study),
data=data.sample.plus.rescaled),
addative.enviro = lmer(C.warmed~C.control+MAP+MAT+pH + perClay+ (1|Study),
data=data.sample.plus.rescaled),
addative.treat = lmer(C.warmed~C.control+degYr + (1|Study),
data=data.sample.plus.rescaled),
interactive = lmer(C.warmed~C.control*degYr+ (1|Study),
data=data.sample.plus.rescaled),
interactive.dT = lmer(C.warmed~C.control*Tdelta+ (1|Study),
data=data.sample.plus.rescaled))
##Construct LM
lm.list <- list(Cw.sample = lm(C.warmed ~ C.control * degYr, data.sample),
Cw.sample.dT = lm(C.warmed ~ C.control * Tdelta, data.sample),
dC.sample = lm(C.warmed - C.control ~ C.control * degYr, data.sample),
dC.dT.sample = lm(C.warmed - C.control ~ C.control * Tdelta, data.sample),
dCperDegYr.sample = lm((C.warmed-C.control)/(Years*Tdelta) ~ C.control,
data.sample),
dCperDeg.sample = lm((C.warmed-C.control)/Tdelta ~ C.control,
40
data.sample),
Cw.study = lm(C.warmed ~ C.control * degYr, data.study),
Cw.study.dT = lm(C.warmed ~ C.control * Tdelta, data.study),
dC.study = lm(C.warmed - C.control ~ C.control * degYr, data.study),
dC.dT.study = lm(C.warmed - C.control ~ C.control * Tdelta, data.study),
dCperDegYr.study = lm((C.warmed-C.control)/(Years*Tdelta) ~ C.control,
data.study),
dCperDeg.study = lm((C.warmed-C.control)/Tdelta ~ C.control,
data.study))
modelFits <- ldply(lm.list,
function(xx){
data.frame(model=as.character(xx$call)[2],
data=as.character(xx$call)[3],
adjR2 = sprintf('%0.3f', summary(xx)$adj.r.squared),
pvalue=sprintf('%0.3g', pullPvalue(xx)))
})
##Sample model vs data distributions
interactive.model <- function(pars=summary(lm.list$Cw.study)$coefficients,
C.control, C.sd.control, degYr){
C_degYr.par <- rnorm(1, mean=pars['C.control:degYr', 'Estimate'],
sd=pars['C.control:degYr', 'Std. Error'])
C.par <- rnorm(1, mean=pars['C.control', 'Estimate'], sd=pars['C.control', 'Std. Error'])
degYr.par <- rnorm(1, mean=pars['degYr', 'Estimate'], sd=pars['degYr', 'Std. Error'])
inter.par <- rnorm(1, mean=pars['(Intercept)', 'Estimate'],
sd=pars['(Intercept)', 'Std. Error'])
model <- inter.par+ C.par*C.control + degYr.par*degYr + C_degYr.par*C.control*degYr
return(model)
}
modelData.df <- data.frame()
for(ii in 1:1000){
modelData.df <- rbind(modelData.df,
data.frame(index = 1:length(data.study$C.warmed),
rnd.data=rnorm(n=length(data.study$C.warmed),
mean=data.study$C.warmed,
sd=data.study$C.sd.warmed),
rnd.model =
interactive.model(C.control=data.study$C.control,
C.sd.control=data.study$C.sd.control,
degYr=data.study$degYr)))
}
summaryMD.df <- ddply(modelData.df, 'index', summarize,
data.mean=mean(rnd.data), data.sd=sd(rnd.data),
model.mean=mean(rnd.model), model.sd=sd(rnd.model))
##bootstrap slope
selectSize.sample <- adply(floor(seq(10, dim(data.sample)[1], length=50)), c(1),
function(xx){
ans <- bootStrap.fn(
41
myFormula=(C.warmed-C.control)/(Years*Tdelta) ~ C.control,
data=data.sample, nRuns=100, sampleSize=xx, numCoef=2,
shuffleFn=shuffle.sample)
ans$sampleSize <- xx
return(ans)
})
selectSize.study <- adply(3:(dim(data.study)[1]), c(1),
function(xx){
ans <- bootStrap.fn(
myFormula=(C.warmed-C.control)/(Years*Tdelta) ~ C.control,
data=data.study, nRuns=100, sampleSize=xx, numCoef=2)
ans$sampleSize <- xx
return(ans)
})
##Pull CI for parameters from subset samples
dCperDeg.boot <- bootStrap.fn(
myFormula=(C.warmed-C.control)/Tdelta ~ C.control,
data=data.sample, nRuns=1e3, sampleSize=200, numCoef=2, shuffleFn=shuffle.sample)
dCperDegYr.boot <- bootStrap.fn(
myFormula=(C.warmed-C.control)/(Years*Tdelta) ~ C.control,
data=data.sample, nRuns=1e3, sampleSize=200, numCoef=2, shuffleFn=shuffle.sample)
dCperDegYr.mod.boot <- llply(list(wk1=1/52, mon1 = 1/12, mon6 = 6/12, yr1 = 1,
yr4 = 4, yr5 = 5, yr7 = 7, yr8 = 8,
yr8.75= 8.75, yr10 = 10, yr11.6=35/3,
yr15 = 15,
yr17.5=17.5, yr20 = 20, yr25 = 25, yr30 = 30, yr35 = 35),
function(xx){
data.sample$Years.mod <- data.sample$Years
data.sample$Years.mod[data.sample$Years.mod > xx] <- xx
ans <- bootStrap.fn(
myFormula = (C.warmed-C.control)/(Years.mod*Tdelta) ~ C.control,
data=data.sample, nRuns=1e3, sampleSize=200,
numCoef=2, shuffleFn=shuffle.sample, verbose=FALSE)
return(ans)
})
parKDE <- kde2d(dCperDegYr.boot$C.control, dCperDegYr.boot$`(Intercept)`, n=100)
parBins <- melt(parKDE$z)
parBins <- subset(parBins, value > max(value)*0.01)
parBins$slope <- parKDE$x[parBins$Var1]
parBins$intercept <- parKDE$y[parBins$Var2]
parBins$alpha <- parBins$value/max(parBins$value)
parRange <- ldply(c(list(dCperDegYr = dCperDegYr.boot,
dCperDeg = dCperDeg.boot),
dCperDegYr.mod.boot), function(xx){
ans <- as.data.frame(apply(xx, c(2),
42
quantile, c(0.05, 0.5, 0.95)))
ans$qrt <- c(0.05, 0.5, 0.95)
return(ans)
})
names(parRange)[1:3] <- c('type','intercept', 'C')
save(file='../data/parCIforLM.RData', parRange)
Extrapolation code
cat
(
readLines
(
'../R/globalExtrapolations.R'
),
sep=
'\n'
)
###Set up
library(ncdf4)
library(ggplot2)
library(plyr)
verbose <- FALSE
dataDir <- '../data/'
readIn.tsl <- TRUE
#############################
###Read in maps
inputs.ls <- list(soilGrid=list(filename='SoilGrids_0.9x1.25.nc',
varName='OCSTHA_M',
units='tonnes ha^-1', #convertion factor 1/10 for kg m^-2
depthWeight=c(1, 1, 0, 0, 0, 0)),
#mid points c(2.5 10.0 22.5 45.0 80.0 150.0) cm
#implies 5cm, 10cm, 15cm, 30cm, 60cm, 60cm layer lengths
#take top 15cm
HWSD=list(filename='surfdata_0.9x1.25_simyr2000_c120906_HWSD_soil.nc',
varName='DOM_SOC', #dominatent mapping unit;
#alt area weighted AWT_SOC
units='kg C m^-2',
depthWeight=c(1, 0)), #0-30 cm, 30-70 cm soil layers
landfrac=list(filename='sftlf_fx_CESM1-BGC_historical_r0i0p0.nc',
varName='sftlf',
units='percent'),
gridArea=list(filename='areacella_fx_CESM1-BGC_historical_r0i0p0.nc',
varName='areacella',
units='m2'))
maps.ls <- lapply(inputs.ls, function(args){
ncin <- nc_open(sprintf('%s%s', dataDir, args$filename))
if(verbose) print(ncin)
lon <- ncvar_get(ncin, 'lon') #longitude
lat <- ncvar_get(ncin, 'lat') #longitude
ans <- ncvar_get(ncin, args$varName)
nc_close(ncin)
if(!is.null(args$depthWeight)){
ans <- apply(ans, c(1,2), function(xx){sum(args$depthWeight*xx)})
43
}
dimnames(ans) <- list(lon=lon, lat=lat)
ans <- as.data.frame.table(ans, stringsAsFactors=FALSE, responseName='value')
ans <- as.data.frame(lapply(ans, as.numeric))
return(ans)
})
maps.ls$landArea <- merge(maps.ls$gridArea, maps.ls$landfrac,
by=c('lon', 'lat'), suffixes=c('.area', '.perc'))
maps.ls$landArea$value <- maps.ls$landArea$value.area*maps.ls$landArea$value.perc/100
if(readIn.tsl){
#CESM1-BGC Soil Temperature
##Pre-processing in cdo
##$cdo yearmean tsl_Lmon_CESM1-BGC_rcp85_r1i1p1_200601-204912.nc
##
tsl_yrmean_CESM1-BGC_rcp85_r1i1p1_200601-204912.nc
##$cdo sellevidx,1,2,3,4 tsl_yrmean_CESM1-BGC_rcp85_r1i1p1_200601-204912.nc temp.nc
##$cdo vertmean temp.nc tsl_yrShortMean_CESM1-BGC_rcp85_r1i1p1_200601-204912.nc
ncin <- nc_open(sprintf('%stsl_yrShortMean_CESM1-BGC_rcp85_r1i1p1_200601-204912.nc',
dataDir))
if(verbose) print(ncin)
tsl <- ncvar_get(ncin, 'tsl') #units K
lon <- ncvar_get(ncin, 'lon') #longitude
lat <- ncvar_get(ncin, 'lat') #longitude
time <- ncvar_get(ncin, 'time') #days since 2005-1-1 0:0:0
nc_close(ncin)
dimnames(tsl) <- list(lon=lon, lat=lat, yr=(time/365) + 2005)
tsl <- as.data.frame.table(tsl, stringsAsFactors=FALSE, responseName='value')
tsl <- as.data.frame(lapply(tsl, as.numeric))
##Make the latitudes aggree, off by 1e-6
tsl$lat <- round(tsl$lat, 2)
maps.ls <- lapply(maps.ls, function(xx){xx$lat <- round(xx$lat, 2); return(xx)})
##Trim tsl to only cover 2015-2049
tsl <- subset(tsl, yr >= 2015 & yr <=2049)
tsl.start <- ddply(subset(tsl, yr >= min(yr) & yr < (min(yr)+10)), .(lon, lat),
summarize, value=mean(value))
tsl.end <- ddply(subset(tsl, yr > max(yr)-10 & yr <= max(yr)), .(lon, lat),
summarize, value=mean(value))
tsl.change <- merge(tsl.start, tsl.end, by=c('lon', 'lat'), suffixes=c('.inital', '.final'))
if(verbose){
print(ggplot(tsl.change) + geom_raster(aes(x=lon, y=lat, fill=value.final-value.inital)) +
labs(title='CESM-BCG temperature change'))
print(ggplot(tsl.change) + geom_histogram(aes(x=value.final-value.inital)) +
labs(title='CESM-BCG temperature change'))
}
}
44
if(verbose){
print(ggplot(maps.ls$soilGrid) + geom_raster(aes(x=lon, y=lat, fill=value/10)) +
scale_fill_continuous(limits=c(0, 300),low="yellow", high='red') +
labs( title='Soil Grids'))
print(ggplot(maps.ls$HWSD) + geom_raster(aes(x=lon, y=lat, fill=value)) +
scale_fill_continuous(limits=c(0, 100),low="yellow", high='red') + labs(title='HWSD'))
print(ggplot(maps.ls$landfrac) + geom_raster(aes(x=lon, y=lat, fill=value/100)) +
scale_fill_continuous(limits=c(0, 1),low="yellow", high='red') +
labs( title='Land Fraction'))
print(ggplot(maps.ls$gridArea) + geom_raster(aes(x=lon, y=lat, fill=value)) +
labs( title='Grid Area'))
print(ggplot(maps.ls$landArea) + geom_raster(aes(x=lon, y=lat, fill=value)) +
labs( title='Land Area'))
}
##########################################
##Make one dataframe to work from so that the lat-lon pair up appropreately
##########################################
commonGrid <- merge(maps.ls$landArea,
merge(maps.ls$soilGrid, maps.ls$HWSD,
by=c('lon', 'lat'), suffixes=c('.SG', '.H')),
by=c('lon', 'lat'))
if(readIn.tsl){
commonGrid <- merge(tsl.change, commonGrid,
by=c('lon', 'lat'), suffixes=c('.Dtsl', '.landArea'))
}
commonGrid <- rename(commonGrid, c('value.inital'='inital.temperature',
'value.final'='final.temperature',
'value.area'='cell.area',
'value.perc'='land.percentage',
'value'='land.area',
'value.SG'='SoilGrid.SOC', 'value.H'='HWSD.SOC'))
##Shift the units for soil grid to kg m^-2
commonGrid$SoilGrid.SOC <- commonGrid$SoilGrid.SOC/10
###Remove 0 values
##commonGrid$SoilGrid.SOC[commonGrid$SoilGrid.SOC == 0] <- NA
##commonGrid$HWSD.SOC[commonGrid$HWSD.SOC == 0] <- NA
commonGrid$allFinite <- is.finite(rowSums(subset(commonGrid, select=-HWSD.SOC))) &
commonGrid$land.area != 0
#################################
###Pull temperature normalization from CESM if needed
#################################
if(readIn.tsl){
globalCESM.dT <- with(commonGrid, sum(land.area*
(final.temperature-inital.temperature)*allFinite,
na.rm=TRUE)/sum(land.area*allFinite, na.rm=TRUE))
45
}else{
globalCESM.dT <- NA
}
if(verbose){
ggplot(commonGrid) + geom_raster(aes(x=lon, y=lat, fill=allFinite)) +
labs(title='Shared grid cells')
print(sprintf("Global totals: HWSD = %0.2f Pg,
SoilGrid = %0.2f Pg, inital T = %0.2f C, dT = %0.2f C",
with(commonGrid, sum(land.area*(HWSD.SOC)*allFinite, na.rm=TRUE)/1e12),
with(commonGrid, sum(land.area*(SoilGrid.SOC)*allFinite, na.rm=TRUE)/1e12),
ifelse(readIn.tsl, with(commonGrid,
sum(land.area*inital.temperature*allFinite, na.rm=TRUE)/
sum(land.area*allFinite, na.rm=TRUE))-273.15, NA),
globalCESM.dT
))
}
##############################
###Run the global extrapolation
###############################
load(sprintf('%sparCIforLM.RData', dataDir))
soilDepth <- 0.15 #in m; for HWSD it's 0.3
##Number of years we run through
runTime <- 35
dC <- function(args, step, Cstock){
#correct for soil depth but converting stocks from per area to per volume
#...and then correcting the result from per volume to per area
return(step*(args$C*Cstock/soilDepth+args$intercept)*soilDepth)
}
##Use the temperature change distribution from CESM from year 2040-2049 and 2015-2024
if(readIn.tsl){
degWarmedRate.ls <- list(oneDeg=1/runTime, twoDeg=2/runTime,
threeDeg=3/runTime, fourDeg=4/runTime,
oneDeg_CESM_normed = (commonGrid$final.temperature-
commonGrid$inital.temperature)/
globalCESM.dT*1/runTime,
twoDeg_CESM_normed = (commonGrid$final.temperature-
commonGrid$inital.temperature)/
globalCESM.dT*2/runTime,
threeDeg_CESM_normed = (commonGrid$final.temperature-
commonGrid$inital.temperature)/
globalCESM.dT*3/runTime,
fourDeg_CESM_normed = (commonGrid$final.temperature-
commonGrid$inital.temperature)/
globalCESM.dT*4/runTime)
}else{
degWarmedRate.ls <-list(oneDeg=1/runTime, twoDeg=2/runTime)
}
#Time step for each linear model type
46
dtime.ls <- list(wk1=1/52, mon1 = 1/12, mon6 = 6/12, yr1 = 1,
yr4 = 4, yr5 = 5, yr7 = 7, yr8 = 8,
yr8.75= 8.75, yr10 = 10, yr11.6=35/3,
yr17.5=17.5, yr20 = 20, yr25 = 25, yr30 = 30, yr35 = 35)
resultsFull <- ldply(degWarmedRate.ls, .id='warming', function(degWarmedRate){
##Calculate the SOC losses
SOC.losses <- ddply(parRange, c('type', 'qrt', 'intercept', 'C'),
function(xx){
#cat(xx$type)
C.map <- commonGrid$SoilGrid.SOC
if(grepl('^dCperDegYr$', xx$type)){
dC.map <- ldply(dtime.ls, .id=NULL, function(warmedTime){
degStep <- degWarmedRate/2*warmedTime^2
return(data.frame(degYr.mean=sum(degStep*commonGrid$land.area, na.rm=TRUE)/
sum(is.finite(degStep)*commonGrid$land.area, na.rm=TRUE),
timeStep=warmedTime,
lon=commonGrid$lon,
lat=commonGrid$lat,
value.C=C.map,
landArea=commonGrid$land.area*commonGrid$allFinite,
value.dC=dC(args=xx, step=degStep, Cstock=C.map)))
})
}else if(grepl('^dCperDeg$', xx$type)){
dC.map <- data.frame(degYr.mean=NA,
timeStep=NA,
lon=commonGrid$lon,
lat=commonGrid$lat,
value.C=C.map,
landArea=commonGrid$land.area*commonGrid$allFinite,
value.dC=dC(args=xx, step=degWarmedRate*runTime, Cstock=C.map))
}else{ ##Cap study
#print(xx$type)
#print(!(xx$type %in% names(dtime.ls)) || (runTime/dtime.ls[[xx$type]]) %% 1 != 0)
if(!(xx$type %in% names(dtime.ls)) ||
(runTime/dtime.ls[[xx$type]]) %% 1 != 0){
return(data.frame()) #don't run if you can't cover the entire period
}
runningC <- C.map
degStep <- degWarmedRate/2*dtime.ls[[xx$type]]^2 #cumulative degYr for each time step
for(ii in seq(0, runTime-1, by=dtime.ls[[xx$type]])){
runningC <- runningC + dC(args=xx, step=degStep, Cstock=runningC)
}
dC.map <- data.frame(degYr.mean=mean(degStep, na.rm=TRUE),
timeStep=dtime.ls[[xx$type]],
lon=commonGrid$lon,
lat=commonGrid$lat,
value.C=C.map,
landArea=commonGrid$land.area*commonGrid$allFinite,
value.dC=runningC-C.map)
}
47
##max loss is the inital carbon stock
dC.map$value.dC[is.finite(dC.map$value.C+dC.map$value.dC) & dC.map$value.dC +
dC.map$value.C < 0] <-
-1*dC.map$value.C[is.finite(dC.map$value.C+dC.map$value.dC) & dC.map$value.dC +
dC.map$value.C < 0]
#dC.map <- merge(dC.map, commonGrid[,c('lon', 'lat', 'land.area', 'allFinite')])
return(ddply(dC.map, c('timeStep', 'degYr.mean'),
summarize, dC=sum(value.dC*landArea, na.rm=TRUE)/1e12))
}) #end SOC.losses
}) #end resultsTable
resultsTable <- merge(subset(resultsFull, qrt==0.95,
select=c('warming', 'type', 'timeStep', 'degYr.mean', 'dC')),
merge(subset(resultsFull, qrt==0.05,
select=c('warming', 'type', 'timeStep','degYr.mean', 'dC')),
subset(resultsFull, qrt==0.50,
select=c('warming', 'type', 'timeStep', 'degYr.mean', 'dC')),
by=c('warming', 'type', 'degYr.mean', 'timeStep'), suffixes=c('_qrt05', '_qrt50')))
resultsTable <- rename(resultsTable, c('dC'='dC_qrt95'))
resultsTable$dodge.timeStep <- resultsTable$timeStep +
rnorm(n=length(resultsTable$timeStep), mean=0, sd=0.1)
deg.key <- list("fourDeg"=4, "oneDeg"=1,
"threeDeg"=3, "twoDeg"=2)
resultsTable$globalWarming <- as.factor(unlist(lapply(strsplit(
as.character(resultsTable$warming), split="_"), function(xx){deg.key[[xx[[1]]]]})))
resultsTable$warmingDistribution <- unlist(lapply(strsplit(
as.character(resultsTable$warming), split="_"),
function(xx){ifelse(length(xx) > 1, 'CESM', 'unif')}))
save(file='../data/globalExtrapolations.RData', resultsTable, resultsFull)
#####################
##Make plots
degYrSingle.pl <- ggplot(subset(resultsTable, grepl('dCperDegYr', type))) +
geom_point(aes(x=timeStep, y=dC_qrt50)) +
geom_errorbar(aes(x=timeStep, y=dC_qrt50, ymin=dC_qrt05, ymax=dC_qrt95)) +
facet_wrap(~warming, nrow=2) +
labs(title='dC per degree-year across single time steps', x='years', y='Pg C')
ggsave(degYrSingle.pl, filename='../figs/degYrSingleTimeStep.pdf')
degYr.pl <- ggplot(subset(resultsTable, grepl('dCperDegYr', type))) +
geom_point(aes(x=degYr.mean, y=dC_qrt50, color=grepl('CESM', warming))) +
geom_ribbon(aes(x=degYr.mean, y=dC_qrt50, ymin=dC_qrt05, ymax=dC_qrt95,
fill=grepl('CESM', warming)), alpha=0.3) +
scale_fill_discrete(guide=guide_legend(title='CESM'))+guides(color=FALSE) +
labs(title='dC per degree-year across single time steps', x='degree-years', y='Pg C')
ggsave(degYr.pl, filename='../figs/degYr.pdf')
degSingle.pl <- ggplot(subset(resultsTable, 'dCperDeg'== type)) +
geom_point(aes(x=warming, y=dC_qrt50)) +
geom_errorbar(aes(x=warming, y=dC_qrt50, ymin=dC_qrt05, ymax=dC_qrt95)) +
48
theme(axis.text.x = element_text(angle = 90, hjust = 1)) + labs(title='dC per degree')
ggsave(degSingle.pl, filename='../figs/degSingleTimeStep.pdf')
degYrStepInt.pl <- ggplot(subset(resultsTable, !grepl('dCperDeg', type))) +
geom_line(aes(x=timeStep, y=dC_qrt50, group=warming, linetype=warmingDistribution)) +
geom_ribbon(aes(x=timeStep, y=dC_qrt50, ymin=dC_qrt05, ymax=dC_qrt95, group=warming),
alpha=0.2) +
facet_wrap(~globalWarming)
ggsave(degYrStepInt.pl, filename='../figs/degYrMultiTimeStep.pdf')
##See Crowther2016Sup.Rmd for figure code
write.csv(file='../data/degYrMultiTimeStepSimple.csv',
subset(resultsTable, !grepl('dCperDeg', type) & globalWarming %in% c('1', '2')))
singleStep.pl <- ggplot(subset(resultsTable, grepl('dCperDeg', type) &
globalWarming %in% c(1,2) &
(is.na(timeStep) | timeStep == 35))) +
geom_point(aes(x=globalWarming, y=dC_qrt50, color=type, shape=warmingDistribution), cex=5) +
geom_errorbar(aes(x=globalWarming, y=dC_qrt50, color=type, linetype=warmingDistribution,
ymin=dC_qrt05, ymax=dC_qrt95)) +
labs(title='Soil carbon losses at 35 years, one step', x='Average temperature increase',
y='Global change in soil carbon [Pg C]')
ggsave(singleStep.pl, filename='../figs/singleStep.pdf')
write.csv(file='../data/singleStep.csv',
subset(resultsTable, grepl('dCperDeg', type) &
globalWarming %in% c('1', '2') &
(is.na(timeStep) | timeStep == 35), -dodge.timeStep))
########
##Make ncdf file for pretty maps
Cshift <- data.frame(lon=commonGrid$lon, lat=commonGrid$lat,
SOC=commonGrid$SoilGrid.SOC,
landArea=commonGrid$land.area, #*commonGrid$allFinite,
dC.single=dC(args=subset(parRange, type=='dCperDegYr' & qrt==0.5),
step=degWarmedRate.ls$oneDeg_CESM_normed/2*35^2,
Cstock=commonGrid$SoilGrid.SOC))
runningC <- Cshift$SOC
degStep <- degWarmedRate.ls$oneDeg_CESM_normed/2*1^2 #cumulative degYr for each time step
for(ii in seq(0, runTime-1, by=1)){
runningC <- runningC + dC(args=subset(parRange, type=='yr1' & qrt==0.5),
step=degStep, Cstock=runningC)
}
Cshift$dC.multi <- runningC-Cshift$SOC
negFlag <- is.finite(Cshift[, 'dC.single'] + Cshift[, 'SOC']) &
(Cshift[, 'dC.single'] + Cshift[, 'SOC'] < 0 )
Cshift[negFlag, 'dC.single'] <- -1*Cshift[negFlag, 'SOC']
negFlag <- is.finite(Cshift[, 'dC.multi'] + Cshift[, 'SOC']) &
(Cshift[, 'dC.multi'] + Cshift[, 'SOC'] < 0 )
Cshift[negFlag, 'dC.multi'] <- -1*Cshift[negFlag, 'SOC']
cat('Single step: ', sum(Cshift$dC.single*Cshift$landArea, na.rm=TRUE)/1e12, '=?=',
49
unlist(subset(resultsTable, grepl('dCperDegYr', type) &
globalWarming %in% c(1, 2) &
(is.na(timeStep) | timeStep == 35) &
warming=='oneDeg_CESM_normed', dC_qrt50)),
'\nOne yr step: ', sum(Cshift$dC.multi*Cshift$landArea, na.rm=TRUE)/1e12, '=?=',
unlist(subset(resultsTable, !grepl('dCperDeg', type) & globalWarming %in% c(1, 2) &
type=='yr1' & warming=='oneDeg_CESM_normed', dC_qrt50)), '\n')
write.csv(file='Crowther_dSOC_35yr.csv', Cshift)
Global carbon loss map code
cat
(
readLines
(
'../ncl/plot_warming_loss.ncl'
),
sep=
'\n'
)
; July 2016
; Will Wieder
; plots changes in SOC stocks from Kathe's analyses.
; *********************************************************************
load "$NCARG_LIB/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_LIB/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_LIB/ncarg/nclscripts/csm/contributed.ncl"
load "$NCARG_LIB/ncarg/nclscripts/csm/shea_util.ncl"
begin
;---------------------------------------------------------------
;Read in input variables
;--------------------------------------------------------------
path
= (/"/project/tss/wwieder/soilCN/global_run/warming/"/)
fin
= path + "Crowther_dSOC_35y.nc"
data
= addfile(fin, "r")
SGRD_SOC
= data->SOC_i(:,:)
; SoilGrids SOC pools, kgC/m2, 0-15 cm
area
= data->Area
dC_single = data->dC_Single
dC_multi
= data->dC_Multi
glob_SOCi = sum(SGRD_SOC * area) / 1.e12
glob_dC_s = sum(dC_single * area) / 1.e12
glob_dC_m = sum(dC_multi * area) / 1.e12
print(glob_SOCi)
print(glob_dC_s)
print(glob_dC_m)
end
;************************************************
; plot SOC losses
; Fig. 3 in manuscript
;************************************************
fout = path + "Crowther_dSOC_35y_step_wZERO"
50
wks = gsn_open_wks("ps" , fout); open a X11 or ps file
res
= True
res@gsnDraw
= False
res@gsnFrame
= False
res@cnSmoothingOn
= False
res@mpProjection
= "Robinson"
res@mpOutlineOn
= True
res@lbOrientation
= "Horizontal"
res@mpPerimOn
= False
res@mpGridAndLimbOn
= True
res@mpGridLatSpacingF
= 180
res@mpGridLonSpacingF
= 180
res@mpGridLineThicknessF
= 0.
res@mpGridLineColor
= "transparent"
res@mpGridMaskMode
= "MaskLand"
gsn_define_colormap(wks,"BlWhRe")
res@gsnSpreadColors
= True
; use full colormap
res@gsnSpreadColorEnd
= 68
; start with last color
; res@gsnSpreadColorStart = 2
; start with last color
gsn_reverse_colormap(wks)
; reverse colormap
res@gsnLeftString
= ""
res@gsnRightString
= ""
res@cnFillOn
= True
res@cnLinesOn
= False
; Turn lines off
res@cnLineLabelsOn
= False
; Turn labels off
res@cnLevelSelectionMode = "ManualLevels"
res@cnMinLevelValF
= -17 ; -3.75*5
res@cnMaxLevelValF
= 5. ; 0.50*5
res@cnLevelSpacingF
= 2. ; 0.5*5
res@lbLabelStrings
= (/-17.,-15.,-13.,-11.,-9.,-7,-5.,-3.,-1,1.,3.,5./)
; res@lbLabelStrings
= (/-17.,-13.,-9.,-5.,-1.,1.,5/)
res@lbLabelFontHeightF
= 0.025
; make labels larger
res@lbTitleOn
= True
; turn on title
res@lbTitlePosition
= "Bottom"
res@lbTitleString
= "kg C m~S~-2~N "
res@lbTitleFontHeightF
= .030
; make title smaller
res@pmLabelBarOrthogonalPosF = .05
; move whole thing down
res@vpXF
= 0.1
; make plot bigger
res@vpYF
= 0.9
res@vpWidthF
= 0.8
res@vpHeightF
= 0.8
plot
= gsn_csm_contour_map(wks,dC_single,res)
resP
= True
; modify the panel plot
resP@gsnFrame
= False
; don't advance panel plot
gsn_panel(wks,plot,(/1,1/),resP)
; now draw as one plot
frame(wks)
print("wrote "+fout+".ps")
51
delete([/plot, res, resP, wks,fout/])
52