Pacotes necessários

library(sf)
Warning: package ‘sf’ was built under R version 4.3.3Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(dplyr)
Warning: package ‘dplyr’ was built under R version 4.3.3
Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(readr)
Warning: package ‘readr’ was built under R version 4.3.3
library(spatstat.geom)
Warning: package ‘spatstat.geom’ was built under R version 4.3.3Carregando pacotes exigidos: spatstat.data
Warning: package ‘spatstat.data’ was built under R version 4.3.3Carregando pacotes exigidos: spatstat.univar
Warning: package ‘spatstat.univar’ was built under R version 4.3.3spatstat.univar 3.1-2
spatstat.geom 3.3-6
library(spatstat.explore)
Warning: package ‘spatstat.explore’ was built under R version 4.3.3Carregando pacotes exigidos: spatstat.random
Warning: package ‘spatstat.random’ was built under R version 4.3.3spatstat.random 3.3-2
Carregando pacotes exigidos: nlme

Attaching package: ‘nlme’

The following object is masked from ‘package:dplyr’:

    collapse

spatstat.explore 3.4-2
library(spatstat.random)
library(ggplot2)
library(purrr)

1- Importar dados

grid = st_read("C:/Users/Samsung/OneDrive/Documentos/1 - PósDoc/2 - FAPESP - Silvipastoril/3 - Execução/Dados/Fase 1/Distribuição/grid_20x20_singlepart.geojson")
Reading layer `grid_20x20_singlepart' from data source 
  `C:\Users\Samsung\OneDrive\Documentos\1 - PósDoc\2 - FAPESP - Silvipastoril\3 - Execução\Dados\Fase 1\Distribuição\grid_20x20_singlepart.geojson' 
  using driver `GeoJSON'
Simple feature collection with 3550 features and 2 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 676072.3 ymin: 8868882 xmax: 678343.2 ymax: 8870838
Projected CRS: WGS 84 / UTM zone 21S
View(grid)

Piquetes = st_read("C:/Users/Samsung/OneDrive/Documentos/1 - PósDoc/2 - FAPESP - Silvipastoril/3 - Execução/Dados/Fase 1/Densidade/Poligono_piquetes.geojson")
Reading layer `Poligono_piquetes' from data source 
  `C:\Users\Samsung\OneDrive\Documentos\1 - PósDoc\2 - FAPESP - Silvipastoril\3 - Execução\Dados\Fase 1\Densidade\Poligono_piquetes.geojson' 
  using driver `GeoJSON'
Simple feature collection with 122 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XYZ
Bounding box:  xmin: 676096.9 ymin: 8868829 xmax: 678333.3 ymax: 8870821
z_range:       zmin: 0 zmax: 0
Projected CRS: WGS 84 / UTM zone 21S
View(Piquetes)

pontos = read_csv("C:/Users/Samsung/OneDrive/Documentos/1 - PósDoc/2 - FAPESP - Silvipastoril/3 - Execução/Dados/Fase 1/Especies_QGIS.csv")
Rows: 2457 Columns: 7── Column specification ──────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Espécie
dbl (6): N, Piquete, LAT, LONG, LONG1, LAT1
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
pontos

copas = st_read("C:/Users/Samsung/OneDrive/Documentos/1 - PósDoc/2 - FAPESP - Silvipastoril/3 - Execução/Dados/Fase 1/GRIDs/Grids Sombreados.shp")
Reading layer `Grids Sombreados' from data source 
  `C:\Users\Samsung\OneDrive\Documentos\1 - PósDoc\2 - FAPESP - Silvipastoril\3 - Execução\Dados\Fase 1\GRIDs\Grids Sombreados.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 3550 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 676072.3 ymin: 8868882 xmax: 678343.2 ymax: 8870838
Projected CRS: WGS 84 / UTM zone 21S
copas  
Simple feature collection with 3550 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 676072.3 ymin: 8868882 xmax: 678343.2 ymax: 8870838
Projected CRS: WGS 84 / UTM zone 21S
First 10 features:
   area ID.Grid Área.sem Área.somb X..N..Sombr X.Sombreada                       geometry
1   400       1  400.000     0.000     100.000       0.000 MULTIPOLYGON (((677185.1 88...
2   400       2  400.000     0.000     100.000       0.000 MULTIPOLYGON (((677173.6 88...
3   400       3  400.000     0.000     100.000       0.000 MULTIPOLYGON (((677162.1 88...
4   400       4  400.000     0.000     100.000       0.000 MULTIPOLYGON (((677150.6 88...
5   400       5  400.000     0.000     100.000       0.000 MULTIPOLYGON (((677139.2 88...
6   400       6  400.000     0.000     100.000       0.000 MULTIPOLYGON (((677127.7 88...
7   400       7  382.960    17.040      95.740       4.260 MULTIPOLYGON (((677132.6 88...
8   400       8  358.073    41.927      89.518      10.482 MULTIPOLYGON (((677109.2 88...
9   400       9  396.272     3.728      99.068       0.932 MULTIPOLYGON (((677097.9 88...
10  400      10  383.605    16.395      95.901       4.099 MULTIPOLYGON (((677098.2 88...
grids_selecionados = read_csv("C:/Users/Samsung/OneDrive/Documentos/1 - PósDoc/2 - FAPESP - Silvipastoril/3 - Execução/Dados/Fase 1/Densidade/Grids_selecionados.csv")
Rows: 40 Columns: 5── Column specification ──────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): Densidade, Densidade real
dbl (3): Piquete, Grid, Rep
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(grids_selecionados)

2- Converter pontos para objeto sf e plotar

pontos_sf <- st_as_sf(pontos, coords = c("LONG1", "LAT1"), crs = 4326)
pontos_sf <- st_transform(pontos_sf, crs = st_crs(grid))
copas <- st_transform(copas, st_crs(grid))
area_sombreada_real = st_difference(grid, st_union(copas))
Warning: attribute variables are assumed to be spatially constant throughout all geometries
plot1=ggplot() +
  geom_sf(data = grid, fill = NA, color = "black") +
  geom_sf(data = pontos_sf, color = "red", size = 1) +
  theme_minimal() +
  labs(title = "Pontos de árvores sobre o grid 20x20 m")
plot1


plot2 = ggplot() +
  geom_sf(data = grid, fill = NA, color = "black", size=0.2) +
  geom_sf(data = area_sombreada_real, fill = "darkgreen", color = NA, alpha = 0.7) +
  theme_minimal() +
  labs(title = "Áreas reais ocupadas por copa dentro do grid 20x20 m")
plot2

Aparentemente deu tudo certo com os grids e com as coordenadas

3 - Densidade arborea

# 1. Gerar as novas geometrias invertidas (sombra real)
geometrias_corrigidas <- map2(st_geometry(grid), st_geometry(copas), st_difference)

# 2. Substituir a geometria no objeto copas1
copas1 <- copas
st_geometry(copas1) <- st_sfc(geometrias_corrigidas, crs = st_crs(copas))

# 3. Verificar quais ficaram vazias e substituir pela geometria original
geometrias_vazias <- st_is_empty(copas1)
st_geometry(copas1)[geometrias_vazias] <- st_geometry(grid)[geometrias_vazias]
View(copas1)

copas_classificado <- copas1 %>%
  mutate(classe_sombra = case_when(
    X.Sombreada <= 8 ~ "0 a 8%",
    X.Sombreada > 8.01 & X.Sombreada <= 16 ~ "8 a 16%",
    X.Sombreada > 16.01 & X.Sombreada <= 24 ~ "16 a 24%",
    X.Sombreada > 24 ~ "> 24%"
  ))
View(copas_classificado)

st_write(copas_classificado, "copas_classificado_sombra.gpkg", layer = "copas_sombra", delete_layer = TRUE)
Deleting layer `copas_sombra' using driver `GPKG'
Writing layer `copas_sombra' to data source `copas_classificado_sombra.gpkg' using driver `GPKG'
Writing 3550 features with 7 fields and geometry type Unknown (any).
#Plot
p2=ggplot(copas_classificado) +
  geom_sf(aes(fill = classe_sombra), color = "gray30", size = 0.1) +
  scale_fill_manual(values = c("0 a 8%" = "lightgray","8 a 16%" = "gold","16 a 24%" = "orange","> 24%" = "darkgreen"),name = "Porcentagem de Sombra") + theme_minimal() +
  labs(title = "Classificação dos Grids por Área Sombreada (%)",x = NULL, y = NULL) +
  theme(legend.position = "right",plot.title = element_text(size = 14, face = "bold"))
p2

8 - Filtrar grids e piquetes

st_write(pontos_clean, "pontos_filtrados.shp")
Warning: Field names abbreviated for ESRI Shapefile driver
Layer pontos_filtrados in dataset pontos_filtrados.shp already exists:
use either append=TRUE to append to layer or append=FALSE to overwrite layer
Erro: Dataset already exists.
LS0tDQp0aXRsZTogIkFuw6FsaXNlIGRhIGRlbnNpZGFkZSBkYXMgw6Fydm9yZXMgY29uc2lkZXJhbmRvIMOhcmVhIGRlIGNvcGEiDQphdXRob3I6ICJWYWduZXIgT3ZhbmkiDQpkYXRlOiAiMjAvMDUvMjAyNSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZGVwdGg6IDINCiAgICB0aGVtZTogdW5pdGVkDQotLS0NCg0KIyAqUGFjb3RlcyBuZWNlc3PDoXJpb3MqDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShzcGF0c3RhdC5nZW9tKQ0KbGlicmFyeShzcGF0c3RhdC5leHBsb3JlKQ0KbGlicmFyeShzcGF0c3RhdC5yYW5kb20pDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHB1cnJyKQ0KYGBgDQoNCiMgKjEtIEltcG9ydGFyIGRhZG9zKg0KDQpgYGB7cn0NCmdyaWQgPSBzdF9yZWFkKCJDOi9Vc2Vycy9TYW1zdW5nL09uZURyaXZlL0RvY3VtZW50b3MvMSAtIFDDs3NEb2MvMiAtIEZBUEVTUCAtIFNpbHZpcGFzdG9yaWwvMyAtIEV4ZWN1w6fDo28vRGFkb3MvRmFzZSAxL0Rpc3RyaWJ1acOnw6NvL2dyaWRfMjB4MjBfc2luZ2xlcGFydC5nZW9qc29uIikNClZpZXcoZ3JpZCkNCg0KUGlxdWV0ZXMgPSBzdF9yZWFkKCJDOi9Vc2Vycy9TYW1zdW5nL09uZURyaXZlL0RvY3VtZW50b3MvMSAtIFDDs3NEb2MvMiAtIEZBUEVTUCAtIFNpbHZpcGFzdG9yaWwvMyAtIEV4ZWN1w6fDo28vRGFkb3MvRmFzZSAxL0RlbnNpZGFkZS9Qb2xpZ29ub19waXF1ZXRlcy5nZW9qc29uIikNClZpZXcoUGlxdWV0ZXMpDQoNCnBvbnRvcyA9IHJlYWRfY3N2KCJDOi9Vc2Vycy9TYW1zdW5nL09uZURyaXZlL0RvY3VtZW50b3MvMSAtIFDDs3NEb2MvMiAtIEZBUEVTUCAtIFNpbHZpcGFzdG9yaWwvMyAtIEV4ZWN1w6fDo28vRGFkb3MvRmFzZSAxL0VzcGVjaWVzX1FHSVMuY3N2IikNCnBvbnRvcw0KDQpjb3BhcyA9IHN0X3JlYWQoIkM6L1VzZXJzL1NhbXN1bmcvT25lRHJpdmUvRG9jdW1lbnRvcy8xIC0gUMOzc0RvYy8yIC0gRkFQRVNQIC0gU2lsdmlwYXN0b3JpbC8zIC0gRXhlY3XDp8Ojby9EYWRvcy9GYXNlIDEvR1JJRHMvR3JpZHMgU29tYnJlYWRvcy5zaHAiKQ0KY29wYXMgIA0KDQpncmlkc19zZWxlY2lvbmFkb3MgPSByZWFkX2NzdigiQzovVXNlcnMvU2Ftc3VuZy9PbmVEcml2ZS9Eb2N1bWVudG9zLzEgLSBQw7NzRG9jLzIgLSBGQVBFU1AgLSBTaWx2aXBhc3RvcmlsLzMgLSBFeGVjdcOnw6NvL0RhZG9zL0Zhc2UgMS9EZW5zaWRhZGUvR3JpZHNfc2VsZWNpb25hZG9zLmNzdiIpDQpWaWV3KGdyaWRzX3NlbGVjaW9uYWRvcykNCmBgYA0KDQojICoyLSBDb252ZXJ0ZXIgcG9udG9zIHBhcmEgb2JqZXRvIHNmIGUgcGxvdGFyKg0KDQpgYGB7cn0NCnBvbnRvc19zZiA8LSBzdF9hc19zZihwb250b3MsIGNvb3JkcyA9IGMoIkxPTkcxIiwgIkxBVDEiKSwgY3JzID0gNDMyNikNCnBvbnRvc19zZiA8LSBzdF90cmFuc2Zvcm0ocG9udG9zX3NmLCBjcnMgPSBzdF9jcnMoZ3JpZCkpDQpjb3BhcyA8LSBzdF90cmFuc2Zvcm0oY29wYXMsIHN0X2NycyhncmlkKSkNCmFyZWFfc29tYnJlYWRhX3JlYWwgPSBzdF9kaWZmZXJlbmNlKGdyaWQsIHN0X3VuaW9uKGNvcGFzKSkNCg0KcGxvdDE9Z2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBncmlkLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBwb250b3Nfc2YsIGNvbG9yID0gInJlZCIsIHNpemUgPSAxKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiUG9udG9zIGRlIMOhcnZvcmVzIHNvYnJlIG8gZ3JpZCAyMHgyMCBtIikNCnBsb3QxDQoNCnBsb3QyID0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBncmlkLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjIpICsNCiAgZ2VvbV9zZihkYXRhID0gYXJlYV9zb21icmVhZGFfcmVhbCwgZmlsbCA9ICJkYXJrZ3JlZW4iLCBjb2xvciA9IE5BLCBhbHBoYSA9IDAuNykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIsOBcmVhcyByZWFpcyBvY3VwYWRhcyBwb3IgY29wYSBkZW50cm8gZG8gZ3JpZCAyMHgyMCBtIikNCnBsb3QyDQpgYGANCj5BcGFyZW50ZW1lbnRlIGRldSB0dWRvIGNlcnRvIGNvbSBvcyBncmlkcyBlIGNvbSBhcyBjb29yZGVuYWRhcyANCg0KDQojICozIC0gRGVuc2lkYWRlIGFyYm9yZWEqDQoNCmBgYHtyfQ0KIyAxLiBHZXJhciBhcyBub3ZhcyBnZW9tZXRyaWFzIGludmVydGlkYXMgKHNvbWJyYSByZWFsKQ0KZ2VvbWV0cmlhc19jb3JyaWdpZGFzIDwtIG1hcDIoc3RfZ2VvbWV0cnkoZ3JpZCksIHN0X2dlb21ldHJ5KGNvcGFzKSwgc3RfZGlmZmVyZW5jZSkNCg0KIyAyLiBTdWJzdGl0dWlyIGEgZ2VvbWV0cmlhIG5vIG9iamV0byBjb3BhczENCmNvcGFzMSA8LSBjb3Bhcw0Kc3RfZ2VvbWV0cnkoY29wYXMxKSA8LSBzdF9zZmMoZ2VvbWV0cmlhc19jb3JyaWdpZGFzLCBjcnMgPSBzdF9jcnMoY29wYXMpKQ0KDQojIDMuIFZlcmlmaWNhciBxdWFpcyBmaWNhcmFtIHZhemlhcyBlIHN1YnN0aXR1aXIgcGVsYSBnZW9tZXRyaWEgb3JpZ2luYWwNCmdlb21ldHJpYXNfdmF6aWFzIDwtIHN0X2lzX2VtcHR5KGNvcGFzMSkNCnN0X2dlb21ldHJ5KGNvcGFzMSlbZ2VvbWV0cmlhc192YXppYXNdIDwtIHN0X2dlb21ldHJ5KGdyaWQpW2dlb21ldHJpYXNfdmF6aWFzXQ0KVmlldyhjb3BhczEpDQoNCmNvcGFzX2NsYXNzaWZpY2FkbyA8LSBjb3BhczEgJT4lDQogIG11dGF0ZShjbGFzc2Vfc29tYnJhID0gY2FzZV93aGVuKA0KICAgIFguU29tYnJlYWRhIDw9IDggfiAiMCBhIDglIiwNCiAgICBYLlNvbWJyZWFkYSA+IDguMDEgJiBYLlNvbWJyZWFkYSA8PSAxNiB+ICI4IGEgMTYlIiwNCiAgICBYLlNvbWJyZWFkYSA+IDE2LjAxICYgWC5Tb21icmVhZGEgPD0gMjQgfiAiMTYgYSAyNCUiLA0KICAgIFguU29tYnJlYWRhID4gMjQgfiAiPiAyNCUiDQogICkpDQpWaWV3KGNvcGFzX2NsYXNzaWZpY2FkbykNCg0Kc3Rfd3JpdGUoY29wYXNfY2xhc3NpZmljYWRvLCAiY29wYXNfY2xhc3NpZmljYWRvX3NvbWJyYS5ncGtnIiwgbGF5ZXIgPSAiY29wYXNfc29tYnJhIiwgZGVsZXRlX2xheWVyID0gVFJVRSkNCg0KI1Bsb3QNCnAyPWdncGxvdChjb3Bhc19jbGFzc2lmaWNhZG8pICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGNsYXNzZV9zb21icmEpLCBjb2xvciA9ICJncmF5MzAiLCBzaXplID0gMC4xKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIjAgYSA4JSIgPSAibGlnaHRncmF5IiwiOCBhIDE2JSIgPSAiZ29sZCIsIjE2IGEgMjQlIiA9ICJvcmFuZ2UiLCI+IDI0JSIgPSAiZGFya2dyZWVuIiksbmFtZSA9ICJQb3JjZW50YWdlbSBkZSBTb21icmEiKSArIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQ2xhc3NpZmljYcOnw6NvIGRvcyBHcmlkcyBwb3Igw4FyZWEgU29tYnJlYWRhICglKSIseCA9IE5VTEwsIHkgPSBOVUxMKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIscGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpKQ0KcDINCmBgYA0KDQojICo4IC0gRmlsdHJhciBncmlkcyBlIHBpcXVldGVzKg0KDQpgYGB7cn0NCmlkc19kZXNlamFkb3MgPSBjKDE3ODQsMTY1OCwxNzIyLDE1MzMsMTIyNSwxMjI0LDExMjYsMTQwNCwxNTI4LDEzMTQsMTM5OSwxNDAwLDExMTUsMTIxMyw5NTQsMTExNCw5NDgsNjE0LDcwNCw2MTMsMzQ4NSwzNTEwLDM0ODQsMzQ4NywzNTI5LDM0NTIsMzQ3OSwzNDgwLDM1MjgsMzQ0OCwzNDQ5LDM0MjIsMzM0OSwzNDAzLDMzNTIsMzM3OCwzNDk1LDM0OTQsMzQ0NCwzMzY2KQ0KDQpQaXF1ZXRlc19kZXNlamFkb3MgPSBjKDk1LDk4LDg5LDg4LDg3LDMsMiwxMCw0LDExKQ0KDQojIEZpbHRyYXIgZ3JpZHMgcGVsb3MgSURzDQpncmlkc19maWx0cmFkb3MgPSBncmlkW2dyaWQkSUQuR3JpZCAlaW4lIGlkc19kZXNlamFkb3MsIF0NCmdyaWRzX2ZpbHRyYWRvcw0KDQojIEZpbHRyYXIgcGlxdWV0ZXMgcGVsb3MgSURzDQpQaXF1ZXRlc19maWx0cmFkb3MgPSBQaXF1ZXRlc1tQaXF1ZXRlcyRQaXF1ZXRlICVpbiUgUGlxdWV0ZXNfZGVzZWphZG9zLCBdDQpQaXF1ZXRlc19maWx0cmFkb3MNCnBpcXVldGVzX2NsZWFuID0gc3Rfem0oUGlxdWV0ZXNfZmlsdHJhZG9zKQ0Kc3Rfd3JpdGUocGlxdWV0ZXNfY2xlYW4sICJwaXF1ZXRlc19maWx0cmFkb3Muc2hwIikNCg0KIyBHYXJhbnRpciBxdWUgYSBjb2x1bmEgdGVuaGEgbyBtZXNtbyBub21lIGUgdGlwbw0KZGZfaW5mbyA9IGdyaWRzX3NlbGVjaW9uYWRvcyAlPiUNCiAgcmVuYW1lKElELkdyaWQgPSBHcmlkKQ0KZGZfaW5mbw0KDQojIEp1bnRhciBvcyBkYWRvcyAoam9pbiBwZWxhIGNvbHVuYSBJRC5HcmlkKQ0Kc2ZfY29tcGxldG8gPSBsZWZ0X2pvaW4oZ3JpZHNfZmlsdHJhZG9zLCBkZl9pbmZvLCBieSA9ICJJRC5HcmlkIikNCnNmX2NvbXBsZXRvDQoNCiMgSW50ZXJzZcOnw6NvIGVzcGFjaWFsIChtYW50w6ltIGFwZW5hcyBvIHF1ZSBlc3TDoSBkZW50cm8gZG9zIGdyaWRzIHNlbGVjaW9uYWRvcykNCmNvcGFzX2ZpbHRyYWRhcyA9IHN0X2ludGVyc2VjdGlvbihjb3BhczEsIHNmX2NvbXBsZXRvKQ0KY29wYXNfZmlsdHJhZGFzIA0KcG9udG9zX2ZpbHRyYWRvcyA9IHN0X2ludGVyc2VjdGlvbihwb250b3Nfc2YsIHNmX2NvbXBsZXRvKQ0KcG9udG9zX2ZpbHRyYWRvcw0KR3JpZHNfZmlsdHJhZG9zID0gc3RfaW50ZXJzZWN0aW9uKGdyaWQsIFBpcXVldGVzX2ZpbHRyYWRvcykNCkdyaWRzX2ZpbHRyYWRvcw0KDQpHcmlkc19jbGVhbiA9IHN0X3ptKEdyaWRzX2ZpbHRyYWRvcykNCnN0X3dyaXRlKEdyaWRzX2NsZWFuLCJHcmlkc19maWx0cmFkb3Muc2hwIikNCg0KY29wYXNfY2xlYW4gPSBzdF9jb2xsZWN0aW9uX2V4dHJhY3QoY29wYXNfZmlsdHJhZGFzLCAiUE9MWUdPTiIpDQpzdF93cml0ZShjb3Bhc19jbGVhbiwgImNvcGFzX2ZpbHRyYWRhcy5zaHAiKQ0KDQpwb250b3NfY2xlYW4gPSBzdF9jb2xsZWN0aW9uX2V4dHJhY3QocG9udG9zX2ZpbHRyYWRvcywgIlBPSU5UIikNCnN0X3dyaXRlKHBvbnRvc19jbGVhbiwgInBvbnRvc19maWx0cmFkb3Muc2hwIikNCmBgYA0KDQoNCg==