From 3b1d41444ca1083bf9ab6d806b72a38bbaecc82b Mon Sep 17 00:00:00 2001 From: Jakob Date: Mon, 22 Jan 2024 11:27:14 +0100 Subject: [PATCH 1/3] Remove NAs if present --- R/jsd_from_vec.R | 4 ++-- R/kld_from_vec.R | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/R/jsd_from_vec.R b/R/jsd_from_vec.R index d5c376e..5c2fa4a 100644 --- a/R/jsd_from_vec.R +++ b/R/jsd_from_vec.R @@ -15,7 +15,7 @@ #' @export #' lfa_jsd_from_vec <- function(x, y) { - x.d = density(x) - y.d = density(y) + x.d = density(x, na.rm = TRUE) + y.d = density(y, na.rm = TRUE) return(lfa::lfa_jsd(x.d$y, y.d$y)) } diff --git a/R/kld_from_vec.R b/R/kld_from_vec.R index e9ed8a3..d715476 100644 --- a/R/kld_from_vec.R +++ b/R/kld_from_vec.R @@ -15,7 +15,7 @@ #' @export #' lfa_kld_from_vec <- function(x, y) { - x.d = density(x) - y.d = density(y) + x.d = density(x, na.rm = TRUE) + y.d = density(y, na.rm = TRUE) return(lfa::lfa_kld(x.d$y, y.d$y)) } From 59884005cbfe768386741281cc9782484ecc4940 Mon Sep 17 00:00:00 2001 From: Jakob Date: Mon, 22 Jan 2024 11:28:19 +0100 Subject: [PATCH 2/3] Analyse number of returns --- .../_freeze/report/execute-results/html.json | 4 +- .../fig-boxplot-number-returns-1.png | Bin 0 -> 84987 bytes .../fig-density-number-returns-1.png | Bin 0 -> 129091 bytes results/appendix/build_quantitativ_results.py | 8 + results/appendix/number_of_returns.qmd | 218 ++++++++++++++++++ results/appendix/z_values.qmd | 1 + results/report.qmd | 6 +- results/results/number_of_returns.qmd | 33 +++ 8 files changed, 266 insertions(+), 4 deletions(-) create mode 100644 results/_freeze/report/figure-html/fig-boxplot-number-returns-1.png create mode 100644 results/_freeze/report/figure-html/fig-density-number-returns-1.png create mode 100644 results/appendix/number_of_returns.qmd create mode 100644 results/results/number_of_returns.qmd diff --git a/results/_freeze/report/execute-results/html.json b/results/_freeze/report/execute-results/html.json index 7ea8b91..33fb8c3 100644 --- a/results/_freeze/report/execute-results/html.json +++ b/results/_freeze/report/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "c0a0046920231e3745e757cf2ece83dc", + "hash": "4b4e3b5d1b324a24fc04923311675379", "result": { - "markdown": "---\ntitle: \"Forest Data Analysis Report\"\noutput:\n pdf_document:\n latex_engine: xelatex\ntoc: true\ntoc-depth: 2\ntoc-title: Contents\nnumber-sections: true\nnumber-depth: 3\ndate: today\nauthor:\n - name: Jakob Danel\n email: jakob.danel@uni-muenster.de\n url: https://github.com/jakobdanel\n affiliations:\n - name: Universität Münster\n city: Münster\n country: Germany\n - name: Federick Bruch\n email: f_bruc03@uni-muenster.de\n url: https://www.uni-muenster.de/Geoinformatics/institute/staff/index.php/351/Frederick_Bruch\n affiliations:\n - name: Universität Münster\n city: Münster\n country: Germany\nbibliography: references.bib\nexecute-dir: .. \nprefer-html: true\n---\n\n\n# Introduction\n\nThis report documents the analysis of forest data for different tree species.\n\n# Methods\n\n## Data acquisition\n\nOur primary objective is to identify patches where one tree species exhibits a high level of dominance, striving to capture monocultural stands within the diverse forests of Nordrhein-Westfalia (NRW). Recognizing the practical challenges of finding true monocultures, we aim to identify patches where one species is highly dominant, enabling meaningful comparisons across different species.\n\nThe study is framed within the NRW region due to the availability of an easily accessible dataset. Our focus includes four prominent tree species in NRW: oak, beech, spruce, and pine, representing the most prevalent species in the region. To ensure the validity of our findings, we derive three patches for each species, thereby confirming that observed variables are characteristic of a particular species rather than a specific patch. Each patch is carefully selected to encompass an area of approximately 50-100 hectares and contain between 5,000 and 10,000 trees. Striking a balance between relevance and manageability, these patches avoid excessive size to enhance the likelihood of capturing varied species mixes and ensure compatibility with local hardware.\n\nSpecific Goals:\n\n1. Retrieve patches with highly dominant tree species.\n2. Minimize or eliminate the presence of human-made structures within the selected patches.\n\nTo achieve our goals, we utilized the waldmonitor dataset [@welle2014] and the map provided by [@Blickensdoerfer2022], both indicating dominant tree species in NRW. We identified patches of feasible size where both sources predicted the presence of a specific species. Further validation involved examining sentinel images of these forest regions to assess the evenness of structures, leaf color distribution, and the absence of significant human-made structures such as roads or buildings. The subsequent preprocessing steps, detailed in the following subsection, involved refining our selected patches and deriving relevant variables, such as tree distribution and density, to ensure that the chosen areas align with the desired research domains.\n\n## Preprocessing\n::: {.cell}\n\n:::\n\n\nIn this research study, the management and processing of a large dataset are crucial considerations. The dataset's substantial size necessitates careful maintenance to ensure efficient handling. Furthermore, the data should be easily processable and editable to facilitate necessary corrections and precalculations within the context of our research objectives. To achieve our goals, we have implemented a framework that automatically derives data based on a shapefile, delineating areas of interest. The processed data and results of precalculations are stored in a straightforward manner to enhance accessibility. Additionally, we have designed functions that establish a user-friendly interface, enabling the execution of algorithms on subsets of the data, such as distinct species. These interfaces are not only directly callable by users but can also be integrated into other functions to automate processes. The overarching aim is to streamline the entire preprocessing workflow using a single script, leveraging only the shapefile as a basis. This subsection details the accomplishments of our R-package in realizing these goals, outlining the preprocessing steps undertaken and justifying their necessity in the context of our research.\n\nThe data are stored in a data subdirectory of the root directory in the format `species/location-name/tile-name`. To automate the matching of areas of interest with the catalog from the Land NRW[^1], we utilize the intersecting tool developed by Heisig[^2]. This tool, allows for the automatic retrieval and placement of data downloaded from the Land NRW catalog. To enhance data accessibility, we have devised an object that incorporates species, location name, and tile name (the NRW internal identifier) for each area This object facilitates the specification of the area to be processed. Additionally, we have defined an initialization function that downloads all tiles, returning a list of tile location objects for subsequent processing. A pivotal component of the package's preprocessing functionality is the map function, which iterates over a list of tile locations (effectively the entire dataset) and accepts a processing function as an argument. The subsequent paragraph outlines the specific preprocessing steps employed, all of which are implemented within the mapping function.\n\nTo facilitate memory-handling capabilities, each of the tiles, where one area can span multiple tiles, has been split into manageable chunks. We employed a 50x50m size for each tile, resulting in the division of original 1km x 1km files into 400 tiles. These tiles are stored in our directory structure, with each tile housed in a directory named after its tile name and assigned an id as the filename. Implementation-wise, the `lidr::catalog_retile` function was instrumental in achieving this segmentation. The resulting smaller chunks allow for efficient iteration during subsequent preprocessing steps.\n\nThe next phase involves reducing our data to the actual size by intersecting the tiles with the defined area of interest. Using the `lidR::merge_spatial` function, we intersect the area derived from the shapefile, removing all point cloud items outside this region. Due to our tile-wise approach, empty tiles may arise, and in such cases, those tiles are simply deleted.\n\nFollowing the size reduction to our dataset, the next step involves correcting the `z` values. The `z` values in the data are originally relative to the ellipsoid used for referencing, but we require them to be relative to the ground. To achieve this, we utilize the `lidR::tin` function, which extrapolates a convex hull between all ground points (classified by the data provider) and calculates the z value based on this structure.\n\nSubsequently, we aim to perform segmentation for each distinct tree, marking each item of the point cloud with a tree ID. We employ the algorithm described by @li2012, using parameters `li2012(dt1 = 2, dt2 = 3, R = 2, Zu = 10, hmin = 5, speed_up = 12)`. The meanings of these parameters are elucidated in Li et al.'s work [@li2012].\n\nFinally, the last preprocessing step involves individual tree detection, seeking a single `POINT` object for each tree. The `lidR::lmf` function, an implementation of the tree data using a local maximum approach, is utilized for this purpose [@popescu2004]. The results are stored in GeoPackage files within our data structure.\n\nSee @sec-appendix-preprocessing for the implementation of the preprocessing.\n\n[^1]: https://www.opengeodata.nrw.de/produkte/geobasis/hm/3dm_l_las/3dm_l_las/, last visited 7th Dec 2023\n[^2]: https://github.com/joheisig/GEDIcalibratoR, last visited 7th Dec 2023\n\n## Analysis of different distributions\n\nAnalysis of data distributions is a critical aspect of our research, with a focus on comparing two or more distributions. Our objective extends beyond evaluating the disparities between species; we also aim to assess differences within a species. To gain a comprehensive understanding of the data, we employ various visualization techniques, including histograms, density functions, and box plots.\n\nIn tandem with visualizations, descriptive statistics, such as means, standard errors, and quantiles, are leveraged to provide key insights into the central tendency and variability of the data.\n\nFor a more quantitative analysis of distribution dissimilarity, statistical tests are employed. The Kullback-Leibler (KL) difference serves as a measure to compare the similarity of a set of distributions. This involves converting distributions into their density functions, with the standard error serving as the bandwidth. The KL difference is calculated for each pair of distributions, as it is asymmetric. For the two distributions the KL difference is defined as following [@kullback1951kullback]:\n\n$$\nD_{KL}(P \\, \\| \\, Q) = \\sum_i P(i) \\log\\left(\\frac{P(i)}{Q(i)}\\right)\n$$\n\nTo obtain a symmetric score, the Jensen-Shannon Divergence (JSD) is utilized [@grosse2002analysis], expressed by the formula:\n\n$$\nJS(P || Q) = \\frac{1}{2} * KL(P || M) + \\frac{1}{2} * KL(Q || M)\n$$\nHere, $M = \\frac{1}{2} * (P + Q)$. The JSD provides a balanced measure of dissimilarity between distributions [@Brownlee2019Calculate]. For comparing the different scores to each other, we will use averages.\n\nAdditionally, the Kolmogorov-Smirnov Test is implemented to assess whether two distributions significantly differ from each other. This statistical test offers a formal evaluation of the dissimilarity between empirical distribution functions.\n\n\n# Results\n::: {.cell}\n\n:::\n\n## Researched areas\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nlibrary(ggplot2)\nsf::sf_use_s2(FALSE)\npatches <- sf::read_sf(\"research_areas.shp\") |> sf::st_centroid()\n\nde <- sf::read_sf(\"results/results/states_de/Bundesländer_2017_mit_Einwohnerzahl.shp\") # Source: https://hub.arcgis.com/datasets/esri-de-content::bundesl%C3%A4nder-2017-mit-einwohnerzahl/explore?location=51.099647%2C10.454033%2C7.43\nnrw <- de[5,] |> sf::st_geometry()\n\n\nggplot() + geom_sf(data = nrw) + \n geom_sf(data = patches, mapping = aes(col = species))\n```\n\n::: {.cell-output-display}\n![Locations of the different patches with the dominant species for that patch. The patches centroids are displayed on a basemap describing the borders from NRW.](report_files/figure-html/fig-patches-nrw-1.png){#fig-patches-nrw width=672}\n:::\n:::\nWe draw three patches for each species from different regions (see @tbl-summary-researched-areas). We download the LiDAR data for those patches and runned all preprocessing steps as described. We than checked with certain derived parameters (e.g. tree heights, tree distributions or tree density) that all patches contain valid forest data. In that step we discovered, that in one patch some forest clearance took place in the near past. This patch was removed from the dataset and was replaced with a new one. \n\nIn our research, drawing patches evenly distributed across Nordrhein-Westfalia is inherently constrained by natural factors. Consequently, the patches for oak and pine predominantly originate from the Münsterland region, as illustrated in [@fig-patches-nrw]. For spruce, the patches were derived from Sauerland, reflecting the prevalence of spruce forests in this specific region within NRW, as corroborated by Welle et al. [@welle2014] and Blickensdörfer et al. [@Blickensdoerfer2022]. Beech patches, on the other hand, were generated from diverse locations within NRW. Across all patches, no human-made objects were identified, with the exception of small paths for pedestrians and forestry vehicles.\n\nThe distribution of area and detections is notable for each four species. Beech covers 69,791.9 hectares with a total of 5,954 detections, oak spans 63,232.49 hectares with 5,354 detections, pine extends across 72,862.4 hectares with 8,912 detections, and spruce encompasses 57,940.02 hectares with 8,619 detections. Both the amount of detections and the corresponding area exhibit a relatively uniform distribution across the diverse patches, as summarized in @tbl-summary-researched-areas. \n\nWith the selected dataset described, we intentionally chose three patches for each four species that exhibit a practical and usable size for our research objectives. These carefully chosen patches align with the conditions essential for our study, providing comprehensive and representative data for in-depth analysis and meaningful insights into the characteristics of each tree species within the specified areas.\n\n\n::: {#tbl-summary-researched-areas .cell tbl-cap='Summary of researched patches grouped by species, with their location, area and the amount of detected trees.'}\n\n```{.r .cell-code code-fold=\"true\"}\nshp <- sf::read_sf(\"research_areas.shp\")\ntable <- lfa::lfa_get_all_areas()\n\nsf::sf_use_s2(FALSE)\nfor (row in 1:nrow(table)) {\n area <-\n dplyr::filter(shp, shp$species == table[row, \"specie\"] &\n shp$name == table[row, \"area\"])\n area_size <- area |> sf::st_area()\n point <- area |> sf::st_centroid() |> sf::st_coordinates()\n table[row,\"point\"] <- paste0(\"(\",round(point[1], digits = 4),\", \",round(point[2],digits = 4),\")\")\n \n table[row, \"area_size\"] = round(area_size,digits = 2) #paste0(round(area_size,digits = 2), \" m²\")\n \n amount_det <- nrow(lfa::lfa_get_detection_area(table[row, \"specie\"], table[row, \"area\"]))\n if(is.null(amount_det)){\n cat(nrow(lfa::lfa_get_detection_area(table[row, \"specie\"], table[row, \"area\"])),table[row, \"specie\"],table[row, \"area\"])\n }\n table[row, \"amount_detections\"] = amount_det\n \n # table[row, \"specie\"] <- lfa::lfa_capitalize_first_char(table[row,\"specie\"])\n table[row, \"area\"] <- lfa::lfa_capitalize_first_char(table[row,\"area\"])\n }\ntable$area <- gsub(\"_\", \" \", table$area)\ntable$area <- gsub(\"ue\", \"ü\", table$area)\ntable = table[,!names(table) %in% c(\"specie\")]\n\nknitr::kable(table, \"html\", col.names = c(\"Patch Name\",\"Location\",\"Area size (m²)\",\"Amount tree detections\" ), caption = NULL, digits = 2, escape = TRUE) |>\n kableExtra::kable_styling(\n bootstrap_options = c(\"striped\", \"hold_position\", \"bordered\",\"responsive\"),\n stripe_index = c(1:3,7:9),\n full_width = FALSE\n ) |>\n kableExtra::pack_rows(\"Beech\", 1, 3) |>\n kableExtra::pack_rows(\"Oak\", 4, 6) |>\n kableExtra::pack_rows(\"Pine\", 7, 9) |>\n kableExtra::pack_rows(\"Spruce\", 10, 12) |>\n kableExtra::column_spec(1, bold = TRUE)\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n \n \n \n \n \n \n \n \n\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Patch Name Location Area size (m²) Amount tree detections
Beech
Bielefeld brackwede (8.5244, 51.9902) 161410.57 1443
Billerbeck (7.3273, 51.9987) 185887.25 1732
Wülfenrath (7.0769, 51.2917) 350621.21 2779
Oak
Hamm (7.8618, 51.6639) 269397.22 2441
Münster (7.6187, 51.9174) 164116.61 1270
Rinkerode (7.6744, 51.8598) 198811.09 1643
Pine
Greffen (8.1697, 51.9913) 49418.81 513
Mesum (7.5403, 52.2573) 405072.85 5031
Telgte (7.7816, 52.0024) 274132.34 3368
Spruce
Brilon (8.5352, 51.4084) 211478.20 3342
Oberhundem (8.1861, 51.0909) 151895.53 2471
Osterwald (8.3721, 51.2151) 216026.43 2806
\n\n`````\n:::\n:::\n\n\n\n\n\n## Distribution of the tree heights\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\ndetections <- lfa::lfa_get_detections()\n```\n:::\n\nIn this study, we scrutinize the distribution of tree heights, focusing initially on the density distribution to unravel the nuances across various tree species. Notably, our examination reveals distinctive patterns, with Oak and Pine exhibiting significantly steeper peaks in their density curves compared to Beech and Spruce. While all species present unique density curves, a commonality emerges—each curve is characterized by a single peak, except for the intriguing exception observed in Telgte. Taking Beech as an illustrative example, our findings indicate a notable shift in the peak to a considerably higher extent. The varinace in the density curves indicating that an differencation between species only with the help oof tree height values could be difficult.\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nlfa::lfa_create_density_plots(detections, value_column = \"Z\", category_column1 = \"area\", category_column2 = \"specie\", title = \"Density of the height distributions\", xlims = c(0,50))\n```\n\n::: {.cell-output-display}\n![Density of the height distribitions of the detectected trees. Splitted by the different researched areas and grouped by the dominant specie in this area.](report_files/figure-html/fig-density-z-1.png){#fig-density-z width=672}\n:::\n:::\n\nTo have a deeper look into the distributions of those `Z`-values we will now also have a look into the boxplots of the height distrubutions in the different areas.\nNoteworthy observations include the presence of outliers beyond the extended range of the Whisker Antennas ($1.5*\\text{IQR}$) in all datasets. Of particular interest is the Rinkerode dataset, which exhibits a higher prevalence of outliers in the upper domain. Anomalies in this dataset are attributed to potential inaccuracies, urging a critical examination of data integrity. A pairwise examination of Oak and Pine species indicates higher mean heights for Oak compared to Pine. This insight underscores the significance of species-specific attributes in shaping overall height distributions. Further exploration into the factors contributing to these mean differences enhances our understanding of the unique characteristics inherent to each species. Contrary to expectations, the spread within a particular species does not exhibit significant divergence from the spread observed between different species. This finding suggests that while species-specific traits play a crucial role in shaping height distributions, certain overarching factors may contribute to shared patterns across diverse tree populations.\n\n\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nlfa::lfa_create_boxplot(detections, value_column = \"Z\", category_column1 = \"area\", category_column2 = \"specie\", title = \"Boxplots of the height distributions\")\n```\n\n::: {.cell-output-display}\n![Boxplots of the height distribitions of the detectected trees. Splitted by the different researched areas and grouped by the dominant specie in this area.](report_files/figure-html/fig-boxplot-z-1.png){#fig-boxplot-z width=672}\n:::\n:::\n\n\n\nOur examination of Kullback-Leibler Divergence (KLD) and Jensen-Shannon Divergence (JSD) metrics reveals low mean values (KLD: 5.252696, JSD: 2.246663) across different species, indicating overall similarity in tree species height distributions. However, within specific species, particularly Pine, higher divergence values (see @tbl-z-values-kld-pine and @tbl-z-values-jsd-pine) suggest significant intraspecific differences.\n\nNotably, the Spruce species consistently demonstrates low divergence values across all tested areas, implying a high level of explainability. This finding highlights tree height as a reliable indicator for detecting Spruce trees, indicating its potential for accurate species identification in diverse forest ecosystems.\n\n## n-nearest Neighbours\n\n::: {.cell}\n\n```{.r .cell-code}\nneighbors <- lfa::lfa_combine_sf_obj(lfa::lfa_get_neighbor_paths(),lfa::lfa_get_all_areas())\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/beech/bielefeld_brackwede/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 1443 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 466999.8 ymin: 5759839 xmax: 467617.1 ymax: 5760261\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/beech/billerbeck/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 1732 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 384890.8 ymin: 5761918 xmax: 385590.9 ymax: 5762478\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/beech/wuelfenrath/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 2779 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 365546.3 ymin: 5683711 xmax: 366356.1 ymax: 5684321\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/oak/hamm/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 2441 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 420953.3 ymin: 5723884 xmax: 421596 ymax: 5724609\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/oak/muenster/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 1270 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 404615.6 ymin: 5752535 xmax: 405396.8 ymax: 5752971\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/oak/rinkerode/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 1643 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 408428.2 ymin: 5746021 xmax: 409014.8 ymax: 5746511\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/pine/greffen/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 513 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 442816.1 ymin: 5760217 xmax: 443148.9 ymax: 5760567\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/pine/mesum/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 5031 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 399930.6 ymin: 5790412 xmax: 400969.7 ymax: 5790950\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/pine/telgte/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 3368 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 416135.1 ymin: 5761663 xmax: 416697.1 ymax: 5762477\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/spruce/brilon/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 3342 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 467305.7 ymin: 5695055 xmax: 467996.9 ymax: 5695593\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/spruce/oberhundem/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 2471 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 442631.7 ymin: 5660096 xmax: 443309.5 ymax: 5660502\nProjected CRS: ETRS89 / UTM zone 32N\nReading layer `neighbours' from data source \n `/home/jakob/gi-master/project-courses/lidar-forest-analysis/src/data/spruce/osterwald/neighbours.gpkg' \n using driver `GPKG'\nSimple feature collection with 2806 features and 102 fields\nGeometry type: POINT\nDimension: XY\nBounding box: xmin: 455822 ymin: 5673761 xmax: 456483.2 ymax: 5674162\nProjected CRS: ETRS89 / UTM zone 32N\n```\n:::\n:::\n\n### The Nearest Neighbour\nFirst we will look into the distance to the nearest neighbor of each tree.\n::: {.cell}\n\n```{.r .cell-code}\nlfa::lfa_create_stacked_distributions_plot(neighbors,\"Neighbor_1\",\"area\",xlim = c(0,15),title = \"Distribution of distance to nearest tree in m among the different species and areas\")\n```\n\n::: {.cell-output-display}\n![](report_files/figure-html/unnamed-chunk-9-1.png){width=672}\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa::lfa_create_boxplot(neighbors,value_column = \"Neighbor_1\",category_column1 = \"area\",category_column2 = \"specie\", title = \"Box plots for the nearest neighbor among species and areas\")\n```\n\n::: {.cell-output-display}\n![](report_files/figure-html/unnamed-chunk-10-1.png){width=672}\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa::lfa_create_density_plots(neighbors,value_column = \"Neighbor_1\",category_column1 = \"area\",category_column2 = \"specie\", title = \"Density plots for the nearest neighbor among species and areas\")\n```\n\n::: {.cell-output-display}\n![](report_files/figure-html/unnamed-chunk-11-1.png){width=672}\n:::\n:::\n\n### KLD: Specie\n\n::: {.cell}\n\n```{.r .cell-code}\nkld_from_vec <- function(x,y){\n x.d = density(x)\n y.d = density(y)\n return(lfa::lfa_kld(x.d$y,y.d$y))\n}\nresults <- lfa::lfa_run_test_asymmetric(neighbors,\"Neighbor_1\",\"specie\",kld_from_vec) \nlfa::lfa_generate_result_table_tests(results, caption = \"Kullback Leibler Divergence between the different species\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback Leibler Divergence between the different species
Beech Oak Pine Spruce
Beech 0.000 0.029 0.40 3.3
Oak 0.031 0.000 0.25 3.9
Pine 0.213 0.128 0.00 4.9
Spruce 2.735 3.199 4.52 0.0
\n\n`````\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(results) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.477983\n```\n:::\n:::\n\n\n### KLD: Oak\n\n::: {.cell}\n\n```{.r .cell-code}\nkld_from_vec <- function(x,y){\n x.d = density(x)\n y.d = density(y)\n return(lfa::lfa_kld(x.d$y,y.d$y))\n}\noak <- neighbors[neighbors$specie == \"oak\",]\nresults <- lfa::lfa_run_test_asymmetric(oak,\"Neighbor_1\",\"area\",kld_from_vec) \nlfa::lfa_generate_result_table_tests(results, caption = \"Kullback Leibler Divergence between the different areas with specie oak\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback Leibler Divergence between the different areas with specie oak
Hamm Muenster Rinkerode
Hamm 0.000 0.079 0.078
Muenster 0.092 0.000 0.019
Rinkerode 0.086 0.020 0.000
\n\n`````\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(results) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.04167636\n```\n:::\n:::\n\n\n### KLD: beech\n\n::: {.cell}\n\n```{.r .cell-code}\nkld_from_vec <- function(x,y){\n x.d = density(x)\n y.d = density(y)\n return(lfa::lfa_kld(x.d$y,y.d$y))\n}\noak <- neighbors[neighbors$specie == \"beech\",]\nresults <- lfa::lfa_run_test_asymmetric(oak,\"Neighbor_1\",\"area\",kld_from_vec) \nlfa::lfa_generate_result_table_tests(results, caption = \"Kullback Leibler Divergence between the different areas with specie beech\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback Leibler Divergence between the different areas with specie beech
Bielefeld_brackwede Billerbeck Wuelfenrath
Bielefeld_brackwede 0.000 0.35 0.051
Billerbeck 0.380 0.00 0.138
Wuelfenrath 0.059 0.15 0.000
\n\n`````\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(results) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1249588\n```\n:::\n:::\n\n\n### KLD: Pine\n\n::: {.cell}\n\n```{.r .cell-code}\nkld_from_vec <- function(x,y){\n x.d = density(x)\n y.d = density(y)\n return(lfa::lfa_kld(x.d$y,y.d$y))\n}\noak <- neighbors[neighbors$specie == \"pine\",]\nresults <- lfa::lfa_run_test_asymmetric(oak,\"Neighbor_1\",\"area\",kld_from_vec) \nlfa::lfa_generate_result_table_tests(results, caption = \"Kullback Leibler Divergence between the different areas with specie pine\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback Leibler Divergence between the different areas with specie pine
Greffen Mesum Telgte
Greffen 0.00 0.495 0.258
Mesum 0.48 0.000 0.098
Telgte 0.22 0.076 0.000
\n\n`````\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(results) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.1812239\n```\n:::\n:::\n\n\n### KLD: Spruce\n\n::: {.cell}\n\n```{.r .cell-code}\nkld_from_vec <- function(x,y){\n x.d = density(x)\n y.d = density(y)\n return(lfa::lfa_kld(x.d$y,y.d$y))\n}\noak <- neighbors[neighbors$specie == \"spruce\",]\nresults <- lfa::lfa_run_test_asymmetric(oak,\"Neighbor_1\",\"area\",kld_from_vec) \nlfa::lfa_generate_result_table_tests(results, caption = \"Kullback Leibler Divergence between the different areas with specie spruce\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback Leibler Divergence between the different areas with specie spruce
Brilon Oberhundem Osterwald
Brilon 0.00 0.67 5.1
Oberhundem 0.41 0.00 7.2
Osterwald 6.09 6.23 0.0
\n\n`````\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(results) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 2.863587\n```\n:::\n:::\n\n\n### JSD: Specie\n\n::: {.cell}\n\n```{.r .cell-code}\njsd_from_vec <- function(x,y){\n x.d = density(x)\n y.d = density(y)\n return(lfa::lfa_jsd(x.d$y,y.d$y))\n}\nresults <- lfa::lfa_run_test_symmetric(neighbors,\"Neighbor_1\",\"specie\",jsd_from_vec) \nlfa::lfa_generate_result_table_tests(results, caption = \"Jensen-Shannon Divergence between the different species\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between the different species
Beech Oak Pine Spruce
Beech 0 0.22 2.1 9.3
Oak NA 0.00 1.3 10.6
Pine NA NA 0.0 14.7
Spruce NA NA NA 0.0
\n\n`````\n:::\n:::\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(results) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] NA\n```\n:::\n:::\n\n\n\n\n\n\n\n|specie |area | density (1/m²)|\n|:------|:-------------------|---------:|\n|beech |bielefeld_brackwede | 0.0089399|\n|beech |billerbeck | 0.0093175|\n|beech |wuelfenrath | 0.0079259|\n|oak |hamm | 0.0090610|\n|oak |muenster | 0.0077384|\n|oak |rinkerode | 0.0082641|\n|pine |greffen | 0.0103807|\n|pine |mesum | 0.0124200|\n|pine |telgte | 0.0122860|\n|spruce |brilon | 0.0158030|\n|spruce |oberhundem | 0.0162678|\n|spruce |osterwald | 0.0129892|\n\n\n\n# References\n\n::: {#refs}\n:::\n\n# Appendix\n## Script which can be used to do all preprocessing {#sec-appendix-preprocessing}\n\n::: {.cell}\n\n:::\n\n\nLoad the file with the research areas\n::: {.cell}\n\n```{.r .cell-code}\nsf <- sf::read_sf(here::here(\"research_areas.shp\"))\nprint(sf)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nSimple feature collection with 12 features and 3 fields\nGeometry type: POLYGON\nDimension: XY\nBounding box: xmin: 7.071625 ymin: 51.0895 xmax: 8.539877 ymax: 52.25983\nGeodetic CRS: WGS 84\n# A tibble: 12 × 4\n id species name geometry\n \n 1 1 oak rinkerode ((7.678922 51.85789, 7.675446 51.85752, 7.…\n 2 2 oak hamm ((7.858955 51.66699, 7.866444 51.66462, 7.…\n 3 3 oak muenster ((7.618908 51.9154, 7.617384 51.9172, 7.61…\n 4 4 pine greffen ((8.168691 51.98965, 8.167178 51.99075, 8.…\n 5 5 pine telgte ((7.779728 52.00662, 7.781616 52.00662, 7.…\n 6 6 pine mesum ((7.534424 52.25499, 7.53378 52.25983, 7.5…\n 7 7 beech bielefeld_brackwede ((8.524749 51.9921, 8.528418 51.99079, 8.5…\n 8 8 beech wuelfenrath ((7.071625 51.29256, 7.072311 51.29334, 7.…\n 9 9 beech billerbeck ((7.324729 51.99783, 7.323548 51.99923, 7.…\n10 11 spruce brilon ((8.532195 51.41029, 8.535027 51.41064, 8.…\n11 12 spruce osterwald ((8.369328 51.21693, 8.371238 51.21718, 8.…\n12 10 spruce oberhundem ((8.18082 51.08999, 8.180868 51.09143, 8.1…\n```\n:::\n:::\n\n\nInit the project\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(lfa)\nsf::sf_use_s2(FALSE)\nlocations <- lfa_init(\"research_areas.shp\")\n```\n:::\n\nDo all of the prprocessing steps\n::: {.cell}\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations,retile,check_flag = \"retile\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag retile is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations, lfa_intersect_areas, ctg = NULL, areas_sf = sf,check_flag = \"intersect\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag intersect is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations, lfa_ground_correction, ctg = NULL,check_flag = \"z_correction\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag z_correction is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations, lfa_segmentation, ctg = NULL,check_flag = \"segmentation\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag segmentation is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations, lfa_detection, catalog = NULL, write_to_file = TRUE,check_flag = \"detection\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag detection is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n:::\n\n\n## Quantitative Results\n### Distribution of Z-Values\n\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\ndata <- lfa::lfa_get_detections()\nvalue_column <- \"Z\"\n```\n:::\n\n\n\n#### Kullback-Leibler-Divergence\n\n\n\n::: {#tbl-z-values-kld_specie .cell tbl-cap='Kullback-Leibler-Divergence between the researched species Beech, Oak, Pine and Spruce for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nkld_results_specie <- lfa::lfa_run_test_asymmetric(data,value_column,\"specie\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_specie,\"Kullback-Leibler-Divergence between species\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between species
Beech Oak Pine Spruce
Beech 0.0 13.2 12.5 0.76
Oak 4.2 0.0 3.4 5.02
Pine 2.3 5.6 0.0 3.95
Spruce 2.4 14.7 16.1 0.00
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_specie, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 5.252696\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-kld-beech .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie beech for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"beech\",]\nkld_results_beech <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_beech,\"Kullback-Leibler-Divergence between areas with beech\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with beech
Bielefeld_brackwede Billerbeck Wuelfenrath
Bielefeld_brackwede 0.00 0.4 3.1
Billerbeck 0.27 0.0 6.0
Wuelfenrath 1.13 2.4 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_beech, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.473353\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-kld-oak .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie oak for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"oak\",]\nkld_results_oak <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_oak,\"Kullback-Leibler-Divergence between areas with oak\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with oak
Hamm Muenster Rinkerode
Hamm 0.0 2.1 16
Muenster 0.4 0.0 17
Rinkerode 7.6 17.8 0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_oak, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 6.779863\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-kld-pine .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie pine for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"pine\",]\nkld_results_pine <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_pine,\"Kullback-Leibler-Divergence between areas with pine\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with pine
Greffen Mesum Telgte
Greffen 0.00 0.74 16
Mesum 0.43 0.00 18
Telgte 3.87 6.82 0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_pine, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 5.129383\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-kld-spruce .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie spruce for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"spruce\",]\nkld_results_spruce <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_spruce,\"Kullback-Leibler-Divergence between areas with spruce\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with spruce
Brilon Oberhundem Osterwald
Brilon 0.000 0.092 1.7
Oberhundem 0.081 0.000 2.1
Osterwald 1.521 2.178 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_spruce, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.8509258\n```\n:::\n:::\n\n\n\n\n#### Jensen-Shannon Divergence\n\n\n\n::: {#tbl-z-values-jsd_specie .cell tbl-cap='Jensen-Shannon Divergence between the researched species Beech, Oak, Pine and Spruce for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\njsd_results_specie <- lfa::lfa_run_test_symmetric(data,value_column,\"specie\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_specie,\"Jensen-Shannon Divergence between species\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between species
Beech Oak Pine Spruce
Beech 0 4.5 4.6 2.4
Oak NA 0.0 3.9 6.1
Pine NA NA 0.0 7.1
Spruce NA NA NA 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_specie, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 2.246663\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-jsd-beech .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie beech for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"beech\",]\njsd_results_beech <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_beech,\"Jensen-Shannon Divergence between areas with beech\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with beech
Bielefeld_brackwede Billerbeck Wuelfenrath
Bielefeld_brackwede 0 1.1 3.3
Billerbeck NA 0.0 4.9
Wuelfenrath NA NA 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_beech, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.10555\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-jsd-oak .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie oak for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"oak\",]\njsd_results_oak <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_oak,\"Jensen-Shannon Divergence between areas with oak\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with oak
Hamm Muenster Rinkerode
Hamm 0 1.6 6.5
Muenster NA 0.0 6.4
Rinkerode NA NA 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_oak, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.692942\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-jsd-pine .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie pine for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"pine\",]\njsd_results_pine <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_pine,\"Jensen-Shannon Divergence between areas with pine\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with pine
Greffen Mesum Telgte
Greffen 0 3.1 12
Mesum NA 0.0 10
Telgte NA NA 0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_pine, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 2.956354\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-jsd-spruce .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie spruce for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"spruce\",]\njsd_results_spruce <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_spruce,\"Jensen-Shannon Divergence between areas with spruce\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with spruce
Brilon Oberhundem Osterwald
Brilon 0 0.31 4.0
Oberhundem NA 0.00 5.5
Osterwald NA NA 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_spruce, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.100383\n```\n:::\n:::\n\n\n\n## Documentation\n### `lfa_capitalize_first_char`\n\nCapitalize First Character of a String\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`input_string` | A single-character string to be processed.\n\n\n#### Concept\n\nString Manipulation\n\n\n#### Description\n\nThis function takes a string as input and returns the same string with the\n first character capitalized. If the first character is already capitalized,\n the function does nothing. If the first character is not from the alphabet,\n an error is thrown.\n\n\n#### Details\n\nThis function performs the following steps:\n \n\n* Checks if the input is a single-character string. \n\n* Verifies if the first character is from the alphabet (A-Z or a-z). \n\n* If the first character is not already capitalized, it capitalizes it. \n\n* Returns the modified string.\n\n\n#### Keyword\n\nalphabet\n\n\n#### Note\n\nThis function is case-sensitive and assumes ASCII characters.\n\n\n#### References\n\nNone\n\n\n#### Seealso\n\nThis function is related to the basic string manipulation functions in base R.\n\n\n#### Value\n\nA modified string with the first character capitalized if it is\n not already. If the first character is already capitalized, the original\n string is returned.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Capitalize the first character of a string\ncapitalize_first_char(\"hello\") # Returns \"Hello\"\ncapitalize_first_char(\"World\") # Returns \"World\"\n\n# Error example (non-alphabetic first character)\ncapitalize_first_char(\"123abc\") # Throws an error\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_capitalize_first_char(input_string)\n```\n:::\n\n\n\n### `lfa_check_flag`\n\nCheck if a flag is set, indicating the completion of a specific process.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`flag_name` | A character string specifying the name of the flag file. It should be a descriptive and unique identifier for the process being checked.\n\n\n#### Description\n\nThis function checks for the existence of a hidden flag file at a specified location within the working directory. If the flag file is found, a message is printed, and the function returns `TRUE` to indicate that the associated processing step has already been completed. If the flag file is not found, the function returns `FALSE` , indicating that further processing can proceed.\n\n\n#### Value\n\nA logical value indicating whether the flag is set ( `TRUE` ) or not ( `FALSE` ).\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Check if the flag for a process named \"data_processing\" is set\nlfa_check_flag(\"data_processing\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_check_flag(flag_name)\n```\n:::\n\n\n\n### `lfa_combine_sf_obj`\n\nCombine Spatial Feature Objects from Multiple GeoPackage Files\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`paths` | A character vector containing file paths to GeoPackage files with neighbor information.\n`area_infos` | A data frame or list containing information about the corresponding detection areas, including \"area\" and \"specie\" columns.\n\n\n#### Description\n\nThis function reads spatial feature objects (sf) from multiple GeoPackage files and combines them into a single sf object.\n Each GeoPackage file is assumed to contain neighbor information for a specific detection area, and the resulting sf object\n includes additional columns indicating the corresponding area and species information.\n\n\n#### Value\n\nA combined sf object with additional columns for area and specie information.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Assuming paths and area_infos are defined\ncombined_sf <- lfa_combine_sf_obj(paths, area_infos)\n\n# Print the combined sf object\nprint(combined_sf)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_combine_sf_obj(paths, area_infos)\n```\n:::\n\n\n\n### `lfa_count_returns_all_areas`\n\nCount tree returns for all species and areas, returning a consolidated data frame.\n\n\n#### Description\n\nThis function iterates through all species and areas obtained from the function\n [`lfa_get_all_areas`](#lfagetallareas) . For each combination of species and area, it reads\n the corresponding area as a catalog, counts the returns per tree using\n [`lfa_count_returns_per_tree`](#lfacountreturnspertree) , and consolidates the results into a data frame.\n The resulting data frame includes columns for the species, area, and return counts per tree.\n\n\n#### Keyword\n\ncounting\n\n\n#### Seealso\n\n[`lfa_get_all_areas`](#lfagetallareas) , [`lfa_read_area_as_catalog`](#lfareadareaascatalog) ,\n [`lfa_count_returns_per_tree`](#lfacountreturnspertree)\n\n\n#### Value\n\nA data frame with columns for species, area, and return counts per tree.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Count tree returns for all species and areas\nreturns_counts <- lfa_count_returns_all_areas()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_count_returns_all_areas()\n```\n:::\n\n\n\n### `lfa_count_returns_per_tree`\n\nCount returns per tree for a given lidR catalog.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | A lidR catalog object containing LAS files to be processed.\n\n\n#### Description\n\nThis function takes a lidR catalog as input and counts the returns per tree.\n It uses the lidR package to read LAS files from the catalog and performs the counting\n operation on each tree. The result is a data frame containing the counts of returns\n for each unique tree ID within the lidR catalog.\n\n\n#### Keyword\n\ncounting\n\n\n#### Seealso\n\n[`lidR::readLAS`](#lidr::readlas) , [`lidR::is.empty`](#lidr::is.empty) ,\n [`base::table`](#base::table) , [`dplyr::bind_rows`](#dplyr::bindrows)\n\n\n#### Value\n\nA data frame with columns for tree ID and the corresponding count of returns.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Count returns per tree for a lidR catalog\nctg <- lfa_read_area_as_catalog(\"SpeciesA\", \"Area1\")\nreturns_counts_per_tree <- lfa_count_returns_per_tree(ctg)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_count_returns_per_tree(ctg)\n```\n:::\n\n\n\n### `lfa_create_boxplot`\n\nCreate a box plot from a data frame\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`data` | A data frame containing the data.\n`value_column` | The name of the column containing the values for the box plot.\n`category_column1` | The name of the column containing the first categorical variable.\n`category_column2` | The name of the column containing the second categorical variable.\n`title` | An optional title for the plot. If not provided, a default title is generated based on the data frame name.\n\n\n#### Description\n\nThis function generates a box plot using ggplot2 based on the specified data frame and columns.\n\n\n#### Details\n\nThe function creates a box plot where the x-axis is based on the second categorical variable,\n the y-axis is based on the specified value column, and the box plots are colored based on the first\n categorical variable. The grouping of box plots is done based on the unique values in the second categorical variable.\n\n\n#### Value\n\nA ggplot object representing the box plot.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Assuming you have a data frame 'your_data' with columns 'value', 'category1', and 'category2'\ncreate_boxplot(your_data, \"value\", \"category1\", \"category2\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_boxplot(\n data,\n value_column,\n category_column1,\n category_column2,\n title = NULL\n)\n```\n:::\n\n\n\n### `lfa_create_density_plots`\n\nCreate density plots for groups in a data frame\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`data` | A data frame containing the data.\n`value_column` | The name of the column containing the values for the density plot.\n`category_column1` | The name of the column containing the categorical variable for grouping.\n`category_column2` | The name of the column containing the categorical variable for arranging plots.\n`title` | An optional title for the plot. If not provided, a default title is generated based on the data frame name.\n`xlims` | Optional limits for the x-axis. Should be a numeric vector with two elements (lower and upper bounds).\n`ylims` | Optional limits for the y-axis. Should be a numeric vector with two elements (lower and upper bounds).\n\n\n#### Description\n\nThis function generates density plots using ggplot2 based on the specified data frame and columns.\n\n\n#### Details\n\nThe function creates density plots where the x-axis is based on the specified value column,\n and the density plots are colored based on the first categorical variable. The arrangement of plots\n is done based on the unique values in the second categorical variable. The plots are arranged in a 2x2 grid.\n\n\n#### Value\n\nA ggplot object representing the density plots arranged in a 2x2 grid.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Assuming you have a data frame 'your_data' with columns 'value', 'category1', and 'category2'\ncreate_density_plots(your_data, \"value\", \"category1\", \"category2\", title = \"Density Plots\", xlims = c(0, 10), ylims = c(0, 0.5))\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_density_plots(\n data,\n value_column,\n category_column1,\n category_column2,\n title = NULL,\n xlims = NULL,\n ylims = NULL\n)\n```\n:::\n\n\n\n### `lfa_create_stacked_distributions_plot`\n\nCreate a stacked distribution plot for tree detections, visualizing the distribution\n of a specified variable on the x-axis, differentiated by another variable.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`trees` | A data frame containing tree detection data.\n`x_value` | A character string specifying the column name used for finding the values on the x-axis of the histogram.\n`fill_value` | A character string specifying the column name by which the data are differentiated in the plot.\n`bin` | An integer specifying the number of bins for the histogram. Default is 100.\n`ylab` | A character string specifying the y-axis label. Default is \"Amount trees.\"\n`xlim` | A numeric vector of length 2 specifying the x-axis limits. Default is c(0, 100).\n`ylim` | A numeric vector of length 2 specifying the y-axis limits. Default is c(0, 1000).\n`title` | The title of the plot.\n\n\n#### Description\n\nThis function generates a stacked distribution plot using the ggplot2 package,\n providing a visual representation of the distribution of a specified variable\n ( `x_value` ) on the x-axis, with differentiation based on another variable\n ( `fill_value` ). The data for the plot are derived from the provided `trees` \n data frame.\n\n\n#### Keyword\n\ndata\n\n\n#### Seealso\n\n[`ggplot2::geom_histogram`](#ggplot2::geomhistogram) , [`ggplot2::facet_wrap`](#ggplot2::facetwrap) ,\n [`ggplot2::ylab`](#ggplot2::ylab) , [`ggplot2::scale_fill_brewer`](#ggplot2::scalefillbrewer) ,\n [`ggplot2::coord_cartesian`](#ggplot2::coordcartesian)\n\n\n#### Value\n\nA ggplot object representing the stacked distribution plot.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Create a stacked distribution plot for variable \"Z,\" differentiated by \"area\"\ntrees <- lfa_get_detections()\nlfa_create_stacked_distributions_plot(trees, \"Z\", \"area\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_stacked_distributions_plot(\n trees,\n x_value,\n fill_value,\n bin = 100,\n ylab = \"Amount trees\",\n xlim = c(0, 100),\n ylim = c(0, 1000),\n title =\n \"Histograms of height distributions between species 'beech', 'oak', 'pine' and 'spruce' divided by the different areas of Interest\"\n)\n```\n:::\n\n\n\n### `lfa_create_stacked_histogram`\n\nCreate a stacked histogram for tree detections, summing up the values for each species.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`trees` | A data frame containing tree detection data.\n`x_value` | A character string specifying the column name used for finding the values on the x-axis of the histogram.\n`fill_value` | A character string specifying the column name by which the data are differentiated in the plot.\n`bin` | An integer specifying the number of bins for the histogram. Default is 30.\n`ylab` | A character string specifying the y-axis label. Default is \"Frequency.\"\n`xlim` | A numeric vector of length 2 specifying the x-axis limits. Default is c(0, 100).\n`ylim` | A numeric vector of length 2 specifying the y-axis limits. Default is NULL.\n\n\n#### Description\n\nThis function generates a stacked histogram using the ggplot2 package,\n summing up the values for each species and visualizing the distribution of\n a specified variable ( `x_value` ) on the x-axis, differentiated by another\n variable ( `fill_value` ). The data for the plot are derived from the provided\n `trees` data frame.\n\n\n#### Keyword\n\ndata\n\n\n#### Seealso\n\n[`ggplot2::geom_histogram`](#ggplot2::geomhistogram) , [`ggplot2::ylab`](#ggplot2::ylab) ,\n [`ggplot2::scale_fill_brewer`](#ggplot2::scalefillbrewer) , [`ggplot2::coord_cartesian`](#ggplot2::coordcartesian)\n\n\n#### Value\n\nA ggplot object representing the stacked histogram.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Create a stacked histogram for variable \"Z,\" differentiated by \"area\"\ntrees <- lfa_get_detections()\nlfa_create_stacked_histogram(trees, \"Z\", \"area\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_stacked_histogram(\n trees,\n x_value,\n fill_value,\n bin = 30,\n ylab = \"Frequency\",\n xlim = c(0, 100),\n ylim = NULL\n)\n```\n:::\n\n\n\n### `lfa_create_tile_location_objects`\n\nCreate tile location objects\n\n\n#### Author\n\nJakob Danel\n\n\n#### Description\n\nThis function traverses a directory structure to find LAZ files and creates\n tile location objects for each file. The function looks into the the `data` \n directory of the repository/working directory. It then creates `tile_location` \n objects based on the folder structure. The folder structure should not be\n touched by hand, but created by `lfa_init_data_structure()` which builds the\n structure based on a shape file.\n\n\n#### Seealso\n\n[`tile_location`](#tilelocation)\n\n\n#### Value\n\nA vector containing tile location objects.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_tile_location_objects()\n\nlfa_create_tile_location_objects()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_tile_location_objects()\n```\n:::\n\n\n\n### `lfa_detection`\n\nPerform tree detection on a lidar catalog and optionally save the results to a file.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`catalog` | A lidar catalog containing point cloud data. If set to NULL, the function attempts to read the catalog from the specified tile location.\n`tile_location` | An object specifying the location of the lidar tile. If catalog is NULL, the function attempts to read the catalog from this tile location.\n`write_to_file` | A logical value indicating whether to save the detected tree information to a file. Default is TRUE.\n\n\n#### Description\n\nThis function utilizes lidar data to detect trees within a specified catalog. The detected tree information can be optionally saved to a file in the GeoPackage format. The function uses parallel processing to enhance efficiency.\n\n\n#### Value\n\nA sf style data frame containing information about the detected trees.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Perform tree detection on a catalog and save the results to a file\nlfa_detection(catalog = my_catalog, tile_location = my_tile_location, write_to_file = TRUE)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_detection(catalog, tile_location, write_to_file = TRUE)\n```\n:::\n\n\n\n### `lfa_download_areas`\n\nDownload areas based on spatial features\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`sf_areas` | Spatial features representing areas to be downloaded. It must include columns like \"species\" \"name\" See details for more information.\n\n\n#### Author\n\nJakob Danel\n\n\n#### Description\n\nThis function initiates the data structure and downloads areas based on spatial features.\n\n\n#### Details\n\nThe input data frame, `sf_areas` , must have the following columns:\n \n\n* \"species\": The species associated with the area. \n\n* \"name\": The name of the area. \n \n The function uses the `lfa_init_data_structure` function to set up the data structure\n and then iterates through the rows of `sf_areas` to download each specified area.\n\n\n#### Value\n\nNone\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_download_areas(sf_areas)\n\n\n# Example spatial features data frame\nsf_areas <- data.frame(\nspecies = c(\"SpeciesA\", \"SpeciesB\"),\nname = c(\"Area1\", \"Area2\"),\n# Must include also other attributes specialized to sf objects\n# such as geometry, for processing of the download\n)\n\nlfa_download_areas(sf_areas)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_download_areas(sf_areas)\n```\n:::\n\n\n\n### `lfa_download`\n\nDownload an las file from the state NRW from a specific location\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`species` | The species of the tree which is observed at this location\n`name` | The name of the area that is observed\n`location` | An sf object, which holds the location information for the area where the tile should be downloaded from.\n\n\n#### Description\n\nIt will download the file and save it to data/ list(list(\"html\"), list(list(\"\"))) / list(list(\"html\"), list(list(\"\"))) with the name of the tile\n\n\n#### Value\n\nThe LASCatalog object of the downloaded file\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_download(species, name, location)\n```\n:::\n\n\n\n### `lfa_find_n_nearest_trees`\n\nFind n Nearest Trees\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`trees` | A sf object containing tree coordinates.\n`n` | The number of nearest trees to find for each tree (default is 100).\n\n\n#### Description\n\nThis function calculates the distances to the n nearest trees for each tree in the input dataset.\n\n\n#### Value\n\nA data frame with additional columns representing the distances to the n nearest trees.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Load tree data using lfa_get_detections() (not provided)\ntree_data <- lfa_get_detections()\n\n# Filter tree data for a specific species and area\ntree_data = tree_data[tree_data$specie == \"pine\" & tree_data$area == \"greffen\", ]\n\n# Find the 100 nearest trees for each tree in the filtered dataset\ntree_data <- lfa_find_n_nearest_trees(tree_data)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_find_n_nearest_trees(trees, n = 100)\n```\n:::\n\n\n\n### `lfa_generate_result_table_tests`\n\nGenerate Result Table for Tests\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`table` | A data frame representing the result table.\n\n\n#### Description\n\nThis function generates a result table for tests using the knitr::kable function.\n\n\n#### Details\n\nThis function uses the knitr::kable function to create a formatted table, making it suitable for HTML output.\n The input table is expected to be a data frame with test results, and the resulting table will have capitalized\n row and column names with lines between columns and rows.\n\n\n#### Value\n\nA formatted table suitable for HTML output with lines between columns and rows.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Generate a result table for tests\nresult_table <- data.frame(\nTest1 = c(0.05, 0.10, 0.03),\nTest2 = c(0.02, 0.08, 0.01),\nTest3 = c(0.08, 0.12, 0.05)\n)\nformatted_table <- lfa_generate_result_table_tests(result_table)\nprint(formatted_table)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_generate_result_table_tests(table, caption = \"Table Caption\")\n```\n:::\n\n\n\n### `lfa_get_all_areas`\n\nRetrieve a data frame containing all species and corresponding areas.\n\n\n#### Description\n\nThis function scans the \"data\" directory within the current working directory to\n obtain a list of species. It then iterates through each species to retrieve the list\n of areas associated with that species. The resulting data frame contains two columns:\n \"specie\" representing the species and \"area\" representing the corresponding area.\n\n\n#### Keyword\n\ndata\n\n\n#### Seealso\n\n[`list.dirs`](#list.dirs)\n\n\n#### Value\n\nA data frame with columns \"specie\" and \"area\" containing information about\n all species and their associated areas.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Retrieve a data frame with information about all species and areas\nall_areas_df <- lfa_get_all_areas()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_all_areas()\n```\n:::\n\n\n\n### `lfa_get_detection_area`\n\nGet Detection for an area\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`species` | A character string specifying the target species.\n`name` | A character string specifying the name of the tile.\n\n\n#### Description\n\nRetrieves the tree detection information for a specified species and tile.\n\n\n#### Details\n\nThis function reads tree detection data from geopackage files within the specified tile location for a given species. It then combines the data into a single SF data frame and returns it. The function assumes that the tree detection files follow a naming convention with the pattern \"_detection.gpkg\".\n\n\n#### Keyword\n\nspatial\n\n\n#### References\n\nThis function is part of the LiDAR Forest Analysis (LFA) package.\n\n\n#### Seealso\n\n[`get_tile_dir`](#gettiledir)\n\n\n#### Value\n\nA Simple Features (SF) data frame containing tree detection information for the specified species and tile.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Retrieve tree detection data for species \"example_species\" in tile \"example_tile\"\ntrees_data <- lfa_get_detection_tile_location(\"example_species\", \"example_tile\")\n\n# Example usage:\ntrees_data <- lfa_get_detection_tile_location(\"example_species\", \"example_tile\")\n\n# No trees found scenario:\nempty_data <- lfa_get_detection_tile_location(\"nonexistent_species\", \"nonexistent_tile\")\n# The result will be an empty data frame if no trees are found for the specified species and tile.\n\n# Error handling:\n# In case of invalid inputs, the function may throw errors. Ensure correct species and tile names are provided.\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_detection_area(species, name)\n```\n:::\n\n\n\n### `lfa_get_detections_species`\n\nRetrieve detections for a specific species.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`species` | A character string specifying the target species.\n\n\n#### Description\n\nThis function retrieves detection data for a given species from multiple areas.\n\n\n#### Details\n\nThe function looks for detection data in the \"data\" directory for the specified species.\n It then iterates through each subdirectory (representing different areas) and consolidates the\n detection data into a single data frame.\n\n\n#### Value\n\nA data frame containing detection information for the specified species in different areas.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Example usage:\ndetections_data <- lfa_get_detections_species(\"example_species\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_detections_species(species)\n```\n:::\n\n\n\n### `lfa_get_detections`\n\nRetrieve aggregated detection data for multiple species.\n\n\n#### Concept\n\ndata retrieval functions\n\n\n#### Description\n\nThis function obtains aggregated detection data for multiple species by iterating\n through the list of species obtained from [`lfa_get_species`](#lfagetspecies) . For each\n species, it calls [`lfa_get_detections_species`](#lfagetdetectionsspecies) to retrieve the\n corresponding detection data and aggregates the results into a single data frame.\n The resulting data frame includes columns for the species, tree detection data,\n and the area in which the detections occurred.\n\n\n#### Keyword\n\naggregation\n\n\n#### Seealso\n\n[`lfa_get_species`](#lfagetspecies) , [`lfa_get_detections_species`](#lfagetdetectionsspecies) \n \n Other data retrieval functions:\n [`lfa_get_species`](#lfagetspecies)\n\n\n#### Value\n\nA data frame containing aggregated detection data for multiple species.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_detections()\n\n# Retrieve aggregated detection data for multiple species\ndetections_data <- lfa_get_detections()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_detections()\n```\n:::\n\n\n\n### `lfa_get_flag_path`\n\nGet the path to a flag file indicating the completion of a specific process.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`flag_name` | A character string specifying the name of the flag file. It should be a descriptive and unique identifier for the process being flagged.\n\n\n#### Description\n\nThis function constructs and returns the path to a hidden flag file, which serves as an indicator that a particular processing step has been completed. The flag file is created in a designated location within the working directory.\n\n\n#### Value\n\nA character string representing the absolute path to the hidden flag file.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Get the flag path for a process named \"data_processing\"\nlfa_get_flag_path(\"data_processing\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_flag_path(flag_name)\n```\n:::\n\n\n\n### `lfa_get_neighbor_paths`\n\nGet Paths to Neighbor GeoPackage Files\n\n\n#### Description\n\nThis function retrieves the file paths to GeoPackage files containing neighbor information for each detection area.\n The GeoPackage files are assumed to be named \"neighbours.gpkg\" and organized in a directory structure under the \"data\" folder.\n\n\n#### Value\n\nA character vector containing file paths to GeoPackage files for each detection area's neighbors.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Get paths to neighbor GeoPackage files for all areas\npaths <- lfa_get_neighbor_paths()\n\n# Print the obtained file paths\nprint(paths)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_neighbor_paths()\n```\n:::\n\n\n\n### `lfa_get_species`\n\nGet a list of species from the data directory.\n\n\n#### Concept\n\ndata retrieval functions\n\n\n#### Description\n\nThis function retrieves a list of species by scanning the \"data\" directory\n located in the current working directory.\n\n\n#### Keyword\n\ndata\n\n\n#### References\n\nThis function relies on the [`list.dirs`](#list.dirs) function for directory listing.\n\n\n#### Seealso\n\n[`list.dirs`](#list.dirs) \n \n Other data retrieval functions:\n [`lfa_get_detections`](#lfagetdetections)\n\n\n#### Value\n\nA character vector containing the names of species found in the \"data\" directory.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Retrieve the list of species\nspecies_list <- lfa_get_species()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_species()\n```\n:::\n\n\n\n### `lfa_ground_correction`\n\nCorrect the point clouds for correct ground imagery\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | An LASCatalog object. If not null, it will perform the actions on this object, if NULL inferring the catalog from the tile_location\n`tile_location` | A tile_location type object holding the information about the location of the cataog. This is used to save the catalog after processing too.\n\n\n#### Author\n\nJakob Danel\n\n\n#### Description\n\nThis function is needed to correct the Z value of the point cloud, relative to the real\n ground height. After using this function to your catalog, the Z values can be seen as the\n real elevation about the ground. At the moment the function uses the `tin()` function from\n the `lidr` package. NOTE : The operation is inplace and can not be reverted, the old values\n of the point cloud will be deleted!\n\n\n#### Value\n\nA catalog with the corrected z values. The catalog is always stored at tile_location and\n holding only the transformed values.\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_ground_correction(ctg, tile_location)\n```\n:::\n\n\n\n### `lfa_init_data_structure`\n\nInitialize data structure for species and areas\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`sf_species` | A data frame with information about species and associated areas.\n\n\n#### Description\n\nThis function initializes the data structure for storing species and associated areas.\n\n\n#### Details\n\nThe input data frame, `sf_species` , should have at least the following columns:\n \n\n* \"species\": The names of the species for which the data structure needs to be initialized. \n\n* \"name\": The names of the associated areas. \n \n The function creates directories based on the species and area information provided in\n the `sf_species` data frame. It checks whether the directories already exist and creates\n them if they don't.\n\n\n#### Value\n\nNone\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Example species data frame\nsf_species <- data.frame(\nspecies = c(\"SpeciesA\", \"SpeciesB\"),\nname = c(\"Area1\", \"Area2\"),\n# Other necessary columns\n)\n\nlfa_init_data_structure(sf_species)\n\n# Example species data frame\nsf_species <- data.frame(\nspecies = c(\"SpeciesA\", \"SpeciesB\"),\nname = c(\"Area1\", \"Area2\"),\n# Other necessary columns\n)\n\nlfa_init_data_structure(sf_species)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_init_data_structure(sf_species)\n```\n:::\n\n\n\n### `lfa_init`\n\nInitialize LFA (LiDAR forest analysis) data processing\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`sf_file` | A character string specifying the path to the shapefile containing spatial features of research areas.\n\n\n#### Description\n\nThis function initializes the LFA data processing by reading a shapefile containing\n spatial features of research areas, downloading the specified areas, and creating\n tile location objects for each area.\n\n\n#### Details\n\nThis function reads a shapefile ( `sf_file` ) using the `sf` package, which should\n contain information about research areas. It then calls the `lfa_download_areas` \n function to download the specified areas and `lfa_create_tile_location_objects` \n to create tile location objects based on Lidar data files in those areas. The\n shapefile MUST follow the following requirements:\n \n\n* Each geometry must be a single object of type polygon \n\n* Each entry must have the following attributes: \n\n* species: A string describing the tree species of the area. \n\n* name: A string describing the location of the area.\n\n\n#### Value\n\nA vector containing tile location objects.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Initialize LFA processing with the default shapefile\nlfa_init()\n\n# Initialize LFA processing with a custom shapefile\nlfa_init(\"custom_areas.shp\")\n\n# Example usage with the default shapefile\nlfa_init()\n\n# Example usage with a custom shapefile\nlfa_init(\"custom_areas.shp\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_init(sf_file = \"research_areas.shp\")\n```\n:::\n\n\n\n### `lfa_intersect_areas`\n\nIntersect Lidar Catalog with Spatial Features\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | A LAScatalog object representing the Lidar data to be processed.\n`tile_location` | A tile location object representing the specific area of interest.\n`areas_sf` | Spatial features defining areas.\n\n\n#### Description\n\nThis function intersects a Lidar catalog with a specific area defined by spatial features.\n\n\n#### Details\n\nThe function intersects the Lidar catalog specified by `ctg` with a specific area defined by\n the `tile_location` object and `areas_sf` . It removes points outside the specified area and\n returns a modified LAScatalog object.\n \n The specified area is identified based on the `species` and `name` attributes in the\n `tile_location` object. If a matching area is not found in `areas_sf` , the function\n stops with an error.\n \n The function then transforms the spatial reference of the identified area to match that of\n the Lidar catalog using `sf::st_transform` .\n \n The processing is applied to each chunk in the catalog using the `identify_area` function,\n which merges spatial information and filters out points that are not classified as inside\n the identified area. After processing, the function writes the modified LAS files back to\n the original file locations, removing points outside the specified area.\n \n If an error occurs during the processing of a chunk, a warning is issued, and the function\n continues processing the next chunks. If no points are found after filtering, a warning is\n issued, and NULL is returned.\n\n\n#### Seealso\n\nOther functions in the Lidar forest analysis (LFA) package.\n\n\n#### Value\n\nA modified LAScatalog object with points outside the specified area removed.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Example usage\nlfa_intersect_areas(ctg, tile_location, areas_sf)\n\n# Example usage\nlfa_intersect_areas(ctg, tile_location, areas_sf)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_intersect_areas(ctg, tile_location, areas_sf)\n```\n:::\n\n\n\n### `lfa_jsd_from_vec`\n\nCompute Jensen-Shannon Divergence from Vectors\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`x` | A numeric vector.\n`y` | A numeric vector.\n\n\n#### Description\n\nThis function calculates the Jensen-Shannon Divergence (JSD) between two vectors.\n\n\n#### Value\n\nJensen-Shannon Divergence between the density distributions of x and y.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- rnorm(100)\ny <- rnorm(100, mean = 2)\nlfa_jsd_from_vec(x, y)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_jsd_from_vec(x, y)\n```\n:::\n\n\n\n### `lfa_jsd`\n\nJensen-Shannon Divergence Calculation\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`p` | A numeric vector representing the probability distribution P.\n`q` | A numeric vector representing the probability distribution Q.\n`epsilon` | A small positive constant added to both P and Q to avoid logarithm of zero. Default is 1e-10.\n\n\n#### Description\n\nThis function calculates the Jensen-Shannon Divergence (JSD) between two probability distributions P and Q.\n\n\n#### Details\n\nThe JSD is computed using the Kullback-Leibler Divergence (KLD) as follows:\n `sum((p * log((p + epsilon) / (m + epsilon)) + q * log((q + epsilon) / (m + epsilon))) / 2)` \n where `m = (p + q) / 2` .\n\n\n#### Seealso\n\n[`kld`](#kld) , [`sum`](#sum) , [`log`](#log)\n\n\n#### Value\n\nA numeric value representing the Jensen-Shannon Divergence between P and Q.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Calculate JSD between two probability distributions\np_distribution <- c(0.2, 0.3, 0.5)\nq_distribution <- c(0.1, 0, 0.9)\njsd_result <- jsd(p_distribution, q_distribution)\nprint(jsd_result)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_jsd(p, q, epsilon = 1e-10)\n```\n:::\n\n\n\n### `lfa_kld_from_vec`\n\nCompute Kullback-Leibler Divergence from Vectors\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`x` | A numeric vector.\n`y` | A numeric vector.\n\n\n#### Description\n\nThis function calculates the Kullback-Leibler Divergence (KLD) between two vectors.\n\n\n#### Value\n\nKullback-Leibler Divergence between the density distributions of x and y.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- rnorm(100)\ny <- rnorm(100, mean = 2)\nlfa_kld_from_vec(x, y)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_kld_from_vec(x, y)\n```\n:::\n\n\n\n### `lfa_kld`\n\nKullback-Leibler Divergence Calculation\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`p` | A numeric vector representing the probability distribution P.\n`q` | A numeric vector representing the probability distribution Q.\n`epsilon` | A small positive constant added to both P and Q to avoid logarithm of zero. Default is 1e-10.\n\n\n#### Description\n\nThis function calculates the Kullback-Leibler Divergence (KLD) between two probability distributions P and Q.\n\n\n#### Details\n\nThe KLD is computed using the formula:\n `sum(p * log((p + epsilon) / (q + epsilon)))` \n This avoids issues when the denominator (Q) contains zero probabilities.\n\n\n#### Seealso\n\n[`sum`](#sum) , [`log`](#log)\n\n\n#### Value\n\nA numeric value representing the Kullback-Leibler Divergence between P and Q.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Calculate KLD between two probability distributions\np_distribution <- c(0.2, 0.3, 0.5)\nq_distribution <- c(0.1, 0, 0.9)\nkld_result <- kld(p_distribution, q_distribution)\nprint(kld_result)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_kld(p, q, epsilon = 1e-10)\n```\n:::\n\n\n\n### `lfa_ks_test`\n\nKolmogorov-Smirnov Test Wrapper Function\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`x` | A numeric vector representing the first sample.\n`y` | A numeric vector representing the second sample.\n`output_variable` | A character string specifying the output variable to extract from the ks.test result. Default is \"p.value\". Other possible values include \"statistic\" and \"alternative\".\n`...` | Additional arguments to be passed to the ks.test function.\n\n\n#### Description\n\nThis function serves as a wrapper for the Kolmogorov-Smirnov (KS) test between two samples.\n\n\n#### Details\n\nThe function uses the ks.test function to perform a two-sample KS test and returns the specified output variable.\n The default output variable is the p-value. Other possible output variables include \"statistic\" and \"alternative\".\n\n\n#### Seealso\n\n[`ks.test`](#ks.test)\n\n\n#### Value\n\nA numeric value representing the specified output variable from the KS test result.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Perform KS test and extract the p-value\nresult <- lfa_ks_test(sample1, sample2)\nprint(result)\n\n# Perform KS test and extract the test statistic\nresult_statistic <- lfa_ks_test(sample1, sample2, output_variable = \"statistic\")\nprint(result_statistic)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_ks_test(x, y, output_variable = \"p.value\", ...)\n```\n:::\n\n\n\n### `lfa_load_ctg_if_not_present`\n\nLoading the catalog if it is not present\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | Catalog object. Can be NULL\n`tile_location` | The location to look for the catalog tiles, if their are not present\n\n\n#### Description\n\nThis function checks if the catalog is `NULL` . If it is it will load the\n catalog from the `tile_location`\n\n\n#### Value\n\nThe provided ctg object if not null, else the catalog for the tiles\n of the tile_location.\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_load_ctg_if_not_present(ctg, tile_location)\n```\n:::\n\n\n\n### `lfa_map_tile_locations`\n\nMap Function Over Tile Locations\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`tile_locations` | A list of tile location objects.\n`map_function` | The mapping function to be applied to each tile location.\n`...` | Additional arguments to be passed to the mapping function.\n\n\n#### Description\n\nThis function applies a specified mapping function to each tile location in a list.\n\n\n#### Details\n\nThis function iterates over each tile location in the provided list ( `tile_locations` )\n and applies the specified mapping function ( `map_function` ) to each tile location.\n The mapping function should accept a tile location object as its first argument, and\n additional arguments can be passed using the ellipsis ( `...` ) syntax.\n \n This function is useful for performing operations on multiple tile locations concurrently,\n such as loading Lidar data, processing areas, or other tasks that involve tile locations.\n\n\n#### Seealso\n\nThe mapping function provided should be compatible with the structure and requirements\n of the tile locations and the specific task being performed.\n\n\n#### Value\n\nNone\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Example usage\nlfa_map_tile_locations(tile_locations, my_mapping_function, param1 = \"value\")\n\n# Example usage\nlfa_map_tile_locations(tile_locations, my_mapping_function, param1 = \"value\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_map_tile_locations(tile_locations, map_function, check_flag = NULL, ...)\n```\n:::\n\n\n\n### `lfa_merge_and_save`\n\nMerge and Save Text Files in a Directory\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`input_directory` | The path to the input directory containing text files.\n`output_name` | The name for the output file where the merged content will be saved.\n\n\n#### Description\n\nThis function takes an input directory and an output name as arguments.\n It merges the textual content of all files in the specified directory into\n a single string, with each file's content separated by a newline character.\n The merged content is then saved into a file named after the output name\n in the same directory. After the merging is complete, all input files are\n deleted.\n\n\n#### Details\n\nThis function reads the content of each text file in the specified input directory\n and concatenates them into a single string. Each file's content is separated by a newline\n character. The merged content is then saved into a file named after the output name\n in the same directory. Finally, all input files are deleted from the directory.\n\n\n#### Seealso\n\n[`readLines`](#readlines) , [`writeLines`](#writelines) , [`file.remove`](#file.remove)\n\n\n#### Value\n\nThis function does not explicitly return any value. It prints a message\n indicating the successful completion of the merging and saving process.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Merge text files in the \"data_files\" directory and save the result in \"merged_output\"\nlfa_merge_and_save(\"data_files\", \"merged_output\")\n\n# Merge text files in the \"data_files\" directory and save the result in \"merged_output\"\nlfa_merge_and_save(\"data_files\", \"merged_output\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_merge_and_save(input_directory, output_name)\n```\n:::\n\n\n\n### `lfa_random_forest`\n\nRandom Forest Classifier with Leave-One-Out Cross-Validation\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`tree_data` | A data frame containing the tree data, including the response variable (\"specie\") and predictor variables.\n`excluded_input_columns` | A character vector specifying columns to be excluded from predictor variables.\n`response_variable` | The response variable to be predicted (default is \"specie\").\n`seed` | An integer to set the seed for reproducibility (default is 123).\n`...` | Additional parameters to be passed to the randomForest function.\n\n\n#### Description\n\nThis function performs a random forest classification using leave-one-out cross-validation for each area in the input tree data.\n It returns a list containing various results, including predicted species, confusion matrix, accuracy, and the formula used for modeling.\n\n\n#### Value\n\nA list containing the following elements:\n \n\n* `predicted_species_absolute` : A data frame with observed and predicted species for each area. \n\n* `predicted_species_relative` : A data frame wit the relative precictions per speices and areas, normalized by the total predictions in each area. \n\n* `confusion_matrix` : A confusion matrix showing the counts of predicted vs. observed species. \n\n* `accuracy` : The accuracy of the model, calculated as the sum of diagonal elements in the confusion matrix divided by the total count. \n\n* `formula` : The formula used for modeling.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Assuming tree_data is defined\nresults <- lfa_random_forest(tree_data, excluded_input_columns = c(\"column1\", \"column2\"))\n\n# Print the list of results\nprint(results)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_random_forest(\n tree_data,\n excluded_input_columns,\n response_variable = \"specie\",\n ntree = 100,\n seed = 123,\n ...\n)\n```\n:::\n\n\n\n### `lfa_rd_to_qmd`\n\nConvert Rd File to Markdown\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`rdfile` | The path to the Rd file or a parsed Rd object.\n`outfile` | The path to the output Markdown file (including the file extension).\n`append` | Logical, indicating whether to append to an existing file (default is FALSE).\n\n\n#### Description\n\nIMPORTANT NOTE: \n This function is nearly identical to the `Rd2md::Rd2markdown` function from the `Rd2md` \n package. We needed to implement our own version of it because of various reasons:\n \n\n* The algorithm uses hardcoded header sizes (h1 and h2 in original) which is not feasible for our use-case of the markdown. \n\n* We needed to add some Quarto Markdown specifics, e.g. to make sure that the examples will not be runned. \n\n* We want to exclude certain tags from our implementation.\n\n\n#### Details\n\nFor that reason we copied the method and made changes as needed and also added this custom documentation.\n \n This function converts an Rd (R documentation) file to Markdown format (.md) and\n saves the converted file at the specified location. The function allows appending\n to an existing file or creating a new one. The resulting Markdown file includes\n sections for the function's name, title, and additional content such as examples,\n usage, arguments, and other sections present in the Rd file.\n \n The function performs the following steps:\n \n\n* Parses the Rd file using the Rd2md package. \n\n* Creates a Markdown file with sections for the function's name, title, and additional content. \n\n* Appends the content to an existing file if `append` is set to TRUE. \n\n* Saves the resulting Markdown file at the specified location.\n\n\n#### Seealso\n\n[`Rd2md::parseRd`](#rd2md::parserd)\n\n\n#### Value\n\nThis function does not explicitly return any value. It saves the converted Markdown file\n at the specified location as described in the details section.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Convert Rd file to Markdown and save it\nlfa_rd_to_md(\"path/to/your/file.Rd\", \"path/to/your/output/file.md\")\n\n# Convert Rd file to Markdown and append to an existing file\nlfa_rd_to_md(\"path/to/your/file.Rd\", \"path/to/existing/output/file.md\", append = TRUE)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_rd_to_qmd(rdfile, outfile, append = FALSE)\n```\n:::\n\n\n\n### `lfa_rd_to_results`\n\nConvert Rd Files to Markdown and Merge Results\n\n\n#### Description\n\nThis function converts all Rd (R documentation) files in the \"man\" directory\n to Markdown format (.qmd) and saves the converted files in the \"results/appendix/package-docs\" directory.\n It then merges the converted Markdown files into a single string and saves\n the merged content into a file named \"docs.qmd\" in the \"results/appendix/package-docs\" directory.\n\n\n#### Details\n\nThe function performs the following steps:\n \n\n* Removes any existing \"docs.qmd\" file in the \"results/appendix/package-docs\" directory. \n\n* Finds all Rd files in the \"man\" directory. \n\n* Converts each Rd file to Markdown format (.qmd) using the `lfa_rd_to_qmd` function. \n\n* Saves the converted Markdown files in the \"results/appendix/package-docs\" directory. \n\n* Merges the content of all converted Markdown files into a single string. \n\n* Saves the merged content into a file named \"docs.qmd\" in the \"results/appendix/package-docs\" directory.\n\n\n#### Seealso\n\n[`lfa_rd_to_qmd`](#lfardtoqmd) , [`lfa_merge_and_save`](#lfamergeandsave)\n\n\n#### Value\n\nThis function does not explicitly return any value. It performs the conversion,\n merging, and saving operations as described in the details section.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Convert Rd files to Markdown and merge the results\nlfa_rd_to_results()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_rd_to_results()\n```\n:::\n\n\n\n### `lfa_read_area_as_catalog`\n\nRead LiDAR data from a specified species and location as a catalog.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`specie` | A character string specifying the species of interest.\n`location_name` | A character string specifying the name of the location.\n\n\n#### Description\n\nThis function constructs the file path based on the specified `specie` and `location_name` ,\n lists the directories at that path, and reads the LiDAR data into a `lidR::LAScatalog` .\n\n\n#### Value\n\nA `lidR::LAScatalog` object containing the LiDAR data from the specified location and species.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_read_area_as_catalog(\"beech\", \"location1\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_read_area_as_catalog(specie, location_name)\n```\n:::\n\n\n\n### `lfa_run_test_asymmetric`\n\nAsymmetric Pairwise Test for Categories\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`data` | A data frame containing the relevant columns.\n`data_column` | A character string specifying the column containing the numerical data.\n`category_column` | A character string specifying the column containing the categorical variable.\n`test_function` | A function used to perform the pairwise test between two sets of data. It should accept two vectors of numeric data and additional parameters specified by `...` . The function should return a numeric value representing the test result.\n`...` | Additional parameters to be passed to the `test_function` .\n\n\n#### Description\n\nThis function performs an asymmetric pairwise test for categories using a user-defined `test_function` .\n\n\n#### Details\n\nThe function calculates the test results for each unique combination of categories using the specified\n `test_function` . The resulting table is asymmetric, containing the test results for comparisons\n from the rows to the columns.\n\n\n#### Seealso\n\n[`outer`](#outer) , [`Vectorize`](#vectorize)\n\n\n#### Value\n\nA data frame representing the results of the asymmetric pairwise tests between categories.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Define a custom test function\ncustom_test_function <- function(x, y) {\n# Your test logic here\n# Return a numeric result\nreturn(mean(x) - mean(y))\n}\n\n# Perform an asymmetric pairwise test\nresult <- lfa_run_test_asymmetric(your_data, \"numeric_column\", \"category_column\", custom_test_function)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_run_test_asymmetric(data, data_column, category_column, test_function, ...)\n```\n:::\n\n\n\n### `lfa_run_test_symmetric`\n\nSymmetric Pairwise Test for Categories\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`data` | A data frame containing the relevant columns.\n`data_column` | A character string specifying the column containing the numerical data.\n`category_column` | A character string specifying the column containing the categorical variable.\n`test_function` | A function used to perform the pairwise test between two sets of data. It should accept two vectors of numeric data and additional parameters specified by `...` . The function should return a numeric value representing the test result.\n`...` | Additional parameters to be passed to the `test_function` .\n\n\n#### Description\n\nThis function performs a symmetric pairwise test for categories using a user-defined `test_function` .\n\n\n#### Details\n\nThe function calculates the test results for each unique combination of categories using the specified\n `test_function` . The resulting table is symmetric, containing the test results for comparisons\n from the rows to the columns. The upper triangle of the matrix is filled with `NA` to avoid duplicate results.\n\n\n#### Seealso\n\n[`outer`](#outer) , [`Vectorize`](#vectorize)\n\n\n#### Value\n\nA data frame representing the results of the symmetric pairwise tests between categories.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Define a custom test function\ncustom_test_function <- function(x, y) {\n# Your test logic here\n# Return a numeric result\nreturn(mean(x) - mean(y))\n}\n\n# Perform a symmetric pairwise test\nresult <- lfa_run_test_symmetric(your_data, \"numeric_column\", \"category_column\", custom_test_function)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_run_test_symmetric(data, data_column, category_column, test_function, ...)\n```\n:::\n\n\n\n### `lfa_save_all_neighbours`\n\nSave Neighbors for All Areas\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`n` | The number of nearest trees to find for each tree (default is 100).\n\n\n#### Description\n\nThis function iterates through all detection areas, finds the n nearest trees for each tree,\n and saves the result to a GeoPackage file for each area.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Save neighbors for all areas with default value (n=100)\nlfa_save_all_neighbours()\n\n# Save neighbors for all areas with a specific value of n (e.g., n=50)\nlfa_save_all_neighbours(n = 50)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_save_all_neighbours(n = 100)\n```\n:::\n\n\n\n### `lfa_segmentation`\n\nSegment the elements of an point cloud by trees\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | An LASCatalog object. If not null, it will perform the actions on this object, if NULL inferring the catalog from the tile_location\n`tile_location` | A tile_location type object holding the information about the location of the catalog. This is used to save the catalog after processing too.\n\n\n#### Author\n\nJakob Danel\n\n\n#### Description\n\nThis function will try to to divide the hole point cloud into unique trees.\n Therefore it is assigning for each chunk of the catalog a `treeID` for each\n point. Therefore the algorithm uses the `li2012` implementation with the\n following parameters: `li2012(dt1 = 2, dt2 = 3, R = 2, Zu = 10, hmin = 5, speed_up = 12)` \n NOTE : The operation is in place and can not be reverted, the old values\n of the point cloud will be deleted!\n\n\n#### Value\n\nA catalog where each chunk has additional `treeID` values indicating the belonging tree.\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_segmentation(ctg, tile_location)\n```\n:::\n\n\n\n### `lfa_set_flag`\n\nSet a flag to indicate the completion of a specific process.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`flag_name` | A character string specifying the name of the flag file. It should be a descriptive and unique identifier for the process being flagged.\n\n\n#### Description\n\nThis function creates a hidden flag file at a specified location within the working directory to indicate that a particular processing step has been completed. If the flag file already exists, a warning is issued.\n\n\n#### Value\n\nThis function does not have a formal return value.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Set the flag for a process named \"data_processing\"\nlfa_set_flag(\"data_processing\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_set_flag(flag_name)\n```\n:::\n\n\n\n", + "markdown": "---\ntitle: \"Forest Data Analysis Report\"\noutput:\n pdf_document:\n latex_engine: xelatex\ntoc: true\ntoc-depth: 2\ntoc-title: Contents\nnumber-sections: true\nnumber-depth: 3\ndate: today\nauthor:\n - name: Jakob Danel\n email: jakob.danel@uni-muenster.de\n url: https://github.com/jakobdanel\n affiliations:\n - name: Universität Münster\n city: Münster\n country: Germany\n - name: Federick Bruch\n email: f_bruc03@uni-muenster.de\n url: https://www.uni-muenster.de/Geoinformatics/institute/staff/index.php/351/Frederick_Bruch\n affiliations:\n - name: Universität Münster\n city: Münster\n country: Germany\nbibliography: references.bib\nexecute-dir: .. \nprefer-html: true\n---\n\n\n# Introduction\n\nThis report documents the analysis of forest data for different tree species.\n\n# Methods\n\n## Data acquisition\n\nOur primary objective is to identify patches where one tree species exhibits a high level of dominance, striving to capture monocultural stands within the diverse forests of Nordrhein-Westfalia (NRW). Recognizing the practical challenges of finding true monocultures, we aim to identify patches where one species is highly dominant, enabling meaningful comparisons across different species.\n\nThe study is framed within the NRW region due to the availability of an easily accessible dataset. Our focus includes four prominent tree species in NRW: oak, beech, spruce, and pine, representing the most prevalent species in the region. To ensure the validity of our findings, we derive three patches for each species, thereby confirming that observed variables are characteristic of a particular species rather than a specific patch. Each patch is carefully selected to encompass an area of approximately 50-100 hectares and contain between 5,000 and 10,000 trees. Striking a balance between relevance and manageability, these patches avoid excessive size to enhance the likelihood of capturing varied species mixes and ensure compatibility with local hardware.\n\nSpecific Goals:\n\n1. Retrieve patches with highly dominant tree species.\n2. Minimize or eliminate the presence of human-made structures within the selected patches.\n\nTo achieve our goals, we utilized the waldmonitor dataset [@welle2014] and the map provided by [@Blickensdoerfer2022], both indicating dominant tree species in NRW. We identified patches of feasible size where both sources predicted the presence of a specific species. Further validation involved examining sentinel images of these forest regions to assess the evenness of structures, leaf color distribution, and the absence of significant human-made structures such as roads or buildings. The subsequent preprocessing steps, detailed in the following subsection, involved refining our selected patches and deriving relevant variables, such as tree distribution and density, to ensure that the chosen areas align with the desired research domains.\n\n## Preprocessing\n::: {.cell}\n\n:::\n\n\nIn this research study, the management and processing of a large dataset are crucial considerations. The dataset's substantial size necessitates careful maintenance to ensure efficient handling. Furthermore, the data should be easily processable and editable to facilitate necessary corrections and precalculations within the context of our research objectives. To achieve our goals, we have implemented a framework that automatically derives data based on a shapefile, delineating areas of interest. The processed data and results of precalculations are stored in a straightforward manner to enhance accessibility. Additionally, we have designed functions that establish a user-friendly interface, enabling the execution of algorithms on subsets of the data, such as distinct species. These interfaces are not only directly callable by users but can also be integrated into other functions to automate processes. The overarching aim is to streamline the entire preprocessing workflow using a single script, leveraging only the shapefile as a basis. This subsection details the accomplishments of our R-package in realizing these goals, outlining the preprocessing steps undertaken and justifying their necessity in the context of our research.\n\nThe data are stored in a data subdirectory of the root directory in the format `species/location-name/tile-name`. To automate the matching of areas of interest with the catalog from the Land NRW[^1], we utilize the intersecting tool developed by Heisig[^2]. This tool, allows for the automatic retrieval and placement of data downloaded from the Land NRW catalog. To enhance data accessibility, we have devised an object that incorporates species, location name, and tile name (the NRW internal identifier) for each area This object facilitates the specification of the area to be processed. Additionally, we have defined an initialization function that downloads all tiles, returning a list of tile location objects for subsequent processing. A pivotal component of the package's preprocessing functionality is the map function, which iterates over a list of tile locations (effectively the entire dataset) and accepts a processing function as an argument. The subsequent paragraph outlines the specific preprocessing steps employed, all of which are implemented within the mapping function.\n\nTo facilitate memory-handling capabilities, each of the tiles, where one area can span multiple tiles, has been split into manageable chunks. We employed a 50x50m size for each tile, resulting in the division of original 1km x 1km files into 400 tiles. These tiles are stored in our directory structure, with each tile housed in a directory named after its tile name and assigned an id as the filename. Implementation-wise, the `lidr::catalog_retile` function was instrumental in achieving this segmentation. The resulting smaller chunks allow for efficient iteration during subsequent preprocessing steps.\n\nThe next phase involves reducing our data to the actual size by intersecting the tiles with the defined area of interest. Using the `lidR::merge_spatial` function, we intersect the area derived from the shapefile, removing all point cloud items outside this region. Due to our tile-wise approach, empty tiles may arise, and in such cases, those tiles are simply deleted.\n\nFollowing the size reduction to our dataset, the next step involves correcting the `z` values. The `z` values in the data are originally relative to the ellipsoid used for referencing, but we require them to be relative to the ground. To achieve this, we utilize the `lidR::tin` function, which extrapolates a convex hull between all ground points (classified by the data provider) and calculates the z value based on this structure.\n\nSubsequently, we aim to perform segmentation for each distinct tree, marking each item of the point cloud with a tree ID. We employ the algorithm described by @li2012, using parameters `li2012(dt1 = 2, dt2 = 3, R = 2, Zu = 10, hmin = 5, speed_up = 12)`. The meanings of these parameters are elucidated in Li et al.'s work [@li2012].\n\nFinally, the last preprocessing step involves individual tree detection, seeking a single `POINT` object for each tree. The `lidR::lmf` function, an implementation of the tree data using a local maximum approach, is utilized for this purpose [@popescu2004]. The results are stored in GeoPackage files within our data structure.\n\nSee @sec-appendix-preprocessing for the implementation of the preprocessing.\n\n[^1]: https://www.opengeodata.nrw.de/produkte/geobasis/hm/3dm_l_las/3dm_l_las/, last visited 7th Dec 2023\n[^2]: https://github.com/joheisig/GEDIcalibratoR, last visited 7th Dec 2023\n\n## Analysis of different distributions\n\nAnalysis of data distributions is a critical aspect of our research, with a focus on comparing two or more distributions. Our objective extends beyond evaluating the disparities between species; we also aim to assess differences within a species. To gain a comprehensive understanding of the data, we employ various visualization techniques, including histograms, density functions, and box plots.\n\nIn tandem with visualizations, descriptive statistics, such as means, standard errors, and quantiles, are leveraged to provide key insights into the central tendency and variability of the data.\n\nFor a more quantitative analysis of distribution dissimilarity, statistical tests are employed. The Kullback-Leibler (KL) difference serves as a measure to compare the similarity of a set of distributions. This involves converting distributions into their density functions, with the standard error serving as the bandwidth. The KL difference is calculated for each pair of distributions, as it is asymmetric. For the two distributions the KL difference is defined as following [@kullback1951kullback]:\n\n$$\nD_{KL}(P \\, \\| \\, Q) = \\sum_i P(i) \\log\\left(\\frac{P(i)}{Q(i)}\\right)\n$$\n\nTo obtain a symmetric score, the Jensen-Shannon Divergence (JSD) is utilized [@grosse2002analysis], expressed by the formula:\n\n$$\nJS(P || Q) = \\frac{1}{2} * KL(P || M) + \\frac{1}{2} * KL(Q || M)\n$$\nHere, $M = \\frac{1}{2} * (P + Q)$. The JSD provides a balanced measure of dissimilarity between distributions [@Brownlee2019Calculate]. For comparing the different scores to each other, we will use averages.\n\nAdditionally, the Kolmogorov-Smirnov Test is implemented to assess whether two distributions significantly differ from each other. This statistical test offers a formal evaluation of the dissimilarity between empirical distribution functions.\n\n\n# Results\n::: {.cell}\n\n:::\n\n## Researched areas\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nlibrary(ggplot2)\nsf::sf_use_s2(FALSE)\npatches <- sf::read_sf(\"research_areas.shp\") |> sf::st_centroid()\n\nde <- sf::read_sf(\"results/results/states_de/Bundesländer_2017_mit_Einwohnerzahl.shp\") # Source: https://hub.arcgis.com/datasets/esri-de-content::bundesl%C3%A4nder-2017-mit-einwohnerzahl/explore?location=51.099647%2C10.454033%2C7.43\nnrw <- de[5,] |> sf::st_geometry()\n\n\nggplot() + geom_sf(data = nrw) + \n geom_sf(data = patches, mapping = aes(col = species))\n```\n\n::: {.cell-output-display}\n![Locations of the different patches with the dominant species for that patch. The patches centroids are displayed on a basemap describing the borders from NRW.](report_files/figure-html/fig-patches-nrw-1.png){#fig-patches-nrw width=672}\n:::\n:::\nWe draw three patches for each species from different regions (see @tbl-summary-researched-areas). We download the LiDAR data for those patches and runned all preprocessing steps as described. We than checked with certain derived parameters (e.g. tree heights, tree distributions or tree density) that all patches contain valid forest data. In that step we discovered, that in one patch some forest clearance took place in the near past. This patch was removed from the dataset and was replaced with a new one. \n\nIn our research, drawing patches evenly distributed across Nordrhein-Westfalia is inherently constrained by natural factors. Consequently, the patches for oak and pine predominantly originate from the Münsterland region, as illustrated in [@fig-patches-nrw]. For spruce, the patches were derived from Sauerland, reflecting the prevalence of spruce forests in this specific region within NRW, as corroborated by Welle et al. [@welle2014] and Blickensdörfer et al. [@Blickensdoerfer2022]. Beech patches, on the other hand, were generated from diverse locations within NRW. Across all patches, no human-made objects were identified, with the exception of small paths for pedestrians and forestry vehicles.\n\nThe distribution of area and detections is notable for each four species. Beech covers 69,791.9 hectares with a total of 5,954 detections, oak spans 63,232.49 hectares with 5,354 detections, pine extends across 72,862.4 hectares with 8,912 detections, and spruce encompasses 57,940.02 hectares with 8,619 detections. Both the amount of detections and the corresponding area exhibit a relatively uniform distribution across the diverse patches, as summarized in @tbl-summary-researched-areas. \n\nWith the selected dataset described, we intentionally chose three patches for each four species that exhibit a practical and usable size for our research objectives. These carefully chosen patches align with the conditions essential for our study, providing comprehensive and representative data for in-depth analysis and meaningful insights into the characteristics of each tree species within the specified areas.\n\n\n::: {#tbl-summary-researched-areas .cell tbl-cap='Summary of researched patches grouped by species, with their location, area and the amount of detected trees.'}\n\n```{.r .cell-code code-fold=\"true\"}\nshp <- sf::read_sf(\"research_areas.shp\")\ntable <- lfa::lfa_get_all_areas()\n\nsf::sf_use_s2(FALSE)\nfor (row in 1:nrow(table)) {\n area <-\n dplyr::filter(shp, shp$species == table[row, \"specie\"] &\n shp$name == table[row, \"area\"])\n area_size <- area |> sf::st_area()\n point <- area |> sf::st_centroid() |> sf::st_coordinates()\n table[row,\"point\"] <- paste0(\"(\",round(point[1], digits = 4),\", \",round(point[2],digits = 4),\")\")\n \n table[row, \"area_size\"] = round(area_size,digits = 2) #paste0(round(area_size,digits = 2), \" m²\")\n \n amount_det <- nrow(lfa::lfa_get_detection_area(table[row, \"specie\"], table[row, \"area\"]))\n if(is.null(amount_det)){\n cat(nrow(lfa::lfa_get_detection_area(table[row, \"specie\"], table[row, \"area\"])),table[row, \"specie\"],table[row, \"area\"])\n }\n table[row, \"amount_detections\"] = amount_det\n \n # table[row, \"specie\"] <- lfa::lfa_capitalize_first_char(table[row,\"specie\"])\n table[row, \"area\"] <- lfa::lfa_capitalize_first_char(table[row,\"area\"])\n }\ntable$area <- gsub(\"_\", \" \", table$area)\ntable$area <- gsub(\"ue\", \"ü\", table$area)\ntable = table[,!names(table) %in% c(\"specie\")]\n\nknitr::kable(table, \"html\", col.names = c(\"Patch Name\",\"Location\",\"Area size (m²)\",\"Amount tree detections\" ), caption = NULL, digits = 2, escape = TRUE) |>\n kableExtra::kable_styling(\n bootstrap_options = c(\"striped\", \"hold_position\", \"bordered\",\"responsive\"),\n stripe_index = c(1:3,7:9),\n full_width = FALSE\n ) |>\n kableExtra::pack_rows(\"Beech\", 1, 3) |>\n kableExtra::pack_rows(\"Oak\", 4, 6) |>\n kableExtra::pack_rows(\"Pine\", 7, 9) |>\n kableExtra::pack_rows(\"Spruce\", 10, 12) |>\n kableExtra::column_spec(1, bold = TRUE)\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n \n \n \n \n \n \n \n \n\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Patch Name Location Area size (m²) Amount tree detections
Beech
Bielefeld brackwede (8.5244, 51.9902) 161410.57 1443
Billerbeck (7.3273, 51.9987) 185887.25 1732
Wülfenrath (7.0769, 51.2917) 350621.21 2779
Oak
Hamm (7.8618, 51.6639) 269397.22 2441
Münster (7.6187, 51.9174) 164116.61 1270
Rinkerode (7.6744, 51.8598) 198811.09 1643
Pine
Greffen (8.1697, 51.9913) 49418.81 513
Mesum (7.5403, 52.2573) 405072.85 5031
Telgte (7.7816, 52.0024) 274132.34 3368
Spruce
Brilon (8.5352, 51.4084) 211478.20 3342
Oberhundem (8.1861, 51.0909) 151895.53 2471
Osterwald (8.3721, 51.2151) 216026.43 2806
\n\n`````\n:::\n:::\n\n\n\n\n\n## Distribution of the tree heights\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\ndetections <- lfa::lfa_get_detections()\n```\n:::\n\nIn this study, we scrutinize the distribution of tree heights, focusing initially on the density distribution to unravel the nuances across various tree species. Notably, our examination reveals distinctive patterns, with Oak and Pine exhibiting significantly steeper peaks in their density curves compared to Beech and Spruce. While all species present unique density curves, a commonality emerges—each curve is characterized by a single peak, except for the intriguing exception observed in Telgte. Taking Beech as an illustrative example, our findings indicate a notable shift in the peak to a considerably higher extent. The varinace in the density curves indicating that an differencation between species only with the help oof tree height values could be difficult.\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nlfa::lfa_create_density_plots(detections, value_column = \"Z\", category_column1 = \"area\", category_column2 = \"specie\", title = \"Density of the height distributions\", xlims = c(0,50))\n```\n\n::: {.cell-output-display}\n![Density of the height distribitions of the detectected trees. Splitted by the different researched areas and grouped by the dominant specie in this area.](report_files/figure-html/fig-density-z-1.png){#fig-density-z width=672}\n:::\n:::\n\nTo have a deeper look into the distributions of those `Z`-values we will now also have a look into the boxplots of the height distrubutions in the different areas.\nNoteworthy observations include the presence of outliers beyond the extended range of the Whisker Antennas ($1.5*\\text{IQR}$) in all datasets. Of particular interest is the Rinkerode dataset, which exhibits a higher prevalence of outliers in the upper domain. Anomalies in this dataset are attributed to potential inaccuracies, urging a critical examination of data integrity. A pairwise examination of Oak and Pine species indicates higher mean heights for Oak compared to Pine. This insight underscores the significance of species-specific attributes in shaping overall height distributions. Further exploration into the factors contributing to these mean differences enhances our understanding of the unique characteristics inherent to each species. Contrary to expectations, the spread within a particular species does not exhibit significant divergence from the spread observed between different species. This finding suggests that while species-specific traits play a crucial role in shaping height distributions, certain overarching factors may contribute to shared patterns across diverse tree populations.\n\n\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nlfa::lfa_create_boxplot(detections, value_column = \"Z\", category_column1 = \"area\", category_column2 = \"specie\", title = \"Boxplots of the height distributions\")\n```\n\n::: {.cell-output-display}\n![Boxplots of the height distribitions of the detectected trees. Splitted by the different researched areas and grouped by the dominant specie in this area.](report_files/figure-html/fig-boxplot-z-1.png){#fig-boxplot-z width=672}\n:::\n:::\n\n\n\nOur examination of Kullback-Leibler Divergence (KLD) and Jensen-Shannon Divergence (JSD) metrics reveals low mean values (KLD: 5.252696, JSD: 2.246663) across different species, indicating overall similarity in tree species height distributions. However, within specific species, particularly Pine, higher divergence values (see @tbl-z-values-kld-pine and @tbl-z-values-jsd-pine) suggest significant intraspecific differences.\n\nNotably, the Spruce species consistently demonstrates low divergence values across all tested areas, implying a high level of explainability. This finding highlights tree height as a reliable indicator for detecting Spruce trees, indicating its potential for accurate species identification in diverse forest ecosystems.\n\n## Distribution of number of returns per detected tree.\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\ndata <- sf::st_read(\"data/tree_properties.gpkg\")\nneighbors <- lfa::lfa_get_neighbor_paths() |> lfa::lfa_combine_sf_obj(lfa::lfa_get_all_areas())\ndata = sf::st_join(data,neighbors, join = sf::st_within)\n```\n:::\nExamining the distribution of LiDAR returns per tree is the focus of our current investigation. Initial analysis involves the study of density graphs representing the distribution of LiDAR returns. The density curves for each species exhibit distinct peaks corresponding to their respective species, providing a clear differentiation in LiDAR return patterns. Notably, there is an exception observed in the Brilon patch (Spruce), where the curve deviates, possibly indicative of variations in forest age. A noteworthy trend is the divergent shape of density curves between coniferous and deciduous trees. Conifers exhibit steeper curves, indicating lower density for higher return values compared to deciduous trees. This disparity underscores the potential of LiDAR data to distinguish between tree types based on return density characteristics. In the case of Beech trees, the peaks' heights vary among different curves, suggesting nuanced variations within the species. Despite these differences, all species consistently peak in similar regions, emphasizing the overarching similarities in LiDAR return patterns across diverse tree species.\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nlfa::lfa_create_density_plots(data, value_column = \"number_of_returns\", category_column1 = \"area\", category_column2 = \"specie\", title = \"Density of the distribution of LiDAR returns per individual tree\", xlims = c(0,10000))\n```\n\n::: {.cell-output-display}\n![Density of the amount of LiDAR returns per detectected tree. Splitted by the different researched areas and grouped by the dominant specie in this area.](report_files/figure-html/fig-density-number-returns-1.png){#fig-density-number-returns width=672}\n:::\n:::\n\nCurrently, our investigation focuses on boxplots representing each patch. We observe significant size variations among plots within the same species. Notably, numerous outliers are present above the box in each patch. For Pines, the boxes exhibit a notable similarity. However, the box for Brilon is entirely shifted from other boxes associated with patches featuring Spruce forest.\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\nlfa::lfa_create_boxplot(data, value_column = \"number_of_returns\", category_column1 = \"area\", category_column2 = \"specie\", title = \"Boxplots of the distribution of LiDAR returns per individual tree\")\n```\n\n::: {.cell-output-display}\n![Boxplots of the the amount of LiDAR returns per detectected tree. Splitted by the different researched areas and grouped by the dominant specie in this area.](report_files/figure-html/fig-boxplot-number-returns-1.png){#fig-boxplot-number-returns width=672}\n:::\n:::\n\nOverall, our analysis reveals very low results for both Kullback-Leibler Divergence (KLD) and Jensen-Shannon Divergence (JSD) metrics across different species. Within species, there is high explainability observed for the different LiDAR return curves between patches.\n\nThis suggests that the number of returns alone may not be a robust predictor for identifying the dominant species in a forest. However, the curves indicate a clear potential for distinguishing between conifers (Pine and Spruce) and deciduous trees (Beech and Oak) based on the number of returns. This observation is further supported by the JSD scores, as detailed in @tbl-number-of-returns-jsd_specie.\n\n\n\n\n\n|specie |area | density (1/m²)|\n|:------|:-------------------|---------:|\n|beech |bielefeld_brackwede | 0.0089399|\n|beech |billerbeck | 0.0093175|\n|beech |wuelfenrath | 0.0079259|\n|oak |hamm | 0.0090610|\n|oak |muenster | 0.0077384|\n|oak |rinkerode | 0.0082641|\n|pine |greffen | 0.0103807|\n|pine |mesum | 0.0124200|\n|pine |telgte | 0.0122860|\n|spruce |brilon | 0.0158030|\n|spruce |oberhundem | 0.0162678|\n|spruce |osterwald | 0.0129892|\n\n\n\n# References\n\n::: {#refs}\n:::\n\n# Appendix\n## Script which can be used to do all preprocessing {#sec-appendix-preprocessing}\n\n::: {.cell}\n\n:::\n\n\nLoad the file with the research areas\n::: {.cell}\n\n```{.r .cell-code}\nsf <- sf::read_sf(here::here(\"research_areas.shp\"))\nprint(sf)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nSimple feature collection with 12 features and 3 fields\nGeometry type: POLYGON\nDimension: XY\nBounding box: xmin: 7.071625 ymin: 51.0895 xmax: 8.539877 ymax: 52.25983\nGeodetic CRS: WGS 84\n# A tibble: 12 × 4\n id species name geometry\n \n 1 1 oak rinkerode ((7.678922 51.85789, 7.675446 51.85752, 7.…\n 2 2 oak hamm ((7.858955 51.66699, 7.866444 51.66462, 7.…\n 3 3 oak muenster ((7.618908 51.9154, 7.617384 51.9172, 7.61…\n 4 4 pine greffen ((8.168691 51.98965, 8.167178 51.99075, 8.…\n 5 5 pine telgte ((7.779728 52.00662, 7.781616 52.00662, 7.…\n 6 6 pine mesum ((7.534424 52.25499, 7.53378 52.25983, 7.5…\n 7 7 beech bielefeld_brackwede ((8.524749 51.9921, 8.528418 51.99079, 8.5…\n 8 8 beech wuelfenrath ((7.071625 51.29256, 7.072311 51.29334, 7.…\n 9 9 beech billerbeck ((7.324729 51.99783, 7.323548 51.99923, 7.…\n10 11 spruce brilon ((8.532195 51.41029, 8.535027 51.41064, 8.…\n11 12 spruce osterwald ((8.369328 51.21693, 8.371238 51.21718, 8.…\n12 10 spruce oberhundem ((8.18082 51.08999, 8.180868 51.09143, 8.1…\n```\n:::\n:::\n\n\nInit the project\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(lfa)\nsf::sf_use_s2(FALSE)\nlocations <- lfa_init(\"research_areas.shp\")\n```\n:::\n\nDo all of the prprocessing steps\n::: {.cell}\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations,retile,check_flag = \"retile\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag retile is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations, lfa_intersect_areas, ctg = NULL, areas_sf = sf,check_flag = \"intersect\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag intersect is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations, lfa_ground_correction, ctg = NULL,check_flag = \"z_correction\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag z_correction is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations, lfa_segmentation, ctg = NULL,check_flag = \"segmentation\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag segmentation is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n\n```{.r .cell-code}\nlfa_map_tile_locations(locations, lfa_detection, catalog = NULL, write_to_file = TRUE,check_flag = \"detection\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNo further processing: flag detection is set!Function is already computed, no further computings here\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n:::\n\n\n## Quantitative Results\n### Distribution of Z-Values\n\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\ndata <- lfa::lfa_get_detections()\nvalue_column <- \"Z\"\n```\n:::\n\n\n\n#### Kullback-Leibler-Divergence\n\n\n\n::: {#tbl-z-values-kld_specie .cell tbl-cap='Kullback-Leibler-Divergence between the researched species Beech, Oak, Pine and Spruce for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nkld_results_specie <- lfa::lfa_run_test_asymmetric(data,value_column,\"specie\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_specie,\"Kullback-Leibler-Divergence between species\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between species
Beech Oak Pine Spruce
Beech 0.0 13.2 12.5 0.76
Oak 4.2 0.0 3.4 5.02
Pine 2.3 5.6 0.0 3.95
Spruce 2.4 14.7 16.1 0.00
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_specie, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 5.252696\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-kld-beech .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie beech for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"beech\",]\nkld_results_beech <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_beech,\"Kullback-Leibler-Divergence between areas with beech\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with beech
Bielefeld_brackwede Billerbeck Wuelfenrath
Bielefeld_brackwede 0.00 0.4 3.1
Billerbeck 0.27 0.0 6.0
Wuelfenrath 1.13 2.4 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_beech, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.473353\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-kld-oak .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie oak for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"oak\",]\nkld_results_oak <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_oak,\"Kullback-Leibler-Divergence between areas with oak\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with oak
Hamm Muenster Rinkerode
Hamm 0.0 2.1 16
Muenster 0.4 0.0 17
Rinkerode 7.6 17.8 0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_oak, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 6.779863\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-kld-pine .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie pine for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"pine\",]\nkld_results_pine <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_pine,\"Kullback-Leibler-Divergence between areas with pine\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with pine
Greffen Mesum Telgte
Greffen 0.00 0.74 16
Mesum 0.43 0.00 18
Telgte 3.87 6.82 0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_pine, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 5.129383\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-kld-spruce .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie spruce for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"spruce\",]\nkld_results_spruce <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_spruce,\"Kullback-Leibler-Divergence between areas with spruce\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with spruce
Brilon Oberhundem Osterwald
Brilon 0.000 0.092 1.7
Oberhundem 0.081 0.000 2.1
Osterwald 1.521 2.178 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_spruce, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.8509258\n```\n:::\n:::\n\n\n\n\n#### Jensen-Shannon Divergence\n\n\n\n::: {#tbl-z-values-jsd_specie .cell tbl-cap='Jensen-Shannon Divergence between the researched species Beech, Oak, Pine and Spruce for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\njsd_results_specie <- lfa::lfa_run_test_symmetric(data,value_column,\"specie\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_specie,\"Jensen-Shannon Divergence between species\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between species
Beech Oak Pine Spruce
Beech 0 4.5 4.6 2.4
Oak NA 0.0 3.9 6.1
Pine NA NA 0.0 7.1
Spruce NA NA NA 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_specie, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 2.246663\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-jsd-beech .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie beech for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"beech\",]\njsd_results_beech <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_beech,\"Jensen-Shannon Divergence between areas with beech\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with beech
Bielefeld_brackwede Billerbeck Wuelfenrath
Bielefeld_brackwede 0 1.1 3.3
Billerbeck NA 0.0 4.9
Wuelfenrath NA NA 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_beech, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.10555\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-jsd-oak .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie oak for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"oak\",]\njsd_results_oak <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_oak,\"Jensen-Shannon Divergence between areas with oak\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with oak
Hamm Muenster Rinkerode
Hamm 0 1.6 6.5
Muenster NA 0.0 6.4
Rinkerode NA NA 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_oak, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.692942\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-jsd-pine .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie pine for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"pine\",]\njsd_results_pine <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_pine,\"Jensen-Shannon Divergence between areas with pine\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with pine
Greffen Mesum Telgte
Greffen 0 3.1 12
Mesum NA 0.0 10
Telgte NA NA 0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_pine, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 2.956354\n```\n:::\n:::\n\n\n\n\n::: {#tbl-z-values-jsd-spruce .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie spruce for the atrribute z-values'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"spruce\",]\njsd_results_spruce <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_spruce,\"Jensen-Shannon Divergence between areas with spruce\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with spruce
Brilon Oberhundem Osterwald
Brilon 0 0.31 4.0
Oberhundem NA 0.00 5.5
Osterwald NA NA 0.0
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_spruce, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.100383\n```\n:::\n:::\n\n\n### Distribution of the number of returns\n\n\n::: {.cell}\n\n```{.r .cell-code code-fold=\"true\"}\ndata <- sf::st_read(\"data/tree_properties.gpkg\")\nneighbors <- lfa::lfa_get_neighbor_paths() |> lfa::lfa_combine_sf_obj(lfa::lfa_get_all_areas())\ndata = sf::st_join(data,neighbors, join = sf::st_within)\nvalue_column <- \"number_of_returns\"\n```\n:::\n\n\n\n#### Kullback-Leibler-Divergence\n\n\n\n::: {#tbl-number-of-returns-kld_specie .cell tbl-cap='Kullback-Leibler-Divergence between the researched species Beech, Oak, Pine and Spruce for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nkld_results_specie <- lfa::lfa_run_test_asymmetric(data,value_column,\"specie\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_specie,\"Kullback-Leibler-Divergence between species\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between species
Beech Oak Pine Spruce
Beech 0.000 0.083 0.57 0.049
Oak 0.051 0.000 0.84 0.059
Pine 0.432 0.833 0.00 0.526
Spruce 0.036 0.059 0.54 0.000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_specie, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.2550987\n```\n:::\n:::\n\n\n\n\n::: {#tbl-number-of-returns-kld-beech .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie beech for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"beech\",]\nkld_results_beech <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_beech,\"Kullback-Leibler-Divergence between areas with beech\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with beech
Bielefeld_brackwede Billerbeck Wuelfenrath
Bielefeld_brackwede 0.00 0.15 0.082
Billerbeck 0.21 0.00 0.136
Wuelfenrath 0.13 0.19 0.000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_beech, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.09985223\n```\n:::\n:::\n\n\n\n\n::: {#tbl-number-of-returns-kld-oak .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie oak for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"oak\",]\nkld_results_oak <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_oak,\"Kullback-Leibler-Divergence between areas with oak\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with oak
Hamm Muenster Rinkerode
Hamm 0.00 0.46 0.846
Muenster 0.41 0.00 0.077
Rinkerode 0.81 0.09 0.000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_oak, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.2994815\n```\n:::\n:::\n\n\n\n\n::: {#tbl-number-of-returns-kld-pine .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie pine for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"pine\",]\nkld_results_pine <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_pine,\"Kullback-Leibler-Divergence between areas with pine\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with pine
Greffen Mesum Telgte
Greffen 0.00 0.1444 0.1773
Mesum 0.14 0.0000 0.0047
Telgte 0.16 0.0045 0.0000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_pine, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.07005788\n```\n:::\n:::\n\n\n\n\n::: {#tbl-number-of-returns-kld-spruce .cell tbl-cap='Kullback-Leibler-Divergence between the researched areas which have the dominante specie spruce for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"spruce\",]\nkld_results_spruce <- lfa::lfa_run_test_asymmetric(specie,value_column,\"area\",lfa::lfa_kld_from_vec)\nlfa::lfa_generate_result_table_tests(kld_results_spruce,\"Kullback-Leibler-Divergence between areas with spruce\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Kullback-Leibler-Divergence between areas with spruce
Brilon Oberhundem Osterwald
Brilon 0.000 0.04 0.034
Oberhundem 0.041 0.00 0.079
Osterwald 0.045 0.10 0.000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(kld_results_spruce, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.03779495\n```\n:::\n:::\n\n\n\n\n#### Jensen-Shannon Divergence\n\n\n\n::: {#tbl-number-of-returns-jsd_specie .cell tbl-cap='Jensen-Shannon Divergence between the researched species Beech, Oak, Pine and Spruce for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\njsd_results_specie <- lfa::lfa_run_test_symmetric(data,value_column,\"specie\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_specie,\"Jensen-Shannon Divergence between species\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between species
Beech Oak Pine Spruce
Beech 0 3e-04 0.019 0.0014
Oak NA 0e+00 0.021 0.0016
Pine NA NA 0.000 0.0143
Spruce NA NA NA 0.0000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_specie, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.004419638\n```\n:::\n:::\n\n\n\n\n::: {#tbl-number-of-returns-jsd-beech .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie beech for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"beech\",]\njsd_results_beech <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_beech,\"Jensen-Shannon Divergence between areas with beech\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with beech
Bielefeld_brackwede Billerbeck Wuelfenrath
Bielefeld_brackwede 0 0.0035 0.00099
Billerbeck NA 0.0000 0.00554
Wuelfenrath NA NA 0.00000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_beech, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.001314268\n```\n:::\n:::\n\n\n\n\n::: {#tbl-number-of-returns-jsd-oak .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie oak for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"oak\",]\njsd_results_oak <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_oak,\"Jensen-Shannon Divergence between areas with oak\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with oak
Hamm Muenster Rinkerode
Hamm 0 0.0068 0.0128
Muenster NA 0.0000 0.0017
Rinkerode NA NA 0.0000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_oak, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.002747351\n```\n:::\n:::\n\n\n\n\n::: {#tbl-number-of-returns-jsd-pine .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie pine for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"pine\",]\njsd_results_pine <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_pine,\"Jensen-Shannon Divergence between areas with pine\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with pine
Greffen Mesum Telgte
Greffen 0 0.0035 0.00458
Mesum NA 0.0000 0.00037
Telgte NA NA 0.00000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_pine, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.001130537\n```\n:::\n:::\n\n\n\n\n::: {#tbl-number-of-returns-jsd-spruce .cell tbl-cap='Jensen-Shannon Divergence between the researched areas which have the dominante specie spruce for the atrribute number-of-returns'}\n\n```{.r .cell-code code-fold=\"true\"}\nspecie <- data[data$specie==\"spruce\",]\njsd_results_spruce <- lfa::lfa_run_test_symmetric(specie,value_column,\"area\",lfa::lfa_jsd_from_vec)\nlfa::lfa_generate_result_table_tests(jsd_results_spruce,\"Jensen-Shannon Divergence between areas with spruce\")\n```\n\n::: {.cell-output-display}\n`````{=html}\n\n\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
Jensen-Shannon Divergence between areas with spruce
Brilon Oberhundem Osterwald
Brilon 0 0.0069 0.005
Oberhundem NA 0.0000 0.002
Osterwald NA NA 0.000
\n\n`````\n:::\n:::\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncolMeans(jsd_results_spruce, na.rm = TRUE) |> mean()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.001939104\n```\n:::\n:::\n\n\n\n\n\n## Documentation\n### `lfa_capitalize_first_char`\n\nCapitalize First Character of a String\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`input_string` | A single-character string to be processed.\n\n\n#### Concept\n\nString Manipulation\n\n\n#### Description\n\nThis function takes a string as input and returns the same string with the\n first character capitalized. If the first character is already capitalized,\n the function does nothing. If the first character is not from the alphabet,\n an error is thrown.\n\n\n#### Details\n\nThis function performs the following steps:\n \n\n* Checks if the input is a single-character string. \n\n* Verifies if the first character is from the alphabet (A-Z or a-z). \n\n* If the first character is not already capitalized, it capitalizes it. \n\n* Returns the modified string.\n\n\n#### Keyword\n\nalphabet\n\n\n#### Note\n\nThis function is case-sensitive and assumes ASCII characters.\n\n\n#### References\n\nNone\n\n\n#### Seealso\n\nThis function is related to the basic string manipulation functions in base R.\n\n\n#### Value\n\nA modified string with the first character capitalized if it is\n not already. If the first character is already capitalized, the original\n string is returned.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Capitalize the first character of a string\ncapitalize_first_char(\"hello\") # Returns \"Hello\"\ncapitalize_first_char(\"World\") # Returns \"World\"\n\n# Error example (non-alphabetic first character)\ncapitalize_first_char(\"123abc\") # Throws an error\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_capitalize_first_char(input_string)\n```\n:::\n\n\n\n### `lfa_check_flag`\n\nCheck if a flag is set, indicating the completion of a specific process.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`flag_name` | A character string specifying the name of the flag file. It should be a descriptive and unique identifier for the process being checked.\n\n\n#### Description\n\nThis function checks for the existence of a hidden flag file at a specified location within the working directory. If the flag file is found, a message is printed, and the function returns `TRUE` to indicate that the associated processing step has already been completed. If the flag file is not found, the function returns `FALSE` , indicating that further processing can proceed.\n\n\n#### Value\n\nA logical value indicating whether the flag is set ( `TRUE` ) or not ( `FALSE` ).\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Check if the flag for a process named \"data_processing\" is set\nlfa_check_flag(\"data_processing\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_check_flag(flag_name)\n```\n:::\n\n\n\n### `lfa_combine_sf_obj`\n\nCombine Spatial Feature Objects from Multiple GeoPackage Files\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`paths` | A character vector containing file paths to GeoPackage files with neighbor information.\n`area_infos` | A data frame or list containing information about the corresponding detection areas, including \"area\" and \"specie\" columns.\n\n\n#### Description\n\nThis function reads spatial feature objects (sf) from multiple GeoPackage files and combines them into a single sf object.\n Each GeoPackage file is assumed to contain neighbor information for a specific detection area, and the resulting sf object\n includes additional columns indicating the corresponding area and species information.\n\n\n#### Value\n\nA combined sf object with additional columns for area and specie information.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Assuming paths and area_infos are defined\ncombined_sf <- lfa_combine_sf_obj(paths, area_infos)\n\n# Print the combined sf object\nprint(combined_sf)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_combine_sf_obj(paths, area_infos)\n```\n:::\n\n\n\n### `lfa_count_returns_all_areas`\n\nCount tree returns for all species and areas, returning a consolidated data frame.\n\n\n#### Description\n\nThis function iterates through all species and areas obtained from the function\n [`lfa_get_all_areas`](#lfagetallareas) . For each combination of species and area, it reads\n the corresponding area as a catalog, counts the returns per tree using\n [`lfa_count_returns_per_tree`](#lfacountreturnspertree) , and consolidates the results into a data frame.\n The resulting data frame includes columns for the species, area, and return counts per tree.\n\n\n#### Keyword\n\ncounting\n\n\n#### Seealso\n\n[`lfa_get_all_areas`](#lfagetallareas) , [`lfa_read_area_as_catalog`](#lfareadareaascatalog) ,\n [`lfa_count_returns_per_tree`](#lfacountreturnspertree)\n\n\n#### Value\n\nA data frame with columns for species, area, and return counts per tree.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Count tree returns for all species and areas\nreturns_counts <- lfa_count_returns_all_areas()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_count_returns_all_areas()\n```\n:::\n\n\n\n### `lfa_count_returns_per_tree`\n\nCount returns per tree for a given lidR catalog.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | A lidR catalog object containing LAS files to be processed.\n\n\n#### Description\n\nThis function takes a lidR catalog as input and counts the returns per tree.\n It uses the lidR package to read LAS files from the catalog and performs the counting\n operation on each tree. The result is a data frame containing the counts of returns\n for each unique tree ID within the lidR catalog.\n\n\n#### Keyword\n\ncounting\n\n\n#### Seealso\n\n[`lidR::readLAS`](#lidr::readlas) , [`lidR::is.empty`](#lidr::is.empty) ,\n [`base::table`](#base::table) , [`dplyr::bind_rows`](#dplyr::bindrows)\n\n\n#### Value\n\nA data frame with columns for tree ID and the corresponding count of returns.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Count returns per tree for a lidR catalog\nctg <- lfa_read_area_as_catalog(\"SpeciesA\", \"Area1\")\nreturns_counts_per_tree <- lfa_count_returns_per_tree(ctg)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_count_returns_per_tree(ctg)\n```\n:::\n\n\n\n### `lfa_create_boxplot`\n\nCreate a box plot from a data frame\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`data` | A data frame containing the data.\n`value_column` | The name of the column containing the values for the box plot.\n`category_column1` | The name of the column containing the first categorical variable.\n`category_column2` | The name of the column containing the second categorical variable.\n`title` | An optional title for the plot. If not provided, a default title is generated based on the data frame name.\n\n\n#### Description\n\nThis function generates a box plot using ggplot2 based on the specified data frame and columns.\n\n\n#### Details\n\nThe function creates a box plot where the x-axis is based on the second categorical variable,\n the y-axis is based on the specified value column, and the box plots are colored based on the first\n categorical variable. The grouping of box plots is done based on the unique values in the second categorical variable.\n\n\n#### Value\n\nA ggplot object representing the box plot.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Assuming you have a data frame 'your_data' with columns 'value', 'category1', and 'category2'\ncreate_boxplot(your_data, \"value\", \"category1\", \"category2\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_boxplot(\n data,\n value_column,\n category_column1,\n category_column2,\n title = NULL\n)\n```\n:::\n\n\n\n### `lfa_create_density_plots`\n\nCreate density plots for groups in a data frame\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`data` | A data frame containing the data.\n`value_column` | The name of the column containing the values for the density plot.\n`category_column1` | The name of the column containing the categorical variable for grouping.\n`category_column2` | The name of the column containing the categorical variable for arranging plots.\n`title` | An optional title for the plot. If not provided, a default title is generated based on the data frame name.\n`xlims` | Optional limits for the x-axis. Should be a numeric vector with two elements (lower and upper bounds).\n`ylims` | Optional limits for the y-axis. Should be a numeric vector with two elements (lower and upper bounds).\n\n\n#### Description\n\nThis function generates density plots using ggplot2 based on the specified data frame and columns.\n\n\n#### Details\n\nThe function creates density plots where the x-axis is based on the specified value column,\n and the density plots are colored based on the first categorical variable. The arrangement of plots\n is done based on the unique values in the second categorical variable. The plots are arranged in a 2x2 grid.\n\n\n#### Value\n\nA ggplot object representing the density plots arranged in a 2x2 grid.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Assuming you have a data frame 'your_data' with columns 'value', 'category1', and 'category2'\ncreate_density_plots(your_data, \"value\", \"category1\", \"category2\", title = \"Density Plots\", xlims = c(0, 10), ylims = c(0, 0.5))\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_density_plots(\n data,\n value_column,\n category_column1,\n category_column2,\n title = NULL,\n xlims = NULL,\n ylims = NULL\n)\n```\n:::\n\n\n\n### `lfa_create_stacked_distributions_plot`\n\nCreate a stacked distribution plot for tree detections, visualizing the distribution\n of a specified variable on the x-axis, differentiated by another variable.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`trees` | A data frame containing tree detection data.\n`x_value` | A character string specifying the column name used for finding the values on the x-axis of the histogram.\n`fill_value` | A character string specifying the column name by which the data are differentiated in the plot.\n`bin` | An integer specifying the number of bins for the histogram. Default is 100.\n`ylab` | A character string specifying the y-axis label. Default is \"Amount trees.\"\n`xlim` | A numeric vector of length 2 specifying the x-axis limits. Default is c(0, 100).\n`ylim` | A numeric vector of length 2 specifying the y-axis limits. Default is c(0, 1000).\n`title` | The title of the plot.\n\n\n#### Description\n\nThis function generates a stacked distribution plot using the ggplot2 package,\n providing a visual representation of the distribution of a specified variable\n ( `x_value` ) on the x-axis, with differentiation based on another variable\n ( `fill_value` ). The data for the plot are derived from the provided `trees` \n data frame.\n\n\n#### Keyword\n\ndata\n\n\n#### Seealso\n\n[`ggplot2::geom_histogram`](#ggplot2::geomhistogram) , [`ggplot2::facet_wrap`](#ggplot2::facetwrap) ,\n [`ggplot2::ylab`](#ggplot2::ylab) , [`ggplot2::scale_fill_brewer`](#ggplot2::scalefillbrewer) ,\n [`ggplot2::coord_cartesian`](#ggplot2::coordcartesian)\n\n\n#### Value\n\nA ggplot object representing the stacked distribution plot.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Create a stacked distribution plot for variable \"Z,\" differentiated by \"area\"\ntrees <- lfa_get_detections()\nlfa_create_stacked_distributions_plot(trees, \"Z\", \"area\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_stacked_distributions_plot(\n trees,\n x_value,\n fill_value,\n bin = 100,\n ylab = \"Amount trees\",\n xlim = c(0, 100),\n ylim = c(0, 1000),\n title =\n \"Histograms of height distributions between species 'beech', 'oak', 'pine' and 'spruce' divided by the different areas of Interest\"\n)\n```\n:::\n\n\n\n### `lfa_create_stacked_histogram`\n\nCreate a stacked histogram for tree detections, summing up the values for each species.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`trees` | A data frame containing tree detection data.\n`x_value` | A character string specifying the column name used for finding the values on the x-axis of the histogram.\n`fill_value` | A character string specifying the column name by which the data are differentiated in the plot.\n`bin` | An integer specifying the number of bins for the histogram. Default is 30.\n`ylab` | A character string specifying the y-axis label. Default is \"Frequency.\"\n`xlim` | A numeric vector of length 2 specifying the x-axis limits. Default is c(0, 100).\n`ylim` | A numeric vector of length 2 specifying the y-axis limits. Default is NULL.\n\n\n#### Description\n\nThis function generates a stacked histogram using the ggplot2 package,\n summing up the values for each species and visualizing the distribution of\n a specified variable ( `x_value` ) on the x-axis, differentiated by another\n variable ( `fill_value` ). The data for the plot are derived from the provided\n `trees` data frame.\n\n\n#### Keyword\n\ndata\n\n\n#### Seealso\n\n[`ggplot2::geom_histogram`](#ggplot2::geomhistogram) , [`ggplot2::ylab`](#ggplot2::ylab) ,\n [`ggplot2::scale_fill_brewer`](#ggplot2::scalefillbrewer) , [`ggplot2::coord_cartesian`](#ggplot2::coordcartesian)\n\n\n#### Value\n\nA ggplot object representing the stacked histogram.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Create a stacked histogram for variable \"Z,\" differentiated by \"area\"\ntrees <- lfa_get_detections()\nlfa_create_stacked_histogram(trees, \"Z\", \"area\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_stacked_histogram(\n trees,\n x_value,\n fill_value,\n bin = 30,\n ylab = \"Frequency\",\n xlim = c(0, 100),\n ylim = NULL\n)\n```\n:::\n\n\n\n### `lfa_create_tile_location_objects`\n\nCreate tile location objects\n\n\n#### Author\n\nJakob Danel\n\n\n#### Description\n\nThis function traverses a directory structure to find LAZ files and creates\n tile location objects for each file. The function looks into the the `data` \n directory of the repository/working directory. It then creates `tile_location` \n objects based on the folder structure. The folder structure should not be\n touched by hand, but created by `lfa_init_data_structure()` which builds the\n structure based on a shape file.\n\n\n#### Seealso\n\n[`tile_location`](#tilelocation)\n\n\n#### Value\n\nA vector containing tile location objects.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_tile_location_objects()\n\nlfa_create_tile_location_objects()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_create_tile_location_objects()\n```\n:::\n\n\n\n### `lfa_detection`\n\nPerform tree detection on a lidar catalog and optionally save the results to a file.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`catalog` | A lidar catalog containing point cloud data. If set to NULL, the function attempts to read the catalog from the specified tile location.\n`tile_location` | An object specifying the location of the lidar tile. If catalog is NULL, the function attempts to read the catalog from this tile location.\n`write_to_file` | A logical value indicating whether to save the detected tree information to a file. Default is TRUE.\n\n\n#### Description\n\nThis function utilizes lidar data to detect trees within a specified catalog. The detected tree information can be optionally saved to a file in the GeoPackage format. The function uses parallel processing to enhance efficiency.\n\n\n#### Value\n\nA sf style data frame containing information about the detected trees.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Perform tree detection on a catalog and save the results to a file\nlfa_detection(catalog = my_catalog, tile_location = my_tile_location, write_to_file = TRUE)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_detection(catalog, tile_location, write_to_file = TRUE)\n```\n:::\n\n\n\n### `lfa_download_areas`\n\nDownload areas based on spatial features\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`sf_areas` | Spatial features representing areas to be downloaded. It must include columns like \"species\" \"name\" See details for more information.\n\n\n#### Author\n\nJakob Danel\n\n\n#### Description\n\nThis function initiates the data structure and downloads areas based on spatial features.\n\n\n#### Details\n\nThe input data frame, `sf_areas` , must have the following columns:\n \n\n* \"species\": The species associated with the area. \n\n* \"name\": The name of the area. \n \n The function uses the `lfa_init_data_structure` function to set up the data structure\n and then iterates through the rows of `sf_areas` to download each specified area.\n\n\n#### Value\n\nNone\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_download_areas(sf_areas)\n\n\n# Example spatial features data frame\nsf_areas <- data.frame(\nspecies = c(\"SpeciesA\", \"SpeciesB\"),\nname = c(\"Area1\", \"Area2\"),\n# Must include also other attributes specialized to sf objects\n# such as geometry, for processing of the download\n)\n\nlfa_download_areas(sf_areas)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_download_areas(sf_areas)\n```\n:::\n\n\n\n### `lfa_download`\n\nDownload an las file from the state NRW from a specific location\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`species` | The species of the tree which is observed at this location\n`name` | The name of the area that is observed\n`location` | An sf object, which holds the location information for the area where the tile should be downloaded from.\n\n\n#### Description\n\nIt will download the file and save it to data/ list(list(\"html\"), list(list(\"\"))) / list(list(\"html\"), list(list(\"\"))) with the name of the tile\n\n\n#### Value\n\nThe LASCatalog object of the downloaded file\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_download(species, name, location)\n```\n:::\n\n\n\n### `lfa_find_n_nearest_trees`\n\nFind n Nearest Trees\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`trees` | A sf object containing tree coordinates.\n`n` | The number of nearest trees to find for each tree (default is 100).\n\n\n#### Description\n\nThis function calculates the distances to the n nearest trees for each tree in the input dataset.\n\n\n#### Value\n\nA data frame with additional columns representing the distances to the n nearest trees.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Load tree data using lfa_get_detections() (not provided)\ntree_data <- lfa_get_detections()\n\n# Filter tree data for a specific species and area\ntree_data = tree_data[tree_data$specie == \"pine\" & tree_data$area == \"greffen\", ]\n\n# Find the 100 nearest trees for each tree in the filtered dataset\ntree_data <- lfa_find_n_nearest_trees(tree_data)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_find_n_nearest_trees(trees, n = 100)\n```\n:::\n\n\n\n### `lfa_generate_result_table_tests`\n\nGenerate Result Table for Tests\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`table` | A data frame representing the result table.\n\n\n#### Description\n\nThis function generates a result table for tests using the knitr::kable function.\n\n\n#### Details\n\nThis function uses the knitr::kable function to create a formatted table, making it suitable for HTML output.\n The input table is expected to be a data frame with test results, and the resulting table will have capitalized\n row and column names with lines between columns and rows.\n\n\n#### Value\n\nA formatted table suitable for HTML output with lines between columns and rows.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Generate a result table for tests\nresult_table <- data.frame(\nTest1 = c(0.05, 0.10, 0.03),\nTest2 = c(0.02, 0.08, 0.01),\nTest3 = c(0.08, 0.12, 0.05)\n)\nformatted_table <- lfa_generate_result_table_tests(result_table)\nprint(formatted_table)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_generate_result_table_tests(table, caption = \"Table Caption\")\n```\n:::\n\n\n\n### `lfa_get_all_areas`\n\nRetrieve a data frame containing all species and corresponding areas.\n\n\n#### Description\n\nThis function scans the \"data\" directory within the current working directory to\n obtain a list of species. It then iterates through each species to retrieve the list\n of areas associated with that species. The resulting data frame contains two columns:\n \"specie\" representing the species and \"area\" representing the corresponding area.\n\n\n#### Keyword\n\ndata\n\n\n#### Seealso\n\n[`list.dirs`](#list.dirs)\n\n\n#### Value\n\nA data frame with columns \"specie\" and \"area\" containing information about\n all species and their associated areas.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Retrieve a data frame with information about all species and areas\nall_areas_df <- lfa_get_all_areas()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_all_areas()\n```\n:::\n\n\n\n### `lfa_get_detection_area`\n\nGet Detection for an area\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`species` | A character string specifying the target species.\n`name` | A character string specifying the name of the tile.\n\n\n#### Description\n\nRetrieves the tree detection information for a specified species and tile.\n\n\n#### Details\n\nThis function reads tree detection data from geopackage files within the specified tile location for a given species. It then combines the data into a single SF data frame and returns it. The function assumes that the tree detection files follow a naming convention with the pattern \"_detection.gpkg\".\n\n\n#### Keyword\n\nspatial\n\n\n#### References\n\nThis function is part of the LiDAR Forest Analysis (LFA) package.\n\n\n#### Seealso\n\n[`get_tile_dir`](#gettiledir)\n\n\n#### Value\n\nA Simple Features (SF) data frame containing tree detection information for the specified species and tile.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Retrieve tree detection data for species \"example_species\" in tile \"example_tile\"\ntrees_data <- lfa_get_detection_tile_location(\"example_species\", \"example_tile\")\n\n# Example usage:\ntrees_data <- lfa_get_detection_tile_location(\"example_species\", \"example_tile\")\n\n# No trees found scenario:\nempty_data <- lfa_get_detection_tile_location(\"nonexistent_species\", \"nonexistent_tile\")\n# The result will be an empty data frame if no trees are found for the specified species and tile.\n\n# Error handling:\n# In case of invalid inputs, the function may throw errors. Ensure correct species and tile names are provided.\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_detection_area(species, name)\n```\n:::\n\n\n\n### `lfa_get_detections_species`\n\nRetrieve detections for a specific species.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`species` | A character string specifying the target species.\n\n\n#### Description\n\nThis function retrieves detection data for a given species from multiple areas.\n\n\n#### Details\n\nThe function looks for detection data in the \"data\" directory for the specified species.\n It then iterates through each subdirectory (representing different areas) and consolidates the\n detection data into a single data frame.\n\n\n#### Value\n\nA data frame containing detection information for the specified species in different areas.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Example usage:\ndetections_data <- lfa_get_detections_species(\"example_species\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_detections_species(species)\n```\n:::\n\n\n\n### `lfa_get_detections`\n\nRetrieve aggregated detection data for multiple species.\n\n\n#### Concept\n\ndata retrieval functions\n\n\n#### Description\n\nThis function obtains aggregated detection data for multiple species by iterating\n through the list of species obtained from [`lfa_get_species`](#lfagetspecies) . For each\n species, it calls [`lfa_get_detections_species`](#lfagetdetectionsspecies) to retrieve the\n corresponding detection data and aggregates the results into a single data frame.\n The resulting data frame includes columns for the species, tree detection data,\n and the area in which the detections occurred.\n\n\n#### Keyword\n\naggregation\n\n\n#### Seealso\n\n[`lfa_get_species`](#lfagetspecies) , [`lfa_get_detections_species`](#lfagetdetectionsspecies) \n \n Other data retrieval functions:\n [`lfa_get_species`](#lfagetspecies)\n\n\n#### Value\n\nA data frame containing aggregated detection data for multiple species.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_detections()\n\n# Retrieve aggregated detection data for multiple species\ndetections_data <- lfa_get_detections()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_detections()\n```\n:::\n\n\n\n### `lfa_get_flag_path`\n\nGet the path to a flag file indicating the completion of a specific process.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`flag_name` | A character string specifying the name of the flag file. It should be a descriptive and unique identifier for the process being flagged.\n\n\n#### Description\n\nThis function constructs and returns the path to a hidden flag file, which serves as an indicator that a particular processing step has been completed. The flag file is created in a designated location within the working directory.\n\n\n#### Value\n\nA character string representing the absolute path to the hidden flag file.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Get the flag path for a process named \"data_processing\"\nlfa_get_flag_path(\"data_processing\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_flag_path(flag_name)\n```\n:::\n\n\n\n### `lfa_get_neighbor_paths`\n\nGet Paths to Neighbor GeoPackage Files\n\n\n#### Description\n\nThis function retrieves the file paths to GeoPackage files containing neighbor information for each detection area.\n The GeoPackage files are assumed to be named \"neighbours.gpkg\" and organized in a directory structure under the \"data\" folder.\n\n\n#### Value\n\nA character vector containing file paths to GeoPackage files for each detection area's neighbors.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Get paths to neighbor GeoPackage files for all areas\npaths <- lfa_get_neighbor_paths()\n\n# Print the obtained file paths\nprint(paths)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_neighbor_paths()\n```\n:::\n\n\n\n### `lfa_get_species`\n\nGet a list of species from the data directory.\n\n\n#### Concept\n\ndata retrieval functions\n\n\n#### Description\n\nThis function retrieves a list of species by scanning the \"data\" directory\n located in the current working directory.\n\n\n#### Keyword\n\ndata\n\n\n#### References\n\nThis function relies on the [`list.dirs`](#list.dirs) function for directory listing.\n\n\n#### Seealso\n\n[`list.dirs`](#list.dirs) \n \n Other data retrieval functions:\n [`lfa_get_detections`](#lfagetdetections)\n\n\n#### Value\n\nA character vector containing the names of species found in the \"data\" directory.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Retrieve the list of species\nspecies_list <- lfa_get_species()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_get_species()\n```\n:::\n\n\n\n### `lfa_ground_correction`\n\nCorrect the point clouds for correct ground imagery\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | An LASCatalog object. If not null, it will perform the actions on this object, if NULL inferring the catalog from the tile_location\n`tile_location` | A tile_location type object holding the information about the location of the cataog. This is used to save the catalog after processing too.\n\n\n#### Author\n\nJakob Danel\n\n\n#### Description\n\nThis function is needed to correct the Z value of the point cloud, relative to the real\n ground height. After using this function to your catalog, the Z values can be seen as the\n real elevation about the ground. At the moment the function uses the `tin()` function from\n the `lidr` package. NOTE : The operation is inplace and can not be reverted, the old values\n of the point cloud will be deleted!\n\n\n#### Value\n\nA catalog with the corrected z values. The catalog is always stored at tile_location and\n holding only the transformed values.\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_ground_correction(ctg, tile_location)\n```\n:::\n\n\n\n### `lfa_init_data_structure`\n\nInitialize data structure for species and areas\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`sf_species` | A data frame with information about species and associated areas.\n\n\n#### Description\n\nThis function initializes the data structure for storing species and associated areas.\n\n\n#### Details\n\nThe input data frame, `sf_species` , should have at least the following columns:\n \n\n* \"species\": The names of the species for which the data structure needs to be initialized. \n\n* \"name\": The names of the associated areas. \n \n The function creates directories based on the species and area information provided in\n the `sf_species` data frame. It checks whether the directories already exist and creates\n them if they don't.\n\n\n#### Value\n\nNone\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Example species data frame\nsf_species <- data.frame(\nspecies = c(\"SpeciesA\", \"SpeciesB\"),\nname = c(\"Area1\", \"Area2\"),\n# Other necessary columns\n)\n\nlfa_init_data_structure(sf_species)\n\n# Example species data frame\nsf_species <- data.frame(\nspecies = c(\"SpeciesA\", \"SpeciesB\"),\nname = c(\"Area1\", \"Area2\"),\n# Other necessary columns\n)\n\nlfa_init_data_structure(sf_species)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_init_data_structure(sf_species)\n```\n:::\n\n\n\n### `lfa_init`\n\nInitialize LFA (LiDAR forest analysis) data processing\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`sf_file` | A character string specifying the path to the shapefile containing spatial features of research areas.\n\n\n#### Description\n\nThis function initializes the LFA data processing by reading a shapefile containing\n spatial features of research areas, downloading the specified areas, and creating\n tile location objects for each area.\n\n\n#### Details\n\nThis function reads a shapefile ( `sf_file` ) using the `sf` package, which should\n contain information about research areas. It then calls the `lfa_download_areas` \n function to download the specified areas and `lfa_create_tile_location_objects` \n to create tile location objects based on Lidar data files in those areas. The\n shapefile MUST follow the following requirements:\n \n\n* Each geometry must be a single object of type polygon \n\n* Each entry must have the following attributes: \n\n* species: A string describing the tree species of the area. \n\n* name: A string describing the location of the area.\n\n\n#### Value\n\nA vector containing tile location objects.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Initialize LFA processing with the default shapefile\nlfa_init()\n\n# Initialize LFA processing with a custom shapefile\nlfa_init(\"custom_areas.shp\")\n\n# Example usage with the default shapefile\nlfa_init()\n\n# Example usage with a custom shapefile\nlfa_init(\"custom_areas.shp\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_init(sf_file = \"research_areas.shp\")\n```\n:::\n\n\n\n### `lfa_intersect_areas`\n\nIntersect Lidar Catalog with Spatial Features\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | A LAScatalog object representing the Lidar data to be processed.\n`tile_location` | A tile location object representing the specific area of interest.\n`areas_sf` | Spatial features defining areas.\n\n\n#### Description\n\nThis function intersects a Lidar catalog with a specific area defined by spatial features.\n\n\n#### Details\n\nThe function intersects the Lidar catalog specified by `ctg` with a specific area defined by\n the `tile_location` object and `areas_sf` . It removes points outside the specified area and\n returns a modified LAScatalog object.\n \n The specified area is identified based on the `species` and `name` attributes in the\n `tile_location` object. If a matching area is not found in `areas_sf` , the function\n stops with an error.\n \n The function then transforms the spatial reference of the identified area to match that of\n the Lidar catalog using `sf::st_transform` .\n \n The processing is applied to each chunk in the catalog using the `identify_area` function,\n which merges spatial information and filters out points that are not classified as inside\n the identified area. After processing, the function writes the modified LAS files back to\n the original file locations, removing points outside the specified area.\n \n If an error occurs during the processing of a chunk, a warning is issued, and the function\n continues processing the next chunks. If no points are found after filtering, a warning is\n issued, and NULL is returned.\n\n\n#### Seealso\n\nOther functions in the Lidar forest analysis (LFA) package.\n\n\n#### Value\n\nA modified LAScatalog object with points outside the specified area removed.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Example usage\nlfa_intersect_areas(ctg, tile_location, areas_sf)\n\n# Example usage\nlfa_intersect_areas(ctg, tile_location, areas_sf)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_intersect_areas(ctg, tile_location, areas_sf)\n```\n:::\n\n\n\n### `lfa_jsd_from_vec`\n\nCompute Jensen-Shannon Divergence from Vectors\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`x` | A numeric vector.\n`y` | A numeric vector.\n\n\n#### Description\n\nThis function calculates the Jensen-Shannon Divergence (JSD) between two vectors.\n\n\n#### Value\n\nJensen-Shannon Divergence between the density distributions of x and y.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- rnorm(100)\ny <- rnorm(100, mean = 2)\nlfa_jsd_from_vec(x, y)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_jsd_from_vec(x, y)\n```\n:::\n\n\n\n### `lfa_jsd`\n\nJensen-Shannon Divergence Calculation\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`p` | A numeric vector representing the probability distribution P.\n`q` | A numeric vector representing the probability distribution Q.\n`epsilon` | A small positive constant added to both P and Q to avoid logarithm of zero. Default is 1e-10.\n\n\n#### Description\n\nThis function calculates the Jensen-Shannon Divergence (JSD) between two probability distributions P and Q.\n\n\n#### Details\n\nThe JSD is computed using the Kullback-Leibler Divergence (KLD) as follows:\n `sum((p * log((p + epsilon) / (m + epsilon)) + q * log((q + epsilon) / (m + epsilon))) / 2)` \n where `m = (p + q) / 2` .\n\n\n#### Seealso\n\n[`kld`](#kld) , [`sum`](#sum) , [`log`](#log)\n\n\n#### Value\n\nA numeric value representing the Jensen-Shannon Divergence between P and Q.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Calculate JSD between two probability distributions\np_distribution <- c(0.2, 0.3, 0.5)\nq_distribution <- c(0.1, 0, 0.9)\njsd_result <- jsd(p_distribution, q_distribution)\nprint(jsd_result)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_jsd(p, q, epsilon = 1e-10)\n```\n:::\n\n\n\n### `lfa_kld_from_vec`\n\nCompute Kullback-Leibler Divergence from Vectors\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`x` | A numeric vector.\n`y` | A numeric vector.\n\n\n#### Description\n\nThis function calculates the Kullback-Leibler Divergence (KLD) between two vectors.\n\n\n#### Value\n\nKullback-Leibler Divergence between the density distributions of x and y.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- rnorm(100)\ny <- rnorm(100, mean = 2)\nlfa_kld_from_vec(x, y)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_kld_from_vec(x, y)\n```\n:::\n\n\n\n### `lfa_kld`\n\nKullback-Leibler Divergence Calculation\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`p` | A numeric vector representing the probability distribution P.\n`q` | A numeric vector representing the probability distribution Q.\n`epsilon` | A small positive constant added to both P and Q to avoid logarithm of zero. Default is 1e-10.\n\n\n#### Description\n\nThis function calculates the Kullback-Leibler Divergence (KLD) between two probability distributions P and Q.\n\n\n#### Details\n\nThe KLD is computed using the formula:\n `sum(p * log((p + epsilon) / (q + epsilon)))` \n This avoids issues when the denominator (Q) contains zero probabilities.\n\n\n#### Seealso\n\n[`sum`](#sum) , [`log`](#log)\n\n\n#### Value\n\nA numeric value representing the Kullback-Leibler Divergence between P and Q.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Calculate KLD between two probability distributions\np_distribution <- c(0.2, 0.3, 0.5)\nq_distribution <- c(0.1, 0, 0.9)\nkld_result <- kld(p_distribution, q_distribution)\nprint(kld_result)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_kld(p, q, epsilon = 1e-10)\n```\n:::\n\n\n\n### `lfa_ks_test`\n\nKolmogorov-Smirnov Test Wrapper Function\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`x` | A numeric vector representing the first sample.\n`y` | A numeric vector representing the second sample.\n`output_variable` | A character string specifying the output variable to extract from the ks.test result. Default is \"p.value\". Other possible values include \"statistic\" and \"alternative\".\n`...` | Additional arguments to be passed to the ks.test function.\n\n\n#### Description\n\nThis function serves as a wrapper for the Kolmogorov-Smirnov (KS) test between two samples.\n\n\n#### Details\n\nThe function uses the ks.test function to perform a two-sample KS test and returns the specified output variable.\n The default output variable is the p-value. Other possible output variables include \"statistic\" and \"alternative\".\n\n\n#### Seealso\n\n[`ks.test`](#ks.test)\n\n\n#### Value\n\nA numeric value representing the specified output variable from the KS test result.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Perform KS test and extract the p-value\nresult <- lfa_ks_test(sample1, sample2)\nprint(result)\n\n# Perform KS test and extract the test statistic\nresult_statistic <- lfa_ks_test(sample1, sample2, output_variable = \"statistic\")\nprint(result_statistic)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_ks_test(x, y, output_variable = \"p.value\", ...)\n```\n:::\n\n\n\n### `lfa_load_ctg_if_not_present`\n\nLoading the catalog if it is not present\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | Catalog object. Can be NULL\n`tile_location` | The location to look for the catalog tiles, if their are not present\n\n\n#### Description\n\nThis function checks if the catalog is `NULL` . If it is it will load the\n catalog from the `tile_location`\n\n\n#### Value\n\nThe provided ctg object if not null, else the catalog for the tiles\n of the tile_location.\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_load_ctg_if_not_present(ctg, tile_location)\n```\n:::\n\n\n\n### `lfa_map_tile_locations`\n\nMap Function Over Tile Locations\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`tile_locations` | A list of tile location objects.\n`map_function` | The mapping function to be applied to each tile location.\n`...` | Additional arguments to be passed to the mapping function.\n\n\n#### Description\n\nThis function applies a specified mapping function to each tile location in a list.\n\n\n#### Details\n\nThis function iterates over each tile location in the provided list ( `tile_locations` )\n and applies the specified mapping function ( `map_function` ) to each tile location.\n The mapping function should accept a tile location object as its first argument, and\n additional arguments can be passed using the ellipsis ( `...` ) syntax.\n \n This function is useful for performing operations on multiple tile locations concurrently,\n such as loading Lidar data, processing areas, or other tasks that involve tile locations.\n\n\n#### Seealso\n\nThe mapping function provided should be compatible with the structure and requirements\n of the tile locations and the specific task being performed.\n\n\n#### Value\n\nNone\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Example usage\nlfa_map_tile_locations(tile_locations, my_mapping_function, param1 = \"value\")\n\n# Example usage\nlfa_map_tile_locations(tile_locations, my_mapping_function, param1 = \"value\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_map_tile_locations(tile_locations, map_function, check_flag = NULL, ...)\n```\n:::\n\n\n\n### `lfa_merge_and_save`\n\nMerge and Save Text Files in a Directory\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`input_directory` | The path to the input directory containing text files.\n`output_name` | The name for the output file where the merged content will be saved.\n\n\n#### Description\n\nThis function takes an input directory and an output name as arguments.\n It merges the textual content of all files in the specified directory into\n a single string, with each file's content separated by a newline character.\n The merged content is then saved into a file named after the output name\n in the same directory. After the merging is complete, all input files are\n deleted.\n\n\n#### Details\n\nThis function reads the content of each text file in the specified input directory\n and concatenates them into a single string. Each file's content is separated by a newline\n character. The merged content is then saved into a file named after the output name\n in the same directory. Finally, all input files are deleted from the directory.\n\n\n#### Seealso\n\n[`readLines`](#readlines) , [`writeLines`](#writelines) , [`file.remove`](#file.remove)\n\n\n#### Value\n\nThis function does not explicitly return any value. It prints a message\n indicating the successful completion of the merging and saving process.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Merge text files in the \"data_files\" directory and save the result in \"merged_output\"\nlfa_merge_and_save(\"data_files\", \"merged_output\")\n\n# Merge text files in the \"data_files\" directory and save the result in \"merged_output\"\nlfa_merge_and_save(\"data_files\", \"merged_output\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_merge_and_save(input_directory, output_name)\n```\n:::\n\n\n\n### `lfa_random_forest`\n\nRandom Forest Classifier with Leave-One-Out Cross-Validation\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`tree_data` | A data frame containing the tree data, including the response variable (\"specie\") and predictor variables.\n`excluded_input_columns` | A character vector specifying columns to be excluded from predictor variables.\n`response_variable` | The response variable to be predicted (default is \"specie\").\n`seed` | An integer to set the seed for reproducibility (default is 123).\n`...` | Additional parameters to be passed to the randomForest function.\n\n\n#### Description\n\nThis function performs a random forest classification using leave-one-out cross-validation for each area in the input tree data.\n It returns a list containing various results, including predicted species, confusion matrix, accuracy, and the formula used for modeling.\n\n\n#### Value\n\nA list containing the following elements:\n \n\n* `predicted_species_absolute` : A data frame with observed and predicted species for each area. \n\n* `predicted_species_relative` : A data frame wit the relative precictions per speices and areas, normalized by the total predictions in each area. \n\n* `confusion_matrix` : A confusion matrix showing the counts of predicted vs. observed species. \n\n* `accuracy` : The accuracy of the model, calculated as the sum of diagonal elements in the confusion matrix divided by the total count. \n\n* `formula` : The formula used for modeling.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Assuming tree_data is defined\nresults <- lfa_random_forest(tree_data, excluded_input_columns = c(\"column1\", \"column2\"))\n\n# Print the list of results\nprint(results)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_random_forest(\n tree_data,\n excluded_input_columns,\n response_variable = \"specie\",\n ntree = 100,\n seed = 123,\n ...\n)\n```\n:::\n\n\n\n### `lfa_rd_to_qmd`\n\nConvert Rd File to Markdown\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`rdfile` | The path to the Rd file or a parsed Rd object.\n`outfile` | The path to the output Markdown file (including the file extension).\n`append` | Logical, indicating whether to append to an existing file (default is FALSE).\n\n\n#### Description\n\nIMPORTANT NOTE: \n This function is nearly identical to the `Rd2md::Rd2markdown` function from the `Rd2md` \n package. We needed to implement our own version of it because of various reasons:\n \n\n* The algorithm uses hardcoded header sizes (h1 and h2 in original) which is not feasible for our use-case of the markdown. \n\n* We needed to add some Quarto Markdown specifics, e.g. to make sure that the examples will not be runned. \n\n* We want to exclude certain tags from our implementation.\n\n\n#### Details\n\nFor that reason we copied the method and made changes as needed and also added this custom documentation.\n \n This function converts an Rd (R documentation) file to Markdown format (.md) and\n saves the converted file at the specified location. The function allows appending\n to an existing file or creating a new one. The resulting Markdown file includes\n sections for the function's name, title, and additional content such as examples,\n usage, arguments, and other sections present in the Rd file.\n \n The function performs the following steps:\n \n\n* Parses the Rd file using the Rd2md package. \n\n* Creates a Markdown file with sections for the function's name, title, and additional content. \n\n* Appends the content to an existing file if `append` is set to TRUE. \n\n* Saves the resulting Markdown file at the specified location.\n\n\n#### Seealso\n\n[`Rd2md::parseRd`](#rd2md::parserd)\n\n\n#### Value\n\nThis function does not explicitly return any value. It saves the converted Markdown file\n at the specified location as described in the details section.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Convert Rd file to Markdown and save it\nlfa_rd_to_md(\"path/to/your/file.Rd\", \"path/to/your/output/file.md\")\n\n# Convert Rd file to Markdown and append to an existing file\nlfa_rd_to_md(\"path/to/your/file.Rd\", \"path/to/existing/output/file.md\", append = TRUE)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_rd_to_qmd(rdfile, outfile, append = FALSE)\n```\n:::\n\n\n\n### `lfa_rd_to_results`\n\nConvert Rd Files to Markdown and Merge Results\n\n\n#### Description\n\nThis function converts all Rd (R documentation) files in the \"man\" directory\n to Markdown format (.qmd) and saves the converted files in the \"results/appendix/package-docs\" directory.\n It then merges the converted Markdown files into a single string and saves\n the merged content into a file named \"docs.qmd\" in the \"results/appendix/package-docs\" directory.\n\n\n#### Details\n\nThe function performs the following steps:\n \n\n* Removes any existing \"docs.qmd\" file in the \"results/appendix/package-docs\" directory. \n\n* Finds all Rd files in the \"man\" directory. \n\n* Converts each Rd file to Markdown format (.qmd) using the `lfa_rd_to_qmd` function. \n\n* Saves the converted Markdown files in the \"results/appendix/package-docs\" directory. \n\n* Merges the content of all converted Markdown files into a single string. \n\n* Saves the merged content into a file named \"docs.qmd\" in the \"results/appendix/package-docs\" directory.\n\n\n#### Seealso\n\n[`lfa_rd_to_qmd`](#lfardtoqmd) , [`lfa_merge_and_save`](#lfamergeandsave)\n\n\n#### Value\n\nThis function does not explicitly return any value. It performs the conversion,\n merging, and saving operations as described in the details section.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Convert Rd files to Markdown and merge the results\nlfa_rd_to_results()\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_rd_to_results()\n```\n:::\n\n\n\n### `lfa_read_area_as_catalog`\n\nRead LiDAR data from a specified species and location as a catalog.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`specie` | A character string specifying the species of interest.\n`location_name` | A character string specifying the name of the location.\n\n\n#### Description\n\nThis function constructs the file path based on the specified `specie` and `location_name` ,\n lists the directories at that path, and reads the LiDAR data into a `lidR::LAScatalog` .\n\n\n#### Value\n\nA `lidR::LAScatalog` object containing the LiDAR data from the specified location and species.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_read_area_as_catalog(\"beech\", \"location1\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_read_area_as_catalog(specie, location_name)\n```\n:::\n\n\n\n### `lfa_run_test_asymmetric`\n\nAsymmetric Pairwise Test for Categories\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`data` | A data frame containing the relevant columns.\n`data_column` | A character string specifying the column containing the numerical data.\n`category_column` | A character string specifying the column containing the categorical variable.\n`test_function` | A function used to perform the pairwise test between two sets of data. It should accept two vectors of numeric data and additional parameters specified by `...` . The function should return a numeric value representing the test result.\n`...` | Additional parameters to be passed to the `test_function` .\n\n\n#### Description\n\nThis function performs an asymmetric pairwise test for categories using a user-defined `test_function` .\n\n\n#### Details\n\nThe function calculates the test results for each unique combination of categories using the specified\n `test_function` . The resulting table is asymmetric, containing the test results for comparisons\n from the rows to the columns.\n\n\n#### Seealso\n\n[`outer`](#outer) , [`Vectorize`](#vectorize)\n\n\n#### Value\n\nA data frame representing the results of the asymmetric pairwise tests between categories.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Define a custom test function\ncustom_test_function <- function(x, y) {\n# Your test logic here\n# Return a numeric result\nreturn(mean(x) - mean(y))\n}\n\n# Perform an asymmetric pairwise test\nresult <- lfa_run_test_asymmetric(your_data, \"numeric_column\", \"category_column\", custom_test_function)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_run_test_asymmetric(data, data_column, category_column, test_function, ...)\n```\n:::\n\n\n\n### `lfa_run_test_symmetric`\n\nSymmetric Pairwise Test for Categories\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`data` | A data frame containing the relevant columns.\n`data_column` | A character string specifying the column containing the numerical data.\n`category_column` | A character string specifying the column containing the categorical variable.\n`test_function` | A function used to perform the pairwise test between two sets of data. It should accept two vectors of numeric data and additional parameters specified by `...` . The function should return a numeric value representing the test result.\n`...` | Additional parameters to be passed to the `test_function` .\n\n\n#### Description\n\nThis function performs a symmetric pairwise test for categories using a user-defined `test_function` .\n\n\n#### Details\n\nThe function calculates the test results for each unique combination of categories using the specified\n `test_function` . The resulting table is symmetric, containing the test results for comparisons\n from the rows to the columns. The upper triangle of the matrix is filled with `NA` to avoid duplicate results.\n\n\n#### Seealso\n\n[`outer`](#outer) , [`Vectorize`](#vectorize)\n\n\n#### Value\n\nA data frame representing the results of the symmetric pairwise tests between categories.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Define a custom test function\ncustom_test_function <- function(x, y) {\n# Your test logic here\n# Return a numeric result\nreturn(mean(x) - mean(y))\n}\n\n# Perform a symmetric pairwise test\nresult <- lfa_run_test_symmetric(your_data, \"numeric_column\", \"category_column\", custom_test_function)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_run_test_symmetric(data, data_column, category_column, test_function, ...)\n```\n:::\n\n\n\n### `lfa_save_all_neighbours`\n\nSave Neighbors for All Areas\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`n` | The number of nearest trees to find for each tree (default is 100).\n\n\n#### Description\n\nThis function iterates through all detection areas, finds the n nearest trees for each tree,\n and saves the result to a GeoPackage file for each area.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Save neighbors for all areas with default value (n=100)\nlfa_save_all_neighbours()\n\n# Save neighbors for all areas with a specific value of n (e.g., n=50)\nlfa_save_all_neighbours(n = 50)\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_save_all_neighbours(n = 100)\n```\n:::\n\n\n\n### `lfa_segmentation`\n\nSegment the elements of an point cloud by trees\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`ctg` | An LASCatalog object. If not null, it will perform the actions on this object, if NULL inferring the catalog from the tile_location\n`tile_location` | A tile_location type object holding the information about the location of the catalog. This is used to save the catalog after processing too.\n\n\n#### Author\n\nJakob Danel\n\n\n#### Description\n\nThis function will try to to divide the hole point cloud into unique trees.\n Therefore it is assigning for each chunk of the catalog a `treeID` for each\n point. Therefore the algorithm uses the `li2012` implementation with the\n following parameters: `li2012(dt1 = 2, dt2 = 3, R = 2, Zu = 10, hmin = 5, speed_up = 12)` \n NOTE : The operation is in place and can not be reverted, the old values\n of the point cloud will be deleted!\n\n\n#### Value\n\nA catalog where each chunk has additional `treeID` values indicating the belonging tree.\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_segmentation(ctg, tile_location)\n```\n:::\n\n\n\n### `lfa_set_flag`\n\nSet a flag to indicate the completion of a specific process.\n\n\n#### Arguments\n\nArgument |Description\n------------- |----------------\n`flag_name` | A character string specifying the name of the flag file. It should be a descriptive and unique identifier for the process being flagged.\n\n\n#### Description\n\nThis function creates a hidden flag file at a specified location within the working directory to indicate that a particular processing step has been completed. If the flag file already exists, a warning is issued.\n\n\n#### Value\n\nThis function does not have a formal return value.\n\n\n#### Examples\n\n::: {.cell}\n\n```{.r .cell-code}\n# Set the flag for a process named \"data_processing\"\nlfa_set_flag(\"data_processing\")\n```\n:::\n\n\n#### Usage\n\n::: {.cell}\n\n```{.r .cell-code}\nlfa_set_flag(flag_name)\n```\n:::\n\n\n\n", "supporting": [ "report_files/figure-html" ], diff --git a/results/_freeze/report/figure-html/fig-boxplot-number-returns-1.png b/results/_freeze/report/figure-html/fig-boxplot-number-returns-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf2f312fbb605db0b89af1cb1fe10f226758471 GIT binary patch literal 84987 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�+LHO14Bavq5pz*_44+v1u+fQo#jwbf<{UN^-*T# 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 literal 0 HcmV?d00001 diff --git a/results/_freeze/report/figure-html/fig-density-number-returns-1.png b/results/_freeze/report/figure-html/fig-density-number-returns-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca33d30ef4cc00f121b450a8a7ad9a809b256cc GIT binary patch literal 129091 zcmc$`2{f1OyEgnwlOd%{r6TD;5k<%>Q_7rqE}24xLT2?uiX=%Y8A8Skk$I}5LWV*z zMhHLil$r0id;ag<`&;YX-}?4m`+GlYJuB&P|L*&`&g(pn^Ei(4zN4XbnwFY{nnWVe zo>7uNM(xg$E+c*@bY@Ao2CW>1LMvY!3=Zp zl-!glDK3dOzfuibE|;>^m-Th4=CnPHrd|J$+|?#1*zh?rJfDMHO%i{S{5R}!|MSf|5|zZC zZ!TQl#7cZ~{g}*u=`sr}@y>l8ifjHlbm+Csm!H3)9M^ho?x>HIW+R{9n4}&nb!9`v z@_32H$DdjBTxxfBACLE#`E~sG@emfFnudmXzo((nYlX(rYksKDUFVW**{9PGQx%)4!*n6#E{o9F z54ldg?=(JA^f(@xWcL60^XKaFe3oIJZU3h*)u$((Ncj|ZIqY!Nc&np9e9`fpj!jmN zb?7RdJI&_f((`6Rc(u#u_u~!gag&DUR8u|DGk+Zob6jbQOM4<6GGiU<^J~TR?cbX> zP^D&PPtO1FGb?r(Zc>--dTEeb@WWU9KsYVK5z#mw`(zmng#X_|T}E*OeC(Q%SZ%GS4wGMn&>alwo zY394w?KR=LCxyG_xm;lR!q4DVGr!f(PXuLe^W$&z;uFTNZ8W*fw>`!l)n5GZ`t@t< zJn?G^z6(nuSy_cYgBrIaSUz3)D8#4|@s7t(T4#OBKsA}xzE8q$&3lnuNJvOTM33^7 zbwkX4aW`Yn;TJKRynp!2m;G+Hi&*tsS(r-IO0Iu=ywdy?B|GAzDc8E;7VTb70n50v zhIaQT_J)3Yv|Xl7j>7L$g4xK5Q3AeWG$+2xY!v6keRWLK3@kytiHyWo0 zOOj)K#hTeSeW(uS8VJ0%U;LKvu8^i?>CDvgX$+=cmQt5QxMTIQ8bWeC*H`)ws%y&= zSVeuxSLfeS?4Wm_XE|YW%$3}XJHRjNQflh!FJKW$SEg&%)c4S}|N9M93QjUVN=!_A zp&aQp)~@5bU(o7q=^KiW#*w+_+c%_$zO%VGo#xzK?z0>t>E%x+7CnyZ>^pY;`aaf_ zk3BCC2G&+qH4S@(?J0X6ZXjK6Q0n17x#i}CU!R{$7yh0dZmNys-$5Rwrlzi`srg%s zCa#@mi&bBZtaxl{Vqj%E=%FZUQ=IRzP2+x@0w^;(L@6#&sXKr@E465`v5tb+V;5utf+wdwveoWM70>weNl7%ZhWTuf*;nd; zfdSPg0xx`)e_y(E$=TUC($sVK&5ezIOT%3Ag454A-ECHv<~S7Z+I)LyU~g}4XlS_n zdyGpx#{2iEfk?u`^^egW`hF4yt~;bxviG?oGqAsZB4|BcGEt7`;N;}QqGiQw;y4^M z-DVxz^T*|SG@{VHiiK3z(?dYGS+Q}Nq{tVby|Hf3qW z57wi+BhoJ4oDS!TcuOC1qCO}-MXx<@+n$5|HXZpHo~gz@!cqsC2fNG2Q_bOZr>9Fj zrV<}4=P$amUY(oh>(uz6FKXM&&Hmo8V%4q7wYB=*u7vn_M6c6WUTgXK+Okf!#h@I` z#NxWqlbZa<>n9FxXvGu{CMbsVvx!~(rJ`QrH(kw@ z<85vpj|(ok&X0GI1DKh2?%c_7`re7Cx`AX-ht87*R;`&Pp;AjW0SO~6#iv<465rjI zS{}_s;OL%wWSW)b^zzirE!7lu-(H5v9U1W#6%{pLvS~^R*_UHp6;z|E)|8}b`J^RX z&nrhj=jyM|so58;+2t)P`U{==M%_x37pZAz*pYBM8`5k3(s{NPhG@3$E-k`E8SkBI zla607q)*e<)^4uwTc_rVdi3b`K%|+}`pV4oNQYy^n1uPFpYedl>Xb!`c;*=S>Vl-#@7cuC{_0-|?ro*+=c;`=yd^@5mgb!uQdH|cg>gt@ z?P}_?i4u*AW!WDr&zodjt8mcHFIyP)$-yT@m z`xp;^_|bi--#dNwP)ldg)nv8kBmTGV-E$z;;#XbhKG7VkW>j4gcMZ-8ekgAL{n()9 zw@eeS`L1iV_l)K|eR8ep_=<<(X9gQ4epLLh7w#DQJ=~Ox#F;kcYw1ul@Cd2p``GWT zY~C7_VUHg#kkhlM*|%-E$=g`qXy$RZ+`cU*%CWp?g(2Ue%X6raon5}G*wqW?yUNo= z;Bx!x;}<`qn9=Xrm6MyhgH4Lp>rsB2eOATV5^CVU%6;3x`e^I=XNUcFOZ%33n~?AB z5$vaZjZEUpmzs-Wc9&JMI4_DR{JekF^F zF~=~Y)#O@Nl4?{lJ8~Rqn7HTcP|?*v#Ou=UF|QUKJrAi*bbg)}%K)UdJXY|-pAOK(YxLE}n#k(fTBBU6kQHxite$Ay z`O#&G6WHv$)Vl}=)Dir~%=GlVeWC}WYBp}&-s#>KVw7(`W$S2a8t0a^rd@wve=(_j z*Vm@4l)D}Ir%&#?_x-!RXwCFMZA))eRTVkoG3{RA6>NU9vP?ig0Lr?%{ChvvlHKBN zFKbVt+~EYrF|4j%Ahfe7)>CWREjXmb{1uMja0K+&Mbg zTUq8gcdnq&AlE8_O;S?QWXovbw*Yne zAcz-7a2N*m-!pBoeiUj8f1zGYF%b+xU(i>77EivXU<2%-81Rpw_@RWl}A zA00KS=|x_CY5&vImE69Jpb zZ%zK*t*OZ{*ZTpxsK1{(tCy0UuYAFLP}fxG+PJZSOjaxKNbMrmpo=p=%D~6f#lhGX zXUo&#Uy*tSCdFLI4=b{&Ed)~ewOrd=7w^B}3Hq9*!?QR7P-NnJ<>WrH&oAlqm8*-+ zJXcXFYhJY@Rrr>**$dAtxgk3oWeQflVXM@$m6k=j{Q6QTz;|S&xS#Fcdl6ZAcCC*% zwgX68CI!W>%r>dlhfaE2c|2gWIyFftN9jBmeNDHJH|EeJo6oG~;?783gLqbbe&fQ% z#bmO2&uVJ1l;gAxHL)$5Oj8q`AL(WqANEVrNqFyrIB z{YE8jml3!Y)t^3n;;&fwTKVb45fQf7s7Tx(Pp|=1l~g@#WYVv$Yd?;fSq*=EVXM`5 zE^_5kucU$AxXzO|UM06~zOvSIeEfCT1;B=v?QXk@hk%eY$855L^vq|$E1gK@dMAH| zt4kfGkyxE=;*;JibR+BK+JctoO_w1G8`|jaCWX7`=?4N!OC=WH_Bwrjd|b{KfYvQQ zJ+|Am)ns})vdh6N$Kp(YmhkRvjOE7*f#0U7WJn@i`ry~vZK@ev;f z)~*>h+N~EGzNTn$EJ_5&a}StNg@uQ6#NHR!z3t}K9hp~b-`;MNV+wu&IF5p~=eW6i zz-ELjzx1cA57SiNbZiYNI4VO5dt+AEOg}>oBp|Vb$2rQdurN)7K_gkpJfnoUkybtZ z9)K22ezBrL^mtv{I)S@BgzT+l-hJHsed3vLWF(j27m>P55rfT})`I!VHP+@`#mRE! z*SbBD2k9S{g;B8+2c<0`8CZoZcqJmEpr>fOc!Wj7!MInwe)VGtg${jVI_snk^`gLmmIwCpOtQE1EXv*7F=2fs(s(R zeMuwD@}{7d#24?P=mDQEBXdhreIKule5)HgtgV0i@7B^y{#;R|-+nvCoDf2R&@}Va zq+Rxu_V^R#JJsxDVj8aeMn0$=`7H9oJ9kMtc<-s8MtYo_>4^$p;)#m%$SD);tKFH@ z?#ppg`I{*Z>{_6S94(Tkd>)giZFayLX{>mU<`~WC@}U={(`9_A&B>w9&^=XKKl*HS z70?#FOQ}WmgPyYAsjeg6a$*vRqrq}N{dAb)?A5M@rzVlB7f zy8cwe(X>sS(M@@8%2SOPE+6xjEHi0w@s3KWpaZRJc~K-bm+{V`oLCgX1lG#SKgzoX z4Hgdn-)_Iuo8=J7hf+SIS=GDqUBDDj&qmoX68yWbedDiH7sv;_j=5j^0en2GJ53or$TnW zk`ndwT>m!o^DZxc`1tYATF%|2{CDRo;yXkB?cA#9d_Sp-bBiS_J2G9xZ1#x)?Jv1$ znz4AIe0eSH6T%A3*&0$05a6fnE9gy@7y3e%^LZH^q)yqIQdEVjnrbZ<0?^Oc=fPbx1=`F>eAzT;Qa;+^JoKPTie;i_dKq;BbU4yt2 z0GFVdplE{56$Dw(y?gaFH7vjn?H9a+X#PVCHUrKzcir(!>loN{HDcfPz$G$^wNz>A zU`{QcIH(PDInB>bYd!=B@LlK)+_+_1ib=`u#^-Vy-5;CwUYsPWCYyFi^ZRRrmUXfz zAi&Igxw*L~ZI{+&ew!S=kw(SWd?dMPxY^;uk^V8C*0<@>dA2Rn7kJtI+lO5&n**6U z%?{J1$>?;wDX&pp-m9&F75vjrHFI@<^D9d_i1Slo*gaS> zQsG(8W_1Ii)bBryl$o*!Z*7+11N6~bTrLaH(n@eRd}E2m+krK`zlCLccZ|ZxE{8Gi z*Vz`;yGpwF{0nF5#cQSOOzU=fnxk( z=eB#J-;Hx6S5(#1bhCuhv(A=Jeb~$6ecIDwJaljAgNF}i+wHQ5`XIfw&3%yugt7-VPO`||Efgf{uI=y8}5>l_sQ1z4= zZ%Pe$;J9#=KEHT>s-2XE->J!O5qf_YTMvW$ur8RQz z>ddJS4IP877(wg$+dDb>v%rpA9jr%(^0}tQ_G{u90P&`;Umx+CWlF`HMN@Q3`R8BW zkVa3nvia;-Mh2P++vOKAv~{086{0f9?b1h|j8s>0ZGz7~yUm^;1wgWavoi^=ei#)c z4&I?{B7NPVV)ZxDtQO@IQf`553;DkfAd`46P0GD{BH%+7| z#BECDMAZhN`RQKX4pxbwUk9w#*H)z(;yuag5dh~`u3qixRPX~6yZCn1)ruK=B^Xt= zwq@R|{bh0c-L!UX1ZDE_Ao{FDBy&CCC2W|5p4)U{Kd`sYy+cAmd7yIzR>eK0Eo7GH z7}>kNY;v2KLY3qOw+lcbQkUA^oMQBd>G#|QhGt3SXffB!@+C5g_QQyX4AZh=#5(%a zc64!cKffyTUk2;&iR0ms^p2vUq8*a6_dj<}l+M)anfc_^lvK*r#?}~A9ue-@QqX92 z8-W&@RlaoA*Uh(12SB))!aY{j-FEzwSPM@zof9&<;j(qPMHJL98*H4$es7p()OG!Iz88QP5 zccjxO6>{IJJS1MI0!@?zAR6-D?p6C1eg&Uu68wgX9#)q5&qyWiNVJ3$Q4T>ApYjaMjFnjXItD5X#2iYK;@& zee$%%3z8J`(Z3Do38pjM*uh~uAyn#!_!nn4bjowLo8)}I#lFcDvj!LcO#GU|VlOg` zQL#(v3c>7)t|#6~HofJVfAQlzV&rQNV&rK~&NK6#QgC%o`91fR z{;p*35gc~CEK}LrfB*eA;67-CGnCHAvR-qqqhoh285gwhZELZR_y2H)vx*Dq9h|^fi$>t8l4$ z^}*5sC86iYV_3e3Sm}kHnhPunV7AwoAOAX`i>vbIq zI--Da<70c^<1@MGV#80Bu5nhc(c?vDB}dEoH2&;I zNe%W((z<@%VC>nmXF1iLeb2Mgo7?aNZH{N2hR*cmc``!(0z&`c-z=wmqOFjmSXQ$@ z@qsBVS(yN3^-7hv(S0E6+DhElQq(~ z1#xMy9c-dk62+VscO?+o0l{Kc6`j-7)g>UWKDn(4$-nTkQhtx@Z72$olW#WW(C9J? zN2!iApUy0<`F4lP)N4#=Q0Uo%2VXOc3UD_kckC0ePzvZv<7&N(mTty1H<2tY0FtCe zv7x^Hk)?&+hkEZ!s_}@32-oq>Hjli-7ccT0f0$;xK<5dNKRxq@adxm=FLa#ySeNEC z^gJ-l*p+e1)s+Qj(Z(V>v1qkx)qh2vaP02%NZkucpHOx##fV=0;PGCWugK!leRcpq zo3Dv?_U+oU2O%Iwu+H9#_d9vRqC%<$(?%LN&0gHM*8r)i#T644_9f-W%`LPKIEoF* z)@1N&f@o=EFETISRo{^<8X)9DB=4B`asFDpqJ8 z&S_d)+?z%D3un&;Ra;EE4X@m3j4dAPv{Tg8{dS*S4*A6mry+fQ?{-!R{S0ZOglndY zwq+*S=TBMI8nH`X%OXUFVTcY4yB1hvB^6(uGdKSUQg?WbdlG**i)!c&&n@lbP-I|W zc*s^8YvKr^v%+_^v$UZP7!XutN^NuJs7p&nN@9P1KXsq8RElTMjjf$8>D39M%E#z# za7s!FSFHC}hXTEm@zPYKQGd+|-q7>TpwfYadd|_$DeM6gTldcYovPIF^25EhT1`2YwTS5=i(6@^!fVKv5vuPCDrBOlN_Y871`7_B zycn-o_howo>Yq`X?B?t1i)M#sACIJ@Pw%^cp!gFGo%;KUV}EbtD#gU$e_;J5S&C?6 zjg31ADG1C)heOF2c;>9>3}w)q?SRW4+5Ac&&P0n}ixI!Zcl78{Fw;CdBfWuax{meR z;!vUiejR_5uYzI~LlXl8q82L^9TU@yb_S%-`f|m(mY369BZ&2{z^6xz+c z9cb}iSXlT=`O!Vm?r z12}6*(+S+ZA5I2Bq{sO|Sv`SUzkNF>_B{DpMhBoAxSu%`Ubd4?GGqQPku(4a)sS?% zO0!!B|DrzALfe!=kzVrwzKA;V{?_s3*lXWFw|xGrvbdHF3>eBL-CZ#0IX^B5n9As1(!RRpl97@R$Qw1QzWy4XdfnP{r&9*eVk8}h~xOz7r}J#=wt(T zu(@6J*hF~;+!r=!&$e68cx$fsk{Hw8Ml}%T4xta&NOTV(&AoBOEj`7wac7NheB7)$ zc4!3(_#v;rEwGj>T)nit@cygCxTJW8jm!dS?Y-|Tg`=S3b4xG#t^aYbY+|I6;4=

a>l5CSe&6Pvj zItoUwBYzCJ^G}1zA08e)Gn(7b?b4(Qjm4zcWe;*Wuu|{US3i80$B<>pe+Kd7i|1weeJ3>X-K2N-*qu?#WT2n*889oe5AdL&%+#ywn zLV$Q7eCw;z0!YMuL_$r->juh#oi5-5-8H4EyuF*7A@jo1)Gc?st&#Z zcfq=I=PRr=TEO3^`vy4{cix^~02Dp({j$_`n)i@wg?v}sgR7>$Ukn}lQQ?Q|i%*6| zYy_DV#-fXPhL*3;8~fn#zkKp1PnMnA7MqE3~JH^I?i}U0SG8x{<7I~ zb4PcP;(i^xvDG%Nxw#n`+}gr|lKp32AEI#zPisUu1*B0;0chNfh63G<_=R`=f6M?d z96UaLamx-?`&ar__0NWNUZG29>2>*ChaFSooXACu|$H{{pmJd*LWLb94!^w^9F!?|uhw%>Ew9v0qO;NOa#lY&hS+ zgR(Ik8hMwRtUx$HVRZ3TOU7w3FfgdEBDbV-`QO*vATt+Uz)2VdJ>t}oOTYv-n+4E; zH2;XAZsKqgk@B)MxO?D+d~TZr$ZSLa5xS6^V%j#5-uQ(*-%gV0v4nKH?Gjc1O#}=F zpmO&L*&dqkU56aU%x^ks{POi{ZOSPuX?0c%L%4bsK`A6Ao{ao5>;kOdM3sQe=96=u z-7iCF!21Z`NkLH&hwbw~G71+pJ6K`$!5cyGqlkMnh2SH_LE*pzbpDlojr#8ZX48|t zD}{6ixwrcX4i$CvhT7WN>T2XbUp2LRbmo9rjQ1S!4ACsa zbK{P-63W5cq3p!OLpzu^kkZ~F1MS~_8vdij;Qkx~G*yXW{j2joV!=(Lv+Zw%%M2(Z z;^D(j!ISmyq4>gGWo2nuwnR>caD&B-tToXjkrr-kVokZx+*doj5l{#9`P{j4(=#(L zTI^zE9Iz6LVNh09rkCv>7+BmdMA9yRR4Oko|Ea*WuzzxTn-#WqpcQhDHTqO4Dk?ni zBv7aa8j-}LBx-j2-`Y|)Cg5y>9j?#mBvOsb?9dm)I{|)Ma%4!?S?)#Y-C(f+d&4J3 z0KM>V`u+Ql^4E*lHY;g9gfLjdz{AViiG+tlJb=(K@t&&kEL-cZ4hKEYSM}karCwQC zkvYmt+Vtq{c_npqWD005E{m6duw-u&npGB?@4|DspG01T@d#AQk=$#VXP8-$GlK8l zJ+XTmq2tk+gI5CJp>3BXk@yZAnv|hM&X)+U?w61+A4q{4F^8+4C$mtN^0?hM-pHLu zA9G0YKFFBU>0DJ<^FKIu%<3mRFr#g`$yMea<3)oMy9G%-e=AVzXqEx7xmUpAw!}+b z9-b&HEO6(+g9nLz*#MmhtCE_UDU3aW4H8-!8VCHdJH{XQz}WGb^cd3Mo)QL7^^I+HYxgcsgSOe*t^h2sM^yCkY10 z95q#za!@b=2E^SbZ0_67c6Qp%{tV`4*>(#Z@uzuD5~*j$F88=CNyJMstv< z(eh23tuIBIW}%c_K_RlZ@&5gLL;)8kC!tKVwY4E=2Bg=fLIDO9<>ghPgfoz~O&LdU zorS5sqfE6McStxPtc*PdB2d=bzyi3r{l-7Z?=PE{| z5l~F&&^$nd5e6Sl_3LU+1O{q&vf!zd!65}uhg<7QlImXe_plB}@|hU+<6oAS+X| z$N2m<@c0`bFg6S)wGkC_ZLz`6ZKAu&{8eId@()xVJj)f2XfH%BDoh95j0rmFy2y=Z zRaM8Dk{bYLuHoD*Y1m_}X_$BmkvX-_ox_qwMn|urejx+b*qqS)NU`xc8xnpg_*G&< zV5UZ})z#Ot!teq8w99?t>v}HJ-~QlWQk$zp$c=Mao7Q*W8XV5Sf%a85v)+j>zq= z_xpLAB}6QmulW^adW&sAM*v;>ozt2Oe=xQ`9i%%db}-3bY__@b%2Hksj)Jqx!eVIe z@xaOpuk`)tJjL*5zZ!B88+-j(_BO5)GWu1c@3#nPCgy6M9K58P36$M zQ9)^r=Eiehi3$n|`YM~Zfv#M(g5#gD03DzYL@(*THUe;9mj7DDgK7&X(A`9BqoE;8 z1gP7{bRG**7j}G{b7KPfiH0Zvr59i6my?K(xlZ%s8~wtwXU|Y7_lsVUrwn`e@HLFa zpyY{uJ~cV!tdbJtr$VXEKM~_XPgGhYw20q(6QD9u&`5v^Xf)L|HA}#)M0o%uXJugl zxoZTFg0i{Lv@ZVj>skC;XPMVE*LnuxcS)*TlSH1ynds~5<5GEi|Is5({}jEfZitNO zts|`&M%TtWMb|&hc{2eT?~(Rhfv{2mJA-Z1;XfC6kVL-#i228s&-2XWT~o?*+FF ziT1puWPhofUQp6=9w*^xTIKXj#h=b6_pum=lAlgpE?~tW4XE5jGK?GERGye9PpP?f z)+O$QpBYOhX?|A-v#EnNF7OCyN=oBB;%+T{=#sfAK~kVDRFgM|c8 zyT^_!M`L`3V-e{kQ34AFFUGXu61*xVX5aT-+&38D5>(Is&h>?EX(b=H(O> z6>ZsB6*N^i!@t-xzZ+nQs^e5QVA-|>kJM6VS~bz}G;%B($JxN(iK1;-adM-Q#1)<< zrHp*TjOm>l*=$`We;)SJIdG^yMpoM;;@}}-^LO-Z3MCFcJkV03-|{qOHrU7y&4`Gg zy@M`L`@{HXATZs6bf$D}<2#iB1+OgJq=&v0a#6OQP*fcjT3A?@Mw|;7hkoJlVgx6j=f82%%~VcnrSDcIy}#9-((n__DiM zOLNQ3w}BU3p1e6NFK^QuN>41v&9^;rm8?$W=oyx_8jDsE=64KFP8gp%caVO8NN^Un zV4Z+1l*TXINo+@Em^&H(MPaAFO7?3B=vio{NR(#J)t__%sW8d*|N2$D4Vaf+wmD6w z_D@JD{&TPj>1@PqIDXH5PG=4(jjyu6@duy3O=sb&^}Z!Rnvl~NNhRUmELKB_{HHYDc18?SBY>xPm=bV>xwfHZ_ZU^dIHGEYUK z0Rs>n45)RQDcBOKEsVM|ZpJ%;Hw*W?`6owd^j%t_E~Wb!AI$d@nH0U*UV8eglRa&0TO-(g)4>7)Q;kozK zb704rOgZ#WjxZ%;MH0h+-B8CruF_qOZ^GfBVjz zFYk0w?9d;8XAzoa5nZHs2eu)kR5A1AOBIf+YLlX3s)-O%kJlX@Z_JV2!>WvOx~ zsNG?eYp}XcR^S$X7Oln%SW;&d&URK=Igc*1#a4#_vhK;|8!M`R($p*c(v0=DJx(Y4 zx2CtG1w?SPo*uJ&8D4Fh=PBfXSg^N$85jV2YL)pEU*S5OtcDAH@BQrZ z3=?FPy2NeLbYTinl=okIchfK(iP$^Sb%RB2+v_HQ^gKO|sqbTMA@)7w?iz=JWjb}l zf@#(c7Y)+8T~yxg;U$-|6g6wb_idl!KIGqD-wh1Je!;D~0@G7xG#L~$Ur&nMS9tZcNQ}Dn$**Rje8NPYDKT8Q`WH?eb1Jg)nNd`{ph zW4*(?ybmL_cJ12r+9|CBw1rjfUtC;)xSanWF#{i8yj5pWPN$4_sjp!|oRT%T>Kt)O8bAH(h+skhCC0B44KP!%;iE^7A|fs& zZU>657VKfUlZ<%)v~oCt%{M3mE5o9qc>HhQy*u06Lrc;|#{6?q2#Wguc#!_rra=GG zSpOfo3~^-AtOTB*y(_S+eT2D4pi)fNB!M(RJ8->kOWJqHgFviZ?*-wJv8sDY#m>ZM zOb~v$`h?**0|QK4%6~v{p_7f|jfU##Cnqj_MWf_ThinL@6ePnuI@VZEa;m?-|Mk0j zznhO^+RQotj_UT{ygyq}*mFtph9CMmK)nYM5p!sqQTd|L+JXfEwXlTQS8#{)_nkND z+oPFhRLns)2S&CWbOxBL2XYn^>sfxQJdhb)WPh=lb=d!BXZc7^eYdQ^6!X34sX8I$$gEw)Egr8oLb_n%?+FSYD? zvhNC{!1X_OgaK8_z{=w;LmGoOrq>oxYB6(}355Y>a2)86y&~Xh9l?Zk@@jkNrnjU| z%i`o``c7V$y&gXG-Cp>pgm_&38YF!hFN(m*=iEUA_D&)|vLWRMtK8}xK;gP3LTQcX z3OIhSJi`<0P;MV{i!Cs)b@f2=3BXP8{nOH3)MKMX$c0qw&C*KZ=tQ@t+kGh5!iCn9 zCPI}G`3Kse7)tHnjenY@321c=g}t``NOTu6Q}zg2NnpB+ZzJS3x0yN-P;BMm1o=#CJqe ztsn%@;(+IU0$CIT8;Al&7!4LCdkZ?R1V;^A!5Hh%%$K_ui+G|^9yL2HmYTO)2`(`ksrax%p54@zuqgCv7L3S`NA1==|^@))%}u_z)_5eZQPay-&YMo zF(gsAkYM?G63@LnKe3MX5Pq3;s1z{X`M{6EckwdxPT2E_g92X!Vg0OP)T3m_6SpRu z4#gM(`+Kmm7+eAqR|+DPa2UnKoqy*~g%R6ouGrbD-(>0%hBukUJimMAj`JSYy?c55 zo&1z~dvVf!nZs#~x&dE^+a5q`d=aCF5HjJH2L}mWN59;A5meiEVrC?hNP{xs-Ecm# z%Y%RNTU)dq>S=@7hljObC@Xgv{)#H*+5IYA->y4w z3XWT2heh2d&qKTih1WCP1iQx7Hp@sM`|lcMT+)1e<1t?2z--HqOaPBhTzI!hB={FE zC+CL_o=G5i(?fTIg3kR=W|I|Q4RNV(gvT}H=^vIRq|~6%Lf~*veADoWuZ!{37GFo^ z3=0oJgz7ga#XRlN_X*taZV0f1pnIJdc#i`^ABUczLws*p(2oKkek0ehKg32z^Fdej z=V9*sx=CS%m-7q!0}K1l|o3_U%q^tjF{TFv^{ZggLMhF0u=HU2wF zT#q(;v-`K%!vO&qn^+y=d%pDa^n~06UrlA;j!3pIy-uJK>qNbzF*^s#pg$eLK{xkW zDnw~QfCp~}(9`X=z6!N}S%-A&QM2voA87BnN%?<^b%^H=Xbe6YPRXi?B%Nx?=> zpAb+fprC0lY=o)Dl#OU9J^C?pePUN=oBch4xj6=MOtlACuggK?i3-t`ekuX@v!rl5 z!E)2{NX_|U3r=?tec-2#t~e7Nsl~C~-ZtMis`;?Wa~M6Tvx4pQzub~7e6TqIu`@Pe zmHcaS17T;Vsky>B4N<9D(F$`r1GV!*UpNE>XK;MricW|{&W&lDpzQkhCN5IF_MaAR zqmha$svYQFC?^jm3cEv4u4;-tjXaA9rNo)g=2Fm9i;?hv84g7@)3j^}?*ErBEf&?D z?$~$ofPV_g_@cPZ3(U-c+$4h5x1J@%<3#iu5xA`h78FSg>cX&uH_DmpZEAjVFL7*5 zDnv$c1Dm|9HW^Bd#9L=j$EaQ?_6^V#!_ckgbC zWQS6~Ap7j3^SjkkS+!MyY)GUM&nqsqg&@OHvttO9+^LL~s~6dXc1tBJasx#DO(Ld` z=zhXG!_TI#qVgF`Kk&vJn607}6e%%wd2qv>yv+Dux?QmN+Ty?y5;T?v1F5K#wEIp@ zVg}pw5fzC@yOrGrT|KGR9_59~&oI2ky(XW?fl>@d#UR49*(}&T{N0gD`6&zyO5dtqv6Ga-W<@f0YQk!SWN8SIYD>_ zU+QbFwSxP^EFM&JD5}Cexm(^vf6ID9!wv?A&2xx--trNz!Oxk(4gA8;grN868oUG` z+%M*mlCzr#lPlm3u&G^;OY31WOIF+OT3Bs?VX008{(HZyXL`erj2wm`i4a2~P-lq= zgd*v~!Bxaxz-WQs=^kQvW3aJTZA9-+x8QFKL>oZI8BR=!qEHbZ3r7K7VG zwl=P22->fjOxd%kKd2_~mO01K1jz zVR(K|m_UHivm1%GjG&8~_4G-p+zB=Y zsE~u7^WPduurkl@DNwS*Y89fGP^-L8?%jV%xDfAexu-z1fR7$gvm?syDqc*fbdJFI zo%O6CrWL|7kMcg~x>6tm}0G{YK4>rWvfN?EdZ7k1;Jh zq{3PwN#FVJy#eU|MDIu3pG`Y_e=$(IG)}X_4Y!I68X!h};Nd^bap6UQCx4)60QVn4 zTITjYF*K=UZf}40i$hszWTO8075Dy@b+`(;TlHpCcI=b>V*7qwXGUei z<#>8=;`2!Vn|C9<5uEJJfO@0Jkfr#lV{H0nl{wmiQd!j;+=Fv@q&ll(b$ElfUo_H1;F zn=|}OxvU`EA~QGpdX7icf!Rbr8y02~49c~1=q!dOTTK2Co8AkNH+%n$*i20H|94^& z?^JlcU0y#!chS}u9|6XO>_k+s+FE5LrQ1P4)ULdcEAXXFxs#chxp`wFNO3ln*AU~` z{Y|r4l`^FM5S%J_j|&hP6uInd4MGyk2*>~-KQK7Rb?A`1;;pqpOdlnJ;H2Ei#^!iT zd%pH{4PIAsln0Fd{(3N;TtX*ysh>J^3b<5ORu-4q9>_twz6et1e}nLpscVL3Fj{RM z*|M1bH+TZ&_SBfR%bkUqlqehbW@l%~PdIG1{qxeW^@i@~Kq1$cv?M=uT?+r~iD3JK z4z~|BZ&ny7H@ZBco6%xqS7tbp=ZO;Qd%49l-6rqFHxs8+!z`w(zZsqFw2k#mNIN$h z9HRT%e{^wex7Sk&b0vy9OKUMwJ|DuLTjWy**c4zlErvW$Ph>I~Eo5lJV3tYABi~ubpy(?cS~K^DeuP%D7ot6U3@og&+zjv= zya1?BQ&U63W?JD}W|-k{FcEi)bQ~0qrfU-k|B%E@z(beK@cUR>pVn-KKP;F)hTFIj$b3GU*Y{O5U}>$L&h;>AA?o<6PVo2sd;g+EvdBh(LQr5doWB`(8w zPf8NrG*ePif?7tHyAB@w2@wC`H5qOkkRYP_wv#>s3?qzqnQF5uFXgqv52+d>A$t7y ztKwovlM`Jf1?aF*l5RcYAT=(_A7%)GDFcfTT4z;KT>Kz}m`W3{AO>U8)6%f298AG5 z*b3P;r+`}+$`1(+h7ZsYQwC?w+=-6v0!{)OcM_b;70m?pFeSnx4c`u&OdzJVli+{Y zMgj~-7_qRhfM*WEFb(ri2$Vz6L@qv!6Ng6pbZNZ;cH@;>#HO?RH>UFn3+Dp{Y~H*X z44jURPGa&Z5ID-eJqFmxWKNaG8t2aCxKEkik$(^wsRto~IPlyB~DR%0zF<)zTCE+*(N;c1J10c)D%=87vWN7#_A>kt0H|5wAXpdn^hZv}N zczCK`E}&Jx%dB`pKQ3dMQBPObZTa`*FeR8yI7#}sRVX4UY3>IS{%U}v`sGH%Bn0e^d#GJxS+ot+OKIdZV8kCYAiE<`ccdvO|p zc>IY9iISQcE4`Pr50f>f$6Q@q;rCNfR^AIq9*q`v(7_IIx6z^AUQMhY=1_A6zyy+x z;Vn=Lf=>da1y^9d54*MW%wn}6?X90(-vx@$KQTb(83EW_`{9G)HDcg&gA6wV_V?DD zdW-}WDKSgG72D7=akC)A(Nez>p@J8DQEmDgMo6V=Uf@ii;KyEzWBxiLj~6=#!A()n zj>BPR3k#6)*6XO|cjPHZEFrg6)`3dV+#55*!TCpkWKjQx8IQWTBWnqhE!r*|i4Pw? zhTF#~iuGz~X;n+}o0bms^$A+mFf{H_P~YY5xl$^{Ww4%WJNcvC{UnX#KYKQ$!^FyJ z>KGgw8w*uU>Ch2g-fh&>Y4hBBD9R9zh~*&%II<3tB-|(Cz9j7aR+D`T;vK26+{f$d zYI-_ILln#gaowg_3C#@~HiQVb+UB8YMB@vZtOC|pyeZI_FBx{Qp)lF!lhf0%wtl^= zpxF$FJThjBw-e$eB_s_~Q(u^r0PTmQ#BBcb%E?Jd^-qNWfU_}C2#^jO!JrVf$uzyi zw9x5Be9DcDTOV-#Z+Aqf_Pa{agyLa!xLldT?t*QA1 z#<5*#Ff41R}6Xm~cgQ9gru~NR``24r3UMIA2V6bZk+6QeONA3Am({t-kEbrmN zmkQ+sY`czm#-!XTXhYT-$LL>1db&}LMK$rV2*gNDO$}L__Ke*~AaweWsG1Oe2r;_EtsZm6Lz>}BV zavyjVx;yC=I!ZkRN&BR{7XU2Ae^gZD<_flDo=bJP2uTG9%;H&5CMo>LX!FV_u(791~2 z{ChUa!F&9Qi^aN*T3pUW<@jMq0ioQTPEc!2p0?cyMY1f_T!J!qLtSZ>mr)F8}uf`S=aT zKUKvPz}*s^?_br4+DA+<@{ERc_qGpUkeflFoltqbTrKM4mnr-I@JGjS; zm7U!PV(n>m#0A>JL54+F{<>6hxkETWb^{3(q&=`pj+Z*uwO}J?XlXZ-at`csM(rie z(4B$maEj}AN6Z!yKFaO?qU*imx$OVH;lm6GMWw9Bs)S?|LI}xD%C4+3%icugEGZ*d zSxJ$M5+XB6NXRH;l!RpOeLX*&-|v0@?)$nf|D5N8e0)B~@jl+~*Xy}nu(D4#<0I5D zKa};Fo^db74G@l5!MPSu+;Tt?Yld8CX$r+uHPSKtFKudIMr;~+@J2d6%{mm5grYZ#nHiPY8I9RklNH8t@2!?Loz z0Pvf-y>xV%gQzwW=dr``W>OOjA?Spaa>&Ek`fmZNhzu(k7&<-?^?c}mTW$bf;I<^0 z0)=CIyu8XFamVrJ@cN&k93Vw~C2n@O;ukJlz-s^W=@X8AWCyV$rmfC+S4a4x3@Gyt z$;tVH0U^JZQdmgR+T+*#U`9`nGhn7aqWcb&B@9w1G?jUDQPP2f0lH5*aB*Hjwu(f& ze>hK7z~BhJ2^vm3fYA>g+zbf`0NkdS+FW1%?ADryX-Qi{!vQ1$qRLB?iqxGI+HpWk zEV5Va*Nb3kTG?Tb|K2<0h*9R@Iqs;s52afrB_+3S?#Er$ge4Qe2pzuOV`WPrz3pjk{br&Wgad=Ur7YkS^oYMVW+|q z@lWjl7G8o3la3&ZWr->0Jsa8yv1oO^9id}mW5$kp=4{%yWE0@e?&-Aj|356zeE3@|Yb{wNkLwKR)OX8O9!jcIGnP@(8+~w|ob>hl*MPl*l z`nO%xH(yP+xP;#B4w&R7?yw)720@kW>v~=2_R?wof1guQ-Ou#jy%ELWDdN9%A(MBz zkm1YgpS8=jcZKsE-YA3f;@{uVu)|7Y=GSO``ULy$sZGHeRR80bJpX>h%FtO}JaV1$ zKfl7{O?#eERxAvSBp6{3vN#WcQW3S^_x$^s;g>Jq=MPlU3}0WlfN)9JQ|G}?O$2Pn z2nv#N9Dd#1{GZn{+b43Iu~dT}RdKS8;C(gTYuB!kOiJ?p5Sfc#FlIK80bPTFIjw3H zkC&O58NZj=jzJtUJqS)6-*HP>3?`ATt}blU2?zH7=Q?=Tobx6(*VTOi^G;9@Il)9j ziSr*{NL_+e@B7RW|7E)_TU5vg*Gh%z@hF^}*V3IF@o8D(p|DsmmEHTX)wTe63V=?a z1e5f*^PkH#yFYK1(jRa+>TAH1i--;!{PTyz6#~!(qh|*k9)*w8N#j<7y|k+U7X5sE zf7etGI%`gs3WX^1khYI~BFS^VRu{Y}6z+-kb!G*u@$EaEsgJ&hZ|`2EJxs9@8h<~A zUYxUOr?8{kI$+V^5Jfow}oRSp@eThAD+SkW@YQ<7rV8Z@tF?=Au$jH_z&o8sadH*eY&7^Ui5^2O&w z`2vqNwneDPIoxEou!51Xv6t?${;m4MX<@@kN2B)ZE;&0p`$rCPMQiI8+Er8*WR;zr z#l7w?AszaqTAhY6qll*Lfi}UREGZk9ywo^)Z~BE(`{!@7NFu! zgWPoKaNNTaHEAuEgt%Fw)lbmv*v9BJ@>w@-=bD_@9}1*IjT)ZLHeg##syXYX^kDwk zlZt(>jIxU@mb#^G4EnklzD=ejhULQt-&t_yUReIfI)4p8&mY$>p3=}Dl?#n*6a+o1 zXg{pP;vOtCaZx7(CJPD*h~_H>?#9N(M7VnT`yvSkiO9;$HxyHKK3pW7{vfXLC2U?U zi%0-qB)c|Bf1`z?-iVJNG29>X3h}^Lp7%|;XHle6q_R+b;jOBZs{fkHe&RW(DzB{3 zt=n$B%TqH_)6@(rR$4se=2n3Jgo229=!wnML|Dp$B|uk@h3>}NZ@RKdayCM$`Es2! zfZhYNLpAub4!hpo8>Z6goNJ41w%rz}VA5RJlBFZfJ zG!EmPv~({)^#Vr64)$FV-{)SwNulxHbYTqZf@@FSsE7B2&@+G8(=n6BdH{|;=|Ax(j)5P(?4?UIY}-c zHc5p)Nvr2+r%=o9&eNZ7eP?Vwxo0Pk5OmsUN=a(6XvqIqR1*rRI^i$=*|AOAWo6vx zKE7#N0CYt7pGzvv#ScM~tnQZN4pUK*?uEX%(?^X^$ZD@2bVjV~`PhwZ+3M*$!7rdw zh^n(U=(etDvd-VadRKY5M05RF$0c!WVx*0xj1NpFHrr#Kll>^F6JiBU@JH>Msk2w) zUwR_SJuU1*g&VX}yET8PaQCz(8L?yAJ;l@%!Ft>>vcRhItdj+fw7I@r9?4;`($ChF zwGJNKh{#yEK4H9+LSx836L3JPs-;C&!=gOvzghsH9a8LKs)gdmUg!e`sx#n z#XZ1PTZhN(y?m}WfUMbEjSrS$)A@HA1|`|4QtqMBC++n#o2O{zT^vfLLnaWf8mPm6 zmID>O{Kk@YwRsL!Wu|@?u!^@aQOZ2raj|$x_*R8Ts}0vKOUbXOnNT~cjhW0<%=OnTV2gwB@J^^Bp83vcT`&38;N z&{7b^CU>Lm?zwK}1+wXOSQr(szVg^Iv)2`q_pWb}4_L~ID%(sT34)&eNZ$7$c~ZR` zE+-^?ZDDSXDiHWjdpAxU1|n?UO{yrHHtS^iXM|D0LMh4q-cVQfxVxf?728ayP!%); zCokwUo%j14FssF~D~xmJPMf2rAyNphyQTaHP+R!)BgXRO+C?h*+hjzrPuP-ME1!pr z2=N-ND#Tus{(o_;U6qfR7onjb)J~mhP5h$C6M@tnG(4z%clUK%Z}*h#1w#lY34Hpx zBC(Lv5;U~5ht|E~5|w$j(%m5Xe_3`Hk8L(66;SMYJsUAWiYh-)wb#!yX7?aY~W(5Y%R zH%x@h5z4EV`3IfixTzPA2lyFMo_c+$z?IQuk?>u-LVSIFb?*pNcHlL*xRUSRe>XIP zfAsa+kkvJie5&JXp(C6r8{$qItXwDQ`U37ThvVjGLU)F9`7m+i>$lvYjpj*av3C^% zH*4N}mn1=xO|7-uXlHA-0P|4frZUFwpf$WwA z7wqX&9f&^;3JPWvJ7}I8L*tT@m9+vsFh<1u)6k5UY%jdouZ#{RH<{<1Co7&SGu%|5 zfF@pM-|Q`#=8E=|BnQ7^f4Cm}b3^fO^b~YMVlB9toxVtr`MLb7O*g;WlS;zKMs4Cn zYwf3=tFBQ-*-4TPMgWX2MBO5t`NMOTEypH_{_o$nva!irYTm5i1%&&armxTU;}on023F1neHQ-)z)X1}82N+br%{P=_8 z<@kf{!&G;1IS<1A=dh;V4-Y2@*_^qytuE*R&Ci|tdZk#0SX||@3tsD@P(T(F;*gAF zbpCT+%QkTm>>L~$u(L^;4ne_AT_oXEKyvE9+@|l7FNmf95INEOzO|~MJ;%`D=^c9W z{I!QBsia5_Ac7AQ6OH**t}}@R1NKOI{-&cdw>Bwp%5v`sU0_yYUvjw&L$CKcKQA|a z0+k|QIc)g^%WP8Z)M zVS=-Yv6X4ouYH%q_RS9euu+%^DCIaohXEq|)8$_E|a%;Jw*L-l~2L+*+dIgQ%uiIdam=r~JYV_+KZg%1Km>70Y zm=WgY)J^mwNXhRoFCDT%qhTpWx~yv4ZD|Q-V}x~Edl_*@dQz&KKE{r0-=V^Zo^utw z!6~U1-#c?2=11H|Ij4u`tNsueV7rS*?qWG%3Zh`d7V!O3L0hDF{!B(I&T_&JA3JP4 z-%U|0mBc0DI7@)twrmMesc09t$V8yFLyf)Dnug== zM`qLLk0=KyWNT+fmSVg~gj%U@d;jRJj;E$<+M7tb6e84~?<4IkF0qGg81`LXuGq@n zntOq2fq_G@mtCPA1Ua7WS*5IB?_Qp>Cl&!M)v=^v5q#v4mi7jGi=ZJfk3BSH1plO( zIneaIHyp>x=zD3SjyJ|FK4)GBVkLR}9O>GkiJ7HzQ|e1nJ+ynnz-^+rYN)A38FY_| z@J(`saHltn?>|wHmP5e$>Vtbbxv%RCfIx!98_T`tk?Pjanu8?)v(lB6oFk!H{cm2) zh+E4?g@nA3?j*0oQuZJD%*U*JlS$EgopY$kHCRK(Rr$Wgo@D1oP`uA zt*9x$sW?BFjd%!v7J*0y*+p=r%l|Jl)bsIUlgol4A{)qA==B`fVr<-9Sy>5Syq)b- zf!~Vz?MG0+=$V?XLAE-zvuzkZjX`hxTvjXR%jph;sSQ8I3R=2z=YrTd0*P< zYIVDchC}Rn-FKoAA`F1RAKc5s`uh$iZBaFPaq)zyscC3UD7b`NK$1wbKtN)2?Lc%) z41}k?K+@j-%pp1EKc_d~L?A(K3!9YOTKg@Ae_6UKi3?s^_R zE31xb4y7dQClIKj9RGxD2@KxBK_-`5ZO*$5YA8{8`2gt0K!hD$*=w!sBmu@c+meN!Y7DDJdxd{tXmK$gK1nPXz2j?QLzo z5Ll_FPs3aPC2{mRyAkg;+8b}{>(zU_{+P4kCe@*dLW(09Nw9YD#p{%me(a-g^{Z=X ztydte=w{U^-bjR2S=!iu9CL#rlv>u$(hSdRnWdH0zG!t~_*+NyV%gO5ugRJdr|QwM zbNi^!q{cKr=YF!P;lR6|y*kPKoQcw%Uf$#inwneuW@LjeK96TUrOQHsQrFSYA7uW! z{ID$pp8`2S0TgEg#4lE-B*9up^8q*Hc4+8RjkuTAjk`JTZ6eqiY_PK+d?UPJaIV7$ ztiv}%HRH*5QTjY1h)TL}Jh}V3>r)>U;n-Ksfhs7{kLS8h*2z<+aKLcxQ=Q|?3aIXn z^|w58G*w4UWP`IMb;y|F2@wdqHShej%wX*NUq~a8Q1`kP;byQB*A-LAj-5pBNlAR3 z$hN~rBvRg76eL{#vNmr6!)K4)R!KYRHO(7bwWm)0pqQ95VmNU~2rw5gITx>z(xhMj z$;z_x^_87zI-%XtaKmbxXl}Ts)h|=vCRN8^sPSHECgkp#B_n|pC`SZR-~&t4C2dvA z*#4)lB3W2fIjpTBH9IuardI3T;lluaL1-d&!{MdhNXV#``SQf+Opp+Ju{L+ZsDEoO zZsM17fRxG(LQM*|kS8J|FHaQph@sEk>MxLUlVT}*#?ZP`1ww>4>`0F`T!`22?ld%) zC^|q@{rvgZIOI_Vv`ih{8vsSYdXS}*magK2BB5BLojjX^X=Oj3Qc&vi389B$m)*X}2p!doCMp5>Lmd8~f?o56u-;FM4` z0c|4se+(mS{$*~_LGnOSa0`k6%Sv9HsRPAtq^37_KwH7P4SRvqfoo?4S?~slJe(Xu zXLK_4g*x(OPkH>1UQ?Q$n`<8uaxpzZ``lvV zSmYmP0Mw{BMZbT-s<<&M+}@queV$^zpPBR1i$dx^5WDEfUII{9>nlA-D)OQDJZQK= zfjxNYb8G9U!#*HFA|gXmp5E@}qk!9x>ocn%DE{KyL)3SSCK6(}``eh9DlNrAZ{Pm# z+S?SEF7O&`6ntfappYRfHWBs!Vna;A&VuVd!o2^bAj+McY4SIvDU0KLhbVj~%j8QA z5E=T9w zbfBc+fZ?7SYPhVdtkxdVenGHG+Q*WWokoehDG+DSm+o>zxW&fCA^@YEmwUv8g&_nZ zxU|#tme4(qbil+7^x+HsCH(bloZdjxNpkFl!IFlq)EFxM$>Ew0i(bSfuJg;-D;@-} zDj7UIuz$bz#@d3LO#^P@sTrg(ko+0WA)gKj?WoOL^K}37ZV9+k#*&GxWrY17=5w86V_?{^19r#Rk^)Bt~|GaHwC@)T?oV~W_JGlZv2H{3E{vk+uM;j0W3_A}^l2K2DTomh8E<0Wi zDa9<#+VgYYYz}-B0Ybf6h@#2z4tN}>4ZVGQRu&g&D1%`903Zc|2~!G64b^DzeH0mA zySqv67{o3w@4K2BE0_}KsV!iy2ZZ4d*Y;) z){}H<9=6q9B%BCbIAVt7##8BpUY1UZD`yN#wv@kbE2^5O9IsZ5Q!Z{E0p2koegjCQ>EzQc!+Upd83kL!+n&pGd&`J7r20K~)E>9n z?xI&olR8~cj&oi(#*VfjSuk2%tRW4^Z+3PzxQzlM(=%uIm}r2S6kCAl*dMJ<7T7f8 zQf%T9a+)j7HMq`F`pA*tPUUO^8EI*C-fhH{1)A0Ql~I-VI_@$0wC3+<)<@+|#-{@9P7BZy~NS-a?|lbfVG_N262`e1Sq?t?v|gF$lH)))W) z-j*^jEL2sCqrD*dUebnIo8Q|7LKI11-aEEkH`D$~anEdzh{(O4uf|r5Emuo(3X&OI z3X7-%k!^-pl8ki55GKV&x3y)r$WC&F+C2aF6V2JCf=#_-1UT^V-m+6p9v<^XvsD`r z(+JAsiK@FJzk`IWn7Nbos}FT`+&97{4<=R0(0OL9AN}V(s!E}l2IJ*_u;&Y*WpFK4 z8e(Ps6Y;34bn1`RBA)e8hR_7*C$Rp)jN&QJ6o=0x)mxBhw*ER*xDoKZg zc#~H`RCQ(9>UwzkQIB!fM(>^ME3qm1qO$&J5DF{OrG;x^Mub_kN7%z6B0sIRWWpigGV zJP_}&C71;xTTBxZqI zC#BiJ07B9=X6j2C9em=WP`gL!FLDJgO4IogumA{lV$`lZVs%jJ6CL}+v9>lQD@&I0 z_cQvu}cU`P?%Of(m;{ascm5T z1kzU$T7;M_lZf@|qO@OrF6;y;EeN$VtCuVO9%o{u&(ihSKh&Na4&L)0k2tduK!cb# zIUOAwGz)!77VmJ0OK@LJ0E7S$5VE}-rj|8RQXvB`{m0eq9?Hw7k9e)V8Uqk|u{ znjlj2G6Ac-fU*I6pEqL|*VkM0UGm_WK&NbxlUAgOQ-(WDS9j~akn8jIx0EJ(dJ@Sg z$P|QQMsv-5^E6-yGNq50|4O6wy$Os^JZ-1@sa>b5gBG)!#Yo+Yt6U5{jNLzRf( zsX;Z~^YNBq=T|H5%5!OgOoM98`1O@kGF2zx<)3Zs?Gfn-A5W$0T^5h;>N0ZKG`%z1 zz>a$gX@U42ZB_Hc-e`3z+Ntm+N zVt7e7ZD%+|V1M|Bo&Ns2fvFdcwB)}`QOIgR%9`8A=bFx?&YII)QX8=!Qf+d1Z!15- zT0x#l<4@HuCjwZF+TJ|R$+=r48c<8IrVh^%b;WNDHSAcQ1P-s2=Y@N=*%sXJ4f|Zt zf&U?!0xu1z*y&9-n7sF0Am4BX+19ApKeEhw)V^dI?Wh`eWkb^Xv8VD8YCyacq(eQ~ zKUF%K$}BFuP4>F_rN46b<(@b;sR`Nr5jd48_n zl$}%Mc4MnIHS=OjLRp!gO9G((m-LYZ1#_DN*fIZ)f{3Z6n{~4ijgO(nae($V)^bA2 z-94)JkByVv>D;@)909(`!=uH;CofC2?QR6=1Fy0elxUI(TZkU%Wp^6qhEE3?8cAPa zm>Fk4P=~AW{Wq|pC+d~5SJixH)CJgSY=)83vdf=Af zo7jd5mFdw5;;j-J5d2g*FC*2n@CxN3h{PwWmO zd0+q@5&e}z+8p937v{A#Z=OtUmcQ9}k*pHMEy_g=^S1#WS8VhUbXakriJbfTou}=# zxn^bR^;Kg=^A~wS8|EhF?88bB9@s(=1i|BI9a$x|IAd{Y5-baT2&TIop`7wuZL7Qf z;0H+Epdn<1ZKe|r6_)ON&dt?7E|+TFw`S9n+4dWhL86>r{72c1j=;MI0*-)f#q7yf zNVYxodSxs3?C$!;#&jp+Ep(TsS`;|PWbRv9wcmfB&Krq-4PZ;SJ(v8I-$gPHGTWX( z)__voSaCr_aaiIIwm%r)aVf62xE%JNp^4jtdcAmEz2EO)e0yF-#xRZ(LV@hgSbM|q zic~v?Z$0nl$Gwis1?}j^J`Xh#3b&*jcilwab+v#+w0@yGMMwh}i~n8{^e$UU*xL$y zLb>ie>Y5LjSzf1Xw#9CPuK8O}4_ReD<=NLxqb7NnttHG7ZKa3iV^{m(@U zi$)GAM7tLaZ&9W(l*6Iw(n9N-;&gbMXP62p3tfy_?wQ}El$elphwi22S;mR!l}2OY z3iP{x);&BHTGnJ%Bi5M+|D{1dxmy*jucCs{J1-jRK>pU~`#*)k!o8*?EIp-}Etj+& z9yx?rrD6x*0-i`LbKXYa!jJ@28SS$EtLHp~wOy{_0r-237}Qjntj;m6lF~hY)-e-T zUgnQ}Nq2E!?8;YKVet1S9W10jc|-Bge*XL4u5AF)ENp&7>Tkt?fzTzHITV|Wb{xHg zro7l!ZgtILrZOqbK6~l!TNm@;`CFNAp(sm&bSQ>}d`_z$DpgRc+V$0sO7iJrKO_ci zJ@!aF>zVSllU7!clnK;gFmhSiLi8O~boXa-Oh$0VtLOv(06;!(Odd`~gUh~KsI7&Bb`fwi~-wmPaj;f~Ius7H8?_Bx%{Ax>CEIl=W z(7d6aKkximvEQDKEopb5Hcs)cDAhjvP9XZZzNSksjtx&tbV*VY_tggx+NvUX_qWtF z76{bZ;;SIH!Cqr8Q-0>ahK)s-i#yLOJ^y6JRrCs$SF8hz(vqNF_fnM3Jg4z1q33Pb z(UOF;>IBo|HT8A0Zp$YYBc}s4R?IEj0d7*Kyy+vWl>d;yC`Cb8^DgiCb7GIYeDd=X zeF7I#0^t^gAH~w@GU>T2;|I7J2Fc}Ksx{_CT%pL~QJ(G_H1>DORK=f}$^#`Q%7X8S5NhcpD>=d1Ya{D5jP^U5i;=W~K0@x) z_WIX6Ccj;|#=_HGFmP4VB{?!NY%b*=n^S&bwwu++R9p65H|j+Dc`|jbwyCwNe2G7} zhCC4V4;Ukd9V!0UkCF95Bn>%)i7u%K&4`8=d-uW@mRWD!NuG#dJS9Y>ReqXccbw=Q zVf3I$oW%Ls2$|_l0`Y95{JghHd#>v+qd&oAJy{%Wlh&&)|UNbKL?ep zPx%?lb-)?&?t=#P-u>e5en!yPKkxgqn}Hz9X)5f;F95^T))t_m6Xfb+u)cHsqG%9? zK@S3D^w>ORW!JbV5OB?xj*j?4qNJ5mup7nsUYPRmpc0jRqcsCVn5d+`e>>qiy-+kb z^5&v%z5$IewzfUQN#*1Eu6AsH27dn-ButQ&tgcSiJ9CT4mSc9yB%(cK?aIA^uTD<6 z(b7?a(Dt8tn_j*(m`q`RG%PChrPu!62RGF2yCag5wdvMHO32Kz4b0!Thu!bH3(j0{V2Nn~uw{lziQ6B+P4b&2&PGV?=j$(QZ3;8y%3mV`(-Cm7+7$ zN>`SAlO22hN-&fw2hWjJ;#ua8X=vowjdSi1B%yjNq{gv29+E#aSc45QQ2~hK!3a-y zljDUIuE%e}I;B~IOr$(>e5|X`UV|u;E}YnLzSfc;*x~2Q)GwUfx>Yf^7=T-xhD!af zGBUFmry`oW*$0XHa>AosIRb95e z#yaq*Z}KW75ngABC(eFkFQ8HvC=6UXyK~ES?QN+!pTFiayT?jkKEKKAVJKvQMvAVk zvj~}hp4D<(feB?A-YYW8po!tU(lC`xe9Wb0Zk9Ym5!S z+PJuQB|(bSbUby;;b9_KWyENW^;M!DC*_gbcy$dmp&b+o&=KOCCC!z6Jp>80_cgui z@tg5?{(*CyA~0K`wzGHH%k928pW(5)Rp(u4=`Iy~{S|hb=L;RoKo%Aj#$&I6J~R2n zgg>=mI#KXJ>Iv4}EoH=2;0vV_%DVm0<%=O4C#Yt}w-D?PqVHKS5&zU&WIq94g{B(9 z#cti&N<#_d1Fjcovl&kVAO}7Y)Bq|e1f+6;IDg}QkU-AC?_P?&46ul#Tn(t-edXl$ z@3#fTgRQw_J2J2L-G=T0>^!u$9UUF)3^3MNBH{R_7@6X-MVt&_dG+1J7izpgJF~fC zu*kf9y1cy#n}1&on|3c8`+4Al;B)Fg*sj7jWIFo#f=X(@PHpqv>X|IbpA=*UKpM)F zGiM^Kj*MOqWhH5s85mHLBBJDA*p{tLm93=4Gg1>z;k#?A$zihM0u$}INwY4=+KvPqW zPQ^ol2W0GIJT`6OvZS5S`lpFY$_qw0-23r4U z=-QFq1Uvr)D=R7jC@P*e#?71Y&z>)^ML)_w_zRqS(@hZL+}(AUngD%z$IpA%4WRI| ziQHX(lH{)^aT;_TtxT@E6gD#Ix>Wr2=F-OY?zcBKkC=&}+=&J_SMq0&+4g5I&Oe+7 zU@Yq7J3CB<6g-l1jytCIGWZL-C*Adxx|aARI5;=dSjH*Y@i-^P8l{<*&;f=_bfK_7 z%+c-f z8+obBQ*~{YhC3>a*)u6RJ1t6ADGaa$c#S$IW$LK!EdAr1Eluw`?_QJ}A{V4$XUi!o ziaL9aZDC$cQp@+HVOF~wo-ZVigIn1hMom1YByZA6^kWY$wzngYCxRcoIFw3y`XOQ41{A~WdtnbKKA?GXTbK%t49xtA3Sp8wV4Dph0CEf`^87c z=gO|otdYzU*W;43v_6r)=?K-RjTJN(+j(rMU&e1)oZ+!5O`L&|(e8boo*f%??Ls6l z`smT0JbP>3*XO&i8Sj*7_8Hz5)8xW1J^6cErN?&S1X-X_wm$+J@vN%_l$-0bBs6Sx z9ibuiN87?O@m`t4mh+;wxXD&lT1tSQd)WJE=$#v~<1$s!u=*U2P$h1C)MsU+raP$6rcfn zVKC&rZW&X)XLyj~VkPG* zBL~=3;^P0Yvm4y@Cvzij>B-e413X~tYbJGr(2lqb^&WF%+t6vUVHSb=xkX%65lW;J zCMN7< zHjqj6D{Kq*?8{cuw%XPdN;y(nQ~${_|IUO@?mhDIH^-W)3|uSp`6I{!uh-Et3}2n| ze`#`Np<-iAL_~zq$Dc{@AGF?*7+Mx^x!hDSzRp*~0t~|B}e`y+4Vw3|5 z3kzr@xRF_?#*5AfPNkd4$$cR1HMYwuil3UemYb1r4r+0raH#Z)O&oDJgM5ac7bUSq zJCvKkW~HQfK6ta{(Xry-##xTwku|)ZL}X(dhkbLlxaRsK#p&@Tvs4}IaE!!PA%lPJ zc~sM7+xs@*c2CF)FI{;jN)nGkU>2#yYaO|@*-BP5wzMgzOPwWWd9)a$?fM5XuFB951GPlHeQG5rjw08Ma1%;&3xUk^e9$sTZ8} zfX7`OrT@Qw!^7R3n!ui}W@2^6wG< zx|f|0-`$AH(D-{ZIN9%!QBeg(2NN)^#%G?CL)Xwinz)5S0C}H1w$RN0L&3Gp`Lc?6 zVZe@IuH)Z$h_cBbs|RCQ9TQ;_0*ioB8yX^$H|`Fon*olMZ0FZbdXBt%hi(I>Arir9 zkd=7Y=I-UB{ocpUAzl%+CP7NgHI-;-Y&<9~uAkLTcSCWYJHF7!%#4$Oo{c z*)#$~0;&hB)a>Wax=CSI0GIDupMa=&XL|AN+p&8f~Y&E>Mw zfg45n){z09U|;<1nnuI@m=Rni=$?8r|Hf1OR${x#CUf&E5;FO7d=60$etqAbo~Z5F zbdvryErEDR5_X?oA|m31x&=zn zmW>=rX?mC(-VR+7{cD=pvUs3Ku;JFz?{;5>hV5KPmYJDn?Y1+$_tMztiH!E&zmnK* zKbkeUa-BWn`_l(WyUQDf2PKKhp1o=t+7!2x^>i`Gj3w&A#2EcezuT+}oz*{HhBTQ* zuXO4ZzhodtQ%Eoy3z9JL(PuBx%buN-b=Ci6^)ai2FWggzdt39;ZunS)e%jsl?_}M< z7*+S``aRd{;e2_+l;wqmI|x_RY-S+q#GYvNFejMF!qm03<(+@h5Ex4Iz@D476c>c< z29hK`eab;y0hkz@JW0GFVXM#Vll8Quq^n;xKPM-r*E@Dr+^2lp-SUM;JT!U(Lq~-k zpi{%FZH-A*P9aK3WM_gKTt-To;fx!<#v z5q|l&GKKY%u>W$v4;YM-S^j+E5Tv%Ml%R@q5-&P)tmCfmp=z5%xp{lji>W%S+qV}0 zXonn0+~X{KI;}Qj@g2(kZ0BeimMr;&_H*Jt)TkJ&D(lcITOL7AX*kQ|E%yEBy|V%9 zX8+Telg(LdLV9fBdKQeX$61FNq_^w^Xl3KJO~4}vR+Kay5xTB++c^{m!^VTgT)X5M z34b(cf%u8s$TH3JwB@0LqgJggU&^DBDTr?(`^sXYw-94~eo}s`TfLx#D*$f!>kcE1 z|6;!t$$dwpz4E`ZA2YsHbJ2P1UY+%H&+mZSg)ccRY&>6YYTfWfyNewUQ*6#2zDYu? zxCabf8D*23c81n$kvXF#rB%Itg#r~zJZY4&LtlB>qeqZF+9KSR6k5Wy8&gz(Bcpy9 zIkbd+1G{3zvuDuRt&((|Fxl}Z#S0%eko9Z69cB{eV?lV1*UMShk4@5w$>=cr4ex#vzI_N)9agY~tE4Ijm{7GI>SBOqim z1A~8yBgqfMd6=ZmuxP)po(`$UmDxtF|Hm0*_~Fr$zs8`KLg$Yv!5CEH5v%cpZ#En> zC~PeVhFmp}fNhPZ=L=*J8&i|Y`9Ey(JE>hwqEc11n77aJOeXbKEr%QrxZdR@eTcrK z8K$jkB?rW9B{<>*Kvvxs_QZgFjw` zU%px=MMZ#qqPr3FNbv7^!9>@}FC~1X(_0mHyj|_9*SzBD%7QDtDJb%wCS!IR$<7F~ z*-s>jzIGkiM$C@)tU#~i;pWz!-Txnh(64_DLP?z0G8v(MSv$at+J9AOz`1ztJxg;a z^`@2L-~Mml&lA(-N~oispO+k)*q*JDrE3>U|KyOoVc+=nyx-?b^mCRctWqCq{SwNf z2y~KPR(1bgecyOw+bv7zAJI4NVG=Lnx}~frb_i?v)S@8?OaLM=-XOsE*2y4KUtNy_i(p6DERx#j7d17uc~S?b zu7p5f3enx;KVxjqhE%Ve6XK^Rjbne1m_@MO^nG->-H1-GKBaI=@iOI>q{-Z;^LF&eh(gx^n6jSrCKV8qFg~90OnMRUri5#}2Gg<8qCcje< z>gkbpzT}5{qURnht7<%v))Jnpi-~5mz~0TwcK97@>h0wuaGH)fz}8Pr2nYy}&fML^ z{g{{lOpHPW4_TurRy%?oe_Ksx?m2*Iv zJC-u$>t`e{dQ5Y4r!t*9-}*hdB6Q7ZSr59;8Iq9{ZGf^GcW@~V^BupJyoq2GDciOP z5+ic7n0`lV#~{^SKO^Q7x&yzSyE)IT*=-Ic4@7o{GIFKLyxVCe(q@agZw@ zL1$d(>b6_FhYv?pf1e%e{z5AL++oUxn+Zh^5Q$?>ll$-0Vt5*oYS@o896HFyM@1l2 zD_(lv!6(n3-}$z+e`2j@+yi7E!la4wVysnWX4bbfxlAb%rHigo2CmlLYx?&3q|*d@ zf5kvP)zA13fW}~CbSh-pswhIyL)m+}f--5mkw2=bNbTIsmoI;5o4t;8B9wCUA-)!iV@^`4R;O zFCQO7|6nc(KaTj4B~Hx*yh*Rf%M1V5`{jL4<86y|W7`DLwZ?w!B6G4pE^S_hKOND% z>jtj5O#+&W`~52nvep9T$7OOdv;2s~sAFn07x=mV?DM(p<20I)R^WElIG~`~AiJYu zJk_u7?%8aIcH59H2abYlBOB8_DSJ-cR8ZT)^nszXZf))Ap-1FFJh!ft2P_sZ{Q8!_ z9DOC(Cu!y(ggqEPi5Rq30lO%VFN>>w+8Q-7{%NY%&L_W9D5{PKRN&29Gr6?bQ&lT( zKR=WFXYHqn_NDB2z^e2dE1xU~bqlIKbBLppMY=`JE`3W!nZm4@fwszVrwdigoCLjD@ z(^b5ny^tAd%|P$HQhUI*Y^mwvsYld?;eCz2DV&63jnAF&n|yns%nXW%Ss-_%KZu|` z9~>r&b(=?MCm}HKJpXapU7*A=8sND)r`-Hhbglm~WuJuYEc>;mC0f@md0(pq zqBrppl9KK(RdyrM0ha;8m7%7ETvmLyCKBgB6o41^{~|WRc-MkbZn1;T{Yy@Puc|8b zw^M{uVVBE+_~~ccdE#<(9olvs)Yu(&;wg=6+*b01#XXKka=RUO#feWdS1VRXJ2zSv zIc?13GA0@Q^t`3E$2Z@-y?J}q?Pn)0zVO5e2kpJ=QoVh%X_ECO zxPb57_GYSfX-9g(RUfEjg>Dwxc<<5fMz`@Uyeq3c@B(Q*Qy>`yVmZDpa~}!XgKHrC zp`F5$n4F#UMSO;gBWbpI&kXM8o!SB93=HS&yow=y_?qxt*_7S5b#ZywyTE7*K`tU9 z8Pzf$=kUVfYhBi7uJ!Cyf!t5$3*DO|M^!j>4@hyJI3ib*TwU5X=b5ydz zH9yz2ZvwksCG503%vw>g_P%nbnZcz36cWZSE&>Ghy_)P4vPVq>8C>xR#(GLiiLBS0 z?Csy}97%DBWw|+XmSvQuLc%%|7h7dqk7%Na6#ygo)s5@7@8|sRy=H>g4X&Kt>I&MNo*N;){#U?pAg8dz2KyhQ{X2>y_ zL(-LR?22mk4lG8HFT9l2JZ{xqcfczxGRn~|&w2jNf$iIITajCeNw0AU388dd+%!Qh zl#|LlE%&%SU$w~8zwMOgcXV>{o8FT!?>}9GQC40XKi){@&o!4!JQ(*G`|-)burHAa z1f5crk#Pz96d*vYv3-9Zv?3)kS@P!n0dkMeP|5f%c?>JBc}3OC|M+6KBCJ2~#!*#zdn!<(oo#QFFi zPW09_DekF!In|O?UQ9_O_{(3h!QS0%kR!OG-6Z=tViXgBn&3dwIW9waoPcPbrf+h3 zo1Wk-gHhMm{LP!xz6pZ^x3g*sLKOCB7%z`MkT`wE`=Gz_myGqX8i!DS-xEw+v$e}T z25Fd*=ZY=`NQ?iU7qt(&jVX_tG@d@75*EwUUF~FKo@JEp>cLpCFX%NtOXXgIfF)v4 zVW(HkM(cXiDx{gdoMYimq>!eoy?RHS^|DosdlOPEtaEKB{j$3Kft)}8%rTV!&i zA{QyY`G)rM$)60?opWrL11qCje>_@~af?~~8s5+7-*|RdBfz|V-}Y1EA2)11U#ci8 z@UNT^+4rgoxF?AKgxkn;Of+aunKr1da&DS`e!sRleLAWgtNvyP+pXpBH8HoL<*zM{PNsK!v&_Yq6b2geG;QD-o~62<~qWpT~TE5bzW;Mn%ZB2M zFMj8oJ+D(2s;Wv5H!mcw&-)}eC@z-vjCO?oqfC$nPmlKuzYq?Zbwi)@$3Z_c7(rykGs*DBJfH8*^9*ZN$2d5mMsEP|HLajlNo)Y_^fI2A){CP72fJJg6(0XtoaM9Fn`y~I{5j^Y_e|$ir?rVu zy-et@fo|Y$Z+w@WJ={2thlil)H?@(pKO%#u46T!$Zi~FY?XhpsmC^Uxw_Y}>a?8Qr1=XsrTQ3oT7p@#pmHi!7 zk-R#q;eO(@kHE6?@I6LaG9s$xrPW5&e0;W-?|hmPH7Qxb6P+*Gyl%T&d(?8jlu#ba zt(N#XNuCU^|C(rY?wc(lqSAh|>_nx#J6*^Yg8IzNwX^OQ-0vvx(tEqV{g~Y_S<5^( zH;3`roiMZ1Up&EtcR!?v&Ed-4Ko6UO=iDI|SpBan^WLOg^e8Oq%HvB;ZphLj0yhOu z4Ly3gZ7FEemt)%eGuekMag$QWvQ0p#D_jS~h=fQ37 zUSB+wZs#~tPf31Z=)eJspdbP|aBD;jVzaFB!yh*>98&G)Ad_u)nm;FD+BzI3B5DYg zkgi>wBhaoA&#})70#j#|s27Zoc zS5I7g@%6kYp^%a+64s^SH817=q2`N`jhpNvCqw6&PY166W2rgh#NhRQ4Df2o*ob=S8hrK&O7bPR=Dy8lQlxmx` z>z(gQoLFkpwrd>fz7)9InL3Hyqnk8>Qg^+cfBocTFUqQV#9Ty zoV>fefA5+TWB*JRi(N%SRZ-tA8An?UjeE0G?n3+BYWlfr4xIHnwAP~LAm6IrxrknCN!cujy>waul`gOi!Yq>Cb{R&U!Fd(&CF05^7;GxuKwY{Moxr<2d5i{?bE8V|Z1E35WAwNUophy_#mn*bzB{`?7<*}|2- z+s&Gy(k{vp|Xt})#1@G6+4HA$J5iC=X=X1eY3 z$H68MwUg;lb&FHv5!2C5`9proBFPOzAb)}N%)}f_R3CH$li$(${yLfL}Y~!LiQ$PyNv9eP4?b<%lMtw{rP{7|NC&< zNB1~x*Lc0(uk&@D&*$T5VrnY3(nE(mM@w%e6;i4<(#88pAkNflQ&$?Zx9bH$_qT$IW-g&N}Y=;C1+3! zt_at*;e4Ln5&i!7miW0x*^jJ?n}|TUiORKfU>G1IG6$Z0rjKy>@P~gKd;uPf-9Z;S>{nBX$?DNAyB`n|hRjEDL9KX+XA3^^v~?v#&ZOR} zwIkfbp_u4s2yW=TL_`1}7=mfGErV&W`$=km^$lI_W==M+`YSSAtA_&(G&a<=wPU`0 zTLFmN#%)?82F}bsp>R24UNSTq+CMi@9;%)3LR;_mbWf-nXPPNv^?a`*7-Xb5o^5Z} zTsjfImmsAgtg;w>JyckGboy&`^*5rm+o?$IV7R>cb)p-?;#H!z%`u*z=1_UUdXMpC z=`8YBmK@@(wRIx+6hLi1mWq_cPkW=w77Yrk+3~5`_e40zZc`+mHB;%JC2w}Ir5T8okykyx47otE#F!iL7D_6Ui>k-CF^1wfBjym*FqjGwkG2yQS0 zxM>pv?LKra3Wa*?G+=@642GD+k^ep&5HtB~uUjkm;2roo?JdKt?NwHRhN$`0#gU=x z9G<|6jPCr? z3pquZwYD*Yk8a+QKLct<*CdhutC-g6hZpqxa%9|2U5^T+M&4qe<%7UtI1Gsnyn*$K zC6%t`n2j8>#6*ZCO*e$Qzvd+U(~%Hx4Zgf8$d&Y<6Zz9=T|OU4`c%s3n}iQ_Oj|sh zRq&=Sr@v-<<$ZD-OVeE?m`A^p7!-S8S$Ct8n?dSy%0p6Bm+=B3oL?L2lJGkBrCfQH zEjKY|>q9;%)#c8l^nB~A6>u29>0b_7F-AvfcqLhm*M;Bz+(cY1?Nn=XPngP6n?K)$ zcIe9@9grP@+tKpHqw95FrDy@$6(miA5B&(}d%=|A9pamS4b^)I$Vhw6Scr*$TLGM% z5PA)y7DYuxfWv99@PVEYytOYp^L!4(P>X~@H&wMkjE|4cMac6@5_MERx1-0Qz?e|# zbwoyMOHXi+vzGWab%G=r**q4)3pb4EGmXt*^f}-2saQdQv8yFxZO3=}m-{4%<9pJ7 zB5x8V8Pq!c>ygDgn*M3bl^}l|QKTaR)f#kqk|3GLjQSdUq%)wM3f(-Cfx4;YxlI>v ztNSKR#g7dM191^+ozm6>4TzW4{8S!?j-fxL+br+H+AMBD}Z z#sE5n;p+0z61Y+WrBFzW%=Gk&g8^k1Ur>iblMs^P5IPmMv(Suyqj5C*3$i328JHpEX}a404oh# z1suOQV9{d&-JSDI4+WUk!C)F9qYn8nL*`KY0EDF&V8bHLjxcS5-%#H6VSVDFAPzjUIrXKa|!H7XLy0H2GXHYO|U} z6Y*8rJ$7{N`V@wXkM5)P#^9>a*-SO7++WYLVStFWs@pB)z@)55!l$OoubxRG^8SghOy7 zE;+wtQvktRUO1;EmcMGmgbxCyK7dbyf&u|=dl10_a}pz?1G2mE(lS(y`< z`=PfEv1ka1bT#PyhCEP+hI$6jVHFAqtNlaR7{5V=)7bc&D)2V&p#ivsfGNX7x`4FX zJ)-(!GpH+1xTC@!PuaUhN+u%^iHtGxEf_w|-t86|#aK z4G?mt5LW!fQHSK>xFDgJgg{s1meynvFc-*V|uL*;!ja$@pCB;DJy4@{=p3lE@4;H&$LJ8pLQf zF?uWpLMzf_x>Gohq4PyAJfMmq2a<%3w$jRznk)vd)q}IXC6qEgF|ii7I|og7pvc{a z)rY8$c%Yz1{T(DG@$uscA?h&Q=TbW-1jc>fJR~dLP(A#xVGfIWODs>G%1AuZF)#y zkU^kShDedo{_&MAOF>&}9zP8}qR}|L^vd$wYVNtR!x|2e{aHzlHPhpT)J($G);vwW}lnw0SqNjyDc`Ti@#Ppc@u04-W7!JOk)hO$< z={OfILhBYK@$Ba2FLp766#6T9w;AV5mIDTh1pV5piBsK1f5JdY(PVsEkv9yt6JrHQ z5qVC}pZYF*UU2iW()417oqS%}O>N+zQM$mn!o+I_S>!U22-uqeV7^ytypBvRRU zmbUFlvf~Z6D<6LJlPTo6J64v%(z$lo_T@Iu+-HvpRprb6MD_dEQd3(WIC~Uai&bjZ z;T76!pLPA$1D#S0W@`)-C=eEF?cwlq&@*{0#lG3;P=>8yQi+ZDHR;miaDE<;_7c!) zQf(=FEcrV@eR%?#$lsb;D1r6z6DTrQ*M>$nY9sdjz>+ZYkGFM13qMTLrHB|Y5vxcQ zQ+<)tpF;Kk@zK>SpNfAX_Js%MC~n6=aD7s*=GcZ#wvPSGgx~5DOsBnMhFH1J%UI3( zzBI^1IbSVJ`nz}Kq+>@4?>@DVGLP*svh@5sX4%t=x~7rt0&v=Bf~o-$ad4?bT-v_e z4-dDBsgZ#Ka)PjanhR~pycB4l2%0Yexa_&I?n~$^ibua4g^#^zYH}9TI`88OpRAR8 z^+{U)P+l&4k`kewM4Gra`X{CCU9Z)@>SQTg1hl(QAVOH1kd}so&;kAdUFZRAVNrb% z;NzP-CA^&UiXY#?1P~iA{s6E+7IK`#HHg%Ha>n-6zb_L-mm#Om#Wc(p;Fe$-AQjlM z$Ocv+UDzLYv#s(!otxpm5FVxy;c^G_?E^CVlZ;Mf?O~f-EZla@JK5r5rAuq;Nh5XT z%WWT=4dmm5__D5O>Q*?N6NUZys*sb`9AI1oxhvf55bJe*aRIf^6_}BSMn7i za`m)--oZSo-qeg$^!FC6axK0=nXz`D#alK0p>+Ipe~Vx!Dc_l4;#G(F#-207d#PY| zde52%441MQcsIk0+eZd!4Y?nwWoWFuB!ESZL5 z5*O|}wxI>^JA%M>;7mZS*YMVAJnTG~v-3(0WV&=V%riukG#<;DtYk>2mRg#ELsq(d z8&xmAKg~uvx#gPv%d0iXTj8&p#JDCdnWLrsUhB>18Ud@RI~V@lc+^GQUVr00$|kJ| z9Qmn+iE}yF3tmO*>cA`x8Xda7-iAxi0HW6uXf7osC0u!_htUKWtL%W`Jq-DJMfq;# z`B2h!b#|~Z&gSmjt99|ErNQH~xj6CR?b`BOC@Obm?V$f`vKwac+rMcJi=2$iz-=`h zmKG#^qIsgxV)uv01e2m6P+lR=9XO}-ncF0xk1=>KS3n)JP&RLaJRF8VM{x5`r}sE) z4}GbH;fZIAK6|T;V&gTW)Q~2eSk=~tJ{tCDL$6Qrw702UX=~1xgnWj}QvyFq5d#sW zRQ@mNPOE((X}8s2);bINdwdeYb8mG9<&C74A8N72dNhrl3eu$OcjJ+}Z^n+7@$#?c zqGV%?r5L_EeaKhDi3^?1J;=lx0pU=6JdQ>KQ2t>=S zYv0231pp(0FiP>w@v7@zDO$6RIf2$L12h5iI0I4J-QOdvTg!3pR|)oOJ`@z#7PlL->-_uy8_-nleNXl6uFx%ET+Aoh%61buLd6aki5epE zxOcIKH*15#Jo2dcMSL1p-@n4g<}mRuHNUxs+R28^`(Tchf@hoybq9PM`3LZx_m!eyQ3$ntZ<& zoS)K1{BJ`NKR!AFl`9lrJdn;ahm$VLgxO;w4^eZ^%ID}gc7FOTZn@er^L4NPxraX9s9Y8n!7tGEl#W4X7r8DD>X^ra^Kqm zTfChwICywh8(?Dtx+8==f!+}S3)vb%koyZtIVi!aiTe(Ac1|GEXZe2_>i{5y_yW+k z1Ki5fEe`_~-l;C~XU)mqMlJzyfcFj{8?T0#(I;OD{7WP$7j}<@J zGll_BH^Jy149rhJgh%wZY2iM6RrM)+>5fC*OW#lFmNlGQlPOECNvNw2fY2WF8UQMW zDf-b$Y8WJ<37Ke$pHE{qa+2t-P&NK^4;`bz2XG>e^S+>Vyn-drm0omNK?2naoSE%S zDp7Iq>7q?){K+%&yN#T(mm&i}eq-(ntOV=Htr!UoZ@eQub-%2z^E&kaS`QlT5whZ< zecOPL9&>t`{Dzw3(&h_Y`-P6!E6V;sW=`C3&}W1E?f*+N5OLrl3vos&DMJ);!Os>J z0O$)%cb)hL9bh3iao;7_m?A(vb-WYvgdtKD;Vll3G^)FI58>eO#?(|Tdk`M!5N}%z z(p$uzSikom9{wH^bBy|emX;tq2ck7V;sX};!;7;?1O9ZLs$+9GYAM@5#tS(-_?0JW zkPvV*08?Cj=pp@+Ij}#gssQ-Seq2^IzYm z?G`4=>L{i6fKk2!Y`N2a|J+?%9PINmuyQIZ?|JJj0LT)@G40R|+3@o1zV_2zKw-Q5 znpnztA*!6Obth0tTPFy5C#*!!tyW>8xZOH7SxJ)QvDXf#a{lS^{(n6ARZ!7GBQwxL!7#5g0%fVjWxBoKYk#lXE^f^ zUpO-6`~Ib^tWX6_y$E3p63X|kk8G5bywLL+TYr`jsl8XWA?}i#HEKWYi?nt)`yNi$ zl97R$%Yk_nZi2dZx6}|b?>rL|PMV6!YYWcTMu$yoZihU5K&a=X2N`Yr))OdRG$rK) zRBb|+l&~|x=mJLmYooVtKU-bo(0L~=?yF2$iL2bVyBB0Q`81Uit=_a~%jLkg1;?yh zKUOgl*ZWn+JK3oailMz=XeRQAie5D0i93`MxL`b{!hv9j92KSsfWfW%g3j5@+`OZ$ zO`=bD58@|1sQn5-F3W})EA8vXr_W}Ci4clCpMHw0b9&KwqTiDDxM5%BW9jXAW&NJ< z^M4KRu1g=+{MEmSjvEkYAn3)`8gc^x^CJNHh`JrTbyvUd@yMW)QFM3PUo<6wQOwoc z%1x?fJ{@XU@S&p0W2o>;M+`dK+aKTH!|s0oYQxY+L-d5YG&Pl5AXK!lw8TK5htDi6 zp3e%C5dGmW*=054$+krNjAI+mM2^@#vmYrDYJakF(R8#-ePvWB9Cj0WM~fxBVvsTo zyPv)@@;dain;=FH&XyL1$RmgXT6YkNRRs8HEd(W9s|O@T!lW?9DmNT3Rlx@dtvbZa zqG>Cqpl66r@0N#a+aLS_1$sH*1fR~P#uNOyXxS1tKWP|TW_bP!GhJrkP0({o6TO@= zP*zSPVwjn)hSmX!Drm4#B`V1=)nOLI?s=}zT$W1R<<5Nn#57t8EY47*f-Mj9Q-Hem zT4*ECW*YUSDcFV=6KeIIGeWZR(V_uE#|`A23`vZ2d;FxyqEB~LOV+Qc;X$U_j6k855G_`#<1735Pb&FAi(uuX~V7p ziPNxah#if-?%AUJ;Bc>sc{P>7btKXH=(pZmmDdRTg@zY=mKEy%7VRFEhi68WTTeHzY#n1zGZ8H1GWB1BdbBO7ixl2cQO|Q=TO*q zo#v~dSzZlA@DeBrAx*6hAWujj4MK2J1_Y$RS-NM7(3aF26f=Lh0QUHj4y|$*)-KJ*+%4YgFH<9`ThLUi#c(u z;?Ory2F(^D>xXA`m#DzyOLQN&An+oDj1MJ1gvhYty;Fj;n2z>#J4-CTiSJ4M6BFP_ zLGw|h8<_leu(zGiprB;1GZ9T)tH(StG@f538gzBM(yB0*Y3eZl93$=H!*i2oM*@t! zHo`{bf9VM!Q5=;1NvKHg`ufByjsTjrMs{9a2cW9;Y+e80aE%vzTJ{n83E86=Kd)9< znP;mc^Ic+V$q~k8SNOTX+okqit1XY&i+k5vt9Wd*jDgjI znjnJh*7v^)I`2QhnLamX#QTcsu@@-buNI6wgqaqWu+JYhZnLWpP92^yF!p*o@r2!h zX(;7C&&829btk#*(;uWBgz0cO!dd9!)8vzIz(axw#}Xi6xvWHR8^D{r2?ah;Ek9u( z_J|1r;lO5S8PoAC?)F$vj9p!T6gq?R;??{l$j8=l|L{>O3!& z!_~F-9)vtgxDh#~*z%$1wSQCdT)3o_)h1ZW^catwA~;&tv$=SVkyVvuz0CvE9#^pV zR|$6WV^&~O0-!GHm=0VV*kNGL*@O7)??R3^)Rt0TYQdJ)^h50$sMoM-3F^l;om%&{ zVfF9VM9eKCe?DldHc{(sS3cf$cf~Tbs1{ik-48kNUW?I&u`hi{H^OIWX$d;*%`GjL zP;gBClYuvjJr}2f<7r4w9JGsO@H-?teW=m@Q&r2{6y8mAd`XY7`?Z$B{!ioL3I*Qg zk~ut!i+&KwiO80`ugTPNm$>L&@X4PqgKYt!cQyj0ezz?&y-b{L*e5B)^c}N=*a}-a zyIpYmtU9=1F_r~N(&B|FP*cTRHq^v?73!{&9?QgGPhhTbD6PWnEy6-kFkn4H@ADb} z^MNlw$@#J#Y>7PF+%PD(fx){GaNs4Bpv0Vmi7>3g&v>qo#~#_9r^SlktY9O&dl9{X zu2dJms147YW{c(sHU!i8e8jIT)AnAAdlOsw>46gTX}#oQHu@cXx9W(fdN6Twv$9}@ zyaa?QNYdm4gQT?w2TBBD$G0+^#$iunPzI@+zmYZCwzRF9oJqF?$zErg%R^6RLBKz zHhbX4J%li+L^^Z!PEWm-6|;M(XcGA&i5!*o1%k)=cGgPL;SCdeO%0|cFM#n0wFuM! zSdf_(3F^I<^(eGEv`E3a=k9KSVP^+h;J3-!i2JXehWf&Z`2=&EUam1}|w zEo}d|jX1eE3Q~O6UjMrl6vi0-Hv#!OZNLZ0 z0wMFf7Q<{TQEpe;|EW|8uK8JchR-M7MVPiUhv43NXY|I6RhhV(=X*5OR=zpEVRpo_ zCNrB>b+@&+wu%NzbQgtCQ)_B!1M=k048GX*cHV{sL_q=32XO6>Fd9ZB8rQg*sQMTu za6+6m*<0%OXXcv-i5$x=7NlFzfxOn((D%>3P3OC#7Ql4d+4+2!<;TD(=#~KA+lsXe zkHhM89_%@yQ29Hr!p%P401F)2!?(ta-}ak2Tq`LE5p3GlY~OG-D4y~f(l z$sb~~Q9I+kkI`ld8{wegxzqap<2lMJhV<=>#y zF6jtP+>+Nv!+yix+pNo9`=CjbAIsX5C9+z#6{^jM+ZYp?smWY5{rnQzTRdjD81dJe z-B5K^&&wvfeF3PAz=y1;6s<3MoZGFXqn@Z4ounI=r0I63XJz7UNCeOd_#FOI7b`$>*DSIN7kNx{0EWYk-5>*qUJH zs6`)_}D5T)=VQO_;xZO+StLO2?v_Q_=q2pbp;nE%p0-JEDnxMFG!$q#F7 zZib!I0>%}Pw({Zv+u7XOnx7OGF@rj=(4D&>r(SYawCOVf+_7W~Q4d;$F;6svO74&p zZTRHuLTTcw^6}lhCqy{u)l^N#KT*>*cuv6147p*8U_C?a(SmoNTl*b$abX6mOXrD` zTDX!P0G9~tUc7U}KIgV9}7 z)br1e$D(&?bK**MO-`3T+rMMMDPhG~)YEi-2ziiDKB}p!?~03xh*0SlLO+m-sNUHC zz#=5o>;moPEs8qm2q=)DpN*(LI^4nC-8{WKs6|jAEcw@qsKskt7TnLheC5(P(NDh( znSSN}yRB~*DX}6T=6cW}if3qFiakKf`MRYtxvI=y~Pf%SP zAZNDDmpc1}CL?OEG5Ofw;mlOu1O*ueY~M;SRRb0Vb#sV9X2N-0=4wyv>54j<2;y5_ zS>3w_CXQqt0^gPeEJjr@^EbV(i})~t>){6vsnRmZg0_D7^hxZ4NbugZLv;XQV0c;O z`GDTVZN$cq%+KMYlfF;h#J+hG29|Lp?(b=OU@|L~nUZ1z zBv=a%7hWRad*HrSN?=YKStcIUFSXESxNbJS>f9mb_~n3luWQ(rG364Cm^4G#9= z7jSBHhqdCGf6XOO${v_eh?g!Er!uF)>EcL1A1p*jir2LEI!h4u?h8U+s-G_Ywp&Dm zzPAw!u{B#GbdKUzCPS;cmk59Hm2tUJ1U3Jz zi&IlmgV|SVN=n=2h?6v$2NwL=L<9VKYB+4d#L?b~g9hTd!7t$8#DU)w3;%YRG(;vr z3F~S+_!VicCjAndC#O&Ai^37Ao@_4N4TJC%C$ z^B$1|iE}yD^__%e?3t(ZYFb*+?Z)T`14Ts0=J)NEDa!h5px7N_^b$H6$Yk)nEiQSu zhu;(5lJqFF%Lv^^I{&Wcq55Q@>`tExZ7i?bVd}M*;6~03FIXPF^4gBOdYY!$Ou2cx zRYZR)uN!faLgozI6mY>P5U{EFbnO5C3K5Y{mc=J|4=Vx-Z)Vld<0(D_K!yz=Y;}}+sC@AreKHA@$R?}o7Z;)^QUZA^;Q@6>{G|)1mzeaUmF>L4)O!+ zNXOIVJZR@u4l(AoxZS`zpl7I!gz2+_$>t?A*3vR`|{<>w{N8P z?yW8_%hKShAiNp>_a#hTzrKV00rde~-=SQYh3Ax_)_7lM>4^FBB|kN}wBT{wQXt&dXCxxAp|gr6|Bo*x5sSZBoYJ zDWtku^d7m%Q6?sLxVJ;`eJ-4;H}po#hA92T1@(Ewr@E1^VID4T4Z9U%p{4;(NA#{6&(%d*i zyMy(!G@sV^L)~>MDk|t)20?*}i(8ZAKK&1G#^!aA?oH{%%8?-Zj+?N76l%qk35Y4D z_QAagmHm#37{sH)y(b215k3Wl^!}V27Q~ODm6}lr#-mJSSY+*oxg=p8h7POWHbYxo ziIi^-1?3h-za(Zwe92lUD(vad;XG?_%;2-~&8d}|uzmL7in-9b-ty>(Og(!L_)df5 zP%OIJ8&km-3#F`pJ;si@n9i5IlRs2m&aRq`%dba3PxarffsZpIJd+3Cy@O0=Y|7aj zndUmRoKO_m@BN#L`@ZKMNWray%FsSbW`e-ILhV3uavS$Rnbhl8Sf9WHasB$~*_qR! zVcqz(lksnCOXq7AV~c)ci`Qd1aO5p=H+06!J0X(;^mj!?MX>g%AwpV($piml6_mHm z^@rC^uC-c1g9jR_GaIwcE0Jg-N`;!lrc}&rXVn=8#mI}__fT7@T%xF;gKaP;^H-_O z!NzXuSA2TLi={3ihKBkBw)w+pJikW1$*03vQE+(Bw&eRdkWm2%5iT?zrOf|wIhkOWLx0a2{Ca?C@RH!h1s&neix30n z>>8R}Hu2m8bFDGWSiP;c;If2Fa(n1vd5pBSGJ=fr!vNJu2@7`uZ2%r|6V^2!@Tu#tu>|Vt_R+9L$ptm{(}pWKy(5f-i8E@G zZ*OphGb-3UQ%y79?Qg;q_{%3s)W_v_QZYdN^d@OSJxBh~*P-m@XWeDwtW3{_2?>da=!tM%7`x!uF#`~%py2lO66T3uIS)1r7B;^9;^H!U zji|RS;ge@IncKs((|x_^Xl7C*uNyWg*HuK?mEO89AGXX@nRjqXhs8$r#Cf}KnS)A_ zqmJ|OMjEe&HlzB;-Op<{x#@l>RllFlxu*7g1C&oxl;3v$+h0Hu`rjiAG+$U>hd-j^ zCviLELKO!O}Md0TdajsNBOxs~ZhG};H%Q~)E>C};B!@{mQgQtiYS2us0lUE+K ze@5a5hl!j+$$1{Ka6e?}H!TSwCzrl;3mlsX`mc(nzS|b`y#*S+m>?dMjq$z9|Ngsf zVxVhRRO0U5@jtn-jGF*Tn)v*m8Rtg3i#2QgteOw5r*Nm9E^#Jwn?g`FTn@N>^D7Qj zNlDa6y)Xhi0*%_i!Gf(I{4bl0>?-wHqSls{{I71n?;z(81^qE4byDN3$PaYAfD#B0 z@oR##NH*%*L*0wq=l=w00~Z*BckakE;eG#@c|g9nS1f*e@bl;NoHZfMsAf}i1X9h} zbe|fmGLMX!2M-u!@#T6>@0*<3)5<=O3N>%P-_M`5hLf|7`jK|Lo-+JkSCK(|eb*Jf zk`3bbMj^4TAT zYY-28)#e+Vs=Tb}drJh6!SIz!;d-MY6f8vYRgsP{_q}NoPEvh#5^p9*Nkm<%tL=;S zyUW+7rl#1r>4?lWL1uX6pq#Fhv4r`Yr~Ez-5&mpxm|KQBa5&LdJ<=x3|fg#1wZ9MRJt^E7F`s+Rcqeg61- zPy<5mc6$nW5JI0Ps34%)ms$FIdqnM}-KGLhp_2++WB*NBDG`+NiLs-<5|p zSQM)*Dasg{A@bD$PrOvud7DZ*uM}#irU4-Rho40UG67*F^1~ph?1hV-;qv1pj z>{5C{50KdGxQI}N0S>=)eiwc($dM!DGo)@lfv&i7E&WJN9Iw2eR=(wMRve#@uR->} z$}`N!p}anU@eTfj$6;8fdQVD*Os^w?x^s9|b_a&s9*TuOP9J#bv-(UXvU#H2KsSH* zzjs*$6Hj47INt%15NO6O8e!tpv%41!@!0;gOBmTqB58gP zGde+VSp4%;rfQYT%$~HeI5t`FlSkX-@6^TgSCUBQHWJH17CQrXo&}JOMcCL3uB-=H zq&3f-rNo^P+6{n&dnm#YQp=zj3JD>t&dfyeuouAd9o}Z0*9CNYT}2Y_h+RYVW9i|Z z|MDrGF=(khCHmlQsGY`$#vPF7)RXlQ_=4VYx%QiUWB0)hh0 z$s5qeb%pXij0TAjD2IJya{XVi3?p`$yl0?}CY#p1E`9{qD@i_o<{-W+i+!O^NB0}! z1AE9)f7VwOH1R*JSl5CP7zynkW%pcak$oPW_`lRpsX(Ep`>5dR9h!m3NlFf~R)9Au zGWa&sUwMqSM(a8-+zUu#yB(`oYk~fuC#z7sjZ9+??sJVXCbOJEZT`UcG{?^^deTqU z%{}sU^8uv-G7RAX>T`}Uf`0d3zZdOcxK8&1vuDMT+MP-Uj=ZL)wi7jzx&~Xk{JtP|W}+vHM?*O9`%0z%8N&sy zYUlW5<8=Ju`md;}c8Aa2Mger5Aj@AID)zUSgVp)O%&L(uP$uW?j@7;glMFF3w*)2FG^^fBtF!VEgIw=Tx>)3}Dw3%~Egm4kpm?8(G zpPE0iwr(eQ6_}j7Wqn+{7J=2-?YlV4!Gu4pxf)0QwF5INiC? zz;i%(A**Q;l-`uhL45>sihxHi?labr7p-*3J+@7wsp!^@=k0JaQGXWs>+ul1nfY54 zz9AMeV-{&-PByGdOJ0YihdX2+6M~PRA9dnU3wwQHIR_CADtrPiU*A5Y*dG4e0lR5jxh=G;n{|Pt1$gQ{<*_$9m zLjd-zsaG|l?W-pQsWQ_#28^tQ7FFz4Y%%->F;m3-*MKN${bHR89$vsS^(!n6#2fkK z=a-!6B3D=rBR&)f1thV+D6?}i#7`stfuMTq_K@&BKJ$zej$n@IeiV!AdpR@SafHO= zgon`fT5L^jgNT8?oQj47!q;j0F*jAO>~-wj7xCRwX<7niy!Ihl1$|7VLQzU1mX^Xc z6mNLR06UhdG-Wkv$uFiA%z?hVzCIolgmkTbhn%dmdrV+en<*YZ5t>|7|MSU2B% zILCoZvqWnsPnFMt&n;p2PhQ`8+_QwwN1CuI(^()FZ2tkUE8xHkDTl2{FAWVM`94{F ziuY0n%1VY*?kiz7Q^>t-uXCDkB@@ik@or*u&&cjSeIwz%m19hm_Al%g-G-eRv8B+( z*_qrF)w(`v6sjyM3uadHTvKa=pIy+z8~s^3JT!OJ^sUKB&dxDVeHf`NKst0bu4MTZ zb)CQfo>DeI%1A;&0+JVX{<~~#ZBI+@TjNuK{pPd z*wACmjdb2g5E+Szzu$JTZ<`t#Jdd}ztWB%Btj)Sc;OzU3#450OE(8*|1UFhn*O^T&0=V86`H z9m_+cGAC!P{WNa`;dv_65YSqZ%IPsz`Fvi$3t}>N#NFpoVYGVST0m6~;#wr=IZlwmpBkCL zb;iQd(c5cSZcQ2Q83R_w#PyDDxIx07HUZGY1HWALH5)#2P%{g%9S7l5ja1V!WX{KG zn=Kx@FH$FAXy|Rjq0CQSWrpyVWN>{qfqb+@`HSmYms@Jlm~sE=Ej?d@bPFv30aji; zKdo`MXTtH_!&Rf?@!hwfMS+ctjf;D*zfVUf%u+U;`6Ym!y)&V6ZDpI{O_`ptd1XaW zt?Lh1_28pH8nLn!#YhxY48fu z?yLKzs2$n3BXbrA5n07I?UVEuMN{gam#HMb@j`b!4e$T70LlXL)XZ{%-ZhmqZ z5pA1V<5tUY-Aj;<1Q$Cp6>z|@ijXa-$Z&_F2+D8RnGGDS85T>?;P0GzfRyo868_`w zw;DN-2HrN!ZrjWHX<_dU5tpEZ0aX#qUQy`m@^WXOH3Ga;MMnq4xr#Ax%YNSDxM+&K zM+4_#+2(!Ord_F!DhonKKMmiJs%r>qGcJ|Y?mu<56fqOzP1Ld# zg(iKwQ@&JR<@!EO<$gOTjP;HSSAEst5GP78Jx7~qZ2>1?*3`a2E4Mkx8RUrsZxMym(wH@|)K*Xns^V++i-hV@#TN96t6FF>`yDp~Ow;sXZ^*X4> zZ@RZHRe;d)PJEdVK!d%pcT#>ZsB+ZC+j~qq*IDZ8>#9nM7}or=-Q8-e-ogWQ8c<9#hNb9fF(PxVXCfc7n3W%c&S()p!)WQvOn3;0f@_y>( zv2Plt_Tl&CCw{Ugrl6RB#5CxBf};m6K%VmZn!bI@WZM1FUmYOu@0Pki<3oJ+ZgW!; zE`^{iC}cIMZvBH;^MCD(N#L)1QS0%Dm-iO{P$8>SK~d3x=%w-?Bwm6)5yHXpfBsa- z*E(M5dkx(RQ0zly3NTQ6V3rTmCkQV}HetlWEPeeGh}cEu;7R$1*128A{5ZfOlHG&Z$)RUku3%xgjj*d=dRKZX^Y0XO(n8lv@M*w}; zZ>qI5^L{9WuuU)0ZnJABD6`Nwsmgx#AnGRkDLy}1j~@VeK-moq4JDq@(FJOM(gquS zL4&x7qjCAzqtH7|H3uSNn@+TZ8X^!HJT>`2QD*Xz(&F}I&2ZLLlGg*;SdFoQ^x|jl zrkBEN`v}CIJ@NbjLu;KZhv`w6Aw4?D0_L|&k$vXBNcr62hfIg>ZE96Nee-L4 zV@W=B$P&6hrpWBGhZj|Mf|{Sj@xFTIY-`JDQ57ZsfP6v&cxX}bV1CeGc@%mR7nh#a z(9qCHVY;_Btdu8@4nY7(v;k5nES}`hN&p633M7fa+~qPqE9<8Y8(ByT^lfl4eH&i# zl8se2u|J535k8t3tqThaD=g#)`f@0U4RGjNxAHG7!zZoZ#PFx7ty;P1zJmaC^$f-P zDNU}aRbt04=|&79-o19MTb26y?OTP_IDbr;iP=63IiYt9*?@nFUdx8ggD4*5ka6B1@bmZ28CruRVJBU45OcxF%Xw=28lK2c@U%wB4}qo^ghwPKBtcRs zCY{kxE+`a^z?AzGRCPdql==lV8}tv3%dgwwA5fmaa1CEoQu4#QPIBnKk&wU+kPQhD zj|}m0r^_VSG5-ikQIOn83BIAKCfgsI=lY=Pobck%{)wtzgK^PFMPRe}!@jrjykyH! zYltiCQX$Fw+v-?+s@dlkBHsM%Swvne(j{f#;k4mxE#rlEWAvHXI#^lYhhO)ygZ>ug z6JQNnTNmt?sbzn4+%{(P*n>bq)R82nQ<|1Q!4sbGI&7xv4+w8OxBii|!cRLV^{_GZ zxxXyl#u5JW*QH}U%gc#19+y(q#Q(PCRfo`a#-8%~khFUeh2bXd)ccU|9C==~*5;o+ z${cg69!q%?p8hC&QD0}S@XM#`osIEr@mVIx=CML5#Dw&>4oFzf(;lORH)8rf5G^>J zSJc&WI}N|%RN@x^&h4?JE5U#J)KUv13x(Fh^jW%Z-^OPU*l{&HY`l1)X%zdTx57LP z`$!w3`ba0K@9i&;$_G9B{Z1yNL8X94W5pp|&(kcuKq~cNUKU%C{mvpJNy_ViE*^<>B*ZBRp3=n<)`U;D+z&gk?7x{0hHpra_~y4{^ctDWKdIgDiI# zH9^xIVrHocC}H>qeCOT6!;7uz?X%-;Wht%PLlFLXZkCR~NP_Z)ND0sxV3rHsp#I+8 z!s6n+qE;$lpm=}0amVdoWf!_v(CpV^i(XE2w}wy=@KqH=e5@{ch`1s0zRqQrmcS9P ztsQ5;QHCU+&&c(q|5nEdk^R&0jGVG(Hd7Q?ym}puOE^gBH^1KAB1X2G^NzDT(?YiA z@Mvx7>E`rBoBzsu$59faR-}`zaRyzv4io$A!M@2x)AHwlUg$P08dEe4>bB<5%@gSr zUY-gLm^X%{KpU-)4*#7tLu9A17*$2!!Sslrc zwf#Q|c}Wwf6W_2A-z1OE_o|}~ou?>wreJ&p?HJndpUz`pK(nVTpM&M~90rpcEC_dP zHeyIL{%HbQudOKvl%r_1X1a0p`@IyKHT7hUr$g?tn`p!ES50%J1yhryMB(uGD7#ht zNCd7vp5*;wRR?cNspD3euSEJi9i#56gAKVP+y_yMnxAz`g>tnrJDoOf*kXCcY8hs9 zcUCOasL{rpVVp2OK|g<@nUm3wll4-wLT^YT-!cU!06QoB9}=+L>xxpwgJdq3h5RA& zg4EvPMT&}qj}NHr7@|LWUYvVei+apezM=Y->l^EyLaE5N@kiei=U$we$L- z-m(UHOa7dpA_2kz8c)~rm zL6(974~W_<;T8W|GH;NwfWyqmdt*V7s#95#|0QV1Z)olBzL}JOyEJ!Rbp`&8$aeN_ zzlbE$?#>2v;YBQw7@=PnJ@>bOfbxBjU5d#KWs8!1GGw}j1cN1T^e+?KKPg4r4!LgXXJP9Zq* zh;#h-iF{PYN*G8%LO}8AC+T?$EX{HA>=jf;-dNz)QCn=&4)pds^O!f_T!+Ivloh?0#x%iuGcx1nkp*wZhhLPpI3)+W7M)8YJxw1rcFWl zt=aK4rt4(OuG73{+!0C$4af=W=(+8NtX=BSX19WB%Mp5Ks@tl#qx(bX_p@Hgz1-b# zYWOJGbfjKr4cH6}Wa=fi9O=)pQ!3`ozP_ zX-6fa|Epy?1g$OU2GO14@oASsAAqe4@&tgs{gU(Nx)w!iQG@$vWdH!0nTSf0zUr_M z^WXJwb#;}N_LG4iP+mS$UwH^%t!tbI$r{vKeQyCaA`h2>LMQyGqXR(4x%xxIfl>gs zhe^ySqqnzrkedNSG08p`H}A?~z;6DCbeyGw%zjdExW;^rfBc@sm>u-f< zHb|6*>fQf!Bv|pap;{lz7fu#N(*J2hU+bB~xP)B6Z7@86q8!|ukBpiEK+UH??NTxY zmR8US=1yz8V%#e2jWKAo^3%^_2d!1E;ZbO4US4Cq!Z<$$)ZwV1QY^k6I~12&JJ|G8 zxkDZMH4^Mq!t4)+kgv=1*_~HiYKN2{ycX!GQHQYTc6VGwcSH}fro%J< z7jM0-%O!ihq4qM$+coh`67!Kn?T|Tg=vgNV|%j zZ`pgx+yMZmfk6+$j%~~TBkaB7vFzXQ@jEF>Wu}r5Dk@U;UfrQYk(F5pAv1fILP874 zDpE=a*|S9@tL$AA*?ZIPxa#?Qzpw9Kzx(xhJ@~XUA(SxRCClh zZC|FnXBXW|pdm?QCrmdz$KR|L`Qpi-P}Q0Aa-h~hUuz%Wq4 zPMdVCz93dG<=Ha~(z$?+Y1oE6T#&p#>Wqxz#`WuA7}*9<&nA1NCbn3QR8P64>}`TNc7jBF>ZuXj2J>=qzJZ$z-C@LH%<_ody*I(q)^-FZ>2$oL3slJ5dVKP=({#w# z(YW3+n)M*ct)3t)AtO`D?iC&q!kGlF_`zZHbcLiI4`m*+hn4^D`h-5W)z8n7;UWZ& zcxl#*_QtCYTase$C-rJJDOZflz-XU2%$J2kvzq9Ew`dEB;yd>hAOX44Xq87O4e->vmm5 z^bKYaGLZR^6bPc0Cnu=&vVqgUeAv((cLk;r0D-KkMU2ChvuS<_b#$nqu2x422pl-D z*s*#AFaxfMHv$nz=P!x(`f zbMSEx%qG#v4q63P53%|%Li*DxDg_w3y7cv$yu()E3!CbuaUdbjGK@ubLq0LI0kSzn ztOt?deBi6f#s?h zoz!(j&f5wjul3XQ)0rFhxT16C?XLIXTOaniU{Bi8N#*K~j_L&m!>Gd?(H(ZbKv%3U zzA*IS5kIAPaJ<&RblDxBE?@ZnNv-pgGT7wLNUt2X%4s87a1p2Cbz>5rM054eDP<0y zD;SmoIaaWB0Q=Vez5?D1kdE4jhgv)6>9a6!3C&3aS095`FgYArE=Z5ls~6SS^0zx3 z{reh7q)MSpAP$^TQzOzZY^7hFV%;q*P?=f-FA*vBl`pNr==H*XVGhY0798o-8fHgz z!6)mxX6U5xoO*D^i-bDL^Z7gqfsOwzOZZ@@%(UWtK?JmY^JQ;wR~d9jxlEmf{`)z3{!X=C^iZ_mJT#h> z*hQWc@m+Bjv!VL;_XVm2u@!PtAGz5>*8le#*5Bs0|l`iZphKbe)&f%~)0;h0THG<>m5grx-#4eV$S>M5ydV_Q()oX|c)Wp5b9j zvt;TgZ=PRW{VpCp?Yc*710^MOKQBYO2K*ubJNa-fK;0P8N>*IHzbOD$awy9SR)MAN zUtjAOSI@#qDo_*o>ULU3hnXJzeIn{EXK3JaZZirZzN7B9{i3kPGVPXwI^C}C@83Db zIb7uo_<)pTgUe1`&Nve$?l^bKCPBvVA^lAU*&q9aZRTNDV0%Y$FmNt3f=rU$pS9Jr zm$p#k=8uJh=+u-G*UjKyhg`|OOGFnuY?%?aI?fShc%gxP=cyG*I0 z8l`Xh`zs{Oa&mTlNiWJ2^k^gBUpq&lU4jAeTl&poudIMVG|JK?`N^b-{ccrr?z2t0 zG7SITJ2hk7G;q2OjoV#z^RCn+<6mQJ|8^lVLH*ZOpYI>&4!_F4$cRx=zeagUB`4(X zz5nk^E7A*^uls`KZ+ihPQh1lOHba9@n{s`Q`Ahgvlk+vM8OXSsaO=J()hIDrx~i1H zB>%urwHGb-@0d4kWBthBUiDB?kphJW63HQUb42LnWvfi3jMsYytp6_4pyJ=Z!e8!o z7~SUW=y=osEeE!bv$MaxqyP7yBzcjHeG@3RYd3@MQ@7!NyI17c4o~8;B$9uJzl~e3 z5vbSMXqbgTg0exmQL!s)m58CyzaJsFiPr6%AUgbuTx?*zvEa4MBM2U$@e*$Ni^FRq z3y3m+tq86E&Wl6-r2LL0v2J%WaNOYy3IVbhASzZ0XZ`)LJA_ckJ}o^Nxa{)ZU3SLf z_+bzyW@Vlt3&voU;mvfza$g@`Us-y7lQKf|7nYhE`~uoFB=UAT|N9;{C$Rv_HZLu$ zMs#Xnh{Zb{Uw}qrVYFR=w~=qta#%tF!&BGDudSO7ilzPc_ytmhu@#9jUQxmOPd%tl zI!=>UX)cK4Nl)~Xj`E7SPn_raTwCj!^KXli{EP1uZ(4~wq#Mk8_;793FEm{3zZVjW zc91^3Po6C%MOQx6{M(--(wO?#{t3i4WXLqK*+BX07#WNz&_}}~F?5r>_ui+@m;Y_d z-m!i=ik=tRhqxr&CmxyAU`w7RYgfj}dCu_CL#pG;|9jC0*(F~3bi+bHNJI`S67m?Z z++-jfdz52<%;RtF2Dj(ik6XC>du_87(#26Yt`LNN*1jP^lo3k%|H=G(UYDEU5K{)e4|qa5@>G_PF`3W5q> zIy?|3=LN`Dh701!hC2(VuWq2p&dz=)dKsmU`O%K(`}ehEjO+)kzT5TMQJf~D0}!Hx zhWHl|d(_0btt>b;XC{Q)x&xOD7VsJlob#*kBjkqoY zw?qhbFE-W-{u@(yMXBb{Rmf(5mJI}?#yA-GYnHJ6Qc?zKO+;vCnpHCK7ENA;=RaUP zU_7RA(C!lKhp-@0NHM$41$1SHSmAg;|E?kFdU4=;Zm&(Ww0^%+qF-d%W3Ys=af0%T ze{VZA2w5&RAINL;cQl_9Ep=#i-pB9>o?1`W^tskjvw=Ni@I<7fIy`w@VqpZ}VD`^(rk1;6cE)p*2B(cXY3LvbmK_<+HKnAu5 zWN<$s&%(?QW`2EPr`HbA6Y>;(y%hmy!~E6X-NyC>R)qiy!!8p1T7xx81C*t)WvuoW7{2JnVQmoFqh2(0L{zfBxOszl%r!1TuC& zUf-f^S*T7r2PI_`3FFctc}zF@d$LGgu`)L|*U)J2TboWq5HE_ROHR)3CV!Tq`#29< zG`-NSt*h{ZK?cnWJ7Nh-&W@&i>i0XBsQ2ytN59|~{6 z2u`b02($5}qln(o1XXn9w;*7B9A$Ag(n~Yd1(+$!Il@|5<+isNd!@q-VKC-VdXy6Q z1O@N%OL?J2fIWrCPIn-Zn1X^s=>?~ZV}w#?re4-tiyZAXx|;n!R4OZ{q%k*b@!&8} z4!jAkAMZDD3C7kyoVLV!QIH+>~nzA?8Im zfF3L1$`2nLS>50{Al!uIwe2oB2N*#RQXU>ZBXu#z1_N#J=f1vcI1a?j8f@ydK8`7)fz04W(tW?(#wck70mE<#!f*PN#${V@!<&m(%P+VUqiulPT>O zDu#TV2;9*&dcEex)b}8c=IrfNj>xj@yGtaz+91aZ;pls3TQZ4|_R*vB@E_wP)7y$E z_#;meJ>u|WF*Uyku})6E{Uj1s5=yL$4F!&U@P=&nH_|9C1KyjsOG792zPrDo_iF z6}}{ho@^-UA@r53jQInlT8VJgzYT5h*lLI-J6>OMMraVk?g<6=$(N^)EsPfqu&3)l zJZ*js&KV1i7#(KkH=>hyU)ciw!bqa$O!PSCav7z6$J zz~yfXMtH3a=+GZ8QGA73OW0c6uBJ9ZH-?N2G9f<*O>a}9Z-nQU7Mnsikq2br;91G0 ztbHY@6H2;`jacu*#UORFJ%l{6G5#1fC{$*^vv@aF_!uv~3`&RCl~5*o3KIqB7jy(j zA;@9x0!&Cg1(q-rV4(Dk&SBTtA?cPltK}2AHa$pC-LP8{nLS+fTF&v_pfk)sL|(#039DadW28}=L|4v zV}bVU?^9`~c?6z0$$yeHwzI{#HwK*Bhwjnaw|>cIfZ$&rz?(i8HtWyA21BCb{l z9NOUOZ8B5vhO}irHlcd&i#dH{bJ17xoc^k-p2hP6iu2yzhk8({TO^tLzMjFSwHs%IFh^w7>@BHee%O zQkx5m3YXJgA=QChh7Mj2(wKQH@i#a*Tq`grsK+{d5cLBhhc9@JA*wouu!%LxeNLu) z#d;$_ii=}awm(YpuXMxICJc|xN=o_x%Z*X2Dlktt9zk1o=K&1EL>h^k*iJ9MHl;Gx zUhB_#ow(J*y{}9`+v|ci;)7u`@hu2zl2cQI)l9X< zyNFm8JapJh^S+mo(C~t>rrNkMDQFu>m^bvp-NZxz=1{cFY8`BX8X(lQjv(j4Zn6i6 z2mKjW_1-SqO=$-@0T1)@L&W&f`SW`osv((-G`QAE zf9LCQ_Dw8^8~|QGPH8}7B;+MT(CXsL9*%r*hpe}Dvw&g2kpl-V0biT#7Q&cd+!s8z z>_YFg@Q~;bmAwqJh>n9>OC+|<+HGo+Sp==tBmD(cL@2ffx{y(Q_c4fm9(mrrBm_ZH zJ2Ko2z>#4iF9BbJY|3TP4m_Yo!gxb+Rj5GOpka15|98lHbt3+S zodHN+j%*JiTp(oWq=~?Yfby+@inSg7*a)5vYXa!4`N@fUm|Ucn-VEm`nL&?JKqBcD zdQq+E#0{8iASo;k$o(nAVS~efEKRQdD)K1A^35Kb?|BY)n^DRxNnu2RapcgM9|& zqno#G!Iew93_<-JdcSLr6t2CvA18e2D|E83Vd)}U75hj;@r2E|>q(b)h-2*ye{I!}bl~h$I*lJImyCjRN)4OpPda5B_A}?D-?x9iT}NK}9UCe- zrn=66M5whxoEr0%5R9EQG_=j{X!A@MKvLI&C>4TBUQf7)q$vOZ9^fGPIppWv? zm#J6o_hG4AfQqygse+*f^%%7g5=M9 zClOe2z78bK)*}pp!h^fi=9>`_|G+Xkio|>Oj*(GlvLF2bGkuH+0NYEZ?ROoa)E+OnM(&OLp0U;N5HBdI*qemxWEE6VO znMmFJW5P}&nw<#JbiA^FUDIpuca8jqDLrBy>kh!c_z5Ir0Gf~3w!Xql$0j`s_&wxu zTj^yc-!uLXN$URU;h>qbTqNd{QuHIqWQTYC$4Cll0`-C2MI@JuKnQ8@e|lb?=H^fO zj1mR_`^~{i!coB)WuBDD?R8W5idn(jHSdrm)t~gz>>?M85hO zH;&kyP1uUA5))0_sq-V~vVZsfi~_Ua z;d$3Rer%X%Y)GAmluYN`IlztRk;*q)98P8a`0NWVdg>_<274++vevnCkYNdijJSss zGZ$C9dX-}wH1&+U=*zmD`z%Pk(h87SmVoQ;X7As-Y$~{0=N;J-NE4dXK3P8$P z=Ewg~T_+co!lZ{U^|G$Ym^9+R0I{^VcoAI;@#?zBIDv+WdUYaO+(^s5g49{~Bkg}* z>+sCk?R*5t#( z@v2f9)88AZz?ezkU@$BI?517$>RS;+fD{qT3-3HSyQO5tt-JZ(Gr9@kNKsKz(lx-ISPQr=OkCj7Ol!&* z^MjQ|M?6w&=oAW+AGF)!7U^4G3FvNSIB4EYySesMnp+W8HE3jm-ayEr);`b%64Nh zEFyN#Sw3div|@xGtCxq3k0S`hSECrZiXw-Y{=e@#V~*Jmr{u69Dgn=>x(?DwgcWOqOSnHwEVLyT!;sJ5IZaI2OhPDR}lIhiu{Zh zgWC8K#%YTv5mKwLGs}yMh_&Im)MErwPBLS1Hi7-&{QLR+!F*}d*N9aPxBb&*nHZ_E zm#hVnfn%KWcvpGY1pqUwRX#vzP=q29*z$6}*~D#>Af@;s942c)ZUuaJyBuA|{*QN% zsUi;Gf--otVf!L1;NR-|V!;*~8ob^kQT(1^=P?$M0b2349PBeQZtTX2W9Fbi6|vX1cJOJOTN4O9`N7M zqmIay$yX3D6O|eqOYq3_axByUBg38$)p}$!$YvNC5Mw2H{Mr@mia_8v*AOH#BWG>5 zdbQMGmwdptG_U^FiFoc+qWO16I(#FbgS&Szj0Is9JomR`Wm$|| z(@%gZMqwAQg8>Qxi#f>8fAKkMrxFfK$lx_vS$EiyHr^RnDJ-!MwuLb?w&69iFARJz zoy3Jp9Q%}X=iv%YlV9E|6v`t+M91uh)wfeThy9=gv8(rjB8jvPTm1heg)+ctoI@m6 zya9LL<2lUF_2Oq?ufe$z_ep@w1eO*TH!?h|iqe%W@Bsp$`eY9L`?2$d@II(eqs^$= zc<%SNf#=T>xRQXNz7lzPb{d&8^z%F+`R>wzJ#hkVClqK-d|6P+e^fI6T! zxt?%Z=TN7?IkT*Jmn!J6u;sfv+svtDEf_N- z*jur*z^jyZ8YQSkfgFSj23pszi8YWA`N8qIH4 z6d&N_{kXWVxRQ;TS;yz1%&Tof$m(7SZiH;xKKh@(eo1E90=nU9jG)JU_t{0fM(%#QMJ5F(l;e9#76jwAmi!ghK=vay7+RFvHSOyb#G8hx0D>g6Ad|F=KpRQBgR`EoHT!SdNWwix z*M*X~su<68r!-hS(Y!R9z!z3$otsUYd1}Aes#OV8!fk|EfTk@Z%yAKPOqP&fwWz+Y zd57b5n=%#5>e9UWQ@abDpG{Z)0a*pI(GSz4fcD(3{%PlGJWUPeV!|9aZlLLa5DTgB z@o|B`*xTU=)0?lqZ76OE{Tr>ms9KaihM?!=4xd%eNA89fFQx$YP_I5kW(av-$nD0q z>H9}2%aOD&{`NIprmk|dt3(Wp%Hv70lOJ5Npw|7-wj3P)7VgV*A2s^j z@1EN;dBm+l!$_Hros+DnZjub^uu5B?EG~PNB819NbJe5i;I$$U5ZR$1i~1%3i5Q!p zs2CHoi-`$#?wMrsMbTKyY&nPl?;VGvH2ZXZJr#U4pp;pBYaXs`k~@4&rJM5X`lqTfCV?57y8Zrjz2f{B%cSfAf)LQ52+ zipwtm5|L-niy$F5hh_l;i8_TmaxOz!x%%;Ns_izJS?sx@v6s=-gaF|VLU`39X!7$cglYZT%)VqZC`Q} zF(D{}h&Pc08-hP!D+&;AhLH9iV zxYaPFX;2%2f`VEEdOfv<4k#tx344%!hIdFj@5pkOUF)lWU?`utjkGoZt~&hzGwJ_v z58v)_WeK}cBg6^`sX&DhaK}L@m#>`SKXBkea(!BpwS5)xUVVM^mR+wmLt+dxjqWeE zwvu^H90{|I&Qs0jfez_vnJrTLKQg_2y+fO6$Bu7_^G7?|PA|`m60I^(66)`##gx+y zqB~3Qlfx+9EkM-kM@#`yTNsJ?;J+sho0^E zdY!0E`57U7iVTTW>~x#{_FXw`fc<`g&&T;?JB6FjxF7u*KL)WPB5kiGaIEf*=F$i6 zfW>w8#HK}hYB)IwR(FT+a&wyjQH3n`+{Z65BvQUqaaY2uLv~jCy&OJKa^hPH-8xeuy7F^O%e1M>FMBC6Rt1k`2$gDxu!! z^S;>WLyfTzvW015Lxj!_RN!d&nIUd?nc16Dny@&LIGz)Ue#Q{pYZN59o1r@dB%_*Y zet2uEDH`-t8za!KQ&m9bT@k-&lk`d$fbXp9JJ@~J3cF8S2zX4MAqur+-fd})>qyjB zoy~T3=k2CH?&^8F6iCh!H&bkOe<^SXQ^P)(UO2mpYB`N#tkK|L)V5)vz+m?T)WC}K zlh>0b%8-3ZM!oAB<4Fph>uRgUOkUB$DEg87mG=Y$wWDhI)}vHi-!-tT)@bQUuKoO63pM(lDFHy{n6^` zI$sd1EbG`qKm5oge*Mjz3TLh?$^GHMOmEau%EX?fBN@8i!UdedUuqlfyoM+SzxBDy z(0WyiZ?vh5hyM4h=ayFx)O~R5FmHA)d8|50o1VYzYM&r4al^~ED~?@87SXD>JeU_A zN&9;I6EogZ2^}NJ|F(ES0Ii)zgxN)hoNcz8GBRB>M~TH{JNaXjBwye9E%qeGarZL? zW*0NJ$+W&jlJjSE+|P?g5Rra8z@5?rekpbzo}}Jij<(++R&Pv=df6K-bXHqh0uKDy zGPPDlSJAa@lXRyh>NH^4(dUNW`YB$URc4d6YakCm?jF(!vVxX-p_X0t1B^8sDIFw{ zO2(0jgQlpx9fM%MDX8Rei2&N0t|xoB^|Ll44AjL-wX|ON`+%F>dcQ}patnP} zlVG`bOmR5l_l~taNzm#>ye#5s4k7e2Xf0wE52v|#%jKo6$ZA@fw9nEN7*H1611Z9~ zt7!J@X_=p+yo2cXm?j90Hz?WdJ~_I{2#RNaHkhyMmfl5-JqGpTTPnVj`i2>$)b*n0 zdcXSg1g2?jA6l;#`ICHQY39;6B^9Yx0vreyC?w`5KZ0JTeGsYlq6%?`o4mDDnkdUu ztKIW@A6RZ9^&Wn&w6r(L-&!Ve(2&`M=$%B%aUhMArN-eBayB;BDKwZ17^@m+d;YUSes^I#A&` z?o=qJzDq0Fw_UX_se`@zfd`OHpdiX*vashB5~+K@isxEVhmJ?J9ABk|5>XGksT8(_ z^ytESnYoCM>Rl{_nm*?y1DaIvAEXO7p@!K#p$_a-c+q5~jimY`rX1cchi^v{h;Szjfe2rD9P|*OrKpUi zxx?9k6TNJ$r<}-F;9-edkUs(o-*$C+@5C*?d*v2`@&W`~6Rk88XL3Nch^S&nyfFE{52EY+}HRQHr&wm(|x>cfNYv~3s(hii(aMou>~lAwwzi`{W=#V-@oSO z!gMQ~E~U+oNk4*g>;p5?(8r;1C$21$`kME$Ad{J92^(Y2k{p7t(jv}R9@Cb6U~}iP z=3uL0J|fFV>bwqgsfw9(eXZ`}EoBnNf$g_!>(9tRl-cPG)}$x&y}RM}C!56|AQv zxjil^kv-c>Tk=%rdFR2om$n6ZU-_aDMMjtU5gWcS3#j`#( z?`4+1;;Jr1L>3?fQiTt(1TMc7IeG^;*qPMHAWBro&yXDQ4+seGaAkdI5#W7YNl|Mw z=t#wmpYIH!WVhDQ*Z<7ixTcWHWW&)F75v3w8l5D&xnXrL@bdGc--Wz)p62e-LZhD2 z<24&kiM?2CMZgPk;eCkznjhu9G$~K$D*$>cYQ^t@ehj7XzO}_VKfv-1TVZu~73cJG zPftcJHfz2#x?+&$Z;Tt#MNhy58o}~CArU5F7gw&nWvd2X=lJP;#2PW;w?Kl~MZe(y zg^fV-;UNo(h;>oxdNZ6Le4Dptn&xFSn|oRlG4!A^7#thYm>~m3AJ`o@bO;#2Y=_RX zZ@*`kSb9*E)lZKK*1CyNyJxD^O|K@mzC~8Ry1u12aKK|}+B2Xf>-=EdHfqI+Y426v zEcPm23D;sH@yVTAHYPU=j>@l@3S%bOJ;0?Wk{jHm0{>t_F9Kwvb}}C`)yB0N5i(V& zv5A+NHVtB(h~)O8%QqqfTP+4Y8Ncgti4lAt9=>L)hxq{XbaZE`Wjzwy2B7&9drN(vB(p8SL z%g4Opj5E;`hPi1S0k>-`%yxxC$+7xp_qL!B*Wx$lk+?!Jt|RLi_13g*K4 zG-LNfo*Ztt0fa|KLneF(AwXX54kp*MUy6J0Eia^nJ&fgnMKsAQMU{jn^5k__EgDXC z{Nve0NZOJSQga8M-W966hd<}d`SbJJ(Rt8d)i172%`a5#9IV2}+|t*tMy=dFItE@H zP)$PS{bzMF=!1~hIf9Zr!1txQdSpc;^7D6sH%aL>{(ylJY|3m{Ackws)JX>Cr~S?h)7bEG;tdU~lk zX~>?A!bO610f@9VMrZ(ZS4=ws;oH7svNBa8d1#92YSA$YKd&@p>w$t3ypbpEa|`>{ zBHHCrmn7Vf(u3RzCKQmT=~ouMP9~+FP^U90m;OeSwDt$YMWOPhOd${`pb7+ey2OFO z9kHqU9^z=Au{!WPA9E;o6TKqPr?7n!iUmeM?4gs$GQ+BWFtWLC;Nm6}<6cy892OIc zhOIu{_|^Ns)wl4;Xr3G0j?<~H|Em&=oeeHp2I)GkTE(8bQaM{kU84w!6{lfWuLtI~ zZvI|JCWo)FP!OnK%lP^+N7v$bGK`-_A=!$CsV-nW|i@Ljh-@q_-S%Xjc=C^FjC)6jy3f+ zY3fcuw;chAA`FmQnRo{!g77~5P?>$>EiUuV8H5i*LHG?d-qbC?hoidpPPd|6bP`mz3eg?$tOB1gUhWM?5;&L>$hG0x!TeVITl|iCA60Z>iwGy<147^2Q z709wR=#%uAM~HZdKnKXe&c9CSoJVC3Sn+NNCv#+$!>7=j4B&PWWct`sPqBuQrv ztM`h$Ego(Fo@#Z}pSteSDrJqX)%AaBM`}k_@76?;g9GF#Cl&0hwKJHtQuBN$A5$u9 z*!^L%HNVy>XREBXZRk~A9r`!ayt4WR{AGl>S*0k8Qhf zk1y6-Oe&ymnPdMwAtB4?nlbNruiE)77INTA{{}BVCE@VU``W0Om;>=)VT&+w)bt*u z#?6bCr~@IyH><0_CMGbQN49?X?D{Z}IGC;GyOJ9|GFP5Or&Hc#GqbIf3Jat5eyY@T zNu+hsSCZ05#Mv-yD6TX&|4Z*$XW?U%>C?xL1GJZzu0&-t-!{9_Oun>R zdvG0TiCs0Jnz5Js-mw$AH^d72Woi{=QiXkOt$Z^Gu|(Z|fz-4&309cW=psTx@(j*m zwOjZuAqy1y*ouXrK5!_rM6=8iMM`pGPLmQ!nt*kz7Kw@Tzinat(f^*U$A>eLS)zsx zc$BpHdcLIxxuTD6cbL-eD%Hb64N$;ZzRHH4F? z^Xo_scO1l7QHH{(qwMO#G)vnLePO=uxA|sZ2ru+NWo64y#4ach7ZSP`wzmgR4s?J@ zb{SkcelX(g$K-Q`py6&9{avH{4hQg9T-d$}w7;q2p2<;k zFZHPhi&IY2Z@NS;;<0fJVCu`)wm)8N$yNHYG&wt$z1h+^E%VbmmOY4FcWgQkeRzn^ zS}oO6YpI~3>(;m5z_~_V52BZoe9Xh6uw@wLdPpzM9rWzR3$|L%>>H5MV%`f>!cqDJ z`+08?3Y}LxB@no|7NR$Mo~EnM?9?_Jl+#o0BnNis*D@!)y^ z4#m?ukJFOs^U-zYo{*W5VNt#1QrGJBP2$C*CFqzqhe3HC(aImiy<_g{$f|%xcnA zjDkpW8g6fx7}%}I;a2OeNQs!)2QlQ6l$64*G4Q1~t_~3mDtnuJ%}{2%_7E%_fMqB- zL}k@|`7*QU4V;I@TF1ns97ST#5str_emQmD@XUb)hgTO?K+6BUb7cn;(?`FN>Y$CK z0mR+-a9Y~Y_Cgu;@@0Pd-!Cl`pmqP#UH0PpGYNfaSMLNPQeBP{mSY2 zRUG5dbGdkT!vqq%5d(QM(~^>lUthf;n>XnNfBfkbkH(DCQkzM1H1H3$$LeF6+HX7e zrVpI*AGt!ujonlSLw#I>;Kl(#_@LthK^Zg=gD<86{n1aK?uccirWWA)+G4#Scmed6 zpkz)-{{h7#dn5Sj`E9n~#({QvAZ=-6(jC*WucLxKIJ>lghMD}N?qz>BP-4#GBgc;) zCw%XNdvXHdeVF=Q*w z#A0g@c|ZpR#0V92_1c=6CM)5o$`&KHE;xt7h5dICYC=p3Bu!B3aMOl(Jud^AtT9(K zS3ezfPXOX5?*ql~?hT-FPaxWg+m>y?yI=nAK?9j8VrMM!-VAxu-8tI8+}IkG zU_rl{|BM>v%(Q~ST|wBPgMDwDZGHlN6|VG} zKH8+b@cii4On&!WMOC#J>>7gO|0tyaR@MWR8bnsayi16yp&PEd!~--ov?AQp3PJ;X z`PytIsKNGV^(0yhu=fs8zeVpE7&hOo<)Ec6x_sp#AZAn-UhDB;l@RK$Vg$BiLOLz+ z=31`Z*;${No12^UlNHfg)dtQOSS>8kBx}!<@zz6UqR|Kk@lLLyrP?2j+8ff)dt^2c5hseG=eNCJ-ys}a$w&rPIF4riq=5s)}TO14TlwpW*ziTn7c#E-0 zCTeP7bpw4K-4--!3_Sa-ZEQqX!rq(@c2UN*&$_-Fczc7@Ef=?seUpt%O^Ce}=uEqI zSQ8ZOOPoM4nC|~Pb9HFQnhPwPF8zjQ@P4b>L+Q`YogIsH@3B9Y|EDKte?0%n&CA5G zeQB%t481K^B;$=UY0HH)eq51k6D!0>#7%w|?edGu$`D*1e7q4skWeg_jcDv~4SaPf z&RlLTn7wN&YRRyU;o9#`sHg6!2>eHnFo4>gA2mW*z#Pg{xjTIfh%16vG+X$9$kX11_jjYNasnKfq(0@}l3=+aoqSL2S`{5Ys6l28CU7rU zhK>ENzLy=?wD~=SyYupbM}9}moK=ld_`p>bo0>|>&_8op`qqH@6!+2e)}6hYaA!wS zW?CA}3wr`3pp&JXp!?D{xe!#6r~4``EzRsK{}mnQXF*S%8hsW;n%=O(h>{e{b|Cby zmD+d82}!0TkQDu?6-cyiBo9;6Ro0ztSy$pBpKYAZeQVnW|ImuUb>68W{X0v4#-;S8 z9GAg&kcw#5NmCB*tjM7-B0mvvGu~Kvf2TdO8o9B#dB4a;Qo)`R2d?Bcr*2CYOgy{| zQ^sJ_Hd44#?>9J>ag5aS_$r&3%Bz?Setp=suM^T4;t6Ioy$Psht$E#%Ny)Og&-_M&2$HOebwZJngFpX=aQ34^nagd=7D508|lLx z3ir}xd9rL`=JV$v!NNu z!O)?$2w0RyCeC@n`Hf98lgB$)hL#s@l5Sonv0u&dI?E+!y_MY9+KRgTZ|`;9pZx=D zlV86U{(He)9vh^%G(!jKDj4t7-u1_Pp2J%>H&u=B|@ysY1dVvh*ebJ8l;Oq_`CcWQ@?ZYfgB}-Qk^aYQt z&7s?*sYZsW)HQO^7G9<%(d`c4oJk6J%dVK2zsH}-e{GaV@W7HW?V|bLDb<^&*b{Yx ziv8*dvtMD7+}Gm+c(`IE5-ziXePvyW-H`(0llQoJ&?EQZ+2@M+mi^AXC!#6|67L|h zc`v74^e*>z9)c5jb4+K^r_<<3MWRy;keEnP;J*>+%fnSFBEFvEyWKj{Oyr@=7~kLZ ze}?)(MMaudhwWpR7m`Sy8)+#PFev~@I_i9FqjTUU8KUtJ=3eu9^bGZMtBOdhoL^a& z9c@D*D43#%af6Be4XEX)ca+S0RmD1gmoDPHqy1RyZb@+0qTs})$xpU@@H863Y$SQU z6IuC>j;4xSQ1j;@0z(R?(FjYm0fgVV<+zjUXZ+yT7 z_^adySx|7eoNUcwuRqmUPMkpYXD3bLqZ$<;#-O39N&{LHkJbBns{Q*G%iVYn90;)> z&WF;&^_gFHzKtWD9?*HrLj-}O`m^|&M6a6NloyjH1hy(D2Jlz}E3;9Cxq_Be{FRy4n75#U>G8`Bf|#1V=)6$YzNo1H7Tziut*GkE`GU+2*L1A}T=2Ltt~jAHCv; z_%^-Cy2<(-n{Qk6!`Rs8J}c54`?)mS)-o!q_GOQ=x3{-Tv!9;v#Lj0#6l#|r`{a1< zJ9fp>1K~-^BtpDGCV7yQ(4@Fq$l_GJZywK;l-Eay?+Qo6)`LcNG!&rK@p$_=4UO;9 zi^vufXXJFeWjS^W+1Kw5(Oc&Bv@Q-t!a-@|;VM z*8b>9c$~uwHxt(T&5fMnGCkJ(vo!&*MmNXqHVd}Wsn3VNrAGca70*|I_>GW08%Xps z*3h^EQ0dMc$BxVSX!{j^e{E=edU`rQ*!Gs&G?Wt;%zHyVCgqDt#fA(bsm@AIp(W8d zYWAixUulfzoVjAh>51J9t7XZ=R*^FZgv>4Z=oz-sXuQaCx554b3Fg#;Bb?ma$I22n zOdvYL$2zy&RuqZ?_;`c-=+@=Z0v0vP562CctgWXOy}#%4a9wgJe)s*nnZnN}iz|{E z16L$d+D5F?ch;u5r!~0dmE8|UQ|+HyyTuO2t-Ttj!3vnlE+z&);dxS6c#d;*a?$(i zN#Cpw#+QsUbtP6ECF4hC84WZ!3=c;$B(ToOHGTd1b~=m0Y+tGU>%2V4_*y%*>gkd< z=c#kD-hCe&Tio}({6$@y#5++f78&|UMLqjlw`v&{He;Ao1{wvv&7O%@f5z~1&xuUy z>noAOKTCvi!jQZKy`%4_J+o{Q!_e)mGWS_S#Se31oMiKM=67^mTSMG`MEA@_f0~4( z_3k>dYAuhw9~x)!B-JNAyugmvq<{d)BjL{n0blypSS+PvN3cK!JyKR{boa}O9T z=)b)T{W9D11tjO;V;d(JaPg!5Xg09iy)mqN)KyjW^Yh$?4rAYc@J(tdl4sC4;WC`} zw92hpBPn%__xnZ-b&1tUcj=SVE_-hd(R#ILhO75DD4u<;^_^-0;aXMZsl>V+zp}nE z?6#$r5upA~m9MY5XZ`rB=b?iK!P}4$9e%^OUHhh|_MxHp7^XShr*Uo;N*b#gwKflm zrf+ap-Q-eEmLt`Vzn7I`q^Ne!&&%65YPoB?J}ooI0~YNQEG{C8)j?&sqW-(8SAA#E z*6j{VoDlmEX)%1Kb3<(BmQZH?hvJS&EyF$_QXiAfu)0_IWmv@Xu8cWniKo}(sOrA$ zJ9a2Pc0xY*ecdpKdFnMWeV4ZVvvG4g3!lvI$_IX!BsuTTCxYDL~nIBGtt@DML zvw?VpqbR)e|V0nSYa!s4)ySNFUxl0rE6%R$`JL5^-KFzv0Xo2J?KwByvcC+OBn z3DG}qvKC#JV{m`sGZpE2@am`$^+;E_*~276<-w9{-mP6`+#RPh&z*}&O!OAN3AV{U zE&vBIk1PitY82N-4$3A9e35El?|h_sO$dE`?&8Hw`?->vQR+g%+H(C{O24_^_o5ds zUL0Aj+?a=N+(-H4tC`kwt&K_;*dqh^>t!m4vI2)9p^Up(@DU$x)Mw6x)wq|F}NPn=!P^p)e6sh4(8 z$gJ`v8P2wM9JCxZ zJ51e41r;h9`7fx3D-xxs*#AY({z>Z>P|QFNO;b}7F$~7`OzOMuAlrvk|0IrJiR2^- z6-37?YEWZ@p@K|W4cO~w#09b^CCeM$XHgq>f($;l*(Pr;B%2**%Rz^?sbGw$)P5ei zit3xK&qcVZf<$;LEVjP9Hv>$R{21BB(RWYP=&ET#>261Eo>6>^@9*1%OuxK!tX*p!$9zOI$r28rMGAddqEon-3remAlYOiX7 zEXkY;ju!N z;VWCjdc1|I97lM60UKERecI2n?P4@q3&HS_euzTUMFOF1t{w7h#>&GrjhTxoRON-#Zl(GUiA77b?< z>tq%){z}(_fnAobv%>5mzfqCS z$TGX670dZ1G;~mW>;1ciF=&c3_L(KHcpy-Es7OMBpcL1Fk_33U%GPJ~^(E0WAh-Ja zbdTR3A8YFuEyLgwkE6u#d zPkWbkzUuwCA9c-9bPf1oj!AUQy}yZI=%RvFSLXSuoj){RwCDd_#4xm44fOXH7-j&b zgUpL!T2pgNOAjO^q|jW4CTYBw)(34>>|O*wKG$Inke<=NKp3lnP!N&#d(doQL5Tbe zb+?kab{o%94Ibb^Y8)bFK!?#XB00I8t7LWteCL3;_I;7=iIqNLtrJv}w` zMDiT&gomIJp1iEb$)7L)@m~NON6kOdaY6P8u{vA?`suj1<~9VXKU*F)`Qr(kkp51` zs4rSrAi7m#QS*@K^!YaMo#?281PrBu9<(KZN5apdRfmwqDKGQW~%3&q zL33|8sJrp%%H$+o)C-*eI&KTX7hTh?Gzf^BhbMxBfrO8^zS%BfR)z&tjs>@m)q58+AJlk|Uz zTJQc9wYc~3^>69A`sawa@*e+|L5k1{Hy;1fx8{2uCrCK&&-Ov?%z264-EU(V&#}S3 zyCfH#dbfhF-l%e7%?Fjp+Jy3Eu-^6;pbSMjNL~H=|AT5|J0(Iw(A-yWIt3R5?VOGx&M!_HxH-s z-QR{6B140rC`6PYLZxKN)S{vk8Ol_l2oWOl5DJAPNtsfTIb4OKmwBdU3Mj z9sg)cB-H%gxa3w0gc@6Z6!@uFsq2`!?z=QDO{>uC;yX%ANS#Uia)P z2TEJDw6kyIzN-uNb~N(Q%i>z1T3!&4afdE-SH?lo_PGY^!IC! zx7M%+U=rsBc^sy*80I?TTi`YTzskhu7=vx)5K|)fVavS?22H#k(X|q1PoKs-WTrja z?0#Ti+lB>re#AK3^)FtTs*d|R4YnlQPqDFD+_(YvtrG-~9mOV^^ODsu8@!o@$F}ZQ z6%!U7SrC?(wweg zf5&QmO{cE2ub?;r>kS}FfcZba4MGpFsrRT=n*tf`F0~jn9f5GbcZ28Dw=u`t4s;SO z>-d+^ASjm5>t%60-bx`Gwa0vyQ*PS0Iw^KH$DTlGM_lq1!V@9BI0DgaC|; z%YYk~pFb80+dEH47|F1(HRZK1H?M?C#n-QoD)MCO(B_8uD}56I1|`Hq7y+8EL!-if zHf9AH1HY!@tflK1lMC|@B zx5%E>u}y_~FI#u)ZwwJ6V`{n)V=$4xU*I@_L$xol=@i+q;FyfeGPWSlP4L1J!8?*T zVD5dgg_h;i@vm4FYcq-R8q4O6r_P@bd)G3BS`j`Y`1v3Mf0g5x<*H*4D};{{O_5Ov z{IG7iI01S9IS4cy=b~{*C~`S6GKp59ZTcqkC0M@q7F;MF)8PU66mjo-=feA_#(P4ANrpF2ydrzE z1T!5Vvfah9LxmZ3U3kiPfcCRvgKH$)n3aKce}=?qyg1Rc0W*lU6Ah~yU}RUH}o zlw{;G#24HLU+QPzoWbP*vZAdV5~*;%f>0K9g1qHR%_K}cept^#^oo(2A_8QN96j1< zkpsa6_#ZrAwZK#YhfJ?CVb&{e!{n;6tsFzu?8)b6yv+E|Jp1hUwW5xNiJ@FK^+ITP zxWlK-M_(l-o`uOeMu#X=$cM3I0y1?d{Q7^J;eF_=+xK}JrIX~w>e7+JS)`c04;-Zx zd1rmh)GRSeAi2bPC)y`|+~c*8G{}KIA7@8(Z7r1P`-O!$@P1RH?S&qUe2qc`!>>hAlG+kVlFeb(V{5bb5N@^PN9~6XKM=Z2(YAY#~ zVRlPTPmk(iyT{gcL6;mo_hxO~Q!)wT)YOwiaVfv}I}G;#!!u;Rn*#a-L24Mi%M@I2 zfG>^1urE3|VL);m!^&znl3-MLJ@W!^K=7@Wpzh9u1UuyNPAOXC*R5?TR5?qwVtuH$ z?ag!H?E?Ip;^J+RJ`G2p$J0HxeTnNEU~Ut)%XHlT2K3ip6B*r~@CWDYbjkX1$%{^W zS)$43=P@y&-1XfkEO2x5w#9!$m4-c%^_{p3@u#3^4(-lJety^EedmkUmMn)VVAdp| zs9=qeB^n5Zj;g7Z`b(fnP{99fbn68<-(vmkqfdS34#r1|>QIpCxpT~V-_KqB?efUG zwZep!7$nVb0@i;>Z@1$e4Z&u0Nm^#<4G@$Q4Y&c8+z`gct9r+eQ!yn`Z?5?Jy=haS z8||^cHUNJLw|Ttod6lx;9W&ez6HxJQ3%x>TpL>_HBE?DjY=7KNmIJ;7_tyo}rwu15 z3XO_s-R84TPbCn2Kq++``h_ClxoecNOgsCUUfuW)Xl;l=(C&xct?Z^0Zm1dd5Uh`F zNgIx3v@nM1y&P$Gen1Bf!f`NgFfTdh$3^*Sao9zp^`Mu{_3QgYL|{1pAO_3-v$ItT zIarc=k(L-zF}7`R!a&nC-1}&orhi}Mz@B&>~-7HvcIP?%A0$XRKbD&=e;m z{6S}Z42_$Eg9B)Us8Rf=ATK z@0!k+=WTs)yPyjnh5H>XK}8y5qf{Q&C2RcW%fEpbW;eUf z`5CcPmdY52N-TGow>R^-{%?SLG?C=0BosPCMMZ-(?}7NGa?hdHReU2C@mZeM=n=tiz{t-uyWO~p z+H1#g(pHKosmWCOV-?duHD}15r=!%xR7K8Qi`F~$-Y{lq$>rXs7Y!TEZani~D|wcf zKbA1)sif=L_l5y{P*~4K&whf-d2dTmoWAw@Kfo749K=Y*boRJ?jHQ+<6osmL-m*_g z`&9N9iF2N?m7wZOM~mkq6!hlEaE%p*J@JWQID5tzT{O&?9r$yDP!C{SOuZAYd7bxd z>1gujl+_HzB00$})1aeT+HC>&nZ~HWcGW%ECLfnnu1>}d7ibiVAFBWauZ1}@u6efK z>dR*}3(p0l^rWP?_8cX76(1g-vJ`KWzT_+D!mdBcJ?5GbB1Ru~nplSPz0^k77Rls7 z&j)vFchekc;UEX;jG5aX{r87s)7?0lfWP|$>fFwfQAhzU4Ktg>_ibk_P5I7Sk@DvD zPAA?&e4DWg;O!%S*hs23yVm10P#8InIqlgeoVd-UmuZh}I9Xk3J7)Q5(aH0>NGwS# z;QrC9AoU5wFsrrelc<}bw`Aj}5rZ=C6iY94XrJrs&~??R5WO;D*8gvyxSWRo_H-R% z`HcSlYx|7N+I9(5*aqvY^G$Fk8y3~i2Iy!g#4<}{D<}J zy7clLzgC5-FtEgYbf~6jV0yOSn|xef|GC}T*H@|==&$5;h9Ag(P$VTh5FL3#@RdCI z_w-_0s)FCm_XfwD?7m&g-c8#uxRo>`L)*K2G)QHS`-QtzeShDcJ*3F^ec0ZJG@7m< zU{S>7nL5tL%@n}yJs|V`M1wiCk4Dpv-#4YBQG|(#s;_mLw(C`ZVxxCsV2}DmPh>nZ zTl++*3kY{4K3oGYAMbHyrRV8)pt~e78m{WjW#;BeAiUX^gFU0Q`WKAY(tOu2sl)%O zv2C&YYQUbdF~-%UxU7`AeC6{fj^ zbG4@tAv51=Vn~cyoc2G3G#u-66Qr-qP|UDr*0Y`}miR&iUI*M>pygsXA%n*uhrPG<2u< zc5na|@7z8>>*0($0Y~E&@vR&U9d*6wH&Zd@7(2hU(8j6AXnjczsQMBWYLe08{O7hv zsAy$0Y`ja6;>6oH{9zMSssvTWFaI|<8qNLnj8{n4IfSby6xR9lkE^Q{rC&Zle*H?Z zG1pFo9Xqnu6pzhkRUIOvHrYxP%0$rsVSh<(1 z_1E^4)iNl8q2ppGmBI2b@;^<=Xc<&4io8M8kQnw57qQRlsQCpMMFFrtFfw9yl z_8otrk#IFE>37(z6s|M+nCI;D2geG1t5!$sHf}+3h{g=5{wy_H=6y0vcUy5ifAJ59 zuKx22+CjQGG#SsIdc;+8V|gYSQsh-aLR$OVSAoZcI84t{ADSGiuAE(qYE-qu>sKVt zK_cC11w&FQ7~U~g^MXJ01P4|fvLcM!({(swRRO$KofO@4HjF# zTVwJ39e_6Sj-a@?URDhX2%mba^nvlwNNHZ+3g#9TS#4I0Hlf}dy*z~QKtp+Eo=`+& zZNBa%hcYvPj)fl(ZaqqMFnWizOL7XqSV{R{(bUnA z+-xBgJkn=0+x{nR9ee#`m^E*Z=5`m*H50_6TF9a@#`+E4_ojg`X$HFt6Q0y=i@G)=5K;x^f(#HqKGMT9GCBxshIoQ7+rb1O9i0e)iNckyF9B-#zhSW}d*MY2(F5VFR983g?%u%IrWrBf z^^w?UG;vEh0F?n_H>Z=7kA}F_Z_>+)YGl@zp2qNytk6138Vo^cmC-^rU6Ex<`W_#5 zgekP5@2^V{lav6KQTfmVnNfiV1Us+i}dkw;=otLW47B-oyNskk3!}{Fi~E4Fu9mho(fCR{ zAA>*Jlh_jdXzw+&6bl#T9q$6uY}#yT-pv%oF98+w1%Xfi5YEKq+AJ{?8MP zjjkapf$)kstiOh-sIZ7gG^|WvXmU$>7gIodK4xiXOrXqK?^ z_O^nQA+bSyazgWO{F~t#DQd+dfMJGC5E~yiK+HN;?^fmgUac2bUh@6z2HWNaq<1?J z{NVhYFh>IZGIb0ieKJU}e`I!TsUXC76Yw6#8-szVkaq9g#s8(nh<5%TEylg^X7IaI z$ciQ#faidz&6LSB^?#}^kWctOs*73$Pj8`_-quqzM&%8SoC@HzC;ai# zXN2dXM}Z@O0rKbGTRS2!WJ`nay-ymNn(;a*Vg;jFal%HxZojWNe|+M|e$d!A{nPEQ z@E_^HPG2Ye-xngeJ|$^Yjl5lKPTK42Y1+qhQn-O)*tqK}?y!2Z-C8;s-Od>MRRU{| zCCQ$Wq>!kzEj>&;^7PNc!lI%C@g7P(jQAFx_pJ0k(YHRhV-xxJEop350p>s;qPf63 zKqsr0HvUc*J)cp7nch!qz5jdxGH{?5Qvo%a+QEk)1`wboISr$2{@+OQ_Np zPJxfUt#saci)@%FL*YTZcqoeJrf_l$LsGc!2F6aWu=5(R&4QRcT|MQ-zvkV=R zz=MW0%u4^!k}9A?h+6x^y;eGRKYj-{cb#q2r=OD!id+Xa&I6RltpWRg3z-{W9zx@9c*8Gq7@|1{kbY-_2psxOVMz-2gGatmnZl z1#DjG*5En+CX2(*z!1&rbjO;EyR=Kr?P+vW$Hs0j;9sSsiM+X3PdQOEv`LWlKP89J zMN&@zuj6S=x2$(TM+7M1Jn6WUxZiIolq%;g%@&%+ZZ!d9%O1%l5CRCv9EIHuuO7^r z&sD=!=S+<3BIb7t?q!7CFVnJ-g7yDGdNHozkaKfF9Z?@|iwCBdlx5^dL%@^RNn{6Z z^lT5;!cP!%io*?nl^a>x)U6%WYT!j>D;XJ84r1bxXy&`8+ z0#6nYTVm5<^`*5&<4nkdV1QAG;}Py`Ph!&|qA9K_k+yp5r#7u0OjtgdqeAOU&S$^-YGb6R_z`tenN%lGL9juQ?*fS;#;h<=EHbTngcA$Zo9Ye8;ALDR z5$cG~fqtXEzaQwR2S)l>KXlUiVlq_pzGXhW6^ABiq7~V{?K3a;kCGDf>H%58#$)=q zf7DLW?heZ1gU#%}@@Z)%IWw3yv*x;E>J)r`D-}s$f^f6}GP!GB3=uJ4UNnY4Z-GC% zo*%=+W$N7==v03}SJ;q)-2+6*sbhfap@1A#%y^2~KG0*4&p*HY11g`hz02-1ZJu_d zSzdBR75QN`*@w~()M}Z*wD2| zfr|7NJ%ubI6S41Rj69I`dB^Mb=KeVvBZ-YM{_GqanHJQf8MZ8*8Foc8|IsQ3R!@>A z+$SnycH*y!o}}&dKB+_19@kJ{fHiOIduUQRt=9ZN)jUA}V3LC0`@5=$(EFF^TvTjk zJxdS(SoOdE)!e&Lik4tb%Zm9k35Pypj1XKuC?+PRX$H7S2*eT%woK-k2OlN8ZeaVv z7y44+TB{CCszf)8IkGS%Ipyr|R_=}5&?!Z+0x#`#<>7B6lE(ICo|!M759ewa8F96X zqsc0zPU6;jVFOxC?hSqTjdfXbA2O{Z6x~Ro2^UIjJM_(DPaDBqf+T(7oj8GtBSnPF zrTZBLgVD?RBg_8&T7|pGqkovRD#p=DL56}jS;2Z)8;zd>{0$uRuX>2UPfk5VzKPSjQSFUNeOy|cd()VIvm#CGe zXfX-rM%^4&wUdjrfhHDM_5JU7RPnx7d!>wO{#qz<{3ID2-k}}eJ!YPqkr6T)iRajR z=hX~}C^rz|`W;0NF&>mg$`0lXo(rG2iPsI-Hi%jWctI`Q$l0z0em*QdNf>Gj z2F4GRazoi17l(Wmxw$qIIyyS?V;F3GW;qK*JP0Sc+S;>gZIu!)=SUtv$2zv;&o%qF z;s=vI*#353Q@2whQ!Om?l05KJnPlZj3Wot}5Ot>}-F~l-TQo*CjEC1Wbf3}?2=hP! zh`=He64pN?7vD@l){N46*{!%f{M#p45WD_gvT@G$oNn24!O%mKzyGeM1e%k$1&v$R zM7}_F#PM;O3OYx7`|OH79^M$7R&u^ZHs>sZtP0R%WC;)rF+)iFz4};5+dISzpXHq= zCdK!*a$hSM`vXpo&i~Mi%j{oxW)}&DP$Q)w>HV!<0 z)Ns5`+eu!PkHirCW&A3ooKNG(+Fv`UsEBm zZB*VkiT0n5SEAA&cnqlg7(u}NLZhIU)&f%0{B)f>bdZFKtggQn_g&}or!jkz?W;RJ~e2r6T9q z-U>j?uP4U8?dCaN&~}kHNSDgL6S3bT&>q8 zIW4W`j~(L1Vg_cHZc<&t*yWaVLF;=*ql~5@KPb?c#3=Fn3p(mZZ@K;(XaUE=4mW;lRTIIJNp;{ zyCOFOMNHQ*+Ee>sop+0kSLD{H{c_#wmN%|${px(5sarFv>*}y;nRKf9AO5|qnS1D> zCS`10V$@pYrBAB8f1P-_x@Mm;|Du-wciAj<-ap_fCr4*<1?4d=`c9k`0r)&K=3Z$TSo}`8Yi8Qxq)L1ATT&g z#gG7m9Gkl!#;yDKun7a57sD$R%@#92AB^O8)~#}l%3w`XgT z9=l;-YH)`qet&$6uJcWLdcUOl%Z8H^-wwjUzKyNmKQv^k@0k!7Ix{1zv7@8y-nDm^ zny=uELIEo^@y&|xybplVuR~zaPyUI33kK>bNiSeC^6EhY2r~^_sg*+G^BtScGrH$$hRWJ|dC2bVea5uV3HYHZAn%^|^ho;ETA#S*vJ&_0uuiQ!ZMbwFAC{2F z+FV=Bbb|b-GRn~+bhdt zCGOOq>-*nG#&5*`hh&T`Q!w<)bV^lh*)KoZf!MyjUl%y0;{w zJ?2ie>yOUSF>yt|&`j#vFTrb(WbR*L%-H$fhFj%0g_j+53v_V4gQs6^->j1J<Xi6-ESp!nG&lzx2+y@2Su=(Z}tvgN+&&?a5i~$1q?Ehu#Lah&z5iuA;v|B+B zGKPGFPx}Pf`*9gCz#PYs20}NHmM4gRKa$(I zgY?b>{H^MVT?zL87SYxggZuDje>?+;aqmNKw)i8yMtm0J=n@aff3soQGeZ=zOzl>= zmsW>$Uvv`O#ba_3ziPgOa1+Sj$>_ALc*k|l>k2REmj3##v9B~{$3%unMT(S>fQx># zTow+>B0wJPv72xD78Ls&jSKM4ubR`=t{mlHLXbv1&WsAc#+ z_Fp=co|M}CP|EAZI)0S@mmKg3CLrPLFsGiBPLcN_9B3bl672vR4Roipy~^Dsx1v-Z ze64@*YQZ$O!9a&w-fnm28r1pmwjw02ZW9XGij)m$-XR_IzrQSK<=UdT{+|n=?Nuzk z8?`=nSe2qsmMT`-gSK;x2rc^WUv$#~M<(>(!JvO2#RQ=?xk;fw+M4AT+{xx0qKRou z>}QL4?Gi;I||%q#`Kbg1`L14}Y1H6D|_=BCsE9hC_UYWq&OQ zN|%4PHa@DC5+c;!JDt`?6u0}KwfMYX%4?S=-8uZs!DsdSFM{kMXt;$GS3$Xb)OT>p zi`J*#EP`VE_4M^$;!?csht&G`LSu39r(3LdtYG96YSuDVf~g0!0#_+Rwx?)T_Z z8K&%RGND(7g+|;|NK{DUA-lZ{z0XxG!!k|_1n>EtNkvkAMDs4?JG&xVxzuE#9^))) zt|2<1A_hEO1qvf;x75QC!YRevjPEtjx>gs1ab3Whe+2%ps=cepSy^`Iep?OfgBr{^(T>4x2-?P4 z*D|P>+)x?A96Z9%u^pjn_V{mzOL*Lu501Vhdj!=W*eDzNOBo71Y29Z6+p79YTLblS z4wQcJSb?YSt^{GA1*b7`XML&nIoN;GU#d33s_3N)4<680NSAJc#LN;ZNLa2K<=^D# zEJ4m2JY=TeEYnls>4_;7s880`?Db>A67o&9lN@X7zVFO%dT{MX(i45+aL-tO1_(9{?wuTPkAL zR|eEWT);9l6m3NoFPxIAr)8PWL`%;CehI=V{&0uHWlB+~#Kbo4hbX^N`kSoK%Rbh*m#}%#KBmG#zlxxIV0z zZx!80OhRe5WwK~%Tv7@4r+K?cHnb>T`cKFHti=&~B1{l$6$L3YhHZDv-;$U0q}3=Z zQrwKTGL7|=T%zxN{_NRW&-$__k&B9PcOQT$B#@kqJVa=8j^EuB;Mjv*e((R6u^d>X z22{FldJz%A(z!^Bre`XhAGIU#5WuncBxgkc7FJZ?fRm_8gxZ-ovtAB$ZHrrXBzFg| z3TFJIBQe^8+GKUyEK7M=kF&z^fllr!P=u@?jB$c78~`LbHE0M=v~h@S--bfL#>lU+ z4OOL7u)QQ_vFNQ$iC|oxoO{1p_xyR5ztt4J*heu-+p&7&_fs{^)yRaUCT;Szqu)!M zn4jF)NK#HpOS{U!e%^rFp!V`~$xblnBm6;_C29jGY5bwq^;nDgTd+1?+}D%7R5#v} zx-|B{*NF-`z`0n^R56(y^#NDR-~cj1z%<7s?9NO4Oj$TCB+04 ztW@WU()nK84xAMGuy-97eFlDBrRjmlAXeV2*z_r9ciVl}4h{Pcg0l)XgGSL|Or#+I zleYgZ4tm+?$+Kd_Qo{Rr0CmcfC#<~eZr95SY<^@9=ZW9F%Fm<`r7iDSyRfzAqTQJG zzaa{tbU@~%+#nCB)b9$?cK(G-#H}LZ_!&6x__3`+8ZgM>kH-V9zD>N7ng^3AjsCs7 zVrXL{y7s8@4Zf77h&jb^;GzGI8|nR1E-5vouRprV#?gWluEXa7=>bn6&)iWEk+^AI3~se z&m19mZ;!zo1POD!NN6I|G8pHAf(+llJ9q9NXVXuz4uoAfIE_EI{!lgMXwR8vTpmb_ z#P%myOKfE24Ep|uB<=U?9-B-%@8sC=!I!eYW<`rWuN#^eYP{e5=2lX!4ll3L&aGhN z-23#ACUY8nfAefPU(P_PguMIkO}PiuiVtXNzL*XCknlWj64pnE-B1TEboQ)CSinPN zFaqTpE;1@E`afVZy{#5v=GE1MXH2xU!<&ZCV3pzE+&zX?IW@Hl=ia)!>-^3g$~kis zEApMUvkTg1x`#v<@6a}qrRfC)+unMyX=GlSTnhZtagK?RLgU>2xI4SFw&km`Deq=f zQd44XbnWS~dOrV&?)WC2S5|6si|*2q$Hb>ivm>L;)GY^wXs`2Fc+cO8$Sb|iDa&xo z%fH@SLi5dv0R_p>fJEj+7^5#^9?!SS0#AgZ>M3mw?4TFkv^j5Op}LB7oP*`h{L=mN z7Z-7$%eyVSjrQ5&%SegQsW=j?u&-L>|Ai6?1;$QUCuEB{YG3}`bdGXji2YruOa?=d zQabGxTIzGr=PlCHrZ?A@>Ql$Pefu^(zO2Da!1rOwhsULAzcu|#Se%~MI8OaOr9M>S z@te#`Dp_;X%Q%`dN!w>L=)C-ZOuClsjLL<^=Vx*OqY~})a6D_+9Kq7ax~I4Z&TlX= zBZNJ8uSl|}E7OC6ofuVnk3~N$tuC*9{&|anl@=SRFi7lJSjx0E-KXBOv2tU+*(^#Y zr+qgV?G0DkMt?6x_{b6Mj8?TH9-}9cROw1DA6PFI%lWf$vF?1Iar`QYn0l?RO{{Y= z3GnzjWnq&Py_oeXHPs5EYjCCn1loy@*vFkGTyF#%K&eF`yT-)l0XZG&xl>5Diuik4JmgOLp60t86Mxm8HnrN{z`RYtr~VA9+K>n5g+yQQSs>4>$}pJ_ct8ZO9@@iHQKFjS?s z{sB`|y?=B|wiS9>9TpyKk8Mdd`FizHtI^Z4mRQ%3v^JI#ER!dF-S@5K>%+@PYjhi^hzbQArq#C`bi zOr&K{uk87Gef^Zy5&fJDYn7ikw z*s){LMe^Ph?2)IfvfIB?%+eKpt&7;cWzD%br$l#xiz55AfZJL#6H*-ja*wrT9^Y?0 zYjW}D)&c(Ys}CkWx99jCO?>_O%dWL*D+!LeX=}Tyxq9tRlD8N8?NTx{zF0}*@o<5c z8CrivhG#?EhT@lDRif-|rb>Z*p&4yF_~Y>i6fF zpu6fpU-d}9W>Gn))Ari&hXr)GAt3U0z6f%G5!}RY-@8Fi#OyG;bIgEbt@|%zH)$q) zZ}u*|mW}d>;%1nWQw+xYF#XzV=guvRd?4#MKIT)FO_e(32w(1;tTL@mJF=L>I{x;L zMf9HTs%OvGThuP?XZ7rrY}TR`*w(T`K|i zGS=NMS$HTm<7I|LF`>h0xhvpyKEEol0}y7KP5}AWmRJkNt18dsnzsa27-#0!g-3Qh z$v-8FNwf7-PI>w_Y@iw(zijWhGAsE%$1O5BpQKkLomn3R=d#DD3D|%{`6rnp!|YnE zGml+(F=Gna#*u-(ax)4A*uFx+70p=s2k_#uhqh4o_)UGC^XE-6FBBGXO5W3{&b+1& z-1lQ|3^mB`Igi(fB5%a&y&f7l%Ob=ar&f*k$ z^421EI&^s3AM0_S*c*hQXeuM~tMHS<84?!jmv!EVh|-Ot(`WX!&&R6QBXg~c`d}UgOl%$j}HMj9xctpm1 z|A#{1Bu({!9LIE)FLkY!f6D?=R}g4R7d=O8UyZgJ426j%B9px8d;33=K5Gu}Pad45 zbE~R~@-SKcsOHUn9BreaVf68P)y%{hxTyHJ+hgvSorVSz$KKJAmyeL)lPIxQ^OA;D zlK4<{HRXrT{d|d9Iy;(K^}AKo2i zv+0uzFJf_ev3RV$Bw%}g&PNUE#1PV(%BszS>=6-Bl)c~D@8t4Ll8l_kUk9AB6cXM{ zNXv^{X7_~1Hnx<~@o4L%D&0aUX1}z_@j-_g3nwFe z+^|wW(wD*Q8lEqK^~%eLZ$eq|%7f`hfI+g=tTA^@{m86U@1xWF4HnxYbn9tOWGP*> zF1}>2`u(q2Q(%YN7n0}f{kqe}e?UJ&@MLn$JzgA8{?)kgCkT7J>PzpFsksy)2CWyB z-xGyL^hhUP{&4Aa5&&x=cq5tu*%eU`pc`K%pv^v^=~piIol3d zE+gy;v^=!}sXPKt+OrpnKrP>#Hm_N=ZR)jHZug6Z)S8mLB8JK5%zb=FrUQ>#BlnL< z<>Jt&6h&*wOUP!8~BB;X!JnW6UvI zh2Jl?1{?puOB@5!wdjp|iRU`4K{?SNYU9l&bDLR)q?xpTza*u?4Mo4qR2_F)t^zpt zN=h*+(O$uVzMvRy{^6x-CoNrJM%{MYJ&%Lf_Xod8^$adajWyOqyp#9ZIKd6mQcgmX z-)UVCBrVN^AG2!<-z3+Wlf8y*lv{U8WHAUoj;Yx^$n^CqR{1RtTn6QCILdD~P3G5e zv3w5A#ghXmMZdGIafj15oPD#k&nfGy=?39Mvu%0uG@<_bOJ8eH8IUm3xR`(Q%5uml zTI>vF@f*5d(isl=T^x*-r{UVnypSdC?0sy6WdZC@(3Pa+cPPbm171pne z_t}SAFY>t4WGmHXvJ`75QQF*N#cwJ$5`J>p%;zWS3PU~hNIZ<83&fg>_)>b`pq-L? zmqv+|W_zUUMBDBw%V5_=ac{zMw=b_Q9DP#C&^PSvpnIw}N0DjR>j0@d>H49JrP{dx z@v*Q{svVCRb1rwEL>&x&loL*Rio|u#pTL7II80+SnssoJ#QVwkbNrI?sN1hQlEEgO znC|EgY&=fOqh$I1hniUg6{1XwjJ7HyJ^q?;VBPI_gHHvi_l8^li%+WDyS!2vu1av& zL|i7xN}4V7el{n87=#V%ie*3X5I(Q|d(zxgVs^?5g$DdvH`7y{3%hhB`$CbDd)pki zOxsy=Z_k=ww@3qMrSs6zZPc#x(W9j~``DBtCE|v6yFSzJ>&#vDy+?6iM~$Cyvm+gi z*M-kTvr{#CL6oH!5rO`7Ib#nC@ntWFTV~zp$E9$K%t@MbYk%(+oBq-2CFZQ}2kCff zbu~0T($mWzWnkTzdxDj3(!1-|s<8_t_QdV4`Kv0k^bu3T^RZ)qRsHfGIMzOkd4g5Q zvx^cdDJ@BKMpU);lgWh_qXxwjfMOiiurh zm>>46memnFRehP-wZ=psfAPzL#-{>GK`}8x20!L{6Cdm=`R|iI?w>&ce#-CwR#1PY zuzWT^)#Qd%?15;!1VEsPLSb zk)WmLfuO>L*ecb8ZKYtF&Q0{#%=h805Ho72VAo#(0=^w2u2~xalIrA=mq(rhiJF%{hn8Od0@l<))20L}uT^_c)OP;xFctjAia@+ zzO8YGvfG3!^NI;5B<0KU$yRDe`=I!mHqePmK`)(FE{2Jxx4yNf^QI~q2~LrmhfZdtRSo( z+KhAba`Z$hY|-UfU9iXO6*ffZc1iH)(SGrx9%p=w?GGG7-*1{|Xf(jT(Qz!NHMw~h zd5SQX6p)fyRQz-6X9;k*R=S@iDhP zZCeHC1WzOQzM+~y36ZDr^7_L46|geVSC1h)K{M$=U?2>reqk%~)g>ec0c6U!`1m`0 zl0hm>2Z)WFDER;#y*P(J$1yC@Z5@;W;>2ds#@E-lZAR4En~iyavWM$RYHIU7+syl+ z)x3LrotR?=+Rxq0d?&K+_MWnuGnUJB3@#6z^F7}6{XT+)1h}|rz9Q<-1-06qTD*X@ zM?F@Yh!TP|Hwu)hGn6?tJ#tsDUmOEIaIWMJ-Xe@$))7O`C1tl)Qc_YtV4&%&{F&3I z3pFPiAn*7VEu+gHM)4G93XuPcWk06+z&!#I*bgcmkZHo#2r?EzZ46`dl;)1N&#FwH zAvF_wM}p?{%a?a|5--%*rw6XUr~^FShK2?h=#{|u0t#?~Ml1B==BLes2>>bbv;@8d zkK}~pAY;X$bkr*=Xr-{z?1-?uyeD|27@0##jAj)0p(mUW@YZ9Z;Ib$RH>?U6pJ)kf_af{{ z^z+n3Bl3nN@sIZ(Jdg#ZjS(3je2?|j+h~^Xgyu*}lW<&m{NxGBwl{!4&UkskCmtks z!SJtRoq24mtTA%#AKtyYg>gOU$^MIFb1v|2lgF5bBovO+I0pdT%v%(r^&k&BI>DnU)MJ^S~ zBD_4kU|cWDG(a~N9*w2xL0fkV$FHkX3v$F2h| zaR(-bz()N6U>eCb%)SOdseXw$vCyg-7!ay?o2$^ghh+iPX8T1oG^vx!3O zy|1TMr0d>E<50=Nf}6aG^S^4{m>grGkIQ{+J@dOb_0Ht2huGqv>Uj<*%0XtUL(;n2 zbDB~Hst*W?=L3Sm$3!D#CN^vce~kg9i_i_CN9bW(Tv3hfklj-K@ro zhZccDeIp6W&TDpCfyLPcgzq9J@#qg`CMMfO=Kz-cLs#~sH(zFQ$~)OhLB3mV`sW&@ z;923BiCsochp80E4@x3bjPwoXVKW4;rPm1RNZj{VAZnLx;El%c@h;NNx?T6bKh`V{pC%C9D64<(Cruv z_6Xbw7q8u}9(iQ&zQZ!yQvQSGn?#gjoswYInz~!}dZ#_7&&Sf1Fx@0m=2HdZcH8tW zowJ@OMT}Ad(EsQ|xDN9g?06^z}78nr0RlB+(T%m}AT7dvW|8_7@OWm*yux zpxTsq!K%W2OkV^u73k^Cs;gr}H#t3xjU!6V-32#_qoo}W02R@*2mizr3=Ec4Hm&Mq z>&Z&IX4I`jM&<09M zN~~SNLk7A436e+K+bblM2Ro4F6o41~ZMBEmQeAdM)`Qdh)6>(?ta`;6?kO1HuETR|0qYyi#E6FnD+lwa48np8{kqMCG`u^zCIa1QLmB7_ zEh9py73-xXECHwV3=+yL?!0~&v2b{Zyd&?)R%E)2&VR& z(^(jKLp6{|b#wa6syn<|iC7{#`m5+=Zu(xC1gi;#HE@}sAaaCB&}|holAI(Mt{)Fd z4@8az7z22dgOatiw7?7>z#0xcnHK*BdQ&Wa?eL`Ug}1oNvGeEI1ux#$h6n_Af4Y` z_t@|4iNSZC0srB{@1kw=80gYYM=(1@ewRutX7=n+NKm4V<4t3f<*pZ_L|(j1#3Rqn z)#DerzvBx}`bRM;jjHd+Pp@CfUED2Or>ms}HEEQJh>fR~Vpm@R{bsMIAA!jhecB^= zkxHWP-M=WH56jTctNphFCc+F3Cp&bMhoCKLkv`_OaMR#)Z?nZL#>9S0sXl2368G7U zwq>fk$Le`WQHU{YkotTXgV+Q1Bg42YmRFqSq}8YKL@5qGYZpau4@`kXD+JX0TIg1A zl)z#LA4VveVwnBz-bKjOv~lJFzS1nV%yHbZ#{y*wY%U=bMl_iKv_usC<-Z{M1Y;t6 zU=fA825ku6Boh-;V6~*RW4wy5Z47s~ea z)47VH-a~MM^1JQBs3e_^IlFp-CKM-UA(8~&&4k0}&Ycf{d2kaDEC#1>wS zvF>w`4>O^#f!C8^P{(hay@Mko%g8_>xF)HsFkUdsv1rDfO3_RL&!?+wa?~NJKl5+l z=GbrJ5WC{ujz%!M1Rcbt>r&J$I>6^RfLjMiAH`mNeu=0w9wbSF=`LHxjY4B}xg!rm zaCR?EtsN)*S)TMZO`t?7yMdG=(E0;~5(}`cGELWoJiI1e_6#8W>wlp!sIc~FO}&Vb#7I1ejwhN^|J+8e#?F$OjhQy<&Lq2>4w+Xn!V|}yUW+g>I(6CW zTG>-0(u~V08nj>a_Do9tES08N`0C8l;hVk8pd+r5kQkPiN0>BR$8>ac;iP^OhNIYU z@jzv9Qb6&_t^?{h&XpwfL|0IYR##WCdvh@|zD1uGdU6JJ_1oqyy)xo8yDwHudl_XK zD%O&pcR8TQ1`D2ph2@h+61+Qa{K#kWy0Cxl?_c22_=+(8Gg;M10q*Y|C}U${w(REN zc>(iozoL#>?8fMW7nYY15`HxK3)c{U|2dN@S9t2CKYsjJ^Lb)}(uodGp^A86Fc zl?hiSJ&qmcqu=Khb|TxEgL^yM&9OJuBnaFx4r^dG_%7_N(!H+&aWxy?KQ6T#or{xr zYe^}&r8H(W7*O?(V<~I=4mdo^BG`C*ZyBVr6_I)0_dm1r4Jy-$4q|rlQ_2L>0f*)Z z6%{Tyw*|tfC+QYQ14KJ?s}2580(^Wm(K1KnRxiX>!J2?dI6O48!7W$Wpghg&g_(Py z-#*q2R%+8!5_QlB_vksK6xz5HMorA>j&Aa_YD)mx0_ z@iX&o9;C$fEcK%4G6ok&TzvMIk2zHJYTiD-qT^-S-8@Tyg?HkUrz80?8*WVOzN!7! zy=-ZA%dyZ$5s{Jaq2a>&FEws}q1^@$<=fB>wwU)}VhS_++Y%S$4;;9Odq+CWe;%VV zj(Pgtq{J8tEpZ{CKq!F~cB_U`bS}QfIiX;GK)e za3D+zx#isQe?GzgA>pQFn=oBGivT#Zg5ne`8*N86#5jZ%yX73u(F>xPzcAL`THO5X z7P<>GFEph%6u;%Z-LQsz5)J61lY8~jB%mutcZM1l>%0fe(=#c(JuXFSQ#%hm7kHNd z_;7evi)F-mGrRI8hXyAsD_O3d}$$m*Rb2HED<{8kOYHDiA zgX?1Qd@`T!(Td9lBySwLa}6V-n1L>fLa*h|pQa1jtsL)N#;i~H!hY7<{`Xe*Ahj*5 z>i6&k(V83jy1K0$&eqDjp_=WDYXkgYRX96E^Y6o*=##tw)F;A~-{s1<^R#gkw_Q?9 z(Reraq2siBLPiMx+xx}5TT3Tg>;50o-aDMj|L+@r8)cRi$|l(>GrJFx?2(b|gzUX% zcFIh$6Oz4Gb_faCduQ*xxu5So-|u~0_wV1|c}NZi&h;A4@fgwpFRK z=|C$2+;XSQanjohTHNc+3pjTLQ@5W$#9(zfFdFsTOAYgi+nO)}?2Y&FHd($mRKQn~ zBG`ei$=G!sF~m4+j159}**^3+1ID1*wthOYps~V6+Q6_p3!si*^I9GQl;HA8td8+xFRA#8@KD z`saMS=J}P)CE6g~d*Nt!V8HWVD6_noJrW5$s z6dsBjhHAj~ET>fN;!N7sh`=|d&3+_z_}$7T>DTMqUSp8L~LPqr+@^TI^uyn+qjvd<#^#!mimpw%RKqD4rH~}`g{KK8Q8`_ z%s=2H0NpYyLdgN=yv$brOydPa%}5X%GPk@9fN@B^$#35tDUtyEQOw>G=+%3}^8s9# z&Ek={RPJC!E%yuV_>maQG-m%U3C^e|y8V1nOI9MBb5d0!FGN{H7*2lKA=K~OtJjq{ zcMtlI^oyCbfSG+D_|XaKM{bMXL9q>J$FPM1m(QY23v|Pu;p71CC^$R;YIo-4B~fG? zK)-86dIMV>4+u&)Ih8+UaoSM5`S!Pi9z#rdZR>~~%oO-`TpX!~*s?Zsi1Wn5WHZgH zBqAo6Z(+yh4W@TNxQr4aMK>#G3F7UnGR7>~W$ewv3JgRZ6|8Y`@81kjHkp8dmrLf3 zFkQTScK<8XIhI}3RrwDuI<5`lxjZcd60tddqD}IU&qY?SJi{8i-;2dWo70mM!DUDG zQ0V4M=WEnR-pznQqyDGx%cqsfAO{8IBN#lRce!kAFmCRcRf8!>_`H_Sli@kH%ejHu zgkZ2dw7Ge6*a3Rjwrib!idmBWX=A8E!o?@Tp(Mz_3jxUx2mn5XXyVSDllHq2MK9@} zgBcPgDTY#oEy9`HnlgYYEpLk&Ly^HqcljR2oxLu9wBw)#YhyEB)~6Z7_VcIL?zO;U zM~U?OBO&!x+?U*jyvlAvue9S7${L`$Tz2wUFrSWogD|v((wgYmi%-H6G}sTq9a3Gv zclit*tui$DA_Cd`#+1HI3m&|bWD#0y)_Yf$%}VgB`B-I$^{f&x{Y7v2UXVmuw0BM` zkq?y9t);%-`!5!N^IGE++AD##>()nVTzTXTg%Rd`BYM+U?=87*BSB-3T>SVatA^#U zGE#&#mW}el1y2Xsv045n~hsbi{2~!)SBF-F)@~I}pS|hsk zI&^HPTcmC7ZFc9=7;%JOx3OXg=d(%;LL->IB)J--+r6 zplly*i1&O&Lo4&s<=|k5Ge4Tw-zoKS3QR7D!saLI)15-pUTREKfjD0P<2F2wkN)FD}ov5Z_!}o`%Uv zf+kwtCwxLz0WHv0#0-s=%|QI@UPQrMr)~{uV!Vi_6*>6m{`f+40isl0ZZ|R747Hyf z*{Rl&U(8wAld`^g09>*h9W}z^1hZ@nPVpfZZSnkGm|_{KU+cmqjK9ayYe8bXa(y z=mt#L{O>j7)a|eIW)ZSs79~8g&yw|aW_8`Kqsb^JOhWk`C;eW4Bg6OGuJJk5ZmNYX z23$o;wR$Y^T9#KfTA7uKY%%6&HO16E(=OecSydBtE_$8V;JfJZeFfRU>ce&E7%lh% z0W4As9d;@x@e|&;<92!O1{QZ@WbV*O_JR8eR7&L#WAb@lt zj%knsf-1Zmycvi)_-^CEZ%hIX61<6^A<4n9=%$z6i$uR!*4CxJG%+c8{r%$GZ?ur` zkgj$`3}t72am%j^#0UKm8+qpCHK46u;J) z9}k-3JV74aDRf<)pAMBNIXm;SGG!hli%ez#gt6-DX?Cof(gFhW z&aF0Y5qlcluMW-cywuGFeWAbvMn4Zkr6pt-TNde1XpYR~NZo@EQwzoI%|iNwwQ_zV zWQ3yB^wL~@hoT!1xNK4SKRbasgY*7>UX*~jV;!Ns{xpalW}FCVl6@SGhKpr?@W2%+ zyqcmR20(uU5|+7}*BRlr->ehdep`gP)Blvw-@|zLut6p}ZbIjI+`i_QQRCR3Er|Cl zqc>vCtjEs*Kj*x$-yRUDC@C{TJXXOL|3kx<6q$Wjnrhu}4Gu(2;{W>m)eu4MyJ-g+ ztFb@cH-+L1ehi?n4sRCZaa)g9Y`|8XuWb+rg`L`i$>7wBOaB-pbFM+%Izrl%G&K6{ z76Qn4Wkbi``C;JSA!CpI`O8GDBbx$27y97AeSVLgSLscj=e8zuP6s!31*Z6I#}^w= zkgf}mMJax)ONII&R%c+2BTD`xaPP;AiV?~df5K}hI{3_EBNSmZUZF*#1)&97THp96a z8a{B`W>1IZ>lNIW&u^O7Vt2GL-2RdfflR1>2Zup@hgNY>T9DlCOJCpV%ESVlA)&Cq zDzp(ibP64odJs&qKL@0b1M$|HLLW^1pgx|Cf1Hv`Q)aD@5M_I4OyvvJ7i7V!;4RF6 z9f0MPzWymtRemO9h!B~lCXY#Ul-MABrt4W>(q}6o$Ve;pJSx4E4g*ofU_q1lPH|DhV=trTn{|WSCfWxwPVAa{u z8-V|P`QX6eJM(kF>r*DB#X}yUQW>fp>(tNC?1BGFk#}QVTi27SF$L|FA{38BY$J7N3?K<*4&`k zA{Y(}e7b$)R&mc=M_=Q3V<|?0FIHR3$deNRu@Tf=6!Bv4`?8DFCs5k?#PY|Ap(D2B zhR}ZZB5^uCQcRTZpMzYdb^9^j z10*6Vt9JEGPyfrkZnL!An>YvW)>+h65gADwOzgQ%-=CoTO6Ad^pF<$6BR+0N{2eKh zShb9VUp`^bEMy>Bu#dA8!I5AVrFbW=cA+M{TaelJ@g-k0-}geD>XN3r zcz>JoXi!xD`svd{rqY*x=DGb@f50 z$tOAMAx{VQ)UzK!;!0rQ=h6l!YQlT_PtXlYwMvhYQ5r+5ypQyI^e$#LlCRf=#scuU zfO7E0Lnv;72-m`AS1ek}#G=~jynL+Mp=vBo<)ajqX)b_yI}LA^DhhACc1v%eyV(fB zJ+Bm8;bblGFoC45)+IRoYr_37xQu6PHQFcaUK1PrINIAHLixm1Xupvt9FP!WGH~=6 zRYjYU7gHQayb8QRR69p;K)2(f_mW#_A`cVRoJ?k_|T{!QDE6bWtA zA_rs|`Vyc`IgX`0^Mbl{k8iK=QB|vk4zKN%E%B8Hpi~yiJ!C}yeI7cRHm-R zy(f3njq^2N_q{kff`Dc0B>|CyP#)N=YnTn*+6QqHh8Qg0F}d!s%w%Sh&c>b!?ep#xb>rzIiN#;~ubYJQ+rFdeF%%jaEsw740tD0^kZk9Y5Ewu)k#AU^ zCpC^+R)F_2g0Q%~Q*QBVdjj#04JIorI*Y&d+%1T4s3=;0B8?qk_gx%Cq9c2xuxi^n zI;zXYA|=>NuN8k+sQJx9Bt6-VoyEUN%KvlV4MAZS;geQGg_WQ^3o}Ne0uRw>F2MSo z-NDB?JRjCL;#yCC?J7ApH^H7gL~Wh!@AGb{8)U86@y{|fa=YTQ>R(73=|GAD=z)Cg z@}Kcp3~=KjM1ac4GDPKU_}EzEfNU}PORtuRA$G51IiFPDYOsm;Eq3%4(Kvq0C+9uu z=Doemkwzef04S>G@^4zrYx0;YNTuUvO`V(>fi+bXS0Y3McmJXPfLf$w#i+ETUtUl7 zg#L3Y4r9qKlKLq36PaO$!_M2b0y2nbcp{BIxeMx>v&K2@w#j6cbO^}5T*xS|A*&xa znu^kE5<+At{h>OZex}%>P*>-zl8IcU1tGT&{xZDwEN!9mx4!I5U2=`D4w_N+FUArK z)~j!8?_+wrC(Db0rhx?*_ERWiyX^jb$V#xrwuOd=Q*mc_H)h;IR^l?nC&?=9#Fg?%9X}syTz(&Soy{Bx-I?k|L3F3GpT9T~s?|c@dl}&sX!9N~3AqhVpcGj>A zg&9c>Qbdzt1?n0|8!4~II7q?}wb06kWw`(o9&yya$;Ra8JL??mG)v!3mdLSJfcv+U za-pbuLl2*P<7(jbY4|=k2>>L({>g3R`mqE}c}f-S%4C6<(t#UPLr&1_C6NTxS|lG|}ZSSGWQSgk*Ie%B_~7Y*Sz) zdz3W>AJj=GKIw%p1v?F= zPL|Yl@F%4GCZ%_LrSlEaopi#9LOto+i+7L2DP7cWqg<|5>L+rL*da7vo$|hL|Icm9 zTHB5Plk_%!=kA=8eKD@D)TrT)MxMLZ^*Li@P>e5}`?O6-D#8}}Q1BvNET|V+6|xQY z)cTldWpMgJ;*D(E{hdLyn5-JEC)ah$OMd%IJkk7x>XTimKUb6Ncr}?(Kf_$_3 zg7f;w>~{mW<4DCI7*H+RGwR&eFmA#*qW~rMwT>6IvvyNTD%t z=6mgpZe^TU%o&;I9F9?al??ZY2VW{v^!A;Bt^Or6#ZCh}u(8AGd=ZvWm z4SLk6s$7-_IxY|&yB2{uegz$K4%{FZ&nxl}Vm#nae5YWP6+JNRA}iF*w*PwV`XJ|d z%0WZSm8;);5J&x^oM^NMWsFYqV|5pV=_XU+w|u)yYCt9z+=-H@*l07*@J){PcW+qN ze*w_DpUI*FuQA_@^l`eu%Dee4avHYt0*ix6YdFD27w;R3Bx|>PJ|M zc@^OM$}=E&V93U6(0tKViQ;y)vyRB7!%LHE0-?dWNt3GhcZ+2*p4vjZ(t8LHXBwSpSC<$w7~vY7=o6hmtV>nZAK%IypG zZOJkWF?^>k)>!Gim=Ea*2LZgpP8hG6c4%!vT5&Fn(5H@_w8qMq1GC9Sj`Pr;pmj`Rq$tDz2n6mk1-_2pl} zRHkaRB!kBD=bd7MvY90}QiW>z|7A>Zh#`KN@SObtJ{jOnVaQV=TRZC(PydHDrBo6c z!>5N{k9O17l-Jy=~W-S!+JQWNHZ|GAGi;H|qdYX;9!S@zYyZWmgDJO;8VB!a_br_x#>;d!^k6;^tl?`cO3F!VnJ3Zv{s-}Qo z|K}%xVu@gDKRmopTr6BPWoM2ChKAY>AyMnP4>yQL_SUldKATtA{ZhD~a<#{0MJnQe zfUm7AWTFDG$;n;V<_(J`Ucd{|*O}~jN90=G(4ZuRSMG!BI~SeMQ-9n)NN|DHX4lVf zG=6gN`eor{G(I)0rILbzZn04-$P;>cdIsGfKLq^EI%q;D{P{}(0puOkPgiEYtwx9{ zt{;-OV2^rq^FI6Mi~0`*Dnz4E1+r9G>z{bLb_aUZI66Dy?XzP&PleLOQ9&!qGOYPv{BEl^WdmX-vdM*^;pc_k%%fe^P~(r)?_y5ij{g9zFlk|c|{ z;1Y=;8^*$?S#4I5BNPYX)`CX-x(Qq>y{$24_oPvPpwIxw)a+>nU>$r+=oaQZlyw3= zwN_J4j~A4od<*RKyj3jeJ=M$YR%)&soTM~w5p5hT`=?h}dE0IsGU|CjXcN?*_wYDkuuw&4C z`fGd9)I2mGd~LiRIMXwa5B{V3NT%qpB9TagEqNVU={8?&uBys(f0G&S zC7`dN8U?npSAfb;#0i1Hwxb2HB9ni;w}D}su5|e91MBuiLxd~2kGDr(Y|cS#U47bR zZp4+@h;RDdf%~fk`D}UI8PG{W8Xi(maMHGH3=9qyAH<`4Mf;wR2S5oEBr%&8yMiPk z5hrZx?%wW=bs=0t&-{s|PnnjGbYG{P&QXEi(Zqe%$)CcPV|BJ0Z=R_!9;xY3l-dGJ zPOVkejjOlc^P^PaxIC(=y6sbO0r++hkVq18GS|@f zU~w1Or%1|cX0*w;0nJ{hE+SMp19M*#`;WA95TvOfSa{xGUv`^)BWydUb3tdd);g)_ zI*kzVncGKE+q#Vo^8%@o0cNb09gG2vViKsFdwrqz6dYwswAcVe3bf$v;j9<*Kvp6= zm5a^U_Kq2e$Q{~XX0mioiaOgP<0hTi+Uy_Zn4o2aR8q zXpj81?wvnH`O1@UwO9BqJ8PG`el;_yp~S>QDvug@S>WAl2njz#3LTOJ5<>3)t6cip zMTW?t9YT&`K89HA>@R3~Jn6wY>Az2}IZ@v9UD`P!F+WY}&9-RiCA^WJ>Z6p}shh zVG;YY;I$7MIR(6!g{$Yadiuh-&$sXq3^6N!R3hUw`wg3laN7k3ZN`)D_j(!gr zuaTLBC$f$TIHFu(B~;GXpNrEMRUp&=bFo*_#&RK1n@MZ+9(B#Bx2_I8B5d?@;S|j! z++%4E?=Vr}fPG`CK4)0`Bj4=e<$4z zI%EFC(Of!$rRjebQyX+14s#^b~2px<)W4mi6;zu z{V;$IfighhXWv|ja$9)mISb~}#K@(1zx>IXYlHW0+weKSN&zTBO;)5f5S~l9XCpdecK#VvLrDhX}zqC)9P@wW*3A zX0yhMs?83;ah|d}9+UcPEy2tzI_Hl+sY3Ni*fo`O5C3^YMl!RO?b+$u0lKvA$h8`) z8OAj?;%Zuno0QcMi2V+3IfEzj* zSs5VLX-Z^i7ARvi_hNI1*?KpO8T5Sm(~qv6(?ucLuXwDEK66@r_`>+Pzx8^!=X|)` zR@V;p?sa9AFINp14ZnJ_@mXXt=AQ5nij5uq?z>U?SYeqx>J7?>Wd*dyDj)%b(hn!Q zj+D$}#{F!SmDi65Up2=8umsMC$d^ugDw{Y`Er~_`TPYLgMo9g2-&P}!b8&smVaJM- zsoL^4#BwHiFx!S7UxSuD7>MK+7Z-!TyY$PKng1?N>rj!3aG3pmZD@kNpGlW8EL|t= z!Q3>S7-Q^D#2=~$9y6IXuH(cQlGpLx#_#WV>RQtHzTv*`p}vyVw=mc8o3BFge?h{T zxN}m_wv{BHldpm(8nuLC_Y)x6fN!fgze`GQMu2NVb1+`%YksD0y>j2p(q}$}Po8&w zMLVx+mXLIxqB+_{i;Q|Ev{lT>lKZwGyz`PFV(VhfC1OIz%2%cZg^7d1dokYhdvi04 zNx)gCXg+=n>sT2M#AT1QxSkYjJVl!!zw=voXGaicG|Bl+1BLkUZlyx^t2U+!z84yk zOT>9-kulFI)=yFslFr*XA9`KANEg^}Uk~@W5eMZb&~m(l=nBxa+n`NkJ75E}hm7~{ zZ)uqEBI@(<%#$*$$2{QK)z7`mhzAAfIeiC!buoTTc4L zvvNiMZqQI6o3ff(DS$;FDFYX1gVs01ARo|0?FXaXPH7H|se1?S<7aWl%agtPp>*pL z)}H!ljxOa*#P-aio6EnbNhqjhNRN*~#Zlg;c5=%8+}$Ed`^_gBQ8pk)m2}(Va_I$s z7`s5OJlo3Kjhm@aDM=!OkBR24p?I3pEAK(+-tPy+HPAre4B4n2Cr5m)NR zZv6-lIsi^bZq)8mwwf|q7J+e)@-$!OMa_aESQdN@zcWj^5Gb?_rTF>vf z*ga!;AI7x%Z9KZIPBt;y?CLy%WH=ND+V(`&a_^CZP0sqa?A5j!Maj_TyE~ws4?;{- z<1JMQzjBgCnD`DuSy_1-5T^COLxhGRAZcL)=X*7GnUuB~q0q#2PR@22?tFd9qKSbD z4c4fxGf4I!G_#{%jH~hfK@D8N;jd6Ei79lFkimczvTf(^kc!t#`ANRYO0ILv{cWgt zqeum}ow}Y;$(vU8@RBP!lQ%G=7G911zV&HX(-6-epp-h||C z>+0@BmcE+1Gu};{-n3HsZF%Ltz;T`|y#3znU7TDN7F;BKACfAt(?K%cWa*>z>fE1X zvL`S45+0if}Ae<7tM9Bp|dPilcOm=;p#x#mu=A8`CR_ zN@lk9vZt?-59d{$C%0xj57BaG&fX5k;#ymiRW$K$YntwHUZXs{+L(0nd^$J^I`N01 zF`~xzXz6KD&{0D|FtN+D^)UvjaDyOGhQ$&~_(EdTC7K-U8bKU^2ILt=^ zBB!;=`-PaIanq$dL<2dO!uwmn(0z?+=QVH6>@>>e=6Lazn>NfLAy4-@o%vSL`lw6a ztfQ`|Hxt2)kLW2X%$Y<#7S7kRH1)+_R>?5sRZp0>RE5YC4kJ?vFmeE~zx2luH(z>6 zqEe$19zTq1M0;38<45gy{W)mv-+2`;pm&BAB{MKFW>)@8D=ocq?AS?tu-<0gKDtcu z$|*D1!QmB={f(tWA{PLO&r;l@)`T8=ORnpt*kbc~!XW#s> zhO^X_{63yw`u9LVe_}|xB|p$4mcd7DV8s#E0sv*Vlfe1?(8cf}a>wV8nZZc@=OcJn z$+M7)8vXL=s(LZ^(V{Q9KcC+sQRT6eVrkuCx_$Qs6}MOfI%;=Uly6A^HP8x*bL+b{ z7VA&XziX!I|7Kv~u_qi2_%SIfuQKhanLW8E;#Kk?1mFR+fM0|4KG z2N~4Oh#YshJ3Bg+{+hjV<%}F>5b=(55S{jev2gn0lqYG*7V*y7Li&m#;SS#STfg~$LFn%e)693<~Zi?E2iT)bhYA)nF`i`2nvXHxx?u-1X-?CC& z(?eSC7V|7{1jFY;h~7Lp5vQ;)e z4DC_sS051kmM8V6sAkoCzpWuptg7-nze_(!>{;CVoF_f9+oP5yigWvk(kaI|KRyY7 zcNv&&eaXm>PkK=7@(H8A_?4En?0bjf_Ium%_R*(b z;_taka0fX!EOAx{U0%4JL(>V+)!Tp}P66+)++4YQjkdP7|N9O0Cw2lOsj)=bq7og#zTaPXzO{bk+OsAsP~7u^AJ^oZJXtV>4Gnyw@&Us_S_~jw!Q^hBVe93Q zJGrBQ=-|IiT75uWC3PUDQEQrvv(;UP@Wv0z^=bXsTv%C4~S=MDym z<~DrAn5e6Lwg{^$>Nf)lhjLQhqgWS2NiwRBnF1 zLUY}#XTzSLH^Q4sb@_MQ`LBczLGE<2vQIa>U;J|#S#=rlvw6e0v|rUQo|?C+n`3;_ zi_v9M(ECeChtDe`qd8!fLemg*UxM(cQ<9UDQ&LjEh!6n2`Qq8osW2+0zjttSfhkXE3>d-5Y5HtHSBx_Z4w-D=Sg2Q(gkBz}LNZd5rs*COGk1(NjVaSi1Et zPs!<`J6c?(1;cedI4Ox~JlB0BmHDFNYNrxI%5MoJwCqxTMwF$elH&O5T#OQHPl`>w z(aTV&=no%0#KgqF0|0wPBx$xenDo{ykQ04$N`33^K89j26Y7UPWnOMQ`K>%JFE2g) zF3{|OT!S=&+WAtBKfK^jUL=V+ou6-G<9(E_yS^7vJ*;>>*oCUn7^&lIx)5G6&q--K z{HLG0%*TDfbkwaLLkSqj?{V_%SxAk*Mf|DKhs(*&YxJM1TwAwNFYH$M+%5;5>knJydOX`N#S=lB z0a7{2(}8`N8UKf<)R=_Fzl+gR6tss12Omk7 zjpnSCjqB1{Kc>OQy~9lp^d(MC8=wb6HUI}8#O>@vy`Q4|_jS*DpkCEXUli2VdII7c zO#9>%6|K$8w7@P7RN4T9Pz56FMR}b|=25=rVj;;G6?NrXHx9)EwP@?iFK@Iu6cS&n zkEzIQ+V1__m0a!);g8vAS9(FBAe~c)1{(oEln(8a&XBl{R_ZNQACp$$n>Aq}U_t{r zA%oyle($~O|J}>Ml-N7rB&yn}H7ItEDd(1EWi@C6$S%eT3&5YGH(EC~6DgMt7E1p~_!1T{qcZ5$l- zK)r0vxkkWh?0s}}Uz^j34!ZaG0*_oq z-&SU!V%C{|L=QxhyCXZDx(tcZ>^0_37x&k&3lfu3Q{&k1F~@KhOP3Nkbu0(hYUl}7 ztQGqP=YzilakYBo(Qi+dXi+*H{P^ZB`NH8b45$}s$j@qWrjqHs<_>yx2fu#FJ7ai5 z@@j8i0$P{nUt5hJ6a_a=^YXEc>6&73TH1eDVsoD61O%YJlTHUAW0qJD$78w$;BqlB zfWAu^h5Q}h6kLcf;QZ?sc8dtJm`Fl#O_sm-IK`t>i~>TCf435nUrf#T|2sX;t__pj&W zJ{p!66Dvms^h=8z`UAT4U+>aI$uMck$Sz_!qQ zG%f)@uCP`k?)W6dEbz9mQ8apdDD^%mNyNB45=4yQnnAy3m)8GUhzdBJag)82qQ_Uh zEPB6evUN@yEmP7K(M91B+c|5iZN-tuPAjmm_pWoYz~^P+LKgXli_Hz<+#{0=i*h^c ze2u7tJlN)fJ9Eeqg+#_z)=MavYg{wd=?I==(xp9|NiD=i=iSU%ANS@xeJp-E9=|7y zG$Jrrf`hqTiMf4ialkXNN$0s~)zfk3VriFRX-)O~8m)8(p~)#HurPu{9B>{*7+*AU zLF=Rs$cO#?4h{~Zc^-GA-?n#m-#oKHK|HM57V<01$)Wq)*Qc7g3zHKR2Cow%Ms z8tpmWu~xiGlf{9=%lfs!9J!^?_NkZo;_lrIUmk*TNw-WYugF185_MfgQGQ9U^5_iL zXh{1jr;#!CAFC#6=~3#=)e{_@J~ulbgj>MCF<)Kedz3~LDg_ttk>6^}3bdnuXiXcB zu^a`4gg5i^>z-QN7Go2nt;Zmezez|JD#aFyjc)gd$A%b_^6GqTp5iF=pI=5!Pu17H z>8jAhW%u{V3sHI`rG%i0QgqwxZ*+{=C=C@{?w!Rj{84NuFxVY*yVk5G8NV~Nu((S8 zc7u|nSmpt*uu3*=Pm=8g^ZkF~KYrRzdDgh%sHwizt#2vlleQpHzG+mxX|MZyIb!HY z2556Yy9D%#=TFc)stHCCZy*zasT&`!`SGmLsCfARJl*v{DYjf&mqSxR;`KusWu{xe zXa>*#xD}{0l%pdI3}&2Ar+@!`I5`>EDhqGttezt^_aDdDTW?S2U-VEFJ~-T&#ZyeV z9NJtq88htO7*ZctVObr~Op~GyQ+u;ONLS*bZAtk-24ls(8sbbi^gMSS`8|wGP8J2H zLC{uq11c+MkBij4xZ`UR9RohT_SI~s5#-xCv+rC&7vA*fd49L9-zA#7ncHQ%Qo_Ql z5|gl6q)kbZ+iXr7PJ|gq7y6Wj5Icl|B)8uLSajgO5aI2%vm8enD#JizYSNNLpWRBA z*1TdbG^v^`LrZFE%D`|BzGWCzP&y|+pUv}5BiBEl;}*7k31QG8Jqs~+>F5_5o+p`e zw6E-1A4xL2?YhIqEy;o7+}Pjy>ZRY;!4m5p%8&Ag{QjXK^n_8;>>Dpw#ztQ{)ChtR zQ^x15h8-z35=b84qYv*&ea_h-|64)O7iX`;?7B&#VxbYRic9uw+@S7m#bm|diHTo}zPJ)}QAJPAMiLL9D=~6C z823&zDBKi0pGa0TH8ss@GFV<+1^XQ7^j>3bEOgY&U2y>yvvTcXtzRh&k(~?hCm)m| z5XFJRShXF-baYpS$spjAlDj_t&9i_6yL5D-{~7K`^DFQ*m%4Rv2Vd*hI()uuy2pnv zgfYeLF5_Er!KMX!{t8}gD-$|DWu`K%uC9EASkj*NsiJ8D=S!&X$7f5Hh0_W62@=Uq zUphOC&svmrrWxn;IH)?-;Sw@X7xEveIoeao>u;E3xM~CCM7G&wz=8Ufz%{ zuB}_cb87)jhwA*rlC2)f?>RK!tOX5## zUO3egFVoHkgG@-b5`}vu{@6Z%1|%GHJvgp==XVIP1E+W>F$2FptXXuf0Z)h;usI%I zurJ1|!|B;0{k<3OwXL_R`yF*{#GG0O_;p_SRcqX1N+*V0A9l`!5=L>STThCQaa^%A#Zw?J8k%l)*xG~{c2_ThTq zn;bb(vV^t$AdRp=ql%Bls_|NEz2Le>;Uo(wA3GRUT1ZdWhSIW zdH8GA3AGSR>=Z{P%o{-o%2D!@d_}7C3>@=_@PcWWmjb<=U{!#yrXFP2CM{ z1^n8HZChchks;%ZItwwio(6!YVA*-Cq+kmEgsZE-YX=IycK&)xbm9XMJ29jjok<@|17*4EMEPK#Q5Oc;VAE^N~B&c?%#%gG0|Z-N=G-2OG3&mj32n!2msxniX6xs?UTXL7wGUr@ji)6pW$UpksMyavAydIb5crg{>W0 zzJAIAd`Rm`=vcM1ww@&2gg*>PpfPtbY0>z`A&ru4NUIUxd!uAVdLUsr83w?WC9XhX zmvv=LR-EbR$$!a^H+4kBPZw7BZ-AMCHSvh&gm$hY@+QKw5tJe7E)(kb`^h~_ZB$iN zr;&-S@;)8fk+Jpq*UwqGk6%MNaDFeGqeq2IX;U3cU?|$IU71FA7+>reIoD!{;ln@7 z9*-H2KbOLw09}DKbUhmUZDX!=ute=>htOM#jF~X>7(b$ag*UMaF0sXD0fI?5Fs}hC zUTeN+*hhL(7>IU&QrVH?-}E_m@TW|IcBgx9L0 z5FH5FizbNj+5^KtB5k=9UDMFCa$HzQC`2Yrd3*MXJFEW{FBzZ?Jnr}ZGctSUmmsph5nPRa{P+OT>xo{1JJ4d{fg!~jURXcBaaXi;3WS0r4a)9HGdD^+rIzvqf%E+Y`?EY$cIn1r<@?? zM;8eVa3#UrVWT3!qMkZz+s?8RiQ1;8np2~1DMe|+m^P9uy!l!@3ctra{2@(aI|XJT zL>rYTz9WH0;6eHKXhGB`m0bJJ$)Lr6hRE3DKNdzTYii^olms* z%N2y2ptP9Y`w{HKVq$opbTBt(v?T=2+CKB|1itBBApJ-{dQVhe(vst{(!9(${)*iJ zXyFi>qGxY|z8H{)lCD3i1Yn_(p8HBBXo=z7;coGH^;GD|NMcye1~tiTT(lu`_~WP*%; zc{udh-ky)%DjqzuRc;;Gxhg&fGa}ngazmSPsq0PeHT}#F!X9zkT}_ zbg)$E2?0a>6`s!+%HbgL#w*8RqXH~J!pDy?uum+5cvBU0q6Nd@VpFpigm)oz{%}Ts ziJqqz(nZXgKXz3^!OA{AO#>ScJt4?tKFQa(+Kp@2AE4NtTm2GLz8xLOX@_pAIl86vs`e1}XUyraCR5WY1il8{b3X%a23c#n^JuR>e zIDsK%r~4~n5q`SRcT35Xf-4;#8=IS-U$A$J%nuyVx!;?kGP>~5EdC)-HdMeQ6_ALf ze}b<+u7s54m6;hR%0rnWMbeg9Wrg0*hQqtU=e8jiF6z9YlA#F2$UH5gg^qsPA7oXD z3BVKY^nEE|1@9Lq`NOM)t4OsEm6DKJf2K@lZfy-0HlA%(`@hd>jTG*Iuo?6oz;@6- z%a+SAF__BTY^~v%dn7kYGW~j2YtJFxUEH953`Eum-Ug$2!${H!Fohcr3c5~bB%tH= z;@-i*fl3H-9!M4UTActu@re{nymi)^9Zmo;f%Xeh(h{l|uovp-O~FeIzCphDjJ0L) zO{m7ZpB!ycosMhJl6J0{gyFTvK@l+d<@w*cEf}%7!vFVfBMd}vjSSufBk;o_8}UfM z_$1_9i5_%Y=(rQR;N-iCDI(Pt!yI(q00!_3OL&(FILxf9L}5@qwS$Nf4v_uvn(@Q1 zuG!$%VEY)v2Iy#=fU}hbaHjO^$^X}EJ_j9#M@+XMiy6-H#CJ}#ev}y#P*-hKdEtTK zpC<4&IIY?B_C(`tm>?vye$;HdWZ+F%ro|?*4w1;h8AfuV2+6C-1A-40*N;+#*ev_;&>G*nhEk6(n(gE}X}t<&%~{zc>H zg#W!?Jc8@Z54os}3wBvm2}^zGW97LJ5kr#=F4G&%sA&>j9i*8sa1^g$UEcJ+Dx zPi^NO4|TrAag}0Cr&6M{Aw$01jY7=EE*Gx$hMlQ8w-axZh)&sXQX_MHFryw2PAm2Q}5VYxAb=(#u0SRD%l9wt{0k004~Q%-D?;UNDbwOK`o0+BAMtgJLmt4DzVN~vvc#^4@68!~$0 zXSN@*dVa!PDtR3)?(Ut}_8MHQ0*DI^Y(c71_BSguAiMZ6z_VwNBLwtHT;{@QtW_|Q zo|p~uciK6?v%~!@)YL>IAZJ!CoVBHrsGwnEdjkRw;P(Xe*axRjEt{M^F+T};eYTkB)}m%Jge}$$RFu* zhCY%M-MDEEQQ-)-vA1h|7o&=dJ*vwdu*i(BTl;4`(p`cu1|?DW=VXwf+tm(VYA0Y& zurh(M8BH<%V7iCLB$U}lZ*I4%#^d8KON#Aep@N9=L&W8)l=0UC$p0eN{3|crHt$`( zkHTc0DyjhuFORXPsSh7K7#z-2*xA}{$^90Q(&{#H2v_8Vip5PHP3<-{VLSYJvUXD3iu)$Ga ztE{MSvem?^IlD>NyzLp-LDMIRs%&mf4&7!EeiJ(=utebc*`8JDZe!D0ZSkYocI3tS zg6Dfs4^QsaFP9~78C92nsnf0PtUHEOQaw@OKnDhG{2IISZ1g*8cqoaLnOA= zUci4r3>AguolWV<$;qI^RTmUE7kcL9=XU}P4=|mo#vatYK#hS)v4+~0p`k;g%|3iI zy*Q@18Z}u8?JSXV&dD)Maw7a-geD9I<9+il&W0$<9iHo;m$jA4N?K~mFguBcSljUa znaH7&k!Yky;AWGY(1a|-w`gd%&%F;G)y(NPQ50|4_#~DuAHB>TPu%!4(L;O3bHNc@ zF6fYS*uG89=(s_(VTSVD!gU=f0ZgV3l!ee1Q&w8)Y4Z5DR0C||gQ#PQuaZxF1XwyH z!J12q1tRok<6zfMYpLH+3QrnoVq&N^d_*n175Z#O#c79IT_sMfsR2Fv&2a!z>xzKXCx#z&e@_c7OONV zJd}1K#tjMr_?)*?1aAi92|@rZSuh8YDoqa`cHJF`9y*>$@cbYw^JQ!j>{z_sp&P}6nerEM-OA(2c*#aj7Sqp z%j4g{A2M~95RGpAX*dHqhKHN|16q;1?Ce`?5yFF7O)?hnGyWC5d{?8kq#lL+F)!P# z0FD4VBJI-pReJGqjqh@?7L%}j!&cj;^}l{?XKn&j27bO&v`%-qKGfa(ggTNWY+B$~ z)l=7A7!+F8`o4t-gVeldoYU0zv4yX4L$u6XudHDRsRA)uU94Qw&g%_0{G(0W+(%dJ zUq>SqV`BOao4h)RffZRA5G}}sXH~KC_sD#xD5)9)m)p#jf0r!^*K&{!-WoXkYPlbe zv1!vpr$W{#p3=P0#o%v$#PoCT5CGLXOwgu-=sXD3+PJMkKb$MUd39x!q7h4Y3{szl zSw5J=%LuCa8hYLsb#$g{CPF68`)zAY`x_!@Wv`XX_QQb|56bc^NKhcoZDosK7NWyM(Q$8&KC90O7LYL9=+eE1&Vx-J9*%UmWu_~%pz%!Gx0L*TrSVQ( zoe;{iF@1+-Qd)Mt`mK@M!`I@4{Pf$A7oXn#y-w#OGKlgf&0=(;BKjXFCbs?===DlU z&!KSJ>$5`R=(^7t_qu0j)=S*b(bYbLrJvxOb2C1xkYbdY4%y4rH|KWKZ$GR> zDfHbh@h|6_aeaZbQ-zox-}4fqEVv5jO9}t+rwU&0{=;-LL*_CT9}2T|C{J)Sshd6n zi5=%)2z=b$Rd&R}4XfZN?=8otwaCM6!_85?PP$Pqt0r=&e(uGhqM_m8&1zeHd?fpJ zcdjE*=vOQjtM{g|AllxeAXo&Y3WJk3CM929USb%!EP_%pxlluc;LKCk=@b?fA=yXb zGY)dcU~KP)1}lKT?p|JA;R5)u*eimC@Ed#7GMeA6JHM*++!+0K@q?8%Hu0s_mF4q1J2wz)Cz>e2qnsEMif@;YP_+}puKybtvdaM!N`K)1P#S=Ks7#|}PD z0AM~yxkr{UaCNFS_z8prb=aXKD*ufSqjSUA@Tvy**rLXqD9XE`@U927>9l_Mibg z2tdJWJi94T{fK>-o;$;@hW0xZZP(a{Z*<1CG=6o?TfD{aX8`fg)mx(zc!kp*mV>0GooW=&nM`PB6u z!dSqVS~-w;ku)kqbpW1kNq?^X-R8|C-B@Vt7c}DvZ8U9IkjiH-?n@sgr^v@M;(~MM#T`^DX2o4X#8=-$|AJSg( z9vl8*bnW7Lyzw{iiFojwdh^1Vi1!uXJ7R?uSPrsjG6*yK2L~Hwft(*9wlbTiN*d!n z*^pO$^(x#^5GFiT4v{0@pbLm)zRcwi=liI62PN zt)5xq-bL978(L>r#_40 zePyVQZ;q-16-q}8&dRqpRc|yK`G|*EXyV8AU#o>dBe$6QJ$VYk(Htk^k zC#Q{m5+vu z7OWxdJur`Rmag_RIt~n`k+E^v&z1Qm`mFn^+p za*45|kKB&)TFPFr5nJ(Y=S6{l(i`Q;D^aoOnp5g!i literal 0 HcmV?d00001 diff --git a/results/appendix/build_quantitativ_results.py b/results/appendix/build_quantitativ_results.py index f63f11f..ae6aaa8 100644 --- a/results/appendix/build_quantitativ_results.py +++ b/results/appendix/build_quantitativ_results.py @@ -68,6 +68,7 @@ def build_quantitativ_results(distribution_name = "detections",distribution_name ```{{r}} #| warning: false #| code-fold: true +#| results: hide {preprocessing} value_column <- {value_column} ``` @@ -126,5 +127,12 @@ def main(): content = build_quantitativ_results("z-values", "Distribution of Z-Values", '"Z"', header_size=3) write_file("z_values.qmd", content) + + preprocessing_number_of_returns = """data <- sf::st_read("data/tree_properties.gpkg") +neighbors <- lfa::lfa_get_neighbor_paths() |> lfa::lfa_combine_sf_obj(lfa::lfa_get_all_areas()) +data = sf::st_join(data,neighbors, join = sf::st_within)""" + + write_file("number_of_returns.qmd", build_quantitativ_results("number-of-returns", "Distribution of the number of returns", '"number_of_returns"', header_size=3, preprocessing=preprocessing_number_of_returns)) + if __name__ == "__main__": main() \ No newline at end of file diff --git a/results/appendix/number_of_returns.qmd b/results/appendix/number_of_returns.qmd new file mode 100644 index 0000000..3805d80 --- /dev/null +++ b/results/appendix/number_of_returns.qmd @@ -0,0 +1,218 @@ +### Distribution of the number of returns + + +```{r} +#| warning: false +#| code-fold: true +#| results: hide +data <- sf::st_read("data/tree_properties.gpkg") +neighbors <- lfa::lfa_get_neighbor_paths() |> lfa::lfa_combine_sf_obj(lfa::lfa_get_all_areas()) +data = sf::st_join(data,neighbors, join = sf::st_within) +value_column <- "number_of_returns" +``` + + + +#### Kullback-Leibler-Divergence + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-kld_specie +#| tbl-cap: "Kullback-Leibler-Divergence between the researched species Beech, Oak, Pine and Spruce for the atrribute number-of-returns" +kld_results_specie <- lfa::lfa_run_test_asymmetric(data,value_column,"specie",lfa::lfa_kld_from_vec) +lfa::lfa_generate_result_table_tests(kld_results_specie,"Kullback-Leibler-Divergence between species") +``` + + + +```{r} +#| warning: false +colMeans(kld_results_specie, na.rm = TRUE) |> mean() +``` + + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-kld-beech +#| tbl-cap: "Kullback-Leibler-Divergence between the researched areas which have the dominante specie beech for the atrribute number-of-returns" +specie <- data[data$specie=="beech",] +kld_results_beech <- lfa::lfa_run_test_asymmetric(specie,value_column,"area",lfa::lfa_kld_from_vec) +lfa::lfa_generate_result_table_tests(kld_results_beech,"Kullback-Leibler-Divergence between areas with beech") +``` + + + +```{r} +#| warning: false +colMeans(kld_results_beech, na.rm = TRUE) |> mean() +``` + + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-kld-oak +#| tbl-cap: "Kullback-Leibler-Divergence between the researched areas which have the dominante specie oak for the atrribute number-of-returns" +specie <- data[data$specie=="oak",] +kld_results_oak <- lfa::lfa_run_test_asymmetric(specie,value_column,"area",lfa::lfa_kld_from_vec) +lfa::lfa_generate_result_table_tests(kld_results_oak,"Kullback-Leibler-Divergence between areas with oak") +``` + + + +```{r} +#| warning: false +colMeans(kld_results_oak, na.rm = TRUE) |> mean() +``` + + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-kld-pine +#| tbl-cap: "Kullback-Leibler-Divergence between the researched areas which have the dominante specie pine for the atrribute number-of-returns" +specie <- data[data$specie=="pine",] +kld_results_pine <- lfa::lfa_run_test_asymmetric(specie,value_column,"area",lfa::lfa_kld_from_vec) +lfa::lfa_generate_result_table_tests(kld_results_pine,"Kullback-Leibler-Divergence between areas with pine") +``` + + + +```{r} +#| warning: false +colMeans(kld_results_pine, na.rm = TRUE) |> mean() +``` + + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-kld-spruce +#| tbl-cap: "Kullback-Leibler-Divergence between the researched areas which have the dominante specie spruce for the atrribute number-of-returns" +specie <- data[data$specie=="spruce",] +kld_results_spruce <- lfa::lfa_run_test_asymmetric(specie,value_column,"area",lfa::lfa_kld_from_vec) +lfa::lfa_generate_result_table_tests(kld_results_spruce,"Kullback-Leibler-Divergence between areas with spruce") +``` + + + +```{r} +#| warning: false +colMeans(kld_results_spruce, na.rm = TRUE) |> mean() +``` + + + + +#### Jensen-Shannon Divergence + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-jsd_specie +#| tbl-cap: "Jensen-Shannon Divergence between the researched species Beech, Oak, Pine and Spruce for the atrribute number-of-returns" +jsd_results_specie <- lfa::lfa_run_test_symmetric(data,value_column,"specie",lfa::lfa_jsd_from_vec) +lfa::lfa_generate_result_table_tests(jsd_results_specie,"Jensen-Shannon Divergence between species") +``` + + + +```{r} +#| warning: false +colMeans(jsd_results_specie, na.rm = TRUE) |> mean() +``` + + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-jsd-beech +#| tbl-cap: "Jensen-Shannon Divergence between the researched areas which have the dominante specie beech for the atrribute number-of-returns" +specie <- data[data$specie=="beech",] +jsd_results_beech <- lfa::lfa_run_test_symmetric(specie,value_column,"area",lfa::lfa_jsd_from_vec) +lfa::lfa_generate_result_table_tests(jsd_results_beech,"Jensen-Shannon Divergence between areas with beech") +``` + + + +```{r} +#| warning: false +colMeans(jsd_results_beech, na.rm = TRUE) |> mean() +``` + + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-jsd-oak +#| tbl-cap: "Jensen-Shannon Divergence between the researched areas which have the dominante specie oak for the atrribute number-of-returns" +specie <- data[data$specie=="oak",] +jsd_results_oak <- lfa::lfa_run_test_symmetric(specie,value_column,"area",lfa::lfa_jsd_from_vec) +lfa::lfa_generate_result_table_tests(jsd_results_oak,"Jensen-Shannon Divergence between areas with oak") +``` + + + +```{r} +#| warning: false +colMeans(jsd_results_oak, na.rm = TRUE) |> mean() +``` + + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-jsd-pine +#| tbl-cap: "Jensen-Shannon Divergence between the researched areas which have the dominante specie pine for the atrribute number-of-returns" +specie <- data[data$specie=="pine",] +jsd_results_pine <- lfa::lfa_run_test_symmetric(specie,value_column,"area",lfa::lfa_jsd_from_vec) +lfa::lfa_generate_result_table_tests(jsd_results_pine,"Jensen-Shannon Divergence between areas with pine") +``` + + + +```{r} +#| warning: false +colMeans(jsd_results_pine, na.rm = TRUE) |> mean() +``` + + + + +```{r} +#| warning: false +#| code-fold: true +#| label: tbl-number-of-returns-jsd-spruce +#| tbl-cap: "Jensen-Shannon Divergence between the researched areas which have the dominante specie spruce for the atrribute number-of-returns" +specie <- data[data$specie=="spruce",] +jsd_results_spruce <- lfa::lfa_run_test_symmetric(specie,value_column,"area",lfa::lfa_jsd_from_vec) +lfa::lfa_generate_result_table_tests(jsd_results_spruce,"Jensen-Shannon Divergence between areas with spruce") +``` + + + +```{r} +#| warning: false +colMeans(jsd_results_spruce, na.rm = TRUE) |> mean() +``` + diff --git a/results/appendix/z_values.qmd b/results/appendix/z_values.qmd index 9709d99..66973c6 100644 --- a/results/appendix/z_values.qmd +++ b/results/appendix/z_values.qmd @@ -4,6 +4,7 @@ ```{r} #| warning: false #| code-fold: true +#| results: hide data <- lfa::lfa_get_detections() value_column <- "Z" ``` diff --git a/results/report.qmd b/results/report.qmd index 817ee8f..f4056db 100644 --- a/results/report.qmd +++ b/results/report.qmd @@ -41,10 +41,9 @@ This report documents the analysis of forest data for different tree species. # Results {{< include results/researched-areas.qmd >}} {{< include results/z-distribution.qmd >}} +{{< include results/number_of_returns.qmd >}} -{{< include results/nearest-neighbors.qmd >}} - |specie |area | density (1/m²)| |:------|:-------------------|---------:| @@ -72,6 +71,9 @@ This report documents the analysis of forest data for different tree species. {{< include appendix/preprocessing.qmd >}} ## Quantitative Results {{< include appendix/z_values.qmd >}} +{{< include appendix/number_of_returns.qmd >}} + + ## Documentation {{< include appendix/package-docs/docs.qmd >}} diff --git a/results/results/number_of_returns.qmd b/results/results/number_of_returns.qmd new file mode 100644 index 0000000..007a08c --- /dev/null +++ b/results/results/number_of_returns.qmd @@ -0,0 +1,33 @@ +## Distribution of number of returns per detected tree. + +```{r} +#| code-fold: true +#| warning: false +#| results: hide +data <- sf::st_read("data/tree_properties.gpkg") +neighbors <- lfa::lfa_get_neighbor_paths() |> lfa::lfa_combine_sf_obj(lfa::lfa_get_all_areas()) +data = sf::st_join(data,neighbors, join = sf::st_within) +``` +Examining the distribution of LiDAR returns per tree is the focus of our current investigation. Initial analysis involves the study of density graphs representing the distribution of LiDAR returns. The density curves for each species exhibit distinct peaks corresponding to their respective species, providing a clear differentiation in LiDAR return patterns. Notably, there is an exception observed in the Brilon patch (Spruce), where the curve deviates, possibly indicative of variations in forest age. A noteworthy trend is the divergent shape of density curves between coniferous and deciduous trees. Conifers exhibit steeper curves, indicating lower density for higher return values compared to deciduous trees. This disparity underscores the potential of LiDAR data to distinguish between tree types based on return density characteristics. In the case of Beech trees, the peaks' heights vary among different curves, suggesting nuanced variations within the species. Despite these differences, all species consistently peak in similar regions, emphasizing the overarching similarities in LiDAR return patterns across diverse tree species. + +```{r} +#| code-fold: true +#| warning: false +#| label: fig-density-number-returns +#| fig-cap: Density of the amount of LiDAR returns per detectected tree. Splitted by the different researched areas and grouped by the dominant specie in this area. +lfa::lfa_create_density_plots(data, value_column = "number_of_returns", category_column1 = "area", category_column2 = "specie", title = "Density of the distribution of LiDAR returns per individual tree", xlims = c(0,10000)) +``` + +Currently, our investigation focuses on boxplots representing each patch. We observe significant size variations among plots within the same species. Notably, numerous outliers are present above the box in each patch. For Pines, the boxes exhibit a notable similarity. However, the box for Brilon is entirely shifted from other boxes associated with patches featuring Spruce forest. + +```{r} +#| code-fold: true +#| warning: false +#| label: fig-boxplot-number-returns +#| fig-cap: Boxplots of the the amount of LiDAR returns per detectected tree. Splitted by the different researched areas and grouped by the dominant specie in this area. +lfa::lfa_create_boxplot(data, value_column = "number_of_returns", category_column1 = "area", category_column2 = "specie", title = "Boxplots of the distribution of LiDAR returns per individual tree") +``` + +Overall, our analysis reveals very low results for both Kullback-Leibler Divergence (KLD) and Jensen-Shannon Divergence (JSD) metrics across different species. Within species, there is high explainability observed for the different LiDAR return curves between patches. + +This suggests that the number of returns alone may not be a robust predictor for identifying the dominant species in a forest. However, the curves indicate a clear potential for distinguishing between conifers (Pine and Spruce) and deciduous trees (Beech and Oak) based on the number of returns. This observation is further supported by the JSD scores, as detailed in @tbl-number-of-returns-jsd_specie. From d274223a9e278b5e41bd2b724ef4243ebc29ab7f Mon Sep 17 00:00:00 2001 From: repo-visualizer Date: Mon, 22 Jan 2024 10:33:08 +0000 Subject: [PATCH 3/3] Repo visualizer: update diagram --- diagram.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diagram.svg b/diagram.svg index 5d49cf0..2bd945f 100644 --- a/diagram.svg +++ b/diagram.svg @@ -1 +1 @@ -resultsresultsmanmanRR.github.githubresultsresultsmethodsmethodsappendixappendixstates_destates_dereferences.bibreferences.bibreferences.bibreport.qmdreport.qmdreport.qmdlfa_rd_to...lfa_rd_to...lfa_rd_to...lfa_creat...lfa_creat...lfa_creat...lfa_inter...lfa_inter...lfa_inter...lfa_rando...lfa_rando...lfa_rando...lfa_creat...lfa_creat...lfa_creat...lfa_crea...lfa_crea...lfa_crea...lfa_run_...lfa_run_...lfa_run_...lfa_run_...lfa_run_...lfa_run_...lfa_merg...lfa_merg...lfa_merg...lfa_get_...lfa_get_...lfa_get_...lfa_capi...lfa_capi...lfa_capi...lfa_init.Rdlfa_init.Rdlfa_init.RdREADME.mdREADME.mdREADME.mdresearch_a...research_a...research_a...research_...research_...research_...workflows/c...workflows/c...workflows/c...ISSUE_TEMPL...ISSUE_TEMPL...ISSUE_TEMPL...researched-a...researched-a...researched-a...z-distribut...z-distribut...z-distribut...preprocessin...preprocessin...preprocessin...data-aqui...data-aqui...data-aqui...distribu...distribu...distribu...z_values.qmdz_values.qmdz_values.qmdpackage-doc...package-doc...package-doc...build_quant...build_quant...build_quant...random_forest.Rrandom_forest.Rrandom_forest.Rrd_to_md.Rrd_to_md.Rrd_to_md.Rintersect_a...intersect_a...intersect_a...create_sta...create_sta...create_sta...merge_and_...merge_and_...merge_and_...run_test_s...run_test_s...run_test_s...processing...processing...processing...create_st...create_st...create_st...run_test_...run_test_...run_test_...segmentat...segmentat...segmentat...create_de...create_de...create_de...map_tile_...map_tile_...map_tile_...init_data...init_data...init_data...detection.Rdetection.Rdetection.Rrd_to_res...rd_to_res...rd_to_res...get_tree_...get_tree_...get_tree_...capitaliz...capitaliz...capitaliz...get_detec...get_detec...get_detec...init.Rinit.Rinit.Rfind_n_n...find_n_n...find_n_n...lfa_crea...lfa_crea...lfa_crea...ground_c...ground_c...ground_c...Bundesl%C3%A4nder_2...Bundesl%C3%A4nder_2...Bundesl%C3%A4nder_2...Bundesländer_20...Bundesländer_20...Bundesländer_20...Bundesländ...Bundesländ...Bundesländ....R.Rd.bib.gitignore.man.md.py.qmd.sh.svg.xml.ymleach dot sized by file size \ No newline at end of file +resultsresultsmanmanRR.github.githubresultsresultsmethodsmethodsappendixappendixstates_destates_dereferences.bibreferences.bibreferences.bibreport.qmdreport.qmdreport.qmdlfa_rd_to...lfa_rd_to...lfa_rd_to...lfa_creat...lfa_creat...lfa_creat...lfa_inter...lfa_inter...lfa_inter...lfa_rand...lfa_rand...lfa_rand...lfa_crea...lfa_crea...lfa_crea...lfa_crea...lfa_crea...lfa_crea...lfa_run_...lfa_run_...lfa_run_...lfa_run_...lfa_run_...lfa_run_...lfa_merg...lfa_merg...lfa_merg...README.mdREADME.mdREADME.mdresearch_a...research_a...research_a...research_...research_...research_...workflows/c...workflows/c...workflows/c...ISSUE_TEMPL...ISSUE_TEMPL...ISSUE_TEMPL...researched-a...researched-a...researched-a...z-distribut...z-distribut...z-distribut...number_of_...number_of_...number_of_...preprocessin...preprocessin...preprocessin...data-aqui...data-aqui...data-aqui...distribu...distribu...distribu...number_of_ret...number_of_ret...number_of_ret...z_values.qmdz_values.qmdz_values.qmdpackage-doc...package-doc...package-doc...build_quant...build_quant...build_quant...random_forest.Rrandom_forest.Rrandom_forest.Rrd_to_md.Rrd_to_md.Rrd_to_md.Rintersect_a...intersect_a...intersect_a...create_sta...create_sta...create_sta...merge_and_...merge_and_...merge_and_...run_test_s...run_test_s...run_test_s...processin...processin...processin...create_st...create_st...create_st...run_test_...run_test_...run_test_...segmentat...segmentat...segmentat...create_de...create_de...create_de...map_tile_...map_tile_...map_tile_...init_data...init_data...init_data...detection.Rdetection.Rdetection.Rrd_to_res...rd_to_res...rd_to_res...get_tree_...get_tree_...get_tree_...capitaliz...capitaliz...capitaliz...get_dete...get_dete...get_dete...init.Rinit.Rinit.Rfind_n_n...find_n_n...find_n_n...lfa_crea...lfa_crea...lfa_crea...Bundesl%C3%A4nder_2...Bundesl%C3%A4nder_2...Bundesl%C3%A4nder_2...Bundesländer_20...Bundesländer_20...Bundesländer_20...Bundesländ...Bundesländ...Bundesländ....R.Rd.bib.gitignore.man.md.py.qmd.sh.svg.xml.ymleach dot sized by file size \ No newline at end of file