library(vegan)
bird_Ohio
shannon<-diversity(bird_Ohio, index = "shannon")
shannon
  [1] 1.8917399 2.5122269 2.5759511 2.5306341 2.5813695 2.5851922 2.8543118 2.6869090 2.6290101 2.4471082 2.4514742
 [12] 2.6624436 2.4801533 2.4524231 2.4446459 2.5985159 2.1580650 2.0290131 2.3439848 2.3677896 2.6230152 2.1818266
 [23] 2.3999167 2.3497389 2.1019228 2.1558323 2.1542864 2.2277483 2.3289428 1.8809617 2.4493401 2.3266446 2.2270348
 [34] 1.9964440 2.0417370 2.4618897 2.1320689 2.2922720 1.5430953 2.0627115 2.6546098 2.3331170 1.7535317 1.8944254
 [45] 1.9905828 1.8202840 1.7588983 1.2049611 2.1437307 2.0737966 1.6534827 2.1077805 1.9625262 1.7738141 2.0210011
 [56] 1.8759969 1.4522335 1.5969316 1.4228140 2.2233828 1.6941131 2.2527933 1.4705667 1.4376671 1.6556983 2.0069460
 [67] 1.7242396 1.6262868 1.9412633 1.2809809 1.3010760 1.5318794 1.5531853 1.5204937 1.7648837 1.6943305 1.7000499
 [78] 1.3091997 1.5702975 1.3837769 1.3385135 1.4513903 0.9429183 1.4490505 1.7895111 1.9656594 1.5788314 1.5022623
 [89] 1.4904512 1.4962931 1.4059042 1.6478061 1.2990656 1.0930459 1.5543977 1.7289643 1.6443609 1.5495614 1.4031313
[100] 1.7226377 1.8883235 1.9303606 1.4901640 1.5787674 1.5705318 1.4178638 1.2837894 1.5926701 1.6081552 1.4082954
[111] 1.2234179 1.2528753 1.3100790 1.4507992 1.2323738 1.3797947 1.7293521 1.4854109 1.4658616 0.9669648 1.1795715
[122] 1.3672704 1.5350481 1.3090028 1.2126036 1.3047201 1.2040135 1.3639687 1.1349332 1.4067959 1.2394246 1.3198667
[133] 1.1560033 1.2668167 1.3633187 1.7184293 1.4705114 1.4134997 1.1657677 1.4382794 1.6241226 0.9479850 0.7890530
[144] 1.4545973 1.4366209 1.3270892 1.1408832 0.9003295 0.9349969 1.1903317 1.5749987 1.5003813 1.0810697 1.5488876
[155] 1.5759803 0.9573217 1.2080605 1.1433944 1.0993195 1.1174376 1.1019272 0.9943400 1.0646499 1.6364990 1.2202461
[166] 1.3055935 1.2551904 1.3908337 1.5319849 0.9827985 0.9091475 1.3284004 1.0280144 1.0155201 0.8256294 1.1407526
[177] 1.1095773 0.9370976 1.1957853 0.9132408 0.9268789 0.9070407 0.9184634 1.0505849 1.1130730 1.1475092 0.8861070
[188] 1.1679846 1.3269686 1.4025824 0.7316835 1.0732068 1.0880649 0.8289934 0.8676827 1.1044350 1.0755235 1.0144104
[199] 1.1081660 1.0762302 1.0511711 0.9282779 1.2321592 0.7472004 0.8967415 0.9696155 0.4879819 1.2601278 1.2607309
[210] 1.0734488
simpson<-diversity(bird_Ohio, index = "simpson")
simpson
  [1] 0.7923875 0.9023669 0.9141051 0.8955078 0.9112426 0.9100346 0.9286265 0.9171429 0.9131944 0.8927116 0.8897290
 [12] 0.9137893 0.8793388 0.8758573 0.8830959 0.8967347 0.8536155 0.8264046 0.8624852 0.8617998 0.8762865 0.8433163
 [23] 0.8526139 0.8573088 0.8130987 0.8250548 0.8136574 0.8264701 0.8491358 0.7441406 0.8553590 0.8238062 0.8106576
 [34] 0.7780612 0.7801904 0.8531268 0.7831946 0.8068698 0.6477631 0.7808963 0.8616564 0.7890625 0.6954194 0.7339693
 [45] 0.7269136 0.6911844 0.6822566 0.5081633 0.7527571 0.7694515 0.6567901 0.7160000 0.7361333 0.6479362 0.6747189
 [56] 0.6863983 0.5658574 0.6459054 0.5912465 0.7710506 0.6341785 0.7706531 0.5559896 0.5789628 0.6272199 0.7150879
 [67] 0.6403025 0.6024793 0.7088021 0.4988000 0.4968140 0.5861804 0.5995339 0.5778835 0.6374853 0.6346974 0.6039282
 [78] 0.4959013 0.5915848 0.5347080 0.5234094 0.5429308 0.4238292 0.5318678 0.6617778 0.6964237 0.5921019 0.5775047
 [89] 0.5791837 0.5853587 0.5223585 0.6010774 0.5181661 0.4416889 0.5807846 0.6220482 0.5677222 0.5565515 0.5220452
[100] 0.5952296 0.6635526 0.6503184 0.5207111 0.6158734 0.5447686 0.5379747 0.4695946 0.5760346 0.5821278 0.5175781
[111] 0.5051503 0.4630629 0.4962000 0.5478637 0.4671492 0.5235294 0.6090305 0.5106574 0.5185606 0.3701524 0.4405887
[122] 0.5040980 0.5602648 0.4785325 0.4391298 0.4572742 0.4574581 0.4963772 0.4396221 0.5037577 0.4670187 0.4978497
[133] 0.4104902 0.4898061 0.4876454 0.5769861 0.5051541 0.5225468 0.3938079 0.5078587 0.5466634 0.3572150 0.3180077
[144] 0.4964437 0.4751863 0.4889245 0.4303415 0.3341988 0.3763435 0.4262014 0.5111597 0.5117908 0.4075500 0.5420794
[155] 0.5161432 0.3428280 0.4343764 0.4120049 0.4084227 0.3921670 0.4009981 0.3344865 0.4009879 0.5320156 0.4317769
[166] 0.4590037 0.4250527 0.4708680 0.5338560 0.3637872 0.3495779 0.4747466 0.3657520 0.3795146 0.2896172 0.4219639
[177] 0.4203375 0.3414050 0.4325555 0.3431800 0.3372680 0.3009006 0.3442333 0.3724143 0.3960015 0.3812779 0.3234457
[188] 0.4113292 0.4541780 0.4803133 0.2576901 0.3719623 0.3935743 0.2681985 0.3192152 0.3765746 0.3795178 0.3771101
[199] 0.3910828 0.3889234 0.3824131 0.3371236 0.4337904 0.2852947 0.3188013 0.3529198 0.1674397 0.4239074 0.4304125
[210] 0.3842678
inv.simpson<-diversity(bird_Ohio, index = "invsimpson")
inv.simpson
  [1]  4.816667 10.242424 11.642140  9.570093 11.266667 11.115385 14.010811 12.068966 11.520000  9.320675  9.068571
 [12] 11.599483  8.287671  8.055249  8.554023  9.683794  6.831325  5.760522  7.271945  7.235880  8.083192  6.382284
 [23]  6.784902  7.008138  5.350417  5.716075  5.366460  5.762696  6.628478  3.908397  6.913669  5.675570  5.281437
 [34]  4.505747  4.549391  6.808596  4.612431  5.177854  2.838998  4.564050  7.228380  4.740741  3.283203  3.758965
 [45]  3.661844  3.238179  3.147193  2.033195  4.044605  4.337483  2.913669  3.521127  3.789793  2.840394  3.074264
 [56]  3.188759  2.303391  2.824104  2.446462  4.367778  2.733574  4.360207  2.252199  2.375087  2.682547  3.509854
 [67]  2.780114  2.515593  3.434090  1.995211  1.987337  2.416512  2.497090  2.369014  2.758509  2.737457  2.524795
 [78]  1.983739  2.448489  2.149188  2.098237  2.187852  1.735597  2.136149  2.956636  3.294065  2.451592  2.366890
 [89]  2.376334  2.411723  2.093621  2.506752  2.075404  1.791116  2.385409  2.645840  2.313327  2.255053  2.092248
[100]  2.470536  2.972233  2.859744  2.086424  2.603309  2.196685  2.164384  1.885350  2.358683  2.393076  2.072874
[111]  2.020815  1.862416  1.984915  2.211722  1.876698  2.098765  2.557744  2.043558  2.077105  1.587686  1.787593
[122]  2.016527  2.274096  1.917665  1.782944  1.842551  1.843175  1.985613  1.784510  2.015144  1.876238  1.991436
[133]  1.696325  1.960039  1.951773  2.363989  2.020831  2.094446  1.649642  2.031937  2.205866  1.555730  1.466292
[144]  1.985875  1.905438  1.956658  1.755438  1.501950  1.603447  1.742772  2.045658  2.048302  1.687906  2.183785
[155]  2.066727  1.521672  1.767960  1.700695  1.690396  1.645189  1.669444  1.502599  1.669415  2.136824  1.759872
[166]  1.848441  1.739290  1.889888  2.145260  1.571801  1.537463  1.903843  1.576670  1.611642  1.407692  1.729996
[177]  1.725142  1.518384  1.762287  1.522487  1.508906  1.430412  1.524933  1.593408  1.655633  1.616235  1.478078
[188]  1.698742  1.832099  1.924236  1.347146  1.592261  1.649007  1.366491  1.468893  1.604041  1.611650  1.605420
[199]  1.642259  1.636456  1.619205  1.508577  1.766130  1.399178  1.468000  1.545403  1.201114  1.735832  1.755657
[210]  1.624083
fish.alp<-fisher.alpha(bird_Ohio)
fish.alp
  [1]  5.642066  7.896600  6.488217  7.565648  7.896600  7.275326 11.680602  8.578491  7.703286  7.612305  7.916266
 [12]  8.839863  9.316717  9.454690  7.814550  9.354043  4.970140  4.970140  6.781181  7.415136 11.156386  5.110244
 [23]  9.198544  7.705935  5.389613  5.679263  6.377738  6.055108  6.765902  4.927590  7.224522  8.920683  7.027652
 [34]  6.430958  5.381526  8.310228  6.891754  8.984035  3.690822  5.538659 11.970603  9.586698  4.350582  5.112918
 [45]  6.765902  5.254828  4.718079  3.192559  7.976087  5.576450  3.718729  9.354332  5.646225  6.096825 10.837223
 [56]  5.798205  4.212510  4.392532  3.217794  7.064403  4.829737  8.991549  4.986195  3.546422  4.711590  6.648249
 [67]  5.988234  6.114229  6.065899  3.560586  3.546422  4.192993  5.427384  5.030672  5.726751  5.687885  6.259378
 [78]  4.238987  4.858106  4.121275  3.717707  5.349775  1.659647  4.890459  4.931276  7.342929  5.082987  4.281400
 [89]  4.257961  4.223961  4.342856  5.369842  3.173985  2.544462  4.545684  6.048954  7.602821  5.778996  5.414712
[100]  7.383522  6.606168  7.981444  7.105981  3.601971  6.964669  4.071694  4.557373  5.109555  5.469168  4.810390
[111]  3.335706  4.489371  4.415941  4.311580  4.062475  3.967505  6.848485  7.622560  6.259936  3.401558  4.396019
[122]  5.031600  5.661968  4.672620  5.506903  6.274631  3.935634  4.959159  3.588003  5.297514  3.882807  3.497519
[133]  5.042383  4.164308  5.639364  8.224130  6.763796  4.777415  5.769443  5.149475  7.797693  3.904973  2.305868
[144]  5.871991  7.955229  4.394232  3.450861  3.204387  2.846412  4.802582  8.995673  6.871785  3.756033  6.745033
[155]  8.446768  3.800210  4.713438  4.046218  4.379899  5.104476  4.033430  5.926942  4.014640  8.614307  5.345689
[166]  5.647828  6.075704  6.342263  6.915739  3.675202  2.750911  4.849896  4.653569  3.632950  3.708700  4.551192
[177]  3.574193  3.328464  4.513385  3.010270  3.314740  5.730437  3.296916  4.218990  4.513385  5.923958  3.292541
[188]  4.471297  6.113701  6.406272  3.014282  5.165024  4.453883  5.647828  2.957055  6.182347  4.772041  3.494964
[199]  4.741473  4.409155  4.409155  3.815290  4.655622  2.103496  3.815290  3.778652  2.415700  6.323830  5.950260
[210]  4.993876
Div.Ind<-cbind.data.frame(shannon, simpson, inv.simpson,fish.alp)
Div.Ind
summary(Div.Ind)
    shannon         simpson        inv.simpson        fish.alp     
 Min.   :0.488   Min.   :0.1674   Min.   : 1.201   Min.   : 1.660  
 1st Qu.:1.171   1st Qu.:0.4272   1st Qu.: 1.746   1st Qu.: 4.214  
 Median :1.453   Median :0.5277   Median : 2.117   Median : 5.112  
 Mean   :1.559   Mean   :0.5678   Mean   : 3.192   Mean   : 5.521  
 3rd Qu.:1.891   3rd Qu.:0.6944   3rd Qu.: 3.272   3rd Qu.: 6.638  
 Max.   :2.854   Max.   :0.9286   Max.   :14.011   Max.   :11.971  
env_Ohio
Ohio.env.Div<-cbind.data.frame(env_Ohio, Div.Ind)
Ohio.env.Div
library("rstatix") 
Ohio.env.Div %>%
  group_by(Habitat) %>%
  get_summary_stats(shannon, type = "mean_sd")
Ohio.env.Div %>%
  group_by(Habitat) %>%
  get_summary_stats(simpson, type = "mean_sd")
Ohio.env.Div %>%
  group_by(Habitat) %>%
  get_summary_stats(fish.alp, type = "mean_sd")
Ohio.env.Div %>%
  group_by(Habitat) %>%
  get_summary_stats(inv.simpson, type = "mean_sd")
library("ggplot2")
Shanon.habitat<-ggplot(Ohio.env.Div, aes(x = Habitat, y = shannon, fill = Habitat)) +
  geom_boxplot() + 
  stat_summary(fun = mean, geom = "point", shape =21, size = 3, colour = "black", fill="yellow")

Simp.habitat<-ggplot(Ohio.env.Div, aes(x = Habitat, y = simpson, fill = Habitat)) +
  geom_boxplot() +
  stat_summary(fun = mean, geom = "point", shape =21, size = 3, colour = "black", fill="yellow")

InvSimp.habitat<-ggplot(Ohio.env.Div, aes(x = Habitat, y = inv.simpson, fill = Habitat)) +
  geom_boxplot()  + 
  stat_summary(fun = mean, geom = "point", shape =21, size = 3, colour = "black", fill="yellow")

Fish.habitat<-ggplot(Ohio.env.Div, aes(x = Habitat, y = fish.alp, fill = Habitat)) +
  geom_boxplot()  + 
  stat_summary(fun = mean, geom = "point", shape =21, size = 3, colour = "black", fill="yellow")
library("gridExtra")
Warning: package ‘gridExtra’ was built under R version 4.4.2
grid.arrange(Shanon.habitat, Simp.habitat, InvSimp.habitat, Fish.habitat,
             nrow=2, ncol=2) 

grid.arrange(Shanon.habitat, Simp.habitat, InvSimp.habitat, Fish.habitat, nrow=2, ncol=2) 

shannon_aov <- aov(Ohio.env.Div$shannon ~ Ohio.env.Div$Habitat)

summary(shannon_aov)
                      Df Sum Sq Mean Sq F value Pr(>F)  
Ohio.env.Div$Habitat   2   1.66  0.8308   3.335 0.0375 *
Residuals            207  51.57  0.2491                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
simpson_aov <- aov(Ohio.env.Div$simpson ~ Ohio.env.Div$Habitat)

summary(simpson_aov)
                      Df Sum Sq Mean Sq F value Pr(>F)  
Ohio.env.Div$Habitat   2  0.189 0.09426   3.015 0.0512 .
Residuals            207  6.471 0.03126                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
inv.simpson_aov <- aov(Ohio.env.Div$inv.simpson ~ Ohio.env.Div$Habitat)

summary(inv.simpson_aov)
                      Df Sum Sq Mean Sq F value Pr(>F)
Ohio.env.Div$Habitat   2   18.2   9.109   1.481   0.23
Residuals            207 1273.6   6.153               
fish.alp_aov <- aov(Ohio.env.Div$fish.alp ~ Ohio.env.Div$Habitat)

summary(fish.alp_aov)
                      Df Sum Sq Mean Sq F value Pr(>F)
Ohio.env.Div$Habitat   2   15.4   7.687   2.206  0.113
Residuals            207  721.4   3.485               
distance_matrix<-vegdist(Ohio.env.Div[,10:10], method="bray", binary=FALSE)
adonis2(distance_matrix ~ Habitat, data=Ohio.env.Div)
Permutation test for adonis under reduced model
Permutation: free
Number of permutations: 999

adonis2(formula = distance_matrix ~ Habitat, data = Ohio.env.Div)
          Df SumOfSqs      R2      F Pr(>F)  
Model      2   0.1221 0.02272 2.4058  0.094 .
Residual 207   5.2533 0.97728                
Total    209   5.3754 1.00000                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
shannon_Tukey<-TukeyHSD(shannon_aov, conf.level=.95, ordered = TRUE)
shannon_Tukey
  Tukey multiple comparisons of means
    95% family-wise confidence level
    factor levels have been ordered

Fit: aov(formula = Ohio.env.Div$shannon ~ Ohio.env.Div$Habitat)

$`Ohio.env.Div$Habitat`
                          diff          lwr       upr     p adj
wet-mesic-dry-oak   0.14147731 -0.058161073 0.3411157 0.2180524
dry-mesic-dry-oak   0.20188576  0.007587024 0.3961845 0.0396316
dry-mesic-wet-mesic 0.06040845 -0.159546381 0.2803633 0.7935133
simpson_Tukey<-TukeyHSD(simpson_aov, conf.level=.95, ordered = TRUE)
simpson_Tukey
  Tukey multiple comparisons of means
    95% family-wise confidence level
    factor levels have been ordered

Fit: aov(formula = Ohio.env.Div$simpson ~ Ohio.env.Div$Habitat)

$`Ohio.env.Div$Habitat`
                          diff           lwr       upr     p adj
wet-mesic-dry-oak   0.04373077 -0.0269916799 0.1144532 0.3125264
dry-mesic-dry-oak   0.06936909  0.0005382234 0.1382000 0.0477573
dry-mesic-wet-mesic 0.02563832 -0.0522812927 0.1035579 0.7177126
inv.simpson_Tukey<-TukeyHSD(inv.simpson_aov, conf.level=.95, ordered = TRUE)
inv.simpson_Tukey 
  Tukey multiple comparisons of means
    95% family-wise confidence level
    factor levels have been ordered

Fit: aov(formula = Ohio.env.Div$inv.simpson ~ Ohio.env.Div$Habitat)

$`Ohio.env.Div$Habitat`
                          diff        lwr      upr     p adj
wet-mesic-dry-oak   0.06042921 -0.9317123 1.052571 0.9886676
dry-mesic-dry-oak   0.67188001 -0.2937251 1.637485 0.2301703
dry-mesic-wet-mesic 0.61145080 -0.4816572 1.704559 0.3853924
fish.alp_Tukey<-TukeyHSD(fish.alp_aov, conf.level=.95, ordered = TRUE)
fish.alp_Tukey
  Tukey multiple comparisons of means
    95% family-wise confidence level
    factor levels have been ordered

Fit: aov(formula = Ohio.env.Div$fish.alp ~ Ohio.env.Div$Habitat)

$`Ohio.env.Div$Habitat`
                           diff        lwr       upr     p adj
wet-mesic-dry-oak   0.538910024 -0.2077869 1.2856069 0.2061985
dry-mesic-dry-oak   0.547843742 -0.1788816 1.2745691 0.1789658
dry-mesic-wet-mesic 0.008933717 -0.8137517 0.8316192 0.9996378
shannon_Tukey_plot <- as.data.frame(shannon_Tukey$`Ohio.env.Div$Habitat`)

shannon_Tukey_plot$comparison <- rownames(shannon_Tukey_plot)

shannon_Tukey_plot
simpson_Tukey_plot <- as.data.frame(simpson_Tukey$`Ohio.env.Div$Habitat`)

simpson_Tukey_plot$comparison <- rownames(simpson_Tukey_plot)

simpson_Tukey_plot
inv.simpson_Tukey_plot <- as.data.frame(inv.simpson_Tukey$`Ohio.env.Div$Habitat`)

inv.simpson_Tukey_plot$comparison <- rownames(inv.simpson_Tukey_plot)

inv.simpson_Tukey_plot
NA
fish.alp_Tukey_plot <- as.data.frame(fish.alp_Tukey$`Ohio.env.Div$Habitat`)

fish.alp_Tukey_plot$comparison <- rownames(fish.alp_Tukey_plot)

fish.alp_Tukey_plot
shannon_Tukey_plot_result<-ggplot(shannon_Tukey_plot, aes(x = comparison, y = diff)) +
  geom_point() +
  geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.2) +
  labs(
    title = "Tukey HSD Test Results for Shannon Diversity",
    x = "Habitat Comparison",
    y = "Pairwise Difference in Mean"
  )

shannon_Tukey_plot_result

shannon_Tukey_plot_result_meandiff<-shannon_Tukey_plot_result + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  geom_hline(yintercept=0, linetype="dashed", color = "red")

shannon_Tukey_plot_result_meandiff

simpson_Tukey_plot_result<-ggplot(simpson_Tukey_plot, aes(x = comparison, y = diff)) +
  geom_point() +
  geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.2) +
  labs(
    title = "Tukey HSD Test Results for Simpson Diversity",
    x = "Habitat Comparison",
    y = "Pairwise Difference in Mean"
  )

simpson_Tukey_plot_result

simpson_Tukey_plot_result_meandiff<-simpson_Tukey_plot_result + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  geom_hline(yintercept=0, linetype="dashed", color = "red")

simpson_Tukey_plot_result_meandiff

inv.simpson_Tukey_plot_result<-ggplot(inv.simpson_Tukey_plot, aes(x = comparison, y = diff)) +
  geom_point() +
  geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.2) +
  labs(
    title = "Tukey HSD Test Results for inv.Simpson Diversity",
    x = "Habitat Comparison",
    y = "Pairwise Difference in Mean"
  )

inv.simpson_Tukey_plot_result

inv.simpson_Tukey_plot_result_meandiff<-inv.simpson_Tukey_plot_result + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  geom_hline(yintercept=0, linetype="dashed", color = "red")

inv.simpson_Tukey_plot_result_meandiff

fish.alp_Tukey_plot_result<-ggplot(fish.alp_Tukey_plot, aes(x = comparison, y = diff)) +
  geom_point() +
  geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.2) +
  labs(
    title = "Tukey HSD Test Results for fish alpha Diversity",
    x = "Habitat Comparison",
    y = "Pairwise Difference in Mean"
  )

fish.alp_Tukey_plot_result

fish.alp_Tukey_plot_result_meandiff<-fish.alp_Tukey_plot_result + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  geom_hline(yintercept=0, linetype="dashed", color = "red")

fish.alp_Tukey_plot_result_meandiff

grid.arrange(shannon_Tukey_plot_result_meandiff,Shanon.habitat,nrow=1, ncol=2)

grid.arrange(simpson_Tukey_plot_result_meandiff,Simp.habitat,nrow=1, ncol=2)

grid.arrange(inv.simpson_Tukey_plot_result_meandiff,InvSimp.habitat,nrow=1, ncol=2)

grid.arrange(fish.alp_Tukey_plot_result_meandiff,Fish.habitat,nrow=1, ncol=2)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkodmVnYW4pDQpgYGANCg0KYGBge3J9DQpiaXJkX09oaW8NCmBgYA0KDQpgYGB7cn0NCnNoYW5ub248LWRpdmVyc2l0eShiaXJkX09oaW8sIGluZGV4ID0gInNoYW5ub24iKQ0Kc2hhbm5vbg0KYGBgDQoNCmBgYHtyfQ0Kc2ltcHNvbjwtZGl2ZXJzaXR5KGJpcmRfT2hpbywgaW5kZXggPSAic2ltcHNvbiIpDQpzaW1wc29uDQpgYGANCg0KYGBge3J9DQppbnYuc2ltcHNvbjwtZGl2ZXJzaXR5KGJpcmRfT2hpbywgaW5kZXggPSAiaW52c2ltcHNvbiIpDQppbnYuc2ltcHNvbg0KYGBgDQoNCmBgYHtyfQ0KZmlzaC5hbHA8LWZpc2hlci5hbHBoYShiaXJkX09oaW8pDQpmaXNoLmFscA0KYGBgDQoNCmBgYHtyfQ0KRGl2LkluZDwtY2JpbmQuZGF0YS5mcmFtZShzaGFubm9uLCBzaW1wc29uLCBpbnYuc2ltcHNvbixmaXNoLmFscCkNCkRpdi5JbmQNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoRGl2LkluZCkNCmBgYA0KDQpgYGB7cn0NCmVudl9PaGlvDQpgYGANCg0KYGBge3J9DQpPaGlvLmVudi5EaXY8LWNiaW5kLmRhdGEuZnJhbWUoZW52X09oaW8sIERpdi5JbmQpDQpPaGlvLmVudi5EaXYNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoInJzdGF0aXgiKSANCmBgYA0KDQpgYGB7cn0NCk9oaW8uZW52LkRpdiAlPiUNCiAgZ3JvdXBfYnkoSGFiaXRhdCkgJT4lDQogIGdldF9zdW1tYXJ5X3N0YXRzKHNoYW5ub24sIHR5cGUgPSAibWVhbl9zZCIpDQpgYGANCg0KYGBge3J9DQpPaGlvLmVudi5EaXYgJT4lDQogIGdyb3VwX2J5KEhhYml0YXQpICU+JQ0KICBnZXRfc3VtbWFyeV9zdGF0cyhzaW1wc29uLCB0eXBlID0gIm1lYW5fc2QiKQ0KYGBgDQoNCmBgYHtyfQ0KT2hpby5lbnYuRGl2ICU+JQ0KICBncm91cF9ieShIYWJpdGF0KSAlPiUNCiAgZ2V0X3N1bW1hcnlfc3RhdHMoZmlzaC5hbHAsIHR5cGUgPSAibWVhbl9zZCIpDQpgYGANCg0KYGBge3J9DQpPaGlvLmVudi5EaXYgJT4lDQogIGdyb3VwX2J5KEhhYml0YXQpICU+JQ0KICBnZXRfc3VtbWFyeV9zdGF0cyhpbnYuc2ltcHNvbiwgdHlwZSA9ICJtZWFuX3NkIikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoImdncGxvdDIiKQ0KYGBgDQoNCmBgYHtyfQ0KU2hhbm9uLmhhYml0YXQ8LWdncGxvdChPaGlvLmVudi5EaXYsIGFlcyh4ID0gSGFiaXRhdCwgeSA9IHNoYW5ub24sIGZpbGwgPSBIYWJpdGF0KSkgKw0KICBnZW9tX2JveHBsb3QoKSArIA0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0yMSwgc2l6ZSA9IDMsIGNvbG91ciA9ICJibGFjayIsIGZpbGw9InllbGxvdyIpDQoNClNpbXAuaGFiaXRhdDwtZ2dwbG90KE9oaW8uZW52LkRpdiwgYWVzKHggPSBIYWJpdGF0LCB5ID0gc2ltcHNvbiwgZmlsbCA9IEhhYml0YXQpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9MjEsIHNpemUgPSAzLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsPSJ5ZWxsb3ciKQ0KDQpJbnZTaW1wLmhhYml0YXQ8LWdncGxvdChPaGlvLmVudi5EaXYsIGFlcyh4ID0gSGFiaXRhdCwgeSA9IGludi5zaW1wc29uLCBmaWxsID0gSGFiaXRhdCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgICsgDQogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPTIxLCBzaXplID0gMywgY29sb3VyID0gImJsYWNrIiwgZmlsbD0ieWVsbG93IikNCg0KRmlzaC5oYWJpdGF0PC1nZ3Bsb3QoT2hpby5lbnYuRGl2LCBhZXMoeCA9IEhhYml0YXQsIHkgPSBmaXNoLmFscCwgZmlsbCA9IEhhYml0YXQpKSArDQogIGdlb21fYm94cGxvdCgpICArIA0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0yMSwgc2l6ZSA9IDMsIGNvbG91ciA9ICJibGFjayIsIGZpbGw9InllbGxvdyIpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KCJncmlkRXh0cmEiKQ0KZ3JpZC5hcnJhbmdlKFNoYW5vbi5oYWJpdGF0LCBTaW1wLmhhYml0YXQsIEludlNpbXAuaGFiaXRhdCwgRmlzaC5oYWJpdGF0LA0KICAgICAgICAgICAgIG5yb3c9MiwgbmNvbD0yKSANCmBgYA0KDQpgYGB7ciBmaWcud2lkdGg9MTAgLCBmaWcuaGVpZ2h0PTd9DQpncmlkLmFycmFuZ2UoU2hhbm9uLmhhYml0YXQsIFNpbXAuaGFiaXRhdCwgSW52U2ltcC5oYWJpdGF0LCBGaXNoLmhhYml0YXQsIG5yb3c9MiwgbmNvbD0yKSANCmBgYA0KDQpgYGB7cn0NCnNoYW5ub25fYW92IDwtIGFvdihPaGlvLmVudi5EaXYkc2hhbm5vbiB+IE9oaW8uZW52LkRpdiRIYWJpdGF0KQ0KDQpzdW1tYXJ5KHNoYW5ub25fYW92KQ0KYGBgDQoNCmBgYHtyfQ0Kc2ltcHNvbl9hb3YgPC0gYW92KE9oaW8uZW52LkRpdiRzaW1wc29uIH4gT2hpby5lbnYuRGl2JEhhYml0YXQpDQoNCnN1bW1hcnkoc2ltcHNvbl9hb3YpDQpgYGANCg0KYGBge3J9DQppbnYuc2ltcHNvbl9hb3YgPC0gYW92KE9oaW8uZW52LkRpdiRpbnYuc2ltcHNvbiB+IE9oaW8uZW52LkRpdiRIYWJpdGF0KQ0KDQpzdW1tYXJ5KGludi5zaW1wc29uX2FvdikNCmBgYA0KDQpgYGB7cn0NCmZpc2guYWxwX2FvdiA8LSBhb3YoT2hpby5lbnYuRGl2JGZpc2guYWxwIH4gT2hpby5lbnYuRGl2JEhhYml0YXQpDQoNCnN1bW1hcnkoZmlzaC5hbHBfYW92KQ0KYGBgDQoNCmBgYHtyfQ0KZGlzdGFuY2VfbWF0cml4PC12ZWdkaXN0KE9oaW8uZW52LkRpdlssMTA6MTBdLCBtZXRob2Q9ImJyYXkiLCBiaW5hcnk9RkFMU0UpDQpgYGANCg0KYGBge3J9DQphZG9uaXMyKGRpc3RhbmNlX21hdHJpeCB+IEhhYml0YXQsIGRhdGE9T2hpby5lbnYuRGl2KQ0KYGBgDQoNCmBgYHtyfQ0Kc2hhbm5vbl9UdWtleTwtVHVrZXlIU0Qoc2hhbm5vbl9hb3YsIGNvbmYubGV2ZWw9Ljk1LCBvcmRlcmVkID0gVFJVRSkNCnNoYW5ub25fVHVrZXkNCmBgYA0KDQpgYGB7cn0NCnNpbXBzb25fVHVrZXk8LVR1a2V5SFNEKHNpbXBzb25fYW92LCBjb25mLmxldmVsPS45NSwgb3JkZXJlZCA9IFRSVUUpDQpzaW1wc29uX1R1a2V5DQpgYGANCg0KYGBge3J9DQppbnYuc2ltcHNvbl9UdWtleTwtVHVrZXlIU0QoaW52LnNpbXBzb25fYW92LCBjb25mLmxldmVsPS45NSwgb3JkZXJlZCA9IFRSVUUpDQppbnYuc2ltcHNvbl9UdWtleSANCmBgYA0KDQpgYGB7cn0NCmZpc2guYWxwX1R1a2V5PC1UdWtleUhTRChmaXNoLmFscF9hb3YsIGNvbmYubGV2ZWw9Ljk1LCBvcmRlcmVkID0gVFJVRSkNCmZpc2guYWxwX1R1a2V5DQpgYGANCg0KYGBge3J9DQpzaGFubm9uX1R1a2V5X3Bsb3QgPC0gYXMuZGF0YS5mcmFtZShzaGFubm9uX1R1a2V5JGBPaGlvLmVudi5EaXYkSGFiaXRhdGApDQoNCnNoYW5ub25fVHVrZXlfcGxvdCRjb21wYXJpc29uIDwtIHJvd25hbWVzKHNoYW5ub25fVHVrZXlfcGxvdCkNCg0Kc2hhbm5vbl9UdWtleV9wbG90DQpgYGANCg0KYGBge3J9DQpzaW1wc29uX1R1a2V5X3Bsb3QgPC0gYXMuZGF0YS5mcmFtZShzaW1wc29uX1R1a2V5JGBPaGlvLmVudi5EaXYkSGFiaXRhdGApDQoNCnNpbXBzb25fVHVrZXlfcGxvdCRjb21wYXJpc29uIDwtIHJvd25hbWVzKHNpbXBzb25fVHVrZXlfcGxvdCkNCg0Kc2ltcHNvbl9UdWtleV9wbG90DQpgYGANCg0KYGBge3J9DQppbnYuc2ltcHNvbl9UdWtleV9wbG90IDwtIGFzLmRhdGEuZnJhbWUoaW52LnNpbXBzb25fVHVrZXkkYE9oaW8uZW52LkRpdiRIYWJpdGF0YCkNCg0KaW52LnNpbXBzb25fVHVrZXlfcGxvdCRjb21wYXJpc29uIDwtIHJvd25hbWVzKGludi5zaW1wc29uX1R1a2V5X3Bsb3QpDQoNCmludi5zaW1wc29uX1R1a2V5X3Bsb3QNCg0KYGBgDQoNCmBgYHtyfQ0KZmlzaC5hbHBfVHVrZXlfcGxvdCA8LSBhcy5kYXRhLmZyYW1lKGZpc2guYWxwX1R1a2V5JGBPaGlvLmVudi5EaXYkSGFiaXRhdGApDQoNCmZpc2guYWxwX1R1a2V5X3Bsb3QkY29tcGFyaXNvbiA8LSByb3duYW1lcyhmaXNoLmFscF9UdWtleV9wbG90KQ0KDQpmaXNoLmFscF9UdWtleV9wbG90DQpgYGANCg0KYGBge3J9DQpzaGFubm9uX1R1a2V5X3Bsb3RfcmVzdWx0PC1nZ3Bsb3Qoc2hhbm5vbl9UdWtleV9wbG90LCBhZXMoeCA9IGNvbXBhcmlzb24sIHkgPSBkaWZmKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbHdyLCB5bWF4ID0gdXByKSwgd2lkdGggPSAwLjIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUdWtleSBIU0QgVGVzdCBSZXN1bHRzIGZvciBTaGFubm9uIERpdmVyc2l0eSIsDQogICAgeCA9ICJIYWJpdGF0IENvbXBhcmlzb24iLA0KICAgIHkgPSAiUGFpcndpc2UgRGlmZmVyZW5jZSBpbiBNZWFuIg0KICApDQoNCnNoYW5ub25fVHVrZXlfcGxvdF9yZXN1bHQNCmBgYA0KDQpgYGB7cn0NCnNoYW5ub25fVHVrZXlfcGxvdF9yZXN1bHRfbWVhbmRpZmY8LXNoYW5ub25fVHVrZXlfcGxvdF9yZXN1bHQgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKQ0KDQpzaGFubm9uX1R1a2V5X3Bsb3RfcmVzdWx0X21lYW5kaWZmDQpgYGANCg0KYGBge3J9DQpzaW1wc29uX1R1a2V5X3Bsb3RfcmVzdWx0PC1nZ3Bsb3Qoc2ltcHNvbl9UdWtleV9wbG90LCBhZXMoeCA9IGNvbXBhcmlzb24sIHkgPSBkaWZmKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbHdyLCB5bWF4ID0gdXByKSwgd2lkdGggPSAwLjIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUdWtleSBIU0QgVGVzdCBSZXN1bHRzIGZvciBTaW1wc29uIERpdmVyc2l0eSIsDQogICAgeCA9ICJIYWJpdGF0IENvbXBhcmlzb24iLA0KICAgIHkgPSAiUGFpcndpc2UgRGlmZmVyZW5jZSBpbiBNZWFuIg0KICApDQoNCnNpbXBzb25fVHVrZXlfcGxvdF9yZXN1bHQNCmBgYA0KDQpgYGB7cn0NCnNpbXBzb25fVHVrZXlfcGxvdF9yZXN1bHRfbWVhbmRpZmY8LXNpbXBzb25fVHVrZXlfcGxvdF9yZXN1bHQgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKQ0KDQpzaW1wc29uX1R1a2V5X3Bsb3RfcmVzdWx0X21lYW5kaWZmDQpgYGANCg0KYGBge3J9DQppbnYuc2ltcHNvbl9UdWtleV9wbG90X3Jlc3VsdDwtZ2dwbG90KGludi5zaW1wc29uX1R1a2V5X3Bsb3QsIGFlcyh4ID0gY29tcGFyaXNvbiwgeSA9IGRpZmYpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsd3IsIHltYXggPSB1cHIpLCB3aWR0aCA9IDAuMikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlR1a2V5IEhTRCBUZXN0IFJlc3VsdHMgZm9yIGludi5TaW1wc29uIERpdmVyc2l0eSIsDQogICAgeCA9ICJIYWJpdGF0IENvbXBhcmlzb24iLA0KICAgIHkgPSAiUGFpcndpc2UgRGlmZmVyZW5jZSBpbiBNZWFuIg0KICApDQoNCmludi5zaW1wc29uX1R1a2V5X3Bsb3RfcmVzdWx0DQpgYGANCg0KYGBge3J9DQppbnYuc2ltcHNvbl9UdWtleV9wbG90X3Jlc3VsdF9tZWFuZGlmZjwtaW52LnNpbXBzb25fVHVrZXlfcGxvdF9yZXN1bHQgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKQ0KDQppbnYuc2ltcHNvbl9UdWtleV9wbG90X3Jlc3VsdF9tZWFuZGlmZg0KYGBgDQoNCmBgYHtyfQ0KZmlzaC5hbHBfVHVrZXlfcGxvdF9yZXN1bHQ8LWdncGxvdChmaXNoLmFscF9UdWtleV9wbG90LCBhZXMoeCA9IGNvbXBhcmlzb24sIHkgPSBkaWZmKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbHdyLCB5bWF4ID0gdXByKSwgd2lkdGggPSAwLjIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUdWtleSBIU0QgVGVzdCBSZXN1bHRzIGZvciBmaXNoIGFscGhhIERpdmVyc2l0eSIsDQogICAgeCA9ICJIYWJpdGF0IENvbXBhcmlzb24iLA0KICAgIHkgPSAiUGFpcndpc2UgRGlmZmVyZW5jZSBpbiBNZWFuIg0KICApDQoNCmZpc2guYWxwX1R1a2V5X3Bsb3RfcmVzdWx0DQpgYGANCg0KYGBge3J9DQpmaXNoLmFscF9UdWtleV9wbG90X3Jlc3VsdF9tZWFuZGlmZjwtZmlzaC5hbHBfVHVrZXlfcGxvdF9yZXN1bHQgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKQ0KDQpmaXNoLmFscF9UdWtleV9wbG90X3Jlc3VsdF9tZWFuZGlmZg0KDQpgYGANCg0KYGBge3IgZmlnLndpZHRoPTEwICwgZmlnLmhlaWdodD02fQ0KZ3JpZC5hcnJhbmdlKHNoYW5ub25fVHVrZXlfcGxvdF9yZXN1bHRfbWVhbmRpZmYsU2hhbm9uLmhhYml0YXQsbnJvdz0xLCBuY29sPTIpDQpgYGANCg0KYGBge3IgZmlnLndpZHRoPTEwICwgZmlnLmhlaWdodD02fQ0KZ3JpZC5hcnJhbmdlKHNpbXBzb25fVHVrZXlfcGxvdF9yZXN1bHRfbWVhbmRpZmYsU2ltcC5oYWJpdGF0LG5yb3c9MSwgbmNvbD0yKQ0KYGBgDQoNCmBgYHtyIGZpZy53aWR0aD0xMCAsIGZpZy5oZWlnaHQ9Nn0NCmdyaWQuYXJyYW5nZShpbnYuc2ltcHNvbl9UdWtleV9wbG90X3Jlc3VsdF9tZWFuZGlmZixJbnZTaW1wLmhhYml0YXQsbnJvdz0xLCBuY29sPTIpDQpgYGANCg0KYGBge3IgZmlnLndpZHRoPTEwICwgZmlnLmhlaWdodD02fQ0KZ3JpZC5hcnJhbmdlKGZpc2guYWxwX1R1a2V5X3Bsb3RfcmVzdWx0X21lYW5kaWZmLEZpc2guaGFiaXRhdCxucm93PTEsIG5jb2w9MikNCmBgYA0K