workflowr
Last updated: 2025-01-07
Checks: 7
0
Knit directory: analysis-user-group/
This reproducible R Markdown
analysis was created with workflowr (version
1.7.1). The Checks tab describes the reproducibility checks
that were applied when the results were created. The Past
versions tab lists the development history.
Great! Since the R Markdown file has been committed to the Git
repository, you know the exact version of the code that produced these
results.
Great job! The global environment was empty. Objects defined in the
global environment can affect the analysis in your R Markdown file in
unknown ways. For reproduciblity it’s best to always run the code in an
empty environment.
The command set.seed(1337)
was run prior to running the
code in the R Markdown file. Setting a seed ensures that any results
that rely on randomness, e.g. subsampling or permutations, are
reproducible.
Nice! There were no cached chunks for this analysis, so you can be
confident that you successfully produced the results during this
run.
Great job! Using relative paths to the files within your workflowr
project makes it easier to run your code on other machines.
Great! You are using Git for version control. Tracking code development
and connecting the code version to the results is critical for
reproducibility.
The results in this page were generated with repository version
0ecb65d .
See the Past versions tab to see a history of the changes made
to the R Markdown and HTML files.
Note that you need to be careful to ensure that all relevant files for
the analysis have been committed to Git prior to generating the results
(you can use wflow_publish
or
wflow_git_commit
). workflowr only checks the R Markdown
file, but you know if there are other scripts or data files that it
depends on. Below is the status of the Git repository when the results
were generated:
Ignored files:
Ignored: .DS_Store
Ignored: analysis/.DS_Store
Unstaged changes:
Modified: workflow.R
Note that any generated files, e.g. HTML, png, CSS, etc., are not
included in this status report because it is ok for generated content to
have uncommitted changes.
These are the previous versions of the repository in which changes were
made to the R Markdown (analysis/0_start.Rmd
) and HTML
(docs/0_start.html
) files. If you’ve configured a remote
Git repository (see ?wflow_git_remote
), click on the
hyperlinks in the table below to view the files as they were in that
past version.
File
Version
Author
Date
Message
Rmd
0ecb65d
DrThomasOneil
2025-01-07
Updated Getting Started in R. Chapter 1 completed
html
c893d70
DrThomasOneil
2025-01-06
Build site.
Rmd
8eec2ce
DrThomasOneil
2025-01-06
Initial Deployment
html
660b0f8
DrThomasOneil
2025-01-06
Build site.
html
2e79a1d
DrThomasOneil
2025-01-06
Build site.
Rmd
451a21f
DrThomasOneil
2025-01-06
Initial Deployment
Rmd
2eeb8dc
DrThomasOneil
2024-12-26
first draft
This 10-session workshop series is designed to introduce users to R
programming with a focus on bioinformatics workflows and
reproducibility. It emphasizes the mindset shift required to transition
from manual tools like Excel to programmatic data analysis.
Start
Tutorial →
Session 0: What Is Programming? Shifting
Mindsets
Goals:
Introduce programming concepts and the mindset behind programmatic
workflows.
• Transition from manual tools (e.g. Excel & Prism) to
programming-based workflows.
• Understand the concept of handling data using code.
• Learn to navigate directories and file paths programmatically.
• Emphasize reproducibility and structured workflows.
Go
to Chapter →
Chapter 1: Getting Started with R and RStudio
Goal: Set up R and RStudio, and get familiar with
the interface.
Installing R and RStudio.
Exploring the interface – Console, Environment, Scripts.
Setting up a project.
Installing and loading packages.
Practice: - Create and save an R script. - Install
and load a package (e.g., tidyverse
).
Go
to Chapter →
Chapter 2: Data Types and Structures
Goal: Learn about data types and structures in
R.
Basic data types: numeric, character, logical.
Data structures: vectors, matrices, data frames, lists.
Importing data (Excel and CSV files).
Viewing and summarizing data.
Practice: - Load flow cytometry data and explore
structure. - Create and index vectors and data frames.
Go
to Chapter →
Chapter 3: Basic Programming and Control
Structures
Goal: Understand programming logic for automating
tasks.
Variables and assignments.
Conditional statements (if
, else
).
Loops (for
, while
).
Writing functions.
Practice: - Write functions to calculate percentages
dynamically. - Automate filtering tasks.
Go
to Chapter →
Chapter 4: Data Manipulation with
dplyr
Goal: Introduce dplyr
for filtering,
mutating, and summarizing data.
Filtering rows (filter()
), selecting columns
(select()
).
Adding new columns (mutate()
).
Grouping and summarizing (group_by()
+
summarize()
).
Practice: - Calculate proportions for CD4/CD8
populations. - Add calculated columns for analysis.
Go
to Chapter →
Chapter 5: Visualization with ggplot2
– Part
1
Goal: Create and customize visualizations.
Basics of ggplot2
– scatter, bar, and boxplots.
Customizing labels, themes, and colors.
Practice: - Visualize CD4 vs CD8 proportions. - Add
colors and themes.
Go
to Chapter →
Chapter 6: Advanced Visualization with ggplot2
– Part 2
Goal: Learn advanced visualization techniques.
Faceting and small multiples.
Combining plots (grid layouts).
Saving high-resolution plots.
Practice: - Create faceted boxplots for subsets. -
Export plots for reports.
Go
to Chapter →
Chapter 7: Statistical Analysis
Goal: Understand descriptive and inferential
statistics.
Descriptive statistics: mean, median, mode.
Hypothesis testing (t-tests, ANOVA).
Correlation and regression.
Practice: - Test differences in CD4 proportions. -
Perform correlation analysis.
Go
to Chapter →
Chapter 8: Reproducible Reports with RMarkdown
Goal: Build dynamic and shareable reports.
Introduction to RMarkdown.
Combining text, code, and visuals.
Exporting to PDF and HTML.
Practice: - Create a report summarizing flow
cytometry data. - Embed visualizations and tables.
Go
to Chapter →
Chapter 9: Mini Project – Putting It All
Together
Goal: Apply skills to a complete workflow.
Practice: - Load and clean data. - Summarize and
visualize trends. - Run tests and compile everything into a report.
Go
to Chapter →
Chapter 10: Troubleshooting and Workflow
Design
Goal: Teach debugging strategies and workflow
optimization.
Debugging errors and warnings.
Writing modular scripts (functions).
Organizing larger projects.
Brief intro to Git/GitHub for version control.
Practice: - Debug a script with errors. -
Restructure code for reusability.
Go
to Chapter →
Session information
R version 4.4.0 (2024-04-24)
Platform: aarch64-apple-darwin20
Running under: macOS Sonoma 14.3
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.0
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
time zone: Australia/Sydney
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] workflowr_1.7.1
loaded via a namespace (and not attached):
[1] vctrs_0.6.5 httr_1.4.7 cli_3.6.3 knitr_1.49
[5] rlang_1.1.4 xfun_0.49 stringi_1.8.4 processx_3.8.4
[9] promises_1.3.2 jsonlite_1.8.9 glue_1.8.0 rprojroot_2.0.4
[13] git2r_0.35.0 htmltools_0.5.8.1 httpuv_1.6.15 ps_1.8.1
[17] sass_0.4.9 fansi_1.0.6 rmarkdown_2.29 tibble_3.2.1
[21] jquerylib_0.1.4 evaluate_1.0.1 fastmap_1.2.0 yaml_2.3.10
[25] lifecycle_1.0.4 whisker_0.4.1 stringr_1.5.1 compiler_4.4.0
[29] fs_1.6.5 pkgconfig_2.0.3 Rcpp_1.0.13-1 rstudioapi_0.17.1
[33] later_1.4.1 digest_0.6.37 R6_2.5.1 utf8_1.2.4
[37] pillar_1.9.0 callr_3.7.6 magrittr_2.0.3 bslib_0.8.0
[41] tools_4.4.0 cachem_1.1.0 getPass_0.2-4
LS0tCnRpdGxlOiAiR2V0dGluZyBTdGFydGVkIGluIFIgKDIwMjUpIgphdXRob3I6ICJUaG9tYXMgUi4gTydOZWlsIgpvdXRwdXQ6CiAgd29ya2Zsb3dyOjp3Zmxvd19odG1sOgogICAgdG9jOiBubwotLS0KCmBgYHtodG1sLCBpbmNsdWRlPUZ9CjxzY3JpcHQ+CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7CiAgY29uc3QgY2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0nKTsKICBjaGVja2JveGVzLmZvckVhY2goKGNoZWNrYm94KSA9PiB7CiAgICBjaGVja2JveC5jaGVja2VkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oY2hlY2tib3guaWQpID09PSAndHJ1ZSc7CiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGNoZWNrYm94LmlkLCBjaGVja2JveC5jaGVja2VkKTsKICAgIH0pOwogIH0pOwp9KTsKPC9zY3JpcHQ+CmBgYAoKVGhpcyAxMC1zZXNzaW9uIHdvcmtzaG9wIHNlcmllcyBpcyBkZXNpZ25lZCB0byBpbnRyb2R1Y2UgdXNlcnMgdG8gUiBwcm9ncmFtbWluZyB3aXRoIGEgZm9jdXMgb24gYmlvaW5mb3JtYXRpY3Mgd29ya2Zsb3dzIGFuZCByZXByb2R1Y2liaWxpdHkuIEl0IGVtcGhhc2l6ZXMgdGhlIG1pbmRzZXQgc2hpZnQgcmVxdWlyZWQgdG8gdHJhbnNpdGlvbiBmcm9tIG1hbnVhbCB0b29scyBsaWtlIEV4Y2VsIHRvIHByb2dyYW1tYXRpYyBkYXRhIGFuYWx5c2lzLgoKW1N0YXJ0IFR1dG9yaWFsIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svaW5kZXguaHRtbCkKCjx3aW1yPgoKIyMgKipTZXNzaW9uIDA6IFdoYXQgSXMgUHJvZ3JhbW1pbmc/IFNoaWZ0aW5nIE1pbmRzZXRzKioKCjxkaXYgY2xhc3M9ImhpbnQtZ29hbHMiPiAgICAKKipHb2FsczoqKiAgICAKSW50cm9kdWNlIHByb2dyYW1taW5nIGNvbmNlcHRzIGFuZCB0aGUgbWluZHNldCBiZWhpbmQgcHJvZ3JhbW1hdGljIHdvcmtmbG93cy4gICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBUcmFuc2l0aW9uIGZyb20gbWFudWFsIHRvb2xzIChlLmcuIEV4Y2VsICYgUHJpc20pIHRvIHByb2dyYW1taW5nLWJhc2VkIHdvcmtmbG93cy4gIAombmJzcDsmbmJzcDsmIzgyMjY7IFVuZGVyc3RhbmQgdGhlIGNvbmNlcHQgb2YgaGFuZGxpbmcgZGF0YSB1c2luZyBjb2RlLiAgCiZuYnNwOyZuYnNwOyYjODIyNjsgTGVhcm4gdG8gbmF2aWdhdGUgZGlyZWN0b3JpZXMgYW5kIGZpbGUgcGF0aHMgcHJvZ3JhbW1hdGljYWxseS4gIAombmJzcDsmbmJzcDsmIzgyMjY7IEVtcGhhc2l6ZSByZXByb2R1Y2liaWxpdHkgYW5kIHN0cnVjdHVyZWQgd29ya2Zsb3dzLiAgICAKPC9kaXY+CgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vYW5hbHlzaXMtdXNlci1ncm91cC9yLXR1dG9yaWFsL19ib29rL2ludHJvZHVjdGlvbi5odG1sKQoKPHdpbXI+CgojIyAqKkNoYXB0ZXIgMTogR2V0dGluZyBTdGFydGVkIHdpdGggUiBhbmQgUlN0dWRpbyoqCioqR29hbDoqKiBTZXQgdXAgUiBhbmQgUlN0dWRpbywgYW5kIGdldCBmYW1pbGlhciB3aXRoIHRoZSBpbnRlcmZhY2UuCgotIEluc3RhbGxpbmcgUiBhbmQgUlN0dWRpby4KLSBFeHBsb3JpbmcgdGhlIGludGVyZmFjZSDigJMgQ29uc29sZSwgRW52aXJvbm1lbnQsIFNjcmlwdHMuCi0gU2V0dGluZyB1cCBhIHByb2plY3QuCi0gSW5zdGFsbGluZyBhbmQgbG9hZGluZyBwYWNrYWdlcy4KCioqUHJhY3RpY2U6KioKLSBDcmVhdGUgYW5kIHNhdmUgYW4gUiBzY3JpcHQuCi0gSW5zdGFsbCBhbmQgbG9hZCBhIHBhY2thZ2UgKGUuZy4sIGB0aWR5dmVyc2VgKS4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svY2hhcHRlci0xLWdldHRpbmctc3RhcnRlZC1pbi1SLWFuZC1SU3R1ZGlvLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciAyOiBEYXRhIFR5cGVzIGFuZCBTdHJ1Y3R1cmVzKioKKipHb2FsOioqIExlYXJuIGFib3V0IGRhdGEgdHlwZXMgYW5kIHN0cnVjdHVyZXMgaW4gUi4KCi0gQmFzaWMgZGF0YSB0eXBlczogbnVtZXJpYywgY2hhcmFjdGVyLCBsb2dpY2FsLgotIERhdGEgc3RydWN0dXJlczogdmVjdG9ycywgbWF0cmljZXMsIGRhdGEgZnJhbWVzLCBsaXN0cy4KLSBJbXBvcnRpbmcgZGF0YSAoRXhjZWwgYW5kIENTViBmaWxlcykuCi0gVmlld2luZyBhbmQgc3VtbWFyaXppbmcgZGF0YS4KCioqUHJhY3RpY2U6KioKLSBMb2FkIGZsb3cgY3l0b21ldHJ5IGRhdGEgYW5kIGV4cGxvcmUgc3RydWN0dXJlLgotIENyZWF0ZSBhbmQgaW5kZXggdmVjdG9ycyBhbmQgZGF0YSBmcmFtZXMuCgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vYW5hbHlzaXMtdXNlci1ncm91cC9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItMi1kYXRhLXR5cGVzLWFuZC1zdHJ1Y3R1cmVzLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciAzOiBCYXNpYyBQcm9ncmFtbWluZyBhbmQgQ29udHJvbCBTdHJ1Y3R1cmVzKioKKipHb2FsOioqIFVuZGVyc3RhbmQgcHJvZ3JhbW1pbmcgbG9naWMgZm9yIGF1dG9tYXRpbmcgdGFza3MuCgotIFZhcmlhYmxlcyBhbmQgYXNzaWdubWVudHMuCi0gQ29uZGl0aW9uYWwgc3RhdGVtZW50cyAoYGlmYCwgYGVsc2VgKS4KLSBMb29wcyAoYGZvcmAsIGB3aGlsZWApLgotIFdyaXRpbmcgZnVuY3Rpb25zLgoKKipQcmFjdGljZToqKgotIFdyaXRlIGZ1bmN0aW9ucyB0byBjYWxjdWxhdGUgcGVyY2VudGFnZXMgZHluYW1pY2FsbHkuCi0gQXV0b21hdGUgZmlsdGVyaW5nIHRhc2tzLgoKW0dvIHRvIENoYXB0ZXIg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL2FuYWx5c2lzLXVzZXItZ3JvdXAvci10dXRvcmlhbC9fYm9vay9jaGFwdGVyLTMtYmFzaWMtcHJvZ3JhbW1pbmcuaHRtbCkKCjx3aW1yPgoKIyMgKipDaGFwdGVyIDQ6IERhdGEgTWFuaXB1bGF0aW9uIHdpdGggYGRwbHlyYCoqCioqR29hbDoqKiBJbnRyb2R1Y2UgYGRwbHlyYCBmb3IgZmlsdGVyaW5nLCBtdXRhdGluZywgYW5kIHN1bW1hcml6aW5nIGRhdGEuCgotIEZpbHRlcmluZyByb3dzIChgZmlsdGVyKClgKSwgc2VsZWN0aW5nIGNvbHVtbnMgKGBzZWxlY3QoKWApLgotIEFkZGluZyBuZXcgY29sdW1ucyAoYG11dGF0ZSgpYCkuCi0gR3JvdXBpbmcgYW5kIHN1bW1hcml6aW5nIChgZ3JvdXBfYnkoKWAgKyBgc3VtbWFyaXplKClgKS4KCioqUHJhY3RpY2U6KioKLSBDYWxjdWxhdGUgcHJvcG9ydGlvbnMgZm9yIENENC9DRDggcG9wdWxhdGlvbnMuCi0gQWRkIGNhbGN1bGF0ZWQgY29sdW1ucyBmb3IgYW5hbHlzaXMuCgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vYW5hbHlzaXMtdXNlci1ncm91cC9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItNC1kYXRhLW1hbmlwdWxhdGlvbi13aXRoLWRwbHlyLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciA1OiBWaXN1YWxpemF0aW9uIHdpdGggYGdncGxvdDJgIOKAkyBQYXJ0IDEqKgoqKkdvYWw6KiogQ3JlYXRlIGFuZCBjdXN0b21pemUgdmlzdWFsaXphdGlvbnMuCgotIEJhc2ljcyBvZiBgZ2dwbG90MmAg4oCTIHNjYXR0ZXIsIGJhciwgYW5kIGJveHBsb3RzLgotIEN1c3RvbWl6aW5nIGxhYmVscywgdGhlbWVzLCBhbmQgY29sb3JzLgoKKipQcmFjdGljZToqKgotIFZpc3VhbGl6ZSBDRDQgdnMgQ0Q4IHByb3BvcnRpb25zLgotIEFkZCBjb2xvcnMgYW5kIHRoZW1lcy4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svY2hhcHRlci01LWRhdGEtdmlzdWFsaXNhdGlvbi13aXRoLWdncGxvdDIuaHRtbCkKCjx3aW1yPgoKIyMgKipDaGFwdGVyIDY6IEFkdmFuY2VkIFZpc3VhbGl6YXRpb24gd2l0aCBgZ2dwbG90MmAg4oCTIFBhcnQgMioqCioqR29hbDoqKiBMZWFybiBhZHZhbmNlZCB2aXN1YWxpemF0aW9uIHRlY2huaXF1ZXMuCgotIEZhY2V0aW5nIGFuZCBzbWFsbCBtdWx0aXBsZXMuCi0gQ29tYmluaW5nIHBsb3RzIChncmlkIGxheW91dHMpLgotIFNhdmluZyBoaWdoLXJlc29sdXRpb24gcGxvdHMuCgoqKlByYWN0aWNlOioqCi0gQ3JlYXRlIGZhY2V0ZWQgYm94cGxvdHMgZm9yIHN1YnNldHMuCi0gRXhwb3J0IHBsb3RzIGZvciByZXBvcnRzLgoKW0dvIHRvIENoYXB0ZXIg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL2FuYWx5c2lzLXVzZXItZ3JvdXAvci10dXRvcmlhbC9fYm9vay9jaGFwdGVyLTYtYWR2YW5jZWQtZGF0YS12aXN1YWxpc2F0aW9uLXdpdGgtZ2dwbG90Mi5odG1sKQoKPHdpbXI+CgojIyAqKkNoYXB0ZXIgNzogU3RhdGlzdGljYWwgQW5hbHlzaXMqKgoqKkdvYWw6KiogVW5kZXJzdGFuZCBkZXNjcmlwdGl2ZSBhbmQgaW5mZXJlbnRpYWwgc3RhdGlzdGljcy4KCi0gRGVzY3JpcHRpdmUgc3RhdGlzdGljczogbWVhbiwgbWVkaWFuLCBtb2RlLgotIEh5cG90aGVzaXMgdGVzdGluZyAodC10ZXN0cywgQU5PVkEpLgotIENvcnJlbGF0aW9uIGFuZCByZWdyZXNzaW9uLgoKKipQcmFjdGljZToqKgotIFRlc3QgZGlmZmVyZW5jZXMgaW4gQ0Q0IHByb3BvcnRpb25zLgotIFBlcmZvcm0gY29ycmVsYXRpb24gYW5hbHlzaXMuCgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vYW5hbHlzaXMtdXNlci1ncm91cC9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItNy1zdGF0aXN0aWNhbC1hbmFseXNpcy5odG1sKQoKPHdpbXI+CgojIyAqKkNoYXB0ZXIgODogUmVwcm9kdWNpYmxlIFJlcG9ydHMgd2l0aCBSTWFya2Rvd24qKgoqKkdvYWw6KiogQnVpbGQgZHluYW1pYyBhbmQgc2hhcmVhYmxlIHJlcG9ydHMuCgotIEludHJvZHVjdGlvbiB0byBSTWFya2Rvd24uCi0gQ29tYmluaW5nIHRleHQsIGNvZGUsIGFuZCB2aXN1YWxzLgotIEV4cG9ydGluZyB0byBQREYgYW5kIEhUTUwuCgoqKlByYWN0aWNlOioqCi0gQ3JlYXRlIGEgcmVwb3J0IHN1bW1hcml6aW5nIGZsb3cgY3l0b21ldHJ5IGRhdGEuCi0gRW1iZWQgdmlzdWFsaXphdGlvbnMgYW5kIHRhYmxlcy4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9hbmFseXNpcy11c2VyLWdyb3VwL3ItdHV0b3JpYWwvX2Jvb2svY2hhcHRlci04LXJlcHJvZHVjaWJsZS1yZXBvcnRzLXdpdGgtcm1hcmtkb3duLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciA5OiBNaW5pIFByb2plY3Qg4oCTIFB1dHRpbmcgSXQgQWxsIFRvZ2V0aGVyKioKKipHb2FsOioqIEFwcGx5IHNraWxscyB0byBhIGNvbXBsZXRlIHdvcmtmbG93LgoKKipQcmFjdGljZToqKgotIExvYWQgYW5kIGNsZWFuIGRhdGEuCi0gU3VtbWFyaXplIGFuZCB2aXN1YWxpemUgdHJlbmRzLgotIFJ1biB0ZXN0cyBhbmQgY29tcGlsZSBldmVyeXRoaW5nIGludG8gYSByZXBvcnQuCgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vYW5hbHlzaXMtdXNlci1ncm91cC9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItOS1taW5pLXByb2plY3QtcHV0dGluZy1pdC1hbGwtdG9nZXRoZXIuaHRtbCkKCjx3aW1yPgoKIyMgKipDaGFwdGVyIDEwOiBUcm91Ymxlc2hvb3RpbmcgYW5kIFdvcmtmbG93IERlc2lnbioqCioqR29hbDoqKiBUZWFjaCBkZWJ1Z2dpbmcgc3RyYXRlZ2llcyBhbmQgd29ya2Zsb3cgb3B0aW1pemF0aW9uLgoKLSBEZWJ1Z2dpbmcgZXJyb3JzIGFuZCB3YXJuaW5ncy4KLSBXcml0aW5nIG1vZHVsYXIgc2NyaXB0cyAoZnVuY3Rpb25zKS4KLSBPcmdhbml6aW5nIGxhcmdlciBwcm9qZWN0cy4KLSBCcmllZiBpbnRybyB0byBHaXQvR2l0SHViIGZvciB2ZXJzaW9uIGNvbnRyb2wuCgoqKlByYWN0aWNlOioqCi0gRGVidWcgYSBzY3JpcHQgd2l0aCBlcnJvcnMuCi0gUmVzdHJ1Y3R1cmUgY29kZSBmb3IgcmV1c2FiaWxpdHkuCgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vYW5hbHlzaXMtdXNlci1ncm91cC9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItMTAtdHJvdWJsZXNob290aW5nLWFuZC13b3JrZmxvdy1kZXNpZ24uaHRtbCkKCjx3aW1yPgoKCg==