diff --git a/.Rprofile b/.Rprofile index 5b36bc35..81b960f5 100644 --- a/.Rprofile +++ b/.Rprofile @@ -1,26 +1 @@ source("renv/activate.R") - -# Set the repos using the renv.lock file -renv_json <- jsonlite::read_json("renv.lock") -renv_r_repos <- renv_json$R$Repositories - -# Extract the names -repo_names <- purrr::flatten_chr( - purrr::map(renv_r_repos, - ~ .x$Name) -) - -# Extract the URLs -repo_urls <- purrr::flatten_chr( - purrr::map(renv_r_repos, - ~ .x$URL) -) - -# Set the repo names -names(repo_urls) <- repo_names - -# Set the options -options(repos = repo_urls) - -# Remove all these objects -rm(renv_json, renv_r_repos, repo_names, repo_urls) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 13cfb828..22feafa8 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -19,16 +19,27 @@ on: - renv.lock - requirements.txt - current-modules.json + - .github/workflows/build-docker.yml -# A workflow run is made up of one or more jobs that can run sequentially or in parallel +env: + REGISTRY_IMAGE: ccdl/training_rstudio jobs: - # This workflow contains a single job called "build" build: - # The type of runner that the job will run on - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - platform: linux/amd64 + runner: ubuntu-latest + - platform: linux/arm64 + runner: ubuntu-24.04-arm + runs-on: ${{ matrix.runner }} - # Steps represent a sequence of tasks that will be executed as part of the job steps: + - name: Prepare env variables + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - name: Check out the repo uses: actions/checkout@v5 @@ -36,7 +47,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') run: | GIT_TAG=${GITHUB_REF#refs/tags/} - MODULES_TAG=$(jq -r '.release-tag' current-modules.json) + MODULES_TAG=$(jq -r '."release-tag"' current-modules.json) if [ "$GIT_TAG" != "$MODULES_TAG" ]; then echo "Error: current-modules.json release-tag ($MODULES_TAG) does not match git tag ($GIT_TAG)" echo "Please update release-tag in current-modules.json to match the git tag (and modules, if needed), then update the GitHub release accordingly." @@ -44,23 +55,22 @@ jobs: fi - name: Load 1Password secrets - uses: 1password/load-secrets-action@v2 + uses: 1password/load-secrets-action@v3 with: export-env: true env: OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.TRAINING_OP_SERVICE_ACCOUNT_TOKEN }} DOCKER_USER: ${{ secrets.OP_DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.OP_DOCKER_PASSWORD }} - ACTION_MONITORING_SLACK: ${{ secrets.OP_ACTION_MONITORING_SLACK }} - # Login to Dockerhub - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ env.DOCKER_USER }} password: ${{ env.DOCKER_PASSWORD }} - # set up Docker build + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -68,7 +78,74 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ccdl/training_rstudio + images: ${{ env.REGISTRY_IMAGE }} + + # Build Docker image, push only on push events + - name: Build Docker image + id: build + uses: docker/build-push-action@v6 + with: + push: ${{ github.event_name == 'push' }} + platforms: ${{ matrix.platform }} + outputs: type=image,push-by-digest=true,name-canonical=true + labels: ${{ steps.meta.outputs.labels }} + tags: ${{ env.REGISTRY_IMAGE }} + cache-from: type=registry,ref=${{ env.REGISTRY_IMAGE }}:buildcache-${{ env.PLATFORM_PAIR }} + cache-to: type=registry,ref=${{ env.REGISTRY_IMAGE }}:buildcache-${{ env.PLATFORM_PAIR }},mode=max + + - name: Export digest + if: github.event_name == 'push' + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + if: github.event_name == 'push' + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + needs: + - build + # only merge the manifests and push on push events + if: github.event_name == 'push' + steps: + - name: Load 1Password secrets + uses: 1password/load-secrets-action@v3 + with: + export-env: true + env: + OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.TRAINING_OP_SERVICE_ACCOUNT_TOKEN }} + DOCKER_USER: ${{ secrets.OP_DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.OP_DOCKER_PASSWORD }} + ACTION_MONITORING_SLACK: ${{ secrets.OP_ACTION_MONITORING_SLACK }} + + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: ${{ runner.temp }}/digests + pattern: digests-* + merge-multiple: true + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ env.DOCKER_USER }} + password: ${{ env.DOCKER_PASSWORD }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} # each github tag will create a matching tag on dockerhub, # with the most recent given the "latest" tag # the most recent push to master will get an "edge" tag @@ -76,18 +153,19 @@ jobs: type=ref,event=tag type=edge,branch=master - # Build Docker image, push only on push events - - name: Build Docker image - uses: docker/build-push-action@v5 - with: - push: ${{ github.event_name == 'push' }} - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=registry,ref=ccdl/training_rstudio:buildcache - cache-to: type=registry,ref=ccdl/training_rstudio:buildcache,mode=max + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} # If we have a failure, Slack us - name: Report failure to Slack - if: ${{ github.event_name == 'push' }} + if: ${{ failure() }} uses: ravsamhq/notify-slack-action@v2 with: status: ${{ job.status }} diff --git a/.github/workflows/make-live.yml b/.github/workflows/make-live.yml index d10d0a2c..c37b4f6f 100644 --- a/.github/workflows/make-live.yml +++ b/.github/workflows/make-live.yml @@ -14,20 +14,22 @@ jobs: make-live: # The type of runner that the job will run on runs-on: ubuntu-latest - container: - image: ccdl/training_rstudio:edge steps: + - name: Free disk space + run: | + sudo rm -rf /usr/local/lib/android + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf /usr/local/share/boost + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + # Print free disk space + df -h + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - name: Checkout code uses: actions/checkout@v4 - - name: Configure git - run: | - git config --global --add safe.directory "$GITHUB_WORKSPACE" - git config --local user.email "actions@github.com" - git config --local user.name "GitHub Actions" - - name: Load 1Password secrets uses: 1password/load-secrets-action@v2 with: @@ -43,15 +45,26 @@ jobs: env: AWS_DEFAULT_REGION: us-east-1 run: | - aws s3 sync s3://ccdl-training-data/training-modules/ . + aws s3 sync s3://ccdl-training-data/training-modules/ . --no-progress + + - name: Pull latest Docker image + run: | + docker pull ccdl/training_rstudio:edge - name: Render notebooks env: RENDER_RMD: ${{ github.event.inputs.rendering }} - run: bash scripts/render-live.sh + run: | + docker run --rm \ + --mount type=bind,source="$GITHUB_WORKSPACE",target=/training-modules \ + -w /training-modules \ + -e RENDER_RMD \ + ccdl/training_rstudio:edge \ + bash scripts/render-live.sh # Make changes to pull request here - name: Create PR with rendered notebooks + id: cpr uses: peter-evans/create-pull-request@v6 with: token: ${{ env.DOCS_BOT_GITHUB_TOKEN }} diff --git a/.github/workflows/render-rmds.yml b/.github/workflows/render-rmds.yml index 3b3cd56c..14271387 100644 --- a/.github/workflows/render-rmds.yml +++ b/.github/workflows/render-rmds.yml @@ -6,20 +6,29 @@ on: branches: - master paths: - - '**.Rmd' - - '!**-live.Rmd' # don't trigger for live-only changes - - '!**/exercise*.Rmd' # or exercise notebooks - - '!**/setup/**.Rmd' # or setup notebooks - - 'scripts/make-live.R' - - 'scripts/render-live.sh' + - ".github/workflows/render-rmds.yml" + - "**.Rmd" + - "!**-live.Rmd" # don't trigger for live-only changes + - "!**/exercise*.Rmd" # or exercise notebooks + - "!**/setup/**.Rmd" # or setup notebooks + - "scripts/make-live.R" + - "scripts/render-live.sh" jobs: test-render: runs-on: ubuntu-latest - container: - image: ccdl/training_rstudio:edge steps: + - name: Free disk space + run: | + sudo rm -rf /usr/local/lib/android + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf /usr/local/share/boost + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + # Print free disk space + df -h + - name: Checkout code uses: actions/checkout@v4 @@ -36,8 +45,16 @@ jobs: env: AWS_DEFAULT_REGION: us-east-1 run: | - aws s3 sync s3://ccdl-training-data/training-modules/ . + aws s3 sync s3://ccdl-training-data/training-modules/ . --no-progress + - name: Pull latest Docker image + run: | + docker pull ccdl/training_rstudio:edge - name: Render notebooks - run: bash scripts/render-live.sh + run: | + docker run --rm \ + --mount type=bind,source="$GITHUB_WORKSPACE",target=/training-modules \ + -w /training-modules \ + ccdl/training_rstudio:edge \ + bash scripts/render-live.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 15b2b996..34b25a16 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -215,7 +215,7 @@ In practice, this means that you will not need to add individual R packages to t To use the Docker image for development, pull from Docker Hub with: ``` -docker pull --platform linux/amd64 ccdl/training_rstudio:edge +docker pull ccdl/training_rstudio:edge ``` To run the container and mount a local volume, use the following from the root of this repository: diff --git a/Dockerfile b/Dockerfile index e551636f..9d08dc91 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ # Build salmon from source in a separate image -FROM ubuntu:22.04 AS build +# matching base image from https://github.com/rocker-org/rocker-versioned2/blob/master/dockerfiles/r-ver_4.5.2.Dockerfile +FROM docker.io/library/ubuntu:noble AS build # Build dependencies RUN apt-get update -qq @@ -15,6 +16,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ libdeflate-dev \ libisal-dev \ liblzma-dev \ + libzstd-dev \ make \ pkg-config \ unzip \ @@ -29,7 +31,7 @@ RUN unzip awscliv2.zip RUN ./aws/install # Build salmon -ARG SALMON_VERSION=1.10.1 +ARG SALMON_VERSION=1.10.3 RUN curl -LO https://github.com/COMBINE-lab/salmon/archive/refs/tags/v${SALMON_VERSION}.tar.gz RUN tar xzf v${SALMON_VERSION}.tar.gz RUN mkdir salmon-${SALMON_VERSION}/build @@ -45,12 +47,12 @@ RUN cd fastp-${FASTP_VERSION} && \ make && make install # Main image with Biocconductor and other tools -FROM bioconductor/bioconductor_docker:3.19 AS final +FROM bioconductor/bioconductor_docker:3.22 AS final LABEL maintainer="ccdl@alexslemonade.org" WORKDIR /rocker-build/ -# Additonal dependencies for AWS runtime +# Additional dependencies for AWS runtime RUN apt-get update -qq RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ glibc-source \ @@ -66,21 +68,19 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ # Python packages COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt +RUN pip install -r requirements.txt --break-system-packages # Use renv for R packages WORKDIR /usr/local/renv ENV RENV_CONFIG_CACHE_ENABLED=FALSE RUN Rscript -e "install.packages('renv')" -# Temporary fix for broken(?) RSamtools package -RUN Rscript -e "install.packages('BiocManager'); BiocManager::install('Rsamtools')" COPY renv.lock renv.lock -RUN Rscript -e "renv::restore()" \ - rm -rf ~/.cache/R/renv && \ - rm -rf /tmp/downloaded_packages && \ - rm -rf /tmp/Rtmp* +RUN Rscript -e "options(pkgType='binary'); renv::restore(repos = c(CRAN = 'https://packagemanager.posit.co/cran/__linux__/noble/latest'))" \ + && rm -rf ~/.cache/R/renv \ + && rm -rf /tmp/downloaded_packages \ + && rm -rf /tmp/Rtmp* # copy aws, salmon, and fastp binaries from the build image COPY --from=build /usr/local/aws-cli/ /usr/local/aws-cli/ diff --git a/RNA-seq/01-qc_trim_quant.Rmd b/RNA-seq/01-qc_trim_quant.Rmd index aa6ca7ac..f5299c1c 100644 --- a/RNA-seq/01-qc_trim_quant.Rmd +++ b/RNA-seq/01-qc_trim_quant.Rmd @@ -247,7 +247,7 @@ The index we used was built with `-k 23` and can be found here: index/Homo_sapiens/short_index ``` -Using a smaller value for _k_ than the default (_k_ = 31) is appropriate for shorter reads and may improve sensitivity when using `--validateMappings` according to the [Salmon documentation](https://salmon.readthedocs.io/en/latest/salmon.html#preparing-transcriptome-indices-mapping-based-mode). +Using a smaller value for _k_ than the default (_k_ = 31) is appropriate for shorter reads and may improve sensitivity when using `--validateMappings` according to the [Salmon documentation](https://salmon.readthedocs.io/en/latest/salmon.html#salmon). #### `-l` @@ -285,5 +285,5 @@ The `--threads` argument controls the number of threads that are available to Sa This in essence controls how much of the mapping can occur in parallel. If you had access to a computer with many cores, you could increase the number of threads to make quantification go faster. -**Navigate to** `data/gastric-cancer/salmon_quant/SRR585571/aux_info` **and open** `meta_info.json`**. +**Navigate to** `data/gastric-cancer/salmon_quant/SRR585570/aux_info` **and open** `meta_info.json`**. Look for a field called** `percent_mapped` **-- what value does this sample have?** diff --git a/RNA-seq/02-gastric_cancer_tximeta.Rmd b/RNA-seq/02-gastric_cancer_tximeta.Rmd index 0738a6c5..a8fe752e 100644 --- a/RNA-seq/02-gastric_cancer_tximeta.Rmd +++ b/RNA-seq/02-gastric_cancer_tximeta.Rmd @@ -120,24 +120,24 @@ sample_meta_df <- readr::read_tsv(meta_file) sample_meta_df ``` -We'll want this information to be added to the `coldata`, which we can do by using a join function to match up the rows between the two data frames and combine them. +We'll want this information to be added to the `coldata`, which we can do by using a join function to match up the rows between the two data frames and combine them to create a new data frame `coldata_joined`. ```{r join-sample_meta_df} -coldata <- coldata |> +coldata_joined <- coldata |> dplyr::inner_join(sample_meta_df, by = c("names" = "srr_accession")) -coldata +coldata_joined ``` ## Import expression data with `tximeta` -Using the `coldata` data frame that we set up, we can now run the `tximeta()` to import our expression data while automatically finding and associating the transcript annotations that were used when we performed the quantification. +Using the `coldata_joined` data frame that we set up, we can now run the `tximeta()` to import our expression data while automatically finding and associating the transcript annotations that were used when we performed the quantification. The first time you run `tximeta()` you may get a message about storing downloaded transcriptome data in a cache directory so that it can retrieve the data more quickly the next time. We recommend you use the cache, and accept the default location. ```{r tximeta, live = TRUE} -txi_data <- tximeta(coldata) +txi_data <- tximeta(coldata_joined) ``` *tximeta currently works easily for most human and mouse datasets, but requires a [few more steps for other species](https://bioconductor.org/packages/release/bioc/vignettes/tximeta/inst/doc/tximeta.html#What_if_checksum_isn%E2%80%99t_known). diff --git a/RNA-seq/02-gastric_cancer_tximeta.nb.html b/RNA-seq/02-gastric_cancer_tximeta.nb.html index 99d9795d..ce6fa77e 100644 --- a/RNA-seq/02-gastric_cancer_tximeta.nb.html +++ b/RNA-seq/02-gastric_cancer_tximeta.nb.html @@ -3264,8 +3264,8 @@

Summarize to gene

# Summarize to the gene level
 gene_summarized <- summarizeToGene(txi_data)
- -
loading existing EnsDb created: 2025-07-16 21:08:01
+ +
loading existing EnsDb created: 2025-11-20 20:30:47
obtaining transcript-to-gene mapping from database
diff --git a/components/dependencies.R b/components/dependencies.R index fe381a4e..358fe6d8 100644 --- a/components/dependencies.R +++ b/components/dependencies.R @@ -36,3 +36,6 @@ library(scDblFinder) # Loom file format functions for Single Cell data library(LoomExperiment) + +# Needed for SingleR to run de with wilcox, for cell type exercises +library(scrapper) diff --git a/components/dictionary.txt b/components/dictionary.txt index b6fadbe6..0387b616 100644 --- a/components/dictionary.txt +++ b/components/dictionary.txt @@ -1,5 +1,6 @@ ʹ ⚠️ +µm Adelie ADT ADTs @@ -15,6 +16,7 @@ AllCells ALSF Amezquita AML +anaplastic Anders Angerer AnnotationDbi @@ -46,6 +48,8 @@ biomolecular bioRxiv biospecimen Blasi +blastema +blastemal BMC Bonferroni bp @@ -110,6 +114,7 @@ dplyr dropdown DropSeq dumpFeatures +ECM effector eigengene embeddings @@ -145,6 +150,7 @@ FCS FDR fgsea fibrotic +fiducials Figshare FLI FN @@ -191,6 +197,7 @@ hematopoietic Hemberg hexamer Hippen +histologic histologies Hm Homebrew @@ -314,6 +321,7 @@ Novia NPC NRAS NRASG +num octothorps OkabeIto oligodendrocyte @@ -343,6 +351,7 @@ pDC PDX ped permalink +permeabilized phenotypes Phred Picelli @@ -390,6 +399,7 @@ rmd Rmd RMS roadmap +roxygen RPKMs rRNA Rscript @@ -490,6 +500,7 @@ vectorization vectorized versicolor virginica +Visium vitro VST Wattenberg diff --git a/current-modules.json b/current-modules.json index bb8d68be..fe8c34c7 100644 --- a/current-modules.json +++ b/current-modules.json @@ -1,5 +1,5 @@ { - "release-tag": "2025-dev", + "release-tag": "2025-december", "modules": ["scRNA-seq-advanced"], "reference-modules": ["scRNA-seq"] } diff --git a/intro-to-R-tidyverse/01-intro_to_base_R.Rmd b/intro-to-R-tidyverse/01-intro_to_base_R.Rmd index 79a9ec9d..5240f597 100644 --- a/intro-to-R-tidyverse/01-intro_to_base_R.Rmd +++ b/intro-to-R-tidyverse/01-intro_to_base_R.Rmd @@ -418,13 +418,9 @@ question_values %in% values_1_to_20 _Data frames are one of the most useful tools for data analysis in R._ They are tables which consist of rows and columns, much like a _spreadsheet_. Each column is a variable which behaves as a _vector_, and each row is an observation. -We will begin our exploration with dataset of measurements from three penguin species measured, which we can find in the [`palmerpenguins` package](https://allisonhorst.github.io/palmerpenguins/). -We'll talk more about packages soon! -To use this dataset, we will load it from the `palmerpenguins` package using a `::` (more on this later) and assign it to a variable named `penguins` in our current environment. - -```{r penguin-library} -penguins <- palmerpenguins::penguins -``` +We will begin our exploration with dataset of measurements from three penguin species measured using the built-in R dataset `penguins`. +(This dataset was added as a built-in dataset to R version `4.5.0`; +if you are working with an earlier version of R, it is available via the [`palmerpenguins` package](https://allisonhorst.github.io/palmerpenguins/) - we'll talk more about packages soon!) ![drawings of penguin species](diagrams/lter_penguins.png) Artwork by [@allison_horst](https://twitter.com/allison_horst) @@ -456,32 +452,33 @@ This provides a short view of the **str**ucture and contents of the data frame. str(penguins) ``` -You'll notice that the column `species` is a _factor_: This is a special type of character variable that represents distinct categories known as "levels". -We have learned here that there are three levels in the `species` column: Adelie, Chinstrap, and Gentoo. +You'll notice that the columns `species`, `island`, and `sex` are labelled as _factor_: This is a special type of character variable that represents distinct categories known as "levels". +Other columns are labelled as _num_ for numeric (with decimals), or _int_ for integer (numeric without decimals). + We might want to explore individual columns of the data frame more in-depth. We can examine individual columns using the dollar sign `$` to select one by name: ```{r penguins-subset} -# Extract bill_length_mm as a vector -penguins$bill_length_mm +# Extract bill_len as a vector +penguins$bill_len # indexing operators can be used on these vectors too -penguins$bill_length_mm[1:10] +penguins$bill_len[1:10] ``` We can perform our regular vector operations on columns directly. ```{r penguins-col-mean, live = TRUE} -# calculate the mean of the bill_length_mm column -mean(penguins$bill_length_mm, +# calculate the mean of the bill_len column +mean(penguins$bill_len, na.rm = TRUE) # remove missing values before calculating the mean ``` We can also calculate the full summary statistics for a single column directly. ```{r penguins-col-summary, live = TRUE} -# show a summary of the bill_length_mm column -summary(penguins$bill_length_mm) +# show a summary of the bill_len column +summary(penguins$bill_len) ``` Extract `species` as a vector and subset it to see a preview. diff --git a/intro-to-R-tidyverse/02-intro_to_ggplot2.Rmd b/intro-to-R-tidyverse/02-intro_to_ggplot2.Rmd index fbbd2ae0..0cb33754 100644 --- a/intro-to-R-tidyverse/02-intro_to_ggplot2.Rmd +++ b/intro-to-R-tidyverse/02-intro_to_ggplot2.Rmd @@ -32,8 +32,8 @@ We performed three sets of contrasts: **More ggplot2 resources:** - [ggplot2 website](https://ggplot2.tidyverse.org/) +- [ggplot2 book](https://ggplot2-book.org/) - [Handy cheatsheet for ggplot2 (pdf)](https://github.com/rstudio/cheatsheets/raw/main/data-visualization.pdf) -- [_Data Visualization, A practical introduction_](https://socviz.co/) - [Data visualization chapter of _R for Data Science_](https://r4ds.hadley.nz/data-visualize.html) - [ggplot2 online tutorial](http://r-statistics.co/Complete-Ggplot2-Tutorial-Part1-With-R-Code.html) diff --git a/intro-to-R-tidyverse/03-intro_to_tidyverse.Rmd b/intro-to-R-tidyverse/03-intro_to_tidyverse.Rmd index b3d3d915..bc58746c 100644 --- a/intro-to-R-tidyverse/03-intro_to_tidyverse.Rmd +++ b/intro-to-R-tidyverse/03-intro_to_tidyverse.Rmd @@ -52,7 +52,8 @@ library(tidyverse) Note that if we had not imported the tidyverse set of packages using `library()` like above, and we wanted to use a tidyverse function like `read_tsv()`, we would need to tell R what package to find this function in. To do this, we would use `::` to tell R to load in this function from the `readr` package by using `readr::read_tsv()`. You will see this `::` method of referencing libraries within packages throughout the course. -We like to use it in part to remove any ambiguity in which version of a function we are using; it is not too uncommon for different packages to use the same name for very different functions! +We like to use it in part to remove any ambiguity in which version of a function we are using, even if the package was imported; it is not too uncommon for different packages to use the same name for very different functions! +We'll use `::` syntax for external functions throughout this notebook. ## Managing directories @@ -92,6 +93,7 @@ But we've also seen that this function will throw an error if you try to create A different option is to use the [`fs`](https://fs.r-lib.org/) package, which provides functions for you to interact with your computer's file system with a more consistent behavior than the base R functions. One function from this package is `fs::dir_create()` (note that it has an _underscore_, not a period), and much like the base R `dir.create()`, it creates directories. It has some other helpful features too: + - It will simply do nothing if that directory already exists; no errors, and nothing will get overwritten - It allows creating _nested_ directories by default, i.e. in one call make directories inside of other directories @@ -142,16 +144,15 @@ data_dir <- "data" ``` Although base R has functions to read in data files, the functions in the `readr` package (part of the tidyverse) are faster and more straightforward to use so we are going to use those here. -Because the file we are reading in is a TSV (tab separated values) file we will be using the `read_tsv` function. -There are analogous functions for CSV (comma separated values) files (`read_csv()`) and other files types. +Because the file we are reading in is a TSV (tab separated values) file we will be using the `readr::read_tsv()` function. +There are analogous functions for CSV (comma separated values) files (`readr::read_csv()`) and other files types. ## Read in the differential expression analysis results file ```{r read-results} stats_df <- readr::read_tsv( - file.path(data_dir, - "gene_results_GSE44971.tsv") - ) + file.path(data_dir, "gene_results_GSE44971.tsv") +) ``` Following the template of the previous chunk, use this chunk to read in the file `GSE44971.tsv` that is in the `data` folder and save it in the variable `gene_df`. @@ -159,9 +160,8 @@ Following the template of the previous chunk, use this chunk to read in the file ```{r read-expr, live = TRUE} # Use this chunk to read in data from the file `GSE44971.tsv` gene_df <- readr::read_tsv( - file.path(data_dir, - "GSE44971.tsv") - ) + file.path(data_dir, "GSE44971.tsv") +) ``` Use this chunk to explore what `gene_df` looks like. @@ -182,16 +182,18 @@ _Note:_ If you are using a version of `R` prior to 4.1 (or looking at older code That pipe was the inspiration for the native R pipe we are using here. While there are some minor differences, you can mostly treat them interchangeably as long as you load the `magrittr` package or `dplyr`, which also loads that version of the pipe. -For example, the output from this: +We'll being our journey into pipes using some core functions from the `dplyr` package (a core tidyverse package that offers "pliers" for your data). + +As our first example, the output from this: ```{r filter} -filter(stats_df, contrast == "male_female") +dplyr::filter(stats_df, contrast == "male_female") ``` ...is the same as the output from this: ```{r filter-pipe} -stats_df |> filter(contrast == "male_female") +stats_df |> dplyr::filter(contrast == "male_female") ``` This can make your code cleaner and easier to follow a series of related commands. @@ -200,9 +202,9 @@ Let's look at an example with our stats of of how the same functions look with o *Example 1:* without pipes: ```{r steps-nopipe} -stats_arranged <- arrange(stats_df, t_statistic) -stats_filtered <- filter(stats_arranged, avg_expression > 50) -stats_nopipe <- select(stats_filtered, contrast, log_fold_change, p_value) +stats_arranged <- dplyr::arrange(stats_df, t_statistic) +stats_filtered <- dplyr::filter(stats_arranged, avg_expression > 50) +stats_nopipe <- dplyr::select(stats_filtered, contrast, log_fold_change, p_value) ``` UGH, we have to keep track of all of those different intermediate data frames and type their names so many times here! @@ -213,15 +215,15 @@ It's annoying and makes it harder for people to read. ```{r steps-pipe, live = TRUE} # Example of the same modifications as above but with pipes! -stats_pipe <- stats_df |> - arrange(t_statistic) |> - filter(avg_expression > 50) |> - select(contrast, log_fold_change, p_value) +stats_pipe <- stats_df |> + dplyr::arrange(t_statistic) |> + dplyr::filter(avg_expression > 50) |> + dplyr::select(contrast, log_fold_change, p_value) ``` What the `|>` (pipe) is doing here is feeding the result of the expression on its left into the first argument of the next function (to its right, or on the next line here). We can then skip that first argument (the data in these cases), and move right on to the part we care about at that step: what we are arranging, filtering, or selecting in this case. -The key insight that makes the pipe work here is to recognize that each of these functions (`arrange`, `filter`, and `select`) are fundamental `dplyr` (a tidyverse package) functions which work as "data in, data out." +The key insight that makes the pipe work here is to recognize that each of these functions (`dplyr::arrange`, `dplyr::filter`, and `dplyr::select`) are fundamental `dplyr` functions which work as "data in, data out." In other words, these functions operate on data frames, and return data frames; you give them a data frame, and they give you back a data frame. Because these functions all follow a "data in, data out" framework, we can chain them together with pipe and send data all the way through the...pipeline! @@ -239,12 +241,12 @@ Now that hopefully you are convinced that the tidyverse can help you make your c ## Common tidyverse functions Let's say we wanted to filter this gene expression dataset to particular sample groups. -In order to do this, we would use the function `filter()` as well as a logic statement (usually one that refers to a column or columns in the data frame). +In order to do this, we would use the function `dplyr::filter()` as well as a logic statement (usually one that refers to a column or columns in the data frame). ```{r filter-gene} # Here let's filter stats_df to only keep the gene_symbol "SNCA" stats_df |> - filter(gene_symbol == "SNCA") + dplyr::filter(gene_symbol == "SNCA") ``` We can use `filter()` similarly for numeric statements. @@ -252,7 +254,7 @@ We can use `filter()` similarly for numeric statements. ```{r filter-numeric, live = TRUE} # Here let's filter the data to rows with average expression values above 50 stats_df |> - filter(avg_expression > 50) + dplyr::filter(avg_expression > 50) ``` We can apply multiple filters at once, which will require all of them to be satisfied for every row in the results: @@ -260,8 +262,10 @@ We can apply multiple filters at once, which will require all of them to be sati ```{r filter-2, live = TRUE} # filter to highly expressed genes with contrast "male_female" stats_df |> - filter(contrast == "male_female", - avg_expression > 50) + dplyr::filter( + contrast == "male_female", + avg_expression > 50 + ) ``` When we are filtering, the `%in%` operator can come in handy if we have multiple items we would like to match. @@ -278,7 +282,7 @@ stats_df$gene_symbol %in% genes_of_interest ```{r filter-in, live = TRUE} # filter to keep only genes of interest stats_df |> - filter(gene_symbol %in% c("SNCA", "CDKN1A")) + dplyr::filter(gene_symbol %in% c("SNCA", "CDKN1A")) ``` Let's return to our first `filter()` and build on to it. @@ -290,9 +294,11 @@ Let's also save this as a new data frame called `stats_filtered_df`. # filter to highly expressed "male_female" # and select gene_symbol, log_fold_change and t_statistic stats_filtered_df <- stats_df |> - filter(contrast == "male_female", - avg_expression > 50) |> - select(log_fold_change, t_statistic) + dplyr::filter( + contrast == "male_female", + avg_expression > 50 + ) |> + dplyr::select(log_fold_change, t_statistic) ``` Let's say we wanted to arrange this dataset so that the genes are arranged by the smallest p values to the largest. @@ -300,7 +306,7 @@ In order to do this, we would use the function `arrange()` as well as the column ```{r arrange} stats_df |> - arrange(p_value) + dplyr::arrange(p_value) ``` What if we want to sort from largest to smallest? @@ -310,15 +316,15 @@ We can use the same function, but instead use the `desc()` function and now we a ```{r arrange-desc} # arrange descending by avg_expression stats_df |> - arrange(desc(avg_expression)) + dplyr::arrange(desc(avg_expression)) ``` What if we would like to create a new column of values? -For that we use `mutate()` function. +For that we use `dplyr::mutate()` function. ```{r mutate} stats_df |> - mutate(log10_p_value = -log10(p_value)) + dplyr::mutate(log10_p_value = -log10(p_value)) ``` What if we want to obtain summary statistics for a column or columns? @@ -327,19 +333,26 @@ Here we will use summarize to calculate two summary statistics of log-fold chang ```{r summarize} stats_df |> - summarize(mean(log_fold_change), - sd(log_fold_change)) + dplyr::summarize( + # name the columns mean_lfc an sd_lfc + mean_lfc = mean(log_fold_change), + sd_lfc = sd(log_fold_change) + ) ``` What if we'd like to obtain a summary statistics but have them for various groups? Conveniently named, there's a function called `group_by()` that seamlessly allows us to do this. Also note that `group_by()` allows us to group by multiple variables at a time if you want to. +We'll use this function to create a grouped summary data frame and save it to a variable `stats_summary_df`. + ```{r summarize-groups, live = TRUE} stats_summary_df <- stats_df |> - group_by(contrast) |> - summarize(mean(log_fold_change), - sd(log_fold_change)) + dplyr::group_by(contrast) |> + dplyr::summarize( + mean_lfc = mean(log_fold_change), + sd_lfc = sd(log_fold_change) + ) ``` Let's look at a preview of what we made: @@ -454,7 +467,7 @@ In this case we want to match the gene information between the two, so we will s stats_df |> # Join based on their shared column # Called ensembl_id in stats_df and called Gene in gene_df - inner_join(gene_df, by = c('ensembl_id' = 'Gene')) + dplyr::inner_join(gene_df, by = c('ensembl_id' = 'Gene')) ``` ## Save data to files diff --git a/pathway-analysis/01-overrepresentation_analysis.Rmd b/pathway-analysis/01-overrepresentation_analysis.Rmd index 8e7a62f1..afc79f52 100644 --- a/pathway-analysis/01-overrepresentation_analysis.Rmd +++ b/pathway-analysis/01-overrepresentation_analysis.Rmd @@ -59,9 +59,7 @@ library(org.Mm.eg.db) # We'll create a directory to specifically hold the ORA results if it doesn't # exist yet results_dir <- file.path("results", "leukemia") -if (!dir.exists(results_dir)) { - dir.create(results_dir, recursive = TRUE) -} +fs::dir_create(results_dir) ``` #### Input files @@ -107,7 +105,7 @@ The results we're interested in here come from mouse samples, so we can obtain j mm_msigdb_df <- msigdbr(species = "Mus musculus") ``` -MSigDB contains 8 different gene set collections. +MSigDB contains 9 different gene set collections. H: hallmark gene sets C1: positional gene sets @@ -117,23 +115,26 @@ MSigDB contains 8 different gene set collections. C5: GO gene sets C6: oncogenic signatures C7: immunologic signatures + C8: cell type signatures In this example, we will use canonical pathways which are ([ref](https://www.gsea-msigdb.org/gsea/msigdb/collections.jsp)): > Gene sets from pathway databases. Usually, these gene sets are canonical representations of a biological process compiled by domain experts. And are a subset of `C2: curated gene sets`. -Specifically, we will use the [KEGG (Kyoto Encyclopedia of Genes and Genomes)](https://www.genome.jp/kegg/) pathways. +Specifically, we will use the [KEGG (Kyoto Encyclopedia of Genes and Genomes)](https://www.genome.jp/kegg/) pathways, which is denoted as `CP:KEGG_MEDICUS` in this version of `msigdbr`. ```{r filter_to_kegg} # Filter the mouse data frame to the KEGG pathways that are included in the # curated gene sets mm_kegg_df <- mm_msigdb_df |> - dplyr::filter(gs_cat == "C2", # curated gene sets - gs_subcat == "CP:KEGG") # KEGG pathways + dplyr::filter( + gs_collection == "C2", # curated gene set + gs_subcollection == "CP:KEGG_MEDICUS" # KEGG pathways + ) ``` -*Note: We could specified that we wanted the KEGG gene sets using the `category` and `subcategory` arguments of `msigdbr()`, but we're going for general steps!* +*Note: We could specified that we wanted the KEGG gene sets using the `collection` and `subcollection` arguments of `msigdbr()`, but we're going for general steps!* ```{r mm_kegg_columns} colnames(mm_kegg_df) @@ -179,18 +180,20 @@ The function we will use to map from Ensembl gene IDs to gene symbols is called ```{r map_to_symbol} # This returns a named vector which we can convert to a data frame, where # the keys (Ensembl IDs) are the names -symbols_vector <- mapIds(org.Mm.eg.db, # Specify the annotation package - # The vector of gene identifiers we want to - # map - keys = vs_low_df$Gene, - # What type of gene identifiers we're starting - # with - keytype = "ENSEMBL", - # The type of gene identifier we want returned - column = "SYMBOL", - # In the case of 1:many mappings, return the - # first one. This is default behavior! - multiVals = "first") +symbols_vector <- mapIds( + org.Mm.eg.db, # Specify the annotation package + # The vector of gene identifiers we want to + # map + keys = vs_low_df$Gene, + # What type of gene identifiers we're starting + # with + keytype = "ENSEMBL", + # The type of gene identifier we want returned + column = "SYMBOL", + # In the case of 1:many mappings, return the + # first one. This is default behavior! + multiVals = "first" +) # We would like a data frame we can join to the DGE results symbols_df <- data.frame( @@ -210,10 +213,12 @@ Let's do this first for the comparison to the low stem cell capacity population. ```{r add_symbols, live = TRUE} vs_low_df <- symbols_df |> # An *inner* join will only return rows that are in both data frames - dplyr::inner_join(vs_low_df, - # The name of the column that contains the Ensembl gene IDs - # in the left data frame and right data frame - by = c("ensembl_id" = "Gene")) + dplyr::inner_join( + vs_low_df, + # The name of the column that contains the Ensembl gene IDs + # in the left data frame and right data frame + by = c("ensembl_id" = "Gene") + ) ``` ### Drop `NA` values @@ -226,7 +231,7 @@ This will also drop genes that have an Ensembl gene identifier but no gene symbo ```{r complete_cases} # Remove rows that are not complete (e.g., contain NAs) by filtering to only # complete rows -vs_low_df <- vs_low_df |> +vs_low_complete_df <- vs_low_df |> tidyr::drop_na() ``` @@ -290,10 +295,12 @@ We'll start with the high stem cell capacity vs. low stem cell capacity populati Genes with positive log2 fold-changes (LFC) will be more highly expressed in the high stem cell capacity cells based on how we set up the analysis. ```{r high_capacity_genes} -vs_low_genes <- vs_low_df |> +vs_low_genes <- vs_low_complete_df |> # Filter to the positive LFC and filter based on significance too (padj) - dplyr::filter(log2FoldChange > 0, - padj < 0.05) |> + dplyr::filter( + log2FoldChange > 0, + padj < 0.05 + ) |> # Return a vector of gene symbols dplyr::pull(gene_symbol) ``` @@ -306,8 +313,10 @@ Now, we'll take the same steps for our other results. ```{r unsorted_genes_to_remove, live = TRUE} vs_unsorted_genes <- vs_unsorted_df |> - dplyr::filter(log2FoldChange > 0, - padj < 0.05) |> + dplyr::filter( + log2FoldChange > 0, + padj < 0.05 + ) |> dplyr::pull(gene_symbol) ``` @@ -335,8 +344,10 @@ We can use another function for set operations, `intersect()`, to get our backgr ```{r get_background_set} # intersect() will return the genes in both sets - we are using the entire data # frame here (complete cases), not just the significant genes -background_set <- intersect(vs_low_df$gene_symbol, - vs_unsorted_df$gene_symbol) +background_set <- intersect( + vs_low_complete_df$gene_symbol, + vs_unsorted_df$gene_symbol +) # Remove anything that couldn't reliably be measured/assessed in both from the # genes of interest list - using intersect() will drop anything in the first set @@ -381,13 +392,13 @@ kegg_result_df <- data.frame(kegg_ora_results@result) We can use a dot plot to visualize our significant enrichment results. -```{r dotplot, live = TRUE} +```{r dotplot, fig.width = 10, live = TRUE} enrichplot::dotplot(kegg_ora_results) ``` We can use an [UpSet plot](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4720993/) to visualize the **overlap** between the gene sets that were returned as significant. -```{r upsetplot, live = TRUE} +```{r upsetplot, fig.width = 10, live = TRUE} enrichplot::upsetplot(kegg_ora_results) ``` diff --git a/pathway-analysis/02-gene_set_enrichment_analysis.Rmd b/pathway-analysis/02-gene_set_enrichment_analysis.Rmd index 3c79f68b..1d6dd544 100644 --- a/pathway-analysis/02-gene_set_enrichment_analysis.Rmd +++ b/pathway-analysis/02-gene_set_enrichment_analysis.Rmd @@ -52,6 +52,10 @@ library(clusterProfiler) library(msigdbr) ``` +```{r set seed} +set.seed(2020) +``` + ### Directories and Files #### Directories @@ -63,9 +67,7 @@ input_dir <- file.path("..", "RNA-seq", "results", "NB-cell") # We will create a directory to specifically hold our GSEA results if it does # not yet exist output_dir <- file.path("results", "NB-cell") -if (!dir.exists(output_dir)) { - dir.create(output_dir, recursive = TRUE) -} +fs::dir_create(output_dir) ``` #### Input files @@ -119,11 +121,13 @@ We'll use the Hallmark collection for GSEA. Notably, there are only 50 gene sets included in this collection. The fewer gene sets we test, the lower our multiple hypothesis testing burden. -We can retrieve only the Hallmark gene sets by specifying `category = "H"` to the `msigdbr()` function. +We can retrieve only the Hallmark gene sets by specifying `collection = "H"` to the `msigdbr()` function. ```{r hallmark_sets, live = TRUE} -hs_hallmark_df <- msigdbr(species = "Homo sapiens", - category = "H") +hs_hallmark_df <- msigdbr( + species = "Homo sapiens", + collection = "H" +) ``` ## Differential gene expression results @@ -238,14 +242,18 @@ Now for the analysis! We can use the `GSEA()` function to perform GSEA with any generic set of gene sets, but there are several functions for using specific, commonly used gene sets (e.g., `gseKEGG()`). ```{r run_gsea} -gsea_results <- GSEA(geneList = lfc_vector, # ordered ranked gene list - minGSSize = 25, # minimum gene set size - maxGSSize = 500, # maximum gene set set - pvalueCutoff = 0.05, - pAdjustMethod = "BH", # correction for multiple hypothesis testing - TERM2GENE = dplyr::select(hs_hallmark_df, - gs_name, - gene_symbol)) +gsea_results <- GSEA( + geneList = lfc_vector, # ordered ranked gene list + minGSSize = 25, # minimum gene set size + maxGSSize = 500, # maximum gene set set + pvalueCutoff = 0.05, + pAdjustMethod = "BH", # correction for multiple hypothesis testing + TERM2GENE = dplyr::select( + hs_hallmark_df, + gs_name, + gene_symbol + ) +) ``` The warning about ties means that there are multiple genes that have the same log2 fold change value. diff --git a/pathway-analysis/03-gene_set_variation_analysis.Rmd b/pathway-analysis/03-gene_set_variation_analysis.Rmd index abcbb998..6e8862c1 100644 --- a/pathway-analysis/03-gene_set_variation_analysis.Rmd +++ b/pathway-analysis/03-gene_set_variation_analysis.Rmd @@ -57,9 +57,7 @@ input_dir <- file.path("data", "open-pbta") # Create a directory specifically for the results using this dataset output_dir <- file.path("results", "open-pbta") -if (!dir.exists(output_dir)) { - dir.create(output_dir, recursive = TRUE) -} +fs::dir_create(output_dir) ``` #### Input @@ -164,9 +162,7 @@ gsva_results <- gsva( kcdf = "Gaussian", # enrichment score is the difference between largest positive and negative maxDiff = TRUE - ), - # Use 4 cores for multiprocessing - BPPARAM = BiocParallel::MulticoreParam(4) + ) ) ``` @@ -211,8 +207,9 @@ random_gene_sets <- rep(gene_set_size, nreps) |> # Repeat gene sizes so we run purrr::map( # Sample the vector of all genes, choosing the number of items specified # in the element of gene set size - ~ base::sample(x = all_genes, - size = .x) + \(geneset_size) { + base::sample(x = all_genes, size = geneset_size) + } ) ``` @@ -224,9 +221,13 @@ The Hallmarks list we used earlier stored the gene set names as the name of the # number lengths_vector <- random_gene_sets |> # Get the length of each gene set (number of genes) - purrr::map(~ length(.x)) |> + purrr::map(length) |> # Make it "pathway_" - purrr::map(~ paste0("pathway_", .x)) |> + purrr::map( + \(geneset_size) { + paste0("pathway_", geneset_size) + } + ) |> # Return a vector purrr::flatten_chr() @@ -247,9 +248,7 @@ random_gsva_results <- gsva( maxSize = 500, kcdf = "Gaussian", maxDiff = TRUE - ), - # Use 4 cores for multiprocessing - BPPARAM = BiocParallel::MulticoreParam(4) + ) ) ``` diff --git a/renv.lock b/renv.lock index 752ed02d..d6d0ab6b 100644 --- a/renv.lock +++ b/renv.lock @@ -1,2128 +1,5955 @@ { "R": { - "Version": "4.4.0", + "Version": "4.5.2", "Repositories": [ { "Name": "BioCsoft", - "URL": "https://bioconductor.org/packages/3.19/bioc" + "URL": "https://bioconductor.org/packages/3.22/bioc" }, { "Name": "BioCann", - "URL": "https://bioconductor.org/packages/3.19/data/annotation" + "URL": "https://bioconductor.org/packages/3.22/data/annotation" }, { "Name": "BioCexp", - "URL": "https://bioconductor.org/packages/3.19/data/experiment" + "URL": "https://bioconductor.org/packages/3.22/data/experiment" }, { "Name": "BioCworkflows", - "URL": "https://bioconductor.org/packages/3.19/workflows" + "URL": "https://bioconductor.org/packages/3.22/workflows" }, { "Name": "BioCbooks", - "URL": "https://bioconductor.org/packages/3.19/books" + "URL": "https://bioconductor.org/packages/3.22/books" }, { "Name": "CRAN", "URL": "https://p3m.dev/cran/latest" + }, + { + "Name": "BioCcontainers", + "URL": "https://bioconductor.org/packages/3.22/container-binaries/bioconductor_docker" } ] }, "Bioconductor": { - "Version": "3.19" + "Version": "3.22" }, "Packages": { "ALL": { "Package": "ALL", - "Version": "1.46.0", + "Version": "1.52.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Biobase", - "R" - ], - "Hash": "dd00b008c7f784712d11015bbd59bd4c" + "Title": "A data package", + "Date": "2009-07-22", + "Author": "Xiaochun Li", + "Description": "Data of T- and B-cell Acute Lymphocytic Leukemia from the Ritz Laboratory at the DFCI (includes Apr 2004 versions)", + "Maintainer": "Robert Gentleman ", + "License": "Artistic-2.0", + "Depends": [ + "R (>= 2.10)", + "Biobase (>= 2.5.5)" + ], + "Suggests": [ + "rpart" + ], + "biocViews": "ExperimentData, CancerData, LeukemiaCancerData", + "git_url": "https://git.bioconductor.org/packages/ALL", + "git_branch": "RELEASE_3_22", + "git_last_commit": "0bc53bb", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no" }, "AUCell": { "Package": "AUCell", - "Version": "1.26.0", + "Version": "1.32.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", + "Type": "Package", + "Title": "AUCell: Analysis of 'gene set' activity in single-cell RNA-seq data (e.g. identify cells with specific gene signatures)", + "Date": "2024-03-09", + "Author": "Sara Aibar, Stein Aerts. Laboratory of Computational Biology. VIB-KU Leuven Center for Brain & Disease Research. Leuven, Belgium.", + "Maintainer": "Gert Hulselmans ", + "Description": "AUCell allows to identify cells with active gene sets (e.g. signatures, gene modules...) in single-cell RNA-seq data. AUCell uses the \"Area Under the Curve\" (AUC) to calculate whether a critical subset of the input gene set is enriched within the expressed genes for each cell. The distribution of AUC scores across all the cells allows exploring the relative expression of the signature. Since the scoring method is ranking-based, AUCell is independent of the gene expression units and the normalization procedure. In addition, since the cells are evaluated individually, it can easily be applied to bigger datasets, subsetting the expression matrix if needed.", + "URL": "http://scenic.aertslab.org", + "Imports": [ "DelayedArray", "DelayedMatrixStats", - "GSEABase", - "Matrix", - "R.utils", - "SummarizedExperiment", "data.table", - "grDevices", "graphics", + "grDevices", + "GSEABase", + "Matrix", "methods", "mixtools", + "R.utils", "stats", + "SummarizedExperiment", + "BiocGenerics", "utils" ], - "Hash": "40f8fe9c663d117a1486e7716f148891" + "Enhances": [ + "doMC", + "doRNG", + "doParallel", + "foreach" + ], + "Suggests": [ + "Biobase", + "BiocStyle", + "doSNOW", + "dynamicTreeCut", + "DT", + "GEOquery", + "knitr", + "NMF", + "plyr", + "R2HTML", + "rmarkdown", + "reshape2", + "plotly", + "Rtsne", + "testthat", + "zoo" + ], + "License": "GPL-3", + "biocViews": "SingleCell, GeneSetEnrichment, Transcriptomics, Transcription, GeneExpression, WorkflowStep, Normalization", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.2.0", + "git_url": "https://git.bioconductor.org/packages/AUCell", + "git_branch": "RELEASE_3_22", + "git_last_commit": "a57f250", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no" }, "AnnotationDbi": { "Package": "AnnotationDbi", - "Version": "1.66.0", + "Version": "1.72.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Biobase", - "BiocGenerics", + "Title": "Manipulation of SQLite-based annotations in Bioconductor", + "Description": "Implements a user-friendly interface for querying SQLite-based annotation data packages.", + "biocViews": "Annotation, Microarray, Sequencing, GenomeAnnotation", + "URL": "https://bioconductor.org/packages/AnnotationDbi", + "Video": "https://www.youtube.com/watch?v=8qvGNTVz3Ik", + "BugReports": "https://github.com/Bioconductor/AnnotationDbi/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Author": "Hervé Pagès, Marc Carlson, Seth Falcon, Nianhua Li", + "Maintainer": "Bioconductor Package Maintainer ", + "Depends": [ + "R (>= 2.7.0)", + "methods", + "stats4", + "BiocGenerics (>= 0.29.2)", + "Biobase (>= 1.17.0)", + "IRanges" + ], + "Imports": [ "DBI", - "IRanges", - "KEGGREST", - "R", "RSQLite", - "S4Vectors", - "methods", + "S4Vectors (>= 0.9.25)", "stats", - "stats4" + "KEGGREST" ], - "Hash": "b7df9c597fb5533fc8248d73b8c703ac" + "Suggests": [ + "utils", + "hgu95av2.db", + "GO.db", + "org.Sc.sgd.db", + "org.At.tair.db", + "RUnit", + "TxDb.Hsapiens.UCSC.hg19.knownGene", + "org.Hs.eg.db", + "reactome.db", + "AnnotationForge", + "graph", + "EnsDb.Hsapiens.v75", + "BiocStyle", + "knitr" + ], + "VignetteBuilder": "knitr", + "Collate": "00RTobjs.R AllGenerics.R AllClasses.R unlist2.R utils.R SQL.R FlatBimap.R AnnDbObj-lowAPI.R Bimap.R GOTerms.R BimapFormatting.R Bimap-envirAPI.R flatten.R methods-AnnotationDb.R methods-SQLiteConnection.R methods-geneCentricDbs.R methods-geneCentricDbs-keys.R methods-ReactomeDb.R methods-OrthologyDb.R loadDb.R createAnnObjs-utils.R createAnnObjs.NCBIORG_DBs.R createAnnObjs.NCBICHIP_DBs.R createAnnObjs.ORGANISM_DB.R createAnnObjs.YEASTCHIP_DB.R createAnnObjs.COELICOLOR_DB.R createAnnObjs.ARABIDOPSISCHIP_DB.R createAnnObjs.MALARIA_DB.R createAnnObjs.YEAST_DB.R createAnnObjs.YEASTNCBI_DB.R createAnnObjs.ARABIDOPSIS_DB.R createAnnObjs.GO_DB.R createAnnObjs.KEGG_DB.R createAnnObjs.PFAM_DB.R AnnDbPkg-templates-common.R AnnDbPkg-checker.R print.probetable.R makeMap.R inpIDMapper.R test_AnnotationDbi_package.R", + "git_url": "https://git.bioconductor.org/packages/AnnotationDbi", + "git_branch": "RELEASE_3_22", + "git_last_commit": "ffdaf5d", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no" }, "AnnotationFilter": { "Package": "AnnotationFilter", - "Version": "1.28.0", + "Version": "1.34.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "GenomicRanges", - "R", - "lazyeval", + "Title": "Facilities for Filtering Bioconductor Annotation Resources", + "Authors@R": "c( person(\"Martin\", \"Morgan\", email = \"martin.morgan@roswellpark.org\", role = \"aut\"), person(\"Johannes\", \"Rainer\", email = \"johannes.rainer@eurac.edu\", role = \"aut\"), person(\"Joachim\", \"Bargsten\", email = \"jw@bargsten.org\", role = \"ctb\"), person(\"Daniel\", \"Van Twisk\", email = \"daniel.vantwisk@roswellpark.org\", role = \"ctb\"), person(\"Bioconductor Package\", \"Maintainer\", email=\"maintainer@bioconductor.org\", role = \"cre\"))", + "URL": "https://github.com/Bioconductor/AnnotationFilter", + "BugReports": "https://github.com/Bioconductor/AnnotationFilter/issues", + "Description": "This package provides class and other infrastructure to implement filters for manipulating Bioconductor annotation resources. The filters will be used by ensembldb, Organism.dplyr, and other packages.", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "utils", "methods", - "utils" + "GenomicRanges", + "lazyeval" ], - "Hash": "24e809470aef6d81b25003d775b2fb56" + "Suggests": [ + "BiocStyle", + "knitr", + "testthat", + "RSQLite", + "org.Hs.eg.db", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "License": "Artistic-2.0", + "biocViews": "Annotation, Infrastructure, Software", + "Encoding": "UTF-8", + "RoxygenNote": "6.0.1", + "Collate": "'AllGenerics.R' 'AnnotationFilter.R' 'AnnotationFilterList.R' 'translate-utils.R'", + "git_url": "https://git.bioconductor.org/packages/AnnotationFilter", + "git_branch": "RELEASE_3_22", + "git_last_commit": "730457f", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Martin Morgan [aut], Johannes Rainer [aut], Joachim Bargsten [ctb], Daniel Van Twisk [ctb], Bioconductor Package Maintainer [cre]", + "Maintainer": "Bioconductor Package Maintainer " }, "AnnotationHub": { "Package": "AnnotationHub", - "Version": "3.12.0", + "Version": "4.0.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationDbi", - "BiocFileCache", - "BiocGenerics", + "Type": "Package", + "Title": "Client to access AnnotationHub resources", + "Authors@R": "c(person(\"Bioconductor Package\", \"Maintainer\", email=\"maintainer@bioconductor.org\", role=\"cre\"), person(\"Martin\", \"Morgan\", role=\"aut\"), person(\"Marc\", \"Carlson\", role=\"ctb\"), person(\"Dan\", \"Tenenbaum\", role=\"ctb\"), person(\"Sonali\", \"Arora\", role=\"ctb\"), person(\"Valerie\", \"Oberchain\", role=\"ctb\"), person(\"Kayla\", \"Morrell\", role=\"ctb\"), person(\"Lori\", \"Shepherd\", role=\"aut\"))", + "biocViews": "Infrastructure, DataImport, GUI, ThirdPartyClient", + "Description": "This package provides a client for the Bioconductor AnnotationHub web resource. The AnnotationHub web resource provides a central location where genomic files (e.g., VCF, bed, wig) and other resources from standard locations (e.g., UCSC, Ensembl) can be discovered. The resource includes metadata about each resource, e.g., a textual description, tags, and date of modification. The client creates and manages a local cache of files retrieved by the user, helping with quick and reproducible access.", + "License": "Artistic-2.0", + "Depends": [ + "BiocGenerics (>= 0.15.10)", + "BiocFileCache (>= 2.99.3)" + ], + "Imports": [ + "utils", + "methods", + "grDevices", + "RSQLite", "BiocManager", "BiocVersion", - "RSQLite", - "S4Vectors", "curl", - "dplyr", - "grDevices", - "httr", - "methods", "rappdirs", - "utils", - "yaml" + "AnnotationDbi (>= 1.31.19)", + "S4Vectors", + "httr2", + "yaml", + "dplyr", + "BiocBaseUtils" ], - "Hash": "346ca347b61989d1da5f655d7bac6a8c" + "Suggests": [ + "IRanges", + "Seqinfo", + "GenomeInfoDb", + "GenomicRanges", + "VariantAnnotation", + "Rsamtools", + "rtracklayer", + "BiocStyle", + "knitr", + "AnnotationForge", + "rBiopaxParser", + "RUnit", + "txdbmaker", + "MSnbase", + "mzR", + "Biostrings", + "CompoundDb", + "keras", + "ensembldb", + "SummarizedExperiment", + "ExperimentHub", + "gdsfmt", + "rmarkdown", + "HubPub" + ], + "Enhances": [ + "AnnotationHubData" + ], + "Collate": "AnnotationHubOption.R AllGenerics.R Hub-class.R db-utils.R AnnotationHub-class.R AnnotationHubResource-class.R BEDResource-class.R ProteomicsResource-class.R EpigenomeResource-class.R EnsDbResource-class.R utilities.R sql-utils.R Hub-utils.R cache-utils.R zzz.R", + "VignetteBuilder": "knitr", + "BugReports": "https://github.com/Bioconductor/AnnotationHub/issues", + "NeedsCompilation": "yes", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/AnnotationHub", + "git_branch": "RELEASE_3_22", + "git_last_commit": "e27e804", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Bioconductor Package Maintainer [cre], Martin Morgan [aut], Marc Carlson [ctb], Dan Tenenbaum [ctb], Sonali Arora [ctb], Valerie Oberchain [ctb], Kayla Morrell [ctb], Lori Shepherd [aut]", + "Maintainer": "Bioconductor Package Maintainer " }, "BH": { "Package": "BH", - "Version": "1.84.0-0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "a8235afbcd6316e6e91433ea47661013" + "Version": "1.90.0-1", + "Source": "Repository", + "Type": "Package", + "Title": "Boost C++ Header Files", + "Date": "2025-12-13", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"John W.\", \"Emerson\", role = \"aut\"), person(\"Michael J.\", \"Kane\", role = \"aut\", comment = c(ORCID = \"0000-0003-1899-6662\")))", + "Description": "Boost provides free peer-reviewed portable C++ source libraries. A large part of Boost is provided as C++ template code which is resolved entirely at compile-time without linking. This package aims to provide the most useful subset of Boost libraries for template use among CRAN packages. By placing these libraries in this package, we offer a more efficient distribution system for CRAN as replication of this code in the sources of other packages is avoided. As of release 1.84.0-0, the following Boost libraries are included: 'accumulators' 'algorithm' 'align' 'any' 'atomic' 'beast' 'bimap' 'bind' 'circular_buffer' 'compute' 'concept' 'config' 'container' 'date_time' 'detail' 'dynamic_bitset' 'exception' 'flyweight' 'foreach' 'functional' 'fusion' 'geometry' 'graph' 'heap' 'icl' 'integer' 'interprocess' 'intrusive' 'io' 'iostreams' 'iterator' 'lambda2' 'math' 'move' 'mp11' 'mpl' 'multiprecision' 'numeric' 'pending' 'phoenix' 'polygon' 'preprocessor' 'process' 'propery_tree' 'qvm' 'random' 'range' 'scope_exit' 'smart_ptr' 'sort' 'spirit' 'tuple' 'type_traits' 'typeof' 'unordered' 'url' 'utility' 'uuid'.", + "License": "BSL-1.0", + "URL": "https://github.com/eddelbuettel/bh, https://dirk.eddelbuettel.com/code/bh.html", + "BugReports": "https://github.com/eddelbuettel/bh/issues", + "NeedsCompilation": "no", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), John W. Emerson [aut], Michael J. Kane [aut] (ORCID: )", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "Biobase": { "Package": "Biobase", - "Version": "2.64.0", + "Version": "2.70.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "R", + "Title": "Biobase: Base functions for Bioconductor", + "Description": "Functions that are needed by many other packages or which replace R functions.", + "biocViews": "Infrastructure", + "URL": "https://bioconductor.org/packages/Biobase", + "BugReports": "https://github.com/Bioconductor/Biobase/issues", + "License": "Artistic-2.0", + "Authors@R": "c( person(\"R.\", \"Gentleman\", role=\"aut\"), person(\"V.\", \"Carey\", role = \"aut\"), person(\"M.\", \"Morgan\", role=\"aut\"), person(\"S.\", \"Falcon\", role=\"aut\"), person(\"Haleema\", \"Khan\", role = \"ctb\", comment = \"'esApply' and 'BiobaseDevelopment' vignette translation from Sweave to Rmarkdown / HTML\" ), person(\"Bioconductor Package Maintainer\", role = \"cre\", email = \"maintainer@bioconductor.org\" ))", + "Suggests": [ + "tools", + "tkWidgets", + "ALL", + "RUnit", + "golubEsets", + "BiocStyle", + "knitr", + "limma" + ], + "Depends": [ + "R (>= 2.10)", + "BiocGenerics (>= 0.27.1)", + "utils" + ], + "Imports": [ + "methods" + ], + "VignetteBuilder": "knitr", + "LazyLoad": "yes", + "Collate": "tools.R strings.R environment.R vignettes.R packages.R AllGenerics.R VersionsClass.R VersionedClasses.R methods-VersionsNull.R methods-VersionedClass.R DataClasses.R methods-aggregator.R methods-container.R methods-MIAxE.R methods-MIAME.R methods-AssayData.R methods-AnnotatedDataFrame.R methods-eSet.R methods-ExpressionSet.R methods-MultiSet.R methods-SnpSet.R methods-NChannelSet.R anyMissing.R rowOp-methods.R updateObjectTo.R methods-ScalarObject.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/Biobase", + "git_branch": "RELEASE_3_22", + "git_last_commit": "9964e15", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "R. Gentleman [aut], V. Carey [aut], M. Morgan [aut], S. Falcon [aut], Haleema Khan [ctb] ('esApply' and 'BiobaseDevelopment' vignette translation from Sweave to Rmarkdown / HTML), Bioconductor Package Maintainer [cre]", + "Maintainer": "Bioconductor Package Maintainer " + }, + "BiocBaseUtils": { + "Package": "BiocBaseUtils", + "Version": "1.12.0", + "Source": "Bioconductor", + "Title": "General utility functions for developing Bioconductor packages", + "Authors@R": "c( person(\"Marcel\", \"Ramos\", , \"marcel.ramos@sph.cuny.edu\", c(\"aut\", \"cre\"), c(ORCID = \"0000-0002-3242-0582\") ), person(\"Martin\", \"Morgan\", , \"martin.morgan@roswellpark.org\", \"ctb\" ), person(\"Hervé\", \"Pagès\", , \"hpages.on.github@gmail.com\", \"ctb\") )", + "Description": "The package provides utility functions related to package development. These include functions that replace slots, and selectors for show methods. It aims to coalesce the various helper functions often re-used throughout the Bioconductor ecosystem.", + "Imports": [ "methods", "utils" ], - "Hash": "9bc4cabd3bfda461409172213d932813" + "Depends": [ + "R (>= 4.2.0)" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "BiocStyle", + "tinytest" + ], + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "biocViews": "Software, Infrastructure", + "BugReports": "https://www.github.com/Bioconductor/BiocBaseUtils/issues", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2", + "VignetteBuilder": "knitr", + "Date": "2025-07-14", + "git_url": "https://git.bioconductor.org/packages/BiocBaseUtils", + "git_branch": "RELEASE_3_22", + "git_last_commit": "756163a", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Marcel Ramos [aut, cre] (ORCID: ), Martin Morgan [ctb], Hervé Pagès [ctb]", + "Maintainer": "Marcel Ramos " }, "BiocFileCache": { "Package": "BiocFileCache", - "Version": "2.12.0", + "Version": "3.0.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "DBI", - "R", - "RSQLite", - "curl", - "dbplyr", - "dplyr", - "filelock", - "httr", + "Title": "Manage Files Across Sessions", + "Authors@R": "c(person(\"Lori\", \"Shepherd\", email = \"lori.shepherd@roswellpark.org\", role = c(\"aut\", \"cre\")), person(\"Martin\", \"Morgan\", email = \"martin.morgan@roswellpark.org\", role = \"aut\"))", + "Description": "This package creates a persistent on-disk cache of files that the user can add, update, and retrieve. It is useful for managing resources (such as custom Txdb objects) that are costly or difficult to create, web resources, and data files used across sessions.", + "Depends": [ + "R (>= 3.4.0)", + "dbplyr (>= 1.0.0)" + ], + "Imports": [ "methods", "stats", - "utils" + "utils", + "dplyr", + "RSQLite", + "DBI", + "filelock", + "curl", + "httr2" + ], + "BugReports": "https://github.com/Bioconductor/BiocFileCache/issues", + "DevelopmentURL": "https://github.com/Bioconductor/BiocFileCache", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "biocViews": "DataImport", + "VignetteBuilder": "knitr", + "Suggests": [ + "testthat", + "knitr", + "BiocStyle", + "rmarkdown", + "rtracklayer" ], - "Hash": "9c3414bcfae204d56080dd0f0a220136" + "git_url": "https://git.bioconductor.org/packages/BiocFileCache", + "git_branch": "RELEASE_3_22", + "git_last_commit": "81fd6e0", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Lori Shepherd [aut, cre], Martin Morgan [aut]", + "Maintainer": "Lori Shepherd " }, "BiocGenerics": { "Package": "BiocGenerics", - "Version": "0.50.0", + "Version": "0.56.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", - "graphics", + "Title": "S4 generic functions used in Bioconductor", + "Description": "The package defines many S4 generic functions used in Bioconductor.", + "biocViews": "Infrastructure", + "URL": "https://bioconductor.org/packages/BiocGenerics", + "BugReports": "https://github.com/Bioconductor/BiocGenerics/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"The Bioconductor Dev Team\", role=\"aut\"), person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\", comment=c(ORCID=\"0009-0002-8272-4522\")), person(\"Laurent\", \"Gatto\", role=\"ctb\", email=\"laurent.gatto@uclouvain.be\", comment=c(ORCID=\"0000-0002-1520-2268\")), person(\"Nathaniel\", \"Hayden\", role=\"ctb\"), person(\"James\", \"Hester\", role=\"ctb\"), person(\"Wolfgang\", \"Huber\", role=\"ctb\"), person(\"Michael\", \"Lawrence\", role=\"ctb\"), person(\"Martin\", \"Morgan\", role=\"ctb\", email=\"mtmorgan.xyz@gmail.com\", comment=c(ORCID=\"0000-0002-5874-8148\")), person(\"Valerie\", \"Obenchain\", role=\"ctb\"))", + "Depends": [ + "R (>= 4.0.0)", "methods", + "utils", + "graphics", "stats", - "utils" + "generics" + ], + "Imports": [ + "methods", + "utils", + "graphics", + "stats" ], - "Hash": "ef32d07aafdd12f24c5827374ae3590d" + "Suggests": [ + "Biobase", + "S4Vectors", + "IRanges", + "S4Arrays", + "SparseArray", + "DelayedArray", + "HDF5Array", + "GenomicRanges", + "pwalign", + "Rsamtools", + "AnnotationDbi", + "affy", + "affyPLM", + "DESeq2", + "flowClust", + "MSnbase", + "annotate", + "MultiAssayExperiment", + "RUnit" + ], + "Collate": "S3-classes-as-S4-classes.R utils.R normarg-utils.R replaceSlots.R aperm.R append.R as.data.frame.R as.list.R as.vector.R cbind.R do.call.R duplicated.R eval.R Extremes.R format.R funprog.R get.R grep.R is.unsorted.R lapply.R mapply.R match.R mean.R nrow.R order.R paste.R rank.R rep.R row_colnames.R saveRDS.R sort.R start.R subset.R t.R table.R tapply.R unique.R unlist.R unsplit.R which.R which.min.R relist.R boxplot.R image.R density.R IQR.R mad.R residuals.R var.R weights.R xtabs.R setops.R annotation.R combine.R containsOutOfMemoryData.R dbconn.R dge.R dims.R fileName.R longForm.R normalize.R Ontology.R organism_species.R paste2.R path.R plotMA.R plotPCA.R score.R strand.R toTable.R type.R updateObject.R testPackage.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/BiocGenerics", + "git_branch": "RELEASE_3_22", + "git_last_commit": "16cf16d", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "The Bioconductor Dev Team [aut], Hervé Pagès [aut, cre] (ORCID: ), Laurent Gatto [ctb] (ORCID: ), Nathaniel Hayden [ctb], James Hester [ctb], Wolfgang Huber [ctb], Michael Lawrence [ctb], Martin Morgan [ctb] (ORCID: ), Valerie Obenchain [ctb]", + "Maintainer": "Hervé Pagès " }, "BiocIO": { "Package": "BiocIO", - "Version": "1.14.0", + "Version": "1.20.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Title": "Standard Input and Output for Bioconductor Packages", + "Authors@R": "c( person(\"Martin\", \"Morgan\", role = \"aut\"), person(\"Michael\", \"Lawrence\", role = \"aut\"), person(\"Daniel\", \"Van Twisk\", role = \"aut\"), person(\"Marcel\", \"Ramos\", , \"marcel.ramos@sph.cuny.edu\", \"cre\", c(ORCID = \"0000-0002-3242-0582\") ))", + "Description": "The `BiocIO` package contains high-level abstract classes and generics used by developers to build IO funcionality within the Bioconductor suite of packages. Implements `import()` and `export()` standard generics for importing and exporting biological data formats. `import()` supports whole-file as well as chunk-wise iterative import. The `import()` interface optionally provides a standard mechanism for 'lazy' access via `filter()` (on row or element-like components of the file resource), `select()` (on column-like components of the file resource) and `collect()`. The `import()` interface optionally provides transparent access to remote (e.g. via https) as well as local access. Developers can register a file extension, e.g., `.loom` for dispatch from character-based URIs to specific `import()` / `export()` methods based on classes representing file types, e.g., `LoomFile()`.", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 4.3.0)" + ], + "Imports": [ "BiocGenerics", - "R", "S4Vectors", "methods", "tools" ], - "Hash": "f97a7ef01d364cf20d1946d43a3d526f" + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "Collate": "'BiocFile.R' 'import_export.R' 'compression.R' 'utils.R'", + "VignetteBuilder": "knitr", + "biocViews": "Annotation,DataImport", + "BugReports": "https://github.com/Bioconductor/BiocIO/issues", + "Date": "2024-11-21", + "git_url": "https://git.bioconductor.org/packages/BiocIO", + "git_branch": "RELEASE_3_22", + "git_last_commit": "2810f6a", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Martin Morgan [aut], Michael Lawrence [aut], Daniel Van Twisk [aut], Marcel Ramos [cre] (ORCID: )", + "Maintainer": "Marcel Ramos " }, "BiocManager": { "Package": "BiocManager", - "Version": "1.30.22", + "Version": "1.30.27", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Access the Bioconductor Project Package Repository", + "Description": "A convenient tool to install and update Bioconductor packages.", + "Authors@R": "c( person(\"Martin\", \"Morgan\", email = \"martin.morgan@roswellpark.org\", role = \"aut\", comment = c(ORCID = \"0000-0002-5874-8148\")), person(\"Marcel\", \"Ramos\", email = \"marcel.ramos@sph.cuny.edu\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-3242-0582\")))", + "Imports": [ "utils" ], - "Hash": "d57e43105a1aa9cb54fdb4629725acb1" + "Suggests": [ + "BiocVersion", + "BiocStyle", + "remotes", + "rmarkdown", + "testthat", + "withr", + "curl", + "knitr" + ], + "URL": "https://bioconductor.github.io/BiocManager/", + "BugReports": "https://github.com/Bioconductor/BiocManager/issues", + "VignetteBuilder": "knitr", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Martin Morgan [aut] (ORCID: ), Marcel Ramos [aut, cre] (ORCID: )", + "Maintainer": "Marcel Ramos ", + "Repository": "CRAN" }, "BiocNeighbors": { "Package": "BiocNeighbors", - "Version": "1.22.0", + "Version": "2.4.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocParallel", - "Matrix", + "Date": "2025-05-22", + "Title": "Nearest Neighbor Detection for Bioconductor Packages", + "Authors@R": "c(person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\", \"cph\"), email=\"infinite.monkeys.with.keyboards@gmail.com\"))", + "Imports": [ "Rcpp", - "RcppHNSW", - "S4Vectors", - "methods", - "stats" + "methods" + ], + "Suggests": [ + "BiocParallel", + "testthat", + "BiocStyle", + "knitr", + "rmarkdown" ], - "Hash": "da9f332c88453734623406dcca13ee03" + "biocViews": "Clustering, Classification", + "Description": "Implements exact and approximate methods for nearest neighbor detection, in a framework that allows them to be easily switched within Bioconductor packages or workflows. Exact searches can be performed using the k-means for k-nearest neighbors algorithm or with vantage point trees. Approximate searches can be performed using the Annoy or HNSW libraries. Searching on either Euclidean or Manhattan distances is supported. Parallelization is achieved for all methods by using BiocParallel. Functions are also provided to search for all neighbors within a given distance.", + "License": "GPL-3", + "LinkingTo": [ + "Rcpp", + "assorthead" + ], + "VignetteBuilder": "knitr", + "SystemRequirements": "C++17", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "git_url": "https://git.bioconductor.org/packages/BiocNeighbors", + "git_branch": "RELEASE_3_22", + "git_last_commit": "c2ff286", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Aaron Lun [aut, cre, cph]", + "Maintainer": "Aaron Lun " }, "BiocParallel": { "Package": "BiocParallel", - "Version": "1.38.0", + "Version": "1.44.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BH", - "R", - "codetools", - "cpp11", + "Type": "Package", + "Title": "Bioconductor facilities for parallel evaluation", + "Authors@R": "c( person(\"Jiefei\", \"Wang\", email = \"jiefei0804@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Martin\", \"Morgan\", email = \"mtmorgan.bioc@gmail.com\", role=\"aut\"), person(\"Valerie\", \"Obenchain\", role=\"aut\"), person(\"Michel\", \"Lang\", email=\"michellang@gmail.com\", role=\"aut\"), person(\"Ryan\", \"Thompson\", email=\"rct@thompsonclan.org\", role=\"aut\"), person(\"Nitesh\", \"Turaga\", role=\"aut\"), person(\"Aaron\", \"Lun\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Madelyn\", \"Carlson\", role = \"ctb\", comment = \"Translated 'Random Numbers' vignette from Sweave to RMarkdown / HTML.\" ), person(\"Phylis\", \"Atieno\", role = \"ctb\", comment = \"Translated 'Introduction to BiocParallel' vignette from Sweave to Rmarkdown / HTML.\" ), person( \"Sergio\", \"Oller\", role = \"ctb\", comment = c( \"Improved bpmapply() efficiency.\", \"ORCID\" = \"0000-0002-8994-1549\" ) ))", + "Description": "This package provides modified versions and novel implementation of functions for parallel evaluation, tailored to use with Bioconductor objects.", + "URL": "https://github.com/Bioconductor/BiocParallel", + "BugReports": "https://github.com/Bioconductor/BiocParallel/issues", + "biocViews": "Infrastructure", + "License": "GPL-2 | GPL-3 | BSL-1.0", + "SystemRequirements": "C++11", + "Depends": [ + "methods", + "R (>= 4.1.0)" + ], + "Imports": [ + "stats", + "utils", "futile.logger", - "methods", "parallel", "snow", - "stats", - "utils" + "codetools" + ], + "Suggests": [ + "BiocGenerics", + "tools", + "foreach", + "BBmisc", + "doParallel", + "GenomicRanges", + "RNAseqData.HNRNPC.bam.chr14", + "TxDb.Hsapiens.UCSC.hg19.knownGene", + "VariantAnnotation", + "Rsamtools", + "GenomicAlignments", + "ShortRead", + "RUnit", + "BiocStyle", + "knitr", + "batchtools", + "data.table" ], - "Hash": "7b6e79f86e3d1c23f62c5e2052e848d4" + "Enhances": [ + "Rmpi" + ], + "Collate": "AllGenerics.R DeveloperInterface.R prototype.R bploop.R ErrorHandling.R log.R bpbackend-methods.R bpisup-methods.R bplapply-methods.R bpiterate-methods.R bpstart-methods.R bpstop-methods.R BiocParallelParam-class.R bpmapply-methods.R bpschedule-methods.R bpvec-methods.R bpvectorize-methods.R bpworkers-methods.R bpaggregate-methods.R bpvalidate.R SnowParam-class.R MulticoreParam-class.R TransientMulticoreParam-class.R register.R SerialParam-class.R DoparParam-class.R SnowParam-utils.R BatchtoolsParam-class.R progress.R ipcmutex.R worker-number.R utilities.R rng.R bpinit.R reducer.R worker.R bpoptions.R cpp11.R BiocParallel-defunct.R", + "LinkingTo": [ + "BH (>= 1.87.0)", + "cpp11" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.1.2", + "git_url": "https://git.bioconductor.org/packages/BiocParallel", + "git_branch": "RELEASE_3_22", + "git_last_commit": "3d6f2f6", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Jiefei Wang [aut, cre], Martin Morgan [aut], Valerie Obenchain [aut], Michel Lang [aut], Ryan Thompson [aut], Nitesh Turaga [aut], Aaron Lun [ctb], Henrik Bengtsson [ctb], Madelyn Carlson [ctb] (Translated 'Random Numbers' vignette from Sweave to RMarkdown / HTML.), Phylis Atieno [ctb] (Translated 'Introduction to BiocParallel' vignette from Sweave to Rmarkdown / HTML.), Sergio Oller [ctb] (Improved bpmapply() efficiency., ORCID: )", + "Maintainer": "Jiefei Wang " }, "BiocSingular": { "Package": "BiocSingular", - "Version": "1.20.0", + "Version": "1.26.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Date": "2025-11-17", + "Title": "Singular Value Decomposition for Bioconductor Packages", + "Authors@R": "c(person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\", \"cph\"), email=\"infinite.monkeys.with.keyboards@gmail.com\"))", + "Imports": [ "BiocGenerics", - "BiocParallel", - "DelayedArray", - "Matrix", - "Rcpp", "S4Vectors", + "Matrix", + "methods", + "utils", + "DelayedArray", + "BiocParallel", "ScaledMatrix", - "beachmat", "irlba", - "methods", "rsvd", - "utils" + "Rcpp", + "beachmat (>= 2.25.1)" + ], + "Suggests": [ + "testthat", + "BiocStyle", + "knitr", + "rmarkdown", + "ResidualMatrix" ], - "Hash": "9d2e9fbd803f4eddfeb307b1ee376aad" + "biocViews": "Software, DimensionReduction, PrincipalComponent", + "Description": "Implements exact and approximate methods for singular value decomposition and principal components analysis, in a framework that allows them to be easily switched within Bioconductor packages or workflows. Where possible, parallelization is achieved using the BiocParallel framework.", + "License": "GPL-3", + "LinkingTo": [ + "Rcpp", + "beachmat", + "assorthead" + ], + "VignetteBuilder": "knitr", + "SystemRequirements": "C++17", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "BugReports": "https://github.com/LTLA/BiocSingular/issues", + "URL": "https://github.com/LTLA/BiocSingular", + "git_url": "https://git.bioconductor.org/packages/BiocSingular", + "git_branch": "RELEASE_3_22", + "git_last_commit": "d110898", + "git_last_commit_date": "2025-11-16", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Aaron Lun [aut, cre, cph]", + "Maintainer": "Aaron Lun " }, "BiocVersion": { "Package": "BiocVersion", - "Version": "3.19.1", + "Version": "3.22.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R" - ], - "Hash": "b892e27fc9659a4c8f8787d34c37b8b2" + "Title": "Set the appropriate version of Bioconductor packages", + "Description": "This package provides repository information for the appropriate version of Bioconductor.", + "Authors@R": "c( person(\"Martin\", \"Morgan\", email = \"martin.morgan@roswellpark.org\", role = \"aut\"), person(\"Marcel\", \"Ramos\", email = \"marcel.ramos@sph.cuny.edu\", role = \"ctb\"), person(\"Bioconductor\", \"Package Maintainer\", email = \"maintainer@bioconductor.org\", role = c(\"ctb\", \"cre\")))", + "biocViews": "Infrastructure", + "Depends": [ + "R (>= 4.5.0)" + ], + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "RoxygenNote": "6.0.1", + "git_url": "https://git.bioconductor.org/packages/BiocVersion", + "git_branch": "devel", + "git_last_commit": "fea53ac", + "git_last_commit_date": "2025-04-15", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Martin Morgan [aut], Marcel Ramos [ctb], Bioconductor Package Maintainer [ctb, cre]", + "Maintainer": "Bioconductor Package Maintainer " }, "Biostrings": { "Package": "Biostrings", - "Version": "2.72.0", + "Version": "2.78.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "GenomeInfoDb", - "IRanges", - "R", - "S4Vectors", - "XVector", - "crayon", - "grDevices", + "Title": "Efficient manipulation of biological strings", + "Description": "Memory efficient string containers, string matching algorithms, and other utilities, for fast manipulation of large biological sequences or sets of sequences.", + "biocViews": "SequenceMatching, Alignment, Sequencing, Genetics, DataImport, DataRepresentation, Infrastructure", + "URL": "https://bioconductor.org/packages/Biostrings", + "BugReports": "https://github.com/Bioconductor/Biostrings/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"Patrick\", \"Aboyoun\", role=\"aut\"), person(\"Robert\", \"Gentleman\", role=\"aut\"), person(\"Saikat\", \"DebRoy\", role=\"aut\"), person(\"Vince\", \"Carey\", role=\"ctb\"), person(\"Nicolas\", \"Delhomme\", role=\"ctb\"), person(\"Felix\", \"Ernst\", role=\"ctb\"), person(\"Wolfgang\", \"Huber\", role=\"ctb\", comment=\"'matchprobes' vignette\"), person(\"Beryl\", \"Kanali\", role=\"ctb\", comment=\"Converted 'MultipleAlignments' vignette from Sweave to RMarkdown\"), person(\"Haleema\", \"Khan\", role=\"ctb\", comment=\"Converted 'matchprobes' vignette from Sweave to RMarkdown\"), person(\"Aidan\", \"Lakshman\", role=\"ctb\"), person(\"Kieran\", \"O'Neill\", role=\"ctb\"), person(\"Valerie\", \"Obenchain\", role=\"ctb\"), person(\"Marcel\", \"Ramos\", role=\"ctb\"), person(\"Albert\", \"Vill\", role=\"ctb\"), person(\"Jen\", \"Wokaty\", role=\"ctb\", comment=\"Converted 'matchprobes' vignette from Sweave to RMarkdown\"), person(\"Erik\", \"Wright\", role=\"ctb\"))", + "Depends": [ + "R (>= 4.1.0)", + "BiocGenerics (>= 0.37.0)", + "S4Vectors (>= 0.27.12)", + "IRanges (>= 2.31.2)", + "XVector (>= 0.37.1)", + "Seqinfo" + ], + "Imports": [ "methods", + "utils", + "grDevices", "stats", - "utils" + "crayon" + ], + "LinkingTo": [ + "S4Vectors", + "IRanges", + "XVector" ], - "Hash": "48618c7c7b90b503837824ebcfee6363" + "Suggests": [ + "graphics", + "pwalign", + "BSgenome (>= 1.13.14)", + "BSgenome.Celegans.UCSC.ce2 (>= 1.3.11)", + "BSgenome.Dmelanogaster.UCSC.dm3 (>= 1.3.11)", + "BSgenome.Hsapiens.UCSC.hg18", + "drosophila2probe", + "hgu95av2probe", + "hgu133aprobe", + "GenomicFeatures (>= 1.3.14)", + "hgu95av2cdf", + "affy (>= 1.41.3)", + "affydata (>= 1.11.5)", + "RUnit", + "BiocStyle", + "knitr", + "testthat (>= 3.0.0)", + "covr" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R IUPAC_CODE_MAP.R AMINO_ACID_CODE.R GENETIC_CODE.R XStringCodec-class.R seqtype.R coloring.R XString-class.R XStringSet-class.R XStringSet-comparison.R XStringViews-class.R MaskedXString-class.R XStringSetList-class.R seqinfo-methods.R xscat.R XStringSet-io.R letter.R getSeq.R letterFrequency.R dinucleotideFrequencyTest.R chartr.R reverseComplement.R translate.R toComplex.R replaceAt.R replaceLetterAt.R injectHardMask.R padAndClip.R strsplit-methods.R misc.R SparseList-class.R MIndex-class.R lowlevel-matching.R match-utils.R matchPattern.R maskMotif.R matchLRPatterns.R trimLRPatterns.R matchProbePair.R matchPWM.R findPalindromes.R PDict-class.R matchPDict.R XStringPartialMatches-class.R XStringQuality-class.R QualityScaledXStringSet.R pmatchPattern.R MultipleAlignment.R matchprobes.R moved_to_pwalign.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/Biostrings", + "git_branch": "RELEASE_3_22", + "git_last_commit": "eda5d66", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre], Patrick Aboyoun [aut], Robert Gentleman [aut], Saikat DebRoy [aut], Vince Carey [ctb], Nicolas Delhomme [ctb], Felix Ernst [ctb], Wolfgang Huber [ctb] ('matchprobes' vignette), Beryl Kanali [ctb] (Converted 'MultipleAlignments' vignette from Sweave to RMarkdown), Haleema Khan [ctb] (Converted 'matchprobes' vignette from Sweave to RMarkdown), Aidan Lakshman [ctb], Kieran O'Neill [ctb], Valerie Obenchain [ctb], Marcel Ramos [ctb], Albert Vill [ctb], Jen Wokaty [ctb] (Converted 'matchprobes' vignette from Sweave to RMarkdown), Erik Wright [ctb]", + "Maintainer": "Hervé Pagès " }, "Cairo": { "Package": "Cairo", - "Version": "1.6-2", + "Version": "1.7-0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "R Graphics Device using Cairo Graphics Library for Creating High-Quality Bitmap (PNG, JPEG, TIFF), Vector (PDF, SVG, PostScript) and Display (X11 and Win32) Output", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, ORCID: ), Jeffrey Horner [aut]", + "Maintainer": "Simon Urbanek ", + "Authors@R": "c(person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.org\", ORCID=\"0000-0003-2297-1732\")), person(\"Jeffrey\", \"Horner\", role=\"aut\", email=\"jeff.horner@vanderbilt.edu\"))", + "Depends": [ + "R (>= 2.7.0)" + ], + "Imports": [ "grDevices", "graphics" ], - "Hash": "3918e6b40d27984ca4a99c73b92406c3" + "Suggests": [ + "png" + ], + "Enhances": [ + "FastRWeb" + ], + "Description": "R graphics device using cairographics library that can be used to create high-quality vector (PDF, PostScript and SVG) and bitmap output (PNG,JPEG,TIFF), and high-quality rendering in displays (X11 and Win32). Since it uses the same back-end for all output, copying across formats is WYSIWYG. Files are created without the dependence on X11 or other external programs. This device supports alpha channel (semi-transparent drawing) and resulting images can contain transparent and semi-transparent regions. It is ideal for use in server environments (file output) and as a replacement for other devices that don't have Cairo's capabilities such as alpha support or anti-aliasing. Backends are modular such that any subset of backends is supported.", + "License": "GPL-2 | GPL-3", + "SystemRequirements": "cairo (>= 1.2 http://www.cairographics.org/)", + "URL": "http://www.rforge.net/Cairo/", + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "ComplexHeatmap": { "Package": "ComplexHeatmap", - "Version": "2.20.0", + "Version": "2.26.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Type": "Package", + "Title": "Make Complex Heatmaps", + "Date": "2026-01-30", + "Authors@R": "person(\"Zuguang\", \"Gu\", email = \"guzuguang@suat-sz.edu.cn\", role = c(\"aut\", \"cre\"), comment = c('ORCID'=\"0000-0002-7395-8709\"))", + "Depends": [ + "R (>= 4.0.0)", + "methods", + "grid", + "graphics", + "stats", + "grDevices" + ], + "Imports": [ + "circlize (>= 0.4.14)", "GetoptLong", - "GlobalOptions", - "IRanges", - "R", - "RColorBrewer", - "circlize", - "clue", - "codetools", "colorspace", + "clue", + "RColorBrewer", + "GlobalOptions (>= 0.1.0)", + "png", "digest", - "doParallel", - "foreach", - "grDevices", - "graphics", - "grid", + "IRanges", "matrixStats", - "methods", - "png", - "stats" + "foreach", + "doParallel", + "codetools" ], - "Hash": "0308920b8b9315ccfe69bccb66c15485" + "Suggests": [ + "testthat (>= 1.0.0)", + "knitr", + "markdown", + "dendsort", + "jpeg", + "tiff", + "fastcluster", + "EnrichedHeatmap", + "dendextend (>= 1.0.1)", + "grImport", + "grImport2", + "glue", + "GenomicRanges", + "gridtext", + "pheatmap (>= 1.0.12)", + "gridGraphics", + "gplots", + "rmarkdown", + "Cairo", + "magick" + ], + "VignetteBuilder": "knitr", + "Description": "Complex heatmaps are efficient to visualize associations between different sources of data sets and reveal potential patterns. Here the ComplexHeatmap package provides a highly flexible way to arrange multiple heatmaps and supports various annotation graphics.", + "biocViews": "Software, Visualization, Sequencing", + "URL": "https://github.com/jokergoo/ComplexHeatmap, https://jokergoo.github.io/ComplexHeatmap-reference/book/", + "License": "MIT + file LICENSE", + "RoxygenNote": "7.2.3", + "git_url": "https://git.bioconductor.org/packages/ComplexHeatmap", + "git_branch": "RELEASE_3_22", + "git_last_commit": "880562b", + "git_last_commit_date": "2026-01-30", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Zuguang Gu [aut, cre] (ORCID: )", + "Maintainer": "Zuguang Gu " }, "ConsensusClusterPlus": { "Package": "ConsensusClusterPlus", - "Version": "1.68.0", + "Version": "1.74.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "ALL", + "Type": "Package", + "Imports": [ "Biobase", - "cluster", + "ALL", "graphics", "stats", - "utils" - ], - "Hash": "ba88e4eb2ca2df69376294de93bdda2f" + "utils", + "cluster" + ], + "Title": "ConsensusClusterPlus", + "Date": "2020-4-24", + "Author": "Matt Wilkerson , Peter Waltman ", + "Maintainer": "Matt Wilkerson ", + "Description": "algorithm for determining cluster count and membership by stability evidence in unsupervised analysis", + "License": "GPL version 2", + "biocViews": "Software, Clustering", + "git_url": "https://git.bioconductor.org/packages/ConsensusClusterPlus", + "git_branch": "RELEASE_3_22", + "git_last_commit": "4015c97", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no" }, "DBI": { "Package": "DBI", - "Version": "1.2.2", + "Version": "1.2.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" + "Title": "R Database Interface", + "Date": "2024-06-02", + "Authors@R": "c( person(\"R Special Interest Group on Databases (R-SIG-DB)\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"R Consortium\", role = \"fnd\") )", + "Description": "A database interface definition for communication between R and relational database management systems. All classes in this package are virtual and need to be extended by the various R/DBMS implementations.", + "License": "LGPL (>= 2.1)", + "URL": "https://dbi.r-dbi.org, https://github.com/r-dbi/DBI", + "BugReports": "https://github.com/r-dbi/DBI/issues", + "Depends": [ + "methods", + "R (>= 3.0.0)" + ], + "Suggests": [ + "arrow", + "blob", + "covr", + "DBItest", + "dbplyr", + "downlit", + "dplyr", + "glue", + "hms", + "knitr", + "magrittr", + "nanoarrow (>= 0.3.0.1)", + "RMariaDB", + "rmarkdown", + "rprojroot", + "RSQLite (>= 1.1-2)", + "testthat (>= 3.0.0)", + "vctrs", + "xml2" ], - "Hash": "164809cd72e1d5160b4cb3aa57f510fe" + "VignetteBuilder": "knitr", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/Needs/check": "r-dbi/DBItest", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Config/Needs/website": "r-dbi/DBItest, r-dbi/dbitemplate, adbi, AzureKusto, bigrquery, DatabaseConnector, dittodb, duckdb, implyr, lazysf, odbc, pool, RAthena, IMSMWU/RClickhouse, RH2, RJDBC, RMariaDB, RMySQL, RPostgres, RPostgreSQL, RPresto, RSQLite, sergeant, sparklyr, withr", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "R Special Interest Group on Databases (R-SIG-DB) [aut], Hadley Wickham [aut], Kirill Müller [aut, cre] (), R Consortium [fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "DESeq2": { "Package": "DESeq2", - "Version": "1.44.0", + "Version": "1.50.2", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Type": "Package", + "Title": "Differential gene expression analysis based on the negative binomial distribution", + "Authors@R": "c( person(\"Michael\", \"Love\", email=\"michaelisaiahlove@gmail.com\", role = c(\"aut\",\"cre\")), person(\"Constantin\", \"Ahlmann-Eltze\", role = c(\"ctb\")), person(\"Kwame\", \"Forbes\", role = c(\"ctb\")), person(\"Simon\", \"Anders\", role = c(\"aut\",\"ctb\")), person(\"Wolfgang\", \"Huber\", role = c(\"aut\",\"ctb\")), person(\"RADIANT EU FP7\", role=\"fnd\"), person(\"NIH NHGRI\", role=\"fnd\"), person(\"CZI\", role=\"fnd\"))", + "Maintainer": "Michael Love ", + "Description": "Estimate variance-mean dependence in count data from high-throughput sequencing assays and test for differential expression based on a model using the negative binomial distribution.", + "License": "LGPL (>= 3)", + "VignetteBuilder": "knitr, rmarkdown", + "Imports": [ + "BiocGenerics (>= 0.7.5)", "Biobase", - "BiocGenerics", "BiocParallel", - "GenomicRanges", - "IRanges", - "MatrixGenerics", - "Rcpp", - "RcppArmadillo", - "S4Vectors", - "SummarizedExperiment", - "ggplot2", - "locfit", "matrixStats", "methods", - "stats4" + "stats4", + "locfit", + "ggplot2 (>= 3.4.0)", + "Rcpp (>= 0.11.0)", + "MatrixGenerics" + ], + "Depends": [ + "S4Vectors (>= 0.23.18)", + "IRanges", + "GenomicRanges", + "SummarizedExperiment (>= 1.1.6)" ], - "Hash": "a90e0e67215ba95ccb29e93b169caaa4" + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "vsn", + "pheatmap", + "RColorBrewer", + "apeglm", + "ashr", + "tximport", + "tximeta", + "tximportData", + "readr", + "pbapply", + "airway", + "glmGamPoi", + "BiocManager" + ], + "LinkingTo": [ + "Rcpp", + "RcppArmadillo" + ], + "URL": "https://github.com/thelovelab/DESeq2", + "biocViews": "Sequencing, RNASeq, ChIPSeq, GeneExpression, Transcription, Normalization, DifferentialExpression, Bayesian, Regression, PrincipalComponent, Clustering, ImmunoOncology", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "git_url": "https://git.bioconductor.org/packages/DESeq2", + "git_branch": "RELEASE_3_22", + "git_last_commit": "d90821a", + "git_last_commit_date": "2025-11-11", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Michael Love [aut, cre], Constantin Ahlmann-Eltze [ctb], Kwame Forbes [ctb], Simon Anders [aut, ctb], Wolfgang Huber [aut, ctb], RADIANT EU FP7 [fnd], NIH NHGRI [fnd], CZI [fnd]" }, "DOSE": { "Package": "DOSE", - "Version": "3.30.0", + "Version": "4.4.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Type": "Package", + "Title": "Disease Ontology Semantic and Enrichment analysis", + "Authors@R": "c( person(given = \"Guangchuang\", family = \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\")), person(given = \"Li-Gen\", family = \"Wang\", email = \"reeganwang020@gmail.com\", role = \"ctb\"), person(given = \"Vladislav\", family = \"Petyuk\", email = \"petyuk@gmail.com\", role = \"ctb\"), person(given = \"Giovanni\", family = \"Dall'Olio\", email = \"giovanni.dallolio@upf.edu\", role = \"ctb\"))", + "Maintainer": "Guangchuang Yu ", + "Description": "This package implements five methods proposed by Resnik, Schlicker, Jiang, Lin and Wang respectively for measuring semantic similarities among DO terms and gene products. Enrichment analyses including hypergeometric model and gene set enrichment analysis are also implemented for discovering disease associations of high-throughput biological data.", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "AnnotationDbi", "BiocParallel", - "GOSemSim", - "HDO.db", - "R", "fgsea", "ggplot2", + "GOSemSim (>= 2.31.2)", "methods", "qvalue", "reshape2", "stats", "utils", - "yulab.utils" + "yulab.utils (>= 0.1.6)" ], - "Hash": "48770d6c09181b2e1353650830a2b375" + "Suggests": [ + "prettydoc", + "clusterProfiler", + "gson (>= 0.0.5)", + "knitr", + "memoise", + "org.Hs.eg.db", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "URL": "https://yulab-smu.top/contribution-knowledge-mining/", + "BugReports": "https://github.com/GuangchuangYu/DOSE/issues", + "biocViews": "Annotation, Visualization, MultipleComparison, GeneSetEnrichment, Pathways, Software", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/DOSE", + "git_branch": "RELEASE_3_22", + "git_last_commit": "963047a", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre], Li-Gen Wang [ctb], Vladislav Petyuk [ctb], Giovanni Dall'Olio [ctb]" }, "DT": { "Package": "DT", - "Version": "0.33", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "0.34.0", + "Source": "Repository", + "Type": "Package", + "Title": "A Wrapper of the JavaScript Library 'DataTables'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Xianying\", \"Tan\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Maximilian\", \"Girlich\", role = \"ctb\"), person(\"Greg\", \"Freedman Ellis\", role = \"ctb\"), person(\"Johannes\", \"Rauh\", role = \"ctb\"), person(\"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables in htmlwidgets/lib\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js in htmlwidgets/lib\"), person(\"Leon\", \"Gersen\", role = c(\"ctb\", \"cph\"), comment = \"noUiSlider in htmlwidgets/lib\"), person(\"Bartek\", \"Szopka\", role = c(\"ctb\", \"cph\"), comment = \"jquery.highlight.js in htmlwidgets/lib\"), person(\"Alex\", \"Pickering\", role = \"ctb\"), person(\"William\", \"Holmes\", role = \"ctb\"), person(\"Mikko\", \"Marttila\", role = \"ctb\"), person(\"Andres\", \"Quintero\", role = \"ctb\"), person(\"Stéphane\", \"Laurent\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Data objects in R can be rendered as HTML tables using the JavaScript library 'DataTables' (typically via R Markdown or Shiny). The 'DataTables' library has been included in this R package. The package name 'DT' is an abbreviation of 'DataTables'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/DT", + "BugReports": "https://github.com/rstudio/DT/issues", + "Imports": [ "crosstalk", - "htmltools", - "htmlwidgets", - "httpuv", + "htmltools (>= 0.3.6)", + "htmlwidgets (>= 1.3)", "jquerylib", - "jsonlite", + "jsonlite (>= 0.9.16)", "magrittr", "promises" ], - "Hash": "64ff3427f559ce3f2597a4fe13255cb6" + "Suggests": [ + "bslib", + "future", + "httpuv", + "knitr (>= 1.8)", + "rmarkdown", + "shiny (>= 1.6)", + "testit", + "tibble" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut], Joe Cheng [aut], Xianying Tan [aut], Garrick Aden-Buie [aut, cre] (ORCID: ), JJ Allaire [ctb], Maximilian Girlich [ctb], Greg Freedman Ellis [ctb], Johannes Rauh [ctb], SpryMedia Limited [ctb, cph] (DataTables in htmlwidgets/lib), Brian Reavis [ctb, cph] (selectize.js in htmlwidgets/lib), Leon Gersen [ctb, cph] (noUiSlider in htmlwidgets/lib), Bartek Szopka [ctb, cph] (jquery.highlight.js in htmlwidgets/lib), Alex Pickering [ctb], William Holmes [ctb], Mikko Marttila [ctb], Andres Quintero [ctb], Stéphane Laurent [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Garrick Aden-Buie ", + "Repository": "CRAN" }, "DelayedArray": { "Package": "DelayedArray", - "Version": "0.30.0", + "Version": "0.36.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "IRanges", - "Matrix", - "MatrixGenerics", - "R", - "S4Arrays", - "S4Vectors", - "SparseArray", + "Title": "A unified framework for working transparently with on-disk and in-memory array-like datasets", + "Description": "Wrapping an array-like object (typically an on-disk object) in a DelayedArray object allows one to perform common array operations on it without loading the object in memory. In order to reduce memory usage and optimize performance, operations on the object are either delayed or executed using a block processing mechanism. Note that this also works on in-memory array-like objects like DataFrame objects (typically with Rle columns), Matrix objects, ordinary arrays and, data frames.", + "biocViews": "Infrastructure, DataRepresentation, Annotation, GenomeAnnotation", + "URL": "https://bioconductor.org/packages/DelayedArray", + "BugReports": "https://github.com/Bioconductor/DelayedArray/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"Aaron\", \"Lun\", role=\"ctb\", email=\"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Peter\", \"Hickey\", role=\"ctb\", email=\"peter.hickey@gmail.com\"))", + "Maintainer": "Hervé Pagès ", + "Depends": [ + "R (>= 4.0.0)", "methods", - "stats", - "stats4" + "stats4", + "Matrix", + "BiocGenerics (>= 0.53.3)", + "MatrixGenerics (>= 1.1.3)", + "S4Vectors (>= 0.47.6)", + "IRanges (>= 2.17.3)", + "S4Arrays (>= 1.9.3)", + "SparseArray (>= 1.7.5)" + ], + "Imports": [ + "stats" + ], + "LinkingTo": [ + "S4Vectors" ], - "Hash": "9141899d1bb4ce53e036810eb217721f" + "Suggests": [ + "BiocParallel", + "HDF5Array (>= 1.17.12)", + "genefilter", + "SummarizedExperiment", + "airway", + "lobstr", + "DelayedMatrixStats", + "knitr", + "rmarkdown", + "BiocStyle", + "RUnit" + ], + "VignetteBuilder": "knitr", + "Collate": "compress_atomic_vector.R makeCappedVolumeBox.R AutoBlock-global-settings.R AutoGrid.R blockApply.R DelayedOp-class.R DelayedSubset-class.R DelayedAperm-class.R DelayedUnaryIsoOpStack-class.R DelayedUnaryIsoOpWithArgs-class.R DelayedSubassign-class.R DelayedSetDimnames-class.R DelayedNaryIsoOp-class.R DelayedAbind-class.R showtree.R simplify.R DelayedArray-class.R DelayedArray-subsetting.R chunkGrid.R RealizationSink-class.R realize.R DelayedArray-utils.R DelayedArray-stats.R matrixStats-methods.R DelayedMatrix-rowsum.R DelayedMatrix-mult.R ConstantArray-class.R RleArraySeed-class.R RleArray-class.R compat.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/DelayedArray", + "git_branch": "RELEASE_3_22", + "git_last_commit": "adde054", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre], Aaron Lun [ctb], Peter Hickey [ctb]" }, "DelayedMatrixStats": { "Package": "DelayedMatrixStats", - "Version": "1.26.0", + "Version": "1.32.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "DelayedArray", - "IRanges", - "Matrix", - "MatrixGenerics", - "S4Vectors", - "methods", - "sparseMatrixStats" - ], - "Hash": "5d9536664ccddb0eaa68a90afe4ee76e" + "Type": "Package", + "Title": "Functions that Apply to Rows and Columns of 'DelayedMatrix' Objects", + "Date": "2025-01-09", + "Authors@R": "c(person(\"Peter\", \"Hickey\", role = c(\"aut\", \"cre\"), email = \"peter.hickey@gmail.com\", comment = c(ORCID = \"0000-0002-8153-6258\")), person(\"Hervé\", \"Pagès\", role = \"ctb\", email = \"hpages.on.github@gmail.com\"), person(\"Aaron\", \"Lun\", role = \"ctb\", email = \"infinite.monkeys.with.keyboards@gmail.com\"))", + "Description": "A port of the 'matrixStats' API for use with DelayedMatrix objects from the 'DelayedArray' package. High-performing functions operating on rows and columns of DelayedMatrix objects, e.g. col / rowMedians(), col / rowRanks(), and col / rowSds(). Functions optimized per data type and for subsetted calculations such that both memory usage and processing time is minimized.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2", + "Depends": [ + "MatrixGenerics (>= 1.15.1)", + "DelayedArray (>= 0.31.7)" + ], + "Imports": [ + "methods", + "sparseMatrixStats (>= 1.13.2)", + "Matrix (>= 1.5-0)", + "S4Vectors (>= 0.17.5)", + "IRanges (>= 2.25.10)", + "SparseArray (>= 1.5.19)" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "BiocStyle", + "microbenchmark", + "profmem", + "HDF5Array", + "matrixStats (>= 1.0.0)" + ], + "VignetteBuilder": "knitr", + "URL": "https://github.com/PeteHaitch/DelayedMatrixStats", + "BugReports": "https://github.com/PeteHaitch/DelayedMatrixStats/issues", + "biocViews": "Infrastructure, DataRepresentation, Software", + "git_url": "https://git.bioconductor.org/packages/DelayedMatrixStats", + "git_branch": "RELEASE_3_22", + "git_last_commit": "cbf7d75", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Peter Hickey [aut, cre] (ORCID: ), Hervé Pagès [ctb], Aaron Lun [ctb]", + "Maintainer": "Peter Hickey " }, "DropletUtils": { "Package": "DropletUtils", - "Version": "1.24.0", + "Version": "1.30.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BH", + "Date": "2025-08-27", + "Title": "Utilities for Handling Single-Cell Droplet Data", + "Authors@R": "c( person(\"Aaron\", \"Lun\", role = \"aut\"), person(\"Jonathan\", \"Griffiths\", role=c(\"ctb\", \"cre\"), email = \"jonathan.griffiths.94@gmail.com\"), person(\"Davis\", \"McCarthy\", role=\"ctb\"), person(\"Dongze\", \"He\", role=\"ctb\"), person(\"Rob\", \"Patro\", role=\"ctb\"))", + "Depends": [ + "SingleCellExperiment" + ], + "Imports": [ + "utils", + "stats", + "methods", + "Matrix", + "Rcpp", "BiocGenerics", + "S4Vectors", + "IRanges", + "GenomicRanges", + "SummarizedExperiment", "BiocParallel", - "DelayedArray", + "SparseArray (>= 1.5.18)", + "DelayedArray (>= 0.31.9)", "DelayedMatrixStats", - "GenomicRanges", "HDF5Array", - "IRanges", - "Matrix", + "rhdf5", + "edgeR", "R.utils", + "dqrng", + "beachmat", + "scuttle" + ], + "Suggests": [ + "testthat", + "knitr", + "BiocStyle", + "rmarkdown", + "jsonlite", + "DropletTestFiles" + ], + "biocViews": "ImmunoOncology, SingleCell, Sequencing, RNASeq, GeneExpression, Transcriptomics, DataImport, Coverage", + "Description": "Provides a number of utility functions for handling single-cell (RNA-seq) data from droplet technologies such as 10X Genomics. This includes data loading from count matrices or molecule information files, identification of cells from empty droplets, removal of barcode-swapped pseudo-cells, and downsampling of the count matrix.", + "License": "GPL-3", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "LinkingTo": [ "Rcpp", - "Rhdf5lib", - "S4Vectors", - "SingleCellExperiment", - "SummarizedExperiment", "beachmat", + "assorthead", + "Rhdf5lib", + "BH", "dqrng", - "edgeR", - "methods", - "rhdf5", - "scuttle", - "stats", - "utils" - ], - "Hash": "77f762ad74d48a0ef578fc81deded039" + "scuttle" + ], + "SystemRequirements": "C++17, GNU make", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "git_url": "https://git.bioconductor.org/packages/DropletUtils", + "git_branch": "RELEASE_3_22", + "git_last_commit": "6ef5eaa", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Aaron Lun [aut], Jonathan Griffiths [ctb, cre], Davis McCarthy [ctb], Dongze He [ctb], Rob Patro [ctb]", + "Maintainer": "Jonathan Griffiths " }, "EnhancedVolcano": { "Package": "EnhancedVolcano", - "Version": "1.22.0", + "Version": "1.28.2", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Type": "Package", + "Title": "Publication-ready volcano plots with enhanced colouring and labeling", + "Authors@R": "c( person(\"Kevin\", \"Blighe\", role = c(\"aut\")), person(\"Jared\", \"Andrews\", email = \"jared.andrews07@gmail.com\", role = c(\"cre\", \"ctb\"), comment = c(ORCID = \"0000-0002-0780-6248\")), person(\"Sharmila\", \"Rana\", role = c(\"aut\")), person(\"Emir\", \"Turkes\", role = c(\"ctb\")), person(\"Benjamin\", \"Ostendorf\", role = c(\"ctb\")), person(\"Andrea\", \"Grioni\", role = c(\"ctb\")), person(\"Myles\", \"Lewis\", role = c(\"aut\")))", + "Maintainer": "Jared Andrews ", + "Description": "Volcano plots represent a useful way to visualise the results of differential expression analyses. Here, we present a highly-configurable function that produces publication-ready volcano plots. EnhancedVolcano will attempt to fit as many point labels in the plot window as possible, thus avoiding 'clogging' up the plot with labels that could not otherwise have been read. Other functionality allows the user to identify up to 4 different types of attributes in the same plot space via colour, shape, size, and shade parameter configurations.", + "License": "GPL-3", + "Encoding": "UTF-8", + "Depends": [ "ggplot2", - "ggrepel", - "methods" + "ggrepel" + ], + "Imports": [ + "methods", + "scales", + "grid", + "grDevices" ], - "Hash": "5a83fa8aee8e8ef141122053cd398f53" + "Suggests": [ + "RUnit", + "ggrastr", + "BiocGenerics", + "knitr", + "DESeq2", + "pasilla", + "airway", + "org.Hs.eg.db", + "gridExtra", + "magrittr", + "rmarkdown" + ], + "URL": "https://github.com/kevinblighe/EnhancedVolcano", + "biocViews": "RNASeq, GeneExpression, Transcription, DifferentialExpression, ImmunoOncology", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/EnhancedVolcano", + "git_branch": "RELEASE_3_22", + "git_last_commit": "dae20c7", + "git_last_commit_date": "2025-12-03", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Kevin Blighe [aut], Jared Andrews [cre, ctb] (ORCID: ), Sharmila Rana [aut], Emir Turkes [ctb], Benjamin Ostendorf [ctb], Andrea Grioni [ctb], Myles Lewis [aut]" }, "ExperimentHub": { "Package": "ExperimentHub", - "Version": "2.12.0", + "Version": "3.0.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationHub", - "BiocFileCache", - "BiocGenerics", - "BiocManager", + "Type": "Package", + "Title": "Client to access ExperimentHub resources", + "Authors@R": "c(person(\"Bioconductor Package\", \"Maintainer\", email=\"maintainer@bioconductor.org\", role=\"cre\"), person(\"Martin\", \"Morgan\", role=\"aut\"), person(\"Marc\", \"Carlson\", role=\"ctb\"), person(\"Dan\", \"Tenenbaum\", role=\"ctb\"), person(\"Sonali\", \"Arora\", role=\"ctb\"), person(\"Valerie\", \"Oberchain\", role=\"ctb\"), person(\"Kayla\", \"Morrell\", role=\"ctb\"), person(\"Lori\", \"Shepherd\", role=\"aut\"))", + "Description": "This package provides a client for the Bioconductor ExperimentHub web resource. ExperimentHub provides a central location where curated data from experiments, publications or training courses can be accessed. Each resource has associated metadata, tags and date of modification. The client creates and manages a local cache of files retrieved enabling quick and reproducible access.", + "License": "Artistic-2.0", + "biocViews": "Infrastructure, DataImport, GUI, ThirdPartyClient", + "Depends": [ + "methods", + "BiocGenerics (>= 0.15.10)", + "AnnotationHub (>= 3.99.3)", + "BiocFileCache (>= 2.99.3)" + ], + "Imports": [ + "utils", "S4Vectors", - "methods", - "rappdirs", - "utils" + "BiocManager", + "rappdirs" ], - "Hash": "988693270e5886a33c536dda6b3c9f98" + "Suggests": [ + "knitr", + "BiocStyle", + "rmarkdown", + "HubPub", + "GenomicAlignments" + ], + "Enhances": [ + "ExperimentHubData" + ], + "URL": "https://github.com/Bioconductor/ExperimentHub", + "BugReports": "https://github.com/Bioconductor/ExperimentHub/issues", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.0.0", + "git_url": "https://git.bioconductor.org/packages/ExperimentHub", + "git_branch": "RELEASE_3_22", + "git_last_commit": "b1013ec", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Bioconductor Package Maintainer [cre], Martin Morgan [aut], Marc Carlson [ctb], Dan Tenenbaum [ctb], Sonali Arora [ctb], Valerie Oberchain [ctb], Kayla Morrell [ctb], Lori Shepherd [aut]", + "Maintainer": "Bioconductor Package Maintainer " }, "FNN": { "Package": "FNN", - "Version": "1.1.4", + "Version": "1.1.4.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Date": "2023-12-31", + "Title": "Fast Nearest Neighbor Search Algorithms and Applications", + "Authors@R": "c(person(\"Alina\", \"Beygelzimer\", role = \"aut\", comment = \"cover tree library\"), person(\"Sham\", \"Kakadet\", role = \"aut\", comment = \"cover tree library\"), person(\"John\", \"Langford\", role = \"aut\", comment = \"cover tree library\"), person(\"Sunil\", \"Arya\", role = \"aut\", comment = \"ANN library 1.1.2 for the kd-tree approach\"), person(\"David\", \"Mount\", role = \"aut\", comment = \"ANN library 1.1.2 for the kd-tree approach\"), person(\"Shengqiao\", \"Li\", role = c(\"aut\", \"cre\"), email = \"lishengqiao@yahoo.com\"))", + "Copyright": "ANN Copyright (c) 1997-2010 University of Maryland and Sunil Arya and David Mount. All Rights Reserved.", + "Depends": [ + "R (>= 4.0.0)" ], - "Hash": "eaabdc7938aa3632a28273f53a0d226d" + "Suggests": [ + "chemometrics", + "mvtnorm" + ], + "Description": "Cover-tree and kd-tree fast k-nearest neighbor search algorithms and related applications including KNN classification, regression and information measures are implemented.", + "License": "GPL (>= 2)", + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Author": "Alina Beygelzimer [aut] (cover tree library), Sham Kakadet [aut] (cover tree library), John Langford [aut] (cover tree library), Sunil Arya [aut] (ANN library 1.1.2 for the kd-tree approach), David Mount [aut] (ANN library 1.1.2 for the kd-tree approach), Shengqiao Li [aut, cre]", + "Maintainer": "Shengqiao Li ", + "Encoding": "UTF-8" }, "GEOquery": { "Package": "GEOquery", - "Version": "2.72.0", + "Version": "2.78.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Biobase", - "R.utils", - "curl", - "data.table", + "Type": "Package", + "Title": "Get data from NCBI Gene Expression Omnibus (GEO)", + "Date": "2025-09-03", + "Authors@R": "c(person(given = \"Sean\", family = \"Davis\", role = c(\"aut\", \"cre\"), email = \"seandavi@gmail.com\", comment = c(ORCID = \"0000-0002-8991-6458\")))", + "BugReports": "https://github.com/seandavi/GEOquery/issues/new", + "Depends": [ + "R (>= 4.1.0)", + "methods", + "Biobase" + ], + "Imports": [ + "readr (>= 1.3.1)", + "xml2", "dplyr", - "limma", - "magrittr", - "methods", - "readr", + "data.table", "tidyr", - "xml2" + "magrittr", + "limma", + "curl", + "rentrez", + "R.utils", + "stringr", + "SummarizedExperiment", + "S4Vectors", + "rvest", + "httr2" ], - "Hash": "b27b8e249f59da9349a482311c603a58" + "Suggests": [ + "knitr", + "rmarkdown", + "BiocGenerics", + "testthat", + "covr", + "markdown", + "quarto", + "DropletUtils", + "SingleCellExperiment" + ], + "VignetteBuilder": "quarto", + "URL": "https://github.com/seandavi/GEOquery, http://seandavi.github.io/GEOquery, http://seandavi.github.io/GEOquery/", + "biocViews": "Microarray, DataImport, OneChannel, TwoChannel, SAGE", + "Description": "The NCBI Gene Expression Omnibus (GEO) is a public repository of microarray data. Given the rich and varied nature of this resource, it is only natural to want to apply BioConductor tools to these data. GEOquery is the bridge between GEO and BioConductor.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Roxygen": "list(markdown = TRUE)", + "git_url": "https://git.bioconductor.org/packages/GEOquery", + "git_branch": "RELEASE_3_22", + "git_last_commit": "3a4b52d", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Sean Davis [aut, cre] (ORCID: )", + "Maintainer": "Sean Davis " }, "GGally": { "Package": "GGally", - "Version": "2.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "RColorBrewer", - "dplyr", - "ggplot2", - "ggstats", + "Version": "2.4.0", + "Source": "Repository", + "Type": "Package", + "Title": "Extension to 'ggplot2'", + "Authors@R": "c( person(\"Barret\", \"Schloerke\", , \"schloerke@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Di\", \"Cook\", , \"dicook@monash.edu\", role = c(\"aut\", \"ths\"), comment = c(ORCID = \"0000-0002-3813-7155\")), person(\"Joseph\", \"Larmarange\", , \"joseph@larmarange.net\", role = \"aut\", comment = c(ORCID = \"0000-0001-7097-700X\")), person(\"Francois\", \"Briatte\", , \"f.briatte@gmail.com\", role = \"aut\"), person(\"Moritz\", \"Marbach\", , \"mmarbach@mail.uni-mannheim.de\", role = \"aut\"), person(\"Edwin\", \"Thoen\", , \"edwinthoen@gmail.com\", role = \"aut\"), person(\"Amos\", \"Elberg\", , \"amos.elberg@gmail.com\", role = \"aut\"), person(\"Ott\", \"Toomet\", , \"otoomet@gmail.com\", role = \"ctb\"), person(\"Jason\", \"Crowley\", , \"crowley.jason.s@gmail.com\", role = \"aut\"), person(\"Heike\", \"Hofmann\", , \"hhofmann4@unl.edu\", role = \"ths\", comment = c(ORCID = \"0000-0001-6216-5183\")), person(\"Hadley\", \"Wickham\", , \"h.wickham@gmail.com\", role = \"ths\", comment = c(ORCID = \"0000-0003-4757-117X\")) )", + "Description": "The R package 'ggplot2' is a plotting system based on the grammar of graphics. 'GGally' extends 'ggplot2' by adding several functions to reduce the complexity of combining geometric objects with transformed data. Some of these functions include a pairwise plot matrix, a two group pairwise plot matrix, a parallel coordinates plot, a survival plot, and several functions to plot networks.", + "License": "GPL (>= 2.0)", + "URL": "https://ggobi.github.io/ggally/, https://github.com/ggobi/ggally", + "BugReports": "https://github.com/ggobi/ggally/issues", + "Depends": [ + "ggplot2 (>= 3.5.2)", + "R (>= 4.3)" + ], + "Imports": [ + "cli", + "dplyr (>= 1.1.0)", + "ggstats (>= 0.9.0)", "grDevices", "grid", - "gtable", + "gtable (>= 0.2.0)", "lifecycle", "magrittr", - "plyr", "progress", + "RColorBrewer", "rlang", - "scales", - "tidyr", + "S7 (>= 0.2.0)", + "scales (>= 1.3.0)", + "tidyr (>= 1.3.0)", "utils" ], - "Hash": "b11ac45c916608b7d1374ff87da053d5" + "Suggests": [ + "airports", + "broom (>= 0.7.0)", + "broom.helpers (>= 1.3.0)", + "chemometrics", + "crosstalk", + "emmeans", + "geosphere (>= 1.5-1)", + "ggforce", + "Hmisc", + "igraph (>= 1.0.1)", + "intergraph (>= 2.0-2)", + "knitr", + "labelled", + "mapproj", + "maps (>= 3.1.0)", + "network (>= 1.17.1)", + "nnet", + "rmarkdown", + "scagnostics", + "sna (>= 2.3-2)", + "spelling", + "survival", + "testthat (>= 3.0.0)", + "vdiffr" + ], + "RdMacros": "lifecycle", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-06-13", + "Encoding": "UTF-8", + "Language": "en-US", + "LazyData": "true", + "LazyLoad": "yes", + "RoxygenNote": "7.3.2", + "SystemRequirements": "openssl", + "Collate": "'GGally-package.R' 'data-australia-pisa-2012.R' 'data-baseball.R' 'data-flea.R' 'data-happy.R' 'data-nasa.R' 'data-nba_ppg_2008.R' 'data-pigs.R' 'data-psychademic.R' 'data-tips.R' 'data-twitter_spambots.R' 'deprecated.R' 'find-combo.R' 'gg-plots.R' 'ggally_colbar.R' 'ggally_cross.R' 'ggaly_trends.R' 'ggbivariate.R' 'ggcoef.R' 'ggcorr.R' 'ggfacet.R' 'gglyph.R' 'ggpairs_getput.R' 'ggmatrix.R' 'ggmatrix_gtable.R' 'ggmatrix_gtable_helpers.R' 'ggmatrix_legend.R' 'ggmatrix_make_plot.R' 'ggmatrix_print.R' 'ggmatrix_progress.R' 'ggnet.R' 'ggnet2.R' 'ggnetworkmap.R' 'ggnostic.R' 'ggpairs.R' 'ggpairs_add.R' 'ggpairs_internal_plots.R' 'ggparcoord.R' 'ggsave.R' 'ggscatmat.R' 'ggsurv.R' 'ggtable.R' 'reexports.R' 'utils-pipe.R' 'utils.R' 'vig_ggally.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Barret Schloerke [aut, cre] (ORCID: ), Di Cook [aut, ths] (ORCID: ), Joseph Larmarange [aut] (ORCID: ), Francois Briatte [aut], Moritz Marbach [aut], Edwin Thoen [aut], Amos Elberg [aut], Ott Toomet [ctb], Jason Crowley [aut], Heike Hofmann [ths] (ORCID: ), Hadley Wickham [ths] (ORCID: )", + "Maintainer": "Barret Schloerke ", + "Repository": "CRAN" }, "GO.db": { "Package": "GO.db", - "Version": "3.19.1", + "Version": "3.22.0", "Source": "Bioconductor", - "Requirements": [ - "AnnotationDbi", - "R", - "methods" + "Title": "A set of annotation maps describing the entire Gene Ontology", + "Description": "A set of annotation maps describing the entire Gene Ontology assembled using data from GO", + "Author": "Marc Carlson", + "Maintainer": "Bioconductor Package Maintainer ", + "Depends": [ + "R (>= 2.7.0)", + "methods", + "AnnotationDbi (>= 1.71.1)" + ], + "Suggests": [ + "DBI" ], - "Hash": "46bfc38370acea3503c223347915e43b" + "License": "Artistic-2.0", + "biocViews": "AnnotationData, FunctionalAnnotation", + "NeedsCompilation": "no" }, "GOSemSim": { "Package": "GOSemSim", - "Version": "2.30.0", + "Version": "2.36.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Type": "Package", + "Title": "GO-terms Semantic Similarity Measures", + "Authors@R": "c( person(given = \"Guangchuang\", family = \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\")), person(given = \"Alexey\", family = \"Stukalov\", email = \"astukalov@gmail.com\", role = \"ctb\"), person(given= \"Pingfan\", family = \"Guo\", email = \"1178431277@qq.com\", role = \"ctb\"), person(given = \"Chuanle\", family = \"Xiao\", email = \"xiaochuanle@126.com\", role = \"ctb\"), person(given = \"Lluís\", family = \"Revilla Sancho\", email = \"lluis.revilla@gmail.com\", role = \"ctb\") )", + "Maintainer": "Guangchuang Yu ", + "Description": "The semantic comparisons of Gene Ontology (GO) annotations provide quantitative ways to compute similarities between genes and gene groups, and have became important basis for many bioinformatics analysis approaches. GOSemSim is an R package for semantic similarity computation among GO terms, sets of GO terms, gene products and gene clusters. GOSemSim implemented five methods proposed by Resnik, Schlicker, Jiang, Lin and Wang respectively.", + "Depends": [ + "R (>= 4.2.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ "AnnotationDbi", + "DBI", + "digest", "GO.db", - "R", - "Rcpp", "methods", "rlang", + "R.utils", "stats", "utils", - "yulab.utils" + "yulab.utils (>= 0.2.1)" ], - "Hash": "71084bb847242267f84259405c0094b0" + "Suggests": [ + "AnnotationHub", + "BiocManager", + "clusterProfiler", + "DOSE", + "knitr", + "org.Hs.eg.db", + "prettydoc", + "readr", + "rmarkdown", + "testthat", + "tidyr", + "tidyselect", + "ROCR" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "URL": "https://yulab-smu.top/biomedical-knowledge-mining-book/", + "BugReports": "https://github.com/YuLab-SMU/GOSemSim/issues", + "biocViews": "Annotation, GO, Clustering, Pathways, Network, Software", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/GOSemSim", + "git_branch": "RELEASE_3_22", + "git_last_commit": "c1bf5c5", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Guangchuang Yu [aut, cre], Alexey Stukalov [ctb], Pingfan Guo [ctb], Chuanle Xiao [ctb], Lluís Revilla Sancho [ctb]" }, "GSEABase": { "Package": "GSEABase", - "Version": "1.66.0", + "Version": "1.72.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationDbi", - "Biobase", - "BiocGenerics", - "R", - "XML", - "annotate", - "graph", - "methods" + "Type": "Package", + "Title": "Gene set enrichment data structures and methods", + "Authors@R": "c( person(\"Martin\", \"Morgan\", role = \"aut\"), person(\"Seth\", \"Falcon\", role = \"aut\"), person(\"Robert\", \"Gentleman\", role = \"aut\"), person(\"Paul\", \"Villafuerte\", role = \"ctb\", comment = \"'GSEABase' vignette translation from Sweave to Rmarkdown / HTML\"), person(\"Bioconductor Package Maintainer\", role = \"cre\", email = \"maintainer@bioconductor.org\" ))", + "Description": "This package provides classes and methods to support Gene Set Enrichment Analysis (GSEA).", + "License": "Artistic-2.0", + "Depends": [ + "R (>= 2.6.0)", + "BiocGenerics (>= 0.13.8)", + "Biobase (>= 2.17.8)", + "annotate (>= 1.45.3)", + "methods", + "graph (>= 1.37.2)" + ], + "Suggests": [ + "hgu95av2.db", + "GO.db", + "org.Hs.eg.db", + "Rgraphviz", + "ReportingTools", + "testthat", + "BiocStyle", + "knitr", + "RUnit" ], - "Hash": "b55026a2047cdc8fbadac8670eb6fd8b" + "Imports": [ + "AnnotationDbi", + "XML" + ], + "LazyLoad": "yes", + "Collate": "utilities.R AAA.R AllClasses.R AllGenerics.R getObjects.R methods-CollectionType.R methods-ExpressionSet.R methods-GeneColorSet.R methods-GeneIdentifierType.R methods-GeneSet.R methods-GeneSetCollection.R methods-OBOCollection.R", + "VignetteBuilder": "knitr", + "biocViews": "GeneExpression, GeneSetEnrichment, GraphAndNetwork, GO, KEGG", + "git_url": "https://git.bioconductor.org/packages/GSEABase", + "git_branch": "RELEASE_3_22", + "git_last_commit": "8f4e176", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Martin Morgan [aut], Seth Falcon [aut], Robert Gentleman [aut], Paul Villafuerte [ctb] ('GSEABase' vignette translation from Sweave to Rmarkdown / HTML), Bioconductor Package Maintainer [cre]", + "Maintainer": "Bioconductor Package Maintainer " }, "GSVA": { "Package": "GSVA", - "Version": "1.52.0", + "Version": "2.4.4", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Biobase", - "BiocParallel", - "BiocSingular", - "DelayedArray", - "DelayedMatrixStats", - "GSEABase", + "Title": "Gene Set Variation Analysis for Microarray and RNA-Seq Data", + "Authors@R": "c(person(\"Robert\", \"Castelo\", role=c(\"aut\", \"cre\"), comment=c(ORCID=\"0000-0003-2229-4508\"), email=\"robert.castelo@upf.edu\"), person(\"Justin\", \"Guinney\", role=\"aut\", email=\"jguinney@gmail.com\"), person(\"Alexey\", \"Sergushichev\", role=\"ctb\", email=\"alsergbox@gmail.com\"), person(\"Pablo Sebastian\", \"Rodriguez\", role=\"ctb\", email=\"pablo.rodriguez.bio2@gmail.com\"), person(\"Axel\", \"Klenk\", role=\"ctb\", email=\"axel.klenk@gmail.com\"), person(\"Chan Zuckerberg Initiative (CZI)\", role=\"fnd\"), person(\"Spanish Ministry of Science, Innovation and Universities (MCIU)\", role=\"fnd\"))", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "methods", + "stats", + "utils", + "graphics", + "parallel", + "BiocGenerics", + "MatrixGenerics", + "S4Vectors", + "S4Arrays", "HDF5Array", + "SparseArray", + "DelayedArray", "IRanges", - "Matrix", - "R", - "S4Vectors", + "Biobase", + "SummarizedExperiment", + "GSEABase", + "Matrix (>= 1.5-0)", + "BiocParallel", "SingleCellExperiment", + "BiocSingular", "SpatialExperiment", - "SummarizedExperiment", - "graphics", - "methods", - "parallel", "sparseMatrixStats", - "stats", - "utils" + "cli", + "memuse" ], - "Hash": "c6d010cbdc01797f5e9249843b7ebff4" + "Suggests": [ + "RUnit", + "BiocStyle", + "knitr", + "rmarkdown", + "limma", + "RColorBrewer", + "org.Hs.eg.db", + "genefilter", + "edgeR", + "GSVAdata", + "sva", + "TENxPBMCData", + "TENxVisiumData", + "scuttle", + "scran", + "igraph", + "shiny", + "shinydashboard", + "ggplot2", + "data.table", + "plotly", + "future", + "promises", + "shinybusy", + "shinyjs" + ], + "LinkingTo": [ + "cli" + ], + "Description": "Gene Set Variation Analysis (GSVA) is a non-parametric, unsupervised method for estimating variation of gene set enrichment through the samples of a expression data set. GSVA performs a change in coordinate systems, transforming the data from a gene by sample matrix to a gene-set by sample matrix, thereby allowing the evaluation of pathway enrichment for each sample. This new matrix of GSVA enrichment scores facilitates applying standard analytical methods like functional enrichment, survival analysis, clustering, CNV-pathway analysis or cross-tissue pathway analysis, in a pathway-centric manner.", + "License": "Artistic-2.0", + "VignetteBuilder": "knitr", + "URL": "https://github.com/rcastelo/GSVA", + "BugReports": "https://github.com/rcastelo/GSVA/issues", + "Encoding": "UTF-8", + "biocViews": "FunctionalGenomics, Microarray, RNASeq, Pathways, GeneSetEnrichment", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.3", + "git_url": "https://git.bioconductor.org/packages/GSVA", + "git_branch": "RELEASE_3_22", + "git_last_commit": "e48e822", + "git_last_commit_date": "2025-12-14", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Robert Castelo [aut, cre] (ORCID: ), Justin Guinney [aut], Alexey Sergushichev [ctb], Pablo Sebastian Rodriguez [ctb], Axel Klenk [ctb], Chan Zuckerberg Initiative (CZI) [fnd], Spanish Ministry of Science, Innovation and Universities (MCIU) [fnd]", + "Maintainer": "Robert Castelo " }, "GenomeInfoDb": { "Package": "GenomeInfoDb", - "Version": "1.40.0", + "Version": "1.46.2", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "GenomeInfoDbData", - "IRanges", - "R", - "S4Vectors", - "UCSC.utils", - "methods", + "Title": "Utilities for manipulating chromosome names, including modifying them to follow a particular naming style", + "Description": "Contains data and functions that define and allow translation between different chromosome sequence naming conventions (e.g., \"chr1\" versus \"1\"), including a function that attempts to place sequence names in their natural, rather than lexicographic, order.", + "biocViews": "Genetics, DataRepresentation, Annotation, GenomeAnnotation", + "URL": "https://bioconductor.org/packages/GenomeInfoDb", + "Video": "http://youtu.be/wdEjCYSXa7w", + "BugReports": "https://github.com/Bioconductor/GenomeInfoDb/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Sonali\", \"Arora\", role=\"aut\"), person(\"Martin\", \"Morgan\", role=\"aut\"), person(\"Marc\", \"Carlson\", role=\"aut\"), person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"Prisca Chidimma\", \"Maduka\", role=\"ctb\"), person(\"Atuhurira Kirabo\", \"Kakopo\", role=\"ctb\"), person(\"Haleema\", \"Khan\", role=\"ctb\", comment=\"vignette translation from Sweave to Rmarkdown / HTML\"), person(\"Emmanuel Chigozie\", \"Elendu\", role=\"ctb\"))", + "Depends": [ + "R (>= 4.0.0)", + "methods", + "BiocGenerics (>= 0.53.2)", + "S4Vectors (>= 0.47.6)", + "IRanges (>= 2.41.1)", + "Seqinfo (>= 0.99.2)" + ], + "Imports": [ "stats", - "stats4", - "utils" - ], - "Hash": "614124bc9fb80d222cfa0d2e3e76c339" - }, - "GenomeInfoDbData": { - "Package": "GenomeInfoDbData", - "Version": "1.2.12", - "Source": "Bioconductor", - "Requirements": [ - "R" + "utils", + "UCSC.utils" ], - "Hash": "c3c792a7b7f2677be56e8632c5b7543d" + "Suggests": [ + "GenomeInfoDbData", + "R.utils", + "data.table", + "GenomicRanges", + "Rsamtools", + "GenomicAlignments", + "BSgenome", + "GenomicFeatures", + "TxDb.Dmelanogaster.UCSC.dm3.ensGene", + "BSgenome.Scerevisiae.UCSC.sacCer2", + "BSgenome.Celegans.UCSC.ce2", + "BSgenome.Hsapiens.NCBI.GRCh38", + "RUnit", + "BiocStyle", + "knitr" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R fetch_table_dump_from_Ensembl_FTP.R list_ftp_dir.R NCBI-utils.R UCSC-utils.R Ensembl-utils.R getChromInfoFromNCBI.R getChromInfoFromUCSC.R getChromInfoFromEnsembl.R loadTaxonomyDb.R mapGenomeBuilds.R seqlevelsStyle.R seqlevels-wrappers.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/GenomeInfoDb", + "git_branch": "RELEASE_3_22", + "git_last_commit": "149c9ca", + "git_last_commit_date": "2025-12-03", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Sonali Arora [aut], Martin Morgan [aut], Marc Carlson [aut], Hervé Pagès [aut, cre], Prisca Chidimma Maduka [ctb], Atuhurira Kirabo Kakopo [ctb], Haleema Khan [ctb] (vignette translation from Sweave to Rmarkdown / HTML), Emmanuel Chigozie Elendu [ctb]", + "Maintainer": "Hervé Pagès " }, "GenomicAlignments": { "Package": "GenomicAlignments", - "Version": "1.40.0", + "Version": "1.46.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Title": "Representation and manipulation of short genomic alignments", + "Description": "Provides efficient containers for storing and manipulating short genomic alignments (typically obtained by aligning short reads to a reference genome). This includes read counting, computing the coverage, junction detection, and working with the nucleotide content of the alignments.", + "biocViews": "Infrastructure, DataImport, Genetics, Sequencing, RNASeq, SNP, Coverage, Alignment, ImmunoOncology", + "URL": "https://bioconductor.org/packages/GenomicAlignments", + "Video": "https://www.youtube.com/watch?v=2KqBSbkfhRo , https://www.youtube.com/watch?v=3PK_jx44QTs", + "BugReports": "https://github.com/Bioconductor/GenomicAlignments/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"Valerie\", \"Obenchain\", role=\"aut\"), person(\"Martin\", \"Morgan\", role=\"aut\"), person(\"Fedor\", \"Bezrukov\", role=\"ctb\"), person(\"Robert\", \"Castelo\", role=\"ctb\"), person(\"Halimat C.\", \"Atanda\", role=\"ctb\", comment=\"Translated 'WorkingWithAlignedNucleotides' vignette from Sweave to RMarkdown / HTML.\" ))", + "Depends": [ + "R (>= 4.0.0)", + "methods", + "BiocGenerics (>= 0.37.0)", + "S4Vectors (>= 0.47.6)", + "IRanges (>= 2.23.9)", + "Seqinfo", + "GenomicRanges (>= 1.61.1)", + "SummarizedExperiment (>= 1.39.1)", + "Biostrings (>= 2.77.2)", + "Rsamtools (>= 2.25.1)" + ], + "Imports": [ + "methods", + "utils", + "stats", "BiocGenerics", - "BiocParallel", - "Biostrings", - "GenomeInfoDb", - "GenomicRanges", + "S4Vectors", "IRanges", - "R", + "GenomicRanges", + "Biostrings", "Rsamtools", + "BiocParallel", + "cigarillo (>= 0.99.2)" + ], + "LinkingTo": [ "S4Vectors", - "SummarizedExperiment", - "methods", - "stats", - "utils" + "IRanges" ], - "Hash": "e539709764587c581b31e446dc84d7b8" + "Suggests": [ + "ShortRead", + "rtracklayer", + "BSgenome", + "GenomicFeatures", + "RNAseqData.HNRNPC.bam.chr14", + "pasillaBamSubset", + "TxDb.Hsapiens.UCSC.hg19.knownGene", + "TxDb.Dmelanogaster.UCSC.dm3.ensGene", + "BSgenome.Dmelanogaster.UCSC.dm3", + "BSgenome.Hsapiens.UCSC.hg19", + "DESeq2", + "edgeR", + "RUnit", + "knitr", + "BiocStyle" + ], + "Collate": "utils.R cigar-utils.R GAlignments-class.R GAlignmentPairs-class.R GAlignmentsList-class.R GappedReads-class.R OverlapEncodings-class.R findMateAlignment.R readGAlignments.R junctions-methods.R sequenceLayer.R pileLettersAt.R stackStringsFromGAlignments.R intra-range-methods.R coverage-methods.R setops-methods.R findOverlaps-methods.R coordinate-mapping-methods.R encodeOverlaps-methods.R findCompatibleOverlaps-methods.R summarizeOverlaps-methods.R findSpliceOverlaps-methods.R zzz.R", + "VignetteBuilder": "knitr", + "git_url": "https://git.bioconductor.org/packages/GenomicAlignments", + "git_branch": "RELEASE_3_22", + "git_last_commit": "4bd0167", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre], Valerie Obenchain [aut], Martin Morgan [aut], Fedor Bezrukov [ctb], Robert Castelo [ctb], Halimat C. Atanda [ctb] (Translated 'WorkingWithAlignedNucleotides' vignette from Sweave to RMarkdown / HTML.)", + "Maintainer": "Hervé Pagès " }, "GenomicFeatures": { "Package": "GenomicFeatures", - "Version": "1.56.0", + "Version": "1.62.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationDbi", - "BiocGenerics", - "Biostrings", - "DBI", - "GenomeInfoDb", - "GenomicRanges", - "IRanges", - "R", - "S4Vectors", - "XVector", + "Title": "Query the gene models of a given organism/assembly", + "Description": "Extract the genomic locations of genes, transcripts, exons, introns, and CDS, for the gene models stored in a TxDb object. A TxDb object is a small database that contains the gene models of a given organism/assembly. Bioconductor provides a small collection of TxDb objects in the form of ready-to-install TxDb packages for the most commonly studied organisms. Additionally, the user can easily make a TxDb object (or package) for the organism/assembly of their choice by using the tools from the txdbmaker package.", + "biocViews": "Genetics, Infrastructure, Annotation, Sequencing, GenomeAnnotation", + "URL": "https://bioconductor.org/packages/GenomicFeatures", + "BugReports": "https://github.com/Bioconductor/GenomicFeatures/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"H.\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"M.\", \"Carlson\", role=\"aut\"), person(\"P.\", \"Aboyoun\", role=\"aut\"), person(\"S.\", \"Falcon\", role=\"aut\"), person(\"M.\", \"Morgan\", role=\"aut\"), person(\"D.\", \"Sarkar\", role=\"aut\"), person(\"M.\", \"Lawrence\", role=\"aut\"), person(\"V.\", \"Obenchain\", role=\"aut\"), person(\"S.\", \"Arora\", role=\"ctb\"), person(\"J.\", \"MacDonald\", role=\"ctb\"), person(\"M.\", \"Ramos\", role=\"ctb\"), person(\"S.\", \"Saini\", role=\"ctb\"), person(\"P.\", \"Shannon\", role=\"ctb\"), person(\"L.\", \"Shepherd\", role=\"ctb\"), person(\"D.\", \"Tenenbaum\", role=\"ctb\"), person(\"D.\", \"Van Twisk\", role=\"ctb\"))", + "Depends": [ + "R (>= 3.5.0)", + "BiocGenerics (>= 0.51.2)", + "S4Vectors (>= 0.47.6)", + "IRanges (>= 2.37.1)", + "Seqinfo (>= 0.99.2)", + "GenomicRanges (>= 1.61.1)", + "AnnotationDbi (>= 1.41.4)" + ], + "Imports": [ "methods", - "rtracklayer", + "utils", "stats", - "utils" + "DBI", + "XVector", + "Biostrings (>= 2.77.2)", + "rtracklayer (>= 1.69.1)" ], - "Hash": "0d19619d13b06b9dea85993ce7f09c52" + "Suggests": [ + "GenomeInfoDb", + "txdbmaker", + "org.Mm.eg.db", + "org.Hs.eg.db", + "BSgenome", + "BSgenome.Hsapiens.UCSC.hg19 (>= 1.3.17)", + "BSgenome.Celegans.UCSC.ce11", + "BSgenome.Dmelanogaster.UCSC.dm3 (>= 1.3.17)", + "FDb.UCSC.tRNAs", + "TxDb.Hsapiens.UCSC.hg19.knownGene", + "TxDb.Celegans.UCSC.ce11.ensGene", + "TxDb.Dmelanogaster.UCSC.dm3.ensGene (>= 2.7.1)", + "TxDb.Mmusculus.UCSC.mm10.knownGene (>= 3.4.7)", + "TxDb.Hsapiens.UCSC.hg19.lincRNAsTranscripts", + "TxDb.Hsapiens.UCSC.hg38.knownGene (>= 3.4.6)", + "SNPlocs.Hsapiens.dbSNP144.GRCh38", + "Rsamtools", + "pasillaBamSubset (>= 0.0.5)", + "GenomicAlignments (>= 1.15.7)", + "ensembldb", + "AnnotationFilter", + "RUnit", + "BiocStyle", + "knitr", + "markdown" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R TxDb-schema.R TxDb-SELECT-helpers.R TxDb-class.R FeatureDb-class.R mapIdsToRanges.R id2name.R transcripts.R transcriptsBy.R transcriptsByOverlaps.R transcriptLengths.R exonicParts.R extendExonsIntoIntrons.R features.R tRNAs.R extractTranscriptSeqs.R extractUpstreamSeqs.R getPromoterSeq-methods.R select-methods.R nearest-methods.R transcriptLocs2refLocs.R coordinate-mapping-methods.R proteinToGenome.R coverageByTranscript.R makeTxDb.R makeTxDbFromUCSC.R makeTxDbFromBiomart.R makeTxDbFromEnsembl.R makeTxDbFromGRanges.R makeTxDbFromGFF.R makeFeatureDbFromUCSC.R makeTxDbPackage.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/GenomicFeatures", + "git_branch": "RELEASE_3_22", + "git_last_commit": "f4dfd41", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "H. Pagès [aut, cre], M. Carlson [aut], P. Aboyoun [aut], S. Falcon [aut], M. Morgan [aut], D. Sarkar [aut], M. Lawrence [aut], V. Obenchain [aut], S. Arora [ctb], J. MacDonald [ctb], M. Ramos [ctb], S. Saini [ctb], P. Shannon [ctb], L. Shepherd [ctb], D. Tenenbaum [ctb], D. Van Twisk [ctb]", + "Maintainer": "H. Pagès " }, "GenomicRanges": { "Package": "GenomicRanges", - "Version": "1.56.0", + "Version": "1.62.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "GenomeInfoDb", - "IRanges", - "R", - "S4Vectors", - "XVector", + "Title": "Representation and manipulation of genomic intervals", + "Description": "The ability to efficiently represent and manipulate genomic annotations and alignments is playing a central role when it comes to analyzing high-throughput sequencing data (a.k.a. NGS data). The GenomicRanges package defines general purpose containers for storing and manipulating genomic intervals and variables defined along a genome. More specialized containers for representing and manipulating short alignments against a reference genome, or a matrix-like summarization of an experiment, are defined in the GenomicAlignments and SummarizedExperiment packages, respectively. Both packages build on top of the GenomicRanges infrastructure.", + "biocViews": "Genetics, Infrastructure, DataRepresentation, Sequencing, Annotation, GenomeAnnotation, Coverage", + "URL": "https://bioconductor.org/packages/GenomicRanges", + "BugReports": "https://github.com/Bioconductor/GenomicRanges/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Patrick\", \"Aboyoun\", role=\"aut\"), person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"Michael\", \"Lawrence\", role=\"aut\"), person(\"Sonali\", \"Arora\", role=\"ctb\"), person(\"Martin\", \"Morgan\", role=\"ctb\"), person(\"Kayla\", \"Morrell\", role=\"ctb\"), person(\"Valerie\", \"Obenchain\", role=\"ctb\"), person(\"Marcel\", \"Ramos\", role=\"ctb\"), person(\"Lori\", \"Shepherd\", role=\"ctb\"), person(\"Dan\", \"Tenenbaum\", role=\"ctb\"), person(\"Daniel\", \"van Twisk\", role=\"ctb\"))", + "Depends": [ + "R (>= 4.0.0)", "methods", - "stats", "stats4", - "utils" + "BiocGenerics (>= 0.53.2)", + "S4Vectors (>= 0.45.2)", + "IRanges (>= 2.43.6)", + "Seqinfo (>= 0.99.3)" + ], + "Imports": [ + "utils", + "stats" + ], + "LinkingTo": [ + "S4Vectors", + "IRanges" ], - "Hash": "0fab423e3f49e207681eb404d9182a1e" + "Suggests": [ + "GenomeInfoDb", + "Biobase", + "AnnotationDbi", + "annotate", + "Biostrings (>= 2.77.2)", + "SummarizedExperiment (>= 1.39.1)", + "Rsamtools", + "GenomicAlignments", + "BSgenome", + "GenomicFeatures", + "UCSC.utils", + "txdbmaker", + "Gviz", + "VariantAnnotation", + "AnnotationHub", + "DESeq2", + "DEXSeq", + "edgeR", + "KEGGgraph", + "RNAseqData.HNRNPC.bam.chr14", + "pasillaBamSubset", + "KEGGREST", + "hgu95av2.db", + "hgu95av2probe", + "BSgenome.Scerevisiae.UCSC.sacCer2", + "BSgenome.Hsapiens.UCSC.hg38", + "BSgenome.Mmusculus.UCSC.mm10", + "TxDb.Athaliana.BioMart.plantsmart22", + "TxDb.Dmelanogaster.UCSC.dm3.ensGene", + "TxDb.Hsapiens.UCSC.hg38.knownGene", + "TxDb.Mmusculus.UCSC.mm10.knownGene", + "RUnit", + "digest", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "Collate": "normarg-utils.R utils.R phicoef.R transcript-utils.R constraint.R strand-utils.R genomic-range-squeezers.R GenomicRanges-class.R GenomicRanges-comparison.R GRanges-class.R GPos-class.R GRangesFactor-class.R DelegatingGenomicRanges-class.R GNCList-class.R GenomicRangesList-class.R GRangesList-class.R makeGRangesFromDataFrame.R makeGRangesListFromDataFrame.R RangedData-methods.R findOverlaps-methods.R intra-range-methods.R inter-range-methods.R coverage-methods.R setops-methods.R subtract-methods.R nearest-methods.R absoluteRanges.R tileGenome.R tile-methods.R genomicvars.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/GenomicRanges", + "git_branch": "RELEASE_3_22", + "git_last_commit": "efdd1c3", + "git_last_commit_date": "2025-12-08", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Patrick Aboyoun [aut], Hervé Pagès [aut, cre], Michael Lawrence [aut], Sonali Arora [ctb], Martin Morgan [ctb], Kayla Morrell [ctb], Valerie Obenchain [ctb], Marcel Ramos [ctb], Lori Shepherd [ctb], Dan Tenenbaum [ctb], Daniel van Twisk [ctb]", + "Maintainer": "Hervé Pagès " }, "GetoptLong": { "Package": "GetoptLong", - "Version": "1.0.5", + "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "GlobalOptions", - "R", - "crayon", + "Type": "Package", + "Title": "Parsing Command-Line Arguments and Simple Variable Interpolation", + "Date": "2025-11-28", + "Authors@R": "person(\"Zuguang\", \"Gu\", email = \"z.gu@dkfz.de\", role = c(\"aut\", \"cre\"), comment = c('ORCID'=\"0000-0002-7395-8709\"))", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "rjson", + "GlobalOptions (>= 0.1.0)", "methods", - "rjson" + "crayon" ], - "Hash": "61fac01c73abf03ac72e88dc3952c1e3" + "Suggests": [ + "testthat (>= 1.0.0)", + "knitr", + "markdown", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "Description": "This is a command-line argument parser which wraps the powerful Perl module Getopt::Long and with some adaptations for easier use in R. It also provides a simple way for variable interpolation in R.", + "URL": "https://github.com/jokergoo/GetoptLong", + "SystemRequirements": "Perl, Getopt::Long", + "License": "MIT + file LICENSE", + "NeedsCompilation": "no", + "Author": "Zuguang Gu [aut, cre] (ORCID: )", + "Maintainer": "Zuguang Gu ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "GlobalOptions": { "Package": "GlobalOptions", - "Version": "0.1.2", + "Version": "0.1.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods", + "Type": "Package", + "Title": "Generate Functions to Get or Set Global Options", + "Date": "2025-11-28", + "Authors@R": "person(\"Zuguang\", \"Gu\", email = \"z.gu@dkfz.de\", role = c(\"aut\", \"cre\"), comment = c('ORCID'=\"0000-0002-7395-8709\"))", + "Depends": [ + "R (>= 4.0.0)", + "methods" + ], + "Imports": [ "utils" ], - "Hash": "c3f7b221e60c28f5f3533d74c6fef024" + "Suggests": [ + "testthat (>= 1.0.0)", + "knitr", + "markdown", + "GetoptLong", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "Description": "It provides more configurations on the option values such as validation and filtering on the values, making options invisible or private.", + "URL": "https://github.com/jokergoo/GlobalOptions", + "License": "MIT + file LICENSE", + "NeedsCompilation": "no", + "Author": "Zuguang Gu [aut, cre] (ORCID: )", + "Maintainer": "Zuguang Gu ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "HDF5Array": { "Package": "HDF5Array", - "Version": "1.32.0", + "Version": "1.38.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "DelayedArray", - "IRanges", - "Matrix", - "R", - "Rhdf5lib", - "S4Arrays", - "S4Vectors", - "methods", - "rhdf5", - "rhdf5filters", + "Title": "HDF5 datasets as array-like objects in R", + "Description": "The HDF5Array package is an HDF5 backend for DelayedArray objects. It implements the HDF5Array, H5SparseMatrix, H5ADMatrix, and TENxMatrix classes, 4 convenient and memory-efficient array-like containers for representing and manipulating either: (1) a conventional (a.k.a. dense) HDF5 dataset, (2) an HDF5 sparse matrix (stored in CSR/CSC/Yale format), (3) the central matrix of an h5ad file (or any matrix in the /layers group), or (4) a 10x Genomics sparse matrix. All these containers are DelayedArray extensions and thus support all operations (delayed or block-processed) supported by DelayedArray objects.", + "biocViews": "Infrastructure, DataRepresentation, DataImport, Sequencing, RNASeq, Coverage, Annotation, GenomeAnnotation, SingleCell, ImmunoOncology", + "URL": "https://bioconductor.org/packages/HDF5Array", + "BugReports": "https://github.com/Bioconductor/HDF5Array/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\", comment=c(ORCID=\"0009-0002-8272-4522\"))", + "Depends": [ + "R (>= 3.4)", + "methods", + "SparseArray (>= 1.7.5)", + "DelayedArray (>= 0.33.5)", + "h5mread (>= 0.99.4)" + ], + "Imports": [ + "utils", "stats", "tools", - "utils" - ], - "Hash": "b10ddb24baf506cf7b4bc868ae65b984" - }, - "HDO.db": { - "Package": "HDO.db", - "Version": "0.99.1", - "Source": "Bioconductor", - "Requirements": [ - "AnnotationDbi", - "R", - "methods", - "utils" + "Matrix", + "BiocGenerics (>= 0.51.2)", + "S4Vectors", + "IRanges", + "S4Arrays (>= 1.1.1)", + "rhdf5" ], - "Hash": "be08478e9424bbb54a3890d08e01192b" + "Suggests": [ + "BiocParallel", + "GenomicRanges", + "SummarizedExperiment (>= 1.15.1)", + "h5vcData", + "ExperimentHub", + "TENxBrainData", + "zellkonverter", + "GenomicFeatures", + "SingleCellExperiment", + "DelayedMatrixStats", + "genefilter", + "RSpectra", + "RUnit", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R h5utils.R HDF5ArraySeed-class.R HDF5Array-class.R ReshapedHDF5ArraySeed-class.R ReshapedHDF5Array-class.R dump-management.R writeHDF5Array.R saveHDF5SummarizedExperiment.R H5SparseMatrixSeed-class.R H5SparseMatrix-class.R H5ADMatrixSeed-class.R H5ADMatrix-class.R TENxMatrixSeed-class.R TENxMatrix-class.R writeTENxMatrix.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/HDF5Array", + "git_branch": "RELEASE_3_22", + "git_last_commit": "9bca08f", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Hervé Pagès [aut, cre] (ORCID: )", + "Maintainer": "Hervé Pagès " }, "IRanges": { "Package": "IRanges", - "Version": "2.38.0", + "Version": "2.44.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "R", - "S4Vectors", + "Title": "Foundation of integer range manipulation in Bioconductor", + "Description": "Provides efficient low-level and highly reusable S4 classes for storing, manipulating and aggregating over annotated ranges of integers. Implements an algebra of range operations, including efficient algorithms for finding overlaps and nearest neighbors. Defines efficient list-like classes for storing, transforming and aggregating large grouped data, i.e., collections of atomic vectors and DataFrames.", + "biocViews": "Infrastructure, DataRepresentation", + "URL": "https://bioconductor.org/packages/IRanges", + "BugReports": "https://github.com/Bioconductor/IRanges/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"Patrick\", \"Aboyoun\", role=\"aut\"), person(\"Michael\", \"Lawrence\", role=\"aut\"))", + "Depends": [ + "R (>= 4.0.0)", "methods", + "utils", "stats", - "stats4", - "utils" + "BiocGenerics (>= 0.53.2)", + "S4Vectors (>= 0.47.6)" + ], + "Imports": [ + "stats4" ], - "Hash": "836770692f7c8401090519228b93af32" + "LinkingTo": [ + "S4Vectors" + ], + "Suggests": [ + "XVector", + "GenomicRanges", + "Rsamtools", + "GenomicAlignments", + "GenomicFeatures", + "BSgenome.Celegans.UCSC.ce2", + "pasillaBamSubset", + "RUnit", + "BiocStyle" + ], + "Collate": "thread-control.R range-squeezers.R Vector-class-leftovers.R DataFrameList-class.R DataFrameList-utils.R AtomicList-class.R AtomicList-utils.R Ranges-and-RangesList-classes.R IPosRanges-class.R IPosRanges-comparison.R IntegerRangesList-class.R IRanges-class.R IRanges-constructor.R makeIRangesFromDataFrame.R IRanges-utils.R Rle-class-leftovers.R IPos-class.R subsetting-utils.R Grouping-class.R Views-class.R RleViews-class.R RleViews-summarization.R extractList.R seqapply.R multisplit.R SimpleGrouping-class.R IRangesList-class.R IPosList-class.R ViewsList-class.R RleViewsList-class.R RleViewsList-utils.R RangedSelection-class.R MaskCollection-class.R read.Mask.R CompressedList-class.R CompressedList-comparison.R CompressedHitsList-class.R CompressedDataFrameList-class.R CompressedAtomicList-class.R CompressedAtomicList-summarization.R CompressedGrouping-class.R CompressedRangesList-class.R Hits-class-leftovers.R NCList-class.R findOverlaps-methods.R windows-methods.R intra-range-methods.R inter-range-methods.R reverse-methods.R coverage-methods.R cvg-methods.R slice-methods.R setops-methods.R nearest-methods.R cbind-Rle-methods.R tile-methods.R extractListFragments.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/IRanges", + "git_branch": "RELEASE_3_22", + "git_last_commit": "964a290", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre], Patrick Aboyoun [aut], Michael Lawrence [aut]", + "Maintainer": "Hervé Pagès " }, "KEGGREST": { "Package": "KEGGREST", - "Version": "1.44.0", + "Version": "1.50.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Biostrings", - "R", - "httr", + "Title": "Client-side REST access to the Kyoto Encyclopedia of Genes and Genomes (KEGG)", + "Authors@R": "c( person(\"Dan\", \"Tenenbaum\", role = \"aut\"), person(\"Bioconductor Package\", \"Maintainer\", role = c(\"aut\", \"cre\"), email = \"maintainer@bioconductor.org\"), person(\"Martin\", \"Morgan\", role = \"ctb\"), person(\"Kozo\", \"Nishida\", role = \"ctb\"), person(\"Marcel\", \"Ramos\", role = \"ctb\"), person(\"Kristina\", \"Riemer\", role = \"ctb\"), person(\"Lori\", \"Shepherd\", role = \"ctb\"), person(\"Jeremy\", \"Volkening\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "methods", - "png" + "httr", + "png", + "Biostrings" ], - "Hash": "05ef9fd9aa613310e060ddd93a0c8571" + "Suggests": [ + "RUnit", + "BiocGenerics", + "BiocStyle", + "knitr", + "markdown" + ], + "Description": "A package that provides a client interface to the Kyoto Encyclopedia of Genes and Genomes (KEGG) REST API. Only for academic use by academic users belonging to academic institutions (see ). Note that KEGGREST is based on KEGGSOAP by J. Zhang, R. Gentleman, and Marc Carlson, and KEGG (python package) by Aurelien Mazurie.", + "URL": "https://bioconductor.org/packages/KEGGREST", + "BugReports": "https://github.com/Bioconductor/KEGGREST/issues", + "License": "Artistic-2.0", + "VignetteBuilder": "knitr", + "biocViews": "Annotation, Pathways, ThirdPartyClient, KEGG", + "RoxygenNote": "7.1.1", + "Date": "2025-06-18", + "git_url": "https://git.bioconductor.org/packages/KEGGREST", + "git_branch": "RELEASE_3_22", + "git_last_commit": "bb924dc", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Dan Tenenbaum [aut], Bioconductor Package Maintainer [aut, cre], Martin Morgan [ctb], Kozo Nishida [ctb], Marcel Ramos [ctb], Kristina Riemer [ctb], Lori Shepherd [ctb], Jeremy Volkening [ctb]", + "Maintainer": "Bioconductor Package Maintainer " }, "KernSmooth": { "Package": "KernSmooth", - "Version": "2.23-22", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "2.23-26", + "Source": "Repository", + "Priority": "recommended", + "Date": "2024-12-10", + "Title": "Functions for Kernel Smoothing Supporting Wand & Jones (1995)", + "Authors@R": "c(person(\"Matt\", \"Wand\", role = \"aut\", email = \"Matt.Wand@uts.edu.au\"), person(\"Cleve\", \"Moler\", role = \"ctb\", comment = \"LINPACK routines in src/d*\"), person(\"Brian\", \"Ripley\", role = c(\"trl\", \"cre\", \"ctb\"), email = \"Brian.Ripley@R-project.org\", comment = \"R port and updates\"))", + "Note": "Maintainers are not available to give advice on using a package they did not author.", + "Depends": [ + "R (>= 2.5.0)", "stats" ], - "Hash": "2fecebc3047322fa5930f74fae5de70f" + "Suggests": [ + "MASS", + "carData" + ], + "Description": "Functions for kernel smoothing (and density estimation) corresponding to the book: Wand, M.P. and Jones, M.C. (1995) \"Kernel Smoothing\".", + "License": "Unlimited", + "ByteCompile": "yes", + "NeedsCompilation": "yes", + "Author": "Matt Wand [aut], Cleve Moler [ctb] (LINPACK routines in src/d*), Brian Ripley [trl, cre, ctb] (R port and updates)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "LoomExperiment": { "Package": "LoomExperiment", - "Version": "1.22.0", + "Version": "1.28.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocIO", - "DelayedArray", - "GenomicRanges", - "HDF5Array", - "Matrix", - "R", + "Title": "LoomExperiment container", + "Description": "The LoomExperiment package provide a means to easily convert the Bioconductor \"Experiment\" classes to loom files and vice versa.", + "Encoding": "UTF-8", + "Author": "Martin Morgan, Daniel Van Twisk", + "Maintainer": "Bioconductor Package Maintainer ", + "Depends": [ + "R (>= 3.5.0)", "S4Vectors", "SingleCellExperiment", "SummarizedExperiment", "methods", "rhdf5", + "BiocIO" + ], + "Imports": [ + "DelayedArray", + "GenomicRanges", + "HDF5Array", + "Matrix", "stats", "stringr", "utils" ], - "Hash": "69afb3fc64fcd99784133bc69dfe4f5d" + "Suggests": [ + "testthat", + "BiocStyle", + "knitr", + "rmarkdown", + "reticulate" + ], + "Collate": "AllGenerics.R utils.R SharedMethods.R LoomGraph-class.R LoomExperiment-class.R RangedLoomExperiment-class.R SingleCellLoomExperiment-class.R LoomFile-class.R export-method.R import-method.R", + "License": "Artistic-2.0", + "VignetteBuilder": "knitr", + "biocViews": "ImmunoOncology, DataRepresentation, DataImport, Infrastructure, SingleCell", + "RoxygenNote": "7.1.1", + "git_url": "https://git.bioconductor.org/packages/LoomExperiment", + "git_branch": "RELEASE_3_22", + "git_last_commit": "4b227ef", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no" }, "MASS": { "Package": "MASS", - "Version": "7.3-60.2", + "Version": "7.3-65", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Priority": "recommended", + "Date": "2025-02-19", + "Revision": "$Rev: 3681 $", + "Depends": [ + "R (>= 4.4.0)", "grDevices", "graphics", - "methods", "stats", "utils" ], - "Hash": "2f342c46163b0b54d7b64d1f798e2c78" + "Imports": [ + "methods" + ], + "Suggests": [ + "lattice", + "nlme", + "nnet", + "survival" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Brian.Ripley@R-project.org\"), person(\"Bill\", \"Venables\", role = c(\"aut\", \"cph\")), person(c(\"Douglas\", \"M.\"), \"Bates\", role = \"ctb\"), person(\"Kurt\", \"Hornik\", role = \"trl\", comment = \"partial port ca 1998\"), person(\"Albrecht\", \"Gebhardt\", role = \"trl\", comment = \"partial port ca 1998\"), person(\"David\", \"Firth\", role = \"ctb\", comment = \"support functions for polr\"))", + "Description": "Functions and datasets to support Venables and Ripley, \"Modern Applied Statistics with S\" (4th edition, 2002).", + "Title": "Support Functions and Datasets for Venables and Ripley's MASS", + "LazyData": "yes", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "Contact": "", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], Bill Venables [aut, cph], Douglas M. Bates [ctb], Kurt Hornik [trl] (partial port ca 1998), Albrecht Gebhardt [trl] (partial port ca 1998), David Firth [ctb] (support functions for polr)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "Matrix": { "Package": "Matrix", - "Version": "1.7-0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.7-4", + "Source": "Repository", + "VersionNote": "do also bump src/version.h, inst/include/Matrix/version.h", + "Date": "2025-08-27", + "Priority": "recommended", + "Title": "Sparse and Dense Matrix Classes and Methods", + "Description": "A rich hierarchy of sparse and dense matrix classes, including general, symmetric, triangular, and diagonal matrices with numeric, logical, or pattern entries. Efficient methods for operating on such matrices, often wrapping the 'BLAS', 'LAPACK', and 'SuiteSparse' libraries.", + "License": "GPL (>= 2) | file LICENCE", + "URL": "https://Matrix.R-forge.R-project.org", + "BugReports": "https://R-forge.R-project.org/tracker/?atid=294&group_id=61", + "Contact": "Matrix-authors@R-project.org", + "Authors@R": "c(person(\"Douglas\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"Martin\", \"Maechler\", role = c(\"aut\", \"cre\"), email = \"mmaechler+Matrix@gmail.com\", comment = c(ORCID = \"0000-0002-8685-9910\")), person(\"Mikael\", \"Jagan\", role = \"aut\", comment = c(ORCID = \"0000-0002-3542-2938\")), person(\"Timothy A.\", \"Davis\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7614-6899\", \"SuiteSparse libraries\", \"collaborators listed in dir(system.file(\\\"doc\\\", \\\"SuiteSparse\\\", package=\\\"Matrix\\\"), pattern=\\\"License\\\", full.names=TRUE, recursive=TRUE)\")), person(\"George\", \"Karypis\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2753-1437\", \"METIS library\", \"Copyright: Regents of the University of Minnesota\")), person(\"Jason\", \"Riedy\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4345-4200\", \"GNU Octave's condest() and onenormest()\", \"Copyright: Regents of the University of California\")), person(\"Jens\", \"Oehlschlägel\", role = \"ctb\", comment = \"initial nearPD()\"), person(\"R Core Team\", role = \"ctb\", comment = c(ROR = \"02zz1nj61\", \"base R's matrix implementation\")))", + "Depends": [ + "R (>= 4.4)", + "methods" + ], + "Imports": [ "grDevices", "graphics", "grid", "lattice", - "methods", "stats", "utils" ], - "Hash": "1920b2f11133b12350024297d8a4ff4a" + "Suggests": [ + "MASS", + "datasets", + "sfsmisc", + "tools" + ], + "Enhances": [ + "SparseM", + "graph" + ], + "LazyData": "no", + "LazyDataNote": "not possible, since we use data/*.R and our S4 classes", + "BuildResaveData": "no", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Douglas Bates [aut] (ORCID: ), Martin Maechler [aut, cre] (ORCID: ), Mikael Jagan [aut] (ORCID: ), Timothy A. Davis [ctb] (ORCID: , SuiteSparse libraries, collaborators listed in dir(system.file(\"doc\", \"SuiteSparse\", package=\"Matrix\"), pattern=\"License\", full.names=TRUE, recursive=TRUE)), George Karypis [ctb] (ORCID: , METIS library, Copyright: Regents of the University of Minnesota), Jason Riedy [ctb] (ORCID: , GNU Octave's condest() and onenormest(), Copyright: Regents of the University of California), Jens Oehlschlägel [ctb] (initial nearPD()), R Core Team [ctb] (ROR: , base R's matrix implementation)", + "Maintainer": "Martin Maechler ", + "Repository": "CRAN" }, "MatrixGenerics": { "Package": "MatrixGenerics", - "Version": "1.16.0", + "Version": "1.22.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "matrixStats", + "Title": "S4 Generic Summary Statistic Functions that Operate on Matrix-Like Objects", + "Description": "S4 generic functions modeled after the 'matrixStats' API for alternative matrix implementations. Packages with alternative matrix implementation can depend on this package and implement the generic functions that are defined here for a useful set of row and column summary statistics. Other package developers can import this package and handle a different matrix implementations without worrying about incompatibilities.", + "biocViews": "Infrastructure, Software", + "URL": "https://bioconductor.org/packages/MatrixGenerics", + "BugReports": "https://github.com/Bioconductor/MatrixGenerics/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c(person(\"Constantin\", \"Ahlmann-Eltze\", email = \"artjom31415@googlemail.com\", role = c(\"aut\"), comment = c(ORCID = \"0000-0002-3762-068X\")), person(\"Peter\", \"Hickey\", role = c(\"aut\", \"cre\"), email = \"peter.hickey@gmail.com\", comment = c(ORCID = \"0000-0002-8153-6258\")), person(\"Hervé\", \"Pagès\", email = \"hpages.on.github@gmail.com\", role = \"aut\"))", + "Depends": [ + "matrixStats (>= 1.4.1)" + ], + "Imports": [ "methods" ], - "Hash": "152dbbcde6a9a7c7f3beef79b68cd76a" + "Suggests": [ + "Matrix", + "sparseMatrixStats", + "SparseArray", + "DelayedArray", + "DelayedMatrixStats", + "SummarizedExperiment", + "testthat (>= 2.1.0)" + ], + "RoxygenNote": "7.3.2", + "Roxygen": "list(markdown = TRUE, old_usage = TRUE)", + "Collate": "'MatrixGenerics-package.R' 'rowAlls.R' 'rowAnyNAs.R' 'rowAnys.R' 'rowAvgsPerColSet.R' 'rowCollapse.R' 'rowCounts.R' 'rowCummaxs.R' 'rowCummins.R' 'rowCumprods.R' 'rowCumsums.R' 'rowDiffs.R' 'rowIQRDiffs.R' 'rowIQRs.R' 'rowLogSumExps.R' 'rowMadDiffs.R' 'rowMads.R' 'rowMaxs.R' 'rowMeans.R' 'rowMeans2.R' 'rowMedians.R' 'rowMins.R' 'rowOrderStats.R' 'rowProds.R' 'rowQuantiles.R' 'rowRanges.R' 'rowRanks.R' 'rowSdDiffs.R' 'rowSds.R' 'rowSums.R' 'rowSums2.R' 'rowTabulates.R' 'rowVarDiffs.R' 'rowVars.R' 'rowWeightedMads.R' 'rowWeightedMeans.R' 'rowWeightedMedians.R' 'rowWeightedSds.R' 'rowWeightedVars.R'", + "git_url": "https://git.bioconductor.org/packages/MatrixGenerics", + "git_branch": "RELEASE_3_22", + "git_last_commit": "75d9a54", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Constantin Ahlmann-Eltze [aut] (ORCID: ), Peter Hickey [aut, cre] (ORCID: ), Hervé Pagès [aut]", + "Maintainer": "Peter Hickey " }, "PLIER": { "Package": "PLIER", "Version": "0.99.0", "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "wgmao", - "RemoteRepo": "PLIER", - "RemoteRef": "v0.1.6", - "RemoteSha": "08ed6b54e4efe5249107cb335cd8e169657cbc44", - "Requirements": [ + "Type": "Package", + "Title": "Pathway-Level Information Extractor (PLIER): a generative model for gene expression data", + "Date": "2019-12-31", + "Author": "Maria Chikina, Weiguang Mao", + "Maintainer": "", + "Description": "Prior information", + "License": "GPL (>=2)", + "RoxygenNote": "6.0.1", + "VignetteBuilder": "knitr", + "biocViews": "qvalue", + "Depends": [ "RColorBrewer", - "glmnet", "gplots", - "knitr", "pheatmap", - "qvalue", - "rsvd" + "glmnet", + "knitr", + "rsvd", + "qvalue" ], - "Hash": "c239b106e70c572d14ba7366e646b29d" + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteRepo": "PLIER", + "RemoteUsername": "wgmao", + "RemoteRef": "v0.1.6", + "RemoteSha": "08ed6b54e4efe5249107cb335cd8e169657cbc44" }, "ProtGenerics": { "Package": "ProtGenerics", - "Version": "1.36.0", + "Version": "1.42.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Title": "Generic infrastructure for Bioconductor mass spectrometry packages", + "Description": "S4 generic functions and classes needed by Bioconductor proteomics packages.", + "Author": "Laurent Gatto , Johannes Rainer ", + "Maintainer": "Laurent Gatto ", + "biocViews": "Infrastructure, Proteomics, MassSpectrometry", + "URL": "https://github.com/RforMassSpectrometry/ProtGenerics", + "Depends": [ "methods" ], - "Hash": "a3737c10efc865abfa9d204ca8735b74" + "Suggests": [ + "testthat" + ], + "License": "Artistic-2.0", + "NeedsCompilation": "no", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/ProtGenerics", + "git_branch": "RELEASE_3_22", + "git_last_commit": "672cf15", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22" }, "R.methodsS3": { "Package": "R.methodsS3", "Version": "1.8.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Depends": [ + "R (>= 2.13.0)" + ], + "Imports": [ "utils" ], - "Hash": "278c286fd6e9e75d0c2e8f731ea445c8" + "Suggests": [ + "codetools" + ], + "Title": "S3 Methods Simplified", + "Authors@R": "c(person(\"Henrik\", \"Bengtsson\", role=c(\"aut\", \"cre\", \"cph\"), email = \"henrikb@braju.com\"))", + "Author": "Henrik Bengtsson [aut, cre, cph]", + "Maintainer": "Henrik Bengtsson ", + "Description": "Methods that simplify the setup of S3 generic functions and S3 methods. Major effort has been made in making definition of methods as simple as possible with a minimum of maintenance for package developers. For example, generic functions are created automatically, if missing, and naming conflict are automatically solved, if possible. The method setMethodS3() is a good start for those who in the future may want to migrate to S4. This is a cross-platform package implemented in pure R that generates standard S3 methods.", + "License": "LGPL (>= 2.1)", + "LazyLoad": "TRUE", + "URL": "https://github.com/HenrikBengtsson/R.methodsS3", + "BugReports": "https://github.com/HenrikBengtsson/R.methodsS3/issues", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "R.oo": { "Package": "R.oo", - "Version": "1.26.0", + "Version": "1.27.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R.methodsS3", + "Depends": [ + "R (>= 2.13.0)", + "R.methodsS3 (>= 1.8.2)" + ], + "Imports": [ "methods", "utils" ], - "Hash": "4fed809e53ddb5407b3da3d0f572e591" - }, - "R.utils": { + "Suggests": [ + "tools" + ], + "Title": "R Object-Oriented Programming with or without References", + "Authors@R": "c(person(\"Henrik\", \"Bengtsson\", role=c(\"aut\", \"cre\", \"cph\"), email = \"henrikb@braju.com\"))", + "Author": "Henrik Bengtsson [aut, cre, cph]", + "Maintainer": "Henrik Bengtsson ", + "Description": "Methods and classes for object-oriented programming in R with or without references. Large effort has been made on making definition of methods as simple as possible with a minimum of maintenance for package developers. The package has been developed since 2001 and is now considered very stable. This is a cross-platform package implemented in pure R that defines standard S3 classes without any tricks.", + "License": "LGPL (>= 2.1)", + "LazyLoad": "TRUE", + "URL": "https://henrikbengtsson.github.io/R.oo/, https://github.com/HenrikBengtsson/R.oo", + "BugReports": "https://github.com/HenrikBengtsson/R.oo/issues", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" + }, + "R.utils": { "Package": "R.utils", - "Version": "2.12.3", + "Version": "2.13.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R.methodsS3", - "R.oo", + "Depends": [ + "R (>= 2.14.0)", + "R.oo" + ], + "Imports": [ "methods", + "utils", "tools", - "utils" + "R.methodsS3" ], - "Hash": "3dc2829b790254bfba21e60965787651" + "Suggests": [ + "datasets", + "digest (>= 0.6.10)" + ], + "Title": "Various Programming Utilities", + "Authors@R": "c(person(\"Henrik\", \"Bengtsson\", role=c(\"aut\", \"cre\", \"cph\"), email = \"henrikb@braju.com\"))", + "Author": "Henrik Bengtsson [aut, cre, cph]", + "Maintainer": "Henrik Bengtsson ", + "Description": "Utility functions useful when programming and developing R packages.", + "License": "LGPL (>= 2.1)", + "LazyLoad": "TRUE", + "URL": "https://henrikbengtsson.github.io/R.utils/, https://github.com/HenrikBengtsson/R.utils", + "BugReports": "https://github.com/HenrikBengtsson/R.utils/issues", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "R6": { "Package": "R6", - "Version": "2.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "470851b6d5d0ac559e9d01bb352b4021" + "Version": "2.6.1", + "Source": "Repository", + "Title": "Encapsulated Classes with Reference Semantics", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Creates classes with reference semantics, similar to R's built-in reference classes. Compared to reference classes, R6 classes are simpler and lighter-weight, and they are not built on S4 classes so they do not require the methods package. These classes allow public and private members, and they support inheritance, even when the classes are defined in different packages.", + "License": "MIT + file LICENSE", + "URL": "https://r6.r-lib.org, https://github.com/r-lib/R6", + "BugReports": "https://github.com/r-lib/R6/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Suggests": [ + "lobstr", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate, ggplot2, microbenchmark, scales", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "RColorBrewer": { "Package": "RColorBrewer", "Version": "1.1-3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Date": "2022-04-03", + "Title": "ColorBrewer Palettes", + "Authors@R": "c(person(given = \"Erich\", family = \"Neuwirth\", role = c(\"aut\", \"cre\"), email = \"erich.neuwirth@univie.ac.at\"))", + "Author": "Erich Neuwirth [aut, cre]", + "Maintainer": "Erich Neuwirth ", + "Depends": [ + "R (>= 2.0.0)" ], - "Hash": "45f0398006e83a5b10b72a90663d8d8c" + "Description": "Provides color schemes for maps (and other graphics) designed by Cynthia Brewer as described at http://colorbrewer2.org.", + "License": "Apache License 2.0", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "RCurl": { "Package": "RCurl", - "Version": "1.98-1.14", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bitops", + "Version": "1.98-1.17", + "Source": "Repository", + "Title": "General Network (HTTP/FTP/...) Client Interface for R", + "Authors@R": "c(person(\"CRAN Team\", role = c('ctb', 'cre'), email = \"CRAN@r-project.org\", comment = \"de facto maintainer since 2013\"), person(\"Duncan\", \"Temple Lang\", role = \"aut\", email = \"duncan@r-project.org\", comment = c(ORCID = \"0000-0003-0159-1546\")))", + "SystemRequirements": "GNU make, libcurl", + "Description": "A wrapper for 'libcurl' Provides functions to allow one to compose general HTTP requests and provides convenient functions to fetch URIs, get & post forms, etc. and process the results returned by the Web server. This provides a great deal of control over the HTTP/FTP/... connection and the form of the request while providing a higher-level interface than is available just using R socket connections. Additionally, the underlying implementation is robust and extensive, supporting FTP/FTPS/TFTP (uploads and downloads), SSL/HTTPS, telnet, dict, ldap, and also supports cookies, redirects, authentication, etc.", + "License": "BSD_3_clause + file LICENSE", + "Depends": [ + "R (>= 3.4.0)", "methods" ], - "Hash": "47f648d288079d0c696804ad4e55197e" + "Imports": [ + "bitops" + ], + "Suggests": [ + "XML" + ], + "Collate": "aclassesEnums.R bitClasses.R xbits.R base64.R binary.S classes.S curl.S curlAuthConstants.R curlEnums.R curlError.R curlInfo.S dynamic.R form.S getFormParams.R getURLContent.R header.R http.R httpError.R httpErrors.R iconv.R info.S mime.R multi.S options.S scp.R support.S upload.R urlExists.R zclone.R zzz.R", + "NeedsCompilation": "yes", + "Author": "CRAN Team [ctb, cre] (de facto maintainer since 2013), Duncan Temple Lang [aut] ()", + "Maintainer": "CRAN Team ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "RSQLite": { "Package": "RSQLite", - "Version": "2.3.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "DBI", - "R", + "Version": "2.4.6", + "Source": "Repository", + "Title": "SQLite Interface for R", + "Date": "2026-02-05", + "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(c(\"David\", \"A.\"), \"James\", role = \"aut\"), person(\"Seth\", \"Falcon\", role = \"aut\"), person(\"D. Richard\", \"Hipp\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Dan\", \"Kennedy\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Joe\", \"Mistachkin\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(, \"SQLite Authors\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Liam\", \"Healy\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"R Consortium\", role = \"fnd\"), person(, \"RStudio\", role = \"cph\") )", + "Description": "Embeds the SQLite database engine in R and provides an interface compliant with the DBI package. The source for the SQLite engine (version 3.51.2) and for various extensions is included. System libraries will never be consulted because this package relies on static linking for the plugins it includes; this also ensures a consistent experience across all installations.", + "License": "LGPL (>= 2.1)", + "URL": "https://rsqlite.r-dbi.org, https://github.com/r-dbi/RSQLite", + "BugReports": "https://github.com/r-dbi/RSQLite/issues", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ "bit64", - "blob", - "cpp11", + "blob (>= 1.2.0)", + "DBI (>= 1.2.0)", "memoise", "methods", "pkgconfig", - "plogr", "rlang" ], - "Hash": "ae4a925e0f6bb1b7e5fa96b739c5221a" + "Suggests": [ + "callr", + "cli", + "DBItest (>= 1.8.0)", + "decor", + "gert", + "gh", + "hms", + "knitr", + "magrittr", + "rmarkdown", + "rvest", + "testthat (>= 3.0.0)", + "withr", + "xml2" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "r-dbi/dbitemplate", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "Collate": "'SQLiteConnection.R' 'SQLKeywords_SQLiteConnection.R' 'SQLiteDriver.R' 'SQLite.R' 'SQLiteResult.R' 'coerce.R' 'compatRowNames.R' 'copy.R' 'cpp11.R' 'datasetsDb.R' 'dbAppendTable_SQLiteConnection.R' 'dbBeginTransaction.R' 'dbBegin_SQLiteConnection.R' 'dbBind_SQLiteResult.R' 'dbClearResult_SQLiteResult.R' 'dbColumnInfo_SQLiteResult.R' 'dbCommit_SQLiteConnection.R' 'dbConnect_SQLiteConnection.R' 'dbConnect_SQLiteDriver.R' 'dbDataType_SQLiteConnection.R' 'dbDataType_SQLiteDriver.R' 'dbDisconnect_SQLiteConnection.R' 'dbExistsTable_SQLiteConnection_Id.R' 'dbExistsTable_SQLiteConnection_character.R' 'dbFetch_SQLiteResult.R' 'dbGetException_SQLiteConnection.R' 'dbGetInfo_SQLiteConnection.R' 'dbGetInfo_SQLiteDriver.R' 'dbGetPreparedQuery.R' 'dbGetPreparedQuery_SQLiteConnection_character_data.frame.R' 'dbGetRowCount_SQLiteResult.R' 'dbGetRowsAffected_SQLiteResult.R' 'dbGetStatement_SQLiteResult.R' 'dbHasCompleted_SQLiteResult.R' 'dbIsValid_SQLiteConnection.R' 'dbIsValid_SQLiteDriver.R' 'dbIsValid_SQLiteResult.R' 'dbListResults_SQLiteConnection.R' 'dbListTables_SQLiteConnection.R' 'dbQuoteIdentifier_SQLiteConnection_SQL.R' 'dbQuoteIdentifier_SQLiteConnection_character.R' 'dbReadTable_SQLiteConnection_character.R' 'dbRemoveTable_SQLiteConnection_character.R' 'dbRollback_SQLiteConnection.R' 'dbSendPreparedQuery.R' 'dbSendPreparedQuery_SQLiteConnection_character_data.frame.R' 'dbSendQuery_SQLiteConnection_character.R' 'dbUnloadDriver_SQLiteDriver.R' 'dbUnquoteIdentifier_SQLiteConnection_SQL.R' 'dbWriteTable_SQLiteConnection_character_character.R' 'dbWriteTable_SQLiteConnection_character_data.frame.R' 'db_bind.R' 'deprecated.R' 'export.R' 'fetch_SQLiteResult.R' 'import-standalone-check_suggested.R' 'import-standalone-purrr.R' 'initExtension.R' 'initRegExp.R' 'isSQLKeyword_SQLiteConnection_character.R' 'make.db.names_SQLiteConnection_character.R' 'pkgconfig.R' 'show_SQLiteConnection.R' 'sqlData_SQLiteConnection.R' 'table.R' 'transactions.R' 'utils.R' 'version.R' 'zzz.R'", + "NeedsCompilation": "yes", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], David A. James [aut], Seth Falcon [aut], D. Richard Hipp [ctb] (for the included SQLite sources), Dan Kennedy [ctb] (for the included SQLite sources), Joe Mistachkin [ctb] (for the included SQLite sources), SQLite Authors [ctb] (for the included SQLite sources), Liam Healy [ctb] (for the included SQLite sources), R Consortium [fnd], RStudio [cph]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "RSpectra": { "Package": "RSpectra", - "Version": "0.16-1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", + "Version": "0.16-2", + "Source": "Repository", + "Type": "Package", + "Title": "Solvers for Large-Scale Eigenvalue and SVD Problems", + "Date": "2024-07-18", + "Authors@R": "c( person(\"Yixuan\", \"Qiu\", , \"yixuan.qiu@cos.name\", c(\"aut\", \"cre\")), person(\"Jiali\", \"Mei\", , \"vermouthmjl@gmail.com\", \"aut\", comment = \"Function interface of matrix operation\"), person(\"Gael\", \"Guennebaud\", , \"gael.guennebaud@inria.fr\", \"ctb\", comment = \"Eigenvalue solvers from the 'Eigen' library\"), person(\"Jitse\", \"Niesen\", , \"jitse@maths.leeds.ac.uk\", \"ctb\", comment = \"Eigenvalue solvers from the 'Eigen' library\") )", + "Description": "R interface to the 'Spectra' library for large-scale eigenvalue and SVD problems. It is typically used to compute a few eigenvalues/vectors of an n by n matrix, e.g., the k largest eigenvalues, which is usually more efficient than eigen() if k << n. This package provides the 'eigs()' function that does the similar job as in 'Matlab', 'Octave', 'Python SciPy' and 'Julia'. It also provides the 'svds()' function to calculate the largest k singular values and corresponding singular vectors of a real matrix. The matrix to be computed on can be dense, sparse, or in the form of an operator defined by the user.", + "License": "MPL (>= 2)", + "URL": "https://github.com/yixuan/RSpectra", + "BugReports": "https://github.com/yixuan/RSpectra/issues", + "Depends": [ + "R (>= 3.0.2)" + ], + "Imports": [ + "Matrix (>= 1.1-0)", + "Rcpp (>= 0.11.5)" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "prettydoc" + ], + "LinkingTo": [ "Rcpp", - "RcppEigen" + "RcppEigen (>= 0.3.3.3.0)" ], - "Hash": "6b5ab997fd5ff6d46a5f1d9f8b76961c" + "VignetteBuilder": "knitr, rmarkdown", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "yes", + "Author": "Yixuan Qiu [aut, cre], Jiali Mei [aut] (Function interface of matrix operation), Gael Guennebaud [ctb] (Eigenvalue solvers from the 'Eigen' library), Jitse Niesen [ctb] (Eigenvalue solvers from the 'Eigen' library)", + "Maintainer": "Yixuan Qiu ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "Rcpp": { "Package": "Rcpp", - "Version": "1.0.12", + "Version": "1.1.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Seamless R and C++ Integration", + "Date": "2026-01-07", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"JJ\", \"Allaire\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Kevin\", \"Ushey\", role = \"aut\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Qiang\", \"Kou\", role = \"aut\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Nathan\", \"Russell\", role = \"aut\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"John\", \"Chambers\", role = \"aut\"))", + "Description": "The 'Rcpp' package provides R functions as well as C++ classes which offer a seamless integration of R and C++. Many R data types and objects can be mapped back and forth to C++ equivalents which facilitates both writing of new code as well as easier integration of third-party libraries. Documentation about 'Rcpp' is provided by several vignettes included in this package, via the 'Rcpp Gallery' site at , the paper by Eddelbuettel and Francois (2011, ), the book by Eddelbuettel (2013, ) and the paper by Eddelbuettel and Balamuta (2018, ); see 'citation(\"Rcpp\")' for details.", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "methods", "utils" ], - "Hash": "5ea2700d21e038ace58269ecdbeb9ec0" + "Suggests": [ + "tinytest", + "inline", + "rbenchmark", + "pkgKitten (>= 0.1.2)" + ], + "URL": "https://www.rcpp.org, https://dirk.eddelbuettel.com/code/rcpp.html, https://github.com/RcppCore/Rcpp", + "License": "GPL (>= 2)", + "BugReports": "https://github.com/RcppCore/Rcpp/issues", + "MailingList": "rcpp-devel@lists.r-forge.r-project.org", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "VignetteBuilder": "Rcpp", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Romain Francois [aut] (ORCID: ), JJ Allaire [aut] (ORCID: ), Kevin Ushey [aut] (ORCID: ), Qiang Kou [aut] (ORCID: ), Nathan Russell [aut], Iñaki Ucar [aut] (ORCID: ), Doug Bates [aut] (ORCID: ), John Chambers [aut]", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" }, "RcppAnnoy": { "Package": "RcppAnnoy", - "Version": "0.0.22", + "Version": "0.0.23", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", - "methods" + "Type": "Package", + "Title": "'Rcpp' Bindings for 'Annoy', a Library for Approximate Nearest Neighbors", + "Date": "2026-01-12", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Erik\", \"Bernhardsson\", role = c(\"aut\"), comment = \"Principal author of Annoy\"))", + "Description": "'Annoy' is a small C++ library for Approximate Nearest Neighbors written for efficient memory usage as well an ability to load from / save to disk. This package provides an R interface by relying on the 'Rcpp' package, exposing the same interface as the original Python wrapper to 'Annoy'. See for more on 'Annoy'. 'Annoy' is released under Version 2.0 of the Apache License. Also included is a small Windows port of 'mmap' which is released under the MIT license.", + "License": "GPL (>= 2)", + "Depends": [ + "R (>= 3.1)" + ], + "Imports": [ + "methods", + "Rcpp" + ], + "LinkingTo": [ + "Rcpp" + ], + "Suggests": [ + "tinytest" ], - "Hash": "f6baa1e06fb6c3724f601a764266cb0d" + "URL": "https://github.com/eddelbuettel/rcppannoy, https://dirk.eddelbuettel.com/code/rcpp.annoy.html", + "BugReports": "https://github.com/eddelbuettel/rcppannoy/issues", + "NeedsCompilation": "yes", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "VignetteBuilder": "Rcpp", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Erik Bernhardsson [aut] (Principal author of Annoy)", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" }, "RcppArmadillo": { "Package": "RcppArmadillo", - "Version": "0.12.8.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", - "methods", + "Version": "15.2.3-1", + "Source": "Repository", + "Type": "Package", + "Title": "'Rcpp' Integration for the 'Armadillo' Templated Linear Algebra Library", + "Date": "2025-12-16", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"Binxiang\", \"Ni\", role = \"aut\"), person(\"Conrad\", \"Sanderson\", role = \"aut\", comment = c(ORCID = \"0000-0002-0049-4501\")))", + "Description": "'Armadillo' is a templated C++ linear algebra library aiming towards a good balance between speed and ease of use. It provides high-level syntax and functionality deliberately similar to Matlab. It is useful for algorithm development directly in C++, or quick conversion of research code into production environments. It provides efficient classes for vectors, matrices and cubes where dense and sparse matrices are supported. Integer, floating point and complex numbers are supported. A sophisticated expression evaluator (based on template meta-programming) automatically combines several operations to increase speed and efficiency. Dynamic evaluation automatically chooses optimal code paths based on detected matrix structures. Matrix decompositions are provided through integration with LAPACK, or one of its high performance drop-in replacements (such as 'MKL' or 'OpenBLAS'). It can automatically use 'OpenMP' multi-threading (parallelisation) to speed up computationally expensive operations. . The 'RcppArmadillo' package includes the header files from the 'Armadillo' library; users do not need to install 'Armadillo' itself in order to use 'RcppArmadillo'. Starting from release 15.0.0, the minimum compilation standard is C++14 so 'Armadillo' version 14.6.3 is included as a fallback when an R package forces the C++11 standard. Package authors should set a '#define' to select the 'current' version, or select the 'legacy' version (also chosen as default) if they must. See 'GitHub issue #475' for details. . Since release 7.800.0, 'Armadillo' is licensed under Apache License 2; previous releases were under licensed as MPL 2.0 from version 3.800.0 onwards and LGPL-3 prior to that; 'RcppArmadillo' (the 'Rcpp' bindings/bridge to Armadillo) is licensed under the GNU GPL version 2 or later, as is the rest of 'Rcpp'.", + "License": "GPL (>= 2)", + "LazyLoad": "yes", + "Depends": [ + "R (>= 3.3.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ + "Rcpp (>= 1.0.12)", "stats", - "utils" + "utils", + "methods" + ], + "Suggests": [ + "tinytest", + "Matrix (>= 1.3.0)", + "pkgKitten", + "reticulate", + "slam" ], - "Hash": "d5448fb24fb114c4da1275a37a571f37" + "URL": "https://github.com/RcppCore/RcppArmadillo, https://dirk.eddelbuettel.com/code/rcpp.armadillo.html", + "BugReports": "https://github.com/RcppCore/RcppArmadillo/issues", + "RoxygenNote": "6.0.1", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Romain Francois [aut] (ORCID: ), Doug Bates [aut] (ORCID: ), Binxiang Ni [aut], Conrad Sanderson [aut] (ORCID: )", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "RcppEigen": { "Package": "RcppEigen", - "Version": "0.3.4.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", + "Version": "0.3.4.0.2", + "Source": "Repository", + "Type": "Package", + "Title": "'Rcpp' Integration for the 'Eigen' Templated Linear Algebra Library", + "Date": "2024-08-23", + "Authors@R": "c(person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Yixuan\", \"Qiu\", role = \"aut\", comment = c(ORCID = \"0000-0003-0109-6692\")), person(\"Authors of\", \"Eigen\", role = \"cph\", comment = \"Authorship and copyright in included Eigen library as detailed in inst/COPYRIGHTS\"))", + "Copyright": "See the file COPYRIGHTS for various Eigen copyright details", + "Description": "R and 'Eigen' integration using 'Rcpp'. 'Eigen' is a C++ template library for linear algebra: matrices, vectors, numerical solvers and related algorithms. It supports dense and sparse matrices on integer, floating point and complex numbers, decompositions of such matrices, and solutions of linear systems. Its performance on many algorithms is comparable with some of the best implementations based on 'Lapack' and level-3 'BLAS'. The 'RcppEigen' package includes the header files from the 'Eigen' C++ template library. Thus users do not need to install 'Eigen' itself in order to use 'RcppEigen'. Since version 3.1.1, 'Eigen' is licensed under the Mozilla Public License (version 2); earlier version were licensed under the GNU LGPL version 3 or later. 'RcppEigen' (the 'Rcpp' bindings/bridge to 'Eigen') is licensed under the GNU GPL version 2 or later, as is the rest of 'Rcpp'.", + "License": "GPL (>= 2) | file LICENSE", + "LazyLoad": "yes", + "Depends": [ + "R (>= 3.6.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ + "Rcpp (>= 0.11.0)", "stats", "utils" ], - "Hash": "df49e3306f232ec28f1604e36a202847" - }, - "RcppHNSW": { - "Package": "RcppHNSW", - "Version": "0.6.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Rcpp", - "methods" + "Suggests": [ + "Matrix", + "inline", + "tinytest", + "pkgKitten", + "microbenchmark" ], - "Hash": "1f2dc32c27746a35196aaf95adb357be" + "URL": "https://github.com/RcppCore/RcppEigen, https://dirk.eddelbuettel.com/code/rcpp.eigen.html", + "BugReports": "https://github.com/RcppCore/RcppEigen/issues", + "NeedsCompilation": "yes", + "Author": "Doug Bates [aut] (), Dirk Eddelbuettel [aut, cre] (), Romain Francois [aut] (), Yixuan Qiu [aut] (), Authors of Eigen [cph] (Authorship and copyright in included Eigen library as detailed in inst/COPYRIGHTS)", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "RcppML": { "Package": "RcppML", "Version": "0.3.7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", + "Type": "Package", + "Title": "Rcpp Machine Learning Library", + "Date": "2021-09-21", + "Authors@R": "person(\"Zachary\", \"DeBruine\", email = \"zacharydebruine@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-2234-4827\"))", + "Description": "Fast machine learning algorithms including matrix factorization and divisive clustering for large sparse and dense matrices.", + "License": "GPL (>= 2)", + "Imports": [ "Rcpp", - "RcppEigen", + "Matrix", "methods", "stats" ], - "Hash": "225157373f361daf85198a8d1ddaa733" + "LinkingTo": [ + "Rcpp", + "RcppEigen" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.1.1", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "URL": "https://github.com/zdebruine/RcppML", + "BugReports": "https://github.com/zdebruine/RcppML/issues", + "NeedsCompilation": "yes", + "Author": "Zachary DeBruine [aut, cre] ()", + "Maintainer": "Zachary DeBruine ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "RcppNumerical": { "Package": "RcppNumerical", "Version": "0.6-0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "'Rcpp' Integration for Numerical Computing Libraries", + "Date": "2023-09-06", + "Authors@R": "c( person(\"Yixuan\", \"Qiu\", email = \"yixuan.qiu@cos.name\", role = c(\"aut\", \"cre\")), person(\"Ralf\", \"Stubner\", email = \"ralf.stubner@gmail.com\", role = \"ctb\", comment = \"Integration on infinite intervals\"), person(\"Sreekumar\", \"Balan\", role = \"aut\", comment = \"Numerical integration library\"), person(\"Matt\", \"Beall\", role = \"aut\", comment = \"Numerical integration library\"), person(\"Mark\", \"Sauder\", role = \"aut\", comment = \"Numerical integration library\"), person(\"Naoaki\", \"Okazaki\", role = \"aut\", comment = \"The libLBFGS library\"), person(\"Thomas\", \"Hahn\", role = \"aut\", comment = \"The Cuba library\") )", + "Maintainer": "Yixuan Qiu ", + "Description": "A collection of open source libraries for numerical computing (numerical integration, optimization, etc.) and their integration with 'Rcpp'.", + "License": "GPL (>= 2)", + "Copyright": "See file COPYRIGHTS", + "URL": "https://github.com/yixuan/RcppNumerical", + "BugReports": "https://github.com/yixuan/RcppNumerical/issues", + "Imports": [ + "Rcpp" + ], + "LinkingTo": [ "Rcpp", "RcppEigen" ], - "Hash": "a008f094e60e88cef2472ef0e057f90e" + "Suggests": [ + "knitr", + "rmarkdown", + "prettydoc", + "mvtnorm", + "RcppEigen" + ], + "VignetteBuilder": "knitr, rmarkdown", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Yixuan Qiu [aut, cre], Ralf Stubner [ctb] (Integration on infinite intervals), Sreekumar Balan [aut] (Numerical integration library), Matt Beall [aut] (Numerical integration library), Mark Sauder [aut] (Numerical integration library), Naoaki Okazaki [aut] (The libLBFGS library), Thomas Hahn [aut] (The Cuba library)", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "RcppProgress": { "Package": "RcppProgress", "Version": "0.4.2", "Source": "Repository", - "Repository": "CRAN", - "Hash": "1c0aa18b97e6aaa17f93b8b866c0ace5" + "Maintainer": "Karl Forner ", + "License": "GPL (>= 3)", + "Title": "An Interruptible Progress Bar with OpenMP Support for C++ in R Packages", + "Type": "Package", + "LazyLoad": "yes", + "Author": "Karl Forner ", + "Description": "Allows to display a progress bar in the R console for long running computations taking place in c++ code, and support for interrupting those computations even in multithreaded code, typically using OpenMP.", + "URL": "https://github.com/kforner/rcpp_progress", + "BugReports": "https://github.com/kforner/rcpp_progress/issues", + "Date": "2020-02-06", + "Suggests": [ + "RcppArmadillo", + "devtools", + "roxygen2", + "testthat" + ], + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "RcppTOML": { "Package": "RcppTOML", - "Version": "0.2.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "0.2.3", + "Source": "Repository", + "Type": "Package", + "Title": "'Rcpp' Bindings to Parser for \"Tom's Obvious Markup Language\"", + "Date": "2025-03-08", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Mark\", \"Gillard\", role = \"aut\", comment = \"Author of 'toml++' header library\"))", + "Description": "The configuration format defined by 'TOML' (which expands to \"Tom's Obvious Markup Language\") specifies an excellent format (described at ) suitable for both human editing as well as the common uses of a machine-readable format. This package uses 'Rcpp' to connect to the 'toml++' parser written by Mark Gillard to R.", + "SystemRequirements": "A C++17 compiler", + "BugReports": "https://github.com/eddelbuettel/rcpptoml/issues", + "URL": "http://dirk.eddelbuettel.com/code/rcpp.toml.html", + "Imports": [ + "Rcpp (>= 1.0.8)" + ], + "Depends": [ + "R (>= 3.3.0)" + ], + "LinkingTo": [ "Rcpp" ], - "Hash": "c232938949fcd8126034419cc529333a" + "Suggests": [ + "tinytest" + ], + "License": "GPL (>= 2)", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (), Mark Gillard [aut] (Author of 'toml++' header library)", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "ResidualMatrix": { "Package": "ResidualMatrix", - "Version": "1.14.0", + "Version": "1.20.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "DelayedArray", + "Date": "2025-04-08", + "Title": "Creating a DelayedMatrix of Regression Residuals", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\", \"cph\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "Imports": [ + "methods", "Matrix", "S4Vectors", - "methods" + "DelayedArray" ], - "Hash": "26b5d104b2d27d7aa3725c4e3aa1b3b9" + "Suggests": [ + "testthat", + "BiocStyle", + "knitr", + "rmarkdown", + "BiocSingular" + ], + "biocViews": "Software, DataRepresentation, Regression, BatchEffect, ExperimentalDesign", + "Description": "Provides delayed computation of a matrix of residuals after fitting a linear model to each column of an input matrix. Also supports partial computation of residuals where selected factors are to be preserved in the output matrix. Implements a number of efficient methods for operating on the delayed matrix of residuals, most notably matrix multiplication and calculation of row/column sums or means.", + "License": "GPL-3", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.1", + "BugReports": "https://github.com/LTLA/ResidualMatrix/issues", + "URL": "https://github.com/LTLA/ResidualMatrix", + "git_url": "https://git.bioconductor.org/packages/ResidualMatrix", + "git_branch": "RELEASE_3_22", + "git_last_commit": "87f8d9c", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [aut, cre, cph]", + "Maintainer": "Aaron Lun " }, "Rhdf5lib": { "Package": "Rhdf5lib", - "Version": "1.26.0", + "Version": "1.32.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R" - ], - "Hash": "c92ba8b9a2c5c9ff600a1062a3b7b727" + "Type": "Package", + "Title": "hdf5 library as an R package", + "Authors@R": "c( person( \"Mike\", \"Smith\", role = \"ctb\", comment = c(ORCID = \"0000-0002-7800-3848\") ), person( \"Hugo\", \"Gruson\", role = \"cre\", email = \"hugo.gruson@embl.de\", comment = c(ORCID = \"0000-0002-4094-1476\")) , person( given = \"The HDF Group\", role = \"cph\" ) )", + "Description": "Provides C and C++ hdf5 libraries.", + "License": "Artistic-2.0", + "Copyright": "src/hdf5/COPYING", + "LazyLoad": "true", + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 4.2.0)" + ], + "Suggests": [ + "BiocStyle", + "knitr", + "rmarkdown", + "tinytest", + "mockery" + ], + "URL": "https://github.com/Huber-group-EMBL/Rhdf5lib", + "BugReports": "https://github.com/Huber-group-EMBL/Rhdf5lib/issues", + "SystemRequirements": "GNU make", + "Encoding": "UTF-8", + "biocViews": "Infrastructure", + "RoxygenNote": "7.1.2", + "git_url": "https://git.bioconductor.org/packages/Rhdf5lib", + "git_branch": "RELEASE_3_22", + "git_last_commit": "f62ae28", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Mike Smith [ctb] (ORCID: ), Hugo Gruson [cre] (ORCID: ), The HDF Group [cph]", + "Maintainer": "Hugo Gruson " }, "RhpcBLASctl": { "Package": "RhpcBLASctl", "Version": "0.23-42", "Source": "Repository", + "Date": "2023-02-11", + "Title": "Control the Number of Threads on 'BLAS'", + "Author": "Junji NAKANO and Ei-ji Nakama ", + "Maintainer": "Ei-ji Nakama ", + "Description": "Control the number of threads on 'BLAS' (Aka 'GotoBLAS', 'OpenBLAS', 'ACML', 'BLIS' and 'MKL'). And possible to control the number of threads in 'OpenMP'. Get a number of logical cores and physical cores if feasible.", + "License": "AGPL-3", + "URL": "https://prs.ism.ac.jp/~nakama/Rhpc/", + "ByteCompile": "true", + "NeedsCompilation": "yes", "Repository": "CRAN", - "Hash": "c966ea2957ff75e77afa5c908dfc89e1" + "Encoding": "UTF-8" }, "Rhtslib": { "Package": "Rhtslib", - "Version": "3.0.0", + "Version": "3.6.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "tools", - "zlibbioc" + "Title": "HTSlib high-throughput sequencing library as an R package", + "Description": "This package provides version 1.18 of the 'HTSlib' C library for high-throughput sequence analysis. The package is primarily useful to developers of other R packages who wish to make use of HTSlib. Motivation and instructions for use of this package are in the vignette, vignette(package=\"Rhtslib\", \"Rhtslib\").", + "biocViews": "DataImport, Sequencing", + "URL": "https://bioconductor.org/packages/Rhtslib, http://www.htslib.org/", + "BugReports": "https://github.com/Bioconductor/Rhtslib/issues", + "License": "LGPL (>= 2)", + "Copyright": "Unless otherwise noted in the file, all files outside src/htslib-1.18 or inst/include copyright Bioconductor; for files inside src/htslib-1.18 or inst/include, see file src/htslib-1.18/LICENSE.", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Nathaniel\", \"Hayden\", role=c(\"led\", \"aut\"), email=\"nhayden@fredhutch.org\"), person(\"Martin\", \"Morgan\", role=\"aut\", email=\"martin.morgan@roswellpark.org\"), person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"Tomas\", \"Kalibera\", role=\"ctb\"), person(\"Jeroen\", \"Ooms\", role=\"ctb\"))", + "Imports": [ + "tools" ], - "Hash": "5d6514cd44a0106581e3310f3972a82e" + "Suggests": [ + "knitr", + "rmarkdown", + "BiocStyle" + ], + "SystemRequirements": "libbz2 & liblzma & libcurl (with header files), GNU make", + "StagedInstall": "no", + "VignetteBuilder": "knitr", + "git_url": "https://git.bioconductor.org/packages/Rhtslib", + "git_branch": "RELEASE_3_22", + "git_last_commit": "c4b7268", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Nathaniel Hayden [led, aut], Martin Morgan [aut], Hervé Pagès [aut, cre], Tomas Kalibera [ctb], Jeroen Ooms [ctb]", + "Maintainer": "Hervé Pagès " + }, + "Rigraphlib": { + "Package": "Rigraphlib", + "Version": "1.2.0", + "Source": "Bioconductor", + "Type": "Package", + "Date": "2025-08-21", + "Title": "igraph library as an R package", + "License": "GPL-3", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"cre\", \"aut\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "Description": "Vendors the igraph C source code and builds it into a static library. Other Bioconductor packages can link to libigraph.a in their own C/C++ code. This is intended for packages wrapping C/C++ libraries that depend on the igraph C library and cannot be easily adapted to use the igraph R package.", + "LinkingTo": [ + "biocmake" + ], + "Suggests": [ + "BiocStyle", + "knitr", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "biocViews": "Clustering, GraphAndNetwork", + "NeedsCompilation": "yes", + "URL": "https://github.com/libscran/Rigraphlib", + "BugReports": "https://github.com/libscran/Rigraphlib/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/Rigraphlib", + "git_branch": "RELEASE_3_22", + "git_last_commit": "e14ac37", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Aaron Lun [cre, aut]", + "Maintainer": "Aaron Lun " }, "Rsamtools": { "Package": "Rsamtools", - "Version": "2.20.0", + "Version": "2.26.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", + "Type": "Package", + "Title": "Binary alignment (BAM), FASTA, variant call (BCF), and tabix file import", + "Description": "This package provides an interface to the 'samtools', 'bcftools', and 'tabix' utilities for manipulating SAM (Sequence Alignment / Map), FASTA, binary variant call (BCF) and compressed indexed tab-delimited (tabix) files.", + "biocViews": "DataImport, Sequencing, Coverage, Alignment, QualityControl", + "URL": "https://bioconductor.org/packages/Rsamtools", + "Video": "https://www.youtube.com/watch?v=Rfon-DQYbWA&list=UUqaMSQd_h-2EDGsU6WDiX0Q", + "BugReports": "https://github.com/Bioconductor/Rsamtools/issues", + "License": "Artistic-2.0 | file LICENSE", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Martin\", \"Morgan\", role = \"aut\"), person(\"Hervé\", \"Pagès\", role = \"aut\"), person(\"Valerie\", \"Obenchain\", role = \"aut\"), person(\"Nathaniel\", \"Hayden\", role = \"aut\"), person(\"Busayo\", \"Samuel\", role = \"ctb\", comment = \"Converted Rsamtools vignette from Sweave to RMarkdown / HTML.\"), person(\"Bioconductor Package Maintainer\", email = \"maintainer@bioconductor.org\", role = \"cre\"))", + "Depends": [ + "R (>= 3.5.0)", + "methods", + "Seqinfo", + "GenomicRanges (>= 1.61.1)", + "Biostrings (>= 2.77.2)" + ], + "Imports": [ + "utils", + "BiocGenerics (>= 0.25.1)", + "S4Vectors (>= 0.17.25)", + "IRanges (>= 2.13.12)", + "XVector (>= 0.19.7)", + "bitops", "BiocParallel", - "Biostrings", - "GenomeInfoDb", - "GenomicRanges", - "IRanges", - "R", - "Rhtslib", + "stats" + ], + "Suggests": [ + "GenomicAlignments", + "ShortRead (>= 1.19.10)", + "GenomicFeatures", + "VariantAnnotation", + "TxDb.Dmelanogaster.UCSC.dm3.ensGene", + "TxDb.Hsapiens.UCSC.hg18.knownGene", + "RNAseqData.HNRNPC.bam.chr14", + "BSgenome.Hsapiens.UCSC.hg19", + "RUnit", + "BiocStyle", + "knitr" + ], + "LinkingTo": [ + "Rhtslib (>= 3.3.1)", "S4Vectors", + "IRanges", "XVector", - "bitops", - "methods", - "stats", - "utils", - "zlibbioc" - ], - "Hash": "9762f24dcbdbd1626173c516bb64792c" + "Biostrings" + ], + "LazyLoad": "yes", + "SystemRequirements": "GNU make", + "VignetteBuilder": "knitr", + "git_url": "https://git.bioconductor.org/packages/Rsamtools", + "git_branch": "RELEASE_3_22", + "git_last_commit": "ea99fb0", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Martin Morgan [aut], Hervé Pagès [aut], Valerie Obenchain [aut], Nathaniel Hayden [aut], Busayo Samuel [ctb] (Converted Rsamtools vignette from Sweave to RMarkdown / HTML.), Bioconductor Package Maintainer [cre]", + "Maintainer": "Bioconductor Package Maintainer " }, "Rtsne": { "Package": "Rtsne", "Version": "0.17", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Rcpp", + "Type": "Package", + "Title": "T-Distributed Stochastic Neighbor Embedding using a Barnes-Hut Implementation", + "Authors@R": "c( person(\"Jesse\", \"Krijthe\", ,\"jkrijthe@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Laurens\", \"van der Maaten\", role = c(\"cph\"), comment = \"Author of original C++ code\") )", + "Description": "An R wrapper around the fast T-distributed Stochastic Neighbor Embedding implementation by Van der Maaten (see for more information on the original implementation).", + "License": "file LICENSE", + "URL": "https://github.com/jkrijthe/Rtsne", + "Encoding": "UTF-8", + "Imports": [ + "Rcpp (>= 0.11.0)", "stats" ], - "Hash": "f81f7764a3c3e310b1d40e1a8acee19e" + "LinkingTo": [ + "Rcpp" + ], + "Suggests": [ + "irlba", + "testthat" + ], + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Jesse Krijthe [aut, cre], Laurens van der Maaten [cph] (Author of original C++ code)", + "Maintainer": "Jesse Krijthe ", + "License_is_FOSS": "yes", + "Repository": "CRAN" }, "S4Arrays": { "Package": "S4Arrays", - "Version": "1.4.0", + "Version": "1.10.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "IRanges", + "Title": "Foundation of array-like containers in Bioconductor", + "Description": "The S4Arrays package defines the Array virtual class to be extended by other S4 classes that wish to implement a container with an array-like semantic. It also provides: (1) low-level functionality meant to help the developer of such container to implement basic operations like display, subsetting, or coercion of their array-like objects to an ordinary matrix or array, and (2) a framework that facilitates block processing of array-like objects (typically on-disk objects).", + "biocViews": "Infrastructure, DataRepresentation", + "URL": "https://bioconductor.org/packages/S4Arrays", + "BugReports": "https://github.com/Bioconductor/S4Arrays/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\", comment=c(ORCID=\"0009-0002-8272-4522\")), person(\"Jacques\", \"Serizay\", role=\"ctb\"))", + "Depends": [ + "R (>= 4.3.0)", + "methods", "Matrix", - "R", - "S4Vectors", "abind", - "crayon", - "methods", + "BiocGenerics (>= 0.45.2)", + "S4Vectors (>= 0.47.6)", + "IRanges" + ], + "Imports": [ "stats" ], - "Hash": "665d1f150ce8a6e7614375eafdbad645" + "LinkingTo": [ + "S4Vectors" + ], + "Suggests": [ + "BiocParallel", + "SparseArray (>= 0.0.4)", + "DelayedArray", + "HDF5Array", + "testthat", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R rowsum.R abind.R aperm2.R array_selection.R Nindex-utils.R arep.R array_recycling.R Array-class.R dim-tuning-utils.R Array-subsetting.R Array-subassignment.R ArrayGrid-class.R mapToGrid.R extract_array.R type.R is_sparse.R read_block.R write_block.R show-utils.R Array-kronecker-methods.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/S4Arrays", + "git_branch": "RELEASE_3_22", + "git_last_commit": "a4cccba", + "git_last_commit_date": "2025-11-24", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre] (ORCID: ), Jacques Serizay [ctb]", + "Maintainer": "Hervé Pagès " }, "S4Vectors": { "Package": "S4Vectors", - "Version": "0.42.0", + "Version": "0.48.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "R", + "Title": "Foundation of vector-like and list-like containers in Bioconductor", + "Description": "The S4Vectors package defines the Vector and List virtual classes and a set of generic functions that extend the semantic of ordinary vectors and lists in R. Package developers can easily implement vector-like or list-like objects as concrete subclasses of Vector or List. In addition, a few low-level concrete subclasses of general interest (e.g. DataFrame, Rle, Factor, and Hits) are implemented in the S4Vectors package itself (many more are implemented in the IRanges package and in other Bioconductor infrastructure packages).", + "biocViews": "Infrastructure, DataRepresentation", + "URL": "https://bioconductor.org/packages/S4Vectors", + "BugReports": "https://github.com/Bioconductor/S4Vectors/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"Michael\", \"Lawrence\", role=\"aut\"), person(\"Patrick\", \"Aboyoun\", role=\"aut\"), person(\"Aaron\", \"Lun\", role=\"ctb\"), person(\"Beryl\", \"Kanali\", role=\"ctb\", comment=\"Converted vignettes from Sweave to RMarkdown\"))", + "Depends": [ + "R (>= 4.0.0)", "methods", + "utils", "stats", "stats4", + "BiocGenerics (>= 0.53.2)" + ], + "Suggests": [ + "IRanges", + "GenomicRanges", + "SummarizedExperiment", + "Matrix", + "DelayedArray", + "ShortRead", + "graph", + "data.table", + "RUnit", + "BiocStyle", + "knitr" + ], + "VignetteBuilder": "knitr", + "Collate": "S4-utils.R show-utils.R utils.R normarg-utils.R bindROWS.R LLint-class.R isSorted.R subsetting-utils.R vector-utils.R integer-utils.R character-utils.R raw-utils.R eval-utils.R map_ranges_to_runs.R RectangularData-class.R Annotated-class.R DataFrame_OR_NULL-class.R Vector-class.R Vector-comparison.R Vector-setops.R Vector-merge.R Hits-class.R Hits-comparison.R Hits-setops.R Rle-class.R Rle-utils.R Factor-class.R List-class.R List-comparison.R splitAsList.R List-utils.R SimpleList-class.R HitsList-class.R DataFrame-class.R DataFrame-combine.R DataFrame-comparison.R DataFrame-utils.R DataFrameFactor-class.R TransposedDataFrame-class.R Pairs-class.R FilterRules-class.R stack-methods.R expand-methods.R aggregate-methods.R shiftApply-methods.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/S4Vectors", + "git_branch": "RELEASE_3_22", + "git_last_commit": "c4f37f0", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre], Michael Lawrence [aut], Patrick Aboyoun [aut], Aaron Lun [ctb], Beryl Kanali [ctb] (Converted vignettes from Sweave to RMarkdown)", + "Maintainer": "Hervé Pagès " + }, + "S7": { + "Package": "S7", + "Version": "0.2.1", + "Source": "Repository", + "Title": "An Object Oriented System Meant to Become a Successor to S3 and S4", + "Authors@R": "c( person(\"Object-Oriented Programming Working Group\", role = \"cph\"), person(\"Davis\", \"Vaughan\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Tomasz\", \"Kalinowski\", role = \"aut\"), person(\"Will\", \"Landau\", role = \"aut\"), person(\"Michael\", \"Lawrence\", role = \"aut\"), person(\"Martin\", \"Maechler\", role = \"aut\", comment = c(ORCID = \"0000-0002-8685-9910\")), person(\"Luke\", \"Tierney\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")) )", + "Description": "A new object oriented programming system designed to be a successor to S3 and S4. It includes formal class, generic, and method specification, and a limited form of multiple dispatch. It has been designed and implemented collaboratively by the R Consortium Object-Oriented Programming Working Group, which includes representatives from R-Core, 'Bioconductor', 'Posit'/'tidyverse', and the wider R community.", + "License": "MIT + file LICENSE", + "URL": "https://rconsortium.github.io/S7/, https://github.com/RConsortium/S7", + "BugReports": "https://github.com/RConsortium/S7/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "utils" ], - "Hash": "245ac721ca6088200392ea5251db9e3c" + "Suggests": [ + "bench", + "callr", + "covr", + "knitr", + "methods", + "rmarkdown", + "testthat (>= 3.2.0)", + "tibble" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "sloop", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "external-generic", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Object-Oriented Programming Working Group [cph], Davis Vaughan [aut], Jim Hester [aut] (ORCID: ), Tomasz Kalinowski [aut], Will Landau [aut], Michael Lawrence [aut], Martin Maechler [aut] (ORCID: ), Luke Tierney [aut], Hadley Wickham [aut, cre] (ORCID: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "SQUAREM": { "Package": "SQUAREM", "Version": "2021.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Date": "2021-01-12", + "Title": "Squared Extrapolation Methods for Accelerating EM-Like Monotone Algorithms", + "Description": "Algorithms for accelerating the convergence of slow, monotone sequences from smooth, contraction mapping such as the EM algorithm. It can be used to accelerate any smooth, linearly convergent acceleration scheme. A tutorial style introduction to this package is available in a vignette on the CRAN download page or, when the package is loaded in an R session, with vignette(\"SQUAREM\"). Refer to the J Stat Software article: .", + "Depends": [ + "R (>= 3.0)" + ], + "Suggests": [ + "setRNG" ], - "Hash": "0cf10dab0d023d5b46a5a14387556891" + "LazyLoad": "yes", + "License": "GPL (>= 2)", + "Author": "Ravi Varadhan", + "Maintainer": "Ravi Varadhan ", + "URL": "https://coah.jhu.edu/people/Faculty_personal_Pages/Varadhan.html", + "Repository": "CRAN", + "NeedsCompilation": "no", + "Encoding": "UTF-8" }, "ScaledMatrix": { "Package": "ScaledMatrix", - "Version": "1.12.0", + "Version": "1.18.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "DelayedArray", + "Date": "2024-02-29", + "Title": "Creating a DelayedMatrix of Scaled and Centered Values", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\", \"cph\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "Imports": [ + "methods", "Matrix", "S4Vectors", - "methods" + "DelayedArray" + ], + "Suggests": [ + "testthat", + "BiocStyle", + "knitr", + "rmarkdown", + "BiocSingular", + "DelayedMatrixStats" + ], + "biocViews": "Software, DataRepresentation", + "Description": "Provides delayed computation of a matrix of scaled and centered values. The result is equivalent to using the scale() function but avoids explicit realization of a dense matrix during block processing. This permits greater efficiency in common operations, most notably matrix multiplication.", + "License": "GPL-3", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.1", + "BugReports": "https://github.com/LTLA/ScaledMatrix/issues", + "URL": "https://github.com/LTLA/ScaledMatrix", + "git_url": "https://git.bioconductor.org/packages/ScaledMatrix", + "git_branch": "RELEASE_3_22", + "git_last_commit": "2bcf86d", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [aut, cre, cph]", + "Maintainer": "Aaron Lun " + }, + "Seqinfo": { + "Package": "Seqinfo", + "Version": "1.0.0", + "Source": "Bioconductor", + "Title": "A simple S4 class for storing basic information about a collection of genomic sequences", + "Description": "The Seqinfo class stores the names, lengths, circularity flags, and genomes for a particular collection of sequences. These sequences are typically the chromosomes and/or scaffolds of a specific genome assembly of a given organism. Seqinfo objects are rarely used as standalone objects. Instead, they are used as part of higher-level objects to represent their seqinfo() component. Examples of such higher-level objects are GRanges, RangedSummarizedExperiment, VCF, GAlignments, etc... defined in other Bioconductor infrastructure packages.", + "biocViews": "Infrastructure, DataRepresentation, GenomeAssembly, Annotation, GenomeAnnotation", + "URL": "https://bioconductor.org/packages/Seqinfo", + "BugReports": "https://github.com/Bioconductor/Seqinfo/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\", comment=c(ORCID=\"0009-0002-8272-4522\"))", + "Depends": [ + "methods", + "BiocGenerics" + ], + "Imports": [ + "stats", + "S4Vectors (>= 0.47.6)", + "IRanges" ], - "Hash": "bac1c808a92d9c3f45d05e7a8c1b74f0" + "Suggests": [ + "GenomeInfoDb", + "GenomicRanges", + "BSgenome", + "GenomicFeatures", + "TxDb.Hsapiens.UCSC.hg38.knownGene", + "TxDb.Dmelanogaster.UCSC.dm3.ensGene", + "BSgenome.Hsapiens.UCSC.hg38", + "BSgenome.Celegans.UCSC.ce2", + "RUnit", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R rankSeqlevels.R seqinfo.R sortSeqlevels.R Seqinfo-class.R seqlevelsInUse.R GenomeDescription-class.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/Seqinfo", + "git_branch": "RELEASE_3_22", + "git_last_commit": "9fc5a61", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Hervé Pagès [aut, cre] (ORCID: )", + "Maintainer": "Hervé Pagès " }, "SingleCellExperiment": { "Package": "SingleCellExperiment", - "Version": "1.26.0", + "Version": "1.32.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "DelayedArray", - "GenomicRanges", - "S4Vectors", - "SummarizedExperiment", + "Date": "2025-06-27", + "Title": "S4 Classes for Single Cell Data", + "Authors@R": "c( person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cph\"), email=\"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Davide\",\"Risso\", role=c(\"aut\",\"cre\", \"cph\"), email=\"risso.davide@gmail.com\"), person(\"Keegan\", \"Korthauer\", role=\"ctb\"), person(\"Kevin\", \"Rue-Albrecht\", role=\"ctb\"), person(\"Luke\", \"Zappia\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7744-8565\", github = \"lazappi\")))", + "Depends": [ + "SummarizedExperiment" + ], + "Imports": [ "methods", + "utils", "stats", - "utils" + "S4Vectors", + "BiocGenerics", + "GenomicRanges", + "DelayedArray" ], - "Hash": "4476ad434a5e7887884521417cab3764" + "Suggests": [ + "testthat", + "BiocStyle", + "knitr", + "rmarkdown", + "Matrix", + "scRNAseq (>= 2.9.1)", + "Rtsne" + ], + "biocViews": "ImmunoOncology, DataRepresentation, DataImport, Infrastructure, SingleCell", + "Description": "Defines a S4 class for storing data from single-cell experiments. This includes specialized methods to store and retrieve spike-in information, dimensionality reduction coordinates and size factors for each cell, along with the usual metadata for genes and libraries.", + "License": "GPL-3", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/SingleCellExperiment", + "git_branch": "RELEASE_3_22", + "git_last_commit": "db7133e", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [aut, cph], Davide Risso [aut, cre, cph], Keegan Korthauer [ctb], Kevin Rue-Albrecht [ctb], Luke Zappia [ctb] (ORCID: , github: lazappi)", + "Maintainer": "Davide Risso " }, "SingleR": { "Package": "SingleR", - "Version": "2.6.0", + "Version": "2.12.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocNeighbors", - "BiocParallel", - "BiocSingular", + "Title": "Reference-Based Single-Cell RNA-Seq Annotation", + "Date": "2025-10-16", + "Authors@R": "c(person(\"Dvir\", \"Aran\", email=\"dvir.aran@ucsf.edu\", role=c(\"aut\", \"cph\")), person(\"Aaron\", \"Lun\", email=\"infinite.monkeys.with.keyboards@gmail.com\", role=c(\"ctb\", \"cre\")), person(\"Daniel\", \"Bunis\", role=\"ctb\"), person(\"Jared\", \"Andrews\", email = \"jared.andrews07@gmail.com\", role=\"ctb\"), person(\"Friederike\", \"Dündar\", email = \"frd2007@med.cornell.edu\", role=\"ctb\"))", + "Description": "Performs unbiased cell type recognition from single-cell RNA sequencing data, by leveraging reference transcriptomic datasets of pure cell types to infer the cell of origin of each single cell independently.", + "License": "GPL-3", + "Depends": [ + "SummarizedExperiment" + ], + "Imports": [ + "methods", + "Matrix", + "S4Vectors", "DelayedArray", "DelayedMatrixStats", - "Matrix", + "BiocParallel", + "BiocNeighbors", + "stats", + "utils", + "Rcpp", + "beachmat (>= 2.25.1)" + ], + "LinkingTo": [ "Rcpp", - "S4Vectors", - "SummarizedExperiment", "beachmat", - "methods", - "parallel", - "stats", - "utils" + "assorthead (>= 1.3.5)", + "BiocNeighbors" ], - "Hash": "754516444a16b2616e35e9c8767d1110" + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "BiocStyle", + "BiocGenerics", + "SingleCellExperiment", + "scuttle", + "scrapper (>= 1.3.14)", + "scRNAseq", + "ggplot2", + "pheatmap", + "grDevices", + "gridExtra", + "viridis", + "celldex" + ], + "biocViews": "Software, SingleCell, GeneExpression, Transcriptomics, Classification, Clustering, Annotation", + "SystemRequirements": "C++17", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "URL": "https://github.com/SingleR-inc/SingleR", + "BugReports": "https://github.com/SingleR-inc/SingleR/issues", + "git_url": "https://git.bioconductor.org/packages/SingleR", + "git_branch": "RELEASE_3_22", + "git_last_commit": "39ca8d4", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Dvir Aran [aut, cph], Aaron Lun [ctb, cre], Daniel Bunis [ctb], Jared Andrews [ctb], Friederike Dündar [ctb]", + "Maintainer": "Aaron Lun " }, "SparseArray": { "Package": "SparseArray", - "Version": "1.4.0", + "Version": "1.10.8", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "IRanges", + "Title": "High-performance sparse data representation and manipulation in R", + "Description": "The SparseArray package provides array-like containers for efficient in-memory representation of multidimensional sparse data in R (arrays and matrices). The package defines the SparseArray virtual class and two concrete subclasses: COO_SparseArray and SVT_SparseArray. Each subclass uses its own internal representation of the nonzero multidimensional data: the \"COO layout\" and the \"SVT layout\", respectively. SVT_SparseArray objects mimic as much as possible the behavior of ordinary matrix and array objects in base R. In particular, they suppport most of the \"standard matrix and array API\" defined in base R and in the matrixStats package from CRAN.", + "biocViews": "Infrastructure, DataRepresentation", + "URL": "https://bioconductor.org/packages/SparseArray", + "BugReports": "https://github.com/Bioconductor/SparseArray/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\", comment=c(ORCID=\"0009-0002-8272-4522\")), person(\"Vince\", \"Carey\", role=\"fnd\", email=\"stvjc@channing.harvard.edu\", comment=c(ORCID=\"0000-0003-4046-0063\")), person(\"Rafael A.\", \"Irizarry\", role=\"fnd\", email=\"rafa@ds.harvard.edu\", comment=c(ORCID=\"0000-0002-3944-4309\")), person(\"Jacques\", \"Serizay\", role=\"ctb\", comment=c(ORCID=\"0000-0002-4295-0624\")))", + "Depends": [ + "R (>= 4.3.0)", + "methods", "Matrix", - "MatrixGenerics", - "R", - "S4Arrays", - "S4Vectors", - "XVector", + "BiocGenerics (>= 0.43.1)", + "MatrixGenerics (>= 1.11.1)", + "S4Vectors (>= 0.43.2)", + "S4Arrays (>= 1.10.1)" + ], + "Imports": [ + "utils", + "stats", "matrixStats", - "methods", - "stats" + "IRanges", + "XVector" + ], + "LinkingTo": [ + "S4Vectors", + "IRanges", + "XVector" ], - "Hash": "84697af365cd2a6367fa5d2c1086298c" + "Suggests": [ + "HDF5Array", + "ExperimentHub", + "testthat", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R options.R OPBufTree.R thread-control.R sparseMatrix-utils.R is_nonzero.R SparseArray-class.R COO_SparseArray-class.R SVT_SparseArray-class.R extract_sparse_array.R read_block_as_sparse.R SparseArray-dim-tuning.R SparseArray-aperm.R SparseArray-subsetting.R SparseArray-subassignment.R SparseArray-abind.R SparseArray-summarization.R SparseArray-Arith-methods.R SparseArray-Compare-methods.R SparseArray-Logic-methods.R SparseArray-Math-methods.R SparseArray-Complex-methods.R SparseArray-misc-methods.R SparseArray-matrixStats.R rowsum-methods.R SparseMatrix-mult.R randomSparseArray.R readSparseCSV.R is_nonna.R NaArray-class.R NaArray-aperm.R NaArray-subsetting.R NaArray-subassignment.R NaArray-abind.R NaArray-summarization.R NaArray-Arith-methods.R NaArray-Compare-methods.R NaArray-Logic-methods.R NaArray-Math-methods.R NaArray-misc-methods.R NaArray-matrixStats.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/SparseArray", + "git_branch": "RELEASE_3_22", + "git_last_commit": "c0de8d4", + "git_last_commit_date": "2025-12-15", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre] (ORCID: ), Vince Carey [fnd] (ORCID: ), Rafael A. Irizarry [fnd] (ORCID: ), Jacques Serizay [ctb] (ORCID: )", + "Maintainer": "Hervé Pagès " }, "SpatialExperiment": { "Package": "SpatialExperiment", - "Version": "1.14.0", + "Version": "1.20.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocFileCache", - "BiocGenerics", + "Title": "S4 Class for Spatially Resolved -omics Data", + "Description": "Defines an S4 class for storing data from spatial -omics experiments. The class extends SingleCellExperiment to support storage and retrieval of additional information from spot-based and molecule-based platforms, including spatial coordinates, images, and image metadata. A specialized constructor function is included for data from the 10x Genomics Visium platform.", + "Authors@R": "c( person(\"Dario\", \"Righelli\", role=c(\"aut\", \"cre\"), email=\"dario.righelli@gmail.com\", comment=c(ORCID=\"0000-0003-1504-3583\")), person(\"Davide\", \"Risso\", role=c(\"aut\"), email=\"risso.davide@gmail.com\", comment=c(ORCID=\"0000-0001-8508-5012\")), person(\"Helena L.\", \"Crowell\", role=c(\"aut\"), email=\"helena.crowell@cnag.eu\", comment=c(ORCID=\"0000-0002-4801-1767\")), person(\"Lukas M.\", \"Weber\", role=c(\"aut\"), email=\"lmweb012@gmail.com\", comment=c(ORCID=\"0000-0002-3282-1730\")), person(\"Nicholas J.\", \"Eagles\", role=c(\"ctb\"), email=\"nickeagles77@gmail.com\"))", + "URL": "https://github.com/drighelli/SpatialExperiment", + "BugReports": "https://github.com/drighelli/SpatialExperiment/issues", + "License": "GPL-3", + "Encoding": "UTF-8", + "biocViews": "DataRepresentation, DataImport, Infrastructure, ImmunoOncology, GeneExpression, Transcriptomics, SingleCell, Spatial", + "Depends": [ + "R (>= 4.1.0)", + "methods", + "SingleCellExperiment" + ], + "Imports": [ + "rjson", + "grDevices", + "magick", + "utils", "S4Vectors", - "SingleCellExperiment", "SummarizedExperiment", + "BiocGenerics", + "BiocFileCache" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "BiocStyle", + "BumpyMatrix", + "DropletUtils", + "VisiumIO" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.1", + "git_url": "https://git.bioconductor.org/packages/SpatialExperiment", + "git_branch": "RELEASE_3_22", + "git_last_commit": "dfdda19", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Dario Righelli [aut, cre] (ORCID: ), Davide Risso [aut] (ORCID: ), Helena L. Crowell [aut] (ORCID: ), Lukas M. Weber [aut] (ORCID: ), Nicholas J. Eagles [ctb]", + "Maintainer": "Dario Righelli " + }, + "SpotSweeper": { + "Package": "SpotSweeper", + "Version": "1.6.0", + "Source": "Bioconductor", + "Title": "Spatially-aware quality control for spatial transcriptomics", + "Date": "2025-10-14", + "Authors@R": "c( person(\"Michael\", \"Totty\", ,\"mictott@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-9292-8556\")), person(\"Stephanie\", \"Hicks\", ,email = \"shicks19@jhu.edu\", role = c(\"aut\"), comment = c(ORCID = \"0000-0002-7858-0231\")), person(\"Boyi\", \"Guo\", ,email = \"boyi.guo.work@gmail.com\", role = c(\"aut\"), comment = c(ORCID = \"0000-0003-2950-2349\")))", + "Description": "Spatially-aware quality control (QC) software for both spot-level and artifact-level QC in spot-based spatial transcripomics, such as 10x Visium. These methods calculate local (nearest-neighbors) mean and variance of standard QC metrics (library size, unique genes, and mitochondrial percentage) to identify outliers spot and large technical artifacts.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/MicTott/SpotSweeper", + "BugReports": "https://support.bioconductor.org/tag/SpotSweeper", + "biocViews": "Software, Spatial, Transcriptomics, QualityControl, GeneExpression,", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.1", + "Depends": [ + "R (>= 4.4.0)" + ], + "Imports": [ + "SpatialExperiment", + "SummarizedExperiment", + "BiocNeighbors", + "SingleCellExperiment", + "stats", + "escheR", + "MASS", + "ggplot2", + "spatialEco", "grDevices", - "magick", - "methods", - "rjson", - "utils" + "BiocParallel" ], - "Hash": "f27e097dbca623953cff5694733e2c39" + "Suggests": [ + "knitr", + "BiocStyle", + "rmarkdown", + "scuttle", + "STexampleData", + "ggpubr", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "VignetteBuilder": "knitr", + "LazyData": "False", + "News": "NEWS.md", + "git_url": "https://git.bioconductor.org/packages/SpotSweeper", + "git_branch": "RELEASE_3_22", + "git_last_commit": "2a9e4a7", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Michael Totty [aut, cre] (ORCID: ), Stephanie Hicks [aut] (ORCID: ), Boyi Guo [aut] (ORCID: )", + "Maintainer": "Michael Totty " }, "SummarizedExperiment": { "Package": "SummarizedExperiment", - "Version": "1.34.0", + "Version": "1.40.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Biobase", + "Title": "A container (S4 class) for matrix-like assays", + "Description": "The SummarizedExperiment container contains one or more assays, each represented by a matrix-like object of numeric or other mode. The rows typically represent genomic ranges of interest and the columns represent samples.", + "biocViews": "Genetics, Infrastructure, Sequencing, Annotation, Coverage, GenomeAnnotation", + "URL": "https://bioconductor.org/packages/SummarizedExperiment", + "BugReports": "https://github.com/Bioconductor/SummarizedExperiment/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Martin\", \"Morgan\", role=\"aut\"), person(\"Valerie\", \"Obenchain\", role=\"aut\"), person(\"Jim\", \"Hester\", role=\"aut\"), person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"))", + "Depends": [ + "R (>= 4.0.0)", + "methods", + "MatrixGenerics (>= 1.1.3)", + "GenomicRanges (>= 1.61.4)", + "Biobase" + ], + "Imports": [ + "utils", + "stats", + "tools", + "Matrix", + "BiocGenerics (>= 0.51.3)", + "S4Vectors (>= 0.33.7)", + "IRanges (>= 2.23.9)", + "Seqinfo", + "S4Arrays (>= 1.1.1)", + "DelayedArray (>= 0.31.12)" + ], + "Suggests": [ + "GenomeInfoDb (>= 1.45.5)", + "rhdf5", + "HDF5Array (>= 1.7.5)", + "annotate", + "AnnotationDbi", + "GenomicFeatures", + "SparseArray", + "SingleCellExperiment", + "TxDb.Hsapiens.UCSC.hg19.knownGene", + "hgu95av2.db", + "airway (>= 1.15.1)", + "BiocStyle", + "knitr", + "rmarkdown", + "RUnit", + "testthat", + "digest" + ], + "VignetteBuilder": "knitr", + "Collate": "Assays-class.R SummarizedExperiment-class.R RangedSummarizedExperiment-class.R intra-range-methods.R inter-range-methods.R coverage-methods.R combine-methods.R findOverlaps-methods.R nearest-methods.R makeSummarizedExperimentFromExpressionSet.R makeSummarizedExperimentFromDataFrame.R makeSummarizedExperimentFromLoom.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/SummarizedExperiment", + "git_branch": "RELEASE_3_22", + "git_last_commit": "469a2de", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Martin Morgan [aut], Valerie Obenchain [aut], Jim Hester [aut], Hervé Pagès [aut, cre]", + "Maintainer": "Hervé Pagès " + }, + "TENxIO": { + "Package": "TENxIO", + "Version": "1.12.1", + "Source": "Bioconductor", + "Type": "Package", + "Title": "Import methods for 10X Genomics files", + "Authors@R": "person( \"Marcel\", \"Ramos\", , \"marcel.ramos@sph.cuny.edu\", c(\"aut\", \"cre\"), c(ORCID = \"0000-0002-3242-0582\") )", + "Depends": [ + "R (>= 4.5.0)", + "SingleCellExperiment", + "SummarizedExperiment" + ], + "Imports": [ + "BiocBaseUtils", "BiocGenerics", - "DelayedArray", - "GenomeInfoDb", + "BiocIO", + "Seqinfo", "GenomicRanges", - "IRanges", + "HDF5Array", "Matrix", "MatrixGenerics", - "R", - "S4Arrays", - "S4Vectors", "methods", - "stats", - "tools", + "RCurl", + "readr", + "rhdf5", + "R.utils", + "S4Vectors", "utils" ], - "Hash": "2f6c8cc972ed6aee07c96e3dff729d15" + "Suggests": [ + "BiocStyle", + "DropletTestFiles", + "ExperimentHub", + "knitr", + "RaggedExperiment (>= 1.33.3)", + "rmarkdown", + "Rsamtools", + "tinytest" + ], + "Description": "Provides a structured S4 approach to importing data files from the 10X pipelines. It mainly supports Single Cell Multiome ATAC + Gene Expression data among other data types. The main Bioconductor data representations used are SingleCellExperiment and RaggedExperiment.", + "biocViews": "Software, Infrastructure, DataImport, SingleCell", + "VignetteBuilder": "knitr", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2", + "BugReports": "https://github.com/waldronlab/TENxIO/issues", + "URL": "https://github.com/waldronlab/TENxIO", + "Collate": "'TENxFile-class.R' 'TENxFileList-class.R' 'TENxFragments-class.R' 'TENxH5-class.R' 'TENxIO-package.R' 'TENxMTX-class.R' 'TENxPeaks-class.R' 'TENxTSV-class.R' 'utils.R'", + "Date": "2025-12-05", + "git_url": "https://git.bioconductor.org/packages/TENxIO", + "git_branch": "RELEASE_3_22", + "git_last_commit": "3c95124", + "git_last_commit_date": "2025-12-05", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Marcel Ramos [aut, cre] (ORCID: )", + "Maintainer": "Marcel Ramos " }, "UCSC.utils": { "Package": "UCSC.utils", - "Version": "1.0.0", + "Version": "1.6.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "S4Vectors", + "Title": "Low-level utilities to retrieve data from the UCSC Genome Browser", + "Description": "A set of low-level utilities to retrieve data from the UCSC Genome Browser. Most functions in the package access the data via the UCSC REST API but some of them query the UCSC MySQL server directly. Note that the primary purpose of the package is to support higher-level functionalities implemented in downstream packages like GenomeInfoDb or txdbmaker.", + "biocViews": "Infrastructure, GenomeAssembly, Annotation, GenomeAnnotation, DataImport", + "URL": "https://bioconductor.org/packages/UCSC.utils", + "BugReports": "https://github.com/Bioconductor/UCSC.utils/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\")", + "Imports": [ + "methods", + "stats", "httr", "jsonlite", - "methods", - "stats" + "S4Vectors (>= 0.47.6)" ], - "Hash": "83d45b690bffd09d1980c224ef329f5b" + "Suggests": [ + "DBI", + "RMariaDB", + "GenomeInfoDb", + "testthat", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "Collate": "00utils.R UCSC.api.url.R REST_API.R list_UCSC_genomes.R get_UCSC_chrom_sizes.R list_UCSC_tracks.R fetch_UCSC_track_data.R UCSC_dbselect.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/UCSC.utils", + "git_branch": "RELEASE_3_22", + "git_last_commit": "625d554", + "git_last_commit_date": "2025-12-08", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Hervé Pagès [aut, cre]", + "Maintainer": "Hervé Pagès " }, "V8": { "Package": "V8", - "Version": "4.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Rcpp", - "curl", - "jsonlite", + "Version": "8.0.1", + "Source": "Repository", + "Type": "Package", + "Title": "Embedded JavaScript and WebAssembly Engine for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"George\", \"Stagg\", role = \"ctb\", comment = c(ORCID = \"0009-0006-3173-9846\")), person(\"Jan Marvin\", \"Garbuszus\", role = \"ctb\"))", + "Description": "An R interface to V8 : Google's open source JavaScript and WebAssembly engine. This package can be compiled either with V8 or NodeJS when built as a shared library.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/V8", + "BugReports": "https://github.com/jeroen/v8/issues", + "SystemRequirements": "On Linux you can build against libv8-dev (Debian) or v8-devel (Fedora). We also provide static libv8 binaries for most platforms, see the README for details.", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "Imports": [ + "Rcpp (>= 0.12.12)", + "jsonlite (>= 1.0)", + "curl (>= 1.0)", "utils" ], - "Hash": "ca98390ad1cef2a5a609597b49d3d042" + "LinkingTo": [ + "Rcpp" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown" + ], + "RoxygenNote": "7.3.1", + "Language": "en-US", + "Encoding": "UTF-8", + "Biarch": "true", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), George Stagg [ctb] (ORCID: ), Jan Marvin Garbuszus [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "VisiumIO": { + "Package": "VisiumIO", + "Version": "1.6.3", + "Source": "Bioconductor", + "Title": "Import Visium data from the 10X Space Ranger pipeline", + "Authors@R": "c( person(\"Marcel\", \"Ramos\", , \"marcel.ramos@sph.cuny.edu\", c(\"aut\", \"cre\"), c(ORCID = \"0000-0002-3242-0582\") ), person(\"Estella YiXing\", \"Dong\", role = c(\"aut\", \"ctb\")), person(\"Dario\", \"Righelli\", role = c(\"aut\", \"ctb\")), person(\"Helena\", \"Crowell\", role = c(\"aut\", \"ctb\")) )", + "Description": "The package allows users to readily import spatial data obtained from either the 10X website or from the Space Ranger pipeline. Supported formats include tar.gz, h5, and mtx files. Multiple files can be imported at once with *List type of functions. The package represents data mainly as SpatialExperiment objects.", + "License": "Artistic-2.0", + "Depends": [ + "R (>= 4.5.0)", + "TENxIO" + ], + "Imports": [ + "BiocBaseUtils", + "BiocGenerics", + "BiocIO (>= 1.15.1)", + "jsonlite", + "methods", + "S4Vectors", + "SingleCellExperiment", + "SpatialExperiment", + "SummarizedExperiment" + ], + "Suggests": [ + "arrow", + "BiocStyle", + "data.table", + "knitr", + "readr", + "rmarkdown", + "sf", + "tinytest" + ], + "biocViews": "Software, Infrastructure, DataImport, SingleCell, Spatial", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.3", + "BugReports": "https://github.com/waldronlab/VisiumIO/issues", + "URL": "https://github.com/waldronlab/VisiumIO", + "Collate": "'TENxGeoJSON.R' 'TENxSpatialCSV.R' 'TENxSpatialList-class.R' 'TENxSpatialParquet.R' 'TENxVisium-class.R' 'TENxVisiumList-class.R' 'TENxVisiumHD-class.R' 'VisiumIO-package.R' 'utilities.R'", + "Date": "2025-11-21", + "git_url": "https://git.bioconductor.org/packages/VisiumIO", + "git_branch": "RELEASE_3_22", + "git_last_commit": "1a42895", + "git_last_commit_date": "2025-11-21", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Marcel Ramos [aut, cre] (ORCID: ), Estella YiXing Dong [aut, ctb], Dario Righelli [aut, ctb], Helena Crowell [aut, ctb]", + "Maintainer": "Marcel Ramos " }, "XML": { "Package": "XML", - "Version": "3.99-0.16.1", + "Version": "3.99-0.22", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Authors@R": "c(person(\"CRAN Team\", role = \"ctb\", email = \"CRAN@r-project.org\", comment = \"de facto maintainer in 2013-2026\"), person(\"Duncan\", \"Temple Lang\", role = \"aut\", email = \"duncan@r-project.org\", comment = c(ORCID = \"0000-0003-0159-1546\")), person(\"Tomas\", \"Kalibera\", role = \"ctb\"), person(\"Ivan\", \"Krylov\", email = \"ikrylov@disroot.org\", role = \"cre\"))", + "Title": "Tools for Parsing and Generating XML Within R and S-Plus", + "Depends": [ + "R (>= 4.0.0)", "methods", "utils" ], - "Hash": "da3098169c887914551b607c66fe2a28" + "Suggests": [ + "bitops", + "RCurl" + ], + "SystemRequirements": "libxml2 (>= 2.6.3)", + "Description": "Many approaches for both reading and creating XML (and HTML) documents (including DTDs), both local and accessible via HTTP or FTP. Also offers access to an 'XPath' \"interpreter\".", + "BugReports": "https://codeberg.org/aitap/XML/issues", + "License": "BSD_3_clause + file LICENSE", + "Collate": "AAA.R DTD.R DTDClasses.R DTDRef.R SAXMethods.R XMLClasses.R applyDOM.R assignChild.R catalog.R createNode.R dynSupports.R error.R flatTree.R nodeAccessors.R parseDTD.R schema.R summary.R tangle.R toString.R tree.R version.R xmlErrorEnums.R xmlEventHandler.R xmlEventParse.R xmlHandler.R xmlInternalSource.R xmlOutputDOM.R xmlNodes.R xmlOutputBuffer.R xmlTree.R xmlTreeParse.R htmlParse.R hashTree.R zzz.R supports.R parser.R libxmlFeatures.R xmlString.R saveXML.R namespaces.R readHTMLTable.R reflection.R xmlToDataFrame.R bitList.R compare.R encoding.R fixNS.R xmlRoot.R serialize.R xmlMemoryMgmt.R keyValueDB.R solrDocs.R XMLRErrorInfo.R xincludes.R namespaceHandlers.R tangle1.R htmlLinks.R htmlLists.R getDependencies.R getRelativeURL.R xmlIncludes.R simplifyPath.R", + "NeedsCompilation": "yes", + "Author": "CRAN Team [ctb] (de facto maintainer in 2013-2026), Duncan Temple Lang [aut] (ORCID: ), Tomas Kalibera [ctb], Ivan Krylov [cre]", + "Maintainer": "Ivan Krylov ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "XVector": { "Package": "XVector", - "Version": "0.44.0", + "Version": "0.50.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "IRanges", - "R", - "S4Vectors", + "Title": "Foundation of external vector representation and manipulation in Bioconductor", + "Description": "Provides memory efficient S4 classes for storing sequences \"externally\" (e.g. behind an R external pointer, or on disk).", + "biocViews": "Infrastructure, DataRepresentation", + "URL": "https://bioconductor.org/packages/XVector", + "BugReports": "https://github.com/Bioconductor/XVector/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Author": "Hervé Pagès and Patrick Aboyoun", + "Maintainer": "Hervé Pagès ", + "Depends": [ + "R (>= 4.0.0)", + "methods", + "BiocGenerics (>= 0.37.0)", + "S4Vectors (>= 0.27.12)", + "IRanges (>= 2.43.8)" + ], + "Imports": [ "methods", - "tools", "utils", - "zlibbioc" + "stats", + "tools", + "BiocGenerics", + "S4Vectors", + "IRanges" + ], + "LinkingTo": [ + "S4Vectors", + "IRanges" + ], + "Suggests": [ + "Biostrings", + "drosophila2probe", + "RUnit" ], - "Hash": "4245b9938ac74c0dbddbebbec6036ab4" + "Collate": "io-utils.R RDS-random-access.R SharedVector-class.R SharedRaw-class.R SharedInteger-class.R SharedDouble-class.R XVector-class.R XRaw-class.R XInteger-class.R XDouble-class.R XVectorList-class.R XRawList-class.R XRawList-comparison.R XIntegerViews-class.R XDoubleViews-class.R OnDiskRaw-class.R RdaCollection-class.R RdsCollection-class.R intra-range-methods.R compact-methods.R reverse-methods.R slice-methods.R view-summarization-methods.R updateObject-methods.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/XVector", + "git_branch": "RELEASE_3_22", + "git_last_commit": "6b7e2a1", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes" }, "abind": { "Package": "abind", - "Version": "1.4-5", + "Version": "1.4-8", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Date": "2024-09-08", + "Title": "Combine Multidimensional Arrays", + "Authors@R": "c(person(\"Tony\", \"Plate\", email = \"tplate@acm.org\", role = c(\"aut\", \"cre\")), person(\"Richard\", \"Heiberger\", role = c(\"aut\")))", + "Maintainer": "Tony Plate ", + "Description": "Combine multidimensional arrays into a single array. This is a generalization of 'cbind' and 'rbind'. Works with vectors, matrices, and higher-dimensional arrays (aka tensors). Also provides functions 'adrop', 'asub', and 'afill' for manipulating, extracting and replacing data in arrays.", + "Depends": [ + "R (>= 1.5.0)" + ], + "Imports": [ "methods", "utils" ], - "Hash": "4f57884290cc75ab22f4af9e9d4ca862" + "License": "MIT + file LICENSE", + "NeedsCompilation": "no", + "Author": "Tony Plate [aut, cre], Richard Heiberger [aut]", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "affy": { "Package": "affy", - "Version": "1.82.0", + "Version": "1.88.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Biobase", - "BiocGenerics", + "Title": "Methods for Affymetrix Oligonucleotide Arrays", + "Author": "Rafael A. Irizarry , Laurent Gautier , Benjamin Milo Bolstad , and Crispin Miller with contributions from Magnus Astrand , Leslie M. Cope , Robert Gentleman, Jeff Gentry, Conrad Halling , Wolfgang Huber, James MacDonald , Benjamin I. P. Rubinstein, Christopher Workman , John Zhang", + "Maintainer": "Robert D. Shear ", + "URL": "https://bioconductor.org/packages/affy", + "BugReports": "https://github.com/rafalab/affy/issues", + "Depends": [ + "R (>= 2.8.0)", + "BiocGenerics (>= 0.1.12)", + "Biobase (>= 2.5.5)" + ], + "Imports": [ + "affyio (>= 1.13.3)", "BiocManager", - "R", - "affyio", - "grDevices", "graphics", + "grDevices", "methods", "preprocessCore", "stats", - "utils", - "zlibbioc" + "utils" ], - "Hash": "de30a31c7d837db23467d5cbfcf88de0" + "Suggests": [ + "tkWidgets (>= 1.19.0)", + "affydata", + "widgetTools", + "hgu95av2cdf" + ], + "LinkingTo": [ + "preprocessCore" + ], + "Description": "The package contains functions for exploratory oligonucleotide array analysis. The dependence on tkWidgets only concerns few convenience functions. 'affy' is fully functional without it.", + "License": "LGPL (>= 2.0)", + "Collate": "ProgressBarText.R ppset.ttest.R ppsetApply.R expressoWidget.R getCDFenv.R AffyRNAdeg.R avdiff.R barplot.ProbeSet.R bg.Affy.chipwide.R bg.R expresso.R fit.li.wong.R generateExprVal.method.avgdiff.R generateExprVal.method.liwong.R generateExprVal.method.mas.R generateExprVal.method.medianpolish.R generateExprVal.method.playerout.R hlog.R justrma.R loess.normalize.R maffy.R mas5.R merge.AffyBatch.R normalize.constant.R normalize.contrasts.R normalize.invariantset.R normalize.loess.R normalize.qspline.R normalize.quantiles.R pairs.AffyBatch.R plot.density.R plotLocation.R plot.ProbeSet.R pmcorrect.mas.R AffyBatch.R mva.pairs.R ProbeSet.R read.affybatch.R rma.R summary.R tukey.biweight.R whatcdf.R xy2indices.R zzz.R", + "biocViews": "Microarray, OneChannel, Preprocessing", + "LazyLoad": "yes", + "git_url": "https://git.bioconductor.org/packages/affy", + "git_branch": "RELEASE_3_22", + "git_last_commit": "229aef4", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes" }, "affyio": { "Package": "affyio", - "Version": "1.74.0", + "Version": "1.80.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", - "methods", - "zlibbioc" + "Title": "Tools for parsing Affymetrix data files", + "Author": "Ben Bolstad ", + "Maintainer": "Ben Bolstad ", + "Depends": [ + "R (>= 2.6.0)" + ], + "Imports": [ + "methods" ], - "Hash": "88e77a7f8571a173db7d4f6d9bf46a64" + "Description": "Routines for parsing Affymetrix data files based upon file format information. Primary focus is on accessing the CEL and CDF file formats.", + "License": "LGPL (>= 2)", + "URL": "https://github.com/bmbolstad/affyio", + "biocViews": "Microarray, DataImport, Infrastructure", + "LazyLoad": "yes", + "git_url": "https://git.bioconductor.org/packages/affyio", + "git_branch": "RELEASE_3_22", + "git_last_commit": "eb747bb", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes" }, "alabaster.base": { "Package": "alabaster.base", - "Version": "1.4.0", + "Version": "1.10.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Rcpp", - "Rhdf5lib", - "S4Vectors", + "Title": "Save Bioconductor Objects to File", + "Date": "2025-07-25", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "License": "MIT + file LICENSE", + "Description": "Save Bioconductor data structures into file artifacts, and load them back into memory. This is a more robust and portable alternative to serialization of such objects into RDS files. Each artifact is associated with metadata for further interpretation; downstream applications can enrich this metadata with context-specific properties.", + "Imports": [ "alabaster.schemas", + "methods", + "utils", + "S4Vectors", + "rhdf5 (>= 2.47.6)", "jsonlite", "jsonvalidate", - "methods", - "rhdf5", - "utils" + "Rcpp" + ], + "Suggests": [ + "BiocStyle", + "rmarkdown", + "knitr", + "testthat", + "digest", + "Matrix", + "alabaster.matrix" ], - "Hash": "dff0dcd23d2ca7ce1d90e513cb6a6c63" + "LinkingTo": [ + "Rcpp", + "assorthead (>= 1.1.2)", + "Rhdf5lib" + ], + "VignetteBuilder": "knitr", + "SystemRequirements": "C++17, GNU make", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "biocViews": "DataRepresentation, DataImport", + "URL": "https://github.com/ArtifactDB/alabaster.base", + "BugReports": "https://github.com/ArtifactDB/alabaster.base/issues", + "git_url": "https://git.bioconductor.org/packages/alabaster.base", + "git_branch": "RELEASE_3_22", + "git_last_commit": "6b49bcc", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Aaron Lun [aut, cre]", + "Maintainer": "Aaron Lun " }, "alabaster.matrix": { "Package": "alabaster.matrix", - "Version": "1.4.0", + "Version": "1.10.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Title": "Load and Save Artifacts from File", + "Date": "2025-03-04", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "License": "MIT + file LICENSE", + "Description": "Save matrices, arrays and similar objects into file artifacts, and load them back into memory. This is a more portable alternative to serialization of such objects into RDS files. Each artifact is associated with metadata for further interpretation; downstream applications can enrich this metadata with context-specific properties.", + "Depends": [ + "alabaster.base" + ], + "Imports": [ + "methods", "BiocGenerics", - "DelayedArray", + "S4Vectors", + "DelayedArray (>= 0.33.3)", + "S4Arrays", + "SparseArray (>= 1.5.22)", + "rhdf5 (>= 2.47.1)", "HDF5Array", "Matrix", - "Rcpp", - "S4Arrays", - "S4Vectors", - "SparseArray", - "alabaster.base", - "methods", - "rhdf5" + "Rcpp" + ], + "Suggests": [ + "testthat", + "knitr", + "BiocStyle", + "chihaya", + "BiocSingular", + "ResidualMatrix" ], - "Hash": "22b09ff731438f649f7a6bfe25dccde1" + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "biocViews": "DataImport, DataRepresentation", + "git_url": "https://git.bioconductor.org/packages/alabaster.matrix", + "git_branch": "RELEASE_3_22", + "git_last_commit": "8892772", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Aaron Lun [aut, cre]", + "Maintainer": "Aaron Lun " }, "alabaster.ranges": { "Package": "alabaster.ranges", - "Version": "1.4.0", + "Version": "1.10.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "GenomeInfoDb", + "Title": "Load and Save Ranges-related Artifacts from File", + "Date": "2025-07-22", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "License": "MIT + file LICENSE", + "Description": "Save GenomicRanges, IRanges and related data structures into file artifacts, and load them back into memory. This is a more portable alternative to serialization of such objects into RDS files. Each artifact is associated with metadata for further interpretation; downstream applications can enrich this metadata with context-specific properties.", + "Depends": [ "GenomicRanges", - "IRanges", - "S4Vectors", - "alabaster.base", + "alabaster.base" + ], + "Imports": [ "methods", + "S4Vectors", + "BiocGenerics", + "IRanges", + "Seqinfo", "rhdf5" ], - "Hash": "74b3fe9e2e18d0f10e25af0278f5452a" + "Suggests": [ + "testthat", + "knitr", + "BiocStyle", + "jsonlite" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.2.3", + "biocViews": "DataImport, DataRepresentation", + "git_url": "https://git.bioconductor.org/packages/alabaster.ranges", + "git_branch": "RELEASE_3_22", + "git_last_commit": "e35375b", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [aut, cre]", + "Maintainer": "Aaron Lun " }, "alabaster.sce": { "Package": "alabaster.sce", - "Version": "1.4.0", + "Version": "1.10.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Title": "Load and Save SingleCellExperiment from File", + "Date": "2024-10-16", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "License": "MIT + file LICENSE", + "Description": "Save SingleCellExperiment into file artifacts, and load them back into memory. This is a more portable alternative to serialization of such objects into RDS files. Each artifact is associated with metadata for further interpretation; downstream applications can enrich this metadata with context-specific properties.", + "Depends": [ "SingleCellExperiment", - "alabaster.base", + "alabaster.base" + ], + "Imports": [ + "methods", "alabaster.se", - "jsonlite", - "methods" + "jsonlite" ], - "Hash": "fa41c555dd420c8f19cfddeb74da75b3" + "Suggests": [ + "knitr", + "testthat", + "BiocStyle", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.2.3", + "biocViews": "DataImport, DataRepresentation", + "git_url": "https://git.bioconductor.org/packages/alabaster.sce", + "git_branch": "RELEASE_3_22", + "git_last_commit": "a6eed09", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [aut, cre]", + "Maintainer": "Aaron Lun " }, "alabaster.schemas": { "Package": "alabaster.schemas", - "Version": "1.4.0", + "Version": "1.10.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Hash": "e58b4124478c9f912c7c4a21d9adca6c" + "Title": "Schemas for the Alabaster Framework", + "Date": "2023-11-09", + "License": "MIT + file LICENSE", + "Description": "Stores all schemas required by various alabaster.* packages. No computation should be performed by this package, as that is handled by alabaster.base. We use a separate package instead of storing the schemas in alabaster.base itself, to avoid conflating management of the schemas with code maintenence.", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"cre\", \"aut\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "RoxygenNote": "7.2.3", + "biocViews": "DataRepresentation, DataImport", + "Suggests": [ + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "git_url": "https://git.bioconductor.org/packages/alabaster.schemas", + "git_branch": "RELEASE_3_22", + "git_last_commit": "f89d374", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [cre, aut]", + "Maintainer": "Aaron Lun " }, "alabaster.se": { "Package": "alabaster.se", - "Version": "1.4.0", + "Version": "1.10.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "GenomicRanges", - "IRanges", - "S4Vectors", + "Title": "Load and Save SummarizedExperiments from File", + "Date": "2024-10-16", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "License": "MIT + file LICENSE", + "Description": "Save SummarizedExperiments into file artifacts, and load them back into memory. This is a more portable alternative to serialization of such objects into RDS files. Each artifact is associated with metadata for further interpretation; downstream applications can enrich this metadata with context-specific properties.", + "Depends": [ "SummarizedExperiment", - "alabaster.base", - "alabaster.matrix", + "alabaster.base" + ], + "Imports": [ + "methods", "alabaster.ranges", - "jsonlite", - "methods" + "alabaster.matrix", + "BiocGenerics", + "S4Vectors", + "IRanges", + "GenomicRanges", + "jsonlite" ], - "Hash": "507cafb86c69a5f04a5ad0eb7f05fcf1" + "Suggests": [ + "rmarkdown", + "knitr", + "testthat", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.1", + "biocViews": "DataImport, DataRepresentation", + "git_url": "https://git.bioconductor.org/packages/alabaster.se", + "git_branch": "RELEASE_3_22", + "git_last_commit": "9f5dc20", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [aut, cre]", + "Maintainer": "Aaron Lun " }, "alevinQC": { "Package": "alevinQC", - "Version": "1.20.0", + "Version": "1.26.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "DT", + "Type": "Package", + "Title": "Generate QC Reports For Alevin Output", + "Date": "2025-07-17", + "Authors@R": "c(person(\"Charlotte\", \"Soneson\", role = c(\"aut\", \"cre\"), email = \"charlottesoneson@gmail.com\", comment = c(ORCID = \"0000-0003-3833-2169\")), person(\"Avi\", \"Srivastava\", role = \"aut\"), person(\"Rob\", \"Patro\", role = \"aut\"), person(\"Dongze\", \"He\", role = \"aut\"))", + "Description": "Generate QC reports summarizing the output from an alevin, alevin-fry, or simpleaf run. Reports can be generated as html or pdf files, or as shiny applications.", + "Encoding": "UTF-8", + "SystemRequirements": "C++11", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "rmarkdown (>= 2.5)", + "tools", + "methods", + "ggplot2 (>= 3.4.0)", "GGally", - "R", - "Rcpp", - "cowplot", "dplyr", - "ggplot2", - "methods", "rjson", - "rlang", - "rmarkdown", "shiny", "shinydashboard", + "DT", "stats", - "tools", - "tximport", - "utils" + "utils", + "tximport (>= 1.17.4)", + "cowplot", + "rlang", + "Rcpp" ], - "Hash": "6eeae7ae41bf79ffb8137fdd0360b9cf" + "RoxygenNote": "7.3.2", + "Suggests": [ + "knitr", + "BiocStyle", + "testthat (>= 3.0.0)", + "BiocManager" + ], + "VignetteBuilder": "knitr", + "biocViews": "QualityControl, SingleCell", + "URL": "https://github.com/csoneson/alevinQC", + "BugReports": "https://github.com/csoneson/alevinQC/issues", + "License": "MIT + file LICENSE", + "Config/testthat/edition": "3", + "LinkingTo": [ + "Rcpp" + ], + "git_url": "https://git.bioconductor.org/packages/alevinQC", + "git_branch": "RELEASE_3_22", + "git_last_commit": "e9f801e", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Charlotte Soneson [aut, cre] (ORCID: ), Avi Srivastava [aut], Rob Patro [aut], Dongze He [aut]", + "Maintainer": "Charlotte Soneson " }, "annotate": { "Package": "annotate", - "Version": "1.82.0", + "Version": "1.88.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationDbi", + "Title": "Annotation for microarrays", + "Author": "R. Gentleman", + "Authors@R": "c( person(\"Jeff\", \"Gentry\", role = \"aut\"), person(\"Kritika\", \"Verma\", role = \"ctb\", comment = \"Converted chromLOC vignette from Sweave to RMarkdown / HTML.\"), person(\"Manvi\", \"Yaduvanshi\", role = \"ctb\", comment = \"Converted useDataPkgs vignette from Sweave to RMarkdown / HTML.\"), person(\"Bioconductor Package Maintainer\", email = \"maintainer@bioconductor.org\", role = \"cre\"))", + "Description": "Using R enviroments for annotation.", + "Depends": [ + "R (>= 2.10)", + "AnnotationDbi (>= 1.27.5)", + "XML" + ], + "Imports": [ "Biobase", - "BiocGenerics", "DBI", - "R", - "XML", + "xtable", "graphics", - "httr", - "methods", - "stats", "utils", - "xtable" + "stats", + "methods", + "BiocGenerics (>= 0.13.8)", + "httr" ], - "Hash": "659c0a3bfad51dc798e4b4eb0f2cdedc" + "Suggests": [ + "hgu95av2.db", + "genefilter", + "Biostrings (>= 2.25.10)", + "IRanges", + "rae230a.db", + "rae230aprobe", + "tkWidgets", + "GO.db", + "org.Hs.eg.db", + "org.Mm.eg.db", + "humanCHRLOC", + "Rgraphviz", + "RUnit", + "BiocStyle", + "knitr" + ], + "VignetteBuilder": "knitr", + "License": "Artistic-2.0", + "LazyLoad": "yes", + "Collate": "AllGenerics.R ACCNUMStats.R Amat.R AnnMaps.R chromLocation.R compatipleVersions.R findNeighbors.R getData.R getPMInfo.R getSeq4ACC.R GOhelpers.R homoData.R html.R isValidKey.R LL2homology.R pmid2MIAME.R pubMedAbst.R query.R readGEOAnn.R serializeEnv.R blastSequences.R zzz.R test_annotate_package.R", + "biocViews": "Annotation, Pathways, GO", + "git_url": "https://git.bioconductor.org/packages/annotate", + "git_branch": "RELEASE_3_22", + "git_last_commit": "bc0d5a0", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Maintainer": "Bioconductor Package Maintainer " }, "ape": { "Package": "ape", - "Version": "5.8", + "Version": "5.8-1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", - "digest", - "graphics", + "Date": "2024-12-10", + "Title": "Analyses of Phylogenetics and Evolution", + "Authors@R": "c(person(\"Emmanuel\", \"Paradis\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Emmanuel.Paradis@ird.fr\", comment = c(ORCID = \"0000-0003-3092-2199\")), person(\"Simon\", \"Blomberg\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0003-1062-0839\")), person(\"Ben\", \"Bolker\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-2127-0443\")), person(\"Joseph\", \"Brown\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-3835-8062\")), person(\"Santiago\", \"Claramunt\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-8926-5974\")), person(\"Julien\", \"Claude\", role = c(\"aut\", \"cph\"), , comment = c(ORCID = \"0000-0002-9267-1228\")), person(\"Hoa Sien\", \"Cuong\", role = c(\"aut\", \"cph\")), person(\"Richard\", \"Desper\", role = c(\"aut\", \"cph\")), person(\"Gilles\", \"Didier\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0003-0596-9112\")), person(\"Benoit\", \"Durand\", role = c(\"aut\", \"cph\")), person(\"Julien\", \"Dutheil\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0001-7753-4121\")), person(\"RJ\", \"Ewing\", role = c(\"aut\", \"cph\")), person(\"Olivier\", \"Gascuel\", role = c(\"aut\", \"cph\")), person(\"Thomas\", \"Guillerme\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0003-4325-1275\")), person(\"Christoph\", \"Heibl\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-7655-3299\")), person(\"Anthony\", \"Ives\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0001-9375-9523\")), person(\"Bradley\", \"Jones\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0003-4498-1069\")), person(\"Franz\", \"Krah\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0001-7866-7508\")), person(\"Daniel\", \"Lawson\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-5311-6213\")), person(\"Vincent\", \"Lefort\", role = c(\"aut\", \"cph\")), person(\"Pierre\", \"Legendre\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-3838-3305\")), person(\"Jim\", \"Lemon\", role = c(\"aut\", \"cph\")), person(\"Guillaume\", \"Louvel\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-7745-0785\")), person(\"Federico\", \"Marotta\", role = c(\"aut\", \"cph\")), person(\"Eric\", \"Marcon\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-5249-321X\")), person(\"Rosemary\", \"McCloskey\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0002-9772-8553\")), person(\"Johan\", \"Nylander\", role = c(\"aut\", \"cph\")), person(\"Rainer\", \"Opgen-Rhein\", role = c(\"aut\", \"cph\")), person(\"Andrei-Alin\", \"Popescu\", role = c(\"aut\", \"cph\")), person(\"Manuela\", \"Royer-Carenzi\", role = c(\"aut\", \"cph\")), person(\"Klaus\", \"Schliep\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0003-2941-0161\")), person(\"Korbinian\", \"Strimmer\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0001-7917-2056\")), person(\"Damien\", \"de Vienne\", role = c(\"aut\", \"cph\"), comment = c(ORCID = \"0000-0001-9532-5251\")))", + "Depends": [ + "R (>= 3.2.0)" + ], + "Suggests": [ + "gee", + "expm", + "igraph", + "phangorn", + "xml2" + ], + "Imports": [ + "nlme", "lattice", + "graphics", "methods", - "nlme", - "parallel", "stats", - "utils" + "utils", + "parallel", + "Rcpp (>= 0.12.0)", + "digest" + ], + "LinkingTo": [ + "Rcpp" ], - "Hash": "16b5ff4dff0ead9ea955f62f794b1535" + "ZipData": "no", + "Description": "Functions for reading, writing, plotting, and manipulating phylogenetic trees, analyses of comparative data in a phylogenetic framework, ancestral character analyses, analyses of diversification and macroevolution, computing distances from DNA sequences, reading and writing nucleotide sequences as well as importing from BioConductor, and several tools such as Mantel's test, generalized skyline plots, graphical exploration of phylogenetic data (alex, trex, kronoviz), estimation of absolute evolutionary rates and clock-like trees using mean path lengths and penalized likelihood, dating trees with non-contemporaneous sequences, translating DNA into AA sequences, and assessing sequence alignments. Phylogeny estimation can be done with the NJ, BIONJ, ME, MVR, SDM, and triangle methods, and several methods handling incomplete distance matrices (NJ*, BIONJ*, MVR*, and the corresponding triangle method). Some functions call external applications (PhyML, Clustal, T-Coffee, Muscle) whose results are returned into R.", + "License": "GPL-2 | GPL-3", + "URL": "https://github.com/emmanuelparadis/ape", + "BugReports": "https://github.com/emmanuelparadis/ape/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Emmanuel Paradis [aut, cre, cph] (), Simon Blomberg [aut, cph] (), Ben Bolker [aut, cph] (), Joseph Brown [aut, cph] (), Santiago Claramunt [aut, cph] (), Julien Claude [aut, cph] (), Hoa Sien Cuong [aut, cph], Richard Desper [aut, cph], Gilles Didier [aut, cph] (), Benoit Durand [aut, cph], Julien Dutheil [aut, cph] (), RJ Ewing [aut, cph], Olivier Gascuel [aut, cph], Thomas Guillerme [aut, cph] (), Christoph Heibl [aut, cph] (), Anthony Ives [aut, cph] (), Bradley Jones [aut, cph] (), Franz Krah [aut, cph] (), Daniel Lawson [aut, cph] (), Vincent Lefort [aut, cph], Pierre Legendre [aut, cph] (), Jim Lemon [aut, cph], Guillaume Louvel [aut, cph] (), Federico Marotta [aut, cph], Eric Marcon [aut, cph] (), Rosemary McCloskey [aut, cph] (), Johan Nylander [aut, cph], Rainer Opgen-Rhein [aut, cph], Andrei-Alin Popescu [aut, cph], Manuela Royer-Carenzi [aut, cph], Klaus Schliep [aut, cph] (), Korbinian Strimmer [aut, cph] (), Damien de Vienne [aut, cph] ()", + "Maintainer": "Emmanuel Paradis ", + "Repository": "CRAN" }, "apeglm": { "Package": "apeglm", - "Version": "1.26.0", + "Version": "1.32.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "GenomicRanges", - "Rcpp", - "RcppEigen", - "RcppNumerical", - "SummarizedExperiment", + "Title": "Approximate posterior estimation for GLM coefficients", + "Authors@R": "c( person(\"Anqi\", \"Zhu\", email = \"anqizhu@live.unc.edu\", role = c(\"aut\",\"cre\")), person(\"Joshua\", \"Zitovsky\", role = \"ctb\"), person(\"Joseph\", \"Ibrahim\", role = \"aut\"), person(\"Michael\", \"Love\", role = \"aut\"))", + "Maintainer": "Anqi Zhu ", + "Description": "apeglm provides Bayesian shrinkage estimators for effect sizes for a variety of GLM models, using approximation of the posterior for individual coefficients.", + "VignetteBuilder": "knitr, rmarkdown", + "Imports": [ "emdbook", + "SummarizedExperiment", + "GenomicRanges", "methods", "stats", - "utils" + "utils", + "Rcpp" + ], + "Suggests": [ + "DESeq2", + "airway", + "knitr", + "rmarkdown", + "testthat" ], - "Hash": "db0445903cb0274f9b99abc410768df1" + "LinkingTo": [ + "Rcpp", + "RcppEigen", + "RcppNumerical" + ], + "License": "GPL-2", + "Encoding": "UTF-8", + "biocViews": "ImmunoOncology, Sequencing, RNASeq, DifferentialExpression, GeneExpression, Bayesian", + "RoxygenNote": "7.1.1", + "git_url": "https://git.bioconductor.org/packages/apeglm", + "git_branch": "RELEASE_3_22", + "git_last_commit": "8940580", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Anqi Zhu [aut, cre], Joshua Zitovsky [ctb], Joseph Ibrahim [aut], Michael Love [aut]" }, "aplot": { "Package": "aplot", - "Version": "0.2.2", + "Version": "0.2.9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "ggfun", + "Title": "Decorate a 'ggplot' with Associated Information", + "Authors@R": "c( person(given = \"Guangchuang\", family = \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(\"Shuangbin\", \"Xu\", email = \"xshuangbin@163.com\", role = \"ctb\", comment = c(ORCID=\"0000-0003-3513-5362\")), person(given = \"Thomas\", family = \"Hackl\", email = \"thackl@mit.edu\", role = \"ctb\") )", + "Description": "For many times, we are not just aligning plots as what 'cowplot' and 'patchwork' did. Users would like to align associated information that requires axes to be exactly matched in subplots, e.g. hierarchical clustering with a heatmap. Inspired by the 'Method 2' in 'ggtree' (G Yu (2018) ), 'aplot' provides utilities to aligns associated subplots to a main plot at different sides (left, right, top and bottom) with axes exactly matched.", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "ggfun (>= 0.1.3)", "ggplot2", "ggplotify", + "patchwork", "magrittr", "methods", - "patchwork", - "utils" + "utils", + "yulab.utils (>= 0.1.9)", + "pillar" ], - "Hash": "869a35e6d38fe9936eb578e09091842b" + "Suggests": [ + "ggtree" + ], + "URL": "https://github.com/YuLab-SMU/aplot, https://yulab-smu.top/aplot/", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre] (ORCID: ), Shuangbin Xu [ctb] (ORCID: ), Thomas Hackl [ctb]", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" }, "ashr": { "Package": "ashr", "Version": "2.2-63", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Encoding": "UTF-8", + "Type": "Package", + "Maintainer": "Peter Carbonetto ", + "Authors@R": "c(person(\"Matthew\",\"Stephens\",role=\"aut\", email=\"mstephens@uchicago.edu\"), person(\"Peter\",\"Carbonetto\",role=c(\"aut\",\"cre\"), email=\"pcarbo@uchicago.edu\"), person(\"Chaoxing\",\"Dai\",role=\"ctb\"), person(\"David\",\"Gerard\",role=\"aut\"), person(\"Mengyin\",\"Lu\",role=\"aut\"), person(\"Lei\",\"Sun\",role=\"aut\"), person(\"Jason\",\"Willwerscheid\",role=\"aut\"), person(\"Nan\",\"Xiao\",role=\"aut\"), person(\"Mazon\",\"Zeng\",role=\"ctb\"))", + "Date": "2023-08-21", + "Title": "Methods for Adaptive Shrinkage, using Empirical Bayes", + "Description": "The R package 'ashr' implements an Empirical Bayes approach for large-scale hypothesis testing and false discovery rate (FDR) estimation based on the methods proposed in M. Stephens, 2016, \"False discovery rates: a new deal\", . These methods can be applied whenever two sets of summary statistics---estimated effects and standard errors---are available, just as 'qvalue' can be applied to previously computed p-values. Two main interfaces are provided: ash(), which is more user-friendly; and ash.workhorse(), which has more options and is geared toward advanced users. The ash() and ash.workhorse() also provides a flexible modeling interface that can accommodate a variety of likelihoods (e.g., normal, Poisson) and mixture priors (e.g., uniform, normal).", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ "Matrix", - "R", - "Rcpp", - "SQUAREM", - "etrunct", + "stats", "graphics", - "invgamma", + "Rcpp (>= 0.10.5)", + "truncnorm", "mixsqp", - "stats", - "truncnorm" + "SQUAREM", + "etrunct", + "invgamma" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "ggplot2", + "REBayes" + ], + "LinkingTo": [ + "Rcpp" ], - "Hash": "d5b252e570ccffbc8fec77827c585635" + "License": "GPL (>= 3)", + "NeedsCompilation": "yes", + "URL": "https://github.com/stephens999/ashr", + "BugReports": "https://github.com/stephens999/ashr/issues", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.1.2", + "Author": "Matthew Stephens [aut], Peter Carbonetto [aut, cre], Chaoxing Dai [ctb], David Gerard [aut], Mengyin Lu [aut], Lei Sun [aut], Jason Willwerscheid [aut], Nan Xiao [aut], Mazon Zeng [ctb]", + "Repository": "CRAN" }, "askpass": { "Package": "askpass", - "Version": "1.2.0", + "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "sys" + "Type": "Package", + "Title": "Password Entry Utilities for R, Git, and SSH", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Cross-platform utilities for prompting the user for credentials or a passphrase, for example to authenticate with a server or read a protected key. Includes native programs for MacOS and Windows, hence no 'tcltk' is required. Password entry can be invoked in two different ways: directly from R via the askpass() function, or indirectly as password-entry back-end for 'ssh-agent' or 'git-credential' via the SSH_ASKPASS and GIT_ASKPASS environment variables. Thereby the user can be prompted for credentials or a passphrase if needed when R calls out to git or ssh.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.r-universe.dev/askpass", + "BugReports": "https://github.com/r-lib/askpass/issues", + "Encoding": "UTF-8", + "Imports": [ + "sys (>= 2.1)" + ], + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "assertthat": { + "Package": "assertthat", + "Version": "0.2.1", + "Source": "Repository", + "Title": "Easy Pre and Post Assertions", + "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", c(\"aut\", \"cre\"))", + "Description": "An extension to stopifnot() that makes it easy to declare the pre and post conditions that you code should satisfy, while also producing friendly error messages so that your users know what's gone wrong.", + "License": "GPL-3", + "Imports": [ + "tools" + ], + "Suggests": [ + "testthat", + "covr" ], - "Hash": "cad6cf7f1d5f6e906700b9d3e718c796" + "RoxygenNote": "6.0.1", + "Collate": "'assert-that.r' 'on-failure.r' 'assertions-file.r' 'assertions-scalar.R' 'assertions.r' 'base.r' 'base-comparison.r' 'base-is.r' 'base-logical.r' 'base-misc.r' 'utils.r' 'validate-that.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN", + "Encoding": "UTF-8" + }, + "assorthead": { + "Package": "assorthead", + "Version": "1.4.0", + "Source": "Bioconductor", + "Date": "2025-10-27", + "Title": "Assorted Header-Only C++ Libraries", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"cre\", \"aut\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "Description": "Vendors an assortment of useful header-only C++ libraries. Bioconductor packages can use these libraries in their own C++ code by LinkingTo this package without introducing any additional dependencies. The use of a central repository avoids duplicate vendoring of libraries across multiple R packages, and enables better coordination of version updates across cohorts of interdependent C++ libraries.", + "License": "MIT + file LICENSE", + "Suggests": [ + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "URL": "https://github.com/LTLA/assorthead", + "BugReports": "https://github.com/LTLA/assorthead/issues", + "Encoding": "UTF-8", + "biocViews": "SingleCell, QualityControl, Normalization, DataRepresentation, DataImport, DifferentialExpression, Alignment", + "git_url": "https://git.bioconductor.org/packages/assorthead", + "git_branch": "RELEASE_3_22", + "git_last_commit": "9255f2f", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [cre, aut]", + "Maintainer": "Aaron Lun " }, "babelgene": { "Package": "babelgene", "Version": "22.9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Gene Orthologs for Model Organisms in a Tidy Data Format", + "Authors@R": "person(\"Igor\", \"Dolgalev\", , \"igor.dolgalev@nyumc.org\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4451-126X\"))", + "Description": "Genomic analysis of model organisms frequently requires the use of databases based on human data or making comparisons to patient-derived resources. This requires harmonization of gene names into the same gene space. The 'babelgene' R package converts between human and non-human gene orthologs/homologs. The package integrates orthology assertion predictions sourced from multiple databases as compiled by the HGNC Comparison of Orthology Predictions (HCOP) (Wright et al. 2005 , Eyre et al. 2007 , Seal et al. 2011 ).", + "License": "MIT + file LICENSE", + "URL": "https://igordot.github.io/babelgene/", + "BugReports": "https://github.com/igordot/babelgene/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "dplyr", "methods", "rlang" ], - "Hash": "8288e81d0c2c3272603f6ef394ffa6fd" + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.1", + "NeedsCompilation": "no", + "Author": "Igor Dolgalev [aut, cre] ()", + "Maintainer": "Igor Dolgalev ", + "Repository": "CRAN" }, "backports": { "Package": "backports", - "Version": "1.4.1", + "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "c39fbec8a30d23e721980b8afb31984c" + "Type": "Package", + "Title": "Reimplementations of Functions Introduced Since R-3.0.0", + "Authors@R": "c( person(\"Michel\", \"Lang\", NULL, \"michellang@gmail.com\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Duncan\", \"Murdoch\", NULL, \"murdoch.duncan@gmail.com\", role = c(\"aut\")), person(\"R Core Team\", role = \"aut\"))", + "Maintainer": "Michel Lang ", + "Description": "Functions introduced or changed since R v3.0.0 are re-implemented in this package. The backports are conditionally exported in order to let R resolve the function name to either the implemented backport, or the respective base version, if available. Package developers can make use of new functions or arguments by selectively importing specific backports to support older installations.", + "URL": "https://github.com/r-lib/backports", + "BugReports": "https://github.com/r-lib/backports/issues", + "License": "GPL-2 | GPL-3", + "NeedsCompilation": "yes", + "ByteCompile": "yes", + "Depends": [ + "R (>= 3.0.0)" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Author": "Michel Lang [cre, aut] (), Duncan Murdoch [aut], R Core Team [aut]", + "Repository": "CRAN" }, "base64enc": { "Package": "base64enc", - "Version": "0.1-3", + "Version": "0.1-6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Tools for 'base64' Encoding", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" + ], + "Enhances": [ + "png" ], - "Hash": "543776ae6848fde2f48ff3816d0628bc" + "Description": "Tools for handling 'base64' encoding. It is more flexible than the orphaned 'base64' package.", + "License": "GPL-2 | GPL-3", + "URL": "https://www.rforge.net/base64enc", + "BugReports": "https://github.com/s-u/base64enc/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "batchelor": { "Package": "batchelor", - "Version": "1.20.0", + "Version": "1.26.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Date": "2025-03-13", + "Title": "Single-Cell Batch Correction Methods", + "Authors@R": "c(person(\"Aaron\", \"Lun\", role = c(\"aut\", \"cre\"), email = \"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Laleh\", \"Haghverdi\", role=\"ctb\"))", + "Depends": [ + "SingleCellExperiment" + ], + "Imports": [ + "SummarizedExperiment", + "S4Vectors", "BiocGenerics", + "Rcpp", + "stats", + "methods", + "utils", + "igraph", "BiocNeighbors", - "BiocParallel", "BiocSingular", - "DelayedArray", - "DelayedMatrixStats", "Matrix", - "Rcpp", + "SparseArray", + "DelayedArray (>= 0.31.5)", + "DelayedMatrixStats", + "BiocParallel", + "scuttle", "ResidualMatrix", - "S4Vectors", "ScaledMatrix", - "SingleCellExperiment", - "SummarizedExperiment", - "beachmat", - "igraph", - "methods", - "scuttle", - "stats", - "utils" + "beachmat" + ], + "Suggests": [ + "testthat", + "BiocStyle", + "knitr", + "rmarkdown", + "scran", + "scater", + "bluster", + "scRNAseq" + ], + "biocViews": "Sequencing, RNASeq, Software, GeneExpression, Transcriptomics, SingleCell, BatchEffect, Normalization", + "LinkingTo": [ + "Rcpp" ], - "Hash": "ec5dcf85cdf644b078d02deaf27a3bfd" + "Description": "Implements a variety of methods for batch correction of single-cell (RNA sequencing) data. This includes methods based on detecting mutually nearest neighbors, as well as several efficient variants of linear regression of the log-expression values. Functions are also provided to perform global rescaling to remove differences in depth between batches, and to perform a principal components analysis that is robust to differences in the numbers of cells across batches.", + "License": "GPL-3", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "SystemRequirements": "C++11", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/batchelor", + "git_branch": "RELEASE_3_22", + "git_last_commit": "8a9df0d", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Aaron Lun [aut, cre], Laleh Haghverdi [ctb]", + "Maintainer": "Aaron Lun " }, "bbmle": { "Package": "bbmle", "Version": "1.0.25.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "MASS", - "Matrix", - "R", - "bdsmatrix", + "Title": "Tools for General Maximum Likelihood Estimation", + "Description": "Methods and functions for fitting maximum likelihood models in R. This package modifies and extends the 'mle' classes in the 'stats4' package.", + "Authors@R": "c(person(\"Ben\",\"Bolker\",email=\"bolker@mcmaster.ca\",role=c(\"aut\",\"cre\"), comment=c(ORCID=\"0000-0002-2127-0443\")), person(\"R Development Core Team\",role=c(\"aut\")), person(\"Iago Giné-Vázquez\", role=c(\"ctb\")) )", + "Depends": [ + "R (>= 3.0.0)", + "stats4" + ], + "Imports": [ + "stats", + "numDeriv", "lattice", + "MASS", "methods", - "mvtnorm", - "numDeriv", - "stats", - "stats4" + "bdsmatrix", + "Matrix", + "mvtnorm" ], - "Hash": "f32b6a1dfc5c80504326aa3474b10fe6" + "Suggests": [ + "emdbook", + "rms", + "ggplot2", + "RUnit", + "MuMIn", + "AICcmodavg", + "Hmisc", + "optimx (>= 2013.8.6)", + "knitr", + "testthat" + ], + "VignetteBuilder": "knitr", + "BuildVignettes": "yes", + "License": "GPL", + "URL": "https://github.com/bbolker/bbmle", + "Collate": "'mle2-class.R' 'mle2-methods.R' 'mle.R' 'confint.R' 'predict.R' 'profile.R' 'update.R' 'dists.R' 'IC.R' 'slice.R' 'impsamp.R' 'TMB.R'", + "RoxygenNote": "7.1.0", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Ben Bolker [aut, cre] (), R Development Core Team [aut], Iago Giné-Vázquez [ctb]", + "Maintainer": "Ben Bolker ", + "Repository": "CRAN" }, "bdsmatrix": { "Package": "bdsmatrix", "Version": "1.3-7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" + "Title": "Routines for Block Diagonal Symmetric Matrices", + "Maintainer": "Terry Therneau ", + "Date": "2024-03-01", + "Depends": [ + "methods", + "R (>= 2.0.0)" ], - "Hash": "d36e416e5a8f91cf90b5edeb3306703a" + "LazyLoad": "Yes", + "Author": "Terry Therneau", + "Description": "This is a special case of sparse matrices, used by coxme.", + "License": "LGPL-2", + "Collate": "bdsmatrix.R gchol.R gchol.bdsmatrix.R as.matrix.bdsmatrix.R bdsBlock.R bdsI.R bdsmatrix.ibd.R bdsmatrix.reconcile.R diag.bdsmatrix.R listbdsmatrix.R multiply.bdsmatrix.R solve.bdsmatrix.R solve.gchol.R solve.gchol.bdsmatrix.R backsolve.R", + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "beachmat": { "Package": "beachmat", - "Version": "2.20.0", + "Version": "2.26.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Date": "2025-08-19", + "Title": "Compiling Bioconductor to Handle Each Matrix Type", + "Authors@R": "c(person(\"Aaron\", \"Lun\", role = c(\"aut\", \"cre\"), email = \"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Hervé\", \"Pagès\", role=\"aut\"), person(\"Mike\", \"Smith\", role=\"aut\"))", + "Imports": [ + "methods", + "DelayedArray (>= 0.27.2)", + "SparseArray", "BiocGenerics", - "DelayedArray", "Matrix", - "Rcpp", - "SparseArray", - "methods" + "Rcpp" + ], + "Suggests": [ + "testthat", + "BiocStyle", + "knitr", + "rmarkdown", + "rcmdcheck", + "BiocParallel", + "HDF5Array", + "beachmat.hdf5" ], - "Hash": "10e94b1bce9070632a40c6b873f8b2d4" + "LinkingTo": [ + "Rcpp", + "assorthead (>= 1.3.3)" + ], + "biocViews": "DataRepresentation, DataImport, Infrastructure", + "Description": "Provides a consistent C++ class interface for reading from a variety of commonly used matrix types. Ordinary matrices and several sparse/dense Matrix classes are directly supported, along with a subset of the delayed operations implemented in the DelayedArray package. All other matrix-like objects are supported by calling back into R.", + "License": "GPL-3", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "SystemRequirements": "C++17", + "URL": "https://github.com/tatami-inc/beachmat", + "BugReports": "https://github.com/tatami-inc/beachmat/issues", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "git_url": "https://git.bioconductor.org/packages/beachmat", + "git_branch": "RELEASE_3_22", + "git_last_commit": "016c55e", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Aaron Lun [aut, cre], Hervé Pagès [aut], Mike Smith [aut]", + "Maintainer": "Aaron Lun " }, "beeswarm": { "Package": "beeswarm", "Version": "0.4.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "grDevices", - "graphics", + "Title": "The Bee Swarm Plot, an Alternative to Stripchart", + "Description": "The bee swarm plot is a one-dimensional scatter plot like \"stripchart\", but with closely-packed, non-overlapping points.", + "Date": "2021-05-07", + "Authors@R": "c( person(\"Aron\", \"Eklund\", , \"aroneklund@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0861-1001\")), person(\"James\", \"Trimble\", role = \"aut\", comment = c(ORCID = \"0000-0001-7282-8745\")) )", + "Imports": [ "stats", + "graphics", + "grDevices", "utils" ], - "Hash": "0f4e9d8caa6feaa7e409ae6c30f2ca66" + "NeedsCompilation": "yes", + "License": "Artistic-2.0", + "URL": "https://github.com/aroneklund/beeswarm", + "BugReports": "https://github.com/aroneklund/beeswarm/issues", + "Author": "Aron Eklund [aut, cre] (), James Trimble [aut] ()", + "Maintainer": "Aron Eklund ", + "Repository": "CRAN", + "Encoding": "UTF-8" + }, + "biocmake": { + "Package": "biocmake", + "Version": "1.2.0", + "Source": "Bioconductor", + "Date": "2025-08-21", + "Title": "CMake for Bioconductor", + "Description": "Manages the installation of CMake for building Bioconductor packages. This avoids the need for end-users to manually install CMake on their system. No action is performed if a suitable version of CMake is already available.", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"cre\", \"aut\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "VignetteBuilder": "knitr", + "Imports": [ + "utils", + "tools", + "dir.expiry" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "BiocStyle", + "testthat" + ], + "biocViews": "Infrastructure", + "URL": "https://github.com/LTLA/biocmake", + "BugReports": "https://github.com/LTLA/biocmake/issues", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/biocmake", + "git_branch": "RELEASE_3_22", + "git_last_commit": "ee210d0", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [cre, aut]", + "Maintainer": "Aaron Lun " }, "biomaRt": { "Package": "biomaRt", - "Version": "2.60.0", + "Version": "2.66.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Title": "Interface to BioMart databases (i.e. Ensembl)", + "Authors@R": "c( person(\"Steffen\", \"Durinck\", , \"biomartdev@gmail.com\", role = \"aut\"), person(\"Wolfgang\", \"Huber\", role = \"aut\"), person(\"Sean\", \"Davis\", , \"sdavis2@mail.nih.gov\", role = \"ctb\"), person(\"Francois\", \"Pepin\", role = \"ctb\"), person(\"Vince S\", \"Buffalo\", role = \"ctb\"), person(\"Mike\", \"Smith\", , \"grimbough@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-7800-3848\")), person(\"Hugo\", \"Gruson\", , \"hugo.gruson@embl.de\", role = c(\"ctb\", \"cre\"), comment = c(ORCID = \"0000-0002-4094-1476\")), person(\"German Network for Bioinformatics Infrastructure - de.NBI\", role = \"fnd\") )", + "Description": "In recent years a wealth of biological data has become available in public data repositories. Easy access to these valuable data resources and firm integration with data analysis is needed for comprehensive bioinformatics data analysis. biomaRt provides an interface to a growing collection of databases implementing the BioMart software suite (). The package enables retrieval of large amounts of data in a uniform way without the need to know the underlying database schemas or write complex SQL queries. The most prominent examples of BioMart databases are maintained by Ensembl, which provides biomaRt users direct access to a diverse set of data and enables a wide range of powerful online queries from gene annotation to database mining.", + "License": "Artistic-2.0", + "URL": "https://github.com/Huber-group-EMBL/biomaRt, https://huber-group-embl.github.io/biomaRt/", + "BugReports": "https://github.com/Huber-group-EMBL/biomaRt/issues", + "Depends": [ + "methods", + "R (>= 4.5.0)" + ], + "Imports": [ "AnnotationDbi", "BiocFileCache", - "digest", + "curl", "httr2", - "methods", "progress", - "rappdirs", "stringr", "utils", "xml2" ], - "Hash": "8bce67ed479b1d54e1627598edd9db30" + "Suggests": [ + "BiocStyle", + "httptest2", + "knitr", + "mockery", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "biocViews": "Annotation", + "Config/Needs/website": "xfun", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyLoad": "yes", + "NeedsCompilation": "no", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.3", + "Collate": "'biomaRt-package.R' 'biomaRtClasses.R' 'methods-Mart.R' 'biomaRt.R' 'caching.R' 'ensembl.R' 'ensembl_wrappers.R' 'ensembl_ssl_settings.R' 'utilityFunctions.R' 'non-biomart-utils.R' 'exportFASTA.R' 'NP2009code.R'", + "git_url": "https://git.bioconductor.org/packages/biomaRt", + "git_branch": "RELEASE_3_22", + "git_last_commit": "13281c5", + "git_last_commit_date": "2026-02-12", + "Repository": "Bioconductor 3.22", + "Author": "Steffen Durinck [aut], Wolfgang Huber [aut], Sean Davis [ctb], Francois Pepin [ctb], Vince S Buffalo [ctb], Mike Smith [ctb] (ORCID: ), Hugo Gruson [ctb, cre] (ORCID: ), German Network for Bioinformatics Infrastructure - de.NBI [fnd]", + "Maintainer": "Hugo Gruson " }, "bit": { "Package": "bit", - "Version": "4.0.5", + "Version": "4.6.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Classes and Methods for Fast Memory-Efficient Boolean Selections", + "Authors@R": "c( person(\"Michael\", \"Chirico\", email = \"MichaelChirico4@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Jens\", \"Oehlschlägel\", role = \"aut\"), person(\"Brian\", \"Ripley\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.4.0)" ], - "Hash": "d242abec29412ce988848d0294b208fd" + "Suggests": [ + "testthat (>= 3.0.0)", + "roxygen2", + "knitr", + "markdown", + "rmarkdown", + "microbenchmark", + "bit64 (>= 4.0.0)", + "ff (>= 4.0.0)" + ], + "Description": "Provided are classes for boolean and skewed boolean vectors, fast boolean methods, fast unique and non-unique integer sorting, fast set operations on sorted and unsorted sets of integers, and foundations for ff (range index, compression, chunked processing).", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "ByteCompile": "yes", + "Encoding": "UTF-8", + "URL": "https://github.com/r-lib/bit", + "VignetteBuilder": "knitr, rmarkdown", + "RoxygenNote": "7.3.2", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Michael Chirico [aut, cre], Jens Oehlschlägel [aut], Brian Ripley [ctb]", + "Maintainer": "Michael Chirico ", + "Repository": "CRAN" }, "bit64": { "Package": "bit64", - "Version": "4.0.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bit", + "Version": "4.6.0-1", + "Source": "Repository", + "Title": "A S3 Class for Vectors of 64bit Integers", + "Authors@R": "c( person(\"Michael\", \"Chirico\", email = \"michaelchirico4@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Jens\", \"Oehlschlägel\", role = \"aut\"), person(\"Leonardo\", \"Silvestri\", role = \"ctb\"), person(\"Ofek\", \"Shilon\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.4.0)", + "bit (>= 4.0.0)" + ], + "Description": "Package 'bit64' provides serializable S3 atomic 64bit (signed) integers. These are useful for handling database keys and exact counting in +-2^63. WARNING: do not use them as replacement for 32bit integers, integer64 are not supported for subscripting by R-core and they have different semantics when combined with double, e.g. integer64 + double => integer64. Class integer64 can be used in vectors, matrices, arrays and data.frames. Methods are available for coercion from and to logicals, integers, doubles, characters and factors as well as many elementwise and summary functions. Many fast algorithmic operations such as 'match' and 'order' support inter- active data exploration and manipulation and optionally leverage caching.", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "ByteCompile": "yes", + "URL": "https://github.com/r-lib/bit64", + "Encoding": "UTF-8", + "Imports": [ + "graphics", "methods", "stats", "utils" ], - "Hash": "9fe98599ca456d6552421db0d6772d8f" + "Suggests": [ + "testthat (>= 3.0.3)", + "withr" + ], + "Config/testthat/edition": "3", + "Config/needs/development": "testthat", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Michael Chirico [aut, cre], Jens Oehlschlägel [aut], Leonardo Silvestri [ctb], Ofek Shilon [ctb]", + "Maintainer": "Michael Chirico ", + "Repository": "CRAN" }, "bitops": { "Package": "bitops", - "Version": "1.0-7", + "Version": "1.0-9", "Source": "Repository", + "Date": "2024-10-03", + "Authors@R": "c( person(\"Steve\", \"Dutky\", role = \"aut\", email = \"sdutky@terpalum.umd.edu\", comment = \"S original; then (after MM's port) revised and modified\"), person(\"Martin\", \"Maechler\", role = c(\"cre\", \"aut\"), email = \"maechler@stat.math.ethz.ch\", comment = c(\"Initial R port; tweaks\", ORCID = \"0000-0002-8685-9910\")))", + "Title": "Bitwise Operations", + "Description": "Functions for bitwise operations on integer vectors.", + "License": "GPL (>= 2)", + "URL": "https://github.com/mmaechler/R-bitops", + "BugReports": "https://github.com/mmaechler/R-bitops/issues", + "NeedsCompilation": "yes", + "Author": "Steve Dutky [aut] (S original; then (after MM's port) revised and modified), Martin Maechler [cre, aut] (Initial R port; tweaks, )", + "Maintainer": "Martin Maechler ", "Repository": "CRAN", - "Hash": "b7d8d8ee39869c18d8846a184dd8a1af" + "Encoding": "UTF-8" }, "blob": { "Package": "blob", - "Version": "1.2.4", + "Version": "1.3.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "A Simple S3 Class for Representing Vectors of Binary Data ('BLOBS')", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = \"cre\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "R's raw vector is useful for storing a single binary object. What if you want to put a vector of them in a data frame? The 'blob' package provides the blob object, a list of raw vectors, suitable for use as a column in data frame.", + "License": "MIT + file LICENSE", + "URL": "https://blob.tidyverse.org, https://github.com/tidyverse/blob", + "BugReports": "https://github.com/tidyverse/blob/issues", + "Imports": [ "methods", "rlang", - "vctrs" + "vctrs (>= 0.2.1)" ], - "Hash": "40415719b5a479b87949f3aa0aee737c" + "Suggests": [ + "covr", + "crayon", + "pillar (>= 1.2.1)", + "testthat (>= 3.0.0)" + ], + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Kirill Müller [cre], RStudio [cph, fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "bluster": { "Package": "bluster", - "Version": "1.14.0", + "Version": "1.20.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocNeighbors", - "BiocParallel", + "Date": "2025-10-22", + "Title": "Clustering Algorithms for Bioconductor", + "Description": "Wraps common clustering algorithms in an easily extended S4 framework. Backends are implemented for hierarchical, k-means and graph-based clustering. Several utilities are also provided to compare and evaluate clustering results.", + "Authors@R": "c( person(\"Aaron\", \"Lun\", role = c(\"aut\", \"cre\"), email = \"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Stephanie\", \"Hicks\", role=\"ctb\"), person(\"Basil\", \"Courbayre\", role=\"ctb\"), person(\"Tuomas\", \"Borman\", role=\"ctb\"), person(\"Leo\", \"Lahti\", role=\"ctb\") )", + "Imports": [ + "stats", + "methods", + "utils", + "cluster", "Matrix", "Rcpp", - "S4Vectors", - "cluster", "igraph", - "methods", - "stats", - "utils" + "S4Vectors", + "BiocParallel", + "BiocNeighbors" ], - "Hash": "ed9597168d850071aa9abbbef7be7204" + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "BiocStyle", + "dynamicTreeCut", + "scRNAseq", + "scuttle", + "scater", + "scran", + "pheatmap", + "viridis", + "mbkmeans", + "kohonen", + "apcluster", + "DirichletMultinomial", + "vegan", + "fastcluster" + ], + "biocViews": "ImmunoOncology, Software, GeneExpression, Transcriptomics, SingleCell, Clustering", + "LinkingTo": [ + "Rcpp", + "assorthead" + ], + "Collate": "AllClasses.R AllGenerics.R AgnesParam.R approxSilhouette.R bluster-package.R DbscanParam.R DianaParam.R AffinityParam.R BlusterParam.R bootstrapStability.R ClaraParam.R clusterRMSD.R clusterSweep.R compareClusterings.R DmmParam.R FixedNumberParam.R HclustParam.R HierarchicalParam.R KmeansParam.R linkClusters.R makeSNNGraph.R MbkmeansParam.R mergeCommunities.R neighborPurity.R nestedClusters.R NNGraphParam.R pairwiseModularity.R pairwiseRand.R PamParam.R RcppExports.R SomParam.R TwoStepParam.R utils.R", + "License": "GPL-3", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "SystemRequirements": "C++17", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "git_url": "https://git.bioconductor.org/packages/bluster", + "git_branch": "RELEASE_3_22", + "git_last_commit": "b47a2df", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Aaron Lun [aut, cre], Stephanie Hicks [ctb], Basil Courbayre [ctb], Tuomas Borman [ctb], Leo Lahti [ctb]", + "Maintainer": "Aaron Lun " }, "broom": { "Package": "broom", - "Version": "1.0.5", + "Version": "1.0.12", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Convert Statistical Objects into Tidy Tibbles", + "Authors@R": "c( person(\"David\", \"Robinson\", , \"admiral.david@gmail.com\", role = \"aut\"), person(\"Alex\", \"Hayes\", , \"alexpghayes@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4985-5160\")), person(\"Simon\", \"Couch\", , \"simon.couch@posit.co\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-5676-5107\")), person(\"Emil\", \"Hvitfeldt\", , \"emil.hvitfeldt@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0679-1945\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Indrajeet\", \"Patil\", , \"patilindrajeet.science@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1995-6531\")), person(\"Derek\", \"Chiu\", , \"dchiu@bccrc.ca\", role = \"ctb\"), person(\"Matthieu\", \"Gomez\", , \"mattg@princeton.edu\", role = \"ctb\"), person(\"Boris\", \"Demeshev\", , \"boris.demeshev@gmail.com\", role = \"ctb\"), person(\"Dieter\", \"Menne\", , \"dieter.menne@menne-biomed.de\", role = \"ctb\"), person(\"Benjamin\", \"Nutter\", , \"nutter@battelle.org\", role = \"ctb\"), person(\"Luke\", \"Johnston\", , \"luke.johnston@mail.utoronto.ca\", role = \"ctb\"), person(\"Ben\", \"Bolker\", , \"bolker@mcmaster.ca\", role = \"ctb\"), person(\"Francois\", \"Briatte\", , \"f.briatte@gmail.com\", role = \"ctb\"), person(\"Jeffrey\", \"Arnold\", , \"jeffrey.arnold@gmail.com\", role = \"ctb\"), person(\"Jonah\", \"Gabry\", , \"jsg2201@columbia.edu\", role = \"ctb\"), person(\"Luciano\", \"Selzer\", , \"luciano.selzer@gmail.com\", role = \"ctb\"), person(\"Gavin\", \"Simpson\", , \"ucfagls@gmail.com\", role = \"ctb\"), person(\"Jens\", \"Preussner\", , \"jens.preussner@mpi-bn.mpg.de\", role = \"ctb\"), person(\"Jay\", \"Hesselberth\", , \"jay.hesselberth@gmail.com\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"ctb\"), person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = \"ctb\"), person(\"Alessandro\", \"Gasparini\", , \"ag475@leicester.ac.uk\", role = \"ctb\"), person(\"Lukasz\", \"Komsta\", , \"lukasz.komsta@umlub.pl\", role = \"ctb\"), person(\"Frederick\", \"Novometsky\", role = \"ctb\"), person(\"Wilson\", \"Freitas\", role = \"ctb\"), person(\"Michelle\", \"Evans\", role = \"ctb\"), person(\"Jason Cory\", \"Brunson\", , \"cornelioid@gmail.com\", role = \"ctb\"), person(\"Simon\", \"Jackson\", , \"drsimonjackson@gmail.com\", role = \"ctb\"), person(\"Ben\", \"Whalley\", , \"ben.whalley@plymouth.ac.uk\", role = \"ctb\"), person(\"Karissa\", \"Whiting\", , \"karissa.whiting@gmail.com\", role = \"ctb\"), person(\"Yves\", \"Rosseel\", , \"yrosseel@gmail.com\", role = \"ctb\"), person(\"Michael\", \"Kuehn\", , \"mkuehn10@gmail.com\", role = \"ctb\"), person(\"Jorge\", \"Cimentada\", , \"cimentadaj@gmail.com\", role = \"ctb\"), person(\"Erle\", \"Holgersen\", , \"erle.holgersen@gmail.com\", role = \"ctb\"), person(\"Karl\", \"Dunkle Werner\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0523-7309\")), person(\"Ethan\", \"Christensen\", , \"christensen.ej@gmail.com\", role = \"ctb\"), person(\"Steven\", \"Pav\", , \"shabbychef@gmail.com\", role = \"ctb\"), person(\"Paul\", \"PJ\", , \"pjpaul.stephens@gmail.com\", role = \"ctb\"), person(\"Ben\", \"Schneider\", , \"benjamin.julius.schneider@gmail.com\", role = \"ctb\"), person(\"Patrick\", \"Kennedy\", , \"pkqstr@protonmail.com\", role = \"ctb\"), person(\"Lily\", \"Medina\", , \"lilymiru@gmail.com\", role = \"ctb\"), person(\"Brian\", \"Fannin\", , \"captain@pirategrunt.com\", role = \"ctb\"), person(\"Jason\", \"Muhlenkamp\", , \"jason.muhlenkamp@gmail.com\", role = \"ctb\"), person(\"Matt\", \"Lehman\", role = \"ctb\"), person(\"Bill\", \"Denney\", , \"wdenney@humanpredictions.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Nic\", \"Crane\", role = \"ctb\"), person(\"Andrew\", \"Bates\", role = \"ctb\"), person(\"Vincent\", \"Arel-Bundock\", , \"vincent.arel-bundock@umontreal.ca\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2042-7063\")), person(\"Hideaki\", \"Hayashi\", role = \"ctb\"), person(\"Luis\", \"Tobalina\", role = \"ctb\"), person(\"Annie\", \"Wang\", , \"anniewang.uc@gmail.com\", role = \"ctb\"), person(\"Wei Yang\", \"Tham\", , \"weiyang.tham@gmail.com\", role = \"ctb\"), person(\"Clara\", \"Wang\", , \"clara.wang.94@gmail.com\", role = \"ctb\"), person(\"Abby\", \"Smith\", , \"als1@u.northwestern.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3207-0375\")), person(\"Jasper\", \"Cooper\", , \"jaspercooper@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8639-3188\")), person(\"E Auden\", \"Krauska\", , \"krauskae@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-1466-5850\")), person(\"Alex\", \"Wang\", , \"x249wang@uwaterloo.ca\", role = \"ctb\"), person(\"Malcolm\", \"Barrett\", , \"malcolmbarrett@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Charles\", \"Gray\", , \"charlestigray@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9978-011X\")), person(\"Jared\", \"Wilber\", role = \"ctb\"), person(\"Vilmantas\", \"Gegzna\", , \"GegznaV@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9500-5167\")), person(\"Eduard\", \"Szoecs\", , \"eduardszoecs@gmail.com\", role = \"ctb\"), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Angus\", \"Moore\", , \"angusmoore9@gmail.com\", role = \"ctb\"), person(\"Nick\", \"Williams\", , \"ntwilliams.personal@gmail.com\", role = \"ctb\"), person(\"Marius\", \"Barth\", , \"marius.barth.uni.koeln@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3421-6665\")), person(\"Bruna\", \"Wundervald\", , \"brunadaviesw@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8163-220X\")), person(\"Joyce\", \"Cahoon\", , \"joyceyu48@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7217-4702\")), person(\"Grant\", \"McDermott\", , \"grantmcd@uoregon.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7883-8573\")), person(\"Kevin\", \"Zarca\", , \"kevin.zarca@gmail.com\", role = \"ctb\"), person(\"Shiro\", \"Kuriwaki\", , \"shirokuriwaki@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5687-2647\")), person(\"Lukas\", \"Wallrich\", , \"lukas.wallrich@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2121-5177\")), person(\"James\", \"Martherus\", , \"james@martherus.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8285-3300\")), person(\"Chuliang\", \"Xiao\", , \"cxiao@umich.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8466-9398\")), person(\"Joseph\", \"Larmarange\", , \"joseph@larmarange.net\", role = \"ctb\"), person(\"Max\", \"Kuhn\", , \"max@posit.co\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", , \"michal2992@gmail.com\", role = \"ctb\"), person(\"Hakon\", \"Malmedal\", , \"hmalmedal@gmail.com\", role = \"ctb\"), person(\"Clara\", \"Wang\", role = \"ctb\"), person(\"Sergio\", \"Oller\", , \"sergioller@gmail.com\", role = \"ctb\"), person(\"Luke\", \"Sonnet\", , \"luke.sonnet@gmail.com\", role = \"ctb\"), person(\"Jim\", \"Hester\", , \"jim.hester@posit.co\", role = \"ctb\"), person(\"Ben\", \"Schneider\", , \"benjamin.julius.schneider@gmail.com\", role = \"ctb\"), person(\"Bernie\", \"Gray\", , \"bfgray3@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9190-6032\")), person(\"Mara\", \"Averick\", , \"mara@posit.co\", role = \"ctb\"), person(\"Aaron\", \"Jacobs\", , \"atheriel@gmail.com\", role = \"ctb\"), person(\"Andreas\", \"Bender\", , \"bender.at.R@gmail.com\", role = \"ctb\"), person(\"Sven\", \"Templer\", , \"sven.templer@gmail.com\", role = \"ctb\"), person(\"Paul-Christian\", \"Buerkner\", , \"paul.buerkner@gmail.com\", role = \"ctb\"), person(\"Matthew\", \"Kay\", , \"mjskay@umich.edu\", role = \"ctb\"), person(\"Erwan\", \"Le Pennec\", , \"lepennec@gmail.com\", role = \"ctb\"), person(\"Johan\", \"Junkka\", , \"johan.junkka@umu.se\", role = \"ctb\"), person(\"Hao\", \"Zhu\", , \"haozhu233@gmail.com\", role = \"ctb\"), person(\"Benjamin\", \"Soltoff\", , \"soltoffbc@uchicago.edu\", role = \"ctb\"), person(\"Zoe\", \"Wilkinson Saldana\", , \"zoewsaldana@gmail.com\", role = \"ctb\"), person(\"Tyler\", \"Littlefield\", , \"tylurp1@gmail.com\", role = \"ctb\"), person(\"Charles T.\", \"Gray\", , \"charlestigray@gmail.com\", role = \"ctb\"), person(\"Shabbh E.\", \"Banks\", role = \"ctb\"), person(\"Serina\", \"Robinson\", , \"robi0916@umn.edu\", role = \"ctb\"), person(\"Roger\", \"Bivand\", , \"Roger.Bivand@nhh.no\", role = \"ctb\"), person(\"Riinu\", \"Ots\", , \"riinuots@gmail.com\", role = \"ctb\"), person(\"Nicholas\", \"Williams\", , \"ntwilliams.personal@gmail.com\", role = \"ctb\"), person(\"Nina\", \"Jakobsen\", role = \"ctb\"), person(\"Michael\", \"Weylandt\", , \"michael.weylandt@gmail.com\", role = \"ctb\"), person(\"Lisa\", \"Lendway\", , \"llendway@macalester.edu\", role = \"ctb\"), person(\"Karl\", \"Hailperin\", , \"khailper@gmail.com\", role = \"ctb\"), person(\"Josue\", \"Rodriguez\", , \"jerrodriguez@ucdavis.edu\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", , \"jenny@posit.co\", role = \"ctb\"), person(\"Chris\", \"Jarvis\", , \"Christopher1.jarvis@gmail.com\", role = \"ctb\"), person(\"Greg\", \"Macfarlane\", , \"gregmacfarlane@gmail.com\", role = \"ctb\"), person(\"Brian\", \"Mannakee\", , \"bmannakee@gmail.com\", role = \"ctb\"), person(\"Drew\", \"Tyre\", , \"atyre2@unl.edu\", role = \"ctb\"), person(\"Shreyas\", \"Singh\", , \"shreyas.singh.298@gmail.com\", role = \"ctb\"), person(\"Laurens\", \"Geffert\", , \"laurensgeffert@gmail.com\", role = \"ctb\"), person(\"Hong\", \"Ooi\", , \"hongooi@microsoft.com\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", , \"henrikb@braju.com\", role = \"ctb\"), person(\"Eduard\", \"Szocs\", , \"eduardszoecs@gmail.com\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", , \"davidhughjones@gmail.com\", role = \"ctb\"), person(\"Matthieu\", \"Stigler\", , \"Matthieu.Stigler@gmail.com\", role = \"ctb\"), person(\"Hugo\", \"Tavares\", , \"hm533@cam.ac.uk\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9373-2726\")), person(\"R. Willem\", \"Vervoort\", , \"Willemvervoort@gmail.com\", role = \"ctb\"), person(\"Brenton M.\", \"Wiernik\", , \"brenton@wiernik.org\", role = \"ctb\"), person(\"Josh\", \"Yamamoto\", , \"joshuayamamoto5@gmail.com\", role = \"ctb\"), person(\"Jasme\", \"Lee\", role = \"ctb\"), person(\"Taren\", \"Sanders\", , \"taren.sanders@acu.edu.au\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4504-6008\")), person(\"Ilaria\", \"Prosdocimi\", , \"prosdocimi.ilaria@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8565-094X\")), person(\"Daniel D.\", \"Sjoberg\", , \"danield.sjoberg@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0862-2018\")), person(\"Alex\", \"Reinhart\", , \"areinhar@stat.cmu.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-6658-514X\")) )", + "Description": "Summarizes key information about statistical objects in tidy tibbles. This makes it easy to report results, create plots and consistently work with large numbers of models at once. Broom provides three verbs that each provide different types of information about a model. tidy() summarizes information about model components such as coefficients of a regression. glance() reports information about an entire model, such as goodness of fit measures like AIC and BIC. augment() adds information about individual observations to a dataset, such as fitted values or influence measures.", + "License": "MIT + file LICENSE", + "URL": "https://broom.tidymodels.org/, https://github.com/tidymodels/broom", + "BugReports": "https://github.com/tidymodels/broom/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "backports", - "dplyr", - "ellipsis", - "generics", - "glue", - "lifecycle", - "purrr", - "rlang", - "stringr", - "tibble", - "tidyr" - ], - "Hash": "fd25391c3c4f6ecf0fa95f1e6d15378c" - }, - "broom.helpers": { - "Package": "broom.helpers", - "Version": "1.15.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "broom", "cli", - "dplyr", - "labelled", + "dplyr (>= 1.0.0)", + "generics (>= 0.0.2)", + "glue", "lifecycle", "purrr", - "rlang", - "stats", + "rlang (>= 1.1.0)", "stringr", - "tibble", - "tidyr" + "tibble (>= 3.0.0)", + "tidyr (>= 1.0.0)" ], - "Hash": "768cae43c3da698d6b11763777301e43" + "Suggests": [ + "AER", + "AUC", + "bbmle", + "betareg (>= 3.2-1)", + "biglm", + "binGroup", + "boot", + "btergm (>= 1.10.6)", + "car (>= 3.1-2)", + "carData", + "caret", + "cluster", + "cmprsk", + "coda", + "covr", + "drc", + "e1071", + "emmeans", + "epiR (>= 2.0.85)", + "ergm (>= 3.10.4)", + "fixest (>= 0.9.0)", + "gam (>= 1.15)", + "gee", + "geepack", + "ggplot2", + "glmnet", + "glmnetUtils", + "gmm", + "Hmisc", + "interp", + "irlba", + "joineRML", + "Kendall", + "knitr", + "ks", + "Lahman", + "lavaan (>= 0.6.18)", + "leaps", + "lfe", + "lm.beta", + "lme4", + "lmodel2", + "lmtest (>= 0.9.38)", + "lsmeans", + "maps", + "margins", + "MASS", + "mclust", + "mediation", + "metafor", + "mfx", + "mgcv", + "mlogit", + "modeldata", + "modeltests (>= 0.1.6)", + "muhaz", + "multcomp", + "network", + "nnet", + "ordinal", + "plm", + "poLCA", + "psych", + "quantreg", + "rmarkdown", + "robust", + "robustbase", + "rsample", + "sandwich", + "spatialreg", + "spdep (>= 1.1)", + "speedglm", + "spelling", + "stats4", + "survey", + "survival (>= 3.6-4)", + "systemfit", + "testthat (>= 3.0.0)", + "tseries", + "vars", + "zoo" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "Collate": "'aaa-documentation-helper.R' 'null-and-default.R' 'aer.R' 'auc.R' 'base.R' 'bbmle.R' 'betareg.R' 'biglm.R' 'bingroup.R' 'boot.R' 'broom-package.R' 'broom.R' 'btergm.R' 'car.R' 'caret.R' 'cluster.R' 'cmprsk.R' 'data-frame.R' 'deprecated-0-7-0.R' 'drc.R' 'emmeans.R' 'epiR.R' 'ergm.R' 'fixest.R' 'gam.R' 'geepack.R' 'glmnet-cv-glmnet.R' 'glmnet-glmnet.R' 'gmm.R' 'hmisc.R' 'import-standalone-obj-type.R' 'import-standalone-types-check.R' 'joinerml.R' 'kendall.R' 'ks.R' 'lavaan.R' 'leaps.R' 'lfe.R' 'list-irlba.R' 'list-optim.R' 'list-svd.R' 'list-xyz.R' 'list.R' 'lm-beta.R' 'lmodel2.R' 'lmtest.R' 'maps.R' 'margins.R' 'mass-fitdistr.R' 'mass-negbin.R' 'mass-polr.R' 'mass-ridgelm.R' 'stats-lm.R' 'mass-rlm.R' 'mclust.R' 'mediation.R' 'metafor.R' 'mfx.R' 'mgcv.R' 'mlogit.R' 'muhaz.R' 'multcomp.R' 'nnet.R' 'nobs.R' 'ordinal-clm.R' 'ordinal-clmm.R' 'plm.R' 'polca.R' 'psych.R' 'stats-nls.R' 'quantreg-nlrq.R' 'quantreg-rq.R' 'quantreg-rqs.R' 'robust-glmrob.R' 'robust-lmrob.R' 'robustbase-glmrob.R' 'robustbase-lmrob.R' 'sp.R' 'spdep.R' 'speedglm-speedglm.R' 'speedglm-speedlm.R' 'stats-anova.R' 'stats-arima.R' 'stats-decompose.R' 'stats-factanal.R' 'stats-glm.R' 'stats-htest.R' 'stats-kmeans.R' 'stats-loess.R' 'stats-mlm.R' 'stats-prcomp.R' 'stats-smooth.spline.R' 'stats-summary-lm.R' 'stats-time-series.R' 'survey.R' 'survival-aareg.R' 'survival-cch.R' 'survival-coxph.R' 'survival-pyears.R' 'survival-survdiff.R' 'survival-survexp.R' 'survival-survfit.R' 'survival-survreg.R' 'systemfit.R' 'tseries.R' 'utilities.R' 'vars.R' 'zoo.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "David Robinson [aut], Alex Hayes [aut] (ORCID: ), Simon Couch [aut] (ORCID: ), Emil Hvitfeldt [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Indrajeet Patil [ctb] (ORCID: ), Derek Chiu [ctb], Matthieu Gomez [ctb], Boris Demeshev [ctb], Dieter Menne [ctb], Benjamin Nutter [ctb], Luke Johnston [ctb], Ben Bolker [ctb], Francois Briatte [ctb], Jeffrey Arnold [ctb], Jonah Gabry [ctb], Luciano Selzer [ctb], Gavin Simpson [ctb], Jens Preussner [ctb], Jay Hesselberth [ctb], Hadley Wickham [ctb], Matthew Lincoln [ctb], Alessandro Gasparini [ctb], Lukasz Komsta [ctb], Frederick Novometsky [ctb], Wilson Freitas [ctb], Michelle Evans [ctb], Jason Cory Brunson [ctb], Simon Jackson [ctb], Ben Whalley [ctb], Karissa Whiting [ctb], Yves Rosseel [ctb], Michael Kuehn [ctb], Jorge Cimentada [ctb], Erle Holgersen [ctb], Karl Dunkle Werner [ctb] (ORCID: ), Ethan Christensen [ctb], Steven Pav [ctb], Paul PJ [ctb], Ben Schneider [ctb], Patrick Kennedy [ctb], Lily Medina [ctb], Brian Fannin [ctb], Jason Muhlenkamp [ctb], Matt Lehman [ctb], Bill Denney [ctb] (ORCID: ), Nic Crane [ctb], Andrew Bates [ctb], Vincent Arel-Bundock [ctb] (ORCID: ), Hideaki Hayashi [ctb], Luis Tobalina [ctb], Annie Wang [ctb], Wei Yang Tham [ctb], Clara Wang [ctb], Abby Smith [ctb] (ORCID: ), Jasper Cooper [ctb] (ORCID: ), E Auden Krauska [ctb] (ORCID: ), Alex Wang [ctb], Malcolm Barrett [ctb] (ORCID: ), Charles Gray [ctb] (ORCID: ), Jared Wilber [ctb], Vilmantas Gegzna [ctb] (ORCID: ), Eduard Szoecs [ctb], Frederik Aust [ctb] (ORCID: ), Angus Moore [ctb], Nick Williams [ctb], Marius Barth [ctb] (ORCID: ), Bruna Wundervald [ctb] (ORCID: ), Joyce Cahoon [ctb] (ORCID: ), Grant McDermott [ctb] (ORCID: ), Kevin Zarca [ctb], Shiro Kuriwaki [ctb] (ORCID: ), Lukas Wallrich [ctb] (ORCID: ), James Martherus [ctb] (ORCID: ), Chuliang Xiao [ctb] (ORCID: ), Joseph Larmarange [ctb], Max Kuhn [ctb], Michal Bojanowski [ctb], Hakon Malmedal [ctb], Clara Wang [ctb], Sergio Oller [ctb], Luke Sonnet [ctb], Jim Hester [ctb], Ben Schneider [ctb], Bernie Gray [ctb] (ORCID: ), Mara Averick [ctb], Aaron Jacobs [ctb], Andreas Bender [ctb], Sven Templer [ctb], Paul-Christian Buerkner [ctb], Matthew Kay [ctb], Erwan Le Pennec [ctb], Johan Junkka [ctb], Hao Zhu [ctb], Benjamin Soltoff [ctb], Zoe Wilkinson Saldana [ctb], Tyler Littlefield [ctb], Charles T. Gray [ctb], Shabbh E. Banks [ctb], Serina Robinson [ctb], Roger Bivand [ctb], Riinu Ots [ctb], Nicholas Williams [ctb], Nina Jakobsen [ctb], Michael Weylandt [ctb], Lisa Lendway [ctb], Karl Hailperin [ctb], Josue Rodriguez [ctb], Jenny Bryan [ctb], Chris Jarvis [ctb], Greg Macfarlane [ctb], Brian Mannakee [ctb], Drew Tyre [ctb], Shreyas Singh [ctb], Laurens Geffert [ctb], Hong Ooi [ctb], Henrik Bengtsson [ctb], Eduard Szocs [ctb], David Hugh-Jones [ctb], Matthieu Stigler [ctb], Hugo Tavares [ctb] (ORCID: ), R. Willem Vervoort [ctb], Brenton M. Wiernik [ctb], Josh Yamamoto [ctb], Jasme Lee [ctb], Taren Sanders [ctb] (ORCID: ), Ilaria Prosdocimi [ctb] (ORCID: ), Daniel D. Sjoberg [ctb] (ORCID: ), Alex Reinhart [ctb] (ORCID: )", + "Maintainer": "Emil Hvitfeldt ", + "Repository": "CRAN" }, "bslib": { "Package": "bslib", - "Version": "0.7.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "0.10.0", + "Source": "Repository", + "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", + "Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )", + "Description": "Simplifies custom 'CSS' styling of both 'shiny' and 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 and 5 as well as their various 'Bootswatch' themes. An interactive widget is also provided for previewing themes in real time.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib", + "BugReports": "https://github.com/rstudio/bslib/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ "base64enc", "cachem", - "fastmap", + "fastmap (>= 1.1.1)", "grDevices", - "htmltools", - "jquerylib", + "htmltools (>= 0.5.8)", + "jquerylib (>= 0.1.3)", "jsonlite", "lifecycle", - "memoise", + "memoise (>= 2.0.1)", "mime", "rlang", - "sass" - ], - "Hash": "8644cc53f43828f19133548195d7e59e" - }, - "caTools": { - "Package": "caTools", - "Version": "1.18.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bitops" + "sass (>= 0.4.9)" ], - "Hash": "34d90fa5845004236b9eacafc51d07b2" - }, - "cachem": { - "Package": "cachem", - "Version": "1.0.8", + "Suggests": [ + "brand.yml", + "bsicons", + "curl", + "fontawesome", + "future", + "ggplot2", + "knitr", + "lattice", + "magrittr", + "rappdirs", + "rmarkdown (>= 2.7)", + "shiny (>= 1.11.1)", + "testthat", + "thematic", + "tools", + "utils", + "withr", + "yaml" + ], + "Config/Needs/deploy": "BH, chiflights22, colourpicker, commonmark, cpp11, cpsievert/chiflights22, cpsievert/histoslider, dplyr, DT, ggplot2, ggridges, gt, hexbin, histoslider, htmlwidgets, lattice, leaflet, lubridate, markdown, modelr, plotly, reactable, reshape2, rprojroot, rsconnect, rstudio/shiny, scales, styler, tibble", + "Config/Needs/routine": "chromote, desc, renv", + "Config/Needs/website": "brio, crosstalk, dplyr, DT, ggplot2, glue, htmlwidgets, leaflet, lorem, palmerpenguins, plotly, purrr, rprojroot, rstudio/htmltools, scales, stringr, tidyr, webshot2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-code-editor.R' 'input-dark-mode.R' 'input-submit.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'toast.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (ORCID: ), Joe Cheng [aut], Garrick Aden-Buie [aut] (ORCID: ), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "caTools": { + "Package": "caTools", + "Version": "1.18.3", "Source": "Repository", + "Type": "Package", + "Title": "Tools: Moving Window Statistics, GIF, Base64, ROC AUC, etc", + "Date": "2024-09-04", + "Authors@R": "c(person(given = \"Jarek\", family = \"Tuszynski\", role = \"aut\", email = \"jaroslaw.w.tuszynski@saic.com\"), person(given = \"Michael\", family = \"Dietze\", role = \"cre\", email = \"michael.dietze@uni-goettingen.de\"))", + "Maintainer": "Michael Dietze ", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "bitops" + ], + "Suggests": [ + "MASS", + "rpart" + ], + "Description": "Contains several basic utility functions including: moving (rolling, running) window statistic functions, read/write for GIF and ENVI binary files, fast calculation of AUC, LogitBoost classifier, base64 encoder/decoder, round-off-error-free sum and cumsum, etc.", + "License": "GPL-3", + "NeedsCompilation": "yes", "Repository": "CRAN", - "Requirements": [ - "fastmap", - "rlang" + "Author": "Jarek Tuszynski [aut], Michael Dietze [cre]", + "Encoding": "UTF-8" + }, + "cachem": { + "Package": "cachem", + "Version": "1.1.0", + "Source": "Repository", + "Title": "Cache R Objects with Automatic Pruning", + "Description": "Key-value stores with automatic pruning. Caches can limit either their total size or the age of the oldest object (or both), automatically pruning objects to maintain the constraints.", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", c(\"aut\", \"cre\")), person(family = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")))", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "ByteCompile": "true", + "URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem", + "Imports": [ + "rlang", + "fastmap (>= 1.2.0)" ], - "Hash": "c35768291560ce302c0a6589f92e837d" + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.2.3", + "Config/Needs/routine": "lobstr", + "Config/Needs/website": "pkgdown", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "callr": { "Package": "callr", "Version": "3.7.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Call R from R", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Ascent Digital Services\", role = c(\"cph\", \"fnd\")) )", + "Description": "It is sometimes useful to perform a computation in a separate R process, without affecting the current R process at all. This packages does exactly that.", + "License": "MIT + file LICENSE", + "URL": "https://callr.r-lib.org, https://github.com/r-lib/callr", + "BugReports": "https://github.com/r-lib/callr/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "processx (>= 3.6.1)", "R6", - "processx", "utils" ], - "Hash": "d7e13f49c19103ece9e58ad2d83a7354" + "Suggests": [ + "asciicast (>= 2.3.1)", + "cli (>= 1.1.0)", + "mockery", + "ps", + "rprojroot", + "spelling", + "testthat (>= 3.2.0)", + "withr (>= 2.3.0)" + ], + "Config/Needs/website": "r-lib/asciicast, glue, htmlwidgets, igraph, tibble, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.1.9000", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre, cph] (), Winston Chang [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "celldex": { "Package": "celldex", - "Version": "1.14.0", + "Version": "1.20.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationDbi", + "Title": "Index of Reference Cell Type Datasets", + "Date": "2024-04-25", + "Authors@R": "c(person(\"Dvir\", \"Aran\", email=\"dvir.aran@ucsf.edu\", role=c(\"aut\")), person(\"Aaron\", \"Lun\", email=\"infinite.monkeys.with.keyboards@gmail.com\", role=c(\"aut\", \"cre\", \"cph\")), person(\"Daniel\", \"Bunis\", role=\"aut\"), person(\"Jared\", \"Andrews\", email = \"jared.andrews07@gmail.com\", role=\"aut\"), person(\"Friederike\", \"Dündar\", email = \"frd2007@med.cornell.edu\", role=\"aut\"))", + "Description": "Provides a collection of reference expression datasets with curated cell type labels, for use in procedures like automated annotation of single-cell data or deconvolution of bulk RNA-seq.", + "License": "GPL-3", + "Depends": [ + "SummarizedExperiment" + ], + "Imports": [ + "utils", + "methods", + "Matrix", + "ExperimentHub", "AnnotationHub", - "DBI", + "AnnotationDbi", + "S4Vectors", "DelayedArray", "DelayedMatrixStats", - "ExperimentHub", - "Matrix", - "RSQLite", - "S4Vectors", - "SummarizedExperiment", + "gypsum", "alabaster.base", "alabaster.matrix", "alabaster.se", - "gypsum", - "jsonlite", - "methods", - "utils" + "DBI", + "RSQLite", + "jsonlite" ], - "Hash": "23893b3ebc5833e56319d1136a154531" + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "BiocStyle", + "DT", + "jsonvalidate", + "BiocManager", + "ensembldb" + ], + "biocViews": "ExperimentHub, ExperimentData, ExpressionData, SequencingData, RNASeqData", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "URL": "https://github.com/LTLA/celldex", + "BugReports": "https://support.bioconductor.org/", + "RoxygenNote": "7.3.1", + "git_url": "https://git.bioconductor.org/packages/celldex", + "git_branch": "RELEASE_3_22", + "git_last_commit": "4db42c8", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Dvir Aran [aut], Aaron Lun [aut, cre, cph], Daniel Bunis [aut], Jared Andrews [aut], Friederike Dündar [aut]", + "Maintainer": "Aaron Lun " }, "cellranger": { "Package": "cellranger", "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Translate Spreadsheet Cell Ranges to Rows and Columns", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@stat.ubc.ca\", c(\"cre\", \"aut\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", \"ctb\") )", + "Description": "Helper functions to work with spreadsheets and the \"A1:D10\" style of cell range specification.", + "Depends": [ + "R (>= 3.0.0)" + ], + "License": "MIT + file LICENSE", + "LazyData": "true", + "URL": "https://github.com/rsheets/cellranger", + "BugReports": "https://github.com/rsheets/cellranger/issues", + "Suggests": [ + "covr", + "testthat (>= 1.0.0)", + "knitr", + "rmarkdown" + ], + "RoxygenNote": "5.0.1.9000", + "VignetteBuilder": "knitr", + "Imports": [ "rematch", "tibble" ], - "Hash": "f61dbaec772ccd2e17705c1e872e9e7c" + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [cre, aut], Hadley Wickham [ctb]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN", + "Encoding": "UTF-8" + }, + "cigarillo": { + "Package": "cigarillo", + "Version": "1.0.0", + "Source": "Bioconductor", + "Title": "Efficient manipulation of CIGAR strings", + "Description": "CIGAR stands for Concise Idiosyncratic Gapped Alignment Report. CIGAR strings are found in the BAM files produced by most aligners and in the AIRR-formatted output produced by IgBLAST. The cigarillo package provides functions to parse and inspect CIGAR strings, trim them, turn them into ranges of positions relative to the \"query space\" or \"reference space\", and project positions or sequences from one space to the other. Note that these operations are low-level operations that the user rarely needs to perform directly. More typically, they are performed behind the scene by higher-level functionality implemented in other packages like Bioconductor packages GenomicAlignments and igblastr.", + "biocViews": "Infrastructure, Alignment, SequenceMatching, Sequencing", + "URL": "https://bioconductor.org/packages/cigarillo", + "BugReports": "https://github.com/Bioconductor/cigarillo/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\", comment=c(ORCID=\"0009-0002-8272-4522\")), person(\"Valerie\", \"Obenchain\", role=\"aut\"), person(\"Michael\", \"Lawrence\", role=\"aut\", email=\"lawremi@gmail.com\"), person(\"Patrick\", \"Aboyoun\", role=\"ctb\"), person(\"Fedor\", \"Bezrukov\", role=\"ctb\"), person(\"Martin\", \"Morgan\", role=\"ctb\"))", + "Depends": [ + "methods", + "BiocGenerics", + "S4Vectors (>= 0.47.2)", + "IRanges", + "Biostrings" + ], + "Imports": [ + "stats" + ], + "LinkingTo": [ + "S4Vectors", + "IRanges" + ], + "Suggests": [ + "Rsamtools", + "GenomicAlignments", + "RNAseqData.HNRNPC.bam.chr14", + "BSgenome.Hsapiens.UCSC.hg19", + "testthat", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R cigar_ops_visibility.R explode_cigars.R tabulate_cigar_ops.R cigar_extent.R trim_cigars.R cigars_as_ranges.R project_positions.R project_sequences.R map_ref_ranges_to_query.R", + "git_url": "https://git.bioconductor.org/packages/cigarillo", + "git_branch": "RELEASE_3_22", + "git_last_commit": "8775adf", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre] (ORCID: ), Valerie Obenchain [aut], Michael Lawrence [aut], Patrick Aboyoun [ctb], Fedor Bezrukov [ctb], Martin Morgan [ctb]", + "Maintainer": "Hervé Pagès " }, "circlize": { "Package": "circlize", - "Version": "0.4.16", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "GlobalOptions", - "R", - "colorspace", + "Version": "0.4.17", + "Source": "Repository", + "Type": "Package", + "Title": "Circular Visualization", + "Date": "2025-12-08", + "Authors@R": "person(\"Zuguang\", \"Gu\", email = \"z.gu@dkfz.de\", role = c(\"aut\", \"cre\"), comment = c('ORCID'=\"0000-0002-7395-8709\"))", + "Depends": [ + "R (>= 3.0.0)", + "graphics" + ], + "Imports": [ + "GlobalOptions (>= 0.1.2)", + "shape", "grDevices", - "graphics", - "grid", + "utils", + "stats", + "colorspace", "methods", - "shape", + "grid" + ], + "Suggests": [ + "knitr", + "dendextend (>= 1.0.1)", + "ComplexHeatmap (>= 2.0.0)", + "gridBase", + "png", + "markdown", + "bezier", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "Description": "Circular layout is an efficient way for the visualization of huge amounts of information. Here this package provides an implementation of circular layout generation in R as well as an enhancement of available software. The flexibility of the package is based on the usage of low-level graphics functions such that self-defined high-level graphics can be easily implemented by users for specific purposes. Together with the seamless connection between the powerful computational and visual environment in R, it gives users more convenience and freedom to design figures for better understanding complex patterns behind multiple dimensional data. The package is described in Gu et al. 2014 .", + "URL": "https://github.com/jokergoo/circlize, https://jokergoo.github.io/circlize_book/book/", + "License": "MIT + file LICENSE", + "NeedsCompilation": "no", + "Author": "Zuguang Gu [aut, cre] (ORCID: )", + "Maintainer": "Zuguang Gu ", + "Repository": "CRAN", + "Encoding": "UTF-8" + }, + "class": { + "Package": "class", + "Version": "7.3-23", + "Source": "Repository", + "Priority": "recommended", + "Date": "2025-01-01", + "Depends": [ + "R (>= 3.0.0)", "stats", "utils" ], - "Hash": "bf366c80e2b55a5383b4af8fa2a10b74" + "Imports": [ + "MASS" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Brian.Ripley@R-project.org\"), person(\"William\", \"Venables\", role = \"cph\"))", + "Description": "Various functions for classification, including k-nearest neighbour, Learning Vector Quantization and Self-Organizing Maps.", + "Title": "Functions for Classification", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], William Venables [cph]", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" + }, + "classInt": { + "Package": "classInt", + "Version": "0.4-11", + "Source": "Repository", + "Date": "2025-01-06", + "Title": "Choose Univariate Class Intervals", + "Authors@R": "c( person(\"Roger\", \"Bivand\", role=c(\"aut\", \"cre\"), email=\"Roger.Bivand@nhh.no\", comment=c(ORCID=\"0000-0003-2392-6140\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment=c(ORCID=\"0000-0002-5759-428X\")), person(\"Richard\", \"Dunlap\", role=\"ctb\"), person(\"Diego\", \"Hernangómez\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8457-4658\")), person(\"Hisaji\", \"Ono\", role=\"ctb\"), person(\"Josiah\", \"Parry\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9910-865X\")), person(\"Matthieu\", \"Stigler\", role=\"ctb\", comment =c(ORCID=\"0000-0002-6802-4290\")))", + "Depends": [ + "R (>= 2.2)" + ], + "Imports": [ + "grDevices", + "stats", + "graphics", + "e1071", + "class", + "KernSmooth" + ], + "Suggests": [ + "spData (>= 0.2.6.2)", + "units", + "knitr", + "rmarkdown", + "tinytest" + ], + "NeedsCompilation": "yes", + "Description": "Selected commonly used methods for choosing univariate class intervals for mapping or other graphics purposes.", + "License": "GPL (>= 2)", + "URL": "https://r-spatial.github.io/classInt/, https://github.com/r-spatial/classInt/", + "BugReports": "https://github.com/r-spatial/classInt/issues/", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "VignetteBuilder": "knitr", + "Author": "Roger Bivand [aut, cre] (), Bill Denney [ctb] (), Richard Dunlap [ctb], Diego Hernangómez [ctb] (), Hisaji Ono [ctb], Josiah Parry [ctb] (), Matthieu Stigler [ctb] ()", + "Maintainer": "Roger Bivand ", + "Repository": "CRAN" }, "cli": { "Package": "cli", - "Version": "3.6.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "3.6.5", + "Source": "Repository", + "Title": "Helpers for Developing Command Line Interfaces", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"gabor@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kirill\", \"Müller\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", , \"salim-b@pm.me\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A suite of tools to build attractive command line interfaces ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs, etc. Supports custom themes via a 'CSS'-like language. It also contains a number of lower level 'CLI' elements: rules, boxes, trees, and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI colors and text styles as well.", + "License": "MIT + file LICENSE", + "URL": "https://cli.r-lib.org, https://github.com/r-lib/cli", + "BugReports": "https://github.com/r-lib/cli/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "utils" ], - "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52" + "Suggests": [ + "callr", + "covr", + "crayon", + "digest", + "glue (>= 1.6.0)", + "grDevices", + "htmltools", + "htmlwidgets", + "knitr", + "methods", + "processx", + "ps (>= 1.3.4.9000)", + "rlang (>= 1.0.2.9003)", + "rmarkdown", + "rprojroot", + "rstudioapi", + "testthat (>= 3.2.0)", + "tibble", + "whoami", + "withr" + ], + "Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc, fansi, prettyunits, sessioninfo, tidyverse/tidytemplate, usethis, vctrs", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Hadley Wickham [ctb], Kirill Müller [ctb], Salim Brüggemann [ctb] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "clipr": { "Package": "clipr", "Version": "0.8.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Read and Write from the System Clipboard", + "Authors@R": "c( person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4387-3384\")), person(\"Louis\", \"Maddox\", role = \"ctb\"), person(\"Steve\", \"Simpson\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\") )", + "Description": "Simple utility functions to read from and write to the Windows, OS X, and X11 clipboards.", + "License": "GPL-3", + "URL": "https://github.com/mdlincoln/clipr, http://matthewlincoln.net/clipr/", + "BugReports": "https://github.com/mdlincoln/clipr/issues", + "Imports": [ "utils" ], - "Hash": "3f038e5ac7f41d4ac41ce658c85e3042" + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "rstudioapi (>= 0.5)", + "testthat (>= 2.0.0)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.1.2", + "SystemRequirements": "xclip (https://github.com/astrand/xclip) or xsel (http://www.vergenet.net/~conrad/software/xsel/) for accessing the X11 clipboard, or wl-clipboard (https://github.com/bugaevc/wl-clipboard) for systems using Wayland.", + "NeedsCompilation": "no", + "Author": "Matthew Lincoln [aut, cre] (), Louis Maddox [ctb], Steve Simpson [ctb], Jennifer Bryan [ctb]", + "Maintainer": "Matthew Lincoln ", + "Repository": "CRAN" }, "clue": { "Package": "clue", - "Version": "0.3-65", + "Version": "0.3-66", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Encoding": "UTF-8", + "Title": "Cluster Ensembles", + "Description": "CLUster Ensembles.", + "Authors@R": "c(person(\"Kurt\", \"Hornik\", role = c(\"aut\", \"cre\"), email = \"Kurt.Hornik@R-project.org\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"Walter\", \"Böhm\", role = \"ctb\"))", + "License": "GPL-2", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "stats", "cluster", "graphics", - "methods", - "stats" + "methods" + ], + "Suggests": [ + "e1071", + "lpSolve (>= 5.5.7)", + "quadprog (>= 1.4-8)", + "relations" + ], + "Enhances": [ + "RWeka", + "ape", + "cba", + "cclust", + "flexclust", + "flexmix", + "kernlab", + "mclust", + "movMF", + "modeltools" ], - "Hash": "d6b53853800595408a776900bcc0c23f" + "NeedsCompilation": "yes", + "Author": "Kurt Hornik [aut, cre] (), Walter Böhm [ctb]", + "Maintainer": "Kurt Hornik ", + "Repository": "CRAN" }, "cluster": { "Package": "cluster", - "Version": "2.1.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", + "Version": "2.1.8.1", + "Source": "Repository", + "VersionNote": "Last CRAN: 2.1.8 on 2024-12-10; 2.1.7 on 2024-12-06; 2.1.6 on 2023-11-30; 2.1.5 on 2023-11-27", + "Date": "2025-03-11", + "Priority": "recommended", + "Title": "\"Finding Groups in Data\": Cluster Analysis Extended Rousseeuw et al.", + "Description": "Methods for Cluster analysis. Much extended the original from Peter Rousseeuw, Anja Struyf and Mia Hubert, based on Kaufman and Rousseeuw (1990) \"Finding Groups in Data\".", + "Maintainer": "Martin Maechler ", + "Authors@R": "c(person(\"Martin\",\"Maechler\", role = c(\"aut\",\"cre\"), email=\"maechler@stat.math.ethz.ch\", comment = c(ORCID = \"0000-0002-8685-9910\")) ,person(\"Peter\", \"Rousseeuw\", role=\"aut\", email=\"peter.rousseeuw@kuleuven.be\", comment = c(\"Fortran original\", ORCID = \"0000-0002-3807-5353\")) ,person(\"Anja\", \"Struyf\", role=\"aut\", comment= \"S original\") ,person(\"Mia\", \"Hubert\", role=\"aut\", email= \"Mia.Hubert@uia.ua.ac.be\", comment = c(\"S original\", ORCID = \"0000-0001-6398-4850\")) ,person(\"Kurt\", \"Hornik\", role=c(\"trl\", \"ctb\"), email=\"Kurt.Hornik@R-project.org\", comment=c(\"port to R; maintenance(1999-2000)\", ORCID=\"0000-0003-4198-9911\")) ,person(\"Matthias\", \"Studer\", role=\"ctb\") ,person(\"Pierre\", \"Roudier\", role=\"ctb\") ,person(\"Juan\", \"Gonzalez\", role=\"ctb\") ,person(\"Kamil\", \"Kozlowski\", role=\"ctb\") ,person(\"Erich\", \"Schubert\", role=\"ctb\", comment = c(\"fastpam options for pam()\", ORCID = \"0000-0001-9143-4880\")) ,person(\"Keefe\", \"Murphy\", role=\"ctb\", comment = \"volume.ellipsoid({d >= 3})\") #not yet ,person(\"Fischer-Rasmussen\", \"Kasper\", role = \"ctb\", comment = \"Gower distance for CLARA\") )", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "graphics", + "grDevices", "stats", "utils" ], - "Hash": "0aaa05204035dc43ea0004b9c76611dd" + "Suggests": [ + "MASS", + "Matrix" + ], + "SuggestsNote": "MASS: two examples using cov.rob() and mvrnorm(); Matrix tools for testing", + "Enhances": [ + "mvoutlier", + "fpc", + "ellipse", + "sfsmisc" + ], + "EnhancesNote": "xref-ed in man/*.Rd", + "LazyLoad": "yes", + "LazyData": "yes", + "ByteCompile": "yes", + "BuildResaveData": "no", + "License": "GPL (>= 2)", + "URL": "https://svn.r-project.org/R-packages/trunk/cluster/", + "NeedsCompilation": "yes", + "Author": "Martin Maechler [aut, cre] (), Peter Rousseeuw [aut] (Fortran original, ), Anja Struyf [aut] (S original), Mia Hubert [aut] (S original, ), Kurt Hornik [trl, ctb] (port to R; maintenance(1999-2000), ), Matthias Studer [ctb], Pierre Roudier [ctb], Juan Gonzalez [ctb], Kamil Kozlowski [ctb], Erich Schubert [ctb] (fastpam options for pam(), ), Keefe Murphy [ctb] (volume.ellipsoid({d >= 3}))", + "Repository": "CRAN" }, "clusterProfiler": { "Package": "clusterProfiler", - "Version": "4.12.0", + "Version": "4.18.4", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Type": "Package", + "Title": "A universal enrichment tool for interpreting omics data", + "Authors@R": "c( person(given = \"Guangchuang\", family = \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(given = \"Li-Gen\", family = \"Wang\", email = \"reeganwang020@gmail.com\", role = \"ctb\"), person(given = \"Xiao\", family = \"Luo\", email = \"l77880853349@163.com\", role = \"ctb\"), person(given = \"Meijun\", family = \"Chen\", email = \"mjchen1996@outlook.com\", role = \"ctb\"), person(given = \"Giovanni\", family = \"Dall'Olio\", email = \"giovanni.dallolio@upf.edu\", role = \"ctb\"), person(given = \"Wanqian\", family = \"Wei\", email = \"altair_wei@outlook.com\", role = \"ctb\"), person(given = \"Chun-Hui\", family = \"Gao\", email = \"gaospecial@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-1445-7939\")) )", + "Maintainer": "Guangchuang Yu ", + "Description": "This package supports functional characteristics of both coding and non-coding genomics data for thousands of species with up-to-date gene annotation. It provides a universal interface for gene functional annotation from a variety of sources and thus can be applied in diverse scenarios. It provides a tidy interface to access, manipulate, and visualize enrichment results to help users achieve efficient data interpretation. Datasets obtained from multiple treatments and time points can be analyzed and compared in a single run, easily revealing functional consensus and differences among distinct gene clusters.", + "Depends": [ + "R (>= 4.2.0)" + ], + "Imports": [ "AnnotationDbi", - "DOSE", - "GO.db", - "GOSemSim", - "R", - "downloader", + "DOSE (>= 3.23.2)", "dplyr", - "enrichplot", - "gson", + "enrichplot (>= 1.9.3)", + "GO.db", + "GOSemSim (>= 2.27.2)", + "gson (>= 0.0.7)", "httr", "igraph", "magrittr", @@ -2133,1002 +5960,2847 @@ "stats", "tidyr", "utils", - "yulab.utils" + "yulab.utils (>= 0.2.3)" ], - "Hash": "4dcafdc7266ccabdde011cbab04b1730" + "Suggests": [ + "AnnotationHub", + "BiocManager", + "jsonlite", + "readr", + "org.Hs.eg.db", + "quarto", + "testthat" + ], + "VignetteBuilder": "quarto", + "ByteCompile": "true", + "License": "Artistic-2.0", + "URL": "https://yulab-smu.top/contribution-knowledge-mining/", + "BugReports": "https://github.com/YuLab-SMU/clusterProfiler/issues", + "biocViews": "Annotation, Clustering, GeneSetEnrichment, GO, KEGG, MultipleComparison, Pathways, Reactome, Visualization", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "git_url": "https://git.bioconductor.org/packages/clusterProfiler", + "git_branch": "RELEASE_3_22", + "git_last_commit": "16e6517", + "git_last_commit_date": "2025-12-15", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre, cph] (ORCID: ), Li-Gen Wang [ctb], Xiao Luo [ctb], Meijun Chen [ctb], Giovanni Dall'Olio [ctb], Wanqian Wei [ctb], Chun-Hui Gao [ctb] (ORCID: )" }, "coda": { "Package": "coda", "Version": "0.19-4.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Date": "2020-09-30", + "Title": "Output Analysis and Diagnostics for MCMC", + "Authors@R": "c(person(\"Martyn\", \"Plummer\", role=c(\"aut\",\"cre\",\"trl\"), email=\"martyn.plummer@gmail.com\"), person(\"Nicky\", \"Best\", role=\"aut\"), person(\"Kate\", \"Cowles\", role=\"aut\"), person(\"Karen\", \"Vines\", role=\"aut\"), person(\"Deepayan\", \"Sarkar\", role=\"aut\"), person(\"Douglas\", \"Bates\", role=\"aut\"), person(\"Russell\", \"Almond\", role=\"aut\"), person(\"Arni\", \"Magnusson\", role=\"aut\"))", + "Depends": [ + "R (>= 2.14.0)" + ], + "Imports": [ "lattice" ], - "Hash": "af436915c590afc6fffc3ce3a5be1569" + "Description": "Provides functions for summarizing and plotting the output from Markov Chain Monte Carlo (MCMC) simulations, as well as diagnostic tests of convergence to the equilibrium distribution of the Markov chain.", + "License": "GPL (>= 2)", + "NeedsCompilation": "no", + "Author": "Martyn Plummer [aut, cre, trl], Nicky Best [aut], Kate Cowles [aut], Karen Vines [aut], Deepayan Sarkar [aut], Douglas Bates [aut], Russell Almond [aut], Arni Magnusson [aut]", + "Maintainer": "Martyn Plummer ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "codetools": { "Package": "codetools", "Version": "0.2-20", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Priority": "recommended", + "Author": "Luke Tierney ", + "Description": "Code analysis tools for R.", + "Title": "Code Analysis Tools for R", + "Depends": [ + "R (>= 2.1)" ], - "Hash": "61e097f35917d342622f21cdc79c256e" + "Maintainer": "Luke Tierney ", + "URL": "https://gitlab.com/luke-tierney/codetools", + "License": "GPL", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "colorspace": { "Package": "colorspace", - "Version": "2.1-0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", + "Version": "2.1-2", + "Source": "Repository", + "Date": "2025-09-22", + "Title": "A Toolbox for Manipulating and Assessing Colors and Palettes", + "Authors@R": "c(person(given = \"Ross\", family = \"Ihaka\", role = \"aut\", email = \"ihaka@stat.auckland.ac.nz\"), person(given = \"Paul\", family = \"Murrell\", role = \"aut\", email = \"paul@stat.auckland.ac.nz\", comment = c(ORCID = \"0000-0002-3224-8858\")), person(given = \"Kurt\", family = \"Hornik\", role = \"aut\", email = \"Kurt.Hornik@R-project.org\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(given = c(\"Jason\", \"C.\"), family = \"Fisher\", role = \"aut\", email = \"jfisher@usgs.gov\", comment = c(ORCID = \"0000-0001-9032-8912\")), person(given = \"Reto\", family = \"Stauffer\", role = \"aut\", email = \"Reto.Stauffer@uibk.ac.at\", comment = c(ORCID = \"0000-0002-3798-5507\")), person(given = c(\"Claus\", \"O.\"), family = \"Wilke\", role = \"aut\", email = \"wilke@austin.utexas.edu\", comment = c(ORCID = \"0000-0002-7470-9261\")), person(given = c(\"Claire\", \"D.\"), family = \"McWhite\", role = \"aut\", email = \"claire.mcwhite@utmail.utexas.edu\", comment = c(ORCID = \"0000-0001-7346-3047\")), person(given = \"Achim\", family = \"Zeileis\", role = c(\"aut\", \"cre\"), email = \"Achim.Zeileis@R-project.org\", comment = c(ORCID = \"0000-0003-0918-3766\")))", + "Description": "Carries out mapping between assorted color spaces including RGB, HSV, HLS, CIEXYZ, CIELUV, HCL (polar CIELUV), CIELAB, and polar CIELAB. Qualitative, sequential, and diverging color palettes based on HCL colors are provided along with corresponding ggplot2 color scales. Color palette choice is aided by an interactive app (with either a Tcl/Tk or a shiny graphical user interface) and shiny apps with an HCL color picker and a color vision deficiency emulator. Plotting functions for displaying and assessing palettes include color swatches, visualizations of the HCL space, and trajectories in HCL and/or RGB spectrum. Color manipulation functions include: desaturation, lightening/darkening, mixing, and simulation of color vision deficiencies (deutanomaly, protanomaly, tritanomaly). Details can be found on the project web page at and in the accompanying scientific paper: Zeileis et al. (2020, Journal of Statistical Software, ).", + "Depends": [ + "R (>= 3.0.0)", + "methods" + ], + "Imports": [ "graphics", - "methods", + "grDevices", "stats" ], - "Hash": "f20c47fd52fae58b4e377c37bb8c335b" + "Suggests": [ + "datasets", + "utils", + "KernSmooth", + "MASS", + "kernlab", + "mvtnorm", + "vcd", + "tcltk", + "shiny", + "shinyjs", + "ggplot2", + "dplyr", + "scales", + "grid", + "png", + "jpeg", + "knitr", + "rmarkdown", + "RColorBrewer", + "rcartocolor", + "scico", + "viridis", + "wesanderson" + ], + "VignetteBuilder": "knitr", + "License": "BSD_3_clause + file LICENSE", + "URL": "https://colorspace.R-Forge.R-project.org/, https://hclwizard.org/", + "BugReports": "https://colorspace.R-Forge.R-project.org/contact.html", + "LazyData": "yes", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Ross Ihaka [aut], Paul Murrell [aut] (ORCID: ), Kurt Hornik [aut] (ORCID: ), Jason C. Fisher [aut] (ORCID: ), Reto Stauffer [aut] (ORCID: ), Claus O. Wilke [aut] (ORCID: ), Claire D. McWhite [aut] (ORCID: ), Achim Zeileis [aut, cre] (ORCID: )", + "Maintainer": "Achim Zeileis ", + "Repository": "CRAN" }, "commonmark": { "Package": "commonmark", - "Version": "1.9.1", + "Version": "2.0.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "5d8225445acb167abf7797de48b2ee3c" + "Type": "Package", + "Title": "High Performance CommonMark and Github Markdown Rendering in R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", ,\"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"John MacFarlane\", role = \"cph\", comment = \"Author of cmark\"))", + "Description": "The CommonMark specification defines a rationalized version of markdown syntax. This package uses the 'cmark' reference implementation for converting markdown text into various formats including html, latex and groff man. In addition it exposes the markdown parse tree in xml format. Also includes opt-in support for GFM extensions including tables, autolinks, and strikethrough text.", + "License": "BSD_2_clause + file LICENSE", + "URL": "https://docs.ropensci.org/commonmark/ https://ropensci.r-universe.dev/commonmark", + "BugReports": "https://github.com/r-lib/commonmark/issues", + "Suggests": [ + "curl", + "testthat", + "xml2" + ], + "RoxygenNote": "7.3.2", + "Language": "en-US", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), John MacFarlane [cph] (Author of cmark)", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "conflicted": { "Package": "conflicted", "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Title": "An Alternative Conflict Resolution Strategy", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "R's default conflict management system gives the most recently loaded package precedence. This can make it hard to detect conflicts, particularly when they arise because a package update creates ambiguity that did not previously exist. 'conflicted' takes a different approach, making every conflict an error and forcing you to choose which function to use.", + "License": "MIT + file LICENSE", + "URL": "https://conflicted.r-lib.org/, https://github.com/r-lib/conflicted", + "BugReports": "https://github.com/r-lib/conflicted/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ + "cli (>= 3.4.0)", "memoise", - "rlang" + "rlang (>= 1.0.0)" + ], + "Suggests": [ + "callr", + "covr", + "dplyr", + "Matrix", + "methods", + "pkgload", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "bb097fccb22d156624fd07cd2894ddb6" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "cowplot": { "Package": "cowplot", - "Version": "1.1.3", + "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "ggplot2", - "grDevices", + "Title": "Streamlined Plot Theme and Plot Annotations for 'ggplot2'", + "Authors@R": "person( given = \"Claus O.\", family = \"Wilke\", role = c(\"aut\", \"cre\"), email = \"wilke@austin.utexas.edu\", comment = c(ORCID = \"0000-0002-7470-9261\") )", + "Description": "Provides various features that help with creating publication-quality figures with 'ggplot2', such as a set of themes, functions to align plots and arrange them into complex compound figures, and functions that make it easy to annotate plots and or mix plots with images. The package was originally written for internal use in the Wilke lab, hence the name (Claus O. Wilke's plot package). It has also been used extensively in the book Fundamentals of Data Visualization.", + "URL": "https://wilkelab.org/cowplot/", + "BugReports": "https://github.com/wilkelab/cowplot/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "ggplot2 (>= 3.5.2)", "grid", "gtable", + "grDevices", "methods", "rlang", "scales" ], - "Hash": "8ef2084dd7d28847b374e55440e4f8cb" + "License": "GPL-2", + "Suggests": [ + "Cairo", + "covr", + "dplyr", + "forcats", + "gridGraphics (>= 0.4-0)", + "knitr", + "lattice", + "magick", + "maps", + "PASWR", + "patchwork", + "rmarkdown", + "ragg", + "testthat (>= 1.0.0)", + "tidyr", + "vdiffr (>= 0.3.0)", + "VennDiagram" + ], + "VignetteBuilder": "knitr", + "Collate": "'add_sub.R' 'align_plots.R' 'as_grob.R' 'as_gtable.R' 'axis_canvas.R' 'cowplot.R' 'draw.R' 'get_plot_component.R' 'get_axes.R' 'get_titles.R' 'get_legend.R' 'get_panel.R' 'gtable.R' 'key_glyph.R' 'plot_grid.R' 'save.R' 'set_null_device.R' 'setup.R' 'stamp.R' 'themes.R' 'utils_ggplot2.R'", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Claus O. Wilke [aut, cre] (ORCID: )", + "Maintainer": "Claus O. Wilke ", + "Repository": "CRAN" }, "cpp11": { "Package": "cpp11", - "Version": "0.4.7", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Version": "0.5.3", + "Source": "Repository", + "Title": "A C++11 Interface for R's C Interface", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", email = \"davis@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Jim\",\"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Benjamin\", \"Kietzman\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a header only, C++11 interface to R's C interface. Compared to other approaches 'cpp11' strives to be safe against long jumps from the C API as well as C++ exceptions, conform to normal R function semantics and supports interaction with 'ALTREP' vectors.", + "License": "MIT + file LICENSE", + "URL": "https://cpp11.r-lib.org, https://github.com/r-lib/cpp11", + "BugReports": "https://github.com/r-lib/cpp11/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "bench", + "brio", + "callr", + "cli", + "covr", + "decor", + "desc", + "ggplot2", + "glue", + "knitr", + "lobstr", + "mockery", + "progress", + "rmarkdown", + "scales", + "Rcpp", + "testthat (>= 3.2.0)", + "tibble", + "utils", + "vctrs", + "withr" ], - "Hash": "5a295d7d963cc5035284dcdbaf334f4e" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/Needs/cpp11/cpp_register": "brio, cli, decor, desc, glue, tibble, vctrs", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Davis Vaughan [aut, cre] (ORCID: ), Jim Hester [aut] (ORCID: ), Romain François [aut] (ORCID: ), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" }, "crayon": { "Package": "crayon", - "Version": "1.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "1.5.3", + "Source": "Repository", + "Title": "Colored Terminal Output", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Brodie\", \"Gaslam\", , \"brodie.gaslam@yahoo.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The crayon package is now superseded. Please use the 'cli' package for new projects. Colored terminal output on terminals that support 'ANSI' color and highlight codes. It also works in 'Emacs' 'ESS'. 'ANSI' color support is automatically detected. Colors and highlighting can be combined and nested. New styles can also be created easily. This package was inspired by the 'chalk' 'JavaScript' project.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.github.io/crayon/, https://github.com/r-lib/crayon", + "BugReports": "https://github.com/r-lib/crayon/issues", + "Imports": [ "grDevices", "methods", "utils" ], - "Hash": "e8a1e41acf02548751f45c718d55aa6a" + "Suggests": [ + "mockery", + "rstudioapi", + "testthat", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Collate": "'aaa-rstudio-detect.R' 'aaaa-rematch2.R' 'aab-num-ansi-colors.R' 'aac-num-ansi-colors.R' 'ansi-256.R' 'ansi-palette.R' 'combine.R' 'string.R' 'utils.R' 'crayon-package.R' 'disposable.R' 'enc-utils.R' 'has_ansi.R' 'has_color.R' 'link.R' 'styles.R' 'machinery.R' 'parts.R' 'print.R' 'style-var.R' 'show.R' 'string_operations.R'", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Brodie Gaslam [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "crosstalk": { "Package": "crosstalk", - "Version": "1.2.1", + "Version": "1.2.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R6", - "htmltools", + "Type": "Package", + "Title": "Inter-Widget Interactivity for HTML Widgets", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Kristopher Michael\", \"Kowal\", role = c(\"ctb\", \"cph\"), comment = \"es5-shim library\"), person(, \"es5-shim contributors\", role = c(\"ctb\", \"cph\"), comment = \"es5-shim library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\") )", + "Description": "Provides building blocks for allowing HTML widgets to communicate with each other, with Shiny or without (i.e. static .html files). Currently supports linked brushing and filtering.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/crosstalk/, https://github.com/rstudio/crosstalk", + "BugReports": "https://github.com/rstudio/crosstalk/issues", + "Imports": [ + "htmltools (>= 0.3.6)", "jsonlite", - "lazyeval" + "lazyeval", + "R6" + ], + "Suggests": [ + "bslib", + "ggplot2", + "sass", + "shiny", + "testthat (>= 2.1.0)" ], - "Hash": "ab12c7b080a57475248a30f4db6298c0" + "Config/Needs/website": "jcheng5/d3scatter, DT, leaflet, rmarkdown", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Brian Reavis [ctb, cph] (selectize.js library), Kristopher Michael Kowal [ctb, cph] (es5-shim library), es5-shim contributors [ctb, cph] (es5-shim library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "curl": { "Package": "curl", - "Version": "5.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Version": "7.0.0", + "Source": "Repository", + "Type": "Package", + "Title": "A Modern and Flexible Web Client for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Posit Software, PBC\", role = \"cph\"))", + "Description": "Bindings to 'libcurl' for performing fully configurable HTTP/FTP requests where responses can be processed in memory, on disk, or streaming via the callback or connection interfaces. Some knowledge of 'libcurl' is recommended; for a more-user-friendly web client see the 'httr2' package which builds on this package with http specific tools and logic.", + "License": "MIT + file LICENSE", + "SystemRequirements": "libcurl (>= 7.73): libcurl-devel (rpm) or libcurl4-openssl-dev (deb)", + "URL": "https://jeroen.r-universe.dev/curl", + "BugReports": "https://github.com/jeroen/curl/issues", + "Suggests": [ + "spelling", + "testthat (>= 1.0.0)", + "knitr", + "jsonlite", + "later", + "rmarkdown", + "httpuv (>= 1.4.4)", + "webutils" ], - "Hash": "411ca2c03b1ce5f548345d2fc2685f7a" + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 3.0.0)" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Hadley Wickham [ctb], Posit Software, PBC [cph]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "data.table": { "Package": "data.table", - "Version": "1.15.4", + "Version": "1.18.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Extension of `data.frame`", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ "methods" ], - "Hash": "8ee9ac56ef633d0c7cab8b2ca87d683e" + "Suggests": [ + "bit64 (>= 4.0.0)", + "bit (>= 4.0.4)", + "R.utils (>= 2.13.0)", + "xts", + "zoo (>= 1.8-1)", + "yaml", + "knitr", + "markdown" + ], + "Description": "Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, fast add/modify/delete of columns by group using no copies at all, list columns, friendly and fast character-separated-value read/write. Offers a natural and flexible syntax, for faster development.", + "License": "MPL-2.0 | file LICENSE", + "URL": "https://r-datatable.com, https://Rdatatable.gitlab.io/data.table, https://github.com/Rdatatable/data.table", + "BugReports": "https://github.com/Rdatatable/data.table/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "ByteCompile": "TRUE", + "Authors@R": "c( person(\"Tyson\",\"Barrett\", role=c(\"aut\",\"cre\"), email=\"t.barrett88@gmail.com\", comment = c(ORCID=\"0000-0002-2137-1391\")), person(\"Matt\",\"Dowle\", role=\"aut\", email=\"mattjdowle@gmail.com\"), person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"), person(\"Jan\",\"Gorecki\", role=\"aut\", email=\"j.gorecki@wit.edu.pl\"), person(\"Michael\",\"Chirico\", role=\"aut\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\")), person(\"Toby\",\"Hocking\", role=\"aut\", email=\"toby.hocking@r-project.org\", comment = c(ORCID=\"0000-0002-3146-0865\")), person(\"Benjamin\",\"Schwendinger\",role=\"aut\", comment = c(ORCID=\"0000-0003-3315-8114\")), person(\"Ivan\", \"Krylov\", role=\"aut\", email=\"ikrylov@disroot.org\", comment = c(ORCID=\"0000-0002-0172-3812\")), person(\"Pasha\",\"Stetsenko\", role=\"ctb\"), person(\"Tom\",\"Short\", role=\"ctb\"), person(\"Steve\",\"Lianoglou\", role=\"ctb\"), person(\"Eduard\",\"Antonyan\", role=\"ctb\"), person(\"Markus\",\"Bonsch\", role=\"ctb\"), person(\"Hugh\",\"Parsonage\", role=\"ctb\"), person(\"Scott\",\"Ritchie\", role=\"ctb\"), person(\"Kun\",\"Ren\", role=\"ctb\"), person(\"Xianying\",\"Tan\", role=\"ctb\"), person(\"Rick\",\"Saporta\", role=\"ctb\"), person(\"Otto\",\"Seiskari\", role=\"ctb\"), person(\"Xianghui\",\"Dong\", role=\"ctb\"), person(\"Michel\",\"Lang\", role=\"ctb\"), person(\"Watal\",\"Iwasaki\", role=\"ctb\"), person(\"Seth\",\"Wenchel\", role=\"ctb\"), person(\"Karl\",\"Broman\", role=\"ctb\"), person(\"Tobias\",\"Schmidt\", role=\"ctb\"), person(\"David\",\"Arenburg\", role=\"ctb\"), person(\"Ethan\",\"Smith\", role=\"ctb\"), person(\"Francois\",\"Cocquemas\", role=\"ctb\"), person(\"Matthieu\",\"Gomez\", role=\"ctb\"), person(\"Philippe\",\"Chataignon\", role=\"ctb\"), person(\"Nello\",\"Blaser\", role=\"ctb\"), person(\"Dmitry\",\"Selivanov\", role=\"ctb\"), person(\"Andrey\",\"Riabushenko\", role=\"ctb\"), person(\"Cheng\",\"Lee\", role=\"ctb\"), person(\"Declan\",\"Groves\", role=\"ctb\"), person(\"Daniel\",\"Possenriede\", role=\"ctb\"), person(\"Felipe\",\"Parages\", role=\"ctb\"), person(\"Denes\",\"Toth\", role=\"ctb\"), person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"), person(\"Ayappan\",\"Perumal\", role=\"ctb\"), person(\"James\",\"Sams\", role=\"ctb\"), person(\"Martin\",\"Morgan\", role=\"ctb\"), person(\"Michael\",\"Quinn\", role=\"ctb\"), person(given=\"@javrucebo\", role=\"ctb\", comment=\"GitHub user\"), person(\"Marc\",\"Halperin\", role=\"ctb\"), person(\"Roy\",\"Storey\", role=\"ctb\"), person(\"Manish\",\"Saraswat\", role=\"ctb\"), person(\"Morgan\",\"Jacob\", role=\"ctb\"), person(\"Michael\",\"Schubmehl\", role=\"ctb\"), person(\"Davis\",\"Vaughan\", role=\"ctb\"), person(\"Leonardo\",\"Silvestri\", role=\"ctb\"), person(\"Jim\",\"Hester\", role=\"ctb\"), person(\"Anthony\",\"Damico\", role=\"ctb\"), person(\"Sebastian\",\"Freundt\", role=\"ctb\"), person(\"David\",\"Simons\", role=\"ctb\"), person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"), person(\"Cole\",\"Miller\", role=\"ctb\"), person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"), person(\"Vaclav\",\"Tlapak\", role=\"ctb\"), person(\"Kevin\",\"Ushey\", role=\"ctb\"), person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"), person(\"Tony\",\"Fischetti\", role=\"ctb\"), person(\"Ofek\",\"Shilon\", role=\"ctb\"), person(\"Vadim\",\"Khotilovich\", role=\"ctb\"), person(\"Hadley\",\"Wickham\", role=\"ctb\"), person(\"Bennet\",\"Becker\", role=\"ctb\"), person(\"Kyle\",\"Haynes\", role=\"ctb\"), person(\"Boniface Christian\",\"Kamgang\", role=\"ctb\"), person(\"Olivier\",\"Delmarcell\", role=\"ctb\"), person(\"Josh\",\"O'Brien\", role=\"ctb\"), person(\"Dereck\",\"de Mezquita\", role=\"ctb\"), person(\"Michael\",\"Czekanski\", role=\"ctb\"), person(\"Dmitry\", \"Shemetov\", role=\"ctb\"), person(\"Nitish\", \"Jha\", role=\"ctb\"), person(\"Joshua\", \"Wu\", role=\"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role=\"ctb\"), person(\"Anirban\", \"Chetia\", role=\"ctb\"), person(\"Doris\", \"Amoakohene\", role=\"ctb\"), person(\"Angel\", \"Feliz\", role=\"ctb\"), person(\"Michael\",\"Young\", role=\"ctb\"), person(\"Mark\", \"Seeto\", role=\"ctb\"), person(\"Philippe\", \"Grosjean\", role=\"ctb\"), person(\"Vincent\", \"Runge\", role=\"ctb\"), person(\"Christian\", \"Wia\", role=\"ctb\"), person(\"Elise\", \"Maigné\", role=\"ctb\"), person(\"Vincent\", \"Rocher\", role=\"ctb\"), person(\"Vijay\", \"Lulla\", role=\"ctb\"), person(\"Aljaž\", \"Sluga\", role=\"ctb\"), person(\"Bill\", \"Evans\", role=\"ctb\"), person(\"Reino\", \"Bruner\", role=\"ctb\"), person(given=\"@badasahog\", role=\"ctb\", comment=\"GitHub user\"), person(\"Vinit\", \"Thakur\", role=\"ctb\"), person(\"Mukul\", \"Kumar\", role=\"ctb\"), person(\"Ildikó\", \"Czeller\", role=\"ctb\"), person(\"Manmita\", \"Das\", role=\"ctb\") )", + "NeedsCompilation": "yes", + "Author": "Tyson Barrett [aut, cre] (ORCID: ), Matt Dowle [aut], Arun Srinivasan [aut], Jan Gorecki [aut], Michael Chirico [aut] (ORCID: ), Toby Hocking [aut] (ORCID: ), Benjamin Schwendinger [aut] (ORCID: ), Ivan Krylov [aut] (ORCID: ), Pasha Stetsenko [ctb], Tom Short [ctb], Steve Lianoglou [ctb], Eduard Antonyan [ctb], Markus Bonsch [ctb], Hugh Parsonage [ctb], Scott Ritchie [ctb], Kun Ren [ctb], Xianying Tan [ctb], Rick Saporta [ctb], Otto Seiskari [ctb], Xianghui Dong [ctb], Michel Lang [ctb], Watal Iwasaki [ctb], Seth Wenchel [ctb], Karl Broman [ctb], Tobias Schmidt [ctb], David Arenburg [ctb], Ethan Smith [ctb], Francois Cocquemas [ctb], Matthieu Gomez [ctb], Philippe Chataignon [ctb], Nello Blaser [ctb], Dmitry Selivanov [ctb], Andrey Riabushenko [ctb], Cheng Lee [ctb], Declan Groves [ctb], Daniel Possenriede [ctb], Felipe Parages [ctb], Denes Toth [ctb], Mus Yaramaz-David [ctb], Ayappan Perumal [ctb], James Sams [ctb], Martin Morgan [ctb], Michael Quinn [ctb], @javrucebo [ctb] (GitHub user), Marc Halperin [ctb], Roy Storey [ctb], Manish Saraswat [ctb], Morgan Jacob [ctb], Michael Schubmehl [ctb], Davis Vaughan [ctb], Leonardo Silvestri [ctb], Jim Hester [ctb], Anthony Damico [ctb], Sebastian Freundt [ctb], David Simons [ctb], Elliott Sales de Andrade [ctb], Cole Miller [ctb], Jens Peder Meldgaard [ctb], Vaclav Tlapak [ctb], Kevin Ushey [ctb], Dirk Eddelbuettel [ctb], Tony Fischetti [ctb], Ofek Shilon [ctb], Vadim Khotilovich [ctb], Hadley Wickham [ctb], Bennet Becker [ctb], Kyle Haynes [ctb], Boniface Christian Kamgang [ctb], Olivier Delmarcell [ctb], Josh O'Brien [ctb], Dereck de Mezquita [ctb], Michael Czekanski [ctb], Dmitry Shemetov [ctb], Nitish Jha [ctb], Joshua Wu [ctb], Iago Giné-Vázquez [ctb], Anirban Chetia [ctb], Doris Amoakohene [ctb], Angel Feliz [ctb], Michael Young [ctb], Mark Seeto [ctb], Philippe Grosjean [ctb], Vincent Runge [ctb], Christian Wia [ctb], Elise Maigné [ctb], Vincent Rocher [ctb], Vijay Lulla [ctb], Aljaž Sluga [ctb], Bill Evans [ctb], Reino Bruner [ctb], @badasahog [ctb] (GitHub user), Vinit Thakur [ctb], Mukul Kumar [ctb], Ildikó Czeller [ctb], Manmita Das [ctb]", + "Maintainer": "Tyson Barrett ", + "Repository": "CRAN" }, "dbplyr": { "Package": "dbplyr", - "Version": "2.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "DBI", - "R", - "R6", - "blob", - "cli", - "dplyr", - "glue", - "lifecycle", + "Version": "2.5.2", + "Source": "Repository", + "Type": "Package", + "Title": "A 'dplyr' Back End for Databases", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Edgar\", \"Ruiz\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A 'dplyr' back end for databases that allows you to work with remote database tables as if they are in-memory data frames. Basic features works with any database that has a 'DBI' back end; more advanced features require 'SQL' translation to be provided by the package author.", + "License": "MIT + file LICENSE", + "URL": "https://dbplyr.tidyverse.org/, https://github.com/tidyverse/dbplyr", + "BugReports": "https://github.com/tidyverse/dbplyr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "blob (>= 1.2.0)", + "cli (>= 3.6.1)", + "DBI (>= 1.1.3)", + "dplyr (>= 1.1.2)", + "glue (>= 1.6.2)", + "lifecycle (>= 1.0.3)", "magrittr", "methods", - "pillar", - "purrr", - "rlang", - "tibble", - "tidyr", - "tidyselect", + "pillar (>= 1.9.0)", + "purrr (>= 1.0.1)", + "R6 (>= 2.2.2)", + "rlang (>= 1.1.1)", + "tibble (>= 3.2.1)", + "tidyr (>= 1.3.0)", + "tidyselect (>= 1.2.1)", "utils", - "vctrs", - "withr" + "vctrs (>= 0.6.3)", + "withr (>= 2.5.0)" ], - "Hash": "39b2e002522bfd258039ee4e889e0fd1" + "Suggests": [ + "bit64", + "covr", + "knitr", + "Lahman", + "nycflights13", + "odbc (>= 1.4.2)", + "RMariaDB (>= 1.2.2)", + "rmarkdown", + "RPostgres (>= 1.4.5)", + "RPostgreSQL", + "RSQLite (>= 2.3.8)", + "testthat (>= 3.1.10)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Encoding": "UTF-8", + "Language": "en-gb", + "RoxygenNote": "7.3.3", + "Collate": "'db-sql.R' 'utils-check.R' 'import-standalone-types-check.R' 'import-standalone-obj-type.R' 'utils.R' 'sql.R' 'escape.R' 'translate-sql-cut.R' 'translate-sql-quantile.R' 'translate-sql-string.R' 'translate-sql-paste.R' 'translate-sql-helpers.R' 'translate-sql-window.R' 'translate-sql-conditional.R' 'backend-.R' 'backend-access.R' 'backend-hana.R' 'backend-hive.R' 'backend-impala.R' 'verb-copy-to.R' 'backend-mssql.R' 'backend-mysql.R' 'backend-odbc.R' 'backend-oracle.R' 'backend-postgres.R' 'backend-postgres-old.R' 'backend-redshift.R' 'backend-snowflake.R' 'backend-spark-sql.R' 'backend-sqlite.R' 'backend-teradata.R' 'build-sql.R' 'data-cache.R' 'data-lahman.R' 'data-nycflights13.R' 'db-escape.R' 'db-io.R' 'db.R' 'dbplyr.R' 'explain.R' 'ident.R' 'import-standalone-s3-register.R' 'join-by-compat.R' 'join-cols-compat.R' 'lazy-join-query.R' 'lazy-ops.R' 'lazy-query.R' 'lazy-select-query.R' 'lazy-set-op-query.R' 'memdb.R' 'optimise-utils.R' 'pillar.R' 'progress.R' 'sql-build.R' 'query-join.R' 'query-select.R' 'query-semi-join.R' 'query-set-op.R' 'query.R' 'reexport.R' 'remote.R' 'rows.R' 'schema.R' 'simulate.R' 'sql-clause.R' 'sql-expr.R' 'src-sql.R' 'src_dbi.R' 'table-name.R' 'tbl-lazy.R' 'tbl-sql.R' 'test-frame.R' 'testthat.R' 'tidyeval-across.R' 'tidyeval.R' 'translate-sql.R' 'utils-format.R' 'verb-arrange.R' 'verb-compute.R' 'verb-count.R' 'verb-distinct.R' 'verb-do-query.R' 'verb-do.R' 'verb-expand.R' 'verb-fill.R' 'verb-filter.R' 'verb-group_by.R' 'verb-head.R' 'verb-joins.R' 'verb-mutate.R' 'verb-pivot-longer.R' 'verb-pivot-wider.R' 'verb-pull.R' 'verb-select.R' 'verb-set-ops.R' 'verb-slice.R' 'verb-summarise.R' 'verb-uncount.R' 'verb-window.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Maximilian Girlich [aut], Edgar Ruiz [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "digest": { "Package": "digest", - "Version": "0.6.35", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "0.6.39", + "Source": "Repository", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Antoine\", \"Lucas\", role=\"ctb\", comment = c(ORCID = \"0000-0002-8059-9767\")), person(\"Jarek\", \"Tuszynski\", role=\"ctb\"), person(\"Henrik\", \"Bengtsson\", role=\"ctb\", comment = c(ORCID = \"0000-0002-7579-5165\")), person(\"Simon\", \"Urbanek\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2297-1732\")), person(\"Mario\", \"Frasca\", role=\"ctb\"), person(\"Bryan\", \"Lewis\", role=\"ctb\"), person(\"Murray\", \"Stokely\", role=\"ctb\"), person(\"Hannes\", \"Muehleisen\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8552-0029\")), person(\"Duncan\", \"Murdoch\", role=\"ctb\"), person(\"Jim\", \"Hester\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Wush\", \"Wu\", role=\"ctb\", comment = c(ORCID = \"0000-0001-5180-0567\")), person(\"Qiang\", \"Kou\", role=\"ctb\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Thierry\", \"Onkelinx\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8804-4216\")), person(\"Michel\", \"Lang\", role=\"ctb\", comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Viliam\", \"Simko\", role=\"ctb\"), person(\"Kurt\", \"Hornik\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"Radford\", \"Neal\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2473-3407\")), person(\"Kendon\", \"Bell\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9093-8312\")), person(\"Matthew\", \"de Queljoe\", role=\"ctb\"), person(\"Dmitry\", \"Selivanov\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0492-6647\")), person(\"Ion\", \"Suruceanu\", role=\"ctb\", comment = c(ORCID = \"0009-0005-6446-4909\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Dirk\", \"Schumacher\", role=\"ctb\"), person(\"András\", \"Svraka\", role=\"ctb\", comment = c(ORCID = \"0009-0008-8480-1329\")), person(\"Sergey\", \"Fedorov\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5970-7233\")), person(\"Will\", \"Landau\", role=\"ctb\", comment = c(ORCID = \"0000-0003-1878-3253\")), person(\"Floris\", \"Vanderhaeghe\", role=\"ctb\", comment = c(ORCID = \"0000-0002-6378-6229\")), person(\"Kevin\", \"Tappe\", role=\"ctb\"), person(\"Harris\", \"McGehee\", role=\"ctb\"), person(\"Tim\", \"Mastny\", role=\"ctb\"), person(\"Aaron\", \"Peikert\", role=\"ctb\", comment = c(ORCID = \"0000-0001-7813-818X\")), person(\"Mark\", \"van der Loo\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9807-4686\")), person(\"Chris\", \"Muir\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2555-3878\")), person(\"Moritz\", \"Beller\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4852-0526\")), person(\"Sebastian\", \"Campbell\", role=\"ctb\", comment = c(ORCID = \"0009-0000-5948-4503\")), person(\"Winston\", \"Chang\", role=\"ctb\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Dean\", \"Attali\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5645-3493\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Kevin\", \"Ushey\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Carl\", \"Pearson\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0701-7860\")))", + "Date": "2025-11-19", + "Title": "Create Compact Hash Digests of R Objects", + "Description": "Implementation of a function 'digest()' for the creation of hash digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32', 'xxhash', 'murmurhash', 'spookyhash', 'blake3', 'crc32c', 'xxh3_64', and 'xxh3_128' algorithms) permitting easy comparison of R language objects, as well as functions such as 'hmac()' to create hash-based message authentication code. Please note that this package is not meant to be deployed for cryptographic purposes for which more comprehensive (and widely tested) libraries such as 'OpenSSL' should be used.", + "URL": "https://github.com/eddelbuettel/digest, https://eddelbuettel.github.io/digest/, https://dirk.eddelbuettel.com/code/digest.html", + "BugReports": "https://github.com/eddelbuettel/digest/issues", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ "utils" ], - "Hash": "698ece7ba5a4fa4559e3d537e7ec3d31" + "License": "GPL (>= 2)", + "Suggests": [ + "tinytest", + "simplermarkdown", + "rbenchmark" + ], + "VignetteBuilder": "simplermarkdown", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Antoine Lucas [ctb] (ORCID: ), Jarek Tuszynski [ctb], Henrik Bengtsson [ctb] (ORCID: ), Simon Urbanek [ctb] (ORCID: ), Mario Frasca [ctb], Bryan Lewis [ctb], Murray Stokely [ctb], Hannes Muehleisen [ctb] (ORCID: ), Duncan Murdoch [ctb], Jim Hester [ctb] (ORCID: ), Wush Wu [ctb] (ORCID: ), Qiang Kou [ctb] (ORCID: ), Thierry Onkelinx [ctb] (ORCID: ), Michel Lang [ctb] (ORCID: ), Viliam Simko [ctb], Kurt Hornik [ctb] (ORCID: ), Radford Neal [ctb] (ORCID: ), Kendon Bell [ctb] (ORCID: ), Matthew de Queljoe [ctb], Dmitry Selivanov [ctb] (ORCID: ), Ion Suruceanu [ctb] (ORCID: ), Bill Denney [ctb] (ORCID: ), Dirk Schumacher [ctb], András Svraka [ctb] (ORCID: ), Sergey Fedorov [ctb] (ORCID: ), Will Landau [ctb] (ORCID: ), Floris Vanderhaeghe [ctb] (ORCID: ), Kevin Tappe [ctb], Harris McGehee [ctb], Tim Mastny [ctb], Aaron Peikert [ctb] (ORCID: ), Mark van der Loo [ctb] (ORCID: ), Chris Muir [ctb] (ORCID: ), Moritz Beller [ctb] (ORCID: ), Sebastian Campbell [ctb] (ORCID: ), Winston Chang [ctb] (ORCID: ), Dean Attali [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Kevin Ushey [ctb] (ORCID: ), Carl Pearson [ctb] (ORCID: )", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" + }, + "dir.expiry": { + "Package": "dir.expiry", + "Version": "1.18.0", + "Source": "Bioconductor", + "Date": "2024-10-17", + "Title": "Managing Expiration for Cache Directories", + "Description": "Implements an expiration system for access to versioned directories. Directories that have not been accessed by a registered function within a certain time frame are deleted. This aims to reduce disk usage by eliminating obsolete caches generated by old versions of packages.", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "License": "GPL-3", + "Imports": [ + "utils", + "filelock" + ], + "Suggests": [ + "rmarkdown", + "knitr", + "testthat", + "BiocStyle" + ], + "biocViews": "Software, Infrastructure", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "git_url": "https://git.bioconductor.org/packages/dir.expiry", + "git_branch": "RELEASE_3_22", + "git_last_commit": "6d768b3", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [aut, cre]", + "Maintainer": "Aaron Lun " }, "doParallel": { "Package": "doParallel", "Version": "1.0.17", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "foreach", - "iterators", + "Type": "Package", + "Title": "Foreach Parallel Adaptor for the 'parallel' Package", + "Authors@R": "c(person(\"Folashade\", \"Daniel\", role=\"cre\", email=\"fdaniel@microsoft.com\"), person(\"Microsoft\", \"Corporation\", role=c(\"aut\", \"cph\")), person(\"Steve\", \"Weston\", role=\"aut\"), person(\"Dan\", \"Tenenbaum\", role=\"ctb\"))", + "Description": "Provides a parallel backend for the %dopar% function using the parallel package.", + "Depends": [ + "R (>= 2.14.0)", + "foreach (>= 1.2.0)", + "iterators (>= 1.0.0)", "parallel", "utils" ], - "Hash": "451e5edf411987991ab6a5410c45011f" - }, - "downloader": { - "Package": "downloader", - "Version": "0.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "digest", - "utils" + "Suggests": [ + "caret", + "mlbench", + "rpart", + "RUnit" + ], + "Enhances": [ + "compiler" ], - "Hash": "f4f2a915e0dedbdf016a83b63477349f" + "License": "GPL-2", + "URL": "https://github.com/RevolutionAnalytics/doparallel", + "BugReports": "https://github.com/RevolutionAnalytics/doparallel/issues", + "NeedsCompilation": "no", + "Author": "Folashade Daniel [cre], Microsoft Corporation [aut, cph], Steve Weston [aut], Dan Tenenbaum [ctb]", + "Maintainer": "Folashade Daniel ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "dplyr": { "Package": "dplyr", - "Version": "1.1.4", + "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", + "Type": "Package", + "Title": "A Grammar of Data Manipulation", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Kirill\", \"Müller\", role = \"aut\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A fast, consistent tool for working with data frame like objects, both in memory and out of memory.", + "License": "MIT + file LICENSE", + "URL": "https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr", + "BugReports": "https://github.com/tidyverse/dplyr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli (>= 3.6.2)", "generics", - "glue", - "lifecycle", - "magrittr", + "glue (>= 1.3.2)", + "lifecycle (>= 1.0.5)", + "magrittr (>= 1.5)", "methods", - "pillar", - "rlang", - "tibble", - "tidyselect", + "pillar (>= 1.9.0)", + "R6", + "rlang (>= 1.1.7)", + "tibble (>= 3.2.0)", + "tidyselect (>= 1.2.0)", "utils", - "vctrs" + "vctrs (>= 0.7.1)" + ], + "Suggests": [ + "broom", + "covr", + "DBI", + "dbplyr (>= 2.2.1)", + "ggplot2", + "knitr", + "Lahman", + "lobstr", + "nycflights13", + "purrr", + "rmarkdown", + "RSQLite", + "stringi (>= 1.7.6)", + "testthat (>= 3.1.5)", + "tidyr (>= 1.3.0)", + "withr" ], - "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Romain François [aut] (ORCID: ), Lionel Henry [aut], Kirill Müller [aut] (ORCID: ), Davis Vaughan [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "dqrng": { "Package": "dqrng", - "Version": "0.3.2", + "Version": "0.4.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "BH", - "R", + "Type": "Package", + "Title": "Fast Pseudo Random Number Generators", + "Authors@R": "c( person(\"Ralf\", \"Stubner\", email = \"ralf.stubner@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0009-0009-1908-106X\")), person(\"daqana GmbH\", role = \"cph\"), person(\"David Blackman\", role = \"cph\", comment = \"Xoroshiro / Xoshiro family\"), person(\"Melissa O'Neill\", email = \"oneill@pcg-random.org\", role = \"cph\", comment = \"PCG family\"), person(\"Sebastiano Vigna\", email = \"vigna@acm.org\", role = \"cph\", comment = \"Xoroshiro / Xoshiro family\"), person(\"Aaron\", \"Lun\", role=\"ctb\"), person(\"Kyle\", \"Butts\", role = \"ctb\", email = \"kyle.butts@colorado.edu\"), person(\"Henrik\", \"Sloot\", role = \"ctb\"), person(\"Philippe\", \"Grosjean\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0002-2694-9471\")) )", + "Description": "Several fast random number generators are provided as C++ header only libraries: The PCG family by O'Neill (2014 ) as well as the Xoroshiro / Xoshiro family by Blackman and Vigna (2021 ). In addition fast functions for generating random numbers according to a uniform, normal and exponential distribution are included. The latter two use the Ziggurat algorithm originally proposed by Marsaglia and Tsang (2000, ). The fast sampling methods support unweighted sampling both with and without replacement. These functions are exported to R and as a C++ interface and are enabled for use with the default 64 bit generator from the PCG family, Xoroshiro128+/++/** and Xoshiro256+/++/** as well as the 64 bit version of the 20 rounds Threefry engine (Salmon et al., 2011, ) as provided by the package 'sitmo'.", + "License": "AGPL-3", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "Rcpp (>= 0.12.16)" + ], + "LinkingTo": [ "Rcpp", + "BH (>= 1.64.0-1)", + "sitmo (>= 2.0.0)" + ], + "RoxygenNote": "7.3.1", + "Suggests": [ + "BH", + "testthat", + "knitr", + "rmarkdown", + "mvtnorm (>= 1.2-3)", + "bench", "sitmo" ], - "Hash": "824df2aeba88d701df5e79018b35b815" + "VignetteBuilder": "knitr", + "URL": "https://daqana.github.io/dqrng/, https://github.com/daqana/dqrng", + "BugReports": "https://github.com/daqana/dqrng/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Ralf Stubner [aut, cre] (), daqana GmbH [cph], David Blackman [cph] (Xoroshiro / Xoshiro family), Melissa O'Neill [cph] (PCG family), Sebastiano Vigna [cph] (Xoroshiro / Xoshiro family), Aaron Lun [ctb], Kyle Butts [ctb], Henrik Sloot [ctb], Philippe Grosjean [ctb] ()", + "Maintainer": "Ralf Stubner ", + "Repository": "CRAN" }, "dtplyr": { "Package": "dtplyr", - "Version": "1.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "data.table", - "dplyr", + "Version": "1.3.3", + "Source": "Repository", + "Title": "Data Table Back-End for 'dplyr'", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"cre\", \"aut\")), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Mark\", \"Fairbanks\", role = \"aut\"), person(\"Ryan\", \"Dickerson\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a data.table backend for 'dplyr'. The goal of 'dtplyr' is to allow you to write 'dplyr' code that is automatically translated to the equivalent, but usually much faster, data.table code.", + "License": "MIT + file LICENSE", + "URL": "https://dtplyr.tidyverse.org, https://github.com/tidyverse/dtplyr", + "BugReports": "https://github.com/tidyverse/dtplyr/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "data.table (>= 1.13.0)", + "dplyr (>= 1.1.0)", "glue", "lifecycle", - "rlang", + "rlang (>= 1.0.4)", "tibble", - "tidyselect", - "vctrs" + "tidyselect (>= 1.2.0)", + "vctrs (>= 0.4.1)" + ], + "Suggests": [ + "bench", + "covr", + "knitr", + "rmarkdown", + "testthat (>= 3.1.2)", + "tidyr (>= 1.1.0)", + "waldo (>= 0.3.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [cre, aut], Maximilian Girlich [aut], Mark Fairbanks [aut], Ryan Dickerson [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "e1071": { + "Package": "e1071", + "Version": "1.7-17", + "Source": "Repository", + "Title": "Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien", + "Imports": [ + "graphics", + "grDevices", + "class", + "stats", + "methods", + "utils", + "proxy" + ], + "Suggests": [ + "cluster", + "mlbench", + "nnet", + "randomForest", + "rpart", + "SparseM", + "xtable", + "Matrix", + "MASS", + "slam" ], - "Hash": "54ed3ea01b11e81a86544faaecfef8e2" + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")), person(given = \"Evgenia\", family = \"Dimitriadou\", role = c(\"aut\",\"cph\")), person(given = \"Kurt\", family = \"Hornik\", role = \"aut\", email = \"Kurt.Hornik@R-project.org\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(given = \"Andreas\", family = \"Weingessel\", role = \"aut\"), person(given = \"Friedrich\", family = \"Leisch\", role = \"aut\"), person(given = \"Chih-Chung\", family = \"Chang\", role = c(\"ctb\",\"cph\"), comment = \"libsvm C++-code\"), person(given = \"Chih-Chen\", family = \"Lin\", role = c(\"ctb\",\"cph\"), comment = \"libsvm C++-code\"))", + "Description": "Functions for latent class analysis, short time Fourier transform, fuzzy clustering, support vector machines, shortest path computation, bagged clustering, naive Bayes classifier, generalized k-nearest neighbour ...", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "NeedsCompilation": "yes", + "Author": "David Meyer [aut, cre] (ORCID: ), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (ORCID: ), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code)", + "Maintainer": "David Meyer ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "edgeR": { "Package": "edgeR", - "Version": "4.2.0", + "Version": "4.8.2", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", - "Rcpp", - "graphics", - "limma", - "locfit", + "Date": "2025-12-23", + "Title": "Empirical Analysis of Digital Gene Expression Data in R", + "Description": "Differential expression analysis of sequence count data. Implements a range of statistical methodology based on the negative binomial distributions, including empirical Bayes estimation, exact tests, generalized linear models, quasi-likelihood, and gene set enrichment. Can perform differential analyses of any type of omics data that produces read counts, including RNA-seq, ChIP-seq, ATAC-seq, Bisulfite-seq, SAGE, CAGE, metabolomics, or proteomics spectral counts. RNA-seq analyses can be conducted at the gene or isoform level, and tests can be conducted for differential exon or transcript usage.", + "Author": "Yunshun Chen, Lizhong Chen, Aaron TL Lun, Davis J McCarthy, Pedro Baldoni, Matthew E Ritchie, Belinda Phipson, Yifang Hu, Xiaobei Zhou, Mark D Robinson, Gordon K Smyth", + "Maintainer": "Yunshun Chen , Gordon Smyth , Aaron Lun , Mark Robinson ", + "License": "GPL (>=2)", + "Depends": [ + "R (>= 3.6.0)", + "limma (>= 3.63.6)" + ], + "Imports": [ "methods", + "graphics", "stats", - "utils" + "utils", + "locfit" ], - "Hash": "20783ecb7e7cea3f351e8b21153e3eb8" + "Suggests": [ + "arrow", + "jsonlite", + "knitr", + "Matrix", + "readr", + "rhdf5", + "SeuratObject", + "splines", + "AnnotationDbi", + "Biobase", + "BiocStyle", + "org.Hs.eg.db", + "SummarizedExperiment" + ], + "VignetteBuilder": "knitr", + "URL": "https://bioinf.wehi.edu.au/edgeR/, https://bioconductor.org/packages/edgeR", + "biocViews": "AlternativeSplicing, BatchEffect, Bayesian, BiomedicalInformatics, CellBiology, ChIPSeq, Clustering, Coverage, DifferentialExpression, DifferentialMethylation, DifferentialSplicing, DNAMethylation, Epigenetics, FunctionalGenomics, GeneExpression, GeneSetEnrichment, Genetics, Genetics, ImmunoOncology, MultipleComparison, Normalization, Pathways, Proteomics, QualityControl, Regression, RNASeq, SAGE, Sequencing, SingleCell, SystemsBiology, TimeCourse, Transcription, Transcriptomics", + "NeedsCompilation": "yes", + "git_url": "https://git.bioconductor.org/packages/edgeR", + "git_branch": "RELEASE_3_22", + "git_last_commit": "af0343a", + "git_last_commit_date": "2025-12-23", + "Repository": "Bioconductor 3.22", + "RemoteType": "bioconductor", + "RemoteUrl": "https://github.com/bioc/edgeR", + "RemoteRef": "RELEASE_3_22", + "RemoteSha": "af0343acbb3998d2d2bb3e3d259bbee17a2c8a7e" }, "eds": { "Package": "eds", - "Version": "1.6.0", + "Version": "1.12.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Matrix", + "Title": "eds: Low-level reader for Alevin EDS format", + "Authors@R": "c( person(\"Avi\", \"Srivastava\", role=c(\"aut\",\"cre\"), email=\"asrivastava@cs.stonybrook.edu\"), person(\"Michael\", \"Love\", role=c(\"aut\",\"ctb\")))", + "Description": "This packages provides a single function, readEDS. This is a low-level utility for reading in Alevin EDS format into R. This function is not designed for end-users but instead the package is predominantly for simplifying package dependency graph for other Bioconductor packages.", + "Depends": [ + "Matrix" + ], + "Imports": [ "Rcpp" ], - "Hash": "ab19d02b3418e44d6f32ffb8060427d2" - }, - "ellipsis": { - "Package": "ellipsis", - "Version": "0.3.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "rlang" + "Suggests": [ + "knitr", + "tximportData", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "Rcpp" ], - "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077" + "SystemRequirements": "C++11", + "License": "GPL-2", + "Encoding": "UTF-8", + "URL": "https://github.com/mikelove/eds", + "biocViews": "Sequencing, RNASeq, GeneExpression, SingleCell", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.1.2", + "Config/testthat/edition": "3", + "git_url": "https://git.bioconductor.org/packages/eds", + "git_branch": "RELEASE_3_22", + "git_last_commit": "d2b8448", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Avi Srivastava [aut, cre], Michael Love [aut, ctb]", + "Maintainer": "Avi Srivastava " }, "emdbook": { "Package": "emdbook", - "Version": "1.3.13", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "1.3.14", + "Source": "Repository", + "Type": "Package", + "Title": "Support Functions and Data for \"Ecological Models and Data\"", + "LazyData": "yes", + "Authors@R": "c(person(\"Ben\",\"Bolker\",email=\"bolker@mcmaster.ca\", role=c(\"aut\",\"cre\")), person(\"Sang Woo\",\"Park\",role=\"ctb\"), person(\"James\",\"Vonesh\",role=\"dtc\"), person(\"Jacqueline\",\"Wilson\",role=\"dtc\"), person(\"Russ\",\"Schmitt\",role=\"dtc\"), person(\"Sally\",\"Holbrook\",role=\"dtc\"), person(\"James D.\",\"Thomson\",role=\"dtc\"), person(\"R. Scot\",\"Duncan\",role=\"dtc\") )", + "Description": "Auxiliary functions and data sets for \"Ecological Models and Data\", a book presenting maximum likelihood estimation and related topics for ecologists (ISBN 978-0-691-12522-0).", + "Suggests": [ + "R2jags", + "ellipse", + "SuppDists", + "numDeriv", + "testthat", + "rgl" + ], + "Imports": [ "MASS", - "bbmle", - "coda", "lattice", - "plyr" + "plyr", + "coda", + "bbmle" ], - "Hash": "ed650db9168aeca46d35aa373b12e056" + "License": "GPL", + "URL": "https://math.mcmaster.ca/bolker/emdbook", + "NeedsCompilation": "no", + "Author": "Ben Bolker [aut, cre], Sang Woo Park [ctb], James Vonesh [dtc], Jacqueline Wilson [dtc], Russ Schmitt [dtc], Sally Holbrook [dtc], James D. Thomson [dtc], R. Scot Duncan [dtc]", + "Maintainer": "Ben Bolker ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "emmeans": { "Package": "emmeans", - "Version": "1.10.1", + "Version": "2.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "estimability", + "Type": "Package", + "Title": "Estimated Marginal Means, aka Least-Squares Means", + "Date": "2025-12-10", + "Authors@R": "c(person(\"Russell V.\", \"Lenth\", role = c(\"aut\", \"cph\"), email = \"russell-lenth@uiowa.edu\"), person(\"Julia\", \"Piaskowski\", role = c(\"cre\", \"aut\"), email = \"julia.piask@gmail.com\"), person(\"Balazs\", \"Banfai\", role = \"ctb\"), person(\"Ben\", \"Bolker\", role = \"ctb\"), person(\"Paul\", \"Buerkner\", role = \"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role = \"ctb\"), person(\"Maxime\", \"Hervé\", role = \"ctb\"), person(\"Maarten\", \"Jung\", role = \"ctb\"), person(\"Jonathon\", \"Love\", role = \"ctb\"), person(\"Fernando\", \"Miguez\", role = \"ctb\"), person(\"Hannes\", \"Riebl\", role = \"ctb\"), person(\"Henrik\", \"Singmann\", role = \"ctb\"))", + "Maintainer": "Julia Piaskowski ", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "estimability (>= 1.4.1)", "graphics", "methods", "mvtnorm", "numDeriv", + "rlang", "stats", "utils" ], - "Hash": "4445298c65c50bcb7d33b687e69bb0bd" + "Suggests": [ + "bayesplot", + "bayestestR", + "biglm", + "brms", + "car", + "coda (>= 0.17)", + "compositions", + "ggplot2", + "knitr", + "lattice", + "lme4", + "lmerTest (>= 2.0.32)", + "logspline", + "MASS", + "mediation", + "mgcv", + "multcomp", + "multcompView", + "MuMIn", + "nlme", + "ordinal (>= 2014.11-12)", + "pbkrtest (>= 0.4-1)", + "rmarkdown", + "robmixglm", + "rsm", + "sandwich", + "scales", + "splines", + "testthat", + "tibble", + "xtable (>= 1.8-2)" + ], + "Enhances": [ + "CARBayes", + "coxme", + "gee", + "geepack", + "MCMCglmm", + "MCMCpack", + "mice", + "nnet", + "pscl", + "rstanarm", + "sommer", + "survival" + ], + "URL": "https://rvlenth.github.io/emmeans/,https://rvlenth.github.io/emmeans/", + "BugReports": "https://github.com/rvlenth/emmeans/issues", + "LazyData": "yes", + "ByteCompile": "yes", + "Description": "Obtain estimated marginal means (EMMs) for many linear, generalized linear, and mixed models. Compute contrasts or linear functions of EMMs, trends, and comparisons of slopes. Plots and other displays. Least-squares means are discussed, and the term \"estimated marginal means\" is suggested, in Searle, Speed, and Milliken (1980) Population marginal means in the linear model: An alternative to least squares means, The American Statistician 34(4), 216-221 .", + "License": "GPL-2 | GPL-3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Russell V. Lenth [aut, cph], Julia Piaskowski [cre, aut], Balazs Banfai [ctb], Ben Bolker [ctb], Paul Buerkner [ctb], Iago Giné-Vázquez [ctb], Maxime Hervé [ctb], Maarten Jung [ctb], Jonathon Love [ctb], Fernando Miguez [ctb], Hannes Riebl [ctb], Henrik Singmann [ctb]", + "Repository": "CRAN" }, "enrichplot": { "Package": "enrichplot", - "Version": "1.24.0", + "Version": "1.30.4", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "DOSE", - "GOSemSim", - "R", - "RColorBrewer", - "aplot", - "ggfun", + "Title": "Visualization of Functional Enrichment Result", + "Authors@R": "c( person(given = \"Guangchuang\", family = \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(given = \"Chun-Hui\", family = \"Gao\", email = \"gaospecial@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-1445-7939\")))", + "Description": "The 'enrichplot' package implements several visualization methods for interpreting functional enrichment results obtained from ORA or GSEA analysis. It is mainly designed to work with the 'clusterProfiler' package suite. All the visualization methods are developed based on 'ggplot2' graphics.", + "Depends": [ + "R (>= 4.2.0)" + ], + "Imports": [ + "aplot (>= 0.2.1)", + "DOSE (>= 3.31.2)", + "ggfun (>= 0.1.7)", "ggnewscale", - "ggplot2", - "ggraph", - "ggtree", + "ggplot2 (>= 3.5.0)", + "ggrepel (>= 0.9.0)", + "ggtangle (>= 0.0.9)", "graphics", "grid", "igraph", - "magrittr", "methods", "plyr", "purrr", + "RColorBrewer", "reshape2", "rlang", - "scatterpie", - "shadowtext", "stats", + "tidydr", "utils", - "yulab.utils" + "scatterpie", + "GOSemSim (>= 2.31.2)", + "ggtree", + "yulab.utils (>= 0.1.6)" ], - "Hash": "19039e8a7075c61615d6f1459fb13ec6" + "Suggests": [ + "clusterProfiler", + "dplyr", + "europepmc", + "ggarchery", + "ggupset", + "glue", + "knitr", + "rmarkdown", + "org.Hs.eg.db", + "prettydoc", + "tibble", + "tidyr", + "ggforce", + "ggHoriPlot", + "AnnotationDbi", + "ggplotify", + "ggridges", + "grDevices", + "gridExtra", + "ggstar", + "scales", + "ggtreeExtra" + ], + "VignetteBuilder": "knitr", + "License": "Artistic-2.0", + "URL": "https://yulab-smu.top/contribution-knowledge-mining/", + "BugReports": "https://github.com/GuangchuangYu/enrichplot/issues", + "biocViews": "Annotation, GeneSetEnrichment, GO, KEGG, Pathways, Software, Visualization", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "git_url": "https://git.bioconductor.org/packages/enrichplot", + "git_branch": "RELEASE_3_22", + "git_last_commit": "920c1db", + "git_last_commit_date": "2025-11-30", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre] (ORCID: ), Chun-Hui Gao [ctb] (ORCID: )", + "Maintainer": "Guangchuang Yu " }, "ensembldb": { "Package": "ensembldb", - "Version": "2.28.0", + "Version": "2.34.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationDbi", - "AnnotationFilter", - "Biobase", - "BiocGenerics", - "Biostrings", + "Type": "Package", + "Title": "Utilities to create and use Ensembl-based annotation databases", + "Authors@R": "c(person(given = \"Johannes\", family = \"Rainer\", email = \"johannes.rainer@eurac.edu\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6977-7147\")), person(given = \"Tim\", family = \"Triche\", email = \"tim.triche@usc.edu\", role = \"ctb\"), person(given = \"Christian\", family = \"Weichenberger\", email = \"christian.weichenberger@eurac.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-2176-0274\")), person(given = \"Sebastian\", family = \"Gibb\", email = \"mail@sebastiangibb.de\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7406-4443\")), person(given = \"Laurent\", family = \"Gatto\", email = \"lg390@cam.ac.uk\", role = \"ctb\", comment = c(ORCID = \"0000-0002-1520-2268\")), person(given = \"Boyu\", family = \"Yu\", email = \"boyu.yu.tim@gmail.com\", role = \"ctb\"))", + "Author": "Johannes Rainer with contributions from Tim Triche, Sebastian Gibb, Laurent Gatto Christian Weichenberger and Boyu Yu.", + "Maintainer": "Johannes Rainer ", + "URL": "https://github.com/jorainer/ensembldb", + "BugReports": "https://github.com/jorainer/ensembldb/issues", + "Imports": [ + "methods", + "RSQLite (>= 1.1)", "DBI", - "GenomeInfoDb", - "GenomicFeatures", - "GenomicRanges", - "IRanges", - "ProtGenerics", - "R", - "RSQLite", + "Biobase", + "Seqinfo", + "GenomeInfoDb (>= 1.45.5)", + "AnnotationDbi (>= 1.31.19)", + "rtracklayer (>= 1.69.1)", + "S4Vectors (>= 0.23.10)", "Rsamtools", - "S4Vectors", - "curl", - "methods", - "rtracklayer" + "IRanges (>= 2.13.24)", + "ProtGenerics", + "Biostrings (>= 2.77.2)", + "curl" + ], + "Depends": [ + "R (>= 3.5.0)", + "BiocGenerics (>= 0.15.10)", + "GenomicRanges (>= 1.61.1)", + "GenomicFeatures (>= 1.61.4)", + "AnnotationFilter (>= 1.5.2)" + ], + "Suggests": [ + "BiocStyle", + "knitr", + "EnsDb.Hsapiens.v86 (>= 0.99.8)", + "testthat", + "BSgenome.Hsapiens.NCBI.GRCh38", + "ggbio (>= 1.24.0)", + "Gviz (>= 1.20.0)", + "rmarkdown", + "AnnotationHub" + ], + "Enhances": [ + "RMariaDB", + "shiny" + ], + "VignetteBuilder": "knitr", + "Description": "The package provides functions to create and use transcript centric annotation databases/packages. The annotation for the databases are directly fetched from Ensembl using their Perl API. The functionality and data is similar to that of the TxDb packages from the GenomicFeatures package, but, in addition to retrieve all gene/transcript models and annotations from the database, ensembldb provides a filter framework allowing to retrieve annotations for specific entries like genes encoded on a chromosome region or transcript models of lincRNA genes. EnsDb databases built with ensembldb contain also protein annotations and mappings between proteins and their encoding transcripts. Finally, ensembldb provides functions to map between genomic, transcript and protein coordinates.", + "Collate": "'Classes.R' 'Deprecated.R' 'Generics.R' 'Methods-Filter.R' 'Methods.R' 'dbhelpers.R' 'functions-EnsDb.R' 'functions-Filter.R' 'functions-create-EnsDb.R' 'functions-utils.R' 'proteinToX.R' 'transcriptToX.R' 'genomeToX.R' 'select-methods.R' 'seqname-utils.R' 'zzz.R'", + "biocViews": "Genetics, AnnotationData, Sequencing, Coverage", + "License": "LGPL", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/ensembldb", + "git_branch": "RELEASE_3_22", + "git_last_commit": "a13967b", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no" + }, + "escheR": { + "Package": "escheR", + "Version": "1.10.0", + "Source": "Bioconductor", + "Title": "Unified multi-dimensional visualizations with Gestalt principles", + "Authors@R": "c( person(\"Boyi\", \"Guo\", email = \"boyi.guo.work@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-2950-2349\")), person(c(\"Stephanie\", \"C.\"), \"Hicks\", role = c(\"aut\"), email = \"shicks19@jhu.edu\", comment = c(ORCID = \"0000-0002-7858-0231\")), person(c(\"Erik\", \"D.\"), \"Nelson\", email = \"erik.nelson116@gmail.com\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0001-8477-0982\")) )", + "Description": "The creation of effective visualizations is a fundamental component of data analysis. In biomedical research, new challenges are emerging to visualize multi-dimensional data in a 2D space, but current data visualization tools have limited capabilities. To address this problem, we leverage Gestalt principles to improve the design and interpretability of multi-dimensional data in 2D data visualizations, layering aesthetics to display multiple variables. The proposed visualization can be applied to spatially-resolved transcriptomics data, but also broadly to data visualized in 2D space, such as embedding visualizations. We provide this open source R package escheR, which is built off of the state-of-the-art ggplot2 visualization framework and can be seamlessly integrated into genomics toolboxes and workflows.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.2.3", + "biocViews": "Spatial, SingleCell, Transcriptomics, Visualization, Software", + "Depends": [ + "ggplot2", + "R (>= 4.3)" + ], + "Imports": [ + "SpatialExperiment (>= 1.6.1)", + "SingleCellExperiment", + "rlang", + "SummarizedExperiment" ], - "Hash": "f9a5e52468ec832a839c012e15c41c15" + "BugReports": "https://github.com/boyiguo1/escheR/issues", + "URL": "https://github.com/boyiguo1/escheR", + "Suggests": [ + "STexampleData", + "BumpyMatrix", + "knitr", + "rmarkdown", + "BiocStyle", + "ggpubr", + "scran", + "scater", + "scuttle", + "Seurat", + "hexbin" + ], + "VignetteBuilder": "knitr", + "git_url": "https://git.bioconductor.org/packages/escheR", + "git_branch": "RELEASE_3_22", + "git_last_commit": "3f79e54", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Boyi Guo [aut, cre] (ORCID: ), Stephanie C. Hicks [aut] (ORCID: ), Erik D. Nelson [ctb] (ORCID: )", + "Maintainer": "Boyi Guo " }, "estimability": { "Package": "estimability", - "Version": "1.5", + "Version": "1.5.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "stats" + "Type": "Package", + "Title": "Tools for Assessing Estimability of Linear Predictions", + "Date": "2024-05-12", + "Authors@R": "c(person(\"Russell\", \"Lenth\", role = c(\"aut\", \"cre\", \"cph\"), email = \"russell-lenth@uiowa.edu\"))", + "Depends": [ + "stats", + "R(>= 4.1.0)" + ], + "Suggests": [ + "knitr", + "rmarkdown" ], - "Hash": "0d5f495f1edc281fca2510d8dabcba0f" + "Description": "Provides tools for determining estimability of linear functions of regression coefficients, and 'epredict' methods that handle non-estimable cases correctly. Estimability theory is discussed in many linear-models textbooks including Chapter 3 of Monahan, JF (2008), \"A Primer on Linear Models\", Chapman and Hall (ISBN 978-1-4200-6201-4).", + "URL": "https://github.com/rvlenth/estimability, https://rvlenth.github.io/estimability/", + "BugReports": "https://github.com/rvlenth/estimability/issues", + "ByteCompile": "yes", + "License": "GPL (>= 3)", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Russell Lenth [aut, cre, cph]", + "Maintainer": "Russell Lenth ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "etrunct": { "Package": "etrunct", "Version": "0.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "d1cdcd7d3ee4de411b7a29877a5e322a" + "Type": "Package", + "Title": "Computes Moments of Univariate Truncated t Distribution", + "Author": "Matthew Stephens", + "Maintainer": "Matthew Stephens ", + "Description": "Computes moments of univariate truncated t distribution. There is only one exported function, e_trunct(), which should be seen for details.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "5.0.1", + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Repository": "CRAN" }, "evaluate": { "Package": "evaluate", - "Version": "0.23", + "Version": "1.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" + "Type": "Package", + "Title": "Parsing and Evaluation Tools that Provide More Details than the Default", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Yihui\", \"Xie\", role = \"aut\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Michael\", \"Lawrence\", role = \"ctb\"), person(\"Thomas\", \"Kluyver\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Adam\", \"Ryczkowski\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Michel\", \"Lang\", role = \"ctb\"), person(\"Karolis\", \"Koncevičius\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Parsing and evaluation tools that make it easy to recreate the command line behaviour of R.", + "License": "MIT + file LICENSE", + "URL": "https://evaluate.r-lib.org/, https://github.com/r-lib/evaluate", + "BugReports": "https://github.com/r-lib/evaluate/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "covr", + "ggplot2 (>= 3.3.6)", + "lattice", + "methods", + "pkgload", + "ragg (>= 1.4.0)", + "rlang (>= 1.1.5)", + "knitr", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "daf4a1246be12c1fa8c7705a0935c1a0" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Yihui Xie [aut] (ORCID: ), Michael Lawrence [ctb], Thomas Kluyver [ctb], Jeroen Ooms [ctb], Barret Schloerke [ctb], Adam Ryczkowski [ctb], Hiroaki Yutani [ctb], Michel Lang [ctb], Karolis Koncevičius [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "exrcise": { "Package": "exrcise", "Version": "0.1.0", "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "AlexsLemonade", - "RemoteRepo": "exrcise", - "RemoteRef": "main", - "RemoteSha": "a496662f8a8a2294366cae4d2f3547c50ac341f1", - "Requirements": [ + "Type": "Package", + "Title": "Selectively Excise Code Chunks for Exercises", + "Authors@R": "person(c(\"Joshua\", \"A.\"), \"Shapiro\", email = \"josh.shapiro@ccdatalab.org\", comment = list(ORCID = \"0000-0002-6224-0347\"), role = c(\"aut\", \"cre\"))", + "Maintainer": "Joshua Shapiro ", + "Description": "This package selectively removes the contents of code chunks from Rmarkdown files to produce new notebooks suitable for live coding instruction or exercises, while preserving the original file as a reference or answer key.", + "License": "BSD_3_clause + file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "Imports": [ "knitr", + "stringr", "magrittr", "purrr", - "readr", - "stringr" + "readr" ], - "Hash": "ba726351afff6ca2957a801ee977f295" - }, - "fansi": { - "Package": "fansi", - "Version": "1.0.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "utils" + "RoxygenNote": "7.1.0", + "Suggests": [ + "testthat" ], - "Hash": "962174cf2aeb5b9eea581522286a911f" + "Author": "Joshua A. Shapiro [aut, cre] (0000-0002-6224-0347)", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteRepo": "exrcise", + "RemoteUsername": "AlexsLemonade", + "RemoteRef": "HEAD", + "RemoteSha": "a496662f8a8a2294366cae4d2f3547c50ac341f1" }, "farver": { "Package": "farver", - "Version": "2.1.1", + "Version": "2.1.2", "Source": "Repository", - "Repository": "CRAN", - "Hash": "8106d78941f34855c440ddb946b8f7a5" + "Type": "Package", + "Title": "High Performance Colour Space Manipulation", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Berendea\", \"Nicolae\", role = \"aut\", comment = \"Author of the ColorSpace C++ library\"), person(\"Romain\", \"François\", , \"romain@purrple.cat\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The encoding of colour can be handled in many different ways, using different colour spaces. As different colour spaces have different uses, efficient conversion between these representations are important. The 'farver' package provides a set of functions that gives access to very fast colour space conversion and comparisons implemented in C++, and offers speed improvements over the 'convertColor' function in the 'grDevices' package.", + "License": "MIT + file LICENSE", + "URL": "https://farver.data-imaginist.com, https://github.com/thomasp85/farver", + "BugReports": "https://github.com/thomasp85/farver/issues", + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (), Berendea Nicolae [aut] (Author of the ColorSpace C++ library), Romain François [aut] (), Posit, PBC [cph, fnd]", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "fastmap": { "Package": "fastmap", - "Version": "1.1.1", + "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "f7736a18de97dea803bde0a2daaafb27" + "Title": "Fast Data Structures", + "Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\") )", + "Description": "Fast implementation of data structures, including a key-value store, stack, and queue. Environments are commonly used as key-value stores in R, but every time a new key is used, it is added to R's global symbol table, causing a small amount of memory leakage. This can be problematic in cases where many different keys are used. Fastmap avoids this memory leak issue by implementing the map using data structures in C++.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat (>= 2.1.1)" + ], + "URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap", + "BugReports": "https://github.com/r-lib/fastmap/issues", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "fastmatch": { "Package": "fastmatch", - "Version": "1.1-4", + "Version": "1.1-8", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Fast 'match()' Function", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Description": "Package providing a fast match() replacement for cases that require repeated look-ups. It is slightly faster that R's built-in match() function on first match against a table, but extremely fast on any subsequent lookup as it keeps the hash table in memory.", + "License": "GPL-2", + "Depends": [ + "R (>= 2.3.0)" ], - "Hash": "8c406b7284bbaef08e01c6687367f195" + "URL": "https://www.rforge.net/fastmatch", + "BugReports": "https://github.com/s-u/fastmatch/issues/", + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "fastqcr": { "Package": "fastqcr", "Version": "0.1.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Quality Control of Sequencing Data", + "Date": "2023-02-18", + "Authors@R": "c( person(\"Alboukadel\", \"Kassambara\", role = c(\"aut\", \"cre\"), email = \"alboukadel.kassambara@gmail.com\") )", + "Description": "'FASTQC' is the most widely used tool for evaluating the quality of high throughput sequencing data. It produces, for each sample, an html report and a compressed file containing the raw data. If you have hundreds of samples, you are not going to open up each 'HTML' page. You need some way of looking at these data in aggregate. 'fastqcr' Provides helper functions to easily parse, aggregate and analyze 'FastQC' reports for large numbers of samples. It provides a convenient solution for building a 'Multi-QC' report, as well as, a 'one-sample' report with result interpretations.", + "License": "GPL-2", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.1.2)" + ], + "Imports": [ "dplyr", - "ggplot2", "grid", "gridExtra", + "ggplot2", "magrittr", - "readr", - "rlang", - "rmarkdown", + "readr (>= 1.3.0)", + "rmarkdown (>= 1.4)", "rvest", - "scales", - "stats", "tibble", "tidyr", + "scales", + "stats", "utils", - "xml2" + "xml2", + "rlang" + ], + "Suggests": [ + "knitr" ], - "Hash": "f7800223e02992c148f627e7f476deff" + "URL": "https://rpkgs.datanovia.com/fastqcr/index.html", + "BugReports": "https://github.com/kassambara/fastqcr/issues", + "RoxygenNote": "7.2.3", + "Collate": "'utilities.R' 'fastqc.R' 'fastqc_install.R' 'qc_aggregate.R' 'qc_plot.R' 'qc_plot_collection.R' 'qc_problems.R' 'qc_read.R' 'qc_read_collection.R' 'qc_report.R' 'qc_unzip.R'", + "NeedsCompilation": "no", + "Author": "Alboukadel Kassambara [aut, cre]", + "Maintainer": "Alboukadel Kassambara ", + "Repository": "CRAN" }, "fftw": { "Package": "fftw", - "Version": "1.0-8", + "Version": "1.0-9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "b3d25ec6e091228e863adc3e672772e4" + "Title": "Fast FFT and DCT Based on the FFTW Library", + "Description": "Provides a simple and efficient wrapper around the fastest Fourier transform in the west (FFTW) library .", + "Authors@R": "c( person(\"Olaf\", \"Mersmann\", email=\"olafm@p-value.net\", role=c(\"aut\")), person(\"Sebastian\", \"Krey\", email=\"skrey@statistik.tu-dortmund.de\", role=c(\"ctb\")), person(\"Uwe\", \"Ligges\", email=\"ligges@statistik.tu-dortmund.de\", role=c(\"ctb\", \"cre\")) )", + "Depends": [ + "R (>= 3.0.0)" + ], + "SystemRequirements": "fftw3 (>= 3.1.2)", + "License": "GPL-2", + "RoxygenNote": "6.0.1", + "NeedsCompilation": "yes", + "Author": "Olaf Mersmann [aut], Sebastian Krey [ctb], Uwe Ligges [ctb, cre]", + "Maintainer": "Uwe Ligges ", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "fgsea": { "Package": "fgsea", - "Version": "1.30.0", + "Version": "1.36.2", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BH", - "BiocParallel", - "Matrix", - "R", + "Title": "Fast Gene Set Enrichment Analysis", + "Authors@R": "c(person(\"Gennady\", \"Korotkevich\", role = \"aut\"), person(\"Vladimir\", \"Sukhov\", role = \"aut\"), person(\"Nikolay\", \"Budin\", role = \"ctb\"), person(\"Nikita\", \"Gusak\", role = \"ctb\"), person(\"Zieman\", \"Mark\", role = \"ctb\"), person(\"Alexey\", \"Sergushichev\", email = \"alsergbox@gmail.com\", role = c(\"aut\", \"cre\")))", + "Description": "The package implements an algorithm for fast gene set enrichment analysis. Using the fast algorithm allows to make more permutations and get more fine grained p-values, which allows to use accurate stantard approaches to multiple hypothesis correction.", + "biocViews": "GeneExpression, DifferentialExpression, GeneSetEnrichment, Pathways", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "Rcpp", - "cowplot", "data.table", - "fastmatch", - "ggplot2", - "grid", - "scales", + "BiocParallel", "stats", + "ggplot2 (>= 2.2.0)", + "cowplot", + "grid", + "fastmatch", + "Matrix", + "scales", "utils" ], - "Hash": "ead409e5a973cd285681c3bb0ade49a7" + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "reactome.db", + "AnnotationDbi", + "parallel", + "org.Mm.eg.db", + "limma", + "GEOquery", + "msigdbr", + "aggregation", + "Seurat" + ], + "License": "MIT + file LICENCE", + "LazyData": "true", + "LinkingTo": [ + "Rcpp", + "BH" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "VignetteBuilder": "knitr", + "URL": "https://github.com/ctlab/fgsea/", + "BugReports": "https://github.com/ctlab/fgsea/issues", + "git_url": "https://git.bioconductor.org/packages/fgsea", + "git_branch": "RELEASE_3_22", + "git_last_commit": "b7862b7", + "git_last_commit_date": "2026-01-05", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Gennady Korotkevich [aut], Vladimir Sukhov [aut], Nikolay Budin [ctb], Nikita Gusak [ctb], Zieman Mark [ctb], Alexey Sergushichev [aut, cre]", + "Maintainer": "Alexey Sergushichev ", + "RemoteType": "bioconductor", + "RemoteUrl": "https://github.com/bioc/fgsea", + "RemoteRef": "RELEASE_3_22", + "RemoteSha": "b7862b78985f52670a13ca46abacb7831e33d5e1" }, "filelock": { "Package": "filelock", "Version": "1.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "192053c276525c8495ccfd523aa8f2d1" + "Title": "Portable File Locking", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Place an exclusive or shared lock on a file. It uses 'LockFile' on Windows and 'fcntl' locks on Unix-like systems.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.github.io/filelock/, https://github.com/r-lib/filelock", + "BugReports": "https://github.com/r-lib/filelock/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Suggests": [ + "callr (>= 2.0.0)", + "covr", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "flexmix": { "Package": "flexmix", - "Version": "2.3-19", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", + "Version": "2.3-20", + "Source": "Repository", + "Type": "Package", + "Title": "Flexible Mixture Modeling", + "Authors@R": "c(person(\"Bettina\", \"Gruen\", role = c(\"aut\", \"cre\"), email = \"Bettina.Gruen@R-project.org\", comment = c(ORCID = \"0000-0001-7265-4773\")), person(\"Friedrich\", \"Leisch\", role = \"aut\", comment = c(ORCID = \"0000-0001-7278-1983\")), person(\"Deepayan\", \"Sarkar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4107-1553\")), person(\"Frederic\", \"Mortier\", role = \"ctb\"), person(\"Nicolas\", \"Picard\", role = \"ctb\", comment = c(ORCID = \"0000-0001-5548-9171\")))", + "Description": "A general framework for finite mixtures of regression models using the EM algorithm is implemented. The E-step and all data handling are provided, while the M-step can be supplied by the user to easily define new models. Existing drivers implement mixtures of standard linear models, generalized linear models and model-based clustering.", + "Depends": [ + "R (>= 2.15.0)", + "lattice" + ], + "Imports": [ "graphics", "grid", - "lattice", + "grDevices", "methods", - "modeltools", + "modeltools (>= 0.2-16)", "nnet", "stats", "stats4", "utils" ], - "Hash": "0cb3c4b251c2d3fd5923d3e7e6021ee2" + "Suggests": [ + "actuar", + "codetools", + "diptest", + "Ecdat", + "ellipse", + "gclus", + "glmnet", + "lme4 (>= 1.1)", + "MASS", + "mgcv (>= 1.8-0)", + "mlbench", + "multcomp", + "mvtnorm", + "SuppDists", + "survival" + ], + "License": "GPL (>= 2)", + "LazyLoad": "yes", + "NeedsCompilation": "no", + "Author": "Bettina Gruen [aut, cre] (), Friedrich Leisch [aut] (), Deepayan Sarkar [ctb] (), Frederic Mortier [ctb], Nicolas Picard [ctb] ()", + "Maintainer": "Bettina Gruen ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, - "fontawesome": { - "Package": "fontawesome", - "Version": "0.5.2", + "fontBitstreamVera": { + "Package": "fontBitstreamVera", + "Version": "0.1.1", + "Source": "Repository", + "Title": "Fonts with 'Bitstream Vera Fonts' License", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel.hry@gmail.com\", c(\"cre\", \"aut\")), person(\"Bitstream\", role = \"cph\"))", + "Description": "Provides fonts licensed under the 'Bitstream Vera Fonts' license for the 'fontquiver' package.", + "Depends": [ + "R (>= 3.0.0)" + ], + "License": "file LICENCE", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "5.0.1", + "NeedsCompilation": "no", + "Author": "Lionel Henry [cre, aut], Bitstream [cph]", + "Maintainer": "Lionel Henry ", + "License_is_FOSS": "yes", + "Repository": "CRAN" + }, + "fontLiberation": { + "Package": "fontLiberation", + "Version": "0.1.0", "Source": "Repository", + "Title": "Liberation Fonts", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", \"cre\"), person(\"Pravin Satpute\", role = \"aut\"), person(\"Steve Matteson\", role = \"aut\"), person(\"Red Hat, Inc\", role = \"cph\"), person(\"Google Corporation\", role = \"cph\"))", + "Description": "A placeholder for the Liberation fontset intended for the `fontquiver` package. This fontset covers the 12 combinations of families (sans, serif, mono) and faces (plain, bold, italic, bold italic) supported in R graphics devices.", + "Depends": [ + "R (>= 3.0)" + ], + "License": "file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "5.0.1", + "NeedsCompilation": "no", + "Author": "Lionel Henry [cre], Pravin Satpute [aut], Steve Matteson [aut], Red Hat, Inc [cph], Google Corporation [cph]", + "Maintainer": "Lionel Henry ", "Repository": "CRAN", - "Requirements": [ - "R", - "htmltools", - "rlang" + "License_is_FOSS": "yes" + }, + "fontawesome": { + "Package": "fontawesome", + "Version": "0.5.3", + "Source": "Repository", + "Type": "Package", + "Title": "Easily Work with 'Font Awesome' Icons", + "Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown' documents and 'Shiny' apps. These icons can be inserted into HTML content through inline 'SVG' tags or 'i' tags. There is also a utility function for exporting 'Font Awesome' icons as 'PNG' images for those situations where raster graphics are needed.", + "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome font\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/fontawesome, https://rstudio.github.io/fontawesome/", + "BugReports": "https://github.com/rstudio/fontawesome/issues", + "Encoding": "UTF-8", + "ByteCompile": "true", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "rlang (>= 1.0.6)", + "htmltools (>= 0.5.1.1)" + ], + "Suggests": [ + "covr", + "dplyr (>= 1.0.8)", + "gt (>= 0.9.0)", + "knitr (>= 1.31)", + "testthat (>= 3.0.0)", + "rsvg" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Richard Iannone [aut, cre] (), Christophe Dervieux [ctb] (), Winston Chang [ctb], Dave Gandy [ctb, cph] (Font-Awesome font), Posit Software, PBC [cph, fnd]", + "Maintainer": "Richard Iannone ", + "Repository": "CRAN" + }, + "fontquiver": { + "Package": "fontquiver", + "Version": "0.2.1", + "Source": "Repository", + "Title": "Set of Installed Fonts", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", c(\"cre\", \"aut\")), person(\"RStudio\", role = \"cph\"), person(\"George Douros\", role = \"cph\", comment = \"Symbola font\"))", + "Description": "Provides a set of fonts with permissive licences. This is useful when you want to avoid system fonts to make sure your outputs are reproducible.", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ + "fontBitstreamVera (>= 0.1.0)", + "fontLiberation (>= 0.1.0)" + ], + "Suggests": [ + "testthat", + "htmltools" ], - "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d" + "License": "GPL-3 | file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "5.0.1", + "Collate": "'font-getters.R' 'fontset.R' 'fontset-bitstream-vera.R' 'fontset-dejavu.R' 'fontset-liberation.R' 'fontset-symbola.R' 'html-dependency.R' 'utils.R'", + "NeedsCompilation": "no", + "Author": "Lionel Henry [cre, aut], RStudio [cph], George Douros [cph] (Symbola font)", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "forcats": { "Package": "forcats", - "Version": "1.0.0", + "Version": "1.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Title": "Tools for Working with Categorical Variables (Factors)", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Helpers for reordering factor levels (including moving specified levels to front, ordering by first appearance, reversing, and randomly shuffling), and tools for modifying factor levels (including collapsing rare levels into other, 'anonymising', and manually 'recoding').", + "License": "MIT + file LICENSE", + "URL": "https://forcats.tidyverse.org/, https://github.com/tidyverse/forcats", + "BugReports": "https://github.com/tidyverse/forcats/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.4.0)", "glue", "lifecycle", "magrittr", - "rlang", + "rlang (>= 1.0.0)", "tibble" ], - "Hash": "1a0a9a3d5083d0d573c4214576f1e690" + "Suggests": [ + "covr", + "dplyr", + "ggplot2", + "knitr", + "readr", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "foreach": { "Package": "foreach", "Version": "1.5.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Provides Foreach Looping Construct", + "Authors@R": "c(person(\"Folashade\", \"Daniel\", role=\"cre\", email=\"fdaniel@microsoft.com\"), person(\"Hong\", \"Ooi\", role=\"ctb\"), person(\"Rich\", \"Calaway\", role=\"ctb\"), person(\"Microsoft\", role=c(\"aut\", \"cph\")), person(\"Steve\", \"Weston\", role=\"aut\"))", + "Description": "Support for the foreach looping construct. Foreach is an idiom that allows for iterating over elements in a collection, without the use of an explicit loop counter. This package in particular is intended to be used for its return value, rather than for its side effects. In that sense, it is similar to the standard lapply function, but doesn't require the evaluation of a function. Using foreach without side effects also facilitates executing the loop in parallel.", + "License": "Apache License (== 2.0)", + "URL": "https://github.com/RevolutionAnalytics/foreach", + "BugReports": "https://github.com/RevolutionAnalytics/foreach/issues", + "Depends": [ + "R (>= 2.5.0)" + ], + "Imports": [ "codetools", - "iterators", - "utils" + "utils", + "iterators" ], - "Hash": "618609b42c9406731ead03adf5379850" + "Suggests": [ + "randomForest", + "doMC", + "doParallel", + "testthat", + "knitr", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.1.1", + "Collate": "'callCombine.R' 'foreach.R' 'do.R' 'foreach-ext.R' 'foreach-pkg.R' 'getDoPar.R' 'getDoSeq.R' 'getsyms.R' 'iter.R' 'nextElem.R' 'onLoad.R' 'setDoPar.R' 'setDoSeq.R' 'times.R' 'utils.R'", + "NeedsCompilation": "no", + "Author": "Folashade Daniel [cre], Hong Ooi [ctb], Rich Calaway [ctb], Microsoft [aut, cph], Steve Weston [aut]", + "Maintainer": "Folashade Daniel ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "formatR": { "Package": "formatR", "Version": "1.14", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Format R Code Automatically", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Ed\", \"Lee\", role = \"ctb\"), person(\"Eugene\", \"Ha\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Pavel\", \"Krivitsky\", role = \"ctb\"), person() )", + "Description": "Provides a function tidy_source() to format R source code. Spaces and indent will be added to the code automatically, and comments will be preserved under certain conditions, so that R code will be more human-readable and tidy. There is also a Shiny app as a user interface in this package (see tidy_app()).", + "Depends": [ + "R (>= 3.2.3)" ], - "Hash": "63cb26d12517c7863f5abb006c5e0f25" + "Suggests": [ + "rstudioapi", + "shiny", + "testit", + "rmarkdown", + "knitr" + ], + "License": "GPL", + "URL": "https://github.com/yihui/formatR", + "BugReports": "https://github.com/yihui/formatR/issues", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), Ed Lee [ctb], Eugene Ha [ctb], Kohske Takahashi [ctb], Pavel Krivitsky [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "fs": { "Package": "fs", - "Version": "1.6.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.6.6", + "Source": "Repository", + "Title": "Cross-Platform File System Operations Based on 'libuv'", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A cross-platform interface to file system operations, built on top of the 'libuv' C library.", + "License": "MIT + file LICENSE", + "URL": "https://fs.r-lib.org, https://github.com/r-lib/fs", + "BugReports": "https://github.com/r-lib/fs/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "methods" ], - "Hash": "15aeb8c27f5ea5161f9f6a641fafd93a" + "Suggests": [ + "covr", + "crayon", + "knitr", + "pillar (>= 1.0.0)", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "tibble (>= 1.1.0)", + "vctrs (>= 0.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "SystemRequirements": "GNU make", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut], Hadley Wickham [aut], Gábor Csárdi [aut, cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "futile.logger": { "Package": "futile.logger", - "Version": "1.4.3", + "Version": "1.4.9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "futile.options", - "lambda.r", - "utils" + "Type": "Package", + "Title": "A Logging Utility for R", + "Date": "2025-12-22", + "Maintainer": "Brian Lee Yung Rowe ", + "Authors@R": "person(given=c(\"Brian\", \"Lee\", \"Yung\"), family=\"Rowe\", role=c(\"aut\", \"cre\"), email=\"r@zatonovo.com\")", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ + "utils", + "lambda.r (>= 1.1.0)", + "futile.options" + ], + "Suggests": [ + "testit", + "jsonlite", + "httr", + "crayon", + "rsyslog", + "glue" ], - "Hash": "99f0ace8c05ec7d3683d27083c4f1e7e" + "Description": "Provides a simple yet powerful logging utility. Based loosely on log4j, futile.logger takes advantage of R idioms to make logging a convenient and easy to use replacement for cat and print statements.", + "License": "LGPL-3", + "LazyLoad": "yes", + "NeedsCompilation": "no", + "ByteCompile": "yes", + "Collate": "'options.R' 'appender.R' 'constants.R' 'layout.R' 'logger.R' 'scat.R' 'util.R' 'futile.logger-package.R'", + "RoxygenNote": "7.1.2", + "URL": "https://github.com/zatonovo/futile.logger", + "Author": "Brian Lee Yung Rowe [aut, cre]", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "futile.options": { "Package": "futile.options", "Version": "1.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Futile Options Management", + "Date": "2018-04-20", + "Author": "Brian Lee Yung Rowe", + "Maintainer": "Brian Lee Yung Rowe ", + "Depends": [ + "R (>= 2.8.0)" ], - "Hash": "0d9bf02413ddc2bbe8da9ce369dcdd2b" + "Description": "A scoped options management framework. Used in other packages.", + "License": "LGPL-3", + "LazyLoad": "yes", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "gargle": { "Package": "gargle", - "Version": "1.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "fs", - "glue", - "httr", + "Version": "1.6.1", + "Source": "Repository", + "Title": "Utilities for Working with Google APIs", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Craig\", \"Citro\", , \"craigcitro@google.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Google Inc\", role = \"cph\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides utilities for working with Google APIs . This includes functions and classes for handling common credential types and for preparing, executing, and processing HTTP requests.", + "License": "MIT + file LICENSE", + "URL": "https://gargle.r-lib.org, https://github.com/r-lib/gargle", + "BugReports": "https://github.com/r-lib/gargle/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.1)", + "fs (>= 1.3.1)", + "glue (>= 1.3.0)", + "httr (>= 1.4.5)", "jsonlite", - "lifecycle", + "lifecycle (>= 0.2.0)", "openssl", "rappdirs", - "rlang", + "rlang (>= 1.1.0)", "stats", "utils", "withr" ], - "Hash": "fc0b272e5847c58cd5da9b20eedbd026" + "Suggests": [ + "aws.ec2metadata", + "aws.signature", + "covr", + "httpuv", + "knitr", + "rmarkdown", + "sodium", + "spelling", + "testthat (>= 3.1.7)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [aut, cre] (ORCID: ), Craig Citro [aut], Hadley Wickham [aut] (ORCID: ), Google Inc [cph], Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "gdtools": { + "Package": "gdtools", + "Version": "0.5.0", + "Source": "Repository", + "Title": "Font Metrics and Font Management Utilities for R Graphics", + "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", , \"jeroen@berkeley.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Yixuan\", \"Qiu\", role = \"ctb\"), person(\"R Core Team\", role = \"cph\", comment = \"Cairo code from X11 device\"), person(\"ArData\", role = \"cph\"), person(\"RStudio\", role = \"cph\") )", + "Description": "Compute text metrics (width, ascent, descent) using 'Cairo' and 'FreeType', independently of the active graphic device. Font lookup is delegated to 'systemfonts'. Additional utilities let users register 'Google Fonts' or bundled 'Liberation' fonts, check font availability, and assemble 'htmlDependency' objects so that fonts are correctly embedded in 'Shiny' applications, 'R Markdown' documents, and 'htmlwidgets' outputs such as 'ggiraph'.", + "License": "GPL-3 | file LICENSE", + "URL": "https://davidgohel.github.io/gdtools/", + "BugReports": "https://github.com/davidgohel/gdtools/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "fontquiver (>= 0.2.0)", + "htmltools", + "Rcpp (>= 0.12.12)", + "systemfonts (>= 1.3.1)", + "tools" + ], + "Suggests": [ + "curl", + "gfonts", + "methods", + "testthat" + ], + "LinkingTo": [ + "Rcpp" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "cairo, freetype2, fontconfig", + "NeedsCompilation": "yes", + "Author": "David Gohel [aut, cre], Hadley Wickham [aut], Lionel Henry [aut], Jeroen Ooms [aut] (ORCID: ), Yixuan Qiu [ctb], R Core Team [cph] (Cairo code from X11 device), ArData [cph], RStudio [cph]", + "Maintainer": "David Gohel ", + "Repository": "CRAN" }, "generics": { "Package": "generics", - "Version": "0.1.3", + "Version": "0.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Common S3 Generics not Provided by Base R Methods Related to Model Fitting", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Max\", \"Kuhn\", , \"max@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", + "Description": "In order to reduce potential package dependencies and conflicts, generics provides a number of commonly used S3 generics.", + "License": "MIT + file LICENSE", + "URL": "https://generics.r-lib.org, https://github.com/r-lib/generics", + "BugReports": "https://github.com/r-lib/generics/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "methods" ], - "Hash": "15e9634c0fcd294799e9b2e929ed1b86" + "Suggests": [ + "covr", + "pkgload", + "testthat (>= 3.0.0)", + "tibble", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Max Kuhn [aut], Davis Vaughan [aut], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "getopt": { "Package": "getopt", "Version": "1.20.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Encoding": "UTF-8", + "Type": "Package", + "Title": "C-Like 'getopt' Behavior", + "Authors@R": "c(person(\"Trevor L\", \"Davis\", role=c(\"aut\", \"cre\"), email=\"trevor.l.davis@gmail.com\", comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Allen\", \"Day\", role=\"aut\", comment=\"Original package author\"), person(\"Roman\", \"Zenka\", role=\"ctb\"))", + "URL": "https://github.com/trevorld/r-getopt", + "Imports": [ "stats" ], - "Hash": "ed33b16c6d24f7ced1d68877ac2509ee" + "BugReports": "https://github.com/trevorld/r-getopt/issues", + "Description": "Package designed to be used with Rscript to write '#!' shebang scripts that accept short and long flags/options. Many users will prefer using instead the packages optparse or argparse which add extra features like automatically generated help option and usage, support for default values, positional argument support, etc.", + "License": "GPL (>= 2)", + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.2.3", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Trevor L Davis [aut, cre] (), Allen Day [aut] (Original package author), Roman Zenka [ctb]", + "Maintainer": "Trevor L Davis ", + "Repository": "CRAN" }, "ggbeeswarm": { "Package": "ggbeeswarm", - "Version": "0.7.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "0.7.3", + "Source": "Repository", + "Type": "Package", + "Title": "Categorical Scatter (Violin Point) Plots", + "Date": "2025-11-28", + "Authors@R": "c( person(given=\"Erik\", family=\"Clarke\", role=c(\"aut\", \"cre\"), email=\"erikclarke@gmail.com\"), person(given=\"Scott\", family=\"Sherrill-Mix\", role=c(\"aut\"), email=\"sherrillmix@gmail.com\"), person(given=\"Charlotte\", family=\"Dawson\", role=c(\"aut\"), email=\"csdaw@outlook.com\"))", + "Description": "Provides two methods of plotting categorical scatter plots such that the arrangement of points within a category reflects the density of data at that region, and avoids over-plotting.", + "URL": "https://github.com/eclarke/ggbeeswarm", + "BugReports": "https://github.com/eclarke/ggbeeswarm/issues", + "Encoding": "UTF-8", + "License": "GPL (>= 3)", + "Depends": [ + "R (>= 3.5.0)", + "ggplot2 (>= 3.3.0)" + ], + "Imports": [ "beeswarm", - "cli", - "ggplot2", "lifecycle", - "vipor" + "vipor", + "cli" ], - "Hash": "899f28fe0388b7f687d7453429c2474d" + "Suggests": [ + "gridExtra" + ], + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Erik Clarke [aut, cre], Scott Sherrill-Mix [aut], Charlotte Dawson [aut]", + "Maintainer": "Erik Clarke ", + "Repository": "CRAN" }, "ggforce": { "Package": "ggforce", - "Version": "0.4.2", + "Version": "0.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "MASS", - "R", - "Rcpp", - "RcppEigen", - "cli", - "ggplot2", - "grDevices", + "Type": "Package", + "Title": "Accelerating 'ggplot2'", + "Authors@R": "c(person(given = \"Thomas Lin\", family = \"Pedersen\", role = c(\"cre\", \"aut\"), email = \"thomasp85@gmail.com\", comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"RStudio\", role = \"cph\"))", + "Maintainer": "Thomas Lin Pedersen ", + "Description": "The aim of 'ggplot2' is to aid in visual data investigations. This focus has led to a lack of facilities for composing specialised plots. 'ggforce' aims to be a collection of mainly new stats and geoms that fills this gap. All additional functionality is aimed to come through the official extension system so using 'ggforce' should be a stable experience.", + "URL": "https://ggforce.data-imaginist.com, https://github.com/thomasp85/ggforce", + "BugReports": "https://github.com/thomasp85/ggforce/issues", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Depends": [ + "ggplot2 (>= 3.5.0)", + "R (>= 3.3.0)" + ], + "Imports": [ "grid", + "scales", + "MASS", + "tweenr (>= 0.1.5)", "gtable", - "lifecycle", - "polyclip", "rlang", - "scales", + "polyclip", "stats", - "systemfonts", + "grDevices", "tidyselect", - "tweenr", + "withr", "utils", + "lifecycle", + "cli", "vctrs", - "withr" + "systemfonts" + ], + "RoxygenNote": "7.3.2", + "LinkingTo": [ + "cpp11" + ], + "Suggests": [ + "sessioninfo", + "deldir", + "latex2exp", + "reshape2", + "units (>= 0.8.0)", + "covr" ], - "Hash": "384b388bd9155468d2c851846ee69f9f" + "Collate": "'aaa.R' 'shape.R' 'arc_bar.R' 'arc.R' 'autodensity.R' 'autohistogram.R' 'autopoint.R' 'bezier.R' 'bspline.R' 'bspline_closed.R' 'circle.R' 'concaveman.R' 'cpp11.R' 'diagonal.R' 'diagonal_wide.R' 'ellipse.R' 'errorbar.R' 'facet_grid_paginate.R' 'facet_matrix.R' 'facet_row.R' 'facet_stereo.R' 'facet_wrap_paginate.R' 'facet_zoom.R' 'ggforce-package.R' 'ggproto-classes.R' 'interpolate.R' 'labeller.R' 'link.R' 'mark_circle.R' 'mark_ellipse.R' 'mark_hull.R' 'mark_label.R' 'mark_rect.R' 'parallel_sets.R' 'position-jitternormal.R' 'position_auto.R' 'position_floatstack.R' 'regon.R' 'scale-depth.R' 'scale-unit.R' 'sina.R' 'spiro.R' 'themes.R' 'trans.R' 'trans_linear.R' 'utilities.R' 'voronoi.R' 'zzz.R'", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), RStudio [cph]", + "Repository": "CRAN" }, "ggfun": { "Package": "ggfun", - "Version": "0.1.4", + "Version": "0.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Miscellaneous Functions for 'ggplot2'", + "Authors@R": "c( person(\"Guangchuang\", \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(\"Shuangbin\", \"Xu\", email = \"xshuangbin@163.com\", role = \"aut\", comment = c(ORCID=\"0000-0003-3513-5362\")) )", + "Description": "Useful functions and utilities for 'ggplot' object (e.g., geometric layers, themes, and utilities to edit the object).", + "Depends": [ + "R (>= 4.2.0)" + ], + "Imports": [ "cli", + "dplyr", "ggplot2", "grid", "rlang", - "utils" + "scales", + "utils", + "yulab.utils (>= 0.1.6)" + ], + "Suggests": [ + "ggplotify", + "knitr", + "rmarkdown", + "prettydoc", + "tidyr", + "ggnewscale" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "URL": "https://github.com/YuLab-SMU/ggfun", + "BugReports": "https://github.com/YuLab-SMU/ggfun/issues", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre, cph] (ORCID: ), Shuangbin Xu [aut] (ORCID: )", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" + }, + "ggiraph": { + "Package": "ggiraph", + "Version": "0.9.4", + "Source": "Repository", + "Type": "Package", + "Title": "Make 'ggplot2' Graphics Interactive", + "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"Panagiotis\", \"Skintzos\", , \"sigmapi@posteo.net\", role = \"aut\"), person(\"Mike\", \"Bostock\", role = \"cph\", comment = \"d3.js\"), person(\"Speros\", \"Kokenes\", role = \"cph\", comment = \"d3-lasso\"), person(\"Eric\", \"Shull\", role = \"cph\", comment = \"saveSvgAsPng js library\"), person(\"Lee\", \"Thomason\", role = \"cph\", comment = \"TinyXML2\"), person(\"Vladimir\", \"Agafonkin\", role = \"cph\", comment = \"Flatbush\"), person(\"Eric\", \"Book\", role = \"ctb\", comment = \"hline and vline geoms\") )", + "Description": "Create interactive 'ggplot2' graphics using 'htmlwidgets'.", + "License": "GPL-3", + "URL": "https://davidgohel.github.io/ggiraph/", + "BugReports": "https://github.com/davidgohel/ggiraph/issues", + "Imports": [ + "cli", + "dplyr", + "gdtools (>= 0.4.4)", + "ggplot2 (>= 4.0.0)", + "grid", + "htmltools", + "htmlwidgets (>= 1.5)", + "purrr", + "Rcpp (>= 1.1.0)", + "rlang", + "S7 (>= 0.2.0)", + "stats", + "systemfonts (>= 1.3.1)", + "vctrs" + ], + "Suggests": [ + "ggbeeswarm", + "ggrepel (>= 0.9.1)", + "hexbin", + "knitr", + "maps", + "quantreg", + "rmarkdown", + "sf (>= 1.0)", + "shiny", + "tinytest", + "xml2 (>= 1.0)" + ], + "LinkingTo": [ + "Rcpp", + "systemfonts" ], - "Hash": "91780e07f1d631a1152835b4e25c66b9" + "VignetteBuilder": "knitr", + "Copyright": "See file COPYRIGHTS.", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "libpng", + "Collate": "'RcppExports.R' 'ipar.R' 'utils_ggplot2_performance.R' 'utils_ggplot2.R' 'utils.R' 'annotate_interactive.R' 'annotation_raster_interactive.R' 'utils_css.R' 'fonts.R' 'girafe_options.R' 'default.R' 'dsvg.R' 'dsvg_view.R' 'element_interactive.R' 'facet_interactive.R' 'geom_abline_interactive.R' 'geom_path_interactive.R' 'geom_polygon_interactive.R' 'geom_rect_interactive.R' 'geom_bar_interactive.R' 'geom_bin_2d_interactive.R' 'geom_boxplot_interactive.R' 'geom_col_interactive.R' 'geom_contour_interactive.R' 'geom_count_interactive.R' 'geom_crossbar_interactive.R' 'geom_curve_interactive.R' 'geom_density_2d_interactive.R' 'geom_density_interactive.R' 'geom_dotplot_interactive.R' 'geom_errorbar_interactive.R' 'geom_errorbarh_interactive.R' 'geom_freqpoly_interactive.R' 'geom_hex_interactive.R' 'geom_histogram_interactive.R' 'geom_hline_interactive.R' 'geom_jitter_interactive.R' 'geom_label_interactive.R' 'geom_linerange_interactive.R' 'geom_map_interactive.R' 'geom_point_interactive.R' 'geom_pointrange_interactive.R' 'geom_quantile_interactive.R' 'geom_quasirandom_interactive.R' 'geom_raster_interactive.R' 'geom_ribbon_interactive.R' 'geom_segment_interactive.R' 'geom_sf_interactive.R' 'geom_smooth_interactive.R' 'geom_spoke_interactive.R' 'geom_text_interactive.R' 'geom_text_repel_interactive.R' 'geom_tile_interactive.R' 'geom_violin_interactive.R' 'geom_vline_interactive.R' 'ggiraph.R' 'girafe.R' 'grob_interactive.R' 'guide_bins_interactive.R' 'guide_colourbar_interactive.R' 'guide_coloursteps_interactive.R' 'guide_interactive.R' 'guide_legend_interactive.R' 'interactive_circle_grob.R' 'interactive_curve_grob.R' 'interactive_path_grob.R' 'interactive_points_grob.R' 'interactive_polygon_grob.R' 'interactive_polyline_grob.R' 'interactive_raster_grob.R' 'interactive_rect_grob.R' 'interactive_roundrect_grob.R' 'interactive_segments_grob.R' 'interactive_text_grob.R' 'labeller_interactive.R' 'layer_interactive.R' 'scale_alpha_interactive.R' 'scale_brewer_interactive.R' 'scale_colour_interactive.R' 'scale_gradient_interactive.R' 'scale_interactive.R' 'scale_linetype_interactive.R' 'scale_manual_interactive.R' 'scale_shape_interactive.R' 'scale_size_interactive.R' 'scale_steps_interactive.R' 'scale_viridis_interactive.R' 'tracers.R' 'utils_data.r'", + "NeedsCompilation": "yes", + "Author": "David Gohel [aut, cre], Panagiotis Skintzos [aut], Mike Bostock [cph] (d3.js), Speros Kokenes [cph] (d3-lasso), Eric Shull [cph] (saveSvgAsPng js library), Lee Thomason [cph] (TinyXML2), Vladimir Agafonkin [cph] (Flatbush), Eric Book [ctb] (hline and vline geoms)", + "Maintainer": "David Gohel ", + "Repository": "CRAN" }, "ggnewscale": { "Package": "ggnewscale", - "Version": "0.4.10", + "Version": "0.5.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "ggplot2" - ], - "Hash": "2fb8808f9b9b750371b6bfc4cc9f2939" + "Language": "en-GB", + "Title": "Multiple Fill and Colour Scales in 'ggplot2'", + "Authors@R": "person(given = \"Elio\", family = \"Campitelli\", role = c(\"cre\", \"aut\"), email = \"eliocampitelli@gmail.com\", comment = c(ORCID = \"0000-0002-7742-9230\"))", + "Description": "Use multiple fill and colour scales in 'ggplot2'.", + "License": "GPL-3", + "URL": "https://eliocamp.github.io/ggnewscale/, https://github.com/eliocamp/ggnewscale", + "BugReports": "https://github.com/eliocamp/ggnewscale/issues", + "Encoding": "UTF-8", + "Imports": [ + "ggplot2 (>= 3.5.0)" + ], + "RoxygenNote": "7.3.2", + "Suggests": [ + "testthat", + "vdiffr", + "covr" + ], + "NeedsCompilation": "no", + "Author": "Elio Campitelli [cre, aut] (ORCID: )", + "Maintainer": "Elio Campitelli ", + "Repository": "CRAN" }, "ggplot2": { "Package": "ggplot2", - "Version": "3.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "MASS", - "R", + "Version": "4.0.2", + "Source": "Repository", + "Title": "Create Elegant Data Visualisations Using the Grammar of Graphics", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Winston\", \"Chang\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Kohske\", \"Takahashi\", role = \"aut\"), person(\"Claus\", \"Wilke\", role = \"aut\", comment = c(ORCID = \"0000-0002-7470-9261\")), person(\"Kara\", \"Woo\", role = \"aut\", comment = c(ORCID = \"0000-0002-5125-4188\")), person(\"Hiroaki\", \"Yutani\", role = \"aut\", comment = c(ORCID = \"0000-0002-3385-7233\")), person(\"Dewey\", \"Dunnington\", role = \"aut\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Teun\", \"van den Brand\", role = \"aut\", comment = c(ORCID = \"0000-0002-9335-7468\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A system for 'declaratively' creating graphics, based on \"The Grammar of Graphics\". You provide the data, tell 'ggplot2' how to map variables to aesthetics, what graphical primitives to use, and it takes care of the details.", + "License": "MIT + file LICENSE", + "URL": "https://ggplot2.tidyverse.org, https://github.com/tidyverse/ggplot2", + "BugReports": "https://github.com/tidyverse/ggplot2/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "cli", - "glue", "grDevices", "grid", - "gtable", + "gtable (>= 0.3.6)", "isoband", - "lifecycle", - "mgcv", - "rlang", - "scales", + "lifecycle (> 1.0.1)", + "rlang (>= 1.1.0)", + "S7", + "scales (>= 1.4.0)", "stats", + "vctrs (>= 0.6.0)", + "withr (>= 2.5.0)" + ], + "Suggests": [ + "broom", + "covr", + "dplyr", + "ggplot2movies", + "hexbin", + "Hmisc", + "hms", + "knitr", + "mapproj", + "maps", + "MASS", + "mgcv", + "multcomp", + "munsell", + "nlme", + "profvis", + "quantreg", + "quarto", + "ragg (>= 1.2.6)", + "RColorBrewer", + "roxygen2", + "rpart", + "sf (>= 0.7-3)", + "svglite (>= 2.1.2)", + "testthat (>= 3.1.5)", "tibble", - "vctrs", - "withr" + "vdiffr (>= 1.0.6)", + "xml2" ], - "Hash": "44c6a2f8202d5b7e878ea274b1092426" + "Enhances": [ + "sp" + ], + "VignetteBuilder": "quarto", + "Config/Needs/website": "ggtext, tidyr, forcats, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "Collate": "'ggproto.R' 'ggplot-global.R' 'aaa-.R' 'aes-colour-fill-alpha.R' 'aes-evaluation.R' 'aes-group-order.R' 'aes-linetype-size-shape.R' 'aes-position.R' 'all-classes.R' 'compat-plyr.R' 'utilities.R' 'aes.R' 'annotation-borders.R' 'utilities-checks.R' 'legend-draw.R' 'geom-.R' 'annotation-custom.R' 'annotation-logticks.R' 'scale-type.R' 'layer.R' 'make-constructor.R' 'geom-polygon.R' 'geom-map.R' 'annotation-map.R' 'geom-raster.R' 'annotation-raster.R' 'annotation.R' 'autolayer.R' 'autoplot.R' 'axis-secondary.R' 'backports.R' 'bench.R' 'bin.R' 'coord-.R' 'coord-cartesian-.R' 'coord-fixed.R' 'coord-flip.R' 'coord-map.R' 'coord-munch.R' 'coord-polar.R' 'coord-quickmap.R' 'coord-radial.R' 'coord-sf.R' 'coord-transform.R' 'data.R' 'docs_layer.R' 'facet-.R' 'facet-grid-.R' 'facet-null.R' 'facet-wrap.R' 'fortify-map.R' 'fortify-models.R' 'fortify-spatial.R' 'fortify.R' 'stat-.R' 'geom-abline.R' 'geom-rect.R' 'geom-bar.R' 'geom-tile.R' 'geom-bin2d.R' 'geom-blank.R' 'geom-boxplot.R' 'geom-col.R' 'geom-path.R' 'geom-contour.R' 'geom-point.R' 'geom-count.R' 'geom-crossbar.R' 'geom-segment.R' 'geom-curve.R' 'geom-defaults.R' 'geom-ribbon.R' 'geom-density.R' 'geom-density2d.R' 'geom-dotplot.R' 'geom-errorbar.R' 'geom-freqpoly.R' 'geom-function.R' 'geom-hex.R' 'geom-histogram.R' 'geom-hline.R' 'geom-jitter.R' 'geom-label.R' 'geom-linerange.R' 'geom-pointrange.R' 'geom-quantile.R' 'geom-rug.R' 'geom-sf.R' 'geom-smooth.R' 'geom-spoke.R' 'geom-text.R' 'geom-violin.R' 'geom-vline.R' 'ggplot2-package.R' 'grob-absolute.R' 'grob-dotstack.R' 'grob-null.R' 'grouping.R' 'properties.R' 'margins.R' 'theme-elements.R' 'guide-.R' 'guide-axis.R' 'guide-axis-logticks.R' 'guide-axis-stack.R' 'guide-axis-theta.R' 'guide-legend.R' 'guide-bins.R' 'guide-colorbar.R' 'guide-colorsteps.R' 'guide-custom.R' 'guide-none.R' 'guide-old.R' 'guides-.R' 'guides-grid.R' 'hexbin.R' 'import-standalone-obj-type.R' 'import-standalone-types-check.R' 'labeller.R' 'labels.R' 'layer-sf.R' 'layout.R' 'limits.R' 'performance.R' 'plot-build.R' 'plot-construction.R' 'plot-last.R' 'plot.R' 'position-.R' 'position-collide.R' 'position-dodge.R' 'position-dodge2.R' 'position-identity.R' 'position-jitter.R' 'position-jitterdodge.R' 'position-nudge.R' 'position-stack.R' 'quick-plot.R' 'reshape-add-margins.R' 'save.R' 'scale-.R' 'scale-alpha.R' 'scale-binned.R' 'scale-brewer.R' 'scale-colour.R' 'scale-continuous.R' 'scale-date.R' 'scale-discrete-.R' 'scale-expansion.R' 'scale-gradient.R' 'scale-grey.R' 'scale-hue.R' 'scale-identity.R' 'scale-linetype.R' 'scale-linewidth.R' 'scale-manual.R' 'scale-shape.R' 'scale-size.R' 'scale-steps.R' 'scale-view.R' 'scale-viridis.R' 'scales-.R' 'stat-align.R' 'stat-bin.R' 'stat-summary-2d.R' 'stat-bin2d.R' 'stat-bindot.R' 'stat-binhex.R' 'stat-boxplot.R' 'stat-connect.R' 'stat-contour.R' 'stat-count.R' 'stat-density-2d.R' 'stat-density.R' 'stat-ecdf.R' 'stat-ellipse.R' 'stat-function.R' 'stat-identity.R' 'stat-manual.R' 'stat-qq-line.R' 'stat-qq.R' 'stat-quantilemethods.R' 'stat-sf-coordinates.R' 'stat-sf.R' 'stat-smooth-methods.R' 'stat-smooth.R' 'stat-sum.R' 'stat-summary-bin.R' 'stat-summary-hex.R' 'stat-summary.R' 'stat-unique.R' 'stat-ydensity.R' 'summarise-plot.R' 'summary.R' 'theme.R' 'theme-defaults.R' 'theme-current.R' 'theme-sub.R' 'utilities-break.R' 'utilities-grid.R' 'utilities-help.R' 'utilities-patterns.R' 'utilities-resolution.R' 'utilities-tidy-eval.R' 'zxx.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Lionel Henry [aut], Thomas Lin Pedersen [aut, cre] (ORCID: ), Kohske Takahashi [aut], Claus Wilke [aut] (ORCID: ), Kara Woo [aut] (ORCID: ), Hiroaki Yutani [aut] (ORCID: ), Dewey Dunnington [aut] (ORCID: ), Teun van den Brand [aut] (ORCID: ), Posit, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "ggplotify": { "Package": "ggplotify", - "Version": "0.1.2", + "Version": "0.1.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Convert Plot to 'grob' or 'ggplot' Object", + "Authors@R": "c(person(\"Guangchuang\", \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6485-8781\")))", + "Description": "Convert plot function call (using expression or formula) to 'grob' or 'ggplot' object that compatible to the 'grid' and 'ggplot2' ecosystem. With this package, we are able to e.g. using 'cowplot' to align plots produced by 'base' graphics, 'ComplexHeatmap', 'eulerr', 'grid', 'lattice', 'magick', 'pheatmap', 'vcd' etc. by converting them to 'ggplot' objects.", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ "ggplot2", - "grDevices", "graphics", + "grDevices", "grid", "gridGraphics", + "rlang", "yulab.utils" ], - "Hash": "1547863db3b472cf7181973acf649f1a" - }, - "ggraph": { - "Package": "ggraph", - "Version": "2.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "MASS", - "R", - "cli", - "cpp11", - "dplyr", - "ggforce", - "ggplot2", - "ggrepel", - "graphlayouts", - "grid", - "igraph", - "lifecycle", - "memoise", - "rlang", - "scales", - "stats", - "tidygraph", - "utils", - "vctrs", - "viridis", - "withr" + "Suggests": [ + "aplot", + "colorspace", + "cowplot", + "ggimage", + "knitr", + "rmarkdown", + "lattice", + "prettydoc", + "vcd", + "utils" ], - "Hash": "1f5d21a9e1f84b4a81ddacb8f052ca61" + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "License": "Artistic-2.0", + "URL": "https://github.com/GuangchuangYu/ggplotify", + "BugReports": "https://github.com/GuangchuangYu/ggplotify/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre] (ORCID: )", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" }, "ggrastr": { "Package": "ggrastr", "Version": "1.0.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Cairo", - "R", + "Type": "Package", + "Title": "Rasterize Layers for 'ggplot2'", + "Authors@R": "c(person(\"Viktor\", \"Petukhov\", email = \"viktor.s.petukhov@ya.ru\", role = c(\"aut\", \"cph\")), person(\"Teun\", \"van den Brand\", email = \"t.vd.brand@nki.nl\", role=c(\"aut\")), person(\"Evan\", \"Biederstedt\", email = \"evan.biederstedt@gmail.com\", role=c(\"cre\", \"aut\")))", + "Description": "Rasterize only specific layers of a 'ggplot2' plot while simultaneously keeping all labels and text in vector format. This allows users to keep plots within the reasonable size limit without loosing vector properties of the scale-sensitive information.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Imports": [ + "ggplot2 (>= 2.1.0)", + "Cairo (>= 1.5.9)", "ggbeeswarm", - "ggplot2", "grid", "png", "ragg" ], - "Hash": "7c8178842114bfcd44e688e7fd84c52a" + "Depends": [ + "R (>= 3.2.2)" + ], + "RoxygenNote": "7.2.3", + "Suggests": [ + "knitr", + "maps", + "rmarkdown", + "sf" + ], + "VignetteBuilder": "knitr", + "URL": "https://github.com/VPetukhov/ggrastr", + "BugReports": "https://github.com/VPetukhov/ggrastr/issues", + "NeedsCompilation": "no", + "Author": "Viktor Petukhov [aut, cph], Teun van den Brand [aut], Evan Biederstedt [cre, aut]", + "Maintainer": "Evan Biederstedt ", + "Repository": "CRAN" }, "ggrepel": { "Package": "ggrepel", - "Version": "0.9.5", + "Version": "0.9.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", - "ggplot2", + "Authors@R": "c( person(\"Kamil\", \"Slowikowski\", email = \"kslowikowski@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-2843-6370\")), person(\"Alicia\", \"Schep\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3915-0618\")), person(\"Sean\", \"Hughes\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9409-9405\")), person(\"Trung Kien\", \"Dang\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7562-6495\")), person(\"Saulius\", \"Lukauskas\", role = \"ctb\"), person(\"Jean-Olivier\", \"Irisson\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4920-3880\")), person(\"Zhian N\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(\"Thompson\", \"Ryan\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0450-8181\")), person(\"Dervieux\", \"Christophe\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Yutani\", \"Hiroaki\", role = \"ctb\"), person(\"Pierre\", \"Gramme\", role = \"ctb\"), person(\"Amir Masoud\", \"Abdol\", role = \"ctb\"), person(\"Malcolm\", \"Barrett\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Robrecht\", \"Cannoodt\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3641-729X\")), person(\"Michał\", \"Krassowski\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9638-7785\")), person(\"Michael\", \"Chirico\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Pedro\", \"Aphalo\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3385-972X\")), person(\"Francis\", \"Barton\", role = \"ctb\") )", + "Title": "Automatically Position Non-Overlapping Text Labels with 'ggplot2'", + "Description": "Provides text and label geoms for 'ggplot2' that help to avoid overlapping text labels. Labels repel away from each other and away from the data points.", + "Depends": [ + "R (>= 3.0.0)", + "ggplot2 (>= 2.2.0)" + ], + "Imports": [ "grid", - "rlang", - "scales", - "withr" + "Rcpp", + "rlang (>= 0.3.0)", + "scales (>= 0.5.0)", + "withr (>= 2.5.0)" ], - "Hash": "cc3361e234c4a5050e29697d675764aa" - }, - "ggsignif": { - "Package": "ggsignif", - "Version": "0.6.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "svglite", + "vdiffr", + "gridExtra", + "ggpp", + "patchwork", + "devtools", + "prettydoc", + "ggbeeswarm", + "dplyr", + "magrittr", + "readr", + "stringr" + ], + "VignetteBuilder": "knitr", + "License": "GPL-3 | file LICENSE", + "URL": "https://ggrepel.slowkow.com/, https://github.com/slowkow/ggrepel", + "BugReports": "https://github.com/slowkow/ggrepel/issues", + "RoxygenNote": "7.3.1", + "LinkingTo": [ + "Rcpp" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Kamil Slowikowski [aut, cre] (), Alicia Schep [ctb] (), Sean Hughes [ctb] (), Trung Kien Dang [ctb] (), Saulius Lukauskas [ctb], Jean-Olivier Irisson [ctb] (), Zhian N Kamvar [ctb] (), Thompson Ryan [ctb] (), Dervieux Christophe [ctb] (), Yutani Hiroaki [ctb], Pierre Gramme [ctb], Amir Masoud Abdol [ctb], Malcolm Barrett [ctb] (), Robrecht Cannoodt [ctb] (), Michał Krassowski [ctb] (), Michael Chirico [ctb] (), Pedro Aphalo [ctb] (), Francis Barton [ctb]", + "Maintainer": "Kamil Slowikowski ", + "Repository": "CRAN" + }, + "ggside": { + "Package": "ggside", + "Version": "0.4.1", + "Source": "Repository", + "Type": "Package", + "Title": "Side Grammar Graphics", + "Authors@R": "person(given = \"Justin\", family = \"Landis\", role = c(\"aut\", \"cre\"), email = \"jtlandis314@gmail.com\", comment = c(ORCID = \"0000-0001-5501-4934\"))", + "Maintainer": "Justin Landis ", + "Description": "The grammar of graphics as shown in 'ggplot2' has provided an expressive API for users to build plots. 'ggside' extends 'ggplot2' by allowing users to add graphical information about one of the main panel's axis using a familiar 'ggplot2' style API with tidy data. This package is particularly useful for visualizing metadata on a discrete axis, or summary graphics on a continuous axis such as a boxplot or a density distribution.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/jtlandis/ggside", + "BugReports": "https://github.com/jtlandis/ggside/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 4.1)", + "ggplot2 (>= 4.0.0)" + ], + "Imports": [ + "grid", + "gtable", + "rlang", + "scales (>= 1.3.0)", + "cli", + "glue", + "stats", + "tibble", + "vctrs", + "S7", + "lifecycle" + ], + "Suggests": [ + "tidyr", + "dplyr", + "testthat (>= 3.0.3)", + "knitr", + "rmarkdown", + "vdiffr (>= 1.0.0)", + "ggdendro", + "viridis", + "waldo" + ], + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "all_ggside_layers, *themes", + "Collate": "'utils-ggproto.R' 'utils-calls.R' 'utils-ggplot2-reimpl-.R' 'utils-constructors.R' 'side-layer.R' 'constructor-.R' 'utils-.R' 'ggside.R' 'utils-side-facet.R' 'side-facet_.R' 'utils-side-coord.R' 'side-coord-cartesian.R' 'add_gg.R' 'ggplot_add.R' 'side-layout-.r' 'all_classes.r' 'geom-sideabline.r' 'geom-sidebar.r' 'geom-sideboxplot.r' 'geom-sidecol.r' 'geom-sidedensity.r' 'geom-sidefreqpoly.r' 'geom-sidefunction.r' 'geom-sidehistogram.r' 'geom-sidehline.r' 'geom-sidelabel.r' 'geom-sideline.r' 'geom-sidepath.r' 'geom-sidepoint.r' 'geom-sidesegment.r' 'geom-sidetext.r' 'geom-sidetile.r' 'geom-sideviolin.r' 'geom-sidevline.r' 'ggside-ggproto.r' 'ggside-package.r' 'ggside-themes.R' 'plot-construction.R' 'position_rescale.r' 'scales-sides-.R' 'scales-xycolour.R' 'scales-xyfill.R' 'utils-ggplot2-reimpl-facet.R' 'side-facet-wrap.R' 'side-facet-grid.R' 'side-facet-null.R' 'stats.r' 'update_ggplot.R' 'z-depricated.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Justin Landis [aut, cre] (ORCID: )", + "Repository": "CRAN" + }, + "ggsignif": { + "Package": "ggsignif", + "Version": "0.6.4", + "Source": "Repository", + "Type": "Package", + "Title": "Significance Brackets for 'ggplot2'", + "Authors@R": "c( person(given = \"Constantin\", family = \"Ahlmann-Eltze\", role = c(\"aut\", \"cre\", \"ctb\"), email = \"artjom31415@googlemail.com\", comment = c(ORCID = \"0000-0002-3762-068X\", Twitter = \"@const_ae\")), person(given = \"Indrajeet\", family = \"Patil\", role = c(\"aut\", \"ctb\"), email = \"patilindrajeet.science@gmail.com\", comment = c(ORCID = \"0000-0003-1995-6531\", Twitter = \"@patilindrajeets\")) )", + "Description": "Enrich your 'ggplots' with group-wise comparisons. This package provides an easy way to indicate if two groups are significantly different. Commonly this is shown by a bracket on top connecting the groups of interest which itself is annotated with the level of significance (NS, *, **, ***). The package provides a single layer (geom_signif()) that takes the groups for comparison and the test (t.test(), wilcox.text() etc.) as arguments and adds the annotation to the plot.", + "License": "GPL-3 | file LICENSE", + "URL": "https://const-ae.github.io/ggsignif/, https://github.com/const-ae/ggsignif", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Language": "en-US", + "Imports": [ + "ggplot2 (>= 3.3.5)" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "vdiffr (>= 1.0.2)" + ], + "RoxygenNote": "7.2.1", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "NeedsCompilation": "no", + "Author": "Constantin Ahlmann-Eltze [aut, cre, ctb] (, @const_ae), Indrajeet Patil [aut, ctb] (, @patilindrajeets)", + "Maintainer": "Constantin Ahlmann-Eltze ", + "Repository": "CRAN" + }, + "ggspavis": { + "Package": "ggspavis", + "Version": "1.16.0", + "Source": "Bioconductor", + "Title": "Visualization functions for spatial transcriptomics data", + "Description": "Visualization functions for spatial transcriptomics data. Includes functions to generate several types of plots, including spot plots, feature (molecule) plots, reduced dimension plots, spot-level quality control (QC) plots, and feature-level QC plots, for datasets from the 10x Genomics Visium and other technological platforms. Datasets are assumed to be in either SpatialExperiment or SingleCellExperiment format.", + "Authors@R": "c( person(\"Lukas M.\", \"Weber\", email = \"lmweb012@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-3282-1730\")), person(\"Helena L.\", \"Crowell\", email = \"helena.crowell@uzh.ch\", role = c(\"aut\"), comment = c(ORCID = \"0000-0002-4801-1767\")), person(\"Yixing E.\", \"Dong\", email = \"estelladong729@gmail.com\", role = c(\"aut\"), comment = c(ORCID = \"0009-0003-5115-5686\")))", + "URL": "https://github.com/lmweber/ggspavis", + "BugReports": "https://github.com/lmweber/ggspavis/issues", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "biocViews": "Spatial, SingleCell, Transcriptomics, GeneExpression, QualityControl, DimensionReduction", + "Depends": [ "ggplot2" ], - "Hash": "a57f0f5dbcfd0d77ad4ff33032f5dc79" + "Imports": [ + "SpatialExperiment", + "SingleCellExperiment", + "SummarizedExperiment", + "ggside", + "grid", + "ggrepel", + "RColorBrewer", + "scales", + "grDevices", + "methods", + "stats" + ], + "VignetteBuilder": "knitr", + "Suggests": [ + "BiocStyle", + "rmarkdown", + "knitr", + "OSTA.data", + "VisiumIO", + "arrow", + "STexampleData", + "BumpyMatrix", + "scater", + "scran", + "uwot", + "testthat", + "patchwork" + ], + "RoxygenNote": "7.3.3", + "git_url": "https://git.bioconductor.org/packages/ggspavis", + "git_branch": "RELEASE_3_22", + "git_last_commit": "9ea2f70", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Lukas M. Weber [aut, cre] (ORCID: ), Helena L. Crowell [aut] (ORCID: ), Yixing E. Dong [aut] (ORCID: )", + "Maintainer": "Lukas M. Weber " }, "ggstats": { "Package": "ggstats", - "Version": "0.6.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "broom.helpers", + "Version": "0.12.0", + "Source": "Repository", + "Type": "Package", + "Title": "Extension to 'ggplot2' for Plotting Stats", + "Authors@R": "c( person( \"Joseph\", \"Larmarange\", , \"joseph@larmarange.net\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-7097-700X\") ) )", + "Description": "Provides new statistics, new geometries and new positions for 'ggplot2' and a suite of functions to facilitate the creation of statistical plots.", + "License": "GPL (>= 3)", + "URL": "https://larmarange.github.io/ggstats/, https://github.com/larmarange/ggstats", + "BugReports": "https://github.com/larmarange/ggstats/issues", + "Depends": [ + "R (>= 4.2)" + ], + "Imports": [ "cli", "dplyr", "forcats", - "ggplot2", + "ggplot2 (>= 4.0.0)", "lifecycle", - "magrittr", "patchwork", "purrr", "rlang", "scales", "stats", "stringr", + "utils", "tidyr" ], - "Hash": "02cdab34154e9e70dac279afbb20d34b" + "Suggests": [ + "betareg", + "broom", + "broom.helpers (>= 1.20.0)", + "emmeans", + "glue", + "gtsummary", + "knitr", + "labelled (>= 2.11.0)", + "reshape", + "rmarkdown", + "nnet", + "parameters", + "pscl", + "testthat (>= 3.0.0)", + "spelling", + "survey", + "survival", + "vdiffr" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "3", + "Language": "en-US", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Joseph Larmarange [aut, cre] (ORCID: )", + "Maintainer": "Joseph Larmarange ", + "Repository": "CRAN" + }, + "ggtangle": { + "Package": "ggtangle", + "Version": "0.1.1", + "Source": "Repository", + "Title": "Draw Network with Data", + "Authors@R": "c( person(given = \"Guangchuang\", family = \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6485-8781\")))", + "Description": "Extends the 'ggplot2' plotting system to support network visualization. Inspired by the 'Method 1' in 'ggtree' (G Yu (2018) ), 'ggtangle' is designed to work with network associated data.", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "ggfun (>= 0.1.7)", + "ggplot2", + "ggrepel", + "igraph", + "rlang", + "yulab.utils (>= 0.2.2)" + ], + "Suggests": [ + "aplot", + "cli", + "ggiraph", + "ggnewscale", + "ggtree", + "quarto", + "scatterpie (>= 0.2.4)" + ], + "VignetteBuilder": "quarto", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre] (ORCID: )", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" }, "ggtree": { "Package": "ggtree", - "Version": "3.12.0", + "Version": "4.0.4", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", + "Type": "Package", + "Title": "an R package for visualization of tree and annotation data", + "Authors@R": "c( person(\"Guangchuang\", \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(\"Tommy Tsan-Yuk\", \"Lam\", email = \"tylam.tommy@gmail.com\", role = c(\"aut\", \"ths\")), person(\"Shuangbin\", \"Xu\", email = \"xshuangbin@163.com\", role = \"aut\", comment = c(ORCID=\"0000-0003-3513-5362\")), person(\"Lin\", \" Li\", email = \"williamlee2220@qq.com\", role = \"ctb\"), person(\"Bradley\", \"Jones\", email = \"bjones@cfenet.ubc.ca\", role = \"ctb\"), person(\"Justin\", \"Silverman\", email = \"jsilve24@gmail.com\", role = \"ctb\"), person(\"Watal M.\", \"Iwasaki\", email = \"heavy.watal@gmail.com\", role = \"ctb\"), person(\"Yonghe\", \"Xia\", email = \"xiayh17@gmail.com\", role = \"ctb\"), person(\"Ruizhu\", \"Huang\", email = \"ruizhuRH@gmail.com\", role = \"ctb\") )", + "Maintainer": "Guangchuang Yu ", + "Description": "'ggtree' extends the 'ggplot2' plotting system which implemented the grammar of graphics. 'ggtree' is designed for visualization and annotation of phylogenetic trees and other tree-like structures with their annotation data.", + "Depends": [ + "R (>= 4.2.0)" + ], + "Imports": [ "ape", "aplot", - "cli", "dplyr", - "ggfun", - "ggplot2", + "ggplot2 (>= 4.0.0)", "grid", "magrittr", "methods", "purrr", "rlang", - "scales", - "stats", + "ggfun (>= 0.1.7)", + "yulab.utils (>= 0.1.6)", "tidyr", - "tidytree", - "treeio", + "tidytree (>= 0.4.5)", + "treeio (>= 1.8.0)", "utils", - "yulab.utils" + "scales", + "stats", + "cli", + "ggiraph (>= 0.9.1)" ], - "Hash": "6c4748308cbe296a022cba26e118075a" + "Suggests": [ + "emojifont", + "ggimage", + "ggplotify", + "shadowtext", + "grDevices", + "knitr", + "prettydoc", + "rmarkdown", + "testthat", + "tibble", + "glue", + "Biostrings" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Encoding": "UTF-8", + "License": "Artistic-2.0", + "URL": "https://www.amazon.com/Integration-Manipulation-Visualization-Phylogenetic-Computational-ebook/dp/B0B5NLZR1Z/ (book), http://onlinelibrary.wiley.com/doi/10.1111/2041-210X.12628 (paper)", + "BugReports": "https://github.com/YuLab-SMU/ggtree/issues", + "biocViews": "Alignment, Annotation, Clustering, DataImport, MultipleSequenceAlignment, Phylogenetics, ReproducibleResearch, Software, Visualization", + "RoxygenNote": "7.3.3", + "Roxygen": "list(markdown = TRUE)", + "git_url": "https://git.bioconductor.org/packages/ggtree", + "git_branch": "RELEASE_3_22", + "git_last_commit": "8e25254", + "git_last_commit_date": "2026-01-04", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre, cph] (ORCID: ), Tommy Tsan-Yuk Lam [aut, ths], Shuangbin Xu [aut] (ORCID: ), Lin Li [ctb], Bradley Jones [ctb], Justin Silverman [ctb], Watal M. Iwasaki [ctb], Yonghe Xia [ctb], Ruizhu Huang [ctb]", + "RemoteType": "bioconductor", + "RemoteUrl": "https://github.com/bioc/ggtree", + "RemoteRef": "RELEASE_3_22", + "RemoteSha": "8e25254da5a9aa23db9e2f58acd14cc4e58a2893" }, "ggupset": { "Package": "ggupset", - "Version": "0.3.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "ggplot2", - "grid", + "Version": "0.4.1", + "Source": "Repository", + "Type": "Package", + "Title": "Combination Matrix Axis for 'ggplot2' to Create 'UpSet' Plots", + "URL": "https://github.com/const-ae/ggupset", + "BugReports": "https://github.com/const-ae/ggupset/issues", + "Authors@R": "person(\"Constantin\", \"Ahlmann-Eltze\", email = \"artjom31415@googlemail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-3762-068X\"))", + "Description": "Replace the standard x-axis in 'ggplots' with a combination matrix to visualize complex set overlaps. 'UpSet' has introduced a new way to visualize the overlap of sets as an alternative to Venn diagrams. This package provides a simple way to produce such plots using 'ggplot2'. In addition it can convert any categorical axis into a combination matrix axis.", + "License": "GPL-3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.1", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "testthat" + ], + "Imports": [ + "ggplot2 (>= 3.3.0)", "gtable", + "grid", + "tibble", "rlang", - "scales", - "tibble" + "scales" ], - "Hash": "8e9eb92bf465601c07d17c5e8b75dce1" + "NeedsCompilation": "no", + "Author": "Constantin Ahlmann-Eltze [aut, cre] ()", + "Maintainer": "Constantin Ahlmann-Eltze ", + "Repository": "CRAN" }, "glmnet": { "Package": "glmnet", - "Version": "4.1-8", + "Version": "4.1-10", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", - "Rcpp", - "RcppEigen", - "foreach", + "Type": "Package", + "Title": "Lasso and Elastic-Net Regularized Generalized Linear Models", + "Date": "2025-07-15", + "Authors@R": "c(person(\"Jerome\", \"Friedman\", role=c(\"aut\")), person(\"Trevor\", \"Hastie\", role=c(\"aut\", \"cre\"), email = \"hastie@stanford.edu\"), person(\"Rob\", \"Tibshirani\", role=c(\"aut\")), person(\"Balasubramanian\", \"Narasimhan\", role=c(\"aut\")), person(\"Kenneth\",\"Tay\",role=c(\"aut\")), person(\"Noah\", \"Simon\", role=c(\"aut\")), person(\"Junyang\", \"Qian\", role=c(\"ctb\")), person(\"James\", \"Yang\", role=c(\"aut\")))", + "Depends": [ + "R (>= 3.6.0)", + "Matrix (>= 1.0-6)" + ], + "Imports": [ "methods", + "utils", + "foreach", "shape", "survival", - "utils" + "Rcpp" + ], + "Suggests": [ + "knitr", + "lars", + "testthat", + "xfun", + "rmarkdown" + ], + "SystemRequirements": "C++17", + "Description": "Extremely efficient procedures for fitting the entire lasso or elastic-net regularization path for linear regression, logistic and multinomial regression models, Poisson regression, Cox model, multiple-response Gaussian, and the grouped multinomial regression; see and . There are two new and important additions. The family argument can be a GLM family object, which opens the door to any programmed family (). This comes with a modest computational cost, so when the built-in families suffice, they should be used instead. The other novelty is the relax option, which refits each of the active sets in the path unpenalized. The algorithm uses cyclical coordinate descent in a path-wise fashion, as described in the papers cited.", + "License": "GPL-2", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "URL": "https://glmnet.stanford.edu", + "RoxygenNote": "7.3.2", + "LinkingTo": [ + "RcppEigen", + "Rcpp" ], - "Hash": "eb6fc70e561aae41d5911a6726188f71" + "NeedsCompilation": "yes", + "Author": "Jerome Friedman [aut], Trevor Hastie [aut, cre], Rob Tibshirani [aut], Balasubramanian Narasimhan [aut], Kenneth Tay [aut], Noah Simon [aut], Junyang Qian [ctb], James Yang [aut]", + "Maintainer": "Trevor Hastie ", + "Repository": "CRAN" }, "glue": { "Package": "glue", - "Version": "1.7.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.8.0", + "Source": "Repository", + "Title": "Interpreted String Literals", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "An implementation of interpreted string literals, inspired by Python's Literal String Interpolation and Docstrings and Julia's Triple-Quoted String Literals .", + "License": "MIT + file LICENSE", + "URL": "https://glue.tidyverse.org/, https://github.com/tidyverse/glue", + "BugReports": "https://github.com/tidyverse/glue/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "methods" ], - "Hash": "e0b3a53876554bd45879e596cdb10a52" + "Suggests": [ + "crayon", + "DBI (>= 1.2.0)", + "dplyr", + "knitr", + "magrittr", + "rlang", + "rmarkdown", + "RSQLite", + "testthat (>= 3.2.0)", + "vctrs (>= 0.3.0)", + "waldo (>= 0.5.3)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "bench, forcats, ggbeeswarm, ggplot2, R.utils, rprintf, tidyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (), Jennifer Bryan [aut, cre] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "googledrive": { "Package": "googledrive", - "Version": "2.1.1", + "Version": "2.1.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "gargle", - "glue", + "Title": "An Interface to Google Drive", + "Authors@R": "c( person(\"Lucy\", \"D'Agostino McGowan\", , role = \"aut\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Manage Google Drive files from R.", + "License": "MIT + file LICENSE", + "URL": "https://googledrive.tidyverse.org, https://github.com/tidyverse/googledrive", + "BugReports": "https://github.com/tidyverse/googledrive/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "gargle (>= 1.6.0)", + "glue (>= 1.4.2)", "httr", "jsonlite", "lifecycle", "magrittr", - "pillar", - "purrr", - "rlang", - "tibble", + "pillar (>= 1.9.0)", + "purrr (>= 1.0.1)", + "rlang (>= 1.0.2)", + "tibble (>= 2.0.0)", "utils", "uuid", - "vctrs", + "vctrs (>= 0.3.0)", "withr" ], - "Hash": "e99641edef03e2a5e87f0a0b1fcc97f4" + "Suggests": [ + "curl", + "dplyr (>= 1.0.0)", + "knitr", + "rmarkdown", + "spelling", + "testthat (>= 3.1.5)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Lucy D'Agostino McGowan [aut], Jennifer Bryan [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "googlesheets4": { "Package": "googlesheets4", - "Version": "1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.1.2", + "Source": "Repository", + "Title": "Access Google Sheets using the Sheets API V4", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Interact with Google Sheets through the Sheets API v4 . \"API\" is an acronym for \"application programming interface\"; the Sheets API allows users to interact with Google Sheets programmatically, instead of via a web browser. The \"v4\" refers to the fact that the Sheets API is currently at version 4. This package can read and write both the metadata and the cell data in a Sheet.", + "License": "MIT + file LICENSE", + "URL": "https://googlesheets4.tidyverse.org, https://github.com/tidyverse/googlesheets4", + "BugReports": "https://github.com/tidyverse/googlesheets4/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "cellranger", - "cli", + "cli (>= 3.0.0)", "curl", - "gargle", - "glue", - "googledrive", + "gargle (>= 1.6.0)", + "glue (>= 1.3.0)", + "googledrive (>= 2.1.0)", "httr", "ids", "lifecycle", @@ -3136,89 +8808,178 @@ "methods", "purrr", "rematch2", - "rlang", - "tibble", + "rlang (>= 1.0.2)", + "tibble (>= 2.1.1)", "utils", - "vctrs", + "vctrs (>= 0.2.3)", "withr" ], - "Hash": "d6db1667059d027da730decdc214b959" + "Suggests": [ + "readr", + "rmarkdown", + "spelling", + "testthat (>= 3.1.7)" + ], + "ByteCompile": "true", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "gplots": { "Package": "gplots", - "Version": "3.1.3.1", + "Version": "3.3.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "KernSmooth", - "R", - "caTools", + "Title": "Various R Programming Tools for Plotting Data", + "Description": "Various R programming tools for plotting data, including: - calculating and plotting locally smoothed summary function as ('bandplot', 'wapply'), - enhanced versions of standard plots ('barplot2', 'boxplot2', 'heatmap.2', 'smartlegend'), - manipulating colors ('col2hex', 'colorpanel', 'redgreen', 'greenred', 'bluered', 'redblue', 'rich.colors'), - calculating and plotting two-dimensional data summaries ('ci2d', 'hist2d'), - enhanced regression diagnostic plots ('lmplot2', 'residplot'), - formula-enabled interface to 'stats::lowess' function ('lowess'), - displaying textual data in plots ('textplot', 'sinkplot'), - plotting dots whose size reflects the relative magnitude of the elements ('balloonplot', 'bubbleplot'), - plotting \"Venn\" diagrams ('venn'), - displaying Open-Office style plots ('ooplot'), - plotting multiple data on same region, with separate axes ('overplot'), - plotting means and confidence intervals ('plotCI', 'plotmeans'), - spacing points in an x-y plot so they don't overlap ('space').", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ "gtools", - "methods", - "stats" + "stats", + "caTools", + "KernSmooth", + "methods" ], - "Hash": "f72b5d1ed587f8905e38ee7295e88d80" + "Suggests": [ + "grid", + "MASS", + "knitr", + "rmarkdown", + "r2d2", + "nlme", + "dendextend", + "heatmaply", + "RColorBrewer" + ], + "LazyData": "yes", + "VignetteBuilder": "knitr", + "Date": "2025-11-29", + "Authors@R": "c( person(\"Gregory R.\", \"Warnes\", , role = \"aut\"), person(\"Ben\", \"Bolker\", , role = \"aut\"), person(\"Lodewijk\", \"Bonebakker\", , role = \"aut\"), person(\"Robert\", \"Gentleman\", role = \"aut\"), person(\"Wolfgang\", \"Huber\", role = \"aut\"), person(\"Andy\", \"Liaw\", role = \"aut\"), person(\"Thomas\", \"Lumley\", role = \"aut\"), person(\"Martin\", \"Maechler\", role = \"aut\"), person(\"Arni\", \"Magnusson\", role = \"aut\"), person(\"Steffen\", \"Moeller\", role = \"aut\"), person(\"Marc\", \"Schwartz\", role = \"aut\"), person(\"Bill\", \"Venables\", role = \"aut\"), person(\"Tal\", \"Galili\", , \"tal.galili@gmail.com\", c(\"aut\", \"cre\")) )", + "License": "GPL-2", + "URL": "https://github.com/talgalili/gplots, https://talgalili.github.io/gplots/", + "BugReports": "https://github.com/talgalili/gplots/issues", + "NeedsCompilation": "no", + "Author": "Gregory R. Warnes [aut], Ben Bolker [aut], Lodewijk Bonebakker [aut], Robert Gentleman [aut], Wolfgang Huber [aut], Andy Liaw [aut], Thomas Lumley [aut], Martin Maechler [aut], Arni Magnusson [aut], Steffen Moeller [aut], Marc Schwartz [aut], Bill Venables [aut], Tal Galili [aut, cre]", + "Maintainer": "Tal Galili ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "graph": { "Package": "graph", - "Version": "1.82.0", + "Version": "1.88.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "R", + "Title": "graph: A package to handle graph data structures", + "Authors@R": "c( person(\"R\", \"Gentleman\", role = \"aut\"), person(\"Elizabeth\", \"Whalen\", role=\"aut\"), person(\"W\", \"Huber\", role=\"aut\"), person(\"S\", \"Falcon\", role=\"aut\"), person(\"Jeff\", \"Gentry\", role=\"aut\"), person(\"Paul\", \"Shannon\", role=\"aut\"), person(\"Halimat C.\", \"Atanda\", role = \"ctb\", comment = \"Converted 'MultiGraphClass' and 'GraphClass' vignettes from Sweave to RMarkdown / HTML.\" ), person(\"Paul\", \"Villafuerte\", role = \"ctb\", comment = \"Converted vignettes from Sweave to RMarkdown / HTML.\" ), person(\"Aliyu Atiku\", \"Mustapha\", role = \"ctb\", comment = \"Converted 'Graph' vignette from Sweave to RMarkdown / HTML.\" ), person(\"Bioconductor Package Maintainer\", role = \"cre\", email = \"maintainer@bioconductor.org\" ))", + "Description": "A package that implements some simple graph handling capabilities.", + "License": "Artistic-2.0", + "Depends": [ + "R (>= 2.10)", "methods", + "BiocGenerics (>= 0.13.11)" + ], + "Imports": [ "stats", "stats4", "utils" ], - "Hash": "096137dd6d37588451a82658aa94ecbd" - }, - "graphlayouts": { - "Package": "graphlayouts", - "Version": "1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", - "RcppArmadillo", - "igraph" - ], - "Hash": "d329345a6a37666ca3f18f3b3c1347b7" + "Suggests": [ + "SparseM (>= 0.36)", + "XML", + "RBGL", + "RUnit", + "cluster", + "BiocStyle", + "knitr" + ], + "Enhances": [ + "Rgraphviz" + ], + "Collate": "AllClasses.R AllGenerics.R bitarray.R buildDepGraph.R methods-graph.R graphNEL.R clustergraph.R NELhandler.R edgefunctions.R graphfunctions.R GXLformals.R gxlReader.R random.R write.tlp.R mat2graph.R settings.R zzz.R standardLabeling.R TODOT.R toDotWithRI.R methods-graphAM.R attrData.R reverseEdgeDirections.R nodes-methods.R methods-multiGraph.R MultiGraph.R methods-graphBAM.R graph-constructors.R", + "LazyLoad": "yes", + "biocViews": "GraphAndNetwork", + "RoxygenNote": "7.2.3", + "VignetteBuilder": "knitr", + "git_url": "https://git.bioconductor.org/packages/graph", + "git_branch": "RELEASE_3_22", + "git_last_commit": "1834660", + "git_last_commit_date": "2025-12-07", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "R Gentleman [aut], Elizabeth Whalen [aut], W Huber [aut], S Falcon [aut], Jeff Gentry [aut], Paul Shannon [aut], Halimat C. Atanda [ctb] (Converted 'MultiGraphClass' and 'GraphClass' vignettes from Sweave to RMarkdown / HTML.), Paul Villafuerte [ctb] (Converted vignettes from Sweave to RMarkdown / HTML.), Aliyu Atiku Mustapha [ctb] (Converted 'Graph' vignette from Sweave to RMarkdown / HTML.), Bioconductor Package Maintainer [cre]", + "Maintainer": "Bioconductor Package Maintainer " }, "gridExtra": { "Package": "gridExtra", "Version": "2.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Authors@R": "c(person(\"Baptiste\", \"Auguie\", email = \"baptiste.auguie@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Anton\", \"Antonov\", email = \"tonytonov@gmail.com\", role = c(\"ctb\")))", + "License": "GPL (>= 2)", + "Title": "Miscellaneous Functions for \"Grid\" Graphics", + "Type": "Package", + "Description": "Provides a number of user-level functions to work with \"grid\" graphics, notably to arrange multiple grid-based plots on a page, and draw tables.", + "VignetteBuilder": "knitr", + "Imports": [ + "gtable", + "grid", "grDevices", "graphics", - "grid", - "gtable", "utils" ], - "Hash": "7d7f283939f563670a697165b2cf5560" + "Suggests": [ + "ggplot2", + "egg", + "lattice", + "knitr", + "testthat" + ], + "RoxygenNote": "6.0.1", + "NeedsCompilation": "no", + "Author": "Baptiste Auguie [aut, cre], Anton Antonov [ctb]", + "Maintainer": "Baptiste Auguie ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "gridGraphics": { "Package": "gridGraphics", "Version": "0.5-1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "grDevices", - "graphics", - "grid" + "Title": "Redraw Base Graphics Using 'grid' Graphics", + "Authors@R": "c(person(\"Paul\", \"Murrell\", role = c(\"cre\", \"aut\"), email = \"paul@stat.auckland.ac.nz\"), person(\"Zhijian\", \"Wen\", role = \"aut\", email = \"jwen246@aucklanduni.ac.nz\"))", + "Description": "Functions to convert a page of plots drawn with the 'graphics' package into identical output drawn with the 'grid' package. The result looks like the original 'graphics'-based plot, but consists of 'grid' grobs and viewports that can then be manipulated with 'grid' functions (e.g., edit grobs and revisit viewports).", + "Depends": [ + "grid", + "graphics" ], - "Hash": "5b79228594f02385d4df4979284879ae" + "Imports": [ + "grDevices" + ], + "Suggests": [ + "magick (>= 1.3)", + "pdftools (>= 1.6)" + ], + "License": "GPL (>= 2)", + "URL": "https://github.com/pmur002/gridgraphics", + "NeedsCompilation": "no", + "Author": "Paul Murrell [cre, aut], Zhijian Wen [aut]", + "Maintainer": "Paul Murrell ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "gson": { "Package": "gson", "Version": "0.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Base Class and Methods for 'gson' Format", + "Authors@R": "c( person(\"Guangchuang\", \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0002-6485-8781\")) )", + "Description": "Proposes a new file format ('gson') for storing gene set and related information, and provides read, write and other utilities to process this file format.", + "Imports": [ "jsonlite", "methods", "rlang", @@ -3226,1264 +8987,3305 @@ "tidyr", "utils" ], - "Hash": "d37d82cf043b679dd802e91d0b2ef6a1" + "ByteCompile": "true", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre, cph] ()", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" }, "gtable": { "Package": "gtable", - "Version": "0.3.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "0.3.6", + "Source": "Repository", + "Title": "Arrange 'Grobs' in Tables", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to make it easier to work with \"tables\" of 'grobs'. The 'gtable' package defines a 'gtable' grob class that specifies a grid along with a list of grobs and their placement in the grid. Further the package makes it easy to manipulate and combine 'gtable' objects so that complex compositions can be built up sequentially.", + "License": "MIT + file LICENSE", + "URL": "https://gtable.r-lib.org, https://github.com/r-lib/gtable", + "BugReports": "https://github.com/r-lib/gtable/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ "cli", "glue", "grid", "lifecycle", - "rlang" + "rlang (>= 1.1.0)", + "stats" ], - "Hash": "e18861963cbc65a27736e02b3cd3c4a0" + "Suggests": [ + "covr", + "ggplot2", + "knitr", + "profvis", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2024-10-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Thomas Lin Pedersen [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "gtools": { "Package": "gtools", "Version": "3.9.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Various R Programming Tools", + "Description": "Functions to assist in R programming, including: - assist in developing, updating, and maintaining R and R packages ('ask', 'checkRVersion', 'getDependencies', 'keywords', 'scat'), - calculate the logit and inverse logit transformations ('logit', 'inv.logit'), - test if a value is missing, empty or contains only NA and NULL values ('invalid'), - manipulate R's .Last function ('addLast'), - define macros ('defmacro'), - detect odd and even integers ('odd', 'even'), - convert strings containing non-ASCII characters (like single quotes) to plain ASCII ('ASCIIfy'), - perform a binary search ('binsearch'), - sort strings containing both numeric and character components ('mixedsort'), - create a factor variable from the quantiles of a continuous variable ('quantcut'), - enumerate permutations and combinations ('combinations', 'permutation'), - calculate and convert between fold-change and log-ratio ('foldchange', 'logratio2foldchange', 'foldchange2logratio'), - calculate probabilities and generate random numbers from Dirichlet distributions ('rdirichlet', 'ddirichlet'), - apply a function over adjacent subsets of a vector ('running'), - modify the TCP_NODELAY ('de-Nagle') flag for socket objects, - efficient 'rbind' of data frames, even if the column names don't match ('smartbind'), - generate significance stars from p-values ('stars.pval'), - convert characters to/from ASCII codes ('asc', 'chr'), - convert character vector to ASCII representation ('ASCIIfy'), - apply title capitalization rules to a character vector ('capwords').", + "Authors@R": "c(person(\"Gregory R.\", \"Warnes\", role = \"aut\"), person(\"Ben\", \"Bolker\", role = c(\"aut\", \"cre\"), email = \"bolker@mcmaster.ca\", comment=c(ORCID=\"0000-0002-2127-0443\")), person(\"Thomas\", \"Lumley\", role = \"aut\"), person(\"Arni\", \"Magnusson\", role = \"aut\"), person(\"Bill\", \"Venables\", role = \"aut\"), person(\"Genei\", \"Ryodan\", role = \"aut\"), person(\"Steffen\", \"Moeller\", role = \"aut\"), person(\"Ian\", \"Wilson\", role = \"ctb\"), person(\"Mark\", \"Davis\", role = \"ctb\"), person(\"Nitin\", \"Jain\", role=\"ctb\"), person(\"Scott\", \"Chamberlain\", role = \"ctb\"))", + "License": "GPL-2", + "Depends": [ "methods", "stats", "utils" ], - "Hash": "588d091c35389f1f4a9d533c8d709b35" + "URL": "https://github.com/r-gregmisc/gtools", + "BugReports": "https://github.com/r-gregmisc/gtools/issues", + "Language": "en-US", + "Suggests": [ + "car", + "gplots", + "knitr", + "rstudioapi", + "SGP", + "taxize" + ], + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Gregory R. Warnes [aut], Ben Bolker [aut, cre] (), Thomas Lumley [aut], Arni Magnusson [aut], Bill Venables [aut], Genei Ryodan [aut], Steffen Moeller [aut], Ian Wilson [ctb], Mark Davis [ctb], Nitin Jain [ctb], Scott Chamberlain [ctb]", + "Maintainer": "Ben Bolker ", + "Repository": "CRAN" }, "gypsum": { "Package": "gypsum", - "Version": "1.0.0", + "Version": "1.6.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "filelock", + "Date": "2024-06-20", + "Title": "Interface to the gypsum REST API", + "Description": "Client for the gypsum REST API (https://gypsum.artifactdb.com), a cloud-based file store in the ArtifactDB ecosystem. This package provides functions for uploads, downloads, and various adminstrative and management tasks. Check out the documentation at https://github.com/ArtifactDB/gypsum-worker for more details.", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "License": "MIT + file LICENSE", + "Imports": [ + "utils", "httr2", "jsonlite", "parallel", - "paws.storage", + "filelock", + "rappdirs" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "BiocStyle", + "digest", + "jsonvalidate", + "DBI", + "RSQLite", + "S4Vectors", + "methods" + ], + "RoxygenNote": "7.3.1", + "VignetteBuilder": "knitr", + "URL": "https://github.com/ArtifactDB/gypsum-R", + "BugReports": "https://github.com/ArtifactDB/gypsum-R/issues", + "biocViews": "DataImport", + "git_url": "https://git.bioconductor.org/packages/gypsum", + "git_branch": "RELEASE_3_22", + "git_last_commit": "ff6acdc", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Aaron Lun [aut, cre]", + "Maintainer": "Aaron Lun " + }, + "h5mread": { + "Package": "h5mread", + "Version": "1.2.1", + "Source": "Bioconductor", + "Title": "A fast HDF5 reader", + "Description": "The main function in the h5mread package is h5mread(), which allows reading arbitrary data from an HDF5 dataset into R, similarly to what the h5read() function from the rhdf5 package does. In the case of h5mread(), the implementation has been optimized to make it as fast and memory-efficient as possible.", + "biocViews": "Infrastructure, DataRepresentation, DataImport", + "URL": "https://bioconductor.org/packages/h5mread", + "BugReports": "https://github.com/Bioconductor/h5mread/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "person(\"Hervé\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\", comment=c(ORCID=\"0009-0002-8272-4522\"))", + "Depends": [ + "R (>= 4.5)", + "methods", + "rhdf5", + "BiocGenerics", + "SparseArray" + ], + "Imports": [ + "stats", "tools", - "utils" + "rhdf5filters", + "S4Vectors", + "IRanges", + "S4Arrays" + ], + "LinkingTo": [ + "Rhdf5lib", + "S4Vectors" ], - "Hash": "380fad913349a0834d73a49c312155b9" + "SystemRequirements": "GNU make", + "Suggests": [ + "BiocParallel", + "ExperimentHub", + "TENxBrainData", + "HDF5Array", + "testthat", + "knitr", + "rmarkdown", + "BiocStyle" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R h5dim.R H5File-class.R h5ls.R H5DSetDescriptor-class.R uaselection.R h5mread.R h5summarize.R h5mread_from_reshaped.R h5dimscales.R h5writeDimnames.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/h5mread", + "git_branch": "RELEASE_3_22", + "git_last_commit": "b377076", + "git_last_commit_date": "2025-11-21", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Hervé Pagès [aut, cre] (ORCID: )", + "Maintainer": "Hervé Pagès " }, "harmony": { "Package": "harmony", - "Version": "1.2.0", + "Version": "1.2.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", + "Title": "Fast, Sensitive, and Accurate Integration of Single Cell Data", + "Authors@R": "c( person(\"Ilya\", \"Korsunsky\", email = \"ilya.korsunsky@gmail.com\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0003-4848-3948\")), person(\"Martin\", \"Hemberg\", email = \"mhemberg@bwh.harvard.edu\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-8895-5239\")), person(\"Nikolaos\", \"Patikas\", email = \"nik.patik@gmail.com\", role = c(\"aut\", \"ctb\"), comment = c(ORCID = \"0000-0002-3978-0134\")), person(\"Hongcheng\", \"Yao\", email = \"hongchengyaonk@gmail.com\", role = c(\"aut\", \"ctb\"), comment = c(ORCID = \"0000-0002-0743-4835\")), person(\"Nghia\", \"Millard\", email = \"nmillard@g.harvard.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-0518-7674\")), person(\"Jean\", \"Fan\", email = \"jeanfan@fas.harvard.edu\", role = c(\"aut\", \"ctb\"), comment = c(ORCID = \"0000-0002-0212-5451\")), person(\"Kamil\", \"Slowikowski\", email = \"kslowikowski@gmail.com\", role = c(\"aut\", \"ctb\"), comment = c(ORCID = \"0000-0002-2843-6370\")), person(\"Miles\", \"Smith\", role = c(\"ctb\")), person(\"Soumya\", \"Raychaudhuri\", role = c(\"aut\"), comment = c(ORCID = \"0000-0002-1901-8265\")) )", + "Description": "Implementation of the Harmony algorithm for single cell integration, described in Korsunsky et al . Package includes a standalone Harmony function and interfaces to external frameworks.", + "URL": "https://github.com/immunogenomics/harmony", + "License": "GPL-3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Depends": [ + "R(>= 3.5.0)", + "Rcpp" + ], + "LazyData": "true", + "LazyDataCompression": "gzip", + "LinkingTo": [ "Rcpp", "RcppArmadillo", - "RcppProgress", - "RhpcBLASctl", - "cowplot", + "RcppProgress" + ], + "Imports": [ "dplyr", + "cowplot", "ggplot2", + "Matrix", "methods", + "tibble", "rlang", - "tibble" + "RhpcBLASctl" + ], + "Suggests": [ + "SingleCellExperiment", + "Seurat (>= 4.1.1)", + "testthat", + "knitr", + "rmarkdown", + "ggthemes", + "ggrepel", + "patchwork", + "tidyverse", + "tidyr", + "data.table" ], - "Hash": "4f3b181961712ff4127a8634c1367f89" + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "Ilya Korsunsky [cre, aut] (ORCID: ), Martin Hemberg [aut] (ORCID: ), Nikolaos Patikas [aut, ctb] (ORCID: ), Hongcheng Yao [aut, ctb] (ORCID: ), Nghia Millard [aut] (ORCID: ), Jean Fan [aut, ctb] (ORCID: ), Kamil Slowikowski [aut, ctb] (ORCID: ), Miles Smith [ctb], Soumya Raychaudhuri [aut] (ORCID: )", + "Maintainer": "Ilya Korsunsky ", + "Repository": "CRAN" }, "haven": { "Package": "haven", - "Version": "2.5.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "cpp11", - "forcats", + "Version": "2.5.5", + "Source": "Repository", + "Title": "Import and Export 'SPSS', 'Stata' and 'SAS' Files", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Evan\", \"Miller\", role = c(\"aut\", \"cph\"), comment = \"Author of included ReadStat code\"), person(\"Danny\", \"Smith\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Import foreign statistical formats into R via the embedded 'ReadStat' C library, .", + "License": "MIT + file LICENSE", + "URL": "https://haven.tidyverse.org, https://github.com/tidyverse/haven, https://github.com/WizardMac/ReadStat", + "BugReports": "https://github.com/tidyverse/haven/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "forcats (>= 0.2.0)", "hms", "lifecycle", "methods", - "readr", - "rlang", + "readr (>= 0.1.0)", + "rlang (>= 0.4.0)", "tibble", "tidyselect", - "vctrs" + "vctrs (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "crayon", + "fs", + "knitr", + "pillar (>= 1.4.0)", + "rmarkdown", + "testthat (>= 3.0.0)", + "utf8" + ], + "LinkingTo": [ + "cpp11" ], - "Hash": "9171f898db9d9c4c1b2c745adc2c1ef1" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make, zlib: zlib1g-dev (deb), zlib-devel (rpm)", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Evan Miller [aut, cph] (Author of included ReadStat code), Danny Smith [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "here": { "Package": "here", - "Version": "1.0.1", + "Version": "1.0.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "rprojroot" + "Title": "A Simpler Way to Find Your Files", + "Date": "2025-09-06", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Jennifer\", family = \"Bryan\", role = \"ctb\", email = \"jenny@rstudio.com\", comment = c(ORCID = \"0000-0002-6983-2759\")))", + "Description": "Constructs paths to your project's files. Declare the relative path of a file within your project with 'i_am()'. Use the 'here()' function as a drop-in replacement for 'file.path()', it will always locate the files relative to your project root.", + "License": "MIT + file LICENSE", + "URL": "https://here.r-lib.org/, https://github.com/r-lib/here", + "BugReports": "https://github.com/r-lib/here/issues", + "Imports": [ + "rprojroot (>= 2.1.0)" + ], + "Suggests": [ + "conflicted", + "covr", + "fs", + "knitr", + "palmerpenguins", + "plyr", + "readr", + "rlang", + "rmarkdown", + "testthat", + "uuid", + "withr" ], - "Hash": "24b224366f9c2e7534d2344d10d59211" + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Jennifer Bryan [ctb] (ORCID: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "hexbin": { "Package": "hexbin", - "Version": "1.28.3", + "Version": "1.28.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics", - "grid", + "Title": "Hexagonal Binning Routines", + "Authors@R": "c(person(given = \"Dan\", family = \"Carr\", role = \"aut\", email = \"dcarr@voxel.galaxy.gmu.edu\"), person(given = c(\"Nicholas\"), family = \"Lewin-Koh\", role = \"aut\"), person(given = \"Martin\", family = \"Maechler\", role = \"aut\", email = \"maechler@stat.math.ethz.ch\"), person(given = \"Deepayan\", family = \"Sarkar\", role = \"aut\", email = \"deepayan.sarkar@r-project.org\"), person(given = \"Edzer\", family = \"Pebesma\", role = \"cre\", comment = c(ORCID = \"0000-0001-8049-7069\"), email = \"edzer.pebesma@uni-muenster.de\"))", + "Depends": [ + "R (>= 2.0.1)", + "methods" + ], + "Imports": [ "lattice", - "methods", + "grid", + "graphics", + "grDevices", "stats", "utils" ], - "Hash": "124e384c01d8746f1c12f9dc1b80a161" + "Suggests": [ + "marray", + "affy", + "Biobase", + "limma", + "knitr" + ], + "Description": "Binning and plotting functions for hexagonal bins.", + "Collate": "lattice.R BTC.R BTY.R grid.hexagons.R grid.hexlegend.R hbox.R hdiffplot.R hexbinList.R hexbinplot.R hexbin.s4.R hexpanel.R hexplom.R hexPlotMA.R hexutil.R hexViewport.R HO.R LINGRAY.R LOCS.R MAG.R RB.R smoothHexbin.R", + "License": "GPL-2", + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "URL": "https://github.com/edzer/hexbin", + "Author": "Dan Carr [aut], Nicholas Lewin-Koh [aut], Martin Maechler [aut], Deepayan Sarkar [aut], Edzer Pebesma [cre] ()", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "highr": { "Package": "highr", - "Version": "0.10", + "Version": "0.11", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "xfun" + "Type": "Package", + "Title": "Syntax Highlighting for R Source Code", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Yixuan\", \"Qiu\", role = \"aut\"), person(\"Christopher\", \"Gandrud\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\") )", + "Description": "Provides syntax highlighting for R source code. Currently it supports LaTeX and HTML output. Source code of other languages is supported via Andre Simon's highlight package ().", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "xfun (>= 0.18)" ], - "Hash": "06230136b2d2b9ba5805e1963fa6e890" + "Suggests": [ + "knitr", + "markdown", + "testit" + ], + "License": "GPL", + "URL": "https://github.com/yihui/highr", + "BugReports": "https://github.com/yihui/highr/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), Yixuan Qiu [aut], Christopher Gandrud [ctb], Qiang Li [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "hms": { "Package": "hms", - "Version": "1.1.3", + "Version": "1.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Pretty Time of Day", + "Date": "2025-10-11", + "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"R Consortium\", role = \"fnd\"), person(\"Posit Software, PBC\", role = \"fnd\", comment = c(ROR = \"03wc8by49\")) )", + "Description": "Implements an S3 class for storing and formatting time-of-day values, based on the 'difftime' class.", + "License": "MIT + file LICENSE", + "URL": "https://hms.tidyverse.org/, https://github.com/tidyverse/hms", + "BugReports": "https://github.com/tidyverse/hms/issues", + "Imports": [ + "cli", "lifecycle", "methods", "pkgconfig", - "rlang", - "vctrs" + "rlang (>= 1.0.2)", + "vctrs (>= 0.3.8)" ], - "Hash": "b59377caa7ed00fa41808342002138f9" + "Suggests": [ + "crayon", + "lubridate", + "pillar (>= 1.1.0)", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), R Consortium [fnd], Posit Software, PBC [fnd] (ROR: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "htmltools": { "Package": "htmltools", - "Version": "0.5.8.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "0.5.9", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for HTML", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools for HTML generation and output.", + "License": "GPL (>= 2)", + "URL": "https://github.com/rstudio/htmltools, https://rstudio.github.io/htmltools/", + "BugReports": "https://github.com/rstudio/htmltools/issues", + "Depends": [ + "R (>= 2.14.1)" + ], + "Imports": [ "base64enc", "digest", - "fastmap", + "fastmap (>= 1.1.0)", "grDevices", - "rlang", + "rlang (>= 1.0.0)", "utils" ], - "Hash": "81d371a9cc60640e74e4ab6ac46dcedc" + "Suggests": [ + "Cairo", + "markdown", + "ragg", + "shiny", + "testthat", + "withr" + ], + "Enhances": [ + "knitr" + ], + "Config/Needs/check": "knitr", + "Config/Needs/website": "rstudio/quillt, bench", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R' 'html_print.R' 'htmltools-package.R' 'images.R' 'known_tags.R' 'selector.R' 'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R' 'template.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "htmlwidgets": { "Package": "htmlwidgets", "Version": "1.6.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "HTML Widgets for R", + "Authors@R": "c( person(\"Ramnath\", \"Vaidyanathan\", role = c(\"aut\", \"cph\")), person(\"Yihui\", \"Xie\", role = \"aut\"), person(\"JJ\", \"Allaire\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Kenton\", \"Russell\", role = c(\"aut\", \"cph\")), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A framework for creating HTML widgets that render in various contexts including the R console, 'R Markdown' documents, and 'Shiny' web applications.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/ramnathv/htmlwidgets", + "BugReports": "https://github.com/ramnathv/htmlwidgets/issues", + "Imports": [ "grDevices", - "htmltools", - "jsonlite", - "knitr", + "htmltools (>= 0.5.7)", + "jsonlite (>= 0.9.16)", + "knitr (>= 1.8)", "rmarkdown", "yaml" ], - "Hash": "04291cc45198225444a397606810ac37" + "Suggests": [ + "testthat" + ], + "Enhances": [ + "shiny (>= 1.1)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Ramnath Vaidyanathan [aut, cph], Yihui Xie [aut], JJ Allaire [aut], Joe Cheng [aut], Carson Sievert [aut, cre] (), Kenton Russell [aut, cph], Ellis Hughes [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "httpuv": { "Package": "httpuv", - "Version": "1.6.15", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "Rcpp", - "later", + "Version": "1.6.16", + "Source": "Repository", + "Type": "Package", + "Title": "HTTP and WebSocket Server Library", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit, PBC\", \"fnd\", role = \"cph\"), person(\"Hector\", \"Corrada Bravo\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Andrzej\", \"Krzemienski\", role = \"cph\", comment = \"optional.hpp\"), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file\"), person(\"Niels\", \"Provos\", role = \"cph\", comment = \"libuv subcomponent: tree.h\"), person(\"Internet Systems Consortium, Inc.\", role = \"cph\", comment = \"libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c\"), person(\"Alexander\", \"Chemeris\", role = \"cph\", comment = \"libuv subcomponent: stdint-msvc2008.h (from msinttypes)\"), person(\"Google, Inc.\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Sony Mobile Communcations AB\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Berkeley Software Design Inc.\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Kenneth\", \"MacKay\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016)\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Steve\", \"Reid\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"James\", \"Brown\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"Bob\", \"Trower\", role = \"aut\", comment = \"base64 implementation\"), person(\"Alexander\", \"Peslyak\", role = \"aut\", comment = \"MD5 implementation\"), person(\"Trantor Standard Systems\", role = \"cph\", comment = \"base64 implementation\"), person(\"Igor\", \"Sysoev\", role = \"cph\", comment = \"http-parser\") )", + "Description": "Provides low-level socket and protocol support for handling HTTP and WebSocket requests directly from within R. It is primarily intended as a building block for other packages, rather than making it particularly easy to create complete web applications using httpuv alone. httpuv is built on top of the libuv and http-parser C libraries, both of which were developed by Joyent, Inc. (See LICENSE file for libuv and http-parser license information.)", + "License": "GPL (>= 2) | file LICENSE", + "URL": "https://github.com/rstudio/httpuv", + "BugReports": "https://github.com/rstudio/httpuv/issues", + "Depends": [ + "R (>= 2.15.1)" + ], + "Imports": [ + "later (>= 0.8.0)", "promises", + "R6", + "Rcpp (>= 1.0.7)", "utils" ], - "Hash": "d55aa087c47a63ead0f6fc10f8fa1ee0" + "Suggests": [ + "callr", + "curl", + "jsonlite", + "testthat", + "websocket" + ], + "LinkingTo": [ + "later", + "Rcpp" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make, zlib", + "Collate": "'RcppExports.R' 'httpuv.R' 'random_port.R' 'server.R' 'staticServer.R' 'static_paths.R' 'utils.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Winston Chang [aut, cre], Posit, PBC fnd [cph], Hector Corrada Bravo [ctb], Jeroen Ooms [ctb], Andrzej Krzemienski [cph] (optional.hpp), libuv project contributors [cph] (libuv library, see src/libuv/AUTHORS file), Joyent, Inc. and other Node contributors [cph] (libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file), Niels Provos [cph] (libuv subcomponent: tree.h), Internet Systems Consortium, Inc. [cph] (libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c), Alexander Chemeris [cph] (libuv subcomponent: stdint-msvc2008.h (from msinttypes)), Google, Inc. [cph] (libuv subcomponent: pthread-fixes.c), Sony Mobile Communcations AB [cph] (libuv subcomponent: pthread-fixes.c), Berkeley Software Design Inc. [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Kenneth MacKay [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016) [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Steve Reid [aut] (SHA-1 implementation), James Brown [aut] (SHA-1 implementation), Bob Trower [aut] (base64 implementation), Alexander Peslyak [aut] (MD5 implementation), Trantor Standard Systems [cph] (base64 implementation), Igor Sysoev [cph] (http-parser)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "httr": { "Package": "httr", - "Version": "1.4.7", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "curl", + "Version": "1.4.8", + "Source": "Repository", + "Title": "Tools for Working with URLs and HTTP", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Useful tools for working with HTTP organised by HTTP verbs (GET(), POST(), etc). Configuration functions make it easy to control additional request components (authenticate(), add_headers() and so on).", + "License": "MIT + file LICENSE", + "URL": "https://httr.r-lib.org/, https://github.com/r-lib/httr", + "BugReports": "https://github.com/r-lib/httr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "curl (>= 5.1.0)", "jsonlite", "mime", - "openssl" + "openssl (>= 0.8)", + "R6" + ], + "Suggests": [ + "covr", + "httpuv", + "jpeg", + "knitr", + "png", + "readr", + "rmarkdown", + "testthat (>= 0.8.0)", + "xml2" ], - "Hash": "ac107251d9d9fd72f0ca8049988f1d7f" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "httr2": { "Package": "httr2", - "Version": "1.0.1", + "Version": "1.2.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", - "curl", + "Title": "Perform HTTP Requests and Process the Responses", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Maximilian\", \"Girlich\", role = \"ctb\") )", + "Description": "Tools for creating and modifying HTTP requests, then performing them and processing the results. 'httr2' is a modern re-imagining of 'httr' that uses a pipe-based interface and solves more of the problems that API wrapping packages face.", + "License": "MIT + file LICENSE", + "URL": "https://httr2.r-lib.org, https://github.com/r-lib/httr2", + "BugReports": "https://github.com/r-lib/httr2/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "curl (>= 6.4.0)", "glue", "lifecycle", "magrittr", "openssl", + "R6", "rappdirs", - "rlang", - "vctrs", + "rlang (>= 1.1.0)", + "vctrs (>= 0.6.3)", "withr" ], - "Hash": "03d741c92fda96d98c3a3f22494e3b4a" + "Suggests": [ + "askpass", + "bench", + "clipr", + "covr", + "docopt", + "httpuv", + "jose", + "jsonlite", + "knitr", + "later (>= 1.4.0)", + "nanonext", + "otel (>= 0.2.0)", + "otelsdk (>= 0.2.0)", + "paws.common (>= 0.8.0)", + "promises", + "rmarkdown", + "testthat (>= 3.1.8)", + "tibble", + "webfakes (>= 1.4.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "resp-stream, req-perform", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], Maximilian Girlich [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "hunspell": { "Package": "hunspell", - "Version": "3.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "3.0.6", + "Source": "Repository", + "Type": "Package", + "Title": "High-Performance Stemmer, Tokenizer, and Spell Checker", + "Depends": [ + "R (>= 3.0.2)" + ], + "Encoding": "UTF-8", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", ,\"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Authors of libhunspell\", role = \"cph\", comment = \"see AUTHORS file\"))", + "Description": "Low level spell checker and morphological analyzer based on the famous 'hunspell' library . The package can analyze or check individual words as well as parse text, latex, html or xml documents. For a more user-friendly interface use the 'spelling' package which builds on this package to automate checking of files, documentation and vignettes in all common formats.", + "License": "GPL-2 | LGPL-2.1 | MPL-1.1", + "URL": "https://docs.ropensci.org/hunspell/ https://ropensci.r-universe.dev/hunspell", + "BugReports": "https://github.com/ropensci/hunspell/issues", + "Imports": [ "Rcpp", "digest" ], - "Hash": "e957e989ea17f937964f0d46b0f0bca0" + "LinkingTo": [ + "Rcpp (>= 0.12.12)" + ], + "Suggests": [ + "spelling", + "testthat", + "knitr", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.2.3", + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre], Authors of libhunspell [cph] (see AUTHORS file)", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "ids": { "Package": "ids", "Version": "1.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Generate Random Identifiers", + "Authors@R": "person(\"Rich\", \"FitzJohn\", role = c(\"aut\", \"cre\"), email = \"rich.fitzjohn@gmail.com\")", + "Description": "Generate random or human readable and pronounceable identifiers.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/richfitz/ids", + "BugReports": "https://github.com/richfitz/ids/issues", + "Imports": [ "openssl", "uuid" ], - "Hash": "99df65cfef20e525ed38c3d2577f7190" + "Suggests": [ + "knitr", + "rcorpora", + "rmarkdown", + "testthat" + ], + "RoxygenNote": "6.0.1", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Rich FitzJohn [aut, cre]", + "Maintainer": "Rich FitzJohn ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "igraph": { "Package": "igraph", - "Version": "2.0.3", + "Version": "2.2.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", + "Title": "Network Analysis and Visualization", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Tamás\", \"Nepusz\", , \"ntamas@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-1451-338X\")), person(\"Vincent\", \"Traag\", role = \"aut\", comment = c(ORCID = \"0000-0003-3170-3879\")), person(\"Szabolcs\", \"Horvát\", , \"szhorvat@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-3100-523X\")), person(\"Fabio\", \"Zanini\", , \"fabio.zanini@unsw.edu.au\", role = \"aut\", comment = c(ORCID = \"0000-0001-7097-8539\")), person(\"Daniel\", \"Noom\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Michael\", \"Antonov\", role = \"ctb\"), person(\"Chan Zuckerberg Initiative\", role = \"fnd\", comment = c(ROR = \"02qenvm24\")), person(\"David\", \"Schoch\", , \"david.schoch@cynkra.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-2952-4812\")), person(\"Maëlle\", \"Salmon\", , \"maelle@cynkra.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-2815-0399\")) )", + "Description": "Routines for simple graphs and network analysis. It can handle large graphs very well and provides functions for generating random and regular graphs, graph visualization, centrality methods and much more.", + "License": "GPL (>= 2)", + "URL": "https://r.igraph.org/, https://igraph.org/, https://igraph.discourse.group/", + "BugReports": "https://github.com/igraph/rigraph/issues", + "Depends": [ + "methods", + "R (>= 3.5.0)" + ], + "Imports": [ "cli", - "cpp11", - "grDevices", "graphics", + "grDevices", "lifecycle", "magrittr", - "methods", - "pkgconfig", - "rlang", + "Matrix", + "pkgconfig (>= 2.0.0)", + "rlang (>= 1.1.0)", "stats", "utils", "vctrs" ], - "Hash": "c3b7d801d722e26e4cd888e042bf9af5" + "Suggests": [ + "ape (>= 5.7-0.1)", + "callr", + "decor", + "digest", + "igraphdata", + "knitr", + "rgl (>= 1.3.14)", + "rmarkdown", + "scales", + "stats4", + "tcltk", + "testthat", + "vdiffr", + "withr" + ], + "Enhances": [ + "graph" + ], + "LinkingTo": [ + "cpp11 (>= 0.5.0)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "false", + "Config/build/never-clean": "true", + "Config/comment/compilation-database": "Generate manually with pkgload:::generate_db() for faster pkgload::load_all()", + "Config/Needs/build": "r-lib/roxygen2, devtools, irlba, pkgconfig, igraph/igraph.r2cdocs, moodymudskipper/devtag", + "Config/Needs/coverage": "covr", + "Config/Needs/website": "here, readr, tibble, xmlparsedata, xml2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "aaa-auto, vs-es, scan, vs-operators, weakref, watts.strogatz.game", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "SystemRequirements": "libxml2 (optional), glpk (>= 4.57, optional)", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut] (ORCID: ), Tamás Nepusz [aut] (ORCID: ), Vincent Traag [aut] (ORCID: ), Szabolcs Horvát [aut] (ORCID: ), Fabio Zanini [aut] (ORCID: ), Daniel Noom [aut], Kirill Müller [aut, cre] (ORCID: ), Michael Antonov [ctb], Chan Zuckerberg Initiative [fnd] (ROR: ), David Schoch [aut] (ORCID: ), Maëlle Salmon [aut] (ORCID: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "invgamma": { "Package": "invgamma", - "Version": "1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "d124cd1623454d8aeaaec5d67cf1d146" + "Version": "1.2", + "Source": "Repository", + "Type": "Package", + "Title": "The Inverse Gamma Distribution", + "URL": "https://github.com/dkahle/invgamma, https://www.kahle.io/invgamma/", + "BugReports": "https://github.com/dkahle/invgamma/issues", + "Authors@R": "c( person(\"David\", \"Kahle\", email = \"david.kahle@gmail.com\", role = c(\"aut\", \"cre\", \"cph\")), person(\"James\", \"Stamey\", email = \"james_stamey@baylor.edu\", role = c(\"aut\", \"cph\")) )", + "Description": "Light weight implementation of the standard distribution functions for the inverse gamma distribution, wrapping those for the gamma distribution in the stats package.", + "License": "MIT + file LICENSE", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "Suggests": [ + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "David Kahle [aut, cre, cph], James Stamey [aut, cph]", + "Maintainer": "David Kahle ", + "Repository": "CRAN" }, "irlba": { "Package": "irlba", - "Version": "2.3.5.1", + "Version": "2.3.7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", - "methods", - "stats" + "Type": "Package", + "Title": "Fast Truncated Singular Value Decomposition and Principal Components Analysis for Large Dense and Sparse Matrices", + "Date": "2026-1-26", + "Authors@R": "c( person(\"Jim\", \"Baglama\", role=c(\"aut\", \"cph\"), email=\"jbaglama@uri.edu\"), person(\"Lothar\", \"Reichel\", role=c(\"aut\", \"cph\"), email=\"reichel@math.kent.edu\"), person(\"B. W.\", \"Lewis\", role=c(\"aut\",\"cre\",\"cph\"), email=\"blewis@illposed.net\"))", + "Description": "Fast and memory efficient methods for truncated singular value decomposition and principal components analysis of large sparse and dense matrices.", + "Depends": [ + "R (>= 3.6.2)", + "Matrix" + ], + "LinkingTo": [ + "Matrix" ], - "Hash": "acb06a47b732c6251afd16e19c3201ff" + "Imports": [ + "stats", + "methods" + ], + "License": "GPL-3", + "BugReports": "https://github.com/bwlewis/irlba/issues", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Jim Baglama [aut, cph], Lothar Reichel [aut, cph], B. W. Lewis [aut, cre, cph]", + "Maintainer": "B. W. Lewis ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "isoband": { "Package": "isoband", - "Version": "0.2.7", + "Version": "0.3.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Generate Isolines and Isobands from Regularly Spaced Elevation Grids", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Claus O.\", \"Wilke\", , \"wilke@austin.utexas.edu\", role = \"aut\", comment = c(\"Original author\", ORCID = \"0000-0002-7470-9261\")), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A fast C++ implementation to generate contour lines (isolines) and contour polygons (isobands) from regularly spaced grids containing elevation data.", + "License": "MIT + file LICENSE", + "URL": "https://isoband.r-lib.org, https://github.com/r-lib/isoband", + "BugReports": "https://github.com/r-lib/isoband/issues", + "Imports": [ + "cli", "grid", + "rlang", "utils" ], - "Hash": "0080607b4a1a7b28979aecef976d8bc2" + "Suggests": [ + "covr", + "ggplot2", + "knitr", + "magick", + "bench", + "rmarkdown", + "sf", + "testthat (>= 3.0.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-12-05", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/build/compilation-database": "true", + "LinkingTo": [ + "cpp11" + ], + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut] (ORCID: ), Claus O. Wilke [aut] (Original author, ORCID: ), Thomas Lin Pedersen [aut, cre] (ORCID: ), Posit, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "iterators": { "Package": "iterators", "Version": "1.0.14", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Provides Iterator Construct", + "Authors@R": "c(person(\"Folashade\", \"Daniel\", role=\"cre\", email=\"fdaniel@microsoft.com\"), person(\"Revolution\", \"Analytics\", role=c(\"aut\", \"cph\")), person(\"Steve\", \"Weston\", role=\"aut\"))", + "Description": "Support for iterators, which allow a programmer to traverse through all the elements of a vector, list, or other collection of data.", + "URL": "https://github.com/RevolutionAnalytics/iterators", + "Depends": [ + "R (>= 2.5.0)", "utils" ], - "Hash": "8954069286b4b2b0d023d1b288dce978" + "Suggests": [ + "RUnit", + "foreach" + ], + "License": "Apache License (== 2.0)", + "NeedsCompilation": "no", + "Author": "Folashade Daniel [cre], Revolution Analytics [aut, cph], Steve Weston [aut]", + "Maintainer": "Folashade Daniel ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "jquerylib": { "Package": "jquerylib", "Version": "0.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Obtain 'jQuery' as an HTML Dependency Object", + "Authors@R": "c( person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"), person(family = \"RStudio\", role = \"cph\"), person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\") )", + "Description": "Obtain any major version of 'jQuery' () and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown'). Most R users don't need to use this package directly, but other R packages (e.g. 'shiny', 'rmarkdown', etc.) depend on this package to avoid bundling redundant copies of 'jQuery'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "RoxygenNote": "7.0.2", + "Imports": [ "htmltools" ], - "Hash": "5aab57a3bd297eee1c1d862735972182" + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], RStudio [cph], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "jsonlite": { "Package": "jsonlite", - "Version": "1.8.8", + "Version": "2.0.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "A Simple and Robust JSON Parser and Generator for R", + "License": "MIT + file LICENSE", + "Depends": [ "methods" ], - "Hash": "e1b9c55281c5adc4dd113652d9e26768" + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Duncan\", \"Temple Lang\", role = \"ctb\"), person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))", + "URL": "https://jeroen.r-universe.dev/jsonlite https://arxiv.org/abs/1403.2805", + "BugReports": "https://github.com/jeroen/jsonlite/issues", + "Maintainer": "Jeroen Ooms ", + "VignetteBuilder": "knitr, R.rsp", + "Description": "A reasonably fast JSON parser and generator, optimized for statistical data and the web. Offers simple, flexible tools for working with JSON in R, and is particularly powerful for building pipelines and interacting with a web API. The implementation is based on the mapping described in the vignette (Ooms, 2014). In addition to converting JSON data from/to R objects, 'jsonlite' contains functions to stream, validate, and prettify JSON data. The unit tests included with the package verify that all edge cases are encoded and decoded consistently for use with dynamic data in systems and applications.", + "Suggests": [ + "httr", + "vctrs", + "testthat", + "knitr", + "rmarkdown", + "R.rsp", + "sf" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Duncan Temple Lang [ctb], Lloyd Hilaiel [cph] (author of bundled libyajl)", + "Repository": "CRAN" }, "jsonvalidate": { "Package": "jsonvalidate", - "Version": "1.3.2", + "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Validate 'JSON' Schema", + "Authors@R": "c(person(\"Rich\", \"FitzJohn\", role = c(\"aut\", \"cre\"), email = \"rich.fitzjohn@gmail.com\"), person(\"Rob\", \"Ashton\", role = \"aut\"), person(\"Alex\", \"Hill\", role = \"ctb\"), person(\"Alicia\", \"Schep\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Kara\", \"Woo\", role = \"ctb\"), person(\"Mathias\", \"Buus\", role = c(\"aut\", \"cph\"), comment = \"Author of bundled imjv library\"), person(\"Evgeny\", \"Poberezkin\", role = c(\"aut\", \"cph\"), comment = \"Author of bundled Ajv library\"))", + "Maintainer": "Rich FitzJohn ", + "Description": "Uses the node library 'is-my-json-valid' or 'ajv' to validate 'JSON' against a 'JSON' schema. Drafts 04, 06 and 07 of 'JSON' schema are supported.", + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/jsonvalidate/, https://github.com/ropensci/jsonvalidate", + "BugReports": "https://github.com/ropensci/jsonvalidate/issues", + "Imports": [ + "R6", "V8" ], - "Hash": "cdc2843ef7f44f157198bb99aea7552d" + "Suggests": [ + "knitr", + "jsonlite", + "rmarkdown", + "testthat", + "withr" + ], + "RoxygenNote": "7.3.2", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Language": "en-GB", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Rich FitzJohn [aut, cre], Rob Ashton [aut], Alex Hill [ctb], Alicia Schep [ctb], Ian Lyttle [ctb], Kara Woo [ctb], Mathias Buus [aut, cph] (Author of bundled imjv library), Evgeny Poberezkin [aut, cph] (Author of bundled Ajv library)", + "Repository": "CRAN" }, "kernlab": { "Package": "kernlab", "Version": "0.9-33", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics", + "Title": "Kernel-Based Machine Learning Lab", + "Authors@R": "c(person(\"Alexandros\", \"Karatzoglou\", role = c(\"aut\", \"cre\"), email = \"alexandros.karatzoglou@gmail.com\"), person(\"Alex\", \"Smola\", role = \"aut\"), person(\"Kurt\", \"Hornik\", role = \"aut\", email = \"Kurt.Hornik@R-project.org\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"National ICT Australia (NICTA)\", role = \"cph\"), person(c(\"Michael\", \"A.\"), \"Maniscalco\", role = c(\"ctb\", \"cph\")), person(c(\"Choon\", \"Hui\"), \"Teo\", role = \"ctb\"))", + "Description": "Kernel-based machine learning methods for classification, regression, clustering, novelty detection, quantile regression and dimensionality reduction. Among other methods 'kernlab' includes Support Vector Machines, Spectral Clustering, Kernel PCA, Gaussian Processes and a QP solver.", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ "methods", - "stats" + "stats", + "grDevices", + "graphics" ], - "Hash": "97d266249d6c3b4f40e34e1ceaf9c558" + "LazyLoad": "Yes", + "License": "GPL-2", + "NeedsCompilation": "yes", + "Author": "Alexandros Karatzoglou [aut, cre], Alex Smola [aut], Kurt Hornik [aut] (), National ICT Australia (NICTA) [cph], Michael A. Maniscalco [ctb, cph], Choon Hui Teo [ctb]", + "Maintainer": "Alexandros Karatzoglou ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "knitr": { "Package": "knitr", - "Version": "1.46", + "Version": "1.51", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "evaluate", - "highr", + "Type": "Package", + "Title": "A General-Purpose Package for Dynamic Report Generation in R", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Abhraneel\", \"Sarma\", role = \"ctb\"), person(\"Adam\", \"Vogt\", role = \"ctb\"), person(\"Alastair\", \"Andrew\", role = \"ctb\"), person(\"Alex\", \"Zvoleff\", role = \"ctb\"), person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"), person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"), person(\"Aron\", \"Atkins\", role = \"ctb\"), person(\"Aaron\", \"Wolen\", role = \"ctb\"), person(\"Ashley\", \"Manton\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")), person(\"Ben\", \"Baumer\", role = \"ctb\"), person(\"Brian\", \"Diggs\", role = \"ctb\"), person(\"Brian\", \"Zhang\", role = \"ctb\"), person(\"Bulat\", \"Yapparov\", role = \"ctb\"), person(\"Cassio\", \"Pereira\", role = \"ctb\"), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person(\"David\", \"Hall\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", role = \"ctb\"), person(\"David\", \"Robinson\", role = \"ctb\"), person(\"Doug\", \"Hemken\", role = \"ctb\"), person(\"Duncan\", \"Murdoch\", role = \"ctb\"), person(\"Elio\", \"Campitelli\", role = \"ctb\"), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Emily\", \"Riederer\", role = \"ctb\"), person(\"Fabian\", \"Hirschmann\", role = \"ctb\"), person(\"Fitch\", \"Simeon\", role = \"ctb\"), person(\"Forest\", \"Fang\", role = \"ctb\"), person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"), person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"), person(\"Gregoire\", \"Detrez\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Hao\", \"Zhu\", role = \"ctb\"), person(\"Heewon\", \"Jeon\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Hodges\", \"Daniel\", role = \"ctb\"), person(\"Jacob\", \"Bien\", role = \"ctb\"), person(\"Jake\", \"Burkhead\", role = \"ctb\"), person(\"James\", \"Manton\", role = \"ctb\"), person(\"Jared\", \"Lander\", role = \"ctb\"), person(\"Jason\", \"Punyon\", role = \"ctb\"), person(\"Javier\", \"Luraschi\", role = \"ctb\"), person(\"Jeff\", \"Arnold\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", role = \"ctb\"), person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"), person(\"Jeremy\", \"Stephens\", role = \"ctb\"), person(\"Jim\", \"Hester\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Johannes\", \"Ranke\", role = \"ctb\"), person(\"John\", \"Honaker\", role = \"ctb\"), person(\"John\", \"Muschelli\", role = \"ctb\"), person(\"Jonathan\", \"Keane\", role = \"ctb\"), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Johan\", \"Toloe\", role = \"ctb\"), person(\"Jonathan\", \"Sidi\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Julien\", \"Barnier\", role = \"ctb\"), person(\"Kaiyin\", \"Zhong\", role = \"ctb\"), person(\"Kamil\", \"Slowikowski\", role = \"ctb\"), person(\"Karl\", \"Forner\", role = \"ctb\"), person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"), person(\"Kirill\", \"Mueller\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Lorenz\", \"Walthert\", role = \"ctb\"), person(\"Lucas\", \"Gallindo\", role = \"ctb\"), person(\"Marius\", \"Hofert\", role = \"ctb\"), person(\"Martin\", \"Modrák\", role = \"ctb\"), person(\"Michael\", \"Chirico\", role = \"ctb\"), person(\"Michael\", \"Friendly\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", role = \"ctb\"), person(\"Michel\", \"Kuhlmann\", role = \"ctb\"), person(\"Miller\", \"Patrick\", role = \"ctb\"), person(\"Nacho\", \"Caballero\", role = \"ctb\"), person(\"Nick\", \"Salkowski\", role = \"ctb\"), person(\"Niels Richard\", \"Hansen\", role = \"ctb\"), person(\"Noam\", \"Ross\", role = \"ctb\"), person(\"Obada\", \"Mahdi\", role = \"ctb\"), person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")), person(\"Pedro\", \"Faria\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\"), person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"), person(\"Rodrigo\", \"Copetti\", role = \"ctb\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Ruaridh\", \"Williamson\", role = \"ctb\"), person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")), person(\"Scott\", \"Kostyshak\", role = \"ctb\"), person(\"Sebastian\", \"Meyer\", role = \"ctb\"), person(\"Sietse\", \"Brouwer\", role = \"ctb\"), person(c(\"Simon\", \"de\"), \"Bernard\", role = \"ctb\"), person(\"Sylvain\", \"Rousseau\", role = \"ctb\"), person(\"Taiyun\", \"Wei\", role = \"ctb\"), person(\"Thibaut\", \"Assus\", role = \"ctb\"), person(\"Thibaut\", \"Lamadon\", role = \"ctb\"), person(\"Thomas\", \"Leeper\", role = \"ctb\"), person(\"Tim\", \"Mastny\", role = \"ctb\"), person(\"Tom\", \"Torsney-Weir\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = \"ctb\"), person(\"Viktoras\", \"Veitas\", role = \"ctb\"), person(\"Weicheng\", \"Zhu\", role = \"ctb\"), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Zachary\", \"Foster\", role = \"ctb\"), person(\"Zhian N.\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a general-purpose tool for dynamic report generation in R using Literate Programming techniques.", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "evaluate (>= 0.15)", + "highr (>= 0.11)", "methods", "tools", - "xfun", - "yaml" + "xfun (>= 0.52)", + "yaml (>= 2.1.19)" ], - "Hash": "6e008ab1d696a5283c79765fa7b56b47" + "Suggests": [ + "bslib", + "DBI (>= 0.4-1)", + "digest", + "formatR", + "gifski", + "gridSVG", + "htmlwidgets (>= 0.7)", + "jpeg", + "JuliaCall (>= 0.11.1)", + "magick", + "litedown", + "markdown (>= 1.3)", + "otel", + "otelsdk", + "png", + "ragg", + "reticulate (>= 1.4)", + "rgl (>= 0.95.1201)", + "rlang", + "rmarkdown", + "sass", + "showtext", + "styler (>= 1.2.0)", + "targets (>= 0.6.0)", + "testit", + "tibble", + "tikzDevice (>= 0.10)", + "tinytex (>= 0.56)", + "webshot", + "rstudioapi", + "svglite" + ], + "License": "GPL", + "URL": "https://yihui.org/knitr/", + "BugReports": "https://github.com/yihui/knitr/issues", + "Encoding": "UTF-8", + "VignetteBuilder": "litedown, knitr", + "SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).", + "Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'otel.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (ORCID: , URL: https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (ORCID: ), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (ORCID: ), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (ORCID: ), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "labeling": { "Package": "labeling", "Version": "0.4.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "graphics", - "stats" + "Type": "Package", + "Title": "Axis Labeling", + "Date": "2023-08-29", + "Author": "Justin Talbot,", + "Maintainer": "Nuno Sempere ", + "Description": "Functions which provide a range of axis labeling algorithms.", + "License": "MIT + file LICENSE | Unlimited", + "Collate": "'labeling.R'", + "NeedsCompilation": "no", + "Imports": [ + "stats", + "graphics" ], - "Hash": "b64ec208ac5bc1852b285f665d6368b3" - }, - "labelled": { - "Package": "labelled", - "Version": "2.13.0", - "Source": "Repository", "Repository": "CRAN", - "Requirements": [ - "R", - "dplyr", - "haven", - "lifecycle", - "rlang", - "stringr", - "tidyr", - "tidyselect", - "vctrs" - ], - "Hash": "ad4b6d757624221aec6220b8c78defeb" + "Encoding": "UTF-8" }, "lambda.r": { "Package": "lambda.r", "Version": "1.2.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Modeling Data with Functional Programming", + "Date": "2019-09-15", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ "formatR" ], - "Hash": "b1e925c4b9ffeb901bacf812cbe9a6ad" + "Suggests": [ + "testit" + ], + "Author": "Brian Lee Yung Rowe", + "Maintainer": "Brian Lee Yung Rowe ", + "Description": "A language extension to efficiently write functional programs in R. Syntax extensions include multi-part function definitions, pattern matching, guard statements, built-in (optional) type safety.", + "License": "LGPL-3", + "LazyLoad": "yes", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "later": { "Package": "later", - "Version": "1.3.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Rcpp", + "Version": "1.4.6", + "Source": "Repository", + "Type": "Package", + "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", + "License": "MIT + file LICENSE", + "URL": "https://later.r-lib.org, https://github.com/r-lib/later", + "BugReports": "https://github.com/r-lib/later/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "Rcpp (>= 1.0.10)", "rlang" ], - "Hash": "a3e051d405326b8b0012377434c62b37" + "Suggests": [ + "knitr", + "nanonext", + "promises", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-07-18", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Maintainer": "Charlie Gao ", + "Repository": "CRAN" }, "lattice": { "Package": "lattice", - "Version": "0.22-6", + "Version": "0.22-7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Date": "2025-03-31", + "Priority": "recommended", + "Title": "Trellis Graphics for R", + "Authors@R": "c(person(\"Deepayan\", \"Sarkar\", role = c(\"aut\", \"cre\"), email = \"deepayan.sarkar@r-project.org\", comment = c(ORCID = \"0000-0003-4107-1553\")), person(\"Felix\", \"Andrews\", role = \"ctb\"), person(\"Kevin\", \"Wright\", role = \"ctb\", comment = \"documentation\"), person(\"Neil\", \"Klepeis\", role = \"ctb\"), person(\"Johan\", \"Larsson\", role = \"ctb\", comment = \"miscellaneous improvements\"), person(\"Zhijian (Jason)\", \"Wen\", role = \"cph\", comment = \"filled contour code\"), person(\"Paul\", \"Murrell\", role = \"ctb\", email = \"paul@stat.auckland.ac.nz\"), person(\"Stefan\", \"Eng\", role = \"ctb\", comment = \"violin plot improvements\"), person(\"Achim\", \"Zeileis\", role = \"ctb\", comment = \"modern colors\"), person(\"Alexandre\", \"Courtiol\", role = \"ctb\", comment = \"generics for larrows, lpolygon, lrect and lsegments\") )", + "Description": "A powerful and elegant high-level data visualization system inspired by Trellis graphics, with an emphasis on multivariate data. Lattice is sufficient for typical graphics needs, and is also flexible enough to handle most nonstandard requirements. See ?Lattice for an introduction.", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "KernSmooth", + "MASS", + "latticeExtra", + "colorspace" + ], + "Imports": [ + "grid", "grDevices", "graphics", - "grid", "stats", "utils" ], - "Hash": "cc5ac1ba4c238c7ca9fa6a87ca11a7e2" + "Enhances": [ + "chron", + "zoo" + ], + "LazyLoad": "yes", + "LazyData": "yes", + "License": "GPL (>= 2)", + "URL": "https://lattice.r-forge.r-project.org/", + "BugReports": "https://github.com/deepayan/lattice/issues", + "NeedsCompilation": "yes", + "Author": "Deepayan Sarkar [aut, cre] (), Felix Andrews [ctb], Kevin Wright [ctb] (documentation), Neil Klepeis [ctb], Johan Larsson [ctb] (miscellaneous improvements), Zhijian (Jason) Wen [cph] (filled contour code), Paul Murrell [ctb], Stefan Eng [ctb] (violin plot improvements), Achim Zeileis [ctb] (modern colors), Alexandre Courtiol [ctb] (generics for larrows, lpolygon, lrect and lsegments)", + "Maintainer": "Deepayan Sarkar ", + "Repository": "CRAN" }, "lazyeval": { "Package": "lazyeval", "Version": "0.2.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Lazy (Non-Standard) Evaluation", + "Description": "An alternative approach to non-standard evaluation using formulas. Provides a full implementation of LISP style 'quasiquotation', making it easier to generate code with other code.", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", ,\"hadley@rstudio.com\", c(\"aut\", \"cre\")), person(\"RStudio\", role = \"cph\") )", + "License": "GPL-3", + "LazyData": "true", + "Depends": [ + "R (>= 3.1.0)" ], - "Hash": "d908914ae53b04d4c0c0fd72ecc35370" - }, + "Suggests": [ + "knitr", + "rmarkdown (>= 0.2.65)", + "testthat", + "covr" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "6.1.1", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], RStudio [cph]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN", + "Encoding": "UTF-8" + }, "lifecycle": { "Package": "lifecycle", - "Version": "1.0.4", + "Version": "1.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "rlang" + "Title": "Manage the Life Cycle of your Package Functions", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Manage the life cycle of your exported functions with shared conventions, documentation badges, and user-friendly deprecation warnings.", + "License": "MIT + file LICENSE", + "URL": "https://lifecycle.r-lib.org/, https://github.com/r-lib/lifecycle", + "BugReports": "https://github.com/r-lib/lifecycle/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "knitr", + "lintr (>= 3.1.0)", + "rmarkdown", + "testthat (>= 3.0.1)", + "tibble", + "tidyverse", + "tools", + "vctrs", + "withr", + "xml2" ], - "Hash": "b8552d117e1b808b09a832f589b79035" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, usethis", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "limma": { "Package": "limma", - "Version": "3.60.0", + "Version": "3.66.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", + "Date": "2025-10-21", + "Title": "Linear Models for Microarray and Omics Data", + "Description": "Data analysis, linear models and differential expression for omics data.", + "Author": "Gordon Smyth [cre,aut], Yifang Hu [ctb], Matthew Ritchie [ctb], Jeremy Silver [ctb], James Wettenhall [ctb], Davis McCarthy [ctb], Di Wu [ctb], Wei Shi [ctb], Belinda Phipson [ctb], Aaron Lun [ctb], Natalie Thorne [ctb], Alicia Oshlack [ctb], Carolyn de Graaf [ctb], Yunshun Chen [ctb], Goknur Giner [ctb], Mette Langaas [ctb], Egil Ferkingstad [ctb], Marcus Davy [ctb], Francois Pepin [ctb], Dongseok Choi [ctb], Charity Law [ctb], Mengbo Li [ctb], Lizhong Chen [ctb]", + "Maintainer": "Gordon Smyth ", + "License": "GPL (>=2)", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ "grDevices", "graphics", - "methods", - "statmod", "stats", - "utils" + "utils", + "methods", + "statmod" + ], + "Suggests": [ + "BiasedUrn", + "ellipse", + "gplots", + "knitr", + "locfit", + "MASS", + "splines", + "affy", + "AnnotationDbi", + "Biobase", + "BiocStyle", + "GO.db", + "illuminaio", + "org.Hs.eg.db", + "vsn" + ], + "VignetteBuilder": "knitr", + "URL": "https://bioinf.wehi.edu.au/limma/", + "biocViews": "ExonArray, GeneExpression, Transcription, AlternativeSplicing, DifferentialExpression, DifferentialSplicing, GeneSetEnrichment, DataImport, Bayesian, Clustering, Regression, TimeCourse, Microarray, MicroRNAArray, mRNAMicroarray, OneChannel, ProprietaryPlatforms, TwoChannel, Sequencing, RNASeq, BatchEffect, MultipleComparison, Normalization, Preprocessing, QualityControl, BiomedicalInformatics, CellBiology, Cheminformatics, Epigenetics, FunctionalGenomics, Genetics, ImmunoOncology, Metabolomics, Proteomics, SystemsBiology, Transcriptomics", + "git_url": "https://git.bioconductor.org/packages/limma", + "git_branch": "RELEASE_3_22", + "git_last_commit": "1c4b971", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes" + }, + "litedown": { + "Package": "litedown", + "Version": "0.9", + "Source": "Repository", + "Type": "Package", + "Title": "A Lightweight Version of R Markdown", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Tim\", \"Taylor\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8587-7113\")), person() )", + "Description": "Render R Markdown to Markdown (without using 'knitr'), and Markdown to lightweight HTML or 'LaTeX' documents with the 'commonmark' package (instead of 'Pandoc'). Some missing Markdown features in 'commonmark' are also supported, such as raw HTML or 'LaTeX' blocks, 'LaTeX' math, superscripts, subscripts, footnotes, element attributes, and appendices, but not all 'Pandoc' Markdown features are (or will be) supported. With additional JavaScript and CSS, you can also create HTML slides and articles. This package can be viewed as a trimmed-down version of R Markdown and 'knitr'. It does not aim at rich Markdown features or a large variety of output formats (the primary formats are HTML and 'LaTeX'). Book and website projects of multiple input documents are also supported.", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "utils", + "commonmark (>= 2.0.0)", + "xfun (>= 0.55)" ], - "Hash": "eb9369d11da98acc7f7ca4cdab0ee3d8" + "Suggests": [ + "rbibutils", + "rstudioapi", + "tinytex" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/yihui/litedown", + "BugReports": "https://github.com/yihui/litedown/issues", + "VignetteBuilder": "litedown", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (ORCID: , URL: https://yihui.org), Tim Taylor [ctb] (ORCID: )", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "locfit": { "Package": "locfit", - "Version": "1.5-9.9", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.5-9.12", + "Source": "Repository", + "Title": "Local Regression, Likelihood and Density Estimation", + "Date": "2025-03-05", + "Authors@R": "c(person(\"Catherine\", \"Loader\", role = \"aut\"), person(\"Jiayang\", \"Sun\", role = \"ctb\"), person(\"Lucent Technologies\", role = \"cph\"), person(\"Andy\", \"Liaw\", role = \"cre\", email=\"andy_liaw@merck.com\"))", + "Author": "Catherine Loader [aut], Jiayang Sun [ctb], Lucent Technologies [cph], Andy Liaw [cre]", + "Maintainer": "Andy Liaw ", + "Description": "Local regression, likelihood and density estimation methods as described in the 1999 book by Loader.", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ "lattice" ], - "Hash": "3885127e04b35dafded049075057ad83" + "Suggests": [ + "interp", + "gam" + ], + "License": "GPL (>= 2)", + "SystemRequirements": "USE_C17", + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "lubridate": { "Package": "lubridate", - "Version": "1.9.3", + "Version": "1.9.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "generics", + "Type": "Package", + "Title": "Make Dealing with Dates a Little Easier", + "Authors@R": "c( person(\"Vitalie\", \"Spinu\", , \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Garrett\", \"Grolemund\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Davis\", \"Vaughan\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Imanuel\", \"Costigan\", role = \"ctb\"), person(\"Jason\", \"Law\", role = \"ctb\"), person(\"Doug\", \"Mitarotonda\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Jonathan\", \"Boiser\", role = \"ctb\"), person(\"Chel Hee\", \"Lee\", role = \"ctb\") )", + "Maintainer": "Vitalie Spinu ", + "Description": "Functions to work with date-times and time-spans: fast and user friendly parsing of date-time data, extraction and updating of components of a date-time (years, months, days, hours, minutes, and seconds), algebraic manipulation on date-time and time-span objects. The 'lubridate' package has a consistent and memorable syntax that makes working with dates easy and fun.", + "License": "MIT + file LICENSE", + "URL": "https://lubridate.tidyverse.org, https://github.com/tidyverse/lubridate", + "BugReports": "https://github.com/tidyverse/lubridate/issues", + "Depends": [ "methods", - "timechange" + "R (>= 3.2)" ], - "Hash": "680ad542fbcf801442c83a6ac5a2126c" + "Imports": [ + "generics", + "timechange (>= 0.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "testthat (>= 2.1.0)", + "vctrs (>= 0.6.5)" + ], + "Enhances": [ + "chron", + "data.table", + "timeDate", + "tis", + "zoo" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "Collate": "'Dates.r' 'POSIXt.r' 'util.r' 'parse.r' 'timespans.r' 'intervals.r' 'difftimes.r' 'durations.r' 'periods.r' 'accessors-date.R' 'accessors-day.r' 'accessors-dst.r' 'accessors-hour.r' 'accessors-minute.r' 'accessors-month.r' 'accessors-quarter.r' 'accessors-second.r' 'accessors-tz.r' 'accessors-week.r' 'accessors-year.r' 'am-pm.r' 'time-zones.r' 'numeric.r' 'coercion.r' 'constants.r' 'cyclic_encoding.r' 'data.r' 'decimal-dates.r' 'deprecated.r' 'format_ISO8601.r' 'guess.r' 'hidden.r' 'instants.r' 'leap-years.r' 'ops-addition.r' 'ops-compare.r' 'ops-division.r' 'ops-integer-division.r' 'ops-m+.r' 'ops-modulo.r' 'ops-multiplication.r' 'ops-subtraction.r' 'package.r' 'pretty.r' 'round.r' 'stamp.r' 'tzdir.R' 'update.r' 'vctrs.R' 'zzz.R'", + "NeedsCompilation": "yes", + "Author": "Vitalie Spinu [aut, cre], Garrett Grolemund [aut], Hadley Wickham [aut], Davis Vaughan [ctb], Ian Lyttle [ctb], Imanuel Costigan [ctb], Jason Law [ctb], Doug Mitarotonda [ctb], Joseph Larmarange [ctb], Jonathan Boiser [ctb], Chel Hee Lee [ctb]", + "Repository": "CRAN" }, "magick": { "Package": "magick", - "Version": "2.8.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Rcpp", - "curl", - "magrittr" + "Version": "2.9.0", + "Source": "Repository", + "Type": "Package", + "Title": "Advanced Graphics and Image-Processing in R", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Bindings to 'ImageMagick': the most comprehensive open-source image processing library available. Supports many common formats (png, jpeg, tiff, pdf, etc) and manipulations (rotate, scale, crop, trim, flip, blur, etc). All operations are vectorized via the Magick++ STL meaning they operate either on a single frame or a series of frames for working with layers, collages, or animation. In RStudio images are automatically previewed when printed to the console, resulting in an interactive editing environment. Also includes a graphics device for creating drawing onto images using pixel coordinates.", + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/magick/ https://ropensci.r-universe.dev/magick", + "BugReports": "https://github.com/ropensci/magick/issues", + "SystemRequirements": "ImageMagick++: ImageMagick-c++-devel (rpm) or libmagick++-dev (deb)", + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "Rcpp (>= 0.12.12)", + "magrittr", + "curl" + ], + "LinkingTo": [ + "Rcpp" ], - "Hash": "3f6bcbb8a0c1c9365b2f02d5d04ad7bc" + "Suggests": [ + "av", + "spelling", + "jsonlite", + "methods", + "knitr", + "rmarkdown", + "rsvg", + "webp", + "pdftools", + "ggplot2", + "gapminder", + "IRdisplay", + "tesseract", + "gifski" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: )", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "magrittr": { "Package": "magrittr", - "Version": "2.0.3", + "Version": "2.0.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "7ce2733a9826b3aeb1775d56fd305472" + "Type": "Package", + "Title": "A Forward-Pipe Operator for R", + "Authors@R": "c( person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"), comment = \"Original author and creator of magrittr\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"cre\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. There is flexible support for the type of right-hand side expressions. For more information, see package vignette. To quote Rene Magritte, \"Ceci n'est pas un pipe.\"", + "License": "MIT + file LICENSE", + "URL": "https://magrittr.tidyverse.org, https://github.com/tidyverse/magrittr", + "BugReports": "https://github.com/tidyverse/magrittr/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "Yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of magrittr), Hadley Wickham [aut], Lionel Henry [cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "markdown": { "Package": "markdown", - "Version": "1.12", + "Version": "2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "commonmark", + "Type": "Package", + "Title": "Render Markdown with 'commonmark'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"JJ\", \"Allaire\", role = \"aut\"), person(\"Jeffrey\", \"Horner\", role = \"aut\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Jim\", \"Hester\", role = \"ctb\"), person(\"Yixuan\", \"Qiu\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Adam\", \"November\", role = \"ctb\"), person(\"Nacho\", \"Caballero\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Thomas\", \"Leeper\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Andrzej\", \"Oles\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Render Markdown to full and lightweight HTML/LaTeX documents with the 'commonmark' package. This package has been superseded by 'litedown'.", + "Depends": [ + "R (>= 2.11.1)" + ], + "Imports": [ "utils", - "xfun" + "xfun", + "litedown (>= 0.6)" ], - "Hash": "765cf53992401b3b6c297b69e1edb8bd" + "Suggests": [ + "knitr", + "rmarkdown (>= 2.18)", + "yaml", + "RCurl" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/markdown", + "BugReports": "https://github.com/rstudio/markdown/issues", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), JJ Allaire [aut], Jeffrey Horner [aut], Henrik Bengtsson [ctb], Jim Hester [ctb], Yixuan Qiu [ctb], Kohske Takahashi [ctb], Adam November [ctb], Nacho Caballero [ctb], Jeroen Ooms [ctb], Thomas Leeper [ctb], Joe Cheng [ctb], Andrzej Oles [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "matrixStats": { "Package": "matrixStats", - "Version": "1.3.0", + "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Depends": [ + "R (>= 3.4.0)" ], - "Hash": "4b3ea27a19d669c0405b38134d89a9d1" + "Suggests": [ + "utils", + "base64enc", + "ggplot2", + "knitr", + "markdown", + "microbenchmark", + "R.devices", + "R.rsp" + ], + "VignetteBuilder": "R.rsp", + "Title": "Functions that Apply to Rows and Columns of Matrices (and to Vectors)", + "Authors@R": "c( person(\"Henrik\", \"Bengtsson\", role=c(\"aut\", \"cre\", \"cph\"), email=\"henrikb@braju.com\"), person(\"Constantin\", \"Ahlmann-Eltze\", role = \"ctb\"), person(\"Hector\", \"Corrada Bravo\", role=\"ctb\"), person(\"Robert\", \"Gentleman\", role=\"ctb\"), person(\"Jan\", \"Gleixner\", role=\"ctb\"), person(\"Peter\", \"Hickey\", role=\"ctb\"), person(\"Ola\", \"Hossjer\", role=\"ctb\"), person(\"Harris\", \"Jaffee\", role=\"ctb\"), person(\"Dongcan\", \"Jiang\", role=\"ctb\"), person(\"Peter\", \"Langfelder\", role=\"ctb\"), person(\"Brian\", \"Montgomery\", role=\"ctb\"), person(\"Angelina\", \"Panagopoulou\", role=\"ctb\"), person(\"Hugh\", \"Parsonage\", role=\"ctb\"), person(\"Jakob Peder\", \"Pettersen\", role=\"ctb\"))", + "Author": "Henrik Bengtsson [aut, cre, cph], Constantin Ahlmann-Eltze [ctb], Hector Corrada Bravo [ctb], Robert Gentleman [ctb], Jan Gleixner [ctb], Peter Hickey [ctb], Ola Hossjer [ctb], Harris Jaffee [ctb], Dongcan Jiang [ctb], Peter Langfelder [ctb], Brian Montgomery [ctb], Angelina Panagopoulou [ctb], Hugh Parsonage [ctb], Jakob Peder Pettersen [ctb]", + "Maintainer": "Henrik Bengtsson ", + "Description": "High-performing functions operating on rows and columns of matrices, e.g. col / rowMedians(), col / rowRanks(), and col / rowSds(). Functions optimized per data type and for subsetted calculations such that both memory usage and processing time is minimized. There are also optimized vector-based methods, e.g. binMeans(), madDiff() and weightedMedian().", + "License": "Artistic-2.0", + "LazyLoad": "TRUE", + "NeedsCompilation": "yes", + "ByteCompile": "TRUE", + "URL": "https://github.com/HenrikBengtsson/matrixStats", + "BugReports": "https://github.com/HenrikBengtsson/matrixStats/issues", + "RoxygenNote": "7.3.2", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "memoise": { "Package": "memoise", "Version": "2.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cachem", - "rlang" + "Title": "'Memoisation' of Functions", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Jim\", family = \"Hester\", role = \"aut\"), person(given = \"Winston\", family = \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"), person(given = \"Kirill\", family = \"Müller\", role = \"aut\", email = \"krlmlr+r@mailbox.org\"), person(given = \"Daniel\", family = \"Cook\", role = \"aut\", email = \"danielecook@gmail.com\"), person(given = \"Mark\", family = \"Edmondson\", role = \"ctb\", email = \"r@sunholo.com\"))", + "Description": "Cache the results of a function so that when you call it again with the same arguments it returns the previously computed value.", + "License": "MIT + file LICENSE", + "URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise", + "BugReports": "https://github.com/r-lib/memoise/issues", + "Imports": [ + "rlang (>= 0.4.10)", + "cachem" + ], + "Suggests": [ + "digest", + "aws.s3", + "covr", + "googleAuthR", + "googleCloudStorageR", + "httr", + "testthat" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill Müller [aut], Daniel Cook [aut], Mark Edmondson [ctb]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "memuse": { + "Package": "memuse", + "Version": "4.2-3", + "Source": "Repository", + "Title": "Memory Estimation Utilities", + "Description": "How much ram do you need to store a 100,000 by 100,000 matrix? How much ram is your current R session using? How much ram do you even have? Learn the scintillating answer to these and many more such questions with the 'memuse' package.", + "License": "BSD 2-clause License + file LICENSE", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ + "methods", + "utils" ], - "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" + "NeedsCompilation": "yes", + "ByteCompile": "yes", + "Authors@R": "c( person(\"Drew\", \"Schmidt\", email=\"wrathematics@gmail.com\", role=c(\"aut\", \"cre\")), person(\"Christian\", \"Heckendorf\", role=\"ctb\", comment=\"FreeBSD improvements to meminfo\"), person(\"Wei-Chen\", \"Chen\", role=\"ctb\", comment=\"Windows build fixes\"), person(\"Dan\", \"Burgess\", role=\"ctb\", comment=\"donation of a Mac for development and testing\"))", + "Maintainer": "Drew Schmidt ", + "URL": "https://github.com/shinra-dev/memuse", + "BugReports": "https://github.com/shinra-dev/memuse/issues", + "RoxygenNote": "7.1.2", + "Author": "Drew Schmidt [aut, cre], Christian Heckendorf [ctb] (FreeBSD improvements to meminfo), Wei-Chen Chen [ctb] (Windows build fixes), Dan Burgess [ctb] (donation of a Mac for development and testing)", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "metapod": { "Package": "metapod", - "Version": "1.12.0", + "Version": "1.18.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Date": "2023-12-22", + "Title": "Meta-Analyses on P-Values of Differential Analyses", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"aut\", \"cre\"), email = \"infinite.monkeys.with.keyboards@gmail.com\")", + "Imports": [ "Rcpp" ], - "Hash": "026552a86c3aa0d92d4d8b12d80010cc" - }, - "mgcv": { - "Package": "mgcv", - "Version": "1.9-1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", - "graphics", - "methods", - "nlme", - "splines", - "stats", - "utils" + "Suggests": [ + "testthat", + "knitr", + "BiocStyle", + "rmarkdown" + ], + "LinkingTo": [ + "Rcpp" ], - "Hash": "110ee9d83b496279960e162ac97764ce" + "biocViews": "MultipleComparison, DifferentialPeakCalling", + "Description": "Implements a variety of methods for combining p-values in differential analyses of genome-scale datasets. Functions can combine p-values across different tests in the same analysis (e.g., genomic windows in ChIP-seq, exons in RNA-seq) or for corresponding tests across separate analyses (e.g., replicated comparisons, effect of different treatment conditions). Support is provided for handling log-transformed input p-values, missing values and weighting where appropriate.", + "License": "GPL-3", + "NeedsCompilation": "yes", + "SystemRequirements": "C++11", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.1.1", + "git_url": "https://git.bioconductor.org/packages/metapod", + "git_branch": "RELEASE_3_22", + "git_last_commit": "6552a64", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Aaron Lun [aut, cre]", + "Maintainer": "Aaron Lun " }, "miQC": { "Package": "miQC", - "Version": "1.12.0", + "Version": "1.18.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Flexible, probabilistic metrics for quality control of scRNA-seq data", + "Authors@R": "c(person(\"Ariel\", \"Hippen\", role = c(\"aut\", \"cre\"), email = \"ariel.hippen@gmail.com\"), person(\"Stephanie\", \"Hicks\", role = c(\"aut\"), email = \"shicks19@jhu.edu\"))", + "Description": "Single-cell RNA-sequencing (scRNA-seq) has made it possible to profile gene expression in tissues at high resolution. An important preprocessing step prior to performing downstream analyses is to identify and remove cells with poor or degraded sample quality using quality control (QC) metrics. Two widely used QC metrics to identify a ‘low-quality’ cell are (i) if the cell includes a high proportion of reads that map to mitochondrial DNA encoded genes (mtDNA) and (ii) if a small number of genes are detected. miQC is data-driven QC metric that jointly models both the proportion of reads mapping to mtDNA and the number of detected genes with mixture models in a probabilistic framework to predict the low-quality cells in a given dataset.", + "URL": "https://github.com/greenelab/miQC", + "BugReports": "https://github.com/greenelab/miQC/issues", + "License": "BSD_3_clause + file LICENSE", + "Imports": [ "SingleCellExperiment", "flexmix", "ggplot2", "splines" ], - "Hash": "86a3469aee260ac4094af5302291d57a" + "Suggests": [ + "scRNAseq", + "scater", + "BiocStyle", + "knitr", + "rmarkdown" + ], + "biocViews": "SingleCell, QualityControl, GeneExpression, Preprocessing, Sequencing", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.1", + "LazyData": "TRUE", + "git_url": "https://git.bioconductor.org/packages/miQC", + "git_branch": "RELEASE_3_22", + "git_last_commit": "3ec5429", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Ariel Hippen [aut, cre], Stephanie Hicks [aut]", + "Maintainer": "Ariel Hippen ", + "Depends": [ + "R (>= 3.5.0)" + ] }, "mime": { "Package": "mime", - "Version": "0.12", + "Version": "0.13", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Map Filenames to MIME Types", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"Beilei\", \"Bian\", role = \"ctb\") )", + "Description": "Guesses the MIME type from a filename extension using the data derived from /etc/mime.types in UNIX-type systems.", + "Imports": [ "tools" ], - "Hash": "18e9c28c1d3ca1560ce30658b22ce104" + "License": "GPL", + "URL": "https://github.com/yihui/mime", + "BugReports": "https://github.com/yihui/mime/issues", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre] (, https://yihui.org), Jeffrey Horner [ctb], Beilei Bian [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "mixsqp": { "Package": "mixsqp", "Version": "0.3-54", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", - "RcppArmadillo", - "irlba", + "Encoding": "UTF-8", + "Type": "Package", + "Date": "2023-12-20", + "Title": "Sequential Quadratic Programming for Fast Maximum-Likelihood Estimation of Mixture Proportions", + "Authors@R": "c(person(\"Youngseok\",\"Kim\",role=\"aut\", email=\"youngseok@uchicago.edu\"), person(\"Peter\",\"Carbonetto\",role=c(\"aut\",\"cre\"), email=\"peter.carbonetto@gmail.com\"), person(\"Mihai\",\"Anitescu\",role=\"aut\"), person(\"Matthew\",\"Stephens\",role=\"aut\"), person(\"Jason\",\"Willwerscheid\",role=\"ctb\"), person(\"Jean\",\"Morrison\",role=\"ctb\"))", + "URL": "https://github.com/stephenslab/mixsqp", + "BugReports": "https://github.com/stephenslab/mixsqp/issues", + "Depends": [ + "R (>= 3.3.0)" + ], + "Description": "Provides an optimization method based on sequential quadratic programming (SQP) for maximum likelihood estimation of the mixture proportions in a finite mixture model where the component densities are known. The algorithm is expected to obtain solutions that are at least as accurate as the state-of-the-art MOSEK interior-point solver (called by function \"KWDual\" in the 'REBayes' package), and they are expected to arrive at solutions more quickly when the number of samples is large and the number of mixture components is not too large. This implements the \"mix-SQP\" algorithm, with some improvements, described in Y. Kim, P. Carbonetto, M. Stephens & M. Anitescu (2020) .", + "License": "MIT + file LICENSE", + "Imports": [ + "utils", "stats", - "utils" + "irlba", + "Rcpp (>= 0.12.15)" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown" + ], + "LinkingTo": [ + "Rcpp", + "RcppArmadillo" ], - "Hash": "62896dd832ccbf1091e7f13324c24160" + "LazyData": "true", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "RoxygenNote": "7.1.2", + "Author": "Youngseok Kim [aut], Peter Carbonetto [aut, cre], Mihai Anitescu [aut], Matthew Stephens [aut], Jason Willwerscheid [ctb], Jean Morrison [ctb]", + "Maintainer": "Peter Carbonetto ", + "Repository": "CRAN" }, "mixtools": { "Package": "mixtools", - "Version": "2.0.0", + "Version": "2.0.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "MASS", - "R", + "Date": "2022-12-04", + "Title": "Tools for Analyzing Finite Mixture Models", + "Authors@R": "c(person(\"Derek\", \"Young\", role = c(\"aut\", \"cre\"), email = \"derek.young@uky.edu\", comment = c(ORCID = \"0000-0002-3048-3803\")), person(\"Tatiana\", \"Benaglia\", role = \"aut\"), person(\"Didier\", \"Chauveau\", role = \"aut\"), person(\"David\", \"Hunter\", role = \"aut\"), person(\"Kedai\", \"Cheng\", role = \"aut\"), person(\"Ryan\", \"Elmore\", role = \"ctb\"), person(\"Thomas\", \"Hettmansperger\", role = \"ctb\"), person(\"Hoben\", \"Thomas\", role = \"ctb\"), person(\"Fengjuan\", \"Xuan\", role = \"ctb\"))", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ "kernlab", + "MASS", "plotly", "scales", "segmented", "stats", "survival" ], - "Hash": "2b9414057d7f3725130e2f743ea05a2f" + "URL": "https://github.com/dsy109/mixtools", + "Description": "Analyzes finite mixture models for various parametric and semiparametric settings. This includes mixtures of parametric distributions (normal, multivariate normal, multinomial, gamma), various Reliability Mixture Models (RMMs), mixtures-of-regressions settings (linear regression, logistic regression, Poisson regression, linear regression with changepoints, predictor-dependent mixing proportions, random effects regressions, hierarchical mixtures-of-experts), and tools for selecting the number of components (bootstrapping the likelihood ratio test statistic, mixturegrams, and model selection criteria). Bayesian estimation of mixtures-of-linear-regressions models is available as well as a novel data depth method for obtaining credible bands. This package is based upon work supported by the National Science Foundation under Grant No. SES-0518772 and the Chan Zuckerberg Initiative: Essential Open Source Software for Science (Grant No. 2020-255193).", + "License": "GPL (>= 2)", + "NeedsCompilation": "yes", + "Author": "Derek Young [aut, cre] (), Tatiana Benaglia [aut], Didier Chauveau [aut], David Hunter [aut], Kedai Cheng [aut], Ryan Elmore [ctb], Thomas Hettmansperger [ctb], Hoben Thomas [ctb], Fengjuan Xuan [ctb]", + "Maintainer": "Derek Young ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "modelr": { "Package": "modelr", "Version": "0.1.11", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Modelling Functions that Work with the Pipe", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Functions for modelling that help you seamlessly integrate modelling into a pipeline of data manipulation and visualisation.", + "License": "GPL-3", + "URL": "https://modelr.tidyverse.org, https://github.com/tidyverse/modelr", + "BugReports": "https://github.com/tidyverse/modelr/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ "broom", "magrittr", - "purrr", - "rlang", + "purrr (>= 0.2.2)", + "rlang (>= 1.0.6)", "tibble", - "tidyr", + "tidyr (>= 0.8.0)", "tidyselect", "vctrs" ], - "Hash": "4f50122dc256b1b6996a4703fecea821" + "Suggests": [ + "compiler", + "covr", + "ggplot2", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "modeltools": { "Package": "modeltools", - "Version": "0.2-23", + "Version": "0.2-24", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "methods", + "Title": "Tools and Classes for Statistical Models", + "Date": "2025-05-02", + "Authors@R": "c(person(given = \"Torsten\", family = \"Hothorn\", role = c(\"aut\", \"cre\"), email = \"Torsten.Hothorn@R-project.org\", comment = c(ORCID = \"0000-0001-8301-0471\")), person(given = \"Friedrich\", family = \"Leisch\", role = \"aut\", comment = c(ORCID = \"0000-0001-7278-1983\")), person(given = \"Achim\", family = \"Zeileis\", role = \"aut\", comment = c(ORCID = \"0000-0003-0918-3766\")))", + "Description": "A collection of tools to deal with statistical models. The functionality is experimental and the user interface is likely to change in the future. The documentation is rather terse, but packages `coin' and `party' have some working examples. However, if you find the implemented ideas interesting we would be very interested in a discussion of this proposal. Contributions are more than welcome!", + "Depends": [ "stats", "stats4" ], - "Hash": "f5a957c02222589bdf625a67be68b2a9" + "Imports": [ + "methods" + ], + "LazyLoad": "yes", + "License": "GPL-2", + "NeedsCompilation": "no", + "Author": "Torsten Hothorn [aut, cre] (ORCID: ), Friedrich Leisch [aut] (ORCID: ), Achim Zeileis [aut] (ORCID: )", + "Maintainer": "Torsten Hothorn ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "msigdbr": { "Package": "msigdbr", - "Version": "7.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "babelgene", - "dplyr", - "magrittr", + "Version": "25.1.1", + "Source": "Repository", + "Type": "Package", + "Title": "MSigDB Gene Sets for Multiple Organisms in a Tidy Data Format", + "Authors@R": "person(\"Igor\", \"Dolgalev\", , \"igor.dolgalev@nyumc.org\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4451-126X\"))", + "Description": "Provides the 'Molecular Signatures Database' (MSigDB) gene sets typically used with the 'Gene Set Enrichment Analysis' (GSEA) software (Subramanian et al. 2005 , Liberzon et al. 2015 , Castanza et al. 2023 ) as an R data frame. The package includes the human genes as listed in MSigDB as well as the corresponding symbols and IDs for frequently studied model organisms such as mouse, rat, pig, fly, and yeast.", + "License": "MIT + file LICENSE", + "URL": "https://igordot.github.io/msigdbr/", + "BugReports": "https://github.com/igordot/msigdbr/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "assertthat", + "babelgene (>= 22.9)", + "curl", + "dplyr (>= 1.1.1)", + "lifecycle", + "methods", "rlang", "tibble", - "tidyselect" + "tidyselect (>= 1.2.0)", + "tools" ], - "Hash": "2def1d52dfe1044f82e75d25fb5dd2e5" - }, - "munsell": { - "Package": "munsell", - "Version": "0.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "colorspace", - "methods" + "Suggests": [ + "knitr", + "rmarkdown", + "roxygen2", + "testthat" ], - "Hash": "4fd8900853b746af55b81fda99da7695" + "Config/Needs/website": "rmarkdown", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Igor Dolgalev [aut, cre] (ORCID: )", + "Maintainer": "Igor Dolgalev ", + "Repository": "CRAN" }, "mvtnorm": { "Package": "mvtnorm", - "Version": "1.2-4", + "Version": "1.3-3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Multivariate Normal and t Distributions", + "Date": "2025-01-09", + "Authors@R": "c(person(\"Alan\", \"Genz\", role = \"aut\"), person(\"Frank\", \"Bretz\", role = \"aut\"), person(\"Tetsuhisa\", \"Miwa\", role = \"aut\"), person(\"Xuefei\", \"Mi\", role = \"aut\"), person(\"Friedrich\", \"Leisch\", role = \"ctb\"), person(\"Fabian\", \"Scheipl\", role = \"ctb\"), person(\"Bjoern\", \"Bornkamp\", role = \"ctb\", comment = c(ORCID = \"0000-0002-6294-8185\")), person(\"Martin\", \"Maechler\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8685-9910\")), person(\"Torsten\", \"Hothorn\", role = c(\"aut\", \"cre\"), email = \"Torsten.Hothorn@R-project.org\", comment = c(ORCID = \"0000-0001-8301-0471\")))", + "Description": "Computes multivariate normal and t probabilities, quantiles, random deviates, and densities. Log-likelihoods for multivariate Gaussian models and Gaussian copulae parameterised by Cholesky factors of covariance or precision matrices are implemented for interval-censored and exact data, or a mix thereof. Score functions for these log-likelihoods are available. A class representing multiple lower triangular matrices and corresponding methods are part of this package.", + "Imports": [ "stats" ], - "Hash": "17e96668f44a28aef0981d9e17c49b59" + "Depends": [ + "R(>= 3.5.0)" + ], + "Suggests": [ + "qrng", + "numDeriv" + ], + "License": "GPL-2", + "URL": "http://mvtnorm.R-forge.R-project.org", + "NeedsCompilation": "yes", + "Author": "Alan Genz [aut], Frank Bretz [aut], Tetsuhisa Miwa [aut], Xuefei Mi [aut], Friedrich Leisch [ctb], Fabian Scheipl [ctb], Bjoern Bornkamp [ctb] (), Martin Maechler [ctb] (), Torsten Hothorn [aut, cre] ()", + "Maintainer": "Torsten Hothorn ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "nlme": { "Package": "nlme", - "Version": "3.1-164", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "3.1-168", + "Source": "Repository", + "Date": "2025-03-31", + "Priority": "recommended", + "Title": "Linear and Nonlinear Mixed Effects Models", + "Authors@R": "c(person(\"José\", \"Pinheiro\", role = \"aut\", comment = \"S version\"), person(\"Douglas\", \"Bates\", role = \"aut\", comment = \"up to 2007\"), person(\"Saikat\", \"DebRoy\", role = \"ctb\", comment = \"up to 2002\"), person(\"Deepayan\", \"Sarkar\", role = \"ctb\", comment = \"up to 2005\"), person(\"EISPACK authors\", role = \"ctb\", comment = \"src/rs.f\"), person(\"Siem\", \"Heisterkamp\", role = \"ctb\", comment = \"Author fixed sigma\"), person(\"Bert\", \"Van Willigen\",role = \"ctb\", comment = \"Programmer fixed sigma\"), person(\"Johannes\", \"Ranke\", role = \"ctb\", comment = \"varConstProp()\"), person(\"R Core Team\", email = \"R-core@R-project.org\", role = c(\"aut\", \"cre\"), comment = c(ROR = \"02zz1nj61\")))", + "Contact": "see 'MailingList'", + "Description": "Fit and compare Gaussian linear and nonlinear mixed-effects models.", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ "graphics", - "lattice", "stats", - "utils" + "utils", + "lattice" ], - "Hash": "a623a2239e642806158bc4dc3f51565d" + "Suggests": [ + "MASS", + "SASmixed" + ], + "LazyData": "yes", + "Encoding": "UTF-8", + "License": "GPL (>= 2)", + "BugReports": "https://bugs.r-project.org", + "MailingList": "R-help@r-project.org", + "URL": "https://svn.r-project.org/R-packages/trunk/nlme/", + "NeedsCompilation": "yes", + "Author": "José Pinheiro [aut] (S version), Douglas Bates [aut] (up to 2007), Saikat DebRoy [ctb] (up to 2002), Deepayan Sarkar [ctb] (up to 2005), EISPACK authors [ctb] (src/rs.f), Siem Heisterkamp [ctb] (Author fixed sigma), Bert Van Willigen [ctb] (Programmer fixed sigma), Johannes Ranke [ctb] (varConstProp()), R Core Team [aut, cre] (02zz1nj61)", + "Maintainer": "R Core Team ", + "Repository": "CRAN" }, "nnet": { "Package": "nnet", - "Version": "7.3-19", + "Version": "7.3-20", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Priority": "recommended", + "Date": "2025-01-01", + "Depends": [ + "R (>= 3.0.0)", "stats", "utils" ], - "Hash": "2c797b46eea7fb58ede195bc0b1f1138" + "Suggests": [ + "MASS" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Brian.Ripley@R-project.org\"), person(\"William\", \"Venables\", role = \"cph\"))", + "Description": "Software for feed-forward neural networks with a single hidden layer, and for multinomial log-linear models.", + "Title": "Feed-Forward Neural Networks and Multinomial Log-Linear Models", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], William Venables [cph]", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "numDeriv": { "Package": "numDeriv", "Version": "2016.8-1.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Accurate Numerical Derivatives", + "Description": "Methods for calculating (usually) accurate numerical first and second order derivatives. Accurate calculations are done using 'Richardson''s' extrapolation or, when applicable, a complex step derivative is available. A simple difference method is also provided. Simple difference is (usually) less accurate but is much quicker than 'Richardson''s' extrapolation and provides a useful cross-check. Methods are provided for real scalar and vector valued functions.", + "Depends": [ + "R (>= 2.11.1)" ], - "Hash": "df58958f293b166e4ab885ebcad90e02" + "LazyLoad": "yes", + "ByteCompile": "yes", + "License": "GPL-2", + "Copyright": "2006-2011, Bank of Canada. 2012-2016, Paul Gilbert", + "Author": "Paul Gilbert and Ravi Varadhan", + "Maintainer": "Paul Gilbert ", + "URL": "http://optimizer.r-forge.r-project.org/", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "openssl": { "Package": "openssl", - "Version": "2.1.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "2.3.4", + "Source": "Repository", + "Type": "Package", + "Title": "Toolkit for Encryption, Signatures and Certificates Based on OpenSSL", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Oliver\", \"Keyes\", role = \"ctb\"))", + "Description": "Bindings to OpenSSL libssl and libcrypto, plus custom SSH key parsers. Supports RSA, DSA and EC curves P-256, P-384, P-521, and curve25519. Cryptographic signatures can either be created and verified manually or via x509 certificates. AES can be used in cbc, ctr or gcm mode for symmetric encryption; RSA for asymmetric (public key) encryption or EC for Diffie Hellman. High-level envelope functions combine RSA and AES for encrypting arbitrary sized data. Other utilities include key generators, hash functions (md5, sha1, sha256, etc), base64 encoder, a secure random number generator, and 'bignum' math methods for manually performing crypto calculations on large multibyte integers.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/openssl", + "BugReports": "https://github.com/jeroen/openssl/issues", + "SystemRequirements": "OpenSSL >= 1.0.2", + "VignetteBuilder": "knitr", + "Imports": [ "askpass" ], - "Hash": "ea2475b073243d9d338aa8f086ce973e" + "Suggests": [ + "curl", + "testthat (>= 2.1.0)", + "digest", + "knitr", + "rmarkdown", + "jsonlite", + "jose", + "sodium" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Oliver Keyes [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "optparse": { "Package": "optparse", "Version": "1.7.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "getopt", - "methods" + "Encoding": "UTF-8", + "Type": "Package", + "Title": "Command Line Option Parser", + "Authors@R": "c(person(\"Trevor L.\", \"Davis\", role=c(\"aut\", \"cre\"), email=\"trevor.l.davis@gmail.com\", comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Allen\", \"Day\", role=\"ctb\", comment=\"Some documentation and examples ported from the getopt package.\"), person(\"Python Software Foundation\", role=\"ctb\", comment=\"Some documentation from the optparse Python module.\"), person(\"Steve\", \"Lianoglou\", role=\"ctb\"), person(\"Jim\", \"Nikelski\", role=\"ctb\"), person(\"Kirill\", \"Müller\", role=\"ctb\"), person(\"Peter\", \"Humburg\", role=\"ctb\"), person(\"Rich\", \"FitzJohn\", role=\"ctb\"), person(\"Gyu Jin\", \"Choi\", role=\"ctb\"))", + "Description": "A command line parser inspired by Python's 'optparse' library to be used with Rscript to write \"#!\" shebang scripts that accept short and long flag/options.", + "License": "GPL (>= 2)", + "Copyright": "See file (inst/)COPYRIGHTS.", + "URL": "https://github.com/trevorld/r-optparse", + "BugReports": "https://github.com/trevorld/r-optparse/issues", + "LazyLoad": "yes", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "methods", + "getopt (>= 1.20.2)" + ], + "Suggests": [ + "knitr (>= 1.15.19)", + "stringr", + "testthat" ], - "Hash": "ce5f8381cd2c38d1fc14c83d8b21efd0" + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "no", + "Author": "Trevor L. Davis [aut, cre] (), Allen Day [ctb] (Some documentation and examples ported from the getopt package.), Python Software Foundation [ctb] (Some documentation from the optparse Python module.), Steve Lianoglou [ctb], Jim Nikelski [ctb], Kirill Müller [ctb], Peter Humburg [ctb], Rich FitzJohn [ctb], Gyu Jin Choi [ctb]", + "Maintainer": "Trevor L. Davis ", + "Repository": "CRAN" }, "org.Cf.eg.db": { "Package": "org.Cf.eg.db", - "Version": "3.19.1", + "Version": "3.22.0", "Source": "Bioconductor", - "Requirements": [ - "AnnotationDbi", - "R", - "methods" + "Title": "Genome wide annotation for Canine", + "Description": "Genome wide annotation for Canine, primarily based on mapping using Entrez Gene identifiers.", + "Author": "Marc Carlson", + "Maintainer": "Bioconductor Package Maintainer ", + "Depends": [ + "R (>= 2.7.0)", + "methods", + "AnnotationDbi (>= 1.71.1)" + ], + "Suggests": [ + "DBI", + "annotate", + "RUnit" ], - "Hash": "683c948128f3c35766e9f71e35b52606" + "License": "Artistic-2.0", + "organism": "Canis familiaris", + "species": "Canine", + "biocViews": "OrgDb, AnnotationData, Canis_familiaris", + "NeedsCompilation": "no" }, "org.Dr.eg.db": { "Package": "org.Dr.eg.db", - "Version": "3.19.1", + "Version": "3.22.0", "Source": "Bioconductor", - "Requirements": [ - "AnnotationDbi", - "R", - "methods" + "Title": "Genome wide annotation for Zebrafish", + "Description": "Genome wide annotation for Zebrafish, primarily based on mapping using Entrez Gene identifiers.", + "Author": "Marc Carlson", + "Maintainer": "Bioconductor Package Maintainer ", + "Depends": [ + "R (>= 2.7.0)", + "methods", + "AnnotationDbi (>= 1.71.1)" + ], + "Suggests": [ + "DBI", + "annotate", + "RUnit" ], - "Hash": "1e6893b6ea27551fa2fd8d13644486e7" + "License": "Artistic-2.0", + "organism": "Danio rerio", + "species": "Zebrafish", + "biocViews": "OrgDb, AnnotationData, Danio_rerio", + "NeedsCompilation": "no" }, "org.Hs.eg.db": { "Package": "org.Hs.eg.db", - "Version": "3.19.1", + "Version": "3.22.0", "Source": "Bioconductor", - "Requirements": [ - "AnnotationDbi", - "R", - "methods" + "Title": "Genome wide annotation for Human", + "Description": "Genome wide annotation for Human, primarily based on mapping using Entrez Gene identifiers.", + "Author": "Marc Carlson", + "Maintainer": "Bioconductor Package Maintainer ", + "Depends": [ + "R (>= 2.7.0)", + "methods", + "AnnotationDbi (>= 1.71.1)" + ], + "Suggests": [ + "DBI", + "annotate", + "RUnit" ], - "Hash": "1ac8a004ad2e4f6489dadf3a2ffeb638" + "License": "Artistic-2.0", + "organism": "Homo sapiens", + "species": "Human", + "biocViews": "OrgDb, AnnotationData, Homo_sapiens, humanLLMappings", + "NeedsCompilation": "no" }, "org.Mm.eg.db": { "Package": "org.Mm.eg.db", - "Version": "3.19.1", + "Version": "3.22.0", "Source": "Bioconductor", - "Requirements": [ - "AnnotationDbi", - "R", - "methods" + "Title": "Genome wide annotation for Mouse", + "Description": "Genome wide annotation for Mouse, primarily based on mapping using Entrez Gene identifiers.", + "Author": "Marc Carlson", + "Maintainer": "Bioconductor Package Maintainer ", + "Depends": [ + "R (>= 2.7.0)", + "methods", + "AnnotationDbi (>= 1.71.1)" + ], + "Suggests": [ + "DBI", + "annotate", + "RUnit" ], - "Hash": "3798992dbae16046c472adb1b5fcd04b" + "License": "Artistic-2.0", + "organism": "Mus musculus", + "species": "Mouse", + "biocViews": "OrgDb, AnnotationData, Mus_musculus, mouseLLMappings", + "NeedsCompilation": "no" }, - "palmerpenguins": { - "Package": "palmerpenguins", - "Version": "0.1.1", + "otel": { + "Package": "otel", + "Version": "0.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "OpenTelemetry R API", + "Authors@R": "person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "High-quality, ubiquitous, and portable telemetry to enable effective observability. OpenTelemetry is a collection of tools, APIs, and SDKs used to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior. This package implements the OpenTelemetry API: . Use this package as a dependency if you want to instrument your R package for OpenTelemetry.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "cli", + "glue", + "jsonlite", + "otelsdk", + "processx", + "shiny", + "spelling", + "testthat (>= 3.0.0)", + "utils", + "withr" ], - "Hash": "6c6861efbc13c1d543749e9c7be4a592" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "URL": "https://otel.r-lib.org, https://github.com/r-lib/otel", + "Additional_repositories": "https://github.com/r-lib/otelsdk/releases/download/devel", + "BugReports": "https://github.com/r-lib/otel/issues", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "patchwork": { "Package": "patchwork", - "Version": "1.2.0", + "Version": "1.3.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cli", - "ggplot2", - "grDevices", - "graphics", + "Type": "Package", + "Title": "The Composer of Plots", + "Authors@R": "person(given = \"Thomas Lin\", family = \"Pedersen\", role = c(\"cre\", \"aut\"), email = \"thomasp85@gmail.com\", comment = c(ORCID = \"0000-0002-5147-4711\"))", + "Maintainer": "Thomas Lin Pedersen ", + "Description": "The 'ggplot2' package provides a strong API for sequentially building up a plot, but does not concern itself with composition of multiple plots. 'patchwork' is a package that expands the API to allow for arbitrarily complex composition of plots by, among others, providing mathematical operators for combining multiple plots. Other packages that try to address this need (but with a different approach) are 'gridExtra' and 'cowplot'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Imports": [ + "ggplot2 (>= 3.0.0)", + "gtable (>= 0.3.6)", "grid", - "gtable", - "rlang", - "stats", - "utils" - ], - "Hash": "9c8ab14c00ac07e9e04d1664c0b74486" - }, - "paws.common": { - "Package": "paws.common", - "Version": "0.7.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Rcpp", - "base64enc", - "curl", - "digest", - "httr", - "jsonlite", - "methods", "stats", + "grDevices", "utils", - "xml2" + "graphics", + "rlang (>= 1.0.0)", + "cli", + "farver" ], - "Hash": "c66dfa46eb607d3171f89596d7529446" - }, - "paws.storage": { - "Package": "paws.storage", - "Version": "0.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "RoxygenNote": "7.3.2", + "URL": "https://patchwork.data-imaginist.com, https://github.com/thomasp85/patchwork", + "BugReports": "https://github.com/thomasp85/patchwork/issues", + "Suggests": [ + "knitr", + "rmarkdown", + "gridGraphics", + "gridExtra", + "ragg", + "testthat (>= 2.1.0)", + "vdiffr", + "covr", + "png", + "gt (>= 0.11.0)" ], - "Hash": "e4a5655c4172112449f7f501c60ed671" + "VignetteBuilder": "knitr", + "Config/Needs/website": "gifski", + "NeedsCompilation": "no", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: )", + "Repository": "CRAN" }, "pheatmap": { "Package": "pheatmap", - "Version": "1.0.12", + "Version": "1.0.13", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Pretty Heatmaps", + "Date": "2025-06-05", + "Authors@R": "person(given = \"Raivo\", family = \"Kolde\", role = c(\"aut\", \"cre\"), email = \"rkolde@gmail.com\")", + "Depends": [ + "R (>= 2.0)" + ], + "Description": "Implementation of heatmaps that offers more control over dimensions and appearance.", + "Imports": [ + "grid", "RColorBrewer", - "grDevices", - "graphics", - "grid", - "gtable", "scales", - "stats" + "gtable", + "stats", + "grDevices", + "graphics" ], - "Hash": "db1fb0021811b6693741325bbe916e58" + "License": "GPL-2", + "Encoding": "UTF-8", + "LazyLoad": "yes", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Raivo Kolde [aut, cre]", + "Maintainer": "Raivo Kolde ", + "Repository": "CRAN" }, "pillar": { "Package": "pillar", - "Version": "1.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cli", - "fansi", + "Version": "1.11.1", + "Source": "Repository", + "Title": "Coloured Formatting for Columns", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\"), person(given = \"RStudio\", role = \"cph\"))", + "Description": "Provides 'pillar' and 'colonnade' generics designed for formatting columns of data using the full range of colours provided by modern terminals.", + "License": "MIT + file LICENSE", + "URL": "https://pillar.r-lib.org/, https://github.com/r-lib/pillar", + "BugReports": "https://github.com/r-lib/pillar/issues", + "Imports": [ + "cli (>= 2.3.0)", "glue", "lifecycle", - "rlang", - "utf8", + "rlang (>= 1.0.2)", + "utf8 (>= 1.1.0)", "utils", - "vctrs" + "vctrs (>= 0.5.0)" + ], + "Suggests": [ + "bit64", + "DBI", + "debugme", + "DiagrammeR", + "dplyr", + "formattable", + "ggplot2", + "knitr", + "lubridate", + "nanotime", + "nycflights13", + "palmerpenguins", + "rmarkdown", + "scales", + "stringi", + "survival", + "testthat (>= 3.1.1)", + "tibble", + "units (>= 0.7.2)", + "vdiffr", + "withr" ], - "Hash": "15da5a8412f317beeee6175fbc76f4bb" + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "format_multi_fuzz, format_multi_fuzz_2, format_multi, ctl_colonnade, ctl_colonnade_1, ctl_colonnade_2", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/gha/extra-packages": "units=?ignore-before-r=4.3.0", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], RStudio [cph]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "pkgconfig": { "Package": "pkgconfig", "Version": "2.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Private Configuration for 'R' Packages", + "Author": "Gábor Csárdi", + "Maintainer": "Gábor Csárdi ", + "Description": "Set configuration options on a per-package basis. Options set by a given package only apply to that package, other packages are unaffected.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "Imports": [ "utils" ], - "Hash": "01f28d4278f15c76cddbea05899c5d6f" - }, - "plogr": { - "Package": "plogr", - "Version": "0.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "09eb987710984fc2905c7129c7d85e65" + "Suggests": [ + "covr", + "testthat", + "disposables (>= 1.0.3)" + ], + "URL": "https://github.com/r-lib/pkgconfig#readme", + "BugReports": "https://github.com/r-lib/pkgconfig/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "plotly": { "Package": "plotly", - "Version": "4.10.4", + "Version": "4.12.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "RColorBrewer", - "base64enc", - "crosstalk", - "data.table", + "Title": "Create Interactive Web Graphics via 'plotly.js'", + "Authors@R": "c(person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"cpsievert1@gmail.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Chris\", \"Parmer\", role = \"aut\", email = \"chris@plot.ly\"), person(\"Toby\", \"Hocking\", role = \"aut\", email = \"tdhock5@gmail.com\"), person(\"Scott\", \"Chamberlain\", role = \"aut\", email = \"myrmecocystus@gmail.com\"), person(\"Karthik\", \"Ram\", role = \"aut\", email = \"karthik.ram@gmail.com\"), person(\"Marianne\", \"Corvellec\", role = \"aut\", email = \"marianne.corvellec@igdore.org\", comment = c(ORCID = \"0000-0002-1994-3581\")), person(\"Pedro\", \"Despouy\", role = \"aut\", email = \"pedro@plot.ly\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Plotly Technologies Inc.\", role = \"cph\"))", + "License": "MIT + file LICENSE", + "Description": "Create interactive web graphics from 'ggplot2' graphs and/or a custom interface to the (MIT-licensed) JavaScript library 'plotly.js' inspired by the grammar of graphics.", + "URL": "https://plotly-r.com, https://github.com/plotly/plotly.R, https://plotly.com/r/", + "BugReports": "https://github.com/plotly/plotly.R/issues", + "Depends": [ + "R (>= 3.5.0)", + "ggplot2 (>= 3.0.0)" + ], + "Imports": [ + "tools", + "scales", + "httr (>= 1.3.0)", + "jsonlite (>= 1.6)", + "magrittr", "digest", + "viridisLite", + "base64enc", + "htmltools (>= 0.3.6)", + "htmlwidgets (>= 1.5.2.9001)", + "tidyr (>= 1.0.0)", + "RColorBrewer", "dplyr", - "ggplot2", - "htmltools", - "htmlwidgets", - "httr", - "jsonlite", - "lazyeval", - "magrittr", - "promises", - "purrr", - "rlang", - "scales", - "tibble", - "tidyr", - "tools", "vctrs", - "viridisLite" + "tibble", + "lazyeval (>= 0.2.0)", + "rlang (>= 1.0.0)", + "crosstalk", + "purrr", + "data.table", + "promises" ], - "Hash": "a1ac5c03ad5ad12b9d1597e00e23c3dd" + "Suggests": [ + "MASS", + "maps", + "hexbin", + "ggthemes", + "GGally", + "ggalluvial", + "testthat", + "knitr", + "shiny (>= 1.1.0)", + "shinytest2", + "curl", + "rmarkdown", + "Cairo", + "broom", + "webshot", + "listviewer", + "dendextend", + "sf", + "png", + "IRdisplay", + "processx", + "plotlyGeoAssets", + "forcats", + "withr", + "palmerpenguins", + "rversions", + "reticulate", + "rsvg", + "ggridges" + ], + "LazyData": "true", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Config/Needs/check": "tidyverse/ggplot2, ggobi/GGally, rcmdcheck, devtools, reshape2, s2", + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (ORCID: ), Chris Parmer [aut], Toby Hocking [aut], Scott Chamberlain [aut], Karthik Ram [aut], Marianne Corvellec [aut] (ORCID: ), Pedro Despouy [aut], Salim Brüggemann [ctb] (ORCID: ), Plotly Technologies Inc. [cph]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "plyr": { "Package": "plyr", "Version": "1.8.9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Tools for Splitting, Applying and Combining Data", + "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"))", + "Description": "A set of tools that solves a common set of problems: you need to break a big problem down into manageable pieces, operate on each piece and then put all the pieces back together. For example, you might want to fit a model to each spatial location or time point in your study, summarise data by panels or collapse high-dimensional arrays to simpler summary statistics. The development of 'plyr' has been generously supported by 'Becton Dickinson'.", + "License": "MIT + file LICENSE", + "URL": "http://had.co.nz/plyr, https://github.com/hadley/plyr", + "BugReports": "https://github.com/hadley/plyr/issues", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "Rcpp (>= 0.11.0)" + ], + "Suggests": [ + "abind", + "covr", + "doParallel", + "foreach", + "iterators", + "itertools", + "tcltk", + "testthat" + ], + "LinkingTo": [ "Rcpp" ], - "Hash": "6b8177fd19982f0020743fadbfdbd933" + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "png": { "Package": "png", "Version": "0.1-8", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Read and write PNG images", + "Author": "Simon Urbanek ", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" ], - "Hash": "bd54ba8a0a5faded999a7aab6e46b374" + "Description": "This package provides an easy and simple way to read, write and display bitmap images stored in the PNG format. It can read and write both files and in-memory raw vectors.", + "License": "GPL-2 | GPL-3", + "SystemRequirements": "libpng", + "URL": "http://www.rforge.net/png/", + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "polyclip": { "Package": "polyclip", - "Version": "1.10-6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "436542aadb70675e361cf359285af7c7" + "Version": "1.10-7", + "Source": "Repository", + "Date": "2024-07-23", + "Title": "Polygon Clipping", + "Authors@R": "c(person(\"Angus\", \"Johnson\", role = \"aut\", comment=\"C++ original, http://www.angusj.com/delphi/clipper.php\"), person(\"Adrian\", \"Baddeley\", role = c(\"aut\", \"trl\", \"cre\"), email = \"Adrian.Baddeley@curtin.edu.au\"), person(\"Kurt\", \"Hornik\", role = \"ctb\"), person(c(\"Brian\", \"D.\"), \"Ripley\", role = \"ctb\"), person(\"Elliott\", \"Sales de Andrade\", role=\"ctb\"), person(\"Paul\", \"Murrell\", role = \"ctb\"), person(\"Ege\", \"Rubak\", role=\"ctb\"), person(\"Mark\", \"Padgham\", role=\"ctb\"))", + "Maintainer": "Adrian Baddeley ", + "Depends": [ + "R (>= 3.5.0)" + ], + "Description": "R port of Angus Johnson's open source library 'Clipper'. Performs polygon clipping operations (intersection, union, set minus, set difference) for polygonal regions of arbitrary complexity, including holes. Computes offset polygons (spatial buffer zones, morphological dilations, Minkowski dilations) for polygonal regions and polygonal lines. Computes Minkowski Sum of general polygons. There is a function for removing self-intersections from polygon data.", + "License": "BSL", + "URL": "https://www.angusj.com, https://sourceforge.net/projects/polyclipping, https://github.com/baddstats/polyclip", + "BugReports": "https://github.com/baddstats/polyclip/issues", + "ByteCompile": "true", + "Note": "built from Clipper C++ version 6.4.0", + "NeedsCompilation": "yes", + "Author": "Angus Johnson [aut] (C++ original, http://www.angusj.com/delphi/clipper.php), Adrian Baddeley [aut, trl, cre], Kurt Hornik [ctb], Brian D. Ripley [ctb], Elliott Sales de Andrade [ctb], Paul Murrell [ctb], Ege Rubak [ctb], Mark Padgham [ctb]", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "preprocessCore": { "Package": "preprocessCore", - "Version": "1.66.0", + "Version": "1.72.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Title": "A collection of pre-processing functions", + "Author": "Ben Bolstad ", + "Maintainer": "Ben Bolstad ", + "Imports": [ "stats" ], - "Hash": "d188d81b219bbf395f3281d3edb6328c" + "Description": "A library of core preprocessing routines.", + "License": "LGPL (>= 2)", + "URL": "https://github.com/bmbolstad/preprocessCore", + "Collate": "normalize.quantiles.R quantile_extensions.R rma.background.correct.R rcModel.R colSummarize.R subColSummarize.R plmr.R plmd.R", + "LazyLoad": "yes", + "biocViews": "Infrastructure", + "git_url": "https://git.bioconductor.org/packages/preprocessCore", + "git_branch": "RELEASE_3_22", + "git_last_commit": "f8fc99a", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes" }, "prettyunits": { "Package": "prettyunits", "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Pretty, Human Readable Formatting of Quantities", + "Authors@R": "c( person(\"Gabor\", \"Csardi\", email=\"csardi.gabor@gmail.com\", role=c(\"aut\", \"cre\")), person(\"Bill\", \"Denney\", email=\"wdenney@humanpredictions.com\", role=c(\"ctb\"), comment=c(ORCID=\"0000-0002-5759-428X\")), person(\"Christophe\", \"Regouby\", email=\"christophe.regouby@free.fr\", role=c(\"ctb\")) )", + "Description": "Pretty, human readable formatting of quantities. Time intervals: '1337000' -> '15d 11h 23m 20s'. Vague time intervals: '2674000' -> 'about a month ago'. Bytes: '1337' -> '1.34 kB'. Rounding: '99' with 3 significant digits -> '99.0' p-values: '0.00001' -> '<0.0001'. Colors: '#FF0000' -> 'red'. Quantities: '1239437' -> '1.24 M'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/prettyunits", + "BugReports": "https://github.com/r-lib/prettyunits/issues", + "Depends": [ + "R(>= 2.10)" + ], + "Suggests": [ + "codetools", + "covr", + "testthat" ], - "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Gabor Csardi [aut, cre], Bill Denney [ctb] (), Christophe Regouby [ctb]", + "Maintainer": "Gabor Csardi ", + "Repository": "CRAN" }, "processx": { "Package": "processx", - "Version": "3.8.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "3.8.6", + "Source": "Repository", + "Title": "Execute and Control System Processes", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Ascent Digital Services\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to run system processes in the background. It can check if a background process is running; wait on a background process to finish; get the exit status of finished processes; kill background processes. It can read the standard output and error of the processes, using non-blocking connections. 'processx' can poll a process for standard output or error, with a timeout. It can also poll several processes at once.", + "License": "MIT + file LICENSE", + "URL": "https://processx.r-lib.org, https://github.com/r-lib/processx", + "BugReports": "https://github.com/r-lib/processx/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "ps (>= 1.2.0)", "R6", - "ps", "utils" ], - "Hash": "0c90a7d71988856bad2a2a45dd871bb9" + "Suggests": [ + "callr (>= 3.7.3)", + "cli (>= 3.3.0)", + "codetools", + "covr", + "curl", + "debugme", + "parallel", + "rlang (>= 1.0.2)", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1.9000", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre, cph] (), Winston Chang [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "progress": { "Package": "progress", "Version": "1.2.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", + "Title": "Terminal Progress Bars", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Rich\", \"FitzJohn\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Configurable Progress bars, they may include percentage, elapsed time, and/or the estimated completion time. They work in terminals, in 'Emacs' 'ESS', 'RStudio', 'Windows' 'Rgui' and the 'macOS' 'R.app'. The package also provides a 'C++' 'API', that works with or without 'Rcpp'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/progress#readme, http://r-lib.github.io/progress/", + "BugReports": "https://github.com/r-lib/progress/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "crayon", "hms", - "prettyunits" + "prettyunits", + "R6" + ], + "Suggests": [ + "Rcpp", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "f4625e061cb2865f111b47ff163a5ca6" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Rich FitzJohn [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "promises": { "Package": "promises", - "Version": "1.3.0", + "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Abstractions for Promise-Based Asynchronous Programming", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides fundamental abstractions for doing asynchronous programming in R using promises. Asynchronous programming is useful for allowing a single R process to orchestrate multiple tasks in the background while also attending to something else. Semantics are similar to 'JavaScript' promises, but with a syntax that is idiomatic R.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/promises/, https://github.com/rstudio/promises", + "BugReports": "https://github.com/rstudio/promises/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "fastmap (>= 1.1.0)", + "later", + "lifecycle", + "magrittr (>= 1.5)", + "otel (>= 0.2.0)", "R6", + "rlang" + ], + "Suggests": [ + "future (>= 1.21.0)", + "knitr", + "mirai", + "otelsdk (>= 0.2.0)", + "purrr", "Rcpp", - "fastmap", - "later", - "magrittr", - "rlang", - "stats" + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "vembedr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "rsconnect, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-27", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Barret Schloerke [aut, cre] (ORCID: ), Winston Chang [aut] (ORCID: ), Charlie Gao [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Barret Schloerke ", + "Repository": "CRAN" + }, + "proxy": { + "Package": "proxy", + "Version": "0.4-29", + "Source": "Repository", + "Type": "Package", + "Title": "Distance and Similarity Measures", + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")),\t person(given = \"Christian\", family = \"Buchta\", role = \"aut\"))", + "Description": "Provides an extensible framework for the efficient calculation of auto- and cross-proximities, along with implementations of the most popular ones.", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "stats", + "utils" ], - "Hash": "434cd5388a3979e74be5c219bcd6e77d" + "Suggests": [ + "cba" + ], + "Collate": "registry.R database.R dist.R similarities.R dissimilarities.R util.R seal.R", + "License": "GPL-2 | GPL-3", + "NeedsCompilation": "yes", + "Author": "David Meyer [aut, cre] (ORCID: ), Christian Buchta [aut]", + "Maintainer": "David Meyer ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "ps": { "Package": "ps", - "Version": "1.7.6", + "Version": "1.9.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "List, Query, Manipulate System Processes", + "Authors@R": "c( person(\"Jay\", \"Loden\", role = \"aut\"), person(\"Dave\", \"Daeschler\", role = \"aut\"), person(\"Giampaolo\", \"Rodola'\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "List, query and manipulate all system processes, on 'Windows', 'Linux' and 'macOS'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/ps, https://ps.r-lib.org/", + "BugReports": "https://github.com/r-lib/ps/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "utils" ], - "Hash": "dd2b9319ee0656c8acf45c7f40c59de7" + "Suggests": [ + "callr", + "covr", + "curl", + "pillar", + "pingr", + "processx (>= 3.1.0)", + "R6", + "rlang", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Biarch": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Jay Loden [aut], Dave Daeschler [aut], Giampaolo Rodola' [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "purrr": { "Package": "purrr", - "Version": "1.0.2", + "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "lifecycle", - "magrittr", - "rlang", - "vctrs" + "Title": "Functional Programming Tools", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", + "Description": "A complete and consistent functional programming toolkit for R.", + "License": "MIT + file LICENSE", + "URL": "https://purrr.tidyverse.org/, https://github.com/tidyverse/purrr", + "BugReports": "https://github.com/tidyverse/purrr/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.6.1)", + "lifecycle (>= 1.0.3)", + "magrittr (>= 1.5.0)", + "rlang (>= 1.1.1)", + "vctrs (>= 0.6.3)" + ], + "Suggests": [ + "carrier (>= 0.3.0)", + "covr", + "dplyr (>= 0.7.8)", + "httr", + "knitr", + "lubridate", + "mirai (>= 2.5.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble", + "tidyselect" ], - "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc" + "LinkingTo": [ + "cli" + ], + "VignetteBuilder": "knitr", + "Biarch": "true", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate, tidyr", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Lionel Henry [aut], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "qusage": { "Package": "qusage", - "Version": "2.38.0", + "Version": "2.44.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Date": "2013-01-20", + "Title": "qusage: Quantitative Set Analysis for Gene Expression", + "Authors@R": "c(person(\"Christopher Bolen\", \"Developer\", role = c(\"aut\", \"cre\"), email = \"cbolen1@gmail.com\"), person(\"Gur Yaari\", \"Developer\", role = \"aut\"), person(\"Juilee Thakar\", \"Developer\", role = \"aut\"), person(\"Hailong Meng\", \"Developer\", role = \"aut\"), person(\"Jacob Turner\", \"Developer\", role = \"aut\"), person(\"Derek Blankenship\", \"Developer\", role = \"aut\"), person(\"Steven Kleinstein\", \"Developer\", role = \"aut\"))", + "Author": "Christopher Bolen and Gur Yaari, with contributions from Juilee Thakar, Hailong Meng, Jacob Turner, Derek Blankenship, and Steven Kleinstein", + "Maintainer": "Christopher Bolen ", + "Depends": [ + "R (>= 2.10)", + "limma (>= 3.14)", + "methods" + ], + "Imports": [ + "utils", "Biobase", - "R", - "emmeans", - "fftw", - "limma", - "methods", "nlme", - "utils" - ], - "Hash": "f62c4ffeadb75c4b129350116258ac1f" + "emmeans", + "fftw" + ], + "Description": "This package is an implementation the Quantitative Set Analysis for Gene Expression (QuSAGE) method described in (Yaari G. et al, Nucl Acids Res, 2013). This is a novel Gene Set Enrichment-type test, which is designed to provide a faster, more accurate, and easier to understand test for gene expression studies. qusage accounts for inter-gene correlations using the Variance Inflation Factor technique proposed by Wu et al. (Nucleic Acids Res, 2012). In addition, rather than simply evaluating the deviation from a null hypothesis with a single number (a P value), qusage quantifies gene set activity with a complete probability density function (PDF). From this PDF, P values and confidence intervals can be easily extracted. Preserving the PDF also allows for post-hoc analysis (e.g., pair-wise comparisons of gene set activity) while maintaining statistical traceability. Finally, while qusage is compatible with individual gene statistics from existing methods (e.g., LIMMA), a Welch-based method is implemented that is shown to improve specificity. The QuSAGE package also includes a mixed effects model implementation, as described in (Turner JA et al, BMC Bioinformatics, 2015), and a meta-analysis framework as described in (Meng H, et al. PLoS Comput Biol. 2019). For questions, contact Chris Bolen (cbolen1@gmail.com) or Steven Kleinstein (steven.kleinstein@yale.edu)", + "License": "GPL (>= 2)", + "URL": "http://clip.med.yale.edu/qusage", + "biocViews": "GeneSetEnrichment, Microarray, RNASeq, Software, ImmunoOncology", + "git_url": "https://git.bioconductor.org/packages/qusage", + "git_branch": "RELEASE_3_22", + "git_last_commit": "123902b", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no" }, "qvalue": { "Package": "qvalue", - "Version": "2.36.0", + "Version": "2.42.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Q-value estimation for false discovery rate control", + "Date": "2015-03-24", + "Authors@R": "as.person(c( \"John D. Storey [aut, cre]\", \"Andrew J. Bass [aut]\", \"Alan Dabney [aut]\", \"David Robinson [aut]\", \"Gregory Warnes [ctb]\" ))", + "Maintainer": "John D. Storey , Andrew J. Bass ", + "biocViews": "MultipleComparisons", + "Description": "This package takes a list of p-values resulting from the simultaneous testing of many hypotheses and estimates their q-values and local FDR values. The q-value of a test measures the proportion of false positives incurred (called the false discovery rate) when that particular test is called significant. The local FDR measures the posterior probability the null hypothesis is true given the test's p-value. Various plots are automatically generated, allowing one to make sensible significance cut-offs. Several mathematical results have recently been shown on the conservative accuracy of the estimated q-values from this software. The software can be applied to problems in genomics, brain imaging, astrophysics, and data mining.", + "VignetteBuilder": "knitr", + "Imports": [ + "splines", "ggplot2", "grid", - "reshape2", - "splines" + "reshape2" + ], + "Suggests": [ + "knitr" ], - "Hash": "16f095487215acf101cdc3ed3da237cf" + "Depends": [ + "R(>= 2.10)" + ], + "URL": "http://github.com/jdstorey/qvalue", + "License": "LGPL", + "RoxygenNote": "5.0.1", + "git_url": "https://git.bioconductor.org/packages/qvalue", + "git_branch": "RELEASE_3_22", + "git_last_commit": "6527d7b", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "John D. Storey [aut, cre], Andrew J. Bass [aut], Alan Dabney [aut], David Robinson [aut], Gregory Warnes [ctb]" }, "ragg": { "Package": "ragg", - "Version": "1.3.0", + "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Graphic Devices Based on AGG", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Maxim\", \"Shemanarev\", role = c(\"aut\", \"cph\"), comment = \"Author of AGG\"), person(\"Tony\", \"Juricic\", , \"tonygeek@yahoo.com\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Milan\", \"Marusinec\", , \"milan@marusinec.sk\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Spencer\", \"Garrett\", role = \"ctb\", comment = \"Contributor to AGG\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Maintainer": "Thomas Lin Pedersen ", + "Description": "Anti-Grain Geometry (AGG) is a high-quality and high-performance 2D drawing library. The 'ragg' package provides a set of graphic devices based on AGG to use as alternative to the raster devices provided through the 'grDevices' package.", + "License": "MIT + file LICENSE", + "URL": "https://ragg.r-lib.org, https://github.com/r-lib/ragg", + "BugReports": "https://github.com/r-lib/ragg/issues", + "Imports": [ + "systemfonts (>= 1.0.3)", + "textshaping (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "graphics", + "grid", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ "systemfonts", "textshaping" ], - "Hash": "082e1a198e3329d571f4448ef0ede4bc" + "Config/build/compilation-database": "true", + "Config/Needs/website": "ggplot2, devoid, magick, bench, tidyr, ggridges, hexbin, sessioninfo, pkgdown, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "freetype2, libpng, libtiff, libjpeg, libwebp, libwebpmux", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), Maxim Shemanarev [aut, cph] (Author of AGG), Tony Juricic [ctb, cph] (Contributor to AGG), Milan Marusinec [ctb, cph] (Contributor to AGG), Spencer Garrett [ctb] (Contributor to AGG), Posit Software, PBC [cph, fnd] (ROR: )", + "Repository": "CRAN" }, "rappdirs": { "Package": "rappdirs", - "Version": "0.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Version": "0.3.4", + "Source": "Repository", + "Type": "Package", + "Title": "Application Directories: Determine Where to Save Data, Caches, and Logs", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"trl\", \"cre\", \"cph\")), person(\"Sridhar\", \"Ratnakumar\", role = \"aut\"), person(\"Trent\", \"Mick\", role = \"aut\"), person(\"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(\"Eddy\", \"Petrisor\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = c(\"trl\", \"aut\"), comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Gabor\", \"Csardi\", role = \"ctb\"), person(\"Gregory\", \"Jefferis\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' () to R.", + "License": "MIT + file LICENSE", + "URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs", + "BugReports": "https://github.com/r-lib/rappdirs/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Suggests": [ + "covr", + "roxygen2", + "testthat (>= 3.2.0)", + "withr" ], - "Hash": "5e3c5dc0b071b21fa128676560dbe94d" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-05", + "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, Posit, PBC. See file LICENSE for details.", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [trl, cre, cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut] (ORCID: ), Gabor Csardi [ctb], Gregory Jefferis [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "readr": { "Package": "readr", - "Version": "2.1.5", + "Version": "2.1.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", + "Title": "Read Rectangular Text Data", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\") )", + "Description": "The goal of 'readr' is to provide a fast and friendly way to read rectangular data (like 'csv', 'tsv', and 'fwf'). It is designed to flexibly parse many types of data found in the wild, while still cleanly failing when data unexpectedly changes.", + "License": "MIT + file LICENSE", + "URL": "https://readr.tidyverse.org, https://github.com/tidyverse/readr", + "BugReports": "https://github.com/tidyverse/readr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.2.0)", "clipr", - "cpp11", "crayon", - "hms", - "lifecycle", + "hms (>= 0.4.1)", + "lifecycle (>= 0.2.0)", "methods", + "R6", "rlang", "tibble", - "tzdb", "utils", - "vroom" + "vroom (>= 1.6.0)" + ], + "Suggests": [ + "covr", + "curl", + "datasets", + "knitr", + "rmarkdown", + "spelling", + "stringi", + "testthat (>= 3.2.0)", + "tzdb (>= 0.1.1)", + "waldo", + "withr", + "xml2" ], - "Hash": "9de96463d2117f6ac49980577939dfb3" + "LinkingTo": [ + "cpp11", + "tzdb (>= 0.1.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "false", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Romain Francois [ctb], Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], Posit Software, PBC [cph, fnd], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [ctb, cph] (grisu3 implementation), Mikkel Jørgensen [ctb, cph] (grisu3 implementation)", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "readxl": { "Package": "readxl", - "Version": "1.4.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.4.5", + "Source": "Repository", + "Title": "Read Excel Files", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = \"Copyright holder of all R code and all C/C++ code without explicit copyright attribution\"), person(\"Marcin\", \"Kalicinski\", role = c(\"ctb\", \"cph\"), comment = \"Author of included RapidXML code\"), person(\"Komarov Valery\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Christophe Leitienne\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Bob Colbert\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"David Hoerl\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Evan Miller\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\") )", + "Description": "Import excel files into R. Supports '.xls' via the embedded 'libxls' C library and '.xlsx' via the embedded 'RapidXML' C++ library . Works on Windows, Mac and Linux without external dependencies.", + "License": "MIT + file LICENSE", + "URL": "https://readxl.tidyverse.org, https://github.com/tidyverse/readxl", + "BugReports": "https://github.com/tidyverse/readxl/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "cellranger", - "cpp11", - "progress", - "tibble", + "tibble (>= 2.0.1)", "utils" ], - "Hash": "8cf9c239b96df1bbb133b74aef77ad0a" + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "testthat (>= 3.1.6)", + "withr" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.0)", + "progress" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, tidyverse", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Note": "libxls v1.6.3 c199d13", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut] (), Jennifer Bryan [aut, cre] (), Posit, PBC [cph, fnd] (Copyright holder of all R code and all C/C++ code without explicit copyright attribution), Marcin Kalicinski [ctb, cph] (Author of included RapidXML code), Komarov Valery [ctb, cph] (Author of included libxls code), Christophe Leitienne [ctb, cph] (Author of included libxls code), Bob Colbert [ctb, cph] (Author of included libxls code), David Hoerl [ctb, cph] (Author of included libxls code), Evan Miller [ctb, cph] (Author of included libxls code)", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "rematch": { "Package": "rematch", "Version": "2.0.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "cbff1b666c6fa6d21202f07e2318d4f1" + "Title": "Match Regular Expressions with a Nicer 'API'", + "Author": "Gabor Csardi", + "Maintainer": "Gabor Csardi ", + "Description": "A small wrapper on 'regexpr' to extract the matches and captured groups from the match of a regular expression to a character vector.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/gaborcsardi/rematch", + "BugReports": "https://github.com/gaborcsardi/rematch/issues", + "RoxygenNote": "5.0.1.9000", + "Suggests": [ + "covr", + "testthat" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "rematch2": { "Package": "rematch2", "Version": "2.1.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Tidy Output from Regular Expression Matching", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", email = \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Matthew\", \"Lincoln\", email = \"matthew.d.lincoln@gmail.com\", role = c(\"ctb\")))", + "Description": "Wrappers on 'regexpr' and 'gregexpr' to return the match results in tidy data frames.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "URL": "https://github.com/r-lib/rematch2#readme", + "BugReports": "https://github.com/r-lib/rematch2/issues", + "RoxygenNote": "7.1.0", + "Imports": [ "tibble" ], - "Hash": "76c9e04c712a05848ae7a23d2f170a40" + "Suggests": [ + "covr", + "testthat" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Matthew Lincoln [ctb]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "remotes": { "Package": "remotes", "Version": "2.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "R Package Installation from Remote Repositories, Including 'GitHub'", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Martin\", \"Morgan\", role = \"aut\"), person(\"Dan\", \"Tenenbaum\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Ascent Digital Services\", role = \"cph\") )", + "Description": "Download and install R packages stored in 'GitHub', 'GitLab', 'Bitbucket', 'Bioconductor', or plain 'subversion' or 'git' repositories. This package provides the 'install_*' functions in 'devtools'. Indeed most of the code was copied over from 'devtools'.", + "License": "MIT + file LICENSE", + "URL": "https://remotes.r-lib.org, https://github.com/r-lib/remotes#readme", + "BugReports": "https://github.com/r-lib/remotes/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ "methods", "stats", "tools", "utils" ], - "Hash": "3ee025083e66f18db6cf27b56e23e141" + "Suggests": [ + "brew", + "callr", + "codetools", + "covr", + "curl", + "git2r (>= 0.23.0)", + "knitr", + "mockery", + "pingr", + "pkgbuild (>= 1.0.1)", + "rmarkdown", + "rprojroot", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "SystemRequirements": "Subversion for install_svn, git for install_git", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Jim Hester [aut], Hadley Wickham [aut], Winston Chang [aut], Martin Morgan [aut], Dan Tenenbaum [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "rentrez": { + "Package": "rentrez", + "Version": "1.2.4", + "Source": "Repository", + "Date": "2025-06-11", + "Title": "'Entrez' in R", + "Authors@R": "c( person(\"David\", \"Winter\", role=c(\"aut\", \"cre\"), email = \"david.winter@gmail.com\", comment = c(ORCID = \"0000-0002-6165-0029\")), person(\"Scott\", \"Chamberlain\", role=\"ctb\", email = \"myrmecocystus@gmail.com\", comment = c(ORCID = \"0000-0003-1444-9135\")), person(\"Han\",\"Guangchun\", role=c(\"ctb\"),email=\"hanguangchun@gmail.com\", comment = c(ORCID = \"0000-0001-9277-2507\")) )", + "Depends": [ + "R (>= 2.6.0)" + ], + "Imports": [ + "XML", + "httr (>= 0.5)", + "jsonlite (>= 0.9)" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown" + ], + "URL": "https://github.com/ropensci/rentrez/", + "BugReports": "https://github.com/ropensci/rentrez/issues/", + "Description": "Provides an R interface to the NCBI's 'EUtils' API, allowing users to search databases like 'GenBank' and 'PubMed' , process the results of those searches and pull data into their R sessions.", + "VignetteBuilder": "knitr", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "David Winter [aut, cre] (ORCID: ), Scott Chamberlain [ctb] (ORCID: ), Han Guangchun [ctb] (ORCID: )", + "Maintainer": "David Winter ", + "Repository": "CRAN" }, "renv": { "Package": "renv", - "Version": "1.0.11", - "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ + "Version": "1.1.7", + "Source": "Repository", + "Type": "Package", + "Title": "Project Environments", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@rstudio.com\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A dependency management toolkit for R. Using 'renv', you can create and manage project-local R libraries, save the state of these libraries to a 'lockfile', and later restore your library as required. Together, these tools can help make your projects more isolated, portable, and reproducible.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/renv/, https://github.com/rstudio/renv", + "BugReports": "https://github.com/rstudio/renv/issues", + "Imports": [ "utils" ], - "Hash": "47623f66b4e80b3b0587bc5d7b309888" + "Suggests": [ + "BiocManager", + "cli", + "compiler", + "covr", + "cpp11", + "curl", + "devtools", + "generics", + "gitcreds", + "jsonlite", + "jsonvalidate", + "knitr", + "miniUI", + "modules", + "packrat", + "pak", + "R6", + "remotes", + "reticulate", + "rmarkdown", + "rstudioapi", + "shiny", + "testthat", + "uuid", + "waldo", + "yaml", + "webfakes" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "bioconductor,python,install,restore,snapshot,retrieve,remotes", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Kevin Ushey ", + "Repository": "CRAN" }, "reprex": { "Package": "reprex", - "Version": "2.1.0", + "Version": "2.1.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "callr", - "cli", - "clipr", + "Title": "Prepare Reproducible Example Code via the Clipboard", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"David\", \"Robinson\", , \"admiral.david@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Convenience wrapper that uses the 'rmarkdown' package to render small snippets of code to target formats that include both code and output. The goal is to encourage the sharing of small, reproducible, and runnable examples on code-oriented websites, such as and , or in email. The user's clipboard is the default source of input code and the default target for rendered output. 'reprex' also extracts clean, runnable R code from various common formats, such as copy/paste from an R session.", + "License": "MIT + file LICENSE", + "URL": "https://reprex.tidyverse.org, https://github.com/tidyverse/reprex", + "BugReports": "https://github.com/tidyverse/reprex/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "callr (>= 3.6.0)", + "cli (>= 3.2.0)", + "clipr (>= 0.4.0)", "fs", "glue", - "knitr", + "knitr (>= 1.23)", "lifecycle", - "rlang", + "rlang (>= 1.0.0)", "rmarkdown", "rstudioapi", "utils", - "withr" - ], - "Hash": "1425f91b4d5d9a8f25352c44a3d914ed" + "withr (>= 2.3.0)" + ], + "Suggests": [ + "covr", + "fortunes", + "miniUI", + "rprojroot", + "sessioninfo", + "shiny", + "spelling", + "styler (>= 1.2.0)", + "testthat (>= 3.2.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "knitr-options, venues, reprex", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2", + "SystemRequirements": "pandoc (>= 2.0) - https://pandoc.org/", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [aut, cre] (), Jim Hester [aut] (), David Robinson [aut], Hadley Wickham [aut] (), Christophe Dervieux [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "reshape2": { "Package": "reshape2", - "Version": "1.4.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.4.5", + "Source": "Repository", + "Title": "Flexibly Reshape Data: A Reboot of the Reshape Package", + "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"))", + "Description": "Flexibly restructure and aggregate data using just two functions: melt and 'dcast' (or 'acast').", + "License": "MIT + file LICENSE", + "URL": "https://github.com/hadley/reshape", + "BugReports": "https://github.com/hadley/reshape/issues", + "Depends": [ + "R (>= 3.1)" + ], + "Imports": [ + "plyr (>= 1.8.1)", "Rcpp", - "plyr", "stringr" ], - "Hash": "bb5996d0bd962d214a11140d77589917" + "Suggests": [ + "covr", + "lattice", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "restfulr": { "Package": "restfulr", - "Version": "0.0.15", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "RCurl", - "S4Vectors", + "Version": "0.0.16", + "Source": "Repository", + "Type": "Package", + "Title": "R Interface to RESTful Web Services", + "Authors@R": "person(given = \"Michael\", family = \"Lawrence\", role = c(\"aut\", \"cre\"), email = \"michafla@gene.com\")", + "Description": "Models a RESTful service as if it were a nested R list.", + "License": "Artistic-2.0", + "Imports": [ "XML", - "methods", + "RCurl", "rjson", + "S4Vectors (>= 0.13.15)", "yaml" ], - "Hash": "44651c1e68eda9d462610aca9f15a815" - }, - "reticulate": { - "Package": "reticulate", - "Version": "1.36.1", - "Source": "Repository", + "Depends": [ + "R (>= 3.4.0)", + "methods" + ], + "Suggests": [ + "getPass", + "rsolr", + "RUnit" + ], + "Collate": "CRUDProtocol-class.R CacheInfo-class.R Credentials-class.R HTTP-class.R Media-class.R MediaCache-class.R RestUri-class.R RestContainer-class.R test_restfulr_package.R utils.R", + "NeedsCompilation": "yes", + "Author": "Michael Lawrence [aut, cre]", + "Maintainer": "Michael Lawrence ", "Repository": "CRAN", - "Requirements": [ + "Encoding": "UTF-8" + }, + "reticulate": { + "Package": "reticulate", + "Version": "1.45.0", + "Source": "Repository", + "Type": "Package", + "Title": "Interface to 'Python'", + "Authors@R": "c( person(\"Tomasz\", \"Kalinowski\", role = c(\"ctb\", \"cre\"), email = \"tomasz@posit.co\"), person(\"Kevin\", \"Ushey\", role = c(\"aut\"), email = \"kevin@posit.co\"), person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@posit.co\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")), person(\"Yuan\", \"Tang\", role = c(\"aut\", \"cph\"), email = \"terrytangyuan@gmail.com\", comment = c(ORCID = \"0000-0001-5243-233X\")), person(\"Dirk\", \"Eddelbuettel\", role = c(\"ctb\", \"cph\"), email = \"edd@debian.org\"), person(\"Bryan\", \"Lewis\", role = c(\"ctb\", \"cph\"), email = \"blewis@illposed.net\"), person(\"Sigrid\", \"Keydana\", role = c(\"ctb\"), email = \"sigrid@posit.co\"), person(\"Ryan\", \"Hafen\", role = c(\"ctb\", \"cph\"), email = \"rhafen@gmail.com\"), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyThread library, http://tinythreadpp.bitsnbites.eu/\") )", + "Description": "Interface to 'Python' modules, classes, and functions. When calling into 'Python', R data types are automatically converted to their equivalent 'Python' types. When values are returned from 'Python' to R they are converted back to R types. Compatible with all versions of 'Python' >= 2.7.", + "License": "Apache License 2.0", + "URL": "https://rstudio.github.io/reticulate/, https://github.com/rstudio/reticulate", + "BugReports": "https://github.com/rstudio/reticulate/issues", + "SystemRequirements": "Python (>= 2.7.0)", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ "Matrix", - "R", - "Rcpp", + "Rcpp (>= 1.0.7)", "RcppTOML", "graphics", "here", @@ -4491,776 +12293,2081 @@ "methods", "png", "rappdirs", - "rlang", "utils", + "rlang", "withr" ], - "Hash": "e037fb5dc364efdaf616eb6bc05aaca2" + "Suggests": [ + "callr", + "knitr", + "glue", + "cli", + "rmarkdown", + "pillar", + "testthat" + ], + "LinkingTo": [ + "Rcpp" + ], + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "NeedsCompilation": "yes", + "Author": "Tomasz Kalinowski [ctb, cre], Kevin Ushey [aut], JJ Allaire [aut], RStudio [cph, fnd], Yuan Tang [aut, cph] (ORCID: ), Dirk Eddelbuettel [ctb, cph], Bryan Lewis [ctb, cph], Sigrid Keydana [ctb], Ryan Hafen [ctb, cph], Marcus Geelnard [ctb, cph] (TinyThread library, http://tinythreadpp.bitsnbites.eu/)", + "Maintainer": "Tomasz Kalinowski ", + "Repository": "CRAN" }, "rhdf5": { "Package": "rhdf5", - "Version": "2.48.0", + "Version": "2.54.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", - "Rhdf5lib", - "methods", - "rhdf5filters" + "Type": "Package", + "Title": "R Interface to HDF5", + "Authors@R": "c( person(\"Bernd\", \"Fischer\", role = \"aut\"), person( \"Mike\", \"Smith\", role= \"aut\", comment = c(ORCID = \"0000-0002-7800-3848\", \"Maintainer from 2017 to 2025\") ), person(\"Gregoire\", \"Pau\", role=\"aut\"), person(\"Martin\", \"Morgan\", role = \"ctb\"), person(\"Daniel\", \"van Twisk\", role = \"ctb\"), person( \"Hugo\", \"Gruson\", role = \"cre\", email = \"hugo.gruson@embl.de\", comment = c(ORCID = \"0000-0002-4094-1476\") ) )", + "Description": "This package provides an interface between HDF5 and R. HDF5's main features are the ability to store and access very large and/or complex datasets and a wide variety of metadata on mass storage (disk) through a completely portable file format. The rhdf5 package is thus suited for the exchange of large and/or complex datasets between R and other software package, and for letting R applications work on datasets that are larger than the available RAM.", + "License": "Artistic-2.0", + "URL": "https://github.com/Huber-group-EMBL/rhdf5", + "BugReports": "https://github.com/Huber-group-EMBL/rhdf5/issues", + "LazyLoad": "true", + "VignetteBuilder": "knitr", + "Imports": [ + "Rhdf5lib (>= 1.13.4)", + "rhdf5filters (>= 1.15.5)" + ], + "Depends": [ + "R (>= 4.0.0)", + "methods" + ], + "Suggests": [ + "bit64", + "BiocStyle", + "knitr", + "rmarkdown", + "testthat", + "bench", + "dplyr", + "ggplot2", + "mockery", + "BiocParallel" + ], + "LinkingTo": [ + "Rhdf5lib" ], - "Hash": "74d8c5aeb96d090ce8efc9ffd16afa2b" + "SystemRequirements": "GNU make", + "biocViews": "Infrastructure, DataImport", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.3", + "git_url": "https://git.bioconductor.org/packages/rhdf5", + "git_branch": "RELEASE_3_22", + "git_last_commit": "7f691e4", + "git_last_commit_date": "2025-12-02", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Bernd Fischer [aut], Mike Smith [aut] (ORCID: , Maintainer from 2017 to 2025), Gregoire Pau [aut], Martin Morgan [ctb], Daniel van Twisk [ctb], Hugo Gruson [cre] (ORCID: )", + "Maintainer": "Hugo Gruson " }, "rhdf5filters": { "Package": "rhdf5filters", - "Version": "1.16.0", + "Version": "1.22.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Type": "Package", + "Title": "HDF5 Compression Filters", + "Authors@R": "c( person(\"Mike\", \"Smith\", role = c(\"aut\", \"ccp\"), comment = c(ORCID = \"0000-0002-7800-3848\") ), person(\"Hugo\", \"Gruson\", role = \"cre\", email = \"hugo.gruson@embl.de\", comment = c(ORCID = \"0000-0002-4094-1476\") ) )", + "Description": "Provides a collection of additional compression filters for HDF5 datasets. The package is intended to provide seemless integration with rhdf5, however the compiled filters can also be used with external applications.", + "License": "BSD_2_clause + file LICENSE", + "LazyLoad": "true", + "VignetteBuilder": "knitr", + "Suggests": [ + "BiocStyle", + "knitr", + "rmarkdown", + "tinytest", + "rhdf5 (>= 2.47.7)" + ], + "SystemRequirements": "GNU make", + "URL": "https://github.com/Huber-group-EMBL/rhdf5filters", + "BugReports": "https://github.com/Huber-group-EMBL/rhdf5filters/issues", + "LinkingTo": [ "Rhdf5lib" ], - "Hash": "99e15369f8fb17dc188377234de13fc6" + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "biocViews": "Infrastructure, DataImport", + "git_url": "https://git.bioconductor.org/packages/rhdf5filters", + "git_branch": "RELEASE_3_22", + "git_last_commit": "3465c24", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Mike Smith [aut, ccp] (ORCID: ), Hugo Gruson [cre] (ORCID: )", + "Maintainer": "Hugo Gruson " }, "rjson": { "Package": "rjson", - "Version": "0.2.21", + "Version": "0.2.23", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "JSON for R", + "Author": "Alex Couture-Beil [aut, cre]", + "Authors@R": "person(given = \"Alex\", family = \"Couture-Beil\", role = c(\"aut\", \"cre\"), email = \"rjson_pkg@mofo.ca\")", + "Maintainer": "Alex Couture-Beil ", + "Depends": [ + "R (>= 4.0.0)" ], - "Hash": "f9da75e6444e95a1baf8ca24909d63b9" + "Description": "Converts R object into JSON objects and vice-versa.", + "URL": "https://github.com/alexcb/rjson", + "License": "GPL-2", + "Repository": "CRAN", + "NeedsCompilation": "yes", + "Encoding": "UTF-8" }, "rlang": { "Package": "rlang", - "Version": "1.1.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.1.7", + "Source": "Repository", + "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", + "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", + "Authors@R": "c( person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"), person(given = \"mikefc\", email = \"mikefc@coolbutuseless.com\", role = \"cph\", comment = \"Hash implementation based on Mike's xxhashlite\"), person(given = \"Yann\", family = \"Collet\", role = \"cph\", comment = \"Author of the embedded xxHash library\"), person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "ByteCompile": "true", + "Biarch": "true", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ "utils" ], - "Hash": "42548638fae05fd9a9b5f3f437fbbbe2" + "Suggests": [ + "cli (>= 3.1.0)", + "covr", + "crayon", + "desc", + "fs", + "glue", + "knitr", + "magrittr", + "methods", + "pillar", + "pkgload", + "rmarkdown", + "stats", + "testthat (>= 3.2.0)", + "tibble", + "usethis", + "vctrs (>= 0.2.3)", + "withr" + ], + "Enhances": [ + "winch" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", + "BugReports": "https://github.com/r-lib/rlang/issues", + "Config/build/compilation-database": "true", + "Config/testthat/edition": "3", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], mikefc [cph] (Hash implementation based on Mike's xxhashlite), Yann Collet [cph] (Author of the embedded xxHash library), Posit, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "rmarkdown": { "Package": "rmarkdown", - "Version": "2.26", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bslib", - "evaluate", - "fontawesome", - "htmltools", + "Version": "2.30", + "Source": "Repository", + "Type": "Package", + "Title": "Dynamic Documents for R", + "Authors@R": "c( person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Javier\", \"Luraschi\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"), person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")), person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Malcolm\", \"Barrett\", role = \"ctb\"), person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"), person(\"Romain\", \"Lesur\", role = \"ctb\"), person(\"Roy\", \"Storey\", role = \"ctb\"), person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"), person(\"Sergio\", \"Oller\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"), person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"), person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"), person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"), person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"), person(, \"W3C\", role = \"cph\", comment = \"slidy library\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"), person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"), person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"), person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"), person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"), person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\") )", + "Description": "Convert R Markdown documents into a variety of formats.", + "License": "GPL-3", + "URL": "https://github.com/rstudio/rmarkdown, https://pkgs.rstudio.com/rmarkdown/", + "BugReports": "https://github.com/rstudio/rmarkdown/issues", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "bslib (>= 0.2.5.1)", + "evaluate (>= 0.13)", + "fontawesome (>= 0.5.0)", + "htmltools (>= 0.5.1)", "jquerylib", "jsonlite", - "knitr", + "knitr (>= 1.43)", "methods", - "tinytex", + "tinytex (>= 0.31)", "tools", "utils", - "xfun", - "yaml" + "xfun (>= 0.36)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "digest", + "dygraphs", + "fs", + "rsconnect", + "downlit (>= 0.4.0)", + "katex (>= 1.4.0)", + "sass (>= 0.4.0)", + "shiny (>= 1.6.0)", + "testthat (>= 3.0.3)", + "tibble", + "vctrs", + "cleanrmd", + "withr (>= 2.4.2)", + "xml2" ], - "Hash": "9b148e7f95d33aac01f31282d49e4f44" + "VignetteBuilder": "knitr", + "Config/Needs/website": "rstudio/quillt, pkgdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "pandoc (>= 1.14) - http://pandoc.org", + "NeedsCompilation": "no", + "Author": "JJ Allaire [aut], Yihui Xie [aut, cre] (ORCID: ), Christophe Dervieux [aut] (ORCID: ), Jonathan McPherson [aut], Javier Luraschi [aut], Kevin Ushey [aut], Aron Atkins [aut], Hadley Wickham [aut], Joe Cheng [aut], Winston Chang [aut], Richard Iannone [aut] (ORCID: ), Andrew Dunning [ctb] (ORCID: ), Atsushi Yasumoto [ctb, cph] (ORCID: , cph: Number sections Lua filter), Barret Schloerke [ctb], Carson Sievert [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Frederik Aust [ctb] (ORCID: ), Jeff Allen [ctb], JooYoung Seo [ctb] (ORCID: ), Malcolm Barrett [ctb], Rob Hyndman [ctb], Romain Lesur [ctb], Roy Storey [ctb], Ruben Arslan [ctb], Sergio Oller [ctb], Posit Software, PBC [cph, fnd], jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Alexander Farkas [ctb, cph] (html5shiv library), Scott Jehl [ctb, cph] (Respond.js library), Ivan Sagalaev [ctb, cph] (highlight.js library), Greg Franko [ctb, cph] (tocify library), John MacFarlane [ctb, cph] (Pandoc templates), Google, Inc. [ctb, cph] (ioslides library), Dave Raggett [ctb] (slidy library), W3C [cph] (slidy library), Dave Gandy [ctb, cph] (Font-Awesome), Ben Sperry [ctb] (Ionicons), Drifty [cph] (Ionicons), Aidan Lister [ctb, cph] (jQuery StickyTabs), Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter), Albert Krewinkel [ctb, cph] (pagebreak Lua filter)", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "rprojroot": { "Package": "rprojroot", - "Version": "2.0.4", + "Version": "2.1.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Finding Files in Project Subdirectories", + "Authors@R": "person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\"))", + "Description": "Robust, reliable and flexible paths to files below a project root. The 'root' of a project is defined as a directory that matches a certain criterion, e.g., it contains a certain regular file.", + "License": "MIT + file LICENSE", + "URL": "https://rprojroot.r-lib.org/, https://github.com/r-lib/rprojroot", + "BugReports": "https://github.com/r-lib/rprojroot/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Suggests": [ + "covr", + "knitr", + "lifecycle", + "rlang", + "rmarkdown", + "testthat (>= 3.2.0)", + "withr" ], - "Hash": "4c8415e0ec1e29f3f4f6fc108bef0144" + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "rstudioapi": { "Package": "rstudioapi", - "Version": "0.16.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "96710351d642b70e8f02ddeb237c46a7" + "Version": "0.18.0", + "Source": "Repository", + "Title": "Safely Access the RStudio API", + "Description": "Access the RStudio API (if available) and provide informative error messages when it's not.", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\"), person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@posit.co\"), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@posit.co\"), person(\"Gary\", \"Ritchie\", role = c(\"aut\"), email = \"gary@posit.co\"), person(family = \"RStudio\", role = \"cph\") )", + "Maintainer": "Kevin Ushey ", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/rstudioapi/, https://github.com/rstudio/rstudioapi", + "BugReports": "https://github.com/rstudio/rstudioapi/issues", + "RoxygenNote": "7.3.3", + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "clipr", + "covr", + "curl", + "jsonlite", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre], JJ Allaire [aut], Hadley Wickham [aut], Gary Ritchie [aut], RStudio [cph]", + "Repository": "CRAN" }, "rsvd": { "Package": "rsvd", "Version": "1.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R" + "Type": "Package", + "Title": "Randomized Singular Value Decomposition", + "Date": "2021-04-11", + "Authors@R": "c(person(\"N. Benjamin\", \"Erichson\", role = c(\"aut\", \"cre\"), email = \"erichson@berkeley.edu\"))", + "Author": "N. Benjamin Erichson [aut, cre]", + "Maintainer": "N. Benjamin Erichson ", + "Description": "Low-rank matrix decompositions are fundamental tools and widely used for data analysis, dimension reduction, and data compression. Classically, highly accurate deterministic matrix algorithms are used for this task. However, the emergence of large-scale data has severely challenged our computational ability to analyze big data. The concept of randomness has been demonstrated as an effective strategy to quickly produce approximate answers to familiar problems such as the singular value decomposition (SVD). The rsvd package provides several randomized matrix algorithms such as the randomized singular value decomposition (rsvd), randomized principal component analysis (rpca), randomized robust principal component analysis (rrpca), randomized interpolative decomposition (rid), and the randomized CUR decomposition (rcur). In addition several plot functions are provided.", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "Matrix" + ], + "License": "GPL (>= 3)", + "LazyData": "TRUE", + "LazyDataCompression": "xz", + "URL": "https://github.com/erichson/rSVD", + "BugReports": "https://github.com/erichson/rSVD/issues", + "Suggests": [ + "ggplot2", + "testthat" ], - "Hash": "b462187d887abc519894874486dbd6fd" + "RoxygenNote": "7.1.1", + "NeedsCompilation": "no", + "Encoding": "UTF-8", + "Repository": "CRAN" }, "rtracklayer": { "Package": "rtracklayer", - "Version": "1.64.0", + "Version": "1.70.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "BiocIO", - "Biostrings", - "GenomeInfoDb", - "GenomicAlignments", - "GenomicRanges", - "IRanges", - "R", - "Rsamtools", - "S4Vectors", - "XML", - "XVector", + "Title": "R interface to genome annotation files and the UCSC genome browser", + "Author": "Michael Lawrence, Vince Carey, Robert Gentleman", + "Depends": [ + "R (>= 3.5)", + "methods", + "GenomicRanges (>= 1.37.2)" + ], + "Imports": [ + "XML (>= 1.98-0)", + "BiocGenerics (>= 0.35.3)", + "S4Vectors (>= 0.23.18)", + "IRanges (>= 2.13.13)", + "XVector (>= 0.19.7)", + "Seqinfo", + "Biostrings (>= 2.77.2)", "curl", "httr", - "methods", - "restfulr", + "Rsamtools (>= 1.31.2)", + "GenomicAlignments (>= 1.15.6)", + "BiocIO", "tools", - "zlibbioc" + "restfulr (>= 0.0.13)" ], - "Hash": "3d6f004fce582bd7d68e2e18d44abbc1" + "Suggests": [ + "GenomeInfoDb", + "BSgenome (>= 1.33.4)", + "humanStemCell", + "microRNA (>= 1.1.1)", + "genefilter", + "limma", + "org.Hs.eg.db", + "hgu133plus2.db", + "GenomicFeatures", + "BSgenome.Hsapiens.UCSC.hg19", + "TxDb.Hsapiens.UCSC.hg19.knownGene", + "RUnit" + ], + "LinkingTo": [ + "S4Vectors", + "IRanges", + "XVector" + ], + "Description": "Extensible framework for interacting with multiple genome browsers (currently UCSC built-in) and manipulating annotation tracks in various formats (currently GFF, BED, bedGraph, BED15, WIG, BigWig and 2bit built-in). The user may export/import tracks to/from the supported browsers, as well as query and modify the browser state, such as the current viewport.", + "Maintainer": "Michael Lawrence ", + "License": "Artistic-2.0 + file LICENSE", + "Collate": "io.R web.R ranges.R trackDb.R browser.R ucsc.R readGFF.R gff.R bed.R wig.R utils.R bigWig.R bigBed.R chain.R quickload.R trackhub.R twobit.R fasta.R tabix.R bam.R trackTable.R index.R test_rtracklayer_package.R ncbi.R igv.R zzz.R", + "biocViews": "Annotation,Visualization,DataImport", + "git_url": "https://git.bioconductor.org/packages/rtracklayer", + "git_branch": "RELEASE_3_22", + "git_last_commit": "873c711", + "git_last_commit_date": "2025-12-16", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "RemoteType": "bioconductor", + "RemoteUrl": "https://github.com/bioc/rtracklayer", + "RemoteRef": "RELEASE_3_22", + "RemoteSha": "873c7111e8befb0e5761618280100a4de0cc5f3e" }, "rvest": { "Package": "rvest", - "Version": "1.0.4", + "Version": "1.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Easily Harvest (Scrape) Web Pages", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Wrappers around the 'xml2' and 'httr' packages to make it easy to download, then manipulate, HTML and XML.", + "License": "MIT + file LICENSE", + "URL": "https://rvest.tidyverse.org/, https://github.com/tidyverse/rvest", + "BugReports": "https://github.com/tidyverse/rvest/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "cli", "glue", - "httr", - "lifecycle", + "httr (>= 0.5)", + "lifecycle (>= 1.0.3)", "magrittr", - "rlang", + "rlang (>= 1.1.0)", "selectr", "tibble", - "xml2" + "xml2 (>= 1.4.0)" + ], + "Suggests": [ + "chromote", + "covr", + "knitr", + "purrr", + "R6", + "readr", + "repurrrsive", + "rmarkdown", + "spelling", + "stringi (>= 0.3.1)", + "testthat (>= 3.0.2)", + "tidyr", + "webfakes" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "s2": { + "Package": "s2", + "Version": "1.1.9", + "Source": "Repository", + "Title": "Spherical Geometry Operators Using the S2 Geometry Library", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(\"Ege\", \"Rubak\", email=\"rubak@math.aau.dk\", role = c(\"aut\")), person(\"Jeroen\", \"Ooms\", , \"jeroen.ooms@stat.ucla.edu\", role = \"ctb\", comment = \"configure script\"), person(family = \"Google, Inc.\", role = \"cph\", comment = \"Original s2geometry.io source code\") )", + "Description": "Provides R bindings for Google's s2 library for geometric calculations on the sphere. High-performance constructors and exporters provide high compatibility with existing spatial packages, transformers construct new geometries from existing geometries, predicates provide a means to select geometries based on spatial relationships, and accessors extract information about geometries.", + "License": "Apache License (== 2.0)", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.2", + "SystemRequirements": "cmake, OpenSSL >= 1.0.1, Abseil >= 20230802.0", + "LinkingTo": [ + "Rcpp", + "wk" + ], + "Imports": [ + "Rcpp", + "wk (>= 0.6.0)" + ], + "Suggests": [ + "bit64", + "testthat (>= 3.0.0)", + "vctrs" + ], + "URL": "https://r-spatial.github.io/s2/, https://github.com/r-spatial/s2, http://s2geometry.io/", + "BugReports": "https://github.com/r-spatial/s2/issues", + "Depends": [ + "R (>= 3.0.0)" ], - "Hash": "0bcf0c6f274e90ea314b812a6d19a519" + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut] (ORCID: ), Edzer Pebesma [aut, cre] (ORCID: ), Ege Rubak [aut], Jeroen Ooms [ctb] (configure script), Google, Inc. [cph] (Original s2geometry.io source code)", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" }, "sass": { "Package": "sass", - "Version": "0.4.9", + "Version": "0.4.10", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Syntactically Awesome Style Sheets ('Sass')", + "Description": "An 'SCSS' compiler, powered by the 'LibSass' library. With this, R developers can use variables, inheritance, and functions to generate dynamic style sheets. The package uses the 'Sass CSS' extension language, which is stable, powerful, and CSS compatible.", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@rstudio.com\", \"aut\"), person(\"Timothy\", \"Mastny\", , \"tim.mastny@gmail.com\", \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Barret\", \"Schloerke\", , \"barret@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Carson\", \"Sievert\", , \"carson@rstudio.com\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Christophe\", \"Dervieux\", , \"cderv@rstudio.com\", c(\"ctb\"), comment = c(ORCID = \"0000-0003-4474-2498\")), person(family = \"RStudio\", role = c(\"cph\", \"fnd\")), person(family = \"Sass Open Source Foundation\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Greter\", \"Marcel\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Mifsud\", \"Michael\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Hampton\", \"Catlin\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Natalie\", \"Weizenbaum\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Chris\", \"Eppstein\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Adams\", \"Joseph\", role = c(\"ctb\", \"cph\"), comment = \"json.cpp\"), person(\"Trifunovic\", \"Nemanja\", role = c(\"ctb\", \"cph\"), comment = \"utf8.h\") )", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/sass/, https://github.com/rstudio/sass", + "BugReports": "https://github.com/rstudio/sass/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make", + "Imports": [ + "fs (>= 1.2.4)", + "rlang (>= 0.4.10)", + "htmltools (>= 0.5.1)", "R6", - "fs", - "htmltools", - "rappdirs", - "rlang" + "rappdirs" ], - "Hash": "d53dbfddf695303ea4ad66f86e99b95d" + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "withr", + "shiny", + "curl" + ], + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Timothy Mastny [aut], Richard Iannone [aut] (), Barret Schloerke [aut] (), Carson Sievert [aut, cre] (), Christophe Dervieux [ctb] (), RStudio [cph, fnd], Sass Open Source Foundation [ctb, cph] (LibSass library), Greter Marcel [ctb, cph] (LibSass library), Mifsud Michael [ctb, cph] (LibSass library), Hampton Catlin [ctb, cph] (LibSass library), Natalie Weizenbaum [ctb, cph] (LibSass library), Chris Eppstein [ctb, cph] (LibSass library), Adams Joseph [ctb, cph] (json.cpp), Trifunovic Nemanja [ctb, cph] (utf8.h)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "scDblFinder": { "Package": "scDblFinder", - "Version": "1.18.0", + "Version": "1.24.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Type": "Package", + "Title": "scDblFinder", + "Authors@R": "c( person(\"Pierre-Luc\", \"Germain\", email=\"pierre-luc.germain@hest.ethz.ch\", role=c(\"cre\",\"aut\"), comment=c(ORCID=\"0000-0003-3418-4218\")), person(\"Aaron\", \"Lun\", email=\"infinite.monkeys.with.keyboards@gmail.com\", role=\"ctb\"))", + "URL": "https://github.com/plger/scDblFinder, https://plger.github.io/scDblFinder/", + "BugReports": "https://github.com/plger/scDblFinder/issues", + "Description": "The scDblFinder package gathers various methods for the detection and handling of doublets/multiplets in single-cell sequencing data (i.e. multiple cells captured within the same droplet or reaction volume). It includes methods formerly found in the scran package, the new fast and comprehensive scDblFinder method, and a reimplementation of the Amulet detection method for single-cell ATAC-seq.", + "License": "GPL-3 + file LICENSE", + "Depends": [ + "R (>= 4.0)", + "SingleCellExperiment" + ], + "Imports": [ + "igraph", + "Matrix", "BiocGenerics", - "BiocNeighbors", "BiocParallel", + "BiocNeighbors", "BiocSingular", - "DelayedArray", - "GenomeInfoDb", - "GenomicRanges", - "IRanges", - "MASS", - "Matrix", - "R", - "Rsamtools", "S4Vectors", - "SingleCellExperiment", "SummarizedExperiment", - "bluster", - "igraph", - "methods", - "rtracklayer", - "scater", "scran", + "scater", "scuttle", + "bluster", + "methods", + "DelayedArray", + "xgboost", "stats", "utils", - "xgboost" + "MASS", + "IRanges", + "GenomicRanges", + "GenomeInfoDb", + "Rsamtools", + "rtracklayer" ], - "Hash": "3a998cfc42e06628628c320c904ffdaf" + "Suggests": [ + "BiocStyle", + "knitr", + "rmarkdown", + "testthat", + "scRNAseq", + "circlize", + "ComplexHeatmap", + "ggplot2", + "dplyr", + "viridisLite", + "mbkmeans" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "biocViews": "Preprocessing, SingleCell, RNASeq, ATACSeq", + "git_url": "https://git.bioconductor.org/packages/scDblFinder", + "git_branch": "RELEASE_3_22", + "git_last_commit": "0336756", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Pierre-Luc Germain [cre, aut] (ORCID: ), Aaron Lun [ctb]", + "Maintainer": "Pierre-Luc Germain " }, "scRNAseq": { "Package": "scRNAseq", - "Version": "2.18.0", + "Version": "2.24.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationDbi", - "AnnotationHub", - "BiocGenerics", - "DBI", - "DelayedArray", - "ExperimentHub", - "GenomicFeatures", - "GenomicRanges", + "Title": "Collection of Public Single-Cell RNA-Seq Datasets", + "Date": "2025-10-10", + "Authors@R": "c( person(\"Davide\", \"Risso\", email = \"risso.davide@gmail.com\", role = c(\"aut\", \"cph\")), person(\"Michael\", \"Cole\", role=\"aut\"), person(\"Aaron\", \"Lun\", role=c(\"ctb\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Alan\", \"O'Callaghan\", role=\"ctb\"), person(\"Jens\", \"Preussner\", role=\"ctb\"), person(\"Charlotte\", \"Soneson\", role=\"ctb\"), person(\"Stephany\", \"Orjuela\", role=\"ctb\"), person(\"Daniel\", \"Bunis\", role=\"ctb\"), person(\"Milan\", \"Malfait\", role=\"ctb\"))", + "Description": "Gene-level counts for a collection of public scRNA-seq datasets, provided as SingleCellExperiment objects with cell- and gene-level metadata.", + "License": "CC0", + "NeedsCompilation": "no", + "Depends": [ + "SingleCellExperiment" + ], + "Imports": [ + "utils", + "methods", "Matrix", - "RSQLite", + "BiocGenerics", "S4Vectors", - "SingleCellExperiment", "SparseArray", + "DelayedArray", + "GenomicRanges", "SummarizedExperiment", + "ExperimentHub (>= 2.3.4)", + "AnnotationHub (>= 3.3.6)", + "AnnotationDbi", + "ensembldb", + "GenomicFeatures", "alabaster.base", "alabaster.matrix", "alabaster.sce", - "ensembldb", "gypsum", "jsonlite", - "methods", - "utils" + "DBI", + "RSQLite" ], - "Hash": "83fde673a4bb12d7ab50d4684a115363" + "Suggests": [ + "BiocStyle", + "knitr", + "rmarkdown", + "testthat", + "jsonvalidate", + "BiocManager" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "biocViews": "ExperimentHub, ExperimentData, ExpressionData, SequencingData, RNASeqData, SingleCellData", + "BuildResaveData": "no", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/scRNAseq", + "git_branch": "RELEASE_3_22", + "git_last_commit": "111920c", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Davide Risso [aut, cph], Michael Cole [aut], Aaron Lun [ctb, cre], Alan O'Callaghan [ctb], Jens Preussner [ctb], Charlotte Soneson [ctb], Stephany Orjuela [ctb], Daniel Bunis [ctb], Milan Malfait [ctb]", + "Maintainer": "Aaron Lun " }, "scales": { "Package": "scales", - "Version": "1.3.0", + "Version": "1.4.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "RColorBrewer", + "Title": "Scale Functions for Visualization", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Dana\", \"Seidel\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Graphical scales map data to aesthetics, and provide methods for automatically determining breaks and labels for axes and legends.", + "License": "MIT + file LICENSE", + "URL": "https://scales.r-lib.org, https://github.com/r-lib/scales", + "BugReports": "https://github.com/r-lib/scales/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "cli", - "farver", + "farver (>= 2.0.3)", "glue", "labeling", "lifecycle", - "munsell", - "rlang", + "R6", + "RColorBrewer", + "rlang (>= 1.1.0)", "viridisLite" ], - "Hash": "c19df082ba346b0ffa6f833e92de34d1" + "Suggests": [ + "bit64", + "covr", + "dichromat", + "ggplot2", + "hms (>= 0.5.0)", + "stringi", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "LazyLoad": "yes", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Thomas Lin Pedersen [cre, aut] (), Dana Seidel [aut], Posit Software, PBC [cph, fnd] (03wc8by49)", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "scater": { "Package": "scater", - "Version": "1.32.0", + "Version": "1.38.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "BiocNeighbors", - "BiocParallel", - "BiocSingular", - "DelayedArray", + "Type": "Package", + "Authors@R": "c( person(\"Davis\", \"McCarthy\", role=c(\"aut\"), email=\"davis@ebi.ac.uk\"), person(\"Kieran\", \"Campbell\", role=c(\"aut\"), email=\"kieran.campbell@sjc.ox.ac.uk\"), person(\"Aaron\", \"Lun\", role = c(\"aut\", \"ctb\"), email=\"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Quin\", \"Wills\", role=c(\"aut\"), email=\"qilin@quinwills.net\"), person(\"Vladimir\", \"Kiselev\", role=c(\"ctb\"), email=\"vk6@sanger.ac.uk\"), person(\"Felix G.M.\", \"Ernst\", role=c(\"ctb\"), email=\"felix.gm.ernst@outlook.com\"), person(\"Alan\", \"O'Callaghan\", role=c(\"ctb\", \"cre\"), email=\"alan.ocallaghan@outlook.com\"), person(\"Yun\", \"Peng\", role=c(\"ctb\"), email=\"yunyunp96@gmail.com\"), person(\"Leo\", \"Lahti\", role=c(\"ctb\"), email=\"leo.lahti@utu.fi\", comment = c(ORCID = \"0000-0001-5537-637X\")), person(\"Tuomas\", \"Borman\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0002-8563-8884\")) )", + "Date": "2025-03-07", + "License": "GPL-3", + "Title": "Single-Cell Analysis Toolkit for Gene Expression Data in R", + "Description": "A collection of tools for doing various analyses of single-cell RNA-seq gene expression data, with a focus on quality control and visualization.", + "Depends": [ + "SingleCellExperiment", + "scuttle", + "ggplot2" + ], + "Imports": [ + "stats", + "utils", + "methods", "Matrix", - "MatrixGenerics", - "RColorBrewer", - "RcppML", - "Rtsne", + "BiocGenerics", "S4Vectors", - "SingleCellExperiment", "SummarizedExperiment", + "MatrixGenerics", + "SparseArray", + "DelayedArray", "beachmat", - "ggbeeswarm", - "ggplot2", - "ggrastr", - "ggrepel", - "methods", - "pheatmap", + "BiocNeighbors", + "BiocSingular", + "BiocParallel", "rlang", - "scuttle", - "stats", - "utils", + "ggbeeswarm", + "viridis", + "Rtsne", + "RColorBrewer", + "RcppML", "uwot", - "viridis" + "pheatmap", + "ggrepel", + "ggrastr" ], - "Hash": "4a6eb8ab8a2b926fe67cf83aa731a3df" + "Suggests": [ + "BiocStyle", + "DelayedMatrixStats", + "snifter", + "densvis", + "cowplot", + "biomaRt", + "knitr", + "scRNAseq", + "robustbase", + "rmarkdown", + "testthat", + "Biobase", + "scattermore" + ], + "VignetteBuilder": "knitr", + "biocViews": "ImmunoOncology, SingleCell, RNASeq, QualityControl, Preprocessing, Normalization, Visualization, DimensionReduction, Transcriptomics, GeneExpression, Sequencing, Software, DataImport, DataRepresentation, Infrastructure, Coverage", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "URL": "http://bioconductor.org/packages/scater/", + "BugReports": "https://support.bioconductor.org/", + "git_url": "https://git.bioconductor.org/packages/scater", + "git_branch": "RELEASE_3_22", + "git_last_commit": "64e2b5e", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Davis McCarthy [aut], Kieran Campbell [aut], Aaron Lun [aut, ctb], Quin Wills [aut], Vladimir Kiselev [ctb], Felix G.M. Ernst [ctb], Alan O'Callaghan [ctb, cre], Yun Peng [ctb], Leo Lahti [ctb] (ORCID: ), Tuomas Borman [ctb] (ORCID: )", + "Maintainer": "Alan O'Callaghan " }, "scatterpie": { "Package": "scatterpie", - "Version": "0.2.2", + "Version": "0.2.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "dplyr", + "Title": "Scatter Pie Plot", + "Authors@R": "c( person(given = \"Guangchuang\", family = \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(given = \"Shuangbin\", family = \"Xu\", email = \"xshuangbin@163.com\", role = \"ctb\", comment = c(ORCID=\"0000-0003-3513-5362\")) )", + "Description": "Creates scatterpie plots, especially useful for plotting pies on a map.", + "Depends": [ + "R (>= 4.1.0)", + "ggplot2" + ], + "Imports": [ "ggforce", - "ggfun", - "ggplot2", "rlang", + "ggfun", "stats", "tidyr", - "utils" + "dplyr", + "utils", + "yulab.utils (>= 0.1.6)" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "prettydoc", + "maps", + "scales", + "cli" ], - "Hash": "5a6b2f02c942e71a06690a99cb51c060" + "VignetteBuilder": "knitr", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre] (ORCID: ), Shuangbin Xu [ctb] (ORCID: )", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" }, "scran": { "Package": "scran", - "Version": "1.32.0", + "Version": "1.38.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BH", + "Date": "2024-09-05", + "Title": "Methods for Single-Cell RNA-Seq Data Analysis", + "Description": "Implements miscellaneous functions for interpretation of single-cell RNA-seq data. Methods are provided for assignment of cell cycle phase, detection of highly variable and significantly correlated genes, identification of marker genes, and other common tasks in routine single-cell analysis workflows.", + "Authors@R": "c(person(\"Aaron\", \"Lun\", role = c(\"aut\", \"cre\"), email = \"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Karsten\", \"Bach\", role = \"aut\"), person(\"Jong Kyoung\", \"Kim\", role = \"ctb\"), person(\"Antonio\", \"Scialdone\", role=\"ctb\"))", + "Depends": [ + "SingleCellExperiment", + "scuttle" + ], + "Imports": [ + "SummarizedExperiment", + "S4Vectors", "BiocGenerics", "BiocParallel", - "BiocSingular", + "Rcpp", + "stats", + "methods", + "utils", + "Matrix", + "edgeR", + "limma", + "igraph", + "statmod", + "MatrixGenerics", + "S4Arrays", "DelayedArray", + "BiocSingular", + "bluster", + "metapod", + "dqrng", + "beachmat" + ], + "Suggests": [ + "testthat", + "BiocStyle", + "knitr", + "rmarkdown", "DelayedMatrixStats", - "Matrix", + "HDF5Array", + "scRNAseq", + "dynamicTreeCut", + "ResidualMatrix", + "ScaledMatrix", + "DESeq2", + "pheatmap", + "scater" + ], + "biocViews": "ImmunoOncology, Normalization, Sequencing, RNASeq, Software, GeneExpression, Transcriptomics, SingleCell, Clustering", + "LinkingTo": [ "Rcpp", - "S4Vectors", - "SingleCellExperiment", - "SummarizedExperiment", "beachmat", - "bluster", + "BH", "dqrng", - "edgeR", - "igraph", - "limma", - "metapod", + "scuttle" + ], + "License": "GPL-3", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "SystemRequirements": "C++11", + "RoxygenNote": "7.3.2", + "URL": "https://github.com/MarioniLab/scran/", + "BugReports": "https://github.com/MarioniLab/scran/issues", + "git_url": "https://git.bioconductor.org/packages/scran", + "git_branch": "RELEASE_3_22", + "git_last_commit": "50cb1ba", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Aaron Lun [aut, cre], Karsten Bach [aut], Jong Kyoung Kim [ctb], Antonio Scialdone [ctb]", + "Maintainer": "Aaron Lun " + }, + "scrapper": { + "Package": "scrapper", + "Version": "1.4.0", + "Source": "Bioconductor", + "Date": "2025-10-27", + "Authors@R": "person(\"Aaron\", \"Lun\", role=c(\"cre\", \"aut\"), email=\"infinite.monkeys.with.keyboards@gmail.com\")", + "Title": "Bindings to C++ Libraries for Single-Cell Analysis", + "Description": "Implements R bindings to C++ code for analyzing single-cell (expression) data, mostly from various libscran libraries. Each function performs an individual step in the single-cell analysis workflow, ranging from quality control to clustering and marker detection. It is mostly intended for other Bioconductor package developers to build more user-friendly end-to-end workflows.", + "License": "MIT + file LICENSE", + "Imports": [ "methods", - "scuttle", - "statmod", - "stats", - "utils" + "Rcpp", + "beachmat (>= 2.25.1)", + "DelayedArray", + "BiocNeighbors (>= 1.99.0)", + "Rigraphlib", + "parallel" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "BiocStyle", + "MatrixGenerics", + "sparseMatrixStats", + "Matrix", + "S4Vectors", + "SummarizedExperiment", + "SingleCellExperiment", + "scRNAseq", + "igraph" ], - "Hash": "5b11173a6b49f06dda0db31e80caa561" + "LinkingTo": [ + "Rcpp", + "assorthead (>= 1.3.10)", + "beachmat", + "BiocNeighbors" + ], + "biocViews": "Normalization, RNASeq, Software, GeneExpression, Transcriptomics, SingleCell, BatchEffect, QualityControl, DifferentialExpression, FeatureExtraction, PrincipalComponent, Clustering", + "SystemRequirements": "C++17, GNU make", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "git_url": "https://git.bioconductor.org/packages/scrapper", + "git_branch": "RELEASE_3_22", + "git_last_commit": "4de467a", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Aaron Lun [cre, aut]", + "Maintainer": "Aaron Lun " }, "scuttle": { "Package": "scuttle", - "Version": "1.14.0", + "Version": "1.20.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "BiocGenerics", - "BiocParallel", - "DelayedArray", - "DelayedMatrixStats", - "GenomicRanges", + "Type": "Package", + "Authors@R": "c( person(\"Aaron\", \"Lun\", role = c(\"aut\", \"cre\"), email=\"infinite.monkeys.with.keyboards@gmail.com\"), person(\"Davis\", \"McCarthy\", role=\"aut\") )", + "Date": "2024-10-26", + "License": "GPL-3", + "Title": "Single-Cell RNA-Seq Analysis Utilities", + "Description": "Provides basic utility functions for performing single-cell analyses, focusing on simple normalization, quality control and data transformations. Also provides some helper functions to assist development of other packages.", + "Depends": [ + "SingleCellExperiment" + ], + "Imports": [ + "methods", + "utils", + "stats", "Matrix", "Rcpp", + "BiocGenerics", "S4Vectors", - "SingleCellExperiment", + "BiocParallel", + "GenomicRanges", "SummarizedExperiment", - "beachmat", - "methods", - "stats", - "utils" + "S4Arrays", + "MatrixGenerics", + "SparseArray", + "DelayedArray", + "beachmat" + ], + "Suggests": [ + "BiocStyle", + "knitr", + "scRNAseq", + "rmarkdown", + "testthat", + "sparseMatrixStats", + "DelayedMatrixStats", + "scran" ], - "Hash": "6d94b72071aefd6e8b041c34ee83ebd0" + "VignetteBuilder": "knitr", + "biocViews": "ImmunoOncology, SingleCell, RNASeq, QualityControl, Preprocessing, Normalization, Transcriptomics, GeneExpression, Sequencing, Software, DataImport", + "LinkingTo": [ + "Rcpp", + "beachmat" + ], + "SystemRequirements": "C++11", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "git_url": "https://git.bioconductor.org/packages/scuttle", + "git_branch": "RELEASE_3_22", + "git_last_commit": "2796dbd", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "Author": "Aaron Lun [aut, cre], Davis McCarthy [aut]", + "Maintainer": "Aaron Lun " }, "segmented": { "Package": "segmented", - "Version": "2.1-3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "2.2-1", + "Source": "Repository", + "Type": "Package", + "Title": "Regression Models with Break-Points / Change-Points Estimation (with Possibly Random Effects)", + "Date": "2026-01-29", + "Authors@R": "c(person(given = c(\"Vito\",\"M.\",\"R.\"), family = \"Muggeo\", role = c(\"aut\", \"cre\"), email = \"vito.muggeo@unipa.it\", comment=c(ORCID=\"0000-0002-3386-4054\")))", + "Maintainer": "Vito M. R. Muggeo ", + "Description": "Fitting regression models where, in addition to possible linear terms, one or more covariates have segmented (i.e., broken-line or piece-wise linear) or stepmented (i.e. piece-wise constant) effects. Multiple breakpoints for the same variable are allowed. The estimation method is discussed in Muggeo (2003, ) and illustrated in Muggeo (2008, ). An approach for hypothesis testing is presented in Muggeo (2016, ), and interval estimation for the breakpoint is discussed in Muggeo (2017, ). Segmented mixed models, i.e. random effects in the change point, are discussed in Muggeo (2014, ). Estimation of piecewise-constant relationships and changepoints (mean-shift models) is discussed in Fasola et al. (2018, ).", + "Depends": [ + "R (>= 3.5.0)", "MASS", - "R", "nlme" ], - "Hash": "3994f48217792f0bb363f0c52167dada" + "License": "GPL", + "NeedsCompilation": "no", + "Author": "Vito M. R. Muggeo [aut, cre] (ORCID: )", + "RoxygenNote": "7.3.1", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "selectr": { "Package": "selectr", - "Version": "0.4-2", + "Version": "0.5-1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", + "Type": "Package", + "Title": "Translate CSS Selectors to XPath Expressions", + "Authors@R": "c(person(\"Simon\", \"Potter\", role = c(\"aut\", \"trl\", \"cre\"), email = \"simon@sjp.co.nz\"), person(\"Simon\", \"Sapin\", role = \"aut\"), person(\"Ian\", \"Bicking\", role = \"aut\"))", + "License": "BSD_3_clause + file LICENCE", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ "methods", - "stringr" + "stringr", + "R6" ], - "Hash": "3838071b66e0c566d55cc26bd6e27bf4" + "Suggests": [ + "testthat", + "XML", + "xml2" + ], + "URL": "https://sjp.co.nz/projects/selectr/", + "BugReports": "https://github.com/sjp/selectr/issues", + "Description": "Translates a CSS selector into an equivalent XPath expression. This allows us to use CSS selectors when working with the XML package as it can only evaluate XPath expressions. Also provided are convenience functions useful for using CSS selectors on XML nodes. This package is a port of the Python package 'cssselect' ().", + "NeedsCompilation": "no", + "Author": "Simon Potter [aut, trl, cre], Simon Sapin [aut], Ian Bicking [aut]", + "Maintainer": "Simon Potter ", + "Repository": "CRAN", + "Encoding": "UTF-8" }, - "shadowtext": { - "Package": "shadowtext", - "Version": "0.1.3", + "sf": { + "Package": "sf", + "Version": "1.0-24", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "ggplot2", + "Title": "Simple Features for R", + "Authors@R": "c(person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Roger\", family = \"Bivand\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2392-6140\")), person(given = \"Etienne\", family = \"Racine\", role = \"ctb\"), person(given = \"Michael\", family = \"Sumner\", role = \"ctb\"), person(given = \"Ian\", family = \"Cook\", role = \"ctb\"), person(given = \"Tim\", family = \"Keitt\", role = \"ctb\"), person(given = \"Robin\", family = \"Lovelace\", role = \"ctb\"), person(given = \"Hadley\", family = \"Wickham\", role = \"ctb\"), person(given = \"Jeroen\", family = \"Ooms\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"ctb\"), person(given = \"Thomas Lin\", family = \"Pedersen\", role = \"ctb\"), person(given = \"Dan\", family = \"Baston\", role = \"ctb\"), person(given = \"Dewey\", family = \"Dunnington\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9415-4582\")) )", + "Description": "Support for simple feature access, a standardized way to encode and analyze spatial vector data. Binds to 'GDAL' for reading and writing data, to 'GEOS' for geometrical operations, and to 'PROJ' for projection conversions and datum transformations. Uses by default the 's2' package for geometry operations on geodetic (long/lat degree) coordinates.", + "License": "GPL-2 | MIT + file LICENSE", + "URL": "https://r-spatial.github.io/sf/, https://github.com/r-spatial/sf", + "BugReports": "https://github.com/r-spatial/sf/issues", + "Depends": [ + "methods", + "R (>= 3.3.0)" + ], + "Imports": [ + "classInt (>= 0.4-1)", + "DBI (>= 0.8)", + "graphics", + "grDevices", "grid", - "scales" + "magrittr", + "s2 (>= 1.1.0)", + "stats", + "tools", + "units (>= 0.7-0)", + "utils" ], - "Hash": "a6d0947671b22116358e2fa6595abdc4" + "Suggests": [ + "blob", + "nanoarrow", + "covr", + "dplyr (>= 1.0.0)", + "ggplot2", + "knitr", + "lwgeom (>= 0.2-14)", + "maps", + "mapview", + "Matrix", + "microbenchmark", + "odbc", + "pbapply", + "pillar", + "pool", + "raster", + "rlang", + "rmarkdown", + "RPostgres (>= 1.1.0)", + "RPostgreSQL", + "RSQLite", + "sp (>= 1.2-4)", + "spatstat (>= 2.0-1)", + "spatstat.geom", + "spatstat.random", + "spatstat.linnet", + "spatstat.utils", + "stars (>= 0.6-0)", + "terra", + "testthat (>= 3.0.0)", + "tibble (>= 1.4.1)", + "tidyr (>= 1.2.0)", + "tidyselect (>= 1.0.0)", + "tmap (>= 2.0)", + "vctrs", + "wk (>= 0.9.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "2", + "Config/needs/coverage": "XML", + "SystemRequirements": "GDAL (>= 2.0.1), GEOS (>= 3.4.0), PROJ (>= 4.8.0), sqlite3", + "Collate": "'RcppExports.R' 'init.R' 'import-standalone-s3-register.R' 'crs.R' 'bbox.R' 'read.R' 'db.R' 'sfc.R' 'sfg.R' 'sf.R' 'bind.R' 'wkb.R' 'wkt.R' 'plot.R' 'geom-measures.R' 'geom-predicates.R' 'geom-transformers.R' 'transform.R' 'proj.R' 'sp.R' 'grid.R' 'arith.R' 'tidyverse.R' 'tidyverse-vctrs.R' 'cast_sfg.R' 'cast_sfc.R' 'graticule.R' 'datasets.R' 'aggregate.R' 'agr.R' 'maps.R' 'join.R' 'sample.R' 'valid.R' 'collection_extract.R' 'jitter.R' 'sgbp.R' 'spatstat.R' 'stars.R' 'crop.R' 'gdal_utils.R' 'nearest.R' 'normalize.R' 'sf-package.R' 'defunct.R' 'z_range.R' 'm_range.R' 'shift_longitude.R' 'make_grid.R' 's2.R' 'terra.R' 'geos-overlayng.R' 'break_antimeridian.R'", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Roger Bivand [ctb] (ORCID: ), Etienne Racine [ctb], Michael Sumner [ctb], Ian Cook [ctb], Tim Keitt [ctb], Robin Lovelace [ctb], Hadley Wickham [ctb], Jeroen Ooms [ctb] (ORCID: ), Kirill Müller [ctb], Thomas Lin Pedersen [ctb], Dan Baston [ctb], Dewey Dunnington [ctb] (ORCID: )", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" }, "shape": { "Package": "shape", "Version": "1.4.6.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", + "Title": "Functions for Plotting Graphical Shapes, Colors", + "Author": "Karline Soetaert ", + "Maintainer": "Karline Soetaert ", + "Depends": [ + "R (>= 2.01)" + ], + "Imports": [ + "stats", "graphics", - "stats" + "grDevices" ], - "Hash": "5c47e84dc0a3ca761ae1d307889e796d" + "Description": "Functions for plotting graphical shapes such as ellipses, circles, cylinders, arrows, ...", + "License": "GPL (>= 3)", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "shiny": { "Package": "shiny", - "Version": "1.8.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "bslib", - "cachem", - "commonmark", - "crayon", - "fastmap", - "fontawesome", - "glue", + "Version": "1.12.1", + "Source": "Repository", + "Type": "Package", + "Title": "Web Application Framework for R", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Garrick\", \"Aden-Buie\", , \"garrick@adenbuie.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(, \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(, \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", + "Description": "Makes it incredibly easy to build interactive web applications with R. Automatic \"reactive\" binding between inputs and outputs and extensive prebuilt widgets make it possible to build beautiful, responsive, and powerful applications with minimal effort.", + "License": "GPL-3 | file LICENSE", + "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", + "BugReports": "https://github.com/rstudio/shiny/issues", + "Depends": [ + "methods", + "R (>= 3.0.2)" + ], + "Imports": [ + "bslib (>= 0.6.0)", + "cachem (>= 1.1.0)", + "cli", + "commonmark (>= 2.0.0)", + "fastmap (>= 1.1.1)", + "fontawesome (>= 0.4.0)", + "glue (>= 1.3.2)", "grDevices", - "htmltools", - "httpuv", - "jsonlite", - "later", - "lifecycle", - "methods", - "mime", - "promises", - "rlang", + "htmltools (>= 0.5.4)", + "httpuv (>= 1.5.2)", + "jsonlite (>= 0.9.16)", + "later (>= 1.0.0)", + "lifecycle (>= 0.2.0)", + "mime (>= 0.3)", + "otel", + "promises (>= 1.5.0)", + "R6 (>= 2.0)", + "rlang (>= 0.4.10)", "sourcetools", "tools", "utils", "withr", "xtable" ], - "Hash": "54b26646816af9960a4c64d8ceec75d6" + "Suggests": [ + "Cairo (>= 1.5-5)", + "coro (>= 1.1.0)", + "datasets", + "DT", + "dygraphs", + "future", + "ggplot2", + "knitr (>= 1.6)", + "magrittr", + "markdown", + "mirai", + "otelsdk (>= 0.2.0)", + "ragg", + "reactlog (>= 1.0.0)", + "rmarkdown", + "sass", + "showtext", + "testthat (>= 3.2.1)", + "watcher", + "yaml" + ], + "Config/Needs/check": "shinytest2", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'globals.R' 'app-state.R' 'app_template.R' 'bind-cache.R' 'bind-event.R' 'bookmark-state-local.R' 'bookmark-state.R' 'bootstrap-deprecated.R' 'bootstrap-layout.R' 'conditions.R' 'map.R' 'utils.R' 'bootstrap.R' 'busy-indicators-spinners.R' 'busy-indicators.R' 'cache-utils.R' 'deprecated.R' 'devmode.R' 'diagnose.R' 'extended-task.R' 'fileupload.R' 'graph.R' 'reactives.R' 'reactive-domains.R' 'history.R' 'hooks.R' 'html-deps.R' 'image-interact-opts.R' 'image-interact.R' 'imageutils.R' 'input-action.R' 'input-checkbox.R' 'input-checkboxgroup.R' 'input-date.R' 'input-daterange.R' 'input-file.R' 'input-numeric.R' 'input-password.R' 'input-radiobuttons.R' 'input-select.R' 'input-slider.R' 'input-submit.R' 'input-text.R' 'input-textarea.R' 'input-utils.R' 'insert-tab.R' 'insert-ui.R' 'jqueryui.R' 'knitr.R' 'middleware-shiny.R' 'middleware.R' 'timer.R' 'shiny.R' 'mock-session.R' 'modal.R' 'modules.R' 'notifications.R' 'otel-attr-srcref.R' 'otel-collect.R' 'otel-enable.R' 'otel-error.R' 'otel-label.R' 'otel-reactive-update.R' 'otel-session.R' 'otel-shiny.R' 'otel-with.R' 'priorityqueue.R' 'progress.R' 'react.R' 'reexports.R' 'render-cached-plot.R' 'render-plot.R' 'render-table.R' 'run-url.R' 'runapp.R' 'serializers.R' 'server-input-handlers.R' 'server-resource-paths.R' 'server.R' 'shiny-options.R' 'shiny-package.R' 'shinyapp.R' 'shinyui.R' 'shinywrappers.R' 'showcase.R' 'snapshot.R' 'staticimports.R' 'tar.R' 'test-export.R' 'test-server.R' 'test.R' 'update-input.R' 'utils-lang.R' 'utils-tags.R' 'version_bs_date_picker.R' 'version_ion_range_slider.R' 'version_jquery.R' 'version_jqueryui.R' 'version_selectize.R' 'version_strftime.R' 'viewer.R'", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], JJ Allaire [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Garrick Aden-Buie [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Jonathan McPherson [aut], Alan Dipert [aut], Barbara Borges [aut], Posit Software, PBC [cph, fnd] (ROR: ), jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Prem Nawaz Khan [ctb] (Bootstrap accessibility plugin), Victor Tsaran [ctb] (Bootstrap accessibility plugin), Dennis Lembree [ctb] (Bootstrap accessibility plugin), Srinivasu Chakravarthula [ctb] (Bootstrap accessibility plugin), Cathy O'Connor [ctb] (Bootstrap accessibility plugin), PayPal, Inc [cph] (Bootstrap accessibility plugin), Stefan Petre [ctb, cph] (Bootstrap-datepicker library), Andrew Rowls [ctb, cph] (Bootstrap-datepicker library), Brian Reavis [ctb, cph] (selectize.js library), Salmen Bejaoui [ctb, cph] (selectize-plugin-a11y library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library), SpryMedia Limited [ctb, cph] (DataTables library), Ivan Sagalaev [ctb, cph] (highlight.js library), R Core Team [ctb, cph] (tar implementation from R)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "shinydashboard": { "Package": "shinydashboard", - "Version": "0.7.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "htmltools", + "Version": "0.7.3", + "Source": "Repository", + "Title": "Create Dashboards with 'Shiny'", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Barbara\", \"Borges Ribeiro\", role = \"aut\"), person(, \"Posit Software, PBC\", role = \"cph\"), person(, \"Almasaeed Studio\", role = c(\"ctb\", \"cph\"), comment = \"AdminLTE theme for Bootstrap\"), person(, \"Adobe Systems Incorporated\", role = c(\"ctb\", \"cph\"), comment = \"Source Sans Pro font\") )", + "Description": "Create dashboards with 'Shiny'. This package provides a theme on top of 'Shiny', making it easy to create attractive dashboards.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/shinydashboard/, https://github.com/rstudio/shinydashboard", + "BugReports": "https://github.com/rstudio/shinydashboard/issues", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "htmltools (>= 0.2.6)", "promises", - "shiny", + "shiny (>= 1.0.0)", "utils" ], - "Hash": "e418b532e9bb4eb22a714b9a9f1acee7" + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut, cre], Barbara Borges Ribeiro [aut], Posit Software, PBC [cph], Almasaeed Studio [ctb, cph] (AdminLTE theme for Bootstrap), Adobe Systems Incorporated [ctb, cph] (Source Sans Pro font)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "sitmo": { "Package": "sitmo", "Version": "2.0.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Parallel Pseudo Random Number Generator (PPRNG) 'sitmo' Header Files", + "Authors@R": "c(person(\"James\", \"Balamuta\", email = \"balamut2@illinois.edu\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0003-2826-8458\")), person(\"Thijs\",\"van den Berg\", email = \"thijs@sitmo.com\", role = c(\"aut\", \"cph\")), person(\"Ralf\", \"Stubner\", email = \"ralf.stubner@daqana.com\", role = c(\"ctb\")))", + "Description": "Provided within are two high quality and fast PPRNGs that may be used in an 'OpenMP' parallel environment. In addition, there is a generator for one dimensional low-discrepancy sequence. The objective of this library to consolidate the distribution of the 'sitmo' (C++98 & C++11), 'threefry' and 'vandercorput' (C++11-only) engines on CRAN by enabling others to link to the header files inside of 'sitmo' instead of including a copy of each engine within their individual package. Lastly, the package contains example implementations using the 'sitmo' package and three accompanying vignette that provide additional information.", + "Depends": [ + "R (>= 3.2.0)" + ], + "URL": "https://github.com/coatless/sitmo, http://thecoatlessprofessor.com/projects/sitmo/, https://github.com/stdfin/random/", + "BugReports": "https://github.com/coatless/sitmo/issues", + "License": "MIT + file LICENSE", + "LinkingTo": [ "Rcpp" ], - "Hash": "c956d93f6768a9789edbc13072b70c78" + "Imports": [ + "Rcpp (>= 0.12.13)" + ], + "RoxygenNote": "7.1.1", + "Suggests": [ + "knitr", + "rmarkdown", + "ggplot2" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "James Balamuta [aut, cre, cph] (), Thijs van den Berg [aut, cph], Ralf Stubner [ctb]", + "Maintainer": "James Balamuta ", + "Repository": "CRAN" }, "snow": { "Package": "snow", "Version": "0.4-4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Simple Network of Workstations", + "Author": "Luke Tierney, A. J. Rossini, Na Li, H. Sevcikova", + "Description": "Support for simple parallel computing in R.", + "Maintainer": "Luke Tierney ", + "Suggests": [ + "rlecuyer" + ], + "Enhances": [ + "Rmpi" + ], + "License": "GPL", + "Depends": [ + "R (>= 2.13.1)", "utils" ], - "Hash": "40b74690debd20c57d93d8c246b305d4" + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "sourcetools": { "Package": "sourcetools", "Version": "0.1.7-1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Tools for Reading, Tokenizing and Parsing R Code", + "Author": "Kevin Ushey", + "Maintainer": "Kevin Ushey ", + "Description": "Tools for the reading and tokenization of R code. The 'sourcetools' package provides both an R and C++ interface for the tokenization of R code, and helpers for interacting with the tokenized representation of R code.", + "License": "MIT + file LICENSE", + "Depends": [ + "R (>= 3.0.2)" + ], + "Suggests": [ + "testthat" ], - "Hash": "5f5a7629f956619d519205ec475fe647" + "RoxygenNote": "5.0.1", + "BugReports": "https://github.com/kevinushey/sourcetools/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Repository": "CRAN" }, "sparseMatrixStats": { "Package": "sparseMatrixStats", - "Version": "1.16.0", + "Version": "1.22.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Matrix", - "MatrixGenerics", + "Type": "Package", + "Title": "Summary Statistics for Rows and Columns of Sparse Matrices", + "Authors@R": "person(\"Constantin\", \"Ahlmann-Eltze\", email = \"artjom31415@googlemail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-3762-068X\"))", + "Description": "High performance functions for row and column operations on sparse matrices. For example: col / rowMeans2, col / rowMedians, col / rowVars etc. Currently, the optimizations are limited to data in the column sparse format. This package is inspired by the matrixStats package by Henrik Bengtsson.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ "Rcpp", - "matrixStats", + "Matrix", + "matrixStats (>= 0.60.0)", "methods" ], - "Hash": "7e500a5a527460ca0406473bdcade286" + "Depends": [ + "MatrixGenerics (>= 1.5.3)" + ], + "Suggests": [ + "testthat (>= 2.1.0)", + "knitr", + "bench", + "rmarkdown", + "BiocStyle" + ], + "SystemRequirements": "C++11", + "VignetteBuilder": "knitr", + "URL": "https://github.com/const-ae/sparseMatrixStats", + "BugReports": "https://github.com/const-ae/sparseMatrixStats/issues", + "biocViews": "Infrastructure, Software, DataRepresentation", + "git_url": "https://git.bioconductor.org/packages/sparseMatrixStats", + "git_branch": "RELEASE_3_22", + "git_last_commit": "3acf348", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes", + "Author": "Constantin Ahlmann-Eltze [aut, cre] (ORCID: )", + "Maintainer": "Constantin Ahlmann-Eltze " + }, + "spatialEco": { + "Package": "spatialEco", + "Version": "2.0-3", + "Source": "Repository", + "Type": "Package", + "Title": "Spatial Analysis and Modelling Utilities", + "Date": "2025-09-29", + "Authors@R": "c( person(family=\"Evans\", given=\"Jeffrey S.\", email = \"jeffrey_evans@tnc.org\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5533-7044\")), person(family=\"Murphy\", given=\"Melanie A.\", role = \"ctb\"),\t\t\t person(family=\"Ram\", given=\"Karthik\", role = \"ctb\") )", + "Description": "Utilities to support spatial data manipulation, query, sampling and modelling in ecological applications. Functions include models for species population density, spatial smoothing, multivariate separability, point process model for creating pseudo- absences and sub-sampling, Quadrant-based sampling and analysis, auto-logistic modeling, sampling models, cluster optimization, statistical exploratory tools and raster-based metrics.", + "Depends": [ + "R (>= 4.2)" + ], + "Imports": [ + "sf", + "terra" + ], + "Suggests": [ + "spatstat.geom (>= 3.0-3)", + "spatstat.explore", + "spdep", + "ks", + "cluster", + "readr", + "RCurl", + "RANN", + "rms", + "yaImpute", + "mgcv", + "zyp", + "SpatialPack (>= 0.3)", + "MASS", + "caret", + "dplyr", + "earth", + "Matrix", + "gstat", + "spatstat.data", + "methods", + "units", + "sp", + "stringr", + "lwgeom", + "geodata" + ], + "Maintainer": "Jeffrey S. Evans ", + "License": "GPL-3", + "URL": "https://github.com/jeffreyevans/spatialEco, https://jeffreyevans.github.io/spatialEco/", + "BugReports": "https://github.com/jeffreyevans/spatialEco/issues", + "NeedsCompilation": "no", + "Repository": "CRAN", + "LazyData": "true", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Author": "Jeffrey S. Evans [aut, cre] (ORCID: ), Melanie A. Murphy [ctb], Karthik Ram [ctb]" }, "spelling": { "Package": "spelling", - "Version": "2.3.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "2.3.2", + "Source": "Repository", + "Title": "Tools for Spell Checking in R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", , \"jeroenooms@gmail.com\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Jim\", \"Hester\", , \"james.hester@rstudio.com\", role = \"aut\"))", + "Description": "Spell checking common document formats including latex, markdown, manual pages, and description files. Includes utilities to automate checking of documentation and vignettes as a unit test during 'R CMD check'. Both British and American English are supported out of the box and other languages can be added. In addition, packages may define a 'wordlist' to allow custom terminology without having to abuse punctuation.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "URL": "https://ropensci.r-universe.dev/spelling https://docs.ropensci.org/spelling/", + "BugReports": "https://github.com/ropensci/spelling/issues", + "Imports": [ "commonmark", - "hunspell", - "knitr", - "xml2" + "xml2", + "hunspell (>= 3.0)", + "knitr" ], - "Hash": "632e9e83d3dc774d361b9415b15642bb" + "Suggests": [ + "pdftools" + ], + "RoxygenNote": "7.3.1", + "Language": "en-GB", + "NeedsCompilation": "no", + "Author": "Jeroen Ooms [cre, aut] (ORCID: ), Jim Hester [aut]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "statmod": { "Package": "statmod", - "Version": "1.5.0", + "Version": "1.5.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "graphics", - "stats" + "Date": "2025-10-08", + "Title": "Statistical Modeling", + "Authors@R": "c(person(given = \"Gordon\", family = \"Smyth\", role = c(\"cre\", \"aut\"), email = \"smyth@wehi.edu.au\"), person(given = \"Lizhong\", family = \"Chen\", role = \"aut\"), person(given = \"Yifang\", family = \"Hu\", role = \"ctb\"), person(given = \"Peter\", family = \"Dunn\", role = \"ctb\"), person(given = \"Belinda\", family = \"Phipson\", role = \"ctb\"), person(given = \"Yunshun\", family = \"Chen\", role = \"ctb\"))", + "Maintainer": "Gordon Smyth ", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ + "stats", + "graphics" + ], + "Suggests": [ + "MASS", + "tweedie" ], - "Hash": "26e158d12052c279bdd4ba858b80fb1f" + "Description": "A collection of algorithms and functions to aid statistical modeling. Includes limiting dilution analysis (aka ELDA), growth curve comparisons, mixed linear models, heteroscedastic regression, inverse-Gaussian probability calculations, Gauss quadrature and a secure convergence algorithm for nonlinear models. Also includes advanced generalized linear model functions including Tweedie and Digamma distributional families, secure convergence and exact distributional calculations for unit deviances.", + "License": "GPL-2 | GPL-3", + "NeedsCompilation": "yes", + "Author": "Gordon Smyth [cre, aut], Lizhong Chen [aut], Yifang Hu [ctb], Peter Dunn [ctb], Belinda Phipson [ctb], Yunshun Chen [ctb]", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "stringi": { "Package": "stringi", - "Version": "1.8.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "stats", + "Version": "1.8.7", + "Source": "Repository", + "Date": "2025-03-27", + "Title": "Fast and Portable Character String Processing Facilities", + "Description": "A collection of character string/text/natural language processing tools for pattern searching (e.g., with 'Java'-like regular expressions or the 'Unicode' collation algorithm), random string generation, case mapping, string transliteration, concatenation, sorting, padding, wrapping, Unicode normalisation, date-time formatting and parsing, and many more. They are fast, consistent, convenient, and - thanks to 'ICU' (International Components for Unicode) - portable across all locales and platforms. Documentation about 'stringi' is provided via its website at and the paper by Gagolewski (2022, ).", + "URL": "https://stringi.gagolewski.com/, https://github.com/gagolews/stringi, https://icu.unicode.org/", + "BugReports": "https://github.com/gagolews/stringi/issues", + "SystemRequirements": "ICU4C (>= 61, optional)", + "Type": "Package", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "tools", - "utils" + "utils", + "stats" ], - "Hash": "058aebddea264f4c99401515182e656a" + "Biarch": "TRUE", + "License": "file LICENSE", + "Authors@R": "c(person(given = \"Marek\", family = \"Gagolewski\", role = c(\"aut\", \"cre\", \"cph\"), email = \"marek@gagolewski.com\", comment = c(ORCID = \"0000-0003-0637-6028\")), person(given = \"Bartek\", family = \"Tartanus\", role = \"ctb\"), person(\"Unicode, Inc. and others\", role=\"ctb\", comment = \"ICU4C source code, Unicode Character Database\") )", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Marek Gagolewski [aut, cre, cph] (), Bartek Tartanus [ctb], Unicode, Inc. and others [ctb] (ICU4C source code, Unicode Character Database)", + "Maintainer": "Marek Gagolewski ", + "License_is_FOSS": "yes", + "Repository": "CRAN" }, "stringr": { "Package": "stringr", - "Version": "1.5.1", + "Version": "1.6.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Simple, Consistent Wrappers for Common String Operations", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\", \"cph\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A consistent, simple and easy to use set of wrappers around the fantastic 'stringi' package. All function and argument names (and positions) are consistent, all functions deal with \"NA\"'s and zero length vectors in the same way, and the output from one function is easy to feed into the input of another.", + "License": "MIT + file LICENSE", + "URL": "https://stringr.tidyverse.org, https://github.com/tidyverse/stringr", + "BugReports": "https://github.com/tidyverse/stringr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ "cli", - "glue", - "lifecycle", + "glue (>= 1.6.1)", + "lifecycle (>= 1.0.3)", "magrittr", - "rlang", - "stringi", - "vctrs" + "rlang (>= 1.0.0)", + "stringi (>= 1.5.3)", + "vctrs (>= 0.4.0)" + ], + "Suggests": [ + "covr", + "dplyr", + "gt", + "htmltools", + "htmlwidgets", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble" ], - "Hash": "960e2ae9e09656611e0b8214ad543207" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/potools/style": "explicit", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre, cph], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "survival": { "Package": "survival", - "Version": "3.5-8", + "Version": "3.8-3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", + "Title": "Survival Analysis", + "Priority": "recommended", + "Date": "2024-12-17", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "graphics", + "Matrix", "methods", "splines", "stats", "utils" ], - "Hash": "184d7799bca4ba8c3be72ea396f4b9a3" + "LazyData": "Yes", + "LazyDataCompression": "xz", + "ByteCompile": "Yes", + "Authors@R": "c(person(c(\"Terry\", \"M\"), \"Therneau\", email=\"therneau.terry@mayo.edu\", role=c(\"aut\", \"cre\")), person(\"Thomas\", \"Lumley\", role=c(\"ctb\", \"trl\"), comment=\"original S->R port and R maintainer until 2009\"), person(\"Atkinson\", \"Elizabeth\", role=\"ctb\"), person(\"Crowson\", \"Cynthia\", role=\"ctb\"))", + "Description": "Contains the core survival analysis routines, including definition of Surv objects, Kaplan-Meier and Aalen-Johansen (multi-state) curves, Cox models, and parametric accelerated failure time models.", + "License": "LGPL (>= 2)", + "URL": "https://github.com/therneau/survival", + "NeedsCompilation": "yes", + "Author": "Terry M Therneau [aut, cre], Thomas Lumley [ctb, trl] (original S->R port and R maintainer until 2009), Atkinson Elizabeth [ctb], Crowson Cynthia [ctb]", + "Maintainer": "Terry M Therneau ", + "Repository": "CRAN" }, "sys": { "Package": "sys", - "Version": "3.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "3a1be13d68d47a8cd0bfd74739ca1555" + "Version": "3.4.3", + "Source": "Repository", + "Type": "Package", + "Title": "Powerful and Reliable Tools for Running System Commands in R", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"ctb\"))", + "Description": "Drop-in replacements for the base system2() function with fine control and consistent behavior across platforms. Supports clean interruption, timeout, background tasks, and streaming STDIN / STDOUT / STDERR over binary or text connections. Arguments on Windows automatically get encoded and quoted to work on different locales.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/sys", + "BugReports": "https://github.com/jeroen/sys/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "Suggests": [ + "unix (>= 1.4)", + "spelling", + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Gábor Csárdi [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "systemfonts": { "Package": "systemfonts", - "Version": "1.0.6", + "Version": "1.3.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" + "Type": "Package", + "Title": "System Native Font Finding", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Jeroen\", \"Ooms\", , \"jeroen@berkeley.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Devon\", \"Govett\", role = \"aut\", comment = \"Author of font-manager\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides system native access to the font catalogue. As font handling varies between systems it is difficult to correctly locate installed fonts across different operating systems. The 'systemfonts' package provides bindings to the native libraries on Windows, macOS and Linux for finding font files that can then be used further by e.g. graphic devices. The main use is intended to be from compiled code but 'systemfonts' also provides access from R.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/systemfonts, https://systemfonts.r-lib.org", + "BugReports": "https://github.com/r-lib/systemfonts/issues", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "base64enc", + "grid", + "jsonlite", + "lifecycle", + "tools", + "utils" + ], + "Suggests": [ + "covr", + "farver", + "ggplot2", + "graphics", + "knitr", + "ragg", + "rmarkdown", + "svglite", + "testthat (>= 2.1.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.1)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "fontconfig, freetype2", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [aut, cre] (ORCID: ), Jeroen Ooms [aut] (ORCID: ), Devon Govett [aut] (Author of font-manager), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "terra": { + "Package": "terra", + "Version": "1.8-93", + "Source": "Repository", + "Type": "Package", + "Title": "Spatial Data Analysis", + "Date": "2026-01-11", + "Depends": [ + "R (>= 3.5.0)", + "methods" + ], + "Suggests": [ + "parallel", + "tinytest", + "ncdf4", + "sf (>= 0.9-8)", + "deldir", + "XML", + "leaflet (>= 2.2.1)", + "htmlwidgets" + ], + "LinkingTo": [ + "Rcpp" ], - "Hash": "6d538cff441f0f1f36db2209ac7495ac" + "Imports": [ + "Rcpp (>= 1.0-10)" + ], + "SystemRequirements": "C++17, GDAL (>= 2.2.3), GEOS (>= 3.4.0), PROJ (>= 4.9.3), TBB, sqlite3", + "Encoding": "UTF-8", + "Language": "en-US", + "Maintainer": "Robert J. Hijmans ", + "Description": "Methods for spatial data analysis with vector (points, lines, polygons) and raster (grid) data. Methods for vector data include geometric operations such as intersect and buffer. Raster methods include local, focal, global, zonal and geometric operations. The predict and interpolate methods facilitate the use of regression type (interpolation, machine learning) models for spatial prediction, including with satellite remote sensing data. Processing of very large files is supported. See the manual and tutorials on to get started.", + "License": "GPL (>= 3)", + "URL": "https://rspatial.org/, https://rspatial.github.io/terra/", + "BugReports": "https://github.com/rspatial/terra/issues", + "LazyLoad": "yes", + "Authors@R": "c( person(\"Robert J.\", \"Hijmans\", role=c(\"cre\", \"aut\"), email=\"r.hijmans@gmail.com\", comment=c(ORCID=\"0000-0001-5872-2872\")),\t\t\t person(\"Márcia\", \"Barbosa\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8972-7713\")), person(\"Roger\", \"Bivand\", role=\"ctb\", comment=c(ORCID=\"0000-0003-2392-6140\")), person(\"Andrew\", \"Brown\", role=\"ctb\", comment=c(ORCID=\"0000-0002-4565-533X\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment=c(ORCID=\"0000-0003-0787-087X\")), person(\"Emanuele\", \"Cordano\", role=\"ctb\",comment=c(ORCID=\"0000-0002-3508-5898\")), person(\"Krzysztof\", \"Dyba\", role=\"ctb\", comment=c(ORCID=\"0000-0002-8614-3816\")), person(\"Edzer\", \"Pebesma\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8049-7069\")), person(\"Barry\", \"Rowlingson\", role=\"ctb\", comment=c(ORCID=\"0000-0002-8586-6625\")), person(\"Michael D.\", \"Sumner\", role=\"ctb\", comment=c(ORCID=\"0000-0002-2471-7511\")))", + "NeedsCompilation": "yes", + "Author": "Robert J. Hijmans [cre, aut] (ORCID: ), Márcia Barbosa [ctb] (ORCID: ), Roger Bivand [ctb] (ORCID: ), Andrew Brown [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Emanuele Cordano [ctb] (ORCID: ), Krzysztof Dyba [ctb] (ORCID: ), Edzer Pebesma [ctb] (ORCID: ), Barry Rowlingson [ctb] (ORCID: ), Michael D. Sumner [ctb] (ORCID: )", + "Repository": "CRAN" }, "textshaping": { "Package": "textshaping", - "Version": "0.3.7", + "Version": "1.0.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11", - "systemfonts" + "Title": "Bindings to the 'HarfBuzz' and 'Fribidi' Libraries for Text Shaping", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides access to the text shaping functionality in the 'HarfBuzz' library and the bidirectional algorithm in the 'Fribidi' library. 'textshaping' is a low-level utility package mainly for graphic devices that expands upon the font tool-set provided by the 'systemfonts' package.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/textshaping", + "BugReports": "https://github.com/r-lib/textshaping/issues", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "lifecycle", + "stats", + "stringi", + "systemfonts (>= 1.3.0)", + "utils" ], - "Hash": "997aac9ad649e0ef3b97f96cddd5622b" + "Suggests": [ + "covr", + "grDevices", + "grid", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.1)", + "systemfonts (>= 1.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "freetype2, harfbuzz, fribidi", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "tibble": { "Package": "tibble", - "Version": "3.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "fansi", - "lifecycle", + "Version": "3.3.1", + "Source": "Repository", + "Title": "Simple Data Frames", + "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Romain\", \"Francois\", , \"romain@r-enthusiasts.com\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides a 'tbl_df' class (the 'tibble') with stricter checking and better formatting than the traditional data frame.", + "License": "MIT + file LICENSE", + "URL": "https://tibble.tidyverse.org/, https://github.com/tidyverse/tibble", + "BugReports": "https://github.com/tidyverse/tibble/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "cli", + "lifecycle (>= 1.0.0)", "magrittr", "methods", - "pillar", + "pillar (>= 1.8.1)", "pkgconfig", - "rlang", + "rlang (>= 1.0.2)", "utils", - "vctrs" + "vctrs (>= 0.5.0)" ], - "Hash": "a84e2cc86d07289b3b6f5069df7a004c" - }, - "tidygraph": { - "Package": "tidygraph", - "Version": "1.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R6", - "cli", - "cpp11", + "Suggests": [ + "bench", + "bit64", + "blob", + "brio", + "callr", + "DiagrammeR", "dplyr", - "igraph", - "lifecycle", - "magrittr", - "pillar", + "evaluate", + "formattable", + "ggplot2", + "here", + "hms", + "htmltools", + "knitr", + "lubridate", + "nycflights13", + "pkgload", + "purrr", + "rmarkdown", + "stringi", + "testthat (>= 3.0.2)", + "tidyr", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/autostyle/rmd": "false", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "vignette-formats, as_tibble, add, invariants", + "Config/usethis/last-upkeep": "2025-06-07", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "yes", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "tidydr": { + "Package": "tidydr", + "Version": "0.0.6", + "Source": "Repository", + "Title": "Unify Dimensionality Reduction Results", + "Authors@R": "c( person(\"Guangchuang\", \"Yu\", , \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(\"Shuangbin\", \"Xu\", , \"xshuangbin@163.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-3513-5362\")), person(\"Erqiang\", \"Hu\", , \"13766876214@163.com\", role = \"ctb\") )", + "Description": "Dimensionality reduction (DR) is widely used in many domain for analyzing and visualizing high-dimensional data. 'tidydr' provides uniform output and is compatible with multiple methods, including 'prcomp', 'mds', 'Rtsne'. etc.", + "Imports": [ + "cluster", + "ggfun", + "ggplot2", + "grid", "rlang", "stats", - "tibble", - "tidyr", - "tools", "utils" ], - "Hash": "2149824d406f233b57b087be72c5f163" + "Suggests": [ + "knitr", + "rmarkdown", + "prettydoc", + "SingleCellExperiment", + "SummarizedExperiment" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "License": "Artistic-2.0", + "URL": "https://github.com/YuLab-SMU/tidydr/", + "BugReports": "https://github.com/YuLab-SMU/tidydr/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre, cph] (ORCID: ), Shuangbin Xu [aut] (ORCID: ), Erqiang Hu [ctb]", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" }, "tidyr": { "Package": "tidyr", - "Version": "1.3.1", + "Version": "1.3.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "cpp11", - "dplyr", + "Title": "Tidy Messy Data", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to help to create tidy data, where each column is a variable, each row is an observation, and each cell contains a single value. 'tidyr' contains tools for changing the shape (pivoting) and hierarchy (nesting and 'unnesting') of a dataset, turning deeply nested lists into rectangular data frames ('rectangling'), and extracting values out of string columns. It also includes tools for working with missing values (both implicit and explicit).", + "License": "MIT + file LICENSE", + "URL": "https://tidyr.tidyverse.org, https://github.com/tidyverse/tidyr", + "BugReports": "https://github.com/tidyverse/tidyr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli (>= 3.4.1)", + "dplyr (>= 1.1.0)", "glue", - "lifecycle", + "lifecycle (>= 1.0.3)", "magrittr", - "purrr", - "rlang", - "stringr", - "tibble", - "tidyselect", + "purrr (>= 1.0.1)", + "rlang (>= 1.1.1)", + "stringr (>= 1.5.0)", + "tibble (>= 2.1.1)", + "tidyselect (>= 1.2.1)", "utils", - "vctrs" + "vctrs (>= 0.5.2)" ], - "Hash": "915fb7ce036c22a6a33b5a8adb712eb1" + "Suggests": [ + "covr", + "data.table", + "knitr", + "readr", + "repurrrsive (>= 1.1.0)", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.0)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Davis Vaughan [aut], Maximilian Girlich [aut], Kevin Ushey [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "tidyselect": { "Package": "tidyselect", "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "rlang", - "vctrs", + "Title": "Select from a Set of Strings", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A backend for the selecting functions of the 'tidyverse'. It makes it easy to implement select-like functions in your own packages in a way that is consistent with other 'tidyverse' interfaces for selection.", + "License": "MIT + file LICENSE", + "URL": "https://tidyselect.r-lib.org, https://github.com/r-lib/tidyselect", + "BugReports": "https://github.com/r-lib/tidyselect/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "cli (>= 3.3.0)", + "glue (>= 1.3.0)", + "lifecycle (>= 1.0.3)", + "rlang (>= 1.0.4)", + "vctrs (>= 0.5.2)", "withr" ], - "Hash": "829f27b9c4919c16b593794a6344d6c0" + "Suggests": [ + "covr", + "crayon", + "dplyr", + "knitr", + "magrittr", + "rmarkdown", + "stringr", + "testthat (>= 3.1.1)", + "tibble (>= 2.1.3)" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.0.9000", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "tidytree": { "Package": "tidytree", - "Version": "0.4.6", + "Version": "0.4.7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "A Tidy Tool for Phylogenetic Tree Data Manipulation", + "Authors@R": "c( person(\"Guangchuang\", \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(\"Bradley\", \"Jones\", email = \"brj1@sfu.ca\", role = \"ctb\"), person(\"Zebulun\", \"Arendsee\", email = \"zbwrnz@gmail.com\", role = \"ctb\") )", + "Description": "Phylogenetic tree generally contains multiple components including node, edge, branch and associated data. 'tidytree' provides an approach to convert tree object to tidy data frame as well as provides tidy interfaces to manipulate tree data.", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ "ape", - "cli", "dplyr", "lazyeval", "magrittr", "methods", - "pillar", "rlang", "tibble", "tidyr", "tidyselect", - "yulab.utils" + "yulab.utils (>= 0.1.5)", + "pillar", + "cli" + ], + "Suggests": [ + "testthat", + "utils" ], - "Hash": "a700d295c0eff82fbce42eac067bb89d" + "ByteCompile": "true", + "License": "Artistic-2.0", + "URL": "https://yulab-smu.top/contribution-tree-data/", + "BugReports": "https://github.com/YuLab-SMU/tidytree/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre, cph] (ORCID: ), Bradley Jones [ctb], Zebulun Arendsee [ctb]", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" }, "tidyverse": { "Package": "tidyverse", "Version": "2.0.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "broom", - "cli", - "conflicted", - "dbplyr", - "dplyr", - "dtplyr", - "forcats", - "ggplot2", - "googledrive", - "googlesheets4", - "haven", - "hms", - "httr", - "jsonlite", - "lubridate", - "magrittr", - "modelr", - "pillar", - "purrr", - "ragg", - "readr", - "readxl", - "reprex", - "rlang", - "rstudioapi", - "rvest", - "stringr", - "tibble", - "tidyr", - "xml2" - ], - "Hash": "c328568cd14ea89a83bd4ca7f54ae07e" + "Title": "Easily Install and Load the 'Tidyverse'", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "The 'tidyverse' is a set of packages that work in harmony because they share common data representations and 'API' design. This package is designed to make it easy to install and load multiple 'tidyverse' packages in a single step. Learn more about the 'tidyverse' at .", + "License": "MIT + file LICENSE", + "URL": "https://tidyverse.tidyverse.org, https://github.com/tidyverse/tidyverse", + "BugReports": "https://github.com/tidyverse/tidyverse/issues", + "Depends": [ + "R (>= 3.3)" + ], + "Imports": [ + "broom (>= 1.0.3)", + "conflicted (>= 1.2.0)", + "cli (>= 3.6.0)", + "dbplyr (>= 2.3.0)", + "dplyr (>= 1.1.0)", + "dtplyr (>= 1.2.2)", + "forcats (>= 1.0.0)", + "ggplot2 (>= 3.4.1)", + "googledrive (>= 2.0.0)", + "googlesheets4 (>= 1.0.1)", + "haven (>= 2.5.1)", + "hms (>= 1.1.2)", + "httr (>= 1.4.4)", + "jsonlite (>= 1.8.4)", + "lubridate (>= 1.9.2)", + "magrittr (>= 2.0.3)", + "modelr (>= 0.1.10)", + "pillar (>= 1.8.1)", + "purrr (>= 1.0.1)", + "ragg (>= 1.2.5)", + "readr (>= 2.1.4)", + "readxl (>= 1.4.2)", + "reprex (>= 2.0.2)", + "rlang (>= 1.0.6)", + "rstudioapi (>= 0.14)", + "rvest (>= 1.0.3)", + "stringr (>= 1.5.0)", + "tibble (>= 3.1.8)", + "tidyr (>= 1.3.0)", + "xml2 (>= 1.3.3)" + ], + "Suggests": [ + "covr (>= 3.6.1)", + "feather (>= 0.3.5)", + "glue (>= 1.6.2)", + "mockr (>= 0.2.0)", + "knitr (>= 1.41)", + "rmarkdown (>= 2.20)", + "testthat (>= 3.1.6)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "timechange": { "Package": "timechange", - "Version": "0.3.0", + "Version": "0.4.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" - ], - "Hash": "c5f3c201b931cd6474d17d8700ccb1c8" + "Title": "Efficient Manipulation of Date-Times", + "Authors@R": "c(person(\"Vitalie\", \"Spinu\", email = \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Google Inc.\", role = c(\"ctb\", \"cph\")))", + "Description": "Efficient routines for manipulation of date-time objects while accounting for time-zones and daylight saving times. The package includes utilities for updating of date-time components (year, month, day etc.), modification of time-zones, rounding of date-times, period addition and subtraction etc. Parts of the 'CCTZ' source code, released under the Apache 2.0 License, are included in this package. See for more details.", + "Depends": [ + "R (>= 3.3)" + ], + "License": "GPL (>= 3)", + "Encoding": "UTF-8", + "LinkingTo": [ + "cpp11 (>= 0.2.7)" + ], + "Suggests": [ + "testthat (>= 0.7.1.99)", + "knitr" + ], + "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "BugReports": "https://github.com/vspinu/timechange/issues", + "URL": "https://github.com/vspinu/timechange/", + "RoxygenNote": "7.2.1", + "NeedsCompilation": "yes", + "Author": "Vitalie Spinu [aut, cre], Google Inc. [ctb, cph]", + "Maintainer": "Vitalie Spinu ", + "Repository": "CRAN" }, "tinytex": { "Package": "tinytex", - "Version": "0.50", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "xfun" - ], - "Hash": "be7a76845222ad20adb761f462eed3ea" + "Version": "0.58", + "Source": "Repository", + "Type": "Package", + "Title": "Helper Functions to Install and Maintain TeX Live, and Compile LaTeX Documents", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Devon\", \"Ryan\", role = \"ctb\", email = \"dpryan79@gmail.com\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Ethan\", \"Heinzen\", role = \"ctb\"), person(\"Fernando\", \"Cagua\", role = \"ctb\"), person() )", + "Description": "Helper functions to install and maintain the 'LaTeX' distribution named 'TinyTeX' (), a lightweight, cross-platform, portable, and easy-to-maintain version of 'TeX Live'. This package also contains helper functions to compile 'LaTeX' documents, and install missing 'LaTeX' packages automatically.", + "Imports": [ + "xfun (>= 0.48)" + ], + "Suggests": [ + "testit", + "rstudioapi" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/tinytex", + "BugReports": "https://github.com/rstudio/tinytex/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: ), Posit Software, PBC [cph, fnd], Christophe Dervieux [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Ethan Heinzen [ctb], Fernando Cagua [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "treeio": { "Package": "treeio", - "Version": "1.28.0", + "Version": "1.34.0", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "R", + "Title": "Base Classes and Functions for Phylogenetic Tree Input and Output", + "Authors@R": "c( person(\"Guangchuang\", \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6485-8781\")), person(\"Tommy Tsan-Yuk\", \"Lam\", email = \"tylam.tommy@gmail.com\", role = c(\"ctb\", \"ths\")), person(\"Shuangbin\", \"Xu\", email = \"xshuangbin@163.com\", role = \"ctb\", comment = c(ORCID=\"0000-0003-3513-5362\")), person(\"Bradley\", \"Jones\", email = \"brj1@sfu.ca\", role = \"ctb\"), person(\"Casey\", \"Dunn\", email = \"casey_dunn@brown.edu\", role = \"ctb\"), person(\"Tyler\", \"Bradley\", email = \"tcb85@drexel.edu\", role = \"ctb\"), person(\"Konstantinos\", \"Geles\", email = \"konstantinos.geles@studenti.unicz.it\", role = \"ctb\") )", + "Description": "'treeio' is an R package to make it easier to import and store phylogenetic tree with associated data; and to link external data from different sources to phylogeny. It also supports exporting phylogenetic tree with heterogeneous associated data to a single tree file and can be served as a platform for merging tree with associated data and converting file formats.", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ "ape", "dplyr", "jsonlite", @@ -5269,356 +14376,1030 @@ "rlang", "stats", "tibble", - "tidytree", + "tidytree (>= 0.4.5)", "utils", - "yulab.utils" + "yulab.utils (>= 0.1.6)" + ], + "Suggests": [ + "Biostrings", + "cli", + "ggplot2", + "ggtree", + "igraph", + "knitr", + "rmarkdown", + "phangorn", + "prettydoc", + "purrr", + "testthat", + "tidyr", + "vroom", + "xml2", + "yaml" ], - "Hash": "9e0a0b700763836cd36cb3a49be5a15d" + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "URL": "https://yulab-smu.top/contribution-tree-data/", + "BugReports": "https://github.com/YuLab-SMU/treeio/issues", + "biocViews": "Software, Annotation, Clustering, DataImport, DataRepresentation, Alignment, MultipleSequenceAlignment, Phylogenetics", + "RoxygenNote": "7.3.2", + "git_url": "https://git.bioconductor.org/packages/treeio", + "git_branch": "RELEASE_3_22", + "git_last_commit": "68b1d91", + "git_last_commit_date": "2025-10-29", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre] (ORCID: ), Tommy Tsan-Yuk Lam [ctb, ths], Shuangbin Xu [ctb] (ORCID: ), Bradley Jones [ctb], Casey Dunn [ctb], Tyler Bradley [ctb], Konstantinos Geles [ctb]", + "Maintainer": "Guangchuang Yu " }, "truncnorm": { "Package": "truncnorm", "Version": "1.0-9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Truncated Normal Distribution", + "Description": "Density, probability, quantile and random number generation functions for the truncated normal distribution.", + "Authors@R": "c(person(\"Olaf\", \"Mersmann\", role=c(\"aut\", \"cre\"), email=\"olafm@p-value.net\"), person(\"Heike\", \"Trautmann\", role=c(\"aut\")), person(\"Detlef\", \"Steuer\", role=c(\"aut\")), person(\"Björn\", \"Bornkamp\", role=c(\"aut\")))", + "URL": "https://github.com/olafmersmann/truncnorm", + "BugReports": "https://github.com/olafmersmann/truncnorm/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "testthat" ], - "Hash": "ef5b32c5194351ff409dfb37ca9468f1" + "License": "GPL (>= 2)", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Olaf Mersmann [aut, cre], Heike Trautmann [aut], Detlef Steuer [aut], Björn Bornkamp [aut]", + "Maintainer": "Olaf Mersmann ", + "Repository": "CRAN" }, "tweenr": { "Package": "tweenr", "Version": "2.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11", + "Type": "Package", + "Title": "Interpolate Data for Smooth Animations", + "Authors@R": "c(person(given = \"Thomas Lin\", family = \"Pedersen\", role = c(\"aut\", \"cre\"), email = \"thomasp85@gmail.com\", comment = c(ORCID = \"0000-0002-5147-4711\")))", + "Maintainer": "Thomas Lin Pedersen ", + "Description": "In order to create smooth animation between states of data, tweening is necessary. This package provides a range of functions for creating tweened data that can be used as basis for animation. Furthermore it adds a number of vectorized interpolaters for common R data types such as numeric, date and colour.", + "URL": "https://github.com/thomasp85/tweenr", + "BugReports": "https://github.com/thomasp85/tweenr/issues", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ "farver", "magrittr", "rlang", "vctrs" ], - "Hash": "82fac2b73e6a1f3874fc000aaf96d8bc" + "LinkingTo": [ + "cpp11 (>= 0.4.2)" + ], + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat", + "covr" + ], + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [aut, cre] ()", + "Repository": "CRAN" }, "txdbmaker": { "Package": "txdbmaker", - "Version": "1.0.0", + "Version": "1.6.2", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "AnnotationDbi", - "Biobase", + "Title": "Tools for making TxDb objects from genomic annotations", + "Description": "A set of tools for making TxDb objects from genomic annotations from various sources (e.g. UCSC, Ensembl, and GFF files). These tools allow the user to download the genomic locations of transcripts, exons, and CDS, for a given assembly, and to import them in a TxDb object. TxDb objects are implemented in the GenomicFeatures package, together with flexible methods for extracting the desired features in convenient formats.", + "biocViews": "Infrastructure, DataImport, Annotation, GenomeAnnotation, GenomeAssembly, Genetics, Sequencing", + "URL": "https://bioconductor.org/packages/txdbmaker", + "BugReports": "https://github.com/Bioconductor/txdbmaker/issues", + "License": "Artistic-2.0", + "Encoding": "UTF-8", + "Authors@R": "c( person(\"H.\", \"Pagès\", role=c(\"aut\", \"cre\"), email=\"hpages.on.github@gmail.com\"), person(\"M.\", \"Carlson\", role=\"aut\"), person(\"P.\", \"Aboyoun\", role=\"aut\"), person(\"S.\", \"Falcon\", role=\"aut\"), person(\"M.\", \"Morgan\", role=\"aut\"), person(\"R.\", \"Castelo\", role=\"ctb\"), person(\"M.\", \"Lawrence\", role=\"ctb\"), person(\"I-Hsuan\", \"Lin\", role=\"ctb\"), person(\"J.\", \"MacDonald\", role=\"ctb\"), person(\"M.\", \"Ramos\", role=\"ctb\"), person(\"S.\", \"Saini\", role=\"ctb\"), person(\"L.\", \"Shepherd\", role=\"ctb\"))", + "Depends": [ "BiocGenerics", - "BiocIO", - "DBI", - "GenomeInfoDb", - "GenomicFeatures", - "GenomicRanges", - "IRanges", - "RSQLite", - "S4Vectors", - "UCSC.utils", - "biomaRt", - "httr", + "S4Vectors (>= 0.47.6)", + "Seqinfo", + "GenomicRanges (>= 1.61.1)", + "GenomicFeatures (>= 1.61.4)" + ], + "Imports": [ "methods", - "rjson", - "rtracklayer", + "utils", "stats", "tools", - "utils" + "httr", + "rjson", + "DBI", + "RSQLite (>= 2.0)", + "IRanges", + "UCSC.utils (>= 1.6.1)", + "GenomeInfoDb", + "AnnotationDbi", + "Biobase", + "BiocIO", + "rtracklayer", + "biomaRt (>= 2.59.1)" ], - "Hash": "6daec4674f5198f4d3b7db2c8a3a9508" + "Suggests": [ + "RMariaDB", + "ensembldb", + "GenomeInfoDbData", + "RUnit", + "BiocStyle", + "knitr" + ], + "VignetteBuilder": "knitr", + "Collate": "utils.R Ensembl-utils.R findCompatibleMarts.R TxDb-schema.R TxDb-CREATE-TABLE-helpers.R makeTxDb.R makeTxDbFromUCSC.R makeTxDbFromBiomart.R makeTxDbFromEnsembl.R makeTxDbFromGRanges.R makeTxDbFromGFF.R makeFeatureDbFromUCSC.R makeTxDbPackage.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/txdbmaker", + "git_branch": "RELEASE_3_22", + "git_last_commit": "75a238d", + "git_last_commit_date": "2025-12-08", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "H. Pagès [aut, cre], M. Carlson [aut], P. Aboyoun [aut], S. Falcon [aut], M. Morgan [aut], R. Castelo [ctb], M. Lawrence [ctb], I-Hsuan Lin [ctb], J. MacDonald [ctb], M. Ramos [ctb], S. Saini [ctb], L. Shepherd [ctb]", + "Maintainer": "H. Pagès " }, "tximeta": { "Package": "tximeta", - "Version": "1.22.0", + "Version": "1.28.3", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ + "Title": "Transcript Quantification Import with Automatic Metadata", + "Description": "Transcript quantification import from Salmon and other quantifiers with automatic attachment of transcript ranges and release information, and other associated metadata. De novo transcriptomes can be linked to the appropriate sources with linkedTxomes and shared for computational reproducibility.", + "Authors@R": "c( person(\"Michael\", \"Love\", email=\"michaelisaiahlove@gmail.com\", role = c(\"aut\",\"cre\")), person(\"Charlotte\", \"Soneson\", role = c(\"aut\",\"ctb\")), person(\"Peter\", \"Hickey\", role = c(\"aut\",\"ctb\")), person(\"Rob\", \"Patro\", role = c(\"aut\",\"ctb\")), person(\"NIH NHGRI\", role=\"fnd\"), person(\"CZI\", role=\"fnd\") )", + "Maintainer": "Michael Love ", + "License": "GPL-2", + "VignetteBuilder": "knitr, rmarkdown", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "SummarizedExperiment (>= 1.39.1)", + "tximport", + "jsonlite", + "S4Vectors", + "IRanges", + "GenomicRanges (>= 1.61.1)", "AnnotationDbi", - "AnnotationHub", - "BiocFileCache", - "Biostrings", - "GenomeInfoDb", "GenomicFeatures", - "GenomicRanges", - "IRanges", - "Matrix", - "S4Vectors", - "SummarizedExperiment", + "txdbmaker", "ensembldb", - "jsonlite", - "methods", + "BiocFileCache", + "AnnotationHub", + "Biostrings", "tibble", + "Seqinfo", "tools", - "txdbmaker", - "tximport", - "utils" + "utils", + "methods", + "Matrix" ], - "Hash": "8871a89e79fd3e419b5a5869efb68158" + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "tximportData (>= 1.37.5)", + "org.Dm.eg.db", + "DESeq2", + "edgeR", + "limma", + "devtools", + "macrophage" + ], + "URL": "https://github.com/thelovelab/tximeta", + "biocViews": "Annotation, GenomeAnnotation, DataImport, Preprocessing, RNASeq, SingleCell, Transcriptomics, Transcription, GeneExpression, FunctionalGenomics, ReproducibleResearch, ReportWriting, ImmunoOncology", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "git_url": "https://git.bioconductor.org/packages/tximeta", + "git_branch": "RELEASE_3_22", + "git_last_commit": "2b35811", + "git_last_commit_date": "2026-02-03", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "no", + "Author": "Michael Love [aut, cre], Charlotte Soneson [aut, ctb], Peter Hickey [aut, ctb], Rob Patro [aut, ctb], NIH NHGRI [fnd], CZI [fnd]" }, "tximport": { "Package": "tximport", - "Version": "1.32.0", + "Version": "1.38.2", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "methods", + "Title": "Import and summarize transcript-level estimates for transcript- and gene-level analysis", + "Description": "Imports transcript-level abundance, estimated counts and transcript lengths, and summarizes into matrices for use with downstream gene-level analysis packages. Average transcript length, weighted by sample-specific transcript abundance estimates, is provided as a matrix which can be used as an offset for different expression of gene-level counts.", + "Author": "Michael Love [cre,aut], Charlotte Soneson [aut], Mark Robinson [aut], Rob Patro [ctb], Andrew Parker Morgan [ctb], Ryan C. Thompson [ctb], Matt Shirley [ctb], Avi Srivastava [ctb]", + "Maintainer": "Michael Love ", + "License": "LGPL (>=2)", + "VignetteBuilder": "knitr", + "Imports": [ + "utils", "stats", - "utils" + "methods" ], - "Hash": "de83dfc887cf6205591b70500c987e43" + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "tximportData", + "TxDb.Hsapiens.UCSC.hg19.knownGene", + "readr (>= 0.2.2)", + "arrow", + "limma", + "edgeR", + "DESeq2 (>= 1.11.6)", + "rhdf5", + "jsonlite", + "matrixStats", + "Matrix", + "eds" + ], + "URL": "https://github.com/thelovelab/tximport", + "biocViews": "DataImport, Preprocessing, RNASeq, Transcriptomics, Transcription, GeneExpression, ImmunoOncology", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Encoding": "UTF-8", + "Repository": "https://bioc-release.r-universe.dev", + "RemoteType": "bioconductor", + "RemoteUrl": "https://github.com/bioc/tximport", + "RemoteRef": "RELEASE_3_22", + "RemoteSha": "1c6a0bb7ba89727d227946700dffe2c436b6e11e" }, "tzdb": { "Package": "tzdb", - "Version": "0.4.0", + "Version": "0.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" - ], - "Hash": "f561504ec2897f4d46f0c7657e488ae1" + "Title": "Time Zone Database Information", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"Howard\", \"Hinnant\", role = \"cph\", comment = \"Author of the included date library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides an up-to-date copy of the Internet Assigned Numbers Authority (IANA) Time Zone Database. It is updated periodically to reflect changes made by political bodies to time zone boundaries, UTC offsets, and daylight saving time rules. Additionally, this package provides a C++ interface for working with the 'date' library. 'date' provides comprehensive support for working with dates and date-times, which this package exposes to make it easier for other R packages to utilize. Headers are provided for calendar specific calculations, along with a limited interface for time zone manipulations.", + "License": "MIT + file LICENSE", + "URL": "https://tzdb.r-lib.org, https://github.com/r-lib/tzdb", + "BugReports": "https://github.com/r-lib/tzdb/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.5.2)" + ], + "Biarch": "yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Davis Vaughan [aut, cre], Howard Hinnant [cph] (Author of the included date library), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" }, "umap": { "Package": "umap", "Version": "0.2.10.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Uniform Manifold Approximation and Projection", + "Authors@R": "person(\"Tomasz\", \"Konopka\", , \"tokonopka@gmail.com\", role = c(\"aut\", \"cre\"))", + "Author": "Tomasz Konopka [aut, cre]", + "Maintainer": "Tomasz Konopka ", + "Description": "Uniform manifold approximation and projection is a technique for dimension reduction. The algorithm was described by McInnes and Healy (2018) in . This package provides an interface for two implementations. One is written from scratch, including components for nearest-neighbor search and for embedding. The second implementation is a wrapper for 'python' package 'umap-learn' (requires separate installation, see vignette for more details).", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ "Matrix", - "R", - "RSpectra", - "Rcpp", "methods", "openssl", "reticulate", + "Rcpp (>= 0.12.6)", + "RSpectra", "stats" ], - "Hash": "249dae2d91909b98bc93086d82cd7c7f" + "License": "MIT + file LICENSE", + "URL": "https://github.com/tkonopka/umap", + "BugReports": "https://github.com/tkonopka/umap/issues", + "LinkingTo": [ + "Rcpp" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "units": { + "Package": "units", + "Version": "1.0-0", + "Source": "Repository", + "Title": "Measurement Units for R Vectors", + "Authors@R": "c(person(\"Edzer\", \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(\"Thomas\", \"Mailund\", role = \"aut\", email = \"mailund@birc.au.dk\"), person(\"Tomasz\", \"Kalinowski\", role = \"aut\"), person(\"James\", \"Hiebert\", role = \"ctb\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", email = \"iucar@fedoraproject.org\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Thomas Lin\", \"Pedersen\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "Rcpp" + ], + "LinkingTo": [ + "Rcpp (>= 0.12.10)" + ], + "Suggests": [ + "NISTunits", + "measurements", + "xml2", + "magrittr", + "pillar (>= 1.3.0)", + "dplyr (>= 1.0.0)", + "vctrs (>= 0.3.1)", + "ggplot2 (> 3.2.1)", + "testthat (>= 3.0.0)", + "vdiffr", + "knitr", + "rvest", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "Description": "Support for measurement units in R vectors, matrices and arrays: automatic propagation, conversion, derivation and simplification of units; raising errors in case of unit incompatibility. Compatible with the POSIXct, Date and difftime classes. Uses the UNIDATA udunits library and unit database for unit compatibility checking and conversion. Documentation about 'units' is provided in the paper by Pebesma, Mailund & Hiebert (2016, ), included in this package as a vignette; see 'citation(\"units\")' for details.", + "SystemRequirements": "udunits-2", + "License": "GPL-2", + "URL": "https://r-quantities.github.io/units/, https://github.com/r-quantities/units", + "BugReports": "https://github.com/r-quantities/units/issues", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Thomas Mailund [aut], Tomasz Kalinowski [aut], James Hiebert [ctb], Iñaki Ucar [aut] (ORCID: ), Thomas Lin Pedersen [ctb]", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" }, "utf8": { "Package": "utf8", - "Version": "1.2.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Version": "1.2.6", + "Source": "Repository", + "Title": "Unicode Text Processing", + "Authors@R": "c(person(given = c(\"Patrick\", \"O.\"), family = \"Perry\", role = c(\"aut\", \"cph\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"cre\", email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database\"))", + "Description": "Process and print 'UTF-8' encoded international text (Unicode). Input, validate, normalize, encode, format, and display.", + "License": "Apache License (== 2.0) | file LICENSE", + "URL": "https://krlmlr.github.io/utf8/, https://github.com/krlmlr/utf8", + "BugReports": "https://github.com/krlmlr/utf8/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "cli", + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "62b65c52671e6665f803ff02954446e9" + "VignetteBuilder": "knitr, rmarkdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "Patrick O. Perry [aut, cph], Kirill Müller [cre] (ORCID: ), Unicode, Inc. [cph, dtc] (Unicode Character Database)", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "uuid": { "Package": "uuid", - "Version": "1.2-0", + "Version": "1.2-2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Tools for Generating and Handling of UUIDs", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, ORCID: ), Theodore Ts'o [aut, cph] (libuuid)", + "Maintainer": "Simon Urbanek ", + "Authors@R": "c(person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.org\", ORCID=\"0000-0003-2297-1732\")), person(\"Theodore\",\"Ts'o\", email=\"tytso@thunk.org\", role=c(\"aut\",\"cph\"), comment=\"libuuid\"))", + "Depends": [ + "R (>= 2.9.0)" ], - "Hash": "303c19bfd970bece872f93a824e323d9" + "Description": "Tools for generating and handling of UUIDs (Universally Unique Identifiers).", + "License": "MIT + file LICENSE", + "URL": "https://www.rforge.net/uuid", + "BugReports": "https://github.com/s-u/uuid/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "uwot": { "Package": "uwot", - "Version": "0.2.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "0.2.4", + "Source": "Repository", + "Title": "The Uniform Manifold Approximation and Projection (UMAP) Method for Dimensionality Reduction", + "Authors@R": "c( person(\"James\", \"Melville\", , \"jlmelville@gmail.com\", role = c(\"aut\", \"cre\", \"cph\")), person(\"Aaron\", \"Lun\", role = \"ctb\"), person(\"Mohamed Nadhir\", \"Djekidel\", role = \"ctb\"), person(\"Yuhan\", \"Hao\", role = \"ctb\"), person(\"Dirk\", \"Eddelbuettel\", role = \"ctb\"), person(\"Wouter\", \"van der Bijl\", role = \"ctb\"), person(\"Hugo\", \"Gruson\", role = \"ctb\") )", + "Description": "An implementation of the Uniform Manifold Approximation and Projection dimensionality reduction by McInnes et al. (2018) . It also provides means to transform new data and to carry out supervised dimensionality reduction. An implementation of the related LargeVis method of Tang et al. (2016) is also provided. This is a complete re-implementation in R (and C++, via the 'Rcpp' package): no Python installation is required. See the uwot website () for more documentation and examples.", + "License": "GPL (>= 3)", + "URL": "https://github.com/jlmelville/uwot, https://jlmelville.github.io/uwot/", + "BugReports": "https://github.com/jlmelville/uwot/issues", + "Depends": [ + "Matrix" + ], + "Imports": [ "FNN", - "Matrix", - "RSpectra", + "irlba", + "methods", "Rcpp", - "RcppAnnoy", - "RcppProgress", + "RcppAnnoy (>= 0.0.17)", + "RSpectra" + ], + "Suggests": [ + "bigstatsr", + "covr", + "knitr", + "RcppHNSW", + "rmarkdown", + "rnndescent", + "testthat" + ], + "LinkingTo": [ "dqrng", - "irlba", - "methods" + "Rcpp", + "RcppAnnoy", + "RcppProgress" ], - "Hash": "f693a0ca6d34b02eb432326388021805" + "VignetteBuilder": "knitr", + "Config/Needs/website": "rmarkdown", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "James Melville [aut, cre, cph], Aaron Lun [ctb], Mohamed Nadhir Djekidel [ctb], Yuhan Hao [ctb], Dirk Eddelbuettel [ctb], Wouter van der Bijl [ctb], Hugo Gruson [ctb]", + "Maintainer": "James Melville ", + "Repository": "CRAN" }, "vctrs": { "Package": "vctrs", - "Version": "0.6.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Version": "0.7.1", + "Source": "Repository", + "Title": "Vector Helpers", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"data.table team\", role = \"cph\", comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Defines new notions of prototype and size that are used to provide tools for consistent and well-founded type-coercion and size-recycling, and are in turn connected to ideas of type- and size-stability useful for analysing function interfaces.", + "License": "MIT + file LICENSE", + "URL": "https://vctrs.r-lib.org/, https://github.com/r-lib/vctrs", + "BugReports": "https://github.com/r-lib/vctrs/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", "glue", - "lifecycle", - "rlang" + "lifecycle (>= 1.0.3)", + "rlang (>= 1.1.7)" ], - "Hash": "c03fa420630029418f7e6da3667aac4a" + "Suggests": [ + "bit64", + "covr", + "crayon", + "dplyr (>= 0.8.5)", + "generics", + "knitr", + "pillar (>= 1.4.4)", + "pkgdown (>= 2.0.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble (>= 3.1.3)", + "waldo (>= 0.2.0)", + "withr", + "xml2", + "zeallot" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "Language": "en-GB", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Lionel Henry [aut], Davis Vaughan [aut, cre], data.table team [cph] (Radix sort based on data.table's forder() and their contribution to R's order()), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" }, "vipor": { "Package": "vipor", "Version": "0.4.7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "graphics", - "stats" + "Type": "Package", + "Title": "Plot Categorical Data Using Quasirandom Noise and Density Estimates", + "Date": "2023-12-15", + "Author": "Scott Sherrill-Mix, Erik Clarke", + "Maintainer": "Scott Sherrill-Mix ", + "Description": "Generate a violin point plot, a combination of a violin/histogram plot and a scatter plot by offsetting points within a category based on their density using quasirandom noise.", + "License": "GPL (>= 2)", + "LazyData": "True", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "stats", + "graphics" + ], + "Suggests": [ + "testthat", + "beeswarm", + "lattice", + "ggplot2", + "beanplot", + "vioplot", + "ggbeeswarm" ], - "Hash": "86493c62c14eb78140f1725003958a77" + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Repository": "CRAN", + "Encoding": "UTF-8" }, "viridis": { "Package": "viridis", "Version": "0.6.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "ggplot2", - "gridExtra", - "viridisLite" - ], - "Hash": "acd96d9fa70adeea4a5a1150609b9745" + "Type": "Package", + "Title": "Colorblind-Friendly Color Maps for R", + "Date": "2024-01-28", + "Authors@R": "c( person(\"Simon\", \"Garnier\", email = \"garnier@njit.edu\", role = c(\"aut\", \"cre\")), person(\"Noam\", \"Ross\", email = \"noam.ross@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Bob\", \"Rudis\", email = \"bob@rud.is\", role = c(\"ctb\", \"cph\")), person(\"Marco\", \"Sciaini\", email = \"sciaini.marco@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Antônio Pedro\", \"Camargo\", role = c(\"ctb\", \"cph\")), person(\"Cédric\", \"Scherer\", email = \"scherer@izw-berlin.de\", role = c(\"ctb\", \"cph\")) )", + "Maintainer": "Simon Garnier ", + "Description": "Color maps designed to improve graph readability for readers with common forms of color blindness and/or color vision deficiency. The color maps are also perceptually-uniform, both in regular form and also when converted to black-and-white for printing. This package also contains 'ggplot2' bindings for discrete and continuous color and fill scales. A lean version of the package called 'viridisLite' that does not include the 'ggplot2' bindings can be found at .", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 2.10)", + "viridisLite (>= 0.4.0)" + ], + "Imports": [ + "ggplot2 (>= 1.0.1)", + "gridExtra" + ], + "Suggests": [ + "hexbin (>= 1.27.0)", + "scales", + "MASS", + "knitr", + "dichromat", + "colorspace", + "httr", + "mapproj", + "vdiffr", + "svglite (>= 1.2.0)", + "testthat", + "covr", + "rmarkdown", + "maps", + "terra" + ], + "LazyData": "true", + "VignetteBuilder": "knitr", + "URL": "https://sjmgarnier.github.io/viridis/, https://github.com/sjmgarnier/viridis/", + "BugReports": "https://github.com/sjmgarnier/viridis/issues", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "no", + "Author": "Simon Garnier [aut, cre], Noam Ross [ctb, cph], Bob Rudis [ctb, cph], Marco Sciaini [ctb, cph], Antônio Pedro Camargo [ctb, cph], Cédric Scherer [ctb, cph]", + "Repository": "CRAN" }, "viridisLite": { "Package": "viridisLite", - "Version": "0.4.2", + "Version": "0.4.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "c826c7c4241b6fc89ff55aaea3fa7491" + "Type": "Package", + "Title": "Colorblind-Friendly Color Maps (Lite Version)", + "Date": "2026-02-03", + "Authors@R": "c( person(\"Simon\", \"Garnier\", email = \"garnier@njit.edu\", role = c(\"aut\", \"cre\")), person(\"Noam\", \"Ross\", email = \"noam.ross@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Bob\", \"Rudis\", email = \"bob@rud.is\", role = c(\"ctb\", \"cph\")), person(\"Marco\", \"Sciaini\", email = \"sciaini.marco@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Antônio Pedro\", \"Camargo\", role = c(\"ctb\", \"cph\")), person(\"Cédric\", \"Scherer\", email = \"scherer@izw-berlin.de\", role = c(\"ctb\", \"cph\")) )", + "Maintainer": "Simon Garnier ", + "Description": "Color maps designed to improve graph readability for readers with common forms of color blindness and/or color vision deficiency. The color maps are also perceptually-uniform, both in regular form and also when converted to black-and-white for printing. This is the 'lite' version of the 'viridis' package that also contains 'ggplot2' bindings for discrete and continuous color and fill scales and can be found at .", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "hexbin (>= 1.27.0)", + "ggplot2 (>= 1.0.1)", + "testthat", + "covr" + ], + "URL": "https://sjmgarnier.github.io/viridisLite/, https://github.com/sjmgarnier/viridisLite/", + "BugReports": "https://github.com/sjmgarnier/viridisLite/issues/", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Simon Garnier [aut, cre], Noam Ross [ctb, cph], Bob Rudis [ctb, cph], Marco Sciaini [ctb, cph], Antônio Pedro Camargo [ctb, cph], Cédric Scherer [ctb, cph]", + "Repository": "CRAN" }, "vroom": { "Package": "vroom", - "Version": "1.6.5", + "Version": "1.7.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Read and Write Rectangular Text Data Quickly", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "The goal of 'vroom' is to read and write data (like 'csv', 'tsv' and 'fwf') quickly. When reading it uses a quick initial indexing step, then reads the values lazily , so only the data you actually use needs to be read. The writer formats the data in parallel and writes to disk asynchronously from formatting.", + "License": "MIT + file LICENSE", + "URL": "https://vroom.tidyverse.org, https://github.com/tidyverse/vroom", + "BugReports": "https://github.com/tidyverse/vroom/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "bit64", - "cli", - "cpp11", + "cli (>= 3.2.0)", "crayon", "glue", "hms", - "lifecycle", + "lifecycle (>= 1.0.3)", "methods", - "progress", - "rlang", + "rlang (>= 1.1.0)", "stats", - "tibble", + "tibble (>= 2.0.0)", "tidyselect", - "tzdb", - "vctrs", + "tzdb (>= 0.1.1)", + "vctrs (>= 0.2.0)", "withr" ], - "Hash": "390f9315bc0025be03012054103d227c" + "Suggests": [ + "archive", + "bench (>= 1.1.0)", + "covr", + "curl", + "dplyr", + "forcats", + "fs", + "ggplot2", + "knitr", + "patchwork", + "prettyunits", + "purrr", + "rmarkdown", + "rstudioapi", + "scales", + "spelling", + "testthat (>= 2.1.0)", + "tidyr", + "utils", + "waldo", + "xml2" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.0)", + "progress (>= 1.2.3)", + "tzdb (>= 0.1.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "nycflights13, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "false", + "Config/usethis/last-upkeep": "2025-11-25", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "Config/build/compilation-database": "true", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [cph] (grisu3 implementation), Mikkel Jørgensen [cph] (grisu3 implementation), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "vsn": { "Package": "vsn", - "Version": "3.72.0", + "Version": "3.78.1", "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Requirements": [ - "Biobase", - "R", + "Title": "Variance stabilization and calibration for microarray data", + "Author": "Wolfgang Huber, with contributions from Anja von Heydebreck. Many comments and suggestions by users are acknowledged, among them Dennis Kostka, David Kreil, Hans-Ulrich Klein, Robert Gentleman, Deepayan Sarkar and Gordon Smyth", + "Maintainer": "Wolfgang Huber ", + "Depends": [ + "R (>= 4.0.0)", + "methods", + "Biobase" + ], + "Imports": [ "affy", - "ggplot2", - "lattice", "limma", - "methods" + "lattice", + "ggplot2" ], - "Hash": "72603bed69ebcf4fe1e81de3587e9624" + "Suggests": [ + "affydata", + "hgu95av2cdf", + "BiocStyle", + "knitr", + "rmarkdown", + "dplyr", + "testthat" + ], + "Description": "The package implements a method for normalising microarray intensities from single- and multiple-color arrays. It can also be used for data from other technologies, as long as they have similar format. The method uses a robust variant of the maximum-likelihood estimator for an additive-multiplicative error model and affine calibration. The model incorporates data calibration step (a.k.a. normalization), a model for the dependence of the variance on the mean intensity and a variance stabilizing data transformation. Differences between transformed intensities are analogous to \"normalized log-ratios\". However, in contrast to the latter, their variance is independent of the mean, and they are usually more sensitive and specific in detecting differential transcription.", + "Reference": "[1] Variance stabilization applied to microarray data calibration and to the quantification of differential expression, Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka, Martin Vingron; Bioinformatics (2002) 18 Suppl1 S96-S104. [2] Parameter estimation for the calibration and variance stabilization of microarray data, Wolfgang Huber, Anja von Heydebreck, Holger Sueltmann, Annemarie Poustka, and Martin Vingron; Statistical Applications in Genetics and Molecular Biology (2003) Vol. 2 No. 1, Article 3; http://www.bepress.com/sagmb/vol2/iss1/art3.", + "License": "Artistic-2.0", + "URL": "http://www.r-project.org, http://www.ebi.ac.uk/huber", + "biocViews": "Microarray, OneChannel, TwoChannel, Preprocessing", + "VignetteBuilder": "knitr", + "Collate": "AllClasses.R AllGenerics.R vsn2.R vsnLogLik.R justvsn.R methods-vsnInput.R methods-vsn.R methods-vsn2.R methods-predict.R RGList_to_NChannelSet.R meanSdPlot-methods.R plotLikelihood.R normalize.AffyBatch.vsn.R sagmbSimulateData.R zzz.R", + "git_url": "https://git.bioconductor.org/packages/vsn", + "git_branch": "RELEASE_3_22", + "git_last_commit": "3f3cc16", + "git_last_commit_date": "2026-01-13", + "Repository": "Bioconductor 3.22", + "NeedsCompilation": "yes" }, "withr": { "Package": "withr", - "Version": "3.0.0", + "Version": "3.0.2", + "Source": "Repository", + "Title": "Run Code 'With' Temporarily Modified Global State", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", , \"krlmlr+r@mailbox.org\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevinushey@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A set of functions to run code 'with' safely and temporarily modified global state. Many of these functions were originally a part of the 'devtools' package, this provides a simple package with limited dependencies to provide access to these functions.", + "License": "MIT + file LICENSE", + "URL": "https://withr.r-lib.org, https://github.com/r-lib/withr#readme", + "BugReports": "https://github.com/r-lib/withr/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "graphics", + "grDevices" + ], + "Suggests": [ + "callr", + "DBI", + "knitr", + "methods", + "rlang", + "rmarkdown (>= 2.12)", + "RSQLite", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Collate": "'aaa.R' 'collate.R' 'connection.R' 'db.R' 'defer-exit.R' 'standalone-defer.R' 'defer.R' 'devices.R' 'local_.R' 'with_.R' 'dir.R' 'env.R' 'file.R' 'language.R' 'libpaths.R' 'locale.R' 'makevars.R' 'namespace.R' 'options.R' 'par.R' 'path.R' 'rng.R' 'seed.R' 'wrap.R' 'sink.R' 'tempfile.R' 'timezone.R' 'torture.R' 'utils.R' 'with.R'", + "NeedsCompilation": "no", + "Author": "Jim Hester [aut], Lionel Henry [aut, cre], Kirill Müller [aut], Kevin Ushey [aut], Hadley Wickham [aut], Winston Chang [aut], Jennifer Bryan [ctb], Richard Cotton [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" + }, + "wk": { + "Package": "wk", + "Version": "0.9.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics" + "Title": "Lightweight Well-Known Geometry Parsing", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\", \"cre\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Anthony\", family = \"North\", email = \"anthony.jl.north@gmail.com\", role = c(\"ctb\")) )", + "Maintainer": "Dewey Dunnington ", + "Description": "Provides a minimal R and C++ API for parsing well-known binary and well-known text representation of geometries to and from R-native formats. Well-known binary is compact and fast to parse; well-known text is human-readable and is useful for writing tests. These formats are useful in R only if the information they contain can be accessed in R, for which high-performance functions are provided here.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Suggests": [ + "testthat (>= 3.0.0)", + "vctrs (>= 0.3.0)", + "sf", + "tibble", + "readr" + ], + "URL": "https://paleolimbot.github.io/wk/, https://github.com/paleolimbot/wk", + "BugReports": "https://github.com/paleolimbot/wk/issues", + "Config/testthat/edition": "3", + "Depends": [ + "R (>= 2.10)" ], - "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35" + "LazyData": "true", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut, cre] (ORCID: ), Edzer Pebesma [aut] (ORCID: ), Anthony North [ctb]", + "Repository": "CRAN" }, "xfun": { "Package": "xfun", - "Version": "0.43", + "Version": "0.56", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Daijiang\", \"Li\", role = \"ctb\"), person(\"Xianying\", \"Tan\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person() )", + "Description": "Miscellaneous functions commonly used in other packages maintained by 'Yihui Xie'.", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ "grDevices", "stats", "tools" ], - "Hash": "ab6371d8653ce5f2f9290f4ec7b42a8e" + "Suggests": [ + "testit", + "parallel", + "codetools", + "methods", + "rstudioapi", + "tinytex (>= 0.30)", + "mime", + "litedown (>= 0.6)", + "commonmark", + "knitr (>= 1.50)", + "remotes", + "pak", + "curl", + "xml2", + "jsonlite", + "magick", + "yaml", + "data.table", + "qs2" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/yihui/xfun", + "BugReports": "https://github.com/yihui/xfun/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "litedown", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: , URL: https://yihui.org), Wush Wu [ctb], Daijiang Li [ctb], Xianying Tan [ctb], Salim Brüggemann [ctb] (ORCID: ), Christophe Dervieux [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "xgboost": { "Package": "xgboost", - "Version": "1.7.7.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", - "data.table", - "jsonlite", - "methods" + "Version": "3.2.0.1", + "Source": "Repository", + "Type": "Package", + "Title": "Extreme Gradient Boosting", + "Date": "2026-02-10", + "Authors@R": "c( person(\"Tianqi\", \"Chen\", role = c(\"aut\"), email = \"tianqi.tchen@gmail.com\"), person(\"Tong\", \"He\", role = c(\"aut\"), email = \"hetong007@gmail.com\"), person(\"Michael\", \"Benesty\", role = c(\"aut\"), email = \"michael@benesty.fr\"), person(\"Vadim\", \"Khotilovich\", role = c(\"aut\"), email = \"khotilovich@gmail.com\"), person(\"Yuan\", \"Tang\", role = c(\"aut\"), email = \"terrytangyuan@gmail.com\", comment = c(ORCID = \"0000-0001-5243-233X\")), person(\"Hyunsu\", \"Cho\", role = c(\"aut\"), email = \"chohyu01@cs.washington.edu\"), person(\"Kailong\", \"Chen\", role = c(\"aut\")), person(\"Rory\", \"Mitchell\", role = c(\"aut\")), person(\"Ignacio\", \"Cano\", role = c(\"aut\")), person(\"Tianyi\", \"Zhou\", role = c(\"aut\")), person(\"Mu\", \"Li\", role = c(\"aut\")), person(\"Junyuan\", \"Xie\", role = c(\"aut\")), person(\"Min\", \"Lin\", role = c(\"aut\")), person(\"Yifeng\", \"Geng\", role = c(\"aut\")), person(\"Yutian\", \"Li\", role = c(\"aut\")), person(\"Jiaming\", \"Yuan\", role = c(\"aut\", \"cre\"), email = \"jm.yuan@outlook.com\"), person(\"David\", \"Cortes\", role = c(\"aut\")), person(\"XGBoost contributors\", role = c(\"cph\"), comment = \"base XGBoost implementation\") )", + "Maintainer": "Jiaming Yuan ", + "Description": "Extreme Gradient Boosting, which is an efficient implementation of the gradient boosting framework from Chen & Guestrin (2016) . This package is its R interface. The package includes efficient linear model solver and tree learning algorithms. The package can automatically do parallel computation on a single machine which could be more than 10 times faster than existing gradient boosting packages. It supports various objective functions, including regression, classification and ranking. The package is made to be extensible, so that users are also allowed to define their own objectives easily.", + "License": "Apache License (== 2.0) | file LICENSE", + "URL": "https://github.com/dmlc/xgboost", + "BugReports": "https://github.com/dmlc/xgboost/issues", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "Suggests": [ + "knitr", + "rmarkdown", + "ggplot2 (>= 1.0.1)", + "DiagrammeR (>= 0.9.0)", + "DiagrammeRsvg", + "rsvg", + "htmlwidgets", + "Ckmeans.1d.dp (>= 3.3.1)", + "vcd (>= 1.3)", + "testthat", + "igraph (>= 1.0.1)", + "float", + "titanic", + "RhpcBLASctl", + "survival" + ], + "Depends": [ + "R (>= 4.3.0)" + ], + "Imports": [ + "Matrix (>= 1.1-0)", + "methods", + "data.table (>= 1.9.6)", + "jsonlite (>= 1.0)" ], - "Hash": "6303e61eac62aef7bd2b396ef7e24386" + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "SystemRequirements": "GNU make, C++17", + "Author": "Tianqi Chen [aut], Tong He [aut], Michael Benesty [aut], Vadim Khotilovich [aut], Yuan Tang [aut] (ORCID: ), Hyunsu Cho [aut], Kailong Chen [aut], Rory Mitchell [aut], Ignacio Cano [aut], Tianyi Zhou [aut], Mu Li [aut], Junyuan Xie [aut], Min Lin [aut], Yifeng Geng [aut], Yutian Li [aut], Jiaming Yuan [aut, cre], David Cortes [aut], XGBoost contributors [cph] (base XGBoost implementation)", + "Repository": "CRAN" }, "xml2": { "Package": "xml2", - "Version": "1.3.6", + "Version": "1.5.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Parse XML", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", email = \"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Foundation\", role = \"ctb\", comment = \"Copy of R-project homepage cached as example\") )", + "Description": "Bindings to 'libxml2' for working with XML data using a simple, consistent interface based on 'XPath' expressions. Also supports XML schema validation; for 'XSLT' transformations see the 'xslt' package.", + "License": "MIT + file LICENSE", + "URL": "https://xml2.r-lib.org, https://r-lib.r-universe.dev/xml2", + "BugReports": "https://github.com/r-lib/xml2/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ "cli", "methods", - "rlang" + "rlang (>= 1.1.0)" ], - "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61" + "Suggests": [ + "covr", + "curl", + "httr", + "knitr", + "mockery", + "rmarkdown", + "testthat (>= 3.2.0)", + "xslt" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "libxml2: libxml2-dev (deb), libxml2-devel (rpm)", + "Collate": "'S4.R' 'as_list.R' 'xml_parse.R' 'as_xml_document.R' 'classes.R' 'format.R' 'import-standalone-obj-type.R' 'import-standalone-purrr.R' 'import-standalone-types-check.R' 'init.R' 'nodeset_apply.R' 'paths.R' 'utils.R' 'xml2-package.R' 'xml_attr.R' 'xml_children.R' 'xml_document.R' 'xml_find.R' 'xml_missing.R' 'xml_modify.R' 'xml_name.R' 'xml_namespaces.R' 'xml_node.R' 'xml_nodeset.R' 'xml_path.R' 'xml_schema.R' 'xml_serialize.R' 'xml_structure.R' 'xml_text.R' 'xml_type.R' 'xml_url.R' 'xml_write.R' 'zzz.R'", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Jeroen Ooms [aut, cre], Posit Software, PBC [cph, fnd], R Foundation [ctb] (Copy of R-project homepage cached as example)", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "xtable": { "Package": "xtable", "Version": "1.8-4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Date": "2019-04-08", + "Title": "Export Tables to LaTeX or HTML", + "Authors@R": "c(person(\"David B.\", \"Dahl\", role=\"aut\"), person(\"David\", \"Scott\", role=c(\"aut\",\"cre\"), email=\"d.scott@auckland.ac.nz\"), person(\"Charles\", \"Roosen\", role=\"aut\"), person(\"Arni\", \"Magnusson\", role=\"aut\"), person(\"Jonathan\", \"Swinton\", role=\"aut\"), person(\"Ajay\", \"Shah\", role=\"ctb\"), person(\"Arne\", \"Henningsen\", role=\"ctb\"), person(\"Benno\", \"Puetz\", role=\"ctb\"), person(\"Bernhard\", \"Pfaff\", role=\"ctb\"), person(\"Claudio\", \"Agostinelli\", role=\"ctb\"), person(\"Claudius\", \"Loehnert\", role=\"ctb\"), person(\"David\", \"Mitchell\", role=\"ctb\"), person(\"David\", \"Whiting\", role=\"ctb\"), person(\"Fernando da\", \"Rosa\", role=\"ctb\"), person(\"Guido\", \"Gay\", role=\"ctb\"), person(\"Guido\", \"Schulz\", role=\"ctb\"), person(\"Ian\", \"Fellows\", role=\"ctb\"), person(\"Jeff\", \"Laake\", role=\"ctb\"), person(\"John\", \"Walker\", role=\"ctb\"), person(\"Jun\", \"Yan\", role=\"ctb\"), person(\"Liviu\", \"Andronic\", role=\"ctb\"), person(\"Markus\", \"Loecher\", role=\"ctb\"), person(\"Martin\", \"Gubri\", role=\"ctb\"), person(\"Matthieu\", \"Stigler\", role=\"ctb\"), person(\"Robert\", \"Castelo\", role=\"ctb\"), person(\"Seth\", \"Falcon\", role=\"ctb\"), person(\"Stefan\", \"Edwards\", role=\"ctb\"), person(\"Sven\", \"Garbade\", role=\"ctb\"), person(\"Uwe\", \"Ligges\", role=\"ctb\"))", + "Maintainer": "David Scott ", + "Imports": [ "stats", "utils" ], - "Hash": "b8acdf8af494d9ec19ccb2481a9b11c2" + "Suggests": [ + "knitr", + "plm", + "zoo", + "survival" + ], + "VignetteBuilder": "knitr", + "Description": "Coerce data to LaTeX and HTML tables.", + "URL": "http://xtable.r-forge.r-project.org/", + "Depends": [ + "R (>= 2.10.0)" + ], + "License": "GPL (>= 2)", + "Repository": "CRAN", + "NeedsCompilation": "no", + "Author": "David B. Dahl [aut], David Scott [aut, cre], Charles Roosen [aut], Arni Magnusson [aut], Jonathan Swinton [aut], Ajay Shah [ctb], Arne Henningsen [ctb], Benno Puetz [ctb], Bernhard Pfaff [ctb], Claudio Agostinelli [ctb], Claudius Loehnert [ctb], David Mitchell [ctb], David Whiting [ctb], Fernando da Rosa [ctb], Guido Gay [ctb], Guido Schulz [ctb], Ian Fellows [ctb], Jeff Laake [ctb], John Walker [ctb], Jun Yan [ctb], Liviu Andronic [ctb], Markus Loecher [ctb], Martin Gubri [ctb], Matthieu Stigler [ctb], Robert Castelo [ctb], Seth Falcon [ctb], Stefan Edwards [ctb], Sven Garbade [ctb], Uwe Ligges [ctb]", + "Encoding": "UTF-8" }, "yaml": { "Package": "yaml", - "Version": "2.3.8", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "29240487a071f535f5e5d5a323b7afbd" + "Version": "2.3.12", + "Source": "Repository", + "Type": "Package", + "Title": "Methods to Convert R Data to YAML and Back", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"cre\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Shawn\", \"Garbett\", , \"shawn.garbett@vumc.org\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4079-5621\")), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )", + "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", + "License": "BSD_3_clause + file LICENSE", + "URL": "https://yaml.r-lib.org, https://github.com/r-lib/yaml/", + "BugReports": "https://github.com/r-lib/yaml/issues", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [cre] (ORCID: ), Shawn Garbett [ctb] (ORCID: ), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: ), Zhuoer Dong [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: ), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "yulab.utils": { "Package": "yulab.utils", - "Version": "0.1.4", + "Version": "0.2.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Supporting Functions for Packages Maintained by 'YuLab-SMU'", + "Authors@R": "c(person(\"Guangchuang\", \"Yu\", email = \"guangchuangyu@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6485-8781\")))", + "Description": "Miscellaneous functions commonly used by 'YuLab-SMU'.", + "Depends": [ + "R (>= 4.2.0)" + ], + "Imports": [ "cli", "digest", "fs", - "memoise", + "methods", + "rappdirs", "rlang", - "stats", "tools", "utils" ], - "Hash": "60ee2aaa179dc282e9fa7367bad76e89" - }, - "zlibbioc": { - "Package": "zlibbioc", - "Version": "1.50.0", - "Source": "Bioconductor", - "Repository": "Bioconductor 3.19", - "Hash": "3db02e3c460e1c852365df117a2b441b" + "Suggests": [ + "httr2", + "jsonlite", + "openssl", + "R.utils", + "testthat (>= 3.0.0)" + ], + "ByteCompile": "true", + "License": "Artistic-2.0", + "URL": "https://yulab-smu.top/", + "BugReports": "https://github.com/YuLab-SMU/yulab.utils/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Guangchuang Yu [aut, cre] (ORCID: )", + "Maintainer": "Guangchuang Yu ", + "Repository": "CRAN" } } } diff --git a/renv/.gitignore b/renv/.gitignore index 7c1c770d..0ec0cbba 100644 --- a/renv/.gitignore +++ b/renv/.gitignore @@ -1,8 +1,7 @@ -sandbox/ -cellar/ -local/ library/ +local/ +cellar/ lock/ python/ +sandbox/ staging/ - diff --git a/renv/activate.R b/renv/activate.R index 0eb51088..ef25ef83 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -2,7 +2,8 @@ local({ # the requested version of renv - version <- "1.0.11" + version <- "1.1.7" + attr(version, "md5") <- "dd5d60f155dadff4c88c2fc6680504b4" attr(version, "sha") <- NULL # the project directory @@ -42,7 +43,7 @@ local({ return(FALSE) # next, check environment variables - # TODO: prefer using the configuration one in the future + # prefer using the configuration one in the future envvars <- c( "RENV_CONFIG_AUTOLOADER_ENABLED", "RENV_AUTOLOADER_ENABLED", @@ -135,12 +136,12 @@ local({ # R help links pattern <- "`\\?(renv::(?:[^`])+)`" - replacement <- "`\033]8;;ide:help:\\1\a?\\1\033]8;;\a`" + replacement <- "`\033]8;;x-r-help:\\1\a?\\1\033]8;;\a`" text <- gsub(pattern, replacement, text, perl = TRUE) # runnable code pattern <- "`(renv::(?:[^`])+)`" - replacement <- "`\033]8;;ide:run:\\1\a\\1\033]8;;\a`" + replacement <- "`\033]8;;x-r-run:\\1\a\\1\033]8;;\a`" text <- gsub(pattern, replacement, text, perl = TRUE) # return ansified text @@ -168,6 +169,16 @@ local({ if (quiet) return(invisible()) + # also check for config environment variables that should suppress messages + # https://github.com/rstudio/renv/issues/2214 + enabled <- Sys.getenv("RENV_CONFIG_STARTUP_QUIET", unset = NA) + if (!is.na(enabled) && tolower(enabled) %in% c("true", "1")) + return(invisible()) + + enabled <- Sys.getenv("RENV_CONFIG_SYNCHRONIZED_CHECK", unset = NA) + if (!is.na(enabled) && tolower(enabled) %in% c("false", "0")) + return(invisible()) + msg <- sprintf(fmt, ...) cat(msg, file = stdout(), sep = if (appendLF) "\n" else "") @@ -209,16 +220,22 @@ local({ } - startswith <- function(string, prefix) { - substring(string, 1, nchar(prefix)) == prefix - } - bootstrap <- function(version, library) { friendly <- renv_bootstrap_version_friendly(version) section <- header(sprintf("Bootstrapping renv %s", friendly)) catf(section) + # try to install renv from cache + md5 <- attr(version, "md5", exact = TRUE) + if (length(md5)) { + pkgpath <- renv_bootstrap_find(version) + if (length(pkgpath) && file.exists(pkgpath)) { + file.copy(pkgpath, library, recursive = TRUE) + return(invisible()) + } + } + # attempt to download renv catf("- Downloading renv ... ", appendLF = FALSE) withCallingHandlers( @@ -244,7 +261,6 @@ local({ # add empty line to break up bootstrapping from normal output catf("") - return(invisible()) } @@ -261,12 +277,20 @@ local({ repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) if (!is.na(repos)) { - # check for RSPM; if set, use a fallback repository for renv - rspm <- Sys.getenv("RSPM", unset = NA) - if (identical(rspm, repos)) - repos <- c(RSPM = rspm, CRAN = cran) + # split on ';' if present + parts <- strsplit(repos, ";", fixed = TRUE)[[1L]] - return(repos) + # split into named repositories if present + idx <- regexpr("=", parts, fixed = TRUE) + keys <- substring(parts, 1L, idx - 1L) + vals <- substring(parts, idx + 1L) + names(vals) <- keys + + # if we have a single unnamed repository, call it CRAN + if (length(vals) == 1L && identical(keys, "")) + names(vals) <- "CRAN" + + return(vals) } @@ -515,6 +539,51 @@ local({ } + renv_bootstrap_find <- function(version) { + + path <- renv_bootstrap_find_cache(version) + if (length(path) && file.exists(path)) { + catf("- Using renv %s from global package cache", version) + return(path) + } + + } + + renv_bootstrap_find_cache <- function(version) { + + md5 <- attr(version, "md5", exact = TRUE) + if (is.null(md5)) + return() + + # infer path to renv cache + cache <- Sys.getenv("RENV_PATHS_CACHE", unset = "") + if (!nzchar(cache)) { + root <- Sys.getenv("RENV_PATHS_ROOT", unset = NA) + if (!is.na(root)) + cache <- file.path(root, "cache") + } + + if (!nzchar(cache)) { + tools <- asNamespace("tools") + if (is.function(tools$R_user_dir)) { + root <- tools$R_user_dir("renv", "cache") + cache <- file.path(root, "cache") + } + } + + # start completing path to cache + file.path( + cache, + renv_bootstrap_cache_version(), + renv_bootstrap_platform_prefix(), + "renv", + version, + md5, + "renv" + ) + + } + renv_bootstrap_download_tarball <- function(version) { # if the user has provided the path to a tarball via @@ -563,6 +632,9 @@ local({ # prepare download options token <- renv_bootstrap_github_token() + if (is.null(token)) + token <- "" + if (nzchar(Sys.which("curl")) && nzchar(token)) { fmt <- "--location --fail --header \"Authorization: token %s\"" extra <- sprintf(fmt, token) @@ -696,11 +768,19 @@ local({ } - renv_bootstrap_platform_prefix <- function() { + renv_bootstrap_platform_prefix_default <- function() { - # construct version prefix - version <- paste(R.version$major, R.version$minor, sep = ".") - prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") + # read version component + version <- Sys.getenv("RENV_PATHS_VERSION", unset = "R-%v") + + # expand placeholders + placeholders <- list( + list("%v", format(getRversion()[1, 1:2])), + list("%V", format(getRversion()[1, 1:3])) + ) + + for (placeholder in placeholders) + version <- gsub(placeholder[[1L]], placeholder[[2L]], version, fixed = TRUE) # include SVN revision for development versions of R # (to avoid sharing platform-specific artefacts with released versions of R) @@ -709,10 +789,19 @@ local({ identical(R.version[["nickname"]], "Unsuffered Consequences") if (devel) - prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") + version <- paste(version, R.version[["svn rev"]], sep = "-r") + + version + + } + + renv_bootstrap_platform_prefix <- function() { + + # construct version prefix + version <- renv_bootstrap_platform_prefix_default() # build list of path components - components <- c(prefix, R.version$platform) + components <- c(version, R.version$platform) # include prefix if provided by user prefix <- renv_bootstrap_platform_prefix_impl() @@ -951,13 +1040,19 @@ local({ } renv_bootstrap_validate_version_dev <- function(version, description) { + expected <- description[["RemoteSha"]] - is.character(expected) && startswith(expected, version) + if (!is.character(expected)) + return(FALSE) + + pattern <- sprintf("^\\Q%s\\E", version) + grepl(pattern, expected, perl = TRUE) + } renv_bootstrap_validate_version_release <- function(version, description) { expected <- description[["Version"]] - is.character(expected) && identical(expected, version) + is.character(expected) && identical(c(expected), c(version)) } renv_bootstrap_hash_text <- function(text) { @@ -1132,10 +1227,10 @@ local({ renv_bootstrap_exec <- function(project, libpath, version) { if (!renv_bootstrap_load(project, libpath, version)) - renv_bootstrap_run(version, libpath) + renv_bootstrap_run(project, libpath, version) } - renv_bootstrap_run <- function(version, libpath) { + renv_bootstrap_run <- function(project, libpath, version) { # perform bootstrap bootstrap(version, libpath) @@ -1146,7 +1241,7 @@ local({ # try again to load if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - return(renv::load(project = getwd())) + return(renv::load(project = project)) } # failed to download or load renv; warn the user @@ -1159,6 +1254,18 @@ local({ } + renv_bootstrap_cache_version <- function() { + # NOTE: users should normally not override the cache version; + # this is provided just to make testing easier + Sys.getenv("RENV_CACHE_VERSION", unset = "v5") + } + + renv_bootstrap_cache_version_previous <- function() { + version <- renv_bootstrap_cache_version() + number <- as.integer(substring(version, 2L)) + paste("v", number - 1L, sep = "") + } + renv_json_read <- function(file = NULL, text = NULL) { jlerr <- NULL @@ -1192,98 +1299,105 @@ local({ jsonlite::fromJSON(txt = text, simplifyVector = FALSE) } - renv_json_read_default <- function(file = NULL, text = NULL) { + renv_json_read_patterns <- function() { - # find strings in the JSON - text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") - pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' - locs <- gregexpr(pattern, text, perl = TRUE)[[1]] + list( - # if any are found, replace them with placeholders - replaced <- text - strings <- character() - replacements <- character() + # objects + list("{", "\t\n\tobject(\t\n\t", TRUE), + list("}", "\t\n\t)\t\n\t", TRUE), - if (!identical(c(locs), -1L)) { + # arrays + list("[", "\t\n\tarray(\t\n\t", TRUE), + list("]", "\n\t\n)\n\t\n", TRUE), - # get the string values - starts <- locs - ends <- locs + attr(locs, "match.length") - 1L - strings <- substring(text, starts, ends) + # maps + list(":", "\t\n\t=\t\n\t", TRUE), - # only keep those requiring escaping - strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) + # newlines + list("\\u000a", "\n", FALSE) - # compute replacements - replacements <- sprintf('"\032%i\032"', seq_along(strings)) + ) - # replace the strings - mapply(function(string, replacement) { - replaced <<- sub(string, replacement, replaced, fixed = TRUE) - }, strings, replacements) + } - } + renv_json_read_envir <- function() { - # transform the JSON into something the R parser understands - transformed <- replaced - transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE) - transformed <- gsub("[[{]", "list(", transformed, perl = TRUE) - transformed <- gsub("[]}]", ")", transformed, perl = TRUE) - transformed <- gsub(":", "=", transformed, fixed = TRUE) - text <- paste(transformed, collapse = "\n") + envir <- new.env(parent = emptyenv()) - # parse it - json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] + envir[["+"]] <- `+` + envir[["-"]] <- `-` - # construct map between source strings, replaced strings - map <- as.character(parse(text = strings)) - names(map) <- as.character(parse(text = replacements)) + envir[["object"]] <- function(...) { + result <- list(...) + names(result) <- as.character(names(result)) + result + } - # convert to list - map <- as.list(map) + envir[["array"]] <- list - # remap strings in object - remapped <- renv_json_read_remap(json, map) + envir[["true"]] <- TRUE + envir[["false"]] <- FALSE + envir[["null"]] <- NULL - # evaluate - eval(remapped, envir = baseenv()) + envir } - renv_json_read_remap <- function(json, map) { + renv_json_read_remap <- function(object, patterns) { - # fix names - if (!is.null(names(json))) { - lhs <- match(names(json), names(map), nomatch = 0L) - rhs <- match(names(map), names(json), nomatch = 0L) - names(json)[rhs] <- map[lhs] - } + # repair names if necessary + if (!is.null(names(object))) { + + nms <- names(object) + for (pattern in patterns) + nms <- gsub(pattern[[2L]], pattern[[1L]], nms, fixed = TRUE) + names(object) <- nms - # fix values - if (is.character(json)) - return(map[[json]] %||% json) - - # handle true, false, null - if (is.name(json)) { - text <- as.character(json) - if (text == "true") - return(TRUE) - else if (text == "false") - return(FALSE) - else if (text == "null") - return(NULL) } - # recurse - if (is.recursive(json)) { - for (i in seq_along(json)) { - json[i] <- list(renv_json_read_remap(json[[i]], map)) - } + # repair strings if necessary + if (is.character(object)) { + for (pattern in patterns) + object <- gsub(pattern[[2L]], pattern[[1L]], object, fixed = TRUE) } - json + # recurse for other objects + if (is.recursive(object)) + for (i in seq_along(object)) + object[i] <- list(renv_json_read_remap(object[[i]], patterns)) + + # return remapped object + object + + } + + renv_json_read_default <- function(file = NULL, text = NULL) { + + # read json text + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + + # convert into something the R parser will understand + patterns <- renv_json_read_patterns() + transformed <- text + for (pattern in patterns) + transformed <- gsub(pattern[[1L]], pattern[[2L]], transformed, fixed = TRUE) + + # parse it + rfile <- tempfile("renv-json-", fileext = ".R") + on.exit(unlink(rfile), add = TRUE) + writeLines(transformed, con = rfile) + json <- parse(rfile, keep.source = FALSE, srcfile = NULL)[[1L]] + + # evaluate in safe environment + result <- eval(json, envir = renv_json_read_envir()) + + # fix up strings if necessary -- do so only with reversible patterns + patterns <- Filter(function(pattern) pattern[[3L]], patterns) + renv_json_read_remap(result, patterns) } + # load the renv profile, if any renv_bootstrap_profile_load(project) diff --git a/renv/settings.json b/renv/settings.json index 0470d923..9566b6ff 100644 --- a/renv/settings.json +++ b/renv/settings.json @@ -1,5 +1,5 @@ { - "bioconductor.version": "3.19", + "bioconductor.version": "3.22", "external.libraries": [], "ignored.packages": [], "package.dependency.fields": [ @@ -9,7 +9,8 @@ ], "ppm.enabled": true, "ppm.ignored.urls": [], - "r.version": "4.4.0", + "r.version": "4.5.2", + "snapshot.dev": false, "snapshot.type": "implicit", "use.cache": true, "vcs.ignore.cellar": true, diff --git a/scRNA-seq-advanced/01-read_filter_normalize_scRNA-live.Rmd b/scRNA-seq-advanced/01-read_filter_normalize_scRNA-live.Rmd index 18140bb7..cf5c9cb3 100644 --- a/scRNA-seq-advanced/01-read_filter_normalize_scRNA-live.Rmd +++ b/scRNA-seq-advanced/01-read_filter_normalize_scRNA-live.Rmd @@ -93,8 +93,10 @@ normalized_dir <- file.path(data_dir, "normalized") fs::dir_create(normalized_dir) # output RDS file for normalized data -output_sce_file <- file.path(normalized_dir, - "glioblastoma_normalized_sce.rds") +output_sce_file <- file.path( + normalized_dir, + "glioblastoma_normalized_sce.rds" +) ``` @@ -106,7 +108,7 @@ Whether the 10x Cell Ranger data is in Matrix Exchange format or in an HDF5 file (Though again, we do not recommend using the `.h5` file if you can avoid it, _especially_ for raw (unfiltered) data.) If you used something other than Cell Ranger to process the raw data, you would need to use a different function to read it in and create the `SingleCellExperiment` object. -Some of these functions for other common data formats are discussed in [Chapter 3 of OSCA] (http://bioconductor.org/books/3.19/OSCA.intro/getting-scrna-seq-datasets.html#reading-counts-into-r). +Some of these functions for other common data formats are discussed in [Chapter 3 of OSCA](http://bioconductor.org/books/3.19/OSCA.intro/getting-scrna-seq-datasets.html#reading-counts-into-r). ```{r read SCE, live=TRUE} # read SCE from matrix directory @@ -327,8 +329,11 @@ We stick with that default, but for clarity, we will also include it in our code ```{r miQC plotFiltering} # look at miQC filtering -miQC::plotFiltering(filtered_sce, miqc_model, - posterior_cutoff = 0.75) + +miQC::plotFiltering( + filtered_sce, + miqc_model, + posterior_cutoff = 0.75 +) + theme_bw() ``` @@ -409,8 +414,10 @@ num_genes <- 2000 gene_variance <- scran::modelGeneVar(normalized_sce) # get the most variable genes -hv_genes <- scran::getTopHVGs(gene_variance, - n = num_genes) +hv_genes <- scran::getTopHVGs( + gene_variance, + n = num_genes +) ``` The result is a vector of gene ids (ordered from most to least variable): @@ -476,7 +483,7 @@ We can also visualize the UMAP results using the `plotReducedDim()` function. ```{r plotReducedDim, live=TRUE} # plot the UMAP - # color by the most variable gene + # color by the most variable gene ``` diff --git a/scRNA-seq-advanced/01-read_filter_normalize_scRNA.Rmd b/scRNA-seq-advanced/01-read_filter_normalize_scRNA.Rmd index bb7c0175..23991c70 100644 --- a/scRNA-seq-advanced/01-read_filter_normalize_scRNA.Rmd +++ b/scRNA-seq-advanced/01-read_filter_normalize_scRNA.Rmd @@ -96,8 +96,10 @@ normalized_dir <- file.path(data_dir, "normalized") fs::dir_create(normalized_dir) # output RDS file for normalized data -output_sce_file <- file.path(normalized_dir, - "glioblastoma_normalized_sce.rds") +output_sce_file <- file.path( + normalized_dir, + "glioblastoma_normalized_sce.rds" +) ``` @@ -109,7 +111,7 @@ Whether the 10x Cell Ranger data is in Matrix Exchange format or in an HDF5 file (Though again, we do not recommend using the `.h5` file if you can avoid it, _especially_ for raw (unfiltered) data.) If you used something other than Cell Ranger to process the raw data, you would need to use a different function to read it in and create the `SingleCellExperiment` object. -Some of these functions for other common data formats are discussed in [Chapter 3 of OSCA] (http://bioconductor.org/books/3.19/OSCA.intro/getting-scrna-seq-datasets.html#reading-counts-into-r). +Some of these functions for other common data formats are discussed in [Chapter 3 of OSCA](http://bioconductor.org/books/3.19/OSCA.intro/getting-scrna-seq-datasets.html#reading-counts-into-r). ```{r read SCE, live=TRUE} # read SCE from matrix directory @@ -273,8 +275,10 @@ The `mito` name is important in that it is the name that will be expected by a l (We could define more subsets, but for now this one will do.) ```{r per cell QC, live=TRUE} -filtered_sce <- scuttle::addPerCellQC(filtered_sce, - subsets = list(mito = mito_genes)) +filtered_sce <- scuttle::addPerCellQC( + filtered_sce, + subsets = list(mito = mito_genes) +) ``` Now we can look at the colData to see what was added: @@ -337,8 +341,11 @@ We stick with that default, but for clarity, we will also include it in our code ```{r miQC plotFiltering} # look at miQC filtering -miQC::plotFiltering(filtered_sce, miqc_model, - posterior_cutoff = 0.75) + +miQC::plotFiltering( + filtered_sce, + miqc_model, + posterior_cutoff = 0.75 +) + theme_bw() ``` @@ -349,8 +356,10 @@ At this point, we can perform the actual filtering using the `filterCells()` fun ```{r miQC filtercells, live=TRUE} # perform miQC filtering -qcfiltered_sce <- miQC::filterCells(filtered_sce, - model = miqc_model) +qcfiltered_sce <- miQC::filterCells( + filtered_sce, + model = miqc_model +) ``` #### One more filter: unique gene count @@ -383,8 +392,10 @@ Finally, we apply the scaling factor to the expression values for each cell and qclust <- scran::quickCluster(qcfiltered_sce) # use clusters to compute scaling factors and add to SCE object -qcfiltered_sce <- scran::computeSumFactors(qcfiltered_sce, - clusters = qclust) +qcfiltered_sce <- scran::computeSumFactors( + qcfiltered_sce, + clusters = qclust +) # perform normalization using scaling factors # and save as a new SCE object @@ -424,8 +435,10 @@ num_genes <- 2000 gene_variance <- scran::modelGeneVar(normalized_sce) # get the most variable genes -hv_genes <- scran::getTopHVGs(gene_variance, - n = num_genes) +hv_genes <- scran::getTopHVGs( + gene_variance, + n = num_genes +) ``` The result is a vector of gene ids (ordered from most to least variable): @@ -486,8 +499,10 @@ Since the UMAP procedure would be slow to calculate with the full data, so the ` Since we already have a PCA matrix, we will tell the function use that instead of recalculating it. ```{r runUMAP, live=TRUE} -normalized_sce <- scater::runUMAP(normalized_sce, - dimred = "PCA") +normalized_sce <- scater::runUMAP( + normalized_sce, + dimred = "PCA" +) ``` As before, we could extract the UMAP matrix from our SCE object with the `reducedDim()` function. @@ -495,10 +510,12 @@ We can also visualize the UMAP results using the `plotReducedDim()` function. ```{r plotReducedDim, live=TRUE} # plot the UMAP -scater::plotReducedDim(normalized_sce, - "UMAP", - # color by the most variable gene - color_by = hv_genes[1]) +scater::plotReducedDim( + normalized_sce, + "UMAP", + # color by the most variable gene + color_by = hv_genes[1] +) ``` @@ -552,8 +569,10 @@ Here rather than the general `plotReducedDim()` function, we will use `plotUMAP( ```{r plot clusters, live=TRUE} # plot UMAP with assigned clusters -scater::plotUMAP(normalized_sce, - color_by = "nn_cluster") +scater::plotUMAP( + normalized_sce, + color_by = "nn_cluster" +) ``` What do you see in these results? diff --git a/scRNA-seq-advanced/01-read_filter_normalize_scRNA.nb.html b/scRNA-seq-advanced/01-read_filter_normalize_scRNA.nb.html index dd2bf48f..6f2dc05a 100644 --- a/scRNA-seq-advanced/01-read_filter_normalize_scRNA.nb.html +++ b/scRNA-seq-advanced/01-read_filter_normalize_scRNA.nb.html @@ -3107,7 +3107,7 @@

Directories and files

- +
# Outputs ------------------------------------
 
 # Directory and file to save output
@@ -3117,8 +3117,10 @@ 

Directories and files

fs::dir_create(normalized_dir) # output RDS file for normalized data -output_sce_file <- file.path(normalized_dir, - "glioblastoma_normalized_sce.rds")
+output_sce_file <- file.path( + normalized_dir, + "glioblastoma_normalized_sce.rds" +) @@ -3139,7 +3141,8 @@

Reading Cell Ranger data

If you used something other than Cell Ranger to process the raw data, you would need to use a different function to read it in and create the SingleCellExperiment object. Some of these functions for -other common data formats are discussed in [Chapter 3 of OSCA] (http://bioconductor.org/books/3.19/OSCA.intro/getting-scrna-seq-datasets.html#reading-counts-into-r).

+other common data formats are discussed in Chapter +3 of OSCA.

@@ -3490,9 +3493,11 @@

Calculating summary QC statistics

more subsets, but for now this one will do.)

- -
filtered_sce <- scuttle::addPerCellQC(filtered_sce,
-                                      subsets = list(mito = mito_genes))
+ +
filtered_sce <- scuttle::addPerCellQC(
+  filtered_sce,
+  subsets = list(mito = mito_genes)
+)
@@ -3616,10 +3621,13 @@

Filtering compromised cells

also include it in our code!

- +
# look at miQC filtering
-miQC::plotFiltering(filtered_sce, miqc_model,
-                    posterior_cutoff = 0.75) +
+miQC::plotFiltering(
+  filtered_sce,
+  miqc_model,
+  posterior_cutoff = 0.75
+) +
   theme_bw()
@@ -3637,10 +3645,12 @@

Filtering compromised cells

object.

- +
# perform miQC filtering
-qcfiltered_sce <- miQC::filterCells(filtered_sce,
-                                    model = miqc_model)
+qcfiltered_sce <- miQC::filterCells( + filtered_sce, + model = miqc_model +)
Removing 387 out of 1626 cells.
@@ -3705,13 +3715,15 @@

Normalization

scuttle::logNormCounts() function.

- +
# Perform rough clustering
 qclust <- scran::quickCluster(qcfiltered_sce)
 
 # use clusters to compute scaling factors and add to SCE object
-qcfiltered_sce <- scran::computeSumFactors(qcfiltered_sce,
-                                           clusters = qclust)
+qcfiltered_sce <- scran::computeSumFactors(
+  qcfiltered_sce,
+  clusters = qclust
+)
 
 # perform normalization using scaling factors
 # and save as a new SCE object
@@ -3777,7 +3789,7 @@ 

Selecting highly variable genes

variation, which is what we are most interested in.

- +
# identify 2000 genes
 num_genes <- 2000
 
@@ -3785,8 +3797,10 @@ 

Selecting highly variable genes

gene_variance <- scran::modelGeneVar(normalized_sce) # get the most variable genes -hv_genes <- scran::getTopHVGs(gene_variance, - n = num_genes)
+hv_genes <- scran::getTopHVGs( + gene_variance, + n = num_genes +)
@@ -3907,9 +3921,11 @@

UMAP

recalculating it.

- -
normalized_sce <- scater::runUMAP(normalized_sce,
-                                  dimred = "PCA")
+ +
normalized_sce <- scater::runUMAP(
+  normalized_sce,
+  dimred = "PCA"
+)
@@ -3918,12 +3934,14 @@

UMAP

results using the plotReducedDim() function.

- +
# plot the UMAP
-scater::plotReducedDim(normalized_sce,
-                       "UMAP",
-                       # color by the most variable gene
-                       color_by = hv_genes[1])
+scater::plotReducedDim( + normalized_sce, + "UMAP", + # color by the most variable gene + color_by = hv_genes[1] +)

@@ -4003,10 +4021,12 @@

Unsupervised clustering

we can skip that argument.

- +
# plot UMAP with assigned clusters
-scater::plotUMAP(normalized_sce,
-                 color_by = "nn_cluster")
+scater::plotUMAP( + normalized_sce, + color_by = "nn_cluster" +)

@@ -4141,7 +4161,7 @@

Print session info

-
LS0tCnRpdGxlOiAiUmVhZGluZywgZmlsdGVyaW5nLCBhbmQgbm9ybWFsaXppbmcgc2NSTkEtc2VxIGRhdGEiCmF1dGhvcjogRGF0YSBMYWIgZm9yIEFMU0YKZGF0ZTogMjAyMwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUmVhZCBDZWxsIFJhbmdlciBkYXRhIGludG8gUgotIEZpbHRlciB0byBjZWxscyB1c2luZyBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAKLSBDYWxjdWxhdGUgcXVhbGl0eSBjb250cm9sIG1lYXN1cmVzIG9uIHNjUk5BLXNlcSBkYXRhCi0gUmVtb3ZlIGxpa2VseSBjb21wcm9taXNlZCBjZWxscyB3aXRoIGBtaVFDKClgCi0gTm9ybWFsaXplIGV4cHJlc3Npb24gZGF0YSBhY3Jvc3MgY2VsbHMKLSBDYWxjdWxhdGUgYW5kIHBsb3QgcmVkdWNlZCBkaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIG9mIGV4cHJlc3Npb24gZGF0YSAoUENBLCBVTUFQKQoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSB3aWxsIHJldmlldyBiYXNpYyBwcm9jZXNzaW5nIGZvciBzaW5nbGUtY2VsbCBSTkEtc2VxIGRhdGEsIHN0YXJ0aW5nIHdpdGggdGhlIG91dHB1dCBmcm9tIENlbGwgUmFuZ2VyLCBhbmQgcHJvY2VlZGluZyB0aHJvdWdoIGZpbHRlcmluZywgcXVhbGl0eSBjb250cm9sLCBub3JtYWxpemF0aW9uLCBhbmQgZGltZW5zaW9uIHJlZHVjdGlvbi4gV2Ugd2lsbCBwZXJmb3JtIHRoZXNlIHRhc2tzIHVzaW5nIHRvb2xzIGZyb20gdGhlIFtCaW9jb25kdWN0b3IgcHJvamVjdF0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnKSwgaW4gcGFydGljdWxhciBbYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3RzXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvU2luZ2xlQ2VsbEV4cGVyaW1lbnQuaHRtbCkgYW5kIGZ1bmN0aW9ucyB0aGF0IHdvcmsgd2l0aCB0aG9zZSBvYmplY3RzLgpNdWNoIG9mIHRoZSBtYXRlcmlhbCBpbiB0aGlzIG5vdGVib29rIGlzIGRpcmVjdGx5IGluc3BpcmVkIGJ5LCBhbmQgZHJhd3MgaGVhdmlseSBvbiwgbWF0ZXJpYWwgcHJlc2VudGVkIGluIHRoZSBib29rIFtfT3JjaGVzdHJhdGluZyBTaW5nbGUgQ2VsbCBBbmFseXNpcyB3aXRoIEJpb2NvbmR1Y3Rvcl8gKE9TQ0EpXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy9yZWxlYXNlL09TQ0EvKS4KCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogT3ZlcnZpZXddKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX292ZXJ2aWV3LnBuZykKClRoZSBkYXRhIHdlIHdpbGwgdXNlIGZvciB0aGlzIG5vdGVib29rIGlzIGRlcml2ZWQgZnJvbSBhIGh1bWFuIGdsaW9ibGFzdG9tYSBzcGVjaW1lbi4KVGhlIHNhbXBsZSB3YXMgcHJvY2Vzc2VkIGJ5IDEweCBHZW5vbWljcyB1c2luZyBhIDMnIFJOQSBraXQgKHYzLjEpLCBzZXF1ZW5jZWQsIGFuZCBxdWFudGlmaWVkIHdpdGggQ2VsbCBSYW5nZXIgNi4wLgpGdXJ0aGVyIGRldGFpbHMgYWJvdXQgdGhlIHNhbXBsZSBhbmQgcHJvY2Vzc2luZyBjYW4gYmUgZm91bmQgb24gdGhlIFsxMHggd2Vic2l0ZV0oaHR0cHM6Ly93d3cuMTB4Z2Vub21pY3MuY29tL3Jlc291cmNlcy9kYXRhc2V0cy8yLWstc29ydGVkLWNlbGxzLWZyb20taHVtYW4tZ2xpb2JsYXN0b21hLW11bHRpZm9ybWUtMy12LTMtMS0zLTEtc3RhbmRhcmQtNi0wLTApLgoKCiMjIFNldCBVcAoKVG8gc3RhcnQsIHdlIHdpbGwgbG9hZCBzb21lIG9mIHRoZSBsaWJyYXJpZXMgd2Ugd2lsbCBuZWVkIGxhdGVyLCBhbmQgc2V0IGEgcmFuZG9tIG51bWJlciBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkuCgpgYGB7ciBzZXR1cH0KIyBMb2FkIGxpYnJhcmllcwoKIyBQbG90dGluZyBmdW5jdGlvbnMKbGlicmFyeShnZ3Bsb3QyKQoKIyBUaGUgbWFpbiBjbGFzcyB3ZSB3aWxsIHVzZSBmb3IgU2luZ2xlIENlbGwgZGF0YQpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQoKIyBTZXR0aW5nIHRoZSBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkKc2V0LnNlZWQoMTIzNDUpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKQmVmb3JlIHdlIGdldCB0b28gZmFyLCB3ZSBsaWtlIHRvIGRlZmluZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyB0aGF0IHRoZSBub3RlYm9vayB3aWxsIHVzZSBuZWFyIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50LgpXaGlsZSB5b3UgbWlnaHQgbm90IGtub3cgdGhlIG5hbWVzIG9mIGFsbCBvZiB0aGUgZmlsZXMgeW91IHdpbGwgbmVlZCBvciBjcmVhdGUgb3V0cHV0IGZpbGVzIHdoZW4geW91IHN0YXJ0IGFuIGFuYWx5c2lzLCB3ZSBoYXZlIGZvdW5kIGl0IGhlbHBmdWwgdG8ga2VlcCBhbGwgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIGluIGEgc2luZ2xlIHBsYWNlIG5lYXIgdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQuClRoaXMgbWFrZXMgaXQgZWFzaWVyIGZvciBzb21lYm9keSBjb21pbmcgdG8gdGhlIGNvZGUgbGF0ZXIgdG8gcXVpY2tseSBzZWUgd2hhdCBmaWxlcyBhcmUgbmVlZGVkIGFzIGlucHV0IGFuZCB3aGF0IHdpbGwgYmUgcHJvZHVjZWQgYXMgb3V0cHV0LgpNb3JlIG9mdGVuIHRoYW4gbm90LCB0aGF0IHNvbWVib2R5IGlzIHlvdSEKClRoZSBnZW5lIGV4cHJlc3Npb24gZGF0YSB3ZXJlIHByb2Nlc3NlZCB0byBjcmVhdGUgYSBnZW5lLWJ5LWNlbGwgZXhwcmVzc2lvbiBtYXRyaXggb2YgY291bnRzIGZvciB1c2luZyBDZWxsIFJhbmdlciA2LjAuCldlIGhhdmUgcHJvdmlkZWQgdGhlIHJhdyBkYXRhIGRpcmVjdG9yeSwgYHJhd19mZWF0dXJlX2JjX21hdHJpeGAsIHdoaWNoIGlzIHVzdWFsbHkgcHJvZHVjZWQgYnkgQ2VsbCBSYW5nZXIgYW5kIHBsYWNlZCBpbiBpdHMgYG91dHNgIGRpcmVjdG9yeS4KVGhpcyBkaXJlY3RvcnkgdXN1YWxseSBjb250YWlucyB0aHJlZSBmaWxlczoKLSBgYmFyY29kZXMudHN2Lmd6YCwgYSB0YWJsZSBvZiB0aGUgY2VsbCBiYXJjb2RlcyB0aGF0IDEweCB1c2VzLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2x1bW5zIG9mIHRoZSBjb3VudCBtYXRyaXguCi0gYGZlYXR1cmVzLnRzdi5nemAsIGEgdGFibGUgb2YgdGhlIGZlYXR1cmVzIChnZW5lcyBpbiB0aGlzIGNhc2UpIGZvciB3aGljaCBleHByZXNzaW9uIHdhcyBxdWFudGlmaWVkLgpUaGlzIHdpbGwgdXN1YWxseSBhbHNvIGluY2x1ZGUgYSBiaXQgb2YgbWV0YWRhdGEgYWJvdXQgdGhlIGZlYXR1cmVzLCBpbmNsdWRpbmcgZ2VuZSBzeW1ib2xzIChpZiB0aGUgZmVhdHVyZXMgYXJlIGdlbmVzKSBhbmQgdGhlIHR5cGUgb2YgZGF0YSB0aGV5IHJlcHJlc2VudCAoZS5nLiwgZ2VuZSBleHByZXNzaW9uIG9yIGFudGlib2R5IGNhcHR1cmUpLgotIGBtYXRyaXgubXR4Lmd6YCwgVGhlIGNvdW50cyB0aGVtc2VsdmVzLCBzdG9yZWQgaW4gYSBzcGFyc2UgWyJNYXRyaXggRXhjaGFuZ2UiIGZvcm1hdF0oaHR0cHM6Ly9tYXRoLm5pc3QuZ292L01hdHJpeE1hcmtldC9mb3JtYXRzLmh0bWwpLgoKQ2VsbCBSYW5nZXIgd2lsbCBhbHNvIGV4cG9ydCB0aGVzZSBkYXRhIGluIGEgc2luZ2xlIGBIREY1YCBmb3JtYXQgZmlsZSB3aXRoIGEgYC5oNWAgZXh0ZW5zaW9uLCB3aGljaCBjYW4gYWxzbyBiZSBpbXBvcnRlZCB3aXRoIHRoZSBzYW1lIGNvbW1hbmRzIHdlIHdpbGwgdXNlIGJlbG93LgpIb3dldmVyLCB3ZSBoYXZlIGZvdW5kIHRoYXQgcHJvY2Vzc2luZyBsYXJnZSBgLmg1YCBmaWxlcyBpcyBvZnRlbiBfbXVjaF8gbGVzcyBlZmZpY2llbnQgaW4gUiwgc28gd2UgcHJlZmVyIHRvIHN0YXJ0IHdpdGggdGhlIG1hdHJpeCBmaWxlcyB3aGVuIHBvc3NpYmxlLgpJbiBwYXJ0aWN1bGFyLCB3ZSB3b3VsZCBub3QgcmVjb21tZW5kIHdvcmtpbmcgd2l0aCBgLmg1YCBmaWxlcyBmb3IgcmF3IGRhdGE7IHRoZSBmaWx0ZXJpbmcgc3RlcHMgd2Ugd2lsbCB1c2UgYmVsb3cgY2FuIHNvbWV0aW1lcyB0YWtlIGhvdXJzIHdoZW4gdXNpbmcgdGhvc2UgZmlsZXMgYXMgaW5wdXQuCgpXZSB3aWxsIGFsc28gbmVlZCBhIHRhYmxlIG9mIG1pdG9jaG9uZHJpYWwgZ2VuZXMsIHdoaWNoIHdlIGhhdmUgc3RvcmVkIGluIHRoZSBgZGF0YS9yZWZlcmVuY2UvYCBkaXJlY3RvcnkuCgpGaW5hbGx5LCB3ZSB3aWxsIHNldCB1cCB0aGUgb3VyIG91dHB1dCBkaXJlY3RvcnksIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IHlldCBleGlzdCwgYW5kIGRlZmluZSB0aGUgbmFtZSBmb3IgdGhlIGZpbGVzIHdlIHdpbGwgc2F2ZSBhZnRlciBhbGwgb2Ygb3VyIGluaXRpYWwgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KCmBgYHtyIGlucHV0cywgbGl2ZT1UUlVFfQojIElucHV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIG1haW4gZGF0YSBkaXJlY3RvcnkKZGF0YV9kaXIgPC0gZmlsZS5wYXRoKCJkYXRhIiwgImdsaW9ibGFzdG9tYS0xMHgiKQoKIyBQYXRoIHRvIHRoZSBDZWxsIFJhbmdlciBtYXRyaXggZGlyZWN0b3J5CnJhd19tYXRyaXhfZGlyIDwtIGZpbGUucGF0aChkYXRhX2RpciwgInJhd19mZWF0dXJlX2JjX21hdHJpeCIpCgojIHJlZmVyZW5jZSBkYXRhIGRpcmVjdG9yeQpyZWZfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJyZWZlcmVuY2UiKQoKIyBQYXRoIHRvIG1pdG9jaG9uZHJpYWwgZ2VuZXMgdGFibGUKbWl0b19maWxlIDwtIGZpbGUucGF0aChyZWZfZGlyLCAiaHNfbWl0b2Nob25kcmlhbF9nZW5lcy50c3YiKQpgYGAKCmBgYHtyIG91dHB1dHN9CiMgT3V0cHV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgRGlyZWN0b3J5IGFuZCBmaWxlIHRvIHNhdmUgb3V0cHV0Cm5vcm1hbGl6ZWRfZGlyIDwtIGZpbGUucGF0aChkYXRhX2RpciwgIm5vcm1hbGl6ZWQiKQoKIyBjcmVhdGUgdGhlIGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdCBleGlzdApmczo6ZGlyX2NyZWF0ZShub3JtYWxpemVkX2RpcikKCiMgb3V0cHV0IFJEUyBmaWxlIGZvciBub3JtYWxpemVkIGRhdGEKb3V0cHV0X3NjZV9maWxlIDwtIGZpbGUucGF0aChub3JtYWxpemVkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xpb2JsYXN0b21hX25vcm1hbGl6ZWRfc2NlLnJkcyIpCmBgYAoKCiMjIFJlYWRpbmcgQ2VsbCBSYW5nZXIgZGF0YQoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBQcmVwcm9jZXNzIGFuZCBJbXBvcnRdKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX3ByZXByb2Nlc3MucG5nKQoKV2hldGhlciB0aGUgMTB4IENlbGwgUmFuZ2VyIGRhdGEgaXMgaW4gTWF0cml4IEV4Y2hhbmdlIGZvcm1hdCBvciBpbiBhbiBIREY1IGZpbGUsIHdlIGNhbiB1c2UgdGhlIGByZWFkMTB4Q291bnRzKClgIGZ1bmN0aW9uIGZyb20gdGhlIGBEcm9wbGV0VXRpbHNgIHBhY2thZ2UgdG8gcmVhZCB0aGUgZGF0YSBpbnRvIFIgYW5kIGNyZWF0ZSBhIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0LgooVGhvdWdoIGFnYWluLCB3ZSBkbyBub3QgcmVjb21tZW5kIHVzaW5nIHRoZSBgLmg1YCBmaWxlIGlmIHlvdSBjYW4gYXZvaWQgaXQsIF9lc3BlY2lhbGx5XyBmb3IgcmF3ICh1bmZpbHRlcmVkKSBkYXRhLikKCklmIHlvdSB1c2VkIHNvbWV0aGluZyBvdGhlciB0aGFuIENlbGwgUmFuZ2VyIHRvIHByb2Nlc3MgdGhlIHJhdyBkYXRhLCB5b3Ugd291bGQgbmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgZnVuY3Rpb24gdG8gcmVhZCBpdCBpbiBhbmQgY3JlYXRlIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdC4KU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgZm9yIG90aGVyIGNvbW1vbiBkYXRhIGZvcm1hdHMgYXJlIGRpc2N1c3NlZCBpbiBbQ2hhcHRlciAzIG9mIE9TQ0FdIChodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE5L09TQ0EuaW50cm8vZ2V0dGluZy1zY3JuYS1zZXEtZGF0YXNldHMuaHRtbCNyZWFkaW5nLWNvdW50cy1pbnRvLXIpLgoKYGBge3IgcmVhZCBTQ0UsIGxpdmU9VFJVRX0KIyByZWFkIFNDRSBmcm9tIG1hdHJpeCBkaXJlY3RvcnkKcmF3X3NjZSA8LSBEcm9wbGV0VXRpbHM6OnJlYWQxMHhDb3VudHMoCiAgcmF3X21hdHJpeF9kaXIsCiAgY29sLm5hbWVzID0gVFJVRSAjIGVuc3VyZSBiYXJjb2RlcyBhcmUgc2V0IGFzIGNvbHVtbiBuYW1lcyBpbiB0aGUgU0NFIG9iamVjdAopCmBgYAoKTGV0J3MgbG9vayBhdCB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBhZnRlciByZWFkaW5nIGl0IGluOgoKYGBge3IgdmlldyBTQ0UsIGxpdmU9VFJVRX0KIyB2aWV3IFNDRSBvYmplY3QKcmF3X3NjZQpgYGAKCldlIGNhbiBzZWUgZnJvbSB0aGlzIHN1bW1hcnkgdGhhdCB0aGlzIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgKFNDRSkgb2JqZWN0IGNvbnRhaW5zIDM2LDYwMSByb3dzLCB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBmZWF0dXJlcyAoZ2VuZXMpIHRoYXQgd2VyZSBhbmFseXplZCwgYW5kIDczNCw0OTIgY29sdW1ucywgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgcG9zc2libGUgYmFyY29kZSB0YWdzIHRoYXQgd2VyZSB1c2VkIGluIHRoZSBleHBlcmltZW50LgpOb3RlIHRoYXQgbm90IGFsbCBvZiB0aGVzZSBiYXJjb2RlIHRhZ3Mgd2lsbCBoYXZlIGJlZW4gdXNlZCwgYW5kIG1hbnkgb2YgdGhlIGZlYXR1cmVzIG1heSBuZXZlciBoYXZlIGJlZW4gc2VlbiBlaXRoZXIuCk9uZSBvZiBvdXIgZmlyc3Qgc3RlcHMgd2lsbCBiZSB0byBmaWx0ZXIgb3V0IGJhcmNvZGVzIHRoYXQgd2VyZSBuZXZlciBzZWVuLCBvciB0aGF0IG1heSBoYXZlIG9ubHkgYmVlbiBzZWVuIGluIGEgZHJvcGxldCB0aGF0IGRpZCBub3QgY29udGFpbiBhIGNlbGwgKGFuICJlbXB0eSBkcm9wbGV0IikuCgojIyMgU3RydWN0dXJlIG9mIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdAoKSW4gYWRkaXRpb24gdG8gdGhlIG1haW4gYGNvdW50c2AgbWF0cml4LCBsaXN0ZWQgYXMgYW4gYGFzc2F5YCBpbiB0aGUgU0NFIHN1bW1hcnkgYWJvdmUsIHRoZSBTQ0Ugb2JqZWN0IGNhbiBjb250YWluIGEgbnVtYmVyIG9mIG90aGVyIHRhYmxlcyBhbmQgbWF0cmljZXMsIGVhY2ggc3RvcmVkIGluIGEgInNsb3QiIHdpdGggYSBwYXJ0aWN1bGFyIGZvcm1hdC4KVGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIHRoZSBvYmplY3QgY2FuIGJlIHNlZW4gaW4gdGhlIGZpZ3VyZSBiZWxvdywgd2hpY2ggY29tZXMgZnJvbSBhbiBbT1NDQSBJbnRyb2R1Y3Rpb24gY2hhcHRlcl0oaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xOS9PU0NBLmludHJvL3RoZS1zaW5nbGVjZWxsZXhwZXJpbWVudC1jbGFzcy5odG1sKS4KCiFbU3RydWN0dXJlIG9mIGEgU2luZ2xlQ2VsbEV4cGVyaW1lbnQgb2JqZWN0XShkaWFncmFtcy9TaW5nbGVDZWxsRXhwZXJpbWVudC5wbmcpCgpXZSBoYXZlIGp1c3QgbWVudGlvbmVkIHRoZSBtYWluIGBhc3NheWAgc2xvdCwgd2hpY2ggY29udGFpbnMgZnVsbCBtYXRyaWNlcyBvZiBkYXRhIChzdWNoIGFzIHRyYW5zY3JpcHQgY291bnRzKSB3aXRoIGVhY2ggcm93IGEgZmVhdHVyZSBhbmQgZWFjaCBjb2x1bW4gYSBjZWxsLgpUaGVyZSBhcmUgYWxzbyBhIGNvdXBsZSBvZiB0YWJsZXMgZm9yIG1ldGFkYXRhLCBhbmQgYSBzbG90IHRvIHN0b3JlIHJlZHVjZWQtZGltZW5zaW9uIHJlcHJlc2VudGF0aW9ucyAoZS5nLiwgUENBIGFuZC9vciBVTUFQKSBvZiB0aGUgZXhwcmVzc2lvbiBkYXRhLgoKV2UnbGwgc3RhcnQgd2l0aCB0aGUgYHJvd0RhdGFgIHNsb3QsIHdoaWNoIGlzIGEgdGFibGUgb2YgbWV0YWRhdGEgZm9yIGVhY2ggZmVhdHVyZSBpbiBvdXIgb2JqZWN0LgpGb3Igbm93IHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgZmVhdHVyZXMudHN2Lmd6YCBmaWxlIHRoYXQgd2UgZGlzY3Vzc2VkIGVhcmxpZXIuCklmIHdlIGhhZCByZWFkIHRoZSBkYXRhIGZyb20gc29tZXRoaW5nIG90aGVyIHRoYW4gQ2VsbCBSYW5nZXIgb3V0cHV0LCB3ZSBtaWdodCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgYnV0IGVhY2ggcm93IHdvdWxkIHN0aWxsIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgZmVhdHVyZSBvZiB0aGUgU0NFIG9iamVjdC4KCkxldCdzIGxvb2sgYXQgdGhpcyB0YWJsZSwgZXh0cmFjdGluZyBpdCBmcm9tIHRoZSBTQ0Ugb2JqZWN0IHdpdGggdGhlIGByb3dEYXRhKClgIGZ1bmN0aW9uIGFuZCB1c2luZyBgaGVhZCgpYCB0byB2aWV3IG9ubHkgdGhlIGZpcnN0IDYgcm93cy4KCmBgYHtyIHJvd2RhdGF9CiMgdmlldyByb3dEYXRhIChmZWF0dXJlcykKaGVhZChyb3dEYXRhKHJhd19zY2UpKQpgYGAKCllvdSBjYW4gc2VlIHRoYXQgdGhpcyB0YWJsZSBpbmNsdWRlcyBhbiBgSURgIGZvciBlYWNoIGZlYXR1cmUsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIEVuc2VtYmwgZ2VuZSBJRCwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBnZW5lIHN5bWJvbCBpbiB0aGUgYFN5bWJvbGAgY29sdW1uLgpGaW5hbGx5IHRoZXJlIGlzIGEgY29sdW1uIGZvciBgVHlwZWAsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBhbHdheXMgIkdlbmUgRXhwcmVzc2lvbiIsIGFzIGFsbCBvZiB0aGUgZmVhdHVyZXMgaW4gdGhpcyBkYXRhIHNldCBhcmUgZ2VuZXMuCklmIHRoZXJlIHdlcmUgYW5vdGhlciBtb2RhbGl0eSBvZiBkYXRhIHRoYXQgaGFkIGJlZW4gYXNzYXllZCBpbiB0aGlzIGV4cGVyaW1lbnQsIHRoZXJlIG1pZ2h0IGJlIG90aGVyIHZhbHVlcyBpbiB0aGlzIGNvbHVtbiwgc3VjaCBhcyAiQW50aWJvZHkgQ2FwdHVyZSIgZm9yIENJVEUtc2VxIGV4cGVyaW1lbnRzLgoKVGhlIHNlY29uZCBzbG90IGlzIHRoZSBgY29sRGF0YWAgdGFibGUsIHdoaWNoIG5vdyBjb3JyZXNwb25kcyB0byB0aGUgYGJhcmNvZGVzLnRzdi5nemAgZmlsZSwgY29udGFpbmluZyBvbmUgcm93IHBlciBjZWxsIGJhcmNvZGUsIG9yLCBtb3JlIGdlbmVyYWxseSwgb25lIHJvdyBwZXIgY29sdW1uIG9mIHRoZSBgY291bnRzYCBhc3NheS4KV2UgY2FuIGxvb2sgYXQgdGhpcyB0YWJsZSB1c2luZyB0aGUgYGNvbERhdGEoKWAgZnVuY3Rpb24gKGFuZCBgaGVhZCgpYCBhZ2FpbiB0byBwcmV2ZW50IHByaW50aW5nIHRoZSB3aG9sZSB0YWJsZSk6CgpgYGB7ciBjb2xkYXRhfQojIHZpZXcgY29sRGF0YSAoY2VsbCBiYXJjb2RlcykKaGVhZChjb2xEYXRhKHJhd19zY2UpKQpgYGAKCkhlcmUgd2Ugc2VlIHRoYXQgdGhlcmUgYXJlIGN1cnJlbnRseSB0d28gY29sdW1uczoKCi0gdGhlIGBTYW1wbGVgIGNvbHVtbiBoYXMgdGhlIHBhdGggb2YgdGhlIGZpbGUgdGhhdCB3ZSByZWFkIGluICh5b3UgbWF5IG5vdCBzZWUgdGhlIHdob2xlIHBhdGggaW4gdGhpcyBkaXNwbGF5KTsgdGhpcyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGFsbCByb3dzIGZyb20gYSBzaW5nbGUgc2FtcGxlLgotIHRoZSBgQmFyY29kZWAgY29sdW1uIGNvbnRhaW5zIHRoZSBzZXF1ZW5jZSB0aGF0IHdhcyB1c2VkIHRvIGlkZW50aWZ5IGVhY2ggcG90ZW50aWFsIGRyb3BsZXQgZm9yIHNlcXVlbmNpbmcgKGFuZCBhIG51bWVyaWMgdGFnLCBpbiB0aGlzIGNhc2UpLgpUaGVzZSB3aWxsIGJlIHVuaXF1ZSB3aXRoaW4gYSBzYW1wbGUuCgpBcyB3ZSBwcm9jZWVkIHRvIGNhbGN1bGF0ZSBwZXItY2VsbCBzdGF0aXN0aWNzLCB3ZSB3aWxsIGJlIGFkZGluZyBuZXcgZGF0YSB0byB0aGlzIHRhYmxlLgoKIyMgUXVhbGl0eSBjb250cm9sIGFuZCBmaWx0ZXJpbmcKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogUUMsIEZpbHRlciwgYW5kIE5vcm1hbGl6ZV0oZGlhZ3JhbXMvcm9hZG1hcF9zaW5nbGVfcWNfbm9ybS5wbmcpCgojIyMgRmlsdGVyaW5nIGVtcHR5IGRyb3BsZXRzCgpNb3N0IG9mIHRoZSBiYXJjb2RlcyBpbiBhbnkgZ2l2ZW4gMTB4IGV4cGVyaW1lbnQgd2lsbCBub3QgYmUgc2VlbiBhdCBhbGwsIHNvIG91ciBmaXJzdCBzdGVwIGNhbiBiZSB0byBmaWx0ZXIgdGhpcyByYXcgZGF0YSB0byBvbmx5IHRoZSBjZWxscyB3aGVyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdHJhbnNjcmlwdCB0aGF0IHdhcyBjb3VudGVkIHdpdGggdGhhdCBiYXJjb2RlLgoKVG8gZG8gdGhpcywgd2Ugd2lsbCB1c2UgdGhlIGBjb2xTdW1zKClgIGZ1bmN0aW9uIHRvIHF1aWNrbHkgYWRkIHVwIGFsbCB0aGUgY291bnRzIHRoYXQgY29ycmVzcG9uZCB0byBlYWNoIHBvc3NpYmxlIGNlbGwgYmFyY29kZSwgdGhlbiBmaWx0ZXIgb3VyIGByYXdfc2NlYCBkb3duIHRvIGp1c3QgdGhvc2UgY29sdW1ucyB3aGVyZSB0aGVyZSBhcmUgbm9uLXplcm8gdG90YWwgY291bnRzLgpXZSB3aWxsIG5lZWQgdG8gZXh0cmFjdCB0aGUgYGNvdW50c2AgbWF0cml4IGZyb20gb3VyIFNDRSBvYmplY3QsIHdoaWNoIHdlIGNhbiBkbyB1c2luZyB0aGUgYGNvdW50cygpYCBmdW5jdGlvbiwgY29udmVuaWVudGx5IGVub3VnaC4KCmBgYHtyIHJlbW92ZSB6ZXJvcywgbGl2ZT1UUlVFfQojIHN1bSBjb2x1bW5zIGZyb20gY291bnRzIG1hdHJpeApiYXJjb2RlX2NvdW50cyA8LSBjb2xTdW1zKGNvdW50cyhyYXdfc2NlKSkKCiMgZmlsdGVyIFNDRSBvYmplY3QgdG8gb25seSByb3dzIHdpdGggY291bnRzID4gMApyYXdfc2NlIDwtIHJhd19zY2VbLCB3aGljaChiYXJjb2RlX2NvdW50cyA+IDApXQpgYGAKCk5vdyB3ZSBjYW4gbG9vayBhdCBob3cgb3VyIFNDRSBvYmplY3QgaGFzIGNoYW5nZWQ6CgpgYGB7ciB6ZXJvLWZpbHRlcmVkIFNDRX0KcmF3X3NjZQpgYGAKCkJ1dCBiYXJjb2RlcyB3aXRoIHplcm8gY291bnRzIGFyZSBub3QgdGhlIG9ubHkgb25lcyB0aGF0IGNvcnJlc3BvbmQgdG8gZHJvcGxldHMgd2l0aG91dCBjZWxscyBpbiB0aGVtIQpFdmVuIGlmIGEgZHJvcGxldCBkb2VzIG5vdCBoYXZlIGEgY2VsbCBpbiBpdCwgdGhlcmUgd2lsbCBvZnRlbiBiZSBzcHVyaW91cyByZWFkcyBmcm9tIFJOQSBzZXF1ZW5jZXMgdGhhdCB3ZXJlIHByZXNlbnQgaW4gdGhlIGV4dHJhY2VsbHVsYXIgc29sdXRpb24sIHdoZXRoZXIgZnJvbSB0aGUgb3JpZ2luYWwgc2FtcGxlIG9yIGZyb20gY2VsbHMgdGhhdCB3ZXJlIGRhbWFnZWQgZHVyaW5nIHNpbmdsZS1jZWxsIGxpYnJhcnkgcHJlcGFyYXRpb24uCgpXZSBjb3VsZCBpZGVudGlmeSB0aGVzZSBiYXJjb2RlcyBzaW1wbHkgYXMgdGhvc2Ugd2l0aCBsb3cgdHJhbnNjcmlwdCBjb3VudHMuCk9yLCB3ZSBjYW4gYmUgYSBiaXQgbW9yZSBjbGV2ZXIhCldlIGNhbiBsb29rIGF0IHRoZSB0cmFuc2NyaXB0IGNvdW50cyBfZnJvbV8gdGhlIGxvd2VzdC1jb3VudCBkcm9wbGV0cyB0byBjcmVhdGUgYW4gZXhwZWN0ZWQgZGlzdHJpYnV0aW9uIG9mIHRyYW5zY3JpcHRzIGluIGRyb3BsZXRzIHRoYXQgZG9uJ3QgY29udGFpbiBjZWxscy4KVGhlbiB3ZSBjYW4gdGVzdCBlYWNoIGRyb3BsZXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGl0cyB0cmFuc2NyaXB0IGRpc3RyaWJ1dGlvbiBkZXZpYXRlcyBmcm9tIHRoYXQgZXhwZWN0YXRpb24uCklmIGl0IGRvZXMsIHRoZW4gd2UgaGF2ZSBwcmV0dHkgZ29vZCBldmlkZW5jZSB0aGF0IHRoZXJlIF9pc18gYSBjZWxsIGluIHRoZXJlLgoKVGhpcyB0ZXN0IHdhcyBmaXJzdCBwcm9wb3NlZCBieSBbTHVuIF9ldCBhbC5fICgyMDE5KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExODYvczEzMDU5LTAxOS0xNjYyLXkpIGFuZCBpbXBsZW1lbnRlZCBhcyBgZW1wdHlEcm9wcygpYCBpbiB0aGUgYERyb3BsZXRVdGlsc2AgcGFja2FnZS4KVGhpcyBtZXRob2Qgd2FzIHRoZW4gYWRvcHRlZCwgd2l0aCBzb21lIG1vZGlmaWNhdGlvbnMsIGFzIHRoZSBkZWZhdWx0IGNlbGwgZmlsdGVyaW5nIG1ldGhvZCB1c2VkIGJ5IENlbGwgUmFuZ2VyLgpIZXJlIHdlIHdpbGwgdXNlIHRoZSBbYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgIGZ1bmN0aW9uXShodHRwczovL3JkcnIuaW8vZ2l0aHViL01hcmlvbmlMYWIvRHJvcGxldFV0aWxzL21hbi9lbXB0eURyb3BzQ2VsbFJhbmdlci5odG1sKSB0byBwZXJmb3JtIGZpbHRlcmluZyB0aGF0IG1vcmUgY2xvc2VseSBtYXRjaGVzIHRoZSBDZWxsIFJhbmdlciBpbXBsZW1lbnRhdGlvbi4KCgpgYGB7ciBjYWxjdWxhdGUgZHJvcGxldCBzdGF0cywgbGl2ZT1UUlVFfQojIGNyZWF0ZSBhIHRhYmxlIG9mIHN0YXRpc3RpY3MgdXNpbmcgZW1wdHlEcm9wc0NlbGxSYW5nZXIKZHJvcGxldF9kZiA8LSBEcm9wbGV0VXRpbHM6OmVtcHR5RHJvcHNDZWxsUmFuZ2VyKHJhd19zY2UpCmBgYAoKTW9zdCB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYE5BYCwgYmVjYXVzZSBpbmRpdmlkdWFsIHN0YXRpc3RpY3Mgd2VyZSBub3QgY2FsY3VsYXRlZCBmb3IgdGhlIGxvdy1jb3VudCBkcm9wbGV0cyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYmFja2dyb3VuZCBkaXN0cmlidXRpb24uCihNb3N0IGRyb3BsZXRzIGRvbid0IGhhdmUgY2VsbHMsIHNvIHRoaXMgbWFrZXMgc29tZSBzZW5zZSEpCgpXZSBjYW4gbG9vayBhdCBqdXN0IHRoZSByb3dzIHdpdGhvdXQgYE5BYCB2YWx1ZXMgYnkgc2VsZWN0ZWQgdGhlIG9uZXMgd2hlcmUgdGhlIEZEUiAod2hpY2ggd2Ugd2lsbCB1c2UgYWdhaW4gc29vbiksIGlzIG5vdCBgTkFgLgoKYGBge3IgZHJvcGxldCBzdGF0c30KIyB2aWV3IHJvd3Mgd2hlcmUgRkRSIGlzIG5vdCBgTkFgCmRyb3BsZXRfZGZbIWlzLm5hKGRyb3BsZXRfZGYkRkRSKSwgXQpgYGAKWW91IHdpbGwgbm90aWNlIHRoYXQgc29tZSBjZWxscyB3aXRoIGhpZ2ggY291bnRzIGFsc28gaGF2ZSBgTkFgIHZhbHVlcyBmb3IgbWFueSBzdGF0aXN0aWNzLgpJbiB0aG9zZSBjYXNlcywgYE5BYCB2YWx1ZXMgYXJlIGFjdHVhbGx5IHByZXNlbnQgX2JlY2F1c2VfIG9mIHRoZSBoaWdoIGNvdW50cyAtIGBlbXB0eURyb3BzQ2VsbFJhbmdlcigpYCBhdXRvbWF0aWNhbGx5IGFzc3VtZWQgY2VsbHMgd2VyZSBwcmVzZW50LCBzbyB0aGV5IHdlcmUgYWxzbyBub3QgdGVzdGVkLgoKTm93IHdlIGNhbiBmaWx0ZXIgb3VyIGByYXdfc2NlYCBvYmplY3QgX2J5IGNvbHVtbl8gdG8gb25seSBrZWVwIHRoZSBjZWxscyB3aXRoIGEgc21hbGwgRkRSOiB0aG9zZSB0aGF0IGFyZSBxdWl0ZSB1bmxpa2VseSB0byBiZSBlbXB0eSBkcm9wbGV0cy4KCmBgYHtyIGZpbHRlciBlbXB0eWRyb3BzLCBsaXZlPVRSVUV9CiMgZmlsdGVyIGRyb3BsZXRzIHVzaW5nIGB3aGljaGAgdG8gcHJldmVudCBOQSB0cm91YmxlCmNlbGxzX3RvX3JldGFpbiA8LSB3aGljaChkcm9wbGV0X2RmJEZEUiA8IDAuMDEpCmZpbHRlcmVkX3NjZSA8LSByYXdfc2NlWywgY2VsbHNfdG9fcmV0YWluXQpgYGAKCkhvdyBtYW55IGNlbGxzIGRvIHdlIGhhdmUgbm93PwoKYGBge3IgZmlsdGVyZWQgc3VtbWFyeX0KZmlsdGVyZWRfc2NlCmBgYAoKIyMjIEFkZGl0aW9uYWwgcXVhbGl0eSBjb250cm9sCgpJbiBhZGRpdGlvbiB0byBmaWx0ZXJpbmcgb3V0IGVtcHR5IGRyb3BsZXRzLCB3ZSBhbHNvIHdpbGwgd2FudCB0byBmaWx0ZXIgb3V0IGNlbGxzIHRoYXQgbWF5IGhhdmUgYmVlbiBkYW1hZ2VkIGR1cmluZyBsaWJyYXJ5IHByZXBhcmF0aW9uLgpUaGVzZSB3aWxsIG9mdGVuIGJlIGNoYXJhY3Rlcml6ZWQgYnkgYSBoaWdoIHByb3BvcnRpb24gb2YgbWl0b2Nob25kcmlhbCB0cmFuc2NyaXB0cyBhbmQgYSBzbWFsbGVyIG92ZXJhbGwgbnVtYmVyIG9mIHVuaXF1ZSB0cmFuc2NyaXB0cy4KV2hlbiBhIGNlbGwgcnVwdHVyZXMsIGN5dG9wbGFzbWljIHRyYW5zY3JpcHRzIHdpbGwgbGVhayBvdXQsIGJ1dCBtaXRvY2hvbmRyaWFsIHRyYW5zY3JpcHRzLCBzdGlsbCBwcm90ZWN0ZWQgYnkgdGhlIG1pdG9jaG9uZHJpYWwgbWVtYnJhbmUsIG1heSByZW1haW4uCkFzIGEgY29uc2VxdWVuY2UsIHRoZXJlIHdpbGwgYmUgYW4gb3Zlci1hYnVuZGFuY2Ugb2YgbWl0b2Nob25kcmlhbCByZWFkcywgYW5kIGZld2VyIHVuaXF1ZSB0cmFuc2NyaXB0cyBleHByZXNzZWQuCgpPdXIgZmlyc3Qgc3RlcCB0aGVuLCBpcyBjcmVhdGUgYSB2ZWN0b3Igb2YgdGhlIG1pdG9jaG9uZHJpYWwgZ2VuZXMgdGhhdCBhcmUgcHJlc2VudCBpbiBvdXIgZGF0YXNldC4KVGhlIG1pdG9jaG9uZHJpYWwgZmlsZSB3ZSBkZWZpbmVkIGR1cmluZyBzZXR1cCAoYG1pdG9fZmlsZWApIGlzIGEgVFNWIGZpbGUgY29udGFpbmluZyBhbGwgb2YgdGhlIGh1bWFuIG1pdG9jaG9uZHJpYWwgZ2VuZXMgd2l0aCBhZGRpdGlvbmFsIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIGVhY2ggZ2VuZSwgc3VjaCBhcyB0aGUgZ2VuZSBsb2NhdGlvbiBhbmQgYWx0ZXJuYXRpdmUgbmFtZXMuCihGb3IgbW9yZSBkZXRhaWwgb24gdGhlIHN0ZXBzIHdlIHRvb2sgdG8gY3JlYXRlIHRoaXMgZmlsZSwgeW91IGNhbiBsb29rIGF0IFtvbmUgb2Ygb3VyIHNldHVwIG5vdGVib29rc10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvdHJhaW5pbmctbW9kdWxlcy9ibG9iL21hc3Rlci9zY1JOQS1zZXEtYWR2YW5jZWQvc2V0dXAvbWl0b19nZW5lX2xpc3RzLlJtZCkpCgpBbGwgd2UgbmVlZCBub3cgaXMgdGhlIGBnZW5lX2lkYCwgYW5kIG9ubHkgZm9yIHRoZSBnZW5lcyB0aGF0IGFyZSBwcmVzZW50IGluIG91ciBTQ0UsIHNvIHdlIHdpbGwgZG8gc29tZSBmaWx0ZXJpbmcgd2l0aCBgZHBseXJgIHRvIHB1bGwgb3V0IGEgdmVjdG9yIHdpdGgganVzdCB0aG9zZSBpZHMuCgpgYGB7ciBnZXQgbWl0b2Nob25kcmlhbCBnZW5lc30KIyByZWFkIGluIGEgdGFibGUgb2YgbWl0b2Nob25kcmlhbCBnZW5lcyBhbmQgZXh0cmFjdCBpZHMKbWl0b19nZW5lcyA8LSByZWFkcjo6cmVhZF90c3YobWl0b19maWxlKSB8PgogICMgZmlsdGVyIHRvIG9ubHkgdGhlIGdlbmVzIHRoYXQgYXJlIGZvdW5kIGluIG91ciBkYXRhc2V0CiAgZHBseXI6OmZpbHRlcihnZW5lX2lkICVpbiUgcm93bmFtZXMoZmlsdGVyZWRfc2NlKSkgfD4KICAjIGNyZWF0ZSBhIHZlY3RvciBmcm9tIHRoZSBnZW5lX2lkIGNvbHVtbgogIGRwbHlyOjpwdWxsKGdlbmVfaWQpCmBgYAoKIyMjIENhbGN1bGF0aW5nIHN1bW1hcnkgUUMgc3RhdGlzdGljcwoKV2UgY2FuIG5vdyB1c2UgdGhlIGBzY3V0dGxlYCBmdW5jdGlvbiBgYWRkUGVyQ2VsbFFDKClgIHRvIGNhbGN1bGF0ZSBzb21lIHN0YXRpc3RpY3MgYmFzZWQgb24gdGhlIGNvdW50cyBtYXRyaXgsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGBjb2xEYXRhYCB0YWJsZS4KCkluIGFkZGl0aW9uIHRvIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3MgbGlrZSB0aGUgdG90YWwgcmVhZCBjb3VudCBmb3IgZWFjaCBjZWxsIGFuZCB0aGUgbnVtYmVyIG9mIHRyYW5zY3JpcHRzIHRoYXQgYXJlIGRldGVjdGVkLCB3ZSBjYW4gYWxzbyBjYWxjdWxhdGUgdGhvc2Ugc3RhdGlzdGljcyBmb3IgZGVmaW5lZCBzdWJzZXRzIG9mIGdlbmVzLgpJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdXNlIG91ciBgbWl0b19nZW5lc2AgdmVjdG9yIHRvIGRlZmluZSBhIHN1YnNldCBjYWxsZWQgYG1pdG9gLgpUaGUgYG1pdG9gIG5hbWUgaXMgaW1wb3J0YW50IGluIHRoYXQgaXQgaXMgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIGV4cGVjdGVkIGJ5IGEgbGF0ZXIgZnVuY3Rpb24uCihXZSBjb3VsZCBkZWZpbmUgbW9yZSBzdWJzZXRzLCBidXQgZm9yIG5vdyB0aGlzIG9uZSB3aWxsIGRvLikKCmBgYHtyIHBlciBjZWxsIFFDLCBsaXZlPVRSVUV9CmZpbHRlcmVkX3NjZSA8LSBzY3V0dGxlOjphZGRQZXJDZWxsUUMoZmlsdGVyZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNldHMgPSBsaXN0KG1pdG8gPSBtaXRvX2dlbmVzKSkKYGBgCgpOb3cgd2UgY2FuIGxvb2sgYXQgdGhlIGNvbERhdGEgdG8gc2VlIHdoYXQgd2FzIGFkZGVkOgoKYGBge3IgdmlldyBjb2xEYXRhIHN0YXRzfQpoZWFkKGNvbERhdGEoZmlsdGVyZWRfc2NlKSkKYGBgCgpXZSBjYW4gYWxzbyBwbG90IHNvbWUgb2YgdGhlc2Ugc3RhdGlzdGljcywgaGVyZSB1c2luZyB0aGUgYHBsb3RNZXRyaWNzKClgIGZ1bmN0aW9uIGZyb20gdGhlIGBtaVFDYCBwYWNrYWdlIHRvIHBsb3QgdGhlIHBlcmNlbnQgb2YgcmVhZHMgdGhhdCBhcmUgbWl0b2Nob25kcmlhbCAodGhlIGBzdWJzZXRzX21pdG9fcGVyY2VudGAgY29sdW1uKSBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgdW5pcXVlIGdlbmVzIGRldGVjdGVkICh0aGUgYGRldGVjdGVkYCBjb2x1bW4pIGZvciBlYWNoIGNlbGwuCgpgYGB7ciBtaVFDIHBsb3RNZXRyaWNzfQojIHVzZSBtaVFDOjpwbG90TWV0cmljcygpCm1pUUM6OnBsb3RNZXRyaWNzKGZpbHRlcmVkX3NjZSkgKyB0aGVtZV9idygpCmBgYAoKV2UgY2FuIHNlZSB0aGF0IHRoZXJlIGlzIGEgcmFuZ2Ugb2YgbWl0b2Nob25kcmlhbCBwZXJjZW50YWdlcywgYW5kIGl0IGRvZXMgYWxzbyBzZWVtIHRoYXQgY2VsbHMgd2l0aCBoaWdoIHBlcmNlbnRhZ2VzIG9mIG1pdG9jaG9uZHJpYWwgZ2VuZXMgZG9uJ3Qgc2VlbSB0byBjb250YWluIHZlcnkgbWFueSB1bmlxdWUgZ2VuZXMuCgpIb3cgZG8gd2UgZmlsdGVyIHdpdGggdGhpcyBpbmZvcm1hdGlvbj8KT25lIG9wdGlvbiBpcyB0byBkZWZpbmUgYSBjdXRvZmYgZm9yIHRoZSBtaXRvY2hvbmRyaWFsIHBlcmNlbnRhZ2UgYWJvdmUgd2hpY2ggd2UgY2FsbCBhIGNlbGwgY29tcHJvbWlzZWQgYW5kIGV4Y2x1ZGUgaXQgZnJvbSBmdXJ0aGVyIGFuYWx5c2lzLgpIb3dldmVyLCBjaG9vc2luZyB0aGF0IGN1dG9mZiBjYW4gYmUgYSBiaXQgZnJhdWdodCwgYXMgdGhlIGV4cGVjdGVkIHBlcmNlbnRhZ2Ugb2YgbWl0b2Nob25kcmlhbCByZWFkcyBjYW4gdmFyeSBkZXBlbmRpbmcgb24gdGhlIGNlbGwgdHlwZSBhbmQgbGlicmFyeSBwcmVwYXJhdGlvbiBtZXRob2RzLgpTbyBpdCBtaWdodCBiZSBuaWNlIHRvIGhhdmUgYSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoYXQgY3V0b2ZmIGZyb20gdGhlIGRhdGEgaXRzZWxmLgoKIyMjIEZpbHRlcmluZyBjb21wcm9taXNlZCBjZWxscwoKRGV0ZXJtaW5pbmcgbWl0b2Nob25kcmlhbCBjdXRvZmZzIGlzIGV4YWN0bHkgd2hhdCB0aGUgYG1pUUNgIHBhY2thZ2UgZG9lcyAoW0hpcHBlbiBfZXQgYWwuXyAyMDIxXShodHRwczovL2RvaS5vcmcvMTAuMTM3MS9qb3VybmFsLnBjYmkuMTAwOTI5MCkpIQpJbiB0cnV0aCwgaXQgZG9lcyBzb21ldGhpbmcgcG9zc2libHkgZXZlbiBhIGJpdCBiZXR0ZXI6IGl0IGZpdHMgYSBtaXh0dXJlIG1vZGVsIHRvIHRoZSBkYXRhIHRoYXQgY29uc2lzdHMgb2YgZGlzdHJpYnV0aW9ucyBvZiBoZWFsdGh5IGNlbGxzIGFuZCBjb21wcm9taXNlZCBjZWxscy4KVGhlbiB3ZSBjYW4gY2FsY3VsYXRlIHdoZXRoZXIgZWFjaCBjZWxsIGlzIG1vcmUgbGlrZWx5IHRvIGJlbG9uZyB0byB0aGUgaGVhbHRoeSBvciBjb21wcm9taXNlZCBkaXN0cmlidXRpb24uCldlIGNhbiB0aGVuIGV4Y2x1ZGUgdGhlIGNlbGxzIHRoYXQgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGNvbXByb21pc2VkLgoKVG8gdXNlIGBtaVFDYCwgd2UgZmlyc3QgZml0IGEgbW9kZWwgdG8gdGhlIGRhdGEgaW4gb3VyIFNDRSBvYmplY3Q6CgpgYGB7ciBtaVFDIG1vZGVsLCBsaXZlPVRSVUV9CiMgZml0IHRoZSBtaVFDIG1vZGVsCm1pcWNfbW9kZWwgPC0gbWlRQzo6bWl4dHVyZU1vZGVsKGZpbHRlcmVkX3NjZSkKYGBgCgpOb3cgd2UgY2FuIHBsb3QgdGhlIG1vZGVsIHJlc3VsdHMgdXNpbmcgdGhlIGBwbG90TW9kZWwoKWAgZnVuY3Rpb24gdG8gc2VlIGhvdyBpdCBjb3JyZXNwb25kcyB0byBvdXIgZGF0YS4KV2Ugc2hvdWxkIGV4cGVjdCB0byBzZWUgdHdvIGZpdCBsaW5lczoKCi0gT25lIGxpbmUgd2lsbCBjb3JyZXNwb25kIHRoZSB0aGUgImhlYWx0aHkiIGNlbGxzIGFuZCBzaG91bGQgc2hvdyBsaXR0bGUgdG8gbm8gcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiB1bmlxdWUgZ2VuZXMgZGV0ZWN0ZWQgYW5kIHRoZSBtaXRvY2hvbmRyaWFsIHBlcmNlbnRhZ2UuCi0gQnkgY29udHJhc3QsIHRoZSBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gImNvbXByb21pc2VkIiBjZWxscyB3aWxsIHNob3cgYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBnZW5lcyBkZXRlY3RlZCBhbmQgdGhlIG1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZS4KClRoaXMgcGxvdCB3aWxsIGFsc28gc2hvdywgZm9yIGVhY2ggY2VsbCwgdGhlIHBvc3RlcmlvciBwcm9iYWJpbGl0eSB0aGF0IHRoZSBjZWxsIGlzIGRlcml2ZWQgZnJvbSB0aGUgY29tcHJvbWlzZWQgZGlzdHJpYnV0aW9uOyBhIGhpZ2hlciBzY29yZSBpbmRpY2F0ZXMgdGhhdCBhIGNlbGwgaXMgbW9yZSBsaWtlbHkgdG8gYmUgY29tcHJvbWlzZWQuCgpJdCBpcyBhbHNvIGNyaXRpY2FsIHRvIG5vdGUgdGhhdCB0aGlzIG1vZGVsIGNhbiBfYW5kIGRvZXNfIGZhaWwgYXQgdGltZXMuClBsb3R0aW5nIHRoZSByZXN1bHRzIGFzIHdlIGhhdmUgZG9uZSBoZXJlIGlzIG5vdCBhIHN0ZXAgdG8gc2tpcC4KKipBbHdheXMgbG9vayBhdCB5b3VyIGRhdGEhKioKCmBgYHtyIG1pUUMgcGxvdE1vZGVsLCBsaXZlPVRSVUV9CiMgcGxvdCB0aGUgbWlRQyBtb2RlbAptaVFDOjpwbG90TW9kZWwoZmlsdGVyZWRfc2NlLCBtaXFjX21vZGVsKSArCiAgdGhlbWVfYncoKQpgYGAKCldlIGNhbiBub3cgZmlsdGVyIG91ciBkYXRhIGJhc2VkIG9uIHRoZSBwcm9iYWJpbGl0eSBjb21wcm9taXNlZCBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIG1vZGVsLgpCdXQgYmVmb3JlIHdlIGRvIHRoYXQsIHdlIG1pZ2h0IHdhbnQgdG8gcXVpY2tseSBwbG90IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGZpbHRlcmVkIG91dCB3aXRoIGEgZ2l2ZW4gY3V0b2ZmLCB1c2luZyB0aGUgYHBsb3RGaWx0ZXJpbmcoKWAgZnVuY3Rpb24uClRoZSBkZWZhdWx0IGlzIHRvIGV4Y2x1ZGUgY2VsbHMgdGhhdCBoYXZlIGEgcG9zdGVyaW9yIHByb2JhYmlsaXR5IG9mIDAuNzUgb3IgZ3JlYXRlciBvZiBiZWluZyBjb21wcm9taXNlZC4KV2Ugc3RpY2sgd2l0aCB0aGF0IGRlZmF1bHQsIGJ1dCBmb3IgY2xhcml0eSwgd2Ugd2lsbCBhbHNvIGluY2x1ZGUgaXQgaW4gb3VyIGNvZGUhCgoKYGBge3IgbWlRQyBwbG90RmlsdGVyaW5nfQojIGxvb2sgYXQgbWlRQyBmaWx0ZXJpbmcKbWlRQzo6cGxvdEZpbHRlcmluZyhmaWx0ZXJlZF9zY2UsIG1pcWNfbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgcG9zdGVyaW9yX2N1dG9mZiA9IDAuNzUpICsKICB0aGVtZV9idygpCmBgYAoKSW4gdGhpcyBjYXNlLCB0aGUgbGluZSBiZXR3ZWVuIHRoZSBjZWxscyB0byBiZSBrZXB0IGFuZCB0aG9zZSB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBzZWVtcyB0byBjb3JyZXNwb25kIHRvIGEgbWl0b2Nob25kcmlhbCBwZXJjZW50YWdlIG9mIGFib3V0IDEyLjUlLCBidXQgbm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgYWx3YXlzIGJlIGNvbnN0YW50LgpUaGUgY3V0b2ZmIHBvaW50IGNhbiB2YXJ5IGZvciBkaWZmZXJlbnQgbnVtYmVycyBvZiB1bmlxdWUgZ2VuZXMgd2l0aGluIGEgc2FtcGxlLCBhbmQgaXQgd2lsbCBjZXJ0YWlubHkgdmFyeSBhbW9uZyBzYW1wbGVzIQoKQXQgdGhpcyBwb2ludCwgd2UgY2FuIHBlcmZvcm0gdGhlIGFjdHVhbCBmaWx0ZXJpbmcgdXNpbmcgdGhlIGBmaWx0ZXJDZWxscygpYCBmdW5jdGlvbiwgZ2l2aW5nIHVzIGEgZnVydGhlciBmaWx0ZXJlZCBTQ0Ugb2JqZWN0LgoKYGBge3IgbWlRQyBmaWx0ZXJjZWxscywgbGl2ZT1UUlVFfQojIHBlcmZvcm0gbWlRQyBmaWx0ZXJpbmcKcWNmaWx0ZXJlZF9zY2UgPC0gbWlRQzo6ZmlsdGVyQ2VsbHMoZmlsdGVyZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IG1pcWNfbW9kZWwpCmBgYAoKIyMjIyBPbmUgbW9yZSBmaWx0ZXI6IHVuaXF1ZSBnZW5lIGNvdW50CgpXaGlsZSB0aGUgbWlRQyBmaWx0ZXJpbmcgaXMgcHJldHR5IGdvb2QsIHlvdSBtYXkgaGF2ZSBub3RpY2VkIHRoYXQgaXQgc3RpbGwgbGVmdCBzb21lIGNlbGxzIHRoYXQgaGFkIHZlcnkgbG93IG51bWJlcnMgb2YgdW5pcXVlIGdlbmVzLgpXaGlsZSB0aGVzZSBjZWxscyBtYXkgbm90IGJlIGNvbXByb21pc2VkLCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGVtIGlzIGFsc28gbm90IGxpa2VseSB0byBiZSB1c2VmdWwsIHNvIHdlIHdpbGwgZmlsdGVyIHRob3NlIGFzIHdlbGwuCldlIHdpbGwgb25seSBrZWVwIGNlbGxzIHRoYXQgaGF2ZSBhdCBsZWFzdCAyMDAgdW5pcXVlIGdlbmVzLgoKYGBge3IgdW5pcXVlIGN1dG9mZiwgbGl2ZT1UUlVFfQojIGZpbHRlciBjZWxscyBieSB1bmlxdWUgZ2VuZSBjb3VudCAoYGRldGVjdGVkYCkKcWNmaWx0ZXJlZF9zY2UgPC0gcWNmaWx0ZXJlZF9zY2VbLCB3aGljaChxY2ZpbHRlcmVkX3NjZSRkZXRlY3RlZCA+PSAyMDApXQpxY2ZpbHRlcmVkX3NjZQpgYGAKCgojIyBOb3JtYWxpemF0aW9uCgpOb3cgdGhhdCB3ZSBoYXZlIGRvbmUgb3VyIGZpbHRlcmluZywgd2UgY2FuIHN0YXJ0IGFuYWx5emluZyB0aGUgZXhwcmVzc2lvbiBjb3VudHMgZm9yIHRoZSByZW1haW5pbmcgY2VsbHMuCgpUaGUgbmV4dCBzdGVwIGF0IHRoaXMgcG9pbnQgaXMgdG8gY29udmVydCB0aGUgcmF3IGNvdW50cyBpbnRvIGEgbWVhc3VyZSB0aGF0IGFjY291bnRzIGZvciBkaWZmZXJlbmNlcyBpbiBzZXF1ZW5jaW5nIGRlcHRoIGJldHdlZW4gY2VsbHMsIGFuZCB0byBjb252ZXJ0IHRoZSBkaXN0cmlidXRpb24gb2YgZXhwcmVzc2lvbiB2YWx1ZXMgZnJvbSB0aGUgc2tld2VkIGRpc3RyaWJ1dGlvbiB3ZSBleHBlY3QgdG8gc2VlIGluIHJhdyBjb3VudHMgdG8gb25lIHRoYXQgaXMgbW9yZSBub3JtYWxseSBkaXN0cmlidXRlZC4KCldlIHdpbGwgZG8gdGhpcyB1c2luZyBmdW5jdGlvbnMgZnJvbSB0aGUgYHNjcmFuYCBhbmQgYHNjdXR0bGVgIHBhY2thZ2VzLgpUaGUgcHJvY2VkdXJlIHdlIHdpbGwgdXNlIGhlcmUgaXMgZGVyaXZlZCBmcm9tIHRoZSBbT1NDQSBjaGFwdGVyIG9uIG5vcm1hbGl6YXRpb25dKGh0dHA6Ly9iaW9jb25kdWN0b3Iub3JnL2Jvb2tzLzMuMTkvT1NDQS5iYXNpYy9ub3JtYWxpemF0aW9uLmh0bWwjbm9ybWFsaXphdGlvbi1ieS1kZWNvbnZvbHV0aW9uKS4KVGhlIGlkZWEgaXMgdGhhdCB0aGUgdmFyeWluZyBleHByZXNzaW9uIHBhdHRlcm5zIHRoYXQgZGlmZmVyZW50IGNlbGwgdHlwZXMgZXhoaWJpdCB3aWxsIGFmZmVjdCB0aGUgc2NhbGluZyBmYWN0b3JzIHRoYXQgd2Ugd291bGQgYXBwbHkuClRvIGFjY291bnQgZm9yIHRoYXQgdmFyaWF0aW9uLCB3ZSBmaXJzdCBkbyBhIHJvdWdoIGNsdXN0ZXJpbmcgb2YgY2VsbHMgYnkgdGhlaXIgZXhwcmVzc2lvbiB3aXRoIGBzY3Jhbjo6cXVpY2tDbHVzdGVyKClgLCB0aGVuIHVzZSB0aGF0IGNsdXN0ZXJpbmcgdG8gY2FsY3VsYXRlIHRoZSBzY2FsaW5nIGZhY3RvciBmb3IgZWFjaCBjZWxsIHdpdGhpbiB0aGUgY2x1c3RlcnMgdXNpbmcgYHNjcmFuOjpjb21wdXRlU3VtRmFjdG9ycygpYC4KRmluYWxseSwgd2UgYXBwbHkgdGhlIHNjYWxpbmcgZmFjdG9yIHRvIHRoZSBleHByZXNzaW9uIHZhbHVlcyBmb3IgZWFjaCBjZWxsIGFuZCBjYWxjdWxhdGUgdGhlIGxvZy1zY2FsZWQgZXhwcmVzc2lvbiB2YWx1ZXMgdXNpbmcgdGhlIGBzY3V0dGxlOjpsb2dOb3JtQ291bnRzKClgIGZ1bmN0aW9uLgoKYGBge3Igbm9ybWFsaXphdGlvbiwgbGl2ZT1UUlVFfQojIFBlcmZvcm0gcm91Z2ggY2x1c3RlcmluZwpxY2x1c3QgPC0gc2NyYW46OnF1aWNrQ2x1c3RlcihxY2ZpbHRlcmVkX3NjZSkKCiMgdXNlIGNsdXN0ZXJzIHRvIGNvbXB1dGUgc2NhbGluZyBmYWN0b3JzIGFuZCBhZGQgdG8gU0NFIG9iamVjdApxY2ZpbHRlcmVkX3NjZSA8LSBzY3Jhbjo6Y29tcHV0ZVN1bUZhY3RvcnMocWNmaWx0ZXJlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVycyA9IHFjbHVzdCkKCiMgcGVyZm9ybSBub3JtYWxpemF0aW9uIHVzaW5nIHNjYWxpbmcgZmFjdG9ycwojIGFuZCBzYXZlIGFzIGEgbmV3IFNDRSBvYmplY3QKbm9ybWFsaXplZF9zY2UgPC0gc2N1dHRsZTo6bG9nTm9ybUNvdW50cyhxY2ZpbHRlcmVkX3NjZSkKYGBgCgpUaGlzIGNyZWF0ZXMgYSBuZXcgImFzc2F5IiBpbiB0aGUgYG5vcm1hbGl6ZWRfc2NlYCBvYmplY3QsIGBsb2djb3VudHNgLCB3aGljaCBjb250YWlucyB0aGUgbm9ybWFsaXplZCBjb3VudCB2YWx1ZXMgZm9yIGVhY2ggY2VsbCBhbmQgZ2VuZS4KKFRoZSBkYXRhIGhlcmUgYXJlIG5vdCBfYWN0dWFsbHlfIHRoZSBsb2cgb2YgdGhlIGNvdW50cywgc2luY2Ugd2UgYWxzbyBhcHBsaWVkIHRoZSBzY2FsaW5nIGZhY3RvcnMsIGJ1dCB0aGF0IG5hbWUgaXMgdXNlZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLikKCkxldCdzIHRha2UgYSBsb29rOgoKYGBge3Igbm9ybWFsaXplZCBzY2V9Cm5vcm1hbGl6ZWRfc2NlCmBgYAoKIyMgRGltZW5zaW9uIHJlZHVjdGlvbgoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBEaW1lbnNpb24gcmVkdWN0aW9uXShkaWFncmFtcy9yb2FkbWFwX3NpbmdsZV9kaW1lbnNpb25fcmVkdWN0aW9uLnBuZykKCk5vdyB0aGF0IHdlIGhhdmUgbm9ybWFsaXplZCBleHByZXNzaW9uIHZhbHVlcywgd2Ugd291bGQgbGlrZSB0byBwcm9kdWNlIHNvbWUgcmVkdWNlZC1kaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBkYXRhLgpUaGVzZSB3aWxsIGFsbG93IHVzIHRvIHBlcmZvcm0gc29tZSBkb3duc3RyZWFtIGNhbGN1bGF0aW9ucyBtb3JlIHF1aWNrbHksIHJlZHVjZSBzb21lIG9mIHRoZSBub2lzZSBpbiB0aGUgZGF0YSwgYW5kIGFsbG93IHVzIHRvIHZpc3VhbGl6ZSBvdmVyYWxsIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2VsbHMgbW9yZSBlYXNpbHkgKHRob3VnaCB3aXRoIG1hbnkgY2F2ZWF0cyEpLgoKIyMjIFNlbGVjdGluZyBoaWdobHkgdmFyaWFibGUgZ2VuZXMKCldoaWxlIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIHVzaW5nIGFsbCBvZiB0aGUgZ2VuZXMgdGhhdCB3ZSBoYXZlIGFzc2F5ZWQsIGluIHByYWN0aWNlIG1vc3Qgb2YgdGhlIGdlbmVzIHdpbGwgaGF2ZSB2ZXJ5IGxpdHRsZSB2YXJpYXRpb24gaW4gZXhwcmVzc2lvbiwgc28gZG9pbmcgc28gd2lsbCBub3QgcHJvdmlkZSBtdWNoIGFkZGl0aW9uYWwgc2lnbmFsLgpSZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGdlbmVzIHdlIGluY2x1ZGUgd2lsbCBhbHNvIHNwZWVkIHVwIHNvbWUgb2YgdGhlIGNhbGN1bGF0aW9ucy4KClRvIGlkZW50aWZ5IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzLCB3ZSB3aWxsIHVzZSBmdW5jdGlvbnMgZnJvbSB0aGUgYHNjcmFuYCBwYWNrYWdlLgpUaGUgZmlyc3QgZnVuY3Rpb24sIGBtb2RlbEdlbmVWYXIoKWAsIGF0dGVtcHRzIHRvIGRpdmlkZSB0aGUgdmFyaWF0aW9uIG9ic2VydmVkIGZvciBlYWNoIGdlbmUgaW50byBhIGJpb2xvZ2ljYWwgYW5kIHRlY2huaWNhbCBjb21wb25lbnQsIHdpdGggdGhlIGludHVpdGlvbiB0aGF0IGdlbmVzIHdpdGggbG93ZXIgbWVhbiBleHByZXNzaW9uIHRlbmQgdG8gaGF2ZSBsb3dlciB2YXJpYW5jZSBmb3IgcHVyZWx5IHRlY2huaWNhbCByZWFzb25zLgpXZSB0aGVuIHByb3ZpZGUgdGhlIGBtb2RlbEdlbmVWYXIoKWAgb3V0cHV0IHRvIHRoZSBgZ2V0VG9wSFZHcygpYCBmdW5jdGlvbiB0byBpZGVudGlmeSB0aGUgZ2VuZXMgd2l0aCB0aGUgaGlnaGVzdCBfYmlvbG9naWNhbF8gdmFyaWF0aW9uLCB3aGljaCBpcyB3aGF0IHdlIGFyZSBtb3N0IGludGVyZXN0ZWQgaW4uCgpgYGB7ciBzZWxlY3QgSFZHc30KIyBpZGVudGlmeSAyMDAwIGdlbmVzCm51bV9nZW5lcyA8LSAyMDAwCgojIG1vZGVsIHZhcmlhbmNlLCBwYXJ0aXRpb25pbmcgaW50byBiaW9sb2dpY2FsIGFuZCB0ZWNobmljYWwgdmFyaWF0aW9uCmdlbmVfdmFyaWFuY2UgPC0gc2NyYW46Om1vZGVsR2VuZVZhcihub3JtYWxpemVkX3NjZSkKCiMgZ2V0IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzCmh2X2dlbmVzIDwtIHNjcmFuOjpnZXRUb3BIVkdzKGdlbmVfdmFyaWFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBudW1fZ2VuZXMpCmBgYAoKVGhlIHJlc3VsdCBpcyBhIHZlY3RvciBvZiBnZW5lIGlkcyAob3JkZXJlZCBmcm9tIG1vc3QgdG8gbGVhc3QgdmFyaWFibGUpOgoKYGBge3IgdmlldyBIVkdzfQpoZWFkKGh2X2dlbmVzKQpgYGAKCiMjIyBQcmluY2lwYWwgY29tcG9uZW50cyBhbmFseXNpcwoKTm93IHRoYXQgd2UgaGF2ZSBzZWxlY3RlZCB0aGUgZ2VuZXMgd2Ugd291bGQgbGlrZSB0byB1c2UgZm9yIHRoZSByZWR1Y2VkLWRpbWVuc2lvbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGV4cHJlc3Npb24gZGF0YSwgd2UgY2FuIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGVtLgpGaXJzdCB3ZSB3aWxsIHVzZSB0aGUgYHNjYXRlcjo6cnVuUENBKClgIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudHMgZnJvbSB0aGUgZXhwcmVzc2lvbiBtYXRyaXguClRoaXMgcmVwcmVzZW50YXRpb24gaXMgZmFzdCBhbmQgZmFpcmx5IHJvYnVzdCwgYnV0IHRoZSByZXN1bHQgaXMgc3RpbGwgcXVpdGUgbXVsdGlkaW1lbnNpb25hbC4KV2Ugd2FudCBrZWVwIGEgZmFpciBudW1iZXIgb2YgY29tcG9uZW50cyAoZGltZW5zaW9ucykgaW4gb3JkZXIgdG8gYWNjdXJhdGVseSByZXByZXNlbnQgdGhlIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSwgYnV0IGRvaW5nIHNvIG1lYW5zIHRoYXQgcGxvdHRpbmcgb25seSBhIGZldyBvZiB0aGVzZSBkaW1lbnNpb25zIChpbiAyRCkgaXMgbm90IGxpa2VseSB0byBwcm92aWRlIGEgZnVsbCB2aWV3IG9mIHRoZSBkYXRhLgoKVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaXMgNTAsIHdoaWNoIHdlIHdpbGwgc3RpY2sgd2l0aCwgYnV0IGxldCdzIGVudGVyIGl0IG1hbnVhbGx5IGp1c3QgZm9yIHRoZSByZWNvcmQuCgpgYGB7ciBydW5QQ0EsIGxpdmU9VFJVRX0KIyBjYWxjdWxhdGUgYW5kIHNhdmUgUENBIHJlc3VsdHMKbm9ybWFsaXplZF9zY2UgPC0gc2NhdGVyOjpydW5QQ0EoCiAgbm9ybWFsaXplZF9zY2UsCiAgbmNvbXBvbmVudHMgPSA1MCwgIyBob3cgbWFueSBjb21wb25lbnRzIHRvIGtlZXAKICBzdWJzZXRfcm93ID0gaHZfZ2VuZXMgIyB1c2Ugb25seSB0aGUgdmFyaWFibGUgZ2VuZXMgd2UgY2hvc2UKKQpgYGAKClRoZXNlIHJlZHVjZWQtZGltZW5zaW9uIHJlc3VsdHMgd2lsbCBiZSBzdG9yZWQgaW4gYSBgcmVkdWNlZERpbWAgc2xvdCBpbiB0aGUgU0NFIG9iamVjdC4KV2UgY2FuIHNlZSB0aGUgbmFtZXMgb2YgdGhlIGByZWR1Y2VkRGltYHMgdGhhdCB3ZSBoYXZlIGJ5IGxvb2tpbmcgYXQgdGhlIG9iamVjdCBzdW1tYXJ5OgoKYGBge3IgdmlldyByZWR1Y2VkIGRpbWVuc2lvbnN9Cm5vcm1hbGl6ZWRfc2NlCmBgYAoKSWYgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBQQ0EgcmVzdWx0cywgd2UgY2FuIGRvIHRoYXQgd2l0aCB0aGUgYHJlZHVjZWREaW0oKWAgZnVuY3Rpb246Ck5vdGUgdGhhdCBmb3IgdGhlc2UgcmVkdWNlZC1kaW1lbnNpb25hbGl0eSBtYXRyaWNlcywgdGhlIHJvd3MgYXJlIHRoZSBjZWxscyBhbmQgdGhlIGNvbHVtbnMgYXJlIHRoZSBQQyBkaW1lbnNpb25zLgoKYGBge3IgZ2V0UmVkdWNlZERpbX0KIyBleHRyYWN0IHRoZSBQQ0EgbWF0cml4CnBjYV9tYXRyaXggPC0gcmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIpCgojIGxvb2sgYXQgdGhlIHNoYXBlIG9mIHRoZSBtYXRyaXgKZGltKHBjYV9tYXRyaXgpCmBgYAoKIyMjIFVNQVAKCkZpbmFsbHksIHdlIHdpbGwgY2FsY3VsYXRlIGEgVU1BUCAoVW5pZm9ybSBNYW5pZm9sZCBBcHByb3hpbWF0aW9uIGFuZCBQcm9qZWN0aW9uKSByZXByZXNlbnRhdGlvbiBvZiBvdXIgZGF0YS4KVGhpcyBpcyBhIG1hY2hpbmUtbGVhcm5pbmctYmFzZWQgbWV0aG9kIHRoYXQgaXMgdXNlZnVsIGZvciBwZXJmb3JtaW5nIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBzdWl0YWJsZSBmb3IgdmlzdWFsaXphdGlvbi4KSXQncyBnb2FsIGlzIHRvIHByb3ZpZGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSBpbiB0d28gZGltZW5zaW9ucyAodHlwaWNhbGx5LCBtb3JlIGFyZSBwb3NzaWJsZSkgdGhhdCBwcmVzZXJ2ZXMgYXMgbXVjaCBvZiB0aGUgZGlzdGFuY2UgcmVsYXRpb25zaGlwcyBhbW9uZyBjZWxscyBhcyBwb3NzaWJsZS4KV2hpbGUgdGhpcyBkb2VzIG1ha2UgZm9yIHZpc3VhbGx5IGFwcGVhbGluZyBhbmQgdXNlZnVsIHBsb3RzLCBpdCBpcyBpbXBvcnRhbnQgbm90IHRvIG92ZXJpbnRlcnByZXQgdGhlIHJlc3VsdHMhCkluIHBhcnRpY3VsYXIsIHdoaWxlIHlvdSB3aWxsIG9mdGVuIHNlZSBzb21lIGFwcGFyZW50IGNsdXN0ZXJpbmcgb2YgY2VsbHMgaW4gdGhlIHJlc3VsdGluZyBvdXRwdXQsIHRob3NlIGNsdXN0ZXJzIG1heSBub3QgYmUgcGFydGljdWxhcmx5IHZhbGlkLCBhbmQgdGhlIHNwYWNpbmcgd2l0aGluIG9yIGJldHdlZW4gY2x1c3RlcnMgbWF5IG5vdCByZWZsZWN0IHRydWUgZGlzdGFuY2VzLgoKSW4gbWFueSB3YXlzIHRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZSBwcm9ibGVtIG9mIHByb2plY3RpbmcgYSBtYXAgb2YgdGhlIGVhcnRoIG9udG8gYSBmbGF0IHN1cmZhY2U7IGFueSBjaG9pY2Ugd2lsbCByZXN1bHQgaW4gc29tZSBkaXN0b3J0aW9ucy4KSG93ZXZlciwgd2l0aCBVTUFQLCB3ZSByYXJlbHkga25vdyBleGFjdGx5IHdoYXQgY2hvaWNlcyB3ZXJlIG1hZGUgYW5kIHdoYXQgZGlzdG9ydGlvbnMgbWlnaHQgaGF2ZSByZXN1bHRlZC4KVGhlIFVNQVAgY29vcmRpbmF0ZXMgdGhlbXNlbHZlcyBzaG91bGQgbmV2ZXIgYmUgdXNlZCBmb3IgZG93bnN0cmVhbSBhbmFseXNpcy4KClNpbmNlIHRoZSBVTUFQIHByb2NlZHVyZSB3b3VsZCBiZSBzbG93IHRvIGNhbGN1bGF0ZSB3aXRoIHRoZSBmdWxsIGRhdGEsIHNvIHRoZSBgcnVuVU1BUCgpYCBmdW5jdGlvbiBmaXJzdCBjYWxjdWxhdGVzIGEgUENBIG1hdHJpeCBhbmQgdGhlbiB1c2VzIF90aGF0XyB0byBjYWxjdWxhdGUgdGhlIFVNQVAuClNpbmNlIHdlIGFscmVhZHkgaGF2ZSBhIFBDQSBtYXRyaXgsIHdlIHdpbGwgdGVsbCB0aGUgZnVuY3Rpb24gdXNlIHRoYXQgaW5zdGVhZCBvZiByZWNhbGN1bGF0aW5nIGl0LgoKYGBge3IgcnVuVU1BUCwgbGl2ZT1UUlVFfQpub3JtYWxpemVkX3NjZSA8LSBzY2F0ZXI6OnJ1blVNQVAobm9ybWFsaXplZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiUENBIikKYGBgCgpBcyBiZWZvcmUsIHdlIGNvdWxkIGV4dHJhY3QgdGhlIFVNQVAgbWF0cml4IGZyb20gb3VyIFNDRSBvYmplY3Qgd2l0aCB0aGUgYHJlZHVjZWREaW0oKWAgZnVuY3Rpb24uCldlIGNhbiBhbHNvIHZpc3VhbGl6ZSB0aGUgVU1BUCByZXN1bHRzIHVzaW5nIHRoZSBgcGxvdFJlZHVjZWREaW0oKWAgZnVuY3Rpb24uCgpgYGB7ciBwbG90UmVkdWNlZERpbSwgbGl2ZT1UUlVFfQojIHBsb3QgdGhlIFVNQVAKc2NhdGVyOjpwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAiVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBieSB0aGUgbW9zdCB2YXJpYWJsZSBnZW5lCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSBodl9nZW5lc1sxXSkKYGBgCgoKIyMgVW5zdXBlcnZpc2VkIGNsdXN0ZXJpbmcKCkFzIGEgZmluYWwgYW5hbHlzaXMgc3RlcCBhdCB0aGlzIHN0YWdlLCB3ZSB3aWxsIHJldHVybiB0byB0aGUgUENBIHJlc3VsdHMgdG8gcGVyZm9ybSB1bnN1cGVydmlzZWQgY2x1c3RlcmluZy4KSGVyZSB3ZSB3aWxsIHVzZSBhIGdyYXBoLWJhc2VkIGNsdXN0ZXJpbmcgbWV0aG9kLCB3aGljaCBzdGFydHMgYnkgaWRlbnRpZnlpbmcgY2VsbHMgdGhhdCBhcmUgY2xvc2UgdG9nZXRoZXIgaW4gdGhlIG11bHRpZGltZW5zaW9uYWwgc3BhY2UuCkl0IHRoZW4gaWRlbnRpZmllcyAiY29tbXVuaXRpZXMiIG9mIGhpZ2hseSBjb25uZWN0ZWQgY2VsbHMsIGFuZCBicmVha3MgdGhlbSBhcGFydCBieSByZWdpb25zIG9mIGxvd2VyIGNvbm5lY3Rpb24uCgpUaGVyZSBhcmUgYSBudW1iZXIgb2YgYWxnb3JpdGhtcyB0aGF0IGNhbiBwZXJmb3JtIHRoaXMgY2x1c3RlcmluZywgZWFjaCB3aXRoIHBhcmFtZXRlcnMgdGhhdCBjYW4gYWZmZWN0IGhvdyBtYW55IGNsdXN0ZXJzIGFyZSBpZGVudGlmaWVkIGFuZCB3aGljaCBjZWxscyBiZWxvbmcgdG8gZWFjaCBjbHVzdGVyLgpJdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHRoZXNlIGNsdXN0ZXJzIG1heSBvciBtYXkgbm90IGNvcnJlc3BvbmQgdG8gImNlbGwgdHlwZXMiIGJ5IHdoYXRldmVyIGRlZmluaXRpb24geW91IG1pZ2h0IHByZWZlciB0byB1c2UuCkludGVycHJldGF0aW9uIG9mIHRoZXNlIGNsdXN0ZXJzLCBvciBvdGhlciBtZWFzdXJlcyBvZiBjZWxsIHR5cGUsIGFyZSBzb21ldGhpbmcgdGhhdCB3aWxsIHJlcXVpcmUgbW9yZSBjYXJlZnVsIGFuZCBsaWtlbHkgbW9yZSBjdXN0b21pemVkIGFuYWx5c2lzLgoKV2Ugd2lsbCBwZXJmb3JtIG91ciBjbHVzdGVyaW5nIHVzaW5nIHRoZSBmdW5jdGlvbiBgc2NyYW46OmNsdXN0ZXJDZWxsc2AsIHdoaWNoIGNhbiBwZXJmb3JtIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIGNsdXN0ZXJpbmcgdXNpbmcgdGhlIEJpb2NvbmR1Y3RvciBgYmx1c3RlcmAgcGFja2FnZSB1bmRlciB0aGUgaG9vZC4KQXMgbWVudGlvbmVkIGVhcmxpZXIsIHdlIGFyZSB1c2luZyAiZ3JhcGgiIGNsdXN0ZXJpbmcsIHdoaWNoIHdlIGRlZmluZSB1c2luZyB0aGUgYGJsdXN0ZXI6Ok5OR3JhcGhQYXJhbSgpYCBmdW5jdGlvbi4KV2l0aGluIHRoYXQgYXJlIGEgbnVtYmVyIG9mIGZ1cnRoZXIgb3B0aW9ucywgc3VjaCBhcyB0aGUgd2VpZ2h0aW5nIHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSBuZXR3b3JrIGdyYXBoIGFuZCB0aGUgYWxnb3JpdGhtIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBncmFwaCBpbnRvIGNsdXN0ZXJzLgoKTW9kaWZ5aW5nIHRoZXNlIHBhcmFtZXRlcnMgY2FuIHJlc3VsdCBpbiBxdWl0ZSBkaWZmZXJlbnQgY2x1c3RlciBhc3NpZ25tZW50cyEKRm9yIHRoZSBjbHVzdGVyaW5nIGJlbG93IHdlIHdpbGwgdXNlIEphY2NhcmQgd2VpZ2h0aW5nIGFuZCBMb3V2YWluIGNsdXN0ZXJpbmcsIHdoaWNoIGNvcnJlc3BvbmQgbW9yZSBjbG9zZWx5IHRvIHRoZSBkZWZhdWx0IG1ldGhvZHMgdXNlZCBieSBgU2V1cmF0YCB0aGFuIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuCkl0IGlzIGFsc28gd29ydGggbm90aW5nIHRoYXQgdGhlIHRoZSBjbHVzdGVyIGFzc2lnbm1lbnRzIGFyZSBzb21ld2hhdCBzdG9jaGFzdGljLgpJbiBwYXJ0aWN1bGFyLCB0aGUgbmFtZXMvbnVtYmVycyBvZiB0aGUgY2x1c3RlcnMgY2FuIGJlIHF1aXRlIGluY29uc2lzdGVudCBiZXR3ZWVuIHJ1bnMhCgoKYGBge3IgY2x1c3RlcmluZywgbGl2ZT1UUlVFfQojIHBlcmZvcm0gZ3JhcGgtYmFzZWQgY2x1c3RlcmluZwpubl9jbHVzdGVycyA8LSBzY3Jhbjo6Y2x1c3RlckNlbGxzKAogIG5vcm1hbGl6ZWRfc2NlLCAjIFNDRSB0byBwZXJmb3JtIGNsdXN0ZXJpbmcgb24KICB1c2UuZGltcmVkID0gIlBDQSIsICMgcGVyZm9ybSBjbHVzdGVyaW5nIG9uIHRoZSBQQ0EgbWF0cml4CiAgQkxVU1BBUkFNID0gYmx1c3Rlcjo6Tk5HcmFwaFBhcmFtKCAjIGNsdXN0ZXJpbmcgcGFyYW1ldGVycyB0byBwYXNzIHRvIGJsdXN0ZXIKICAgICMgbnVtYmVyIG9mIG5laWdoYm9ycyB0byB1c2UgaW4gbmV0d29yayBncmFwaAogICAgayA9IDIwLAogICAgIyB3ZWlnaHRpbmcgc2NoZW1lIGZvciBidWlsZGluZyB0aGUgbmV0d29yayBncmFwaAogICAgIyBkZWZhdWx0IGlzICJyYW5rIgogICAgdHlwZSA9ICJqYWNjYXJkIiwKICAgICMgY2x1c3RlciBkZXRlY3Rpb24gYWxnb3JpdGhtCiAgICAjIGRlZmF1bHQgaXMgIndhbGt0cmFwIgogICAgY2x1c3Rlci5mdW4gPSAibG91dmFpbiIKICApCikKYGBgCgpXZSBjYW4gc2F2ZSB0aGUgY2x1c3RlciBhc3NpZ25tZW50cyBiYWNrIGludG8gdGhlIGBjb2xEYXRhYCBvZiB0aGUgU0NFIG9iamVjdCB3aXRoIGEgbGl0dGxlIHNob3J0Y3V0OiB0aGUgYCRgIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBuZXcgY29sdW1uIHdlIHdhbnQgdG8gYWRkLgoKYGBge3IgYWRkIGNsdXN0ZXJzIHRvIFNDRSwgbGl2ZT1UUlVFfQojIHNhdmUgY2x1c3RlcnMgdG8gU0NFIGNvbERhdGEKbm9ybWFsaXplZF9zY2Ukbm5fY2x1c3RlciA8LSBubl9jbHVzdGVycwpgYGAKCk5vdyB3ZSBjYW4gcGxvdCB0aGUgVU1BUCBhZ2FpbiwgdGhpcyB0aW1lIGNvbG9yZWQgYnkgdGhlIGNsdXN0ZXIgYXNzaWdubWVudHMgdGhhdCB3ZSBqdXN0IGNyZWF0ZWQuCkhlcmUgcmF0aGVyIHRoYW4gdGhlIGdlbmVyYWwgYHBsb3RSZWR1Y2VkRGltKClgIGZ1bmN0aW9uLCB3ZSB3aWxsIHVzZSBgcGxvdFVNQVAoKWAsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHNhbWUsIGV4Y2VwdCBpdCBhbHdheXMgcGxvdHMgZnJvbSB0aGUgYHJlZHVjZWREaW1gIHNsb3QgbmFtZWQgYFVNQVBgLCBzbyB3ZSBjYW4gc2tpcCB0aGF0IGFyZ3VtZW50LgoKYGBge3IgcGxvdCBjbHVzdGVycywgbGl2ZT1UUlVFfQojIHBsb3QgVU1BUCB3aXRoIGFzc2lnbmVkIGNsdXN0ZXJzCnNjYXRlcjo6cGxvdFVNQVAobm9ybWFsaXplZF9zY2UsCiAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAibm5fY2x1c3RlciIpCmBgYAoKV2hhdCBkbyB5b3Ugc2VlIGluIHRoZXNlIHJlc3VsdHM/CgpXaGF0IHdvdWxkIHlvdSB3YW50IHRvIGRvIG5leHQ/CgojIyBTYXZlIFNDRSBvYmplY3QgZm9yIGxhdGVyCgpXZSB3aWxsIG5vdyBzYXZlIG91ciBmaWx0ZXJlZCBhbmQgbm9ybWFsaXplZCBvYmplY3QsIGluY2x1ZGluZyB0aGUgZGltZW5zaW9uIHJlZHVjdGlvbiBhbmQgY2x1c3RlcmluZyByZXN1bHRzIHRvIGFuIGBSRFNgIGZpbGUsIHVzaW5nIHRoZSBmaWxlIHBhdGggdGhhdCB3ZSBkZWZpbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgbm90ZWJvb2suCklmIHdlIHdlcmUgdG8gd2FudCB0byByZXR1cm4gdG8gdGhpcyBkYXRhLCB3ZSBjb3VsZCBsb2FkIHRoaXMgZmlsZSBkaXJlY3RseSBpbnRvIGEgbmV3IFIgc2Vzc2lvbiBhbmQgbm90IGhhdmUgdG8gcmVwZWF0IHRoZSBwcm9jZXNzaW5nIHRoYXQgd2UgaGF2ZSBkb25lIHVwIHRvIHRoaXMgcG9pbnQuCgpUaGUgZGF0YSBpbiB0aGVzZSBvYmplY3RzIHRlbmRzIHRvIGJlIHF1aXRlIGxhcmdlLCBidXQgdmVyeSBjb21wcmVzc2libGUuClRvIHNhdmUgc3BhY2Ugb24gZGlzayAoYXQgdGhlIGV4cGVuc2Ugb2YgdGltZSksIHdlIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgaXMgY29tcHJlc3NlZCBpbnRlcm5hbGx5IGJlZm9yZSB3cml0aW5nIGl0IG91dCB0byBhIGZpbGUuCk5vdGUgdGhhdCB0aGUgZmlsZSB3ZSB3cml0ZSBpcyBzdGlsbCBnb2luZyB0byBiZSBhbiBgLnJkc2AgZmlsZSB3aXRoIG5vIGFkZGl0aW9uYWwgZXh0ZW5zaW9uLgooRnVydGhlciBub3RlOiBUaGUgYmFzZSBSIGZ1bmN0aW9uIGBzYXZlUkRTKClgIHVzZXMgY29tcHJlc3Npb24gYnkgZGVmYXVsdCwgYnV0IHRoZSBgdGlkeXZlcnNlYCBmdW5jdGlvbiBgcmVhZHI6OndyaXRlX3JkcygpYCBkb2VzIG5vdC4pCgpgYGB7ciBzYXZlIFNDRSwgbGl2ZT1UUlVFfQojIHdyaXRlIFJEUyBmaWxlIHdpdGggY29tcHJlc3Npb24KcmVhZHI6OndyaXRlX3Jkcyhub3JtYWxpemVkX3NjZSwgZmlsZSA9IG91dHB1dF9zY2VfZmlsZSwgY29tcHJlc3MgPSAiZ3oiKQpgYGAKCgojIyBQcmludCBzZXNzaW9uIGluZm8KCkFzIGlzIG91ciBoYWJpdCBhdCB0aGUgRGF0YSBMYWIsIHdlIHdpbGwgc2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcHV0aW5nIGVudmlyb25tZW50LCB0aGUgcGFja2FnZXMgd2UgaGF2ZSB1c2VkIGluIHRoaXMgbm90ZWJvb2ssIGFuZCB0aGVpciB2ZXJzaW9ucyB1c2luZyB0aGUgYHNlc3Npb25JbmZvKClgIGNvbW1hbmQuCgpgYGB7ciBzZXNzaW9uIGluZm99CnNlc3Npb25JbmZvKCkKYGBgCgo=
+
LS0tCnRpdGxlOiAiUmVhZGluZywgZmlsdGVyaW5nLCBhbmQgbm9ybWFsaXppbmcgc2NSTkEtc2VxIGRhdGEiCmF1dGhvcjogRGF0YSBMYWIgZm9yIEFMU0YKZGF0ZTogMjAyMwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUmVhZCBDZWxsIFJhbmdlciBkYXRhIGludG8gUgotIEZpbHRlciB0byBjZWxscyB1c2luZyBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAKLSBDYWxjdWxhdGUgcXVhbGl0eSBjb250cm9sIG1lYXN1cmVzIG9uIHNjUk5BLXNlcSBkYXRhCi0gUmVtb3ZlIGxpa2VseSBjb21wcm9taXNlZCBjZWxscyB3aXRoIGBtaVFDKClgCi0gTm9ybWFsaXplIGV4cHJlc3Npb24gZGF0YSBhY3Jvc3MgY2VsbHMKLSBDYWxjdWxhdGUgYW5kIHBsb3QgcmVkdWNlZCBkaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIG9mIGV4cHJlc3Npb24gZGF0YSAoUENBLCBVTUFQKQoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSB3aWxsIHJldmlldyBiYXNpYyBwcm9jZXNzaW5nIGZvciBzaW5nbGUtY2VsbCBSTkEtc2VxIGRhdGEsIHN0YXJ0aW5nIHdpdGggdGhlIG91dHB1dCBmcm9tIENlbGwgUmFuZ2VyLCBhbmQgcHJvY2VlZGluZyB0aHJvdWdoIGZpbHRlcmluZywgcXVhbGl0eSBjb250cm9sLCBub3JtYWxpemF0aW9uLCBhbmQgZGltZW5zaW9uIHJlZHVjdGlvbi4gV2Ugd2lsbCBwZXJmb3JtIHRoZXNlIHRhc2tzIHVzaW5nIHRvb2xzIGZyb20gdGhlIFtCaW9jb25kdWN0b3IgcHJvamVjdF0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnKSwgaW4gcGFydGljdWxhciBbYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3RzXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvU2luZ2xlQ2VsbEV4cGVyaW1lbnQuaHRtbCkgYW5kIGZ1bmN0aW9ucyB0aGF0IHdvcmsgd2l0aCB0aG9zZSBvYmplY3RzLgpNdWNoIG9mIHRoZSBtYXRlcmlhbCBpbiB0aGlzIG5vdGVib29rIGlzIGRpcmVjdGx5IGluc3BpcmVkIGJ5LCBhbmQgZHJhd3MgaGVhdmlseSBvbiwgbWF0ZXJpYWwgcHJlc2VudGVkIGluIHRoZSBib29rIFtfT3JjaGVzdHJhdGluZyBTaW5nbGUgQ2VsbCBBbmFseXNpcyB3aXRoIEJpb2NvbmR1Y3Rvcl8gKE9TQ0EpXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy9yZWxlYXNlL09TQ0EvKS4KCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogT3ZlcnZpZXddKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX292ZXJ2aWV3LnBuZykKClRoZSBkYXRhIHdlIHdpbGwgdXNlIGZvciB0aGlzIG5vdGVib29rIGlzIGRlcml2ZWQgZnJvbSBhIGh1bWFuIGdsaW9ibGFzdG9tYSBzcGVjaW1lbi4KVGhlIHNhbXBsZSB3YXMgcHJvY2Vzc2VkIGJ5IDEweCBHZW5vbWljcyB1c2luZyBhIDMnIFJOQSBraXQgKHYzLjEpLCBzZXF1ZW5jZWQsIGFuZCBxdWFudGlmaWVkIHdpdGggQ2VsbCBSYW5nZXIgNi4wLgpGdXJ0aGVyIGRldGFpbHMgYWJvdXQgdGhlIHNhbXBsZSBhbmQgcHJvY2Vzc2luZyBjYW4gYmUgZm91bmQgb24gdGhlIFsxMHggd2Vic2l0ZV0oaHR0cHM6Ly93d3cuMTB4Z2Vub21pY3MuY29tL3Jlc291cmNlcy9kYXRhc2V0cy8yLWstc29ydGVkLWNlbGxzLWZyb20taHVtYW4tZ2xpb2JsYXN0b21hLW11bHRpZm9ybWUtMy12LTMtMS0zLTEtc3RhbmRhcmQtNi0wLTApLgoKCiMjIFNldCBVcAoKVG8gc3RhcnQsIHdlIHdpbGwgbG9hZCBzb21lIG9mIHRoZSBsaWJyYXJpZXMgd2Ugd2lsbCBuZWVkIGxhdGVyLCBhbmQgc2V0IGEgcmFuZG9tIG51bWJlciBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkuCgpgYGB7ciBzZXR1cH0KIyBMb2FkIGxpYnJhcmllcwoKIyBQbG90dGluZyBmdW5jdGlvbnMKbGlicmFyeShnZ3Bsb3QyKQoKIyBUaGUgbWFpbiBjbGFzcyB3ZSB3aWxsIHVzZSBmb3IgU2luZ2xlIENlbGwgZGF0YQpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQoKIyBTZXR0aW5nIHRoZSBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkKc2V0LnNlZWQoMTIzNDUpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKQmVmb3JlIHdlIGdldCB0b28gZmFyLCB3ZSBsaWtlIHRvIGRlZmluZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyB0aGF0IHRoZSBub3RlYm9vayB3aWxsIHVzZSBuZWFyIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50LgpXaGlsZSB5b3UgbWlnaHQgbm90IGtub3cgdGhlIG5hbWVzIG9mIGFsbCBvZiB0aGUgZmlsZXMgeW91IHdpbGwgbmVlZCBvciBjcmVhdGUgb3V0cHV0IGZpbGVzIHdoZW4geW91IHN0YXJ0IGFuIGFuYWx5c2lzLCB3ZSBoYXZlIGZvdW5kIGl0IGhlbHBmdWwgdG8ga2VlcCBhbGwgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIGluIGEgc2luZ2xlIHBsYWNlIG5lYXIgdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQuClRoaXMgbWFrZXMgaXQgZWFzaWVyIGZvciBzb21lYm9keSBjb21pbmcgdG8gdGhlIGNvZGUgbGF0ZXIgdG8gcXVpY2tseSBzZWUgd2hhdCBmaWxlcyBhcmUgbmVlZGVkIGFzIGlucHV0IGFuZCB3aGF0IHdpbGwgYmUgcHJvZHVjZWQgYXMgb3V0cHV0LgpNb3JlIG9mdGVuIHRoYW4gbm90LCB0aGF0IHNvbWVib2R5IGlzIHlvdSEKClRoZSBnZW5lIGV4cHJlc3Npb24gZGF0YSB3ZXJlIHByb2Nlc3NlZCB0byBjcmVhdGUgYSBnZW5lLWJ5LWNlbGwgZXhwcmVzc2lvbiBtYXRyaXggb2YgY291bnRzIGZvciB1c2luZyBDZWxsIFJhbmdlciA2LjAuCldlIGhhdmUgcHJvdmlkZWQgdGhlIHJhdyBkYXRhIGRpcmVjdG9yeSwgYHJhd19mZWF0dXJlX2JjX21hdHJpeGAsIHdoaWNoIGlzIHVzdWFsbHkgcHJvZHVjZWQgYnkgQ2VsbCBSYW5nZXIgYW5kIHBsYWNlZCBpbiBpdHMgYG91dHNgIGRpcmVjdG9yeS4KVGhpcyBkaXJlY3RvcnkgdXN1YWxseSBjb250YWlucyB0aHJlZSBmaWxlczoKLSBgYmFyY29kZXMudHN2Lmd6YCwgYSB0YWJsZSBvZiB0aGUgY2VsbCBiYXJjb2RlcyB0aGF0IDEweCB1c2VzLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2x1bW5zIG9mIHRoZSBjb3VudCBtYXRyaXguCi0gYGZlYXR1cmVzLnRzdi5nemAsIGEgdGFibGUgb2YgdGhlIGZlYXR1cmVzIChnZW5lcyBpbiB0aGlzIGNhc2UpIGZvciB3aGljaCBleHByZXNzaW9uIHdhcyBxdWFudGlmaWVkLgpUaGlzIHdpbGwgdXN1YWxseSBhbHNvIGluY2x1ZGUgYSBiaXQgb2YgbWV0YWRhdGEgYWJvdXQgdGhlIGZlYXR1cmVzLCBpbmNsdWRpbmcgZ2VuZSBzeW1ib2xzIChpZiB0aGUgZmVhdHVyZXMgYXJlIGdlbmVzKSBhbmQgdGhlIHR5cGUgb2YgZGF0YSB0aGV5IHJlcHJlc2VudCAoZS5nLiwgZ2VuZSBleHByZXNzaW9uIG9yIGFudGlib2R5IGNhcHR1cmUpLgotIGBtYXRyaXgubXR4Lmd6YCwgVGhlIGNvdW50cyB0aGVtc2VsdmVzLCBzdG9yZWQgaW4gYSBzcGFyc2UgWyJNYXRyaXggRXhjaGFuZ2UiIGZvcm1hdF0oaHR0cHM6Ly9tYXRoLm5pc3QuZ292L01hdHJpeE1hcmtldC9mb3JtYXRzLmh0bWwpLgoKQ2VsbCBSYW5nZXIgd2lsbCBhbHNvIGV4cG9ydCB0aGVzZSBkYXRhIGluIGEgc2luZ2xlIGBIREY1YCBmb3JtYXQgZmlsZSB3aXRoIGEgYC5oNWAgZXh0ZW5zaW9uLCB3aGljaCBjYW4gYWxzbyBiZSBpbXBvcnRlZCB3aXRoIHRoZSBzYW1lIGNvbW1hbmRzIHdlIHdpbGwgdXNlIGJlbG93LgpIb3dldmVyLCB3ZSBoYXZlIGZvdW5kIHRoYXQgcHJvY2Vzc2luZyBsYXJnZSBgLmg1YCBmaWxlcyBpcyBvZnRlbiBfbXVjaF8gbGVzcyBlZmZpY2llbnQgaW4gUiwgc28gd2UgcHJlZmVyIHRvIHN0YXJ0IHdpdGggdGhlIG1hdHJpeCBmaWxlcyB3aGVuIHBvc3NpYmxlLgpJbiBwYXJ0aWN1bGFyLCB3ZSB3b3VsZCBub3QgcmVjb21tZW5kIHdvcmtpbmcgd2l0aCBgLmg1YCBmaWxlcyBmb3IgcmF3IGRhdGE7IHRoZSBmaWx0ZXJpbmcgc3RlcHMgd2Ugd2lsbCB1c2UgYmVsb3cgY2FuIHNvbWV0aW1lcyB0YWtlIGhvdXJzIHdoZW4gdXNpbmcgdGhvc2UgZmlsZXMgYXMgaW5wdXQuCgpXZSB3aWxsIGFsc28gbmVlZCBhIHRhYmxlIG9mIG1pdG9jaG9uZHJpYWwgZ2VuZXMsIHdoaWNoIHdlIGhhdmUgc3RvcmVkIGluIHRoZSBgZGF0YS9yZWZlcmVuY2UvYCBkaXJlY3RvcnkuCgpGaW5hbGx5LCB3ZSB3aWxsIHNldCB1cCB0aGUgb3VyIG91dHB1dCBkaXJlY3RvcnksIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IHlldCBleGlzdCwgYW5kIGRlZmluZSB0aGUgbmFtZSBmb3IgdGhlIGZpbGVzIHdlIHdpbGwgc2F2ZSBhZnRlciBhbGwgb2Ygb3VyIGluaXRpYWwgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KCmBgYHtyIGlucHV0cywgbGl2ZT1UUlVFfQojIElucHV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIG1haW4gZGF0YSBkaXJlY3RvcnkKZGF0YV9kaXIgPC0gZmlsZS5wYXRoKCJkYXRhIiwgImdsaW9ibGFzdG9tYS0xMHgiKQoKIyBQYXRoIHRvIHRoZSBDZWxsIFJhbmdlciBtYXRyaXggZGlyZWN0b3J5CnJhd19tYXRyaXhfZGlyIDwtIGZpbGUucGF0aChkYXRhX2RpciwgInJhd19mZWF0dXJlX2JjX21hdHJpeCIpCgojIHJlZmVyZW5jZSBkYXRhIGRpcmVjdG9yeQpyZWZfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJyZWZlcmVuY2UiKQoKIyBQYXRoIHRvIG1pdG9jaG9uZHJpYWwgZ2VuZXMgdGFibGUKbWl0b19maWxlIDwtIGZpbGUucGF0aChyZWZfZGlyLCAiaHNfbWl0b2Nob25kcmlhbF9nZW5lcy50c3YiKQpgYGAKCmBgYHtyIG91dHB1dHN9CiMgT3V0cHV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgRGlyZWN0b3J5IGFuZCBmaWxlIHRvIHNhdmUgb3V0cHV0Cm5vcm1hbGl6ZWRfZGlyIDwtIGZpbGUucGF0aChkYXRhX2RpciwgIm5vcm1hbGl6ZWQiKQoKIyBjcmVhdGUgdGhlIGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdCBleGlzdApmczo6ZGlyX2NyZWF0ZShub3JtYWxpemVkX2RpcikKCiMgb3V0cHV0IFJEUyBmaWxlIGZvciBub3JtYWxpemVkIGRhdGEKb3V0cHV0X3NjZV9maWxlIDwtIGZpbGUucGF0aCgKICBub3JtYWxpemVkX2RpciwKICAiZ2xpb2JsYXN0b21hX25vcm1hbGl6ZWRfc2NlLnJkcyIKKQpgYGAKCgojIyBSZWFkaW5nIENlbGwgUmFuZ2VyIGRhdGEKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogUHJlcHJvY2VzcyBhbmQgSW1wb3J0XShkaWFncmFtcy9yb2FkbWFwX3NpbmdsZV9wcmVwcm9jZXNzLnBuZykKCldoZXRoZXIgdGhlIDEweCBDZWxsIFJhbmdlciBkYXRhIGlzIGluIE1hdHJpeCBFeGNoYW5nZSBmb3JtYXQgb3IgaW4gYW4gSERGNSBmaWxlLCB3ZSBjYW4gdXNlIHRoZSBgcmVhZDEweENvdW50cygpYCBmdW5jdGlvbiBmcm9tIHRoZSBgRHJvcGxldFV0aWxzYCBwYWNrYWdlIHRvIHJlYWQgdGhlIGRhdGEgaW50byBSIGFuZCBjcmVhdGUgYSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdC4KKFRob3VnaCBhZ2Fpbiwgd2UgZG8gbm90IHJlY29tbWVuZCB1c2luZyB0aGUgYC5oNWAgZmlsZSBpZiB5b3UgY2FuIGF2b2lkIGl0LCBfZXNwZWNpYWxseV8gZm9yIHJhdyAodW5maWx0ZXJlZCkgZGF0YS4pCgpJZiB5b3UgdXNlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBDZWxsIFJhbmdlciB0byBwcm9jZXNzIHRoZSByYXcgZGF0YSwgeW91IHdvdWxkIG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IGZ1bmN0aW9uIHRvIHJlYWQgaXQgaW4gYW5kIGNyZWF0ZSB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QuClNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIGZvciBvdGhlciBjb21tb24gZGF0YSBmb3JtYXRzIGFyZSBkaXNjdXNzZWQgaW4gW0NoYXB0ZXIgMyBvZiBPU0NBXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE5L09TQ0EuaW50cm8vZ2V0dGluZy1zY3JuYS1zZXEtZGF0YXNldHMuaHRtbCNyZWFkaW5nLWNvdW50cy1pbnRvLXIpLgoKYGBge3IgcmVhZCBTQ0UsIGxpdmU9VFJVRX0KIyByZWFkIFNDRSBmcm9tIG1hdHJpeCBkaXJlY3RvcnkKcmF3X3NjZSA8LSBEcm9wbGV0VXRpbHM6OnJlYWQxMHhDb3VudHMoCiAgcmF3X21hdHJpeF9kaXIsCiAgY29sLm5hbWVzID0gVFJVRSAjIGVuc3VyZSBiYXJjb2RlcyBhcmUgc2V0IGFzIGNvbHVtbiBuYW1lcyBpbiB0aGUgU0NFIG9iamVjdAopCmBgYAoKTGV0J3MgbG9vayBhdCB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBhZnRlciByZWFkaW5nIGl0IGluOgoKYGBge3IgdmlldyBTQ0UsIGxpdmU9VFJVRX0KIyB2aWV3IFNDRSBvYmplY3QKcmF3X3NjZQpgYGAKCldlIGNhbiBzZWUgZnJvbSB0aGlzIHN1bW1hcnkgdGhhdCB0aGlzIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgKFNDRSkgb2JqZWN0IGNvbnRhaW5zIDM2LDYwMSByb3dzLCB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBmZWF0dXJlcyAoZ2VuZXMpIHRoYXQgd2VyZSBhbmFseXplZCwgYW5kIDczNCw0OTIgY29sdW1ucywgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgcG9zc2libGUgYmFyY29kZSB0YWdzIHRoYXQgd2VyZSB1c2VkIGluIHRoZSBleHBlcmltZW50LgpOb3RlIHRoYXQgbm90IGFsbCBvZiB0aGVzZSBiYXJjb2RlIHRhZ3Mgd2lsbCBoYXZlIGJlZW4gdXNlZCwgYW5kIG1hbnkgb2YgdGhlIGZlYXR1cmVzIG1heSBuZXZlciBoYXZlIGJlZW4gc2VlbiBlaXRoZXIuCk9uZSBvZiBvdXIgZmlyc3Qgc3RlcHMgd2lsbCBiZSB0byBmaWx0ZXIgb3V0IGJhcmNvZGVzIHRoYXQgd2VyZSBuZXZlciBzZWVuLCBvciB0aGF0IG1heSBoYXZlIG9ubHkgYmVlbiBzZWVuIGluIGEgZHJvcGxldCB0aGF0IGRpZCBub3QgY29udGFpbiBhIGNlbGwgKGFuICJlbXB0eSBkcm9wbGV0IikuCgojIyMgU3RydWN0dXJlIG9mIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdAoKSW4gYWRkaXRpb24gdG8gdGhlIG1haW4gYGNvdW50c2AgbWF0cml4LCBsaXN0ZWQgYXMgYW4gYGFzc2F5YCBpbiB0aGUgU0NFIHN1bW1hcnkgYWJvdmUsIHRoZSBTQ0Ugb2JqZWN0IGNhbiBjb250YWluIGEgbnVtYmVyIG9mIG90aGVyIHRhYmxlcyBhbmQgbWF0cmljZXMsIGVhY2ggc3RvcmVkIGluIGEgInNsb3QiIHdpdGggYSBwYXJ0aWN1bGFyIGZvcm1hdC4KVGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIHRoZSBvYmplY3QgY2FuIGJlIHNlZW4gaW4gdGhlIGZpZ3VyZSBiZWxvdywgd2hpY2ggY29tZXMgZnJvbSBhbiBbT1NDQSBJbnRyb2R1Y3Rpb24gY2hhcHRlcl0oaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xOS9PU0NBLmludHJvL3RoZS1zaW5nbGVjZWxsZXhwZXJpbWVudC1jbGFzcy5odG1sKS4KCiFbU3RydWN0dXJlIG9mIGEgU2luZ2xlQ2VsbEV4cGVyaW1lbnQgb2JqZWN0XShkaWFncmFtcy9TaW5nbGVDZWxsRXhwZXJpbWVudC5wbmcpCgpXZSBoYXZlIGp1c3QgbWVudGlvbmVkIHRoZSBtYWluIGBhc3NheWAgc2xvdCwgd2hpY2ggY29udGFpbnMgZnVsbCBtYXRyaWNlcyBvZiBkYXRhIChzdWNoIGFzIHRyYW5zY3JpcHQgY291bnRzKSB3aXRoIGVhY2ggcm93IGEgZmVhdHVyZSBhbmQgZWFjaCBjb2x1bW4gYSBjZWxsLgpUaGVyZSBhcmUgYWxzbyBhIGNvdXBsZSBvZiB0YWJsZXMgZm9yIG1ldGFkYXRhLCBhbmQgYSBzbG90IHRvIHN0b3JlIHJlZHVjZWQtZGltZW5zaW9uIHJlcHJlc2VudGF0aW9ucyAoZS5nLiwgUENBIGFuZC9vciBVTUFQKSBvZiB0aGUgZXhwcmVzc2lvbiBkYXRhLgoKV2UnbGwgc3RhcnQgd2l0aCB0aGUgYHJvd0RhdGFgIHNsb3QsIHdoaWNoIGlzIGEgdGFibGUgb2YgbWV0YWRhdGEgZm9yIGVhY2ggZmVhdHVyZSBpbiBvdXIgb2JqZWN0LgpGb3Igbm93IHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgZmVhdHVyZXMudHN2Lmd6YCBmaWxlIHRoYXQgd2UgZGlzY3Vzc2VkIGVhcmxpZXIuCklmIHdlIGhhZCByZWFkIHRoZSBkYXRhIGZyb20gc29tZXRoaW5nIG90aGVyIHRoYW4gQ2VsbCBSYW5nZXIgb3V0cHV0LCB3ZSBtaWdodCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgYnV0IGVhY2ggcm93IHdvdWxkIHN0aWxsIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgZmVhdHVyZSBvZiB0aGUgU0NFIG9iamVjdC4KCkxldCdzIGxvb2sgYXQgdGhpcyB0YWJsZSwgZXh0cmFjdGluZyBpdCBmcm9tIHRoZSBTQ0Ugb2JqZWN0IHdpdGggdGhlIGByb3dEYXRhKClgIGZ1bmN0aW9uIGFuZCB1c2luZyBgaGVhZCgpYCB0byB2aWV3IG9ubHkgdGhlIGZpcnN0IDYgcm93cy4KCmBgYHtyIHJvd2RhdGF9CiMgdmlldyByb3dEYXRhIChmZWF0dXJlcykKaGVhZChyb3dEYXRhKHJhd19zY2UpKQpgYGAKCllvdSBjYW4gc2VlIHRoYXQgdGhpcyB0YWJsZSBpbmNsdWRlcyBhbiBgSURgIGZvciBlYWNoIGZlYXR1cmUsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIEVuc2VtYmwgZ2VuZSBJRCwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBnZW5lIHN5bWJvbCBpbiB0aGUgYFN5bWJvbGAgY29sdW1uLgpGaW5hbGx5IHRoZXJlIGlzIGEgY29sdW1uIGZvciBgVHlwZWAsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBhbHdheXMgIkdlbmUgRXhwcmVzc2lvbiIsIGFzIGFsbCBvZiB0aGUgZmVhdHVyZXMgaW4gdGhpcyBkYXRhIHNldCBhcmUgZ2VuZXMuCklmIHRoZXJlIHdlcmUgYW5vdGhlciBtb2RhbGl0eSBvZiBkYXRhIHRoYXQgaGFkIGJlZW4gYXNzYXllZCBpbiB0aGlzIGV4cGVyaW1lbnQsIHRoZXJlIG1pZ2h0IGJlIG90aGVyIHZhbHVlcyBpbiB0aGlzIGNvbHVtbiwgc3VjaCBhcyAiQW50aWJvZHkgQ2FwdHVyZSIgZm9yIENJVEUtc2VxIGV4cGVyaW1lbnRzLgoKVGhlIHNlY29uZCBzbG90IGlzIHRoZSBgY29sRGF0YWAgdGFibGUsIHdoaWNoIG5vdyBjb3JyZXNwb25kcyB0byB0aGUgYGJhcmNvZGVzLnRzdi5nemAgZmlsZSwgY29udGFpbmluZyBvbmUgcm93IHBlciBjZWxsIGJhcmNvZGUsIG9yLCBtb3JlIGdlbmVyYWxseSwgb25lIHJvdyBwZXIgY29sdW1uIG9mIHRoZSBgY291bnRzYCBhc3NheS4KV2UgY2FuIGxvb2sgYXQgdGhpcyB0YWJsZSB1c2luZyB0aGUgYGNvbERhdGEoKWAgZnVuY3Rpb24gKGFuZCBgaGVhZCgpYCBhZ2FpbiB0byBwcmV2ZW50IHByaW50aW5nIHRoZSB3aG9sZSB0YWJsZSk6CgpgYGB7ciBjb2xkYXRhfQojIHZpZXcgY29sRGF0YSAoY2VsbCBiYXJjb2RlcykKaGVhZChjb2xEYXRhKHJhd19zY2UpKQpgYGAKCkhlcmUgd2Ugc2VlIHRoYXQgdGhlcmUgYXJlIGN1cnJlbnRseSB0d28gY29sdW1uczoKCi0gdGhlIGBTYW1wbGVgIGNvbHVtbiBoYXMgdGhlIHBhdGggb2YgdGhlIGZpbGUgdGhhdCB3ZSByZWFkIGluICh5b3UgbWF5IG5vdCBzZWUgdGhlIHdob2xlIHBhdGggaW4gdGhpcyBkaXNwbGF5KTsgdGhpcyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGFsbCByb3dzIGZyb20gYSBzaW5nbGUgc2FtcGxlLgotIHRoZSBgQmFyY29kZWAgY29sdW1uIGNvbnRhaW5zIHRoZSBzZXF1ZW5jZSB0aGF0IHdhcyB1c2VkIHRvIGlkZW50aWZ5IGVhY2ggcG90ZW50aWFsIGRyb3BsZXQgZm9yIHNlcXVlbmNpbmcgKGFuZCBhIG51bWVyaWMgdGFnLCBpbiB0aGlzIGNhc2UpLgpUaGVzZSB3aWxsIGJlIHVuaXF1ZSB3aXRoaW4gYSBzYW1wbGUuCgpBcyB3ZSBwcm9jZWVkIHRvIGNhbGN1bGF0ZSBwZXItY2VsbCBzdGF0aXN0aWNzLCB3ZSB3aWxsIGJlIGFkZGluZyBuZXcgZGF0YSB0byB0aGlzIHRhYmxlLgoKIyMgUXVhbGl0eSBjb250cm9sIGFuZCBmaWx0ZXJpbmcKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogUUMsIEZpbHRlciwgYW5kIE5vcm1hbGl6ZV0oZGlhZ3JhbXMvcm9hZG1hcF9zaW5nbGVfcWNfbm9ybS5wbmcpCgojIyMgRmlsdGVyaW5nIGVtcHR5IGRyb3BsZXRzCgpNb3N0IG9mIHRoZSBiYXJjb2RlcyBpbiBhbnkgZ2l2ZW4gMTB4IGV4cGVyaW1lbnQgd2lsbCBub3QgYmUgc2VlbiBhdCBhbGwsIHNvIG91ciBmaXJzdCBzdGVwIGNhbiBiZSB0byBmaWx0ZXIgdGhpcyByYXcgZGF0YSB0byBvbmx5IHRoZSBjZWxscyB3aGVyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdHJhbnNjcmlwdCB0aGF0IHdhcyBjb3VudGVkIHdpdGggdGhhdCBiYXJjb2RlLgoKVG8gZG8gdGhpcywgd2Ugd2lsbCB1c2UgdGhlIGBjb2xTdW1zKClgIGZ1bmN0aW9uIHRvIHF1aWNrbHkgYWRkIHVwIGFsbCB0aGUgY291bnRzIHRoYXQgY29ycmVzcG9uZCB0byBlYWNoIHBvc3NpYmxlIGNlbGwgYmFyY29kZSwgdGhlbiBmaWx0ZXIgb3VyIGByYXdfc2NlYCBkb3duIHRvIGp1c3QgdGhvc2UgY29sdW1ucyB3aGVyZSB0aGVyZSBhcmUgbm9uLXplcm8gdG90YWwgY291bnRzLgpXZSB3aWxsIG5lZWQgdG8gZXh0cmFjdCB0aGUgYGNvdW50c2AgbWF0cml4IGZyb20gb3VyIFNDRSBvYmplY3QsIHdoaWNoIHdlIGNhbiBkbyB1c2luZyB0aGUgYGNvdW50cygpYCBmdW5jdGlvbiwgY29udmVuaWVudGx5IGVub3VnaC4KCmBgYHtyIHJlbW92ZSB6ZXJvcywgbGl2ZT1UUlVFfQojIHN1bSBjb2x1bW5zIGZyb20gY291bnRzIG1hdHJpeApiYXJjb2RlX2NvdW50cyA8LSBjb2xTdW1zKGNvdW50cyhyYXdfc2NlKSkKCiMgZmlsdGVyIFNDRSBvYmplY3QgdG8gb25seSByb3dzIHdpdGggY291bnRzID4gMApyYXdfc2NlIDwtIHJhd19zY2VbLCB3aGljaChiYXJjb2RlX2NvdW50cyA+IDApXQpgYGAKCk5vdyB3ZSBjYW4gbG9vayBhdCBob3cgb3VyIFNDRSBvYmplY3QgaGFzIGNoYW5nZWQ6CgpgYGB7ciB6ZXJvLWZpbHRlcmVkIFNDRX0KcmF3X3NjZQpgYGAKCkJ1dCBiYXJjb2RlcyB3aXRoIHplcm8gY291bnRzIGFyZSBub3QgdGhlIG9ubHkgb25lcyB0aGF0IGNvcnJlc3BvbmQgdG8gZHJvcGxldHMgd2l0aG91dCBjZWxscyBpbiB0aGVtIQpFdmVuIGlmIGEgZHJvcGxldCBkb2VzIG5vdCBoYXZlIGEgY2VsbCBpbiBpdCwgdGhlcmUgd2lsbCBvZnRlbiBiZSBzcHVyaW91cyByZWFkcyBmcm9tIFJOQSBzZXF1ZW5jZXMgdGhhdCB3ZXJlIHByZXNlbnQgaW4gdGhlIGV4dHJhY2VsbHVsYXIgc29sdXRpb24sIHdoZXRoZXIgZnJvbSB0aGUgb3JpZ2luYWwgc2FtcGxlIG9yIGZyb20gY2VsbHMgdGhhdCB3ZXJlIGRhbWFnZWQgZHVyaW5nIHNpbmdsZS1jZWxsIGxpYnJhcnkgcHJlcGFyYXRpb24uCgpXZSBjb3VsZCBpZGVudGlmeSB0aGVzZSBiYXJjb2RlcyBzaW1wbHkgYXMgdGhvc2Ugd2l0aCBsb3cgdHJhbnNjcmlwdCBjb3VudHMuCk9yLCB3ZSBjYW4gYmUgYSBiaXQgbW9yZSBjbGV2ZXIhCldlIGNhbiBsb29rIGF0IHRoZSB0cmFuc2NyaXB0IGNvdW50cyBfZnJvbV8gdGhlIGxvd2VzdC1jb3VudCBkcm9wbGV0cyB0byBjcmVhdGUgYW4gZXhwZWN0ZWQgZGlzdHJpYnV0aW9uIG9mIHRyYW5zY3JpcHRzIGluIGRyb3BsZXRzIHRoYXQgZG9uJ3QgY29udGFpbiBjZWxscy4KVGhlbiB3ZSBjYW4gdGVzdCBlYWNoIGRyb3BsZXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGl0cyB0cmFuc2NyaXB0IGRpc3RyaWJ1dGlvbiBkZXZpYXRlcyBmcm9tIHRoYXQgZXhwZWN0YXRpb24uCklmIGl0IGRvZXMsIHRoZW4gd2UgaGF2ZSBwcmV0dHkgZ29vZCBldmlkZW5jZSB0aGF0IHRoZXJlIF9pc18gYSBjZWxsIGluIHRoZXJlLgoKVGhpcyB0ZXN0IHdhcyBmaXJzdCBwcm9wb3NlZCBieSBbTHVuIF9ldCBhbC5fICgyMDE5KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExODYvczEzMDU5LTAxOS0xNjYyLXkpIGFuZCBpbXBsZW1lbnRlZCBhcyBgZW1wdHlEcm9wcygpYCBpbiB0aGUgYERyb3BsZXRVdGlsc2AgcGFja2FnZS4KVGhpcyBtZXRob2Qgd2FzIHRoZW4gYWRvcHRlZCwgd2l0aCBzb21lIG1vZGlmaWNhdGlvbnMsIGFzIHRoZSBkZWZhdWx0IGNlbGwgZmlsdGVyaW5nIG1ldGhvZCB1c2VkIGJ5IENlbGwgUmFuZ2VyLgpIZXJlIHdlIHdpbGwgdXNlIHRoZSBbYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgIGZ1bmN0aW9uXShodHRwczovL3JkcnIuaW8vZ2l0aHViL01hcmlvbmlMYWIvRHJvcGxldFV0aWxzL21hbi9lbXB0eURyb3BzQ2VsbFJhbmdlci5odG1sKSB0byBwZXJmb3JtIGZpbHRlcmluZyB0aGF0IG1vcmUgY2xvc2VseSBtYXRjaGVzIHRoZSBDZWxsIFJhbmdlciBpbXBsZW1lbnRhdGlvbi4KCgpgYGB7ciBjYWxjdWxhdGUgZHJvcGxldCBzdGF0cywgbGl2ZT1UUlVFfQojIGNyZWF0ZSBhIHRhYmxlIG9mIHN0YXRpc3RpY3MgdXNpbmcgZW1wdHlEcm9wc0NlbGxSYW5nZXIKZHJvcGxldF9kZiA8LSBEcm9wbGV0VXRpbHM6OmVtcHR5RHJvcHNDZWxsUmFuZ2VyKHJhd19zY2UpCmBgYAoKTW9zdCB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYE5BYCwgYmVjYXVzZSBpbmRpdmlkdWFsIHN0YXRpc3RpY3Mgd2VyZSBub3QgY2FsY3VsYXRlZCBmb3IgdGhlIGxvdy1jb3VudCBkcm9wbGV0cyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYmFja2dyb3VuZCBkaXN0cmlidXRpb24uCihNb3N0IGRyb3BsZXRzIGRvbid0IGhhdmUgY2VsbHMsIHNvIHRoaXMgbWFrZXMgc29tZSBzZW5zZSEpCgpXZSBjYW4gbG9vayBhdCBqdXN0IHRoZSByb3dzIHdpdGhvdXQgYE5BYCB2YWx1ZXMgYnkgc2VsZWN0ZWQgdGhlIG9uZXMgd2hlcmUgdGhlIEZEUiAod2hpY2ggd2Ugd2lsbCB1c2UgYWdhaW4gc29vbiksIGlzIG5vdCBgTkFgLgoKYGBge3IgZHJvcGxldCBzdGF0c30KIyB2aWV3IHJvd3Mgd2hlcmUgRkRSIGlzIG5vdCBgTkFgCmRyb3BsZXRfZGZbIWlzLm5hKGRyb3BsZXRfZGYkRkRSKSwgXQpgYGAKWW91IHdpbGwgbm90aWNlIHRoYXQgc29tZSBjZWxscyB3aXRoIGhpZ2ggY291bnRzIGFsc28gaGF2ZSBgTkFgIHZhbHVlcyBmb3IgbWFueSBzdGF0aXN0aWNzLgpJbiB0aG9zZSBjYXNlcywgYE5BYCB2YWx1ZXMgYXJlIGFjdHVhbGx5IHByZXNlbnQgX2JlY2F1c2VfIG9mIHRoZSBoaWdoIGNvdW50cyAtIGBlbXB0eURyb3BzQ2VsbFJhbmdlcigpYCBhdXRvbWF0aWNhbGx5IGFzc3VtZWQgY2VsbHMgd2VyZSBwcmVzZW50LCBzbyB0aGV5IHdlcmUgYWxzbyBub3QgdGVzdGVkLgoKTm93IHdlIGNhbiBmaWx0ZXIgb3VyIGByYXdfc2NlYCBvYmplY3QgX2J5IGNvbHVtbl8gdG8gb25seSBrZWVwIHRoZSBjZWxscyB3aXRoIGEgc21hbGwgRkRSOiB0aG9zZSB0aGF0IGFyZSBxdWl0ZSB1bmxpa2VseSB0byBiZSBlbXB0eSBkcm9wbGV0cy4KCmBgYHtyIGZpbHRlciBlbXB0eWRyb3BzLCBsaXZlPVRSVUV9CiMgZmlsdGVyIGRyb3BsZXRzIHVzaW5nIGB3aGljaGAgdG8gcHJldmVudCBOQSB0cm91YmxlCmNlbGxzX3RvX3JldGFpbiA8LSB3aGljaChkcm9wbGV0X2RmJEZEUiA8IDAuMDEpCmZpbHRlcmVkX3NjZSA8LSByYXdfc2NlWywgY2VsbHNfdG9fcmV0YWluXQpgYGAKCkhvdyBtYW55IGNlbGxzIGRvIHdlIGhhdmUgbm93PwoKYGBge3IgZmlsdGVyZWQgc3VtbWFyeX0KZmlsdGVyZWRfc2NlCmBgYAoKIyMjIEFkZGl0aW9uYWwgcXVhbGl0eSBjb250cm9sCgpJbiBhZGRpdGlvbiB0byBmaWx0ZXJpbmcgb3V0IGVtcHR5IGRyb3BsZXRzLCB3ZSBhbHNvIHdpbGwgd2FudCB0byBmaWx0ZXIgb3V0IGNlbGxzIHRoYXQgbWF5IGhhdmUgYmVlbiBkYW1hZ2VkIGR1cmluZyBsaWJyYXJ5IHByZXBhcmF0aW9uLgpUaGVzZSB3aWxsIG9mdGVuIGJlIGNoYXJhY3Rlcml6ZWQgYnkgYSBoaWdoIHByb3BvcnRpb24gb2YgbWl0b2Nob25kcmlhbCB0cmFuc2NyaXB0cyBhbmQgYSBzbWFsbGVyIG92ZXJhbGwgbnVtYmVyIG9mIHVuaXF1ZSB0cmFuc2NyaXB0cy4KV2hlbiBhIGNlbGwgcnVwdHVyZXMsIGN5dG9wbGFzbWljIHRyYW5zY3JpcHRzIHdpbGwgbGVhayBvdXQsIGJ1dCBtaXRvY2hvbmRyaWFsIHRyYW5zY3JpcHRzLCBzdGlsbCBwcm90ZWN0ZWQgYnkgdGhlIG1pdG9jaG9uZHJpYWwgbWVtYnJhbmUsIG1heSByZW1haW4uCkFzIGEgY29uc2VxdWVuY2UsIHRoZXJlIHdpbGwgYmUgYW4gb3Zlci1hYnVuZGFuY2Ugb2YgbWl0b2Nob25kcmlhbCByZWFkcywgYW5kIGZld2VyIHVuaXF1ZSB0cmFuc2NyaXB0cyBleHByZXNzZWQuCgpPdXIgZmlyc3Qgc3RlcCB0aGVuLCBpcyBjcmVhdGUgYSB2ZWN0b3Igb2YgdGhlIG1pdG9jaG9uZHJpYWwgZ2VuZXMgdGhhdCBhcmUgcHJlc2VudCBpbiBvdXIgZGF0YXNldC4KVGhlIG1pdG9jaG9uZHJpYWwgZmlsZSB3ZSBkZWZpbmVkIGR1cmluZyBzZXR1cCAoYG1pdG9fZmlsZWApIGlzIGEgVFNWIGZpbGUgY29udGFpbmluZyBhbGwgb2YgdGhlIGh1bWFuIG1pdG9jaG9uZHJpYWwgZ2VuZXMgd2l0aCBhZGRpdGlvbmFsIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIGVhY2ggZ2VuZSwgc3VjaCBhcyB0aGUgZ2VuZSBsb2NhdGlvbiBhbmQgYWx0ZXJuYXRpdmUgbmFtZXMuCihGb3IgbW9yZSBkZXRhaWwgb24gdGhlIHN0ZXBzIHdlIHRvb2sgdG8gY3JlYXRlIHRoaXMgZmlsZSwgeW91IGNhbiBsb29rIGF0IFtvbmUgb2Ygb3VyIHNldHVwIG5vdGVib29rc10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvdHJhaW5pbmctbW9kdWxlcy9ibG9iL21hc3Rlci9zY1JOQS1zZXEtYWR2YW5jZWQvc2V0dXAvbWl0b19nZW5lX2xpc3RzLlJtZCkpCgpBbGwgd2UgbmVlZCBub3cgaXMgdGhlIGBnZW5lX2lkYCwgYW5kIG9ubHkgZm9yIHRoZSBnZW5lcyB0aGF0IGFyZSBwcmVzZW50IGluIG91ciBTQ0UsIHNvIHdlIHdpbGwgZG8gc29tZSBmaWx0ZXJpbmcgd2l0aCBgZHBseXJgIHRvIHB1bGwgb3V0IGEgdmVjdG9yIHdpdGgganVzdCB0aG9zZSBpZHMuCgpgYGB7ciBnZXQgbWl0b2Nob25kcmlhbCBnZW5lc30KIyByZWFkIGluIGEgdGFibGUgb2YgbWl0b2Nob25kcmlhbCBnZW5lcyBhbmQgZXh0cmFjdCBpZHMKbWl0b19nZW5lcyA8LSByZWFkcjo6cmVhZF90c3YobWl0b19maWxlKSB8PgogICMgZmlsdGVyIHRvIG9ubHkgdGhlIGdlbmVzIHRoYXQgYXJlIGZvdW5kIGluIG91ciBkYXRhc2V0CiAgZHBseXI6OmZpbHRlcihnZW5lX2lkICVpbiUgcm93bmFtZXMoZmlsdGVyZWRfc2NlKSkgfD4KICAjIGNyZWF0ZSBhIHZlY3RvciBmcm9tIHRoZSBnZW5lX2lkIGNvbHVtbgogIGRwbHlyOjpwdWxsKGdlbmVfaWQpCmBgYAoKIyMjIENhbGN1bGF0aW5nIHN1bW1hcnkgUUMgc3RhdGlzdGljcwoKV2UgY2FuIG5vdyB1c2UgdGhlIGBzY3V0dGxlYCBmdW5jdGlvbiBgYWRkUGVyQ2VsbFFDKClgIHRvIGNhbGN1bGF0ZSBzb21lIHN0YXRpc3RpY3MgYmFzZWQgb24gdGhlIGNvdW50cyBtYXRyaXgsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGBjb2xEYXRhYCB0YWJsZS4KCkluIGFkZGl0aW9uIHRvIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3MgbGlrZSB0aGUgdG90YWwgcmVhZCBjb3VudCBmb3IgZWFjaCBjZWxsIGFuZCB0aGUgbnVtYmVyIG9mIHRyYW5zY3JpcHRzIHRoYXQgYXJlIGRldGVjdGVkLCB3ZSBjYW4gYWxzbyBjYWxjdWxhdGUgdGhvc2Ugc3RhdGlzdGljcyBmb3IgZGVmaW5lZCBzdWJzZXRzIG9mIGdlbmVzLgpJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdXNlIG91ciBgbWl0b19nZW5lc2AgdmVjdG9yIHRvIGRlZmluZSBhIHN1YnNldCBjYWxsZWQgYG1pdG9gLgpUaGUgYG1pdG9gIG5hbWUgaXMgaW1wb3J0YW50IGluIHRoYXQgaXQgaXMgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIGV4cGVjdGVkIGJ5IGEgbGF0ZXIgZnVuY3Rpb24uCihXZSBjb3VsZCBkZWZpbmUgbW9yZSBzdWJzZXRzLCBidXQgZm9yIG5vdyB0aGlzIG9uZSB3aWxsIGRvLikKCmBgYHtyIHBlciBjZWxsIFFDLCBsaXZlPVRSVUV9CmZpbHRlcmVkX3NjZSA8LSBzY3V0dGxlOjphZGRQZXJDZWxsUUMoCiAgZmlsdGVyZWRfc2NlLAogIHN1YnNldHMgPSBsaXN0KG1pdG8gPSBtaXRvX2dlbmVzKQopCmBgYAoKTm93IHdlIGNhbiBsb29rIGF0IHRoZSBjb2xEYXRhIHRvIHNlZSB3aGF0IHdhcyBhZGRlZDoKCmBgYHtyIHZpZXcgY29sRGF0YSBzdGF0c30KaGVhZChjb2xEYXRhKGZpbHRlcmVkX3NjZSkpCmBgYAoKV2UgY2FuIGFsc28gcGxvdCBzb21lIG9mIHRoZXNlIHN0YXRpc3RpY3MsIGhlcmUgdXNpbmcgdGhlIGBwbG90TWV0cmljcygpYCBmdW5jdGlvbiBmcm9tIHRoZSBgbWlRQ2AgcGFja2FnZSB0byBwbG90IHRoZSBwZXJjZW50IG9mIHJlYWRzIHRoYXQgYXJlIG1pdG9jaG9uZHJpYWwgKHRoZSBgc3Vic2V0c19taXRvX3BlcmNlbnRgIGNvbHVtbikgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBnZW5lcyBkZXRlY3RlZCAodGhlIGBkZXRlY3RlZGAgY29sdW1uKSBmb3IgZWFjaCBjZWxsLgoKYGBge3IgbWlRQyBwbG90TWV0cmljc30KIyB1c2UgbWlRQzo6cGxvdE1ldHJpY3MoKQptaVFDOjpwbG90TWV0cmljcyhmaWx0ZXJlZF9zY2UpICsgdGhlbWVfYncoKQpgYGAKCldlIGNhbiBzZWUgdGhhdCB0aGVyZSBpcyBhIHJhbmdlIG9mIG1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZXMsIGFuZCBpdCBkb2VzIGFsc28gc2VlbSB0aGF0IGNlbGxzIHdpdGggaGlnaCBwZXJjZW50YWdlcyBvZiBtaXRvY2hvbmRyaWFsIGdlbmVzIGRvbid0IHNlZW0gdG8gY29udGFpbiB2ZXJ5IG1hbnkgdW5pcXVlIGdlbmVzLgoKSG93IGRvIHdlIGZpbHRlciB3aXRoIHRoaXMgaW5mb3JtYXRpb24/Ck9uZSBvcHRpb24gaXMgdG8gZGVmaW5lIGEgY3V0b2ZmIGZvciB0aGUgbWl0b2Nob25kcmlhbCBwZXJjZW50YWdlIGFib3ZlIHdoaWNoIHdlIGNhbGwgYSBjZWxsIGNvbXByb21pc2VkIGFuZCBleGNsdWRlIGl0IGZyb20gZnVydGhlciBhbmFseXNpcy4KSG93ZXZlciwgY2hvb3NpbmcgdGhhdCBjdXRvZmYgY2FuIGJlIGEgYml0IGZyYXVnaHQsIGFzIHRoZSBleHBlY3RlZCBwZXJjZW50YWdlIG9mIG1pdG9jaG9uZHJpYWwgcmVhZHMgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBjZWxsIHR5cGUgYW5kIGxpYnJhcnkgcHJlcGFyYXRpb24gbWV0aG9kcy4KU28gaXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgbWV0aG9kIHRvIGRldGVybWluZSB0aGF0IGN1dG9mZiBmcm9tIHRoZSBkYXRhIGl0c2VsZi4KCiMjIyBGaWx0ZXJpbmcgY29tcHJvbWlzZWQgY2VsbHMKCkRldGVybWluaW5nIG1pdG9jaG9uZHJpYWwgY3V0b2ZmcyBpcyBleGFjdGx5IHdoYXQgdGhlIGBtaVFDYCBwYWNrYWdlIGRvZXMgKFtIaXBwZW4gX2V0IGFsLl8gMjAyMV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEzNzEvam91cm5hbC5wY2JpLjEwMDkyOTApKSEKSW4gdHJ1dGgsIGl0IGRvZXMgc29tZXRoaW5nIHBvc3NpYmx5IGV2ZW4gYSBiaXQgYmV0dGVyOiBpdCBmaXRzIGEgbWl4dHVyZSBtb2RlbCB0byB0aGUgZGF0YSB0aGF0IGNvbnNpc3RzIG9mIGRpc3RyaWJ1dGlvbnMgb2YgaGVhbHRoeSBjZWxscyBhbmQgY29tcHJvbWlzZWQgY2VsbHMuClRoZW4gd2UgY2FuIGNhbGN1bGF0ZSB3aGV0aGVyIGVhY2ggY2VsbCBpcyBtb3JlIGxpa2VseSB0byBiZWxvbmcgdG8gdGhlIGhlYWx0aHkgb3IgY29tcHJvbWlzZWQgZGlzdHJpYnV0aW9uLgpXZSBjYW4gdGhlbiBleGNsdWRlIHRoZSBjZWxscyB0aGF0IGFyZSBtb3JlIGxpa2VseSB0byBiZSBjb21wcm9taXNlZC4KClRvIHVzZSBgbWlRQ2AsIHdlIGZpcnN0IGZpdCBhIG1vZGVsIHRvIHRoZSBkYXRhIGluIG91ciBTQ0Ugb2JqZWN0OgoKYGBge3IgbWlRQyBtb2RlbCwgbGl2ZT1UUlVFfQojIGZpdCB0aGUgbWlRQyBtb2RlbAptaXFjX21vZGVsIDwtIG1pUUM6Om1peHR1cmVNb2RlbChmaWx0ZXJlZF9zY2UpCmBgYAoKTm93IHdlIGNhbiBwbG90IHRoZSBtb2RlbCByZXN1bHRzIHVzaW5nIHRoZSBgcGxvdE1vZGVsKClgIGZ1bmN0aW9uIHRvIHNlZSBob3cgaXQgY29ycmVzcG9uZHMgdG8gb3VyIGRhdGEuCldlIHNob3VsZCBleHBlY3QgdG8gc2VlIHR3byBmaXQgbGluZXM6CgotIE9uZSBsaW5lIHdpbGwgY29ycmVzcG9uZCB0aGUgdGhlICJoZWFsdGh5IiBjZWxscyBhbmQgc2hvdWxkIHNob3cgbGl0dGxlIHRvIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgdW5pcXVlIGdlbmVzIGRldGVjdGVkIGFuZCB0aGUgbWl0b2Nob25kcmlhbCBwZXJjZW50YWdlLgotIEJ5IGNvbnRyYXN0LCB0aGUgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvICJjb21wcm9taXNlZCIgY2VsbHMgd2lsbCBzaG93IGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiB1bmlxdWUgZ2VuZXMgZGV0ZWN0ZWQgYW5kIHRoZSBtaXRvY2hvbmRyaWFsIHBlcmNlbnRhZ2UuCgpUaGlzIHBsb3Qgd2lsbCBhbHNvIHNob3csIGZvciBlYWNoIGNlbGwsIHRoZSBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkgdGhhdCB0aGUgY2VsbCBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbXByb21pc2VkIGRpc3RyaWJ1dGlvbjsgYSBoaWdoZXIgc2NvcmUgaW5kaWNhdGVzIHRoYXQgYSBjZWxsIGlzIG1vcmUgbGlrZWx5IHRvIGJlIGNvbXByb21pc2VkLgoKSXQgaXMgYWxzbyBjcml0aWNhbCB0byBub3RlIHRoYXQgdGhpcyBtb2RlbCBjYW4gX2FuZCBkb2VzXyBmYWlsIGF0IHRpbWVzLgpQbG90dGluZyB0aGUgcmVzdWx0cyBhcyB3ZSBoYXZlIGRvbmUgaGVyZSBpcyBub3QgYSBzdGVwIHRvIHNraXAuCioqQWx3YXlzIGxvb2sgYXQgeW91ciBkYXRhISoqCgpgYGB7ciBtaVFDIHBsb3RNb2RlbCwgbGl2ZT1UUlVFfQojIHBsb3QgdGhlIG1pUUMgbW9kZWwKbWlRQzo6cGxvdE1vZGVsKGZpbHRlcmVkX3NjZSwgbWlxY19tb2RlbCkgKwogIHRoZW1lX2J3KCkKYGBgCgpXZSBjYW4gbm93IGZpbHRlciBvdXIgZGF0YSBiYXNlZCBvbiB0aGUgcHJvYmFiaWxpdHkgY29tcHJvbWlzZWQgYXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBtb2RlbC4KQnV0IGJlZm9yZSB3ZSBkbyB0aGF0LCB3ZSBtaWdodCB3YW50IHRvIHF1aWNrbHkgcGxvdCB0byBzZWUgd2hhdCB3b3VsZCBiZSBmaWx0ZXJlZCBvdXQgd2l0aCBhIGdpdmVuIGN1dG9mZiwgdXNpbmcgdGhlIGBwbG90RmlsdGVyaW5nKClgIGZ1bmN0aW9uLgpUaGUgZGVmYXVsdCBpcyB0byBleGNsdWRlIGNlbGxzIHRoYXQgaGF2ZSBhIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBvZiAwLjc1IG9yIGdyZWF0ZXIgb2YgYmVpbmcgY29tcHJvbWlzZWQuCldlIHN0aWNrIHdpdGggdGhhdCBkZWZhdWx0LCBidXQgZm9yIGNsYXJpdHksIHdlIHdpbGwgYWxzbyBpbmNsdWRlIGl0IGluIG91ciBjb2RlIQoKCmBgYHtyIG1pUUMgcGxvdEZpbHRlcmluZ30KIyBsb29rIGF0IG1pUUMgZmlsdGVyaW5nCm1pUUM6OnBsb3RGaWx0ZXJpbmcoCiAgZmlsdGVyZWRfc2NlLAogIG1pcWNfbW9kZWwsCiAgcG9zdGVyaW9yX2N1dG9mZiA9IDAuNzUKKSArCiAgdGhlbWVfYncoKQpgYGAKCkluIHRoaXMgY2FzZSwgdGhlIGxpbmUgYmV0d2VlbiB0aGUgY2VsbHMgdG8gYmUga2VwdCBhbmQgdGhvc2UgdGhhdCB3aWxsIGJlIHJlbW92ZWQgc2VlbXMgdG8gY29ycmVzcG9uZCB0byBhIG1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZSBvZiBhYm91dCAxMi41JSwgYnV0IG5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IGFsd2F5cyBiZSBjb25zdGFudC4KVGhlIGN1dG9mZiBwb2ludCBjYW4gdmFyeSBmb3IgZGlmZmVyZW50IG51bWJlcnMgb2YgdW5pcXVlIGdlbmVzIHdpdGhpbiBhIHNhbXBsZSwgYW5kIGl0IHdpbGwgY2VydGFpbmx5IHZhcnkgYW1vbmcgc2FtcGxlcyEKCkF0IHRoaXMgcG9pbnQsIHdlIGNhbiBwZXJmb3JtIHRoZSBhY3R1YWwgZmlsdGVyaW5nIHVzaW5nIHRoZSBgZmlsdGVyQ2VsbHMoKWAgZnVuY3Rpb24sIGdpdmluZyB1cyBhIGZ1cnRoZXIgZmlsdGVyZWQgU0NFIG9iamVjdC4KCmBgYHtyIG1pUUMgZmlsdGVyY2VsbHMsIGxpdmU9VFJVRX0KIyBwZXJmb3JtIG1pUUMgZmlsdGVyaW5nCnFjZmlsdGVyZWRfc2NlIDwtIG1pUUM6OmZpbHRlckNlbGxzKAogIGZpbHRlcmVkX3NjZSwKICBtb2RlbCA9IG1pcWNfbW9kZWwKKQpgYGAKCiMjIyMgT25lIG1vcmUgZmlsdGVyOiB1bmlxdWUgZ2VuZSBjb3VudAoKV2hpbGUgdGhlIG1pUUMgZmlsdGVyaW5nIGlzIHByZXR0eSBnb29kLCB5b3UgbWF5IGhhdmUgbm90aWNlZCB0aGF0IGl0IHN0aWxsIGxlZnQgc29tZSBjZWxscyB0aGF0IGhhZCB2ZXJ5IGxvdyBudW1iZXJzIG9mIHVuaXF1ZSBnZW5lcy4KV2hpbGUgdGhlc2UgY2VsbHMgbWF5IG5vdCBiZSBjb21wcm9taXNlZCwgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlbSBpcyBhbHNvIG5vdCBsaWtlbHkgdG8gYmUgdXNlZnVsLCBzbyB3ZSB3aWxsIGZpbHRlciB0aG9zZSBhcyB3ZWxsLgpXZSB3aWxsIG9ubHkga2VlcCBjZWxscyB0aGF0IGhhdmUgYXQgbGVhc3QgMjAwIHVuaXF1ZSBnZW5lcy4KCmBgYHtyIHVuaXF1ZSBjdXRvZmYsIGxpdmU9VFJVRX0KIyBmaWx0ZXIgY2VsbHMgYnkgdW5pcXVlIGdlbmUgY291bnQgKGBkZXRlY3RlZGApCnFjZmlsdGVyZWRfc2NlIDwtIHFjZmlsdGVyZWRfc2NlWywgd2hpY2gocWNmaWx0ZXJlZF9zY2UkZGV0ZWN0ZWQgPj0gMjAwKV0KcWNmaWx0ZXJlZF9zY2UKYGBgCgoKIyMgTm9ybWFsaXphdGlvbgoKTm93IHRoYXQgd2UgaGF2ZSBkb25lIG91ciBmaWx0ZXJpbmcsIHdlIGNhbiBzdGFydCBhbmFseXppbmcgdGhlIGV4cHJlc3Npb24gY291bnRzIGZvciB0aGUgcmVtYWluaW5nIGNlbGxzLgoKVGhlIG5leHQgc3RlcCBhdCB0aGlzIHBvaW50IGlzIHRvIGNvbnZlcnQgdGhlIHJhdyBjb3VudHMgaW50byBhIG1lYXN1cmUgdGhhdCBhY2NvdW50cyBmb3IgZGlmZmVyZW5jZXMgaW4gc2VxdWVuY2luZyBkZXB0aCBiZXR3ZWVuIGNlbGxzLCBhbmQgdG8gY29udmVydCB0aGUgZGlzdHJpYnV0aW9uIG9mIGV4cHJlc3Npb24gdmFsdWVzIGZyb20gdGhlIHNrZXdlZCBkaXN0cmlidXRpb24gd2UgZXhwZWN0IHRvIHNlZSBpbiByYXcgY291bnRzIHRvIG9uZSB0aGF0IGlzIG1vcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuCgpXZSB3aWxsIGRvIHRoaXMgdXNpbmcgZnVuY3Rpb25zIGZyb20gdGhlIGBzY3JhbmAgYW5kIGBzY3V0dGxlYCBwYWNrYWdlcy4KVGhlIHByb2NlZHVyZSB3ZSB3aWxsIHVzZSBoZXJlIGlzIGRlcml2ZWQgZnJvbSB0aGUgW09TQ0EgY2hhcHRlciBvbiBub3JtYWxpemF0aW9uXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE5L09TQ0EuYmFzaWMvbm9ybWFsaXphdGlvbi5odG1sI25vcm1hbGl6YXRpb24tYnktZGVjb252b2x1dGlvbikuClRoZSBpZGVhIGlzIHRoYXQgdGhlIHZhcnlpbmcgZXhwcmVzc2lvbiBwYXR0ZXJucyB0aGF0IGRpZmZlcmVudCBjZWxsIHR5cGVzIGV4aGliaXQgd2lsbCBhZmZlY3QgdGhlIHNjYWxpbmcgZmFjdG9ycyB0aGF0IHdlIHdvdWxkIGFwcGx5LgpUbyBhY2NvdW50IGZvciB0aGF0IHZhcmlhdGlvbiwgd2UgZmlyc3QgZG8gYSByb3VnaCBjbHVzdGVyaW5nIG9mIGNlbGxzIGJ5IHRoZWlyIGV4cHJlc3Npb24gd2l0aCBgc2NyYW46OnF1aWNrQ2x1c3RlcigpYCwgdGhlbiB1c2UgdGhhdCBjbHVzdGVyaW5nIHRvIGNhbGN1bGF0ZSB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIGVhY2ggY2VsbCB3aXRoaW4gdGhlIGNsdXN0ZXJzIHVzaW5nIGBzY3Jhbjo6Y29tcHV0ZVN1bUZhY3RvcnMoKWAuCkZpbmFsbHksIHdlIGFwcGx5IHRoZSBzY2FsaW5nIGZhY3RvciB0byB0aGUgZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIGVhY2ggY2VsbCBhbmQgY2FsY3VsYXRlIHRoZSBsb2ctc2NhbGVkIGV4cHJlc3Npb24gdmFsdWVzIHVzaW5nIHRoZSBgc2N1dHRsZTo6bG9nTm9ybUNvdW50cygpYCBmdW5jdGlvbi4KCmBgYHtyIG5vcm1hbGl6YXRpb24sIGxpdmU9VFJVRX0KIyBQZXJmb3JtIHJvdWdoIGNsdXN0ZXJpbmcKcWNsdXN0IDwtIHNjcmFuOjpxdWlja0NsdXN0ZXIocWNmaWx0ZXJlZF9zY2UpCgojIHVzZSBjbHVzdGVycyB0byBjb21wdXRlIHNjYWxpbmcgZmFjdG9ycyBhbmQgYWRkIHRvIFNDRSBvYmplY3QKcWNmaWx0ZXJlZF9zY2UgPC0gc2NyYW46OmNvbXB1dGVTdW1GYWN0b3JzKAogIHFjZmlsdGVyZWRfc2NlLAogIGNsdXN0ZXJzID0gcWNsdXN0CikKCiMgcGVyZm9ybSBub3JtYWxpemF0aW9uIHVzaW5nIHNjYWxpbmcgZmFjdG9ycwojIGFuZCBzYXZlIGFzIGEgbmV3IFNDRSBvYmplY3QKbm9ybWFsaXplZF9zY2UgPC0gc2N1dHRsZTo6bG9nTm9ybUNvdW50cyhxY2ZpbHRlcmVkX3NjZSkKYGBgCgpUaGlzIGNyZWF0ZXMgYSBuZXcgImFzc2F5IiBpbiB0aGUgYG5vcm1hbGl6ZWRfc2NlYCBvYmplY3QsIGBsb2djb3VudHNgLCB3aGljaCBjb250YWlucyB0aGUgbm9ybWFsaXplZCBjb3VudCB2YWx1ZXMgZm9yIGVhY2ggY2VsbCBhbmQgZ2VuZS4KKFRoZSBkYXRhIGhlcmUgYXJlIG5vdCBfYWN0dWFsbHlfIHRoZSBsb2cgb2YgdGhlIGNvdW50cywgc2luY2Ugd2UgYWxzbyBhcHBsaWVkIHRoZSBzY2FsaW5nIGZhY3RvcnMsIGJ1dCB0aGF0IG5hbWUgaXMgdXNlZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLikKCkxldCdzIHRha2UgYSBsb29rOgoKYGBge3Igbm9ybWFsaXplZCBzY2V9Cm5vcm1hbGl6ZWRfc2NlCmBgYAoKIyMgRGltZW5zaW9uIHJlZHVjdGlvbgoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBEaW1lbnNpb24gcmVkdWN0aW9uXShkaWFncmFtcy9yb2FkbWFwX3NpbmdsZV9kaW1lbnNpb25fcmVkdWN0aW9uLnBuZykKCk5vdyB0aGF0IHdlIGhhdmUgbm9ybWFsaXplZCBleHByZXNzaW9uIHZhbHVlcywgd2Ugd291bGQgbGlrZSB0byBwcm9kdWNlIHNvbWUgcmVkdWNlZC1kaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBkYXRhLgpUaGVzZSB3aWxsIGFsbG93IHVzIHRvIHBlcmZvcm0gc29tZSBkb3duc3RyZWFtIGNhbGN1bGF0aW9ucyBtb3JlIHF1aWNrbHksIHJlZHVjZSBzb21lIG9mIHRoZSBub2lzZSBpbiB0aGUgZGF0YSwgYW5kIGFsbG93IHVzIHRvIHZpc3VhbGl6ZSBvdmVyYWxsIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2VsbHMgbW9yZSBlYXNpbHkgKHRob3VnaCB3aXRoIG1hbnkgY2F2ZWF0cyEpLgoKIyMjIFNlbGVjdGluZyBoaWdobHkgdmFyaWFibGUgZ2VuZXMKCldoaWxlIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIHVzaW5nIGFsbCBvZiB0aGUgZ2VuZXMgdGhhdCB3ZSBoYXZlIGFzc2F5ZWQsIGluIHByYWN0aWNlIG1vc3Qgb2YgdGhlIGdlbmVzIHdpbGwgaGF2ZSB2ZXJ5IGxpdHRsZSB2YXJpYXRpb24gaW4gZXhwcmVzc2lvbiwgc28gZG9pbmcgc28gd2lsbCBub3QgcHJvdmlkZSBtdWNoIGFkZGl0aW9uYWwgc2lnbmFsLgpSZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGdlbmVzIHdlIGluY2x1ZGUgd2lsbCBhbHNvIHNwZWVkIHVwIHNvbWUgb2YgdGhlIGNhbGN1bGF0aW9ucy4KClRvIGlkZW50aWZ5IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzLCB3ZSB3aWxsIHVzZSBmdW5jdGlvbnMgZnJvbSB0aGUgYHNjcmFuYCBwYWNrYWdlLgpUaGUgZmlyc3QgZnVuY3Rpb24sIGBtb2RlbEdlbmVWYXIoKWAsIGF0dGVtcHRzIHRvIGRpdmlkZSB0aGUgdmFyaWF0aW9uIG9ic2VydmVkIGZvciBlYWNoIGdlbmUgaW50byBhIGJpb2xvZ2ljYWwgYW5kIHRlY2huaWNhbCBjb21wb25lbnQsIHdpdGggdGhlIGludHVpdGlvbiB0aGF0IGdlbmVzIHdpdGggbG93ZXIgbWVhbiBleHByZXNzaW9uIHRlbmQgdG8gaGF2ZSBsb3dlciB2YXJpYW5jZSBmb3IgcHVyZWx5IHRlY2huaWNhbCByZWFzb25zLgpXZSB0aGVuIHByb3ZpZGUgdGhlIGBtb2RlbEdlbmVWYXIoKWAgb3V0cHV0IHRvIHRoZSBgZ2V0VG9wSFZHcygpYCBmdW5jdGlvbiB0byBpZGVudGlmeSB0aGUgZ2VuZXMgd2l0aCB0aGUgaGlnaGVzdCBfYmlvbG9naWNhbF8gdmFyaWF0aW9uLCB3aGljaCBpcyB3aGF0IHdlIGFyZSBtb3N0IGludGVyZXN0ZWQgaW4uCgpgYGB7ciBzZWxlY3QgSFZHc30KIyBpZGVudGlmeSAyMDAwIGdlbmVzCm51bV9nZW5lcyA8LSAyMDAwCgojIG1vZGVsIHZhcmlhbmNlLCBwYXJ0aXRpb25pbmcgaW50byBiaW9sb2dpY2FsIGFuZCB0ZWNobmljYWwgdmFyaWF0aW9uCmdlbmVfdmFyaWFuY2UgPC0gc2NyYW46Om1vZGVsR2VuZVZhcihub3JtYWxpemVkX3NjZSkKCiMgZ2V0IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzCmh2X2dlbmVzIDwtIHNjcmFuOjpnZXRUb3BIVkdzKAogIGdlbmVfdmFyaWFuY2UsCiAgbiA9IG51bV9nZW5lcwopCmBgYAoKVGhlIHJlc3VsdCBpcyBhIHZlY3RvciBvZiBnZW5lIGlkcyAob3JkZXJlZCBmcm9tIG1vc3QgdG8gbGVhc3QgdmFyaWFibGUpOgoKYGBge3IgdmlldyBIVkdzfQpoZWFkKGh2X2dlbmVzKQpgYGAKCiMjIyBQcmluY2lwYWwgY29tcG9uZW50cyBhbmFseXNpcwoKTm93IHRoYXQgd2UgaGF2ZSBzZWxlY3RlZCB0aGUgZ2VuZXMgd2Ugd291bGQgbGlrZSB0byB1c2UgZm9yIHRoZSByZWR1Y2VkLWRpbWVuc2lvbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGV4cHJlc3Npb24gZGF0YSwgd2UgY2FuIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGVtLgpGaXJzdCB3ZSB3aWxsIHVzZSB0aGUgYHNjYXRlcjo6cnVuUENBKClgIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudHMgZnJvbSB0aGUgZXhwcmVzc2lvbiBtYXRyaXguClRoaXMgcmVwcmVzZW50YXRpb24gaXMgZmFzdCBhbmQgZmFpcmx5IHJvYnVzdCwgYnV0IHRoZSByZXN1bHQgaXMgc3RpbGwgcXVpdGUgbXVsdGlkaW1lbnNpb25hbC4KV2Ugd2FudCBrZWVwIGEgZmFpciBudW1iZXIgb2YgY29tcG9uZW50cyAoZGltZW5zaW9ucykgaW4gb3JkZXIgdG8gYWNjdXJhdGVseSByZXByZXNlbnQgdGhlIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSwgYnV0IGRvaW5nIHNvIG1lYW5zIHRoYXQgcGxvdHRpbmcgb25seSBhIGZldyBvZiB0aGVzZSBkaW1lbnNpb25zIChpbiAyRCkgaXMgbm90IGxpa2VseSB0byBwcm92aWRlIGEgZnVsbCB2aWV3IG9mIHRoZSBkYXRhLgoKVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaXMgNTAsIHdoaWNoIHdlIHdpbGwgc3RpY2sgd2l0aCwgYnV0IGxldCdzIGVudGVyIGl0IG1hbnVhbGx5IGp1c3QgZm9yIHRoZSByZWNvcmQuCgpgYGB7ciBydW5QQ0EsIGxpdmU9VFJVRX0KIyBjYWxjdWxhdGUgYW5kIHNhdmUgUENBIHJlc3VsdHMKbm9ybWFsaXplZF9zY2UgPC0gc2NhdGVyOjpydW5QQ0EoCiAgbm9ybWFsaXplZF9zY2UsCiAgbmNvbXBvbmVudHMgPSA1MCwgIyBob3cgbWFueSBjb21wb25lbnRzIHRvIGtlZXAKICBzdWJzZXRfcm93ID0gaHZfZ2VuZXMgIyB1c2Ugb25seSB0aGUgdmFyaWFibGUgZ2VuZXMgd2UgY2hvc2UKKQpgYGAKClRoZXNlIHJlZHVjZWQtZGltZW5zaW9uIHJlc3VsdHMgd2lsbCBiZSBzdG9yZWQgaW4gYSBgcmVkdWNlZERpbWAgc2xvdCBpbiB0aGUgU0NFIG9iamVjdC4KV2UgY2FuIHNlZSB0aGUgbmFtZXMgb2YgdGhlIGByZWR1Y2VkRGltYHMgdGhhdCB3ZSBoYXZlIGJ5IGxvb2tpbmcgYXQgdGhlIG9iamVjdCBzdW1tYXJ5OgoKYGBge3IgdmlldyByZWR1Y2VkIGRpbWVuc2lvbnN9Cm5vcm1hbGl6ZWRfc2NlCmBgYAoKSWYgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBQQ0EgcmVzdWx0cywgd2UgY2FuIGRvIHRoYXQgd2l0aCB0aGUgYHJlZHVjZWREaW0oKWAgZnVuY3Rpb246Ck5vdGUgdGhhdCBmb3IgdGhlc2UgcmVkdWNlZC1kaW1lbnNpb25hbGl0eSBtYXRyaWNlcywgdGhlIHJvd3MgYXJlIHRoZSBjZWxscyBhbmQgdGhlIGNvbHVtbnMgYXJlIHRoZSBQQyBkaW1lbnNpb25zLgoKYGBge3IgZ2V0UmVkdWNlZERpbX0KIyBleHRyYWN0IHRoZSBQQ0EgbWF0cml4CnBjYV9tYXRyaXggPC0gcmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIpCgojIGxvb2sgYXQgdGhlIHNoYXBlIG9mIHRoZSBtYXRyaXgKZGltKHBjYV9tYXRyaXgpCmBgYAoKIyMjIFVNQVAKCkZpbmFsbHksIHdlIHdpbGwgY2FsY3VsYXRlIGEgVU1BUCAoVW5pZm9ybSBNYW5pZm9sZCBBcHByb3hpbWF0aW9uIGFuZCBQcm9qZWN0aW9uKSByZXByZXNlbnRhdGlvbiBvZiBvdXIgZGF0YS4KVGhpcyBpcyBhIG1hY2hpbmUtbGVhcm5pbmctYmFzZWQgbWV0aG9kIHRoYXQgaXMgdXNlZnVsIGZvciBwZXJmb3JtaW5nIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBzdWl0YWJsZSBmb3IgdmlzdWFsaXphdGlvbi4KSXQncyBnb2FsIGlzIHRvIHByb3ZpZGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSBpbiB0d28gZGltZW5zaW9ucyAodHlwaWNhbGx5LCBtb3JlIGFyZSBwb3NzaWJsZSkgdGhhdCBwcmVzZXJ2ZXMgYXMgbXVjaCBvZiB0aGUgZGlzdGFuY2UgcmVsYXRpb25zaGlwcyBhbW9uZyBjZWxscyBhcyBwb3NzaWJsZS4KV2hpbGUgdGhpcyBkb2VzIG1ha2UgZm9yIHZpc3VhbGx5IGFwcGVhbGluZyBhbmQgdXNlZnVsIHBsb3RzLCBpdCBpcyBpbXBvcnRhbnQgbm90IHRvIG92ZXJpbnRlcnByZXQgdGhlIHJlc3VsdHMhCkluIHBhcnRpY3VsYXIsIHdoaWxlIHlvdSB3aWxsIG9mdGVuIHNlZSBzb21lIGFwcGFyZW50IGNsdXN0ZXJpbmcgb2YgY2VsbHMgaW4gdGhlIHJlc3VsdGluZyBvdXRwdXQsIHRob3NlIGNsdXN0ZXJzIG1heSBub3QgYmUgcGFydGljdWxhcmx5IHZhbGlkLCBhbmQgdGhlIHNwYWNpbmcgd2l0aGluIG9yIGJldHdlZW4gY2x1c3RlcnMgbWF5IG5vdCByZWZsZWN0IHRydWUgZGlzdGFuY2VzLgoKSW4gbWFueSB3YXlzIHRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZSBwcm9ibGVtIG9mIHByb2plY3RpbmcgYSBtYXAgb2YgdGhlIGVhcnRoIG9udG8gYSBmbGF0IHN1cmZhY2U7IGFueSBjaG9pY2Ugd2lsbCByZXN1bHQgaW4gc29tZSBkaXN0b3J0aW9ucy4KSG93ZXZlciwgd2l0aCBVTUFQLCB3ZSByYXJlbHkga25vdyBleGFjdGx5IHdoYXQgY2hvaWNlcyB3ZXJlIG1hZGUgYW5kIHdoYXQgZGlzdG9ydGlvbnMgbWlnaHQgaGF2ZSByZXN1bHRlZC4KVGhlIFVNQVAgY29vcmRpbmF0ZXMgdGhlbXNlbHZlcyBzaG91bGQgbmV2ZXIgYmUgdXNlZCBmb3IgZG93bnN0cmVhbSBhbmFseXNpcy4KClNpbmNlIHRoZSBVTUFQIHByb2NlZHVyZSB3b3VsZCBiZSBzbG93IHRvIGNhbGN1bGF0ZSB3aXRoIHRoZSBmdWxsIGRhdGEsIHNvIHRoZSBgcnVuVU1BUCgpYCBmdW5jdGlvbiBmaXJzdCBjYWxjdWxhdGVzIGEgUENBIG1hdHJpeCBhbmQgdGhlbiB1c2VzIF90aGF0XyB0byBjYWxjdWxhdGUgdGhlIFVNQVAuClNpbmNlIHdlIGFscmVhZHkgaGF2ZSBhIFBDQSBtYXRyaXgsIHdlIHdpbGwgdGVsbCB0aGUgZnVuY3Rpb24gdXNlIHRoYXQgaW5zdGVhZCBvZiByZWNhbGN1bGF0aW5nIGl0LgoKYGBge3IgcnVuVU1BUCwgbGl2ZT1UUlVFfQpub3JtYWxpemVkX3NjZSA8LSBzY2F0ZXI6OnJ1blVNQVAoCiAgbm9ybWFsaXplZF9zY2UsCiAgZGltcmVkID0gIlBDQSIKKQpgYGAKCkFzIGJlZm9yZSwgd2UgY291bGQgZXh0cmFjdCB0aGUgVU1BUCBtYXRyaXggZnJvbSBvdXIgU0NFIG9iamVjdCB3aXRoIHRoZSBgcmVkdWNlZERpbSgpYCBmdW5jdGlvbi4KV2UgY2FuIGFsc28gdmlzdWFsaXplIHRoZSBVTUFQIHJlc3VsdHMgdXNpbmcgdGhlIGBwbG90UmVkdWNlZERpbSgpYCBmdW5jdGlvbi4KCmBgYHtyIHBsb3RSZWR1Y2VkRGltLCBsaXZlPVRSVUV9CiMgcGxvdCB0aGUgVU1BUApzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKAogIG5vcm1hbGl6ZWRfc2NlLAogICJVTUFQIiwKICAjIGNvbG9yIGJ5IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmUKICBjb2xvcl9ieSA9IGh2X2dlbmVzWzFdCikKYGBgCgoKIyMgVW5zdXBlcnZpc2VkIGNsdXN0ZXJpbmcKCkFzIGEgZmluYWwgYW5hbHlzaXMgc3RlcCBhdCB0aGlzIHN0YWdlLCB3ZSB3aWxsIHJldHVybiB0byB0aGUgUENBIHJlc3VsdHMgdG8gcGVyZm9ybSB1bnN1cGVydmlzZWQgY2x1c3RlcmluZy4KSGVyZSB3ZSB3aWxsIHVzZSBhIGdyYXBoLWJhc2VkIGNsdXN0ZXJpbmcgbWV0aG9kLCB3aGljaCBzdGFydHMgYnkgaWRlbnRpZnlpbmcgY2VsbHMgdGhhdCBhcmUgY2xvc2UgdG9nZXRoZXIgaW4gdGhlIG11bHRpZGltZW5zaW9uYWwgc3BhY2UuCkl0IHRoZW4gaWRlbnRpZmllcyAiY29tbXVuaXRpZXMiIG9mIGhpZ2hseSBjb25uZWN0ZWQgY2VsbHMsIGFuZCBicmVha3MgdGhlbSBhcGFydCBieSByZWdpb25zIG9mIGxvd2VyIGNvbm5lY3Rpb24uCgpUaGVyZSBhcmUgYSBudW1iZXIgb2YgYWxnb3JpdGhtcyB0aGF0IGNhbiBwZXJmb3JtIHRoaXMgY2x1c3RlcmluZywgZWFjaCB3aXRoIHBhcmFtZXRlcnMgdGhhdCBjYW4gYWZmZWN0IGhvdyBtYW55IGNsdXN0ZXJzIGFyZSBpZGVudGlmaWVkIGFuZCB3aGljaCBjZWxscyBiZWxvbmcgdG8gZWFjaCBjbHVzdGVyLgpJdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHRoZXNlIGNsdXN0ZXJzIG1heSBvciBtYXkgbm90IGNvcnJlc3BvbmQgdG8gImNlbGwgdHlwZXMiIGJ5IHdoYXRldmVyIGRlZmluaXRpb24geW91IG1pZ2h0IHByZWZlciB0byB1c2UuCkludGVycHJldGF0aW9uIG9mIHRoZXNlIGNsdXN0ZXJzLCBvciBvdGhlciBtZWFzdXJlcyBvZiBjZWxsIHR5cGUsIGFyZSBzb21ldGhpbmcgdGhhdCB3aWxsIHJlcXVpcmUgbW9yZSBjYXJlZnVsIGFuZCBsaWtlbHkgbW9yZSBjdXN0b21pemVkIGFuYWx5c2lzLgoKV2Ugd2lsbCBwZXJmb3JtIG91ciBjbHVzdGVyaW5nIHVzaW5nIHRoZSBmdW5jdGlvbiBgc2NyYW46OmNsdXN0ZXJDZWxsc2AsIHdoaWNoIGNhbiBwZXJmb3JtIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIGNsdXN0ZXJpbmcgdXNpbmcgdGhlIEJpb2NvbmR1Y3RvciBgYmx1c3RlcmAgcGFja2FnZSB1bmRlciB0aGUgaG9vZC4KQXMgbWVudGlvbmVkIGVhcmxpZXIsIHdlIGFyZSB1c2luZyAiZ3JhcGgiIGNsdXN0ZXJpbmcsIHdoaWNoIHdlIGRlZmluZSB1c2luZyB0aGUgYGJsdXN0ZXI6Ok5OR3JhcGhQYXJhbSgpYCBmdW5jdGlvbi4KV2l0aGluIHRoYXQgYXJlIGEgbnVtYmVyIG9mIGZ1cnRoZXIgb3B0aW9ucywgc3VjaCBhcyB0aGUgd2VpZ2h0aW5nIHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSBuZXR3b3JrIGdyYXBoIGFuZCB0aGUgYWxnb3JpdGhtIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBncmFwaCBpbnRvIGNsdXN0ZXJzLgoKTW9kaWZ5aW5nIHRoZXNlIHBhcmFtZXRlcnMgY2FuIHJlc3VsdCBpbiBxdWl0ZSBkaWZmZXJlbnQgY2x1c3RlciBhc3NpZ25tZW50cyEKRm9yIHRoZSBjbHVzdGVyaW5nIGJlbG93IHdlIHdpbGwgdXNlIEphY2NhcmQgd2VpZ2h0aW5nIGFuZCBMb3V2YWluIGNsdXN0ZXJpbmcsIHdoaWNoIGNvcnJlc3BvbmQgbW9yZSBjbG9zZWx5IHRvIHRoZSBkZWZhdWx0IG1ldGhvZHMgdXNlZCBieSBgU2V1cmF0YCB0aGFuIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuCkl0IGlzIGFsc28gd29ydGggbm90aW5nIHRoYXQgdGhlIHRoZSBjbHVzdGVyIGFzc2lnbm1lbnRzIGFyZSBzb21ld2hhdCBzdG9jaGFzdGljLgpJbiBwYXJ0aWN1bGFyLCB0aGUgbmFtZXMvbnVtYmVycyBvZiB0aGUgY2x1c3RlcnMgY2FuIGJlIHF1aXRlIGluY29uc2lzdGVudCBiZXR3ZWVuIHJ1bnMhCgoKYGBge3IgY2x1c3RlcmluZywgbGl2ZT1UUlVFfQojIHBlcmZvcm0gZ3JhcGgtYmFzZWQgY2x1c3RlcmluZwpubl9jbHVzdGVycyA8LSBzY3Jhbjo6Y2x1c3RlckNlbGxzKAogIG5vcm1hbGl6ZWRfc2NlLCAjIFNDRSB0byBwZXJmb3JtIGNsdXN0ZXJpbmcgb24KICB1c2UuZGltcmVkID0gIlBDQSIsICMgcGVyZm9ybSBjbHVzdGVyaW5nIG9uIHRoZSBQQ0EgbWF0cml4CiAgQkxVU1BBUkFNID0gYmx1c3Rlcjo6Tk5HcmFwaFBhcmFtKCAjIGNsdXN0ZXJpbmcgcGFyYW1ldGVycyB0byBwYXNzIHRvIGJsdXN0ZXIKICAgICMgbnVtYmVyIG9mIG5laWdoYm9ycyB0byB1c2UgaW4gbmV0d29yayBncmFwaAogICAgayA9IDIwLAogICAgIyB3ZWlnaHRpbmcgc2NoZW1lIGZvciBidWlsZGluZyB0aGUgbmV0d29yayBncmFwaAogICAgIyBkZWZhdWx0IGlzICJyYW5rIgogICAgdHlwZSA9ICJqYWNjYXJkIiwKICAgICMgY2x1c3RlciBkZXRlY3Rpb24gYWxnb3JpdGhtCiAgICAjIGRlZmF1bHQgaXMgIndhbGt0cmFwIgogICAgY2x1c3Rlci5mdW4gPSAibG91dmFpbiIKICApCikKYGBgCgpXZSBjYW4gc2F2ZSB0aGUgY2x1c3RlciBhc3NpZ25tZW50cyBiYWNrIGludG8gdGhlIGBjb2xEYXRhYCBvZiB0aGUgU0NFIG9iamVjdCB3aXRoIGEgbGl0dGxlIHNob3J0Y3V0OiB0aGUgYCRgIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBuZXcgY29sdW1uIHdlIHdhbnQgdG8gYWRkLgoKYGBge3IgYWRkIGNsdXN0ZXJzIHRvIFNDRSwgbGl2ZT1UUlVFfQojIHNhdmUgY2x1c3RlcnMgdG8gU0NFIGNvbERhdGEKbm9ybWFsaXplZF9zY2Ukbm5fY2x1c3RlciA8LSBubl9jbHVzdGVycwpgYGAKCk5vdyB3ZSBjYW4gcGxvdCB0aGUgVU1BUCBhZ2FpbiwgdGhpcyB0aW1lIGNvbG9yZWQgYnkgdGhlIGNsdXN0ZXIgYXNzaWdubWVudHMgdGhhdCB3ZSBqdXN0IGNyZWF0ZWQuCkhlcmUgcmF0aGVyIHRoYW4gdGhlIGdlbmVyYWwgYHBsb3RSZWR1Y2VkRGltKClgIGZ1bmN0aW9uLCB3ZSB3aWxsIHVzZSBgcGxvdFVNQVAoKWAsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHNhbWUsIGV4Y2VwdCBpdCBhbHdheXMgcGxvdHMgZnJvbSB0aGUgYHJlZHVjZWREaW1gIHNsb3QgbmFtZWQgYFVNQVBgLCBzbyB3ZSBjYW4gc2tpcCB0aGF0IGFyZ3VtZW50LgoKYGBge3IgcGxvdCBjbHVzdGVycywgbGl2ZT1UUlVFfQojIHBsb3QgVU1BUCB3aXRoIGFzc2lnbmVkIGNsdXN0ZXJzCnNjYXRlcjo6cGxvdFVNQVAoCiAgbm9ybWFsaXplZF9zY2UsCiAgY29sb3JfYnkgPSAibm5fY2x1c3RlciIKKQpgYGAKCldoYXQgZG8geW91IHNlZSBpbiB0aGVzZSByZXN1bHRzPwoKV2hhdCB3b3VsZCB5b3Ugd2FudCB0byBkbyBuZXh0PwoKIyMgU2F2ZSBTQ0Ugb2JqZWN0IGZvciBsYXRlcgoKV2Ugd2lsbCBub3cgc2F2ZSBvdXIgZmlsdGVyZWQgYW5kIG5vcm1hbGl6ZWQgb2JqZWN0LCBpbmNsdWRpbmcgdGhlIGRpbWVuc2lvbiByZWR1Y3Rpb24gYW5kIGNsdXN0ZXJpbmcgcmVzdWx0cyB0byBhbiBgUkRTYCBmaWxlLCB1c2luZyB0aGUgZmlsZSBwYXRoIHRoYXQgd2UgZGVmaW5lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5vdGVib29rLgpJZiB3ZSB3ZXJlIHRvIHdhbnQgdG8gcmV0dXJuIHRvIHRoaXMgZGF0YSwgd2UgY291bGQgbG9hZCB0aGlzIGZpbGUgZGlyZWN0bHkgaW50byBhIG5ldyBSIHNlc3Npb24gYW5kIG5vdCBoYXZlIHRvIHJlcGVhdCB0aGUgcHJvY2Vzc2luZyB0aGF0IHdlIGhhdmUgZG9uZSB1cCB0byB0aGlzIHBvaW50LgoKVGhlIGRhdGEgaW4gdGhlc2Ugb2JqZWN0cyB0ZW5kcyB0byBiZSBxdWl0ZSBsYXJnZSwgYnV0IHZlcnkgY29tcHJlc3NpYmxlLgpUbyBzYXZlIHNwYWNlIG9uIGRpc2sgKGF0IHRoZSBleHBlbnNlIG9mIHRpbWUpLCB3ZSB3aWxsIG1ha2Ugc3VyZSB0aGF0IHRoZSBkYXRhIGlzIGNvbXByZXNzZWQgaW50ZXJuYWxseSBiZWZvcmUgd3JpdGluZyBpdCBvdXQgdG8gYSBmaWxlLgpOb3RlIHRoYXQgdGhlIGZpbGUgd2Ugd3JpdGUgaXMgc3RpbGwgZ29pbmcgdG8gYmUgYW4gYC5yZHNgIGZpbGUgd2l0aCBubyBhZGRpdGlvbmFsIGV4dGVuc2lvbi4KKEZ1cnRoZXIgbm90ZTogVGhlIGJhc2UgUiBmdW5jdGlvbiBgc2F2ZVJEUygpYCB1c2VzIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYHRpZHl2ZXJzZWAgZnVuY3Rpb24gYHJlYWRyOjp3cml0ZV9yZHMoKWAgZG9lcyBub3QuKQoKYGBge3Igc2F2ZSBTQ0UsIGxpdmU9VFJVRX0KIyB3cml0ZSBSRFMgZmlsZSB3aXRoIGNvbXByZXNzaW9uCnJlYWRyOjp3cml0ZV9yZHMobm9ybWFsaXplZF9zY2UsIGZpbGUgPSBvdXRwdXRfc2NlX2ZpbGUsIGNvbXByZXNzID0gImd6IikKYGBgCgoKIyMgUHJpbnQgc2Vzc2lvbiBpbmZvCgpBcyBpcyBvdXIgaGFiaXQgYXQgdGhlIERhdGEgTGFiLCB3ZSB3aWxsIHNhdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXB1dGluZyBlbnZpcm9ubWVudCwgdGhlIHBhY2thZ2VzIHdlIGhhdmUgdXNlZCBpbiB0aGlzIG5vdGVib29rLCBhbmQgdGhlaXIgdmVyc2lvbnMgdXNpbmcgdGhlIGBzZXNzaW9uSW5mbygpYCBjb21tYW5kLgoKYGBge3Igc2Vzc2lvbiBpbmZvfQpzZXNzaW9uSW5mbygpCmBgYAoK
diff --git a/scRNA-seq-advanced/02-dataset_integration-live.Rmd b/scRNA-seq-advanced/02-dataset_integration-live.Rmd index ce4cbb89..64a4cd7e 100644 --- a/scRNA-seq-advanced/02-dataset_integration-live.Rmd +++ b/scRNA-seq-advanced/02-dataset_integration-live.Rmd @@ -55,7 +55,7 @@ set.seed(12345) ``` -### Directories and files +### Define directories and files We have already prepared count data for the four samples we'll be integrating (i.e., filtered cells, normalized counts, and calculated PCA & UMAP). @@ -66,17 +66,22 @@ These SCE objects, stored as RDS files, are available in the `data/rms/processed - `SCPCL000481.rds` (Patient B) - `SCPCL000482.rds` (Patient B) +Both Patient A (18 year old male) and Patient B (4 year old female) had recurrent embryonal rhabdomyosarcoma when samples were taken. + To begin, let's set up our directories and files: -```{r directories, live = TRUE} +```{r directories} # Define directory where processed SCE objects to be integrated are stored +input_dir <- file.path("data", "rms", "processed") # Define directory to save integrated SCE object to +output_dir <- file.path("data", "rms", "integrated") # Create output directory if it doesn't exist +fs::dir_create(output_dir) # Define output file name for the integrated object - +integrated_sce_file <- file.path(output_dir, "rms_integrated_subset.rds") ``` @@ -126,29 +131,6 @@ length(histologies) purrr::map(histologies, length) ``` -One other new coding strategy we'll learn in this notebook is using the [`glue`](https://glue.tidyverse.org/) package to combine strings. -This package offers a convenient function `glue::glue()` that can be used instead of the base R `paste()` function. - -```{r paste} -# Define a variable for example: -org_name <- "Data Lab" - -# We can use paste to combine strings and variables: -paste("Welcome to the", org_name, "workshop on Advanced scRNA-seq!") -``` - -We can use `glue::glue()` to accomplish the same goal with some different syntax: - -```{r glue} -# glue::glue takes a single string argument (only one set of quotes!), and -# variables can easily be included inside {curly braces} -glue::glue("Welcome to the {org_name} workshop on Advanced scRNA-seq!") -``` - -(Note that even though the `glue::glue()` output isn't in quotes, it still behaves like a string!) - - -Alright, time for the good stuff! Let's use `purrr::map()` to read in our SCE objects so that they are immediately stored together in a list. @@ -210,7 +192,7 @@ That said, the integration methods we will be applying _do not actually use_ any If we have annotations, they are a helpful "bonus" for assessing the integration's performance, but they are not part of the integration itself. -## Prepare the SCE list for integration +## Merge the SCE list into one object ![Single-cell roadmap: Merge](diagrams/roadmap_multi_merge.png) @@ -220,115 +202,136 @@ A word of caution before we begin: **This merged SCE object is NOT an integrated Merging SCEs does not perform any batch correction, but just reorganizes the data to allow us to proceed to integration next. To merge SCE objects, we do need to do some wrangling and bookkeeping to ensure compatibility and that we don't lose important information. -Overall we'll want to take care of these items: +Overall, we'll want to make sure that: -1. We should be able to trace sample-specific information back to the originating sample, including... - - Cell-level information: Which sample is each cell from? - - Library-specific feature statistics, e.g., gene-level statistics for a given library found in `rowData`. - Which sample is a given feature statistic from? -2. SCE objects should contain the same genes: Each SCE object should have the same row names. -3. SCE cell metadata columns should match: The `colData` for each SCE object should have the same column names. +1. All objects have compatible dimensions. +This means that all objects should... + + Have the same genes (aka row names), in the same order + + Have the same `colData` slot columns, in the same order + + Have the same assays +2. After merging, we'll still be able to identify which sample different pieces of information came from +As we saw in the slides, this means we'll have to... + + Attach sample names to the barcodes (aka column names) + This also ensures that column names are unique; while a single sample (library) is guaranteed to have unique barcodes, technically they can be repeated across samples! + + Attach sample names to `rowData` slot column names and `metadata` field names (if you care to keep this information around - today, we will!) + + Add a new column indicating the sample to the `colData` slot +We'll approach this merge in two parts: -We'll begin by taking some time to thoroughly explore our SCE objects and figure out what wrangling steps we need to take for these specific data. -Don't skip this exploration! -Bear in mind that the exact wrangling shown here will not be the same for other SCE objects you work with, but the same general principles apply. ++ First, we'll take some time to thoroughly explore the our SCE objects to determine what wrangling we need to do to make all the objects _compatible_ for merging ++ Then, we'll write (ok, we've written it for you) a _custom function_ to format each SCE object for merging, including: + + Making any changes to ensure objects are compatible + + Adding in identifying information so we know which sample the cells and other metadata came from + + Removing the existing reduced dimension matrices (PCA and UMAP). + This is because we'll want to recalculate these matrices on the merged objects, taking batch into account +When merging objects on your own, don't skip these data exploration steps! +The steps we take to prepare our SCEs will probably be different from the steps you need to take with other SCEs, and only by carefully exploring the objects can you figure out what steps you'll need to take to meet all of our conditions. -#### Preserving sample information at the cell level -How will we be able to tell which sample a given cell came from? +### Prepare to merge SCEs -The best way to do this is simply to add a `colData` column with the sample information, so that we can know which sample each row came from. +#### Create unique cell identifiers -In addition, we want to pay some attention to the SCE object's column names (the cell ids), which must remain unique after merging since duplicate ids will cause an R error. -In this case, the SCE column names are barcodes (which is usually but not always the case in SCE objects), which are only guaranteed to be unique _within_ a sample but may be repeated across samples. -So, after merging, it's technically possible that multiple cells will have the same barcode. -This would be a problem for two reasons: -First, the cell id would not be able to point us back to cell's originating sample. -Second, it would literally cause an error in R, which does not allow duplicate column names. +As part of the custom function we'll write, we'll include a step to create unique cell identifiers by attaching sample names to the SCE column names (cell barcodes). +For example, we would update the column name for a cell from `Sample1` with the barcode `ACGT` to `Sample1-ACGT`. +When merging, there can't be any duplicate column names (barcodes) across _all_ the objects or R will throw an error. +While you're guaranteed to have unique barcodes in a given SCE object, there is _no guarantee_ that they are unique across multiple samples - it is absolutely possible to have cells from two different samples share the same barcode (and we've seen it happen!). -One way to ensure that cell ids remain unique even after merging is to actually modify them by _prepending_ the relevant sample name. -For example, consider these barcodes for the `SCPCL000479` sample: +Adding the sample id to the column names (barcodes) is therefore a crucial step in our merging bookkeeping. -```{r barcodes} -# Look at the column names for the `SCPCL000479` sample, for example -colnames(sce_list$SCPCL000479) |> - # Only print out the first 6 for convenience - head() -``` -These ids will be updated to `SCPCL000479-GGGACCTCAAGCGGAT`, `SCPCL000479-CACAGATAGTGAGTGC`, and so on, thereby ensuring fully unique ids for all cells across all samples. +#### Explore the SCE objects -#### Preserving sample information at the gene level +##### Check the genes -The `rowData` table in SCE objects will often contain both "general" and "library-specific" information, for example: +First, we'll compare the object's genes (aka, their row names). +We can use some `purrr` magic to help us find the set of shared genes among all objects: -```{r rowdata} -rowData(sce_list$SCPCL000479) |> - head() +```{r shared genes} +# Define vector of shared genes +shared_genes <- sce_list |> + # get rownames (genes) for each SCE in sce_list + purrr::map(rownames) |> + # reduce to the _intersection_ among lists + purrr::reduce(intersect) + +# How many shared genes are there? +length(shared_genes) ``` -Here, the rownames are Ensembl gene ids, and columns are `gene_symbol`, `mean`, and `detected`. -The `gene_symbol` column is general information about all genes, not specific to any library or experiment, but `mean` and `detected` are library-specific gene statistics. -So, `gene_symbol` does not need to be traced back to its originating sample, but `mean` and `detected` do. -To this end, we can take a similar approach to what we'll do for cell ids: -We can change the sample-specific `rowData` column names by prepending the sample name. -For example, rather than being called `mean`, this column will be named `SCPCL000479-mean` for the `SCPCL000479` sample. +That's quite a lot! +In fact, because these objects were all uniformly processed by the same workflow (which did not filter out any genes!), we expect them to all have the same genes. +We can map over the list to confirm that indeed, they have the same number of rows (genes): -All our SCE objects have the same `rowData` columns (as we can see in the next chunk), so we'll perform this renaming across all SCEs. -```{r compare rowdata, live = TRUE} -# Use `purrr::map()` to quickly extract rowData column names for all SCEs +```{r check shared genes, live = TRUE} +# The number of genes in an SCE corresponds to its number of rows: ``` +Even though we know the genes already match, we need to also be sure they are in the same _order_ among all objects. +So, we'll hold onto that `shared_genes` variable we defined and use it soon in our custom formatting function to make sure all objects fully match. -#### Ensuring that only shared genes are used +It's worth noting that the intersection isn't the only option here, though! +Using the intersection means a lot of genes will get discarded if the objects have different genes. +We could instead take the _union_ of genes so nothing gets thrown out. +In this case, you'd need to create "dummy" assay rows for genes that a given SCE doesn't have and fill it with `NA` expression values. +You'll still have to make sure the SCEs have the same rows in the same order before merging, so you may need to do a decent bit of matrix wrangling. -The next step in ensuring SCE compatibility is to make sure they all contain the same genes, which are stored as the SCE object's row names (these names are also found the `rowData` slot's row names). -Here, those gene ids are unique Ensembl gene ids. +##### Check the `colData` column names -We can use some `purrr` magic to quickly find the set of shared genes among our samples, and then ask how many there are. +Next up, we'll check the `colData` columns: we need these to be the same, and in the same order. +Let's print out each object's `colData` column name to see where we stand: -```{r shared genes} -# Define vector of shared genes -shared_genes <- sce_list |> - # get rownames (genes) for each SCE in sce_list - purrr::map(rownames) |> - # reduce to the _intersection_ among lists - purrr::reduce(intersect) +```{r coldata colnames} +sce_list |> + purrr::map( + \(sce) colnames(colData(sce)) + ) ``` +We see the same columns all around in the same order, which is great! -```{r print shared genes, live = TRUE} -# How many shared genes are there? +But what if there were different columns across objects, or they were differently ordered? +In that case, we could find the intersection of column names like we did above for genes, and use that to re-order and subset all `colData` slots in our custom formatting function. -``` -In this case, we happen to know that all SCE objects we're working with already contained the same genes. -We do a quick-and-dirty check for this by looking at the number of rows across SCE objects, and we'll see that they are all the same: +##### Check the assays -```{r check shared genes, live = TRUE} -# The number of genes in an SCE corresponds to its number of rows: +Next, we'll make sure that all objects share the same assays: + +```{r assay names, live = TRUE} +# print all the assay names ``` +Again, all objects are compatible already with both having a `counts` and `logcounts` assay. -So, for our data, we will not have to subset to shared genes since they are already shared! +In your own data exploration, if you encounter SCEs to merge that have extraneous assays that you don't need, you can remove them by setting them to `NULL` in your custom formatting function, e.g. `assay(sce, "assay_to_remove") <- NULL`. -#### Ensuring matching columns in `colData` +##### Check the `rowData` contents -Finally, we'll need to have the same column names across all SCE `colData` tables, so let's look at all those column names. -We can use similar syntax here to what we used to look at all the `rowData` column names. +One of the other items we said we'd need to think about is the `rowData`, which contains gene metadata. +This slot is interesting because some of its columns are specific to the given sample, while others are general: -```{r compare coldata} -purrr::map(sce_list, - \(sce) colnames(colData(sce)) ) +```{r little head rowdata} +sce_list |> + purrr::map( + \(sce) head(rowData(sce), 3) # only print 3 rows for space! + ) ``` -It looks like the column names are all already matching among SCEs, so there's no specific preparation we'll need to do there. +The column `gene_symbol` is not sample-specific - it just provides the corresponding gene symbol to the Ensembl ids seen here as row names. +The columns `mean` and `detected`, however, are sample-specific - they contain sample-specific statistics about gene expression. -### Perform SCE merging +This means we definitely need to update the column names `mean` and `detected` to include the sample id. +But, we don't need a separate `gene_symbol` column for each sample, so we can leave that one alone as just `gene_symbol`. +Once we eventually merge, only one `gene_symbol` column will be left in the final object since it is the same across all the SCEs. + +We'll show one way to do this in our custom function, but it's worth noting there's nothing _wrong_ with also adding the sample id to the `gene_symbol` column; you'll just end up with a bunch of redundant gene symbol columns. + + +#### Reformat the SCE objects As you can see, there's a lot of moving parts to consider! Again, these moving parts may (will!) differ for SCEs that you are working with, so you have to explore your own SCEs in depth to prepare for merging. @@ -343,33 +346,61 @@ We'll then use our new `purrr::map()` programming skills to run this function ov This will give us a new list of formatted SCEs that we can proceed to merge. It's important to remember that the `format_sce()` function written below is not a function for general use – it's been precisely written to match the processing we need to do for _these_ SCEs, and different SCEs you work with will require different types of processing. +We also include roxygen-style comments for this function, which can be a helpful consistent way to document your code if you like it - we've even written a blog post about it :) (). + ```{r format_sce function} -format_sce <- function(sce, sample_name) { - # Input arguments: - ## sce: An SCE object to format - ## sample_name: The SCE object's name - # This function returns a formatted SCE object. - - ###### Ensure that we can identify the originating sample information ###### - # Add a column called `sample` that stores this information - # This will be stored in `colData` +#' Custom function to format an SCE before merging +#' +#' @param sce SCE object to format +#' @param sample_name Name of the sample +#' @param shared_genes Vector of shared genes across all SCE objects +#' +#' @returns An updated SCE object ready for merging +format_sce <- function( + sce, + sample_name, + shared_genes +) { + + ### Remove the single-sample reduced dimensions + # We do this first since it makes the object a lot smaller for the rest of this code! + reducedDims(sce) <- NULL + + ### Add dedicated sample indicator column to the colData slot + # Recall, the `sce$` shortcut points to the colData sce$sample <- sample_name - - ###### Ensure cell ids will be unique ###### - # Update the SCE object column names (cell ids) by prepending `sample_name` + ### Ensure objects have the same genes in the same order + # Use the shared_genes vector to index genes to the intersection + # Doing this both subsets to just those genes, and reorders! + sce <- sce[shared_genes, ] + + ### There is no additional wrangling to do for the colData column names or assays. + ### But if there were, you could add your custom code to do so here. + ### Your custom function may need additional arguments for this, too. + + ### Ensure cell ids are identifiable and fully unique + # Update the SCE object column names (cell ids) by prepending the `sample_name` colnames(sce) <- glue::glue("{sample_name}-{colnames(sce)}") - - ###### Ensure gene-level statistics can be identified in `rowData` ###### - # We want to rename the columns `mean` and `detected` to contain the `sample_name` - # Recall the names are: "gene_symbol", "mean", "detected" - colnames(rowData(sce)) <- c("gene_symbol", - glue::glue("{sample_name}-mean"), - glue::glue("{sample_name}-detected")) - - # Return the formatted SCE object - return(sce) + ### Ensure the rowData columns can be identified + # Recall, we want to leave `gene_symbol` alone, but add the `sample_name` to the rest + rowdata_names <- colnames(rowData(sce)) + # prefix rowData names with the sample name, except for gene symbols + new_rowdata_names <- ifelse( + rowdata_names == "gene_symbol", + "gene_symbol", + glue::glue("{sample_name}-{rowdata_names}") + ) + colnames(rowData(sce)) <- new_rowdata_names + + ### Ensure metadata slot fields can be identified + # We'll simply prepend the `sample_name` to all fields for this slot + names(metadata(sce)) <- glue::glue("{sample_name}-{names(metadata(sce))}") + + + ### Finally, we can return the formatted SCE object + return(sce) } ``` @@ -382,15 +413,16 @@ In our case, we want to run `format_sce()` over paired `sce_list` items and `sce # Each "iteration" will march down the first two # arguments `sce_list` and `names(sce_list)` in order - # Name of the function to run - -# Print resulting list +# Print formatted SCE list ``` (Psst, like `purrr` and want to dive deeper? Check out [the `purrr::imap()` function](https://purrr.tidyverse.org/reference/imap.html)!) +### Perform the merging + + At long last, we are ready to merge the SCEs, which we'll do using the R function `cbind()`. The `cbind()` function is often used to combine data frames or matrices by column, i.e. "stack" them next to each other. The same principle applies here, but when run on SCE objects, `cbind()` will create a new SCE object by combining `counts` and `logcounts` matrices by column. @@ -405,7 +437,7 @@ Since we need to apply `cbind()` to a _list_ of objects, we need to use some sli ``` -We now have a single SCE object that contains all cells from all samples we'd like to integrate. +We now have a single merged SCE object that contains all cells from all samples we'd like to integrate. Let's take a peek at some of the innards of this new SCE object: @@ -419,54 +451,28 @@ Let's take a peek at some of the innards of this new SCE object: ``` -## Integration +## Integrate samples ![Single-cell roadmap: Integrate](diagrams/roadmap_multi_integrate.png) - So far, we've created a `merged_sce` object which is (almost!) ready for integration. The integration methods we'll be using here actually perform batch correction on a reduced dimension representation of the normalized gene expression values, which is more efficient. `fastMNN` and `harmony` specifically use PCA for this, but be aware that different integration methods may use other kinds of reduced dimensions. -You'll notice that the merged SCE object object already contains PCA and UMAP reduced dimensions, which were calculated during our pre-processing: - -```{r merged_sce reddim, live = TRUE} -# Print the reducedDimNames of the merged_sce - -``` - -These represent the original dimension reductions that were performed on _each individual SCE_ before merging, but we actually need to calculate PCA (and UMAP for visualization) from the merged object directly. - -Why can't we use the sample-specific PCA and UMAP matrices? -Part of these calculations themselves involves scaling the raw data to center the mean. -When samples are separately centered but plotting together, you will see samples "overlapping" in space, but this placement is actually just an artifact of the individual centering. -In addition, the mathematical relationship between the original expression data and reduced dimension version of that data will differ across samples, meaning we can't interpret them all together. -To see how this looks, let's look at the UMAP when calculated from individual samples: - -```{r plot individual UMAPs} -# Plot UMAP calculated from individual samples with separate scaling -scater::plotReducedDim(merged_sce, - dimred = "UMAP", - color_by = "sample", - point_size = 0.5, - point_alpha = 0.2) + - # Use a CVD-friendly color scheme and specify legend name - scale_color_brewer(palette = "Dark2", name = "sample") + - # Modify the legend key with larger, easier to see points - guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + - ggtitle("UMAP calculated on each sample separately") -``` - -As we see in this UMAP, all samples are centered at zero and all overlapping. -This visual artifact can give the _incorrect impression_ that data is integrated - to be clear, this data is NOT integrated! +Before merging, our objects had reduced dimension representations calculated on each individual SCE, and we removed them when preparing for merge. +We removed them because we don't actually want to use them anymore! +This is because part of their calculation involves scaling the raw data to center the mean. +When samples are separately centered, _all_ of them will be centered at zero, making it look like the datasets are already pretty overlapping when you plot their UMAPs together. +But, this is just a mathematical artifact of how dimension reduction is performed. +So, we'll begin by re-calculating PCA and UMAP on the merged object in a way that takes batches into consideration. For input to integration, we'll want the reduced dimension calculations to consider normalized gene expression values from all samples simultaneously. So we'll need to recalculate PCA (and UMAP for visualization) on the merged object. -We'll also save these new reduced dimensions with different names, `merged_PCA` and `merged_UMAP`, to distinguish them from already-present `PCA` and `UMAP`. First, as usual, we'll determine the high-variance genes to use for PCA from the `merged_sce` object. For this, we'll need to provide the argument `block = merged_sce$sample` when modeling gene variance, which tells `scran::modelGeneVar()` to first model variance separately for each batch and then combine those modeling statistics. +(Psst: isn't it handy we created that `sample` column when merging?!) ```{r calc merged hv genes} # Specify the number of genes to identify @@ -515,41 +521,32 @@ We can now include this PCA matrix in our `merged_sce` object: Now that we have the PCA matrix, we can proceed to calculate UMAP to visualize the uncorrected merged data. -We'll calculate UMAP as "usual", but in this case we'll specify two additional arguments: - -- `dimred = "merged_PCA"`, which specifies which existing reduced dimension should be used for the calculation. -We want to use the batch-weighted PCA, which we named above as `"merged_PCA"`. -- `name = "merged_UMAP"`, which names the final UMAP that this function calculates. -This argument will prevent us from overwriting the existing UMAP which is already named "UMAP" and instead create a separate `"merged_UMAP"`. - ```{r calculate merged umap, live = TRUE} -# add merged_UMAP from merged_PCA ``` -Now, let's see how this new `merged_UMAP` looks compared to the `UMAP` calculated from individual samples: - ```{r plot uncorrected merged UMAP} # UMAPs scaled together when calculated from the merged SCE -scater::plotReducedDim(merged_sce, - dimred = "merged_UMAP", - color_by = "sample", - # Some styling to help us see the points: - point_size = 0.5, - point_alpha = 0.2) + +scater::plotUMAP( + merged_sce, + color_by = "sample", + # Some styling to help us see the points: + point_size = 0.5, + point_alpha = 0.2 +) + scale_color_brewer(palette = "Dark2", name = "sample") + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP calculated on merged_sce") ``` -Samples are now separated, which more reasonably reflects that this data is _not yet batch-corrected_. +We see (mostly) four separate clumps representing the four different _merged but not yet integrated_ samples. We can think of this UMAP as our "before" UMAP, and we can compare this to the "after" UMAP we see post-integration. Let's discuss a little first: What visual differences do you think the UMAP on the integrated version of data will have? What similarities do you think the integrated UMAP will have to this plot? -### Integration with `fastMNN` +### Integrate with `fastMNN` Finally, we're ready to integrate! To start, we'll use the `fastMNN` approach from the Bioconductor [`batchelor` package](http://www.bioconductor.org/packages/release/bioc/html/batchelor.html). @@ -588,6 +585,10 @@ We're mostly interested in the PCA that `fastMNN` calculated, so let's save that ``` Finally, we'll calculate UMAP from these corrected PCA matrix for visualization. +In this case we need to specify two additional arguments since we're working with non-standard reduced dimension names: + ++ `dimred = "fastmnn_PCA"`, which specifies the existing reduced dimension to use for the calculation ++ `name = "fastmnn_UMAP"`, which names the final UMAP that this function calculates ```{r calculate fastmnn umap, live = TRUE} # Calculate UMAP @@ -612,7 +613,7 @@ scater::plotReducedDim(merged_sce, ggtitle("UMAP after integration with fastMNN") ``` -This `fastmnn_UMAP` certainly looks different from the one we made from `merged_UMAP`! +This `fastmnn_UMAP` certainly looks different from the one we made before integrating! What different trends do you see? Do all samples look "equally well" integrated, from a first look? @@ -684,12 +685,11 @@ scater::plotReducedDim(merged_sce, What trends do you observe between tumor and healthy tissues among these integrated samples? - -### Integration with `harmony` +### Integrate with `harmony` `fastMNN` is only one of many approaches to perform integration, and different methods have different capabilities and may give different results. For example, some methods can accommodate additional covariates (e.g., technology, patient, diagnosis, etc.) that can influence integration. -In fact the data we are using has a known _patient_ covariate; `SCPCL000479` and `SCPCL000480` are from the first patient, and `SCPCL000481` and `SCPCL000482` are from the second patient. +In fact the data we are using has a known _patient_ covariate; `SCPCL000479` and `SCPCL000480` are from Patient A, and `SCPCL000481` and `SCPCL000482` are from Patient B. So, let's perform integration with a method that can use this information - [`harmony`](https://portals.broadinstitute.org/harmony/)! @@ -713,7 +713,7 @@ However, unlike `fastMNN`, `harmony` does not "back-calculate" corrected express For input, `harmony` needs a couple pieces of information: - First, `harmony` takes a batch-weighted PCA matrix to perform integration. -We already calculated a batch-weighted PCA matrix (our `merged_PCA` reduced dimension), we'll provide this as the the input. +We already calculated a batch-weighted PCA matrix so we'll provide this as the the input. - Second, we need to tell `harmony` about the covariates to use - `sample` and `patient`. To do this, we provide two arguments: - `meta_data`, a data frame that contains covariates across samples. @@ -773,7 +773,7 @@ scater::plotReducedDim(merged_sce, # Specify variable for faceting other_fields = "sample") + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + - guides(color = guide_legend(override.aes = list(size = 3))) + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with harmony") + facet_wrap(vars(sample)) ``` @@ -782,7 +782,7 @@ What do you now notice in this faceted view that wasn't clear previously? Are there other patterns you see that are similar or different from the `fastMNN` UMAP? How do you think `fastMNN` vs. `harmony` performed in integrating these samples? -### Export +## Export Finally, we'll export the final SCE object with both `fastMNN` and `harmony` integration to a file. Since this object is very large (over 1 GB!), we'll export it to a file with some compression, which, in this case, will reduce the final size to a smaller ~360 MB. diff --git a/scRNA-seq-advanced/02-dataset_integration.Rmd b/scRNA-seq-advanced/02-dataset_integration.Rmd index 07c9078b..849f4761 100644 --- a/scRNA-seq-advanced/02-dataset_integration.Rmd +++ b/scRNA-seq-advanced/02-dataset_integration.Rmd @@ -55,7 +55,7 @@ set.seed(12345) ``` -### Directories and files +### Define directories and files We have already prepared count data for the four samples we'll be integrating (i.e., filtered cells, normalized counts, and calculated PCA & UMAP). @@ -66,9 +66,11 @@ These SCE objects, stored as RDS files, are available in the `data/rms/processed - `SCPCL000481.rds` (Patient B) - `SCPCL000482.rds` (Patient B) +Both Patient A (18 year old male) and Patient B (4 year old female) had recurrent embryonal rhabdomyosarcoma when samples were taken. + To begin, let's set up our directories and files: -```{r directories, live = TRUE} +```{r directories} # Define directory where processed SCE objects to be integrated are stored input_dir <- file.path("data", "rms", "processed") @@ -129,29 +131,6 @@ length(histologies) purrr::map(histologies, length) ``` -One other new coding strategy we'll learn in this notebook is using the [`glue`](https://glue.tidyverse.org/) package to combine strings. -This package offers a convenient function `glue::glue()` that can be used instead of the base R `paste()` function. - -```{r paste} -# Define a variable for example: -org_name <- "Data Lab" - -# We can use paste to combine strings and variables: -paste("Welcome to the", org_name, "workshop on Advanced scRNA-seq!") -``` - -We can use `glue::glue()` to accomplish the same goal with some different syntax: - -```{r glue} -# glue::glue takes a single string argument (only one set of quotes!), and -# variables can easily be included inside {curly braces} -glue::glue("Welcome to the {org_name} workshop on Advanced scRNA-seq!") -``` - -(Note that even though the `glue::glue()` output isn't in quotes, it still behaves like a string!) - - -Alright, time for the good stuff! Let's use `purrr::map()` to read in our SCE objects so that they are immediately stored together in a list. @@ -218,7 +197,7 @@ That said, the integration methods we will be applying _do not actually use_ any If we have annotations, they are a helpful "bonus" for assessing the integration's performance, but they are not part of the integration itself. -## Prepare the SCE list for integration +## Merge the SCE list into one object ![Single-cell roadmap: Merge](diagrams/roadmap_multi_merge.png) @@ -228,78 +207,52 @@ A word of caution before we begin: **This merged SCE object is NOT an integrated Merging SCEs does not perform any batch correction, but just reorganizes the data to allow us to proceed to integration next. To merge SCE objects, we do need to do some wrangling and bookkeeping to ensure compatibility and that we don't lose important information. -Overall we'll want to take care of these items: +Overall, we'll want to make sure that: -1. We should be able to trace sample-specific information back to the originating sample, including... - - Cell-level information: Which sample is each cell from? - - Library-specific feature statistics, e.g., gene-level statistics for a given library found in `rowData`. - Which sample is a given feature statistic from? -2. SCE objects should contain the same genes: Each SCE object should have the same row names. -3. SCE cell metadata columns should match: The `colData` for each SCE object should have the same column names. +1. All objects have compatible dimensions. +This means that all objects should... + + Have the same genes (aka row names), in the same order + + Have the same `colData` slot columns, in the same order + + Have the same assays +2. After merging, we'll still be able to identify which sample different pieces of information came from +As we saw in the slides, this means we'll have to... + + Attach sample names to the barcodes (aka column names) + This also ensures that column names are unique; while a single sample (library) is guaranteed to have unique barcodes, technically they can be repeated across samples! + + Attach sample names to `rowData` slot column names and `metadata` field names (if you care to keep this information around - today, we will!) + + Add a new column indicating the sample to the `colData` slot +We'll approach this merge in two parts: -We'll begin by taking some time to thoroughly explore our SCE objects and figure out what wrangling steps we need to take for these specific data. -Don't skip this exploration! -Bear in mind that the exact wrangling shown here will not be the same for other SCE objects you work with, but the same general principles apply. - - -#### Preserving sample information at the cell level - -How will we be able to tell which sample a given cell came from? - -The best way to do this is simply to add a `colData` column with the sample information, so that we can know which sample each row came from. - -In addition, we want to pay some attention to the SCE object's column names (the cell ids), which must remain unique after merging since duplicate ids will cause an R error. -In this case, the SCE column names are barcodes (which is usually but not always the case in SCE objects), which are only guaranteed to be unique _within_ a sample but may be repeated across samples. -So, after merging, it's technically possible that multiple cells will have the same barcode. -This would be a problem for two reasons: -First, the cell id would not be able to point us back to cell's originating sample. -Second, it would literally cause an error in R, which does not allow duplicate column names. - - -One way to ensure that cell ids remain unique even after merging is to actually modify them by _prepending_ the relevant sample name. -For example, consider these barcodes for the `SCPCL000479` sample: - -```{r barcodes} -# Look at the column names for the `SCPCL000479` sample, for example -colnames(sce_list$SCPCL000479) |> - # Only print out the first 6 for convenience - head() -``` ++ First, we'll take some time to thoroughly explore the our SCE objects to determine what wrangling we need to do to make all the objects _compatible_ for merging ++ Then, we'll write (ok, we've written it for you) a _custom function_ to format each SCE object for merging, including: + + Making any changes to ensure objects are compatible + + Adding in identifying information so we know which sample the cells and other metadata came from + + Removing the existing reduced dimension matrices (PCA and UMAP). + This is because we'll want to recalculate these matrices on the merged objects, taking batch into account -These ids will be updated to `SCPCL000479-GGGACCTCAAGCGGAT`, `SCPCL000479-CACAGATAGTGAGTGC`, and so on, thereby ensuring fully unique ids for all cells across all samples. +When merging objects on your own, don't skip these data exploration steps! +The steps we take to prepare our SCEs will probably be different from the steps you need to take with other SCEs, and only by carefully exploring the objects can you figure out what steps you'll need to take to meet all of our conditions. -#### Preserving sample information at the gene level -The `rowData` table in SCE objects will often contain both "general" and "library-specific" information, for example: +### Prepare to merge SCEs -```{r rowdata} -rowData(sce_list$SCPCL000479) |> - head() -``` +#### Create unique cell identifiers -Here, the rownames are Ensembl gene ids, and columns are `gene_symbol`, `mean`, and `detected`. -The `gene_symbol` column is general information about all genes, not specific to any library or experiment, but `mean` and `detected` are library-specific gene statistics. -So, `gene_symbol` does not need to be traced back to its originating sample, but `mean` and `detected` do. -To this end, we can take a similar approach to what we'll do for cell ids: -We can change the sample-specific `rowData` column names by prepending the sample name. -For example, rather than being called `mean`, this column will be named `SCPCL000479-mean` for the `SCPCL000479` sample. +As part of the custom function we'll write, we'll include a step to create unique cell identifiers by attaching sample names to the SCE column names (cell barcodes). +For example, we would update the column name for a cell from `Sample1` with the barcode `ACGT` to `Sample1-ACGT`. -All our SCE objects have the same `rowData` columns (as we can see in the next chunk), so we'll perform this renaming across all SCEs. +When merging, there can't be any duplicate column names (barcodes) across _all_ the objects or R will throw an error. +While you're guaranteed to have unique barcodes in a given SCE object, there is _no guarantee_ that they are unique across multiple samples - it is absolutely possible to have cells from two different samples share the same barcode (and we've seen it happen!). -```{r compare rowdata, live = TRUE} -# Use `purrr::map()` to quickly extract rowData column names for all SCEs -purrr::map(sce_list, - \(sce) colnames(rowData(sce))) -``` +Adding the sample id to the column names (barcodes) is therefore a crucial step in our merging bookkeeping. -#### Ensuring that only shared genes are used +#### Explore the SCE objects -The next step in ensuring SCE compatibility is to make sure they all contain the same genes, which are stored as the SCE object's row names (these names are also found the `rowData` slot's row names). -Here, those gene ids are unique Ensembl gene ids. +##### Check the genes -We can use some `purrr` magic to quickly find the set of shared genes among our samples, and then ask how many there are. +First, we'll compare the object's genes (aka, their row names). +We can use some `purrr` magic to help us find the set of shared genes among all objects: ```{r shared genes} # Define vector of shared genes @@ -308,15 +261,15 @@ shared_genes <- sce_list |> purrr::map(rownames) |> # reduce to the _intersection_ among lists purrr::reduce(intersect) -``` -```{r print shared genes, live = TRUE} # How many shared genes are there? length(shared_genes) ``` -In this case, we happen to know that all SCE objects we're working with already contained the same genes. -We do a quick-and-dirty check for this by looking at the number of rows across SCE objects, and we'll see that they are all the same: +That's quite a lot! +In fact, because these objects were all uniformly processed by the same workflow (which did not filter out any genes!), we expect them to all have the same genes. +We can map over the list to confirm that indeed, they have the same number of rows (genes): + ```{r check shared genes, live = TRUE} # The number of genes in an SCE corresponds to its number of rows: @@ -324,21 +277,68 @@ sce_list |> purrr::map(nrow) ``` -So, for our data, we will not have to subset to shared genes since they are already shared! +Even though we know the genes already match, we need to also be sure they are in the same _order_ among all objects. +So, we'll hold onto that `shared_genes` variable we defined and use it soon in our custom formatting function to make sure all objects fully match. + +It's worth noting that the intersection isn't the only option here, though! +Using the intersection means a lot of genes will get discarded if the objects have different genes. +We could instead take the _union_ of genes so nothing gets thrown out. +In this case, you'd need to create "dummy" assay rows for genes that a given SCE doesn't have and fill it with `NA` expression values. +You'll still have to make sure the SCEs have the same rows in the same order before merging, so you may need to do a decent bit of matrix wrangling. + +##### Check the `colData` column names + +Next up, we'll check the `colData` columns: we need these to be the same, and in the same order. +Let's print out each object's `colData` column name to see where we stand: + +```{r coldata colnames} +sce_list |> + purrr::map( + \(sce) colnames(colData(sce)) + ) +``` +We see the same columns all around in the same order, which is great! -#### Ensuring matching columns in `colData` +But what if there were different columns across objects, or they were differently ordered? +In that case, we could find the intersection of column names like we did above for genes, and use that to re-order and subset all `colData` slots in our custom formatting function. -Finally, we'll need to have the same column names across all SCE `colData` tables, so let's look at all those column names. -We can use similar syntax here to what we used to look at all the `rowData` column names. -```{r compare coldata} -purrr::map(sce_list, - \(sce) colnames(colData(sce)) ) +##### Check the assays + +Next, we'll make sure that all objects share the same assays: + +```{r assay names, live = TRUE} +# print all the assay names +sce_list |> + purrr::map(assayNames) +``` +Again, all objects are compatible already with both having a `counts` and `logcounts` assay. + +In your own data exploration, if you encounter SCEs to merge that have extraneous assays that you don't need, you can remove them by setting them to `NULL` in your custom formatting function, e.g. `assay(sce, "assay_to_remove") <- NULL`. + +##### Check the `rowData` contents + +One of the other items we said we'd need to think about is the `rowData`, which contains gene metadata. +This slot is interesting because some of its columns are specific to the given sample, while others are general: + +```{r little head rowdata} +sce_list |> + purrr::map( + \(sce) head(rowData(sce), 3) # only print 3 rows for space! + ) ``` -It looks like the column names are all already matching among SCEs, so there's no specific preparation we'll need to do there. +The column `gene_symbol` is not sample-specific - it just provides the corresponding gene symbol to the Ensembl ids seen here as row names. +The columns `mean` and `detected`, however, are sample-specific - they contain sample-specific statistics about gene expression. -### Perform SCE merging +This means we definitely need to update the column names `mean` and `detected` to include the sample id. +But, we don't need a separate `gene_symbol` column for each sample, so we can leave that one alone as just `gene_symbol`. +Once we eventually merge, only one `gene_symbol` column will be left in the final object since it is the same across all the SCEs. + +We'll show one way to do this in our custom function, but it's worth noting there's nothing _wrong_ with also adding the sample id to the `gene_symbol` column; you'll just end up with a bunch of redundant gene symbol columns. + + +#### Reformat the SCE objects As you can see, there's a lot of moving parts to consider! Again, these moving parts may (will!) differ for SCEs that you are working with, so you have to explore your own SCEs in depth to prepare for merging. @@ -353,33 +353,61 @@ We'll then use our new `purrr::map()` programming skills to run this function ov This will give us a new list of formatted SCEs that we can proceed to merge. It's important to remember that the `format_sce()` function written below is not a function for general use – it's been precisely written to match the processing we need to do for _these_ SCEs, and different SCEs you work with will require different types of processing. +We also include roxygen-style comments for this function, which can be a helpful consistent way to document your code if you like it - we've even written a blog post about it :) (). + ```{r format_sce function} -format_sce <- function(sce, sample_name) { - # Input arguments: - ## sce: An SCE object to format - ## sample_name: The SCE object's name - # This function returns a formatted SCE object. - - ###### Ensure that we can identify the originating sample information ###### - # Add a column called `sample` that stores this information - # This will be stored in `colData` +#' Custom function to format an SCE before merging +#' +#' @param sce SCE object to format +#' @param sample_name Name of the sample +#' @param shared_genes Vector of shared genes across all SCE objects +#' +#' @returns An updated SCE object ready for merging +format_sce <- function( + sce, + sample_name, + shared_genes +) { + + ### Remove the single-sample reduced dimensions + # We do this first since it makes the object a lot smaller for the rest of this code! + reducedDims(sce) <- NULL + + ### Add dedicated sample indicator column to the colData slot + # Recall, the `sce$` shortcut points to the colData sce$sample <- sample_name - - ###### Ensure cell ids will be unique ###### - # Update the SCE object column names (cell ids) by prepending `sample_name` + ### Ensure objects have the same genes in the same order + # Use the shared_genes vector to index genes to the intersection + # Doing this both subsets to just those genes, and reorders! + sce <- sce[shared_genes, ] + + ### There is no additional wrangling to do for the colData column names or assays. + ### But if there were, you could add your custom code to do so here. + ### Your custom function may need additional arguments for this, too. + + ### Ensure cell ids are identifiable and fully unique + # Update the SCE object column names (cell ids) by prepending the `sample_name` colnames(sce) <- glue::glue("{sample_name}-{colnames(sce)}") - - ###### Ensure gene-level statistics can be identified in `rowData` ###### - # We want to rename the columns `mean` and `detected` to contain the `sample_name` - # Recall the names are: "gene_symbol", "mean", "detected" - colnames(rowData(sce)) <- c("gene_symbol", - glue::glue("{sample_name}-mean"), - glue::glue("{sample_name}-detected")) - - # Return the formatted SCE object - return(sce) + ### Ensure the rowData columns can be identified + # Recall, we want to leave `gene_symbol` alone, but add the `sample_name` to the rest + rowdata_names <- colnames(rowData(sce)) + # prefix rowData names with the sample name, except for gene symbols + new_rowdata_names <- ifelse( + rowdata_names == "gene_symbol", + "gene_symbol", + glue::glue("{sample_name}-{rowdata_names}") + ) + colnames(rowData(sce)) <- new_rowdata_names + + ### Ensure metadata slot fields can be identified + # We'll simply prepend the `sample_name` to all fields for this slot + names(metadata(sce)) <- glue::glue("{sample_name}-{names(metadata(sce))}") + + + ### Finally, we can return the formatted SCE object + return(sce) } ``` @@ -393,17 +421,19 @@ sce_list_formatted <- purrr::map2( # arguments `sce_list` and `names(sce_list)` in order sce_list, names(sce_list), - # Name of the function to run - format_sce + \(sce, sample_name) format_sce(sce, sample_name, shared_genes) ) -# Print resulting list +# Print formatted SCE list sce_list_formatted ``` (Psst, like `purrr` and want to dive deeper? Check out [the `purrr::imap()` function](https://purrr.tidyverse.org/reference/imap.html)!) +### Perform the merging + + At long last, we are ready to merge the SCEs, which we'll do using the R function `cbind()`. The `cbind()` function is often used to combine data frames or matrices by column, i.e. "stack" them next to each other. The same principle applies here, but when run on SCE objects, `cbind()` will create a new SCE object by combining `counts` and `logcounts` matrices by column. @@ -419,70 +449,45 @@ merged_sce <- do.call(cbind, sce_list_formatted) merged_sce ``` -We now have a single SCE object that contains all cells from all samples we'd like to integrate. +We now have a single merged SCE object that contains all cells from all samples we'd like to integrate. Let's take a peek at some of the innards of this new SCE object: ```{r explore merged_sce, live = TRUE} # How many samples, and cells per sample? -table( colData(merged_sce)$sample ) +table(colData(merged_sce)$sample) # What are the new cell ids (column names)? -head( colnames(merged_sce) ) +head(colnames(merged_sce)) +tail(colnames(merged_sce)) # What does rowData look like? -head( rowData(merged_sce) ) +head(rowData(merged_sce)) ``` -## Integration +## Integrate samples ![Single-cell roadmap: Integrate](diagrams/roadmap_multi_integrate.png) - So far, we've created a `merged_sce` object which is (almost!) ready for integration. The integration methods we'll be using here actually perform batch correction on a reduced dimension representation of the normalized gene expression values, which is more efficient. `fastMNN` and `harmony` specifically use PCA for this, but be aware that different integration methods may use other kinds of reduced dimensions. -You'll notice that the merged SCE object object already contains PCA and UMAP reduced dimensions, which were calculated during our pre-processing: - -```{r merged_sce reddim, live = TRUE} -# Print the reducedDimNames of the merged_sce -reducedDimNames(merged_sce) -``` - -These represent the original dimension reductions that were performed on _each individual SCE_ before merging, but we actually need to calculate PCA (and UMAP for visualization) from the merged object directly. - -Why can't we use the sample-specific PCA and UMAP matrices? -Part of these calculations themselves involves scaling the raw data to center the mean. -When samples are separately centered but plotting together, you will see samples "overlapping" in space, but this placement is actually just an artifact of the individual centering. -In addition, the mathematical relationship between the original expression data and reduced dimension version of that data will differ across samples, meaning we can't interpret them all together. -To see how this looks, let's look at the UMAP when calculated from individual samples: - -```{r plot individual UMAPs} -# Plot UMAP calculated from individual samples with separate scaling -scater::plotReducedDim(merged_sce, - dimred = "UMAP", - color_by = "sample", - point_size = 0.5, - point_alpha = 0.2) + - # Use a CVD-friendly color scheme and specify legend name - scale_color_brewer(palette = "Dark2", name = "sample") + - # Modify the legend key with larger, easier to see points - guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + - ggtitle("UMAP calculated on each sample separately") -``` - -As we see in this UMAP, all samples are centered at zero and all overlapping. -This visual artifact can give the _incorrect impression_ that data is integrated - to be clear, this data is NOT integrated! +Before merging, our objects had reduced dimension representations calculated on each individual SCE, and we removed them when preparing for merge. +We removed them because we don't actually want to use them anymore! +This is because part of their calculation involves scaling the raw data to center the mean. +When samples are separately centered, _all_ of them will be centered at zero, making it look like the datasets are already pretty overlapping when you plot their UMAPs together. +But, this is just a mathematical artifact of how dimension reduction is performed. +So, we'll begin by re-calculating PCA and UMAP on the merged object in a way that takes batches into consideration. For input to integration, we'll want the reduced dimension calculations to consider normalized gene expression values from all samples simultaneously. So we'll need to recalculate PCA (and UMAP for visualization) on the merged object. -We'll also save these new reduced dimensions with different names, `merged_PCA` and `merged_UMAP`, to distinguish them from already-present `PCA` and `UMAP`. First, as usual, we'll determine the high-variance genes to use for PCA from the `merged_sce` object. For this, we'll need to provide the argument `block = merged_sce$sample` when modeling gene variance, which tells `scran::modelGeneVar()` to first model variance separately for each batch and then combine those modeling statistics. +(Psst: isn't it handy we created that `sample` column when merging?!) ```{r calc merged hv genes} # Specify the number of genes to identify @@ -529,48 +534,37 @@ We can now include this PCA matrix in our `merged_sce` object: ```{r add merged_pca, live = TRUE} # add PCA results to merged SCE object -reducedDim(merged_sce, "merged_PCA") <- merged_pca[[1]] +reducedDim(merged_sce, "PCA") <- merged_pca[[1]] ``` Now that we have the PCA matrix, we can proceed to calculate UMAP to visualize the uncorrected merged data. -We'll calculate UMAP as "usual", but in this case we'll specify two additional arguments: - -- `dimred = "merged_PCA"`, which specifies which existing reduced dimension should be used for the calculation. -We want to use the batch-weighted PCA, which we named above as `"merged_PCA"`. -- `name = "merged_UMAP"`, which names the final UMAP that this function calculates. -This argument will prevent us from overwriting the existing UMAP which is already named "UMAP" and instead create a separate `"merged_UMAP"`. - ```{r calculate merged umap, live = TRUE} -# add merged_UMAP from merged_PCA -merged_sce <- scater::runUMAP(merged_sce, - dimred = "merged_PCA", - name = "merged_UMAP") +merged_sce <- scater::runUMAP(merged_sce) ``` -Now, let's see how this new `merged_UMAP` looks compared to the `UMAP` calculated from individual samples: - ```{r plot uncorrected merged UMAP} # UMAPs scaled together when calculated from the merged SCE -scater::plotReducedDim(merged_sce, - dimred = "merged_UMAP", - color_by = "sample", - # Some styling to help us see the points: - point_size = 0.5, - point_alpha = 0.2) + +scater::plotUMAP( + merged_sce, + color_by = "sample", + # Some styling to help us see the points: + point_size = 0.5, + point_alpha = 0.2 +) + scale_color_brewer(palette = "Dark2", name = "sample") + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP calculated on merged_sce") ``` -Samples are now separated, which more reasonably reflects that this data is _not yet batch-corrected_. +We see (mostly) four separate clumps representing the four different _merged but not yet integrated_ samples. We can think of this UMAP as our "before" UMAP, and we can compare this to the "after" UMAP we see post-integration. Let's discuss a little first: What visual differences do you think the UMAP on the integrated version of data will have? What similarities do you think the integrated UMAP will have to this plot? -### Integration with `fastMNN` +### Integrate with `fastMNN` Finally, we're ready to integrate! To start, we'll use the `fastMNN` approach from the Bioconductor [`batchelor` package](http://www.bioconductor.org/packages/release/bioc/html/batchelor.html). @@ -613,6 +607,10 @@ reducedDim(merged_sce, "fastmnn_PCA") <- reducedDim(integrated_sce, "corrected") ``` Finally, we'll calculate UMAP from these corrected PCA matrix for visualization. +In this case we need to specify two additional arguments since we're working with non-standard reduced dimension names: + ++ `dimred = "fastmnn_PCA"`, which specifies the existing reduced dimension to use for the calculation ++ `name = "fastmnn_UMAP"`, which names the final UMAP that this function calculates ```{r calculate fastmnn umap, live = TRUE} # Calculate UMAP @@ -641,7 +639,7 @@ scater::plotReducedDim(merged_sce, ggtitle("UMAP after integration with fastMNN") ``` -This `fastmnn_UMAP` certainly looks different from the one we made from `merged_UMAP`! +This `fastmnn_UMAP` certainly looks different from the one we made before integrating! What different trends do you see? Do all samples look "equally well" integrated, from a first look? @@ -713,12 +711,11 @@ scater::plotReducedDim(merged_sce, What trends do you observe between tumor and healthy tissues among these integrated samples? - -### Integration with `harmony` +### Integrate with `harmony` `fastMNN` is only one of many approaches to perform integration, and different methods have different capabilities and may give different results. For example, some methods can accommodate additional covariates (e.g., technology, patient, diagnosis, etc.) that can influence integration. -In fact the data we are using has a known _patient_ covariate; `SCPCL000479` and `SCPCL000480` are from the first patient, and `SCPCL000481` and `SCPCL000482` are from the second patient. +In fact the data we are using has a known _patient_ covariate; `SCPCL000479` and `SCPCL000480` are from Patient A, and `SCPCL000481` and `SCPCL000482` are from Patient B. So, let's perform integration with a method that can use this information - [`harmony`](https://portals.broadinstitute.org/harmony/)! @@ -742,7 +739,7 @@ However, unlike `fastMNN`, `harmony` does not "back-calculate" corrected express For input, `harmony` needs a couple pieces of information: - First, `harmony` takes a batch-weighted PCA matrix to perform integration. -We already calculated a batch-weighted PCA matrix (our `merged_PCA` reduced dimension), we'll provide this as the the input. +We already calculated a batch-weighted PCA matrix so we'll provide this as the the input. - Second, we need to tell `harmony` about the covariates to use - `sample` and `patient`. To do this, we provide two arguments: - `meta_data`, a data frame that contains covariates across samples. @@ -755,7 +752,7 @@ Let's go! ```{r run harmony, live = TRUE} # Run harmony integration harmony_pca <- harmony::RunHarmony( - data_mat = reducedDim(merged_sce, "merged_PCA"), + data_mat = reducedDim(merged_sce, "PCA"), meta_data = colData(merged_sce), vars_use = c("sample", "patient") ) @@ -809,7 +806,7 @@ scater::plotReducedDim(merged_sce, # Specify variable for faceting other_fields = "sample") + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + - guides(color = guide_legend(override.aes = list(size = 3))) + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with harmony") + facet_wrap(vars(sample)) ``` @@ -818,7 +815,7 @@ What do you now notice in this faceted view that wasn't clear previously? Are there other patterns you see that are similar or different from the `fastMNN` UMAP? How do you think `fastMNN` vs. `harmony` performed in integrating these samples? -### Export +## Export Finally, we'll export the final SCE object with both `fastMNN` and `harmony` integration to a file. Since this object is very large (over 1 GB!), we'll export it to a file with some compression, which, in this case, will reduce the final size to a smaller ~360 MB. @@ -826,9 +823,11 @@ This will take a couple minutes to save while compression is performed. ```{r save integration, live = TRUE} # Export to RDS file with "gz" compression -readr::write_rds(merged_sce, - integrated_sce_file, - compress = "gz") +readr::write_rds( + merged_sce, + integrated_sce_file, + compress = "gz" +) ``` diff --git a/scRNA-seq-advanced/02-dataset_integration.nb.html b/scRNA-seq-advanced/02-dataset_integration.nb.html index 1b5b26bf..28d07264 100644 --- a/scRNA-seq-advanced/02-dataset_integration.nb.html +++ b/scRNA-seq-advanced/02-dataset_integration.nb.html @@ -3075,8 +3075,8 @@

Set up

-
-

Directories and files

+
+

Define directories and files

We have already prepared count data for the four samples we’ll be integrating (i.e., filtered cells, normalized counts, and calculated PCA & UMAP). These SCE objects, stored as RDS files, are available in @@ -3088,6 +3088,8 @@

Directories and files

  • SCPCL000481.rds (Patient B)
  • SCPCL000482.rds (Patient B)
  • +

    Both Patient A (18 year old male) and Patient B (4 year old female) +had recurrent embryonal rhabdomyosarcoma when samples were taken.

    To begin, let’s set up our directories and files:

    @@ -3205,50 +3207,8 @@

    Directories and files

    -

    One other new coding strategy we’ll learn in this notebook is using -the glue package -to combine strings. This package offers a convenient function -glue::glue() that can be used instead of the base R -paste() function.

    - - - -
    # Define a variable for example:
    -org_name <- "Data Lab"
    -
    -# We can use paste to combine strings and variables:
    -paste("Welcome to the", org_name, "workshop on Advanced scRNA-seq!")
    - - -
    [1] "Welcome to the Data Lab workshop on Advanced scRNA-seq!"
    - - -
    Welcome to the Data Lab workshop on Advanced scRNA-seq!
    - - - -

    We can use glue::glue() to accomplish the same goal with -some different syntax:

    - - - -
    # glue::glue takes a single string argument (only one set of quotes!), and
    -#  variables can easily be included inside {curly braces}
    -glue::glue("Welcome to the {org_name} workshop on Advanced scRNA-seq!")
    - - -
    Welcome to the Data Lab workshop on Advanced scRNA-seq!
    - - -
    Welcome to the Data Lab workshop on Advanced scRNA-seq!
    - - - -

    (Note that even though the glue::glue() output isn’t in -quotes, it still behaves like a string!)

    -

    Alright, time for the good stuff! Let’s use purrr::map() -to read in our SCE objects so that they are immediately stored together -in a list.

    +

    Let’s use purrr::map() to read in our SCE objects so +that they are immediately stored together in a list.

    We’ll first need to define a vector of the file paths to read in. We’ll start by creating a vector of sample names themselves and then formatting them into the correct paths. This way (foreshadowing!) we @@ -3416,8 +3376,8 @@

    Directories and files

    performance, but they are not part of the integration itself.

    -
    -

    Prepare the SCE list for integration

    +
    +

    Merge the SCE list into one object

    Single-cell roadmap: Merge
    Single-cell roadmap: Merge
    @@ -3430,179 +3390,88 @@

    Prepare the SCE list for integration

    integration next.

    To merge SCE objects, we do need to do some wrangling and bookkeeping to ensure compatibility and that we don’t lose important information. -Overall we’ll want to take care of these items:

    +Overall, we’ll want to make sure that:

      -
    1. We should be able to trace sample-specific information back to the -originating sample, including… +
    2. All objects have compatible dimensions. This means that all objects +should…
        -
      • Cell-level information: Which sample is each cell from?
      • -
      • Library-specific feature statistics, e.g., gene-level statistics for -a given library found in rowData. Which sample is a given -feature statistic from?
      • +
      • Have the same genes (aka row names), in the same order
      • +
      • Have the same colData slot columns, in the same +order
      • +
      • Have the same assays
      • +
    3. +
    4. After merging, we’ll still be able to identify which sample +different pieces of information came from As we saw in the slides, this +means we’ll have to… +
        +
      • Attach sample names to the barcodes (aka column names) This also +ensures that column names are unique; while a single sample (library) is +guaranteed to have unique barcodes, technically they can be repeated +across samples!
      • +
      • Attach sample names to rowData slot column names and +metadata field names (if you care to keep this information +around - today, we will!)
      • +
      • Add a new column indicating the sample to the colData +slot
    5. -
    6. SCE objects should contain the same genes: Each SCE object should -have the same row names.
    7. -
    8. SCE cell metadata columns should match: The colData for -each SCE object should have the same column names.
    -

    We’ll begin by taking some time to thoroughly explore our SCE objects -and figure out what wrangling steps we need to take for these specific -data. Don’t skip this exploration! Bear in mind that the exact wrangling -shown here will not be the same for other SCE objects you work with, but -the same general principles apply.

    -
    -

    Preserving sample information at the cell level

    -

    How will we be able to tell which sample a given cell came from?

    -

    The best way to do this is simply to add a colData -column with the sample information, so that we can know which sample -each row came from.

    -

    In addition, we want to pay some attention to the SCE object’s column -names (the cell ids), which must remain unique after merging since -duplicate ids will cause an R error. In this case, the SCE column names -are barcodes (which is usually but not always the case in SCE objects), -which are only guaranteed to be unique within a sample but may -be repeated across samples. So, after merging, it’s technically possible -that multiple cells will have the same barcode. This would be a problem -for two reasons: First, the cell id would not be able to point us back -to cell’s originating sample. Second, it would literally cause an error -in R, which does not allow duplicate column names.

    -

    One way to ensure that cell ids remain unique even after merging is -to actually modify them by prepending the relevant sample name. -For example, consider these barcodes for the SCPCL000479 -sample:

    - - - -
    # Look at the column names for the `SCPCL000479` sample, for example
    -colnames(sce_list$SCPCL000479) |>
    -  # Only print out the first 6 for convenience
    -  head()
    - - -
    [1] "GGGACCTCAAGCGGAT" "CACAGATAGTGAGTGC" "TGTGGCGGTGAATTGA" "GCCGATGGTACATACC"
    -[5] "ATTATCCCAGTTGGTT" "TCCGAAATCACACCGG"
    - - -
    GGGACCTCAAGCGGAT
    -CACAGATAGTGAGTGC
    -TGTGGCGGTGAATTGA
    -GCCGATGGTACATACC
    -ATTATCCCAGTTGGTT
    -TCCGAAATCACACCGG
    - - - -

    These ids will be updated to -SCPCL000479-GGGACCTCAAGCGGAT, -SCPCL000479-CACAGATAGTGAGTGC, and so on, thereby ensuring -fully unique ids for all cells across all samples.

    -
    -
    -

    Preserving sample information at the gene level

    -

    The rowData table in SCE objects will often contain both -“general” and “library-specific” information, for example:

    - - - -
    rowData(sce_list$SCPCL000479) |>
    -  head()
    - - -
    DataFrame with 6 rows and 3 columns
    -                gene_symbol       mean  detected
    -                <character>  <numeric> <numeric>
    -ENSG00000000003      TSPAN6 0.01772018  1.639778
    -ENSG00000000005        TNMD 0.00264480  0.158688
    -ENSG00000000419        DPM1 0.07299656  6.109495
    -ENSG00000000457       SCYL3 0.02300979  1.983602
    -ENSG00000000460    C1orf112 0.08119545  6.426871
    -ENSG00000000938         FGR 0.00317376  0.238032
    - - - -

    Here, the rownames are Ensembl gene ids, and columns are -gene_symbol, mean, and detected. -The gene_symbol column is general information about all -genes, not specific to any library or experiment, but mean -and detected are library-specific gene statistics. So, -gene_symbol does not need to be traced back to its -originating sample, but mean and detected do. -To this end, we can take a similar approach to what we’ll do for cell -ids: We can change the sample-specific rowData column names -by prepending the sample name. For example, rather than being called -mean, this column will be named -SCPCL000479-mean for the SCPCL000479 -sample.

    -

    All our SCE objects have the same rowData columns (as we -can see in the next chunk), so we’ll perform this renaming across all -SCEs.

    - - - -
    # Use `purrr::map()` to quickly extract rowData column names for all SCEs
    -purrr::map(sce_list,
    -           \(sce) colnames(rowData(sce)))
    - - -
    $SCPCL000479
    -[1] "gene_symbol" "mean"        "detected"   
    -
    -$SCPCL000480
    -[1] "gene_symbol" "mean"        "detected"   
    -
    -$SCPCL000481
    -[1] "gene_symbol" "mean"        "detected"   
    -
    -$SCPCL000482
    -[1] "gene_symbol" "mean"        "detected"   
    - - -
    gene_symbol
    -mean
    -detected
    - - -
    gene_symbol
    -mean
    -detected
    - - -
    gene_symbol
    -mean
    -detected
    - - -
    gene_symbol
    -mean
    -detected
    - - - +

    We’ll approach this merge in two parts:

    +
      +
    • First, we’ll take some time to thoroughly explore the our SCE +objects to determine what wrangling we need to do to make all the +objects compatible for merging
    • +
    • Then, we’ll write (ok, we’ve written it for you) a custom +function to format each SCE object for merging, including: +
        +
      • Making any changes to ensure objects are compatible
      • +
      • Adding in identifying information so we know which sample the cells +and other metadata came from
      • +
      • Removing the existing reduced dimension matrices (PCA and UMAP). +This is because we’ll want to recalculate these matrices on the merged +objects, taking batch into account
      • +
    • +
    +

    When merging objects on your own, don’t skip these data exploration +steps! The steps we take to prepare our SCEs will probably be different +from the steps you need to take with other SCEs, and only by carefully +exploring the objects can you figure out what steps you’ll need to take +to meet all of our conditions.

    +
    +

    Prepare to merge SCEs

    +
    +

    Create unique cell identifiers

    +

    As part of the custom function we’ll write, we’ll include a step to +create unique cell identifiers by attaching sample names to the SCE +column names (cell barcodes). For example, we would update the column +name for a cell from Sample1 with the barcode +ACGT to Sample1-ACGT.

    +

    When merging, there can’t be any duplicate column names (barcodes) +across all the objects or R will throw an error. While you’re +guaranteed to have unique barcodes in a given SCE object, there is +no guarantee that they are unique across multiple samples - it +is absolutely possible to have cells from two different samples share +the same barcode (and we’ve seen it happen!).

    +

    Adding the sample id to the column names (barcodes) is therefore a +crucial step in our merging bookkeeping.

    -
    -

    Ensuring that only shared genes are used

    -

    The next step in ensuring SCE compatibility is to make sure they all -contain the same genes, which are stored as the SCE object’s row names -(these names are also found the rowData slot’s row names). -Here, those gene ids are unique Ensembl gene ids.

    -

    We can use some purrr magic to quickly find the set of -shared genes among our samples, and then ask how many there are.

    +
    +

    Explore the SCE objects

    +
    +
    Check the genes
    +

    First, we’ll compare the object’s genes (aka, their row names). We +can use some purrr magic to help us find the set of shared +genes among all objects:

    - +
    # Define vector of shared genes
     shared_genes <- sce_list |>
       # get rownames (genes) for each SCE in sce_list
       purrr::map(rownames) |>
       # reduce to the _intersection_ among lists
    -  purrr::reduce(intersect)
    - - - - - - -
    # How many shared genes are there?
    +  purrr::reduce(intersect)
    +
    +# How many shared genes are there?
     length(shared_genes)
    @@ -3610,10 +3479,10 @@

    Ensuring that only shared genes are used

    -

    In this case, we happen to know that all SCE objects we’re working -with already contained the same genes. We do a quick-and-dirty check for -this by looking at the number of rows across SCE objects, and we’ll see -that they are all the same:

    +

    That’s quite a lot! In fact, because these objects were all uniformly +processed by the same workflow (which did not filter out any genes!), we +expect them to all have the same genes. We can map over the list to +confirm that indeed, they have the same number of rows (genes):

    @@ -3636,20 +3505,32 @@

    Ensuring that only shared genes are used

    -

    So, for our data, we will not have to subset to shared genes since -they are already shared!

    +

    Even though we know the genes already match, we need to also be sure +they are in the same order among all objects. So, we’ll hold +onto that shared_genes variable we defined and use it soon +in our custom formatting function to make sure all objects fully +match.

    +

    It’s worth noting that the intersection isn’t the only option here, +though! Using the intersection means a lot of genes will get discarded +if the objects have different genes. We could instead take the +union of genes so nothing gets thrown out. In this case, you’d +need to create “dummy” assay rows for genes that a given SCE doesn’t +have and fill it with NA expression values. You’ll still +have to make sure the SCEs have the same rows in the same order before +merging, so you may need to do a decent bit of matrix wrangling.

    -
    -

    Ensuring matching columns in colData

    -

    Finally, we’ll need to have the same column names across all SCE -colData tables, so let’s look at all those column names. We -can use similar syntax here to what we used to look at all the -rowData column names.

    +
    +
    Check the colData column names
    +

    Next up, we’ll check the colData columns: we need these +to be the same, and in the same order. Let’s print out each object’s +colData column name to see where we stand:

    - -
    purrr::map(sce_list,
    -           \(sce) colnames(colData(sce)) )
    + +
    sce_list |>
    +  purrr::map(
    +    \(sce) colnames(colData(sce)) 
    +  ) 
    $SCPCL000479
    @@ -3734,18 +3615,138 @@ 

    Ensuring matching columns in colData

    -

    It looks like the column names are all already matching among SCEs, -so there’s no specific preparation we’ll need to do there.

    +

    We see the same columns all around in the same order, which is +great!

    +

    But what if there were different columns across objects, or they were +differently ordered? In that case, we could find the intersection of +column names like we did above for genes, and use that to re-order and +subset all colData slots in our custom formatting +function.

    -
    -

    Perform SCE merging

    +
    +
    Check the assays
    +

    Next, we’ll make sure that all objects share the same assays:

    + + + +
    # print all the assay names
    +sce_list |>
    +  purrr::map(assayNames)
    + + +
    $SCPCL000479
    +[1] "counts"    "logcounts"
    +
    +$SCPCL000480
    +[1] "counts"    "logcounts"
    +
    +$SCPCL000481
    +[1] "counts"    "logcounts"
    +
    +$SCPCL000482
    +[1] "counts"    "logcounts"
    + + +
    counts
    +logcounts
    + + +
    counts
    +logcounts
    + + +
    counts
    +logcounts
    + + +
    counts
    +logcounts
    + + + +

    Again, all objects are compatible already with both having a +counts and logcounts assay.

    +

    In your own data exploration, if you encounter SCEs to merge that +have extraneous assays that you don’t need, you can remove them by +setting them to NULL in your custom formatting function, +e.g. assay(sce, "assay_to_remove") <- NULL.

    +
    +
    +
    Check the rowData contents
    +

    One of the other items we said we’d need to think about is the +rowData, which contains gene metadata. This slot is +interesting because some of its columns are specific to the given +sample, while others are general:

    + + + +
    sce_list |>
    +  purrr::map(
    +    \(sce) head(rowData(sce), 3) # only print 3 rows for space!
    +  )
    + + +
    $SCPCL000479
    +DataFrame with 3 rows and 3 columns
    +                gene_symbol      mean  detected
    +                <character> <numeric> <numeric>
    +ENSG00000000003      TSPAN6 0.0177202  1.639778
    +ENSG00000000005        TNMD 0.0026448  0.158688
    +ENSG00000000419        DPM1 0.0729966  6.109495
    +
    +$SCPCL000480
    +DataFrame with 3 rows and 3 columns
    +                gene_symbol       mean  detected
    +                <character>  <numeric> <numeric>
    +ENSG00000000003      TSPAN6 0.05209841  4.828312
    +ENSG00000000005        TNMD 0.00855151  0.828838
    +ENSG00000000419        DPM1 0.08919879  8.301539
    +
    +$SCPCL000481
    +DataFrame with 3 rows and 3 columns
    +                gene_symbol      mean  detected
    +                <character> <numeric> <numeric>
    +ENSG00000000003      TSPAN6 0.0637984  5.989666
    +ENSG00000000005        TNMD 0.0054835  0.495624
    +ENSG00000000419        DPM1 0.2401139 20.056944
    +
    +$SCPCL000482
    +DataFrame with 3 rows and 3 columns
    +                gene_symbol      mean  detected
    +                <character> <numeric> <numeric>
    +ENSG00000000003      TSPAN6 0.0289113  2.659838
    +ENSG00000000005        TNMD 0.0100776  0.759954
    +ENSG00000000419        DPM1 0.1391046 11.217578
    + + + +

    The column gene_symbol is not sample-specific - it just +provides the corresponding gene symbol to the Ensembl ids seen here as +row names. The columns mean and detected, +however, are sample-specific - they contain sample-specific statistics +about gene expression.

    +

    This means we definitely need to update the column names +mean and detected to include the sample id. +But, we don’t need a separate gene_symbol column for each +sample, so we can leave that one alone as just gene_symbol. +Once we eventually merge, only one gene_symbol column will +be left in the final object since it is the same across all the +SCEs.

    +

    We’ll show one way to do this in our custom function, but it’s worth +noting there’s nothing wrong with also adding the sample id to +the gene_symbol column; you’ll just end up with a bunch of +redundant gene symbol columns.

    +
    +
    +
    +

    Reformat the SCE objects

    As you can see, there’s a lot of moving parts to consider! Again, these moving parts may (will!) differ for SCEs that you are working with, so you have to explore your own SCEs in depth to prepare for merging.

    Based on our exploration, here is a schematic of how one of the SCE objects will ultimately be modified into the final merged SCE:

    -

    +

    We’ll write a custom function (seen in the chunk below) tailored to our wrangling steps that prepares a single SCE object for merging. We’ll then use our new purrr::map() programming @@ -3756,35 +3757,64 @@

    Perform SCE merging

    written to match the processing we need to do for these SCEs, and different SCEs you work with will require different types of processing.

    +

    We also include roxygen-style comments for this function, which can +be a helpful consistent way to document your code if you like it - we’ve +even written a blog post about it :) (https://www.ccdatalab.org/blog/dont-make-me-write-tips-for-avoiding-typing-in-rstudio).

    - -
    format_sce <- function(sce, sample_name) {
    -  # Input arguments:
    -  ## sce: An SCE object to format
    -  ## sample_name: The SCE object's name
    -  # This function returns a formatted SCE object.
    -
    -  ###### Ensure that we can identify the originating sample information ######
    -  # Add a column called `sample` that stores this information
    -  # This will be stored in `colData`
    +
    +
    #' Custom function to format an SCE before merging
    +#'
    +#' @param sce SCE object to format
    +#' @param sample_name Name of the sample
    +#' @param shared_genes Vector of shared genes across all SCE objects
    +#'
    +#' @returns An updated SCE object ready for merging
    +format_sce <- function(
    +  sce, 
    +  sample_name, 
    +  shared_genes
    +) {
    +  
    +  ### Remove the single-sample reduced dimensions 
    +  # We do this first since it makes the object a lot smaller for the rest of this code!
    +  reducedDims(sce) <- NULL
    +  
    +  ### Add dedicated sample indicator column to the colData slot
    +  # Recall, the `sce$` shortcut points to the colData
       sce$sample <- sample_name
     
    -
    -  ###### Ensure cell ids will be unique ######
    -  # Update the SCE object column names (cell ids) by prepending `sample_name`
    +  ### Ensure objects have the same genes in the same order
    +  # Use the shared_genes vector to index genes to the intersection
    +  # Doing this both subsets to just those genes, and reorders!
    +  sce <- sce[shared_genes, ]
    +  
    +  ### There is no additional wrangling to do for the colData column names or assays.
    +  ### But if there were, you could add your custom code to do so here.
    +  ### Your custom function may need additional arguments for this, too.
    +
    +  ### Ensure cell ids are identifiable and fully unique 
    +  # Update the SCE object column names (cell ids) by prepending the `sample_name`
       colnames(sce) <- glue::glue("{sample_name}-{colnames(sce)}")
     
    -
    -  ###### Ensure gene-level statistics can be identified in `rowData` ######
    -  # We want to rename the columns `mean` and `detected` to contain the `sample_name`
    -  # Recall the names are: "gene_symbol", "mean", "detected"
    -  colnames(rowData(sce)) <- c("gene_symbol",
    -                              glue::glue("{sample_name}-mean"),
    -                              glue::glue("{sample_name}-detected"))
    -
    -  # Return the formatted SCE object
    -  return(sce)
    +  ### Ensure the rowData columns can be identified
    +  # Recall, we want to leave `gene_symbol` alone, but add the `sample_name` to the rest
    +  rowdata_names <- colnames(rowData(sce))
    +  # prefix rowData names with the sample name, except for gene symbols
    +  new_rowdata_names <- ifelse(
    +    rowdata_names == "gene_symbol",
    +    "gene_symbol",
    +    glue::glue("{sample_name}-{rowdata_names}")
    +  )
    +  colnames(rowData(sce)) <- new_rowdata_names
    +  
    +  ### Ensure metadata slot fields can be identified
    +  # We'll simply prepend the `sample_name` to all fields for this slot
    +  names(metadata(sce)) <- glue::glue("{sample_name}-{names(metadata(sce))}")
    +  
    +  
    +  ### Finally, we can return the formatted SCE object
    +  return(sce)  
     }
    @@ -3796,26 +3826,25 @@

    Perform SCE merging

    sce_list names.

    - +
    # We can use `purrr::map2()` to loop over two list/vector arguments
     sce_list_formatted <- purrr::map2(
       # Each "iteration" will march down the first two
       #  arguments `sce_list` and `names(sce_list)` in order
       sce_list,
       names(sce_list),
    -  # Name of the function to run
    -  format_sce
    +  \(sce, sample_name) format_sce(sce, sample_name, shared_genes) 
     )
     
    -# Print resulting list
    +# Print formatted SCE list
     sce_list_formatted
    - +
    $SCPCL000479
     class: SingleCellExperiment 
     dim: 60319 1918 
    -metadata(14): salmon_version reference_index ... filtering_method
    -  miQC_model
    +metadata(14): SCPCL000479-salmon_version SCPCL000479-reference_index
    +  ... SCPCL000479-filtering_method SCPCL000479-miQC_model
     assays(2): counts logcounts
     rownames(60319): ENSG00000000003 ENSG00000000005 ... ENSG00000288724
       ENSG00000288725
    @@ -3824,15 +3853,15 @@ 

    Perform SCE merging

    SCPCL000479-CACAGATAGTGAGTGC ... SCPCL000479-GTTGTCCCACGTACAT SCPCL000479-TCCGATCGTCGTGCCA colData names(13): sum detected ... celltype_broad sample -reducedDimNames(2): PCA UMAP +reducedDimNames(0): mainExpName: NULL altExpNames(0): $SCPCL000480 class: SingleCellExperiment dim: 60319 4428 -metadata(14): salmon_version reference_index ... filtering_method - miQC_model +metadata(14): SCPCL000480-salmon_version SCPCL000480-reference_index + ... SCPCL000480-filtering_method SCPCL000480-miQC_model assays(2): counts logcounts rownames(60319): ENSG00000000003 ENSG00000000005 ... ENSG00000288724 ENSG00000288725 @@ -3841,15 +3870,15 @@

    Perform SCE merging

    SCPCL000480-AACTTCTTCCCTCAAC ... SCPCL000480-AGGGAGTAGCCTCATA SCPCL000480-TCGGATACATTGCAAC colData names(13): sum detected ... celltype_broad sample -reducedDimNames(2): PCA UMAP +reducedDimNames(0): mainExpName: NULL altExpNames(0): $SCPCL000481 class: SingleCellExperiment dim: 60319 5236 -metadata(14): salmon_version reference_index ... filtering_method - miQC_model +metadata(14): SCPCL000481-salmon_version SCPCL000481-reference_index + ... SCPCL000481-filtering_method SCPCL000481-miQC_model assays(2): counts logcounts rownames(60319): ENSG00000000003 ENSG00000000005 ... ENSG00000288724 ENSG00000288725 @@ -3858,15 +3887,15 @@

    Perform SCE merging

    SCPCL000481-GGGTATTTCGTTGTGA ... SCPCL000481-AAAGAACCACTTCAAG SCPCL000481-CAGCAGCTCGTGCATA colData names(13): sum detected ... celltype_broad sample -reducedDimNames(2): PCA UMAP +reducedDimNames(0): mainExpName: NULL altExpNames(0): $SCPCL000482 class: SingleCellExperiment dim: 60319 4372 -metadata(14): salmon_version reference_index ... filtering_method - miQC_model +metadata(14): SCPCL000482-salmon_version SCPCL000482-reference_index + ... SCPCL000482-filtering_method SCPCL000482-miQC_model assays(2): counts logcounts rownames(60319): ENSG00000000003 ENSG00000000005 ... ENSG00000288724 ENSG00000288725 @@ -3875,7 +3904,7 @@

    Perform SCE merging

    SCPCL000482-CAACCTCTCCGATCGG ... SCPCL000482-TGATTTCCACAAGTTC SCPCL000482-ACCAAACGTTCTCAGA colData names(13): sum detected ... celltype_broad sample -reducedDimNames(2): PCA UMAP +reducedDimNames(0): mainExpName: NULL altExpNames(0):
    @@ -3883,6 +3912,10 @@

    Perform SCE merging

    (Psst, like purrr and want to dive deeper? Check out the purrr::imap() function!)

    +
    +
    +
    +

    Perform the merging

    At long last, we are ready to merge the SCEs, which we’ll do using the R function cbind(). The cbind() function is often used to combine data frames or matrices by column, i.e. “stack” @@ -3905,11 +3938,11 @@

    Perform SCE merging

    # Print the merged_sce object merged_sce
    - +
    class: SingleCellExperiment 
     dim: 60319 15954 
    -metadata(56): salmon_version reference_index ... filtering_method
    -  miQC_model
    +metadata(56): SCPCL000479-salmon_version SCPCL000479-reference_index
    +  ... SCPCL000482-filtering_method SCPCL000482-miQC_model
     assays(2): counts logcounts
     rownames(60319): ENSG00000000003 ENSG00000000005 ... ENSG00000288724
       ENSG00000288725
    @@ -3919,29 +3952,29 @@ 

    Perform SCE merging

    SCPCL000479-CACAGATAGTGAGTGC ... SCPCL000482-TGATTTCCACAAGTTC SCPCL000482-ACCAAACGTTCTCAGA colData names(13): sum detected ... celltype_broad sample -reducedDimNames(2): PCA UMAP +reducedDimNames(0): mainExpName: NULL altExpNames(0):
    -

    We now have a single SCE object that contains all cells from all -samples we’d like to integrate.

    +

    We now have a single merged SCE object that contains all cells from +all samples we’d like to integrate.

    Let’s take a peek at some of the innards of this new SCE object:

    - +
    # How many samples, and cells per sample?
    -table( colData(merged_sce)$sample )
    +table(colData(merged_sce)$sample)
    
     SCPCL000479 SCPCL000480 SCPCL000481 SCPCL000482 
            1918        4428        5236        4372 
    - +
    # What are the new cell ids (column names)?
    -head( colnames(merged_sce) )
    +head(colnames(merged_sce))
    [1] "SCPCL000479-GGGACCTCAAGCGGAT" "SCPCL000479-CACAGATAGTGAGTGC"
    @@ -3956,9 +3989,25 @@ 

    Perform SCE merging

    SCPCL000479-ATTATCCCAGTTGGTT SCPCL000479-TCCGAAATCACACCGG
    - + +
    tail(colnames(merged_sce))
    + + +
    [1] "SCPCL000482-GATCACACAGCTAACT" "SCPCL000482-GACGCTGAGACTCTAC"
    +[3] "SCPCL000482-GTGAGGAGTCAACCTA" "SCPCL000482-ATTCCTAGTGTACATC"
    +[5] "SCPCL000482-TGATTTCCACAAGTTC" "SCPCL000482-ACCAAACGTTCTCAGA"
    + + +
    SCPCL000482-GATCACACAGCTAACT
    +SCPCL000482-GACGCTGAGACTCTAC
    +SCPCL000482-GTGAGGAGTCAACCTA
    +SCPCL000482-ATTCCTAGTGTACATC
    +SCPCL000482-TGATTTCCACAAGTTC
    +SCPCL000482-ACCAAACGTTCTCAGA
    + +
    # What does rowData look like?
    -head( rowData(merged_sce) )
    +head(rowData(merged_sce))
    DataFrame with 6 rows and 9 columns
    @@ -3991,8 +4040,8 @@ 

    Perform SCE merging

    -
    -

    Integration

    +
    +

    Integrate samples

    Single-cell roadmap: Integrate
    Single-cell roadmap: Integrate
    @@ -4005,78 +4054,28 @@

    Integration

    harmony specifically use PCA for this, but be aware that different integration methods may use other kinds of reduced dimensions.

    -

    You’ll notice that the merged SCE object object already contains PCA -and UMAP reduced dimensions, which were calculated during our -pre-processing:

    - - - -
    # Print the reducedDimNames of the merged_sce
    -reducedDimNames(merged_sce)
    - - -
    [1] "PCA"  "UMAP"
    - - -
    PCA
    -UMAP
    - - - -

    These represent the original dimension reductions that were performed -on each individual SCE before merging, but we actually need to -calculate PCA (and UMAP for visualization) from the merged object -directly.

    -

    Why can’t we use the sample-specific PCA and UMAP matrices? Part of -these calculations themselves involves scaling the raw data to center -the mean. When samples are separately centered but plotting together, -you will see samples “overlapping” in space, but this placement is -actually just an artifact of the individual centering. In addition, the -mathematical relationship between the original expression data and -reduced dimension version of that data will differ across samples, -meaning we can’t interpret them all together. To see how this looks, -let’s look at the UMAP when calculated from individual samples:

    - - - -
    # Plot UMAP calculated from individual samples with separate scaling
    -scater::plotReducedDim(merged_sce,
    -                       dimred = "UMAP",
    -                       color_by = "sample",
    -                       point_size = 0.5,
    -                       point_alpha = 0.2) +
    -  # Use a CVD-friendly color scheme and specify legend name
    -  scale_color_brewer(palette = "Dark2", name = "sample") + 
    -  # Modify the legend key with larger, easier to see points
    -  guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) +
    -  ggtitle("UMAP calculated on each sample separately")
    - - -
    Scale for colour is already present.
    -Adding another scale for colour, which will replace the existing scale.
    - - -

    - - - -

    As we see in this UMAP, all samples are centered at zero and all -overlapping. This visual artifact can give the incorrect -impression that data is integrated - to be clear, this data is NOT -integrated!

    -

    For input to integration, we’ll want the reduced dimension -calculations to consider normalized gene expression values from all -samples simultaneously. So we’ll need to recalculate PCA (and UMAP for -visualization) on the merged object. We’ll also save these new reduced -dimensions with different names, merged_PCA and -merged_UMAP, to distinguish them from already-present -PCA and UMAP.

    +

    Before merging, our objects had reduced dimension representations +calculated on each individual SCE, and we removed them when preparing +for merge. We removed them because we don’t actually want to use them +anymore! This is because part of their calculation involves scaling the +raw data to center the mean. When samples are separately centered, +all of them will be centered at zero, making it look like the +datasets are already pretty overlapping when you plot their UMAPs +together. But, this is just a mathematical artifact of how dimension +reduction is performed.

    +

    So, we’ll begin by re-calculating PCA and UMAP on the merged object +in a way that takes batches into consideration. For input to +integration, we’ll want the reduced dimension calculations to consider +normalized gene expression values from all samples simultaneously. So +we’ll need to recalculate PCA (and UMAP for visualization) on the merged +object.

    First, as usual, we’ll determine the high-variance genes to use for PCA from the merged_sce object. For this, we’ll need to provide the argument block = merged_sce$sample when modeling gene variance, which tells scran::modelGeneVar() to first model variance separately for each batch and then combine those -modeling statistics.

    +modeling statistics. (Psst: isn’t it handy we created that +sample column when merging?!)

    @@ -4147,48 +4146,32 @@

    Integration

    object:

    - +
    # add PCA results to merged SCE object
    -reducedDim(merged_sce, "merged_PCA") <- merged_pca[[1]]
    +reducedDim(merged_sce, "PCA") <- merged_pca[[1]]

    Now that we have the PCA matrix, we can proceed to calculate UMAP to visualize the uncorrected merged data.

    -

    We’ll calculate UMAP as “usual”, but in this case we’ll specify two -additional arguments:

    -
      -
    • dimred = "merged_PCA", which specifies which existing -reduced dimension should be used for the calculation. We want to use the -batch-weighted PCA, which we named above as -"merged_PCA".
    • -
    • name = "merged_UMAP", which names the final UMAP that -this function calculates. This argument will prevent us from overwriting -the existing UMAP which is already named “UMAP” and instead create a -separate "merged_UMAP".
    • -
    - -
    # add merged_UMAP from merged_PCA
    -merged_sce <- scater::runUMAP(merged_sce,
    -                              dimred = "merged_PCA",
    -                              name = "merged_UMAP")
    + +
    merged_sce <- scater::runUMAP(merged_sce)
    -

    Now, let’s see how this new merged_UMAP looks compared -to the UMAP calculated from individual samples:

    - +
    # UMAPs scaled together when calculated from the merged SCE
    -scater::plotReducedDim(merged_sce,
    -                       dimred = "merged_UMAP",
    -                       color_by = "sample",
    -                       # Some styling to help us see the points:
    -                       point_size = 0.5,
    -                       point_alpha = 0.2) +
    +scater::plotUMAP(
    +  merged_sce,
    +  color_by = "sample",
    +  # Some styling to help us see the points:
    +  point_size = 0.5,
    +  point_alpha = 0.2
    +) +
       scale_color_brewer(palette = "Dark2", name = "sample") +
       guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) +
       ggtitle("UMAP calculated on merged_sce")
    @@ -4198,19 +4181,19 @@

    Integration

    Adding another scale for colour, which will replace the existing scale. -

    +

    -

    Samples are now separated, which more reasonably reflects that this -data is not yet batch-corrected. We can think of this UMAP as -our “before” UMAP, and we can compare this to the “after” UMAP we see -post-integration.

    +

    We see (mostly) four separate clumps representing the four different +merged but not yet integrated samples. We can think of this +UMAP as our “before” UMAP, and we can compare this to the “after” UMAP +we see post-integration.

    Let’s discuss a little first: What visual differences do you think the UMAP on the integrated version of data will have? What similarities do you think the integrated UMAP will have to this plot?

    -
    -

    Integration with fastMNN

    +
    +

    Integrate with fastMNN

    Finally, we’re ready to integrate! To start, we’ll use the fastMNN approach from the Bioconductor batchelor package.

    @@ -4292,7 +4275,14 @@

    Integration with fastMNN

    Finally, we’ll calculate UMAP from these corrected PCA matrix for -visualization.

    +visualization. In this case we need to specify two additional arguments +since we’re working with non-standard reduced dimension names:

    +
      +
    • dimred = "fastmnn_PCA", which specifies the existing +reduced dimension to use for the calculation
    • +
    • name = "fastmnn_UMAP", which names the final UMAP that +this function calculates
    • +
    @@ -4332,13 +4322,13 @@

    Integration with fastMNN

    Adding another scale for colour, which will replace the existing scale. -

    +

    This fastmnn_UMAP certainly looks different from the one -we made from merged_UMAP! What different trends do you see? -Do all samples look “equally well” integrated, from a first look?

    +we made before integrating! What different trends do you see? Do all +samples look “equally well” integrated, from a first look?

    Importantly, one reason that batches may still appear separated in the corrected UMAP is if they should be separated - for example, maybe two batches contain very different cell types, have very @@ -4398,7 +4388,7 @@

    Integration with fastMNN

    Adding another scale for colour, which will replace the existing scale. -

    +

    @@ -4437,24 +4427,24 @@

    Integration with fastMNN

    Adding another scale for colour, which will replace the existing scale. -

    +

    What trends do you observe between tumor and healthy tissues among these integrated samples?

    -
    -

    Integration with harmony

    +
    +

    Integrate with harmony

    fastMNN is only one of many approaches to perform integration, and different methods have different capabilities and may give different results. For example, some methods can accommodate additional covariates (e.g., technology, patient, diagnosis, etc.) that can influence integration. In fact the data we are using has a known patient covariate; SCPCL000479 and -SCPCL000480 are from the first patient, and -SCPCL000481 and SCPCL000482 are from the -second patient.

    +SCPCL000480 are from Patient A, and +SCPCL000481 and SCPCL000482 are from Patient +B.

    So, let’s perform integration with a method that can use this information - harmony!

    To begin setting up for harmony integration, we need to @@ -4487,8 +4477,7 @@

    Integration with harmony

    • First, harmony takes a batch-weighted PCA matrix to perform integration. We already calculated a batch-weighted PCA matrix -(our merged_PCA reduced dimension), we’ll provide this as -the the input.
    • +so we’ll provide this as the the input.
    • Second, we need to tell harmony about the covariates to use - sample and patient. To do this, we provide two arguments: @@ -4505,10 +4494,10 @@

      Integration with harmony

      Let’s go!

      - +
      # Run harmony integration
       harmony_pca <- harmony::RunHarmony(
      -  data_mat = reducedDim(merged_sce, "merged_PCA"),
      +  data_mat = reducedDim(merged_sce, "PCA"),
         meta_data = colData(merged_sce),
         vars_use = c("sample", "patient")
       )
      @@ -4538,13 +4527,13 @@

      Integration with harmony

      # Print the harmony result
       harmony_pca[1:5, 1:5]
      - +
                                        [,1]      [,2]      [,3]     [,4]       [,5]
      -SCPCL000479-GGGACCTCAAGCGGAT -7.032044 -7.271764 -3.713022 5.477643  0.6781986
      -SCPCL000479-CACAGATAGTGAGTGC -8.237485 -7.436515 -5.579578 6.101144 -0.1577978
      -SCPCL000479-TGTGGCGGTGAATTGA -7.893770 -6.595934 -2.042903 4.706149  0.9176450
      -SCPCL000479-GCCGATGGTACATACC -6.741593 -7.537079 -5.997807 2.609384 -4.1100267
      -SCPCL000479-ATTATCCCAGTTGGTT -5.534487 -4.887054 -1.897409 2.588823  1.5458433
      +SCPCL000479-GGGACCTCAAGCGGAT -7.036850 -7.280253 -3.825712 5.564675 0.5984375 +SCPCL000479-CACAGATAGTGAGTGC -8.232417 -7.422768 -5.641379 6.128005 -0.2208036 +SCPCL000479-TGTGGCGGTGAATTGA -7.928602 -6.591079 -2.140173 4.775223 0.8639596 +SCPCL000479-GCCGATGGTACATACC -6.821359 -7.465958 -5.872961 2.313765 -4.1492218 +SCPCL000479-ATTATCCCAGTTGGTT -5.611779 -4.916862 -1.894365 2.626925 1.5535017 @@ -4584,7 +4573,7 @@

      Integration with harmony

      Adding another scale for colour, which will replace the existing scale. -

      +

      @@ -4594,7 +4583,7 @@

      Integration with harmony

      visibility:

      - +
      scater::plotReducedDim(merged_sce,
                              dimred = "harmony_UMAP",
                              color_by = "celltype_broad",
      @@ -4603,7 +4592,7 @@ 

      Integration with harmony

      # Specify variable for faceting other_fields = "sample") + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + - guides(color = guide_legend(override.aes = list(size = 3))) + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with harmony") + facet_wrap(vars(sample))
      @@ -4612,7 +4601,7 @@

      Integration with harmony

      Adding another scale for colour, which will replace the existing scale. -

      +

      @@ -4622,8 +4611,9 @@

      Integration with harmony

      fastMNN vs. harmony performed in integrating these samples?

    -
    -

    Export

    +
    +
    +

    Export

    Finally, we’ll export the final SCE object with both fastMNN and harmony integration to a file. Since this object is very large (over 1 GB!), we’ll export it to a file @@ -4632,16 +4622,17 @@

    Export

    compression is performed.

    - +
    # Export to RDS file with "gz" compression
    -readr::write_rds(merged_sce,
    -                 integrated_sce_file,
    -                 compress = "gz")
    +readr::write_rds( + merged_sce, + integrated_sce_file, + compress = "gz" +)
    -
    -
    LS0tCnRpdGxlOiAiSW50ZWdyYXRpbmcgc2NSTkEtc2VxIGRhdGFzZXRzIgphdXRob3I6IERhdGEgTGFiIGZvciBBTFNGCmRhdGU6IDIwMjMKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUHJlcGFyZSBTQ0Ugb2JqZWN0cyBmb3IgaW50ZWdyYXRpb24KLSBBcHBseSBpbnRlZ3JhdGlvbiBtZXRob2RzIGluY2x1ZGluZyBgZmFzdE1OTmAgYW5kIGBoYXJtb255YAotIFZpc3VhbGx5IGV4cGxvcmUgdGhlIHJlc3VsdHMgb2YgaW50ZWdyYXRpb24KLSBVc2UgYHB1cnJyOjptYXAoKWAgZnVuY3Rpb25zIGZvciBpdGVyYXRpbmcgb3ZlciBsaXN0cwoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBwZXJmb3JtIGludGVncmF0aW9uIG9uIHNjUk5BLXNlcSBkYXRhc2V0cyBmcm9tIHRoZSBbU2luZ2xlLWNlbGwgUGVkaWF0cmljIENhbmNlciBBdGxhcyAoYFNjUENBYCldKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvKSwgYSBkYXRhYmFzZSBvZiB1bmlmb3JtbHktcHJvY2Vzc2VkIHBlZGlhdHJpYyBzY1JOQS1zZXEgZGF0YSBidWlsdCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgRGF0YSBMYWIuClRoZSBgU2NQQ0FgIGRhdGFiYXNlIGN1cnJlbnRseSBob3N0cyBzaW5nbGUtY2VsbCBwZWRpYXRyaWMgY2FuY2VyIHRyYW5zY3JpcHRvbWljIGRhdGEgZ2VuZXJhdGVkIGJ5IEFMU0YtZnVuZGVkIGxhYnMsIHdpdGggdGhlIGdvYWwgb2YgbWFraW5nIHRoaXMgZGF0YSBlYXNpbHkgYWNjZXNzaWJsZSB0byBpbnZlc3RpZ2F0b3JzIChsaWtlIHlvdSEpLgpUaGUgZXhwcmVzc2lvbiBkYXRhIGluIGBTY1BDQWAgd2VyZSBtYXBwaW5nIGFuZCBxdWFudGlmaWVkIHdpdGggW2BhbGV2aW4tZnJ5YF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTkyLTAyMi0wMTQwOC0zKSwgZm9sbG93ZWQgYnkgcHJvY2Vzc2luZyB3aXRoIEJpb2NvbmR1Y3RvciB0b29scyB1c2luZyB0aGUgc2FtZSBnZW5lcmFsIHByb2NlZHVyZXMgdGhhdCB3ZSBoYXZlIGNvdmVyZWQgaW4gdGhpcyB3b3Jrc2hvcC4KVGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUgdXNlZCBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgYW5kIGBtaVFDYCB0byBmaWx0ZXIgdGhlIHJhdyBjb3VudHMgbWF0cml4LCBgc2N1dHRsZWAgdG8gbG9nLW5vcm1hbGl6ZSB0aGUgY291bnRzLCBhbmQgYHNjYXRlcmAgZm9yIGRpbWVuc2lvbiByZWR1Y3Rpb24uClRoZSBwcm9jZXNzZWQgZGF0YSBhcmUgc3RvcmVkIGFzIGAucmRzYCBmaWxlcyBjb250YWluaW5nIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0cy4KWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaG93IGRhdGEgaW4gdGhlIGBTY1BDQWAgaXMgcHJvY2Vzc2VkIGluIFt0aGUgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uXShodHRwczovL3NjcGNhLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC8pLgoKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogSW50ZWdyYXRpb24gT3ZlcnZpZXddKGRpYWdyYW1zL3JvYWRtYXBfbXVsdGlfbWVyZ2UtaW50ZWdyYXRlLnBuZykKClRvIGxlYXJuIGFib3V0IGludGVncmF0aW9uLCB3ZSdsbCBoYXZlIGEgbG9vayBhdCBmb3VyIHNhbXBsZXMgZnJvbSB0aGUgW2BTQ1BDUDAwMDAwNWAgcHJvamVjdF0oaHR0cHM6Ly9zY3BjYS5hbGV4c2xlbW9uYWRlLm9yZy9wcm9qZWN0cy9TQ1BDUDAwMDAwNSkgKFtQYXRlbCBfZXQgYWwuXyAyMDIyXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMykpLCBhbiBpbnZlc3RpZ2F0aW9uIG9mIHBlZGlhdHJpYyBzb2xpZCB0dW1vcnMgbGVkIGJ5IHRoZSBbRHllcl0oaHR0cHM6Ly93d3cuc3RqdWRlLm9yZy9yZXNlYXJjaC9sYWJzL2R5ZXItbGFiLmh0bWwpIGFuZCBbQ2hlbl0oaHR0cHM6Ly93d3cuc3RqdWRlLm9yZy9yZXNlYXJjaC9sYWJzL2NoZW4tbGFiLXRhb3NoZW5nLmh0bWwpIGxhYnMgYXQgU3QuIEp1ZGUgQ2hpbGRyZW4ncyBSZXNlYXJjaCBIb3NwaXRhbC4KVGhlIHBhcnRpY3VsYXIgbGlicmFyaWVzIHdlJ2xsIGludGVncmF0ZSBjb21lIGZyb20gdHdvIHJoYWJkb215b3NhcmNvbWEgKFJNUykgcGF0aWVudHMsIHdpdGggdHdvIHNhbXBsZXMgZnJvbSBlYWNoIG9mIHR3byBwYXRpZW50cywgYWxsIHNlcXVlbmNlZCB3aXRoIDEweCBDaHJvbWl1bSB2MyB0ZWNobm9sb2d5LgpFYWNoIGxpYnJhcnkgaXMgZnJvbSBhIHNlcGFyYXRlIGJpb2xvZ2ljYWwgc2FtcGxlLgoKV2UnbGwgYmUgaW50ZWdyYXRpbmcgdGhlc2Ugc2FtcGxlcyB3aXRoIHR3byBkaWZmZXJlbnQgdG9vbHMsIFtgZmFzdE1OTmBdKGh0dHA6Ly93d3cuYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9iYXRjaGVsb3IuaHRtbCkgKFtIYWdodmVyZGkgX2V0IGFsLl8gMjAxOF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbmJ0LjQwOTEpKSBhbmQgW2BoYXJtb255YF0oaHR0cHM6Ly9wb3J0YWxzLmJyb2FkaW5zdGl0dXRlLm9yZy9oYXJtb255LykgKFtLb3JzdW5za3kgX2V0IGFsLl8gMjAxOV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTkyLTAxOS0wNjE5LTApKS4KSW50ZWdyYXRpb24gY29ycmVjdHMgZm9yIGJhdGNoIGVmZmVjdHMgdGhhdCBhcmlzZSBmcm9tIGRpZmZlcmVudCBsaWJyYXJ5IHByZXBhcmF0aW9ucywgZ2VuZXRpYyBiYWNrZ3JvdW5kcywgYW5kIG90aGVyIHNhbXBsZS1zcGVjaWZpYyBmYWN0b3JzLCBzbyB0aGF0IGRhdGFzZXRzIGNhbiBiZSBqb2ludGx5IGFuYWx5emVkIGF0IHRoZSBjZWxsIGxldmVsLgpgZmFzdE1OTmAgY29ycmVjdHMgZm9yIGJhdGNoIGVmZmVjdHMgdXNpbmcgYSBmYXN0ZXIgdmFyaWFudCBvZiB0aGUgbXV0dWFsLW5lYXJlc3QgbmVpZ2hib3JzIGFsZ29yaXRobSwgdGhlIHRlY2huaWNhbCBkZXRhaWxzIG9mIHdoaWNoIHlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBmcm9tIHRoaXMgW3ZpZ25ldHRlIGJ5IEx1biAoMjAxOSldKGh0dHBzOi8vbWFyaW9uaWxhYi5naXRodWIuaW8vRnVydGhlck1OTjIwMTgvdGhlb3J5L2Rlc2NyaXB0aW9uLmh0bWwpLgpgaGFybW9ueWAsIG9uIHRoZSBvdGhlciBoYW5kLCBjb3JyZWN0cyBmb3IgYmF0Y2ggZWZmZWN0cyB1c2luZyBhbiBpdGVyYXRpdmUgY2x1c3RlcmluZyBhcHByb2FjaCwgYW5kIHVubGlrZSBgZmFzdE1OTmAsIGl0IGlzIGFsc28gYWJsZSB0byBjb25zaWRlciBhZGRpdGlvbmFsIGNvdmFyaWF0ZXMgYmV5b25kIGp1c3QgdGhlIGJhdGNoIGdyb3VwaW5ncy4KClJlZ2FyZGxlc3Mgb2Ygd2hpY2ggaW50ZWdyYXRpb24gdG9vbCBpcyB1c2VkLCB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCAoU0NFKSBvYmplY3RzIGZpcnN0IG5lZWQgdG8gYmUgcmVmb3JtYXR0ZWQgYW5kIG1lcmdlZCBpbnRvIGEgc2luZ2xlICh1bmNvcnJlY3RlZCEpIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgY2VsbHMgZnJvbSBhbGwgc2FtcGxlcy4KVGhpcyBtZXJnZWQgU0NFIGNhbiB0aGVuIGJlIHVzZWQgZm9yIGludGVncmF0aW9uIHRvIG9idGFpbiBhIGZvcm1hbGx5IGJhdGNoLWNvcnJlY3RlZCBTQ0Ugb2JqZWN0LgoKCiMjIFNldCB1cAoKYGBge3Igc2V0dXB9CiMgTG9hZCBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKSAgIyBwbG90dGluZyB0b29scwpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KSAjIHdvcmsgd2l0aCBTQ0Ugb2JqZWN0cwoKIyBTZXQgdGhlIHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgxMjM0NSkKYGBgCgoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKCldlIGhhdmUgYWxyZWFkeSBwcmVwYXJlZCBjb3VudCBkYXRhIGZvciB0aGUgZm91ciBzYW1wbGVzIHdlJ2xsIGJlIGludGVncmF0aW5nIChpLmUuLCBmaWx0ZXJlZCBjZWxscywgbm9ybWFsaXplZCBjb3VudHMsIGFuZCBjYWxjdWxhdGVkIFBDQSAmIFVNQVApLgpUaGVzZSBTQ0Ugb2JqZWN0cywgc3RvcmVkIGFzIFJEUyBmaWxlcywgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYGRhdGEvcm1zL3Byb2Nlc3NlZC9gIGRpcmVjdG9yeSBhbmQgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGVpciBgU2NQQ0FgIGxpYnJhcnkgaWRzIDoKCi0gYFNDUENMMDAwNDc5LnJkc2AgKFBhdGllbnQgQSkKLSBgU0NQQ0wwMDA0ODAucmRzYCAoUGF0aWVudCBBKQotIGBTQ1BDTDAwMDQ4MS5yZHNgIChQYXRpZW50IEIpCi0gYFNDUENMMDAwNDgyLnJkc2AgKFBhdGllbnQgQikKClRvIGJlZ2luLCBsZXQncyBzZXQgdXAgb3VyIGRpcmVjdG9yaWVzIGFuZCBmaWxlczoKCmBgYHtyIGRpcmVjdG9yaWVzLCBsaXZlID0gVFJVRX0KIyBEZWZpbmUgZGlyZWN0b3J5IHdoZXJlIHByb2Nlc3NlZCBTQ0Ugb2JqZWN0cyB0byBiZSBpbnRlZ3JhdGVkIGFyZSBzdG9yZWQKaW5wdXRfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiLCAicHJvY2Vzc2VkIikKCiMgRGVmaW5lIGRpcmVjdG9yeSB0byBzYXZlIGludGVncmF0ZWQgU0NFIG9iamVjdCB0bwpvdXRwdXRfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiLCAiaW50ZWdyYXRlZCIpCgojIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKZnM6OmRpcl9jcmVhdGUob3V0cHV0X2RpcikKCiMgRGVmaW5lIG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBpbnRlZ3JhdGVkIG9iamVjdAppbnRlZ3JhdGVkX3NjZV9maWxlIDwtIGZpbGUucGF0aChvdXRwdXRfZGlyLCAicm1zX2ludGVncmF0ZWRfc3Vic2V0LnJkcyIpCmBgYAoKCldlIGNhbiB1c2UgdGhlIGBkaXIoKWAgZnVuY3Rpb24gdG8gbGlzdCBhbGwgY29udGVudHMgb2YgYSBnaXZlbiBkaXJlY3RvcnksIGZvciBleGFtcGxlIHRvIHNlZSBhbGwgdGhlIGZpbGVzIGluIG91ciBgaW5wdXRfZGlyYDoKCmBgYHtyIGlucHV0IGRpciwgbGl2ZSA9IFRSVUV9CmRpcihpbnB1dF9kaXIpCmBgYAoKV2Ugd2FudCB0byByZWFkIGluIGp1c3QgZm91ciBvZiB0aGVzZSBmaWxlcywgYXMgbGlzdGVkIHByZXZpb3VzbHkuClRvIHJlYWQgaW4gdGhlc2UgZmlsZXMsIHdlIGNvdWxkIHVzZSB0aGUgYHJlYWRyOjpyZWFkX3JkcygpYCBmdW5jdGlvbiAob3IgdGhlIGJhc2UgUiBgcmVhZFJEUygpYCkgZm91ciB0aW1lcywgb25jZSBmb3IgZWFjaCBvZiB0aGUgZmlsZXMuCldlIGNvdWxkIGFsc28gdXNlIGEgYGZvcmAgbG9vcCwgd2hpY2ggaXMgdGhlIGFwcHJvYWNoIHRoYXQgbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMgd291bGQgbGVhbiB0b3dhcmQuCkEgZGlmZmVyZW50IGFuZCBtb3JlIG1vZHVsYXIgY29kaW5nIGFwcHJvYWNoIHRvIHJlYWRpbmcgaW4gdGhlc2UgZmlsZXMgKGFuZCBtb3JlISkgaXMgdG8gbGV2ZXJhZ2UgdGhlIFtgcHVycnJgXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvKSBgdGlkeXZlcnNlYCBwYWNrYWdlLCB3aGljaCBwcm92aWRlcyBhIGNvbnZlbmllbnQgc2V0IG9mIGZ1bmN0aW9ucyBmb3Igb3BlcmF0aW5nIG9uIGxpc3RzLgpZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCB0aGUgYHB1cnJyYCBmdW5jdGlvbnMgYW5kIHRoZWlyIHBvd2VyIGFuZCB1dGlsaXR5IGluIFIgaW4gW3RoZSAiRnVuY3Rpb25hbHMiIGNoYXB0ZXIgb2YgdGhlIF9BZHZhbmNlZCBSXyBlLWJvb2tdKGh0dHBzOi8vYWR2LXIuaGFkbGV5Lm56L2Z1bmN0aW9uYWxzLmh0bWwpLgoKT2YgcGFydGljdWxhciBpbnRlcmVzdCBpcyB0aGUgW2BwdXJycjo6bWFwKClgXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL21hcC5odG1sKSBmYW1pbHkgb2YgZnVuY3Rpb25zLCB3aGljaCBjYW4gYmUgdXNlZCB0byBydW4gYSBnaXZlbiBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQgb2YgYSBsaXN0IChvciB2ZWN0b3IpIGluIG9uZSBjYWxsLgpUaGUgZ2VuZXJhbCBzeW50YXggZm9yIGBwdXJycjo6bWFwKClgIGFuZCBmcmllbmRzIGlzOgoKYGBgCiMgU3ludGF4IGZvciB1c2luZyB0aGUgbWFwIGZ1bmN0aW9uOgpwdXJycjo6bWFwKDxpbnB1dCBsaXN0IG9yIHZlY3Rvcj4sCiAgICAgICAgICAgPGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggaXRlbSBpbiB0aGUgaW5wdXQ+LAogICAgICAgICAgIDxhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uIGNhbiBnbyBoZXJlPiwKICAgICAgICAgICA8YW5kIGFsc28gaGVyZSBpZiB0aGVyZSBhcmUgZXZlbiBtb3JlIGFyZ3VtZW50cywgYW5kIHNvIG9uPikKYGBgCgoKVGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgYHB1cnJyOjptYXAoKWAgaXMgYWx3YXlzIGEgbGlzdCAoYnV0IG5vdGUgdGhhdCB0aGVyZSBhcmUgb3RoZXIgYHB1cnJyOjptYXAoKWAgcmVsYXRpdmVzIHdoaWNoIHJldHVybiBvdGhlciBvYmplY3QgdHlwZXMsIGFzIHlvdSBjYW4gcmVhZCBhYm91dCBpbiBbdGhlIGBwdXJycjo6bWFwKClgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcHVycnIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvaW5kZXguaHRtbCkpLgpJZiB0aGlzIGNvbmNlcHQgc291bmRzIGEgbGl0dGxlIGZhbWlsaWFyIHRvIHlvdSwgdGhhdCdzIGJlY2F1c2UgaXQgcHJvYmFibHkgaXMhCkJhc2UgUidzIGBsYXBwbHkoKWAgZnVuY3Rpb24gY2FuIHByb3ZpZGUgc2ltaWxhciB1dGlsaXR5LCBhbmQgdGhlIGBwdXJycjo6bWFwKClgIGZhbWlseSBvZiBmdW5jdGlvbnMgY2FuIChpbiBwYXJ0KSBiZSB0aG91Z2h0IG9mIGFzIGFuIGFsdGVybmF0aXZlIHRvIHNvbWUgb2YgdGhlIGJhc2UgUiBgYXBwbHlgIGZ1bmN0aW9ucywgd2l0aCBtb3JlIGNvbnNpc3RlbnQgYmVoYXZpb3IuCgpMZXQncyBzZWUgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIG9mIGBwdXJycjo6bWFwKClgIGluIGFjdGlvbiwgaW5zcGlyZWQgYnkgY2FuY2VyIGdyb3VwcyB0aGUgRGF0YSBMYWIgaGFzIGFuYWx5emVkIHRocm91Z2ggdGhlIFtPcGVuUEJUQV0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvKSBwcm9qZWN0OgoKYGBge3IgbWFwIGV4YW1wbGV9CiMgRGVmaW5lIGEgbGlzdCBvZiBjYW5jZXIgaGlzdG9sb2dpZXMKaGlzdG9sb2dpZXMgPC0gbGlzdCgKICAibG93LWdyYWRlIGdsaW9tYXMiICA9IGMoIlNFR0EiLCAiUEEiLCAiR05HIiwgIlBYQSIpLAogICJoaWdoLWdyYWRlIGdsaW9tYXMiID0gYygiRE1HIiwgIkRJUEciKSwKICAiZW1icnlvbmFsIHR1bW9ycyIgICA9IGMoIk1CIiwgIkFUUlQiLCAiRVRNUiIpCiApCgojIFRoZSBvdmVyYWxsIGxlbmd0aCBvZiB0aGUgbGlzdCBpcyAzCmxlbmd0aChoaXN0b2xvZ2llcykKCiMgSG93IGNhbiB3ZSBydW4gYGxlbmd0aCgpYCBvbiBlYWNoIGl0ZW0gb2YgdGhlIGxpc3Q/CiMgV2UgY2FuIHVzZSBvdXIgbmV3IGZyaWVuZCBwdXJycjo6bWFwKCk6CnB1cnJyOjptYXAoaGlzdG9sb2dpZXMsIGxlbmd0aCkKYGBgCgpPbmUgb3RoZXIgbmV3IGNvZGluZyBzdHJhdGVneSB3ZSdsbCBsZWFybiBpbiB0aGlzIG5vdGVib29rIGlzIHVzaW5nIHRoZSBbYGdsdWVgXShodHRwczovL2dsdWUudGlkeXZlcnNlLm9yZy8pIHBhY2thZ2UgdG8gY29tYmluZSBzdHJpbmdzLgpUaGlzIHBhY2thZ2Ugb2ZmZXJzIGEgY29udmVuaWVudCBmdW5jdGlvbiBgZ2x1ZTo6Z2x1ZSgpYCB0aGF0IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGJhc2UgUiBgcGFzdGUoKWAgZnVuY3Rpb24uCgpgYGB7ciBwYXN0ZX0KIyBEZWZpbmUgYSB2YXJpYWJsZSBmb3IgZXhhbXBsZToKb3JnX25hbWUgPC0gIkRhdGEgTGFiIgoKIyBXZSBjYW4gdXNlIHBhc3RlIHRvIGNvbWJpbmUgc3RyaW5ncyBhbmQgdmFyaWFibGVzOgpwYXN0ZSgiV2VsY29tZSB0byB0aGUiLCBvcmdfbmFtZSwgIndvcmtzaG9wIG9uIEFkdmFuY2VkIHNjUk5BLXNlcSEiKQpgYGAKCldlIGNhbiB1c2UgYGdsdWU6OmdsdWUoKWAgdG8gYWNjb21wbGlzaCB0aGUgc2FtZSBnb2FsIHdpdGggc29tZSBkaWZmZXJlbnQgc3ludGF4OgoKYGBge3IgZ2x1ZX0KIyBnbHVlOjpnbHVlIHRha2VzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCAob25seSBvbmUgc2V0IG9mIHF1b3RlcyEpLCBhbmQKIyAgdmFyaWFibGVzIGNhbiBlYXNpbHkgYmUgaW5jbHVkZWQgaW5zaWRlIHtjdXJseSBicmFjZXN9CmdsdWU6OmdsdWUoIldlbGNvbWUgdG8gdGhlIHtvcmdfbmFtZX0gd29ya3Nob3Agb24gQWR2YW5jZWQgc2NSTkEtc2VxISIpCmBgYAoKKE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgYGdsdWU6OmdsdWUoKWAgb3V0cHV0IGlzbid0IGluIHF1b3RlcywgaXQgc3RpbGwgYmVoYXZlcyBsaWtlIGEgc3RyaW5nISkKCgpBbHJpZ2h0LCB0aW1lIGZvciB0aGUgZ29vZCBzdHVmZiEKTGV0J3MgdXNlIGBwdXJycjo6bWFwKClgIHRvIHJlYWQgaW4gb3VyIFNDRSBvYmplY3RzIHNvIHRoYXQgdGhleSBhcmUgaW1tZWRpYXRlbHkgc3RvcmVkIHRvZ2V0aGVyIGluIGEgbGlzdC4KCgpXZSdsbCBmaXJzdCBuZWVkIHRvIGRlZmluZSBhIHZlY3RvciBvZiB0aGUgZmlsZSBwYXRocyB0byByZWFkIGluLgpXZSdsbCBzdGFydCBieSBjcmVhdGluZyBhIHZlY3RvciBvZiBzYW1wbGUgbmFtZXMgdGhlbXNlbHZlcyBhbmQgdGhlbiBmb3JtYXR0aW5nIHRoZW0gaW50byB0aGUgY29ycmVjdCBwYXRocy4KVGhpcyB3YXkgKGZvcmVzaGFkb3dpbmchKSB3ZSBhbHNvIGhhdmUgYSBzdGFuZC1hbG9uZSB2ZWN0b3Igb2YganVzdCBzYW1wbGUgbmFtZXMsIHdoaWNoIHdpbGwgY29tZSBpbiBoYW5keSEKCmBgYHtyIHNhbXBsZSBuYW1lc30KIyBWZWN0b3Igb2YgYWxsIHRoZSBzYW1wbGVzIHRvIHJlYWQgaW46CnNhbXBsZV9uYW1lcyA8LSBjKCJTQ1BDTDAwMDQ3OSIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MCIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MSIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MiIpCmBgYAoKCmBgYHtyIGRlZmluZSBzY2VfcGF0aHMsIGxpdmUgPSBUUlVFfQojIE5vdywgY29udmVydCB0aGVzZSB0byBmaWxlIHBhdGhzOiA8aW5wdXRfZGlyPi88c2FtcGxlX25hbWU+LnJkcwpzY2VfcGF0aHMgPC0gZmlsZS5wYXRoKGlucHV0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICBnbHVlOjpnbHVlKCJ7c2FtcGxlX25hbWVzfS5yZHMiKQopCiMgUHJpbnQgdGhlIHNjZV9wYXRocyB2ZWN0b3IKc2NlX3BhdGhzCmBgYAoKTGV0J3MgbWFrZSB0aGlzIGEgbmFtZWQgdmVjdG9yIHVzaW5nIHRoZSBzYW1wbGUgbmFtZXMuClRoaXMgd2lsbCBoZWxwIHVzIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb2JqZWN0cyBhcmUgd2hpY2ggYWZ0ZXIgd2UgcmVhZCB0aGUgU0NFIG9iamVjdHMgaW46CgpgYGB7ciBhZGQgbGlzdCBuYW1lcywgbGl2ZSA9IFRSVUV9CiMgQXNzaWduIHRoZSBzYW1wbGUgbmFtZXMgYXMgdGhlIG5hbWVzIGZvciBzY2VfcGF0aHMKbmFtZXMoc2NlX3BhdGhzKSA8LSBzYW1wbGVfbmFtZXMKYGBgCgpXZSBjYW4gbm93IHJlYWQgdGhlc2UgZmlsZXMgaW4gYW5kIGNyZWF0ZSBhIGxpc3Qgb2YgZm91ciBTQ0Ugb2JqZWN0cy4gClNpbmNlIGByZWFkcjo6cmVhZF9yZHMoKWAgY2FuIG9ubHkgb3BlcmF0ZSBvbiBvbmUgaW5wdXQgYXQgYSB0aW1lLCB3ZSdsbCBuZWVkIHRvIHVzZSBgcHVycnI6Om1hcCgpYCB0byBydW4gaXQgb24gYWxsIGlucHV0IGZpbGUgcGF0aHMgaW4gb25lIGNvbW1hbmQuCkFsdGhvdWdoIGBzY2VfcGF0aHNgIGlzIGEgdmVjdG9yIChub3QgYSBsaXN0KSwgaXQgd2lsbCBzdGlsbCB3b3JrIGFzIGlucHV0IHRvIGBwdXJycjptYXAoKWAuClRoZSBvdXRwdXQgZnJvbSB0aGlzIGNvZGUgd2lsbCBzdGlsbCBiZSBhIGxpc3QsIHNpbmNlIHRoYXQncyB3aGF0IGBwdXJycjo6bWFwKClgIGFsd2F5cyByZXR1cm5zLCBhbmQgaXQgd2lsbCByZXRhaW4gdGhlIHNhbXBsZSBuYW1lcyBhcyB0aGUgbGlzdCBuYW1lcyBmb3IgY29udmVuaWVudCBib29ra2VlcGluZzoKCmBgYHtyIHJlYWQgc2NlIHBhdGhzLCBsaXZlID0gVFJVRX0KIyBVc2UgcHVycnI6Om1hcCgpIHRvIHJlYWQgYWxsIGZpbGVzIGludG8gYSBsaXN0IGF0IG9uY2UKc2NlX2xpc3QgPC0gcHVycnI6Om1hcCgKICBzY2VfcGF0aHMsCiAgcmVhZHI6OnJlYWRfcmRzCikKYGBgCgpMZXQncyBoYXZlIGEgbG9vayBhdCBvdXIgbmFtZWQgbGlzdCBvZiBTQ0Ugb2JqZWN0czoKCmBgYHtyIHByaW50IHNjZSBsaXN0LCBsaXZlPVRSVUV9CiMgUHJpbnQgc2NlX2xpc3QKc2NlX2xpc3QKYGBgCgpJZiB5b3UgbG9vayBjbG9zZWx5IGF0IHRoZSBwcmludGVkIFNDRSBvYmplY3RzLCB5b3UgbWF5IG5vdGljZSB0aGF0IHRoZXkgYWxsIGNvbnRhaW4gYGNvbERhdGFgIHRhYmxlIGNvbHVtbnMgYGNlbGx0eXBlX2ZpbmVgIGFuZCBgY2VsbHR5cGVfYnJvYWRgLgpUaGVzZSBjb2x1bW5zICh3aGljaCB3ZSBhZGRlZCB0byBTQ0Ugb2JqZWN0cyBkdXJpbmcgW3ByZS1wcm9jZXNzaW5nXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS90cmFpbmluZy1tb2R1bGVzL3RyZWUvbWFzdGVyL3NjUk5BLXNlcS1hZHZhbmNlZC9zZXR1cC9ybXMpKSBjb250YWluIHB1dGF0aXZlIGNlbGwgdHlwZSBhbm5vdGF0aW9ucyBhcyBhc3NpZ25lZCBieSBbUGF0ZWwgX2V0IGFsLl8gKDIwMjIpXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMyk6CgoKPiBGb3IgZWFjaCBjZWxsIHN1YnNldCBpZGVudGlmaWVkIGJ5IGNsdXN0ZXJpbmcsIHdlIHVzZWQgYSBjb21iaW5hdGlvbiBvZiBgU2luZ2xlUmAgdmVyc2lvbiAxLjAuMSAoW0FyYW4gZXQgYWwuLCAyMDE5XShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3M0MTU5MC0wMTgtMDI3Ni15KSkgYW5kIG1hbnVhbCBpbnNwZWN0aW9uIG9mIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyB0byBhbm5vdGF0ZSB3aGV0aGVyIGEgY2x1c3RlciBiZWxvbmdzIHRvIHN0cm9tYWwsIGltbXVuZSBvciBtYWxpZ25hbnQgc3VicG9wdWxhdGlvbnMuIApNYWxpZ25hbnQgY2VsbHMgd2VyZSBjb25maXJtZWQgaW4gcGF0aWVudCB0dW1vciBkYXRhIGJ5IGluZmVyZW5jZSBvZiBjb3B5LW51bWJlciB2YXJpYXRpb24gdXNpbmcgYGluZmVyQ05WYCB2ZXJzaW9uIDEuMS4zIG9mIHRoZSBUcmluaXR5Q1RBVCBQcm9qZWN0IChodHRwczovL2dpdGh1Yi5jb20vYnJvYWRpbnN0aXR1dGUvaW5mZXJjbnYpLiAKCldlIHdpbGwgZW5kIHVwIGxldmVyYWdpbmcgdGhlc2UgY2VsbCB0eXBlIGFubm90YXRpb25zIHRvIGV4cGxvcmUgdGhlIGludGVncmF0aW9uIHJlc3VsdHM7IGFmdGVyIGludGVncmF0aW9uLCB3ZSBleHBlY3QgY2VsbCB0eXBlcyBmcm9tIGRpZmZlcmVudCBzYW1wbGVzIHRvIGdyb3VwIHRvZ2V0aGVyLCByYXRoZXIgdGhhbiBiZWluZyBzZXBhcmF0ZWQgYnkgYmF0Y2hlcy4gCgpUaGF0IHNhaWQsIHRoZSBpbnRlZ3JhdGlvbiBtZXRob2RzIHdlIHdpbGwgYmUgYXBwbHlpbmcgX2RvIG5vdCBhY3R1YWxseSB1c2VfIGFueSBleGlzdGluZyBjZWxsIHR5cGUgYW5ub3RhdGlvbnMuCklmIHdlIGhhdmUgYW5ub3RhdGlvbnMsIHRoZXkgYXJlIGEgaGVscGZ1bCAiYm9udXMiIGZvciBhc3Nlc3NpbmcgdGhlIGludGVncmF0aW9uJ3MgcGVyZm9ybWFuY2UsIGJ1dCB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgaW50ZWdyYXRpb24gaXRzZWxmLgoKCiMjIFByZXBhcmUgdGhlIFNDRSBsaXN0IGZvciBpbnRlZ3JhdGlvbgoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBNZXJnZV0oZGlhZ3JhbXMvcm9hZG1hcF9tdWx0aV9tZXJnZS5wbmcpCgoKTm93IHRoYXQgd2UgaGF2ZSBhIGxpc3Qgb2YgcHJvY2Vzc2VkIFNDRSBvYmplY3RzLCB3ZSBuZWVkIHRvIG1lcmdlIHRoZSBvYmplY3RzIGludG8gb25lIG92ZXJhbGwgU0NFIG9iamVjdCBmb3IgaW5wdXQgdG8gaW50ZWdyYXRpb24uCkEgd29yZCBvZiBjYXV0aW9uIGJlZm9yZSB3ZSBiZWdpbjogKipUaGlzIG1lcmdlZCBTQ0Ugb2JqZWN0IGlzIE5PVCBhbiBpbnRlZ3JhdGVkIFNDRSEqKgpNZXJnaW5nIFNDRXMgZG9lcyBub3QgcGVyZm9ybSBhbnkgYmF0Y2ggY29ycmVjdGlvbiwgYnV0IGp1c3QgcmVvcmdhbml6ZXMgdGhlIGRhdGEgdG8gYWxsb3cgdXMgdG8gcHJvY2VlZCB0byBpbnRlZ3JhdGlvbiBuZXh0LgoKVG8gbWVyZ2UgU0NFIG9iamVjdHMsIHdlIGRvIG5lZWQgdG8gZG8gc29tZSB3cmFuZ2xpbmcgYW5kIGJvb2trZWVwaW5nIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFuZCB0aGF0IHdlIGRvbid0IGxvc2UgaW1wb3J0YW50IGluZm9ybWF0aW9uLgpPdmVyYWxsIHdlJ2xsIHdhbnQgdG8gdGFrZSBjYXJlIG9mIHRoZXNlIGl0ZW1zOgoKMS4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gdHJhY2Ugc2FtcGxlLXNwZWNpZmljIGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlIG9yaWdpbmF0aW5nIHNhbXBsZSwgaW5jbHVkaW5nLi4uCiAgICAtIENlbGwtbGV2ZWwgaW5mb3JtYXRpb246IFdoaWNoIHNhbXBsZSBpcyBlYWNoIGNlbGwgZnJvbT8KICAgIC0gTGlicmFyeS1zcGVjaWZpYyBmZWF0dXJlIHN0YXRpc3RpY3MsIGUuZy4sIGdlbmUtbGV2ZWwgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBsaWJyYXJ5IGZvdW5kIGluIGByb3dEYXRhYC4KICAgIFdoaWNoIHNhbXBsZSBpcyBhIGdpdmVuIGZlYXR1cmUgc3RhdGlzdGljIGZyb20/CjIuIFNDRSBvYmplY3RzIHNob3VsZCBjb250YWluIHRoZSBzYW1lIGdlbmVzOiBFYWNoIFNDRSBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgcm93IG5hbWVzLgozLiBTQ0UgY2VsbCBtZXRhZGF0YSBjb2x1bW5zIHNob3VsZCBtYXRjaDogVGhlIGBjb2xEYXRhYCBmb3IgZWFjaCBTQ0Ugb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGNvbHVtbiBuYW1lcy4KCgpXZSdsbCBiZWdpbiBieSB0YWtpbmcgc29tZSB0aW1lIHRvIHRob3JvdWdobHkgZXhwbG9yZSBvdXIgU0NFIG9iamVjdHMgYW5kIGZpZ3VyZSBvdXQgd2hhdCB3cmFuZ2xpbmcgc3RlcHMgd2UgbmVlZCB0byB0YWtlIGZvciB0aGVzZSBzcGVjaWZpYyBkYXRhLgpEb24ndCBza2lwIHRoaXMgZXhwbG9yYXRpb24hCkJlYXIgaW4gbWluZCB0aGF0IHRoZSBleGFjdCB3cmFuZ2xpbmcgc2hvd24gaGVyZSB3aWxsIG5vdCBiZSB0aGUgc2FtZSBmb3Igb3RoZXIgU0NFIG9iamVjdHMgeW91IHdvcmsgd2l0aCwgYnV0IHRoZSBzYW1lIGdlbmVyYWwgcHJpbmNpcGxlcyBhcHBseS4KCgojIyMjIFByZXNlcnZpbmcgc2FtcGxlIGluZm9ybWF0aW9uIGF0IHRoZSBjZWxsIGxldmVsCgpIb3cgd2lsbCB3ZSBiZSBhYmxlIHRvIHRlbGwgd2hpY2ggc2FtcGxlIGEgZ2l2ZW4gY2VsbCBjYW1lIGZyb20/CgpUaGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcyBzaW1wbHkgdG8gYWRkIGEgYGNvbERhdGFgIGNvbHVtbiB3aXRoIHRoZSBzYW1wbGUgaW5mb3JtYXRpb24sIHNvIHRoYXQgd2UgY2FuIGtub3cgd2hpY2ggc2FtcGxlIGVhY2ggcm93IGNhbWUgZnJvbS4KCkluIGFkZGl0aW9uLCB3ZSB3YW50IHRvIHBheSBzb21lIGF0dGVudGlvbiB0byB0aGUgU0NFIG9iamVjdCdzIGNvbHVtbiBuYW1lcyAodGhlIGNlbGwgaWRzKSwgd2hpY2ggbXVzdCByZW1haW4gdW5pcXVlIGFmdGVyIG1lcmdpbmcgc2luY2UgZHVwbGljYXRlIGlkcyB3aWxsIGNhdXNlIGFuIFIgZXJyb3IuCkluIHRoaXMgY2FzZSwgdGhlIFNDRSBjb2x1bW4gbmFtZXMgYXJlIGJhcmNvZGVzICh3aGljaCBpcyB1c3VhbGx5IGJ1dCBub3QgYWx3YXlzIHRoZSBjYXNlIGluIFNDRSBvYmplY3RzKSwgd2hpY2ggYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgX3dpdGhpbl8gYSBzYW1wbGUgYnV0IG1heSBiZSByZXBlYXRlZCBhY3Jvc3Mgc2FtcGxlcy4KU28sIGFmdGVyIG1lcmdpbmcsIGl0J3MgdGVjaG5pY2FsbHkgcG9zc2libGUgdGhhdCBtdWx0aXBsZSBjZWxscyB3aWxsIGhhdmUgdGhlIHNhbWUgYmFyY29kZS4KVGhpcyB3b3VsZCBiZSBhIHByb2JsZW0gZm9yIHR3byByZWFzb25zOgpGaXJzdCwgdGhlIGNlbGwgaWQgd291bGQgbm90IGJlIGFibGUgdG8gcG9pbnQgdXMgYmFjayB0byBjZWxsJ3Mgb3JpZ2luYXRpbmcgc2FtcGxlLgpTZWNvbmQsIGl0IHdvdWxkIGxpdGVyYWxseSBjYXVzZSBhbiBlcnJvciBpbiBSLCB3aGljaCBkb2VzIG5vdCBhbGxvdyBkdXBsaWNhdGUgY29sdW1uIG5hbWVzLgoKCk9uZSB3YXkgdG8gZW5zdXJlIHRoYXQgY2VsbCBpZHMgcmVtYWluIHVuaXF1ZSBldmVuIGFmdGVyIG1lcmdpbmcgaXMgdG8gYWN0dWFsbHkgbW9kaWZ5IHRoZW0gYnkgX3ByZXBlbmRpbmdfIHRoZSByZWxldmFudCBzYW1wbGUgbmFtZS4KRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZXNlIGJhcmNvZGVzIGZvciB0aGUgYFNDUENMMDAwNDc5YCBzYW1wbGU6CgpgYGB7ciBiYXJjb2Rlc30KIyBMb29rIGF0IHRoZSBjb2x1bW4gbmFtZXMgZm9yIHRoZSBgU0NQQ0wwMDA0NzlgIHNhbXBsZSwgZm9yIGV4YW1wbGUKY29sbmFtZXMoc2NlX2xpc3QkU0NQQ0wwMDA0NzkpIHw+CiAgIyBPbmx5IHByaW50IG91dCB0aGUgZmlyc3QgNiBmb3IgY29udmVuaWVuY2UKICBoZWFkKCkKYGBgCgpUaGVzZSBpZHMgd2lsbCBiZSB1cGRhdGVkIHRvIGBTQ1BDTDAwMDQ3OS1HR0dBQ0NUQ0FBR0NHR0FUYCwgYFNDUENMMDAwNDc5LUNBQ0FHQVRBR1RHQUdUR0NgLCBhbmQgc28gb24sIHRoZXJlYnkgZW5zdXJpbmcgZnVsbHkgdW5pcXVlIGlkcyBmb3IgYWxsIGNlbGxzIGFjcm9zcyBhbGwgc2FtcGxlcy4KCiMjIyMgUHJlc2VydmluZyBzYW1wbGUgaW5mb3JtYXRpb24gYXQgdGhlIGdlbmUgbGV2ZWwKClRoZSBgcm93RGF0YWAgdGFibGUgaW4gU0NFIG9iamVjdHMgd2lsbCBvZnRlbiBjb250YWluIGJvdGggImdlbmVyYWwiIGFuZCAibGlicmFyeS1zcGVjaWZpYyIgaW5mb3JtYXRpb24sIGZvciBleGFtcGxlOgoKYGBge3Igcm93ZGF0YX0Kcm93RGF0YShzY2VfbGlzdCRTQ1BDTDAwMDQ3OSkgfD4KICBoZWFkKCkKYGBgCgpIZXJlLCB0aGUgcm93bmFtZXMgYXJlIEVuc2VtYmwgZ2VuZSBpZHMsIGFuZCBjb2x1bW5zIGFyZSBgZ2VuZV9zeW1ib2xgLCBgbWVhbmAsIGFuZCBgZGV0ZWN0ZWRgLgpUaGUgYGdlbmVfc3ltYm9sYCBjb2x1bW4gaXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZ2VuZXMsIG5vdCBzcGVjaWZpYyB0byBhbnkgbGlicmFyeSBvciBleHBlcmltZW50LCBidXQgYG1lYW5gIGFuZCBgZGV0ZWN0ZWRgIGFyZSBsaWJyYXJ5LXNwZWNpZmljIGdlbmUgc3RhdGlzdGljcy4KU28sIGBnZW5lX3N5bWJvbGAgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFjZWQgYmFjayB0byBpdHMgb3JpZ2luYXRpbmcgc2FtcGxlLCBidXQgYG1lYW5gIGFuZCBgZGV0ZWN0ZWRgIGRvLgpUbyB0aGlzIGVuZCwgd2UgY2FuIHRha2UgYSBzaW1pbGFyIGFwcHJvYWNoIHRvIHdoYXQgd2UnbGwgZG8gZm9yIGNlbGwgaWRzOgpXZSBjYW4gY2hhbmdlIHRoZSBzYW1wbGUtc3BlY2lmaWMgYHJvd0RhdGFgIGNvbHVtbiBuYW1lcyBieSBwcmVwZW5kaW5nIHRoZSBzYW1wbGUgbmFtZS4KRm9yIGV4YW1wbGUsIHJhdGhlciB0aGFuIGJlaW5nIGNhbGxlZCBgbWVhbmAsIHRoaXMgY29sdW1uIHdpbGwgYmUgbmFtZWQgYFNDUENMMDAwNDc5LW1lYW5gIGZvciB0aGUgYFNDUENMMDAwNDc5YCBzYW1wbGUuCgpBbGwgb3VyIFNDRSBvYmplY3RzIGhhdmUgdGhlIHNhbWUgYHJvd0RhdGFgIGNvbHVtbnMgKGFzIHdlIGNhbiBzZWUgaW4gdGhlIG5leHQgY2h1bmspLCBzbyB3ZSdsbCBwZXJmb3JtIHRoaXMgcmVuYW1pbmcgYWNyb3NzIGFsbCBTQ0VzLgoKYGBge3IgY29tcGFyZSByb3dkYXRhLCBsaXZlID0gVFJVRX0KIyBVc2UgYHB1cnJyOjptYXAoKWAgdG8gcXVpY2tseSBleHRyYWN0IHJvd0RhdGEgY29sdW1uIG5hbWVzIGZvciBhbGwgU0NFcwpwdXJycjo6bWFwKHNjZV9saXN0LAogICAgICAgICAgIFwoc2NlKSBjb2xuYW1lcyhyb3dEYXRhKHNjZSkpKQpgYGAKCgojIyMjIEVuc3VyaW5nIHRoYXQgb25seSBzaGFyZWQgZ2VuZXMgYXJlIHVzZWQKClRoZSBuZXh0IHN0ZXAgaW4gZW5zdXJpbmcgU0NFIGNvbXBhdGliaWxpdHkgaXMgdG8gbWFrZSBzdXJlIHRoZXkgYWxsIGNvbnRhaW4gdGhlIHNhbWUgZ2VuZXMsIHdoaWNoIGFyZSBzdG9yZWQgYXMgdGhlIFNDRSBvYmplY3QncyByb3cgbmFtZXMgKHRoZXNlIG5hbWVzIGFyZSBhbHNvIGZvdW5kIHRoZSBgcm93RGF0YWAgc2xvdCdzIHJvdyBuYW1lcykuCkhlcmUsIHRob3NlIGdlbmUgaWRzIGFyZSB1bmlxdWUgRW5zZW1ibCBnZW5lIGlkcy4KCldlIGNhbiB1c2Ugc29tZSBgcHVycnJgIG1hZ2ljIHRvIHF1aWNrbHkgZmluZCB0aGUgc2V0IG9mIHNoYXJlZCBnZW5lcyBhbW9uZyBvdXIgc2FtcGxlcywgYW5kIHRoZW4gYXNrIGhvdyBtYW55IHRoZXJlIGFyZS4KCmBgYHtyIHNoYXJlZCBnZW5lc30KIyBEZWZpbmUgdmVjdG9yIG9mIHNoYXJlZCBnZW5lcwpzaGFyZWRfZ2VuZXMgPC0gc2NlX2xpc3QgfD4KICAjIGdldCByb3duYW1lcyAoZ2VuZXMpIGZvciBlYWNoIFNDRSBpbiBzY2VfbGlzdAogIHB1cnJyOjptYXAocm93bmFtZXMpIHw+CiAgIyByZWR1Y2UgdG8gdGhlIF9pbnRlcnNlY3Rpb25fIGFtb25nIGxpc3RzCiAgcHVycnI6OnJlZHVjZShpbnRlcnNlY3QpCmBgYAoKYGBge3IgcHJpbnQgc2hhcmVkIGdlbmVzLCBsaXZlID0gVFJVRX0KIyBIb3cgbWFueSBzaGFyZWQgZ2VuZXMgYXJlIHRoZXJlPwpsZW5ndGgoc2hhcmVkX2dlbmVzKQpgYGAKCkluIHRoaXMgY2FzZSwgd2UgaGFwcGVuIHRvIGtub3cgdGhhdCBhbGwgU0NFIG9iamVjdHMgd2UncmUgd29ya2luZyB3aXRoIGFscmVhZHkgY29udGFpbmVkIHRoZSBzYW1lIGdlbmVzLgpXZSBkbyBhIHF1aWNrLWFuZC1kaXJ0eSBjaGVjayBmb3IgdGhpcyBieSBsb29raW5nIGF0IHRoZSBudW1iZXIgb2Ygcm93cyBhY3Jvc3MgU0NFIG9iamVjdHMsIGFuZCB3ZSdsbCBzZWUgdGhhdCB0aGV5IGFyZSBhbGwgdGhlIHNhbWU6CgpgYGB7ciBjaGVjayBzaGFyZWQgZ2VuZXMsIGxpdmUgPSBUUlVFfQojIFRoZSBudW1iZXIgb2YgZ2VuZXMgaW4gYW4gU0NFIGNvcnJlc3BvbmRzIHRvIGl0cyBudW1iZXIgb2Ygcm93czoKc2NlX2xpc3QgfD4KICBwdXJycjo6bWFwKG5yb3cpCmBgYAoKU28sIGZvciBvdXIgZGF0YSwgd2Ugd2lsbCBub3QgaGF2ZSB0byBzdWJzZXQgdG8gc2hhcmVkIGdlbmVzIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgc2hhcmVkIQoKIyMjIyBFbnN1cmluZyBtYXRjaGluZyBjb2x1bW5zIGluIGBjb2xEYXRhYAoKRmluYWxseSwgd2UnbGwgbmVlZCB0byBoYXZlIHRoZSBzYW1lIGNvbHVtbiBuYW1lcyBhY3Jvc3MgYWxsIFNDRSBgY29sRGF0YWAgdGFibGVzLCBzbyBsZXQncyBsb29rIGF0IGFsbCB0aG9zZSBjb2x1bW4gbmFtZXMuCldlIGNhbiB1c2Ugc2ltaWxhciBzeW50YXggaGVyZSB0byB3aGF0IHdlIHVzZWQgdG8gbG9vayBhdCBhbGwgdGhlIGByb3dEYXRhYCBjb2x1bW4gbmFtZXMuCgpgYGB7ciBjb21wYXJlIGNvbGRhdGF9CnB1cnJyOjptYXAoc2NlX2xpc3QsCiAgICAgICAgICAgXChzY2UpIGNvbG5hbWVzKGNvbERhdGEoc2NlKSkgKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIGNvbHVtbiBuYW1lcyBhcmUgYWxsIGFscmVhZHkgbWF0Y2hpbmcgYW1vbmcgU0NFcywgc28gdGhlcmUncyBubyBzcGVjaWZpYyBwcmVwYXJhdGlvbiB3ZSdsbCBuZWVkIHRvIGRvIHRoZXJlLgoKIyMjIFBlcmZvcm0gU0NFIG1lcmdpbmcKCkFzIHlvdSBjYW4gc2VlLCB0aGVyZSdzIGEgbG90IG9mIG1vdmluZyBwYXJ0cyB0byBjb25zaWRlciEKQWdhaW4sIHRoZXNlIG1vdmluZyBwYXJ0cyBtYXkgKHdpbGwhKSBkaWZmZXIgZm9yIFNDRXMgdGhhdCB5b3UgYXJlIHdvcmtpbmcgd2l0aCwgc28geW91IGhhdmUgdG8gZXhwbG9yZSB5b3VyIG93biBTQ0VzIGluIGRlcHRoIHRvIHByZXBhcmUgZm9yIG1lcmdpbmcuCgpCYXNlZCBvbiBvdXIgZXhwbG9yYXRpb24sIGhlcmUgaXMgYSBzY2hlbWF0aWMgb2YgaG93IG9uZSBvZiB0aGUgU0NFIG9iamVjdHMgd2lsbCB1bHRpbWF0ZWx5IGJlIG1vZGlmaWVkIGludG8gdGhlIGZpbmFsIG1lcmdlZCBTQ0U6CgohW10oZGlhZ3JhbXMvdGVjaG5pY2FsX21lcmdlX3NjZS5wbmcpCgoKV2UnbGwgd3JpdGUgYSBfY3VzdG9tIGZ1bmN0aW9uXyAoc2VlbiBpbiB0aGUgY2h1bmsgYmVsb3cpIHRhaWxvcmVkIHRvIG91ciB3cmFuZ2xpbmcgc3RlcHMgdGhhdCBwcmVwYXJlcyBhIHNpbmdsZSBTQ0Ugb2JqZWN0IGZvciBtZXJnaW5nLgpXZSdsbCB0aGVuIHVzZSBvdXIgbmV3IGBwdXJycjo6bWFwKClgIHByb2dyYW1taW5nIHNraWxscyB0byBydW4gdGhpcyBmdW5jdGlvbiBvdmVyIHRoZSBgc2NlX2xpc3RgLgpUaGlzIHdpbGwgZ2l2ZSB1cyBhIG5ldyBsaXN0IG9mIGZvcm1hdHRlZCBTQ0VzIHRoYXQgd2UgY2FuIHByb2NlZWQgdG8gbWVyZ2UuCkl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgdGhlIGBmb3JtYXRfc2NlKClgIGZ1bmN0aW9uIHdyaXR0ZW4gYmVsb3cgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGdlbmVyYWwgdXNlIOKAkyBpdCdzIGJlZW4gcHJlY2lzZWx5IHdyaXR0ZW4gdG8gbWF0Y2ggdGhlIHByb2Nlc3Npbmcgd2UgbmVlZCB0byBkbyBmb3IgX3RoZXNlXyBTQ0VzLCBhbmQgZGlmZmVyZW50IFNDRXMgeW91IHdvcmsgd2l0aCB3aWxsIHJlcXVpcmUgZGlmZmVyZW50IHR5cGVzIG9mIHByb2Nlc3NpbmcuCgpgYGB7ciBmb3JtYXRfc2NlIGZ1bmN0aW9ufQpmb3JtYXRfc2NlIDwtIGZ1bmN0aW9uKHNjZSwgc2FtcGxlX25hbWUpIHsKICAjIElucHV0IGFyZ3VtZW50czoKICAjIyBzY2U6IEFuIFNDRSBvYmplY3QgdG8gZm9ybWF0CiAgIyMgc2FtcGxlX25hbWU6IFRoZSBTQ0Ugb2JqZWN0J3MgbmFtZQogICMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgZm9ybWF0dGVkIFNDRSBvYmplY3QuCgogICMjIyMjIyBFbnN1cmUgdGhhdCB3ZSBjYW4gaWRlbnRpZnkgdGhlIG9yaWdpbmF0aW5nIHNhbXBsZSBpbmZvcm1hdGlvbiAjIyMjIyMKICAjIEFkZCBhIGNvbHVtbiBjYWxsZWQgYHNhbXBsZWAgdGhhdCBzdG9yZXMgdGhpcyBpbmZvcm1hdGlvbgogICMgVGhpcyB3aWxsIGJlIHN0b3JlZCBpbiBgY29sRGF0YWAKICBzY2Ukc2FtcGxlIDwtIHNhbXBsZV9uYW1lCgoKICAjIyMjIyMgRW5zdXJlIGNlbGwgaWRzIHdpbGwgYmUgdW5pcXVlICMjIyMjIwogICMgVXBkYXRlIHRoZSBTQ0Ugb2JqZWN0IGNvbHVtbiBuYW1lcyAoY2VsbCBpZHMpIGJ5IHByZXBlbmRpbmcgYHNhbXBsZV9uYW1lYAogIGNvbG5hbWVzKHNjZSkgPC0gZ2x1ZTo6Z2x1ZSgie3NhbXBsZV9uYW1lfS17Y29sbmFtZXMoc2NlKX0iKQoKCiAgIyMjIyMjIEVuc3VyZSBnZW5lLWxldmVsIHN0YXRpc3RpY3MgY2FuIGJlIGlkZW50aWZpZWQgaW4gYHJvd0RhdGFgICMjIyMjIwogICMgV2Ugd2FudCB0byByZW5hbWUgdGhlIGNvbHVtbnMgYG1lYW5gIGFuZCBgZGV0ZWN0ZWRgIHRvIGNvbnRhaW4gdGhlIGBzYW1wbGVfbmFtZWAKICAjIFJlY2FsbCB0aGUgbmFtZXMgYXJlOiAiZ2VuZV9zeW1ib2wiLCAibWVhbiIsICJkZXRlY3RlZCIKICBjb2xuYW1lcyhyb3dEYXRhKHNjZSkpIDwtIGMoImdlbmVfc3ltYm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZTo6Z2x1ZSgie3NhbXBsZV9uYW1lfS1tZWFuIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWU6OmdsdWUoIntzYW1wbGVfbmFtZX0tZGV0ZWN0ZWQiKSkKCiAgIyBSZXR1cm4gdGhlIGZvcm1hdHRlZCBTQ0Ugb2JqZWN0CiAgcmV0dXJuKHNjZSkKfQpgYGAKClRvIHJ1biB0aGlzIGZ1bmN0aW9uLCB3ZSdsbCB1c2UgdGhlIGBwdXJycjo6bWFwMigpYCBmdW5jdGlvbiwgYSByZWxhdGl2ZSBvZiBgcHVycnI6Om1hcCgpYCB0aGF0IGFsbG93cyB5b3UgdG8gbG9vcCBvdmVyIF90d29fIGlucHV0IGxpc3RzL3ZlY3RvcnMuCkluIG91ciBjYXNlLCB3ZSB3YW50IHRvIHJ1biBgZm9ybWF0X3NjZSgpYCBvdmVyIHBhaXJlZCBgc2NlX2xpc3RgIGl0ZW1zIGFuZCBgc2NlX2xpc3RgIG5hbWVzLgoKYGBge3IgZm9ybWF0IHNjZXMgZm9yIG1lcmdlLCBsaXZlID0gVFJVRX0KIyBXZSBjYW4gdXNlIGBwdXJycjo6bWFwMigpYCB0byBsb29wIG92ZXIgdHdvIGxpc3QvdmVjdG9yIGFyZ3VtZW50cwpzY2VfbGlzdF9mb3JtYXR0ZWQgPC0gcHVycnI6Om1hcDIoCiAgIyBFYWNoICJpdGVyYXRpb24iIHdpbGwgbWFyY2ggZG93biB0aGUgZmlyc3QgdHdvCiAgIyAgYXJndW1lbnRzIGBzY2VfbGlzdGAgYW5kIGBuYW1lcyhzY2VfbGlzdClgIGluIG9yZGVyCiAgc2NlX2xpc3QsCiAgbmFtZXMoc2NlX2xpc3QpLAogICMgTmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gcnVuCiAgZm9ybWF0X3NjZQopCgojIFByaW50IHJlc3VsdGluZyBsaXN0CnNjZV9saXN0X2Zvcm1hdHRlZApgYGAKCihQc3N0LCBsaWtlIGBwdXJycmAgYW5kIHdhbnQgdG8gZGl2ZSBkZWVwZXI/IENoZWNrIG91dCBbdGhlIGBwdXJycjo6aW1hcCgpYCBmdW5jdGlvbl0oaHR0cHM6Ly9wdXJyci50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9pbWFwLmh0bWwpISkKCgpBdCBsb25nIGxhc3QsIHdlIGFyZSByZWFkeSB0byBtZXJnZSB0aGUgU0NFcywgd2hpY2ggd2UnbGwgZG8gdXNpbmcgdGhlIFIgZnVuY3Rpb24gYGNiaW5kKClgLgpUaGUgYGNiaW5kKClgIGZ1bmN0aW9uIGlzIG9mdGVuIHVzZWQgdG8gY29tYmluZSBkYXRhIGZyYW1lcyBvciBtYXRyaWNlcyBieSBjb2x1bW4sIGkuZS4gInN0YWNrIiB0aGVtIG5leHQgdG8gZWFjaCBvdGhlci4KVGhlIHNhbWUgcHJpbmNpcGxlIGFwcGxpZXMgaGVyZSwgYnV0IHdoZW4gcnVuIG9uIFNDRSBvYmplY3RzLCBgY2JpbmQoKWAgd2lsbCBjcmVhdGUgYSBuZXcgU0NFIG9iamVjdCBieSBjb21iaW5pbmcgYGNvdW50c2AgYW5kIGBsb2djb3VudHNgIG1hdHJpY2VzIGJ5IGNvbHVtbi4KRm9sbG93aW5nIHRoYXQgc3RydWN0dXJlLCBvdGhlciBTQ0Ugc2xvdHMgKGBjb2xEYXRhYCwgYHJvd0RhdGFgLCByZWR1Y2VkIGRpbWVuc2lvbnMsIGFuZCBvdGhlciBtZXRhZGF0YSkgYXJlIGNvbWJpbmVkIGFwcHJvcHJpYXRlbHkuCgpTaW5jZSB3ZSBuZWVkIHRvIGFwcGx5IGBjYmluZCgpYCB0byBhIF9saXN0XyBvZiBvYmplY3RzLCB3ZSBuZWVkIHRvIHVzZSBzb21lIHNsaWdodGx5LWduYXJseSBzeW50YXg6IFdlJ2xsIHVzZSB0aGUgZnVuY3Rpb24gYGRvLmNhbGwoKWAsIHdoaWNoIGFsbG93cyB0aGUgYGNiaW5kKClgIGlucHV0IHRvIGJlIGEgbGlzdCBvZiBvYmplY3RzIHRvIGNvbWJpbmUuCgpgYGB7ciBtZXJnZXMgc2NlcywgbGl2ZSA9IFRSVUV9CiMgTWVyZ2UgU0NFIG9iamVjdHMKbWVyZ2VkX3NjZSA8LSBkby5jYWxsKGNiaW5kLCBzY2VfbGlzdF9mb3JtYXR0ZWQpCgojIFByaW50IHRoZSBtZXJnZWRfc2NlIG9iamVjdAptZXJnZWRfc2NlCmBgYAoKV2Ugbm93IGhhdmUgYSBzaW5nbGUgU0NFIG9iamVjdCB0aGF0IGNvbnRhaW5zIGFsbCBjZWxscyBmcm9tIGFsbCBzYW1wbGVzIHdlJ2QgbGlrZSB0byBpbnRlZ3JhdGUuCgpMZXQncyB0YWtlIGEgcGVlayBhdCBzb21lIG9mIHRoZSBpbm5hcmRzIG9mIHRoaXMgbmV3IFNDRSBvYmplY3Q6CgpgYGB7ciBleHBsb3JlIG1lcmdlZF9zY2UsIGxpdmUgPSBUUlVFfQojIEhvdyBtYW55IHNhbXBsZXMsIGFuZCBjZWxscyBwZXIgc2FtcGxlPwp0YWJsZSggY29sRGF0YShtZXJnZWRfc2NlKSRzYW1wbGUgKQoKIyBXaGF0IGFyZSB0aGUgbmV3IGNlbGwgaWRzIChjb2x1bW4gbmFtZXMpPwpoZWFkKCBjb2xuYW1lcyhtZXJnZWRfc2NlKSApCgojIFdoYXQgZG9lcyByb3dEYXRhIGxvb2sgbGlrZT8KaGVhZCggcm93RGF0YShtZXJnZWRfc2NlKSApCmBgYAoKCiMjIEludGVncmF0aW9uCgohW1NpbmdsZS1jZWxsIHJvYWRtYXA6IEludGVncmF0ZV0oZGlhZ3JhbXMvcm9hZG1hcF9tdWx0aV9pbnRlZ3JhdGUucG5nKQoKClNvIGZhciwgd2UndmUgY3JlYXRlZCBhIGBtZXJnZWRfc2NlYCBvYmplY3Qgd2hpY2ggaXMgKGFsbW9zdCEpIHJlYWR5IGZvciBpbnRlZ3JhdGlvbi4KClRoZSBpbnRlZ3JhdGlvbiBtZXRob2RzIHdlJ2xsIGJlIHVzaW5nIGhlcmUgYWN0dWFsbHkgcGVyZm9ybSBiYXRjaCBjb3JyZWN0aW9uIG9uIGEgcmVkdWNlZCBkaW1lbnNpb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIG5vcm1hbGl6ZWQgZ2VuZSBleHByZXNzaW9uIHZhbHVlcywgd2hpY2ggaXMgbW9yZSBlZmZpY2llbnQuCmBmYXN0TU5OYCBhbmQgYGhhcm1vbnlgIHNwZWNpZmljYWxseSB1c2UgUENBIGZvciB0aGlzLCBidXQgYmUgYXdhcmUgdGhhdCBkaWZmZXJlbnQgaW50ZWdyYXRpb24gbWV0aG9kcyBtYXkgdXNlIG90aGVyIGtpbmRzIG9mIHJlZHVjZWQgZGltZW5zaW9ucy4KCllvdSdsbCBub3RpY2UgdGhhdCB0aGUgbWVyZ2VkIFNDRSBvYmplY3Qgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgUENBIGFuZCBVTUFQIHJlZHVjZWQgZGltZW5zaW9ucywgd2hpY2ggd2VyZSBjYWxjdWxhdGVkIGR1cmluZyBvdXIgcHJlLXByb2Nlc3Npbmc6CgpgYGB7ciBtZXJnZWRfc2NlIHJlZGRpbSwgbGl2ZSA9IFRSVUV9CiMgUHJpbnQgdGhlIHJlZHVjZWREaW1OYW1lcyBvZiB0aGUgbWVyZ2VkX3NjZQpyZWR1Y2VkRGltTmFtZXMobWVyZ2VkX3NjZSkKYGBgCgpUaGVzZSByZXByZXNlbnQgdGhlIG9yaWdpbmFsIGRpbWVuc2lvbiByZWR1Y3Rpb25zIHRoYXQgd2VyZSBwZXJmb3JtZWQgb24gX2VhY2ggaW5kaXZpZHVhbCBTQ0VfIGJlZm9yZSBtZXJnaW5nLCBidXQgd2UgYWN0dWFsbHkgbmVlZCB0byBjYWxjdWxhdGUgUENBIChhbmQgVU1BUCBmb3IgdmlzdWFsaXphdGlvbikgZnJvbSB0aGUgbWVyZ2VkIG9iamVjdCBkaXJlY3RseS4KCldoeSBjYW4ndCB3ZSB1c2UgdGhlIHNhbXBsZS1zcGVjaWZpYyBQQ0EgYW5kIFVNQVAgbWF0cmljZXM/ClBhcnQgb2YgdGhlc2UgY2FsY3VsYXRpb25zIHRoZW1zZWx2ZXMgaW52b2x2ZXMgc2NhbGluZyB0aGUgcmF3IGRhdGEgdG8gY2VudGVyIHRoZSBtZWFuLgpXaGVuIHNhbXBsZXMgYXJlIHNlcGFyYXRlbHkgY2VudGVyZWQgYnV0IHBsb3R0aW5nIHRvZ2V0aGVyLCB5b3Ugd2lsbCBzZWUgc2FtcGxlcyAib3ZlcmxhcHBpbmciIGluIHNwYWNlLCBidXQgdGhpcyBwbGFjZW1lbnQgaXMgYWN0dWFsbHkganVzdCBhbiBhcnRpZmFjdCBvZiB0aGUgaW5kaXZpZHVhbCBjZW50ZXJpbmcuCkluIGFkZGl0aW9uLCB0aGUgbWF0aGVtYXRpY2FsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBleHByZXNzaW9uIGRhdGEgYW5kIHJlZHVjZWQgZGltZW5zaW9uIHZlcnNpb24gb2YgdGhhdCBkYXRhIHdpbGwgZGlmZmVyIGFjcm9zcyBzYW1wbGVzLCBtZWFuaW5nIHdlIGNhbid0IGludGVycHJldCB0aGVtIGFsbCB0b2dldGhlci4KVG8gc2VlIGhvdyB0aGlzIGxvb2tzLCBsZXQncyBsb29rIGF0IHRoZSBVTUFQIHdoZW4gY2FsY3VsYXRlZCBmcm9tIGluZGl2aWR1YWwgc2FtcGxlczoKCmBgYHtyIHBsb3QgaW5kaXZpZHVhbCBVTUFQc30KIyBQbG90IFVNQVAgY2FsY3VsYXRlZCBmcm9tIGluZGl2aWR1YWwgc2FtcGxlcyB3aXRoIHNlcGFyYXRlIHNjYWxpbmcKc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJVTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9ICJzYW1wbGUiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICsKICAjIFVzZSBhIENWRC1mcmllbmRseSBjb2xvciBzY2hlbWUgYW5kIHNwZWNpZnkgbGVnZW5kIG5hbWUKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAic2FtcGxlIikgKyAKICAjIE1vZGlmeSB0aGUgbGVnZW5kIGtleSB3aXRoIGxhcmdlciwgZWFzaWVyIHRvIHNlZSBwb2ludHMKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICBnZ3RpdGxlKCJVTUFQIGNhbGN1bGF0ZWQgb24gZWFjaCBzYW1wbGUgc2VwYXJhdGVseSIpCmBgYAoKQXMgd2Ugc2VlIGluIHRoaXMgVU1BUCwgYWxsIHNhbXBsZXMgYXJlIGNlbnRlcmVkIGF0IHplcm8gYW5kIGFsbCBvdmVybGFwcGluZy4KVGhpcyB2aXN1YWwgYXJ0aWZhY3QgY2FuIGdpdmUgdGhlIF9pbmNvcnJlY3QgaW1wcmVzc2lvbl8gdGhhdCBkYXRhIGlzIGludGVncmF0ZWQgLSB0byBiZSBjbGVhciwgdGhpcyBkYXRhIGlzIE5PVCBpbnRlZ3JhdGVkIQoKRm9yIGlucHV0IHRvIGludGVncmF0aW9uLCB3ZSdsbCB3YW50IHRoZSByZWR1Y2VkIGRpbWVuc2lvbiBjYWxjdWxhdGlvbnMgdG8gY29uc2lkZXIgbm9ybWFsaXplZCBnZW5lIGV4cHJlc3Npb24gdmFsdWVzIGZyb20gYWxsIHNhbXBsZXMgc2ltdWx0YW5lb3VzbHkuClNvIHdlJ2xsIG5lZWQgdG8gcmVjYWxjdWxhdGUgUENBIChhbmQgVU1BUCBmb3IgdmlzdWFsaXphdGlvbikgb24gdGhlIG1lcmdlZCBvYmplY3QuCldlJ2xsIGFsc28gc2F2ZSB0aGVzZSBuZXcgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggZGlmZmVyZW50IG5hbWVzLCBgbWVyZ2VkX1BDQWAgYW5kIGBtZXJnZWRfVU1BUGAsIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBhbHJlYWR5LXByZXNlbnQgYFBDQWAgYW5kIGBVTUFQYC4KCkZpcnN0LCBhcyB1c3VhbCwgd2UnbGwgZGV0ZXJtaW5lIHRoZSBoaWdoLXZhcmlhbmNlIGdlbmVzIHRvIHVzZSBmb3IgUENBIGZyb20gdGhlIGBtZXJnZWRfc2NlYCBvYmplY3QuCkZvciB0aGlzLCB3ZSdsbCBuZWVkIHRvIHByb3ZpZGUgdGhlIGFyZ3VtZW50IGBibG9jayA9IG1lcmdlZF9zY2Ukc2FtcGxlYCB3aGVuIG1vZGVsaW5nIGdlbmUgdmFyaWFuY2UsIHdoaWNoIHRlbGxzIGBzY3Jhbjo6bW9kZWxHZW5lVmFyKClgIHRvIGZpcnN0IG1vZGVsIHZhcmlhbmNlIHNlcGFyYXRlbHkgZm9yIGVhY2ggYmF0Y2ggYW5kIHRoZW4gY29tYmluZSB0aG9zZSBtb2RlbGluZyBzdGF0aXN0aWNzLgoKYGBge3IgY2FsYyBtZXJnZWQgaHYgZ2VuZXN9CiMgU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGdlbmVzIHRvIGlkZW50aWZ5Cm51bV9nZW5lcyA8LSAyMDAwCgojIENhbGN1bGF0ZSB2YXJpYXRpb24gZm9yIGVhY2ggZ2VuZQpnZW5lX3ZhcmlhbmNlIDwtIHNjcmFuOjptb2RlbEdlbmVWYXIobWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lmeSB0aGUgZ3JvdXBpbmcgY29sdW1uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBtZXJnZWRfc2NlJHNhbXBsZSkKCiMgR2V0IHRoZSB0b3AgYG51bV9nZW5lc2AgaGlnaC12YXJpYW5jZSBnZW5lcyB0byB1c2UgZm9yIGRpbWVuc2lvbiByZWR1Y3Rpb24KaHZfZ2VuZXMgPC0gc2NyYW46OmdldFRvcEhWR3MoZ2VuZV92YXJpYW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG51bV9nZW5lcykKYGBgCgpUbyBjYWxjdWxhdGUgdGhlIFBDQSBtYXRyaXggaXRzZWxmLCB3ZSdsbCB1c2UgYW4gYXBwcm9hY2ggZnJvbSB0aGUgYGJhdGNoZWxvcmAgcGFja2FnZSwgd2hpY2ggaXMgdGhlIFIgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBgZmFzdE1OTmAgbWV0aG9kLgpUaGUgW2BiYXRjaGVsb3I6Om11bHRpQmF0Y2hQQ0EoKWBdKGh0dHBzOi8vcmRyci5pby9iaW9jL2JhdGNoZWxvci9tYW4vbXVsdGlCYXRjaFBDQS5odG1sKSBmdW5jdGlvbiBjYWxjdWxhdGVzIGEgYmF0Y2gtd2VpZ2h0ZWQgUENBIG1hdHJpeC4KVGhpcyB3ZWlnaHRpbmcgZW5zdXJlcyB0aGF0IGFsbCBiYXRjaGVzLCB3aGljaCBtYXkgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBudW1iZXJzIG9mIGNlbGxzLCBjb250cmlidXRlIGVxdWFsbHkgdG8gdGhlIG92ZXJhbGwgc2NhbGluZy4KCmBgYHtyIG1ha2UgbWVyZ2VkX3BjYSwgbGl2ZSA9IFRSVUV9CiMgVXNlIGJhdGNoZWxvciB0byBjYWxjdWxhdGUgUENBIGZvciBtZXJnZWRfc2NlLCBjb25zaWRlcmluZyBvbmx5CiMgIHRoZSBoaWdoLXZhcmlhbmNlIGdlbmVzCiMgV2UnbGwgbmVlZCB0byBpbmNsdWRlIHRoZSBhcmd1bWVudCBgcHJlc2VydmUuc2luZ2xlID0gVFJVRWAgdG8gZ2V0CiMgIGEgc2luZ2xlIG1hdHJpeCB3aXRoIGFsbCBzYW1wbGVzIGFuZCBub3Qgc2VwYXJhdGUgbWF0cmljZXMgZm9yIGVhY2ggc2FtcGxlCm1lcmdlZF9wY2EgPC0gYmF0Y2hlbG9yOjptdWx0aUJhdGNoUENBKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNldC5yb3cgPSBodl9nZW5lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSBtZXJnZWRfc2NlJHNhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmUuc2luZ2xlID0gVFJVRSkKYGBgCgpMZXQncyBoYXZlIGEgbG9vayBhdCB0aGUgb3V0cHV0OgpgYGB7ciBwcmludCBtZXJnZWRfcGNhLCBsaXZlID0gVFJVRX0KIyBUaGlzIG91dHB1dCBpcyBub3QgdmVyeSBpbnRlcmVzdGluZyEKbWVyZ2VkX3BjYQpgYGAKCldlIGNhbiB1c2UgaW5kZXhpbmcgYFtbMV1dYCB0byBzZWUgdGhlIFBDQSBtYXRyaXggY2FsY3VsYXRlZCwgbG9va2luZyBhdCBhIHNtYWxsIHN1YnNldCBmb3IgY29udmVuaWVuY2U6CgpgYGB7ciBwcmludCBtZXJnZWRfcGNhIGluZGV4ZWQsIGxpdmUgPSBUUlVFfQptZXJnZWRfcGNhW1sxXV1bMTo1LDE6NV0KYGBgCgpXZSBjYW4gbm93IGluY2x1ZGUgdGhpcyBQQ0EgbWF0cml4IGluIG91ciBgbWVyZ2VkX3NjZWAgb2JqZWN0OgoKYGBge3IgYWRkIG1lcmdlZF9wY2EsIGxpdmUgPSBUUlVFfQojIGFkZCBQQ0EgcmVzdWx0cyB0byBtZXJnZWQgU0NFIG9iamVjdApyZWR1Y2VkRGltKG1lcmdlZF9zY2UsICJtZXJnZWRfUENBIikgPC0gbWVyZ2VkX3BjYVtbMV1dCmBgYAoKTm93IHRoYXQgd2UgaGF2ZSB0aGUgUENBIG1hdHJpeCwgd2UgY2FuIHByb2NlZWQgdG8gY2FsY3VsYXRlIFVNQVAgdG8gdmlzdWFsaXplIHRoZSB1bmNvcnJlY3RlZCBtZXJnZWQgZGF0YS4KCldlJ2xsIGNhbGN1bGF0ZSBVTUFQIGFzICJ1c3VhbCIsIGJ1dCBpbiB0aGlzIGNhc2Ugd2UnbGwgc3BlY2lmeSB0d28gYWRkaXRpb25hbCBhcmd1bWVudHM6CgotIGBkaW1yZWQgPSAibWVyZ2VkX1BDQSJgLCB3aGljaCBzcGVjaWZpZXMgd2hpY2ggZXhpc3RpbmcgcmVkdWNlZCBkaW1lbnNpb24gc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBjYWxjdWxhdGlvbi4KV2Ugd2FudCB0byB1c2UgdGhlIGJhdGNoLXdlaWdodGVkIFBDQSwgd2hpY2ggd2UgbmFtZWQgYWJvdmUgYXMgYCJtZXJnZWRfUENBImAuCi0gYG5hbWUgPSAibWVyZ2VkX1VNQVAiYCwgd2hpY2ggbmFtZXMgdGhlIGZpbmFsIFVNQVAgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMuClRoaXMgYXJndW1lbnQgd2lsbCBwcmV2ZW50IHVzIGZyb20gb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nIFVNQVAgd2hpY2ggaXMgYWxyZWFkeSBuYW1lZCAiVU1BUCIgYW5kIGluc3RlYWQgY3JlYXRlIGEgc2VwYXJhdGUgYCJtZXJnZWRfVU1BUCJgLgoKYGBge3IgY2FsY3VsYXRlIG1lcmdlZCB1bWFwLCBsaXZlID0gVFJVRX0KIyBhZGQgbWVyZ2VkX1VNQVAgZnJvbSBtZXJnZWRfUENBCm1lcmdlZF9zY2UgPC0gc2NhdGVyOjpydW5VTUFQKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJtZXJnZWRfUENBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJtZXJnZWRfVU1BUCIpCmBgYAoKTm93LCBsZXQncyBzZWUgaG93IHRoaXMgbmV3IGBtZXJnZWRfVU1BUGAgbG9va3MgY29tcGFyZWQgdG8gdGhlIGBVTUFQYCBjYWxjdWxhdGVkIGZyb20gaW5kaXZpZHVhbCBzYW1wbGVzOgoKYGBge3IgcGxvdCB1bmNvcnJlY3RlZCBtZXJnZWQgVU1BUH0KIyBVTUFQcyBzY2FsZWQgdG9nZXRoZXIgd2hlbiBjYWxjdWxhdGVkIGZyb20gdGhlIG1lcmdlZCBTQ0UKc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJtZXJnZWRfVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAic2FtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWUgc3R5bGluZyB0byBoZWxwIHVzIHNlZSB0aGUgcG9pbnRzOgogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAic2FtcGxlIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIGdndGl0bGUoIlVNQVAgY2FsY3VsYXRlZCBvbiBtZXJnZWRfc2NlIikKYGBgCgpTYW1wbGVzIGFyZSBub3cgc2VwYXJhdGVkLCB3aGljaCBtb3JlIHJlYXNvbmFibHkgcmVmbGVjdHMgdGhhdCB0aGlzIGRhdGEgaXMgX25vdCB5ZXQgYmF0Y2gtY29ycmVjdGVkXy4KV2UgY2FuIHRoaW5rIG9mIHRoaXMgVU1BUCBhcyBvdXIgImJlZm9yZSIgVU1BUCwgYW5kIHdlIGNhbiBjb21wYXJlIHRoaXMgdG8gdGhlICJhZnRlciIgVU1BUCB3ZSBzZWUgcG9zdC1pbnRlZ3JhdGlvbi4KCkxldCdzIGRpc2N1c3MgYSBsaXR0bGUgZmlyc3Q6IFdoYXQgdmlzdWFsIGRpZmZlcmVuY2VzIGRvIHlvdSB0aGluayB0aGUgVU1BUCBvbiB0aGUgaW50ZWdyYXRlZCB2ZXJzaW9uIG9mIGRhdGEgd2lsbCBoYXZlPwpXaGF0IHNpbWlsYXJpdGllcyBkbyB5b3UgdGhpbmsgdGhlIGludGVncmF0ZWQgVU1BUCB3aWxsIGhhdmUgdG8gdGhpcyBwbG90PwoKCiMjIyBJbnRlZ3JhdGlvbiB3aXRoIGBmYXN0TU5OYAoKRmluYWxseSwgd2UncmUgcmVhZHkgdG8gaW50ZWdyYXRlIQpUbyBzdGFydCwgd2UnbGwgdXNlIHRoZSBgZmFzdE1OTmAgYXBwcm9hY2ggZnJvbSB0aGUgQmlvY29uZHVjdG9yIFtgYmF0Y2hlbG9yYCBwYWNrYWdlXShodHRwOi8vd3d3LmJpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvYmF0Y2hlbG9yLmh0bWwpLgoKYGZhc3RNTk5gIHRha2VzIGFzIGlucHV0IHRoZSBgbWVyZ2VkX3NjZWAgb2JqZWN0IHRvIGludGVncmF0ZSwgYW5kIHRoZSBmaXJzdCBzdGVwIGl0IHBlcmZvcm1zIGlzIGFjdHVhbGx5IHRvIHJ1biBgYmF0Y2hlbG9yOjptdWx0aUJhdGNoUENBKClgIG9uIHRoYXQgU0NFLgpJdCB0aGVuIHVzZXMgdGhhdCBiYXRjaC13ZWlnaHRlZCBQQ0EgbWF0cml4IHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBiYXRjaCBjb3JyZWN0aW9uLgpUaGUgYGJhdGNoYCBhcmd1bWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpZmZlcmVudCBncm91cGluZ3Mgd2l0aGluIHRoZSBgbWVyZ2VkX3NjZWAgKGkuZS4gdGhlIG9yaWdpbmFsIHNhbXBsZSB0aGF0IGVhY2ggY2VsbCBiZWxvbmdzIHRvKSwgYW5kIHRoZSBgc3Vic2V0LnJvd2AgYXJndW1lbnQgY2FuIG9wdGlvbmFsbHkgYmUgdXNlZCB0byBwcm92aWRlIGEgdmVjdG9yIG9mIGhpZ2gtdmFyaWFuY2UgZ2VuZXMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBmb3IgdGhpcyBQQ0EgY2FsY3VsYXRpb24uCmBmYXN0TU5OYCB3aWxsIHJldHVybiBhbiBTQ0Ugb2JqZWN0IHRoYXQgY29udGFpbnMgYSBiYXRjaC1jb3JyZWN0ZWQgUENBLgpMZXQncyBydW4gaXQgYW5kIHNhdmUgdGhlIHJlc3VsdCB0byBhIHZhcmlhYmxlIGNhbGxlZCBgaW50ZWdyYXRlZF9zY2VgLgoKCmBgYHtyIHJ1biBmYXN0bW5uLCBsaXZlID0gVFJVRX0KIyBpbnRlZ3JhdGUgd2l0aCBmYXN0TU5OLCBhZ2FpbiBzcGVjaWZ5aW5nIG9ubHkgb3VyIGhpZ2gtdmFyaWFuY2UgZ2VuZXMKaW50ZWdyYXRlZF9zY2UgPC0gYmF0Y2hlbG9yOjpmYXN0TU5OKAogIG1lcmdlZF9zY2UsCiAgYmF0Y2ggPSBtZXJnZWRfc2NlJHNhbXBsZSwKICBzdWJzZXQucm93ID0gaHZfZ2VuZXMKKQpgYGAKCkxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSByZXN1bHQ6CgpgYGB7ciBmYXN0bW5uIHJlc3VsdCwgbGl2ZSA9IFRSVUV9CiMgUHJpbnQgdGhlIGludGVncmF0ZWRfc2NlIG9iamVjdAppbnRlZ3JhdGVkX3NjZQpgYGAKClRoZXJlIGFyZSBjb3VwbGUgcGllY2VzIG9mIGluZm9ybWF0aW9uIGhlcmUgb2YgaW50ZXJlc3Q6CgotIFRoZSBgY29ycmVjdGVkYCByZWR1Y2VkIGRpbWVuc2lvbiByZXByZXNlbnRzIHRoZSBiYXRjaC1jb3JyZWN0ZWQgUENBIHRoYXQgYGZhc3RNTk5gIGNhbGN1bGF0ZWQuCi0gVGhlIGByZWNvbnN0cnVjdGVkYCBhc3NheSByZXByZXNlbnRzIHRoZSBiYXRjaC1jb3JyZWN0ZWQgbm9ybWFsaXplZCBleHByZXNzaW9uIHZhbHVlcywgd2hpY2ggYGZhc3RNTk5gICJiYWNrLWNhbGN1bGF0ZWQiIGZyb20gdGhlIGJhdGNoLWNvcnJlY3RlZCBQQ0EgKGBjb3JyZWN0ZWRgKS4KR2VuZXJhbGx5IHNwZWFraW5nLCB0aGVzZSBleHByZXNzaW9uIHZhbHVlcyBhcmUgbm90IHN0YW5kLWFsb25lIHZhbHVlcyB0aGF0IHlvdSBzaG91bGQgdXNlIGZvciBvdGhlciBhcHBsaWNhdGlvbnMgbGlrZSBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uLCBhcyBkZXNjcmliZWQgaW4gW19PcmNoZXN0cmF0aW5nIFNpbmdsZSBDZWxsIEFuYWx5c2VzX10oaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xOS9PU0NBLm11bHRpc2FtcGxlL3VzaW5nLWNvcnJlY3RlZC12YWx1ZXMuaHRtbCkuCklmIHRoZSBgc3Vic2V0LnJvd2AgYXJndW1lbnQgaXMgcHJvdmlkZWQgKGFzIGl0IHdhcyBoZXJlKSwgb25seSBnZW5lcyBwcmVzZW50IGluIGBzdWJzZXQucm93YCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZXNlIHJlY29uc3RydWN0ZWQgZXhwcmVzc2lvbiB2YWx1ZXMsIGJ1dCB0aGlzIHNldHRpbmcgY2FuIGJlIG92ZXJyaWRkZW4gc28gdGhhdCBhbGwgZ2VuZXMgaGF2ZSByZWNvbnN0cnVjdGVkIGV4cHJlc3Npb24gd2l0aCB0aGUgYXJndW1lbnQgYGNvcnJlY3QuYWxsID0gVFJVRWAuCgpXZSdyZSBtb3N0bHkgaW50ZXJlc3RlZCBpbiB0aGUgUENBIHRoYXQgYGZhc3RNTk5gIGNhbGN1bGF0ZWQsIHNvIGxldCdzIHNhdmUgdGhhdCBpbmZvcm1hdGlvbiAod2l0aCBhbiBpbmZvcm1hdGl2ZSBhbmQgdW5pcXVlIG5hbWUpIGludG8gb3VyIGBtZXJnZWRfc2NlYCBvYmplY3Q6CgpgYGB7ciBmYXN0bW5uIHBjcywgbGl2ZSA9IFRSVUV9CiMgTWFrZSBhIG5ldyByZWR1Y2VkRGltIG5hbWVkIGZhc3Rtbm5fUENBIGZyb20gdGhlIGNvcnJlY3RlZCByZWR1Y2VkRGltIGluIGludGVncmF0ZWRfc2NlCnJlZHVjZWREaW0obWVyZ2VkX3NjZSwgImZhc3Rtbm5fUENBIikgPC0gcmVkdWNlZERpbShpbnRlZ3JhdGVkX3NjZSwgImNvcnJlY3RlZCIpCmBgYAoKRmluYWxseSwgd2UnbGwgY2FsY3VsYXRlIFVNQVAgZnJvbSB0aGVzZSBjb3JyZWN0ZWQgUENBIG1hdHJpeCBmb3IgdmlzdWFsaXphdGlvbi4KCmBgYHtyIGNhbGN1bGF0ZSBmYXN0bW5uIHVtYXAsIGxpdmUgPSBUUlVFfQojIENhbGN1bGF0ZSBVTUFQCm1lcmdlZF9zY2UgPC0gc2NhdGVyOjpydW5VTUFQKAogIG1lcmdlZF9zY2UsCiAgZGltcmVkID0gImZhc3Rtbm5fUENBIiwKICBuYW1lID0gImZhc3Rtbm5fVU1BUCIKKQpgYGAKCkZpcnN0LCBsZXQncyBwbG90IHRoZSBpbnRlZ3JhdGVkIFVNQVAgaGlnaGxpZ2h0aW5nIHRoZSBkaWZmZXJlbnQgYmF0Y2hlcy4KQSB3ZWxsLWludGVncmF0ZWQgZGF0YXNldCB3aWxsIHNob3cgYmF0Y2ggbWl4aW5nLCBidXQgYSBwb29ybHktaW50ZWdyYXRlZCBkYXRhc2V0IHdpbGwgc2hvdyBtb3JlIHNlcGFyYXRpb24gYW1vbmcgYmF0Y2hlcywgc2ltaWxhciB0byB0aGUgdW5jb3JyZWN0ZWQgVU1BUC4KTm90ZSB0aGF0IHRoaXMgaXMgYSBtb3JlIHF1YWxpdGF0aXZlIHdheSB0byBhc3Nlc3MgdGhlIHN1Y2Nlc3Mgb2YgaW50ZWdyYXRpb24sIGJ1dCB0aGVyZSBhcmUgZm9ybWFsIG1ldHJpY3Mgb25lIGNhbiB1c2UgdG8gYXNzZXNzIGJhdGNoIG1peGluZywgd2hpY2ggeW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaW4gW3RoaXMgY2hhcHRlciBvZiBPU0NBXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE5L09TQ0EubXVsdGlzYW1wbGUvY29ycmVjdGlvbi1kaWFnbm9zdGljcy5odG1sKS4KCmBgYHtyIHBsb3QgZmFzdG1ubiB1bWFwIGJhdGNoZXN9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAjIHBsb3QgdGhlIGZhc3RNTk4gY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGJ5IHNhbXBsZQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gInNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN0eWxpbmcgdG8gaGVscCB1cyBzZWUgdGhlIHBvaW50czoKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gInNhbXBsZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICBnZ3RpdGxlKCJVTUFQIGFmdGVyIGludGVncmF0aW9uIHdpdGggZmFzdE1OTiIpCmBgYAoKVGhpcyBgZmFzdG1ubl9VTUFQYCBjZXJ0YWlubHkgbG9va3MgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3ZSBtYWRlIGZyb20gYG1lcmdlZF9VTUFQYCEKV2hhdCBkaWZmZXJlbnQgdHJlbmRzIGRvIHlvdSBzZWU/CkRvIGFsbCBzYW1wbGVzIGxvb2sgImVxdWFsbHkgd2VsbCIgaW50ZWdyYXRlZCwgZnJvbSBhIGZpcnN0IGxvb2s/CgpJbXBvcnRhbnRseSwgb25lIHJlYXNvbiB0aGF0IGJhdGNoZXMgbWF5IHN0aWxsIGFwcGVhciBzZXBhcmF0ZWQgaW4gdGhlIGNvcnJlY3RlZCBVTUFQIGlzIGlmIHRoZXkgX3Nob3VsZF8gYmUgc2VwYXJhdGVkIC0gZm9yIGV4YW1wbGUsIG1heWJlIHR3byBiYXRjaGVzIGNvbnRhaW4gdmVyeSBkaWZmZXJlbnQgY2VsbCB0eXBlcywgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBkaWFnbm9zZXMsIG9yIG1heSBiZSBmcm9tIGRpZmZlcmVudCBwYXRpZW50cy4KClJlY2FsbCBmcm9tIGVhcmxpZXIgdGhhdCB3ZSBjb252ZW5pZW50bHkgaGF2ZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgaW4gb3VyIFNDRXMsIHNvIHdlIGNhbiBleHBsb3JlIHRob3NlIGhlcmUhCkxldCdzIHRha2UgYSBxdWljayBkZXRvdXIgdG8gc2VlIHdoYXQga2luZHMgb2YgY2VsbCB0eXBlcyBhcmUgaW4gdGhpcyBkYXRhIGJ5IG1ha2luZyBhIGJhcnBsb3Qgb2YgdGhlIGNlbGwgdHlwZXMgYWNyb3NzIHNhbXBsZXM6CgpgYGB7ciBleHBsb3JlIGNlbGx0eXBlc30KIyBDZWxsIHR5cGVzIGFyZSBpbiB0aGUgYGNlbGx0eXBlX2Jyb2FkYCBhbmQgYGNlbGx0eXBlX2ZpbmVgIGNvbHVtbnMKbWVyZ2VkX3NjZV9kZiA8LSBhcy5kYXRhLmZyYW1lKGNvbERhdGEobWVyZ2VkX3NjZSkpCgojIFVzZSBnZ3Bsb3QyIHRvIG1ha2UgYSBiYXJwbG90IHRoZSBjZWxsIHR5cGVzIGFjcm9zcyBzYW1wbGVzCmdncGxvdChtZXJnZWRfc2NlX2RmLAogICAgICAgYWVzKHggPSBzYW1wbGUsCiAgICAgICAgICAgZmlsbCA9IGNlbGx0eXBlX2Jyb2FkKSkgKwogICMgQmFycGxvdCBvZiBjZWxsdHlwZSBwcm9wb3J0aW9ucwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgIyBVc2UgYSBDVkQtZnJpZW5kbHkgY29sb3Igc2NoZW1lCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hLnZhbHVlID0gImdyZXk4MCIpICsKICAjIGN1c3RvbWl6ZSB5LWF4aXMgbGFiZWwKICBsYWJzKHkgPSAiUHJvcG9ydGlvbiIpICsKICAjIG5pY2VyIHRoZW1lCiAgdGhlbWVfYncoKQpgYGAKCldlIHNlZSB0aGF0IFR1bW9yIGNlbGwgdHlwZXMgYXJlIGJ5IGZhciB0aGUgbW9zdCBwcmV2YWxlbnQgYWNyb3NzIGFsbCBzYW1wbGVzLCBhbmQgbm9ybWFsIHRpc3N1ZSBjZWxsIHR5cGVzIGFyZSBub3QgdmVyeSBjb21tb24uCldlIHNlZSBhbHNvIHRoYXQgYFNDUENMMDAwNDgxYCBoYXMgYSBsYXJnZXIgYFR1bW9yX015b2N5dGVgIHBvcHVsYXRpb24sIHdoaWxlIGFsbCBvdGhlciBzYW1wbGVzIGhhdmUgbGFyZ2VyIGBUdW1vcl9NZXNvZGVybWAgcG9wdWxhdGlvbnMuClRoaXMgZGlmZmVyZW5jZSBfbWF5XyBleHBsYWluIHdoeSB3ZSBvYnNlcnZlIHRoYXQgYFNDUENMMDAwNDgxYCBpcyBzb21ld2hhdCBtb3JlIHNlcGFyYXRlZCBmcm9tIHRoZSBvdGhlciBzYW1wbGVzIGluIHRoZSBgZmFzdE1OTmAgVU1BUC4KCkxldCdzIHJlLXBsb3QgdGhpcyBVTUFQIHRvIGhpZ2hsaWdodCBjZWxsIHR5cGVzOgoKCmBgYHtyIHBsb3QgZmFzdG1ubiB1bWFwIGNlbGx0eXBlc30Kc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgYnkgYnJvYWQgY2VsbHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAiY2VsbHR5cGVfYnJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICsKICAjIGluY2x1ZGUgYXJndW1lbnQgdG8gc3BlY2lmeSBjb2xvciBvZiBOQSB2YWx1ZXMKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAiQnJvYWQgY2VsbHR5cGUiLCBuYS52YWx1ZSA9ICJncmV5ODAiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArCiAgZ2d0aXRsZSgiVU1BUCBhZnRlciBpbnRlZ3JhdGlvbiB3aXRoIGZhc3RNTk4iKQpgYGAKClRoaXMgVU1BUCBzaG93cyB0aGF0IHRoZSBub3JtYWwgdGlzc3VlIGNlbGwgdHlwZXMgKG1vc3RseSB2YXNjdWxhciBlbmRvdGhlbGl1bSwgbXVzY2xlIGNlbGxzLCBhbmQgbW9ub2N5dGVzKSB0ZW5kIHRvIGNsdXN0ZXIgdG9nZXRoZXIgYW5kIGFyZSBnZW5lcmFsbHkgc2VwYXJhdGVkIGZyb20gdGhlIHR1bW9yIGNlbGwgdHlwZXMsIHdoaWNoIGlzIGFuIGVuY291cmFnaW5nIHBhdHRlcm4hClR1bW9yIGNlbGwgdHlwZXMgZnJvbSBkaWZmZXJlbnQgc2FtcGxlcyBhcmUgYWxsIGFsc28gY2x1c3RlcmluZyB0b2dldGhlciwgd2hpY2ggaXMgZXZlbiBtb3JlIGVuY291cmFnaW5nIHRoYXQgd2UgaGFkIHN1Y2Nlc3NmdWwgaW50ZWdyYXRpb24uCgpIb3dldmVyLCBpdCdzIGEgYml0IGNoYWxsZW5naW5nIHRvIHNlZSBhbGwgdGhlIHBvaW50cyBnaXZlbiB0aGUgYW1vdW50IG9mIG92ZXJsYXAgaW4gdGhlIHBsb3QuCk9uZSB3YXkgd2UgY2FuIHNlZSBhbGwgdGhlIHBvaW50cyBhIGJpdCBiZXR0ZXIgaXMgdG8gZmFjZXQgdGhlIHBsb3QgYnkgc2FtcGxlLCB1c2luZyBgZmFjZXRfd3JhcCgpYCBmcm9tIHRoZSBgZ2dwbG90MmAgcGFja2FnZSAod2hpY2ggd2UgY2FuIGRvIGJlY2F1c2UgYHNjYXRlcjo6cGxvdFJlZHVjZWREaW0oKWAgcmV0dXJucyBhIGBnZ3Bsb3QyYCBvYmplY3QpOgoKYGBge3IgcGxvdCBmYXN0bW5uIHVtYXAgY2VsbHR5cGVzIGZhY2V0ZWR9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAjIEFsbG93IGZvciBmYWNldGluZyBieSBhIHZhcmlhYmxlIHVzaW5nIGBvdGhlcl9maWVsZHNgOgogICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9ICJzYW1wbGUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gIkJyb2FkIGNlbGx0eXBlIiwgbmEudmFsdWUgPSAiZ3JleTgwIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIGdndGl0bGUoIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBmYXN0TU5OIikgKwogICMgRmFjZXQgYnkgc2FtcGxlCiAgZmFjZXRfd3JhcCh2YXJzKHNhbXBsZSkpICsKICAjIFVzZSBhIHRoZW1lIHdpdGggYmFja2dyb3VuZCBncmlkIHRvIG1vcmUgZWFzaWx5IGNvbXBhcmUgcGFuZWwgY29vcmRpbmF0ZXMKICB0aGVtZV9idygpCmBgYAoKV2hhdCB0cmVuZHMgZG8geW91IG9ic2VydmUgYmV0d2VlbiB0dW1vciBhbmQgaGVhbHRoeSB0aXNzdWVzIGFtb25nIHRoZXNlIGludGVncmF0ZWQgc2FtcGxlcz8KCgojIyMgSW50ZWdyYXRpb24gd2l0aCBgaGFybW9ueWAKCmBmYXN0TU5OYCBpcyBvbmx5IG9uZSBvZiBtYW55IGFwcHJvYWNoZXMgdG8gcGVyZm9ybSBpbnRlZ3JhdGlvbiwgYW5kIGRpZmZlcmVudCBtZXRob2RzIGhhdmUgZGlmZmVyZW50IGNhcGFiaWxpdGllcyBhbmQgbWF5IGdpdmUgZGlmZmVyZW50IHJlc3VsdHMuCkZvciBleGFtcGxlLCBzb21lIG1ldGhvZHMgY2FuIGFjY29tbW9kYXRlIGFkZGl0aW9uYWwgY292YXJpYXRlcyAoZS5nLiwgdGVjaG5vbG9neSwgcGF0aWVudCwgZGlhZ25vc2lzLCBldGMuKSB0aGF0IGNhbiBpbmZsdWVuY2UgaW50ZWdyYXRpb24uCkluIGZhY3QgdGhlIGRhdGEgd2UgYXJlIHVzaW5nIGhhcyBhIGtub3duIF9wYXRpZW50XyBjb3ZhcmlhdGU7IGBTQ1BDTDAwMDQ3OWAgYW5kIGBTQ1BDTDAwMDQ4MGAgYXJlIGZyb20gdGhlIGZpcnN0IHBhdGllbnQsIGFuZCBgU0NQQ0wwMDA0ODFgIGFuZCBgU0NQQ0wwMDA0ODJgIGFyZSBmcm9tIHRoZSBzZWNvbmQgcGF0aWVudC4KClNvLCBsZXQncyBwZXJmb3JtIGludGVncmF0aW9uIHdpdGggYSBtZXRob2QgdGhhdCBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gLSBbYGhhcm1vbnlgXShodHRwczovL3BvcnRhbHMuYnJvYWRpbnN0aXR1dGUub3JnL2hhcm1vbnkvKSEKClRvIGJlZ2luIHNldHRpbmcgdXAgZm9yIGBoYXJtb255YCBpbnRlZ3JhdGlvbiwgd2UgbmVlZCB0byBhZGQgZXhwbGljaXQgcGF0aWVudCBpbmZvcm1hdGlvbiBpbnRvIG91ciBtZXJnZWQgU0NFLgpXZSdsbCBjcmVhdGUgYSBuZXcgY29sdW1uIGBwYXRpZW50YCB3aG9zZSB2YWx1ZSBpcyBlaXRoZXIgIkEiIG9yICJCIiBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIHNhbXBsZSBuYW1lLCB1c2luZyB0aGUgW2BkcGx5cjo6Y2FzZV93aGVuKClgXShodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2Nhc2Vfd2hlbi5odG1sKSBmdW5jdGlvbi4KV2UgcHJvdmlkZSB0aGlzIGZ1bmN0aW9uIHdpdGggYSBzZXQgb2YgbG9naWNhbCBleHByZXNzaW9ucyBhbmQgZWFjaCBhc3NpZ25lZCB2YWx1ZSBpcyBkZXNpZ25hdGVkIGJ5IGB+YC4KVGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXIsIHN0b3BwaW5nIGF0IHRoZSBfZmlyc3RfIG9uZSB0aGF0IGV2YWx1YXRlcyBhcyBgVFJVRWAgYW5kIHJldHVybmluZyB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KCmBgYHtyIGFkZCBwYXRpZW50IGluZm99CiMgQ3JlYXRlIHBhdGllbnQgY29sdW1uIHdpdGggdmFsdWVzICJBIiBvciAiQiIgZm9yIHRoZSB0d28gcGF0aWVudHMKbWVyZ2VkX3NjZSRwYXRpZW50IDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgbWVyZ2VkX3NjZSRzYW1wbGUgJWluJSBjKCJTQ1BDTDAwMDQ3OSIsICJTQ1BDTDAwMDQ4MCIpIH4gIkEiLAogIG1lcmdlZF9zY2Ukc2FtcGxlICVpbiUgYygiU0NQQ0wwMDA0ODEiLCAiU0NQQ0wwMDA0ODIiKSB+ICJCIiwKKQpgYGAKCgpVbmxpa2UgYGZhc3RNTk5gLCBgaGFybW9ueWAgZG9lcyBub3QgY2FsY3VsYXRlIGNvcnJlY3RlZCBleHByZXNzaW9uIHZhbHVlcyBub3IgZG9lcyBpdCByZXR1cm4gYW4gU0NFIG9iamVjdC4KTGlrZSBgZmFzdE1OTmAsIGBoYXJtb255YCBwZXJmb3JtcyBpbnRlZ3JhdGlvbiBvbiBhIG1lcmdlZCBQQ0EgbWF0cml4LgpIb3dldmVyLCB1bmxpa2UgYGZhc3RNTk5gLCBgaGFybW9ueWAgZG9lcyBub3QgImJhY2stY2FsY3VsYXRlIiBjb3JyZWN0ZWQgZXhwcmVzc2lvbiBmcm9tIHRoZSBjb3JyZWN0ZWQgUENBIG1hdHJpeCBhbmQgaXQgb25seSByZXR1cm5zIHRoZSBjb3JyZWN0ZWQgUENBIG1hdHJpeCBpdHNlbGYuCkZvciBpbnB1dCwgYGhhcm1vbnlgIG5lZWRzIGEgY291cGxlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKCi0gRmlyc3QsIGBoYXJtb255YCB0YWtlcyBhIGJhdGNoLXdlaWdodGVkIFBDQSBtYXRyaXggdG8gcGVyZm9ybSBpbnRlZ3JhdGlvbi4KV2UgYWxyZWFkeSBjYWxjdWxhdGVkIGEgYmF0Y2gtd2VpZ2h0ZWQgUENBIG1hdHJpeCAob3VyIGBtZXJnZWRfUENBYCByZWR1Y2VkIGRpbWVuc2lvbiksIHdlJ2xsIHByb3ZpZGUgdGhpcyBhcyB0aGUgdGhlIGlucHV0LgotIFNlY29uZCwgd2UgbmVlZCB0byB0ZWxsIGBoYXJtb255YCBhYm91dCB0aGUgY292YXJpYXRlcyB0byB1c2UgLSBgc2FtcGxlYCBhbmQgYHBhdGllbnRgLgpUbyBkbyB0aGlzLCB3ZSBwcm92aWRlIHR3byBhcmd1bWVudHM6CiAgLSBgbWV0YV9kYXRhYCwgYSBkYXRhIGZyYW1lIHRoYXQgY29udGFpbnMgY292YXJpYXRlcyBhY3Jvc3Mgc2FtcGxlcy4KICBXZSBjYW4gc2ltcGx5IHNwZWNpZnkgdGhlIFNDRSBgY29sRGF0YWAgaGVyZSBzaW5jZSBpdCBjb250YWlucyBgc2FtcGxlYCBhbmQgYHBhdGllbnRgIGNvbHVtbnMuCiAgLSBgdmFyc191c2VgLCBhIHZlY3RvciBvZiB3aGljaCBjb2x1bW4gbmFtZXMgaW4gYG1ldGFfZGF0YWAgc2hvdWxkIGFjdHVhbGx5IGJlIHVzZWQgYXMgY292YXJpYXRlcy4KICBPdGhlciBjb2x1bW5zIGluIGBtZXRhX2RhdGFgIHdoaWNoIGFyZSBub3QgaW4gYHZhcnNfdXNlYCBhcmUgaWdub3JlZC4KCkxldCdzIGdvIQoKYGBge3IgcnVuIGhhcm1vbnksIGxpdmUgPSBUUlVFfQojIFJ1biBoYXJtb255IGludGVncmF0aW9uCmhhcm1vbnlfcGNhIDwtIGhhcm1vbnk6OlJ1bkhhcm1vbnkoCiAgZGF0YV9tYXQgPSByZWR1Y2VkRGltKG1lcmdlZF9zY2UsICJtZXJnZWRfUENBIiksCiAgbWV0YV9kYXRhID0gY29sRGF0YShtZXJnZWRfc2NlKSwKICB2YXJzX3VzZSA9IGMoInNhbXBsZSIsICJwYXRpZW50IikKKQpgYGAKClRoZSByZXN1bHQgaXMgYSBQQ0EgbWF0cml4LgpMZXQncyBwcmludCBhIHN1YnNldCBvZiB0aGlzIG1hdHJpeCB0byBzZWUgaXQ6CgpgYGB7ciBwcmludCBoYXJtb255IHJlc3VsdCwgbGl2ZSA9IFRSVUV9CiMgUHJpbnQgdGhlIGhhcm1vbnkgcmVzdWx0Cmhhcm1vbnlfcGNhWzE6NSwgMTo1XQpgYGAKCkFzIHdlIGRpZCB3aXRoIGBmYXN0TU5OYCByZXN1bHRzLCBsZXQncyBzdG9yZSB0aGlzIFBDQSBtYXRyaXggZGlyZWN0bHkgaW4gb3VyIGBtZXJnZWRfc2NlYCBvYmplY3Qgd2l0aCBhbiBpbmZvcm1hdGl2ZSBuYW1lIHRoYXQgd29uJ3Qgb3ZlcndyaXRlIGFueSBvZiB0aGUgZXhpc3RpbmcgUENBIG1hdHJpY2VzLgpXZSdsbCBhbHNvIGNhbGN1bGF0ZSBVTUFQIGZyb20gaXQuCgpgYGB7ciBzYXZlIGhhcm1vbnksIGxpdmUgPSBUUlVFfQojIFN0b3JlIFBDQSBhcyBgaGFybW9ueV9QQ0FgCnJlZHVjZWREaW0obWVyZ2VkX3NjZSwgImhhcm1vbnlfUENBIikgPC0gaGFybW9ueV9wY2EKCiMgQXMgYmVmb3JlLCBjYWxjdWxhdGUgVU1BUCBvbiB0aGlzIFBDQSBtYXRyaXggd2l0aCBhcHByb3ByaWF0ZSBuYW1lcwptZXJnZWRfc2NlIDwtIHNjYXRlcjo6cnVuVU1BUChtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiaGFybW9ueV9QQ0EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgPSAiaGFybW9ueV9VTUFQIikKYGBgCgoKTGV0J3Mgc2VlIGhvdyB0aGUgYGhhcm1vbnlgIFVNQVAsIGNvbG9yZWQgYnkgc2FtcGxlLCBsb29rcyBjb21wYXJlZCB0byB0aGUgYGZhc3RNTk5gIFVNQVA6CgpgYGB7ciBwbG90IGhhcm1vbnkgdW1hcCBiYXRjaGVzfQpzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImhhcm1vbnlfVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAic2FtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gInNhbXBsZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICBnZ3RpdGxlKCJVTUFQIGFmdGVyIGludGVncmF0aW9uIHdpdGggaGFybW9ueSIpCmBgYAoKSG93IGRvIHlvdSB0aGluayB0aGlzIGBoYXJtb255YCBVTUFQIGNvbXBhcmVzIHRvIHRoYXQgZnJvbSBgZmFzdE1OTmAgaW50ZWdyYXRpb24/CgpMZXQncyBzZWUgaG93IHRoaXMgVU1BUCBsb29rcyBjb2xvcmVkIGJ5IGNlbGwgdHlwZSwgYW5kIGZhY2V0ZWQgZm9yIHZpc2liaWxpdHk6CgpgYGB7ciBwbG90IGhhcm1vbnkgdW1hcCBjZWxsdHlwZXN9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiaGFybW9ueV9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAjIFNwZWNpZnkgdmFyaWFibGUgZm9yIGZhY2V0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmllbGRzID0gInNhbXBsZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAiQnJvYWQgY2VsbHR5cGUiLCBuYS52YWx1ZSA9ICJncmV5ODAiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMpKSkgKwogIGdndGl0bGUoIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBoYXJtb255IikgKwogIGZhY2V0X3dyYXAodmFycyhzYW1wbGUpKQpgYGAKCldoYXQgZG8geW91IG5vdyBub3RpY2UgaW4gdGhpcyBmYWNldGVkIHZpZXcgdGhhdCB3YXNuJ3QgY2xlYXIgcHJldmlvdXNseT8KQXJlIHRoZXJlIG90aGVyIHBhdHRlcm5zIHlvdSBzZWUgdGhhdCBhcmUgc2ltaWxhciBvciBkaWZmZXJlbnQgZnJvbSB0aGUgYGZhc3RNTk5gIFVNQVA/CkhvdyBkbyB5b3UgdGhpbmsgYGZhc3RNTk5gIHZzLiBgaGFybW9ueWAgcGVyZm9ybWVkIGluIGludGVncmF0aW5nIHRoZXNlIHNhbXBsZXM/CgojIyMgRXhwb3J0CgpGaW5hbGx5LCB3ZSdsbCBleHBvcnQgdGhlIGZpbmFsIFNDRSBvYmplY3Qgd2l0aCBib3RoIGBmYXN0TU5OYCBhbmQgYGhhcm1vbnlgIGludGVncmF0aW9uIHRvIGEgZmlsZS4KU2luY2UgdGhpcyBvYmplY3QgaXMgdmVyeSBsYXJnZSAob3ZlciAxIEdCISksIHdlJ2xsIGV4cG9ydCBpdCB0byBhIGZpbGUgd2l0aCBzb21lIGNvbXByZXNzaW9uLCB3aGljaCwgaW4gdGhpcyBjYXNlLCB3aWxsIHJlZHVjZSB0aGUgZmluYWwgc2l6ZSB0byBhIHNtYWxsZXIgfjM2MCBNQi4KVGhpcyB3aWxsIHRha2UgYSBjb3VwbGUgbWludXRlcyB0byBzYXZlIHdoaWxlIGNvbXByZXNzaW9uIGlzIHBlcmZvcm1lZC4KCmBgYHtyIHNhdmUgaW50ZWdyYXRpb24sIGxpdmUgPSBUUlVFfQojIEV4cG9ydCB0byBSRFMgZmlsZSB3aXRoICJneiIgY29tcHJlc3Npb24KcmVhZHI6OndyaXRlX3JkcyhtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgIGludGVncmF0ZWRfc2NlX2ZpbGUsCiAgICAgICAgICAgICAgICAgY29tcHJlc3MgPSAiZ3oiKQpgYGAKCgojIyBQcmludCBzZXNzaW9uIGluZm8KCkFzIGFsd2F5cywgd2UnbGwgcHJpbnQgdGhlIHNlc3Npb24gaW5mbyB0byBiZSB0cmFuc3BhcmVudCBhYm91dCB3aGF0IHBhY2thZ2VzLCBhbmQgd2hpY2ggdmVyc2lvbnMsIHdlcmUgdXNlZCBkdXJpbmcgdGhpcyBSIHNlc3Npb24uCgpgYGB7ciBzZXNzaW9uaW5mb30Kc2Vzc2lvbkluZm8oKQpgYGAK
    +
    LS0tCnRpdGxlOiAiSW50ZWdyYXRpbmcgc2NSTkEtc2VxIGRhdGFzZXRzIgphdXRob3I6IERhdGEgTGFiIGZvciBBTFNGCmRhdGU6IDIwMjMKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUHJlcGFyZSBTQ0Ugb2JqZWN0cyBmb3IgaW50ZWdyYXRpb24KLSBBcHBseSBpbnRlZ3JhdGlvbiBtZXRob2RzIGluY2x1ZGluZyBgZmFzdE1OTmAgYW5kIGBoYXJtb255YAotIFZpc3VhbGx5IGV4cGxvcmUgdGhlIHJlc3VsdHMgb2YgaW50ZWdyYXRpb24KLSBVc2UgYHB1cnJyOjptYXAoKWAgZnVuY3Rpb25zIGZvciBpdGVyYXRpbmcgb3ZlciBsaXN0cwoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBwZXJmb3JtIGludGVncmF0aW9uIG9uIHNjUk5BLXNlcSBkYXRhc2V0cyBmcm9tIHRoZSBbU2luZ2xlLWNlbGwgUGVkaWF0cmljIENhbmNlciBBdGxhcyAoYFNjUENBYCldKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvKSwgYSBkYXRhYmFzZSBvZiB1bmlmb3JtbHktcHJvY2Vzc2VkIHBlZGlhdHJpYyBzY1JOQS1zZXEgZGF0YSBidWlsdCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgRGF0YSBMYWIuClRoZSBgU2NQQ0FgIGRhdGFiYXNlIGN1cnJlbnRseSBob3N0cyBzaW5nbGUtY2VsbCBwZWRpYXRyaWMgY2FuY2VyIHRyYW5zY3JpcHRvbWljIGRhdGEgZ2VuZXJhdGVkIGJ5IEFMU0YtZnVuZGVkIGxhYnMsIHdpdGggdGhlIGdvYWwgb2YgbWFraW5nIHRoaXMgZGF0YSBlYXNpbHkgYWNjZXNzaWJsZSB0byBpbnZlc3RpZ2F0b3JzIChsaWtlIHlvdSEpLgpUaGUgZXhwcmVzc2lvbiBkYXRhIGluIGBTY1BDQWAgd2VyZSBtYXBwaW5nIGFuZCBxdWFudGlmaWVkIHdpdGggW2BhbGV2aW4tZnJ5YF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTkyLTAyMi0wMTQwOC0zKSwgZm9sbG93ZWQgYnkgcHJvY2Vzc2luZyB3aXRoIEJpb2NvbmR1Y3RvciB0b29scyB1c2luZyB0aGUgc2FtZSBnZW5lcmFsIHByb2NlZHVyZXMgdGhhdCB3ZSBoYXZlIGNvdmVyZWQgaW4gdGhpcyB3b3Jrc2hvcC4KVGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUgdXNlZCBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgYW5kIGBtaVFDYCB0byBmaWx0ZXIgdGhlIHJhdyBjb3VudHMgbWF0cml4LCBgc2N1dHRsZWAgdG8gbG9nLW5vcm1hbGl6ZSB0aGUgY291bnRzLCBhbmQgYHNjYXRlcmAgZm9yIGRpbWVuc2lvbiByZWR1Y3Rpb24uClRoZSBwcm9jZXNzZWQgZGF0YSBhcmUgc3RvcmVkIGFzIGAucmRzYCBmaWxlcyBjb250YWluaW5nIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0cy4KWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaG93IGRhdGEgaW4gdGhlIGBTY1BDQWAgaXMgcHJvY2Vzc2VkIGluIFt0aGUgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uXShodHRwczovL3NjcGNhLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC8pLgoKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogSW50ZWdyYXRpb24gT3ZlcnZpZXddKGRpYWdyYW1zL3JvYWRtYXBfbXVsdGlfbWVyZ2UtaW50ZWdyYXRlLnBuZykKClRvIGxlYXJuIGFib3V0IGludGVncmF0aW9uLCB3ZSdsbCBoYXZlIGEgbG9vayBhdCBmb3VyIHNhbXBsZXMgZnJvbSB0aGUgW2BTQ1BDUDAwMDAwNWAgcHJvamVjdF0oaHR0cHM6Ly9zY3BjYS5hbGV4c2xlbW9uYWRlLm9yZy9wcm9qZWN0cy9TQ1BDUDAwMDAwNSkgKFtQYXRlbCBfZXQgYWwuXyAyMDIyXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMykpLCBhbiBpbnZlc3RpZ2F0aW9uIG9mIHBlZGlhdHJpYyBzb2xpZCB0dW1vcnMgbGVkIGJ5IHRoZSBbRHllcl0oaHR0cHM6Ly93d3cuc3RqdWRlLm9yZy9yZXNlYXJjaC9sYWJzL2R5ZXItbGFiLmh0bWwpIGFuZCBbQ2hlbl0oaHR0cHM6Ly93d3cuc3RqdWRlLm9yZy9yZXNlYXJjaC9sYWJzL2NoZW4tbGFiLXRhb3NoZW5nLmh0bWwpIGxhYnMgYXQgU3QuIEp1ZGUgQ2hpbGRyZW4ncyBSZXNlYXJjaCBIb3NwaXRhbC4KVGhlIHBhcnRpY3VsYXIgbGlicmFyaWVzIHdlJ2xsIGludGVncmF0ZSBjb21lIGZyb20gdHdvIHJoYWJkb215b3NhcmNvbWEgKFJNUykgcGF0aWVudHMsIHdpdGggdHdvIHNhbXBsZXMgZnJvbSBlYWNoIG9mIHR3byBwYXRpZW50cywgYWxsIHNlcXVlbmNlZCB3aXRoIDEweCBDaHJvbWl1bSB2MyB0ZWNobm9sb2d5LgpFYWNoIGxpYnJhcnkgaXMgZnJvbSBhIHNlcGFyYXRlIGJpb2xvZ2ljYWwgc2FtcGxlLgoKV2UnbGwgYmUgaW50ZWdyYXRpbmcgdGhlc2Ugc2FtcGxlcyB3aXRoIHR3byBkaWZmZXJlbnQgdG9vbHMsIFtgZmFzdE1OTmBdKGh0dHA6Ly93d3cuYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9iYXRjaGVsb3IuaHRtbCkgKFtIYWdodmVyZGkgX2V0IGFsLl8gMjAxOF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbmJ0LjQwOTEpKSBhbmQgW2BoYXJtb255YF0oaHR0cHM6Ly9wb3J0YWxzLmJyb2FkaW5zdGl0dXRlLm9yZy9oYXJtb255LykgKFtLb3JzdW5za3kgX2V0IGFsLl8gMjAxOV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTkyLTAxOS0wNjE5LTApKS4KSW50ZWdyYXRpb24gY29ycmVjdHMgZm9yIGJhdGNoIGVmZmVjdHMgdGhhdCBhcmlzZSBmcm9tIGRpZmZlcmVudCBsaWJyYXJ5IHByZXBhcmF0aW9ucywgZ2VuZXRpYyBiYWNrZ3JvdW5kcywgYW5kIG90aGVyIHNhbXBsZS1zcGVjaWZpYyBmYWN0b3JzLCBzbyB0aGF0IGRhdGFzZXRzIGNhbiBiZSBqb2ludGx5IGFuYWx5emVkIGF0IHRoZSBjZWxsIGxldmVsLgpgZmFzdE1OTmAgY29ycmVjdHMgZm9yIGJhdGNoIGVmZmVjdHMgdXNpbmcgYSBmYXN0ZXIgdmFyaWFudCBvZiB0aGUgbXV0dWFsLW5lYXJlc3QgbmVpZ2hib3JzIGFsZ29yaXRobSwgdGhlIHRlY2huaWNhbCBkZXRhaWxzIG9mIHdoaWNoIHlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBmcm9tIHRoaXMgW3ZpZ25ldHRlIGJ5IEx1biAoMjAxOSldKGh0dHBzOi8vbWFyaW9uaWxhYi5naXRodWIuaW8vRnVydGhlck1OTjIwMTgvdGhlb3J5L2Rlc2NyaXB0aW9uLmh0bWwpLgpgaGFybW9ueWAsIG9uIHRoZSBvdGhlciBoYW5kLCBjb3JyZWN0cyBmb3IgYmF0Y2ggZWZmZWN0cyB1c2luZyBhbiBpdGVyYXRpdmUgY2x1c3RlcmluZyBhcHByb2FjaCwgYW5kIHVubGlrZSBgZmFzdE1OTmAsIGl0IGlzIGFsc28gYWJsZSB0byBjb25zaWRlciBhZGRpdGlvbmFsIGNvdmFyaWF0ZXMgYmV5b25kIGp1c3QgdGhlIGJhdGNoIGdyb3VwaW5ncy4KClJlZ2FyZGxlc3Mgb2Ygd2hpY2ggaW50ZWdyYXRpb24gdG9vbCBpcyB1c2VkLCB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCAoU0NFKSBvYmplY3RzIGZpcnN0IG5lZWQgdG8gYmUgcmVmb3JtYXR0ZWQgYW5kIG1lcmdlZCBpbnRvIGEgc2luZ2xlICh1bmNvcnJlY3RlZCEpIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgY2VsbHMgZnJvbSBhbGwgc2FtcGxlcy4KVGhpcyBtZXJnZWQgU0NFIGNhbiB0aGVuIGJlIHVzZWQgZm9yIGludGVncmF0aW9uIHRvIG9idGFpbiBhIGZvcm1hbGx5IGJhdGNoLWNvcnJlY3RlZCBTQ0Ugb2JqZWN0LgoKCiMjIFNldCB1cAoKYGBge3Igc2V0dXB9CiMgTG9hZCBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKSAgIyBwbG90dGluZyB0b29scwpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KSAjIHdvcmsgd2l0aCBTQ0Ugb2JqZWN0cwoKIyBTZXQgdGhlIHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgxMjM0NSkKYGBgCgoKIyMjIERlZmluZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMKCgpXZSBoYXZlIGFscmVhZHkgcHJlcGFyZWQgY291bnQgZGF0YSBmb3IgdGhlIGZvdXIgc2FtcGxlcyB3ZSdsbCBiZSBpbnRlZ3JhdGluZyAoaS5lLiwgZmlsdGVyZWQgY2VsbHMsIG5vcm1hbGl6ZWQgY291bnRzLCBhbmQgY2FsY3VsYXRlZCBQQ0EgJiBVTUFQKS4KVGhlc2UgU0NFIG9iamVjdHMsIHN0b3JlZCBhcyBSRFMgZmlsZXMsIGFyZSBhdmFpbGFibGUgaW4gdGhlIGBkYXRhL3Jtcy9wcm9jZXNzZWQvYCBkaXJlY3RvcnkgYW5kIGFyZSBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlaXIgYFNjUENBYCBsaWJyYXJ5IGlkcyA6CgotIGBTQ1BDTDAwMDQ3OS5yZHNgIChQYXRpZW50IEEpCi0gYFNDUENMMDAwNDgwLnJkc2AgKFBhdGllbnQgQSkKLSBgU0NQQ0wwMDA0ODEucmRzYCAoUGF0aWVudCBCKQotIGBTQ1BDTDAwMDQ4Mi5yZHNgIChQYXRpZW50IEIpCgpCb3RoIFBhdGllbnQgQSAoMTggeWVhciBvbGQgbWFsZSkgYW5kIFBhdGllbnQgQiAoNCB5ZWFyIG9sZCBmZW1hbGUpIGhhZCByZWN1cnJlbnQgZW1icnlvbmFsIHJoYWJkb215b3NhcmNvbWEgd2hlbiBzYW1wbGVzIHdlcmUgdGFrZW4uCgpUbyBiZWdpbiwgbGV0J3Mgc2V0IHVwIG91ciBkaXJlY3RvcmllcyBhbmQgZmlsZXM6CgpgYGB7ciBkaXJlY3Rvcmllc30KIyBEZWZpbmUgZGlyZWN0b3J5IHdoZXJlIHByb2Nlc3NlZCBTQ0Ugb2JqZWN0cyB0byBiZSBpbnRlZ3JhdGVkIGFyZSBzdG9yZWQKaW5wdXRfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiLCAicHJvY2Vzc2VkIikKCiMgRGVmaW5lIGRpcmVjdG9yeSB0byBzYXZlIGludGVncmF0ZWQgU0NFIG9iamVjdCB0bwpvdXRwdXRfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiLCAiaW50ZWdyYXRlZCIpCgojIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKZnM6OmRpcl9jcmVhdGUob3V0cHV0X2RpcikKCiMgRGVmaW5lIG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBpbnRlZ3JhdGVkIG9iamVjdAppbnRlZ3JhdGVkX3NjZV9maWxlIDwtIGZpbGUucGF0aChvdXRwdXRfZGlyLCAicm1zX2ludGVncmF0ZWRfc3Vic2V0LnJkcyIpCmBgYAoKCldlIGNhbiB1c2UgdGhlIGBkaXIoKWAgZnVuY3Rpb24gdG8gbGlzdCBhbGwgY29udGVudHMgb2YgYSBnaXZlbiBkaXJlY3RvcnksIGZvciBleGFtcGxlIHRvIHNlZSBhbGwgdGhlIGZpbGVzIGluIG91ciBgaW5wdXRfZGlyYDoKCmBgYHtyIGlucHV0IGRpciwgbGl2ZSA9IFRSVUV9CmRpcihpbnB1dF9kaXIpCmBgYAoKV2Ugd2FudCB0byByZWFkIGluIGp1c3QgZm91ciBvZiB0aGVzZSBmaWxlcywgYXMgbGlzdGVkIHByZXZpb3VzbHkuClRvIHJlYWQgaW4gdGhlc2UgZmlsZXMsIHdlIGNvdWxkIHVzZSB0aGUgYHJlYWRyOjpyZWFkX3JkcygpYCBmdW5jdGlvbiAob3IgdGhlIGJhc2UgUiBgcmVhZFJEUygpYCkgZm91ciB0aW1lcywgb25jZSBmb3IgZWFjaCBvZiB0aGUgZmlsZXMuCldlIGNvdWxkIGFsc28gdXNlIGEgYGZvcmAgbG9vcCwgd2hpY2ggaXMgdGhlIGFwcHJvYWNoIHRoYXQgbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMgd291bGQgbGVhbiB0b3dhcmQuCkEgZGlmZmVyZW50IGFuZCBtb3JlIG1vZHVsYXIgY29kaW5nIGFwcHJvYWNoIHRvIHJlYWRpbmcgaW4gdGhlc2UgZmlsZXMgKGFuZCBtb3JlISkgaXMgdG8gbGV2ZXJhZ2UgdGhlIFtgcHVycnJgXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvKSBgdGlkeXZlcnNlYCBwYWNrYWdlLCB3aGljaCBwcm92aWRlcyBhIGNvbnZlbmllbnQgc2V0IG9mIGZ1bmN0aW9ucyBmb3Igb3BlcmF0aW5nIG9uIGxpc3RzLgpZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCB0aGUgYHB1cnJyYCBmdW5jdGlvbnMgYW5kIHRoZWlyIHBvd2VyIGFuZCB1dGlsaXR5IGluIFIgaW4gW3RoZSAiRnVuY3Rpb25hbHMiIGNoYXB0ZXIgb2YgdGhlIF9BZHZhbmNlZCBSXyBlLWJvb2tdKGh0dHBzOi8vYWR2LXIuaGFkbGV5Lm56L2Z1bmN0aW9uYWxzLmh0bWwpLgoKT2YgcGFydGljdWxhciBpbnRlcmVzdCBpcyB0aGUgW2BwdXJycjo6bWFwKClgXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL21hcC5odG1sKSBmYW1pbHkgb2YgZnVuY3Rpb25zLCB3aGljaCBjYW4gYmUgdXNlZCB0byBydW4gYSBnaXZlbiBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQgb2YgYSBsaXN0IChvciB2ZWN0b3IpIGluIG9uZSBjYWxsLgpUaGUgZ2VuZXJhbCBzeW50YXggZm9yIGBwdXJycjo6bWFwKClgIGFuZCBmcmllbmRzIGlzOgoKYGBgCiMgU3ludGF4IGZvciB1c2luZyB0aGUgbWFwIGZ1bmN0aW9uOgpwdXJycjo6bWFwKDxpbnB1dCBsaXN0IG9yIHZlY3Rvcj4sCiAgICAgICAgICAgPGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggaXRlbSBpbiB0aGUgaW5wdXQ+LAogICAgICAgICAgIDxhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uIGNhbiBnbyBoZXJlPiwKICAgICAgICAgICA8YW5kIGFsc28gaGVyZSBpZiB0aGVyZSBhcmUgZXZlbiBtb3JlIGFyZ3VtZW50cywgYW5kIHNvIG9uPikKYGBgCgoKVGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgYHB1cnJyOjptYXAoKWAgaXMgYWx3YXlzIGEgbGlzdCAoYnV0IG5vdGUgdGhhdCB0aGVyZSBhcmUgb3RoZXIgYHB1cnJyOjptYXAoKWAgcmVsYXRpdmVzIHdoaWNoIHJldHVybiBvdGhlciBvYmplY3QgdHlwZXMsIGFzIHlvdSBjYW4gcmVhZCBhYm91dCBpbiBbdGhlIGBwdXJycjo6bWFwKClgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcHVycnIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvaW5kZXguaHRtbCkpLgpJZiB0aGlzIGNvbmNlcHQgc291bmRzIGEgbGl0dGxlIGZhbWlsaWFyIHRvIHlvdSwgdGhhdCdzIGJlY2F1c2UgaXQgcHJvYmFibHkgaXMhCkJhc2UgUidzIGBsYXBwbHkoKWAgZnVuY3Rpb24gY2FuIHByb3ZpZGUgc2ltaWxhciB1dGlsaXR5LCBhbmQgdGhlIGBwdXJycjo6bWFwKClgIGZhbWlseSBvZiBmdW5jdGlvbnMgY2FuIChpbiBwYXJ0KSBiZSB0aG91Z2h0IG9mIGFzIGFuIGFsdGVybmF0aXZlIHRvIHNvbWUgb2YgdGhlIGJhc2UgUiBgYXBwbHlgIGZ1bmN0aW9ucywgd2l0aCBtb3JlIGNvbnNpc3RlbnQgYmVoYXZpb3IuCgpMZXQncyBzZWUgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIG9mIGBwdXJycjo6bWFwKClgIGluIGFjdGlvbiwgaW5zcGlyZWQgYnkgY2FuY2VyIGdyb3VwcyB0aGUgRGF0YSBMYWIgaGFzIGFuYWx5emVkIHRocm91Z2ggdGhlIFtPcGVuUEJUQV0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvKSBwcm9qZWN0OgoKYGBge3IgbWFwIGV4YW1wbGV9CiMgRGVmaW5lIGEgbGlzdCBvZiBjYW5jZXIgaGlzdG9sb2dpZXMKaGlzdG9sb2dpZXMgPC0gbGlzdCgKICAibG93LWdyYWRlIGdsaW9tYXMiICA9IGMoIlNFR0EiLCAiUEEiLCAiR05HIiwgIlBYQSIpLAogICJoaWdoLWdyYWRlIGdsaW9tYXMiID0gYygiRE1HIiwgIkRJUEciKSwKICAiZW1icnlvbmFsIHR1bW9ycyIgICA9IGMoIk1CIiwgIkFUUlQiLCAiRVRNUiIpCiApCgojIFRoZSBvdmVyYWxsIGxlbmd0aCBvZiB0aGUgbGlzdCBpcyAzCmxlbmd0aChoaXN0b2xvZ2llcykKCiMgSG93IGNhbiB3ZSBydW4gYGxlbmd0aCgpYCBvbiBlYWNoIGl0ZW0gb2YgdGhlIGxpc3Q/CiMgV2UgY2FuIHVzZSBvdXIgbmV3IGZyaWVuZCBwdXJycjo6bWFwKCk6CnB1cnJyOjptYXAoaGlzdG9sb2dpZXMsIGxlbmd0aCkKYGBgCgpMZXQncyB1c2UgYHB1cnJyOjptYXAoKWAgdG8gcmVhZCBpbiBvdXIgU0NFIG9iamVjdHMgc28gdGhhdCB0aGV5IGFyZSBpbW1lZGlhdGVseSBzdG9yZWQgdG9nZXRoZXIgaW4gYSBsaXN0LgoKCldlJ2xsIGZpcnN0IG5lZWQgdG8gZGVmaW5lIGEgdmVjdG9yIG9mIHRoZSBmaWxlIHBhdGhzIHRvIHJlYWQgaW4uCldlJ2xsIHN0YXJ0IGJ5IGNyZWF0aW5nIGEgdmVjdG9yIG9mIHNhbXBsZSBuYW1lcyB0aGVtc2VsdmVzIGFuZCB0aGVuIGZvcm1hdHRpbmcgdGhlbSBpbnRvIHRoZSBjb3JyZWN0IHBhdGhzLgpUaGlzIHdheSAoZm9yZXNoYWRvd2luZyEpIHdlIGFsc28gaGF2ZSBhIHN0YW5kLWFsb25lIHZlY3RvciBvZiBqdXN0IHNhbXBsZSBuYW1lcywgd2hpY2ggd2lsbCBjb21lIGluIGhhbmR5IQoKYGBge3Igc2FtcGxlIG5hbWVzfQojIFZlY3RvciBvZiBhbGwgdGhlIHNhbXBsZXMgdG8gcmVhZCBpbjoKc2FtcGxlX25hbWVzIDwtIGMoIlNDUENMMDAwNDc5IiwKICAgICAgICAgICAgICAgICAgIlNDUENMMDAwNDgwIiwKICAgICAgICAgICAgICAgICAgIlNDUENMMDAwNDgxIiwKICAgICAgICAgICAgICAgICAgIlNDUENMMDAwNDgyIikKYGBgCgoKYGBge3IgZGVmaW5lIHNjZV9wYXRocywgbGl2ZSA9IFRSVUV9CiMgTm93LCBjb252ZXJ0IHRoZXNlIHRvIGZpbGUgcGF0aHM6IDxpbnB1dF9kaXI+LzxzYW1wbGVfbmFtZT4ucmRzCnNjZV9wYXRocyA8LSBmaWxlLnBhdGgoaW5wdXRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgIGdsdWU6OmdsdWUoIntzYW1wbGVfbmFtZXN9LnJkcyIpCikKIyBQcmludCB0aGUgc2NlX3BhdGhzIHZlY3RvcgpzY2VfcGF0aHMKYGBgCgpMZXQncyBtYWtlIHRoaXMgYSBuYW1lZCB2ZWN0b3IgdXNpbmcgdGhlIHNhbXBsZSBuYW1lcy4KVGhpcyB3aWxsIGhlbHAgdXMga2VlcCB0cmFjayBvZiB3aGljaCBvYmplY3RzIGFyZSB3aGljaCBhZnRlciB3ZSByZWFkIHRoZSBTQ0Ugb2JqZWN0cyBpbjoKCmBgYHtyIGFkZCBsaXN0IG5hbWVzLCBsaXZlID0gVFJVRX0KIyBBc3NpZ24gdGhlIHNhbXBsZSBuYW1lcyBhcyB0aGUgbmFtZXMgZm9yIHNjZV9wYXRocwpuYW1lcyhzY2VfcGF0aHMpIDwtIHNhbXBsZV9uYW1lcwpgYGAKCldlIGNhbiBub3cgcmVhZCB0aGVzZSBmaWxlcyBpbiBhbmQgY3JlYXRlIGEgbGlzdCBvZiBmb3VyIFNDRSBvYmplY3RzLiAKU2luY2UgYHJlYWRyOjpyZWFkX3JkcygpYCBjYW4gb25seSBvcGVyYXRlIG9uIG9uZSBpbnB1dCBhdCBhIHRpbWUsIHdlJ2xsIG5lZWQgdG8gdXNlIGBwdXJycjo6bWFwKClgIHRvIHJ1biBpdCBvbiBhbGwgaW5wdXQgZmlsZSBwYXRocyBpbiBvbmUgY29tbWFuZC4KQWx0aG91Z2ggYHNjZV9wYXRoc2AgaXMgYSB2ZWN0b3IgKG5vdCBhIGxpc3QpLCBpdCB3aWxsIHN0aWxsIHdvcmsgYXMgaW5wdXQgdG8gYHB1cnJyOm1hcCgpYC4KVGhlIG91dHB1dCBmcm9tIHRoaXMgY29kZSB3aWxsIHN0aWxsIGJlIGEgbGlzdCwgc2luY2UgdGhhdCdzIHdoYXQgYHB1cnJyOjptYXAoKWAgYWx3YXlzIHJldHVybnMsIGFuZCBpdCB3aWxsIHJldGFpbiB0aGUgc2FtcGxlIG5hbWVzIGFzIHRoZSBsaXN0IG5hbWVzIGZvciBjb252ZW5pZW50IGJvb2trZWVwaW5nOgoKYGBge3IgcmVhZCBzY2UgcGF0aHMsIGxpdmUgPSBUUlVFfQojIFVzZSBwdXJycjo6bWFwKCkgdG8gcmVhZCBhbGwgZmlsZXMgaW50byBhIGxpc3QgYXQgb25jZQpzY2VfbGlzdCA8LSBwdXJycjo6bWFwKAogIHNjZV9wYXRocywKICByZWFkcjo6cmVhZF9yZHMKKQpgYGAKCkxldCdzIGhhdmUgYSBsb29rIGF0IG91ciBuYW1lZCBsaXN0IG9mIFNDRSBvYmplY3RzOgoKYGBge3IgcHJpbnQgc2NlIGxpc3QsIGxpdmU9VFJVRX0KIyBQcmludCBzY2VfbGlzdApzY2VfbGlzdApgYGAKCklmIHlvdSBsb29rIGNsb3NlbHkgYXQgdGhlIHByaW50ZWQgU0NFIG9iamVjdHMsIHlvdSBtYXkgbm90aWNlIHRoYXQgdGhleSBhbGwgY29udGFpbiBgY29sRGF0YWAgdGFibGUgY29sdW1ucyBgY2VsbHR5cGVfZmluZWAgYW5kIGBjZWxsdHlwZV9icm9hZGAuClRoZXNlIGNvbHVtbnMgKHdoaWNoIHdlIGFkZGVkIHRvIFNDRSBvYmplY3RzIGR1cmluZyBbcHJlLXByb2Nlc3NpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL3RyYWluaW5nLW1vZHVsZXMvdHJlZS9tYXN0ZXIvc2NSTkEtc2VxLWFkdmFuY2VkL3NldHVwL3JtcykpIGNvbnRhaW4gcHV0YXRpdmUgY2VsbCB0eXBlIGFubm90YXRpb25zIGFzIGFzc2lnbmVkIGJ5IFtQYXRlbCBfZXQgYWwuXyAoMjAyMildKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2ouZGV2Y2VsLjIwMjIuMDQuMDAzKToKCgo+IEZvciBlYWNoIGNlbGwgc3Vic2V0IGlkZW50aWZpZWQgYnkgY2x1c3RlcmluZywgd2UgdXNlZCBhIGNvbWJpbmF0aW9uIG9mIGBTaW5nbGVSYCB2ZXJzaW9uIDEuMC4xIChbQXJhbiBldCBhbC4sIDIwMTldKGh0dHBzOi8vd3d3Lm5hdHVyZS5jb20vYXJ0aWNsZXMvczQxNTkwLTAxOC0wMjc2LXkpKSBhbmQgbWFudWFsIGluc3BlY3Rpb24gb2YgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIHRvIGFubm90YXRlIHdoZXRoZXIgYSBjbHVzdGVyIGJlbG9uZ3MgdG8gc3Ryb21hbCwgaW1tdW5lIG9yIG1hbGlnbmFudCBzdWJwb3B1bGF0aW9ucy4gCk1hbGlnbmFudCBjZWxscyB3ZXJlIGNvbmZpcm1lZCBpbiBwYXRpZW50IHR1bW9yIGRhdGEgYnkgaW5mZXJlbmNlIG9mIGNvcHktbnVtYmVyIHZhcmlhdGlvbiB1c2luZyBgaW5mZXJDTlZgIHZlcnNpb24gMS4xLjMgb2YgdGhlIFRyaW5pdHlDVEFUIFByb2plY3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9icm9hZGluc3RpdHV0ZS9pbmZlcmNudikuIAoKV2Ugd2lsbCBlbmQgdXAgbGV2ZXJhZ2luZyB0aGVzZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgdG8gZXhwbG9yZSB0aGUgaW50ZWdyYXRpb24gcmVzdWx0czsgYWZ0ZXIgaW50ZWdyYXRpb24sIHdlIGV4cGVjdCBjZWxsIHR5cGVzIGZyb20gZGlmZmVyZW50IHNhbXBsZXMgdG8gZ3JvdXAgdG9nZXRoZXIsIHJhdGhlciB0aGFuIGJlaW5nIHNlcGFyYXRlZCBieSBiYXRjaGVzLiAKClRoYXQgc2FpZCwgdGhlIGludGVncmF0aW9uIG1ldGhvZHMgd2Ugd2lsbCBiZSBhcHBseWluZyBfZG8gbm90IGFjdHVhbGx5IHVzZV8gYW55IGV4aXN0aW5nIGNlbGwgdHlwZSBhbm5vdGF0aW9ucy4KSWYgd2UgaGF2ZSBhbm5vdGF0aW9ucywgdGhleSBhcmUgYSBoZWxwZnVsICJib251cyIgZm9yIGFzc2Vzc2luZyB0aGUgaW50ZWdyYXRpb24ncyBwZXJmb3JtYW5jZSwgYnV0IHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBpbnRlZ3JhdGlvbiBpdHNlbGYuCgoKIyMgTWVyZ2UgdGhlIFNDRSBsaXN0IGludG8gb25lIG9iamVjdAoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBNZXJnZV0oZGlhZ3JhbXMvcm9hZG1hcF9tdWx0aV9tZXJnZS5wbmcpCgoKTm93IHRoYXQgd2UgaGF2ZSBhIGxpc3Qgb2YgcHJvY2Vzc2VkIFNDRSBvYmplY3RzLCB3ZSBuZWVkIHRvIG1lcmdlIHRoZSBvYmplY3RzIGludG8gb25lIG92ZXJhbGwgU0NFIG9iamVjdCBmb3IgaW5wdXQgdG8gaW50ZWdyYXRpb24uCkEgd29yZCBvZiBjYXV0aW9uIGJlZm9yZSB3ZSBiZWdpbjogKipUaGlzIG1lcmdlZCBTQ0Ugb2JqZWN0IGlzIE5PVCBhbiBpbnRlZ3JhdGVkIFNDRSEqKgpNZXJnaW5nIFNDRXMgZG9lcyBub3QgcGVyZm9ybSBhbnkgYmF0Y2ggY29ycmVjdGlvbiwgYnV0IGp1c3QgcmVvcmdhbml6ZXMgdGhlIGRhdGEgdG8gYWxsb3cgdXMgdG8gcHJvY2VlZCB0byBpbnRlZ3JhdGlvbiBuZXh0LgoKVG8gbWVyZ2UgU0NFIG9iamVjdHMsIHdlIGRvIG5lZWQgdG8gZG8gc29tZSB3cmFuZ2xpbmcgYW5kIGJvb2trZWVwaW5nIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFuZCB0aGF0IHdlIGRvbid0IGxvc2UgaW1wb3J0YW50IGluZm9ybWF0aW9uLgpPdmVyYWxsLCB3ZSdsbCB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0OgoKMS4gQWxsIG9iamVjdHMgaGF2ZSBjb21wYXRpYmxlIGRpbWVuc2lvbnMuClRoaXMgbWVhbnMgdGhhdCBhbGwgb2JqZWN0cyBzaG91bGQuLi4KICAgICsgSGF2ZSB0aGUgc2FtZSBnZW5lcyAoYWthIHJvdyBuYW1lcyksIGluIHRoZSBzYW1lIG9yZGVyCiAgICArIEhhdmUgdGhlIHNhbWUgYGNvbERhdGFgIHNsb3QgY29sdW1ucywgaW4gdGhlIHNhbWUgb3JkZXIKICAgICsgSGF2ZSB0aGUgc2FtZSBhc3NheXMKMi4gQWZ0ZXIgbWVyZ2luZywgd2UnbGwgc3RpbGwgYmUgYWJsZSB0byBpZGVudGlmeSB3aGljaCBzYW1wbGUgZGlmZmVyZW50IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBjYW1lIGZyb20KQXMgd2Ugc2F3IGluIHRoZSBzbGlkZXMsIHRoaXMgbWVhbnMgd2UnbGwgaGF2ZSB0by4uLgogICAgKyBBdHRhY2ggc2FtcGxlIG5hbWVzIHRvIHRoZSBiYXJjb2RlcyAoYWthIGNvbHVtbiBuYW1lcykKICAgIFRoaXMgYWxzbyBlbnN1cmVzIHRoYXQgY29sdW1uIG5hbWVzIGFyZSB1bmlxdWU7IHdoaWxlIGEgc2luZ2xlIHNhbXBsZSAobGlicmFyeSkgaXMgZ3VhcmFudGVlZCB0byBoYXZlIHVuaXF1ZSBiYXJjb2RlcywgdGVjaG5pY2FsbHkgdGhleSBjYW4gYmUgcmVwZWF0ZWQgYWNyb3NzIHNhbXBsZXMhCiAgICArIEF0dGFjaCBzYW1wbGUgbmFtZXMgdG8gYHJvd0RhdGFgIHNsb3QgY29sdW1uIG5hbWVzIGFuZCBgbWV0YWRhdGFgIGZpZWxkIG5hbWVzIChpZiB5b3UgY2FyZSB0byBrZWVwIHRoaXMgaW5mb3JtYXRpb24gYXJvdW5kIC0gdG9kYXksIHdlIHdpbGwhKQogICAgKyBBZGQgYSBuZXcgY29sdW1uIGluZGljYXRpbmcgdGhlIHNhbXBsZSB0byB0aGUgYGNvbERhdGFgIHNsb3QKCldlJ2xsIGFwcHJvYWNoIHRoaXMgbWVyZ2UgaW4gdHdvIHBhcnRzOgoKKyBGaXJzdCwgd2UnbGwgdGFrZSBzb21lIHRpbWUgdG8gdGhvcm91Z2hseSBleHBsb3JlIHRoZSBvdXIgU0NFIG9iamVjdHMgdG8gZGV0ZXJtaW5lIHdoYXQgd3JhbmdsaW5nIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBhbGwgdGhlIG9iamVjdHMgX2NvbXBhdGlibGVfIGZvciBtZXJnaW5nCisgVGhlbiwgd2UnbGwgd3JpdGUgKG9rLCB3ZSd2ZSB3cml0dGVuIGl0IGZvciB5b3UpIGEgX2N1c3RvbSBmdW5jdGlvbl8gdG8gZm9ybWF0IGVhY2ggU0NFIG9iamVjdCBmb3IgbWVyZ2luZywgaW5jbHVkaW5nOgogICAgKyBNYWtpbmcgYW55IGNoYW5nZXMgdG8gZW5zdXJlIG9iamVjdHMgYXJlIGNvbXBhdGlibGUKICAgICsgQWRkaW5nIGluIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uIHNvIHdlIGtub3cgd2hpY2ggc2FtcGxlIHRoZSBjZWxscyBhbmQgb3RoZXIgbWV0YWRhdGEgY2FtZSBmcm9tIAogICAgKyBSZW1vdmluZyB0aGUgZXhpc3RpbmcgcmVkdWNlZCBkaW1lbnNpb24gbWF0cmljZXMgKFBDQSBhbmQgVU1BUCkuCiAgICBUaGlzIGlzIGJlY2F1c2Ugd2UnbGwgd2FudCB0byByZWNhbGN1bGF0ZSB0aGVzZSBtYXRyaWNlcyBvbiB0aGUgbWVyZ2VkIG9iamVjdHMsIHRha2luZyBiYXRjaCBpbnRvIGFjY291bnQKCldoZW4gbWVyZ2luZyBvYmplY3RzIG9uIHlvdXIgb3duLCBkb24ndCBza2lwIHRoZXNlIGRhdGEgZXhwbG9yYXRpb24gc3RlcHMhClRoZSBzdGVwcyB3ZSB0YWtlIHRvIHByZXBhcmUgb3VyIFNDRXMgd2lsbCBwcm9iYWJseSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgc3RlcHMgeW91IG5lZWQgdG8gdGFrZSB3aXRoIG90aGVyIFNDRXMsIGFuZCBvbmx5IGJ5IGNhcmVmdWxseSBleHBsb3JpbmcgdGhlIG9iamVjdHMgY2FuIHlvdSBmaWd1cmUgb3V0IHdoYXQgc3RlcHMgeW91J2xsIG5lZWQgdG8gdGFrZSB0byBtZWV0IGFsbCBvZiBvdXIgY29uZGl0aW9ucy4KCgojIyMgUHJlcGFyZSB0byBtZXJnZSBTQ0VzCgojIyMjIENyZWF0ZSB1bmlxdWUgY2VsbCBpZGVudGlmaWVycwoKQXMgcGFydCBvZiB0aGUgY3VzdG9tIGZ1bmN0aW9uIHdlJ2xsIHdyaXRlLCB3ZSdsbCBpbmNsdWRlIGEgc3RlcCB0byBjcmVhdGUgdW5pcXVlIGNlbGwgaWRlbnRpZmllcnMgYnkgYXR0YWNoaW5nIHNhbXBsZSBuYW1lcyB0byB0aGUgU0NFIGNvbHVtbiBuYW1lcyAoY2VsbCBiYXJjb2RlcykuCkZvciBleGFtcGxlLCB3ZSB3b3VsZCB1cGRhdGUgdGhlIGNvbHVtbiBuYW1lIGZvciBhIGNlbGwgZnJvbSBgU2FtcGxlMWAgd2l0aCB0aGUgYmFyY29kZSBgQUNHVGAgdG8gYFNhbXBsZTEtQUNHVGAuCgpXaGVuIG1lcmdpbmcsIHRoZXJlIGNhbid0IGJlIGFueSBkdXBsaWNhdGUgY29sdW1uIG5hbWVzIChiYXJjb2RlcykgYWNyb3NzIF9hbGxfIHRoZSBvYmplY3RzIG9yIFIgd2lsbCB0aHJvdyBhbiBlcnJvci4KV2hpbGUgeW91J3JlIGd1YXJhbnRlZWQgdG8gaGF2ZSB1bmlxdWUgYmFyY29kZXMgaW4gYSBnaXZlbiBTQ0Ugb2JqZWN0LCB0aGVyZSBpcyBfbm8gZ3VhcmFudGVlXyB0aGF0IHRoZXkgYXJlIHVuaXF1ZSBhY3Jvc3MgbXVsdGlwbGUgc2FtcGxlcyAtIGl0IGlzIGFic29sdXRlbHkgcG9zc2libGUgdG8gaGF2ZSBjZWxscyBmcm9tIHR3byBkaWZmZXJlbnQgc2FtcGxlcyBzaGFyZSB0aGUgc2FtZSBiYXJjb2RlIChhbmQgd2UndmUgc2VlbiBpdCBoYXBwZW4hKS4KCkFkZGluZyB0aGUgc2FtcGxlIGlkIHRvIHRoZSBjb2x1bW4gbmFtZXMgKGJhcmNvZGVzKSBpcyB0aGVyZWZvcmUgYSBjcnVjaWFsIHN0ZXAgaW4gb3VyIG1lcmdpbmcgYm9va2tlZXBpbmcuCgoKIyMjIyBFeHBsb3JlIHRoZSBTQ0Ugb2JqZWN0cwoKIyMjIyMgQ2hlY2sgdGhlIGdlbmVzCgpGaXJzdCwgd2UnbGwgY29tcGFyZSB0aGUgb2JqZWN0J3MgZ2VuZXMgKGFrYSwgdGhlaXIgcm93IG5hbWVzKS4KV2UgY2FuIHVzZSBzb21lIGBwdXJycmAgbWFnaWMgdG8gaGVscCB1cyBmaW5kIHRoZSBzZXQgb2Ygc2hhcmVkIGdlbmVzIGFtb25nIGFsbCBvYmplY3RzOgoKYGBge3Igc2hhcmVkIGdlbmVzfQojIERlZmluZSB2ZWN0b3Igb2Ygc2hhcmVkIGdlbmVzCnNoYXJlZF9nZW5lcyA8LSBzY2VfbGlzdCB8PgogICMgZ2V0IHJvd25hbWVzIChnZW5lcykgZm9yIGVhY2ggU0NFIGluIHNjZV9saXN0CiAgcHVycnI6Om1hcChyb3duYW1lcykgfD4KICAjIHJlZHVjZSB0byB0aGUgX2ludGVyc2VjdGlvbl8gYW1vbmcgbGlzdHMKICBwdXJycjo6cmVkdWNlKGludGVyc2VjdCkKCiMgSG93IG1hbnkgc2hhcmVkIGdlbmVzIGFyZSB0aGVyZT8KbGVuZ3RoKHNoYXJlZF9nZW5lcykKYGBgCgpUaGF0J3MgcXVpdGUgYSBsb3QhCkluIGZhY3QsIGJlY2F1c2UgdGhlc2Ugb2JqZWN0cyB3ZXJlIGFsbCB1bmlmb3JtbHkgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIHdvcmtmbG93ICh3aGljaCBkaWQgbm90IGZpbHRlciBvdXQgYW55IGdlbmVzISksIHdlIGV4cGVjdCB0aGVtIHRvIGFsbCBoYXZlIHRoZSBzYW1lIGdlbmVzLgpXZSBjYW4gbWFwIG92ZXIgdGhlIGxpc3QgdG8gY29uZmlybSB0aGF0IGluZGVlZCwgdGhleSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIChnZW5lcyk6CgoKYGBge3IgY2hlY2sgc2hhcmVkIGdlbmVzLCBsaXZlID0gVFJVRX0KIyBUaGUgbnVtYmVyIG9mIGdlbmVzIGluIGFuIFNDRSBjb3JyZXNwb25kcyB0byBpdHMgbnVtYmVyIG9mIHJvd3M6CnNjZV9saXN0IHw+CiAgcHVycnI6Om1hcChucm93KQpgYGAKCkV2ZW4gdGhvdWdoIHdlIGtub3cgdGhlIGdlbmVzIGFscmVhZHkgbWF0Y2gsIHdlIG5lZWQgdG8gYWxzbyBiZSBzdXJlIHRoZXkgYXJlIGluIHRoZSBzYW1lIF9vcmRlcl8gYW1vbmcgYWxsIG9iamVjdHMuClNvLCB3ZSdsbCBob2xkIG9udG8gdGhhdCBgc2hhcmVkX2dlbmVzYCB2YXJpYWJsZSB3ZSBkZWZpbmVkIGFuZCB1c2UgaXQgc29vbiBpbiBvdXIgY3VzdG9tIGZvcm1hdHRpbmcgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIGFsbCBvYmplY3RzIGZ1bGx5IG1hdGNoLgoKSXQncyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgaW50ZXJzZWN0aW9uIGlzbid0IHRoZSBvbmx5IG9wdGlvbiBoZXJlLCB0aG91Z2ghClVzaW5nIHRoZSBpbnRlcnNlY3Rpb24gbWVhbnMgYSBsb3Qgb2YgZ2VuZXMgd2lsbCBnZXQgZGlzY2FyZGVkIGlmIHRoZSBvYmplY3RzIGhhdmUgZGlmZmVyZW50IGdlbmVzLgpXZSBjb3VsZCBpbnN0ZWFkIHRha2UgdGhlIF91bmlvbl8gb2YgZ2VuZXMgc28gbm90aGluZyBnZXRzIHRocm93biBvdXQuCkluIHRoaXMgY2FzZSwgeW91J2QgbmVlZCB0byBjcmVhdGUgImR1bW15IiBhc3NheSByb3dzIGZvciBnZW5lcyB0aGF0IGEgZ2l2ZW4gU0NFIGRvZXNuJ3QgaGF2ZSBhbmQgZmlsbCBpdCB3aXRoIGBOQWAgZXhwcmVzc2lvbiB2YWx1ZXMuCllvdSdsbCBzdGlsbCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgU0NFcyBoYXZlIHRoZSBzYW1lIHJvd3MgaW4gdGhlIHNhbWUgb3JkZXIgYmVmb3JlIG1lcmdpbmcsIHNvIHlvdSBtYXkgbmVlZCB0byBkbyBhIGRlY2VudCBiaXQgb2YgbWF0cml4IHdyYW5nbGluZy4KCiMjIyMjIENoZWNrIHRoZSBgY29sRGF0YWAgY29sdW1uIG5hbWVzCgpOZXh0IHVwLCB3ZSdsbCBjaGVjayB0aGUgYGNvbERhdGFgIGNvbHVtbnM6IHdlIG5lZWQgdGhlc2UgdG8gYmUgdGhlIHNhbWUsIGFuZCBpbiB0aGUgc2FtZSBvcmRlci4KTGV0J3MgcHJpbnQgb3V0IGVhY2ggb2JqZWN0J3MgYGNvbERhdGFgIGNvbHVtbiBuYW1lIHRvIHNlZSB3aGVyZSB3ZSBzdGFuZDoKCmBgYHtyIGNvbGRhdGEgY29sbmFtZXN9CnNjZV9saXN0IHw+CiAgcHVycnI6Om1hcCgKICAgIFwoc2NlKSBjb2xuYW1lcyhjb2xEYXRhKHNjZSkpIAogICkgCmBgYApXZSBzZWUgdGhlIHNhbWUgY29sdW1ucyBhbGwgYXJvdW5kIGluIHRoZSBzYW1lIG9yZGVyLCB3aGljaCBpcyBncmVhdCEKCkJ1dCB3aGF0IGlmIHRoZXJlIHdlcmUgZGlmZmVyZW50IGNvbHVtbnMgYWNyb3NzIG9iamVjdHMsIG9yIHRoZXkgd2VyZSBkaWZmZXJlbnRseSBvcmRlcmVkPwpJbiB0aGF0IGNhc2UsIHdlIGNvdWxkIGZpbmQgdGhlIGludGVyc2VjdGlvbiBvZiBjb2x1bW4gbmFtZXMgbGlrZSB3ZSBkaWQgYWJvdmUgZm9yIGdlbmVzLCBhbmQgdXNlIHRoYXQgdG8gcmUtb3JkZXIgYW5kIHN1YnNldCBhbGwgYGNvbERhdGFgIHNsb3RzIGluIG91ciBjdXN0b20gZm9ybWF0dGluZyBmdW5jdGlvbi4KCgojIyMjIyBDaGVjayB0aGUgYXNzYXlzCgpOZXh0LCB3ZSdsbCBtYWtlIHN1cmUgdGhhdCBhbGwgb2JqZWN0cyBzaGFyZSB0aGUgc2FtZSBhc3NheXM6CgpgYGB7ciBhc3NheSBuYW1lcywgbGl2ZSA9IFRSVUV9CiMgcHJpbnQgYWxsIHRoZSBhc3NheSBuYW1lcwpzY2VfbGlzdCB8PgogIHB1cnJyOjptYXAoYXNzYXlOYW1lcykKYGBgCkFnYWluLCBhbGwgb2JqZWN0cyBhcmUgY29tcGF0aWJsZSBhbHJlYWR5IHdpdGggYm90aCBoYXZpbmcgYSBgY291bnRzYCBhbmQgYGxvZ2NvdW50c2AgYXNzYXkuCgpJbiB5b3VyIG93biBkYXRhIGV4cGxvcmF0aW9uLCBpZiB5b3UgZW5jb3VudGVyIFNDRXMgdG8gbWVyZ2UgdGhhdCBoYXZlIGV4dHJhbmVvdXMgYXNzYXlzIHRoYXQgeW91IGRvbid0IG5lZWQsIHlvdSBjYW4gcmVtb3ZlIHRoZW0gYnkgc2V0dGluZyB0aGVtIHRvIGBOVUxMYCBpbiB5b3VyIGN1c3RvbSBmb3JtYXR0aW5nIGZ1bmN0aW9uLCBlLmcuIGBhc3NheShzY2UsICJhc3NheV90b19yZW1vdmUiKSA8LSBOVUxMYC4KCiMjIyMjIENoZWNrIHRoZSBgcm93RGF0YWAgY29udGVudHMKCk9uZSBvZiB0aGUgb3RoZXIgaXRlbXMgd2Ugc2FpZCB3ZSdkIG5lZWQgdG8gdGhpbmsgYWJvdXQgaXMgdGhlIGByb3dEYXRhYCwgd2hpY2ggY29udGFpbnMgZ2VuZSBtZXRhZGF0YS4KVGhpcyBzbG90IGlzIGludGVyZXN0aW5nIGJlY2F1c2Ugc29tZSBvZiBpdHMgY29sdW1ucyBhcmUgc3BlY2lmaWMgdG8gdGhlIGdpdmVuIHNhbXBsZSwgd2hpbGUgb3RoZXJzIGFyZSBnZW5lcmFsOgoKYGBge3IgbGl0dGxlIGhlYWQgcm93ZGF0YX0Kc2NlX2xpc3QgfD4KICBwdXJycjo6bWFwKAogICAgXChzY2UpIGhlYWQocm93RGF0YShzY2UpLCAzKSAjIG9ubHkgcHJpbnQgMyByb3dzIGZvciBzcGFjZSEKICApCmBgYAoKVGhlIGNvbHVtbiBgZ2VuZV9zeW1ib2xgIGlzIG5vdCBzYW1wbGUtc3BlY2lmaWMgLSBpdCBqdXN0IHByb3ZpZGVzIHRoZSBjb3JyZXNwb25kaW5nIGdlbmUgc3ltYm9sIHRvIHRoZSBFbnNlbWJsIGlkcyBzZWVuIGhlcmUgYXMgcm93IG5hbWVzLgpUaGUgY29sdW1ucyBgbWVhbmAgYW5kIGBkZXRlY3RlZGAsIGhvd2V2ZXIsIGFyZSBzYW1wbGUtc3BlY2lmaWMgLSB0aGV5IGNvbnRhaW4gc2FtcGxlLXNwZWNpZmljIHN0YXRpc3RpY3MgYWJvdXQgZ2VuZSBleHByZXNzaW9uLgoKVGhpcyBtZWFucyB3ZSBkZWZpbml0ZWx5IG5lZWQgdG8gdXBkYXRlIHRoZSBjb2x1bW4gbmFtZXMgYG1lYW5gIGFuZCBgZGV0ZWN0ZWRgIHRvIGluY2x1ZGUgdGhlIHNhbXBsZSBpZC4KQnV0LCB3ZSBkb24ndCBuZWVkIGEgc2VwYXJhdGUgYGdlbmVfc3ltYm9sYCBjb2x1bW4gZm9yIGVhY2ggc2FtcGxlLCBzbyB3ZSBjYW4gbGVhdmUgdGhhdCBvbmUgYWxvbmUgYXMganVzdCBgZ2VuZV9zeW1ib2xgLiAKT25jZSB3ZSBldmVudHVhbGx5IG1lcmdlLCBvbmx5IG9uZSBgZ2VuZV9zeW1ib2xgIGNvbHVtbiB3aWxsIGJlIGxlZnQgaW4gdGhlIGZpbmFsIG9iamVjdCBzaW5jZSBpdCBpcyB0aGUgc2FtZSBhY3Jvc3MgYWxsIHRoZSBTQ0VzLgoKV2UnbGwgc2hvdyBvbmUgd2F5IHRvIGRvIHRoaXMgaW4gb3VyIGN1c3RvbSBmdW5jdGlvbiwgYnV0IGl0J3Mgd29ydGggbm90aW5nIHRoZXJlJ3Mgbm90aGluZyBfd3JvbmdfIHdpdGggYWxzbyBhZGRpbmcgdGhlIHNhbXBsZSBpZCB0byB0aGUgYGdlbmVfc3ltYm9sYCBjb2x1bW47IHlvdSdsbCBqdXN0IGVuZCB1cCB3aXRoIGEgYnVuY2ggb2YgcmVkdW5kYW50IGdlbmUgc3ltYm9sIGNvbHVtbnMuCgoKIyMjIyBSZWZvcm1hdCB0aGUgU0NFIG9iamVjdHMKCkFzIHlvdSBjYW4gc2VlLCB0aGVyZSdzIGEgbG90IG9mIG1vdmluZyBwYXJ0cyB0byBjb25zaWRlciEKQWdhaW4sIHRoZXNlIG1vdmluZyBwYXJ0cyBtYXkgKHdpbGwhKSBkaWZmZXIgZm9yIFNDRXMgdGhhdCB5b3UgYXJlIHdvcmtpbmcgd2l0aCwgc28geW91IGhhdmUgdG8gZXhwbG9yZSB5b3VyIG93biBTQ0VzIGluIGRlcHRoIHRvIHByZXBhcmUgZm9yIG1lcmdpbmcuCgpCYXNlZCBvbiBvdXIgZXhwbG9yYXRpb24sIGhlcmUgaXMgYSBzY2hlbWF0aWMgb2YgaG93IG9uZSBvZiB0aGUgU0NFIG9iamVjdHMgd2lsbCB1bHRpbWF0ZWx5IGJlIG1vZGlmaWVkIGludG8gdGhlIGZpbmFsIG1lcmdlZCBTQ0U6CgohW10oZGlhZ3JhbXMvdGVjaG5pY2FsX21lcmdlX3NjZS5wbmcpCgoKV2UnbGwgd3JpdGUgYSBfY3VzdG9tIGZ1bmN0aW9uXyAoc2VlbiBpbiB0aGUgY2h1bmsgYmVsb3cpIHRhaWxvcmVkIHRvIG91ciB3cmFuZ2xpbmcgc3RlcHMgdGhhdCBwcmVwYXJlcyBhIHNpbmdsZSBTQ0Ugb2JqZWN0IGZvciBtZXJnaW5nLgpXZSdsbCB0aGVuIHVzZSBvdXIgbmV3IGBwdXJycjo6bWFwKClgIHByb2dyYW1taW5nIHNraWxscyB0byBydW4gdGhpcyBmdW5jdGlvbiBvdmVyIHRoZSBgc2NlX2xpc3RgLgpUaGlzIHdpbGwgZ2l2ZSB1cyBhIG5ldyBsaXN0IG9mIGZvcm1hdHRlZCBTQ0VzIHRoYXQgd2UgY2FuIHByb2NlZWQgdG8gbWVyZ2UuCkl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgdGhlIGBmb3JtYXRfc2NlKClgIGZ1bmN0aW9uIHdyaXR0ZW4gYmVsb3cgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGdlbmVyYWwgdXNlIOKAkyBpdCdzIGJlZW4gcHJlY2lzZWx5IHdyaXR0ZW4gdG8gbWF0Y2ggdGhlIHByb2Nlc3Npbmcgd2UgbmVlZCB0byBkbyBmb3IgX3RoZXNlXyBTQ0VzLCBhbmQgZGlmZmVyZW50IFNDRXMgeW91IHdvcmsgd2l0aCB3aWxsIHJlcXVpcmUgZGlmZmVyZW50IHR5cGVzIG9mIHByb2Nlc3NpbmcuCgpXZSBhbHNvIGluY2x1ZGUgcm94eWdlbi1zdHlsZSBjb21tZW50cyBmb3IgdGhpcyBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIGEgaGVscGZ1bCBjb25zaXN0ZW50IHdheSB0byBkb2N1bWVudCB5b3VyIGNvZGUgaWYgeW91IGxpa2UgaXQgLSB3ZSd2ZSBldmVuIHdyaXR0ZW4gYSBibG9nIHBvc3QgYWJvdXQgaXQgOikgKDxodHRwczovL3d3dy5jY2RhdGFsYWIub3JnL2Jsb2cvZG9udC1tYWtlLW1lLXdyaXRlLXRpcHMtZm9yLWF2b2lkaW5nLXR5cGluZy1pbi1yc3R1ZGlvPikuCgpgYGB7ciBmb3JtYXRfc2NlIGZ1bmN0aW9ufQojJyBDdXN0b20gZnVuY3Rpb24gdG8gZm9ybWF0IGFuIFNDRSBiZWZvcmUgbWVyZ2luZwojJwojJyBAcGFyYW0gc2NlIFNDRSBvYmplY3QgdG8gZm9ybWF0CiMnIEBwYXJhbSBzYW1wbGVfbmFtZSBOYW1lIG9mIHRoZSBzYW1wbGUKIycgQHBhcmFtIHNoYXJlZF9nZW5lcyBWZWN0b3Igb2Ygc2hhcmVkIGdlbmVzIGFjcm9zcyBhbGwgU0NFIG9iamVjdHMKIycKIycgQHJldHVybnMgQW4gdXBkYXRlZCBTQ0Ugb2JqZWN0IHJlYWR5IGZvciBtZXJnaW5nCmZvcm1hdF9zY2UgPC0gZnVuY3Rpb24oCiAgc2NlLCAKICBzYW1wbGVfbmFtZSwgCiAgc2hhcmVkX2dlbmVzCikgewogIAogICMjIyBSZW1vdmUgdGhlIHNpbmdsZS1zYW1wbGUgcmVkdWNlZCBkaW1lbnNpb25zIAogICMgV2UgZG8gdGhpcyBmaXJzdCBzaW5jZSBpdCBtYWtlcyB0aGUgb2JqZWN0IGEgbG90IHNtYWxsZXIgZm9yIHRoZSByZXN0IG9mIHRoaXMgY29kZSEKICByZWR1Y2VkRGltcyhzY2UpIDwtIE5VTEwKICAKICAjIyMgQWRkIGRlZGljYXRlZCBzYW1wbGUgaW5kaWNhdG9yIGNvbHVtbiB0byB0aGUgY29sRGF0YSBzbG90CiAgIyBSZWNhbGwsIHRoZSBgc2NlJGAgc2hvcnRjdXQgcG9pbnRzIHRvIHRoZSBjb2xEYXRhCiAgc2NlJHNhbXBsZSA8LSBzYW1wbGVfbmFtZQoKICAjIyMgRW5zdXJlIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSBnZW5lcyBpbiB0aGUgc2FtZSBvcmRlcgogICMgVXNlIHRoZSBzaGFyZWRfZ2VuZXMgdmVjdG9yIHRvIGluZGV4IGdlbmVzIHRvIHRoZSBpbnRlcnNlY3Rpb24KICAjIERvaW5nIHRoaXMgYm90aCBzdWJzZXRzIHRvIGp1c3QgdGhvc2UgZ2VuZXMsIGFuZCByZW9yZGVycyEKICBzY2UgPC0gc2NlW3NoYXJlZF9nZW5lcywgXQogIAogICMjIyBUaGVyZSBpcyBubyBhZGRpdGlvbmFsIHdyYW5nbGluZyB0byBkbyBmb3IgdGhlIGNvbERhdGEgY29sdW1uIG5hbWVzIG9yIGFzc2F5cy4KICAjIyMgQnV0IGlmIHRoZXJlIHdlcmUsIHlvdSBjb3VsZCBhZGQgeW91ciBjdXN0b20gY29kZSB0byBkbyBzbyBoZXJlLgogICMjIyBZb3VyIGN1c3RvbSBmdW5jdGlvbiBtYXkgbmVlZCBhZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhpcywgdG9vLgoKICAjIyMgRW5zdXJlIGNlbGwgaWRzIGFyZSBpZGVudGlmaWFibGUgYW5kIGZ1bGx5IHVuaXF1ZSAKICAjIFVwZGF0ZSB0aGUgU0NFIG9iamVjdCBjb2x1bW4gbmFtZXMgKGNlbGwgaWRzKSBieSBwcmVwZW5kaW5nIHRoZSBgc2FtcGxlX25hbWVgCiAgY29sbmFtZXMoc2NlKSA8LSBnbHVlOjpnbHVlKCJ7c2FtcGxlX25hbWV9LXtjb2xuYW1lcyhzY2UpfSIpCgogICMjIyBFbnN1cmUgdGhlIHJvd0RhdGEgY29sdW1ucyBjYW4gYmUgaWRlbnRpZmllZAogICMgUmVjYWxsLCB3ZSB3YW50IHRvIGxlYXZlIGBnZW5lX3N5bWJvbGAgYWxvbmUsIGJ1dCBhZGQgdGhlIGBzYW1wbGVfbmFtZWAgdG8gdGhlIHJlc3QKICByb3dkYXRhX25hbWVzIDwtIGNvbG5hbWVzKHJvd0RhdGEoc2NlKSkKICAjIHByZWZpeCByb3dEYXRhIG5hbWVzIHdpdGggdGhlIHNhbXBsZSBuYW1lLCBleGNlcHQgZm9yIGdlbmUgc3ltYm9scwogIG5ld19yb3dkYXRhX25hbWVzIDwtIGlmZWxzZSgKICAgIHJvd2RhdGFfbmFtZXMgPT0gImdlbmVfc3ltYm9sIiwKICAgICJnZW5lX3N5bWJvbCIsCiAgICBnbHVlOjpnbHVlKCJ7c2FtcGxlX25hbWV9LXtyb3dkYXRhX25hbWVzfSIpCiAgKQogIGNvbG5hbWVzKHJvd0RhdGEoc2NlKSkgPC0gbmV3X3Jvd2RhdGFfbmFtZXMKICAKICAjIyMgRW5zdXJlIG1ldGFkYXRhIHNsb3QgZmllbGRzIGNhbiBiZSBpZGVudGlmaWVkCiAgIyBXZSdsbCBzaW1wbHkgcHJlcGVuZCB0aGUgYHNhbXBsZV9uYW1lYCB0byBhbGwgZmllbGRzIGZvciB0aGlzIHNsb3QKICBuYW1lcyhtZXRhZGF0YShzY2UpKSA8LSBnbHVlOjpnbHVlKCJ7c2FtcGxlX25hbWV9LXtuYW1lcyhtZXRhZGF0YShzY2UpKX0iKQogIAogIAogICMjIyBGaW5hbGx5LCB3ZSBjYW4gcmV0dXJuIHRoZSBmb3JtYXR0ZWQgU0NFIG9iamVjdAogIHJldHVybihzY2UpICAKfQpgYGAKClRvIHJ1biB0aGlzIGZ1bmN0aW9uLCB3ZSdsbCB1c2UgdGhlIGBwdXJycjo6bWFwMigpYCBmdW5jdGlvbiwgYSByZWxhdGl2ZSBvZiBgcHVycnI6Om1hcCgpYCB0aGF0IGFsbG93cyB5b3UgdG8gbG9vcCBvdmVyIF90d29fIGlucHV0IGxpc3RzL3ZlY3RvcnMuCkluIG91ciBjYXNlLCB3ZSB3YW50IHRvIHJ1biBgZm9ybWF0X3NjZSgpYCBvdmVyIHBhaXJlZCBgc2NlX2xpc3RgIGl0ZW1zIGFuZCBgc2NlX2xpc3RgIG5hbWVzLgoKYGBge3IgZm9ybWF0IHNjZXMgZm9yIG1lcmdlLCBsaXZlID0gVFJVRX0KIyBXZSBjYW4gdXNlIGBwdXJycjo6bWFwMigpYCB0byBsb29wIG92ZXIgdHdvIGxpc3QvdmVjdG9yIGFyZ3VtZW50cwpzY2VfbGlzdF9mb3JtYXR0ZWQgPC0gcHVycnI6Om1hcDIoCiAgIyBFYWNoICJpdGVyYXRpb24iIHdpbGwgbWFyY2ggZG93biB0aGUgZmlyc3QgdHdvCiAgIyAgYXJndW1lbnRzIGBzY2VfbGlzdGAgYW5kIGBuYW1lcyhzY2VfbGlzdClgIGluIG9yZGVyCiAgc2NlX2xpc3QsCiAgbmFtZXMoc2NlX2xpc3QpLAogIFwoc2NlLCBzYW1wbGVfbmFtZSkgZm9ybWF0X3NjZShzY2UsIHNhbXBsZV9uYW1lLCBzaGFyZWRfZ2VuZXMpIAopCgojIFByaW50IGZvcm1hdHRlZCBTQ0UgbGlzdApzY2VfbGlzdF9mb3JtYXR0ZWQKYGBgCgooUHNzdCwgbGlrZSBgcHVycnJgIGFuZCB3YW50IHRvIGRpdmUgZGVlcGVyPyBDaGVjayBvdXQgW3RoZSBgcHVycnI6OmltYXAoKWAgZnVuY3Rpb25dKGh0dHBzOi8vcHVycnIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvaW1hcC5odG1sKSEpCgoKIyMjIFBlcmZvcm0gdGhlIG1lcmdpbmcKCgpBdCBsb25nIGxhc3QsIHdlIGFyZSByZWFkeSB0byBtZXJnZSB0aGUgU0NFcywgd2hpY2ggd2UnbGwgZG8gdXNpbmcgdGhlIFIgZnVuY3Rpb24gYGNiaW5kKClgLgpUaGUgYGNiaW5kKClgIGZ1bmN0aW9uIGlzIG9mdGVuIHVzZWQgdG8gY29tYmluZSBkYXRhIGZyYW1lcyBvciBtYXRyaWNlcyBieSBjb2x1bW4sIGkuZS4gInN0YWNrIiB0aGVtIG5leHQgdG8gZWFjaCBvdGhlci4KVGhlIHNhbWUgcHJpbmNpcGxlIGFwcGxpZXMgaGVyZSwgYnV0IHdoZW4gcnVuIG9uIFNDRSBvYmplY3RzLCBgY2JpbmQoKWAgd2lsbCBjcmVhdGUgYSBuZXcgU0NFIG9iamVjdCBieSBjb21iaW5pbmcgYGNvdW50c2AgYW5kIGBsb2djb3VudHNgIG1hdHJpY2VzIGJ5IGNvbHVtbi4KRm9sbG93aW5nIHRoYXQgc3RydWN0dXJlLCBvdGhlciBTQ0Ugc2xvdHMgKGBjb2xEYXRhYCwgYHJvd0RhdGFgLCByZWR1Y2VkIGRpbWVuc2lvbnMsIGFuZCBvdGhlciBtZXRhZGF0YSkgYXJlIGNvbWJpbmVkIGFwcHJvcHJpYXRlbHkuCgpTaW5jZSB3ZSBuZWVkIHRvIGFwcGx5IGBjYmluZCgpYCB0byBhIF9saXN0XyBvZiBvYmplY3RzLCB3ZSBuZWVkIHRvIHVzZSBzb21lIHNsaWdodGx5LWduYXJseSBzeW50YXg6IFdlJ2xsIHVzZSB0aGUgZnVuY3Rpb24gYGRvLmNhbGwoKWAsIHdoaWNoIGFsbG93cyB0aGUgYGNiaW5kKClgIGlucHV0IHRvIGJlIGEgbGlzdCBvZiBvYmplY3RzIHRvIGNvbWJpbmUuCgpgYGB7ciBtZXJnZXMgc2NlcywgbGl2ZSA9IFRSVUV9CiMgTWVyZ2UgU0NFIG9iamVjdHMKbWVyZ2VkX3NjZSA8LSBkby5jYWxsKGNiaW5kLCBzY2VfbGlzdF9mb3JtYXR0ZWQpCgojIFByaW50IHRoZSBtZXJnZWRfc2NlIG9iamVjdAptZXJnZWRfc2NlCmBgYAoKV2Ugbm93IGhhdmUgYSBzaW5nbGUgbWVyZ2VkIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgY2VsbHMgZnJvbSBhbGwgc2FtcGxlcyB3ZSdkIGxpa2UgdG8gaW50ZWdyYXRlLgoKTGV0J3MgdGFrZSBhIHBlZWsgYXQgc29tZSBvZiB0aGUgaW5uYXJkcyBvZiB0aGlzIG5ldyBTQ0Ugb2JqZWN0OgoKYGBge3IgZXhwbG9yZSBtZXJnZWRfc2NlLCBsaXZlID0gVFJVRX0KIyBIb3cgbWFueSBzYW1wbGVzLCBhbmQgY2VsbHMgcGVyIHNhbXBsZT8KdGFibGUoY29sRGF0YShtZXJnZWRfc2NlKSRzYW1wbGUpCgojIFdoYXQgYXJlIHRoZSBuZXcgY2VsbCBpZHMgKGNvbHVtbiBuYW1lcyk/CmhlYWQoY29sbmFtZXMobWVyZ2VkX3NjZSkpCnRhaWwoY29sbmFtZXMobWVyZ2VkX3NjZSkpCgojIFdoYXQgZG9lcyByb3dEYXRhIGxvb2sgbGlrZT8KaGVhZChyb3dEYXRhKG1lcmdlZF9zY2UpKQpgYGAKCgojIyBJbnRlZ3JhdGUgc2FtcGxlcwoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBJbnRlZ3JhdGVdKGRpYWdyYW1zL3JvYWRtYXBfbXVsdGlfaW50ZWdyYXRlLnBuZykKClNvIGZhciwgd2UndmUgY3JlYXRlZCBhIGBtZXJnZWRfc2NlYCBvYmplY3Qgd2hpY2ggaXMgKGFsbW9zdCEpIHJlYWR5IGZvciBpbnRlZ3JhdGlvbi4KClRoZSBpbnRlZ3JhdGlvbiBtZXRob2RzIHdlJ2xsIGJlIHVzaW5nIGhlcmUgYWN0dWFsbHkgcGVyZm9ybSBiYXRjaCBjb3JyZWN0aW9uIG9uIGEgcmVkdWNlZCBkaW1lbnNpb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIG5vcm1hbGl6ZWQgZ2VuZSBleHByZXNzaW9uIHZhbHVlcywgd2hpY2ggaXMgbW9yZSBlZmZpY2llbnQuCmBmYXN0TU5OYCBhbmQgYGhhcm1vbnlgIHNwZWNpZmljYWxseSB1c2UgUENBIGZvciB0aGlzLCBidXQgYmUgYXdhcmUgdGhhdCBkaWZmZXJlbnQgaW50ZWdyYXRpb24gbWV0aG9kcyBtYXkgdXNlIG90aGVyIGtpbmRzIG9mIHJlZHVjZWQgZGltZW5zaW9ucy4KCkJlZm9yZSBtZXJnaW5nLCBvdXIgb2JqZWN0cyBoYWQgcmVkdWNlZCBkaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIGNhbGN1bGF0ZWQgb24gZWFjaCBpbmRpdmlkdWFsIFNDRSwgYW5kIHdlIHJlbW92ZWQgdGhlbSB3aGVuIHByZXBhcmluZyBmb3IgbWVyZ2UuCldlIHJlbW92ZWQgdGhlbSBiZWNhdXNlIHdlIGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gdXNlIHRoZW0gYW55bW9yZSEKVGhpcyBpcyBiZWNhdXNlIHBhcnQgb2YgdGhlaXIgY2FsY3VsYXRpb24gaW52b2x2ZXMgc2NhbGluZyB0aGUgcmF3IGRhdGEgdG8gY2VudGVyIHRoZSBtZWFuLgpXaGVuIHNhbXBsZXMgYXJlIHNlcGFyYXRlbHkgY2VudGVyZWQsIF9hbGxfIG9mIHRoZW0gd2lsbCBiZSBjZW50ZXJlZCBhdCB6ZXJvLCBtYWtpbmcgaXQgbG9vayBsaWtlIHRoZSBkYXRhc2V0cyBhcmUgYWxyZWFkeSBwcmV0dHkgb3ZlcmxhcHBpbmcgd2hlbiB5b3UgcGxvdCB0aGVpciBVTUFQcyB0b2dldGhlci4KQnV0LCB0aGlzIGlzIGp1c3QgYSBtYXRoZW1hdGljYWwgYXJ0aWZhY3Qgb2YgaG93IGRpbWVuc2lvbiByZWR1Y3Rpb24gaXMgcGVyZm9ybWVkLgoKU28sIHdlJ2xsIGJlZ2luIGJ5IHJlLWNhbGN1bGF0aW5nIFBDQSBhbmQgVU1BUCBvbiB0aGUgbWVyZ2VkIG9iamVjdCBpbiBhIHdheSB0aGF0IHRha2VzIGJhdGNoZXMgaW50byBjb25zaWRlcmF0aW9uLiAKRm9yIGlucHV0IHRvIGludGVncmF0aW9uLCB3ZSdsbCB3YW50IHRoZSByZWR1Y2VkIGRpbWVuc2lvbiBjYWxjdWxhdGlvbnMgdG8gY29uc2lkZXIgbm9ybWFsaXplZCBnZW5lIGV4cHJlc3Npb24gdmFsdWVzIGZyb20gYWxsIHNhbXBsZXMgc2ltdWx0YW5lb3VzbHkuClNvIHdlJ2xsIG5lZWQgdG8gcmVjYWxjdWxhdGUgUENBIChhbmQgVU1BUCBmb3IgdmlzdWFsaXphdGlvbikgb24gdGhlIG1lcmdlZCBvYmplY3QuCgpGaXJzdCwgYXMgdXN1YWwsIHdlJ2xsIGRldGVybWluZSB0aGUgaGlnaC12YXJpYW5jZSBnZW5lcyB0byB1c2UgZm9yIFBDQSBmcm9tIHRoZSBgbWVyZ2VkX3NjZWAgb2JqZWN0LgpGb3IgdGhpcywgd2UnbGwgbmVlZCB0byBwcm92aWRlIHRoZSBhcmd1bWVudCBgYmxvY2sgPSBtZXJnZWRfc2NlJHNhbXBsZWAgd2hlbiBtb2RlbGluZyBnZW5lIHZhcmlhbmNlLCB3aGljaCB0ZWxscyBgc2NyYW46Om1vZGVsR2VuZVZhcigpYCB0byBmaXJzdCBtb2RlbCB2YXJpYW5jZSBzZXBhcmF0ZWx5IGZvciBlYWNoIGJhdGNoIGFuZCB0aGVuIGNvbWJpbmUgdGhvc2UgbW9kZWxpbmcgc3RhdGlzdGljcy4KKFBzc3Q6IGlzbid0IGl0IGhhbmR5IHdlIGNyZWF0ZWQgdGhhdCBgc2FtcGxlYCBjb2x1bW4gd2hlbiBtZXJnaW5nPyEpCgpgYGB7ciBjYWxjIG1lcmdlZCBodiBnZW5lc30KIyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgZ2VuZXMgdG8gaWRlbnRpZnkKbnVtX2dlbmVzIDwtIDIwMDAKCiMgQ2FsY3VsYXRlIHZhcmlhdGlvbiBmb3IgZWFjaCBnZW5lCmdlbmVfdmFyaWFuY2UgPC0gc2NyYW46Om1vZGVsR2VuZVZhcihtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWZ5IHRoZSBncm91cGluZyBjb2x1bW46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG1lcmdlZF9zY2Ukc2FtcGxlKQoKIyBHZXQgdGhlIHRvcCBgbnVtX2dlbmVzYCBoaWdoLXZhcmlhbmNlIGdlbmVzIHRvIHVzZSBmb3IgZGltZW5zaW9uIHJlZHVjdGlvbgpodl9nZW5lcyA8LSBzY3Jhbjo6Z2V0VG9wSFZHcyhnZW5lX3ZhcmlhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbnVtX2dlbmVzKQpgYGAKClRvIGNhbGN1bGF0ZSB0aGUgUENBIG1hdHJpeCBpdHNlbGYsIHdlJ2xsIHVzZSBhbiBhcHByb2FjaCBmcm9tIHRoZSBgYmF0Y2hlbG9yYCBwYWNrYWdlLCB3aGljaCBpcyB0aGUgUiBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIGBmYXN0TU5OYCBtZXRob2QuClRoZSBbYGJhdGNoZWxvcjo6bXVsdGlCYXRjaFBDQSgpYF0oaHR0cHM6Ly9yZHJyLmlvL2Jpb2MvYmF0Y2hlbG9yL21hbi9tdWx0aUJhdGNoUENBLmh0bWwpIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYSBiYXRjaC13ZWlnaHRlZCBQQ0EgbWF0cml4LgpUaGlzIHdlaWdodGluZyBlbnN1cmVzIHRoYXQgYWxsIGJhdGNoZXMsIHdoaWNoIG1heSBoYXZlIHZlcnkgZGlmZmVyZW50IG51bWJlcnMgb2YgY2VsbHMsIGNvbnRyaWJ1dGUgZXF1YWxseSB0byB0aGUgb3ZlcmFsbCBzY2FsaW5nLgoKYGBge3IgbWFrZSBtZXJnZWRfcGNhLCBsaXZlID0gVFJVRX0KIyBVc2UgYmF0Y2hlbG9yIHRvIGNhbGN1bGF0ZSBQQ0EgZm9yIG1lcmdlZF9zY2UsIGNvbnNpZGVyaW5nIG9ubHkKIyAgdGhlIGhpZ2gtdmFyaWFuY2UgZ2VuZXMKIyBXZSdsbCBuZWVkIHRvIGluY2x1ZGUgdGhlIGFyZ3VtZW50IGBwcmVzZXJ2ZS5zaW5nbGUgPSBUUlVFYCB0byBnZXQKIyAgYSBzaW5nbGUgbWF0cml4IHdpdGggYWxsIHNhbXBsZXMgYW5kIG5vdCBzZXBhcmF0ZSBtYXRyaWNlcyBmb3IgZWFjaCBzYW1wbGUKbWVyZ2VkX3BjYSA8LSBiYXRjaGVsb3I6Om11bHRpQmF0Y2hQQ0EobWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2V0LnJvdyA9IGh2X2dlbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9IG1lcmdlZF9zY2Ukc2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZS5zaW5nbGUgPSBUUlVFKQpgYGAKCkxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSBvdXRwdXQ6CmBgYHtyIHByaW50IG1lcmdlZF9wY2EsIGxpdmUgPSBUUlVFfQojIFRoaXMgb3V0cHV0IGlzIG5vdCB2ZXJ5IGludGVyZXN0aW5nIQptZXJnZWRfcGNhCmBgYAoKV2UgY2FuIHVzZSBpbmRleGluZyBgW1sxXV1gIHRvIHNlZSB0aGUgUENBIG1hdHJpeCBjYWxjdWxhdGVkLCBsb29raW5nIGF0IGEgc21hbGwgc3Vic2V0IGZvciBjb252ZW5pZW5jZToKCmBgYHtyIHByaW50IG1lcmdlZF9wY2EgaW5kZXhlZCwgbGl2ZSA9IFRSVUV9Cm1lcmdlZF9wY2FbWzFdXVsxOjUsMTo1XQpgYGAKCldlIGNhbiBub3cgaW5jbHVkZSB0aGlzIFBDQSBtYXRyaXggaW4gb3VyIGBtZXJnZWRfc2NlYCBvYmplY3Q6CgpgYGB7ciBhZGQgbWVyZ2VkX3BjYSwgbGl2ZSA9IFRSVUV9CiMgYWRkIFBDQSByZXN1bHRzIHRvIG1lcmdlZCBTQ0Ugb2JqZWN0CnJlZHVjZWREaW0obWVyZ2VkX3NjZSwgIlBDQSIpIDwtIG1lcmdlZF9wY2FbWzFdXQpgYGAKCk5vdyB0aGF0IHdlIGhhdmUgdGhlIFBDQSBtYXRyaXgsIHdlIGNhbiBwcm9jZWVkIHRvIGNhbGN1bGF0ZSBVTUFQIHRvIHZpc3VhbGl6ZSB0aGUgdW5jb3JyZWN0ZWQgbWVyZ2VkIGRhdGEuCgpgYGB7ciBjYWxjdWxhdGUgbWVyZ2VkIHVtYXAsIGxpdmUgPSBUUlVFfQptZXJnZWRfc2NlIDwtIHNjYXRlcjo6cnVuVU1BUChtZXJnZWRfc2NlKQpgYGAKCmBgYHtyIHBsb3QgdW5jb3JyZWN0ZWQgbWVyZ2VkIFVNQVB9CiMgVU1BUHMgc2NhbGVkIHRvZ2V0aGVyIHdoZW4gY2FsY3VsYXRlZCBmcm9tIHRoZSBtZXJnZWQgU0NFCnNjYXRlcjo6cGxvdFVNQVAoCiAgbWVyZ2VkX3NjZSwKICBjb2xvcl9ieSA9ICJzYW1wbGUiLAogICMgU29tZSBzdHlsaW5nIHRvIGhlbHAgdXMgc2VlIHRoZSBwb2ludHM6CiAgcG9pbnRfc2l6ZSA9IDAuNSwKICBwb2ludF9hbHBoYSA9IDAuMgopICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAic2FtcGxlIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIGdndGl0bGUoIlVNQVAgY2FsY3VsYXRlZCBvbiBtZXJnZWRfc2NlIikKYGBgCgpXZSBzZWUgKG1vc3RseSkgZm91ciBzZXBhcmF0ZSBjbHVtcHMgcmVwcmVzZW50aW5nIHRoZSBmb3VyIGRpZmZlcmVudCBfbWVyZ2VkIGJ1dCBub3QgeWV0IGludGVncmF0ZWRfIHNhbXBsZXMuCldlIGNhbiB0aGluayBvZiB0aGlzIFVNQVAgYXMgb3VyICJiZWZvcmUiIFVNQVAsIGFuZCB3ZSBjYW4gY29tcGFyZSB0aGlzIHRvIHRoZSAiYWZ0ZXIiIFVNQVAgd2Ugc2VlIHBvc3QtaW50ZWdyYXRpb24uCgpMZXQncyBkaXNjdXNzIGEgbGl0dGxlIGZpcnN0OiBXaGF0IHZpc3VhbCBkaWZmZXJlbmNlcyBkbyB5b3UgdGhpbmsgdGhlIFVNQVAgb24gdGhlIGludGVncmF0ZWQgdmVyc2lvbiBvZiBkYXRhIHdpbGwgaGF2ZT8KV2hhdCBzaW1pbGFyaXRpZXMgZG8geW91IHRoaW5rIHRoZSBpbnRlZ3JhdGVkIFVNQVAgd2lsbCBoYXZlIHRvIHRoaXMgcGxvdD8KCgojIyMgSW50ZWdyYXRlIHdpdGggYGZhc3RNTk5gCgpGaW5hbGx5LCB3ZSdyZSByZWFkeSB0byBpbnRlZ3JhdGUhClRvIHN0YXJ0LCB3ZSdsbCB1c2UgdGhlIGBmYXN0TU5OYCBhcHByb2FjaCBmcm9tIHRoZSBCaW9jb25kdWN0b3IgW2BiYXRjaGVsb3JgIHBhY2thZ2VdKGh0dHA6Ly93d3cuYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9iYXRjaGVsb3IuaHRtbCkuCgpgZmFzdE1OTmAgdGFrZXMgYXMgaW5wdXQgdGhlIGBtZXJnZWRfc2NlYCBvYmplY3QgdG8gaW50ZWdyYXRlLCBhbmQgdGhlIGZpcnN0IHN0ZXAgaXQgcGVyZm9ybXMgaXMgYWN0dWFsbHkgdG8gcnVuIGBiYXRjaGVsb3I6Om11bHRpQmF0Y2hQQ0EoKWAgb24gdGhhdCBTQ0UuCkl0IHRoZW4gdXNlcyB0aGF0IGJhdGNoLXdlaWdodGVkIFBDQSBtYXRyaXggdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGJhdGNoIGNvcnJlY3Rpb24uClRoZSBgYmF0Y2hgIGFyZ3VtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlmZmVyZW50IGdyb3VwaW5ncyB3aXRoaW4gdGhlIGBtZXJnZWRfc2NlYCAoaS5lLiB0aGUgb3JpZ2luYWwgc2FtcGxlIHRoYXQgZWFjaCBjZWxsIGJlbG9uZ3MgdG8pLCBhbmQgdGhlIGBzdWJzZXQucm93YCBhcmd1bWVudCBjYW4gb3B0aW9uYWxseSBiZSB1c2VkIHRvIHByb3ZpZGUgYSB2ZWN0b3Igb2YgaGlnaC12YXJpYW5jZSBnZW5lcyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciB0aGlzIFBDQSBjYWxjdWxhdGlvbi4KYGZhc3RNTk5gIHdpbGwgcmV0dXJuIGFuIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhIGJhdGNoLWNvcnJlY3RlZCBQQ0EuCkxldCdzIHJ1biBpdCBhbmQgc2F2ZSB0aGUgcmVzdWx0IHRvIGEgdmFyaWFibGUgY2FsbGVkIGBpbnRlZ3JhdGVkX3NjZWAuCgoKYGBge3IgcnVuIGZhc3Rtbm4sIGxpdmUgPSBUUlVFfQojIGludGVncmF0ZSB3aXRoIGZhc3RNTk4sIGFnYWluIHNwZWNpZnlpbmcgb25seSBvdXIgaGlnaC12YXJpYW5jZSBnZW5lcwppbnRlZ3JhdGVkX3NjZSA8LSBiYXRjaGVsb3I6OmZhc3RNTk4oCiAgbWVyZ2VkX3NjZSwKICBiYXRjaCA9IG1lcmdlZF9zY2Ukc2FtcGxlLAogIHN1YnNldC5yb3cgPSBodl9nZW5lcwopCmBgYAoKTGV0J3MgaGF2ZSBhIGxvb2sgYXQgdGhlIHJlc3VsdDoKCmBgYHtyIGZhc3Rtbm4gcmVzdWx0LCBsaXZlID0gVFJVRX0KIyBQcmludCB0aGUgaW50ZWdyYXRlZF9zY2Ugb2JqZWN0CmludGVncmF0ZWRfc2NlCmBgYAoKVGhlcmUgYXJlIGNvdXBsZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24gaGVyZSBvZiBpbnRlcmVzdDoKCi0gVGhlIGBjb3JyZWN0ZWRgIHJlZHVjZWQgZGltZW5zaW9uIHJlcHJlc2VudHMgdGhlIGJhdGNoLWNvcnJlY3RlZCBQQ0EgdGhhdCBgZmFzdE1OTmAgY2FsY3VsYXRlZC4KLSBUaGUgYHJlY29uc3RydWN0ZWRgIGFzc2F5IHJlcHJlc2VudHMgdGhlIGJhdGNoLWNvcnJlY3RlZCBub3JtYWxpemVkIGV4cHJlc3Npb24gdmFsdWVzLCB3aGljaCBgZmFzdE1OTmAgImJhY2stY2FsY3VsYXRlZCIgZnJvbSB0aGUgYmF0Y2gtY29ycmVjdGVkIFBDQSAoYGNvcnJlY3RlZGApLgpHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXNlIGV4cHJlc3Npb24gdmFsdWVzIGFyZSBub3Qgc3RhbmQtYWxvbmUgdmFsdWVzIHRoYXQgeW91IHNob3VsZCB1c2UgZm9yIG90aGVyIGFwcGxpY2F0aW9ucyBsaWtlIGRpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24sIGFzIGRlc2NyaWJlZCBpbiBbX09yY2hlc3RyYXRpbmcgU2luZ2xlIENlbGwgQW5hbHlzZXNfXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE5L09TQ0EubXVsdGlzYW1wbGUvdXNpbmctY29ycmVjdGVkLXZhbHVlcy5odG1sKS4KSWYgdGhlIGBzdWJzZXQucm93YCBhcmd1bWVudCBpcyBwcm92aWRlZCAoYXMgaXQgd2FzIGhlcmUpLCBvbmx5IGdlbmVzIHByZXNlbnQgaW4gYHN1YnNldC5yb3dgIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlc2UgcmVjb25zdHJ1Y3RlZCBleHByZXNzaW9uIHZhbHVlcywgYnV0IHRoaXMgc2V0dGluZyBjYW4gYmUgb3ZlcnJpZGRlbiBzbyB0aGF0IGFsbCBnZW5lcyBoYXZlIHJlY29uc3RydWN0ZWQgZXhwcmVzc2lvbiB3aXRoIHRoZSBhcmd1bWVudCBgY29ycmVjdC5hbGwgPSBUUlVFYC4KCldlJ3JlIG1vc3RseSBpbnRlcmVzdGVkIGluIHRoZSBQQ0EgdGhhdCBgZmFzdE1OTmAgY2FsY3VsYXRlZCwgc28gbGV0J3Mgc2F2ZSB0aGF0IGluZm9ybWF0aW9uICh3aXRoIGFuIGluZm9ybWF0aXZlIGFuZCB1bmlxdWUgbmFtZSkgaW50byBvdXIgYG1lcmdlZF9zY2VgIG9iamVjdDoKCmBgYHtyIGZhc3Rtbm4gcGNzLCBsaXZlID0gVFJVRX0KIyBNYWtlIGEgbmV3IHJlZHVjZWREaW0gbmFtZWQgZmFzdG1ubl9QQ0EgZnJvbSB0aGUgY29ycmVjdGVkIHJlZHVjZWREaW0gaW4gaW50ZWdyYXRlZF9zY2UKcmVkdWNlZERpbShtZXJnZWRfc2NlLCAiZmFzdG1ubl9QQ0EiKSA8LSByZWR1Y2VkRGltKGludGVncmF0ZWRfc2NlLCAiY29ycmVjdGVkIikKYGBgCgpGaW5hbGx5LCB3ZSdsbCBjYWxjdWxhdGUgVU1BUCBmcm9tIHRoZXNlIGNvcnJlY3RlZCBQQ0EgbWF0cml4IGZvciB2aXN1YWxpemF0aW9uLgpJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBzcGVjaWZ5IHR3byBhZGRpdGlvbmFsIGFyZ3VtZW50cyBzaW5jZSB3ZSdyZSB3b3JraW5nIHdpdGggbm9uLXN0YW5kYXJkIHJlZHVjZWQgZGltZW5zaW9uIG5hbWVzOgoKKyBgZGltcmVkID0gImZhc3Rtbm5fUENBImAsIHdoaWNoIHNwZWNpZmllcyB0aGUgZXhpc3RpbmcgcmVkdWNlZCBkaW1lbnNpb24gdG8gdXNlIGZvciB0aGUgY2FsY3VsYXRpb24KKyBgbmFtZSA9ICJmYXN0bW5uX1VNQVAiYCwgd2hpY2ggbmFtZXMgdGhlIGZpbmFsIFVNQVAgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMKCmBgYHtyIGNhbGN1bGF0ZSBmYXN0bW5uIHVtYXAsIGxpdmUgPSBUUlVFfQojIENhbGN1bGF0ZSBVTUFQCm1lcmdlZF9zY2UgPC0gc2NhdGVyOjpydW5VTUFQKAogIG1lcmdlZF9zY2UsCiAgZGltcmVkID0gImZhc3Rtbm5fUENBIiwKICBuYW1lID0gImZhc3Rtbm5fVU1BUCIKKQpgYGAKCkZpcnN0LCBsZXQncyBwbG90IHRoZSBpbnRlZ3JhdGVkIFVNQVAgaGlnaGxpZ2h0aW5nIHRoZSBkaWZmZXJlbnQgYmF0Y2hlcy4KQSB3ZWxsLWludGVncmF0ZWQgZGF0YXNldCB3aWxsIHNob3cgYmF0Y2ggbWl4aW5nLCBidXQgYSBwb29ybHktaW50ZWdyYXRlZCBkYXRhc2V0IHdpbGwgc2hvdyBtb3JlIHNlcGFyYXRpb24gYW1vbmcgYmF0Y2hlcywgc2ltaWxhciB0byB0aGUgdW5jb3JyZWN0ZWQgVU1BUC4KTm90ZSB0aGF0IHRoaXMgaXMgYSBtb3JlIHF1YWxpdGF0aXZlIHdheSB0byBhc3Nlc3MgdGhlIHN1Y2Nlc3Mgb2YgaW50ZWdyYXRpb24sIGJ1dCB0aGVyZSBhcmUgZm9ybWFsIG1ldHJpY3Mgb25lIGNhbiB1c2UgdG8gYXNzZXNzIGJhdGNoIG1peGluZywgd2hpY2ggeW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaW4gW3RoaXMgY2hhcHRlciBvZiBPU0NBXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE5L09TQ0EubXVsdGlzYW1wbGUvY29ycmVjdGlvbi1kaWFnbm9zdGljcy5odG1sKS4KCmBgYHtyIHBsb3QgZmFzdG1ubiB1bWFwIGJhdGNoZXN9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAjIHBsb3QgdGhlIGZhc3RNTk4gY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGJ5IHNhbXBsZQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gInNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN0eWxpbmcgdG8gaGVscCB1cyBzZWUgdGhlIHBvaW50czoKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gInNhbXBsZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICBnZ3RpdGxlKCJVTUFQIGFmdGVyIGludGVncmF0aW9uIHdpdGggZmFzdE1OTiIpCmBgYAoKVGhpcyBgZmFzdG1ubl9VTUFQYCBjZXJ0YWlubHkgbG9va3MgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3ZSBtYWRlIGJlZm9yZSBpbnRlZ3JhdGluZyEKV2hhdCBkaWZmZXJlbnQgdHJlbmRzIGRvIHlvdSBzZWU/CkRvIGFsbCBzYW1wbGVzIGxvb2sgImVxdWFsbHkgd2VsbCIgaW50ZWdyYXRlZCwgZnJvbSBhIGZpcnN0IGxvb2s/CgpJbXBvcnRhbnRseSwgb25lIHJlYXNvbiB0aGF0IGJhdGNoZXMgbWF5IHN0aWxsIGFwcGVhciBzZXBhcmF0ZWQgaW4gdGhlIGNvcnJlY3RlZCBVTUFQIGlzIGlmIHRoZXkgX3Nob3VsZF8gYmUgc2VwYXJhdGVkIC0gZm9yIGV4YW1wbGUsIG1heWJlIHR3byBiYXRjaGVzIGNvbnRhaW4gdmVyeSBkaWZmZXJlbnQgY2VsbCB0eXBlcywgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBkaWFnbm9zZXMsIG9yIG1heSBiZSBmcm9tIGRpZmZlcmVudCBwYXRpZW50cy4KClJlY2FsbCBmcm9tIGVhcmxpZXIgdGhhdCB3ZSBjb252ZW5pZW50bHkgaGF2ZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgaW4gb3VyIFNDRXMsIHNvIHdlIGNhbiBleHBsb3JlIHRob3NlIGhlcmUhCkxldCdzIHRha2UgYSBxdWljayBkZXRvdXIgdG8gc2VlIHdoYXQga2luZHMgb2YgY2VsbCB0eXBlcyBhcmUgaW4gdGhpcyBkYXRhIGJ5IG1ha2luZyBhIGJhcnBsb3Qgb2YgdGhlIGNlbGwgdHlwZXMgYWNyb3NzIHNhbXBsZXM6CgpgYGB7ciBleHBsb3JlIGNlbGx0eXBlc30KIyBDZWxsIHR5cGVzIGFyZSBpbiB0aGUgYGNlbGx0eXBlX2Jyb2FkYCBhbmQgYGNlbGx0eXBlX2ZpbmVgIGNvbHVtbnMKbWVyZ2VkX3NjZV9kZiA8LSBhcy5kYXRhLmZyYW1lKGNvbERhdGEobWVyZ2VkX3NjZSkpCgojIFVzZSBnZ3Bsb3QyIHRvIG1ha2UgYSBiYXJwbG90IHRoZSBjZWxsIHR5cGVzIGFjcm9zcyBzYW1wbGVzCmdncGxvdChtZXJnZWRfc2NlX2RmLAogICAgICAgYWVzKHggPSBzYW1wbGUsCiAgICAgICAgICAgZmlsbCA9IGNlbGx0eXBlX2Jyb2FkKSkgKwogICMgQmFycGxvdCBvZiBjZWxsdHlwZSBwcm9wb3J0aW9ucwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgIyBVc2UgYSBDVkQtZnJpZW5kbHkgY29sb3Igc2NoZW1lCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hLnZhbHVlID0gImdyZXk4MCIpICsKICAjIGN1c3RvbWl6ZSB5LWF4aXMgbGFiZWwKICBsYWJzKHkgPSAiUHJvcG9ydGlvbiIpICsKICAjIG5pY2VyIHRoZW1lCiAgdGhlbWVfYncoKQpgYGAKCldlIHNlZSB0aGF0IFR1bW9yIGNlbGwgdHlwZXMgYXJlIGJ5IGZhciB0aGUgbW9zdCBwcmV2YWxlbnQgYWNyb3NzIGFsbCBzYW1wbGVzLCBhbmQgbm9ybWFsIHRpc3N1ZSBjZWxsIHR5cGVzIGFyZSBub3QgdmVyeSBjb21tb24uCldlIHNlZSBhbHNvIHRoYXQgYFNDUENMMDAwNDgxYCBoYXMgYSBsYXJnZXIgYFR1bW9yX015b2N5dGVgIHBvcHVsYXRpb24sIHdoaWxlIGFsbCBvdGhlciBzYW1wbGVzIGhhdmUgbGFyZ2VyIGBUdW1vcl9NZXNvZGVybWAgcG9wdWxhdGlvbnMuClRoaXMgZGlmZmVyZW5jZSBfbWF5XyBleHBsYWluIHdoeSB3ZSBvYnNlcnZlIHRoYXQgYFNDUENMMDAwNDgxYCBpcyBzb21ld2hhdCBtb3JlIHNlcGFyYXRlZCBmcm9tIHRoZSBvdGhlciBzYW1wbGVzIGluIHRoZSBgZmFzdE1OTmAgVU1BUC4KCkxldCdzIHJlLXBsb3QgdGhpcyBVTUFQIHRvIGhpZ2hsaWdodCBjZWxsIHR5cGVzOgoKCmBgYHtyIHBsb3QgZmFzdG1ubiB1bWFwIGNlbGx0eXBlc30Kc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgYnkgYnJvYWQgY2VsbHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAiY2VsbHR5cGVfYnJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICsKICAjIGluY2x1ZGUgYXJndW1lbnQgdG8gc3BlY2lmeSBjb2xvciBvZiBOQSB2YWx1ZXMKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAiQnJvYWQgY2VsbHR5cGUiLCBuYS52YWx1ZSA9ICJncmV5ODAiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArCiAgZ2d0aXRsZSgiVU1BUCBhZnRlciBpbnRlZ3JhdGlvbiB3aXRoIGZhc3RNTk4iKQpgYGAKClRoaXMgVU1BUCBzaG93cyB0aGF0IHRoZSBub3JtYWwgdGlzc3VlIGNlbGwgdHlwZXMgKG1vc3RseSB2YXNjdWxhciBlbmRvdGhlbGl1bSwgbXVzY2xlIGNlbGxzLCBhbmQgbW9ub2N5dGVzKSB0ZW5kIHRvIGNsdXN0ZXIgdG9nZXRoZXIgYW5kIGFyZSBnZW5lcmFsbHkgc2VwYXJhdGVkIGZyb20gdGhlIHR1bW9yIGNlbGwgdHlwZXMsIHdoaWNoIGlzIGFuIGVuY291cmFnaW5nIHBhdHRlcm4hClR1bW9yIGNlbGwgdHlwZXMgZnJvbSBkaWZmZXJlbnQgc2FtcGxlcyBhcmUgYWxsIGFsc28gY2x1c3RlcmluZyB0b2dldGhlciwgd2hpY2ggaXMgZXZlbiBtb3JlIGVuY291cmFnaW5nIHRoYXQgd2UgaGFkIHN1Y2Nlc3NmdWwgaW50ZWdyYXRpb24uCgpIb3dldmVyLCBpdCdzIGEgYml0IGNoYWxsZW5naW5nIHRvIHNlZSBhbGwgdGhlIHBvaW50cyBnaXZlbiB0aGUgYW1vdW50IG9mIG92ZXJsYXAgaW4gdGhlIHBsb3QuCk9uZSB3YXkgd2UgY2FuIHNlZSBhbGwgdGhlIHBvaW50cyBhIGJpdCBiZXR0ZXIgaXMgdG8gZmFjZXQgdGhlIHBsb3QgYnkgc2FtcGxlLCB1c2luZyBgZmFjZXRfd3JhcCgpYCBmcm9tIHRoZSBgZ2dwbG90MmAgcGFja2FnZSAod2hpY2ggd2UgY2FuIGRvIGJlY2F1c2UgYHNjYXRlcjo6cGxvdFJlZHVjZWREaW0oKWAgcmV0dXJucyBhIGBnZ3Bsb3QyYCBvYmplY3QpOgoKYGBge3IgcGxvdCBmYXN0bW5uIHVtYXAgY2VsbHR5cGVzIGZhY2V0ZWR9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAjIEFsbG93IGZvciBmYWNldGluZyBieSBhIHZhcmlhYmxlIHVzaW5nIGBvdGhlcl9maWVsZHNgOgogICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9ICJzYW1wbGUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gIkJyb2FkIGNlbGx0eXBlIiwgbmEudmFsdWUgPSAiZ3JleTgwIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIGdndGl0bGUoIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBmYXN0TU5OIikgKwogICMgRmFjZXQgYnkgc2FtcGxlCiAgZmFjZXRfd3JhcCh2YXJzKHNhbXBsZSkpICsKICAjIFVzZSBhIHRoZW1lIHdpdGggYmFja2dyb3VuZCBncmlkIHRvIG1vcmUgZWFzaWx5IGNvbXBhcmUgcGFuZWwgY29vcmRpbmF0ZXMKICB0aGVtZV9idygpCmBgYAoKV2hhdCB0cmVuZHMgZG8geW91IG9ic2VydmUgYmV0d2VlbiB0dW1vciBhbmQgaGVhbHRoeSB0aXNzdWVzIGFtb25nIHRoZXNlIGludGVncmF0ZWQgc2FtcGxlcz8KCiMjIyBJbnRlZ3JhdGUgd2l0aCBgaGFybW9ueWAKCmBmYXN0TU5OYCBpcyBvbmx5IG9uZSBvZiBtYW55IGFwcHJvYWNoZXMgdG8gcGVyZm9ybSBpbnRlZ3JhdGlvbiwgYW5kIGRpZmZlcmVudCBtZXRob2RzIGhhdmUgZGlmZmVyZW50IGNhcGFiaWxpdGllcyBhbmQgbWF5IGdpdmUgZGlmZmVyZW50IHJlc3VsdHMuCkZvciBleGFtcGxlLCBzb21lIG1ldGhvZHMgY2FuIGFjY29tbW9kYXRlIGFkZGl0aW9uYWwgY292YXJpYXRlcyAoZS5nLiwgdGVjaG5vbG9neSwgcGF0aWVudCwgZGlhZ25vc2lzLCBldGMuKSB0aGF0IGNhbiBpbmZsdWVuY2UgaW50ZWdyYXRpb24uCkluIGZhY3QgdGhlIGRhdGEgd2UgYXJlIHVzaW5nIGhhcyBhIGtub3duIF9wYXRpZW50XyBjb3ZhcmlhdGU7IGBTQ1BDTDAwMDQ3OWAgYW5kIGBTQ1BDTDAwMDQ4MGAgYXJlIGZyb20gUGF0aWVudCBBLCBhbmQgYFNDUENMMDAwNDgxYCBhbmQgYFNDUENMMDAwNDgyYCBhcmUgZnJvbSBQYXRpZW50IEIuCgpTbywgbGV0J3MgcGVyZm9ybSBpbnRlZ3JhdGlvbiB3aXRoIGEgbWV0aG9kIHRoYXQgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIC0gW2BoYXJtb255YF0oaHR0cHM6Ly9wb3J0YWxzLmJyb2FkaW5zdGl0dXRlLm9yZy9oYXJtb255LykhCgpUbyBiZWdpbiBzZXR0aW5nIHVwIGZvciBgaGFybW9ueWAgaW50ZWdyYXRpb24sIHdlIG5lZWQgdG8gYWRkIGV4cGxpY2l0IHBhdGllbnQgaW5mb3JtYXRpb24gaW50byBvdXIgbWVyZ2VkIFNDRS4KV2UnbGwgY3JlYXRlIGEgbmV3IGNvbHVtbiBgcGF0aWVudGAgd2hvc2UgdmFsdWUgaXMgZWl0aGVyICJBIiBvciAiQiIgZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiBzYW1wbGUgbmFtZSwgdXNpbmcgdGhlIFtgZHBseXI6OmNhc2Vfd2hlbigpYF0oaHR0cHM6Ly9kcGx5ci50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9jYXNlX3doZW4uaHRtbCkgZnVuY3Rpb24uCldlIHByb3ZpZGUgdGhpcyBmdW5jdGlvbiB3aXRoIGEgc2V0IG9mIGxvZ2ljYWwgZXhwcmVzc2lvbnMgYW5kIGVhY2ggYXNzaWduZWQgdmFsdWUgaXMgZGVzaWduYXRlZCBieSBgfmAuClRoZSBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGluIG9yZGVyLCBzdG9wcGluZyBhdCB0aGUgX2ZpcnN0XyBvbmUgdGhhdCBldmFsdWF0ZXMgYXMgYFRSVUVgIGFuZCByZXR1cm5pbmcgdGhlIGFzc29jaWF0ZWQgdmFsdWUuCgpgYGB7ciBhZGQgcGF0aWVudCBpbmZvfQojIENyZWF0ZSBwYXRpZW50IGNvbHVtbiB3aXRoIHZhbHVlcyAiQSIgb3IgIkIiIGZvciB0aGUgdHdvIHBhdGllbnRzCm1lcmdlZF9zY2UkcGF0aWVudCA8LSBkcGx5cjo6Y2FzZV93aGVuKAogIG1lcmdlZF9zY2Ukc2FtcGxlICVpbiUgYygiU0NQQ0wwMDA0NzkiLCAiU0NQQ0wwMDA0ODAiKSB+ICJBIiwKICBtZXJnZWRfc2NlJHNhbXBsZSAlaW4lIGMoIlNDUENMMDAwNDgxIiwgIlNDUENMMDAwNDgyIikgfiAiQiIsCikKYGBgCgoKVW5saWtlIGBmYXN0TU5OYCwgYGhhcm1vbnlgIGRvZXMgbm90IGNhbGN1bGF0ZSBjb3JyZWN0ZWQgZXhwcmVzc2lvbiB2YWx1ZXMgbm9yIGRvZXMgaXQgcmV0dXJuIGFuIFNDRSBvYmplY3QuCkxpa2UgYGZhc3RNTk5gLCBgaGFybW9ueWAgcGVyZm9ybXMgaW50ZWdyYXRpb24gb24gYSBtZXJnZWQgUENBIG1hdHJpeC4KSG93ZXZlciwgdW5saWtlIGBmYXN0TU5OYCwgYGhhcm1vbnlgIGRvZXMgbm90ICJiYWNrLWNhbGN1bGF0ZSIgY29ycmVjdGVkIGV4cHJlc3Npb24gZnJvbSB0aGUgY29ycmVjdGVkIFBDQSBtYXRyaXggYW5kIGl0IG9ubHkgcmV0dXJucyB0aGUgY29ycmVjdGVkIFBDQSBtYXRyaXggaXRzZWxmLgpGb3IgaW5wdXQsIGBoYXJtb255YCBuZWVkcyBhIGNvdXBsZSBwaWVjZXMgb2YgaW5mb3JtYXRpb246CgotIEZpcnN0LCBgaGFybW9ueWAgdGFrZXMgYSBiYXRjaC13ZWlnaHRlZCBQQ0EgbWF0cml4IHRvIHBlcmZvcm0gaW50ZWdyYXRpb24uCldlIGFscmVhZHkgY2FsY3VsYXRlZCBhIGJhdGNoLXdlaWdodGVkIFBDQSBtYXRyaXggc28gd2UnbGwgcHJvdmlkZSB0aGlzIGFzIHRoZSB0aGUgaW5wdXQuCi0gU2Vjb25kLCB3ZSBuZWVkIHRvIHRlbGwgYGhhcm1vbnlgIGFib3V0IHRoZSBjb3ZhcmlhdGVzIHRvIHVzZSAtIGBzYW1wbGVgIGFuZCBgcGF0aWVudGAuClRvIGRvIHRoaXMsIHdlIHByb3ZpZGUgdHdvIGFyZ3VtZW50czoKICAtIGBtZXRhX2RhdGFgLCBhIGRhdGEgZnJhbWUgdGhhdCBjb250YWlucyBjb3ZhcmlhdGVzIGFjcm9zcyBzYW1wbGVzLgogIFdlIGNhbiBzaW1wbHkgc3BlY2lmeSB0aGUgU0NFIGBjb2xEYXRhYCBoZXJlIHNpbmNlIGl0IGNvbnRhaW5zIGBzYW1wbGVgIGFuZCBgcGF0aWVudGAgY29sdW1ucy4KICAtIGB2YXJzX3VzZWAsIGEgdmVjdG9yIG9mIHdoaWNoIGNvbHVtbiBuYW1lcyBpbiBgbWV0YV9kYXRhYCBzaG91bGQgYWN0dWFsbHkgYmUgdXNlZCBhcyBjb3ZhcmlhdGVzLgogIE90aGVyIGNvbHVtbnMgaW4gYG1ldGFfZGF0YWAgd2hpY2ggYXJlIG5vdCBpbiBgdmFyc191c2VgIGFyZSBpZ25vcmVkLgoKTGV0J3MgZ28hCgpgYGB7ciBydW4gaGFybW9ueSwgbGl2ZSA9IFRSVUV9CiMgUnVuIGhhcm1vbnkgaW50ZWdyYXRpb24KaGFybW9ueV9wY2EgPC0gaGFybW9ueTo6UnVuSGFybW9ueSgKICBkYXRhX21hdCA9IHJlZHVjZWREaW0obWVyZ2VkX3NjZSwgIlBDQSIpLAogIG1ldGFfZGF0YSA9IGNvbERhdGEobWVyZ2VkX3NjZSksCiAgdmFyc191c2UgPSBjKCJzYW1wbGUiLCAicGF0aWVudCIpCikKYGBgCgpUaGUgcmVzdWx0IGlzIGEgUENBIG1hdHJpeC4KTGV0J3MgcHJpbnQgYSBzdWJzZXQgb2YgdGhpcyBtYXRyaXggdG8gc2VlIGl0OgoKYGBge3IgcHJpbnQgaGFybW9ueSByZXN1bHQsIGxpdmUgPSBUUlVFfQojIFByaW50IHRoZSBoYXJtb255IHJlc3VsdApoYXJtb255X3BjYVsxOjUsIDE6NV0KYGBgCgpBcyB3ZSBkaWQgd2l0aCBgZmFzdE1OTmAgcmVzdWx0cywgbGV0J3Mgc3RvcmUgdGhpcyBQQ0EgbWF0cml4IGRpcmVjdGx5IGluIG91ciBgbWVyZ2VkX3NjZWAgb2JqZWN0IHdpdGggYW4gaW5mb3JtYXRpdmUgbmFtZSB0aGF0IHdvbid0IG92ZXJ3cml0ZSBhbnkgb2YgdGhlIGV4aXN0aW5nIFBDQSBtYXRyaWNlcy4KV2UnbGwgYWxzbyBjYWxjdWxhdGUgVU1BUCBmcm9tIGl0LgoKYGBge3Igc2F2ZSBoYXJtb255LCBsaXZlID0gVFJVRX0KIyBTdG9yZSBQQ0EgYXMgYGhhcm1vbnlfUENBYApyZWR1Y2VkRGltKG1lcmdlZF9zY2UsICJoYXJtb255X1BDQSIpIDwtIGhhcm1vbnlfcGNhCgojIEFzIGJlZm9yZSwgY2FsY3VsYXRlIFVNQVAgb24gdGhpcyBQQ0EgbWF0cml4IHdpdGggYXBwcm9wcmlhdGUgbmFtZXMKbWVyZ2VkX3NjZSA8LSBzY2F0ZXI6OnJ1blVNQVAobWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImhhcm1vbnlfUENBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAgID0gImhhcm1vbnlfVU1BUCIpCmBgYAoKCkxldCdzIHNlZSBob3cgdGhlIGBoYXJtb255YCBVTUFQLCBjb2xvcmVkIGJ5IHNhbXBsZSwgbG9va3MgY29tcGFyZWQgdG8gdGhlIGBmYXN0TU5OYCBVTUFQOgoKYGBge3IgcGxvdCBoYXJtb255IHVtYXAgYmF0Y2hlc30Kc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJoYXJtb255X1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gInNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgbmFtZSA9ICJzYW1wbGUiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArCiAgZ2d0aXRsZSgiVU1BUCBhZnRlciBpbnRlZ3JhdGlvbiB3aXRoIGhhcm1vbnkiKQpgYGAKCkhvdyBkbyB5b3UgdGhpbmsgdGhpcyBgaGFybW9ueWAgVU1BUCBjb21wYXJlcyB0byB0aGF0IGZyb20gYGZhc3RNTk5gIGludGVncmF0aW9uPwoKTGV0J3Mgc2VlIGhvdyB0aGlzIFVNQVAgbG9va3MgY29sb3JlZCBieSBjZWxsIHR5cGUsIGFuZCBmYWNldGVkIGZvciB2aXNpYmlsaXR5OgoKYGBge3IgcGxvdCBoYXJtb255IHVtYXAgY2VsbHR5cGVzfQpzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImhhcm1vbnlfVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAiY2VsbHR5cGVfYnJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBTcGVjaWZ5IHZhcmlhYmxlIGZvciBmYWNldGluZwogICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9ICJzYW1wbGUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gIkJyb2FkIGNlbGx0eXBlIiwgbmEudmFsdWUgPSAiZ3JleTgwIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIGdndGl0bGUoIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBoYXJtb255IikgKwogIGZhY2V0X3dyYXAodmFycyhzYW1wbGUpKQpgYGAKCldoYXQgZG8geW91IG5vdyBub3RpY2UgaW4gdGhpcyBmYWNldGVkIHZpZXcgdGhhdCB3YXNuJ3QgY2xlYXIgcHJldmlvdXNseT8KQXJlIHRoZXJlIG90aGVyIHBhdHRlcm5zIHlvdSBzZWUgdGhhdCBhcmUgc2ltaWxhciBvciBkaWZmZXJlbnQgZnJvbSB0aGUgYGZhc3RNTk5gIFVNQVA/CkhvdyBkbyB5b3UgdGhpbmsgYGZhc3RNTk5gIHZzLiBgaGFybW9ueWAgcGVyZm9ybWVkIGluIGludGVncmF0aW5nIHRoZXNlIHNhbXBsZXM/CgojIyBFeHBvcnQKCkZpbmFsbHksIHdlJ2xsIGV4cG9ydCB0aGUgZmluYWwgU0NFIG9iamVjdCB3aXRoIGJvdGggYGZhc3RNTk5gIGFuZCBgaGFybW9ueWAgaW50ZWdyYXRpb24gdG8gYSBmaWxlLgpTaW5jZSB0aGlzIG9iamVjdCBpcyB2ZXJ5IGxhcmdlIChvdmVyIDEgR0IhKSwgd2UnbGwgZXhwb3J0IGl0IHRvIGEgZmlsZSB3aXRoIHNvbWUgY29tcHJlc3Npb24sIHdoaWNoLCBpbiB0aGlzIGNhc2UsIHdpbGwgcmVkdWNlIHRoZSBmaW5hbCBzaXplIHRvIGEgc21hbGxlciB+MzYwIE1CLgpUaGlzIHdpbGwgdGFrZSBhIGNvdXBsZSBtaW51dGVzIHRvIHNhdmUgd2hpbGUgY29tcHJlc3Npb24gaXMgcGVyZm9ybWVkLgoKYGBge3Igc2F2ZSBpbnRlZ3JhdGlvbiwgbGl2ZSA9IFRSVUV9CiMgRXhwb3J0IHRvIFJEUyBmaWxlIHdpdGggImd6IiBjb21wcmVzc2lvbgpyZWFkcjo6d3JpdGVfcmRzKAogIG1lcmdlZF9zY2UsCiAgaW50ZWdyYXRlZF9zY2VfZmlsZSwKICBjb21wcmVzcyA9ICJneiIKKQpgYGAKCgojIyBQcmludCBzZXNzaW9uIGluZm8KCkFzIGFsd2F5cywgd2UnbGwgcHJpbnQgdGhlIHNlc3Npb24gaW5mbyB0byBiZSB0cmFuc3BhcmVudCBhYm91dCB3aGF0IHBhY2thZ2VzLCBhbmQgd2hpY2ggdmVyc2lvbnMsIHdlcmUgdXNlZCBkdXJpbmcgdGhpcyBSIHNlc3Npb24uCgpgYGB7ciBzZXNzaW9uaW5mb30Kc2Vzc2lvbkluZm8oKQpgYGAK
    diff --git a/scRNA-seq-advanced/03-differential_expression-live.Rmd b/scRNA-seq-advanced/03-differential_expression-live.Rmd index 82022af2..fd878bf0 100644 --- a/scRNA-seq-advanced/03-differential_expression-live.Rmd +++ b/scRNA-seq-advanced/03-differential_expression-live.Rmd @@ -68,27 +68,35 @@ To begin, let's set up our directories and files: data_dir <- file.path("data", "rms") # integrated file containing samples to use for DE analysis -integrated_sce_file <- file.path(data_dir, - "integrated", - "rms_all_sce.rds") +integrated_sce_file <- file.path( + data_dir, + "integrated", + "rms_all_sce.rds" +) # sample metadata to set up DE analysis -sample_metadata_file <- file.path(data_dir, - "annotations", - "rms_sample_metadata.tsv") +sample_metadata_file <- file.path( + data_dir, + "annotations", + "rms_sample_metadata.tsv" +) # directory to store output deseq_dir <- file.path("analysis", "rms", "deseq") fs::dir_create(deseq_dir) # results file to output from DE analysis -deseq_output_file <- file.path(deseq_dir, - "rms_myoblast_deseq_results.tsv") +deseq_output_file <- file.path( + deseq_dir, + "rms_myoblast_deseq_results.tsv" +) # output integrated sce object -output_sce_file <- file.path(data_dir, - "integrated", - "rms_subset_sce.rds") +output_sce_file <- file.path( + data_dir, + "integrated", + "rms_subset_sce.rds" +) ``` We can go ahead and read in the SCE object and the metadata file. @@ -172,17 +180,21 @@ coldata_df <- colData(integrated_sce) |> dplyr::left_join(sample_metadata, by = c("sample" = "library_id")) |> # create new columns # cell_id is a combination of barcode and sample - dplyr::mutate(cell_id = glue::glue("{sample}-{barcode}"), - # simplify subdiagnosis - diagnosis_group = forcats::fct_recode( - subdiagnosis, - "ARMS" = "Alveolar rhabdomyosarcoma", - "ERMS" = "Embryonal rhabdomyosarcoma" - )) + dplyr::mutate( + cell_id = glue::glue("{sample}-{barcode}"), + # simplify subdiagnosis + diagnosis_group = forcats::fct_recode( + subdiagnosis, + "ARMS" = "Alveolar rhabdomyosarcoma", + "ERMS" = "Embryonal rhabdomyosarcoma" + ) + ) # add modified data frame back to SCE as DataFrame -colData(integrated_sce) <- DataFrame(coldata_df, - row.names = coldata_df$cell_id) +colData(integrated_sce) <- DataFrame( + coldata_df, + row.names = coldata_df$cell_id +) ``` Now when we look at the `colData` of the SCE object we should see new columns, including the `diagnosis_group` column which indicates if each cell comes from an ERMS or ARMS sample. @@ -218,12 +230,14 @@ The samples which could be further classified have a mix of `Tumor_Mesoderm`, `T ```{r celltype UMAP} # UMAP of all samples labeled by cell type -scater::plotReducedDim(integrated_sce, - dimred = "fastmnn_UMAP", - # color each point by cell type - color_by = "celltype_broad", - point_size = 0.5, - point_alpha = 0.4) + +scater::plotReducedDim( + integrated_sce, + dimred = "fastmnn_UMAP", + # color each point by cell type + color_by = "celltype_broad", + point_size = 0.5, + point_alpha = 0.4 +) + # Modify the legend key with larger, easier to see points guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) ``` @@ -241,9 +255,9 @@ In the below plot we will color our cells by cell type while also using `facet_g # UMAP of all samples # separating by diagnosis group and labeling cell type - # color each point by cell type + # color each point by cell type - # tell scater to use diagnosis_group for plotting + # tell scater to use diagnosis_group for plotting # include each diagnosis group as its own column @@ -261,20 +275,22 @@ tumor_cells_df <- coldata_df |> # create a stacked barplot ggplot(tumor_cells_df, aes(x = sample, fill = celltype_broad)) + - geom_bar(position = "fill", color = "black", size = 0.2) + - labs( - x = "Sample", - y = "Proportion of cells", - fill = "Cell type" - ) + + geom_bar(position = "fill", color = "black", size = 0.2) + + labs( + x = "Sample", + y = "Proportion of cells", + fill = "Cell type" + ) + scale_fill_brewer(palette = "Dark2") + theme_bw() + - theme(axis.text.x = element_text(angle = 90, vjust = 0.5))+ + theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) + # facet by diagnosis group - facet_grid(cols = vars(diagnosis_group), - # only show non-NA values on x-axis - scales = "free_x", - space = "free_x") + facet_grid( + cols = vars(diagnosis_group), + # only show non-NA values on x-axis + scales = "free_x", + space = "free_x" + ) ``` Similar to the UMAP, this plot shows that ARMS and ERMS share a lot of the same cell types. @@ -366,8 +382,10 @@ We'll start by creating a fake matrix of counts. counts_mtx <- matrix( 1:12, ncol = 4, - dimnames = list(c("geneA", "geneB", "geneC"), - c("A-cell1", "A-cell2", "B-cell1", "B-cell2")) + dimnames = list( + c("geneA", "geneB", "geneC"), + c("A-cell1", "A-cell2", "B-cell1", "B-cell2") + ) ) counts_mtx ``` @@ -401,8 +419,10 @@ pb_groups <- colData(rms_sce)[, c("celltype_broad", "sample")] # create a new SCE object that contains # the pseudo-bulked counts across the provided groups -pb_sce <- scuttle::aggregateAcrossCells(rms_sce, - id = pb_groups) +pb_sce <- scuttle::aggregateAcrossCells( + rms_sce, + id = pb_groups +) # column names aren't automatically added to the pseudo-bulked sce, # so let's add them in @@ -519,8 +539,10 @@ As a reminder, this is NOT required for running `DESeq2` analysis; we are just u deseq_object <- DESeq2::estimateSizeFactors(deseq_object) # normalize and log transform to use for visualization -normalized_object <- DESeq2::rlog(deseq_object, - blind = TRUE) +normalized_object <- DESeq2::rlog( + deseq_object, + blind = TRUE +) normalized_object ``` @@ -632,18 +654,19 @@ This package automatically colors the points by cutoffs for both significance an Even better, it outputs a `ggplot2` object, so if we want to customize the plot further, we can use the same `ggplot2` commands we have used before. ```{r volcano} -EnhancedVolcano::EnhancedVolcano(deseq_results, - x = 'log2FoldChange', # fold change statistic to plot - y = 'pvalue', # significance values - lab = deseq_results$gene_symbol, # labels for points - pCutoff = 1e-05, # p value cutoff (default) - FCcutoff = 1, # fold change cutoff (default) - title = NULL, # no title - subtitle = NULL, # or subtitle - caption = NULL, # or caption - drawConnectors = TRUE, # add some fun arrows - labSize = 3 # smaller labels - ) + +EnhancedVolcano::EnhancedVolcano( + deseq_results, + x = "log2FoldChange", # fold change statistic to plot + y = "pvalue", # significance values + lab = deseq_results$gene_symbol, # labels for points + pCutoff = 1e-05, # p value cutoff (default) + FCcutoff = 1, # fold change cutoff (default) + title = NULL, # no title + subtitle = NULL, # or subtitle + caption = NULL, # or caption + drawConnectors = TRUE, # add some fun arrows + labSize = 3 # smaller labels +) + # change the overall theme theme_bw() + # move the legend to the bottom @@ -669,10 +692,12 @@ However, we might be interested to see the expression of genes that are differen ```{r celltype comparison} # let's compare gene expression across some other cell types # look at all tumor cells and pick one normal cell type -celltypes <- c("Tumor_Myoblast", - "Tumor_Mesoderm", - "Tumor_Myocyte", - "Vascular Endothelium") +celltypes <- c( + "Tumor_Myoblast", + "Tumor_Mesoderm", + "Tumor_Myocyte", + "Vascular Endothelium" +) # subset to just celltypes that we are interested in tumor_sce <- rms_sce[, which(rms_sce$celltype_broad %in% celltypes)] @@ -687,28 +712,37 @@ We can then directly reference that `Feature` column when plotting, instead of u ```{r multi-gene plot} # pick a couple genes to look at -genes_to_plot <- c("ENSG00000196090", #PTPRT - "ENSG00000148935") #GAS2 +genes_to_plot <- c( + "ENSG00000196090", # PTPRT + "ENSG00000148935" +) # GAS2 # create a violin plot -scater::plotExpression(tumor_sce, - # a vector of genes to plot - features = genes_to_plot, - x = "diagnosis_group", - color_by = "diagnosis_group", - other_fields = "celltype_broad", - point_size = 0.1) + +scater::plotExpression( + tumor_sce, + # a vector of genes to plot + features = genes_to_plot, + x = "diagnosis_group", + color_by = "diagnosis_group", + other_fields = "celltype_broad", + point_size = 0.1 +) + # each celltype is its own column - facet_grid(cols = vars(celltype_broad), - # each feature (gene) is its own row - rows = vars(Feature)) + + facet_grid( + cols = vars(celltype_broad), + # each feature (gene) is its own row + rows = vars(Feature) + ) + # change the font size of the facet labels theme(strip.text = element_text(size = 7)) + - guides(color = guide_legend( - title = "Subtype", # update the legend title - # change the size of the legend colors - override.aes = list(size = 3, alpha = 1)) + guides( + color = guide_legend( + # update the legend title + title = "Subtype", + # change the size of the legend colors + override.aes = list(size = 3, alpha = 1) ) + ) ``` How do the expression of these genes change across cell types and RMS subtypes? diff --git a/scRNA-seq-advanced/03-differential_expression.Rmd b/scRNA-seq-advanced/03-differential_expression.Rmd index 43d0cb9e..55f1ea68 100644 --- a/scRNA-seq-advanced/03-differential_expression.Rmd +++ b/scRNA-seq-advanced/03-differential_expression.Rmd @@ -68,27 +68,35 @@ To begin, let's set up our directories and files: data_dir <- file.path("data", "rms") # integrated file containing samples to use for DE analysis -integrated_sce_file <- file.path(data_dir, - "integrated", - "rms_all_sce.rds") +integrated_sce_file <- file.path( + data_dir, + "integrated", + "rms_all_sce.rds" +) # sample metadata to set up DE analysis -sample_metadata_file <- file.path(data_dir, - "annotations", - "rms_sample_metadata.tsv") +sample_metadata_file <- file.path( + data_dir, + "annotations", + "rms_sample_metadata.tsv" +) # directory to store output deseq_dir <- file.path("analysis", "rms", "deseq") fs::dir_create(deseq_dir) # results file to output from DE analysis -deseq_output_file <- file.path(deseq_dir, - "rms_myoblast_deseq_results.tsv") +deseq_output_file <- file.path( + deseq_dir, + "rms_myoblast_deseq_results.tsv" +) # output integrated sce object -output_sce_file <- file.path(data_dir, - "integrated", - "rms_subset_sce.rds") +output_sce_file <- file.path( + data_dir, + "integrated", + "rms_subset_sce.rds" +) ``` We can go ahead and read in the SCE object and the metadata file. @@ -174,17 +182,21 @@ coldata_df <- colData(integrated_sce) |> dplyr::left_join(sample_metadata, by = c("sample" = "library_id")) |> # create new columns # cell_id is a combination of barcode and sample - dplyr::mutate(cell_id = glue::glue("{sample}-{barcode}"), - # simplify subdiagnosis - diagnosis_group = forcats::fct_recode( - subdiagnosis, - "ARMS" = "Alveolar rhabdomyosarcoma", - "ERMS" = "Embryonal rhabdomyosarcoma" - )) + dplyr::mutate( + cell_id = glue::glue("{sample}-{barcode}"), + # simplify subdiagnosis + diagnosis_group = forcats::fct_recode( + subdiagnosis, + "ARMS" = "Alveolar rhabdomyosarcoma", + "ERMS" = "Embryonal rhabdomyosarcoma" + ) + ) # add modified data frame back to SCE as DataFrame -colData(integrated_sce) <- DataFrame(coldata_df, - row.names = coldata_df$cell_id) +colData(integrated_sce) <- DataFrame( + coldata_df, + row.names = coldata_df$cell_id +) ``` Now when we look at the `colData` of the SCE object we should see new columns, including the `diagnosis_group` column which indicates if each cell comes from an ERMS or ARMS sample. @@ -204,11 +216,13 @@ In the chunk below we will start by taking a look at our integration results and ```{r diagnosis group UMAP, live=TRUE} # UMAP of all samples, separating by diagnosis group -scater::plotReducedDim(integrated_sce, - dimred = "fastmnn_UMAP", - color_by = "diagnosis_group", - point_size= 0.5, - point_alpha = 0.2) +scater::plotReducedDim( + integrated_sce, + dimred = "fastmnn_UMAP", + color_by = "diagnosis_group", + point_size = 0.5, + point_alpha = 0.2 +) ``` Interestingly, it looks like samples from the ARMS and ERMS subtypes tend to group with samples of the same subtype rather than all together. @@ -225,12 +239,14 @@ The samples which could be further classified have a mix of `Tumor_Mesoderm`, `T ```{r celltype UMAP} # UMAP of all samples labeled by cell type -scater::plotReducedDim(integrated_sce, - dimred = "fastmnn_UMAP", - # color each point by cell type - color_by = "celltype_broad", - point_size = 0.5, - point_alpha = 0.4) + +scater::plotReducedDim( + integrated_sce, + dimred = "fastmnn_UMAP", + # color each point by cell type + color_by = "celltype_broad", + point_size = 0.5, + point_alpha = 0.4 +) + # Modify the legend key with larger, easier to see points guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) ``` @@ -247,14 +263,16 @@ In the below plot we will color our cells by cell type while also using `facet_g ```{r celltype subdiagnosis UMAP, live=TRUE} # UMAP of all samples # separating by diagnosis group and labeling cell type -scater::plotReducedDim(integrated_sce, - dimred = "fastmnn_UMAP", - # color each point by cell type - color_by = "celltype_broad", - point_size= 0.5, - point_alpha = 0.4, - # tell scater to use diagnosis_group for plotting - other_fields = "diagnosis_group") + +scater::plotReducedDim( + integrated_sce, + dimred = "fastmnn_UMAP", + # color each point by cell type + color_by = "celltype_broad", + point_size = 0.5, + point_alpha = 0.4, + # tell scater to use diagnosis_group for plotting + other_fields = "diagnosis_group" +) + # include each diagnosis group as its own column facet_grid(cols = vars(diagnosis_group)) ``` @@ -271,20 +289,22 @@ tumor_cells_df <- coldata_df |> # create a stacked barplot ggplot(tumor_cells_df, aes(x = sample, fill = celltype_broad)) + - geom_bar(position = "fill", color = "black", size = 0.2) + - labs( - x = "Sample", - y = "Proportion of cells", - fill = "Cell type" - ) + + geom_bar(position = "fill", color = "black", size = 0.2) + + labs( + x = "Sample", + y = "Proportion of cells", + fill = "Cell type" + ) + scale_fill_brewer(palette = "Dark2") + theme_bw() + - theme(axis.text.x = element_text(angle = 90, vjust = 0.5))+ + theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) + # facet by diagnosis group - facet_grid(cols = vars(diagnosis_group), - # only show non-NA values on x-axis - scales = "free_x", - space = "free_x") + facet_grid( + cols = vars(diagnosis_group), + # only show non-NA values on x-axis + scales = "free_x", + space = "free_x" + ) ``` Similar to the UMAP, this plot shows that ARMS and ERMS share a lot of the same cell types. @@ -376,8 +396,10 @@ We'll start by creating a fake matrix of counts. counts_mtx <- matrix( 1:12, ncol = 4, - dimnames = list(c("geneA", "geneB", "geneC"), - c("A-cell1", "A-cell2", "B-cell1", "B-cell2")) + dimnames = list( + c("geneA", "geneB", "geneC"), + c("A-cell1", "A-cell2", "B-cell1", "B-cell2") + ) ) counts_mtx ``` @@ -390,8 +412,7 @@ To do this we will use the `DelayedArray::colsum()` function, which allows us to groups <- c("A", "A", "B", "B") # sum counts across cells (columns) by group label -pb_counts <- DelayedArray::colsum(counts_mtx, - groups) +pb_counts <- DelayedArray::colsum(counts_mtx, groups) pb_counts ``` @@ -414,8 +435,10 @@ pb_groups <- colData(rms_sce)[, c("celltype_broad", "sample")] # create a new SCE object that contains # the pseudo-bulked counts across the provided groups -pb_sce <- scuttle::aggregateAcrossCells(rms_sce, - id = pb_groups) +pb_sce <- scuttle::aggregateAcrossCells( + rms_sce, + id = pb_groups +) # column names aren't automatically added to the pseudo-bulked sce, # so let's add them in @@ -514,8 +537,10 @@ The subtype information is stored in the `diagnosis_group` column of the `colDat ```{r deseq object, live=TRUE} # set up the deseq object, group by diagnosis -deseq_object <- DESeq2::DESeqDataSet(tumor_myoblast_sce, - design = ~ diagnosis_group) +deseq_object <- DESeq2::DESeqDataSet( + tumor_myoblast_sce, + design = ~diagnosis_group +) ``` The pseudo-bulked SCE object contains only one assay: the `counts` assay. @@ -536,8 +561,10 @@ As a reminder, this is NOT required for running `DESeq2` analysis; we are just u deseq_object <- DESeq2::estimateSizeFactors(deseq_object) # normalize and log transform to use for visualization -normalized_object <- DESeq2::rlog(deseq_object, - blind = TRUE) +normalized_object <- DESeq2::rlog( + deseq_object, + blind = TRUE +) normalized_object ``` @@ -651,18 +678,19 @@ This package automatically colors the points by cutoffs for both significance an Even better, it outputs a `ggplot2` object, so if we want to customize the plot further, we can use the same `ggplot2` commands we have used before. ```{r volcano} -EnhancedVolcano::EnhancedVolcano(deseq_results, - x = 'log2FoldChange', # fold change statistic to plot - y = 'pvalue', # significance values - lab = deseq_results$gene_symbol, # labels for points - pCutoff = 1e-05, # p value cutoff (default) - FCcutoff = 1, # fold change cutoff (default) - title = NULL, # no title - subtitle = NULL, # or subtitle - caption = NULL, # or caption - drawConnectors = TRUE, # add some fun arrows - labSize = 3 # smaller labels - ) + +EnhancedVolcano::EnhancedVolcano( + deseq_results, + x = "log2FoldChange", # fold change statistic to plot + y = "pvalue", # significance values + lab = deseq_results$gene_symbol, # labels for points + pCutoff = 1e-05, # p value cutoff (default) + FCcutoff = 1, # fold change cutoff (default) + title = NULL, # no title + subtitle = NULL, # or subtitle + caption = NULL, # or caption + drawConnectors = TRUE, # add some fun arrows + labSize = 3 # smaller labels +) + # change the overall theme theme_bw() + # move the legend to the bottom @@ -680,12 +708,14 @@ This can help us validate the `DESeq2` results so that we can visualize gene exp myoblast_combined_sce <- rms_sce[, which(rms_sce$celltype_broad == "Tumor_Myoblast")] # plot PTPRT (ENSG00000196090) expression in ARMS vs. ERMS -scater::plotReducedDim(myoblast_combined_sce, - dimred = "fastmnn_UMAP", - color_by = "ENSG00000196090", #PTPRT - point_size= 0.5, - point_alpha = 0.4, - other_fields = "diagnosis_group") + +scater::plotReducedDim( + myoblast_combined_sce, + dimred = "fastmnn_UMAP", + color_by = "ENSG00000196090", # PTPRT + point_size = 0.5, + point_alpha = 0.4, + other_fields = "diagnosis_group" +) + facet_grid(cols = vars(diagnosis_group)) ``` @@ -695,10 +725,12 @@ However, we might be interested to see the expression of genes that are differen ```{r celltype comparison} # let's compare gene expression across some other cell types # look at all tumor cells and pick one normal cell type -celltypes <- c("Tumor_Myoblast", - "Tumor_Mesoderm", - "Tumor_Myocyte", - "Vascular Endothelium") +celltypes <- c( + "Tumor_Myoblast", + "Tumor_Mesoderm", + "Tumor_Myocyte", + "Vascular Endothelium" +) # subset to just celltypes that we are interested in tumor_sce <- rms_sce[, which(rms_sce$celltype_broad %in% celltypes)] @@ -713,28 +745,37 @@ We can then directly reference that `Feature` column when plotting, instead of u ```{r multi-gene plot} # pick a couple genes to look at -genes_to_plot <- c("ENSG00000196090", #PTPRT - "ENSG00000148935") #GAS2 +genes_to_plot <- c( + "ENSG00000196090", # PTPRT + "ENSG00000148935" +) # GAS2 # create a violin plot -scater::plotExpression(tumor_sce, - # a vector of genes to plot - features = genes_to_plot, - x = "diagnosis_group", - color_by = "diagnosis_group", - other_fields = "celltype_broad", - point_size = 0.1) + +scater::plotExpression( + tumor_sce, + # a vector of genes to plot + features = genes_to_plot, + x = "diagnosis_group", + color_by = "diagnosis_group", + other_fields = "celltype_broad", + point_size = 0.1 +) + # each celltype is its own column - facet_grid(cols = vars(celltype_broad), - # each feature (gene) is its own row - rows = vars(Feature)) + + facet_grid( + cols = vars(celltype_broad), + # each feature (gene) is its own row + rows = vars(Feature) + ) + # change the font size of the facet labels theme(strip.text = element_text(size = 7)) + - guides(color = guide_legend( - title = "Subtype", # update the legend title - # change the size of the legend colors - override.aes = list(size = 3, alpha = 1)) + guides( + color = guide_legend( + # update the legend title + title = "Subtype", + # change the size of the legend colors + override.aes = list(size = 3, alpha = 1) ) + ) ``` How do the expression of these genes change across cell types and RMS subtypes? diff --git a/scRNA-seq-advanced/03-differential_expression.nb.html b/scRNA-seq-advanced/03-differential_expression.nb.html index 4a6d15be..33bb78ec 100644 --- a/scRNA-seq-advanced/03-differential_expression.nb.html +++ b/scRNA-seq-advanced/03-differential_expression.nb.html @@ -2979,33 +2979,41 @@

    Directories and files

    To begin, let’s set up our directories and files:

    - +
    # set up file paths
     # data directory for RMS data
     data_dir <- file.path("data", "rms")
     
     # integrated file containing samples to use for DE analysis
    -integrated_sce_file <- file.path(data_dir,
    -                                 "integrated",
    -                                 "rms_all_sce.rds")
    +integrated_sce_file <- file.path(
    +  data_dir,
    +  "integrated",
    +  "rms_all_sce.rds"
    +)
     
     # sample metadata to set up DE analysis
    -sample_metadata_file <- file.path(data_dir,
    -                                  "annotations",
    -                                  "rms_sample_metadata.tsv")
    +sample_metadata_file <- file.path(
    +  data_dir,
    +  "annotations",
    +  "rms_sample_metadata.tsv"
    +)
     
     # directory to store output
     deseq_dir <- file.path("analysis", "rms", "deseq")
     fs::dir_create(deseq_dir)
     
     # results file to output from DE analysis
    -deseq_output_file <- file.path(deseq_dir,
    -                               "rms_myoblast_deseq_results.tsv")
    +deseq_output_file <- file.path(
    +  deseq_dir,
    +  "rms_myoblast_deseq_results.tsv"
    +)
     
     # output integrated sce object
    -output_sce_file <- file.path(data_dir,
    -                             "integrated",
    -                             "rms_subset_sce.rds")
    +output_sce_file <- file.path( + data_dir, + "integrated", + "rms_subset_sce.rds" +)
    @@ -3178,7 +3186,7 @@

    Cell type annotations

    plotting.

    - +
    # add sample metadata to colData from the integrated SCE object
     coldata_df <- colData(integrated_sce) |>
       # convert from DataFrame to data.frame
    @@ -3187,17 +3195,21 @@ 

    Cell type annotations

    dplyr::left_join(sample_metadata, by = c("sample" = "library_id")) |> # create new columns # cell_id is a combination of barcode and sample - dplyr::mutate(cell_id = glue::glue("{sample}-{barcode}"), - # simplify subdiagnosis - diagnosis_group = forcats::fct_recode( - subdiagnosis, - "ARMS" = "Alveolar rhabdomyosarcoma", - "ERMS" = "Embryonal rhabdomyosarcoma" - )) + dplyr::mutate( + cell_id = glue::glue("{sample}-{barcode}"), + # simplify subdiagnosis + diagnosis_group = forcats::fct_recode( + subdiagnosis, + "ARMS" = "Alveolar rhabdomyosarcoma", + "ERMS" = "Embryonal rhabdomyosarcoma" + ) + ) # add modified data frame back to SCE as DataFrame -colData(integrated_sce) <- DataFrame(coldata_df, - row.names = coldata_df$cell_id)
    +colData(integrated_sce) <- DataFrame( + coldata_df, + row.names = coldata_df$cell_id +) @@ -3230,13 +3242,15 @@

    Plotting with annotations

    multiple libraries or samples.

    - +
    # UMAP of all samples, separating by diagnosis group
    -scater::plotReducedDim(integrated_sce,
    -                       dimred = "fastmnn_UMAP",
    -                       color_by = "diagnosis_group",
    -                       point_size= 0.5,
    -                       point_alpha = 0.2)
    +scater::plotReducedDim( + integrated_sce, + dimred = "fastmnn_UMAP", + color_by = "diagnosis_group", + point_size = 0.5, + point_alpha = 0.2 +)

    @@ -3262,14 +3276,16 @@

    Plotting with annotations

    Tumor_Myocyte.

    - +
    # UMAP of all samples labeled by cell type
    -scater::plotReducedDim(integrated_sce,
    -                       dimred = "fastmnn_UMAP",
    -                       # color each point by cell type
    -                       color_by = "celltype_broad",
    -                       point_size = 0.5,
    -                       point_alpha = 0.4) +
    +scater::plotReducedDim(
    +  integrated_sce,
    +  dimred = "fastmnn_UMAP",
    +  # color each point by cell type
    +  color_by = "celltype_broad",
    +  point_size = 0.5,
    +  point_alpha = 0.4
    +) +
       # Modify the legend key with larger, easier to see points
       guides(color = guide_legend(override.aes = list(size = 3, alpha = 1)))
    @@ -3298,17 +3314,19 @@

    Plotting with annotations

    be in their own plot panel.

    - +
    # UMAP of all samples
     # separating by diagnosis group and labeling cell type
    -scater::plotReducedDim(integrated_sce,
    -                       dimred = "fastmnn_UMAP",
    -                       # color each point by cell type
    -                       color_by = "celltype_broad",
    -                       point_size= 0.5,
    -                       point_alpha = 0.4,
    -                       # tell scater to use diagnosis_group for plotting
    -                       other_fields = "diagnosis_group") +
    +scater::plotReducedDim(
    +  integrated_sce,
    +  dimred = "fastmnn_UMAP",
    +  # color each point by cell type
    +  color_by = "celltype_broad",
    +  point_size = 0.5,
    +  point_alpha = 0.4,
    +  # tell scater to use diagnosis_group for plotting
    +  other_fields = "diagnosis_group"
    +) +
       # include each diagnosis group as its own column
       facet_grid(cols = vars(diagnosis_group))
    @@ -3324,7 +3342,7 @@

    Plotting with annotations

    first.

    - +
    # filter coldata to only include tumor cells
     tumor_cells_df <- coldata_df |>
       # find rows where the cell type name contains the string "Tumor"
    @@ -3332,20 +3350,22 @@ 

    Plotting with annotations

    # create a stacked barplot ggplot(tumor_cells_df, aes(x = sample, fill = celltype_broad)) + - geom_bar(position = "fill", color = "black", size = 0.2) + - labs( - x = "Sample", - y = "Proportion of cells", - fill = "Cell type" - ) + + geom_bar(position = "fill", color = "black", size = 0.2) + + labs( + x = "Sample", + y = "Proportion of cells", + fill = "Cell type" + ) + scale_fill_brewer(palette = "Dark2") + theme_bw() + - theme(axis.text.x = element_text(angle = 90, vjust = 0.5))+ + theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) + # facet by diagnosis group - facet_grid(cols = vars(diagnosis_group), - # only show non-NA values on x-axis - scales = "free_x", - space = "free_x")
    + facet_grid( + cols = vars(diagnosis_group), + # only show non-NA values on x-axis + scales = "free_x", + space = "free_x" + )
    Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
    @@ -3512,13 +3532,15 @@ 

    Pseudo-bulking

    matrix of counts.

    - +
    # create an example counts matrix
     counts_mtx <- matrix(
       1:12,
       ncol = 4,
    -  dimnames = list(c("geneA", "geneB", "geneC"),
    -                  c("A-cell1", "A-cell2", "B-cell1", "B-cell2"))
    +  dimnames = list(
    +    c("geneA", "geneB", "geneC"),
    +    c("A-cell1", "A-cell2", "B-cell1", "B-cell2")
    +  )
     )
     counts_mtx
    @@ -3537,13 +3559,12 @@

    Pseudo-bulking

    columns.

    - +
    # define the group that each column belongs to
     groups <- c("A", "A", "B", "B")
     
     # sum counts across cells (columns) by group label
    -pb_counts <- DelayedArray::colsum(counts_mtx,
    -                                  groups)
    +pb_counts <- DelayedArray::colsum(counts_mtx, groups)
     pb_counts
    @@ -3572,15 +3593,17 @@

    Pseudo-bulking

    type and original sample.

    - +
    # first subset the coldata
     # to only have the columns we care about for pseudo-bulking
     pb_groups <- colData(rms_sce)[, c("celltype_broad", "sample")]
     
     # create a new SCE object that contains
     # the pseudo-bulked counts across the provided groups
    -pb_sce <- scuttle::aggregateAcrossCells(rms_sce,
    -                                        id = pb_groups)
    +pb_sce <- scuttle::aggregateAcrossCells(
    +  rms_sce,
    +  id = pb_groups
    +)
     
     # column names aren't automatically added to the pseudo-bulked sce,
     # so let's add them in
    @@ -3752,10 +3775,12 @@ 

    Create the DESeqDataSet object

    colData in the pseudo-bulked SCE.

    - +
    # set up the deseq object, group by diagnosis
    -deseq_object <- DESeq2::DESeqDataSet(tumor_myoblast_sce,
    -                                     design = ~ diagnosis_group)
    +deseq_object <- DESeq2::DESeqDataSet( + tumor_myoblast_sce, + design = ~diagnosis_group +)
    converting counts to integer mode
    @@ -3782,13 +3807,15 @@

    Create the DESeqDataSet object

    we are just using it to visualize our data prior to DE analysis.

    - +
    # estimate size factors first
     deseq_object <- DESeq2::estimateSizeFactors(deseq_object)
     
     # normalize and log transform to use for visualization
    -normalized_object <- DESeq2::rlog(deseq_object,
    -                                  blind = TRUE)
    +normalized_object <- DESeq2::rlog(
    +  deseq_object,
    +  blind = TRUE
    +)
     normalized_object
    @@ -4028,19 +4055,20 @@

    Exploring the identified differentially expressed genes

    ggplot2 commands we have used before.

    - -
    EnhancedVolcano::EnhancedVolcano(deseq_results,
    -                x = 'log2FoldChange', # fold change statistic to plot
    -                y = 'pvalue', # significance values
    -                lab = deseq_results$gene_symbol, # labels for points
    -                pCutoff = 1e-05, # p value cutoff (default)
    -                FCcutoff = 1, # fold change cutoff (default)
    -                title = NULL, # no title
    -                subtitle = NULL, # or subtitle
    -                caption = NULL, # or caption
    -                drawConnectors = TRUE, # add some fun arrows
    -                labSize = 3  # smaller labels
    -                ) +
    +
    +
    EnhancedVolcano::EnhancedVolcano(
    +  deseq_results,
    +  x = "log2FoldChange", # fold change statistic to plot
    +  y = "pvalue", # significance values
    +  lab = deseq_results$gene_symbol, # labels for points
    +  pCutoff = 1e-05, # p value cutoff (default)
    +  FCcutoff = 1, # fold change cutoff (default)
    +  title = NULL, # no title
    +  subtitle = NULL, # or subtitle
    +  caption = NULL, # or caption
    +  drawConnectors = TRUE, # add some fun arrows
    +  labSize = 3 # smaller labels
    +) +
       # change the overall theme
       theme_bw() +
       # move the legend to the bottom
    @@ -4067,17 +4095,19 @@ 

    Exploring the identified differentially expressed genes

    interest on a single-cell level.

    - +
    # filter to just myoblast cells and remove any NA's before plotting
     myoblast_combined_sce <- rms_sce[, which(rms_sce$celltype_broad == "Tumor_Myoblast")]
     
     # plot PTPRT (ENSG00000196090) expression in ARMS vs. ERMS
    -scater::plotReducedDim(myoblast_combined_sce,
    -                       dimred = "fastmnn_UMAP",
    -                       color_by = "ENSG00000196090", #PTPRT
    -                       point_size= 0.5,
    -                       point_alpha = 0.4,
    -                       other_fields = "diagnosis_group") +
    +scater::plotReducedDim(
    +  myoblast_combined_sce,
    +  dimred = "fastmnn_UMAP",
    +  color_by = "ENSG00000196090", # PTPRT
    +  point_size = 0.5,
    +  point_alpha = 0.4,
    +  other_fields = "diagnosis_group"
    +) +
       facet_grid(cols = vars(diagnosis_group))
    @@ -4091,13 +4121,15 @@

    Exploring the identified differentially expressed genes

    types present in our samples.

    - +
    # let's compare gene expression across some other cell types
     # look at all tumor cells and pick one normal cell type
    -celltypes <- c("Tumor_Myoblast",
    -               "Tumor_Mesoderm",
    -               "Tumor_Myocyte",
    -               "Vascular Endothelium")
    +celltypes <- c(
    +  "Tumor_Myoblast",
    +  "Tumor_Mesoderm",
    +  "Tumor_Myocyte",
    +  "Vascular Endothelium"
    +)
     
     # subset to just celltypes that we are interested in
     tumor_sce <- rms_sce[, which(rms_sce$celltype_broad %in% celltypes)]
    @@ -4121,30 +4153,39 @@

    Exploring the identified differentially expressed genes

    previously.

    - +
    # pick a couple genes to look at
    -genes_to_plot <- c("ENSG00000196090", #PTPRT
    -                   "ENSG00000148935") #GAS2
    +genes_to_plot <- c(
    +  "ENSG00000196090", # PTPRT
    +  "ENSG00000148935"
    +) # GAS2
     
     # create a violin plot
    -scater::plotExpression(tumor_sce,
    -                       # a vector of genes to plot
    -                       features = genes_to_plot,
    -                       x = "diagnosis_group",
    -                       color_by = "diagnosis_group",
    -                       other_fields = "celltype_broad",
    -                       point_size = 0.1) +
    +scater::plotExpression(
    +  tumor_sce,
    +  # a vector of genes to plot
    +  features = genes_to_plot,
    +  x = "diagnosis_group",
    +  color_by = "diagnosis_group",
    +  other_fields = "celltype_broad",
    +  point_size = 0.1
    +) +
       # each celltype is its own column
    -  facet_grid(cols = vars(celltype_broad),
    -             # each feature (gene) is its own row
    -             rows = vars(Feature)) +
    +  facet_grid(
    +    cols = vars(celltype_broad),
    +    # each feature (gene) is its own row
    +    rows = vars(Feature)
    +  ) +
       # change the font size of the facet labels
       theme(strip.text = element_text(size = 7)) +
    -  guides(color = guide_legend(
    -    title = "Subtype", # update the legend title
    -    # change the size of the legend colors
    -    override.aes = list(size = 3, alpha = 1))
    -    )
    + guides( + color = guide_legend( + # update the legend title + title = "Subtype", + # change the size of the legend colors + override.aes = list(size = 3, alpha = 1) + ) + )

    @@ -4263,7 +4304,7 @@

    Print session info

    -
    LS0tCnRpdGxlOiAiRGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMgZm9yIHNjUk5BLXNlcSBkYXRhIgphdXRob3I6ICJEYXRhIExhYiBmb3IgQUxTRiIKZGF0ZTogMjAyMwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCiMjIE9iamVjdGl2ZXMKClRoaXMgbm90ZWJvb2sgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG86CgotIFVzZSBwc2V1ZG8tYnVsa2luZyB0byBwcmVwYXJlIHNjUk5BLXNlcSBsaWJyYXJpZXMgZm9yIGRpZmZlcmVudGlhbCBleHByZXNzaW9uCi0gUGVyZm9ybSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiB3aXRoIHRoZSBgREVTZXEyYCBwYWNrYWdlCi0gVXNlIGBnZ3Bsb3QyYCBhbmQgYEVuaGFuY2VkVm9sY2Fub2AgdG8gdmlzdWFsaXplIGdlbmUgZXhwcmVzc2lvbiBjaGFuZ2VzIGFjcm9zcyBjZWxsIHR5cGVzIGFuZCBzYW1wbGVzCgotLS0KCkp1c3QgbGlrZSBidWxrIFJOQS1zZXEsIGl0IGlzIGxpa2VseSB0aGF0IG9uZSBvZiB0aGUgZ29hbHMgd2hlbiBwZXJmb3JtaW5nIHNjUk5BLXNlcSB3aWxsIGJlIHRvIGNvbXBhcmUgdGhlIGdlbmUgZXhwcmVzc2lvbiBvZiBtdWx0aXBsZSBzYW1wbGVzIHRvIGVhY2ggb3RoZXIuClVubGlrZSBidWxrIFJOQS1zZXEgYW5hbHlzaXMsIHNjUk5BLXNlcSBhbmFseXNpcyBhbGxvd3MgdXMgdG8gaWRlbnRpZnkgYW5kIGFubm90YXRlIGNlbGwgdHlwZXMgb3Igc3VicG9wdWxhdGlvbnMgb2YgY2VsbHMgcHJlc2VudCBpbiBlYWNoIG9mIG91ciBzYW1wbGVzLgpUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIGFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGluIGNlbGwgdHlwZSBjb21wb3NpdGlvbiBhY3Jvc3Mgc2FtcGxlcyBhbmQgc3BlY2lmaWNhbGx5IGZvY3VzIG9uIGNlbGwgdHlwZXMgb3IgcG9wdWxhdGlvbnMgb2YgaW50ZXJlc3Qgd2hlbiBwZXJmb3JtaW5nIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIChERSkgYW5hbHlzaXMuCkluIHRoaXMgbm90ZWJvb2ssIHdlIHdpbGwgd29yayB3aXRoIG11bHRpcGxlIHNhbXBsZXMgdG8gaWRlbnRpZnkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGFjcm9zcyBjZWxsIHR5cGVzIG9mIGludGVyZXN0IHVzaW5nIHRoZSBbYERFU2VxMmBdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9ERVNlcTIuaHRtbCkgcGFja2FnZS4KCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogRGlmZmVyZW50aWFsIGV4cHJlc3Npb25dKGRpYWdyYW1zL3JvYWRtYXBfZGlmZmVyZW50aWFsX2V4cHJlc3Npb24ucG5nKQoKV2Ugd2lsbCBjb250aW51ZSB3b3JraW5nIHdpdGggc2FtcGxlcyBmcm9tIHRoZSBbYFNDUENQMDAwMDA1YCBwcm9qZWN0XShodHRwczovL3NjcGNhLmFsZXhzbGVtb25hZGUub3JnL3Byb2plY3RzL1NDUENQMDAwMDA1KSwgYW4gaW52ZXN0aWdhdGlvbiBvZiBwZWRpYXRyaWMgc29saWQgdHVtb3JzIGxlZCBieSB0aGUgRHllciBhbmQgQ2hlbiBsYWJzIGF0IFN0LiBKdWRlIENoaWxkcmVuJ3MgUmVzZWFyY2ggSG9zcGl0YWwuClRoaXMgcGFydGljdWxhciBkYXRhc2V0IGNvbnRhaW5zIDEwIGRpZmZlcmVudCBzYW1wbGVzIHRoYXQgaGF2ZSBiZWVuIGludGVncmF0ZWQgdXNpbmcgYGZhc3RNTk5gLCBmb2xsb3dpbmcgdGhlIHNhbWUgcHJvY2VkdXJlIHdlIG91dGxpbmVkIGluIGAwMi1kYXRhc2V0X2ludGVncmF0aW9uLlJtZGAuClRoZXNlIDEwIHNhbXBsZXMgcmVwcmVzZW50IHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgcmhhYmRvbXlvc2FyY29tYSAoUk1TKTogZW1icnlvbmFsIHJoYWJkb215b3NhcmNvbWEgKEVSTVMpIGFuZCBhbHZlb2xhciByaGFiZG9teW9zYXJjb21hIChBUk1TKS4KVGhlc2UgdHdvIHN1YnR5cGVzIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgYFBBWDMvUEFYNy1GT1hPMWAgZnVzaW9uIGdlbmUsIHdoaWNoIGlzIHByZXNlbnQgb25seSBpbiBBUk1TIHBhdGllbnRzLgpBZGRpdGlvbmFsbHksIGNlbGxzIGZvdW5kIGluIEFSTVMgdHVtb3JzIHRlbmQgdG8gaGF2ZSBhbiBpbmNyZWFzZWQgbXV0YXRpb25hbCBidXJkZW4gd2l0aCBjZWxscyBpbiBhIG1vcmUgZGlmZmVyZW50aWF0ZWQgc3RhdGUgY29tcGFyZWQgdG8gRVJNUyB0dW1vciBjZWxscyAoW1NoZXJuIF9ldCBhbC5fIDIwMTRdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTU4LzIxNTktODI5MC5DRC0xMy0wNjM5KTsgW1N0ZXdhcnQgX2V0IGFsLl8gMjAxOF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5jY2VsbC4yMDE4LjA3LjAxMikpLgpSTVMgdHVtb3JzLCByZWdhcmRsZXNzIG9mIHN1YnR5cGUsIGFyZSBtYWRlIHVwIG9mIGNlbGxzIHR5cGljYWxseSBhc3NvY2lhdGVkIHdpdGggZGV2ZWxvcG1lbnQgb2Ygc2tlbGV0YWwgbXVzY2xlOiBtZXNvZGVybSwgbXlvYmxhc3RzLCBhbmQgbXlvY3l0ZXMgKFtTZWJpcmUgYW5kIE1hbG9uZSAyMDAzXShodHRwczovL2RvaS5vcmcvMTAuMTEzNi9qY3AuNTYuNi40MTIpKS4KW1BhdGVsIF9ldCBhbC5fICgyMDIyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5kZXZjZWwuMjAyMi4wNC4wMDMpIHRlc3RlZCB0aGUgaHlwb3RoZXNpcyB0aGF0IGNlbGwgdHlwZXMgaGF2ZSBkaXN0aW5jdCBnZW5lIGV4cHJlc3Npb24gcGF0dGVybnMgaW4gQVJNUyB2cy4gRVJNUyBzYW1wbGVzLgpIZXJlIHdlIHdpbGwgbG9vayBhdCBhIHN1YnNldCBvZiB0aGUgc2FtcGxlcyB0aGV5IHNlcXVlbmNlZCBhbmQgaWRlbnRpZnkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGluIHR1bW9yIGNlbGxzIGJldHdlZW4gQVJNUyBhbmQgRVJNUyBzYW1wbGVzLgoKIyMgU2V0IHVwCgpgYGB7ciBzZXR1cCwgbWVzc2FnZT1GQUxTRX0KIyBzZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5CnNldC5zZWVkKDIwMjIpCgojIGxvYWQgbGlicmFyaWVzCmxpYnJhcnkoZ2dwbG90MikgIyBwbG90dGluZyBmdW5jdGlvbnMKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKCiMgcGFja2FnZSB1c2VkIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcwpsaWJyYXJ5KERFU2VxMikKYGBgCgojIyMgRGlyZWN0b3JpZXMgYW5kIGZpbGVzCgpXZSB3aWxsIHN0YXJ0IGJ5IHJlYWRpbmcgaW4gYSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIChTQ0UpIG9iamVjdCB0aGF0IGNvbnRhaW5zIGJvdGggdGhlIHVuY29ycmVjdGVkIChtZXJnZWQgYnV0IG5vdCBpbnRlZ3JhdGVkKSBhbmQgY29ycmVjdGVkIChpbnRlZ3JhdGVkKSBnZW5lIGV4cHJlc3Npb24gZGF0YSBmb3IgYWxsIDEwIHNhbXBsZXMuCgpQcmlvciB0byBpbnRlZ3JhdGlvbiwgYWxsIDEwIHNhbXBsZXMgd2VudCB0aHJvdWdoIHRoZSBzYW1lIGZpbHRlcmluZywgbm9ybWFsaXphdGlvbiwgYW5kIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi4KVGhlc2UgMTAgc2FtcGxlcyB3ZXJlIHRoZW4gbWVyZ2VkIGludG8gb25lIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0IGZvbGxvd2luZyB0aGUgc2FtZSBzdGVwcyBvdXRsaW5lZCBpbiBgMDMtZGF0YXNldF9pbnRlZ3JhdGlvbi5SbWRgLgpUaGUgbWVyZ2VkIG9iamVjdCB3YXMgdGhlbiBpbnRlZ3JhdGVkIHdpdGggYGZhc3RNTk5gIHRvIG9idGFpbiBhIGNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gYXNzYXkgYW5kIGNvcnJlY3RlZCByZWR1Y2VkIGRpbWVuc2lvbmFsaXR5IHJlc3VsdHMuClRoZSBmaW5hbCBTQ0Ugb2JqZWN0IHdhcyBzdG9yZWQgaW4gYGRhdGEvcm1zL2ludGVncmF0ZWQvcm1zX2FsbF9zY2UucmRzYC4KCldlIGFsc28gaGF2ZSBwcm92aWRlZCBhIG1ldGFkYXRhIGZpbGUsIGBkYXRhL3Jtcy9hbm5vdGF0aW9ucy9ybXNfc2FtcGxlX21ldGFkYXRhLnRzdmAsIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gZnJvbSBlYWNoIHNhbXBsZSwgc3VjaCBhcyBkaWFnbm9zaXMsIHNleCwgYWdlLCBldGMuCkVhY2ggcm93IGluIHRoaXMgZmlsZSBjb3JyZXNwb25kcyB0byBhIHNhbXBsZSBmb3VuZCBpbiB0aGUgaW50ZWdyYXRlZCBTQ0Ugb2JqZWN0LgoKVG8gYmVnaW4sIGxldCdzIHNldCB1cCBvdXIgZGlyZWN0b3JpZXMgYW5kIGZpbGVzOgoKYGBge3IgZmlsZXBhdGhzfQojIHNldCB1cCBmaWxlIHBhdGhzCiMgZGF0YSBkaXJlY3RvcnkgZm9yIFJNUyBkYXRhCmRhdGFfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiKQoKIyBpbnRlZ3JhdGVkIGZpbGUgY29udGFpbmluZyBzYW1wbGVzIHRvIHVzZSBmb3IgREUgYW5hbHlzaXMKaW50ZWdyYXRlZF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ3JhdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJtc19hbGxfc2NlLnJkcyIpCgojIHNhbXBsZSBtZXRhZGF0YSB0byBzZXQgdXAgREUgYW5hbHlzaXMKc2FtcGxlX21ldGFkYXRhX2ZpbGUgPC0gZmlsZS5wYXRoKGRhdGFfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFubm90YXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJybXNfc2FtcGxlX21ldGFkYXRhLnRzdiIpCgojIGRpcmVjdG9yeSB0byBzdG9yZSBvdXRwdXQKZGVzZXFfZGlyIDwtIGZpbGUucGF0aCgiYW5hbHlzaXMiLCAicm1zIiwgImRlc2VxIikKZnM6OmRpcl9jcmVhdGUoZGVzZXFfZGlyKQoKIyByZXN1bHRzIGZpbGUgdG8gb3V0cHV0IGZyb20gREUgYW5hbHlzaXMKZGVzZXFfb3V0cHV0X2ZpbGUgPC0gZmlsZS5wYXRoKGRlc2VxX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJybXNfbXlvYmxhc3RfZGVzZXFfcmVzdWx0cy50c3YiKQoKIyBvdXRwdXQgaW50ZWdyYXRlZCBzY2Ugb2JqZWN0Cm91dHB1dF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVncmF0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJybXNfc3Vic2V0X3NjZS5yZHMiKQpgYGAKCldlIGNhbiBnbyBhaGVhZCBhbmQgcmVhZCBpbiB0aGUgU0NFIG9iamVjdCBhbmQgdGhlIG1ldGFkYXRhIGZpbGUuCgpgYGB7ciByZWFkIGZpbGVzLCBsaXZlPVRSVUV9CiMgcmVhZCBpbiB0aGUgU0NFIG9iamVjdCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW50ZWdyYXRlZAppbnRlZ3JhdGVkX3NjZSA8LSByZWFkcjo6cmVhZF9yZHMoaW50ZWdyYXRlZF9zY2VfZmlsZSkKCiMgcmVhZCBpbiBzYW1wbGUgbWV0YWRhdGEgZmlsZQpzYW1wbGVfbWV0YWRhdGEgPC0gcmVhZHI6OnJlYWRfdHN2KHNhbXBsZV9tZXRhZGF0YV9maWxlKQpgYGAKCiMjIERhdGFzZXQgZXhwbG9yYXRpb24KCkJlZm9yZSB3ZSBkaXZlIGludG8gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24sIGxldCdzIGV4cGxvcmUgb3VyIGludGVncmF0ZWQgU0NFIG9iamVjdCBhbmQgdGhlIGRhdGFzZXQgYSBsaXR0bGUgbW9yZS4KCldlJ2xsIHN0YXJ0IGJ5IGxvb2tpbmcgYXQgd2hhdCdzIGluc2lkZSB0aGUgb2JqZWN0LgpIZXJlIHdlIHNob3VsZCBoYXZlIGJvdGggdGhlIG9yaWdpbmFsICh1bmNvcnJlY3RlZCkgZGF0YSBhbmQgdGhlIGludGVncmF0ZWQgKGNvcnJlY3RlZCkgZGF0YSBmb3IgYm90aCB0aGUgZ2VuZSBleHByZXNzaW9uIGFuZCB0aGUgcmVkdWNlZCBkaW1lbnNpb25hbGl0eSByZXN1bHRzLgpIb3cgYXJlIHRob3NlIHN0b3JlZCBpbiBvdXIgb2JqZWN0PwoKYGBge3IgcHJpbnQgc2NlLCBsaXZlPVRSVUV9CiMgcHJpbnQgb3V0IGVudGlyZSBvYmplY3QKaW50ZWdyYXRlZF9zY2UKYGBgCgoKYGBge3IgcHJpbnQgYXNzYXkgbmFtZXMsIGxpdmU9VFJVRX0KIyBsb29rIGF0IHRoZSBhc3NheSBuYW1lcyBpbiBvdXIgb2JqZWN0CmFzc2F5TmFtZXMoaW50ZWdyYXRlZF9zY2UpCmBgYAoKV2hlbiB3ZSBsb29rIGF0IHRoZSBhc3NheSBuYW1lcyB3ZSBzaG91bGQgc2VlIHRoYXQgdGhlcmUgYXJlIDMgbWF0cmljZXMsIGBjb3VudHNgLCBgbG9nY291bnRzYCwgYW5kIGBmYXN0bW5uX2NvcnJlY3RlZGAuClRoZSBgY291bnRzYCBhbmQgYGxvZ2NvdW50c2AgYXNzYXlzIGNvcnJlc3BvbmQgdG8gdGhlIHVuY29ycmVjdGVkIGdlbmUgZXhwcmVzc2lvbiBkYXRhIHRoYXQgaGFzIGJlZW4gbWVyZ2VkIGJ1dCBOT1QgaW50ZWdyYXRlZC4KVGhlIGBmYXN0bW5uX2NvcnJlY3RlZGAgZGF0YSBjb250YWlucyB0aGUgY29ycmVjdGVkIGdlbmUgZXhwcmVzc2lvbiBkYXRhIG9idGFpbmVkIGZyb20gaW50ZWdyYXRpb24uCkZvciB0aGlzIGV4ZXJjaXNlIHdlIHdpbGwgbm90IGJlIHVzaW5nIHRoZSBgZmFzdG1ubl9jb3JyZWN0ZWRgIGRhdGEgKG1vcmUgb24gd2h5IG5vdCBvbmNlIHdlIGdldCB0byBzZXR0aW5nIHVwIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiksIGJ1dCB3ZSBuZWVkIHRvIGJlIGF3YXJlIHRoYXQgaXQgaXMgcHJlc2VudCBhbmQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIG91ciB1bmNvcnJlY3RlZCBkYXRhLgoKCmBgYHtyIHByaW50IHJlZHVjZWREaW0gbmFtZXMsIGxpdmU9VFJVRX0KIyBsb29rIGF0IHRoZSBuYW1lcyBvZiB0aGUgZGltZW5zaW9uIHJlZHVjdGlvbnMKcmVkdWNlZERpbU5hbWVzKGludGVncmF0ZWRfc2NlKQpgYGAKCkluIHRoZSBgcmVkdWNlZERpbWAgc2xvdHMgeW91IHNob3VsZCBzZWUgYFBDQWAgYW5kIGBVTUFQYCwgd2hpY2ggd2VyZSBib3RoIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY29tYmluZWQgZGF0YSBfYmVmb3JlXyBpbnRlZ3JhdGlvbi4KWW91IHNob3VsZCBhbHNvIHNlZSBgZmFzdG1ubl9QQ0FgIGFuZCBgZmFzdG1ubl9VTUFQYCByZWR1Y2VkIGRpbWVuc2lvbnMsIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGludGVncmF0ZWQgcmVzdWx0cy4KCiMjIyBDZWxsIHR5cGUgYW5ub3RhdGlvbnMKCkp1c3QgbGlrZSBpbiB0aGUgaW50ZWdyYXRpb24gbm90ZWJvb2ssIHRoaXMgZGF0YXNldCBhbHNvIGNvbnRhaW5zIHRoZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgZm91bmQgaW4gdGhlIGBjZWxsdHlwZV9maW5lYCBhbmQgYGNlbGx0eXBlX2Jyb2FkYCBjb2x1bW5zIG9mIHRoZSBgY29sRGF0YWAuClRoZXNlIGNlbGwgdHlwZXMgd2VyZSBvcmlnaW5hbGx5IGFzc2lnbmVkIGluIFtQYXRlbCBfZXQgYWwuXyAoMjAyMildKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2ouZGV2Y2VsLjIwMjIuMDQuMDAzKS4KV2Ugd2lsbCB1c2UgdGhlc2UgY2VsbCB0eXBlIGFzc2lnbm1lbnRzIHRvIHNldCB1cCB0aGUgREUgYW5hbHlzaXMgYmVsb3csIGJ1dCB0aGV5IGFyZSBub3QgcmVxdWlyZWQgZm9yIERFIGFuYWx5c2lzIGl0c2VsZi4KSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IERFIGFuYWx5c2lzIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBzdWJwb3B1bGF0aW9uIG9mIGludGVyZXN0IHRoYXQgaXMgc2hhcmVkIGFjcm9zcyBzYW1wbGVzIGJlc2lkZXMganVzdCBjZWxsIHR5cGVzLgoKQmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gYmUgZG9pbmcgREUgYW5hbHlzaXMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHNhbXBsZXMsIGxldCdzIHN0YXJ0IGJ5IGxhYmVsaW5nIGNlbGxzIGluIHRoZSBpbnRlZ3JhdGVkIGRhdGFzZXQgYmFzZWQgb24gdGhlaXIgUk1TIHN1YnR5cGUuClRvIGRvIHRoaXMgd2Ugd2lsbCBuZWVkIHRvIGJlIHN1cmUgdGhhdCB0aGUgc3VidHlwZSBpcyBwcmVzZW50IGluIHRoZSBgY29sRGF0YWAgb2YgdGhlIGludGVncmF0ZWQgU0NFIG9iamVjdC4KSWYgaXQncyBub3QgdGhlcmUsIHdlIG5lZWQgdG8gYWRkIGl0IGluLgoKYGBge3IgY29sZGF0YSBoZWFkLCBsaXZlPVRSVUV9CiMgbG9vayBhdCB0aGUgaGVhZCBvZiB0aGUgY29sZGF0YQpoZWFkKGNvbERhdGEoaW50ZWdyYXRlZF9zY2UpKSB8PgogIGFzLmRhdGEuZnJhbWUoKQpgYGAKClVoIG9oLCBpdCBsb29rcyBsaWtlIHRoZSBSTVMgc3VidHlwZSBpcyBub3QgZm91bmQgaW4gdGhlIFNDRSBvYmplY3QuCkZvcnR1bmF0ZWx5IHdlIGFsc28gaGF2ZSB0aGUgc2FtcGxlIG1ldGFkYXRhIHRhYmxlIHRoYXQgd2UgcmVhZCBpbiBlYXJsaWVyLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mIHRoZSBzYW1wbGVzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQuCgpgYGB7ciBzYW1wbGUgbWV0YWRhdGEsIGxpdmU9VFJVRX0KIyBwcmludCBvdXQgc2FtcGxlIG1ldGFkYXRhCmhlYWQoc2FtcGxlX21ldGFkYXRhKQpgYGAKCkxvb2tpbmcgYXQgdGhpcyBzYW1wbGUgdGFibGUsIHdlIHNlZSBhIGNvbHVtbiBuYW1lZCBgc3ViZGlhZ25vc2lzYCB3aGljaCBhY2NvdW50cyBmb3IgdGhlIFJNUyBzdWJ0eXBlLCBBUk1TIG9yIEVSTVMuCldlIGFsc28gc2VlIG90aGVyIGNvbHVtbnMgdGhhdCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggc3BlY2lmaWMgc2FtcGxlLgoKV2UgY2FuIGluY29ycG9yYXRlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHNhbXBsZSBtZXRhZGF0YSB0YWJsZSBpbnRvIHRoZSBgY29sRGF0YWAgb2YgdGhlIGludGVncmF0ZWQgU0NFIG9iamVjdC4KVGhpcyB3aWxsIGFsbG93IHVzIHRvIG1hdGNoIGVhY2ggb2YgdGhlIHNhbXBsZXMgaW4gdGhlIFNDRSBvYmplY3Qgd2l0aCB0aGUgUk1TIHN1YnR5cGUgYW5kIGFsc28gYWxsb3cgdXMgdG8gdXNlIGFueSBvZiB0aGUgY29sdW1ucyBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhIGZvciBwbG90dGluZy4KCmBgYHtyIG1vZGlmeSBjb2xkYXRhfQojIGFkZCBzYW1wbGUgbWV0YWRhdGEgdG8gY29sRGF0YSBmcm9tIHRoZSBpbnRlZ3JhdGVkIFNDRSBvYmplY3QKY29sZGF0YV9kZiA8LSBjb2xEYXRhKGludGVncmF0ZWRfc2NlKSB8PgogICMgY29udmVydCBmcm9tIERhdGFGcmFtZSB0byBkYXRhLmZyYW1lCiAgYXMuZGF0YS5mcmFtZSgpIHw+CiAgIyBtZXJnZSB3aXRoIHNhbXBsZSBtZXRhZGF0YQogIGRwbHlyOjpsZWZ0X2pvaW4oc2FtcGxlX21ldGFkYXRhLCBieSA9IGMoInNhbXBsZSIgPSAibGlicmFyeV9pZCIpKSB8PgogICMgY3JlYXRlIG5ldyBjb2x1bW5zCiAgIyBjZWxsX2lkIGlzIGEgY29tYmluYXRpb24gb2YgYmFyY29kZSBhbmQgc2FtcGxlCiAgZHBseXI6Om11dGF0ZShjZWxsX2lkID0gZ2x1ZTo6Z2x1ZSgie3NhbXBsZX0te2JhcmNvZGV9IiksCiAgICAgICAgICAgICAgICAjIHNpbXBsaWZ5IHN1YmRpYWdub3NpcwogICAgICAgICAgICAgICAgZGlhZ25vc2lzX2dyb3VwID0gZm9yY2F0czo6ZmN0X3JlY29kZSgKICAgICAgICAgICAgICAgICAgc3ViZGlhZ25vc2lzLAogICAgICAgICAgICAgICAgICAiQVJNUyIgPSAiQWx2ZW9sYXIgcmhhYmRvbXlvc2FyY29tYSIsCiAgICAgICAgICAgICAgICAgICJFUk1TIiA9ICJFbWJyeW9uYWwgcmhhYmRvbXlvc2FyY29tYSIKICAgICAgICAgICAgICAgICkpCgojIGFkZCBtb2RpZmllZCBkYXRhIGZyYW1lIGJhY2sgdG8gU0NFIGFzIERhdGFGcmFtZQpjb2xEYXRhKGludGVncmF0ZWRfc2NlKSA8LSBEYXRhRnJhbWUoY29sZGF0YV9kZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IGNvbGRhdGFfZGYkY2VsbF9pZCkKYGBgCgpOb3cgd2hlbiB3ZSBsb29rIGF0IHRoZSBgY29sRGF0YWAgb2YgdGhlIFNDRSBvYmplY3Qgd2Ugc2hvdWxkIHNlZSBuZXcgY29sdW1ucywgaW5jbHVkaW5nIHRoZSBgZGlhZ25vc2lzX2dyb3VwYCBjb2x1bW4gd2hpY2ggaW5kaWNhdGVzIGlmIGVhY2ggY2VsbCBjb21lcyBmcm9tIGFuIEVSTVMgb3IgQVJNUyBzYW1wbGUuCgpgYGB7ciBwcmludCBuZXcgY29sZGF0YSwgbGl2ZT1UUlVFfQojIHRha2UgYSBsb29rIGF0IHRoZSBuZXcgbW9kaWZpZWQgY29sRGF0YQpoZWFkKGNvbERhdGEoaW50ZWdyYXRlZF9zY2UpKSB8PgogIGFzLmRhdGEuZnJhbWUoKQpgYGAKCiMjIyBQbG90dGluZyB3aXRoIGFubm90YXRpb25zCgpXZSBjYW4gbm93IHVzZSB0aGF0IGNvbHVtbiB0byBsYWJlbCBhbnkgVU1BUCBwbG90cyAob3Igb3RoZXIgcGxvdCB0eXBlcykgdGhhdCB3ZSBtYWtlLgpJbiB0aGUgY2h1bmsgYmVsb3cgd2Ugd2lsbCBzdGFydCBieSB0YWtpbmcgYSBsb29rIGF0IG91ciBpbnRlZ3JhdGlvbiByZXN1bHRzIGFuZCBjb2xvciBvdXIgY2VsbHMgYnkgUk1TIHN1YnR5cGUuCgoqKlJlbWluZGVyOiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIGJhdGNoLWNvcnJlY3RlZCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gcmVzdWx0cyBmb3IgdmlzdWFsaXppbmcgZGF0YXNldHMgY29udGFpbmluZyBtdWx0aXBsZSBsaWJyYXJpZXMgb3Igc2FtcGxlcy4qKgoKYGBge3IgZGlhZ25vc2lzIGdyb3VwIFVNQVAsIGxpdmU9VFJVRX0KIyBVTUFQIG9mIGFsbCBzYW1wbGVzLCBzZXBhcmF0aW5nIGJ5IGRpYWdub3NpcyBncm91cApzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKGludGVncmF0ZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gImRpYWdub3Npc19ncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZT0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKQpgYGAKCkludGVyZXN0aW5nbHksIGl0IGxvb2tzIGxpa2Ugc2FtcGxlcyBmcm9tIHRoZSBBUk1TIGFuZCBFUk1TIHN1YnR5cGVzIHRlbmQgdG8gZ3JvdXAgd2l0aCBzYW1wbGVzIG9mIHRoZSBzYW1lIHN1YnR5cGUgcmF0aGVyIHRoYW4gYWxsIHRvZ2V0aGVyLgoKSW4gdGhlIGludGVncmF0aW9uIG5vdGVib29rIHdlIGFsc28gbG9va2VkIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgY2VsbCB0eXBlcyBhZnRlciBpbnRlZ3JhdGlvbi4KSW4gdGhhdCBub3RlYm9vaywgd2UgZGlzY3Vzc2VkIHRoYXQgY2VsbHMgb2YgdGhlIHNhbWUgY2VsbCB0eXBlIGFyZSBleHBlY3RlZCB0byBpbnRlZ3JhdGUgd2l0aCBvdGhlciBjZWxscyBvZiB0aGUgc2FtZSB0eXBlLgpJcyB0aGF0IHRoZSBjYXNlIHdpdGggdGhpcyBkYXRhc2V0PwoKQSB3b3JkIG9mIGNhdXRpb24gd2hlbiBldmFsdWF0aW5nIHRoZSBjZWxsIHR5cGUgcmVzdWx0cyBmb3IgdGhpcyBkYXRhc2V0OiBUaGUgY2VsbCB0eXBlcyBmb3IgdGhpcyBkYXRhc2V0IHdlcmUgYXNzaWduZWQgaW4gYSB0d28gc3RhZ2UgcHJvY2VzcyBhcyBkZXNjcmliZWQgaW4gW1BhdGVsIF9ldCBhbC5fICgyMDIyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5kZXZjZWwuMjAyMi4wNC4wMDMpLgpUaGUgZmlyc3Qgc3RhZ2UgYXNzaWduZWQgY2VsbHMgYXMgdHVtb3Igb3Igbm9uLXR1bW9yLgpUaGUgbmV4dCBzdGFnZSBmdXJ0aGVyIGNsYXNzaWZpZWQgdHVtb3IgY2VsbHMgaW50byBvbmUgb2YgdGhyZWUgdHlwZXMgb2YgdHVtb3IgY2VsbHM6IG15b2JsYXN0LCBteW9jeXRlLCBvciBtZXNvZGVybS4KU29tZSBzYW1wbGVzIGNvdWxkIG5vdCBiZSBmdXJ0aGVyIGNsYXNzaWZpZWQsIHNvIGFsbCBvZiB0aGVpciB0dW1vciBjZWxscyBhcmUgZGVub3RlZCBgVHVtb3JgLgpUaGUgc2FtcGxlcyB3aGljaCBjb3VsZCBiZSBmdXJ0aGVyIGNsYXNzaWZpZWQgaGF2ZSBhIG1peCBvZiBgVHVtb3JfTWVzb2Rlcm1gLCBgVHVtb3JfTXlvYmxhc3RgLCBhbmQgYFR1bW9yX015b2N5dGVgLgoKYGBge3IgY2VsbHR5cGUgVU1BUH0KIyBVTUFQIG9mIGFsbCBzYW1wbGVzIGxhYmVsZWQgYnkgY2VsbCB0eXBlCnNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImZhc3Rtbm5fVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBlYWNoIHBvaW50IGJ5IGNlbGwgdHlwZQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gImNlbGx0eXBlX2Jyb2FkIiwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC40KSArCiAgIyBNb2RpZnkgdGhlIGxlZ2VuZCBrZXkgd2l0aCBsYXJnZXIsIGVhc2llciB0byBzZWUgcG9pbnRzCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKQpgYGAKClVubGlrZSB3aXRoIHRoZSBwcmV2aW91cyBkYXRhc2V0cyB3ZSBoYXZlIHNlZW4gd2hlcmUgYWxsIGNlbGxzIG9mIHRoZSBzYW1lIGNlbGwgdHlwZSBhbHdheXMgZ3JvdXBlZCB0b2dldGhlciwgdGhpcyBkYXRhc2V0IHNob3dzIHNvbWUgc2xpZ2h0bHkgZGlmZmVyZW50IHBhdHRlcm5zIGFuZCBub3QgYWxsIGNlbGxzIG9mIHRoZSBzYW1lIGNlbGwgdHlwZSBjbHVzdGVyIHRvZ2V0aGVyLgpPbmUgcmVhc29uIGlzIHRoYXQgdHVtb3IgZGF0YSBjYW4gYmUgaGV0ZXJvZ2VuZW91cyBhbmQgZXZlcnkgdHVtb3IgaXMgdW5pcXVlLgpEZXBlbmRpbmcgb24gdGhlIHR1bW9yIHR5cGUgd2UgbWF5IG5vdCBleHBlY3QgZXZlcnkgc2FtcGxlIHRvIGludGVncmF0ZSBwZXJmZWN0bHkgYW5kIG1vcmUgaGV0ZXJvZ2VuZW91cyB0dW1vciB0eXBlcyB3aWxsIGJlIG1vcmUgZGlmZmljdWx0IHRvIGludGVncmF0ZSB0b2dldGhlci4KSW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2Ugd2UgYXJlIGxvb2tpbmcgYXQgdHdvIHN1YnR5cGVzIG9mIFJNUyB0aGF0IGhhdmUgZGlzdGluY3QgbXV0YXRpb24gYnVyZGVucyBhbmQgZGlmZmVyZW50aWF0aW9uIHN0YXRlcywgc28gaXQncyBsaWtlbHkgdGhhdCB0aG9zZSBkaWZmZXJlbmNlcyBjb250cmlidXRlIHRvIGhvdyB3ZWxsIHRoZXkgaW50ZWdyYXRlLgoKVG8gZXhwbG9yZSB3aGV0aGVyIGNlbGxzIGFyZSBncm91cGluZyB0b2dldGhlciBib3RoIGJ5IGNlbGwgdHlwZSBhbmQgYnkgUk1TIHN1YnR5cGUsIHdlIGNhbiBjcmVhdGUgYSBwbG90IHRoYXQgaW5jb3Jwb3JhdGVzIGJvdGggcGllY2VzIG9mIG1ldGFkYXRhLgpXZSB3aWxsIHRha2UgYWR2YW50YWdlIG9mIHRoZSBgZmFjZXRfZ3JpZCgpYCBmdW5jdGlvbiBmcm9tIGBnZ3Bsb3QyYCB0byBsb29rIGF0IHR3byB2YXJpYWJsZXMgaW4gdGhlIGBjb2xEYXRhYCBhdCBvbmNlIC0gdGhlIGNlbGwgdHlwZSBhbmQgdGhlIHN1YmRpYWdub3Npcy4KSW4gdGhlIGJlbG93IHBsb3Qgd2Ugd2lsbCBjb2xvciBvdXIgY2VsbHMgYnkgY2VsbCB0eXBlIHdoaWxlIGFsc28gdXNpbmcgYGZhY2V0X2dyaWQoKWAgc28gdGhhdCBjZWxscyBmcm9tIGRpZmZlcmVudCBzdWJkaWFnbm9zZXMgd2lsbCBiZSBpbiB0aGVpciBvd24gcGxvdCBwYW5lbC4KCmBgYHtyIGNlbGx0eXBlIHN1YmRpYWdub3NpcyBVTUFQLCBsaXZlPVRSVUV9CiMgVU1BUCBvZiBhbGwgc2FtcGxlcwojIHNlcGFyYXRpbmcgYnkgZGlhZ25vc2lzIGdyb3VwIGFuZCBsYWJlbGluZyBjZWxsIHR5cGUKc2NhdGVyOjpwbG90UmVkdWNlZERpbShpbnRlZ3JhdGVkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGVhY2ggcG9pbnQgYnkgY2VsbCB0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAiY2VsbHR5cGVfYnJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCwKICAgICAgICAgICAgICAgICAgICAgICAjIHRlbGwgc2NhdGVyIHRvIHVzZSBkaWFnbm9zaXNfZ3JvdXAgZm9yIHBsb3R0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmllbGRzID0gImRpYWdub3Npc19ncm91cCIpICsKICAjIGluY2x1ZGUgZWFjaCBkaWFnbm9zaXMgZ3JvdXAgYXMgaXRzIG93biBjb2x1bW4KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRpYWdub3Npc19ncm91cCkpCmBgYAoKQXMgZXhwZWN0ZWQsIHdlIHNlZSB0aGF0IGNlbGwgdHlwZXMgYXJlIHNlcGFyYXRlZCwgbW9zdCBsaWtlbHkgZHVlIHRvIGRpZmZlcmVudCBSTVMgc3VidHlwZXMuCgpXZSBjYW4gYWxzbyB1c2UgYSBzdGFja2VkIGJhcnBsb3QgdG8gbG9vayBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIGNlbGwgdHlwZXMgYWNyb3NzIGVhY2ggc2FtcGxlLCB3aGljaCB3aWxsIHJlcXVpcmUgYSBiaXQgb2Ygd3JhbmdsaW5nIGZpcnN0LgoKYGBge3IgY2VsbHR5cGUgYmFycGxvdH0KIyBmaWx0ZXIgY29sZGF0YSB0byBvbmx5IGluY2x1ZGUgdHVtb3IgY2VsbHMKdHVtb3JfY2VsbHNfZGYgPC0gY29sZGF0YV9kZiB8PgogICMgZmluZCByb3dzIHdoZXJlIHRoZSBjZWxsIHR5cGUgbmFtZSBjb250YWlucyB0aGUgc3RyaW5nICJUdW1vciIKICBkcGx5cjo6ZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY2VsbHR5cGVfYnJvYWQsICJUdW1vciIpKQoKIyBjcmVhdGUgYSBzdGFja2VkIGJhcnBsb3QKZ2dwbG90KHR1bW9yX2NlbGxzX2RmLCBhZXMoeCA9IHNhbXBsZSwgZmlsbCA9IGNlbGx0eXBlX2Jyb2FkKSkgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogICAgbGFicygKICAgICAgeCA9ICJTYW1wbGUiLAogICAgICB5ID0gIlByb3BvcnRpb24gb2YgY2VsbHMiLAogICAgICBmaWxsID0gIkNlbGwgdHlwZSIKICAgICkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUpKSsKICAjIGZhY2V0IGJ5IGRpYWdub3NpcyBncm91cAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSwKICAgICAgICAgICAgICMgb25seSBzaG93IG5vbi1OQSB2YWx1ZXMgb24geC1heGlzCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94IiwKICAgICAgICAgICAgIHNwYWNlID0gImZyZWVfeCIpCmBgYAoKU2ltaWxhciB0byB0aGUgVU1BUCwgdGhpcyBwbG90IHNob3dzIHRoYXQgQVJNUyBhbmQgRVJNUyBzaGFyZSBhIGxvdCBvZiB0aGUgc2FtZSBjZWxsIHR5cGVzLgoKV2UgYWxzbyBzZWUgdGhhdCBvbmx5IDYgb2YgdGhlc2UgbGlicmFyaWVzIGhhdmUgdHVtb3IgY2VsbHMgdGhhdCBoYXZlIGJlZW4gZnVydGhlciBjbGFzc2lmaWVkIGludG8gbWVzb2Rlcm0sIG15b2JsYXN0LCBhbmQgbXlvY3l0ZS4KMyBsaWJyYXJpZXMgY29udGFpbiBjZWxscyB0aGF0IGFyZSBvbmx5IGNsYXNzaWZpZWQgYXMgdHVtb3Igb3Igbm9uLXR1bW9yLCBhbmQgdHVtb3IgY2VsbHMgYXJlIG5vdCBmdXJ0aGVyIGNsYXNzaWZpZWQsIGFuZCB0aGUgcmVtYWluaW5nIGxpYnJhcnkgaXMgbm90IGV2ZW4gcHJlc2VudCBpbiBvdXIgcGxvdCBiZWNhdXNlIGl0IHdhcyBub3QgYXNzaWduZWQgYW55IGNlbGwgdHlwZXMgKGFsbCBhcmUgYE5BYCkuCldlIHdpbGwgY29udGludWUgb3VyIGFuYWx5c2lzIG9ubHkgdXNpbmcgdGhlIDYgbGlicmFyaWVzIHdpdGggZnVsbHkgY2xhc3NpZmllZCBjZWxsIHR5cGVzLCByZW1vdmluZyB0aGUgb3RoZXIgNCBiZWZvcmUgd2UgcHJvY2VlZCB3aXRoIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLgoKIyMjIEZpbHRlcmluZyBzYW1wbGVzCgpUaGUgcmVhc29uIHdlIHdhbnQgdG8gcGFyZSBkb3duIG91ciBsaXN0IG9mIHNhbXBsZXMgdG8gY29uc2lkZXIgaXMgdGhhdCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBjZWxsIHR5cGVzIChvciBzdWJwb3B1bGF0aW9ucykgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBhcmUgcHJlc2VudCBpbiBhbGwgc2FtcGxlcyBpbmNsdWRlZCBpbiBvdXIgREUgYW5hbHlzaXMuCldlIHdhbnQgdG8gcmVtb3ZlIGFueSBzYW1wbGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gb3VyIGNlbGwgcG9wdWxhdGlvbihzKSBvZiBpbnRlcmVzdCBhcyB0aGV5IGhhdmUgbm8gY291bnRzIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIERFIGFuYWx5c2lzLgoKYGBge3Igc3Vic2V0IHNjZX0KIyBkZWZpbmUgc2FtcGxlcyB0byBrZWVwCmxpYnJhcnlfaWRzIDwtIGMoCiAgIlNDUENMMDAwNDc5IiwKICAiU0NQQ0wwMDA0ODAiLAogICJTQ1BDTDAwMDQ4MSIsCiAgIlNDUENMMDAwNDg0IiwKICAiU0NQQ0wwMDA0ODgiLAogICJTQ1BDTDAwMDQ5MSIKKQoKIyBzdWJzZXQgc2NlIHRvIG9ubHkgY29udGFpbiBzYW1wbGVzIG9mIGludGVyZXN0CnNhbXBsZXNfdG9fa2VlcCA8LSBpbnRlZ3JhdGVkX3NjZSRzYW1wbGUgJWluJSBsaWJyYXJ5X2lkcwpybXNfc2NlIDwtIGludGVncmF0ZWRfc2NlWywgc2FtcGxlc190b19rZWVwXQoKIyBwcmludCBvdXQgb3VyIG5ldyBTQ0UKcm1zX3NjZQpgYGAKCkJlZm9yZSB3ZSBtb3ZlIG9uLCB3ZSdsbCByZW1vdmUgdGhlIG9yaWdpbmFsIGludGVncmF0ZWQgb2JqZWN0IGZyb20gb3VyIGVudmlyb25tZW50IHRvIHNhdmUgc29tZSBtZW1vcnkuCgpgYGB7ciByZW1vdmUgc2NlfQpybShpbnRlZ3JhdGVkX3NjZSkKYGBgCgpXZSB3aWxsIGFsc28gc2F2ZSBvdXIgbmV3IG9iamVjdCBpbiBjYXNlIHdlIHdhbnQgdG8gdXNlIGl0IGZvciBvdGhlciBhbmFseXNpcyBsYXRlciBvbi4KCmBgYHtyIHNhdmUgc2NlfQojIHdyaXRlIFJEUyBmaWxlIHdpdGggY29tcHJlc3Npb24KcmVhZHI6OndyaXRlX3JkcyhybXNfc2NlLCBmaWxlID0gb3V0cHV0X3NjZV9maWxlLCBjb21wcmVzcyA9ICJneiIpCmBgYAoKV2Ugbm93IGhhdmUgYW4gdXBkYXRlZCBTQ0Ugb2JqZWN0IHRoYXQgY29udGFpbnMgNiBzYW1wbGVzIHRoYXQgd2VyZSBvYnRhaW5lZCBmcm9tIGEgbWl4IG9mIEFSTVMgYW5kIEVSTVMgcGF0aWVudHMuCldlIGNhbiB0aGVuIGFzayB0aGUgcXVlc3Rpb24sIGRvIHNwZWNpZmljIHR1bW9yIGNlbGwgdHlwZXMgY29udGFpbiBzZXRzIG9mIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBiZXR3ZWVuIEFSTVMgYW5kIEVSTVMgc2FtcGxlcz8KCldlIHNob3VsZCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBiaW9sb2dpY2FsIHJlcGxpY2F0ZXMgZnJvbSBlYWNoIGdyb3VwIHRvIHNldCB1cCBvdXIgZXhwZXJpbWVudC4KSXQgaXMgaW1wZXJhdGl2ZSB0byBjb25zaWRlciBnb29kIGV4cGVyaW1lbnRhbCBkZXNpZ24gYW5kIGVuc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGJpb2xvZ2ljYWwgcmVwbGljYXRlcyAoYXQgbGVhc3QgMyBmb3IgZWFjaCBncm91cCkgd2hlbiBwZXJmb3JtaW5nIGRpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24gYW5hbHlzaXMuCgpJZiB3ZSBsb29rIGJhY2sgYXQgb3VyIHN0YWNrZWQgYmFycGxvdCB3ZSBzZWUgdGhhdCB3ZSBwaWNrZWQgMyBBUk1TIGFuZCAzIEVSTVMgc2FtcGxlcy4KV2UgY2FuIGFsc28gc2VlIHRoYXQgdGhlIG1ham9yaXR5IG9mIGNlbGxzIGFyZSB0dW1vciBjZWxscywgaW4gcGFydGljdWxhciB0aGUgbGFyZ2VzdCBwb3B1bGF0aW9uIG9mIGNlbGxzIGFwcGVhcnMgdG8gYmUgdGhlIGBUdW1vcl9NeW9ibGFzdGAuCkZvciB0aGlzIGV4YW1wbGUgd2Ugd2lsbCBmb2N1cyBvbiBpZGVudGlmeWluZyBERSBnZW5lcyBpbiB0aGVzZSBgVHVtb3JfTXlvYmxhc3RgIGNlbGxzLCBidXQgdGhlIHByaW5jaXBsZXMgYXBwbGllZCBiZWxvdyBjYW4gYmUgYXBwbGllZCB0byBhbnkgY2VsbCB0eXBlcyBvciBzdWJwb3B1bGF0aW9ucyBvZiBpbnRlcmVzdC4KCiMjIERpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzCgpOb3cgd2UgYXJlIHJlYWR5IHRvIHN0YXJ0IHByZXBhcmluZyBmb3Igb3VyIERFIGFuYWx5c2lzLCB3aGVyZSB3ZSB3aWxsIGNvbXBhcmUgdGhlIGdlbmUgZXhwcmVzc2lvbiBvZiB0dW1vciBteW9ibGFzdCBjZWxscyBiZXR3ZWVuIEFSTVMgYW5kIEVSTVMgc2FtcGxlcy4KClRocm91Z2hvdXQgdGhlIG5vdGVib29rIHdlIGhhdmUgYmVlbiB3b3JraW5nIHdpdGggYW4gaW50ZWdyYXRlZCBkYXRhc2V0IHRoYXQgY29udGFpbnMgY29ycmVjdGVkIGdlbmUgZXhwcmVzc2lvbiBkYXRhIChgZmFzdG1ubl9jb3JyZWN0ZWRgIGFzc2F5KSBhbmQgYSBjb3JyZWN0ZWQgVU1BUC4KQXMgYSByZW1pbmRlciwgdGhlIHVuY29ycmVjdGVkIGdlbmUgZXhwcmVzc2lvbiBkYXRhLCBmb3VuZCBpbiB0aGUgYGNvdW50c2AgYW5kIGBsb2djb3VudHNgIGFzc2F5cywgY29ycmVzcG9uZCB0byBkYXRhIHRoYXQgaGFzIGJlZW4gbWVyZ2VkICh0aGUgZmlyc3Qgc3RlcCB3ZSB3YWxrZWQgdGhyb3VnaCBwcmlvciB0byBpbnRlZ3JhdGlvbikgaW50byB0aGUgc2FtZSBTQ0UgYnV0IG5vdCB5ZXQgaW50ZWdyYXRlZC4KV2UgZG8gbm90IHdhbnQgdG8gdXNlIGNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gdmFsdWVzIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbjsgYERFU2VxMmAgZXhwZWN0cyB0aGUgb3JpZ2luYWwgcmF3IGNvdW50cyBhcyBpbnB1dCBzbyB3ZSB3aWxsIGJlIHVzaW5nIGRhdGEgZm91bmQgaW4gdGhlIGBjb3VudHNgIGFzc2F5IG9mIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdC4KCkl0IGlzIGFkdmlzZWQgdG8gb25seSB1c2UgdGhlIGNvcnJlY3RlZCB2YWx1ZXMgZm9yIGFueSBhbmFseXNlcyBiZWluZyBwZXJmb3JtZWQgYXQgdGhlIGNlbGwgbGV2ZWwsIGUuZy4sIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi4KSW4gY29udHJhc3QsIGl0IGlzIG5vdCBhZHZpc2VkIHRvIHVzZSBjb3JyZWN0ZWQgdmFsdWVzIGZvciBhbnkgYW5hbHlzZXMgdGhhdCBhcmUgZ2VuZS1iYXNlZCwgc3VjaCBhcyBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBvciBtYXJrZXIgZ2VuZSBkZXRlY3Rpb24sIGJlY2F1c2Ugd2l0aGluLWJhdGNoIGFuZCBiZXR3ZWVuLWJhdGNoIGdlbmUgZXhwcmVzc2lvbiBkaWZmZXJlbmNlcyBhcmUgbm8gbG9uZ2VyIHByZXNlcnZlZC4KVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0d28tZm9sZCDigJMgbWFueSBvZiB0aGUgREUgbW9kZWxzIHdpbGwgZXhwZWN0IHVuY29ycmVjdGVkIGNvdW50cyBiZWNhdXNlIHRoZXkgd2lsbCBhY2NvdW50IGZvciBiZXR3ZWVuLXNhbXBsZSB2YXJpYXRpb24gd2l0aGluIHRoZSBtb2RlbCwgYW5kIHdlIHdhbnQgdG8gZW5zdXJlIHdlIGFyZSBwcmVzZXJ2aW5nIHZhcmlhdGlvbiB0aGF0IGlzIHByZXNlbnQgc28gYXMgbm90IHRvIGFydGlmaWNpYWxseSBpbmZsYXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcG9wdWxhdGlvbnMuClNlZSB0aGUgW09TQ0EgY2hhcHRlciBvbiBVc2luZyB0aGUgY29ycmVjdGVkIHZhbHVlc10oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL2Jvb2tzLzMuMTkvT1NDQS5tdWx0aXNhbXBsZS91c2luZy1jb3JyZWN0ZWQtdmFsdWVzLmh0bWwjdXNpbmctY29ycmVjdGVkLXZhbHVlcykgZm9yIG1vcmUgaW5zaWdodC4KCiMjIyBQc2V1ZG8tYnVsa2luZwoKQmVmb3JlIHdlIGNhbiBjb21wYXJlIHRoZSBnZW5lIGV4cHJlc3Npb24gcHJvZmlsZXMgb2YgbXlvYmxhc3RzIGluIEFSTVMgdnMuIEVSTVMgc2FtcGxlcywgd2Ugd2lsbCBuZWVkIHRvICJwc2V1ZG8tYnVsayIgdGhlIGdlbmUgY291bnRzLgpQc2V1ZG8tYnVsa2luZyBjcmVhdGVzIGEgbmV3IGNvdW50cyBtYXRyaXggdGhhdCBjb250YWlucyB0aGUgc3VtIG9mIHRoZSBjb3VudHMgZnJvbSBhbGwgY2VsbHMgd2l0aCBhIGdpdmVuIGxhYmVsIChlLmcuLCBjZWxsIHR5cGUpIGZvciBlYWNoIHNhbXBsZSAoW1R1bmcgX2V0IGFsLl8gMjAxN10oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvc3JlcDM5OTIxKSkuCklmIHdlIHdlcmUgdG8ga2VlcCBlYWNoIGNlbGwncyBjb3VudHMgc2VwYXJhdGUsIHRoZXkgd291bGQgYmUgdHJlYXRlZCBhcyByZXBsaWNhdGVzLCBsZWFkaW5nIHRvIGluZmxhdGVkIHN0YXRpc3RpY3MuCkJ5IHBzZXVkby1idWxraW5nIGZpcnN0LCB3ZSB3aWxsIG5vdyBoYXZlIG9uZSBjb3VudCBmb3IgZWFjaCBnZW5lIGZvciBlYWNoIHNhbXBsZSBhbmQgd2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHdlbGwtZXN0YWJsaXNoZWQgbWV0aG9kcyBmb3IgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gd2l0aCBidWxrIFJOQS1zZXEuCgpQc2V1ZG8tYnVsa2luZyBpcyBpbXBsZW1lbnRlZCBwcmlvciB0byBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcyBvbiBzaW5nbGUtY2VsbCBkYXRhIGJlY2F1c2UgaXQ6CgotIFByb2R1Y2VzIGxhcmdlciBhbmQgbGVzcyBzcGFyc2UgY291bnRzLCB3aGljaCBhbGxvd3MgdXMgdG8gdXNlIHN0YW5kYXJkIG5vcm1hbGl6YXRpb24gYW5kIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIG1ldGhvZHMgdXNlZCBieSBidWxrIFJOQS1zZXEuCi0gQ29sbGFwc2VzIGdlbmUgZXhwcmVzc2lvbiBjb3VudHMgYnkgc2FtcGxlLCBzbyB0aGF0IHNhbXBsZXMsIHJhdGhlciB0aGFuIGNlbGxzLCByZXByZXNlbnQgcmVwbGljYXRlcy4KLSBNYXNrcyB2YXJpYW5jZSB3aXRoaW4gYSBzYW1wbGUgdG8gZW1waGFzaXplIHZhcmlhbmNlIGFjcm9zcyBzYW1wbGVzLgpUaGlzIGNhbiBiZSBib3RoIGdvb2QgYW5kIGJhZCEKTWFza2luZyBpbnRyYS1zYW1wbGUgdmFyaWF0aW9uIG1lYW5zIHlvdSBtaWdodCBub3QgaWRlbnRpZnkgZ2VuZXMgd2hlcmUgYXZlcmFnZSBleHByZXNzaW9uIGRvZXNuJ3QgY2hhbmdlIGJldHdlZW4gc2FtcGxlcyBidXQgdGhlIGRlZ3JlZSBvZiBjZWxsLXRvLWNlbGwgdmFyaWF0aW9uIGRvZXMuCgpCZWZvcmUgd2UgYXBwbHkgcHNldWRvLWJ1bGtpbmcgdG8gb3VyIGRhdGFzZXQsIGxldCdzIGxvb2sgYXQgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgcHNldWRvLWJ1bGtpbmcgd29ya3MuCldlJ2xsIHN0YXJ0IGJ5IGNyZWF0aW5nIGEgZmFrZSBtYXRyaXggb2YgY291bnRzLgoKYGBge3IgY3JlYXRlIG1hdHJpeH0KIyBjcmVhdGUgYW4gZXhhbXBsZSBjb3VudHMgbWF0cml4CmNvdW50c19tdHggPC0gbWF0cml4KAogIDE6MTIsCiAgbmNvbCA9IDQsCiAgZGltbmFtZXMgPSBsaXN0KGMoImdlbmVBIiwgImdlbmVCIiwgImdlbmVDIiksCiAgICAgICAgICAgICAgICAgIGMoIkEtY2VsbDEiLCAiQS1jZWxsMiIsICJCLWNlbGwxIiwgIkItY2VsbDIiKSkKKQpjb3VudHNfbXR4CmBgYAoKTmV4dCB3ZSB3aWxsIGNyZWF0ZSBhIHBzZXVkby1idWxrZWQgdmVyc2lvbiBvZiB0aGlzIG1hdHJpeCB3aXRoIG9ubHkgMiBjb2x1bW5zOiAxIGZvciBncm91cCBgQWAgYW5kIDEgZm9yIGdyb3VwIGBCYC4KVG8gZG8gdGhpcyB3ZSB3aWxsIHVzZSB0aGUgYERlbGF5ZWRBcnJheTo6Y29sc3VtKClgIGZ1bmN0aW9uLCB3aGljaCBhbGxvd3MgdXMgdG8gc3VtIHRoZSBjb3VudHMgZm9yIGVhY2ggcm93IGFjcm9zcyBncm91cHMgb2YgY29sdW1ucy4KCmBgYHtyIHBzZXVkb2J1bGsgbWF0cml4LCBsaXZlPVRSVUV9CiMgZGVmaW5lIHRoZSBncm91cCB0aGF0IGVhY2ggY29sdW1uIGJlbG9uZ3MgdG8KZ3JvdXBzIDwtIGMoIkEiLCAiQSIsICJCIiwgIkIiKQoKIyBzdW0gY291bnRzIGFjcm9zcyBjZWxscyAoY29sdW1ucykgYnkgZ3JvdXAgbGFiZWwKcGJfY291bnRzIDwtIERlbGF5ZWRBcnJheTo6Y29sc3VtKGNvdW50c19tdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMpCnBiX2NvdW50cwpgYGAKCkxvb2tpbmcgYXQgdGhpcyBvdXRwdXQsIHlvdSBzaG91bGQgc2VlIHRoYXQgdGhlIG9yaWdpbmFsIDQgY29sdW1ucyBoYXZlIGJlZW4gY29uZGVuc2VkIHRvIG9ubHkgMiBjb2x1bW5zOiAxIGNvbHVtbiB0byByZXByZXNlbnQgYWxsIGNlbGxzIGZyb20gZ3JvdXAgYEFgLCBhbmQgMSBjb2x1bW4gdG8gcmVwcmVzZW50IGFsbCBjZWxscyBmcm9tIGdyb3VwIGBCYC4KCk5vdyB0aGUgYWN0dWFsIHBzZXVkby1idWxraW5nIGZvciBvdXIgZGF0YXNldCEKCldlIHdpbGwgdXNlIHRoZSBbYHNjdXR0bGU6OmFnZ3JlZ2F0ZUFjcm9zc0NlbGxzKClgIGZ1bmN0aW9uXShodHRwczovL3JkcnIuaW8vZ2l0aHViL0xUTEEvc2N1dHRsZS9tYW4vYWdncmVnYXRlQWNyb3NzQ2VsbHMuaHRtbCkgdG8gcHNldWRvLWJ1bGsgb3VyIGRhdGFzZXQuClRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgaW5wdXQgYW4gU0NFIG9iamVjdCBhbmQgdGhlIGdyb3VwaW5nIGFzc2lnbm1lbnRzIGZvciBlYWNoIGNlbGwuClRoZSBvdXRwdXQgd2lsbCBiZSBhbiBTQ0Ugb2JqZWN0IHRoYXQgY29udGFpbnMgb25seSB0aGUgcHNldWRvLWJ1bGtlZCBjb3VudHMgZm9yIGFsbCBnZW5lcyBhY3Jvc3MgYWxsIHNwZWNpZmllZCBncm91cHMsIHJhdGhlciB0aGFuIGFjcm9zcyBhbGwgY2VsbHMuCldlIGNhbiB0aGVuIHN1YnNldCB0aGlzIFNDRSB0byBqdXN0IGluY2x1ZGUgb3VyIGNlbGwgdHlwZSBvZiBpbnRlcmVzdCAodHVtb3IgbXlvYmxhc3RzKSBmb3IgaW5wdXQgdG8gdGhlIERFIGFuYWx5c2lzLgoKV2UgY2FuIHBzZXVkby1idWxrIHVzaW5nIGFueSBncm91cGluZyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLgpGb3IgcmlnaHQgbm93LCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBsb29raW5nIGF0IGdlbmUgZXhwcmVzc2lvbiBhY3Jvc3MgY2VsbCB0eXBlcywgc28gd2Ugd2FudCB0byBncm91cCB0aGUgcHNldWRvLWJ1bGtlZCBjb3VudHMgbWF0cml4IGJ5IGJvdGggY2VsbCB0eXBlIGFuZCBvcmlnaW5hbCBzYW1wbGUuCgpgYGB7ciBwc2V1ZG9idWxrIHNjZX0KIyBmaXJzdCBzdWJzZXQgdGhlIGNvbGRhdGEKIyB0byBvbmx5IGhhdmUgdGhlIGNvbHVtbnMgd2UgY2FyZSBhYm91dCBmb3IgcHNldWRvLWJ1bGtpbmcKcGJfZ3JvdXBzIDwtIGNvbERhdGEocm1zX3NjZSlbLCBjKCJjZWxsdHlwZV9icm9hZCIsICJzYW1wbGUiKV0KCiMgY3JlYXRlIGEgbmV3IFNDRSBvYmplY3QgdGhhdCBjb250YWlucwojIHRoZSBwc2V1ZG8tYnVsa2VkIGNvdW50cyBhY3Jvc3MgdGhlIHByb3ZpZGVkIGdyb3VwcwpwYl9zY2UgPC0gc2N1dHRsZTo6YWdncmVnYXRlQWNyb3NzQ2VsbHMocm1zX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gcGJfZ3JvdXBzKQoKIyBjb2x1bW4gbmFtZXMgYXJlbid0IGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHBzZXVkby1idWxrZWQgc2NlLAojIHNvIGxldCdzIGFkZCB0aGVtIGluCmNvbG5hbWVzKHBiX3NjZSkgPC0gZ2x1ZTo6Z2x1ZSgKICAie3BiX3NjZSRjZWxsdHlwZV9icm9hZH1fe3BiX3NjZSRzYW1wbGV9IgopCgpwYl9zY2UKYGBgCgpIb3cgZG9lcyB0aGUgbmV3IHBzZXVkby1idWxrZWQgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBsb29rIGRpZmZlcmVudD8KSG93IG1hbnkgY29sdW1ucyBkb2VzIGl0IGhhdmU/CgpMZXQncyB0YWtlIGEgbG9vayBhdCB3aGF0IHRoZSBgY29sRGF0YWAgbG9va3MgbGlrZSBpbiB0aGUgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0LgoKYGBge3IgcHNldWRvYnVsayBjb2xEYXRhLCBsaXZlPVRSVUV9CiMgbm90ZSB0aGUgbmV3IGNvbHVtbiB3aXRoIG51bWJlciBvZiBjZWxscyBwZXIgZ3JvdXAKaGVhZChjb2xEYXRhKHBiX3NjZSkpIHw+CiAgYXMuZGF0YS5mcmFtZSgpCmBgYAoKWW91IHNob3VsZCBzZWUgdGhhdCBjb2x1bW5zIHN1Y2ggYXMgYHN1bWAsIGBkZXRlY3RlZGAsIGBzdWJzZXRzX21pdG9fc3VtYCwgYW5kIG90aGVyIGNvbHVtbnMgdGhhdCB0eXBpY2FsbHkgY29udGFpbiBwZXIgY2VsbCBRQyBzdGF0aXN0aWNzIG5vdyBjb250YWluIGBOQWAgcmF0aGVyIHRoYW4gbnVtZXJpYyB2YWx1ZXMuClRoaXMgaXMgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgd2VyZSBpbml0aWFsbHkgY2FsY3VsYXRlZCBvbiBhIHBlciBjZWxsIGxldmVsICh3ZSBkaWQgdGhpcyB1c2luZyBgc2N1dHRsZTo6YWRkUGVyQ2VsbFFDTWV0cmljcygpYCksIGJ1dCB3ZSBubyBsb25nZXIgaGF2ZSBhIHNpbmdsZSBjb2x1bW4gcGVyIGNlbGwuCkluc3RlYWQsIGVhY2ggY29sdW1uIG5vdyByZXByZXNlbnRzIGEgX2dyb3VwXyBvZiBjZWxscywgaW4gdGhpcyBjYXNlIGNvbXByaXNlZCBvZiBjZWxscyBvZiBhIGdpdmVuIGNlbGwgdHlwZSBhbmQgc2FtcGxlIGNvbWJpbmF0aW9uLgpUaGVyZWZvcmUsIHRoZSB2YWx1ZXMgdGhhdCB3ZSBjYWxjdWxhdGVkIG9uIGEgcGVyLWNlbGwgbGV2ZWwgYXJlIG5vIGxvbmdlciBhcHBsaWNhYmxlIHRvIHRoaXMgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0LgoKWW91IHNob3VsZCBhbHNvIHNlZSBhIG5ldyBjb2x1bW4gdGhhdCB3YXNuJ3QgcHJlc2VudCBwcmV2aW91c2x5LCB0aGUgYG5jZWxsc2AgY29sdW1uLgpUaGlzIGNvbHVtbiB3YXMgYWRkZWQgZHVyaW5nIHBzZXVkby1idWxraW5nIGFuZCBpbmRpY2F0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBjZWxscyB0aGF0IHdlcmUgc3VtbWVkIHRvZ2V0aGVyIHRvIGZvcm0gZWFjaCBjb2x1bW4gb2YgdGhlIFNDRSBvYmplY3QuCgpCZWZvcmUgd2UgcHJvY2VlZCB3ZSB3aWxsIHdhbnQgdG8gZmlsdGVyIG91dCBhbnkgY29sdW1ucyB0aGF0IGhhdmUgYSBsb3cgbnVtYmVyIG9mIGNlbGxzLgpBIGxvdyBudW1iZXIgb2YgY2VsbHMgd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBzbWFsbCBjb3VudHMgdGhhdCBjYW4gY2F1c2UgaXNzdWVzIHdpdGggdGhlIHN0YXRpc3RpY2FsIGFwcHJveGltYXRpb25zIG1hZGUgZHVyaW5nIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzLgpUaGlzIGlzIGVxdWl2YWxlbnQgdG8gZmlsdGVyaW5nIG91dCBhbnkgbGlicmFyaWVzIGluIGJ1bGsgUk5BLXNlcSBhbmFseXNpcyB0aGF0IGhhdmUgbG93IGxpYnJhcnkgc2l6ZXMuCgpXZSBjYW4gc2V0IGEgdGhyZXNob2xkIGZvciB0aGUgbnVtYmVyIG9mIGNlbGxzIHJlcXVpcmVkIHRvIGNvbnRpbnVlIHdpdGggb3VyIGFuYWx5c2lzIGFuZCByZW1vdmUgYW55IGdyb3VwcyB0aGF0IGRvIG5vdCBtZWV0IHRoZSBtaW5pbXVtIHRocmVzaG9sZC4KSGVyZSB3ZSB3aWxsIHVzZSAxMCwgYnV0IHRoZSB0aHJlc2hvbGQgeW91IHVzZSBmb3IgeW91ciBkYXRhc2V0IGNhbiB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgY29tcG9zaXRpb24gb2YgY2VsbCB0eXBlcy4KCmBgYHtyIGZpbHRlciBwc2V1ZG9idWxrLCBsaXZlPVRSVUV9CiMgcmVtb3ZlIGFueSBncm91cHMgd2l0aCBmZXdlciB0aGFuIDEwIGNlbGxzCmZpbHRlcl9wYl9zY2UgPC0gcGJfc2NlWywgcGJfc2NlJG5jZWxscyA+PSAxMF0KYGBgCgpXZSBjYW4gdGhlbiB0YWtlIGEgbG9vayBhbmQgc2VlIGhvdyBtYW55IGNlbGwgdHlwZS1zYW1wbGUgY29sdW1ucyB3ZSByZW1vdmVkLCBpZiBhbnkuCgpgYGB7ciBwcmludCBkaW0sIGxpdmU9VFJVRX0KIyBwcmludCBvdXQgZGltZW5zaW9ucyBvZiB1bmZpbHRlcmVkIHBzZXVkb2J1bGsgc2NlCmRpbShwYl9zY2UpCgojIGRpbWVuc2lvbnMgb2YgZmlsdGVyZWQgcHNldWRvYnVsayBzY2UKZGltKGZpbHRlcl9wYl9zY2UpCmBgYAoKSXQgbG9va3MgbGlrZSB3ZSBvbmx5IGdvdCByaWQgb2Ygb25lIGdyb3VwLgpXZSBjYW4gZG8gYSBxdWljayBjaGVjayB0byBzZWUgd2hpY2ggZ3JvdXAgd2FzIHJlbW92ZWQgYnkgZmluZGluZyB3aGljaCBjb2x1bW4gaXMgbm8gbG9uZ2VyIHByZXNlbnQgaW4gdGhlIGZpbHRlcmVkIG9iamVjdC4KCmBgYHtyIHJlbW92ZWQgY29sdW1ucywgbGl2ZT1UUlVFfQojIGZpbmQgcmVtb3ZlZCBjb2x1bW5zCnJlbW92ZWRfY29scyA8LSAhKGNvbG5hbWVzKHBiX3NjZSkgJWluJSBjb2xuYW1lcyhmaWx0ZXJfcGJfc2NlKSkKCiMgcHJpbnQgb3V0IG1pc3NpbmcgY29sdW1ucwpjb2xuYW1lcyhwYl9zY2UpW3JlbW92ZWRfY29sc10KYGBgCgpUaGUgbGFzdCBzdGVwIHdlIHdhbnQgdG8gZG8gdG8gcHJlcGFyZSBvdXIgZGF0YXNldCBmb3IgREUgaXMgdG8gc3Vic2V0IHRoZSBwc2V1ZG8tYnVsa2VkIFNDRSBvYmplY3QgdG8gY29udGFpbiBvbmx5IHRoZSBjZWxsIHR5cGUgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjb21wYXJpbmcgYWNyb3NzIHRoZSB0d28gUk1TIHN1YnR5cGVzLgpBcyBtZW50aW9uZWQgcHJldmlvdXNseSwgd2UgYXJlIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIHRoZSBgVHVtb3JfTXlvYmxhc3RgIGNlbGwgdHlwZS4KCmBgYHtyIGZpbHRlciBjZWxsdHlwZX0KIyBsb2dpY2FsIHZlY3RvciBpbmRpY2F0aW5nIGlmIGNlbGxzIGFyZSB0dW1vciBteW9ibGFzdCBvciBub3QKbXlvYmxhc3RfY2VsbHMgPC0gZmlsdGVyX3BiX3NjZSRjZWxsdHlwZV9icm9hZCA9PSAiVHVtb3JfTXlvYmxhc3QiCgojIGNyZWF0ZSBhIG5ldyBzY2Ugd2l0aCBvbmx5IHRoZSB0dW1vciBteW9ibGFzdHMKdHVtb3JfbXlvYmxhc3Rfc2NlIDwtIGZpbHRlcl9wYl9zY2VbLCBteW9ibGFzdF9jZWxsc10KYGBgCgpBZnRlciBmaWx0ZXJpbmcgZm9yIG91ciBjZWxsIHR5cGUgb2YgaW50ZXJlc3Qgd2Ugc2hvdWxkIGhhdmUgYSBkYXRhc2V0IHdpdGggNiBjb2x1bW5zLCAxIGZvciBlYWNoIGdyb3VwIG9mIGBUdW1vcl9NeW9ibGFzdGAgY2VsbHMgaW4gZWFjaCBvZiBvdXIgNiBzYW1wbGVzLgoKIyMjIFBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gd2l0aCBgREVTZXEyYAoKTm93IHdlIHdpbGwgdXNlIHRoZSBgREVTZXEyYCBwYWNrYWdlIHRvIHBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gKERFKSBhbmFseXNpcyBvbiBvdXIgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0LgpGcm9tIHRoaXMgcG9pbnQsIHdlIGNhbiBwcm9jZWVkIGluIHRoZSBzYW1lIHdheSB3ZSB3b3VsZCBpZiB3ZSBoYWQgYSBidWxrIFJOQS1zZXEgZGF0YXNldCB3aXRoIDYgc2FtcGxlcy4KV2Ugd2lsbCBzdGFydCB3aXRoIHRoZSB1bm5vcm1hbGl6ZWQgcmF3IGNvdW50cyBpbiB0aGUgYGNvdW50c2AgYXNzYXkgb2YgdGhlIHBzZXVkby1idWxrZWQgU0NFIGFuZCBkbyB0aGUgZm9sbG93aW5nIHdpdGggYERFU2VxMmA6CgotIENyZWF0ZSBhIGBERVNlcURhdGFTZXRgIG9iamVjdAotIE5vcm1hbGl6ZSBhbmQgbG9nIHRyYW5zZm9ybSB0aGUgY291bnRzIGRhdGEKLSBFc3RpbWF0ZSBkaXNwZXJzaW9ucyBhbmQgc2hyaW5rIGVzdGltYXRlcwotIEZpdCBhIG5lZ2F0aXZlIGJpbm9taWFsIG1vZGVsIGFuZCBwZXJmb3JtIGh5cG90aGVzaXMgdGVzdGluZyB1c2luZyBXYWxkIHN0YXRpc3RpY3MKCllvdSBjYW4gYWxzbyByZWZlciB0byBvdXIgW21hdGVyaWFscyBmcm9tIG91ciBwcmV2aW91cyB3b3Jrc2hvcHMgY292ZXJpbmcgYnVsayBSTkEtc2VxXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS90cmFpbmluZy1tb2R1bGVzL3RyZWUvbWFzdGVyL1JOQS1zZXEjcmVhZG1lKSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyBgREVTZXFgLgoKIyMjIyBDcmVhdGUgdGhlIGBERVNlcURhdGFTZXRgIG9iamVjdAoKVG8gY3JlYXRlIHRoZSBgREVTZXFEYXRhU2V0YCBvYmplY3Qgd2Ugd2lsbCBuZWVkIHRoZSB1bm5vcm1hbGl6ZWQgY291bnRzIG1hdHJpeCwgdGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxlcywgYW5kIGEgZGVzaWduIGZvcm11bGEuClRoZSBmaXJzdCB0d28gaXRlbXMgYXJlIGFscmVhZHkgc3RvcmVkIGluIG91ciBTQ0Ugb2JqZWN0LCBzbyB3ZSBjYW4gY3JlYXRlIGEgYERFU2VxRGF0YVNldGAgb2JqZWN0IGRpcmVjdGx5IGZyb20gdGhhdCBvYmplY3QgdXNpbmcgdGhlIGBERVNlcURhdGFTZXQoKWAgZnVuY3Rpb24uClRoZSBkZXNpZ24gZm9ybXVsYSBpcyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIGNvbHVtbnMgb2YgdGhlIG1ldGFkYXRhIG5lZWQgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGUgREUgY29tcGFyaXNvbi4KRm9yIG91ciBleHBlcmltZW50IHdlIGFyZSBjb21wYXJpbmcgZ2VuZSBleHByZXNzaW9uIGJldHdlZW4gZGlmZmVyZW50IFJNUyBzdWJ0eXBlcy4KVGhlIHN1YnR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBgZGlhZ25vc2lzX2dyb3VwYCBjb2x1bW4gb2YgdGhlIGBjb2xEYXRhYCBpbiB0aGUgcHNldWRvLWJ1bGtlZCBTQ0UuCgpgYGB7ciBkZXNlcSBvYmplY3QsIGxpdmU9VFJVRX0KIyBzZXQgdXAgdGhlIGRlc2VxIG9iamVjdCwgZ3JvdXAgYnkgZGlhZ25vc2lzCmRlc2VxX29iamVjdCA8LSBERVNlcTI6OkRFU2VxRGF0YVNldCh0dW1vcl9teW9ibGFzdF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSB+IGRpYWdub3Npc19ncm91cCkKYGBgCgpUaGUgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0IGNvbnRhaW5zIG9ubHkgb25lIGFzc2F5OiB0aGUgYGNvdW50c2AgYXNzYXkuClRoaXMgaXMgYmVjYXVzZSBgREVTZXEyYCBleHBlY3RzIHJhdyBjb3VudHMuCldoZW4gd2UgcnVuIGBERVNlcTJgIG9uIG91ciBkYXRhc2V0LCByYXcgY291bnRzIHdpbGwgZmlyc3QgYmUgbm9ybWFsaXplZCB1c2luZyBzaXplIGZhY3RvcnMgdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZXMgaW4gdG90YWwgc2FtcGxlIGNvdW50cy4KVGhlcmVmb3JlIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IG5vcm1hbGl6YXRpb24gb24gb3VyIG93biDigJMgd2UnbGwgbGV0IGBERVNlcTJgIGRvIGFsbCB0aGUgd29yayBmb3IgdXMuCgpIb3dldmVyLCBiZWZvcmUgd2UgZGl2ZSBpbnRvIERFIGFuYWx5c2lzLCB3ZSBjYW4gZG8gc29tZSBpbml0aWFsIGV4cGxvcmF0aW9uIGFuZCB2aXN1YWxpemF0aW9uIG9mIG91ciBkYXRhIHRvIHNlZSBpZiBvdXIgc2FtcGxlcyBzZXBhcmF0ZSBieSBvdXIga25vd24gZmFjdG9yIG9mIGludGVyZXN0LCBSTVMgc3VidHlwZS4KSW4gcGFydGljdWxhciwgd2UgY2FuIHVzZSBwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIChQQ0EpIG9mIG91ciBwc2V1ZG8tYnVsa2VkIGRhdGFzZXQgdG8gdmlzdWFsaXplIGFueSB2YXJpYXRpb24gYmV0d2VlbiBzYW1wbGVzLgpJZiB0aGVyZSBpcyB2YXJpYXRpb24gYmV0d2VlbiBSTVMgc3VidHlwZXMsIHdlIGV4cGVjdCB0aGVpciByZXNwZWN0aXZlIHNhbXBsZXMgdG8gc2VwYXJhdGUgaW4gUEMgc3BhY2UsIGxpa2VseSBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcy4KV2UgY2FuIGV2YWx1YXRlIHRoaXMgYnkgcGxvdHRpbmcgUEMxIGFuZCBQQzIuCgpJbiBvcmRlciB0byBjcmVhdGUgb3VyIFBDQSBwbG90LCB3ZSB3aWxsIGZpcnN0IG5lZWQgdG8gbm9ybWFsaXplIG91ciBkYXRhIHRvIGFjY291bnQgZm9yIGFueSB0ZWNobmljYWwgdmFyaWF0aW9ucyBhY3Jvc3Mgc2FtcGxlcy4KQXMgYSByZW1pbmRlciwgdGhpcyBpcyBOT1QgcmVxdWlyZWQgZm9yIHJ1bm5pbmcgYERFU2VxMmAgYW5hbHlzaXM7IHdlIGFyZSBqdXN0IHVzaW5nIGl0IHRvIHZpc3VhbGl6ZSBvdXIgZGF0YSBwcmlvciB0byBERSBhbmFseXNpcy4KCmBgYHtyIG5vcm1hbGl6ZX0KIyBlc3RpbWF0ZSBzaXplIGZhY3RvcnMgZmlyc3QKZGVzZXFfb2JqZWN0IDwtIERFU2VxMjo6ZXN0aW1hdGVTaXplRmFjdG9ycyhkZXNlcV9vYmplY3QpCgojIG5vcm1hbGl6ZSBhbmQgbG9nIHRyYW5zZm9ybSB0byB1c2UgZm9yIHZpc3VhbGl6YXRpb24Kbm9ybWFsaXplZF9vYmplY3QgPC0gREVTZXEyOjpybG9nKGRlc2VxX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaW5kID0gVFJVRSkKbm9ybWFsaXplZF9vYmplY3QKYGBgCgpXZSBub3cgaGF2ZSBhIG5vcm1hbGl6ZWQgYW5kIHRyYW5zZm9ybWVkIG9iamVjdCB0aGF0IGNhbiBiZSBkaXJlY3RseSBpbnB1dCB0byB0aGUgYERFU2VxMjo6cGxvdFBDQSgpYCBmdW5jdGlvbiwgd2hpY2ggd2lsbCBib3RoIGNhbGN1bGF0ZSBhbmQgcGxvdCB0aGUgUEMgcmVzdWx0cy4KCmBgYHtyIHBsb3RQQ0EsIGxpdmU9VFJVRX0KREVTZXEyOjpwbG90UENBKG5vcm1hbGl6ZWRfb2JqZWN0LCBpbnRncm91cCA9ICJkaWFnbm9zaXNfZ3JvdXAiKQpgYGAKCkFzIGV4cGVjdGVkIHdlIHNlZSB0aGF0IHNhbXBsZXMgZ3JvdXAgdG9nZXRoZXIgYmFzZWQgb24gUk1TIHN1YnR5cGUgYW5kIGFyZSBzZXBhcmF0ZWQgYWxvbmcgdGhlIFBDMSBheGlzLCB0aGUgUEMgY29udHJpYnV0aW5nIHRoZSBoaWdoZXN0IGFtb3VudCBvZiB2YXJpYXRpb24uCgojIyMjIFJ1biBgREVTZXFgCgpXZSdsbCBub3cgdXNlIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiBgREVTZXEoKWAgdG8gcGVyZm9ybSBvdXIgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMuClRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBub3JtYWxpemF0aW9uIGZhY3RvcnMsIGVzdGltYXRlcyBnZW5lLXdpc2UgZGlzcGVyc2lvbnMsIGZpdHMgYSBuZWdhdGl2ZSBiaW5vbWlhbCBtb2RlbCBhbmQgcGVyZm9ybXMgaHlwb3RoZXNpcyB0ZXN0aW5nIHVzaW5nIFdhbGQgc3RhdGlzdGljcy4KCmBgYHtyIGRlc2VxLCBsaXZlPVRSVUV9CiMgcnVuIERFU2VxCmRlc2VxX29iamVjdCA8LSBERVNlcTI6OkRFU2VxKGRlc2VxX29iamVjdCkKYGBgCgpXZSBjYW4gZXZhbHVhdGUgaG93IHdlbGwgdGhlIG1vZGVsIGZpdCBvdXIgZGF0YSBieSBsb29raW5nIGF0IHRoZSBkaXNwZXJzaW9uIGVzdGltYXRlcy4KV2UgZXhwZWN0IHRvIHNlZSB0aGUgZGlzcGVyc2lvbiBlc3RpbWF0ZXMgZGVjcmVhc2UgYXMgbWVhbnMgYXJlIGluY3JlYXNpbmcgYW5kIGZvbGxvdyB0aGUgbGluZSBvZiBiZXN0IGZpdC4KCmBgYHtyIHBsb3QgZGlzcGVyc2lvbiwgbGl2ZT1UUlVFfQpwbG90RGlzcEVzdHMoZGVzZXFfb2JqZWN0KQpgYGAKCk5vdyB3ZSBjYW4gZXh0cmFjdCB0aGUgcmVzdWx0cyBmcm9tIHRoZSBvYmplY3QsIHNwZWNpZnlpbmcgdGhlIHAtdmFsdWUgdGhyZXNob2xkIHRoYXQgd2Ugd291bGQgbGlrZSB0byB1c2UuCgpgYGB7ciByZXN1bHRzLCBsaXZlPVRSVUV9CiMgZXh0cmFjdCB0aGUgcmVzdWx0cyBhcyBhIERhdGFGcmFtZQpkZXNlcV9yZXN1bHRzIDwtIERFU2VxMjo6cmVzdWx0cyhkZXNlcV9vYmplY3QsIGFscGhhID0gMC4wNSkKYGBgCgpCdXQgd2UgYXJlbid0IGRvbmUgeWV0IQoKVGhlIGVzdGltYXRlcyBvZiBsb2cyIGZvbGQgY2hhbmdlIGNhbGN1bGF0ZWQgYnkgYERFU2VxKClgIGFyZSBub3QgY29ycmVjdGVkIGZvciBleHByZXNzaW9uIGxldmVsLgpUaGlzIG1lYW5zIHRoYXQgd2hlbiBjb3VudHMgYXJlIHNtYWxsLCB3ZSBhcmUgbGlrZWx5IHRvIGVuZCB1cCB3aXRoIHNvbWUgbGFyZ2UgZm9sZCBjaGFuZ2UgdmFsdWVzIHRoYXQgb3ZlcmVzdGltYXRlIHRoZSB0cnVlIGV4dGVudCBvZiB0aGUgY2hhbmdlIGJldHdlZW4gY29uZGl0aW9ucy4KCldlIGNhbiBjb3JyZWN0IHRoaXMgYnkgYXBwbHlpbmcgYSAic2hyaW5rYWdlIiBwcm9jZWR1cmUsIHdoaWNoIHdpbGwgYWRqdXN0IGxhcmdlIHZhbHVlcyB3aXRoIHNtYWxsIGNvdW50cyBkb3dud2FyZCwgd2hpbGUgcHJlc2VydmluZyB2YWx1ZXMgd2l0aCBsYXJnZXIgY291bnRzLCB3aGljaCBhcmUgbGlrZWx5IHRvIGJlIG1vcmUgYWNjdXJhdGUuCgpUbyBkbyB0aGlzLCB3ZSB3aWxsIHVzZSB0aGUgYGxmY1NocmluaygpYCBmdW5jdGlvbiwgYnV0IGZpcnN0IHdlIG5lZWQgdG8ga25vdyB0aGUgbmFtZSBhbmQvb3IgcG9zaXRpb24gb2YgdGhlICJjb2VmZmljaWVudCIgdGhhdCB3YXMgY2FsY3VsYXRlZCBieSBgREVTZXEoKWAsIHdoaWNoIHdlIGNhbiBkbyB3aXRoIHRoZSBgcmVzdWx0c05hbWVzKClgIGZ1bmN0aW9uLgoKYGBge3IgY29lZmZpY2llbnQsIGxpdmU9VFJVRX0KIyBpZGVudGlmeSBwb3NpdGlvbiBvZiBjb2VmZmljaWVudApERVNlcTI6OnJlc3VsdHNOYW1lcyhkZXNlcV9vYmplY3QpCmBgYAoKCmBgYHtyIHNocmlua2FnZX0KIyBhcHB5bHkgbG9nRkMgc2hyaW5rYWdlIHVzaW5nIHRoZSBkZWZhdWx0IG1vZGVsCnNocmlua19yZXN1bHRzIDwtIERFU2VxMjo6bGZjU2hyaW5rKAogIGRlc2VxX29iamVjdCwKICByZXMgPSBkZXNlcV9yZXN1bHRzLAogIGNvZWYgPSAyLAogIHR5cGUgPSAiYXBlZ2xtIgopCmhlYWQoc2hyaW5rX3Jlc3VsdHMpCmBgYAoKSWYgeW91IGxvb2sgYXQgb3VyIGBzaHJpbmtfcmVzdWx0c2Agb2JqZWN0LCB3ZSBzZWUgdGhhdCB0aGUgZ2VuZXMgYXJlIGxhYmVsZWQgd2l0aCB0aGUgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXJzLCBhcyB0aG9zZSB3ZXJlIHRoZSByb3cgbmFtZXMgb2YgdGhlIHBzZXVkby1idWxrZWQgU0NFIHdlIHVzZWQgYXMgaW5wdXQgdG8gYnVpbGQgb3VyIGBERVNlcTJgIG9iamVjdC4KQWx0aG91Z2ggc29tZSBvZiB1cyBtYXkgaGF2ZSBhbGwgb2YgdGhlIGlkZW50aWZpZXJzIG1lbW9yaXplZCBieSBoZWFydCwgaXQgY2FuIGJlIHVzZWZ1bCB0byBoYXZlIGEgaHVtYW4gcmVhZGFibGUgc3ltYm9sIGluIG91ciByZXN1bHRzLgpCZWZvcmUgd2Ugc2F2ZSB0aGUgcmVzdWx0cyBhcyBhIGZpbGUsIHdlIHdpbGwgZ3JhYiB0aGUgZ2VuZSBzeW1ib2xzIGZyb20gdGhlIGByb3dEYXRhYCBvZiBvdXIgb3JpZ2luYWwgU0NFIG9iamVjdCBhbmQgYWRkIHRoZW0gYXMgYSBuZXcgY29sdW1uLgoKYGBge3IgYWRkIGdlbmUgc3ltYm9sfQpkZXNlcV9yZXN1bHRzIDwtIHNocmlua19yZXN1bHRzIHw+CiAgIyBkaXJlY3RseSBhZGQgRW5zZW1ibCBpZCBhcyBhIGNvbHVtbgogICMgY29udmVydGluZyByZXN1bHRzIGludG8gYSBkYXRhIGZyYW1lCiAgdGliYmxlOjphc190aWJibGUocm93bmFtZXMgPSAiZW5zZW1ibF9pZCIpCgojIGNvbnZlcnQgcm93ZGF0YSB0byBkYXRhIGZyYW1lCnNjZV9yb3dkYXRhX2RmIDwtIHJvd0RhdGEodHVtb3JfbXlvYmxhc3Rfc2NlKSB8PgogICMgY3JlYXRlIGEgY29sdW1uIHdpdGggcm93bmFtZXMgc3RvcmVkIGFzIGVuc2VtYmwgaWQKICAjIHVzZSBmb3Igam9pbmluZyB3aXRoIGRlc2VxIHJlc3VsdHMKICB0aWJibGU6OmFzX3RpYmJsZShyb3duYW1lcyA9ICJlbnNlbWJsX2lkIikKCiMgY29tYmluZSBkZXNlcSByZXN1bHRzIHdpdGggcm93ZGF0YSBieSBlbnNlbWJsIGlkCmRlc2VxX3Jlc3VsdHMgPC0gZGVzZXFfcmVzdWx0cyB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oc2NlX3Jvd2RhdGFfZGYsIGJ5ID0gImVuc2VtYmxfaWQiKQoKaGVhZChkZXNlcV9yZXN1bHRzKQpgYGAKCldlIGNhbiBzYXZlIHRoZSBuZXcgZGF0YSBmcmFtZSB0aGF0IHdlIGhhdmUgY3JlYXRlZCB3aXRoIHRoZSBFbnNlbWJsIGlkZW50aWZpZXJzLCBnZW5lIHN5bWJvbHMsIGFuZCB0aGUgYERFU2VxMmAgcmVzdWx0cyBhcyBhIHRhYiBzZXBhcmF0ZWQgKGB0c3ZgKSBmaWxlLgoKYGBge3Igc2F2ZSBkZXNlcSwgbGl2ZT1UUlVFfQojIHNhdmUgb3VyIHJlc3VsdHMgYXMgdHN2CnJlYWRyOjp3cml0ZV90c3YoZGVzZXFfcmVzdWx0cywgZGVzZXFfb3V0cHV0X2ZpbGUpCmBgYAoKTmV4dCwgd2Ugd2lsbCB0YWtlIGEgbG9vayBhdCBob3cgbWFueSBnZW5lcyBhcmUgc2lnbmlmaWNhbnQuCkhlcmUgd2Ugd2lsbCB3YW50IHRvIHVzZSB0aGUgYWRqdXN0ZWQgcC12YWx1ZSwgZm91bmQgaW4gdGhlIGBwYWRqYCBjb2x1bW4gb2YgdGhlIHJlc3VsdHMsIGFzIHRoaXMgYWNjb3VudHMgZm9yIG11bHRpcGxlIHRlc3QgY29ycmVjdGlvbi4KCmBgYHtyIHNpZ25pZmljYW50IHJlc3VsdHMsIGxpdmU9VFJVRX0KIyBmaXJzdCBsb29rIGF0IHRoZSBzaWduaWZpY2FudCByZXN1bHRzCmRlc2VxX3Jlc3VsdHNfc2lnIDwtIGRlc2VxX3Jlc3VsdHMgfD4KICAjIGZpbHRlciBiYXNlZCBvbiBhZGp1c3RlZCBwdmFsdWUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPD0gMC4wNSkKCmhlYWQoZGVzZXFfcmVzdWx0c19zaWcpCmBgYAoKCiMjIyBFeHBsb3JpbmcgdGhlIGlkZW50aWZpZWQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzCgpOb3cgdGhhdCB3ZSBoYXZlIGlkZW50aWZpZWQgYSBzZXQgb2YgZ2VuZXMgdGhhdCBhcmUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGluIHRoZSB0dW1vciBteW9ibGFzdHMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHN1YnR5cGVzLCBsZXRzIGFjdHVhbGx5IHRha2UgYSBsb29rIGF0IHRoZW0gYW5kIHNlZSBpZiB3ZSBjYW4gbWFrZSBzb21lIGluZm9ybWF0aXZlIHBsb3RzLgpUaGUgZmlyc3QgcGxvdCB3ZSdsbCBtYWtlIGlzIGEgdm9sY2FubyBwbG90IHVzaW5nIHRoZSBbYEVuaGFuY2VkVm9sY2Fub2AgcGFja2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL2tldmluYmxpZ2hlL0VuaGFuY2VkVm9sY2FubykuClRoaXMgcGFja2FnZSBhdXRvbWF0aWNhbGx5IGNvbG9ycyB0aGUgcG9pbnRzIGJ5IGN1dG9mZnMgZm9yIGJvdGggc2lnbmlmaWNhbmNlIGFuZCBmb2xkIGNoYW5nZSBhbmQgbGFiZWxzIG1hbnkgb2YgdGhlIHNpZ25pZmljYW50IGdlbmVzIChzdWJqZWN0IHRvIHNwYWNpbmcpLgpgRW5oYW5jZWRWb2xjYW5vYCBoYXMgbWFueSwgbWFueSBvcHRpb25zLCB3aGljaCBpcyBhIGdvb2QgdGhpbmcgaWYgeW91IGRvbid0IGxpa2UgYWxsIG9mIGl0cyBkZWZhdWx0IHNldHRpbmdzLgpFdmVuIGJldHRlciwgaXQgb3V0cHV0cyBhIGBnZ3Bsb3QyYCBvYmplY3QsIHNvIGlmIHdlIHdhbnQgdG8gY3VzdG9taXplIHRoZSBwbG90IGZ1cnRoZXIsIHdlIGNhbiB1c2UgdGhlIHNhbWUgYGdncGxvdDJgIGNvbW1hbmRzIHdlIGhhdmUgdXNlZCBiZWZvcmUuCgpgYGB7ciB2b2xjYW5vfQpFbmhhbmNlZFZvbGNhbm86OkVuaGFuY2VkVm9sY2FubyhkZXNlcV9yZXN1bHRzLAogICAgICAgICAgICAgICAgeCA9ICdsb2cyRm9sZENoYW5nZScsICMgZm9sZCBjaGFuZ2Ugc3RhdGlzdGljIHRvIHBsb3QKICAgICAgICAgICAgICAgIHkgPSAncHZhbHVlJywgIyBzaWduaWZpY2FuY2UgdmFsdWVzCiAgICAgICAgICAgICAgICBsYWIgPSBkZXNlcV9yZXN1bHRzJGdlbmVfc3ltYm9sLCAjIGxhYmVscyBmb3IgcG9pbnRzCiAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMWUtMDUsICMgcCB2YWx1ZSBjdXRvZmYgKGRlZmF1bHQpCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsICMgZm9sZCBjaGFuZ2UgY3V0b2ZmIChkZWZhdWx0KQogICAgICAgICAgICAgICAgdGl0bGUgPSBOVUxMLCAjIG5vIHRpdGxlCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IE5VTEwsICMgb3Igc3VidGl0bGUKICAgICAgICAgICAgICAgIGNhcHRpb24gPSBOVUxMLCAjIG9yIGNhcHRpb24KICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwgIyBhZGQgc29tZSBmdW4gYXJyb3dzCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMyAgIyBzbWFsbGVyIGxhYmVscwogICAgICAgICAgICAgICAgKSArCiAgIyBjaGFuZ2UgdGhlIG92ZXJhbGwgdGhlbWUKICB0aGVtZV9idygpICsKICAjIG1vdmUgdGhlIGxlZ2VuZCB0byB0aGUgYm90dG9tCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCmBgYAoKCldlIGNhbiBhbHNvIHJldHVybiBiYWNrIHRvIHRoZSBTQ0Ugb2JqZWN0IHRoYXQgd2UgdXNlZCB0byBjcmVhdGUgb3VyIHBzZXVkby1idWxrZWQgU0NFIGFuZCBsb29rIGF0IGdlbmUgZXhwcmVzc2lvbiBvZiBzb21lIG9mIHRoZSBzaWduaWZpY2FudCBnZW5lcy4KV2UgY2FuIGNyZWF0ZSBVTUFQIHBsb3RzIGFzIHdlIGRpZCBwcmV2aW91c2x5LCBidXQgaW5zdGVhZCBvZiBsYWJlbGluZyBlYWNoIGNlbGwgd2l0aCBtZXRhZGF0YSwgd2UgY2FuIGNvbG9yIGNlbGxzIGJ5IGEgc3BlY2lmaWVkIGdlbmUncyBleHByZXNzaW9uIGxldmVscy4KV2Ugd2lsbCBhbHNvIHVzZSBzb21lIG9mIHRoZSBgZ2dwbG90MmAgc2tpbGxzIHdlIHBpY2tlZCB1cCBlYXJsaWVyLCBsaWtlIGBmYWNldF9ncmlkKClgIHRvIHBsb3QgY2VsbHMgZnJvbSBkaWZmZXJlbnQgUk1TIHN1YnR5cGVzIHNlcGFyYXRlbHkuClRoaXMgY2FuIGhlbHAgdXMgdmFsaWRhdGUgdGhlIGBERVNlcTJgIHJlc3VsdHMgc28gdGhhdCB3ZSBjYW4gdmlzdWFsaXplIGdlbmUgZXhwcmVzc2lvbiBjaGFuZ2VzIGFjcm9zcyBvdXIgY2VsbCB0eXBlIG9mIGludGVyZXN0IG9uIGEgc2luZ2xlLWNlbGwgbGV2ZWwuCgpgYGB7ciBleHByZXNzaW9uIHVtYXAsIGxpdmU9VFJVRX0KIyBmaWx0ZXIgdG8ganVzdCBteW9ibGFzdCBjZWxscyBhbmQgcmVtb3ZlIGFueSBOQSdzIGJlZm9yZSBwbG90dGluZwpteW9ibGFzdF9jb21iaW5lZF9zY2UgPC0gcm1zX3NjZVssIHdoaWNoKHJtc19zY2UkY2VsbHR5cGVfYnJvYWQgPT0gIlR1bW9yX015b2JsYXN0IildCgojIHBsb3QgUFRQUlQgKEVOU0cwMDAwMDE5NjA5MCkgZXhwcmVzc2lvbiBpbiBBUk1TIHZzLiBFUk1TCnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obXlvYmxhc3RfY29tYmluZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gIkVOU0cwMDAwMDE5NjA5MCIsICNQVFBSVAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCwKICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSAiZGlhZ25vc2lzX2dyb3VwIikgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSkKYGBgCgpJbiB0aGUgYWJvdmUgcGxvdCB3ZSBvbmx5IHBsb3R0ZWQgdGhlIHR1bW9yIG15b2JsYXN0IGNlbGxzIHRoYXQgd2UgdXNlZCBpbiBvdXIgREUgYW5hbHlzaXMuCkhvd2V2ZXIsIHdlIG1pZ2h0IGJlIGludGVyZXN0ZWQgdG8gc2VlIHRoZSBleHByZXNzaW9uIG9mIGdlbmVzIHRoYXQgYXJlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBpbiBvdGhlciBjZWxsIHR5cGVzIHByZXNlbnQgaW4gb3VyIHNhbXBsZXMuCgpgYGB7ciBjZWxsdHlwZSBjb21wYXJpc29ufQojIGxldCdzIGNvbXBhcmUgZ2VuZSBleHByZXNzaW9uIGFjcm9zcyBzb21lIG90aGVyIGNlbGwgdHlwZXMKIyBsb29rIGF0IGFsbCB0dW1vciBjZWxscyBhbmQgcGljayBvbmUgbm9ybWFsIGNlbGwgdHlwZQpjZWxsdHlwZXMgPC0gYygiVHVtb3JfTXlvYmxhc3QiLAogICAgICAgICAgICAgICAiVHVtb3JfTWVzb2Rlcm0iLAogICAgICAgICAgICAgICAiVHVtb3JfTXlvY3l0ZSIsCiAgICAgICAgICAgICAgICJWYXNjdWxhciBFbmRvdGhlbGl1bSIpCgojIHN1YnNldCB0byBqdXN0IGNlbGx0eXBlcyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCnR1bW9yX3NjZSA8LSBybXNfc2NlWywgd2hpY2gocm1zX3NjZSRjZWxsdHlwZV9icm9hZCAlaW4lIGNlbGx0eXBlcyldCmBgYAoKTmV4dCB3ZSB3aWxsIGxvb2sgYXQgYSBmZXcgREUgZ2VuZXMgdGhhdCB3ZSBpZGVudGlmaWVkLCBvbmUgdXAgcmVndWxhdGVkIGdlbmUgYW5kIG9uZSBkb3duIHJlZ3VsYXRlZCBnZW5lLCBhbmQgY29tcGFyZSB0aGVpciBleHByZXNzaW9uIGluIG15b2JsYXN0cyB0byBvdGhlciBjZWxsIHR5cGVzIGluIEFSTVMgYW5kIEVSTVMgc2FtcGxlcy4KV2Ugd2lsbCB1c2UgdGhlIGBzY2F0ZXI6OnBsb3RFeHByZXNzaW9uKClgIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHZpb2xpbiBwbG90IHdpdGggUk1TIHN1YnR5cGUgb24gdGhlIHgtYXhpcyBhbmQgZ2VuZSBleHByZXNzaW9uIG9uIHRoZSB5LWF4aXMuCldlIGNhbiBjb250aW51ZSB1c2luZyBgZmFjZXRfZ3JpZCgpYCB0byBzaG93IHNlcGFyYXRlIHBhbmVscyBmb3IgZWFjaCBjZWxsIHR5cGUuCkJlY2F1c2Ugd2Ugd2FudCB0byBzaG93IG11bHRpcGxlIGdlbmVzIGhlcmUsIHdlIGFyZSBnb2luZyB0byBhZGQgYW4gYWRkaXRpb25hbCBvcHRpb24gdG8gYGZhY2V0X2dyaWQoKWAgdG8gaW5jbHVkZSBtdWx0aXBsZSByb3dzIGluIG91ciBwbG90IGdyaWQsIG9uZSBmb3IgZWFjaCBnZW5lIG9mIGludGVyZXN0LgpPbmUgbmVhdCB0cmljayBvZiB0aGUgYHNjYXRlcjo6cGxvdEV4cHJlc3Npb24oKWAgZnVuY3Rpb24gaXMgdGhhdCBpdCBhY3R1YWxseSBjcmVhdGVzIGEgYEZlYXR1cmVgIGNvbHVtbiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZmVhdHVyZXMgKGluIHRoaXMgY2FzZSBnZW5lcykgYmVpbmcgdXNlZCBpbiBwbG90dGluZy4KV2UgY2FuIHRoZW4gZGlyZWN0bHkgcmVmZXJlbmNlIHRoYXQgYEZlYXR1cmVgIGNvbHVtbiB3aGVuIHBsb3R0aW5nLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBgb3RoZXJfZmllbGRzYCBvcHRpb24gd2UgdXNlZCBwcmV2aW91c2x5LgoKYGBge3IgbXVsdGktZ2VuZSBwbG90fQojIHBpY2sgYSBjb3VwbGUgZ2VuZXMgdG8gbG9vayBhdApnZW5lc190b19wbG90IDwtIGMoIkVOU0cwMDAwMDE5NjA5MCIsICNQVFBSVAogICAgICAgICAgICAgICAgICAgIkVOU0cwMDAwMDE0ODkzNSIpICNHQVMyCgojIGNyZWF0ZSBhIHZpb2xpbiBwbG90CnNjYXRlcjo6cGxvdEV4cHJlc3Npb24odHVtb3Jfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICMgYSB2ZWN0b3Igb2YgZ2VuZXMgdG8gcGxvdAogICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gZ2VuZXNfdG9fcGxvdCwKICAgICAgICAgICAgICAgICAgICAgICB4ID0gImRpYWdub3Npc19ncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAiZGlhZ25vc2lzX2dyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSAiY2VsbHR5cGVfYnJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjEpICsKICAjIGVhY2ggY2VsbHR5cGUgaXMgaXRzIG93biBjb2x1bW4KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGNlbGx0eXBlX2Jyb2FkKSwKICAgICAgICAgICAgICMgZWFjaCBmZWF0dXJlIChnZW5lKSBpcyBpdHMgb3duIHJvdwogICAgICAgICAgICAgcm93cyA9IHZhcnMoRmVhdHVyZSkpICsKICAjIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIHRoZSBmYWNldCBsYWJlbHMKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZCgKICAgIHRpdGxlID0gIlN1YnR5cGUiLCAjIHVwZGF0ZSB0aGUgbGVnZW5kIHRpdGxlCiAgICAjIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGNvbG9ycwogICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkKICAgICkKYGBgCgpIb3cgZG8gdGhlIGV4cHJlc3Npb24gb2YgdGhlc2UgZ2VuZXMgY2hhbmdlIGFjcm9zcyBjZWxsIHR5cGVzIGFuZCBSTVMgc3VidHlwZXM/CgpHbyBhaGVhZCBhbmQgZXhwbG9yZSBzb21lIGdlbmVzIG9uIHlvdXIgb3duIQpGZWVsIGZyZWUgdG8gcGxvdCBhbnkgb2YgdGhlIGdlbmVzIHRoYXQgYXJlIGlkZW50aWZpZWQgYXMgc2lnbmlmaWNhbnQsIGZvdW5kIGluIHRoZSBERSByZXN1bHRzIHRhYmxlLCBvciB5b3VyIGZhdm9yaXRlIGdlbmUuClJlbWVtYmVyLCB5b3UgbmVlZCB0byB1c2UgdGhlIEVuc2VtYmwgZ2VuZSBpZGVudGlmaWVyIHRvIHJlZmVyIHRvIGVhY2ggZ2VuZS4KCmBgYHtyIGV4cGxvcmV9CiMgbm93IGRvIHNvbWUgZXhwbG9yYXRpb24gb2Ygb3RoZXIgZ2VuZXMgb24geW91ciBvd24hCmBgYAoKIyMgUHJpbnQgc2Vzc2lvbiBpbmZvCgpgYGB7ciBzZXNzaW9uIGluZm99CnNlc3Npb25JbmZvKCkKYGBgCgo=
    +
    LS0tCnRpdGxlOiAiRGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMgZm9yIHNjUk5BLXNlcSBkYXRhIgphdXRob3I6ICJEYXRhIExhYiBmb3IgQUxTRiIKZGF0ZTogMjAyMwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCiMjIE9iamVjdGl2ZXMKClRoaXMgbm90ZWJvb2sgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG86CgotIFVzZSBwc2V1ZG8tYnVsa2luZyB0byBwcmVwYXJlIHNjUk5BLXNlcSBsaWJyYXJpZXMgZm9yIGRpZmZlcmVudGlhbCBleHByZXNzaW9uCi0gUGVyZm9ybSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiB3aXRoIHRoZSBgREVTZXEyYCBwYWNrYWdlCi0gVXNlIGBnZ3Bsb3QyYCBhbmQgYEVuaGFuY2VkVm9sY2Fub2AgdG8gdmlzdWFsaXplIGdlbmUgZXhwcmVzc2lvbiBjaGFuZ2VzIGFjcm9zcyBjZWxsIHR5cGVzIGFuZCBzYW1wbGVzCgotLS0KCkp1c3QgbGlrZSBidWxrIFJOQS1zZXEsIGl0IGlzIGxpa2VseSB0aGF0IG9uZSBvZiB0aGUgZ29hbHMgd2hlbiBwZXJmb3JtaW5nIHNjUk5BLXNlcSB3aWxsIGJlIHRvIGNvbXBhcmUgdGhlIGdlbmUgZXhwcmVzc2lvbiBvZiBtdWx0aXBsZSBzYW1wbGVzIHRvIGVhY2ggb3RoZXIuClVubGlrZSBidWxrIFJOQS1zZXEgYW5hbHlzaXMsIHNjUk5BLXNlcSBhbmFseXNpcyBhbGxvd3MgdXMgdG8gaWRlbnRpZnkgYW5kIGFubm90YXRlIGNlbGwgdHlwZXMgb3Igc3VicG9wdWxhdGlvbnMgb2YgY2VsbHMgcHJlc2VudCBpbiBlYWNoIG9mIG91ciBzYW1wbGVzLgpUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIGFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGluIGNlbGwgdHlwZSBjb21wb3NpdGlvbiBhY3Jvc3Mgc2FtcGxlcyBhbmQgc3BlY2lmaWNhbGx5IGZvY3VzIG9uIGNlbGwgdHlwZXMgb3IgcG9wdWxhdGlvbnMgb2YgaW50ZXJlc3Qgd2hlbiBwZXJmb3JtaW5nIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIChERSkgYW5hbHlzaXMuCkluIHRoaXMgbm90ZWJvb2ssIHdlIHdpbGwgd29yayB3aXRoIG11bHRpcGxlIHNhbXBsZXMgdG8gaWRlbnRpZnkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGFjcm9zcyBjZWxsIHR5cGVzIG9mIGludGVyZXN0IHVzaW5nIHRoZSBbYERFU2VxMmBdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9ERVNlcTIuaHRtbCkgcGFja2FnZS4KCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogRGlmZmVyZW50aWFsIGV4cHJlc3Npb25dKGRpYWdyYW1zL3JvYWRtYXBfZGlmZmVyZW50aWFsX2V4cHJlc3Npb24ucG5nKQoKV2Ugd2lsbCBjb250aW51ZSB3b3JraW5nIHdpdGggc2FtcGxlcyBmcm9tIHRoZSBbYFNDUENQMDAwMDA1YCBwcm9qZWN0XShodHRwczovL3NjcGNhLmFsZXhzbGVtb25hZGUub3JnL3Byb2plY3RzL1NDUENQMDAwMDA1KSwgYW4gaW52ZXN0aWdhdGlvbiBvZiBwZWRpYXRyaWMgc29saWQgdHVtb3JzIGxlZCBieSB0aGUgRHllciBhbmQgQ2hlbiBsYWJzIGF0IFN0LiBKdWRlIENoaWxkcmVuJ3MgUmVzZWFyY2ggSG9zcGl0YWwuClRoaXMgcGFydGljdWxhciBkYXRhc2V0IGNvbnRhaW5zIDEwIGRpZmZlcmVudCBzYW1wbGVzIHRoYXQgaGF2ZSBiZWVuIGludGVncmF0ZWQgdXNpbmcgYGZhc3RNTk5gLCBmb2xsb3dpbmcgdGhlIHNhbWUgcHJvY2VkdXJlIHdlIG91dGxpbmVkIGluIGAwMi1kYXRhc2V0X2ludGVncmF0aW9uLlJtZGAuClRoZXNlIDEwIHNhbXBsZXMgcmVwcmVzZW50IHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgcmhhYmRvbXlvc2FyY29tYSAoUk1TKTogZW1icnlvbmFsIHJoYWJkb215b3NhcmNvbWEgKEVSTVMpIGFuZCBhbHZlb2xhciByaGFiZG9teW9zYXJjb21hIChBUk1TKS4KVGhlc2UgdHdvIHN1YnR5cGVzIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgYFBBWDMvUEFYNy1GT1hPMWAgZnVzaW9uIGdlbmUsIHdoaWNoIGlzIHByZXNlbnQgb25seSBpbiBBUk1TIHBhdGllbnRzLgpBZGRpdGlvbmFsbHksIGNlbGxzIGZvdW5kIGluIEFSTVMgdHVtb3JzIHRlbmQgdG8gaGF2ZSBhbiBpbmNyZWFzZWQgbXV0YXRpb25hbCBidXJkZW4gd2l0aCBjZWxscyBpbiBhIG1vcmUgZGlmZmVyZW50aWF0ZWQgc3RhdGUgY29tcGFyZWQgdG8gRVJNUyB0dW1vciBjZWxscyAoW1NoZXJuIF9ldCBhbC5fIDIwMTRdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTU4LzIxNTktODI5MC5DRC0xMy0wNjM5KTsgW1N0ZXdhcnQgX2V0IGFsLl8gMjAxOF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5jY2VsbC4yMDE4LjA3LjAxMikpLgpSTVMgdHVtb3JzLCByZWdhcmRsZXNzIG9mIHN1YnR5cGUsIGFyZSBtYWRlIHVwIG9mIGNlbGxzIHR5cGljYWxseSBhc3NvY2lhdGVkIHdpdGggZGV2ZWxvcG1lbnQgb2Ygc2tlbGV0YWwgbXVzY2xlOiBtZXNvZGVybSwgbXlvYmxhc3RzLCBhbmQgbXlvY3l0ZXMgKFtTZWJpcmUgYW5kIE1hbG9uZSAyMDAzXShodHRwczovL2RvaS5vcmcvMTAuMTEzNi9qY3AuNTYuNi40MTIpKS4KW1BhdGVsIF9ldCBhbC5fICgyMDIyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5kZXZjZWwuMjAyMi4wNC4wMDMpIHRlc3RlZCB0aGUgaHlwb3RoZXNpcyB0aGF0IGNlbGwgdHlwZXMgaGF2ZSBkaXN0aW5jdCBnZW5lIGV4cHJlc3Npb24gcGF0dGVybnMgaW4gQVJNUyB2cy4gRVJNUyBzYW1wbGVzLgpIZXJlIHdlIHdpbGwgbG9vayBhdCBhIHN1YnNldCBvZiB0aGUgc2FtcGxlcyB0aGV5IHNlcXVlbmNlZCBhbmQgaWRlbnRpZnkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGluIHR1bW9yIGNlbGxzIGJldHdlZW4gQVJNUyBhbmQgRVJNUyBzYW1wbGVzLgoKIyMgU2V0IHVwCgpgYGB7ciBzZXR1cCwgbWVzc2FnZT1GQUxTRX0KIyBzZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5CnNldC5zZWVkKDIwMjIpCgojIGxvYWQgbGlicmFyaWVzCmxpYnJhcnkoZ2dwbG90MikgIyBwbG90dGluZyBmdW5jdGlvbnMKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKCiMgcGFja2FnZSB1c2VkIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcwpsaWJyYXJ5KERFU2VxMikKYGBgCgojIyMgRGlyZWN0b3JpZXMgYW5kIGZpbGVzCgpXZSB3aWxsIHN0YXJ0IGJ5IHJlYWRpbmcgaW4gYSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIChTQ0UpIG9iamVjdCB0aGF0IGNvbnRhaW5zIGJvdGggdGhlIHVuY29ycmVjdGVkIChtZXJnZWQgYnV0IG5vdCBpbnRlZ3JhdGVkKSBhbmQgY29ycmVjdGVkIChpbnRlZ3JhdGVkKSBnZW5lIGV4cHJlc3Npb24gZGF0YSBmb3IgYWxsIDEwIHNhbXBsZXMuCgpQcmlvciB0byBpbnRlZ3JhdGlvbiwgYWxsIDEwIHNhbXBsZXMgd2VudCB0aHJvdWdoIHRoZSBzYW1lIGZpbHRlcmluZywgbm9ybWFsaXphdGlvbiwgYW5kIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi4KVGhlc2UgMTAgc2FtcGxlcyB3ZXJlIHRoZW4gbWVyZ2VkIGludG8gb25lIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0IGZvbGxvd2luZyB0aGUgc2FtZSBzdGVwcyBvdXRsaW5lZCBpbiBgMDMtZGF0YXNldF9pbnRlZ3JhdGlvbi5SbWRgLgpUaGUgbWVyZ2VkIG9iamVjdCB3YXMgdGhlbiBpbnRlZ3JhdGVkIHdpdGggYGZhc3RNTk5gIHRvIG9idGFpbiBhIGNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gYXNzYXkgYW5kIGNvcnJlY3RlZCByZWR1Y2VkIGRpbWVuc2lvbmFsaXR5IHJlc3VsdHMuClRoZSBmaW5hbCBTQ0Ugb2JqZWN0IHdhcyBzdG9yZWQgaW4gYGRhdGEvcm1zL2ludGVncmF0ZWQvcm1zX2FsbF9zY2UucmRzYC4KCldlIGFsc28gaGF2ZSBwcm92aWRlZCBhIG1ldGFkYXRhIGZpbGUsIGBkYXRhL3Jtcy9hbm5vdGF0aW9ucy9ybXNfc2FtcGxlX21ldGFkYXRhLnRzdmAsIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gZnJvbSBlYWNoIHNhbXBsZSwgc3VjaCBhcyBkaWFnbm9zaXMsIHNleCwgYWdlLCBldGMuCkVhY2ggcm93IGluIHRoaXMgZmlsZSBjb3JyZXNwb25kcyB0byBhIHNhbXBsZSBmb3VuZCBpbiB0aGUgaW50ZWdyYXRlZCBTQ0Ugb2JqZWN0LgoKVG8gYmVnaW4sIGxldCdzIHNldCB1cCBvdXIgZGlyZWN0b3JpZXMgYW5kIGZpbGVzOgoKYGBge3IgZmlsZXBhdGhzfQojIHNldCB1cCBmaWxlIHBhdGhzCiMgZGF0YSBkaXJlY3RvcnkgZm9yIFJNUyBkYXRhCmRhdGFfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiKQoKIyBpbnRlZ3JhdGVkIGZpbGUgY29udGFpbmluZyBzYW1wbGVzIHRvIHVzZSBmb3IgREUgYW5hbHlzaXMKaW50ZWdyYXRlZF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgoCiAgZGF0YV9kaXIsCiAgImludGVncmF0ZWQiLAogICJybXNfYWxsX3NjZS5yZHMiCikKCiMgc2FtcGxlIG1ldGFkYXRhIHRvIHNldCB1cCBERSBhbmFseXNpcwpzYW1wbGVfbWV0YWRhdGFfZmlsZSA8LSBmaWxlLnBhdGgoCiAgZGF0YV9kaXIsCiAgImFubm90YXRpb25zIiwKICAicm1zX3NhbXBsZV9tZXRhZGF0YS50c3YiCikKCiMgZGlyZWN0b3J5IHRvIHN0b3JlIG91dHB1dApkZXNlcV9kaXIgPC0gZmlsZS5wYXRoKCJhbmFseXNpcyIsICJybXMiLCAiZGVzZXEiKQpmczo6ZGlyX2NyZWF0ZShkZXNlcV9kaXIpCgojIHJlc3VsdHMgZmlsZSB0byBvdXRwdXQgZnJvbSBERSBhbmFseXNpcwpkZXNlcV9vdXRwdXRfZmlsZSA8LSBmaWxlLnBhdGgoCiAgZGVzZXFfZGlyLAogICJybXNfbXlvYmxhc3RfZGVzZXFfcmVzdWx0cy50c3YiCikKCiMgb3V0cHV0IGludGVncmF0ZWQgc2NlIG9iamVjdApvdXRwdXRfc2NlX2ZpbGUgPC0gZmlsZS5wYXRoKAogIGRhdGFfZGlyLAogICJpbnRlZ3JhdGVkIiwKICAicm1zX3N1YnNldF9zY2UucmRzIgopCmBgYAoKV2UgY2FuIGdvIGFoZWFkIGFuZCByZWFkIGluIHRoZSBTQ0Ugb2JqZWN0IGFuZCB0aGUgbWV0YWRhdGEgZmlsZS4KCmBgYHtyIHJlYWQgZmlsZXMsIGxpdmU9VFJVRX0KIyByZWFkIGluIHRoZSBTQ0Ugb2JqZWN0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbnRlZ3JhdGVkCmludGVncmF0ZWRfc2NlIDwtIHJlYWRyOjpyZWFkX3JkcyhpbnRlZ3JhdGVkX3NjZV9maWxlKQoKIyByZWFkIGluIHNhbXBsZSBtZXRhZGF0YSBmaWxlCnNhbXBsZV9tZXRhZGF0YSA8LSByZWFkcjo6cmVhZF90c3Yoc2FtcGxlX21ldGFkYXRhX2ZpbGUpCmBgYAoKIyMgRGF0YXNldCBleHBsb3JhdGlvbgoKQmVmb3JlIHdlIGRpdmUgaW50byBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiwgbGV0J3MgZXhwbG9yZSBvdXIgaW50ZWdyYXRlZCBTQ0Ugb2JqZWN0IGFuZCB0aGUgZGF0YXNldCBhIGxpdHRsZSBtb3JlLgoKV2UnbGwgc3RhcnQgYnkgbG9va2luZyBhdCB3aGF0J3MgaW5zaWRlIHRoZSBvYmplY3QuCkhlcmUgd2Ugc2hvdWxkIGhhdmUgYm90aCB0aGUgb3JpZ2luYWwgKHVuY29ycmVjdGVkKSBkYXRhIGFuZCB0aGUgaW50ZWdyYXRlZCAoY29ycmVjdGVkKSBkYXRhIGZvciBib3RoIHRoZSBnZW5lIGV4cHJlc3Npb24gYW5kIHRoZSByZWR1Y2VkIGRpbWVuc2lvbmFsaXR5IHJlc3VsdHMuCkhvdyBhcmUgdGhvc2Ugc3RvcmVkIGluIG91ciBvYmplY3Q/CgpgYGB7ciBwcmludCBzY2UsIGxpdmU9VFJVRX0KIyBwcmludCBvdXQgZW50aXJlIG9iamVjdAppbnRlZ3JhdGVkX3NjZQpgYGAKCgpgYGB7ciBwcmludCBhc3NheSBuYW1lcywgbGl2ZT1UUlVFfQojIGxvb2sgYXQgdGhlIGFzc2F5IG5hbWVzIGluIG91ciBvYmplY3QKYXNzYXlOYW1lcyhpbnRlZ3JhdGVkX3NjZSkKYGBgCgpXaGVuIHdlIGxvb2sgYXQgdGhlIGFzc2F5IG5hbWVzIHdlIHNob3VsZCBzZWUgdGhhdCB0aGVyZSBhcmUgMyBtYXRyaWNlcywgYGNvdW50c2AsIGBsb2djb3VudHNgLCBhbmQgYGZhc3Rtbm5fY29ycmVjdGVkYC4KVGhlIGBjb3VudHNgIGFuZCBgbG9nY291bnRzYCBhc3NheXMgY29ycmVzcG9uZCB0byB0aGUgdW5jb3JyZWN0ZWQgZ2VuZSBleHByZXNzaW9uIGRhdGEgdGhhdCBoYXMgYmVlbiBtZXJnZWQgYnV0IE5PVCBpbnRlZ3JhdGVkLgpUaGUgYGZhc3Rtbm5fY29ycmVjdGVkYCBkYXRhIGNvbnRhaW5zIHRoZSBjb3JyZWN0ZWQgZ2VuZSBleHByZXNzaW9uIGRhdGEgb2J0YWluZWQgZnJvbSBpbnRlZ3JhdGlvbi4KRm9yIHRoaXMgZXhlcmNpc2Ugd2Ugd2lsbCBub3QgYmUgdXNpbmcgdGhlIGBmYXN0bW5uX2NvcnJlY3RlZGAgZGF0YSAobW9yZSBvbiB3aHkgbm90IG9uY2Ugd2UgZ2V0IHRvIHNldHRpbmcgdXAgdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uKSwgYnV0IHdlIG5lZWQgdG8gYmUgYXdhcmUgdGhhdCBpdCBpcyBwcmVzZW50IGFuZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gb3VyIHVuY29ycmVjdGVkIGRhdGEuCgoKYGBge3IgcHJpbnQgcmVkdWNlZERpbSBuYW1lcywgbGl2ZT1UUlVFfQojIGxvb2sgYXQgdGhlIG5hbWVzIG9mIHRoZSBkaW1lbnNpb24gcmVkdWN0aW9ucwpyZWR1Y2VkRGltTmFtZXMoaW50ZWdyYXRlZF9zY2UpCmBgYAoKSW4gdGhlIGByZWR1Y2VkRGltYCBzbG90cyB5b3Ugc2hvdWxkIHNlZSBgUENBYCBhbmQgYFVNQVBgLCB3aGljaCB3ZXJlIGJvdGggY2FsY3VsYXRlZCBmcm9tIHRoZSBjb21iaW5lZCBkYXRhIF9iZWZvcmVfIGludGVncmF0aW9uLgpZb3Ugc2hvdWxkIGFsc28gc2VlIGBmYXN0bW5uX1BDQWAgYW5kIGBmYXN0bW5uX1VNQVBgIHJlZHVjZWQgZGltZW5zaW9ucywgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgaW50ZWdyYXRlZCByZXN1bHRzLgoKIyMjIENlbGwgdHlwZSBhbm5vdGF0aW9ucwoKSnVzdCBsaWtlIGluIHRoZSBpbnRlZ3JhdGlvbiBub3RlYm9vaywgdGhpcyBkYXRhc2V0IGFsc28gY29udGFpbnMgdGhlIGNlbGwgdHlwZSBhbm5vdGF0aW9ucyBmb3VuZCBpbiB0aGUgYGNlbGx0eXBlX2ZpbmVgIGFuZCBgY2VsbHR5cGVfYnJvYWRgIGNvbHVtbnMgb2YgdGhlIGBjb2xEYXRhYC4KVGhlc2UgY2VsbCB0eXBlcyB3ZXJlIG9yaWdpbmFsbHkgYXNzaWduZWQgaW4gW1BhdGVsIF9ldCBhbC5fICgyMDIyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5kZXZjZWwuMjAyMi4wNC4wMDMpLgpXZSB3aWxsIHVzZSB0aGVzZSBjZWxsIHR5cGUgYXNzaWdubWVudHMgdG8gc2V0IHVwIHRoZSBERSBhbmFseXNpcyBiZWxvdywgYnV0IHRoZXkgYXJlIG5vdCByZXF1aXJlZCBmb3IgREUgYW5hbHlzaXMgaXRzZWxmLgpJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgREUgYW5hbHlzaXMgY2FuIGJlIGFwcGxpZWQgdG8gYW55IHN1YnBvcHVsYXRpb24gb2YgaW50ZXJlc3QgdGhhdCBpcyBzaGFyZWQgYWNyb3NzIHNhbXBsZXMgYmVzaWRlcyBqdXN0IGNlbGwgdHlwZXMuCgpCZWNhdXNlIHdlIGFyZSBnb2luZyB0byBiZSBkb2luZyBERSBhbmFseXNpcyBiZXR3ZWVuIEFSTVMgYW5kIEVSTVMgc2FtcGxlcywgbGV0J3Mgc3RhcnQgYnkgbGFiZWxpbmcgY2VsbHMgaW4gdGhlIGludGVncmF0ZWQgZGF0YXNldCBiYXNlZCBvbiB0aGVpciBSTVMgc3VidHlwZS4KVG8gZG8gdGhpcyB3ZSB3aWxsIG5lZWQgdG8gYmUgc3VyZSB0aGF0IHRoZSBzdWJ0eXBlIGlzIHByZXNlbnQgaW4gdGhlIGBjb2xEYXRhYCBvZiB0aGUgaW50ZWdyYXRlZCBTQ0Ugb2JqZWN0LgpJZiBpdCdzIG5vdCB0aGVyZSwgd2UgbmVlZCB0byBhZGQgaXQgaW4uCgpgYGB7ciBjb2xkYXRhIGhlYWQsIGxpdmU9VFJVRX0KIyBsb29rIGF0IHRoZSBoZWFkIG9mIHRoZSBjb2xkYXRhCmhlYWQoY29sRGF0YShpbnRlZ3JhdGVkX3NjZSkpIHw+CiAgYXMuZGF0YS5mcmFtZSgpCmBgYAoKVWggb2gsIGl0IGxvb2tzIGxpa2UgdGhlIFJNUyBzdWJ0eXBlIGlzIG5vdCBmb3VuZCBpbiB0aGUgU0NFIG9iamVjdC4KRm9ydHVuYXRlbHkgd2UgYWxzbyBoYXZlIHRoZSBzYW1wbGUgbWV0YWRhdGEgdGFibGUgdGhhdCB3ZSByZWFkIGluIGVhcmxpZXIsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggb2YgdGhlIHNhbXBsZXMgcHJlc2VudCBpbiB0aGUgZGF0YXNldC4KCmBgYHtyIHNhbXBsZSBtZXRhZGF0YSwgbGl2ZT1UUlVFfQojIHByaW50IG91dCBzYW1wbGUgbWV0YWRhdGEKaGVhZChzYW1wbGVfbWV0YWRhdGEpCmBgYAoKTG9va2luZyBhdCB0aGlzIHNhbXBsZSB0YWJsZSwgd2Ugc2VlIGEgY29sdW1uIG5hbWVkIGBzdWJkaWFnbm9zaXNgIHdoaWNoIGFjY291bnRzIGZvciB0aGUgUk1TIHN1YnR5cGUsIEFSTVMgb3IgRVJNUy4KV2UgYWxzbyBzZWUgb3RoZXIgY29sdW1ucyB0aGF0IGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBzcGVjaWZpYyBzYW1wbGUuCgpXZSBjYW4gaW5jb3Jwb3JhdGUgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgc2FtcGxlIG1ldGFkYXRhIHRhYmxlIGludG8gdGhlIGBjb2xEYXRhYCBvZiB0aGUgaW50ZWdyYXRlZCBTQ0Ugb2JqZWN0LgpUaGlzIHdpbGwgYWxsb3cgdXMgdG8gbWF0Y2ggZWFjaCBvZiB0aGUgc2FtcGxlcyBpbiB0aGUgU0NFIG9iamVjdCB3aXRoIHRoZSBSTVMgc3VidHlwZSBhbmQgYWxzbyBhbGxvdyB1cyB0byB1c2UgYW55IG9mIHRoZSBjb2x1bW5zIGluIHRoZSBzYW1wbGUgbWV0YWRhdGEgZm9yIHBsb3R0aW5nLgoKYGBge3IgbW9kaWZ5IGNvbGRhdGF9CiMgYWRkIHNhbXBsZSBtZXRhZGF0YSB0byBjb2xEYXRhIGZyb20gdGhlIGludGVncmF0ZWQgU0NFIG9iamVjdApjb2xkYXRhX2RmIDwtIGNvbERhdGEoaW50ZWdyYXRlZF9zY2UpIHw+CiAgIyBjb252ZXJ0IGZyb20gRGF0YUZyYW1lIHRvIGRhdGEuZnJhbWUKICBhcy5kYXRhLmZyYW1lKCkgfD4KICAjIG1lcmdlIHdpdGggc2FtcGxlIG1ldGFkYXRhCiAgZHBseXI6OmxlZnRfam9pbihzYW1wbGVfbWV0YWRhdGEsIGJ5ID0gYygic2FtcGxlIiA9ICJsaWJyYXJ5X2lkIikpIHw+CiAgIyBjcmVhdGUgbmV3IGNvbHVtbnMKICAjIGNlbGxfaWQgaXMgYSBjb21iaW5hdGlvbiBvZiBiYXJjb2RlIGFuZCBzYW1wbGUKICBkcGx5cjo6bXV0YXRlKAogICAgY2VsbF9pZCA9IGdsdWU6OmdsdWUoIntzYW1wbGV9LXtiYXJjb2RlfSIpLAogICAgIyBzaW1wbGlmeSBzdWJkaWFnbm9zaXMKICAgIGRpYWdub3Npc19ncm91cCA9IGZvcmNhdHM6OmZjdF9yZWNvZGUoCiAgICAgIHN1YmRpYWdub3NpcywKICAgICAgIkFSTVMiID0gIkFsdmVvbGFyIHJoYWJkb215b3NhcmNvbWEiLAogICAgICAiRVJNUyIgPSAiRW1icnlvbmFsIHJoYWJkb215b3NhcmNvbWEiCiAgICApCiAgKQoKIyBhZGQgbW9kaWZpZWQgZGF0YSBmcmFtZSBiYWNrIHRvIFNDRSBhcyBEYXRhRnJhbWUKY29sRGF0YShpbnRlZ3JhdGVkX3NjZSkgPC0gRGF0YUZyYW1lKAogIGNvbGRhdGFfZGYsCiAgcm93Lm5hbWVzID0gY29sZGF0YV9kZiRjZWxsX2lkCikKYGBgCgpOb3cgd2hlbiB3ZSBsb29rIGF0IHRoZSBgY29sRGF0YWAgb2YgdGhlIFNDRSBvYmplY3Qgd2Ugc2hvdWxkIHNlZSBuZXcgY29sdW1ucywgaW5jbHVkaW5nIHRoZSBgZGlhZ25vc2lzX2dyb3VwYCBjb2x1bW4gd2hpY2ggaW5kaWNhdGVzIGlmIGVhY2ggY2VsbCBjb21lcyBmcm9tIGFuIEVSTVMgb3IgQVJNUyBzYW1wbGUuCgpgYGB7ciBwcmludCBuZXcgY29sZGF0YSwgbGl2ZT1UUlVFfQojIHRha2UgYSBsb29rIGF0IHRoZSBuZXcgbW9kaWZpZWQgY29sRGF0YQpoZWFkKGNvbERhdGEoaW50ZWdyYXRlZF9zY2UpKSB8PgogIGFzLmRhdGEuZnJhbWUoKQpgYGAKCiMjIyBQbG90dGluZyB3aXRoIGFubm90YXRpb25zCgpXZSBjYW4gbm93IHVzZSB0aGF0IGNvbHVtbiB0byBsYWJlbCBhbnkgVU1BUCBwbG90cyAob3Igb3RoZXIgcGxvdCB0eXBlcykgdGhhdCB3ZSBtYWtlLgpJbiB0aGUgY2h1bmsgYmVsb3cgd2Ugd2lsbCBzdGFydCBieSB0YWtpbmcgYSBsb29rIGF0IG91ciBpbnRlZ3JhdGlvbiByZXN1bHRzIGFuZCBjb2xvciBvdXIgY2VsbHMgYnkgUk1TIHN1YnR5cGUuCgoqKlJlbWluZGVyOiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIGJhdGNoLWNvcnJlY3RlZCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gcmVzdWx0cyBmb3IgdmlzdWFsaXppbmcgZGF0YXNldHMgY29udGFpbmluZyBtdWx0aXBsZSBsaWJyYXJpZXMgb3Igc2FtcGxlcy4qKgoKYGBge3IgZGlhZ25vc2lzIGdyb3VwIFVNQVAsIGxpdmU9VFJVRX0KIyBVTUFQIG9mIGFsbCBzYW1wbGVzLCBzZXBhcmF0aW5nIGJ5IGRpYWdub3NpcyBncm91cApzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKAogIGludGVncmF0ZWRfc2NlLAogIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogIGNvbG9yX2J5ID0gImRpYWdub3Npc19ncm91cCIsCiAgcG9pbnRfc2l6ZSA9IDAuNSwKICBwb2ludF9hbHBoYSA9IDAuMgopCmBgYAoKSW50ZXJlc3RpbmdseSwgaXQgbG9va3MgbGlrZSBzYW1wbGVzIGZyb20gdGhlIEFSTVMgYW5kIEVSTVMgc3VidHlwZXMgdGVuZCB0byBncm91cCB3aXRoIHNhbXBsZXMgb2YgdGhlIHNhbWUgc3VidHlwZSByYXRoZXIgdGhhbiBhbGwgdG9nZXRoZXIuCgpJbiB0aGUgaW50ZWdyYXRpb24gbm90ZWJvb2sgd2UgYWxzbyBsb29rZWQgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBjZWxsIHR5cGVzIGFmdGVyIGludGVncmF0aW9uLgpJbiB0aGF0IG5vdGVib29rLCB3ZSBkaXNjdXNzZWQgdGhhdCBjZWxscyBvZiB0aGUgc2FtZSBjZWxsIHR5cGUgYXJlIGV4cGVjdGVkIHRvIGludGVncmF0ZSB3aXRoIG90aGVyIGNlbGxzIG9mIHRoZSBzYW1lIHR5cGUuCklzIHRoYXQgdGhlIGNhc2Ugd2l0aCB0aGlzIGRhdGFzZXQ/CgpBIHdvcmQgb2YgY2F1dGlvbiB3aGVuIGV2YWx1YXRpbmcgdGhlIGNlbGwgdHlwZSByZXN1bHRzIGZvciB0aGlzIGRhdGFzZXQ6IFRoZSBjZWxsIHR5cGVzIGZvciB0aGlzIGRhdGFzZXQgd2VyZSBhc3NpZ25lZCBpbiBhIHR3byBzdGFnZSBwcm9jZXNzIGFzIGRlc2NyaWJlZCBpbiBbUGF0ZWwgX2V0IGFsLl8gKDIwMjIpXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMykuClRoZSBmaXJzdCBzdGFnZSBhc3NpZ25lZCBjZWxscyBhcyB0dW1vciBvciBub24tdHVtb3IuClRoZSBuZXh0IHN0YWdlIGZ1cnRoZXIgY2xhc3NpZmllZCB0dW1vciBjZWxscyBpbnRvIG9uZSBvZiB0aHJlZSB0eXBlcyBvZiB0dW1vciBjZWxsczogbXlvYmxhc3QsIG15b2N5dGUsIG9yIG1lc29kZXJtLgpTb21lIHNhbXBsZXMgY291bGQgbm90IGJlIGZ1cnRoZXIgY2xhc3NpZmllZCwgc28gYWxsIG9mIHRoZWlyIHR1bW9yIGNlbGxzIGFyZSBkZW5vdGVkIGBUdW1vcmAuClRoZSBzYW1wbGVzIHdoaWNoIGNvdWxkIGJlIGZ1cnRoZXIgY2xhc3NpZmllZCBoYXZlIGEgbWl4IG9mIGBUdW1vcl9NZXNvZGVybWAsIGBUdW1vcl9NeW9ibGFzdGAsIGFuZCBgVHVtb3JfTXlvY3l0ZWAuCgpgYGB7ciBjZWxsdHlwZSBVTUFQfQojIFVNQVAgb2YgYWxsIHNhbXBsZXMgbGFiZWxlZCBieSBjZWxsIHR5cGUKc2NhdGVyOjpwbG90UmVkdWNlZERpbSgKICBpbnRlZ3JhdGVkX3NjZSwKICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAjIGNvbG9yIGVhY2ggcG9pbnQgYnkgY2VsbCB0eXBlCiAgY29sb3JfYnkgPSAiY2VsbHR5cGVfYnJvYWQiLAogIHBvaW50X3NpemUgPSAwLjUsCiAgcG9pbnRfYWxwaGEgPSAwLjQKKSArCiAgIyBNb2RpZnkgdGhlIGxlZ2VuZCBrZXkgd2l0aCBsYXJnZXIsIGVhc2llciB0byBzZWUgcG9pbnRzCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKQpgYGAKClVubGlrZSB3aXRoIHRoZSBwcmV2aW91cyBkYXRhc2V0cyB3ZSBoYXZlIHNlZW4gd2hlcmUgYWxsIGNlbGxzIG9mIHRoZSBzYW1lIGNlbGwgdHlwZSBhbHdheXMgZ3JvdXBlZCB0b2dldGhlciwgdGhpcyBkYXRhc2V0IHNob3dzIHNvbWUgc2xpZ2h0bHkgZGlmZmVyZW50IHBhdHRlcm5zIGFuZCBub3QgYWxsIGNlbGxzIG9mIHRoZSBzYW1lIGNlbGwgdHlwZSBjbHVzdGVyIHRvZ2V0aGVyLgpPbmUgcmVhc29uIGlzIHRoYXQgdHVtb3IgZGF0YSBjYW4gYmUgaGV0ZXJvZ2VuZW91cyBhbmQgZXZlcnkgdHVtb3IgaXMgdW5pcXVlLgpEZXBlbmRpbmcgb24gdGhlIHR1bW9yIHR5cGUgd2UgbWF5IG5vdCBleHBlY3QgZXZlcnkgc2FtcGxlIHRvIGludGVncmF0ZSBwZXJmZWN0bHkgYW5kIG1vcmUgaGV0ZXJvZ2VuZW91cyB0dW1vciB0eXBlcyB3aWxsIGJlIG1vcmUgZGlmZmljdWx0IHRvIGludGVncmF0ZSB0b2dldGhlci4KSW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2Ugd2UgYXJlIGxvb2tpbmcgYXQgdHdvIHN1YnR5cGVzIG9mIFJNUyB0aGF0IGhhdmUgZGlzdGluY3QgbXV0YXRpb24gYnVyZGVucyBhbmQgZGlmZmVyZW50aWF0aW9uIHN0YXRlcywgc28gaXQncyBsaWtlbHkgdGhhdCB0aG9zZSBkaWZmZXJlbmNlcyBjb250cmlidXRlIHRvIGhvdyB3ZWxsIHRoZXkgaW50ZWdyYXRlLgoKVG8gZXhwbG9yZSB3aGV0aGVyIGNlbGxzIGFyZSBncm91cGluZyB0b2dldGhlciBib3RoIGJ5IGNlbGwgdHlwZSBhbmQgYnkgUk1TIHN1YnR5cGUsIHdlIGNhbiBjcmVhdGUgYSBwbG90IHRoYXQgaW5jb3Jwb3JhdGVzIGJvdGggcGllY2VzIG9mIG1ldGFkYXRhLgpXZSB3aWxsIHRha2UgYWR2YW50YWdlIG9mIHRoZSBgZmFjZXRfZ3JpZCgpYCBmdW5jdGlvbiBmcm9tIGBnZ3Bsb3QyYCB0byBsb29rIGF0IHR3byB2YXJpYWJsZXMgaW4gdGhlIGBjb2xEYXRhYCBhdCBvbmNlIC0gdGhlIGNlbGwgdHlwZSBhbmQgdGhlIHN1YmRpYWdub3Npcy4KSW4gdGhlIGJlbG93IHBsb3Qgd2Ugd2lsbCBjb2xvciBvdXIgY2VsbHMgYnkgY2VsbCB0eXBlIHdoaWxlIGFsc28gdXNpbmcgYGZhY2V0X2dyaWQoKWAgc28gdGhhdCBjZWxscyBmcm9tIGRpZmZlcmVudCBzdWJkaWFnbm9zZXMgd2lsbCBiZSBpbiB0aGVpciBvd24gcGxvdCBwYW5lbC4KCmBgYHtyIGNlbGx0eXBlIHN1YmRpYWdub3NpcyBVTUFQLCBsaXZlPVRSVUV9CiMgVU1BUCBvZiBhbGwgc2FtcGxlcwojIHNlcGFyYXRpbmcgYnkgZGlhZ25vc2lzIGdyb3VwIGFuZCBsYWJlbGluZyBjZWxsIHR5cGUKc2NhdGVyOjpwbG90UmVkdWNlZERpbSgKICBpbnRlZ3JhdGVkX3NjZSwKICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAjIGNvbG9yIGVhY2ggcG9pbnQgYnkgY2VsbCB0eXBlCiAgY29sb3JfYnkgPSAiY2VsbHR5cGVfYnJvYWQiLAogIHBvaW50X3NpemUgPSAwLjUsCiAgcG9pbnRfYWxwaGEgPSAwLjQsCiAgIyB0ZWxsIHNjYXRlciB0byB1c2UgZGlhZ25vc2lzX2dyb3VwIGZvciBwbG90dGluZwogIG90aGVyX2ZpZWxkcyA9ICJkaWFnbm9zaXNfZ3JvdXAiCikgKwogICMgaW5jbHVkZSBlYWNoIGRpYWdub3NpcyBncm91cCBhcyBpdHMgb3duIGNvbHVtbgogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSkKYGBgCgpBcyBleHBlY3RlZCwgd2Ugc2VlIHRoYXQgY2VsbCB0eXBlcyBhcmUgc2VwYXJhdGVkLCBtb3N0IGxpa2VseSBkdWUgdG8gZGlmZmVyZW50IFJNUyBzdWJ0eXBlcy4KCldlIGNhbiBhbHNvIHVzZSBhIHN0YWNrZWQgYmFycGxvdCB0byBsb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgY2VsbCB0eXBlcyBhY3Jvc3MgZWFjaCBzYW1wbGUsIHdoaWNoIHdpbGwgcmVxdWlyZSBhIGJpdCBvZiB3cmFuZ2xpbmcgZmlyc3QuCgpgYGB7ciBjZWxsdHlwZSBiYXJwbG90fQojIGZpbHRlciBjb2xkYXRhIHRvIG9ubHkgaW5jbHVkZSB0dW1vciBjZWxscwp0dW1vcl9jZWxsc19kZiA8LSBjb2xkYXRhX2RmIHw+CiAgIyBmaW5kIHJvd3Mgd2hlcmUgdGhlIGNlbGwgdHlwZSBuYW1lIGNvbnRhaW5zIHRoZSBzdHJpbmcgIlR1bW9yIgogIGRwbHlyOjpmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjZWxsdHlwZV9icm9hZCwgIlR1bW9yIikpCgojIGNyZWF0ZSBhIHN0YWNrZWQgYmFycGxvdApnZ3Bsb3QodHVtb3JfY2VsbHNfZGYsIGFlcyh4ID0gc2FtcGxlLCBmaWxsID0gY2VsbHR5cGVfYnJvYWQpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGxhYnMoCiAgICB4ID0gIlNhbXBsZSIsCiAgICB5ID0gIlByb3BvcnRpb24gb2YgY2VsbHMiLAogICAgZmlsbCA9ICJDZWxsIHR5cGUiCiAgKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSkpICsKICAjIGZhY2V0IGJ5IGRpYWdub3NpcyBncm91cAogIGZhY2V0X2dyaWQoCiAgICBjb2xzID0gdmFycyhkaWFnbm9zaXNfZ3JvdXApLAogICAgIyBvbmx5IHNob3cgbm9uLU5BIHZhbHVlcyBvbiB4LWF4aXMKICAgIHNjYWxlcyA9ICJmcmVlX3giLAogICAgc3BhY2UgPSAiZnJlZV94IgogICkKYGBgCgpTaW1pbGFyIHRvIHRoZSBVTUFQLCB0aGlzIHBsb3Qgc2hvd3MgdGhhdCBBUk1TIGFuZCBFUk1TIHNoYXJlIGEgbG90IG9mIHRoZSBzYW1lIGNlbGwgdHlwZXMuCgpXZSBhbHNvIHNlZSB0aGF0IG9ubHkgNiBvZiB0aGVzZSBsaWJyYXJpZXMgaGF2ZSB0dW1vciBjZWxscyB0aGF0IGhhdmUgYmVlbiBmdXJ0aGVyIGNsYXNzaWZpZWQgaW50byBtZXNvZGVybSwgbXlvYmxhc3QsIGFuZCBteW9jeXRlLgozIGxpYnJhcmllcyBjb250YWluIGNlbGxzIHRoYXQgYXJlIG9ubHkgY2xhc3NpZmllZCBhcyB0dW1vciBvciBub24tdHVtb3IsIGFuZCB0dW1vciBjZWxscyBhcmUgbm90IGZ1cnRoZXIgY2xhc3NpZmllZCwgYW5kIHRoZSByZW1haW5pbmcgbGlicmFyeSBpcyBub3QgZXZlbiBwcmVzZW50IGluIG91ciBwbG90IGJlY2F1c2UgaXQgd2FzIG5vdCBhc3NpZ25lZCBhbnkgY2VsbCB0eXBlcyAoYWxsIGFyZSBgTkFgKS4KV2Ugd2lsbCBjb250aW51ZSBvdXIgYW5hbHlzaXMgb25seSB1c2luZyB0aGUgNiBsaWJyYXJpZXMgd2l0aCBmdWxseSBjbGFzc2lmaWVkIGNlbGwgdHlwZXMsIHJlbW92aW5nIHRoZSBvdGhlciA0IGJlZm9yZSB3ZSBwcm9jZWVkIHdpdGggZGlmZmVyZW50aWFsIGV4cHJlc3Npb24uCgojIyMgRmlsdGVyaW5nIHNhbXBsZXMKClRoZSByZWFzb24gd2Ugd2FudCB0byBwYXJlIGRvd24gb3VyIGxpc3Qgb2Ygc2FtcGxlcyB0byBjb25zaWRlciBpcyB0aGF0IHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGNlbGwgdHlwZXMgKG9yIHN1YnBvcHVsYXRpb25zKSB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluIGFyZSBwcmVzZW50IGluIGFsbCBzYW1wbGVzIGluY2x1ZGVkIGluIG91ciBERSBhbmFseXNpcy4KV2Ugd2FudCB0byByZW1vdmUgYW55IHNhbXBsZXMgdGhhdCBkbyBub3QgY29udGFpbiBvdXIgY2VsbCBwb3B1bGF0aW9uKHMpIG9mIGludGVyZXN0IGFzIHRoZXkgaGF2ZSBubyBjb3VudHMgdG8gY29udHJpYnV0ZSB0byB0aGUgREUgYW5hbHlzaXMuCgpgYGB7ciBzdWJzZXQgc2NlfQojIGRlZmluZSBzYW1wbGVzIHRvIGtlZXAKbGlicmFyeV9pZHMgPC0gYygKICAiU0NQQ0wwMDA0NzkiLAogICJTQ1BDTDAwMDQ4MCIsCiAgIlNDUENMMDAwNDgxIiwKICAiU0NQQ0wwMDA0ODQiLAogICJTQ1BDTDAwMDQ4OCIsCiAgIlNDUENMMDAwNDkxIgopCgojIHN1YnNldCBzY2UgdG8gb25seSBjb250YWluIHNhbXBsZXMgb2YgaW50ZXJlc3QKc2FtcGxlc190b19rZWVwIDwtIGludGVncmF0ZWRfc2NlJHNhbXBsZSAlaW4lIGxpYnJhcnlfaWRzCnJtc19zY2UgPC0gaW50ZWdyYXRlZF9zY2VbLCBzYW1wbGVzX3RvX2tlZXBdCgojIHByaW50IG91dCBvdXIgbmV3IFNDRQpybXNfc2NlCmBgYAoKQmVmb3JlIHdlIG1vdmUgb24sIHdlJ2xsIHJlbW92ZSB0aGUgb3JpZ2luYWwgaW50ZWdyYXRlZCBvYmplY3QgZnJvbSBvdXIgZW52aXJvbm1lbnQgdG8gc2F2ZSBzb21lIG1lbW9yeS4KCmBgYHtyIHJlbW92ZSBzY2V9CnJtKGludGVncmF0ZWRfc2NlKQpgYGAKCldlIHdpbGwgYWxzbyBzYXZlIG91ciBuZXcgb2JqZWN0IGluIGNhc2Ugd2Ugd2FudCB0byB1c2UgaXQgZm9yIG90aGVyIGFuYWx5c2lzIGxhdGVyIG9uLgoKYGBge3Igc2F2ZSBzY2V9CiMgd3JpdGUgUkRTIGZpbGUgd2l0aCBjb21wcmVzc2lvbgpyZWFkcjo6d3JpdGVfcmRzKHJtc19zY2UsIGZpbGUgPSBvdXRwdXRfc2NlX2ZpbGUsIGNvbXByZXNzID0gImd6IikKYGBgCgpXZSBub3cgaGF2ZSBhbiB1cGRhdGVkIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyA2IHNhbXBsZXMgdGhhdCB3ZXJlIG9idGFpbmVkIGZyb20gYSBtaXggb2YgQVJNUyBhbmQgRVJNUyBwYXRpZW50cy4KV2UgY2FuIHRoZW4gYXNrIHRoZSBxdWVzdGlvbiwgZG8gc3BlY2lmaWMgdHVtb3IgY2VsbCB0eXBlcyBjb250YWluIHNldHMgb2YgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGJldHdlZW4gQVJNUyBhbmQgRVJNUyBzYW1wbGVzPwoKV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGJpb2xvZ2ljYWwgcmVwbGljYXRlcyBmcm9tIGVhY2ggZ3JvdXAgdG8gc2V0IHVwIG91ciBleHBlcmltZW50LgpJdCBpcyBpbXBlcmF0aXZlIHRvIGNvbnNpZGVyIGdvb2QgZXhwZXJpbWVudGFsIGRlc2lnbiBhbmQgZW5zdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYmlvbG9naWNhbCByZXBsaWNhdGVzIChhdCBsZWFzdCAzIGZvciBlYWNoIGdyb3VwKSB3aGVuIHBlcmZvcm1pbmcgZGlmZmVyZW50aWFsIGdlbmUgZXhwcmVzc2lvbiBhbmFseXNpcy4KCklmIHdlIGxvb2sgYmFjayBhdCBvdXIgc3RhY2tlZCBiYXJwbG90IHdlIHNlZSB0aGF0IHdlIHBpY2tlZCAzIEFSTVMgYW5kIDMgRVJNUyBzYW1wbGVzLgpXZSBjYW4gYWxzbyBzZWUgdGhhdCB0aGUgbWFqb3JpdHkgb2YgY2VsbHMgYXJlIHR1bW9yIGNlbGxzLCBpbiBwYXJ0aWN1bGFyIHRoZSBsYXJnZXN0IHBvcHVsYXRpb24gb2YgY2VsbHMgYXBwZWFycyB0byBiZSB0aGUgYFR1bW9yX015b2JsYXN0YC4KRm9yIHRoaXMgZXhhbXBsZSB3ZSB3aWxsIGZvY3VzIG9uIGlkZW50aWZ5aW5nIERFIGdlbmVzIGluIHRoZXNlIGBUdW1vcl9NeW9ibGFzdGAgY2VsbHMsIGJ1dCB0aGUgcHJpbmNpcGxlcyBhcHBsaWVkIGJlbG93IGNhbiBiZSBhcHBsaWVkIHRvIGFueSBjZWxsIHR5cGVzIG9yIHN1YnBvcHVsYXRpb25zIG9mIGludGVyZXN0LgoKIyMgRGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMKCk5vdyB3ZSBhcmUgcmVhZHkgdG8gc3RhcnQgcHJlcGFyaW5nIGZvciBvdXIgREUgYW5hbHlzaXMsIHdoZXJlIHdlIHdpbGwgY29tcGFyZSB0aGUgZ2VuZSBleHByZXNzaW9uIG9mIHR1bW9yIG15b2JsYXN0IGNlbGxzIGJldHdlZW4gQVJNUyBhbmQgRVJNUyBzYW1wbGVzLgoKVGhyb3VnaG91dCB0aGUgbm90ZWJvb2sgd2UgaGF2ZSBiZWVuIHdvcmtpbmcgd2l0aCBhbiBpbnRlZ3JhdGVkIGRhdGFzZXQgdGhhdCBjb250YWlucyBjb3JyZWN0ZWQgZ2VuZSBleHByZXNzaW9uIGRhdGEgKGBmYXN0bW5uX2NvcnJlY3RlZGAgYXNzYXkpIGFuZCBhIGNvcnJlY3RlZCBVTUFQLgpBcyBhIHJlbWluZGVyLCB0aGUgdW5jb3JyZWN0ZWQgZ2VuZSBleHByZXNzaW9uIGRhdGEsIGZvdW5kIGluIHRoZSBgY291bnRzYCBhbmQgYGxvZ2NvdW50c2AgYXNzYXlzLCBjb3JyZXNwb25kIHRvIGRhdGEgdGhhdCBoYXMgYmVlbiBtZXJnZWQgKHRoZSBmaXJzdCBzdGVwIHdlIHdhbGtlZCB0aHJvdWdoIHByaW9yIHRvIGludGVncmF0aW9uKSBpbnRvIHRoZSBzYW1lIFNDRSBidXQgbm90IHlldCBpbnRlZ3JhdGVkLgpXZSBkbyBub3Qgd2FudCB0byB1c2UgY29ycmVjdGVkIGdlbmUgZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIGRpZmZlcmVudGlhbCBleHByZXNzaW9uOyBgREVTZXEyYCBleHBlY3RzIHRoZSBvcmlnaW5hbCByYXcgY291bnRzIGFzIGlucHV0IHNvIHdlIHdpbGwgYmUgdXNpbmcgZGF0YSBmb3VuZCBpbiB0aGUgYGNvdW50c2AgYXNzYXkgb2YgdGhlIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0LgoKSXQgaXMgYWR2aXNlZCB0byBvbmx5IHVzZSB0aGUgY29ycmVjdGVkIHZhbHVlcyBmb3IgYW55IGFuYWx5c2VzIGJlaW5nIHBlcmZvcm1lZCBhdCB0aGUgY2VsbCBsZXZlbCwgZS5nLiwgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLgpJbiBjb250cmFzdCwgaXQgaXMgbm90IGFkdmlzZWQgdG8gdXNlIGNvcnJlY3RlZCB2YWx1ZXMgZm9yIGFueSBhbmFseXNlcyB0aGF0IGFyZSBnZW5lLWJhc2VkLCBzdWNoIGFzIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIG9yIG1hcmtlciBnZW5lIGRldGVjdGlvbiwgYmVjYXVzZSB3aXRoaW4tYmF0Y2ggYW5kIGJldHdlZW4tYmF0Y2ggZ2VuZSBleHByZXNzaW9uIGRpZmZlcmVuY2VzIGFyZSBubyBsb25nZXIgcHJlc2VydmVkLgpUaGUgcmVhc29uIGZvciB0aGlzIGlzIHR3by1mb2xkIOKAkyBtYW55IG9mIHRoZSBERSBtb2RlbHMgd2lsbCBleHBlY3QgdW5jb3JyZWN0ZWQgY291bnRzIGJlY2F1c2UgdGhleSB3aWxsIGFjY291bnQgZm9yIGJldHdlZW4tc2FtcGxlIHZhcmlhdGlvbiB3aXRoaW4gdGhlIG1vZGVsLCBhbmQgd2Ugd2FudCB0byBlbnN1cmUgd2UgYXJlIHByZXNlcnZpbmcgdmFyaWF0aW9uIHRoYXQgaXMgcHJlc2VudCBzbyBhcyBub3QgdG8gYXJ0aWZpY2lhbGx5IGluZmxhdGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwb3B1bGF0aW9ucy4KU2VlIHRoZSBbT1NDQSBjaGFwdGVyIG9uIFVzaW5nIHRoZSBjb3JyZWN0ZWQgdmFsdWVzXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xOS9PU0NBLm11bHRpc2FtcGxlL3VzaW5nLWNvcnJlY3RlZC12YWx1ZXMuaHRtbCN1c2luZy1jb3JyZWN0ZWQtdmFsdWVzKSBmb3IgbW9yZSBpbnNpZ2h0LgoKIyMjIFBzZXVkby1idWxraW5nCgpCZWZvcmUgd2UgY2FuIGNvbXBhcmUgdGhlIGdlbmUgZXhwcmVzc2lvbiBwcm9maWxlcyBvZiBteW9ibGFzdHMgaW4gQVJNUyB2cy4gRVJNUyBzYW1wbGVzLCB3ZSB3aWxsIG5lZWQgdG8gInBzZXVkby1idWxrIiB0aGUgZ2VuZSBjb3VudHMuClBzZXVkby1idWxraW5nIGNyZWF0ZXMgYSBuZXcgY291bnRzIG1hdHJpeCB0aGF0IGNvbnRhaW5zIHRoZSBzdW0gb2YgdGhlIGNvdW50cyBmcm9tIGFsbCBjZWxscyB3aXRoIGEgZ2l2ZW4gbGFiZWwgKGUuZy4sIGNlbGwgdHlwZSkgZm9yIGVhY2ggc2FtcGxlIChbVHVuZyBfZXQgYWwuXyAyMDE3XShodHRwczovL2RvaS5vcmcvMTAuMTAzOC9zcmVwMzk5MjEpKS4KSWYgd2Ugd2VyZSB0byBrZWVwIGVhY2ggY2VsbCdzIGNvdW50cyBzZXBhcmF0ZSwgdGhleSB3b3VsZCBiZSB0cmVhdGVkIGFzIHJlcGxpY2F0ZXMsIGxlYWRpbmcgdG8gaW5mbGF0ZWQgc3RhdGlzdGljcy4KQnkgcHNldWRvLWJ1bGtpbmcgZmlyc3QsIHdlIHdpbGwgbm93IGhhdmUgb25lIGNvdW50IGZvciBlYWNoIGdlbmUgZm9yIGVhY2ggc2FtcGxlIGFuZCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2Ygd2VsbC1lc3RhYmxpc2hlZCBtZXRob2RzIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiB3aXRoIGJ1bGsgUk5BLXNlcS4KClBzZXVkby1idWxraW5nIGlzIGltcGxlbWVudGVkIHByaW9yIHRvIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzIG9uIHNpbmdsZS1jZWxsIGRhdGEgYmVjYXVzZSBpdDoKCi0gUHJvZHVjZXMgbGFyZ2VyIGFuZCBsZXNzIHNwYXJzZSBjb3VudHMsIHdoaWNoIGFsbG93cyB1cyB0byB1c2Ugc3RhbmRhcmQgbm9ybWFsaXphdGlvbiBhbmQgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gbWV0aG9kcyB1c2VkIGJ5IGJ1bGsgUk5BLXNlcS4KLSBDb2xsYXBzZXMgZ2VuZSBleHByZXNzaW9uIGNvdW50cyBieSBzYW1wbGUsIHNvIHRoYXQgc2FtcGxlcywgcmF0aGVyIHRoYW4gY2VsbHMsIHJlcHJlc2VudCByZXBsaWNhdGVzLgotIE1hc2tzIHZhcmlhbmNlIHdpdGhpbiBhIHNhbXBsZSB0byBlbXBoYXNpemUgdmFyaWFuY2UgYWNyb3NzIHNhbXBsZXMuClRoaXMgY2FuIGJlIGJvdGggZ29vZCBhbmQgYmFkIQpNYXNraW5nIGludHJhLXNhbXBsZSB2YXJpYXRpb24gbWVhbnMgeW91IG1pZ2h0IG5vdCBpZGVudGlmeSBnZW5lcyB3aGVyZSBhdmVyYWdlIGV4cHJlc3Npb24gZG9lc24ndCBjaGFuZ2UgYmV0d2VlbiBzYW1wbGVzIGJ1dCB0aGUgZGVncmVlIG9mIGNlbGwtdG8tY2VsbCB2YXJpYXRpb24gZG9lcy4KCkJlZm9yZSB3ZSBhcHBseSBwc2V1ZG8tYnVsa2luZyB0byBvdXIgZGF0YXNldCwgbGV0J3MgbG9vayBhdCBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyBwc2V1ZG8tYnVsa2luZyB3b3Jrcy4KV2UnbGwgc3RhcnQgYnkgY3JlYXRpbmcgYSBmYWtlIG1hdHJpeCBvZiBjb3VudHMuCgpgYGB7ciBjcmVhdGUgbWF0cml4fQojIGNyZWF0ZSBhbiBleGFtcGxlIGNvdW50cyBtYXRyaXgKY291bnRzX210eCA8LSBtYXRyaXgoCiAgMToxMiwKICBuY29sID0gNCwKICBkaW1uYW1lcyA9IGxpc3QoCiAgICBjKCJnZW5lQSIsICJnZW5lQiIsICJnZW5lQyIpLAogICAgYygiQS1jZWxsMSIsICJBLWNlbGwyIiwgIkItY2VsbDEiLCAiQi1jZWxsMiIpCiAgKQopCmNvdW50c19tdHgKYGBgCgpOZXh0IHdlIHdpbGwgY3JlYXRlIGEgcHNldWRvLWJ1bGtlZCB2ZXJzaW9uIG9mIHRoaXMgbWF0cml4IHdpdGggb25seSAyIGNvbHVtbnM6IDEgZm9yIGdyb3VwIGBBYCBhbmQgMSBmb3IgZ3JvdXAgYEJgLgpUbyBkbyB0aGlzIHdlIHdpbGwgdXNlIHRoZSBgRGVsYXllZEFycmF5Ojpjb2xzdW0oKWAgZnVuY3Rpb24sIHdoaWNoIGFsbG93cyB1cyB0byBzdW0gdGhlIGNvdW50cyBmb3IgZWFjaCByb3cgYWNyb3NzIGdyb3VwcyBvZiBjb2x1bW5zLgoKYGBge3IgcHNldWRvYnVsayBtYXRyaXgsIGxpdmU9VFJVRX0KIyBkZWZpbmUgdGhlIGdyb3VwIHRoYXQgZWFjaCBjb2x1bW4gYmVsb25ncyB0bwpncm91cHMgPC0gYygiQSIsICJBIiwgIkIiLCAiQiIpCgojIHN1bSBjb3VudHMgYWNyb3NzIGNlbGxzIChjb2x1bW5zKSBieSBncm91cCBsYWJlbApwYl9jb3VudHMgPC0gRGVsYXllZEFycmF5Ojpjb2xzdW0oY291bnRzX210eCwgZ3JvdXBzKQpwYl9jb3VudHMKYGBgCgpMb29raW5nIGF0IHRoaXMgb3V0cHV0LCB5b3Ugc2hvdWxkIHNlZSB0aGF0IHRoZSBvcmlnaW5hbCA0IGNvbHVtbnMgaGF2ZSBiZWVuIGNvbmRlbnNlZCB0byBvbmx5IDIgY29sdW1uczogMSBjb2x1bW4gdG8gcmVwcmVzZW50IGFsbCBjZWxscyBmcm9tIGdyb3VwIGBBYCwgYW5kIDEgY29sdW1uIHRvIHJlcHJlc2VudCBhbGwgY2VsbHMgZnJvbSBncm91cCBgQmAuCgpOb3cgdGhlIGFjdHVhbCBwc2V1ZG8tYnVsa2luZyBmb3Igb3VyIGRhdGFzZXQhCgpXZSB3aWxsIHVzZSB0aGUgW2BzY3V0dGxlOjphZ2dyZWdhdGVBY3Jvc3NDZWxscygpYCBmdW5jdGlvbl0oaHR0cHM6Ly9yZHJyLmlvL2dpdGh1Yi9MVExBL3NjdXR0bGUvbWFuL2FnZ3JlZ2F0ZUFjcm9zc0NlbGxzLmh0bWwpIHRvIHBzZXVkby1idWxrIG91ciBkYXRhc2V0LgpUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIGlucHV0IGFuIFNDRSBvYmplY3QgYW5kIHRoZSBncm91cGluZyBhc3NpZ25tZW50cyBmb3IgZWFjaCBjZWxsLgpUaGUgb3V0cHV0IHdpbGwgYmUgYW4gU0NFIG9iamVjdCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIHBzZXVkby1idWxrZWQgY291bnRzIGZvciBhbGwgZ2VuZXMgYWNyb3NzIGFsbCBzcGVjaWZpZWQgZ3JvdXBzLCByYXRoZXIgdGhhbiBhY3Jvc3MgYWxsIGNlbGxzLgpXZSBjYW4gdGhlbiBzdWJzZXQgdGhpcyBTQ0UgdG8ganVzdCBpbmNsdWRlIG91ciBjZWxsIHR5cGUgb2YgaW50ZXJlc3QgKHR1bW9yIG15b2JsYXN0cykgZm9yIGlucHV0IHRvIHRoZSBERSBhbmFseXNpcy4KCldlIGNhbiBwc2V1ZG8tYnVsayB1c2luZyBhbnkgZ3JvdXBpbmcgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KRm9yIHJpZ2h0IG5vdywgd2UgYXJlIGludGVyZXN0ZWQgaW4gbG9va2luZyBhdCBnZW5lIGV4cHJlc3Npb24gYWNyb3NzIGNlbGwgdHlwZXMsIHNvIHdlIHdhbnQgdG8gZ3JvdXAgdGhlIHBzZXVkby1idWxrZWQgY291bnRzIG1hdHJpeCBieSBib3RoIGNlbGwgdHlwZSBhbmQgb3JpZ2luYWwgc2FtcGxlLgoKYGBge3IgcHNldWRvYnVsayBzY2V9CiMgZmlyc3Qgc3Vic2V0IHRoZSBjb2xkYXRhCiMgdG8gb25seSBoYXZlIHRoZSBjb2x1bW5zIHdlIGNhcmUgYWJvdXQgZm9yIHBzZXVkby1idWxraW5nCnBiX2dyb3VwcyA8LSBjb2xEYXRhKHJtc19zY2UpWywgYygiY2VsbHR5cGVfYnJvYWQiLCAic2FtcGxlIildCgojIGNyZWF0ZSBhIG5ldyBTQ0Ugb2JqZWN0IHRoYXQgY29udGFpbnMKIyB0aGUgcHNldWRvLWJ1bGtlZCBjb3VudHMgYWNyb3NzIHRoZSBwcm92aWRlZCBncm91cHMKcGJfc2NlIDwtIHNjdXR0bGU6OmFnZ3JlZ2F0ZUFjcm9zc0NlbGxzKAogIHJtc19zY2UsCiAgaWQgPSBwYl9ncm91cHMKKQoKIyBjb2x1bW4gbmFtZXMgYXJlbid0IGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHBzZXVkby1idWxrZWQgc2NlLAojIHNvIGxldCdzIGFkZCB0aGVtIGluCmNvbG5hbWVzKHBiX3NjZSkgPC0gZ2x1ZTo6Z2x1ZSgKICAie3BiX3NjZSRjZWxsdHlwZV9icm9hZH1fe3BiX3NjZSRzYW1wbGV9IgopCgpwYl9zY2UKYGBgCgpIb3cgZG9lcyB0aGUgbmV3IHBzZXVkby1idWxrZWQgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBsb29rIGRpZmZlcmVudD8KSG93IG1hbnkgY29sdW1ucyBkb2VzIGl0IGhhdmU/CgpMZXQncyB0YWtlIGEgbG9vayBhdCB3aGF0IHRoZSBgY29sRGF0YWAgbG9va3MgbGlrZSBpbiB0aGUgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0LgoKYGBge3IgcHNldWRvYnVsayBjb2xEYXRhLCBsaXZlPVRSVUV9CiMgbm90ZSB0aGUgbmV3IGNvbHVtbiB3aXRoIG51bWJlciBvZiBjZWxscyBwZXIgZ3JvdXAKaGVhZChjb2xEYXRhKHBiX3NjZSkpIHw+CiAgYXMuZGF0YS5mcmFtZSgpCmBgYAoKWW91IHNob3VsZCBzZWUgdGhhdCBjb2x1bW5zIHN1Y2ggYXMgYHN1bWAsIGBkZXRlY3RlZGAsIGBzdWJzZXRzX21pdG9fc3VtYCwgYW5kIG90aGVyIGNvbHVtbnMgdGhhdCB0eXBpY2FsbHkgY29udGFpbiBwZXIgY2VsbCBRQyBzdGF0aXN0aWNzIG5vdyBjb250YWluIGBOQWAgcmF0aGVyIHRoYW4gbnVtZXJpYyB2YWx1ZXMuClRoaXMgaXMgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgd2VyZSBpbml0aWFsbHkgY2FsY3VsYXRlZCBvbiBhIHBlciBjZWxsIGxldmVsICh3ZSBkaWQgdGhpcyB1c2luZyBgc2N1dHRsZTo6YWRkUGVyQ2VsbFFDTWV0cmljcygpYCksIGJ1dCB3ZSBubyBsb25nZXIgaGF2ZSBhIHNpbmdsZSBjb2x1bW4gcGVyIGNlbGwuCkluc3RlYWQsIGVhY2ggY29sdW1uIG5vdyByZXByZXNlbnRzIGEgX2dyb3VwXyBvZiBjZWxscywgaW4gdGhpcyBjYXNlIGNvbXByaXNlZCBvZiBjZWxscyBvZiBhIGdpdmVuIGNlbGwgdHlwZSBhbmQgc2FtcGxlIGNvbWJpbmF0aW9uLgpUaGVyZWZvcmUsIHRoZSB2YWx1ZXMgdGhhdCB3ZSBjYWxjdWxhdGVkIG9uIGEgcGVyLWNlbGwgbGV2ZWwgYXJlIG5vIGxvbmdlciBhcHBsaWNhYmxlIHRvIHRoaXMgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0LgoKWW91IHNob3VsZCBhbHNvIHNlZSBhIG5ldyBjb2x1bW4gdGhhdCB3YXNuJ3QgcHJlc2VudCBwcmV2aW91c2x5LCB0aGUgYG5jZWxsc2AgY29sdW1uLgpUaGlzIGNvbHVtbiB3YXMgYWRkZWQgZHVyaW5nIHBzZXVkby1idWxraW5nIGFuZCBpbmRpY2F0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBjZWxscyB0aGF0IHdlcmUgc3VtbWVkIHRvZ2V0aGVyIHRvIGZvcm0gZWFjaCBjb2x1bW4gb2YgdGhlIFNDRSBvYmplY3QuCgpCZWZvcmUgd2UgcHJvY2VlZCB3ZSB3aWxsIHdhbnQgdG8gZmlsdGVyIG91dCBhbnkgY29sdW1ucyB0aGF0IGhhdmUgYSBsb3cgbnVtYmVyIG9mIGNlbGxzLgpBIGxvdyBudW1iZXIgb2YgY2VsbHMgd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBzbWFsbCBjb3VudHMgdGhhdCBjYW4gY2F1c2UgaXNzdWVzIHdpdGggdGhlIHN0YXRpc3RpY2FsIGFwcHJveGltYXRpb25zIG1hZGUgZHVyaW5nIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzLgpUaGlzIGlzIGVxdWl2YWxlbnQgdG8gZmlsdGVyaW5nIG91dCBhbnkgbGlicmFyaWVzIGluIGJ1bGsgUk5BLXNlcSBhbmFseXNpcyB0aGF0IGhhdmUgbG93IGxpYnJhcnkgc2l6ZXMuCgpXZSBjYW4gc2V0IGEgdGhyZXNob2xkIGZvciB0aGUgbnVtYmVyIG9mIGNlbGxzIHJlcXVpcmVkIHRvIGNvbnRpbnVlIHdpdGggb3VyIGFuYWx5c2lzIGFuZCByZW1vdmUgYW55IGdyb3VwcyB0aGF0IGRvIG5vdCBtZWV0IHRoZSBtaW5pbXVtIHRocmVzaG9sZC4KSGVyZSB3ZSB3aWxsIHVzZSAxMCwgYnV0IHRoZSB0aHJlc2hvbGQgeW91IHVzZSBmb3IgeW91ciBkYXRhc2V0IGNhbiB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgY29tcG9zaXRpb24gb2YgY2VsbCB0eXBlcy4KCmBgYHtyIGZpbHRlciBwc2V1ZG9idWxrLCBsaXZlPVRSVUV9CiMgcmVtb3ZlIGFueSBncm91cHMgd2l0aCBmZXdlciB0aGFuIDEwIGNlbGxzCmZpbHRlcl9wYl9zY2UgPC0gcGJfc2NlWywgcGJfc2NlJG5jZWxscyA+PSAxMF0KYGBgCgpXZSBjYW4gdGhlbiB0YWtlIGEgbG9vayBhbmQgc2VlIGhvdyBtYW55IGNlbGwgdHlwZS1zYW1wbGUgY29sdW1ucyB3ZSByZW1vdmVkLCBpZiBhbnkuCgpgYGB7ciBwcmludCBkaW0sIGxpdmU9VFJVRX0KIyBwcmludCBvdXQgZGltZW5zaW9ucyBvZiB1bmZpbHRlcmVkIHBzZXVkb2J1bGsgc2NlCmRpbShwYl9zY2UpCgojIGRpbWVuc2lvbnMgb2YgZmlsdGVyZWQgcHNldWRvYnVsayBzY2UKZGltKGZpbHRlcl9wYl9zY2UpCmBgYAoKSXQgbG9va3MgbGlrZSB3ZSBvbmx5IGdvdCByaWQgb2Ygb25lIGdyb3VwLgpXZSBjYW4gZG8gYSBxdWljayBjaGVjayB0byBzZWUgd2hpY2ggZ3JvdXAgd2FzIHJlbW92ZWQgYnkgZmluZGluZyB3aGljaCBjb2x1bW4gaXMgbm8gbG9uZ2VyIHByZXNlbnQgaW4gdGhlIGZpbHRlcmVkIG9iamVjdC4KCmBgYHtyIHJlbW92ZWQgY29sdW1ucywgbGl2ZT1UUlVFfQojIGZpbmQgcmVtb3ZlZCBjb2x1bW5zCnJlbW92ZWRfY29scyA8LSAhKGNvbG5hbWVzKHBiX3NjZSkgJWluJSBjb2xuYW1lcyhmaWx0ZXJfcGJfc2NlKSkKCiMgcHJpbnQgb3V0IG1pc3NpbmcgY29sdW1ucwpjb2xuYW1lcyhwYl9zY2UpW3JlbW92ZWRfY29sc10KYGBgCgpUaGUgbGFzdCBzdGVwIHdlIHdhbnQgdG8gZG8gdG8gcHJlcGFyZSBvdXIgZGF0YXNldCBmb3IgREUgaXMgdG8gc3Vic2V0IHRoZSBwc2V1ZG8tYnVsa2VkIFNDRSBvYmplY3QgdG8gY29udGFpbiBvbmx5IHRoZSBjZWxsIHR5cGUgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjb21wYXJpbmcgYWNyb3NzIHRoZSB0d28gUk1TIHN1YnR5cGVzLgpBcyBtZW50aW9uZWQgcHJldmlvdXNseSwgd2UgYXJlIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIHRoZSBgVHVtb3JfTXlvYmxhc3RgIGNlbGwgdHlwZS4KCmBgYHtyIGZpbHRlciBjZWxsdHlwZX0KIyBsb2dpY2FsIHZlY3RvciBpbmRpY2F0aW5nIGlmIGNlbGxzIGFyZSB0dW1vciBteW9ibGFzdCBvciBub3QKbXlvYmxhc3RfY2VsbHMgPC0gZmlsdGVyX3BiX3NjZSRjZWxsdHlwZV9icm9hZCA9PSAiVHVtb3JfTXlvYmxhc3QiCgojIGNyZWF0ZSBhIG5ldyBzY2Ugd2l0aCBvbmx5IHRoZSB0dW1vciBteW9ibGFzdHMKdHVtb3JfbXlvYmxhc3Rfc2NlIDwtIGZpbHRlcl9wYl9zY2VbLCBteW9ibGFzdF9jZWxsc10KYGBgCgpBZnRlciBmaWx0ZXJpbmcgZm9yIG91ciBjZWxsIHR5cGUgb2YgaW50ZXJlc3Qgd2Ugc2hvdWxkIGhhdmUgYSBkYXRhc2V0IHdpdGggNiBjb2x1bW5zLCAxIGZvciBlYWNoIGdyb3VwIG9mIGBUdW1vcl9NeW9ibGFzdGAgY2VsbHMgaW4gZWFjaCBvZiBvdXIgNiBzYW1wbGVzLgoKIyMjIFBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gd2l0aCBgREVTZXEyYAoKTm93IHdlIHdpbGwgdXNlIHRoZSBgREVTZXEyYCBwYWNrYWdlIHRvIHBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gKERFKSBhbmFseXNpcyBvbiBvdXIgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0LgpGcm9tIHRoaXMgcG9pbnQsIHdlIGNhbiBwcm9jZWVkIGluIHRoZSBzYW1lIHdheSB3ZSB3b3VsZCBpZiB3ZSBoYWQgYSBidWxrIFJOQS1zZXEgZGF0YXNldCB3aXRoIDYgc2FtcGxlcy4KV2Ugd2lsbCBzdGFydCB3aXRoIHRoZSB1bm5vcm1hbGl6ZWQgcmF3IGNvdW50cyBpbiB0aGUgYGNvdW50c2AgYXNzYXkgb2YgdGhlIHBzZXVkby1idWxrZWQgU0NFIGFuZCBkbyB0aGUgZm9sbG93aW5nIHdpdGggYERFU2VxMmA6CgotIENyZWF0ZSBhIGBERVNlcURhdGFTZXRgIG9iamVjdAotIE5vcm1hbGl6ZSBhbmQgbG9nIHRyYW5zZm9ybSB0aGUgY291bnRzIGRhdGEKLSBFc3RpbWF0ZSBkaXNwZXJzaW9ucyBhbmQgc2hyaW5rIGVzdGltYXRlcwotIEZpdCBhIG5lZ2F0aXZlIGJpbm9taWFsIG1vZGVsIGFuZCBwZXJmb3JtIGh5cG90aGVzaXMgdGVzdGluZyB1c2luZyBXYWxkIHN0YXRpc3RpY3MKCllvdSBjYW4gYWxzbyByZWZlciB0byBvdXIgW21hdGVyaWFscyBmcm9tIG91ciBwcmV2aW91cyB3b3Jrc2hvcHMgY292ZXJpbmcgYnVsayBSTkEtc2VxXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS90cmFpbmluZy1tb2R1bGVzL3RyZWUvbWFzdGVyL1JOQS1zZXEjcmVhZG1lKSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyBgREVTZXFgLgoKIyMjIyBDcmVhdGUgdGhlIGBERVNlcURhdGFTZXRgIG9iamVjdAoKVG8gY3JlYXRlIHRoZSBgREVTZXFEYXRhU2V0YCBvYmplY3Qgd2Ugd2lsbCBuZWVkIHRoZSB1bm5vcm1hbGl6ZWQgY291bnRzIG1hdHJpeCwgdGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxlcywgYW5kIGEgZGVzaWduIGZvcm11bGEuClRoZSBmaXJzdCB0d28gaXRlbXMgYXJlIGFscmVhZHkgc3RvcmVkIGluIG91ciBTQ0Ugb2JqZWN0LCBzbyB3ZSBjYW4gY3JlYXRlIGEgYERFU2VxRGF0YVNldGAgb2JqZWN0IGRpcmVjdGx5IGZyb20gdGhhdCBvYmplY3QgdXNpbmcgdGhlIGBERVNlcURhdGFTZXQoKWAgZnVuY3Rpb24uClRoZSBkZXNpZ24gZm9ybXVsYSBpcyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIGNvbHVtbnMgb2YgdGhlIG1ldGFkYXRhIG5lZWQgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGUgREUgY29tcGFyaXNvbi4KRm9yIG91ciBleHBlcmltZW50IHdlIGFyZSBjb21wYXJpbmcgZ2VuZSBleHByZXNzaW9uIGJldHdlZW4gZGlmZmVyZW50IFJNUyBzdWJ0eXBlcy4KVGhlIHN1YnR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBgZGlhZ25vc2lzX2dyb3VwYCBjb2x1bW4gb2YgdGhlIGBjb2xEYXRhYCBpbiB0aGUgcHNldWRvLWJ1bGtlZCBTQ0UuCgpgYGB7ciBkZXNlcSBvYmplY3QsIGxpdmU9VFJVRX0KIyBzZXQgdXAgdGhlIGRlc2VxIG9iamVjdCwgZ3JvdXAgYnkgZGlhZ25vc2lzCmRlc2VxX29iamVjdCA8LSBERVNlcTI6OkRFU2VxRGF0YVNldCgKICB0dW1vcl9teW9ibGFzdF9zY2UsCiAgZGVzaWduID0gfmRpYWdub3Npc19ncm91cAopCmBgYAoKVGhlIHBzZXVkby1idWxrZWQgU0NFIG9iamVjdCBjb250YWlucyBvbmx5IG9uZSBhc3NheTogdGhlIGBjb3VudHNgIGFzc2F5LgpUaGlzIGlzIGJlY2F1c2UgYERFU2VxMmAgZXhwZWN0cyByYXcgY291bnRzLgpXaGVuIHdlIHJ1biBgREVTZXEyYCBvbiBvdXIgZGF0YXNldCwgcmF3IGNvdW50cyB3aWxsIGZpcnN0IGJlIG5vcm1hbGl6ZWQgdXNpbmcgc2l6ZSBmYWN0b3JzIHRvIGFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGluIHRvdGFsIHNhbXBsZSBjb3VudHMuClRoZXJlZm9yZSB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueSBub3JtYWxpemF0aW9uIG9uIG91ciBvd24g4oCTIHdlJ2xsIGxldCBgREVTZXEyYCBkbyBhbGwgdGhlIHdvcmsgZm9yIHVzLgoKSG93ZXZlciwgYmVmb3JlIHdlIGRpdmUgaW50byBERSBhbmFseXNpcywgd2UgY2FuIGRvIHNvbWUgaW5pdGlhbCBleHBsb3JhdGlvbiBhbmQgdmlzdWFsaXphdGlvbiBvZiBvdXIgZGF0YSB0byBzZWUgaWYgb3VyIHNhbXBsZXMgc2VwYXJhdGUgYnkgb3VyIGtub3duIGZhY3RvciBvZiBpbnRlcmVzdCwgUk1TIHN1YnR5cGUuCkluIHBhcnRpY3VsYXIsIHdlIGNhbiB1c2UgcHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyAoUENBKSBvZiBvdXIgcHNldWRvLWJ1bGtlZCBkYXRhc2V0IHRvIHZpc3VhbGl6ZSBhbnkgdmFyaWF0aW9uIGJldHdlZW4gc2FtcGxlcy4KSWYgdGhlcmUgaXMgdmFyaWF0aW9uIGJldHdlZW4gUk1TIHN1YnR5cGVzLCB3ZSBleHBlY3QgdGhlaXIgcmVzcGVjdGl2ZSBzYW1wbGVzIHRvIHNlcGFyYXRlIGluIFBDIHNwYWNlLCBsaWtlbHkgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMuCldlIGNhbiBldmFsdWF0ZSB0aGlzIGJ5IHBsb3R0aW5nIFBDMSBhbmQgUEMyLgoKSW4gb3JkZXIgdG8gY3JlYXRlIG91ciBQQ0EgcGxvdCwgd2Ugd2lsbCBmaXJzdCBuZWVkIHRvIG5vcm1hbGl6ZSBvdXIgZGF0YSB0byBhY2NvdW50IGZvciBhbnkgdGVjaG5pY2FsIHZhcmlhdGlvbnMgYWNyb3NzIHNhbXBsZXMuCkFzIGEgcmVtaW5kZXIsIHRoaXMgaXMgTk9UIHJlcXVpcmVkIGZvciBydW5uaW5nIGBERVNlcTJgIGFuYWx5c2lzOyB3ZSBhcmUganVzdCB1c2luZyBpdCB0byB2aXN1YWxpemUgb3VyIGRhdGEgcHJpb3IgdG8gREUgYW5hbHlzaXMuCgpgYGB7ciBub3JtYWxpemV9CiMgZXN0aW1hdGUgc2l6ZSBmYWN0b3JzIGZpcnN0CmRlc2VxX29iamVjdCA8LSBERVNlcTI6OmVzdGltYXRlU2l6ZUZhY3RvcnMoZGVzZXFfb2JqZWN0KQoKIyBub3JtYWxpemUgYW5kIGxvZyB0cmFuc2Zvcm0gdG8gdXNlIGZvciB2aXN1YWxpemF0aW9uCm5vcm1hbGl6ZWRfb2JqZWN0IDwtIERFU2VxMjo6cmxvZygKICBkZXNlcV9vYmplY3QsCiAgYmxpbmQgPSBUUlVFCikKbm9ybWFsaXplZF9vYmplY3QKYGBgCgpXZSBub3cgaGF2ZSBhIG5vcm1hbGl6ZWQgYW5kIHRyYW5zZm9ybWVkIG9iamVjdCB0aGF0IGNhbiBiZSBkaXJlY3RseSBpbnB1dCB0byB0aGUgYERFU2VxMjo6cGxvdFBDQSgpYCBmdW5jdGlvbiwgd2hpY2ggd2lsbCBib3RoIGNhbGN1bGF0ZSBhbmQgcGxvdCB0aGUgUEMgcmVzdWx0cy4KCmBgYHtyIHBsb3RQQ0EsIGxpdmU9VFJVRX0KREVTZXEyOjpwbG90UENBKG5vcm1hbGl6ZWRfb2JqZWN0LCBpbnRncm91cCA9ICJkaWFnbm9zaXNfZ3JvdXAiKQpgYGAKCkFzIGV4cGVjdGVkIHdlIHNlZSB0aGF0IHNhbXBsZXMgZ3JvdXAgdG9nZXRoZXIgYmFzZWQgb24gUk1TIHN1YnR5cGUgYW5kIGFyZSBzZXBhcmF0ZWQgYWxvbmcgdGhlIFBDMSBheGlzLCB0aGUgUEMgY29udHJpYnV0aW5nIHRoZSBoaWdoZXN0IGFtb3VudCBvZiB2YXJpYXRpb24uCgojIyMjIFJ1biBgREVTZXFgCgpXZSdsbCBub3cgdXNlIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiBgREVTZXEoKWAgdG8gcGVyZm9ybSBvdXIgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMuClRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBub3JtYWxpemF0aW9uIGZhY3RvcnMsIGVzdGltYXRlcyBnZW5lLXdpc2UgZGlzcGVyc2lvbnMsIGZpdHMgYSBuZWdhdGl2ZSBiaW5vbWlhbCBtb2RlbCBhbmQgcGVyZm9ybXMgaHlwb3RoZXNpcyB0ZXN0aW5nIHVzaW5nIFdhbGQgc3RhdGlzdGljcy4KCmBgYHtyIGRlc2VxLCBsaXZlPVRSVUV9CiMgcnVuIERFU2VxCmRlc2VxX29iamVjdCA8LSBERVNlcTI6OkRFU2VxKGRlc2VxX29iamVjdCkKYGBgCgpXZSBjYW4gZXZhbHVhdGUgaG93IHdlbGwgdGhlIG1vZGVsIGZpdCBvdXIgZGF0YSBieSBsb29raW5nIGF0IHRoZSBkaXNwZXJzaW9uIGVzdGltYXRlcy4KV2UgZXhwZWN0IHRvIHNlZSB0aGUgZGlzcGVyc2lvbiBlc3RpbWF0ZXMgZGVjcmVhc2UgYXMgbWVhbnMgYXJlIGluY3JlYXNpbmcgYW5kIGZvbGxvdyB0aGUgbGluZSBvZiBiZXN0IGZpdC4KCmBgYHtyIHBsb3QgZGlzcGVyc2lvbiwgbGl2ZT1UUlVFfQpwbG90RGlzcEVzdHMoZGVzZXFfb2JqZWN0KQpgYGAKCk5vdyB3ZSBjYW4gZXh0cmFjdCB0aGUgcmVzdWx0cyBmcm9tIHRoZSBvYmplY3QsIHNwZWNpZnlpbmcgdGhlIHAtdmFsdWUgdGhyZXNob2xkIHRoYXQgd2Ugd291bGQgbGlrZSB0byB1c2UuCgpgYGB7ciByZXN1bHRzLCBsaXZlPVRSVUV9CiMgZXh0cmFjdCB0aGUgcmVzdWx0cyBhcyBhIERhdGFGcmFtZQpkZXNlcV9yZXN1bHRzIDwtIERFU2VxMjo6cmVzdWx0cyhkZXNlcV9vYmplY3QsIGFscGhhID0gMC4wNSkKYGBgCgpCdXQgd2UgYXJlbid0IGRvbmUgeWV0IQoKVGhlIGVzdGltYXRlcyBvZiBsb2cyIGZvbGQgY2hhbmdlIGNhbGN1bGF0ZWQgYnkgYERFU2VxKClgIGFyZSBub3QgY29ycmVjdGVkIGZvciBleHByZXNzaW9uIGxldmVsLgpUaGlzIG1lYW5zIHRoYXQgd2hlbiBjb3VudHMgYXJlIHNtYWxsLCB3ZSBhcmUgbGlrZWx5IHRvIGVuZCB1cCB3aXRoIHNvbWUgbGFyZ2UgZm9sZCBjaGFuZ2UgdmFsdWVzIHRoYXQgb3ZlcmVzdGltYXRlIHRoZSB0cnVlIGV4dGVudCBvZiB0aGUgY2hhbmdlIGJldHdlZW4gY29uZGl0aW9ucy4KCldlIGNhbiBjb3JyZWN0IHRoaXMgYnkgYXBwbHlpbmcgYSAic2hyaW5rYWdlIiBwcm9jZWR1cmUsIHdoaWNoIHdpbGwgYWRqdXN0IGxhcmdlIHZhbHVlcyB3aXRoIHNtYWxsIGNvdW50cyBkb3dud2FyZCwgd2hpbGUgcHJlc2VydmluZyB2YWx1ZXMgd2l0aCBsYXJnZXIgY291bnRzLCB3aGljaCBhcmUgbGlrZWx5IHRvIGJlIG1vcmUgYWNjdXJhdGUuCgpUbyBkbyB0aGlzLCB3ZSB3aWxsIHVzZSB0aGUgYGxmY1NocmluaygpYCBmdW5jdGlvbiwgYnV0IGZpcnN0IHdlIG5lZWQgdG8ga25vdyB0aGUgbmFtZSBhbmQvb3IgcG9zaXRpb24gb2YgdGhlICJjb2VmZmljaWVudCIgdGhhdCB3YXMgY2FsY3VsYXRlZCBieSBgREVTZXEoKWAsIHdoaWNoIHdlIGNhbiBkbyB3aXRoIHRoZSBgcmVzdWx0c05hbWVzKClgIGZ1bmN0aW9uLgoKYGBge3IgY29lZmZpY2llbnQsIGxpdmU9VFJVRX0KIyBpZGVudGlmeSBwb3NpdGlvbiBvZiBjb2VmZmljaWVudApERVNlcTI6OnJlc3VsdHNOYW1lcyhkZXNlcV9vYmplY3QpCmBgYAoKCmBgYHtyIHNocmlua2FnZX0KIyBhcHB5bHkgbG9nRkMgc2hyaW5rYWdlIHVzaW5nIHRoZSBkZWZhdWx0IG1vZGVsCnNocmlua19yZXN1bHRzIDwtIERFU2VxMjo6bGZjU2hyaW5rKAogIGRlc2VxX29iamVjdCwKICByZXMgPSBkZXNlcV9yZXN1bHRzLAogIGNvZWYgPSAyLAogIHR5cGUgPSAiYXBlZ2xtIgopCmhlYWQoc2hyaW5rX3Jlc3VsdHMpCmBgYAoKSWYgeW91IGxvb2sgYXQgb3VyIGBzaHJpbmtfcmVzdWx0c2Agb2JqZWN0LCB3ZSBzZWUgdGhhdCB0aGUgZ2VuZXMgYXJlIGxhYmVsZWQgd2l0aCB0aGUgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXJzLCBhcyB0aG9zZSB3ZXJlIHRoZSByb3cgbmFtZXMgb2YgdGhlIHBzZXVkby1idWxrZWQgU0NFIHdlIHVzZWQgYXMgaW5wdXQgdG8gYnVpbGQgb3VyIGBERVNlcTJgIG9iamVjdC4KQWx0aG91Z2ggc29tZSBvZiB1cyBtYXkgaGF2ZSBhbGwgb2YgdGhlIGlkZW50aWZpZXJzIG1lbW9yaXplZCBieSBoZWFydCwgaXQgY2FuIGJlIHVzZWZ1bCB0byBoYXZlIGEgaHVtYW4gcmVhZGFibGUgc3ltYm9sIGluIG91ciByZXN1bHRzLgpCZWZvcmUgd2Ugc2F2ZSB0aGUgcmVzdWx0cyBhcyBhIGZpbGUsIHdlIHdpbGwgZ3JhYiB0aGUgZ2VuZSBzeW1ib2xzIGZyb20gdGhlIGByb3dEYXRhYCBvZiBvdXIgb3JpZ2luYWwgU0NFIG9iamVjdCBhbmQgYWRkIHRoZW0gYXMgYSBuZXcgY29sdW1uLgoKYGBge3IgYWRkIGdlbmUgc3ltYm9sfQpkZXNlcV9yZXN1bHRzIDwtIHNocmlua19yZXN1bHRzIHw+CiAgIyBkaXJlY3RseSBhZGQgRW5zZW1ibCBpZCBhcyBhIGNvbHVtbgogICMgY29udmVydGluZyByZXN1bHRzIGludG8gYSBkYXRhIGZyYW1lCiAgdGliYmxlOjphc190aWJibGUocm93bmFtZXMgPSAiZW5zZW1ibF9pZCIpCgojIGNvbnZlcnQgcm93ZGF0YSB0byBkYXRhIGZyYW1lCnNjZV9yb3dkYXRhX2RmIDwtIHJvd0RhdGEodHVtb3JfbXlvYmxhc3Rfc2NlKSB8PgogICMgY3JlYXRlIGEgY29sdW1uIHdpdGggcm93bmFtZXMgc3RvcmVkIGFzIGVuc2VtYmwgaWQKICAjIHVzZSBmb3Igam9pbmluZyB3aXRoIGRlc2VxIHJlc3VsdHMKICB0aWJibGU6OmFzX3RpYmJsZShyb3duYW1lcyA9ICJlbnNlbWJsX2lkIikKCiMgY29tYmluZSBkZXNlcSByZXN1bHRzIHdpdGggcm93ZGF0YSBieSBlbnNlbWJsIGlkCmRlc2VxX3Jlc3VsdHMgPC0gZGVzZXFfcmVzdWx0cyB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oc2NlX3Jvd2RhdGFfZGYsIGJ5ID0gImVuc2VtYmxfaWQiKQoKaGVhZChkZXNlcV9yZXN1bHRzKQpgYGAKCldlIGNhbiBzYXZlIHRoZSBuZXcgZGF0YSBmcmFtZSB0aGF0IHdlIGhhdmUgY3JlYXRlZCB3aXRoIHRoZSBFbnNlbWJsIGlkZW50aWZpZXJzLCBnZW5lIHN5bWJvbHMsIGFuZCB0aGUgYERFU2VxMmAgcmVzdWx0cyBhcyBhIHRhYiBzZXBhcmF0ZWQgKGB0c3ZgKSBmaWxlLgoKYGBge3Igc2F2ZSBkZXNlcSwgbGl2ZT1UUlVFfQojIHNhdmUgb3VyIHJlc3VsdHMgYXMgdHN2CnJlYWRyOjp3cml0ZV90c3YoZGVzZXFfcmVzdWx0cywgZGVzZXFfb3V0cHV0X2ZpbGUpCmBgYAoKTmV4dCwgd2Ugd2lsbCB0YWtlIGEgbG9vayBhdCBob3cgbWFueSBnZW5lcyBhcmUgc2lnbmlmaWNhbnQuCkhlcmUgd2Ugd2lsbCB3YW50IHRvIHVzZSB0aGUgYWRqdXN0ZWQgcC12YWx1ZSwgZm91bmQgaW4gdGhlIGBwYWRqYCBjb2x1bW4gb2YgdGhlIHJlc3VsdHMsIGFzIHRoaXMgYWNjb3VudHMgZm9yIG11bHRpcGxlIHRlc3QgY29ycmVjdGlvbi4KCmBgYHtyIHNpZ25pZmljYW50IHJlc3VsdHMsIGxpdmU9VFJVRX0KIyBmaXJzdCBsb29rIGF0IHRoZSBzaWduaWZpY2FudCByZXN1bHRzCmRlc2VxX3Jlc3VsdHNfc2lnIDwtIGRlc2VxX3Jlc3VsdHMgfD4KICAjIGZpbHRlciBiYXNlZCBvbiBhZGp1c3RlZCBwdmFsdWUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPD0gMC4wNSkKCmhlYWQoZGVzZXFfcmVzdWx0c19zaWcpCmBgYAoKCiMjIyBFeHBsb3JpbmcgdGhlIGlkZW50aWZpZWQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzCgpOb3cgdGhhdCB3ZSBoYXZlIGlkZW50aWZpZWQgYSBzZXQgb2YgZ2VuZXMgdGhhdCBhcmUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGluIHRoZSB0dW1vciBteW9ibGFzdHMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHN1YnR5cGVzLCBsZXRzIGFjdHVhbGx5IHRha2UgYSBsb29rIGF0IHRoZW0gYW5kIHNlZSBpZiB3ZSBjYW4gbWFrZSBzb21lIGluZm9ybWF0aXZlIHBsb3RzLgpUaGUgZmlyc3QgcGxvdCB3ZSdsbCBtYWtlIGlzIGEgdm9sY2FubyBwbG90IHVzaW5nIHRoZSBbYEVuaGFuY2VkVm9sY2Fub2AgcGFja2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL2tldmluYmxpZ2hlL0VuaGFuY2VkVm9sY2FubykuClRoaXMgcGFja2FnZSBhdXRvbWF0aWNhbGx5IGNvbG9ycyB0aGUgcG9pbnRzIGJ5IGN1dG9mZnMgZm9yIGJvdGggc2lnbmlmaWNhbmNlIGFuZCBmb2xkIGNoYW5nZSBhbmQgbGFiZWxzIG1hbnkgb2YgdGhlIHNpZ25pZmljYW50IGdlbmVzIChzdWJqZWN0IHRvIHNwYWNpbmcpLgpgRW5oYW5jZWRWb2xjYW5vYCBoYXMgbWFueSwgbWFueSBvcHRpb25zLCB3aGljaCBpcyBhIGdvb2QgdGhpbmcgaWYgeW91IGRvbid0IGxpa2UgYWxsIG9mIGl0cyBkZWZhdWx0IHNldHRpbmdzLgpFdmVuIGJldHRlciwgaXQgb3V0cHV0cyBhIGBnZ3Bsb3QyYCBvYmplY3QsIHNvIGlmIHdlIHdhbnQgdG8gY3VzdG9taXplIHRoZSBwbG90IGZ1cnRoZXIsIHdlIGNhbiB1c2UgdGhlIHNhbWUgYGdncGxvdDJgIGNvbW1hbmRzIHdlIGhhdmUgdXNlZCBiZWZvcmUuCgpgYGB7ciB2b2xjYW5vfQpFbmhhbmNlZFZvbGNhbm86OkVuaGFuY2VkVm9sY2FubygKICBkZXNlcV9yZXN1bHRzLAogIHggPSAibG9nMkZvbGRDaGFuZ2UiLCAjIGZvbGQgY2hhbmdlIHN0YXRpc3RpYyB0byBwbG90CiAgeSA9ICJwdmFsdWUiLCAjIHNpZ25pZmljYW5jZSB2YWx1ZXMKICBsYWIgPSBkZXNlcV9yZXN1bHRzJGdlbmVfc3ltYm9sLCAjIGxhYmVscyBmb3IgcG9pbnRzCiAgcEN1dG9mZiA9IDFlLTA1LCAjIHAgdmFsdWUgY3V0b2ZmIChkZWZhdWx0KQogIEZDY3V0b2ZmID0gMSwgIyBmb2xkIGNoYW5nZSBjdXRvZmYgKGRlZmF1bHQpCiAgdGl0bGUgPSBOVUxMLCAjIG5vIHRpdGxlCiAgc3VidGl0bGUgPSBOVUxMLCAjIG9yIHN1YnRpdGxlCiAgY2FwdGlvbiA9IE5VTEwsICMgb3IgY2FwdGlvbgogIGRyYXdDb25uZWN0b3JzID0gVFJVRSwgIyBhZGQgc29tZSBmdW4gYXJyb3dzCiAgbGFiU2l6ZSA9IDMgIyBzbWFsbGVyIGxhYmVscwopICsKICAjIGNoYW5nZSB0aGUgb3ZlcmFsbCB0aGVtZQogIHRoZW1lX2J3KCkgKwogICMgbW92ZSB0aGUgbGVnZW5kIHRvIHRoZSBib3R0b20KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgoKV2UgY2FuIGFsc28gcmV0dXJuIGJhY2sgdG8gdGhlIFNDRSBvYmplY3QgdGhhdCB3ZSB1c2VkIHRvIGNyZWF0ZSBvdXIgcHNldWRvLWJ1bGtlZCBTQ0UgYW5kIGxvb2sgYXQgZ2VuZSBleHByZXNzaW9uIG9mIHNvbWUgb2YgdGhlIHNpZ25pZmljYW50IGdlbmVzLgpXZSBjYW4gY3JlYXRlIFVNQVAgcGxvdHMgYXMgd2UgZGlkIHByZXZpb3VzbHksIGJ1dCBpbnN0ZWFkIG9mIGxhYmVsaW5nIGVhY2ggY2VsbCB3aXRoIG1ldGFkYXRhLCB3ZSBjYW4gY29sb3IgY2VsbHMgYnkgYSBzcGVjaWZpZWQgZ2VuZSdzIGV4cHJlc3Npb24gbGV2ZWxzLgpXZSB3aWxsIGFsc28gdXNlIHNvbWUgb2YgdGhlIGBnZ3Bsb3QyYCBza2lsbHMgd2UgcGlja2VkIHVwIGVhcmxpZXIsIGxpa2UgYGZhY2V0X2dyaWQoKWAgdG8gcGxvdCBjZWxscyBmcm9tIGRpZmZlcmVudCBSTVMgc3VidHlwZXMgc2VwYXJhdGVseS4KVGhpcyBjYW4gaGVscCB1cyB2YWxpZGF0ZSB0aGUgYERFU2VxMmAgcmVzdWx0cyBzbyB0aGF0IHdlIGNhbiB2aXN1YWxpemUgZ2VuZSBleHByZXNzaW9uIGNoYW5nZXMgYWNyb3NzIG91ciBjZWxsIHR5cGUgb2YgaW50ZXJlc3Qgb24gYSBzaW5nbGUtY2VsbCBsZXZlbC4KCmBgYHtyIGV4cHJlc3Npb24gdW1hcCwgbGl2ZT1UUlVFfQojIGZpbHRlciB0byBqdXN0IG15b2JsYXN0IGNlbGxzIGFuZCByZW1vdmUgYW55IE5BJ3MgYmVmb3JlIHBsb3R0aW5nCm15b2JsYXN0X2NvbWJpbmVkX3NjZSA8LSBybXNfc2NlWywgd2hpY2gocm1zX3NjZSRjZWxsdHlwZV9icm9hZCA9PSAiVHVtb3JfTXlvYmxhc3QiKV0KCiMgcGxvdCBQVFBSVCAoRU5TRzAwMDAwMTk2MDkwKSBleHByZXNzaW9uIGluIEFSTVMgdnMuIEVSTVMKc2NhdGVyOjpwbG90UmVkdWNlZERpbSgKICBteW9ibGFzdF9jb21iaW5lZF9zY2UsCiAgZGltcmVkID0gImZhc3Rtbm5fVU1BUCIsCiAgY29sb3JfYnkgPSAiRU5TRzAwMDAwMTk2MDkwIiwgIyBQVFBSVAogIHBvaW50X3NpemUgPSAwLjUsCiAgcG9pbnRfYWxwaGEgPSAwLjQsCiAgb3RoZXJfZmllbGRzID0gImRpYWdub3Npc19ncm91cCIKKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhkaWFnbm9zaXNfZ3JvdXApKQpgYGAKCkluIHRoZSBhYm92ZSBwbG90IHdlIG9ubHkgcGxvdHRlZCB0aGUgdHVtb3IgbXlvYmxhc3QgY2VsbHMgdGhhdCB3ZSB1c2VkIGluIG91ciBERSBhbmFseXNpcy4KSG93ZXZlciwgd2UgbWlnaHQgYmUgaW50ZXJlc3RlZCB0byBzZWUgdGhlIGV4cHJlc3Npb24gb2YgZ2VuZXMgdGhhdCBhcmUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGluIG90aGVyIGNlbGwgdHlwZXMgcHJlc2VudCBpbiBvdXIgc2FtcGxlcy4KCmBgYHtyIGNlbGx0eXBlIGNvbXBhcmlzb259CiMgbGV0J3MgY29tcGFyZSBnZW5lIGV4cHJlc3Npb24gYWNyb3NzIHNvbWUgb3RoZXIgY2VsbCB0eXBlcwojIGxvb2sgYXQgYWxsIHR1bW9yIGNlbGxzIGFuZCBwaWNrIG9uZSBub3JtYWwgY2VsbCB0eXBlCmNlbGx0eXBlcyA8LSBjKAogICJUdW1vcl9NeW9ibGFzdCIsCiAgIlR1bW9yX01lc29kZXJtIiwKICAiVHVtb3JfTXlvY3l0ZSIsCiAgIlZhc2N1bGFyIEVuZG90aGVsaXVtIgopCgojIHN1YnNldCB0byBqdXN0IGNlbGx0eXBlcyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCnR1bW9yX3NjZSA8LSBybXNfc2NlWywgd2hpY2gocm1zX3NjZSRjZWxsdHlwZV9icm9hZCAlaW4lIGNlbGx0eXBlcyldCmBgYAoKTmV4dCB3ZSB3aWxsIGxvb2sgYXQgYSBmZXcgREUgZ2VuZXMgdGhhdCB3ZSBpZGVudGlmaWVkLCBvbmUgdXAgcmVndWxhdGVkIGdlbmUgYW5kIG9uZSBkb3duIHJlZ3VsYXRlZCBnZW5lLCBhbmQgY29tcGFyZSB0aGVpciBleHByZXNzaW9uIGluIG15b2JsYXN0cyB0byBvdGhlciBjZWxsIHR5cGVzIGluIEFSTVMgYW5kIEVSTVMgc2FtcGxlcy4KV2Ugd2lsbCB1c2UgdGhlIGBzY2F0ZXI6OnBsb3RFeHByZXNzaW9uKClgIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHZpb2xpbiBwbG90IHdpdGggUk1TIHN1YnR5cGUgb24gdGhlIHgtYXhpcyBhbmQgZ2VuZSBleHByZXNzaW9uIG9uIHRoZSB5LWF4aXMuCldlIGNhbiBjb250aW51ZSB1c2luZyBgZmFjZXRfZ3JpZCgpYCB0byBzaG93IHNlcGFyYXRlIHBhbmVscyBmb3IgZWFjaCBjZWxsIHR5cGUuCkJlY2F1c2Ugd2Ugd2FudCB0byBzaG93IG11bHRpcGxlIGdlbmVzIGhlcmUsIHdlIGFyZSBnb2luZyB0byBhZGQgYW4gYWRkaXRpb25hbCBvcHRpb24gdG8gYGZhY2V0X2dyaWQoKWAgdG8gaW5jbHVkZSBtdWx0aXBsZSByb3dzIGluIG91ciBwbG90IGdyaWQsIG9uZSBmb3IgZWFjaCBnZW5lIG9mIGludGVyZXN0LgpPbmUgbmVhdCB0cmljayBvZiB0aGUgYHNjYXRlcjo6cGxvdEV4cHJlc3Npb24oKWAgZnVuY3Rpb24gaXMgdGhhdCBpdCBhY3R1YWxseSBjcmVhdGVzIGEgYEZlYXR1cmVgIGNvbHVtbiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZmVhdHVyZXMgKGluIHRoaXMgY2FzZSBnZW5lcykgYmVpbmcgdXNlZCBpbiBwbG90dGluZy4KV2UgY2FuIHRoZW4gZGlyZWN0bHkgcmVmZXJlbmNlIHRoYXQgYEZlYXR1cmVgIGNvbHVtbiB3aGVuIHBsb3R0aW5nLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBgb3RoZXJfZmllbGRzYCBvcHRpb24gd2UgdXNlZCBwcmV2aW91c2x5LgoKYGBge3IgbXVsdGktZ2VuZSBwbG90fQojIHBpY2sgYSBjb3VwbGUgZ2VuZXMgdG8gbG9vayBhdApnZW5lc190b19wbG90IDwtIGMoCiAgIkVOU0cwMDAwMDE5NjA5MCIsICMgUFRQUlQKICAiRU5TRzAwMDAwMTQ4OTM1IgopICMgR0FTMgoKIyBjcmVhdGUgYSB2aW9saW4gcGxvdApzY2F0ZXI6OnBsb3RFeHByZXNzaW9uKAogIHR1bW9yX3NjZSwKICAjIGEgdmVjdG9yIG9mIGdlbmVzIHRvIHBsb3QKICBmZWF0dXJlcyA9IGdlbmVzX3RvX3Bsb3QsCiAgeCA9ICJkaWFnbm9zaXNfZ3JvdXAiLAogIGNvbG9yX2J5ID0gImRpYWdub3Npc19ncm91cCIsCiAgb3RoZXJfZmllbGRzID0gImNlbGx0eXBlX2Jyb2FkIiwKICBwb2ludF9zaXplID0gMC4xCikgKwogICMgZWFjaCBjZWxsdHlwZSBpcyBpdHMgb3duIGNvbHVtbgogIGZhY2V0X2dyaWQoCiAgICBjb2xzID0gdmFycyhjZWxsdHlwZV9icm9hZCksCiAgICAjIGVhY2ggZmVhdHVyZSAoZ2VuZSkgaXMgaXRzIG93biByb3cKICAgIHJvd3MgPSB2YXJzKEZlYXR1cmUpCiAgKSArCiAgIyBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiB0aGUgZmFjZXQgbGFiZWxzCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgKICAgICAgIyB1cGRhdGUgdGhlIGxlZ2VuZCB0aXRsZQogICAgICB0aXRsZSA9ICJTdWJ0eXBlIiwKICAgICAgIyBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBjb2xvcnMKICAgICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKQogICAgKQogICkKYGBgCgpIb3cgZG8gdGhlIGV4cHJlc3Npb24gb2YgdGhlc2UgZ2VuZXMgY2hhbmdlIGFjcm9zcyBjZWxsIHR5cGVzIGFuZCBSTVMgc3VidHlwZXM/CgpHbyBhaGVhZCBhbmQgZXhwbG9yZSBzb21lIGdlbmVzIG9uIHlvdXIgb3duIQpGZWVsIGZyZWUgdG8gcGxvdCBhbnkgb2YgdGhlIGdlbmVzIHRoYXQgYXJlIGlkZW50aWZpZWQgYXMgc2lnbmlmaWNhbnQsIGZvdW5kIGluIHRoZSBERSByZXN1bHRzIHRhYmxlLCBvciB5b3VyIGZhdm9yaXRlIGdlbmUuClJlbWVtYmVyLCB5b3UgbmVlZCB0byB1c2UgdGhlIEVuc2VtYmwgZ2VuZSBpZGVudGlmaWVyIHRvIHJlZmVyIHRvIGVhY2ggZ2VuZS4KCmBgYHtyIGV4cGxvcmV9CiMgbm93IGRvIHNvbWUgZXhwbG9yYXRpb24gb2Ygb3RoZXIgZ2VuZXMgb24geW91ciBvd24hCmBgYAoKIyMgUHJpbnQgc2Vzc2lvbiBpbmZvCgpgYGB7ciBzZXNzaW9uIGluZm99CnNlc3Npb25JbmZvKCkKYGBgCgo=
    diff --git a/scRNA-seq-advanced/04-gene_set_enrichment_analysis-live.Rmd b/scRNA-seq-advanced/04-gene_set_enrichment_analysis-live.Rmd index f022ca51..504d97f4 100644 --- a/scRNA-seq-advanced/04-gene_set_enrichment_analysis-live.Rmd +++ b/scRNA-seq-advanced/04-gene_set_enrichment_analysis-live.Rmd @@ -55,12 +55,14 @@ library(msigdbr) #### Directories -```{r create_dir, live = TRUE} +```{r create_dir} # We'll use the differential expression results as GSEA input +rms_analysis_dir <- file.path("analysis", "rms") # We'll create a directory to specifically hold the pathway results if it doesn't # exist yet - +results_dir <- file.path(rms_analysis_dir, "pathway-analysis") +fs::dir_create(results_dir) ``` #### Input files @@ -134,7 +136,7 @@ The enrichment score for a pathway is the running sum's maximum deviation from z GSEA also assesses statistical significance of the scores for each pathway through permutation testing. As a result, each input pathway will have a p-value associated with it that is then corrected for multiple hypothesis testing ([Subramanian _et al._ 2005](https://doi.org/10.1073/pnas.0506580102); [Yu](http://yulab-smu.top/clusterProfiler-book/chapter2.html#gene-set-enrichment-analysis)). -The implementation of GSEA we use in here examples requires a gene list ordered by some statistic and input gene sets. +The implementation of GSEA we use here requires a gene list ordered by some statistic and input gene sets. When you use previously computed gene-level statistics with GSEA, it is called GSEA pre-ranked. ## DESeq2 results @@ -164,7 +166,7 @@ You can see an example in this Harvard Chan Bioinformatics Core Training materia One good thing about Ensembl gene identifiers is that they are less likely to be duplicated than, for example, gene symbols. (Multiple Ensembl gene identifiers can map to the same symbol.) -The GSEA approach requires on discriminating between genes that are in a gene set and those that are not. +The GSEA approach requires discriminating between genes that are in a gene set and those that are not. Practically speaking, gene sets are just collections of gene identifiers! When the function we use for GSEA pre-ranked gets a list with duplicated gene identifiers, it can produce unexpected results. So, let's check for duplicates in the data frame of DESeq2 results. @@ -227,10 +229,11 @@ Normalized enrichment scores (NES) are enrichment scores that are scaled to make Pathways with significant, highly positive NES are enriched in ERMS myoblasts, whereas pathways with significant, highly negative NES are enriched in ARMS myoblasts. -Let's write these results to file. +Let's write these results to a file. ```{r write_gsea} -gsea_results@result |> readr::write_tsv(output_file) +gsea_results@result |> + readr::write_tsv(output_file) ``` ### Visualizing GSEA results diff --git a/scRNA-seq-advanced/04-gene_set_enrichment_analysis.Rmd b/scRNA-seq-advanced/04-gene_set_enrichment_analysis.Rmd index 7c43a03b..513c4ea7 100644 --- a/scRNA-seq-advanced/04-gene_set_enrichment_analysis.Rmd +++ b/scRNA-seq-advanced/04-gene_set_enrichment_analysis.Rmd @@ -55,7 +55,7 @@ library(msigdbr) #### Directories -```{r create_dir, live = TRUE} +```{r create_dir} # We'll use the differential expression results as GSEA input rms_analysis_dir <- file.path("analysis", "rms") @@ -69,9 +69,11 @@ fs::dir_create(results_dir) ```{r input_files} -input_file <- file.path(rms_analysis_dir, - "deseq", - "rms_myoblast_deseq_results.tsv") +input_file <- file.path( + rms_analysis_dir, + "deseq", + "rms_myoblast_deseq_results.tsv" +) ``` #### Output files @@ -79,8 +81,10 @@ input_file <- file.path(rms_analysis_dir, We'll save our table of GSEA results as a TSV. ```{r output_files} -output_file <- file.path(results_dir, - "rms_myoblast_gsea_results.tsv") +output_file <- file.path( + results_dir, + "rms_myoblast_gsea_results.tsv" +) ``` ## Gene sets @@ -113,11 +117,13 @@ Here's an excerpt of the [collection description](https://www.gsea-msigdb.org/gs Notably, there are only 50 gene sets included in this collection. The fewer gene sets we test, the lower our multiple hypothesis testing burden. -We can retrieve only the Hallmark gene sets by specifying `category = "H"` to the `msigdbr()` function. +We can retrieve only the Hallmark gene sets by specifying `collection = "H"` to the `msigdbr()` function. ```{r immunologic_sets, live = TRUE} -hs_hallmarks_df <- msigdbr(species = "Homo sapiens", - category = "H") +hs_hallmarks_df <- msigdbr( + species = "Homo sapiens", + collection = "H" +) ``` ## Gene Set Enrichment Analysis @@ -137,7 +143,7 @@ The enrichment score for a pathway is the running sum's maximum deviation from z GSEA also assesses statistical significance of the scores for each pathway through permutation testing. As a result, each input pathway will have a p-value associated with it that is then corrected for multiple hypothesis testing ([Subramanian _et al._ 2005](https://doi.org/10.1073/pnas.0506580102); [Yu](http://yulab-smu.top/clusterProfiler-book/chapter2.html#gene-set-enrichment-analysis)). -The implementation of GSEA we use in here examples requires a gene list ordered by some statistic and input gene sets. +The implementation of GSEA we use here requires a gene list ordered by some statistic and input gene sets. When you use previously computed gene-level statistics with GSEA, it is called GSEA pre-ranked. ## DESeq2 results @@ -167,7 +173,7 @@ You can see an example in this Harvard Chan Bioinformatics Core Training materia One good thing about Ensembl gene identifiers is that they are less likely to be duplicated than, for example, gene symbols. (Multiple Ensembl gene identifiers can map to the same symbol.) -The GSEA approach requires on discriminating between genes that are in a gene set and those that are not. +The GSEA approach requires discriminating between genes that are in a gene set and those that are not. Practically speaking, gene sets are just collections of gene identifiers! When the function we use for GSEA pre-ranked gets a list with duplicated gene identifiers, it can produce unexpected results. So, let's check for duplicates in the data frame of DESeq2 results. @@ -211,20 +217,23 @@ Now for the analysis! We can use the `GSEA()` function to perform GSEA with any generic set of gene sets, but there are several functions for using specific, commonly used gene sets (e.g., `gseKEGG()`). ```{r run_gsea} -gsea_results <- GSEA(geneList = lfc_vector, # ordered ranked gene list - minGSSize = 25, # minimum gene set size - maxGSSize = 500, # maximum gene set set - pvalueCutoff = 0.05, - pAdjustMethod = "BH", # correction for multiple hypothesis testing - TERM2GENE = dplyr::select(hs_hallmarks_df, - gs_name, - ensembl_gene)) # pass the correct identifier column +gsea_results <- GSEA( + geneList = lfc_vector, # ordered ranked gene list + minGSSize = 25, # minimum gene set size + maxGSSize = 500, # maximum gene set set + pvalueCutoff = 0.05, + pAdjustMethod = "BH", # correction for multiple hypothesis testing + TERM2GENE = dplyr::select(hs_hallmarks_df, + gs_name, + ensembl_gene) # pass the correct identifier column +) ``` Let's take a look at the GSEA results. ```{r view_gsea, live = TRUE, eval = FALSE} -View(gsea_results@result |> - dplyr::arrange(dplyr::desc(NES)) +View( + gsea_results@result |> + dplyr::arrange(dplyr::desc(NES)) ) ``` @@ -232,10 +241,11 @@ Normalized enrichment scores (NES) are enrichment scores that are scaled to make Pathways with significant, highly positive NES are enriched in ERMS myoblasts, whereas pathways with significant, highly negative NES are enriched in ARMS myoblasts. -Let's write these results to file. +Let's write these results to a file. ```{r write_gsea} -gsea_results@result |> readr::write_tsv(output_file) +gsea_results@result |> + readr::write_tsv(output_file) ``` ### Visualizing GSEA results @@ -248,10 +258,12 @@ Let's take a look at 3 different pathways -- one with a highly positive NES, one Let's take look at a pathway with a highly positive NES (`HALLMARK_MYC_TARGETS_V2`) using a GSEA plot. ```{r highly_pos} -enrichplot::gseaplot(gsea_results, - geneSetID = "HALLMARK_MYC_TARGETS_V2", - title = "HALLMARK_MYC_TARGETS_V2", - color.line = "#0066FF") +enrichplot::gseaplot( + gsea_results, + geneSetID = "HALLMARK_MYC_TARGETS_V2", + title = "HALLMARK_MYC_TARGETS_V2", + color.line = "#0066FF" +) ``` Notice how the genes that are in the gene set, indicated by the black bars, tend to be on the left side of the graph indicating that they have positive gene-level scores. @@ -261,10 +273,12 @@ Notice how the genes that are in the gene set, indicated by the black bars, tend The gene set `HALLMARK_MYOGENESIS` had a highly negative NES. ```{r highly_neg} -enrichplot::gseaplot(gsea_results, - geneSetID = "HALLMARK_MYOGENESIS", - title = "HALLMARK_MYOGENESIS", - color.line = "#0066FF") +enrichplot::gseaplot( + gsea_results, + geneSetID = "HALLMARK_MYOGENESIS", + title = "HALLMARK_MYOGENESIS", + color.line = "#0066FF" +) ``` This gene set shows the opposite pattern -- genes in the pathway tend to be on the right side of the graph. @@ -275,10 +289,12 @@ The `@results` slot will only show gene sets that pass the `pvalueCutoff` thresh Let's look at `HALLMARK_P53_PATHWAY`, which was not in the results we viewed earlier. ```{r p53, live = TRUE} -enrichplot::gseaplot(gsea_results, - geneSetID = "HALLMARK_P53_PATHWAY", - title = "HALLMARK_P53_PATHWAY", - color.line = "#0066FF") +enrichplot::gseaplot( + gsea_results, + geneSetID = "HALLMARK_P53_PATHWAY", + title = "HALLMARK_P53_PATHWAY", + color.line = "#0066FF" +) ``` Genes in the pathway are distributed more evenly throughout the ranked list, resulting in a more "middling" score. diff --git a/scRNA-seq-advanced/04-gene_set_enrichment_analysis.nb.html b/scRNA-seq-advanced/04-gene_set_enrichment_analysis.nb.html index 307ca33d..07e65fd9 100644 --- a/scRNA-seq-advanced/04-gene_set_enrichment_analysis.nb.html +++ b/scRNA-seq-advanced/04-gene_set_enrichment_analysis.nb.html @@ -3090,10 +3090,9 @@

    Gene Set Enrichment Analysis

    input pathway will have a p-value associated with it that is then corrected for multiple hypothesis testing (Subramanian et al. 2005; Yu).

    -

    The implementation of GSEA we use in here examples requires a gene -list ordered by some statistic and input gene sets. When you use -previously computed gene-level statistics with GSEA, it is called GSEA -pre-ranked.

    +

    The implementation of GSEA we use here requires a gene list ordered +by some statistic and input gene sets. When you use previously computed +gene-level statistics with GSEA, it is called GSEA pre-ranked.

    DESeq2 results

    @@ -3152,12 +3151,12 @@

    DESeq2 results

    One good thing about Ensembl gene identifiers is that they are less likely to be duplicated than, for example, gene symbols. (Multiple Ensembl gene identifiers can map to the same symbol.)

    -

    The GSEA approach requires on discriminating between genes that are -in a gene set and those that are not. Practically speaking, gene sets -are just collections of gene identifiers! When the function we use for -GSEA pre-ranked gets a list with duplicated gene identifiers, it can -produce unexpected results. So, let’s check for duplicates in the data -frame of DESeq2 results.

    +

    The GSEA approach requires discriminating between genes that are in a +gene set and those that are not. Practically speaking, gene sets are +just collections of gene identifiers! When the function we use for GSEA +pre-ranked gets a list with duplicated gene identifiers, it can produce +unexpected results. So, let’s check for duplicates in the data frame of +DESeq2 results.

    @@ -3258,9 +3257,10 @@

    Run GSEA

    Let’s take a look at the GSEA results.

    - -
    View(gsea_results@result |>
    -       dplyr::arrange(dplyr::desc(NES))
    +
    +
    View(
    +  gsea_results@result |>
    +    dplyr::arrange(dplyr::desc(NES))
     )
    @@ -3271,11 +3271,12 @@

    Run GSEA

    Pathways with significant, highly positive NES are enriched in ERMS myoblasts, whereas pathways with significant, highly negative NES are enriched in ARMS myoblasts.

    -

    Let’s write these results to file.

    +

    Let’s write these results to a file.

    - -
    gsea_results@result |> readr::write_tsv(output_file)
    + +
    gsea_results@result |> 
    +  readr::write_tsv(output_file)
    @@ -3428,7 +3429,7 @@

    Session Info

    -
    LS0tCnRpdGxlOiAiUGF0aHdheSBhbmFseXNpczogR2VuZSBTZXQgRW5yaWNobWVudCBBbmFseXNpcyAoR1NFQSkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKYXV0aG9yOiBDQ0RMIGZvciBBTFNGCmRhdGU6IDIwMjQKLS0tCgojIyBPYmplY3RpdmVzCgpUaGlzIG5vdGVib29rIHdpbGwgZGVtb25zdHJhdGUgaG93IHRvOgoKLSBQcmVwYXJlIHRhYnVsYXIgZGF0YSBvZiBnZW5lLWxldmVsIHN0YXRpc3RpY3MgZm9yIHVzZSB3aXRoIEdlbmUgU2V0IEVucmljaG1lbnQgQW5hbHlzaXMgKEdTRUEpCi0gQWNjZXNzIFtNb2xlY3VsYXIgU2lnbmF0dXJlcyBEYXRhYmFzZSBnZW5lIHNldCBjb2xsZWN0aW9uc10oaHR0cHM6Ly93d3cuZ3NlYS1tc2lnZGIub3JnL2dzZWEvbXNpZ2RiL2NvbGxlY3Rpb25zLmpzcCkgdmlhIHRoZSBgbXNpZ2RicmAgcGFja2FnZQotIFBlcmZvcm0gR1NFQSB3aXRoIHRoZSBgY2x1c3RlclByb2ZpbGVyYCBwYWNrYWdlCi0gVmlzdWFsaXplIEdTRUEgcmVzdWx0cyB3aXRoIHRoZSBgZW5yaWNocGxvdGAgcGFja2FnZQoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBhbmFseXplIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiByZXN1bHRzIGZyb20gdGhlIGxhc3Qgbm90ZWJvb2suCgpHU0VBIGlzIGEgZnVuY3Rpb25hbCBjbGFzcyBzY29yaW5nIChGQ1MpIGFwcHJvYWNoIHRvIHBhdGh3YXkgYW5hbHlzaXMgdGhhdCB3YXMgZmlyc3QgaW50cm9kdWNlZCBpbiBbU3VicmFtYW5pYW4gX2V0IGFsLl8gKDIwMDUpXShodHRwczovL2RvaS5vcmcvMTAuMTA3My9wbmFzLjA1MDY1ODAxMDIpLgpUaGUgcmF0aW9uYWxlIGJlaGluZCBGQ1MgYXBwcm9hY2hlcyBpcyB0aGF0IHNtYWxsIGNoYW5nZXMgaW4gaW5kaXZpZHVhbCBnZW5lcyB0aGF0IHBhcnRpY2lwYXRlIGluIHRoZSBzYW1lIGJpb2xvZ2ljYWwgcHJvY2VzcyBvciBwYXRod2F5IGNhbiBiZSBzaWduaWZpY2FudCBhbmQgb2YgYmlvbG9naWNhbCBpbnRlcmVzdC4KClRoZXJlIGFyZSAzIGdlbmVyYWwgc3RlcHMgaW4gRkNTIG1ldGhvZHMgKFtLaGF0cmkgX2V0IGFsLl8gMjAxMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjEzNzEvam91cm5hbC5wY2JpLjEwMDIzNzUpKToKCjEuIENhbGN1bGF0ZSBhIGdlbmUtbGV2ZWwgc3RhdGlzdGljIChoZXJlLCB3ZSdsbCB1c2UgdGhlIHN1bW1hcnkgbG9nIGZvbGQgY2hhbmdlcyBpbiBvdXIgREVTZXEyIHJlc3VsdHMpCjIuIEFnZ3JlZ2F0ZSBnZW5lLWxldmVsIHN0YXRpc3RpY3MgaW50byBhIHBhdGh3YXktbGV2ZWwgc3RhdGlzdGljCjMuIEFzc2VzcyB0aGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZSBwYXRod2F5LWxldmVsIHN0YXRpc3RpYwoKIyMjIyBPdGhlciByZXNvdXJjZXMKCiogRm9yIGFub3RoZXIgZXhhbXBsZSB1c2luZyBgY2x1c3RlclByb2ZpbGVyYCBmb3IgR1NFQSwgc2VlIFtfSW50cm8gdG8gREdFOiBGdW5jdGlvbmFsIEFuYWx5c2lzLl8gZnJvbSBIYXJ2YXJkIENoYW4gQmlvaW5mb3JtYXRpY3MgQ29yZSBUcmFpbmluZy5dKGh0dHBzOi8vaGJjdHJhaW5pbmcuZ2l0aHViLmlvL1RyYWluaW5nLW1vZHVsZXMvREdFLWZ1bmN0aW9uYWwtYW5hbHlzaXMvbGVzc29ucy8wMl9mdW5jdGlvbmFsX2FuYWx5c2lzLmh0bWwpCiogVGhlIHdheSB3ZSdsbCB1c2UgYGNsdXN0ZXJQcm9maWxlcmAgaGVyZSB1c2VzIGBmZ3NlYWAgKEZhc3QgR2VuZSBTZXQgRW5yaWNobWVudCBBbmFseXNpcykgdW5kZXIgdGhlIGhvb2QuCllvdSBjYW4gcmVhZCBtb3JlIGFib3V0IGBmZ3NlYWAgaW4gW0tvcm90a2V2aWNoIF9ldCBhbC5fICgyMDIxKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExMDEvMDYwMDEyKS4KKiBTZWUgdGhlIFtyZWZpbmUuYmlvIGV4YW1wbGVzIGZvciAiR2VuZSBzZXQgZW5yaWNobWVudCBhbmFseXNpcyAtIFJOQS1zZXEiXShodHRwczovL2FsZXhzbGVtb25hZGUuZ2l0aHViLmlvL3JlZmluZWJpby1leGFtcGxlcy8wMy1ybmFzZXEvcGF0aHdheS1hbmFseXNpc19ybmFzZXFfMDJfZ3NlYS5odG1sKSBmcm9tIHdoaWNoIHRoaXMgbWF0ZXJpYWwgaGFzIGJlZW4gYWRhcHRlZC4KCiMjIFNldCB1cAoKIyMjIExpYnJhcmllcwoKYGBge3Igc2V0dXB9CiMgc2V0IHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgyMDI1KQoKIyBQYWNrYWdlIHRvIHJ1biBHU0VBCmxpYnJhcnkoY2x1c3RlclByb2ZpbGVyKQojIFBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgTVNpZ0RCIGdlbmUgc2V0cyBpbiB0aWR5IGZvcm1hdApsaWJyYXJ5KG1zaWdkYnIpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBGaWxlcwoKIyMjIyBEaXJlY3RvcmllcwoKYGBge3IgY3JlYXRlX2RpciwgbGl2ZSA9IFRSVUV9CiMgV2UnbGwgdXNlIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiByZXN1bHRzIGFzIEdTRUEgaW5wdXQKcm1zX2FuYWx5c2lzX2RpciA8LSBmaWxlLnBhdGgoImFuYWx5c2lzIiwgInJtcyIpCgojIFdlJ2xsIGNyZWF0ZSBhIGRpcmVjdG9yeSB0byBzcGVjaWZpY2FsbHkgaG9sZCB0aGUgcGF0aHdheSByZXN1bHRzIGlmIGl0IGRvZXNuJ3QKIyBleGlzdCB5ZXQKcmVzdWx0c19kaXIgPC0gZmlsZS5wYXRoKHJtc19hbmFseXNpc19kaXIsICJwYXRod2F5LWFuYWx5c2lzIikKZnM6OmRpcl9jcmVhdGUocmVzdWx0c19kaXIpCmBgYAoKIyMjIyBJbnB1dCBmaWxlcwoKCmBgYHtyIGlucHV0X2ZpbGVzfQppbnB1dF9maWxlIDwtIGZpbGUucGF0aChybXNfYW5hbHlzaXNfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAicm1zX215b2JsYXN0X2Rlc2VxX3Jlc3VsdHMudHN2IikKYGBgCgojIyMjIE91dHB1dCBmaWxlcwoKV2UnbGwgc2F2ZSBvdXIgdGFibGUgb2YgR1NFQSByZXN1bHRzIGFzIGEgVFNWLgoKYGBge3Igb3V0cHV0X2ZpbGVzfQpvdXRwdXRfZmlsZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicm1zX215b2JsYXN0X2dzZWFfcmVzdWx0cy50c3YiKQpgYGAKCiMjIEdlbmUgc2V0cwoKV2Ugd2lsbCB1c2UgZ2VuZSBzZXRzIGZyb20gdGhlIFtNb2xlY3VsYXIgU2lnbmF0dXJlcyBEYXRhYmFzZSAoTVNpZ0RCKV0oaHR0cHM6Ly93d3cuZ3NlYS1tc2lnZGIub3JnL2dzZWEvbXNpZ2RiL2luZGV4LmpzcCkgZnJvbSB0aGUgQnJvYWQgSW5zdGl0dXRlIChbU3VicmFtYW5pYW4sIFRhbWF5byAqZXQgYWwuKiAyMDA1XShodHRwczovL2RvaS5vcmcvMTAuMTA3My9wbmFzLjA1MDY1ODAxMDIpKS4KVGhlIFtgbXNpZ2RicmBdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9tc2lnZGJyL2luZGV4Lmh0bWwpIHBhY2thZ2UgY29udGFpbnMgTVNpZ0RCIGRhdGFzZXRzIGFscmVhZHkgaW4gdGhlIHRpZHkgZm9ybWF0IHJlcXVpcmVkIGJ5IGBjbHVzdGVyUHJvZmlsZXJgIGFuZCBzdXBwb3J0cyBtdWx0aXBsZSBvcmdhbmlzbXMuCgpMZXQncyB0YWtlIGEgbG9vayBhdCB3aGF0IG9yZ2FuaXNtcyB0aGUgcGFja2FnZSBzdXBwb3J0cy4KCmBgYHtyIHNob3dfc3BlY2llc30KbXNpZ2Ricl9zcGVjaWVzKCkKYGBgCgpNU2lnREIgY29udGFpbnMgOCBkaWZmZXJlbnQgZ2VuZSBzZXQgY29sbGVjdGlvbnMuCgogICAgSDogaGFsbG1hcmsgZ2VuZSBzZXRzCiAgICBDMTogcG9zaXRpb25hbCBnZW5lIHNldHMKICAgIEMyOiBjdXJhdGVkIGdlbmUgc2V0cwogICAgQzM6IG1vdGlmIGdlbmUgc2V0cwogICAgQzQ6IGNvbXB1dGF0aW9uYWwgZ2VuZSBzZXRzCiAgICBDNTogR08gZ2VuZSBzZXRzCiAgICBDNjogb25jb2dlbmljIHNpZ25hdHVyZXMKICAgIEM3OiBpbW11bm9sb2dpYyBzaWduYXR1cmVzCgpXZSdsbCB1c2UgdGhlIEhhbGxtYXJrIGNvbGxlY3Rpb24gZm9yIEdTRUEuCkhlcmUncyBhbiBleGNlcnB0IG9mIHRoZSBbY29sbGVjdGlvbiBkZXNjcmlwdGlvbl0oaHR0cHM6Ly93d3cuZ3NlYS1tc2lnZGIub3JnL2dzZWEvbXNpZ2RiL2NvbGxlY3Rpb25fZGV0YWlscy5qc3AjSCk6Cgo+IEhhbGxtYXJrIGdlbmUgc2V0cyBzdW1tYXJpemUgYW5kIHJlcHJlc2VudCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgYmlvbG9naWNhbCBzdGF0ZXMgb3IgcHJvY2Vzc2VzIGFuZCBkaXNwbGF5IGNvaGVyZW50IGV4cHJlc3Npb24uIFRoZXNlIGdlbmUgc2V0cyB3ZXJlIGdlbmVyYXRlZCBieSBhIGNvbXB1dGF0aW9uYWwgbWV0aG9kb2xvZ3kgYmFzZWQgb24gaWRlbnRpZnlpbmcgZ2VuZSBzZXQgb3ZlcmxhcHMgYW5kIHJldGFpbmluZyBnZW5lcyB0aGF0IGRpc3BsYXkgY29vcmRpbmF0ZSBleHByZXNzaW9uLiBUaGUgaGFsbG1hcmtzIHJlZHVjZSBub2lzZSBhbmQgcmVkdW5kYW5jeSBhbmQgcHJvdmlkZSBhIGJldHRlciBkZWxpbmVhdGVkIGJpb2xvZ2ljYWwgc3BhY2UgZm9yIEdTRUEuCgpOb3RhYmx5LCB0aGVyZSBhcmUgb25seSA1MCBnZW5lIHNldHMgaW5jbHVkZWQgaW4gdGhpcyBjb2xsZWN0aW9uLgpUaGUgZmV3ZXIgZ2VuZSBzZXRzIHdlIHRlc3QsIHRoZSBsb3dlciBvdXIgbXVsdGlwbGUgaHlwb3RoZXNpcyB0ZXN0aW5nIGJ1cmRlbi4KCldlIGNhbiByZXRyaWV2ZSBvbmx5IHRoZSBIYWxsbWFyayBnZW5lIHNldHMgYnkgc3BlY2lmeWluZyBgY2F0ZWdvcnkgPSAiSCJgIHRvIHRoZSBgbXNpZ2RicigpYCBmdW5jdGlvbi4KCmBgYHtyIGltbXVub2xvZ2ljX3NldHMsIGxpdmUgPSBUUlVFfQpoc19oYWxsbWFya3NfZGYgPC0gbXNpZ2RicihzcGVjaWVzID0gIkhvbW8gc2FwaWVucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gIkgiKQpgYGAKCiMjIEdlbmUgU2V0IEVucmljaG1lbnQgQW5hbHlzaXMKCl9BZGFwdGVkIGZyb20gW3JlZmluZS5iaW8gZXhhbXBsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL3JlZmluZWJpby1leGFtcGxlcy9ibG9iLzMzY2RlZmY2NmQ1N2Y5ZmU4ZWU0ZmNiNTE1NmFlYTRhYzJkY2UwN2YvMDMtcm5hc2VxL3BhdGh3YXktYW5hbHlzaXNfcm5hc2VxXzAyX2dzZWEuUm1kKV8KCiFbXShkaWFncmFtcy9zdWJyYW1hbmlhbl9maWcxLmpwZykKCioqRmlndXJlIDEuIFtTdWJyYW1hbmlhbiBfZXQgYWwuXyAoMjAwNSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDczL3BuYXMuMDUwNjU4MDEwMikuKioKCkdTRUEgY2FsY3VsYXRlcyBhIHBhdGh3YXktbGV2ZWwgbWV0cmljLCBjYWxsZWQgYW4gZW5yaWNobWVudCBzY29yZSAoc29tZXRpbWVzIGFiYnJldmlhdGVkIGFzIEVTKSwgYnkgcmFua2luZyBnZW5lcyBieSBhIGdlbmUtbGV2ZWwgc3RhdGlzdGljLgpUaGlzIHNjb3JlIHJlZmxlY3RzIHdoZXRoZXIgb3Igbm90IGEgZ2VuZSBzZXQgb3IgcGF0aHdheSBpcyBvdmVyLXJlcHJlc2VudGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBnZW5lIHJhbmtpbmdzIChbU3VicmFtYW5pYW4gX2V0IGFsLl8gMjAwNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwNzMvcG5hcy4wNTA2NTgwMTAyKTsgW1l1XShodHRwOi8veXVsYWItc211LnRvcC9jbHVzdGVyUHJvZmlsZXItYm9vay9jaGFwdGVyMi5odG1sI2dlbmUtc2V0LWVucmljaG1lbnQtYW5hbHlzaXMpKQoKU3BlY2lmaWNhbGx5LCBhbGwgZ2VuZXMgYXJlIHJhbmtlZCBmcm9tIG1vc3QgcG9zaXRpdmUgdG8gbW9zdCBuZWdhdGl2ZSBiYXNlZCBvbiB0aGVpciBzdGF0aXN0aWMgYW5kIGEgcnVubmluZyBzdW0gaXMgY2FsY3VsYXRlZDoKU3RhcnRpbmcgd2l0aCB0aGUgbW9zdCBoaWdobHkgcmFua2VkIGdlbmVzLCB0aGUgcnVubmluZyBzdW0gaW5jcmVhc2VzIGZvciBlYWNoIGdlbmUgaW4gdGhlIHBhdGh3YXkgYW5kIGRlY3JlYXNlcyBmb3IgZWFjaCBnZW5lIG5vdCBpbiB0aGUgcGF0aHdheS4KVGhlIGVucmljaG1lbnQgc2NvcmUgZm9yIGEgcGF0aHdheSBpcyB0aGUgcnVubmluZyBzdW0ncyBtYXhpbXVtIGRldmlhdGlvbiBmcm9tIHplcm8uCkdTRUEgYWxzbyBhc3Nlc3NlcyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgdGhlIHNjb3JlcyBmb3IgZWFjaCBwYXRod2F5IHRocm91Z2ggcGVybXV0YXRpb24gdGVzdGluZy4KQXMgYSByZXN1bHQsIGVhY2ggaW5wdXQgcGF0aHdheSB3aWxsIGhhdmUgYSBwLXZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGF0IGlzIHRoZW4gY29ycmVjdGVkIGZvciBtdWx0aXBsZSBoeXBvdGhlc2lzIHRlc3RpbmcgKFtTdWJyYW1hbmlhbiBfZXQgYWwuXyAyMDA1XShodHRwczovL2RvaS5vcmcvMTAuMTA3My9wbmFzLjA1MDY1ODAxMDIpOyBbWXVdKGh0dHA6Ly95dWxhYi1zbXUudG9wL2NsdXN0ZXJQcm9maWxlci1ib29rL2NoYXB0ZXIyLmh0bWwjZ2VuZS1zZXQtZW5yaWNobWVudC1hbmFseXNpcykpLgoKVGhlIGltcGxlbWVudGF0aW9uIG9mIEdTRUEgd2UgdXNlIGluIGhlcmUgZXhhbXBsZXMgcmVxdWlyZXMgYSBnZW5lIGxpc3Qgb3JkZXJlZCBieSBzb21lIHN0YXRpc3RpYyBhbmQgaW5wdXQgZ2VuZSBzZXRzLgpXaGVuIHlvdSB1c2UgcHJldmlvdXNseSBjb21wdXRlZCBnZW5lLWxldmVsIHN0YXRpc3RpY3Mgd2l0aCBHU0VBLCBpdCBpcyBjYWxsZWQgR1NFQSBwcmUtcmFua2VkLgoKIyMgREVTZXEyIHJlc3VsdHMKCmBgYHtyIHJlYWRfaW5fbWFya2VycywgbGl2ZSA9IFRSVUV9CmRlc2VxX2RmIDwtIHJlYWRyOjpyZWFkX3RzdihpbnB1dF9maWxlKQpgYGAKCmBgYHtyIGRlc2VxX2hlYWR9CmhlYWQoZGVzZXFfZGYpCmBgYAoKVGhpcyBkYXRhIGZyYW1lIHVzZXMgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXJzLgpXZSdsbCBuZWVkIHRvIG1ha2Ugc3VyZSBvdXIgZ2VuZSBzZXRzIHVzZSB0aGUgc2FtZSBpZGVudGlmaWVycy4KTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIGZpcnN0IGZldyByb3dzIG9mIHRoZSBkYXRhIGZyYW1lIHRoYXQgY29udGFpbnMgdGhlIGhhbGxtYXJrIGdlbmUgc2V0cy4KCmBgYHtyIGhhbGxtYXJrX2hlYWQsIGxpdmUgPSBUUlVFfQpoZWFkKGhzX2hhbGxtYXJrc19kZikKYGBgCgpXZSBjYW4gc2VlIHRoYXQgdGhlIGdlbmUgc2V0cyBmcm9tIGBtc2lnZGJyYCBoYXZlIEVuc2VtYmwgZ2VuZSBpZGVudGlmaWVycyBhc3NvY2lhdGVkIHdpdGggdGhlbSwgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgY29udmVyc2lvbi4KSG93ZXZlciwgd2UnbGwgbmVlZCB0byBwYXNzIHRoZSBjb3JyZWN0IGNvbHVtbiB0byB0aGUgZnVuY3Rpb24gdGhhdCBydW5zIEdTRUEuCgpJZiB3ZSBuZWVkZWQgdG8gZG8gZ2VuZSBpZGVudGlmaWVyIGNvbnZlcnNpb24sIHdlIHdvdWxkIGxpa2VseSB1c2UgdGhlIGBBbm5vdGF0aW9uRGJpYCBwYWNrYWdlLgpZb3UgY2FuIHNlZSBhbiBleGFtcGxlIGluIHRoaXMgSGFydmFyZCBDaGFuIEJpb2luZm9ybWF0aWNzIENvcmUgVHJhaW5pbmcgbWF0ZXJpYWw6IDxodHRwczovL2hiY3RyYWluaW5nLmdpdGh1Yi5pby9ER0Vfd29ya3Nob3Bfc2FsbW9uX29ubGluZS9sZXNzb25zL0Fubm90YXRpb25EYmlfbGVzc29uLmh0bWw+CgpPbmUgZ29vZCB0aGluZyBhYm91dCBFbnNlbWJsIGdlbmUgaWRlbnRpZmllcnMgaXMgdGhhdCB0aGV5IGFyZSBsZXNzIGxpa2VseSB0byBiZSBkdXBsaWNhdGVkIHRoYW4sIGZvciBleGFtcGxlLCBnZW5lIHN5bWJvbHMuCihNdWx0aXBsZSBFbnNlbWJsIGdlbmUgaWRlbnRpZmllcnMgY2FuIG1hcCB0byB0aGUgc2FtZSBzeW1ib2wuKQoKVGhlIEdTRUEgYXBwcm9hY2ggcmVxdWlyZXMgb24gZGlzY3JpbWluYXRpbmcgYmV0d2VlbiBnZW5lcyB0aGF0IGFyZSBpbiBhIGdlbmUgc2V0IGFuZCB0aG9zZSB0aGF0IGFyZSBub3QuClByYWN0aWNhbGx5IHNwZWFraW5nLCBnZW5lIHNldHMgYXJlIGp1c3QgY29sbGVjdGlvbnMgb2YgZ2VuZSBpZGVudGlmaWVycyEKV2hlbiB0aGUgZnVuY3Rpb24gd2UgdXNlIGZvciBHU0VBIHByZS1yYW5rZWQgZ2V0cyBhIGxpc3Qgd2l0aCBkdXBsaWNhdGVkIGdlbmUgaWRlbnRpZmllcnMsIGl0IGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4KU28sIGxldCdzIGNoZWNrIGZvciBkdXBsaWNhdGVzIGluIHRoZSBkYXRhIGZyYW1lIG9mIERFU2VxMiByZXN1bHRzLgoKYGBge3IgY2hlY2tfZHVwbGljYXRlcywgbGl2ZSA9IFRSVUV9CmFueShkdXBsaWNhdGVkKGRlc2VxX2RmJGVuc2VtYmxfaWQpKQpgYGAKClRoZXJlIGFyZSBubyBkdXBsaWNhdGVzIGZvciB1cyB0byB3b3JyeSBhYm91dCEKCiMjIyBQcmUtcmFua2VkIGxpc3QKClRoZSBgR1NFQSgpYCBmdW5jdGlvbiB0YWtlcyBhIHByZS1yYW5rZWQgKHNvcnRlZCkgbmFtZWQgdmVjdG9yIG9mIHN0YXRpc3RpY3MsIHdoZXJlIHRoZSBuYW1lcyBpbiB0aGUgdmVjdG9yIGFyZSBnZW5lIGlkZW50aWZpZXJzLgpUaGlzIGlzIHN0ZXAgMSAtLSBnZW5lLWxldmVsIHN0YXRpc3RpY3MuCgpgYGB7ciBsZmNfdmVjdG9yfQpsZmNfdmVjdG9yIDwtIGRlc2VxX2RmIHw+CiAgIyBFeHRyYWN0IGEgdmVjdG9yIG9mIGBsb2cyRm9sZENoYW5nZWAgbmFtZWQgYnkgYGVuc2VtYmxfaWRgCiAgZHBseXI6OnB1bGwobG9nMkZvbGRDaGFuZ2UsIG5hbWUgPSBlbnNlbWJsX2lkKQpsZmNfdmVjdG9yIDwtIHNvcnQobGZjX3ZlY3RvciwgZGVjcmVhc2luZyA9IFRSVUUpCmBgYAoKTGV0J3MgbG9vayBhdCB0aGUgdG9wIHJhbmtlZCB2YWx1ZXMuCgpgYGB7ciBoZWFkX2xmYywgbGl2ZSA9IFRSVUV9CiMgTG9vayBhdCBmaXJzdCBlbnRyaWVzIG9mIHRoZSBsb2cgZm9sZCBjaGFuZ2UgdmVjdG9yCmhlYWQobGZjX3ZlY3RvcikKYGBgCgpBbmQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4KCmBgYHtyIHRhaWxfbGZjLCBsaXZlID0gVFJVRX0KIyBMb29rIGF0IHRoZSBsYXN0IGVudHJpZXMgb2YgdGhlIGxvZyBmb2xkIGNoYW5nZSB2ZWN0b3IKdGFpbChsZmNfdmVjdG9yKQpgYGAKCiMjIFJ1biBHU0VBCgpOb3cgZm9yIHRoZSBhbmFseXNpcyEKCldlIGNhbiB1c2UgdGhlIGBHU0VBKClgIGZ1bmN0aW9uIHRvIHBlcmZvcm0gR1NFQSB3aXRoIGFueSBnZW5lcmljIHNldCBvZiBnZW5lIHNldHMsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCBmdW5jdGlvbnMgZm9yIHVzaW5nIHNwZWNpZmljLCBjb21tb25seSB1c2VkIGdlbmUgc2V0cyAoZS5nLiwgYGdzZUtFR0coKWApLgoKYGBge3IgcnVuX2dzZWF9CmdzZWFfcmVzdWx0cyA8LSBHU0VBKGdlbmVMaXN0ID0gbGZjX3ZlY3RvciwgICMgb3JkZXJlZCByYW5rZWQgZ2VuZSBsaXN0CiAgICAgICAgICAgICAgICAgICAgIG1pbkdTU2l6ZSA9IDI1LCAgIyBtaW5pbXVtIGdlbmUgc2V0IHNpemUKICAgICAgICAgICAgICAgICAgICAgbWF4R1NTaXplID0gNTAwLCAgIyBtYXhpbXVtIGdlbmUgc2V0IHNldAogICAgICAgICAgICAgICAgICAgICBwdmFsdWVDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgICAgICBwQWRqdXN0TWV0aG9kID0gIkJIIiwgICMgY29ycmVjdGlvbiBmb3IgbXVsdGlwbGUgaHlwb3RoZXNpcyB0ZXN0aW5nCiAgICAgICAgICAgICAgICAgICAgIFRFUk0yR0VORSA9IGRwbHlyOjpzZWxlY3QoaHNfaGFsbG1hcmtzX2RmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zZW1ibF9nZW5lKSkgICMgcGFzcyB0aGUgY29ycmVjdCBpZGVudGlmaWVyIGNvbHVtbgpgYGAKTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIEdTRUEgcmVzdWx0cy4KCmBgYHtyIHZpZXdfZ3NlYSwgbGl2ZSA9IFRSVUUsIGV2YWwgPSBGQUxTRX0KVmlldyhnc2VhX3Jlc3VsdHNAcmVzdWx0IHw+CiAgICAgICBkcGx5cjo6YXJyYW5nZShkcGx5cjo6ZGVzYyhORVMpKQopCmBgYAoKTm9ybWFsaXplZCBlbnJpY2htZW50IHNjb3JlcyAoTkVTKSBhcmUgZW5yaWNobWVudCBzY29yZXMgdGhhdCBhcmUgc2NhbGVkIHRvIG1ha2UgZ2VuZSBzZXRzIHRoYXQgY29udGFpbiBkaWZmZXJlbnQgbnVtYmVyIG9mIGdlbmVzIGNvbXBhcmFibGUuCgpQYXRod2F5cyB3aXRoIHNpZ25pZmljYW50LCBoaWdobHkgcG9zaXRpdmUgTkVTIGFyZSBlbnJpY2hlZCBpbiBFUk1TIG15b2JsYXN0cywgd2hlcmVhcyBwYXRod2F5cyB3aXRoIHNpZ25pZmljYW50LCBoaWdobHkgbmVnYXRpdmUgTkVTIGFyZSBlbnJpY2hlZCBpbiBBUk1TIG15b2JsYXN0cy4KCkxldCdzIHdyaXRlIHRoZXNlIHJlc3VsdHMgdG8gZmlsZS4KCmBgYHtyIHdyaXRlX2dzZWF9CmdzZWFfcmVzdWx0c0ByZXN1bHQgfD4gcmVhZHI6OndyaXRlX3RzdihvdXRwdXRfZmlsZSkKYGBgCgojIyMgVmlzdWFsaXppbmcgR1NFQSByZXN1bHRzCgpXZSBjYW4gdmlzdWFsaXplIEdTRUEgcmVzdWx0cyBmb3IgaW5kaXZpZHVhbCBwYXRod2F5cyBvciBnZW5lIHNldHMgdXNpbmcgYGVucmljaHBsb3Q6OmdzZWFwbG90KClgLgpMZXQncyB0YWtlIGEgbG9vayBhdCAzIGRpZmZlcmVudCBwYXRod2F5cyAtLSBvbmUgd2l0aCBhIGhpZ2hseSBwb3NpdGl2ZSBORVMsIG9uZSB3aXRoIGEgaGlnaGx5IG5lZ2F0aXZlIE5FUywgYW5kIG9uZSB0aGF0IHdhcyBub3QgYSBzaWduaWZpY2FudCByZXN1bHQgLS0gdG8gZ2V0IG1vcmUgaW5zaWdodCBpbnRvIGhvdyBFUyBhcmUgY2FsY3VsYXRlZC4KCiMjIyMgSGlnaGx5IFBvc2l0aXZlIE5FUwoKTGV0J3MgdGFrZSBsb29rIGF0IGEgcGF0aHdheSB3aXRoIGEgaGlnaGx5IHBvc2l0aXZlIE5FUyAoYEhBTExNQVJLX01ZQ19UQVJHRVRTX1YyYCkgdXNpbmcgYSBHU0VBIHBsb3QuCgpgYGB7ciBoaWdobHlfcG9zfQplbnJpY2hwbG90Ojpnc2VhcGxvdChnc2VhX3Jlc3VsdHMsCiAgICAgICAgICAgICAgICAgICAgIGdlbmVTZXRJRCA9ICJIQUxMTUFSS19NWUNfVEFSR0VUU19WMiIsCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkhBTExNQVJLX01ZQ19UQVJHRVRTX1YyIiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IubGluZSA9ICIjMDA2NkZGIikKYGBgCgpOb3RpY2UgaG93IHRoZSBnZW5lcyB0aGF0IGFyZSBpbiB0aGUgZ2VuZSBzZXQsIGluZGljYXRlZCBieSB0aGUgYmxhY2sgYmFycywgdGVuZCB0byBiZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBncmFwaCBpbmRpY2F0aW5nIHRoYXQgdGhleSBoYXZlIHBvc2l0aXZlIGdlbmUtbGV2ZWwgc2NvcmVzLgoKIyMjIyBIaWdobHkgTmVnYXRpdmUgTkVTCgpUaGUgZ2VuZSBzZXQgYEhBTExNQVJLX01ZT0dFTkVTSVNgIGhhZCBhIGhpZ2hseSBuZWdhdGl2ZSBORVMuCgpgYGB7ciBoaWdobHlfbmVnfQplbnJpY2hwbG90Ojpnc2VhcGxvdChnc2VhX3Jlc3VsdHMsCiAgICAgICAgICAgICAgICAgICAgIGdlbmVTZXRJRCA9ICJIQUxMTUFSS19NWU9HRU5FU0lTIiwKICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSEFMTE1BUktfTVlPR0VORVNJUyIsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yLmxpbmUgPSAiIzAwNjZGRiIpCmBgYAoKVGhpcyBnZW5lIHNldCBzaG93cyB0aGUgb3Bwb3NpdGUgcGF0dGVybiAtLSBnZW5lcyBpbiB0aGUgcGF0aHdheSB0ZW5kIHRvIGJlIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBncmFwaC4KCiMjIyMgQSBub24tc2lnbmlmaWNhbnQgcmVzdWx0CgpUaGUgYEByZXN1bHRzYCBzbG90IHdpbGwgb25seSBzaG93IGdlbmUgc2V0cyB0aGF0IHBhc3MgdGhlIGBwdmFsdWVDdXRvZmZgIHRocmVzaG9sZCB3ZSBzdXBwbGllZCB0byBgR1NFQSgpYCwgYnV0IHdlIGNhbiBwbG90IGFueSBnZW5lIHNldCBzbyBsb25nIGFzIHdlIGtub3cgaXRzIG5hbWUuCkxldCdzIGxvb2sgYXQgYEhBTExNQVJLX1A1M19QQVRIV0FZYCwgd2hpY2ggd2FzIG5vdCBpbiB0aGUgcmVzdWx0cyB3ZSB2aWV3ZWQgZWFybGllci4KCmBgYHtyIHA1MywgbGl2ZSA9IFRSVUV9CmVucmljaHBsb3Q6OmdzZWFwbG90KGdzZWFfcmVzdWx0cywKICAgICAgICAgICAgICAgICAgICAgZ2VuZVNldElEID0gIkhBTExNQVJLX1A1M19QQVRIV0FZIiwKICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiSEFMTE1BUktfUDUzX1BBVEhXQVkiLAogICAgICAgICAgICAgICAgICAgICBjb2xvci5saW5lID0gIiMwMDY2RkYiKQpgYGAKCkdlbmVzIGluIHRoZSBwYXRod2F5IGFyZSBkaXN0cmlidXRlZCBtb3JlIGV2ZW5seSB0aHJvdWdob3V0IHRoZSByYW5rZWQgbGlzdCwgcmVzdWx0aW5nIGluIGEgbW9yZSAibWlkZGxpbmciIHNjb3JlLgoKKk5vdGU6IFRoZSBwbG90cyByZXR1cm5lZCBieSBgZW5yaWNocGxvdDo6Z3NlYXBsb3RgIGFyZSBnZ3Bsb3RzLCBzbyB3ZSBjb3VsZCB1c2UgYGdncGxvdDI6Omdnc2F2ZSgpYCB0byBzYXZlIHRoZW0gdG8gZmlsZSBpZiB3ZSB3YW50ZWQgdG8uKgoKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7ciBzZXNzaW9uX2luZm99CnNlc3Npb25JbmZvKCkKYGBgCg==
    +
    LS0tCnRpdGxlOiAiUGF0aHdheSBhbmFseXNpczogR2VuZSBTZXQgRW5yaWNobWVudCBBbmFseXNpcyAoR1NFQSkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKYXV0aG9yOiBDQ0RMIGZvciBBTFNGCmRhdGU6IDIwMjQKLS0tCgojIyBPYmplY3RpdmVzCgpUaGlzIG5vdGVib29rIHdpbGwgZGVtb25zdHJhdGUgaG93IHRvOgoKLSBQcmVwYXJlIHRhYnVsYXIgZGF0YSBvZiBnZW5lLWxldmVsIHN0YXRpc3RpY3MgZm9yIHVzZSB3aXRoIEdlbmUgU2V0IEVucmljaG1lbnQgQW5hbHlzaXMgKEdTRUEpCi0gQWNjZXNzIFtNb2xlY3VsYXIgU2lnbmF0dXJlcyBEYXRhYmFzZSBnZW5lIHNldCBjb2xsZWN0aW9uc10oaHR0cHM6Ly93d3cuZ3NlYS1tc2lnZGIub3JnL2dzZWEvbXNpZ2RiL2NvbGxlY3Rpb25zLmpzcCkgdmlhIHRoZSBgbXNpZ2RicmAgcGFja2FnZQotIFBlcmZvcm0gR1NFQSB3aXRoIHRoZSBgY2x1c3RlclByb2ZpbGVyYCBwYWNrYWdlCi0gVmlzdWFsaXplIEdTRUEgcmVzdWx0cyB3aXRoIHRoZSBgZW5yaWNocGxvdGAgcGFja2FnZQoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBhbmFseXplIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiByZXN1bHRzIGZyb20gdGhlIGxhc3Qgbm90ZWJvb2suCgpHU0VBIGlzIGEgZnVuY3Rpb25hbCBjbGFzcyBzY29yaW5nIChGQ1MpIGFwcHJvYWNoIHRvIHBhdGh3YXkgYW5hbHlzaXMgdGhhdCB3YXMgZmlyc3QgaW50cm9kdWNlZCBpbiBbU3VicmFtYW5pYW4gX2V0IGFsLl8gKDIwMDUpXShodHRwczovL2RvaS5vcmcvMTAuMTA3My9wbmFzLjA1MDY1ODAxMDIpLgpUaGUgcmF0aW9uYWxlIGJlaGluZCBGQ1MgYXBwcm9hY2hlcyBpcyB0aGF0IHNtYWxsIGNoYW5nZXMgaW4gaW5kaXZpZHVhbCBnZW5lcyB0aGF0IHBhcnRpY2lwYXRlIGluIHRoZSBzYW1lIGJpb2xvZ2ljYWwgcHJvY2VzcyBvciBwYXRod2F5IGNhbiBiZSBzaWduaWZpY2FudCBhbmQgb2YgYmlvbG9naWNhbCBpbnRlcmVzdC4KClRoZXJlIGFyZSAzIGdlbmVyYWwgc3RlcHMgaW4gRkNTIG1ldGhvZHMgKFtLaGF0cmkgX2V0IGFsLl8gMjAxMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjEzNzEvam91cm5hbC5wY2JpLjEwMDIzNzUpKToKCjEuIENhbGN1bGF0ZSBhIGdlbmUtbGV2ZWwgc3RhdGlzdGljIChoZXJlLCB3ZSdsbCB1c2UgdGhlIHN1bW1hcnkgbG9nIGZvbGQgY2hhbmdlcyBpbiBvdXIgREVTZXEyIHJlc3VsdHMpCjIuIEFnZ3JlZ2F0ZSBnZW5lLWxldmVsIHN0YXRpc3RpY3MgaW50byBhIHBhdGh3YXktbGV2ZWwgc3RhdGlzdGljCjMuIEFzc2VzcyB0aGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZSBwYXRod2F5LWxldmVsIHN0YXRpc3RpYwoKIyMjIyBPdGhlciByZXNvdXJjZXMKCiogRm9yIGFub3RoZXIgZXhhbXBsZSB1c2luZyBgY2x1c3RlclByb2ZpbGVyYCBmb3IgR1NFQSwgc2VlIFtfSW50cm8gdG8gREdFOiBGdW5jdGlvbmFsIEFuYWx5c2lzLl8gZnJvbSBIYXJ2YXJkIENoYW4gQmlvaW5mb3JtYXRpY3MgQ29yZSBUcmFpbmluZy5dKGh0dHBzOi8vaGJjdHJhaW5pbmcuZ2l0aHViLmlvL1RyYWluaW5nLW1vZHVsZXMvREdFLWZ1bmN0aW9uYWwtYW5hbHlzaXMvbGVzc29ucy8wMl9mdW5jdGlvbmFsX2FuYWx5c2lzLmh0bWwpCiogVGhlIHdheSB3ZSdsbCB1c2UgYGNsdXN0ZXJQcm9maWxlcmAgaGVyZSB1c2VzIGBmZ3NlYWAgKEZhc3QgR2VuZSBTZXQgRW5yaWNobWVudCBBbmFseXNpcykgdW5kZXIgdGhlIGhvb2QuCllvdSBjYW4gcmVhZCBtb3JlIGFib3V0IGBmZ3NlYWAgaW4gW0tvcm90a2V2aWNoIF9ldCBhbC5fICgyMDIxKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExMDEvMDYwMDEyKS4KKiBTZWUgdGhlIFtyZWZpbmUuYmlvIGV4YW1wbGVzIGZvciAiR2VuZSBzZXQgZW5yaWNobWVudCBhbmFseXNpcyAtIFJOQS1zZXEiXShodHRwczovL2FsZXhzbGVtb25hZGUuZ2l0aHViLmlvL3JlZmluZWJpby1leGFtcGxlcy8wMy1ybmFzZXEvcGF0aHdheS1hbmFseXNpc19ybmFzZXFfMDJfZ3NlYS5odG1sKSBmcm9tIHdoaWNoIHRoaXMgbWF0ZXJpYWwgaGFzIGJlZW4gYWRhcHRlZC4KCiMjIFNldCB1cAoKIyMjIExpYnJhcmllcwoKYGBge3Igc2V0dXB9CiMgc2V0IHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgyMDI1KQoKIyBQYWNrYWdlIHRvIHJ1biBHU0VBCmxpYnJhcnkoY2x1c3RlclByb2ZpbGVyKQojIFBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgTVNpZ0RCIGdlbmUgc2V0cyBpbiB0aWR5IGZvcm1hdApsaWJyYXJ5KG1zaWdkYnIpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBGaWxlcwoKIyMjIyBEaXJlY3RvcmllcwoKYGBge3IgY3JlYXRlX2Rpcn0KIyBXZSdsbCB1c2UgdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIHJlc3VsdHMgYXMgR1NFQSBpbnB1dApybXNfYW5hbHlzaXNfZGlyIDwtIGZpbGUucGF0aCgiYW5hbHlzaXMiLCAicm1zIikKCiMgV2UnbGwgY3JlYXRlIGEgZGlyZWN0b3J5IHRvIHNwZWNpZmljYWxseSBob2xkIHRoZSBwYXRod2F5IHJlc3VsdHMgaWYgaXQgZG9lc24ndAojIGV4aXN0IHlldApyZXN1bHRzX2RpciA8LSBmaWxlLnBhdGgocm1zX2FuYWx5c2lzX2RpciwgInBhdGh3YXktYW5hbHlzaXMiKQpmczo6ZGlyX2NyZWF0ZShyZXN1bHRzX2RpcikKYGBgCgojIyMjIElucHV0IGZpbGVzCgoKYGBge3IgaW5wdXRfZmlsZXN9CmlucHV0X2ZpbGUgPC0gZmlsZS5wYXRoKHJtc19hbmFseXNpc19kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJybXNfbXlvYmxhc3RfZGVzZXFfcmVzdWx0cy50c3YiKQpgYGAKCiMjIyMgT3V0cHV0IGZpbGVzCgpXZSdsbCBzYXZlIG91ciB0YWJsZSBvZiBHU0VBIHJlc3VsdHMgYXMgYSBUU1YuCgpgYGB7ciBvdXRwdXRfZmlsZXN9Cm91dHB1dF9maWxlIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICJybXNfbXlvYmxhc3RfZ3NlYV9yZXN1bHRzLnRzdiIpCmBgYAoKIyMgR2VuZSBzZXRzCgpXZSB3aWxsIHVzZSBnZW5lIHNldHMgZnJvbSB0aGUgW01vbGVjdWxhciBTaWduYXR1cmVzIERhdGFiYXNlIChNU2lnREIpXShodHRwczovL3d3dy5nc2VhLW1zaWdkYi5vcmcvZ3NlYS9tc2lnZGIvaW5kZXguanNwKSBmcm9tIHRoZSBCcm9hZCBJbnN0aXR1dGUgKFtTdWJyYW1hbmlhbiwgVGFtYXlvICpldCBhbC4qIDIwMDVdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDczL3BuYXMuMDUwNjU4MDEwMikpLgpUaGUgW2Btc2lnZGJyYF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL21zaWdkYnIvaW5kZXguaHRtbCkgcGFja2FnZSBjb250YWlucyBNU2lnREIgZGF0YXNldHMgYWxyZWFkeSBpbiB0aGUgdGlkeSBmb3JtYXQgcmVxdWlyZWQgYnkgYGNsdXN0ZXJQcm9maWxlcmAgYW5kIHN1cHBvcnRzIG11bHRpcGxlIG9yZ2FuaXNtcy4KCkxldCdzIHRha2UgYSBsb29rIGF0IHdoYXQgb3JnYW5pc21zIHRoZSBwYWNrYWdlIHN1cHBvcnRzLgoKYGBge3Igc2hvd19zcGVjaWVzfQptc2lnZGJyX3NwZWNpZXMoKQpgYGAKCk1TaWdEQiBjb250YWlucyA4IGRpZmZlcmVudCBnZW5lIHNldCBjb2xsZWN0aW9ucy4KCiAgICBIOiBoYWxsbWFyayBnZW5lIHNldHMKICAgIEMxOiBwb3NpdGlvbmFsIGdlbmUgc2V0cwogICAgQzI6IGN1cmF0ZWQgZ2VuZSBzZXRzCiAgICBDMzogbW90aWYgZ2VuZSBzZXRzCiAgICBDNDogY29tcHV0YXRpb25hbCBnZW5lIHNldHMKICAgIEM1OiBHTyBnZW5lIHNldHMKICAgIEM2OiBvbmNvZ2VuaWMgc2lnbmF0dXJlcwogICAgQzc6IGltbXVub2xvZ2ljIHNpZ25hdHVyZXMKCldlJ2xsIHVzZSB0aGUgSGFsbG1hcmsgY29sbGVjdGlvbiBmb3IgR1NFQS4KSGVyZSdzIGFuIGV4Y2VycHQgb2YgdGhlIFtjb2xsZWN0aW9uIGRlc2NyaXB0aW9uXShodHRwczovL3d3dy5nc2VhLW1zaWdkYi5vcmcvZ3NlYS9tc2lnZGIvY29sbGVjdGlvbl9kZXRhaWxzLmpzcCNIKToKCj4gSGFsbG1hcmsgZ2VuZSBzZXRzIHN1bW1hcml6ZSBhbmQgcmVwcmVzZW50IHNwZWNpZmljIHdlbGwtZGVmaW5lZCBiaW9sb2dpY2FsIHN0YXRlcyBvciBwcm9jZXNzZXMgYW5kIGRpc3BsYXkgY29oZXJlbnQgZXhwcmVzc2lvbi4gVGhlc2UgZ2VuZSBzZXRzIHdlcmUgZ2VuZXJhdGVkIGJ5IGEgY29tcHV0YXRpb25hbCBtZXRob2RvbG9neSBiYXNlZCBvbiBpZGVudGlmeWluZyBnZW5lIHNldCBvdmVybGFwcyBhbmQgcmV0YWluaW5nIGdlbmVzIHRoYXQgZGlzcGxheSBjb29yZGluYXRlIGV4cHJlc3Npb24uIFRoZSBoYWxsbWFya3MgcmVkdWNlIG5vaXNlIGFuZCByZWR1bmRhbmN5IGFuZCBwcm92aWRlIGEgYmV0dGVyIGRlbGluZWF0ZWQgYmlvbG9naWNhbCBzcGFjZSBmb3IgR1NFQS4KCk5vdGFibHksIHRoZXJlIGFyZSBvbmx5IDUwIGdlbmUgc2V0cyBpbmNsdWRlZCBpbiB0aGlzIGNvbGxlY3Rpb24uClRoZSBmZXdlciBnZW5lIHNldHMgd2UgdGVzdCwgdGhlIGxvd2VyIG91ciBtdWx0aXBsZSBoeXBvdGhlc2lzIHRlc3RpbmcgYnVyZGVuLgoKV2UgY2FuIHJldHJpZXZlIG9ubHkgdGhlIEhhbGxtYXJrIGdlbmUgc2V0cyBieSBzcGVjaWZ5aW5nIGBjYXRlZ29yeSA9ICJIImAgdG8gdGhlIGBtc2lnZGJyKClgIGZ1bmN0aW9uLgoKYGBge3IgaW1tdW5vbG9naWNfc2V0cywgbGl2ZSA9IFRSVUV9CmhzX2hhbGxtYXJrc19kZiA8LSBtc2lnZGJyKHNwZWNpZXMgPSAiSG9tbyBzYXBpZW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkgPSAiSCIpCmBgYAoKIyMgR2VuZSBTZXQgRW5yaWNobWVudCBBbmFseXNpcwoKX0FkYXB0ZWQgZnJvbSBbcmVmaW5lLmJpbyBleGFtcGxlc10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvcmVmaW5lYmlvLWV4YW1wbGVzL2Jsb2IvMzNjZGVmZjY2ZDU3ZjlmZThlZTRmY2I1MTU2YWVhNGFjMmRjZTA3Zi8wMy1ybmFzZXEvcGF0aHdheS1hbmFseXNpc19ybmFzZXFfMDJfZ3NlYS5SbWQpXwoKIVtdKGRpYWdyYW1zL3N1YnJhbWFuaWFuX2ZpZzEuanBnKQoKKipGaWd1cmUgMS4gW1N1YnJhbWFuaWFuIF9ldCBhbC5fICgyMDA1KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwNzMvcG5hcy4wNTA2NTgwMTAyKS4qKgoKR1NFQSBjYWxjdWxhdGVzIGEgcGF0aHdheS1sZXZlbCBtZXRyaWMsIGNhbGxlZCBhbiBlbnJpY2htZW50IHNjb3JlIChzb21ldGltZXMgYWJicmV2aWF0ZWQgYXMgRVMpLCBieSByYW5raW5nIGdlbmVzIGJ5IGEgZ2VuZS1sZXZlbCBzdGF0aXN0aWMuClRoaXMgc2NvcmUgcmVmbGVjdHMgd2hldGhlciBvciBub3QgYSBnZW5lIHNldCBvciBwYXRod2F5IGlzIG92ZXItcmVwcmVzZW50ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGdlbmUgcmFua2luZ3MgKFtTdWJyYW1hbmlhbiBfZXQgYWwuXyAyMDA1XShodHRwczovL2RvaS5vcmcvMTAuMTA3My9wbmFzLjA1MDY1ODAxMDIpOyBbWXVdKGh0dHA6Ly95dWxhYi1zbXUudG9wL2NsdXN0ZXJQcm9maWxlci1ib29rL2NoYXB0ZXIyLmh0bWwjZ2VuZS1zZXQtZW5yaWNobWVudC1hbmFseXNpcykpCgpTcGVjaWZpY2FsbHksIGFsbCBnZW5lcyBhcmUgcmFua2VkIGZyb20gbW9zdCBwb3NpdGl2ZSB0byBtb3N0IG5lZ2F0aXZlIGJhc2VkIG9uIHRoZWlyIHN0YXRpc3RpYyBhbmQgYSBydW5uaW5nIHN1bSBpcyBjYWxjdWxhdGVkOgpTdGFydGluZyB3aXRoIHRoZSBtb3N0IGhpZ2hseSByYW5rZWQgZ2VuZXMsIHRoZSBydW5uaW5nIHN1bSBpbmNyZWFzZXMgZm9yIGVhY2ggZ2VuZSBpbiB0aGUgcGF0aHdheSBhbmQgZGVjcmVhc2VzIGZvciBlYWNoIGdlbmUgbm90IGluIHRoZSBwYXRod2F5LgpUaGUgZW5yaWNobWVudCBzY29yZSBmb3IgYSBwYXRod2F5IGlzIHRoZSBydW5uaW5nIHN1bSdzIG1heGltdW0gZGV2aWF0aW9uIGZyb20gemVyby4KR1NFQSBhbHNvIGFzc2Vzc2VzIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBvZiB0aGUgc2NvcmVzIGZvciBlYWNoIHBhdGh3YXkgdGhyb3VnaCBwZXJtdXRhdGlvbiB0ZXN0aW5nLgpBcyBhIHJlc3VsdCwgZWFjaCBpbnB1dCBwYXRod2F5IHdpbGwgaGF2ZSBhIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0IHRoYXQgaXMgdGhlbiBjb3JyZWN0ZWQgZm9yIG11bHRpcGxlIGh5cG90aGVzaXMgdGVzdGluZyAoW1N1YnJhbWFuaWFuIF9ldCBhbC5fIDIwMDVdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDczL3BuYXMuMDUwNjU4MDEwMik7IFtZdV0oaHR0cDovL3l1bGFiLXNtdS50b3AvY2x1c3RlclByb2ZpbGVyLWJvb2svY2hhcHRlcjIuaHRtbCNnZW5lLXNldC1lbnJpY2htZW50LWFuYWx5c2lzKSkuCgpUaGUgaW1wbGVtZW50YXRpb24gb2YgR1NFQSB3ZSB1c2UgaGVyZSByZXF1aXJlcyBhIGdlbmUgbGlzdCBvcmRlcmVkIGJ5IHNvbWUgc3RhdGlzdGljIGFuZCBpbnB1dCBnZW5lIHNldHMuCldoZW4geW91IHVzZSBwcmV2aW91c2x5IGNvbXB1dGVkIGdlbmUtbGV2ZWwgc3RhdGlzdGljcyB3aXRoIEdTRUEsIGl0IGlzIGNhbGxlZCBHU0VBIHByZS1yYW5rZWQuCgojIyBERVNlcTIgcmVzdWx0cwoKYGBge3IgcmVhZF9pbl9tYXJrZXJzLCBsaXZlID0gVFJVRX0KZGVzZXFfZGYgPC0gcmVhZHI6OnJlYWRfdHN2KGlucHV0X2ZpbGUpCmBgYAoKYGBge3IgZGVzZXFfaGVhZH0KaGVhZChkZXNlcV9kZikKYGBgCgpUaGlzIGRhdGEgZnJhbWUgdXNlcyBFbnNlbWJsIGdlbmUgaWRlbnRpZmllcnMuCldlJ2xsIG5lZWQgdG8gbWFrZSBzdXJlIG91ciBnZW5lIHNldHMgdXNlIHRoZSBzYW1lIGlkZW50aWZpZXJzLgpMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgZmlyc3QgZmV3IHJvd3Mgb2YgdGhlIGRhdGEgZnJhbWUgdGhhdCBjb250YWlucyB0aGUgaGFsbG1hcmsgZ2VuZSBzZXRzLgoKYGBge3IgaGFsbG1hcmtfaGVhZCwgbGl2ZSA9IFRSVUV9CmhlYWQoaHNfaGFsbG1hcmtzX2RmKQpgYGAKCldlIGNhbiBzZWUgdGhhdCB0aGUgZ2VuZSBzZXRzIGZyb20gYG1zaWdkYnJgIGhhdmUgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBjb252ZXJzaW9uLgpIb3dldmVyLCB3ZSdsbCBuZWVkIHRvIHBhc3MgdGhlIGNvcnJlY3QgY29sdW1uIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHJ1bnMgR1NFQS4KCklmIHdlIG5lZWRlZCB0byBkbyBnZW5lIGlkZW50aWZpZXIgY29udmVyc2lvbiwgd2Ugd291bGQgbGlrZWx5IHVzZSB0aGUgYEFubm90YXRpb25EYmlgIHBhY2thZ2UuCllvdSBjYW4gc2VlIGFuIGV4YW1wbGUgaW4gdGhpcyBIYXJ2YXJkIENoYW4gQmlvaW5mb3JtYXRpY3MgQ29yZSBUcmFpbmluZyBtYXRlcmlhbDogPGh0dHBzOi8vaGJjdHJhaW5pbmcuZ2l0aHViLmlvL0RHRV93b3Jrc2hvcF9zYWxtb25fb25saW5lL2xlc3NvbnMvQW5ub3RhdGlvbkRiaV9sZXNzb24uaHRtbD4KCk9uZSBnb29kIHRoaW5nIGFib3V0IEVuc2VtYmwgZ2VuZSBpZGVudGlmaWVycyBpcyB0aGF0IHRoZXkgYXJlIGxlc3MgbGlrZWx5IHRvIGJlIGR1cGxpY2F0ZWQgdGhhbiwgZm9yIGV4YW1wbGUsIGdlbmUgc3ltYm9scy4KKE11bHRpcGxlIEVuc2VtYmwgZ2VuZSBpZGVudGlmaWVycyBjYW4gbWFwIHRvIHRoZSBzYW1lIHN5bWJvbC4pCgpUaGUgR1NFQSBhcHByb2FjaCByZXF1aXJlcyBkaXNjcmltaW5hdGluZyBiZXR3ZWVuIGdlbmVzIHRoYXQgYXJlIGluIGEgZ2VuZSBzZXQgYW5kIHRob3NlIHRoYXQgYXJlIG5vdC4KUHJhY3RpY2FsbHkgc3BlYWtpbmcsIGdlbmUgc2V0cyBhcmUganVzdCBjb2xsZWN0aW9ucyBvZiBnZW5lIGlkZW50aWZpZXJzIQpXaGVuIHRoZSBmdW5jdGlvbiB3ZSB1c2UgZm9yIEdTRUEgcHJlLXJhbmtlZCBnZXRzIGEgbGlzdCB3aXRoIGR1cGxpY2F0ZWQgZ2VuZSBpZGVudGlmaWVycywgaXQgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLgpTbywgbGV0J3MgY2hlY2sgZm9yIGR1cGxpY2F0ZXMgaW4gdGhlIGRhdGEgZnJhbWUgb2YgREVTZXEyIHJlc3VsdHMuCgpgYGB7ciBjaGVja19kdXBsaWNhdGVzLCBsaXZlID0gVFJVRX0KYW55KGR1cGxpY2F0ZWQoZGVzZXFfZGYkZW5zZW1ibF9pZCkpCmBgYAoKVGhlcmUgYXJlIG5vIGR1cGxpY2F0ZXMgZm9yIHVzIHRvIHdvcnJ5IGFib3V0IQoKIyMjIFByZS1yYW5rZWQgbGlzdAoKVGhlIGBHU0VBKClgIGZ1bmN0aW9uIHRha2VzIGEgcHJlLXJhbmtlZCAoc29ydGVkKSBuYW1lZCB2ZWN0b3Igb2Ygc3RhdGlzdGljcywgd2hlcmUgdGhlIG5hbWVzIGluIHRoZSB2ZWN0b3IgYXJlIGdlbmUgaWRlbnRpZmllcnMuClRoaXMgaXMgc3RlcCAxIC0tIGdlbmUtbGV2ZWwgc3RhdGlzdGljcy4KCmBgYHtyIGxmY192ZWN0b3J9CmxmY192ZWN0b3IgPC0gZGVzZXFfZGYgfD4KICAjIEV4dHJhY3QgYSB2ZWN0b3Igb2YgYGxvZzJGb2xkQ2hhbmdlYCBuYW1lZCBieSBgZW5zZW1ibF9pZGAKICBkcGx5cjo6cHVsbChsb2cyRm9sZENoYW5nZSwgbmFtZSA9IGVuc2VtYmxfaWQpCmxmY192ZWN0b3IgPC0gc29ydChsZmNfdmVjdG9yLCBkZWNyZWFzaW5nID0gVFJVRSkKYGBgCgpMZXQncyBsb29rIGF0IHRoZSB0b3AgcmFua2VkIHZhbHVlcy4KCmBgYHtyIGhlYWRfbGZjLCBsaXZlID0gVFJVRX0KIyBMb29rIGF0IGZpcnN0IGVudHJpZXMgb2YgdGhlIGxvZyBmb2xkIGNoYW5nZSB2ZWN0b3IKaGVhZChsZmNfdmVjdG9yKQpgYGAKCkFuZCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LgoKYGBge3IgdGFpbF9sZmMsIGxpdmUgPSBUUlVFfQojIExvb2sgYXQgdGhlIGxhc3QgZW50cmllcyBvZiB0aGUgbG9nIGZvbGQgY2hhbmdlIHZlY3Rvcgp0YWlsKGxmY192ZWN0b3IpCmBgYAoKIyMgUnVuIEdTRUEKCk5vdyBmb3IgdGhlIGFuYWx5c2lzIQoKV2UgY2FuIHVzZSB0aGUgYEdTRUEoKWAgZnVuY3Rpb24gdG8gcGVyZm9ybSBHU0VBIHdpdGggYW55IGdlbmVyaWMgc2V0IG9mIGdlbmUgc2V0cywgYnV0IHRoZXJlIGFyZSBzZXZlcmFsIGZ1bmN0aW9ucyBmb3IgdXNpbmcgc3BlY2lmaWMsIGNvbW1vbmx5IHVzZWQgZ2VuZSBzZXRzIChlLmcuLCBgZ3NlS0VHRygpYCkuCgpgYGB7ciBydW5fZ3NlYX0KZ3NlYV9yZXN1bHRzIDwtIEdTRUEoZ2VuZUxpc3QgPSBsZmNfdmVjdG9yLCAgIyBvcmRlcmVkIHJhbmtlZCBnZW5lIGxpc3QKICAgICAgICAgICAgICAgICAgICAgbWluR1NTaXplID0gMjUsICAjIG1pbmltdW0gZ2VuZSBzZXQgc2l6ZQogICAgICAgICAgICAgICAgICAgICBtYXhHU1NpemUgPSA1MDAsICAjIG1heGltdW0gZ2VuZSBzZXQgc2V0CiAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMDUsCiAgICAgICAgICAgICAgICAgICAgIHBBZGp1c3RNZXRob2QgPSAiQkgiLCAgIyBjb3JyZWN0aW9uIGZvciBtdWx0aXBsZSBoeXBvdGhlc2lzIHRlc3RpbmcKICAgICAgICAgICAgICAgICAgICAgVEVSTTJHRU5FID0gZHBseXI6OnNlbGVjdChoc19oYWxsbWFya3NfZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmUpKSAgIyBwYXNzIHRoZSBjb3JyZWN0IGlkZW50aWZpZXIgY29sdW1uCmBgYApMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgR1NFQSByZXN1bHRzLgoKYGBge3Igdmlld19nc2VhLCBsaXZlID0gVFJVRSwgZXZhbCA9IEZBTFNFfQpWaWV3KAogIGdzZWFfcmVzdWx0c0ByZXN1bHQgfD4KICAgIGRwbHlyOjphcnJhbmdlKGRwbHlyOjpkZXNjKE5FUykpCikKYGBgCgpOb3JtYWxpemVkIGVucmljaG1lbnQgc2NvcmVzIChORVMpIGFyZSBlbnJpY2htZW50IHNjb3JlcyB0aGF0IGFyZSBzY2FsZWQgdG8gbWFrZSBnZW5lIHNldHMgdGhhdCBjb250YWluIGRpZmZlcmVudCBudW1iZXIgb2YgZ2VuZXMgY29tcGFyYWJsZS4KClBhdGh3YXlzIHdpdGggc2lnbmlmaWNhbnQsIGhpZ2hseSBwb3NpdGl2ZSBORVMgYXJlIGVucmljaGVkIGluIEVSTVMgbXlvYmxhc3RzLCB3aGVyZWFzIHBhdGh3YXlzIHdpdGggc2lnbmlmaWNhbnQsIGhpZ2hseSBuZWdhdGl2ZSBORVMgYXJlIGVucmljaGVkIGluIEFSTVMgbXlvYmxhc3RzLgoKTGV0J3Mgd3JpdGUgdGhlc2UgcmVzdWx0cyB0byBhIGZpbGUuCgpgYGB7ciB3cml0ZV9nc2VhfQpnc2VhX3Jlc3VsdHNAcmVzdWx0IHw+IAogIHJlYWRyOjp3cml0ZV90c3Yob3V0cHV0X2ZpbGUpCmBgYAoKIyMjIFZpc3VhbGl6aW5nIEdTRUEgcmVzdWx0cwoKV2UgY2FuIHZpc3VhbGl6ZSBHU0VBIHJlc3VsdHMgZm9yIGluZGl2aWR1YWwgcGF0aHdheXMgb3IgZ2VuZSBzZXRzIHVzaW5nIGBlbnJpY2hwbG90Ojpnc2VhcGxvdCgpYC4KTGV0J3MgdGFrZSBhIGxvb2sgYXQgMyBkaWZmZXJlbnQgcGF0aHdheXMgLS0gb25lIHdpdGggYSBoaWdobHkgcG9zaXRpdmUgTkVTLCBvbmUgd2l0aCBhIGhpZ2hseSBuZWdhdGl2ZSBORVMsIGFuZCBvbmUgdGhhdCB3YXMgbm90IGEgc2lnbmlmaWNhbnQgcmVzdWx0IC0tIHRvIGdldCBtb3JlIGluc2lnaHQgaW50byBob3cgRVMgYXJlIGNhbGN1bGF0ZWQuCgojIyMjIEhpZ2hseSBQb3NpdGl2ZSBORVMKCkxldCdzIHRha2UgbG9vayBhdCBhIHBhdGh3YXkgd2l0aCBhIGhpZ2hseSBwb3NpdGl2ZSBORVMgKGBIQUxMTUFSS19NWUNfVEFSR0VUU19WMmApIHVzaW5nIGEgR1NFQSBwbG90LgoKYGBge3IgaGlnaGx5X3Bvc30KZW5yaWNocGxvdDo6Z3NlYXBsb3QoZ3NlYV9yZXN1bHRzLAogICAgICAgICAgICAgICAgICAgICBnZW5lU2V0SUQgPSAiSEFMTE1BUktfTVlDX1RBUkdFVFNfVjIiLAogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJIQUxMTUFSS19NWUNfVEFSR0VUU19WMiIsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yLmxpbmUgPSAiIzAwNjZGRiIpCmBgYAoKTm90aWNlIGhvdyB0aGUgZ2VuZXMgdGhhdCBhcmUgaW4gdGhlIGdlbmUgc2V0LCBpbmRpY2F0ZWQgYnkgdGhlIGJsYWNrIGJhcnMsIHRlbmQgdG8gYmUgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZ3JhcGggaW5kaWNhdGluZyB0aGF0IHRoZXkgaGF2ZSBwb3NpdGl2ZSBnZW5lLWxldmVsIHNjb3Jlcy4KCiMjIyMgSGlnaGx5IE5lZ2F0aXZlIE5FUwoKVGhlIGdlbmUgc2V0IGBIQUxMTUFSS19NWU9HRU5FU0lTYCBoYWQgYSBoaWdobHkgbmVnYXRpdmUgTkVTLgoKYGBge3IgaGlnaGx5X25lZ30KZW5yaWNocGxvdDo6Z3NlYXBsb3QoZ3NlYV9yZXN1bHRzLAogICAgICAgICAgICAgICAgICAgICBnZW5lU2V0SUQgPSAiSEFMTE1BUktfTVlPR0VORVNJUyIsCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkhBTExNQVJLX01ZT0dFTkVTSVMiLAogICAgICAgICAgICAgICAgICAgICBjb2xvci5saW5lID0gIiMwMDY2RkYiKQpgYGAKClRoaXMgZ2VuZSBzZXQgc2hvd3MgdGhlIG9wcG9zaXRlIHBhdHRlcm4gLS0gZ2VuZXMgaW4gdGhlIHBhdGh3YXkgdGVuZCB0byBiZSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZ3JhcGguCgojIyMjIEEgbm9uLXNpZ25pZmljYW50IHJlc3VsdAoKVGhlIGBAcmVzdWx0c2Agc2xvdCB3aWxsIG9ubHkgc2hvdyBnZW5lIHNldHMgdGhhdCBwYXNzIHRoZSBgcHZhbHVlQ3V0b2ZmYCB0aHJlc2hvbGQgd2Ugc3VwcGxpZWQgdG8gYEdTRUEoKWAsIGJ1dCB3ZSBjYW4gcGxvdCBhbnkgZ2VuZSBzZXQgc28gbG9uZyBhcyB3ZSBrbm93IGl0cyBuYW1lLgpMZXQncyBsb29rIGF0IGBIQUxMTUFSS19QNTNfUEFUSFdBWWAsIHdoaWNoIHdhcyBub3QgaW4gdGhlIHJlc3VsdHMgd2Ugdmlld2VkIGVhcmxpZXIuCgpgYGB7ciBwNTMsIGxpdmUgPSBUUlVFfQplbnJpY2hwbG90Ojpnc2VhcGxvdChnc2VhX3Jlc3VsdHMsCiAgICAgICAgICAgICAgICAgICAgIGdlbmVTZXRJRCA9ICJIQUxMTUFSS19QNTNfUEFUSFdBWSIsCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkhBTExNQVJLX1A1M19QQVRIV0FZIiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IubGluZSA9ICIjMDA2NkZGIikKYGBgCgpHZW5lcyBpbiB0aGUgcGF0aHdheSBhcmUgZGlzdHJpYnV0ZWQgbW9yZSBldmVubHkgdGhyb3VnaG91dCB0aGUgcmFua2VkIGxpc3QsIHJlc3VsdGluZyBpbiBhIG1vcmUgIm1pZGRsaW5nIiBzY29yZS4KCipOb3RlOiBUaGUgcGxvdHMgcmV0dXJuZWQgYnkgYGVucmljaHBsb3Q6OmdzZWFwbG90YCBhcmUgZ2dwbG90cywgc28gd2UgY291bGQgdXNlIGBnZ3Bsb3QyOjpnZ3NhdmUoKWAgdG8gc2F2ZSB0aGVtIHRvIGZpbGUgaWYgd2Ugd2FudGVkIHRvLioKCiMjIFNlc3Npb24gSW5mbwoKYGBge3Igc2Vzc2lvbl9pbmZvfQpzZXNzaW9uSW5mbygpCmBgYAo=
    diff --git a/scRNA-seq-advanced/05-aucell-live.Rmd b/scRNA-seq-advanced/05-aucell-live.Rmd index 67e7a408..f6280b01 100644 --- a/scRNA-seq-advanced/05-aucell-live.Rmd +++ b/scRNA-seq-advanced/05-aucell-live.Rmd @@ -18,21 +18,21 @@ date: 2024 --- -In this notebook, we'll demonstrate how to use the AUCell method, introduced in [Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463). +In this notebook, we'll demonstrate how to use the `AUCell` method, introduced in [Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463). -We can use AUCell when we are interested in a gene set's relative expression or activity in an individual cell. +We can use `AUCell` when we are interested in a gene set's relative expression or activity in an individual cell. Gene sets can come from a curated collection of prior knowledge, like the Hallmark collection we used in the last notebook, or we can use our own custom gene sets (e.g., a set of marker genes for a cell type of interest). -A nice feature of AUCell is that it is based on ranking genes from highest to lowest expression value in an individual cell, which is helpful in the following ways ([AUCell vignette](https://bioconductor.org/packages/release/bioc/vignettes/AUCell/inst/doc/AUCell.html)): +A nice feature of `AUCell` is that it is based on ranking genes from highest to lowest expression value in an individual cell, which is helpful in the following ways ([`AUCell` vignette](https://bioconductor.org/packages/release/bioc/vignettes/AUCell/inst/doc/AUCell.html)): - It can take a number of different values as input (e.g., raw counts, TPM) - It compensates for differences in library size, where something like averaging raw count values of genes in a gene set would not - It scales to larger datasets, since creating rankings is not as resource-intensive as something like permutation testing, and we could split up the object into subsets of cells if needed -AUCell calculates the area under the recovery curve (AUC), which "represents the proportion of expressed genes in the signature and their relative expression value compared to the other genes within the cell" ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)). +`AUCell` calculates the area under the recovery curve (AUC), which "represents the proportion of expressed genes in the signature and their relative expression value compared to the other genes within the cell" ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)). We will visualize some recovery curves in the notebook to give you a better intuition about the AUC and its meaning. -The AUC values we get out of AUCell can be used in a number of ways ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)): +The AUC values we get out of `AUCell` can be used in a number of ways ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)): - As continuous values we can use for visualization or clustering - For binary assignment (i.e., "on" and "off" or "expressed" and "not expressed") if we pick a threshold either automatically using built-in functionality or manually by inspecting the distribution of scores ourselves @@ -82,7 +82,7 @@ sce_file <- fs::path(processed_dir, "SCPCL000822_processed.rds") ``` -We will save the AUCell results as a table in the analysis directory. +We will save the `AUCell` results as a table in the analysis directory. ```{r setup_output_files, live = TRUE} @@ -98,7 +98,7 @@ source(fs::path("util", "aucell_functions.R")) ``` This loads one custom function, called `plot_recovery_curve()`, into our environment. -This function is adapted from [the AUCell vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd#L295-L316). +This function is adapted from [the `AUCell` vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd#L295-L316). ## Set up gene sets @@ -146,21 +146,33 @@ ewing_gene_set_collection <- ewing_gene_set_names |> GeneSetCollection() ``` -## Read in and prepare SingleCellExperiment +## Read in and prepare the `SingleCellExperiment` ```{r read_in_sce, live = TRUE} ``` +Our object includes counts for all genes that were present in the index when quantifying gene expression. +There are a number of genes that are present in the object but not detected in any of the cells. +We don't want genes that are not found in our data set to impact our rankings, so let's remove them. + +```{r, filter_sce} +# remove genes that are not detected in any of the cells from the SCE object +genes_to_keep <- rowData(sce)$detected > 0 +sce <- sce[genes_to_keep, ] +``` + + The `AUCell` functions takes an expression matrix with genes as rows and cells as column. We can extract a counts matrix in sparse format for use with `AUCell`. + ```{r counts_matrix} # Extract counts matrix counts_matrix <- counts(sce) ``` -There may be genes in our gene set that do not appear in the SingleCellExperiment object. +There may be genes in our gene set that do not appear in the `SingleCellExperiment` object. We can remove them using the `subsetGeneSets()` function. ```{r subset_gene_sets, live = TRUE} @@ -168,9 +180,9 @@ We can remove them using the `subsetGeneSets()` function. ``` -## AUCell +## `AUCell` -AUCell relies on ranking genes from highest to lowest expression value to calculate the AUC. +`AUCell` relies on ranking genes from highest to lowest expression value to calculate the AUC. The AUC is the area under the recovery curve, which captures the number of genes in a gene set that are present in the rankings above some threshold (i.e., it is the area under the curve to the left of this gene rank). By default, the top 5% of genes are used as the threshold. @@ -185,16 +197,16 @@ To make our rankings – and therefore results – reproducible, we will set a s ### Cell ranking -The first step in AUCell is to rank genes for each cell from highest to lowest expression value. -We can do this using the `AUCell_buildRankings()` function, which will output a visualization showing the distribution of the number of genes detected in the cells in our SingleCellExperiment object. +The first step in `AUCell` is to rank genes for each cell from highest to lowest expression value. +We can do this using the `AUCell_buildRankings()` function, which will output a visualization showing the distribution of the number of genes detected in the cells in our `SingleCellExperiment` object. ```{r cell_rankings, live = TRUE} ``` -The AUCell authors recommend making sure most cells have at least the number of genes we will use as the max rank to calculate the AUC. +The `AUCell` authors recommend making sure most cells have at least the number of genes we will use as the max rank to calculate the AUC. -The AUC max rank value tells AUCell the cutoff in the gene rankings to use for calculating AUC; we will visualize this curve and max rank in just a moment. +The AUC max rank value tells `AUCell` the cutoff in the gene rankings to use for calculating AUC; we will visualize this curve and max rank in just a moment. If we picked a max rank higher than the number of genes detected in most cells, the non-detected genes that are randomly ordered would play an outsized role in our AUC values. By default, the max rank is the top 5% highest expressed genes. @@ -222,10 +234,10 @@ We can use a function called `ceiling()` to round this and save it to a variable ### Plotting AUC -The AUC values we get out of AUCell are the area under a recovery curve and estimate the proportion of genes in the gene set that are highly expressed (i.e., highly ranked). +The AUC values we get out of `AUCell` are the area under a recovery curve and estimate the proportion of genes in the gene set that are highly expressed (i.e., highly ranked). Let's plot the recovery curve for a cell with high AUC and a cell with low AUC to get a better intuition about AUC values. -Earlier, we loaded a custom function we adapted from [the AUCell vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd) called `plot_recovery_curve()` with `source()`. +Earlier, we loaded a custom function we adapted from [the `AUCell` vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd) called `plot_recovery_curve()` with `source()`. First, we'll start with a cell with a high AUC. We picked this barcode ahead of time when we wrote the notebook. @@ -286,7 +298,7 @@ head(auc_df) ### Assignments -AUCell can assign cells as having an active gene set or not by picking a threshold automatically. +`AUCell` can assign cells as having an active gene set or not by picking a threshold automatically. We'll explore these in a later plot, but for now, let's calculate the threshold and assign cells with `AUCell_exploreThresholds()`. ```{r auc_assignments, live = TRUE} @@ -367,7 +379,7 @@ auc_plotting_df |> #### Adding AUC to `colData` -We can also add the AUC values back into the SingleCellExperiment for convenience, e.g., for plotting. +We can also add the AUC values back into the `SingleCellExperiment` for convenience, e.g., for plotting. We'll add it to the existing `colData`. First, let's rename the gene set columns to something more easily typed. diff --git a/scRNA-seq-advanced/05-aucell.Rmd b/scRNA-seq-advanced/05-aucell.Rmd index f74fc0fd..55d3891b 100644 --- a/scRNA-seq-advanced/05-aucell.Rmd +++ b/scRNA-seq-advanced/05-aucell.Rmd @@ -18,21 +18,21 @@ date: 2024 --- -In this notebook, we'll demonstrate how to use the AUCell method, introduced in [Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463). +In this notebook, we'll demonstrate how to use the `AUCell` method, introduced in [Aibar _et al_. 2017](https://doi.org/10.1038/nmeth.4463). -We can use AUCell when we are interested in a gene set's relative expression or activity in an individual cell. +We can use `AUCell` when we are interested in a gene set's relative expression or activity in an individual cell. Gene sets can come from a curated collection of prior knowledge, like the Hallmark collection we used in the last notebook, or we can use our own custom gene sets (e.g., a set of marker genes for a cell type of interest). -A nice feature of AUCell is that it is based on ranking genes from highest to lowest expression value in an individual cell, which is helpful in the following ways ([AUCell vignette](https://bioconductor.org/packages/release/bioc/vignettes/AUCell/inst/doc/AUCell.html)): +A nice feature of `AUCell` is that it is based on ranking genes from highest to lowest expression value in an individual cell, which is helpful in the following ways ([`AUCell` vignette](https://bioconductor.org/packages/release/bioc/vignettes/AUCell/inst/doc/AUCell.html)): - It can take a number of different values as input (e.g., raw counts, TPM) - It compensates for differences in library size, where something like averaging raw count values of genes in a gene set would not - It scales to larger datasets, since creating rankings is not as resource-intensive as something like permutation testing, and we could split up the object into subsets of cells if needed -AUCell calculates the area under the recovery curve (AUC), which "represents the proportion of expressed genes in the signature and their relative expression value compared to the other genes within the cell" ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)). +`AUCell` calculates the area under the recovery curve (AUC), which "represents the proportion of expressed genes in the signature and their relative expression value compared to the other genes within the cell" ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)). We will visualize some recovery curves in the notebook to give you a better intuition about the AUC and its meaning. -The AUC values we get out of AUCell can be used in a number of ways ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)): +The AUC values we get out of `AUCell` can be used in a number of ways ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)): - As continuous values we can use for visualization or clustering - For binary assignment (i.e., "on" and "off" or "expressed" and "not expressed") if we pick a threshold either automatically using built-in functionality or manually by inspecting the distribution of scores ourselves @@ -77,16 +77,20 @@ fs::dir_create(analysis_dir) The input will be a `SingleCellExperiment` for an individual Ewing sarcoma library. ```{r setup_input_files} -sce_file <- fs::path(processed_dir, - "SCPCS000490", - "SCPCL000822_processed.rds") +sce_file <- fs::path( + processed_dir, + "SCPCS000490", + "SCPCL000822_processed.rds" +) ``` -We will save the AUCell results as a table in the analysis directory. +We will save the `AUCell` results as a table in the analysis directory. ```{r setup_output_files, live = TRUE} -output_file <- fs::path(analysis_dir, - "ewing_sarcoma_aucell_results.tsv") +output_file <- fs::path( + analysis_dir, + "ewing_sarcoma_aucell_results.tsv" +) ``` @@ -99,7 +103,7 @@ source(fs::path("util", "aucell_functions.R")) ``` This loads one custom function, called `plot_recovery_curve()`, into our environment. -This function is adapted from [the AUCell vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd#L295-L316). +This function is adapted from [the `AUCell` vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd#L295-L316). ## Set up gene sets @@ -112,8 +116,10 @@ We would expect both of these gene sets to have high expression in tumor cells. ```{r genesets} # Create a named vector with the relevant gene set names -ewing_gene_set_names <- c(zhang = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", - riggi = "RIGGI_EWING_SARCOMA_PROGENITOR_UP") +ewing_gene_set_names <- c( + zhang = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", + riggi = "RIGGI_EWING_SARCOMA_PROGENITOR_UP" +) ewing_gene_set_names ``` @@ -122,60 +128,68 @@ These gene sets come from the C2 gene set collection from MSigDB. Let's retrieve them using `msigdbr()`. ```{r extract_genesets, live = TRUE} -ewing_gene_sets_df <- msigdbr(species = "Homo sapiens", - category = "C2", - subcategory = "CGP") |> - dplyr::filter(gs_name %in% ewing_gene_set_names) +ewing_gene_sets_df <- msigdbr( + species = "Homo sapiens", + collection = "C2", + subcollection = "CGP" +) |> + dplyr::filter(gs_name %in% ewing_gene_set_names) |> + dplyr::select(gs_name, ensembl_gene) ``` -`AUCell` uses gene sets in a particular format that comes from the `GSEABase` package. -We need to create a `GeneSetCollection`. +We can provide these gene sets as a named list to `AUCell`, so let's create that now. -```{r gene_set_collection} -ewing_gene_set_collection <- ewing_gene_set_names |> - purrr::map( - # For each gene set - \(gene_set_name) { - ewing_gene_sets_df |> - # Subset to the rows in that gene set - dplyr::filter(gs_name == gene_set_name) |> - # Grab the Ensembl gene identifiers - dplyr::pull(ensembl_gene) |> - # Create a GeneSet object - GeneSet(setName = gene_set_name, - geneIdType = ENSEMBLIdentifier()) - } - ) |> - # Turn the list of GeneSet objects into a GeneSet collection - GeneSetCollection() +```{r create_gene_list} +ewing_gene_set_list <- split( + ewing_gene_sets_df$ensembl_gene, + ewing_gene_sets_df$gs_name +) + +# briefly, show the resulting list +purrr::map(ewing_gene_set_list, head) ``` -## Read in and prepare SingleCellExperiment +## Read in and prepare the `SingleCellExperiment` ```{r read_in_sce, live = TRUE} sce <- readr::read_rds(sce_file) ``` +Our object includes counts for all genes that were present in the index when quantifying gene expression. +There are a number of genes that are present in the object but not detected in any of the cells. +We don't want genes that are not found in our data set to impact our rankings, so let's remove them. + +```{r, filter_sce} +# remove genes that are not detected in any of the cells from the SCE object +genes_to_keep <- rowData(sce)$detected > 0 +sce <- sce[genes_to_keep, ] +``` + + The `AUCell` functions takes an expression matrix with genes as rows and cells as column. We can extract a counts matrix in sparse format for use with `AUCell`. + ```{r counts_matrix} # Extract counts matrix counts_matrix <- counts(sce) ``` -There may be genes in our gene set that do not appear in the SingleCellExperiment object. -We can remove them using the `subsetGeneSets()` function. +There may be genes in our gene set that do not appear in the `SingleCellExperiment` object which we should remove before proceeding. ```{r subset_gene_sets, live = TRUE} -# Remove genes from gene sets if they are not in the SCE -ewing_gene_set_collection <- subsetGeneSets(ewing_gene_set_collection, - rownames(counts_matrix)) +# Remove genes from list if they are not in the SCE +ewing_gene_set_list <- ewing_gene_set_list |> + purrr::map( + \(gene_list) { + intersect(gene_list, rownames(sce)) # keep only the intersection with our genes + } +) ``` -## AUCell +## `AUCell` -AUCell relies on ranking genes from highest to lowest expression value to calculate the AUC. +`AUCell` relies on ranking genes from highest to lowest expression value to calculate the AUC. The AUC is the area under the recovery curve, which captures the number of genes in a gene set that are present in the rankings above some threshold (i.e., it is the area under the curve to the left of this gene rank). By default, the top 5% of genes are used as the threshold. @@ -190,16 +204,16 @@ set.seed(2024) ### Cell ranking -The first step in AUCell is to rank genes for each cell from highest to lowest expression value. -We can do this using the `AUCell_buildRankings()` function, which will output a visualization showing the distribution of the number of genes detected in the cells in our SingleCellExperiment object. +The first step in `AUCell` is to rank genes for each cell from highest to lowest expression value. +We can do this using the `AUCell_buildRankings()` function, which will output a visualization showing the distribution of the number of genes detected in the cells in our `SingleCellExperiment` object. ```{r cell_rankings, live = TRUE} cell_rankings <- AUCell_buildRankings(counts_matrix) ``` -The AUCell authors recommend making sure most cells have at least the number of genes we will use as the max rank to calculate the AUC. +The `AUCell` authors recommend making sure most cells have at least the number of genes we will use as the max rank to calculate the AUC. -The AUC max rank value tells AUCell the cutoff in the gene rankings to use for calculating AUC; we will visualize this curve and max rank in just a moment. +The AUC max rank value tells `AUCell` the cutoff in the gene rankings to use for calculating AUC; we will visualize this curve and max rank in just a moment. If we picked a max rank higher than the number of genes detected in most cells, the non-detected genes that are randomly ordered would play an outsized role in our AUC values. By default, the max rank is the top 5% highest expressed genes. @@ -227,20 +241,22 @@ auc_max_rank <- ceiling(nrow(cell_rankings) * 0.01) ### Plotting AUC -The AUC values we get out of AUCell are the area under a recovery curve and estimate the proportion of genes in the gene set that are highly expressed (i.e., highly ranked). +The AUC values we get out of `AUCell` are the area under a recovery curve and estimate the proportion of genes in the gene set that are highly expressed (i.e., highly ranked). Let's plot the recovery curve for a cell with high AUC and a cell with low AUC to get a better intuition about AUC values. -Earlier, we loaded a custom function we adapted from [the AUCell vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd) called `plot_recovery_curve()` with `source()`. +Earlier, we loaded a custom function we adapted from [the `AUCell` vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd) called `plot_recovery_curve()` with `source()`. First, we'll start with a cell with a high AUC. We picked this barcode ahead of time when we wrote the notebook. ```{r high_recovery_curve} -plot_recovery_curve(cell_rankings, - ewing_gene_set_collection, - gene_set_name = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", - barcode = "CTGAGCGGTCTTTATC", - auc_max_rank = auc_max_rank) # 1% threshold +plot_recovery_curve( + cell_rankings, + ewing_gene_set_list, + gene_set_name = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", + barcode = "CTGAGCGGTCTTTATC", + auc_max_rank = auc_max_rank # 1% threshold +) ``` The x-axis is the gene ranks for all genes. @@ -250,11 +266,13 @@ The AUC is the area under this recovery curve at the max rank threshold chosen f Now, let's look at an example with a low AUC. ```{r low_recovery_curve} -plot_recovery_curve(cell_rankings, - ewing_gene_set_collection, - gene_set_name = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", - barcode = "AGATAGAGTCACAATC", - auc_max_rank = auc_max_rank) # 1% threshold +plot_recovery_curve( + cell_rankings, + ewing_gene_set_list, + gene_set_name = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", + barcode = "AGATAGAGTCACAATC", + auc_max_rank = auc_max_rank # 1% threshold +) ``` Far fewer genes in the gene set are ranked above the threshold, yielding a lower AUC value. @@ -264,9 +282,11 @@ Far fewer genes in the gene set are ranked above the threshold, yielding a lower Once we have the rankings, we can calculate the AUC scores for both gene sets in all cells with the `AUCell_calcAUC()` function. ```{r calc_auc, live = TRUE} -cell_auc <- AUCell_calcAUC(geneSets = ewing_gene_set_collection, - rankings = cell_rankings, - aucMaxRank = auc_max_rank) +cell_auc <- AUCell_calcAUC( + geneSets = ewing_gene_set_list, + rankings = cell_rankings, + aucMaxRank = auc_max_rank +) ``` This function returns an `aucellResults` object. @@ -293,22 +313,26 @@ head(auc_df) ### Assignments -AUCell can assign cells as having an active gene set or not by picking a threshold automatically. +`AUCell` can assign cells as having an active gene set or not by picking a threshold automatically. We'll explore these in a later plot, but for now, let's calculate the threshold and assign cells with `AUCell_exploreThresholds()`. ```{r auc_assignments, live = TRUE} -auc_assignments <- AUCell_exploreThresholds(cell_auc, - plotHist = FALSE, - assignCells = TRUE) +auc_assignments <- AUCell_exploreThresholds( + cell_auc, + plotHist = FALSE, + assignCells = TRUE +) ``` We're going to plot the distribution of AUC values with `ggplot2`, so we will want the AUC values in a longer format. ```{r auc_plotting_df} auc_plotting_df <- auc_df |> - tidyr::pivot_longer(!barcodes, - names_to = "gene_set", - values_to = "auc") |> + tidyr::pivot_longer( + !barcodes, + names_to = "gene_set", + values_to = "auc" + ) |> dplyr::mutate( # Create a new logical column called assigned assigned = dplyr::case_when( @@ -376,7 +400,7 @@ auc_plotting_df |> #### Adding AUC to `colData` -We can also add the AUC values back into the SingleCellExperiment for convenience, e.g., for plotting. +We can also add the AUC values back into the `SingleCellExperiment` for convenience, e.g., for plotting. We'll add it to the existing `colData`. First, let's rename the gene set columns to something more easily typed. @@ -384,9 +408,10 @@ First, let's rename the gene set columns to something more easily typed. ```{r rename_gene_set} auc_df <- auc_df |> # Use shorter names - dplyr::rename(zhang_auc = ewing_gene_set_names[["zhang"]], - riggi_auc = ewing_gene_set_names[["riggi"]]) - + dplyr::rename( + zhang_auc = ewing_gene_set_names[["zhang"]], + riggi_auc = ewing_gene_set_names[["riggi"]] + ) ``` And join it to the existing `colData`. @@ -419,18 +444,26 @@ We can use the `plotUMAP()` function from the `scater` package to plot a UMAP wi ```{r plot_umap_zhang} scater::plotUMAP(sce, colour_by = "zhang_auc") + # Use the gene set name, replacing underscores with spaces - ggplot2::ggtitle(stringr::str_replace_all(ewing_gene_set_names[["zhang"]], - "\\_", - " ")) + ggplot2::ggtitle( + stringr::str_replace_all( + ewing_gene_set_names[["zhang"]], + "\\_", + " " + ) + ) ``` Let's color the points by the AUC values for the other gene set. ```{r plot_umap_riggi, live = TRUE} scater::plotUMAP(sce, colour_by = "riggi_auc") + - ggplot2::ggtitle(stringr::str_replace_all(ewing_gene_set_names[["riggi"]], - "\\_", - " ")) + ggplot2::ggtitle( + stringr::str_replace_all( + ewing_gene_set_names[["riggi"]], + "\\_", + " " + ) + ) ``` We would want to do something more formal to confirm, but it seems like the same cells have high AUC values for both gene sets! diff --git a/scRNA-seq-advanced/05-aucell.nb.html b/scRNA-seq-advanced/05-aucell.nb.html index b10258db..7300e6c4 100644 --- a/scRNA-seq-advanced/05-aucell.nb.html +++ b/scRNA-seq-advanced/05-aucell.nb.html @@ -2898,17 +2898,17 @@

    Objectives

    plotting
    -

    In this notebook, we’ll demonstrate how to use the AUCell method, -introduced in Aibar et -al. 2017..

    -

    We can use AUCell when we are interested in a gene set’s relative -expression or activity in an individual cell. Gene sets can come from a -curated collection of prior knowledge, like the Hallmark collection we -used in the last notebook, or we can use our own custom gene sets (e.g., -a set of marker genes for a cell type of interest).

    -

    A nice feature of AUCell is that it is based on ranking genes from -highest to lowest expression value in an individual cell, which is -helpful in the following ways (AUCell +

    In this notebook, we’ll demonstrate how to use the +AUCell method, introduced in Aibar et al. +2017..

    +

    We can use AUCell when we are interested in a gene set’s +relative expression or activity in an individual cell. Gene sets can +come from a curated collection of prior knowledge, like the Hallmark +collection we used in the last notebook, or we can use our own custom +gene sets (e.g., a set of marker genes for a cell type of interest).

    +

    A nice feature of AUCell is that it is based on ranking +genes from highest to lowest expression value in an individual cell, +which is helpful in the following ways (AUCell vignette):

    • It can take a number of different values as input (e.g., raw counts, @@ -2919,15 +2919,15 @@

      Objectives

      resource-intensive as something like permutation testing, and we could split up the object into subsets of cells if needed
    -

    AUCell calculates the area under the recovery curve (AUC), which -“represents the proportion of expressed genes in the signature and their -relative expression value compared to the other genes within the cell” -(Aibar et al. +

    AUCell calculates the area under the recovery curve +(AUC), which “represents the proportion of expressed genes in the +signature and their relative expression value compared to the other +genes within the cell” (Aibar et al. 2017.). We will visualize some recovery curves in the notebook to give you a better intuition about the AUC and its meaning.

    -

    The AUC values we get out of AUCell can be used in a number of ways -(Aibar et al. -2017.):

    +

    The AUC values we get out of AUCell can be used in a +number of ways (Aibar +et al. 2017.):

    • As continuous values we can use for visualization or clustering
    • For binary assignment (i.e., “on” and “off” or “expressed” and “not @@ -3022,8 +3022,8 @@

      Files

      -

      We will save the AUCell results as a table in the analysis -directory.

      +

      We will save the AUCell results as a table in the +analysis directory.

      @@ -3048,7 +3048,7 @@

      Functions

      This loads one custom function, called plot_recovery_curve(), into our environment. This function is adapted from the -AUCell vignette.

      +AUCell vignette.

    @@ -3121,8 +3121,8 @@

    Set up gene sets

    -
    -

    Read in and prepare SingleCellExperiment

    +
    +

    Read in and prepare the SingleCellExperiment

    @@ -3130,6 +3130,20 @@

    Read in and prepare SingleCellExperiment

    +

    Our object includes counts for all genes that were present in the +index when quantifying gene expression. There are a number of genes that +are present in the object but not detected in any of the cells. We don’t +want genes that are not found in our data set to impact our rankings, so +let’s remove them.

    + + + +
    # remove genes that are not detected in any of the cells from the SCE object
    +genes_to_keep <- rowData(sce)$detected > 0
    +sce <- sce[genes_to_keep, ]
    + + +

    The AUCell functions takes an expression matrix with genes as rows and cells as column. We can extract a counts matrix in sparse format for use with AUCell.

    @@ -3142,7 +3156,7 @@

    Read in and prepare SingleCellExperiment

    There may be genes in our gene set that do not appear in the -SingleCellExperiment object. We can remove them using the +SingleCellExperiment object. We can remove them using the subsetGeneSets() function.

    @@ -3155,13 +3169,13 @@

    Read in and prepare SingleCellExperiment

    -

    AUCell

    -

    AUCell relies on ranking genes from highest to lowest expression -value to calculate the AUC. The AUC is the area under the recovery -curve, which captures the number of genes in a gene set that are present -in the rankings above some threshold (i.e., it is the area under the -curve to the left of this gene rank). By default, the top 5% of genes -are used as the threshold.

    +

    AUCell

    +

    AUCell relies on ranking genes from highest to lowest +expression value to calculate the AUC. The AUC is the area under the +recovery curve, which captures the number of genes in a gene set that +are present in the rankings above some threshold (i.e., it is the area +under the curve to the left of this gene rank). By default, the top 5% +of genes are used as the threshold.

    Some genes will not be detected (i.e., have 0 counts). Genes can also have the same expression level (i.e., ties). These undetected genes and ties will be randomly ordered in our ranking. To make our rankings – and @@ -3175,11 +3189,11 @@

    AUCell

    Cell ranking

    -

    The first step in AUCell is to rank genes for each cell from highest -to lowest expression value. We can do this using the +

    The first step in AUCell is to rank genes for each cell +from highest to lowest expression value. We can do this using the AUCell_buildRankings() function, which will output a visualization showing the distribution of the number of genes detected -in the cells in our SingleCellExperiment object.

    +in the cells in our SingleCellExperiment object.

    @@ -3198,13 +3212,14 @@

    Cell ranking

    -

    The AUCell authors recommend making sure most cells have at least the -number of genes we will use as the max rank to calculate the AUC.

    -

    The AUC max rank value tells AUCell the cutoff in the gene rankings -to use for calculating AUC; we will visualize this curve and max rank in -just a moment. If we picked a max rank higher than the number of genes -detected in most cells, the non-detected genes that are randomly ordered -would play an outsized role in our AUC values.

    +

    The AUCell authors recommend making sure most cells have +at least the number of genes we will use as the max rank to calculate +the AUC.

    +

    The AUC max rank value tells AUCell the cutoff in the +gene rankings to use for calculating AUC; we will visualize this curve +and max rank in just a moment. If we picked a max rank higher than the +number of genes detected in most cells, the non-detected genes that are +randomly ordered would play an outsized role in our AUC values.

    By default, the max rank is the top 5% highest expressed genes. We can calculate the default max rank by taking into account the number of genes.

    @@ -3213,8 +3228,8 @@

    Cell ranking

    nrow(cell_rankings) * 0.05
    - -
    [1] 3015.95
    + +
    [1] 1745.7
    @@ -3227,8 +3242,8 @@

    Cell ranking

    nrow(cell_rankings) * 0.01
    - -
    [1] 603.19
    + +
    [1] 349.14
    @@ -3245,14 +3260,14 @@

    Cell ranking

    Plotting AUC

    -

    The AUC values we get out of AUCell are the area under a recovery -curve and estimate the proportion of genes in the gene set that are -highly expressed (i.e., highly ranked).

    +

    The AUC values we get out of AUCell are the area under a +recovery curve and estimate the proportion of genes in the gene set that +are highly expressed (i.e., highly ranked).

    Let’s plot the recovery curve for a cell with high AUC and a cell with low AUC to get a better intuition about AUC values. Earlier, we loaded a custom function we adapted from the -AUCell vignette called plot_recovery_curve() with -source().

    +AUCell vignette called +plot_recovery_curve() with source().

    First, we’ll start with a cell with a high AUC. We picked this barcode ahead of time when we wrote the notebook.

    @@ -3265,7 +3280,7 @@

    Plotting AUC

    auc_max_rank = auc_max_rank) # 1% threshold
    -

    +

    @@ -3285,7 +3300,7 @@

    Plotting AUC

    auc_max_rank = auc_max_rank) # 1% threshold
    -

    +

    @@ -3312,7 +3327,7 @@

    Calculating the AUC

    str(cell_auc)
    - +
    Formal class 'aucellResults' [package "AUCell"] with 6 slots
       ..@ nGenesDetected : num(0) 
       ..@ colData        :Formal class 'DFrame' [package "S4Vectors"] with 6 slots
    @@ -3325,7 +3340,7 @@ 

    Calculating the AUC

    ..@ assays :Formal class 'SimpleAssays' [package "SummarizedExperiment"] with 1 slot .. .. ..@ data:Formal class 'SimpleList' [package "S4Vectors"] with 4 slots .. .. .. .. ..@ listData :List of 1 - .. .. .. .. .. ..$ AUC: num [1:2, 1:4277] 0.1103 0.1206 0.0352 0.0538 0.1671 ... + .. .. .. .. .. ..$ AUC: num [1:2, 1:4277] 0.0912 0.1544 0.0179 0.051 0.1426 ... .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2 .. .. .. .. .. .. .. ..$ gene sets: chr [1:2] "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION" "RIGGI_EWING_SARCOMA_PROGENITOR_UP" .. .. .. .. .. .. .. ..$ cells : chr [1:4277] "AAGCATCTCGTTGCCT" "CTGTATTTCCAAGAGG" "CAGCAGCTCCTCAGAA" "AGGTCTAAGGGACTGT" ... @@ -3363,7 +3378,7 @@

    Calculating the AUC

    @@ -3371,9 +3386,9 @@

    Calculating the AUC

    Assignments

    -

    AUCell can assign cells as having an active gene set or not by -picking a threshold automatically. We’ll explore these in a later plot, -but for now, let’s calculate the threshold and assign cells with +

    AUCell can assign cells as having an active gene set or +not by picking a threshold automatically. We’ll explore these in a later +plot, but for now, let’s calculate the threshold and assign cells with AUCell_exploreThresholds().

    @@ -3414,7 +3429,7 @@

    Assignments

    @@ -3435,7 +3450,7 @@

    Assignments

    @@ -3465,7 +3480,7 @@

    Assignments

    ggplot2::theme_bw()
    -

    +

    @@ -3486,9 +3501,9 @@

    Assignments

    UMAPs

    Adding AUC to colData

    -

    We can also add the AUC values back into the SingleCellExperiment for -convenience, e.g., for plotting. We’ll add it to the existing -colData.

    +

    We can also add the AUC values back into the +SingleCellExperiment for convenience, e.g., for plotting. +We’ll add it to the existing colData.

    First, let’s rename the gene set columns to something more easily typed.

    @@ -3544,7 +3559,7 @@

    Plotting UMAPs

    " ")) -

    +

    @@ -3558,7 +3573,7 @@

    Plotting UMAPs

    " ")) -

    +

    @@ -3665,7 +3680,7 @@

    Session Info

    -
    LS0tCnRpdGxlOiAiUGF0aHdheSBBbmFseXNpczogQVVDZWxsIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCmF1dGhvcjogQ0NETCBmb3IgQUxTRgpkYXRlOiAyMDI0Ci0tLQoKKkFkYXB0ZWQgZnJvbSBbdGhlIEFVQ2VsbCB2aWduZXR0ZV0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy92aWduZXR0ZXMvQVVDZWxsL2luc3QvZG9jL0FVQ2VsbC5odG1sKSBhbmQgW3RoZSBgY2VsbC10eXBlLWV3aW5nc2AgbW9kdWxlXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuU2NQQ0EtYW5hbHlzaXMvdHJlZS9tYWluL2FuYWx5c2VzL2NlbGwtdHlwZS1ld2luZ3MpIHRoYXQgaXMgcGFydCBvZiB0aGUgT3BlbiBTaW5nbGUtY2VsbCBQZWRpYXRyaWMgQ2FuY2VyIEF0bGFzIHByb2plY3QuKgoKIyMgT2JqZWN0aXZlcwoKLSBJbnRyb2R1Y2UgdGhlIGBBVUNlbGxgIFIgcGFja2FnZQotIElsbHVzdHJhdGUgaG93IEFVQyB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQKLSBEZW1vbnN0cmF0ZSBob3cgQVVDIHZhbHVlcyBjYW4gYmUgdXNlZCBmb3IgY2VsbCBhc3NpZ25tZW50IGFuZCBwbG90dGluZwoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBBVUNlbGwgbWV0aG9kLCBpbnRyb2R1Y2VkIGluIFtBaWJhciBfZXQgYWxfLiAyMDE3Ll0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbm1ldGguNDQ2MykuCgpXZSBjYW4gdXNlIEFVQ2VsbCB3aGVuIHdlIGFyZSBpbnRlcmVzdGVkIGluIGEgZ2VuZSBzZXQncyByZWxhdGl2ZSBleHByZXNzaW9uIG9yIGFjdGl2aXR5IGluIGFuIGluZGl2aWR1YWwgY2VsbC4KR2VuZSBzZXRzIGNhbiBjb21lIGZyb20gYSBjdXJhdGVkIGNvbGxlY3Rpb24gb2YgcHJpb3Iga25vd2xlZGdlLCBsaWtlIHRoZSBIYWxsbWFyayBjb2xsZWN0aW9uIHdlIHVzZWQgaW4gdGhlIGxhc3Qgbm90ZWJvb2ssIG9yIHdlIGNhbiB1c2Ugb3VyIG93biBjdXN0b20gZ2VuZSBzZXRzIChlLmcuLCBhIHNldCBvZiBtYXJrZXIgZ2VuZXMgZm9yIGEgY2VsbCB0eXBlIG9mIGludGVyZXN0KS4KCkEgbmljZSBmZWF0dXJlIG9mIEFVQ2VsbCBpcyB0aGF0IGl0IGlzIGJhc2VkIG9uIHJhbmtpbmcgZ2VuZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBleHByZXNzaW9uIHZhbHVlIGluIGFuIGluZGl2aWR1YWwgY2VsbCwgd2hpY2ggaXMgaGVscGZ1bCBpbiB0aGUgZm9sbG93aW5nIHdheXMgKFtBVUNlbGwgdmlnbmV0dGVdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvdmlnbmV0dGVzL0FVQ2VsbC9pbnN0L2RvYy9BVUNlbGwuaHRtbCkpOgoKLSBJdCBjYW4gdGFrZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgdmFsdWVzIGFzIGlucHV0IChlLmcuLCByYXcgY291bnRzLCBUUE0pIAotIEl0IGNvbXBlbnNhdGVzIGZvciBkaWZmZXJlbmNlcyBpbiBsaWJyYXJ5IHNpemUsIHdoZXJlIHNvbWV0aGluZyBsaWtlIGF2ZXJhZ2luZyByYXcgY291bnQgdmFsdWVzIG9mIGdlbmVzIGluIGEgZ2VuZSBzZXQgd291bGQgbm90IAotIEl0IHNjYWxlcyB0byBsYXJnZXIgZGF0YXNldHMsIHNpbmNlIGNyZWF0aW5nIHJhbmtpbmdzIGlzIG5vdCBhcyByZXNvdXJjZS1pbnRlbnNpdmUgYXMgc29tZXRoaW5nIGxpa2UgcGVybXV0YXRpb24gdGVzdGluZywgYW5kIHdlIGNvdWxkIHNwbGl0IHVwIHRoZSBvYmplY3QgaW50byBzdWJzZXRzIG9mIGNlbGxzIGlmIG5lZWRlZAoKQVVDZWxsIGNhbGN1bGF0ZXMgdGhlIGFyZWEgdW5kZXIgdGhlIHJlY292ZXJ5IGN1cnZlIChBVUMpLCB3aGljaCAicmVwcmVzZW50cyB0aGUgcHJvcG9ydGlvbiBvZiBleHByZXNzZWQgZ2VuZXMgaW4gdGhlIHNpZ25hdHVyZSBhbmQgdGhlaXIgcmVsYXRpdmUgZXhwcmVzc2lvbiB2YWx1ZSBjb21wYXJlZCB0byB0aGUgb3RoZXIgZ2VuZXMgd2l0aGluIHRoZSBjZWxsIiAoW0FpYmFyIF9ldCBhbF8uIDIwMTcuXShodHRwczovL2RvaS5vcmcvMTAuMTAzOC9ubWV0aC40NDYzKSkuCldlIHdpbGwgdmlzdWFsaXplIHNvbWUgcmVjb3ZlcnkgY3VydmVzIGluIHRoZSBub3RlYm9vayB0byBnaXZlIHlvdSBhIGJldHRlciBpbnR1aXRpb24gYWJvdXQgdGhlIEFVQyBhbmQgaXRzIG1lYW5pbmcuCgpUaGUgQVVDIHZhbHVlcyB3ZSBnZXQgb3V0IG9mIEFVQ2VsbCBjYW4gYmUgdXNlZCBpbiBhIG51bWJlciBvZiB3YXlzIChbQWliYXIgX2V0IGFsXy4gMjAxNy5dKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L25tZXRoLjQ0NjMpKToKCi0gQXMgY29udGludW91cyB2YWx1ZXMgd2UgY2FuIHVzZSBmb3IgdmlzdWFsaXphdGlvbiBvciBjbHVzdGVyaW5nCi0gRm9yIGJpbmFyeSBhc3NpZ25tZW50IChpLmUuLCAib24iIGFuZCAib2ZmIiBvciAiZXhwcmVzc2VkIiBhbmQgIm5vdCBleHByZXNzZWQiKSBpZiB3ZSBwaWNrIGEgdGhyZXNob2xkIGVpdGhlciBhdXRvbWF0aWNhbGx5IHVzaW5nIGJ1aWx0LWluIGZ1bmN0aW9uYWxpdHkgb3IgbWFudWFsbHkgYnkgaW5zcGVjdGluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIHNjb3JlcyBvdXJzZWx2ZXMKCldlIHdpbGwgdXNlIGFuIHNuUk5BLXNlcSBvZiBhIEV3aW5nIHNhcmNvbWEgc2FtcGxlIGZyb20gdGhlIFtgU0NQQ1AwMDAwMTVgIHByb2plY3RdKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvcHJvamVjdHMvU0NQQ1AwMDAwMTUpIG9uIHRoZSBTaW5nbGUtY2VsbCBQZWRpYXRyaWMgQ2FuY2VyIEF0bGFzIFBvcnRhbCBhbmQgdHdvIHJlbGV2YW50IGdlbmUgc2V0cyBmcm9tIHRoZSBNb2xlY3VsYXIgU2lnbmF0dXJlcyBEYXRhYmFzZSAoTVNpZ0RCKSB0byBkZW1vbnN0cmF0ZSB0aGlzIG1ldGhvZC4KCiMjIFNldCB1cAoKIyMjIExpYnJhcmllcwoKYGBge3Igc2V0dXB9CiMgV2Ugd2lsbCBiZSBsb2FkaW5nIGEgU2luZ2xlQ2VsbEV4cGVyaW1lbnQgb2JqZWN0IGludG8gb3VyIGVudmlyb25tZW50IGJ1dCBkb24ndCBuZWVkIHRvIHNlZSB0aGUgc3RhcnR1cCBtZXNzYWdlcwpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCn0pCgojIExpYnJhcnkgd2UnbGwgdXNlIGZvciB0aGUgZ2VuZSBzZXQgYW5hbHlzaXMgaXRzZWxmCmxpYnJhcnkoQVVDZWxsKQoKIyBMaWJyYXJpZXMgZm9yIGFjY2Vzc2luZyBhbmQgd29ya2luZyB3aXRoIGdlbmUgc2V0cwpsaWJyYXJ5KEdTRUFCYXNlKQpsaWJyYXJ5KG1zaWdkYnIpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKIyMjIyBEaXJlY3RvcmllcwoKYGBge3Igc2V0dXBfZGlyZWN0b3JpZXN9CiMgSW5wdXQgZGF0YSAKZXdpbmdfZGF0YV9kaXIgPC0gZnM6OnBhdGgoImRhdGEiLCAiZXdpbmctc2FyY29tYSIpCnByb2Nlc3NlZF9kaXIgPC0gZnM6OnBhdGgoZXdpbmdfZGF0YV9kaXIsICJwcm9jZXNzZWQiKQoKIyBEaXJlY3RvcnkgZm9yIGhvbGRpbmcgcGF0aHdheSBhbmFseXNpcyByZXN1bHRzCmFuYWx5c2lzX2RpciA8LSBmczo6cGF0aCgiYW5hbHlzaXMiLCAiZXdpbmctc2FyY29tYSIsICJwYXRod2F5LWFuYWx5c2lzIikKIyBDcmVhdGUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQKZnM6OmRpcl9jcmVhdGUoYW5hbHlzaXNfZGlyKQpgYGAKCiMjIyMgRmlsZXMKClRoZSBpbnB1dCB3aWxsIGJlIGEgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBmb3IgYW4gaW5kaXZpZHVhbCBFd2luZyBzYXJjb21hIGxpYnJhcnkuCgpgYGB7ciBzZXR1cF9pbnB1dF9maWxlc30Kc2NlX2ZpbGUgPC0gZnM6OnBhdGgocHJvY2Vzc2VkX2RpciwgCiAgICAgICAgICAgICAgICAgICAgICJTQ1BDUzAwMDQ5MCIsIAogICAgICAgICAgICAgICAgICAgICAiU0NQQ0wwMDA4MjJfcHJvY2Vzc2VkLnJkcyIpCmBgYAoKV2Ugd2lsbCBzYXZlIHRoZSBBVUNlbGwgcmVzdWx0cyBhcyBhIHRhYmxlIGluIHRoZSBhbmFseXNpcyBkaXJlY3RvcnkuCgpgYGB7ciBzZXR1cF9vdXRwdXRfZmlsZXMsIGxpdmUgPSBUUlVFfQpvdXRwdXRfZmlsZSA8LSBmczo6cGF0aChhbmFseXNpc19kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICJld2luZ19zYXJjb21hX2F1Y2VsbF9yZXN1bHRzLnRzdiIpCmBgYAoKCiMjIyBGdW5jdGlvbnMKClRoZSBgc291cmNlKClgIGZ1bmN0aW9uIGFsbG93cyB1cyB0byBsb2FkIGluIGN1c3RvbSBmdW5jdGlvbnMgd2Ugc2F2ZWQgaW4gYW4gYC5SYCBmaWxlLgoKYGBge3Igc291cmNlX2Z1bmN0aW9uc30Kc291cmNlKGZzOjpwYXRoKCJ1dGlsIiwgImF1Y2VsbF9mdW5jdGlvbnMuUiIpKQpgYGAKClRoaXMgbG9hZHMgb25lIGN1c3RvbSBmdW5jdGlvbiwgY2FsbGVkIGBwbG90X3JlY292ZXJ5X2N1cnZlKClgLCBpbnRvIG91ciBlbnZpcm9ubWVudC4KVGhpcyBmdW5jdGlvbiBpcyBhZGFwdGVkIGZyb20gW3RoZSBBVUNlbGwgdmlnbmV0dGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hZXJ0c2xhYi9BVUNlbGwvYmxvYi85MTc1M2IzMjdhMzlkYzdhNGJiZWQ0NjQwOGVjMjI3MWM0ODVmMmYwL3ZpZ25ldHRlcy9BVUNlbGwuUm1kI0wyOTUtTDMxNikuCgojIyBTZXQgdXAgZ2VuZSBzZXRzCgpXZSBhcmUgZ29pbmcgdG8gdXNlIHR3byBnZW5lIHNldHMgcGVydGFpbmluZyB0byBFd2luZyBzYXJjb21hLgoKKiBbYFpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT05gXShodHRwczovL3d3dy5nc2VhLW1zaWdkYi5vcmcvZ3NlYS9tc2lnZGIvZ2VuZXNldF9wYWdlLmpzcD9nZW5lU2V0TmFtZT1aSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OKSwgd2hpY2ggYXJlIGdlbmVzIHRoYXQgd2VyZSBoaWdobHkgZXhwcmVzc2VkIGluIGEgcmhhYmRvbXlvc2FyY29tYSBjZWxsIGxpbmUgZW5naW5lZXJlZCB0byBleHByZXNzIHRoZSBFV1NSMS1GTEkxIGZ1c2lvbi4KKiBbYFJJR0dJX0VXSU5HX1NBUkNPTUFfUFJPR0VOSVRPUl9VUGBdKGh0dHBzOi8vd3d3LmdzZWEtbXNpZ2RiLm9yZy9nc2VhL21zaWdkYi9jYXJkcy9SSUdHSV9FV0lOR19TQVJDT01BX1BST0dFTklUT1JfVVApLCB3aGljaCBhcmUgZ2VuZXMgdGhhdCB3ZXJlIGhpZ2hseSBleHByZXNzZWQgaW4gbWVzZW5jaHltYWwgc3RlbSBjZWxscyBlbmdpbmVlcmVkIHRvIGV4cHJlc3MgdGhlIEVXUy1GTEkxIGZ1c2lvbiBwcm90ZWluLgoKV2Ugd291bGQgZXhwZWN0IGJvdGggb2YgdGhlc2UgZ2VuZSBzZXRzIHRvIGhhdmUgaGlnaCBleHByZXNzaW9uIGluIHR1bW9yIGNlbGxzLgoKYGBge3IgZ2VuZXNldHN9CiMgQ3JlYXRlIGEgbmFtZWQgdmVjdG9yIHdpdGggdGhlIHJlbGV2YW50IGdlbmUgc2V0IG5hbWVzCmV3aW5nX2dlbmVfc2V0X25hbWVzIDwtIGMoemhhbmcgPSAiWkhBTkdfVEFSR0VUU19PRl9FV1NSMV9GTEkxX0ZVU0lPTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnZ2kgPSAiUklHR0lfRVdJTkdfU0FSQ09NQV9QUk9HRU5JVE9SX1VQIikKCmV3aW5nX2dlbmVfc2V0X25hbWVzCmBgYAoKVGhlc2UgZ2VuZSBzZXRzIGNvbWUgZnJvbSB0aGUgQzIgZ2VuZSBzZXQgY29sbGVjdGlvbiBmcm9tIE1TaWdEQi4KTGV0J3MgcmV0cmlldmUgdGhlbSB1c2luZyBgbXNpZ2RicigpYC4KCmBgYHtyIGV4dHJhY3RfZ2VuZXNldHMsIGxpdmUgPSBUUlVFfQpld2luZ19nZW5lX3NldHNfZGYgPC0gbXNpZ2RicihzcGVjaWVzID0gIkhvbW8gc2FwaWVucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gIkMyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2F0ZWdvcnkgPSAiQ0dQIikgfD4KICBkcGx5cjo6ZmlsdGVyKGdzX25hbWUgJWluJSBld2luZ19nZW5lX3NldF9uYW1lcykKYGBgCgpgQVVDZWxsYCB1c2VzIGdlbmUgc2V0cyBpbiBhIHBhcnRpY3VsYXIgZm9ybWF0IHRoYXQgY29tZXMgZnJvbSB0aGUgYEdTRUFCYXNlYCBwYWNrYWdlLgpXZSBuZWVkIHRvIGNyZWF0ZSBhIGBHZW5lU2V0Q29sbGVjdGlvbmAuCgpgYGB7ciBnZW5lX3NldF9jb2xsZWN0aW9ufQpld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uIDwtIGV3aW5nX2dlbmVfc2V0X25hbWVzIHw+CiAgcHVycnI6Om1hcCgKICAgICMgRm9yIGVhY2ggZ2VuZSBzZXQKICAgIFwoZ2VuZV9zZXRfbmFtZSkgewogICAgICBld2luZ19nZW5lX3NldHNfZGYgfD4KICAgICAgICAjIFN1YnNldCB0byB0aGUgcm93cyBpbiB0aGF0IGdlbmUgc2V0CiAgICAgICAgZHBseXI6OmZpbHRlcihnc19uYW1lID09IGdlbmVfc2V0X25hbWUpIHw+CiAgICAgICAgIyBHcmFiIHRoZSBFbnNlbWJsIGdlbmUgaWRlbnRpZmllcnMKICAgICAgICBkcGx5cjo6cHVsbChlbnNlbWJsX2dlbmUpIHw+CiAgICAgICAgIyBDcmVhdGUgYSBHZW5lU2V0IG9iamVjdAogICAgICAgIEdlbmVTZXQoc2V0TmFtZSA9IGdlbmVfc2V0X25hbWUsCiAgICAgICAgICAgICAgICBnZW5lSWRUeXBlID0gRU5TRU1CTElkZW50aWZpZXIoKSkKICAgIH0KICApIHw+CiAgIyBUdXJuIHRoZSBsaXN0IG9mIEdlbmVTZXQgb2JqZWN0cyBpbnRvIGEgR2VuZVNldCBjb2xsZWN0aW9uCiAgR2VuZVNldENvbGxlY3Rpb24oKQpgYGAKCiMjIFJlYWQgaW4gYW5kIHByZXBhcmUgU2luZ2xlQ2VsbEV4cGVyaW1lbnQKCmBgYHtyIHJlYWRfaW5fc2NlLCBsaXZlID0gVFJVRX0Kc2NlIDwtIHJlYWRyOjpyZWFkX3JkcyhzY2VfZmlsZSkKYGBgCgpUaGUgYEFVQ2VsbGAgZnVuY3Rpb25zIHRha2VzIGFuIGV4cHJlc3Npb24gbWF0cml4IHdpdGggZ2VuZXMgYXMgcm93cyBhbmQgY2VsbHMgYXMgY29sdW1uLgpXZSBjYW4gZXh0cmFjdCBhIGNvdW50cyBtYXRyaXggaW4gc3BhcnNlIGZvcm1hdCBmb3IgdXNlIHdpdGggYEFVQ2VsbGAuCgpgYGB7ciBjb3VudHNfbWF0cml4fQojIEV4dHJhY3QgY291bnRzIG1hdHJpeApjb3VudHNfbWF0cml4IDwtIGNvdW50cyhzY2UpCmBgYAoKVGhlcmUgbWF5IGJlIGdlbmVzIGluIG91ciBnZW5lIHNldCB0aGF0IGRvIG5vdCBhcHBlYXIgaW4gdGhlIFNpbmdsZUNlbGxFeHBlcmltZW50IG9iamVjdC4KV2UgY2FuIHJlbW92ZSB0aGVtIHVzaW5nIHRoZSBgc3Vic2V0R2VuZVNldHMoKWAgZnVuY3Rpb24uCgpgYGB7ciBzdWJzZXRfZ2VuZV9zZXRzLCBsaXZlID0gVFJVRX0KIyBSZW1vdmUgZ2VuZXMgZnJvbSBnZW5lIHNldHMgaWYgdGhleSBhcmUgbm90IGluIHRoZSBTQ0UKZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiA8LSBzdWJzZXRHZW5lU2V0cyhld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd25hbWVzKGNvdW50c19tYXRyaXgpKQpgYGAKCiMjIEFVQ2VsbAoKQVVDZWxsIHJlbGllcyBvbiByYW5raW5nIGdlbmVzIGZyb20gaGlnaGVzdCB0byBsb3dlc3QgZXhwcmVzc2lvbiB2YWx1ZSB0byBjYWxjdWxhdGUgdGhlIEFVQy4KVGhlIEFVQyBpcyB0aGUgYXJlYSB1bmRlciB0aGUgcmVjb3ZlcnkgY3VydmUsIHdoaWNoIGNhcHR1cmVzIHRoZSBudW1iZXIgb2YgZ2VuZXMgaW4gYSBnZW5lIHNldCB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSByYW5raW5ncyBhYm92ZSBzb21lIHRocmVzaG9sZCAoaS5lLiwgaXQgaXMgdGhlIGFyZWEgdW5kZXIgdGhlIGN1cnZlIHRvIHRoZSBsZWZ0IG9mIHRoaXMgZ2VuZSByYW5rKS4KQnkgZGVmYXVsdCwgdGhlIHRvcCA1JSBvZiBnZW5lcyBhcmUgdXNlZCBhcyB0aGUgdGhyZXNob2xkLgoKU29tZSBnZW5lcyB3aWxsIG5vdCBiZSBkZXRlY3RlZCAoaS5lLiwgaGF2ZSAwIGNvdW50cykuCkdlbmVzIGNhbiBhbHNvIGhhdmUgdGhlIHNhbWUgZXhwcmVzc2lvbiBsZXZlbCAoaS5lLiwgdGllcykuClRoZXNlIHVuZGV0ZWN0ZWQgZ2VuZXMgYW5kIHRpZXMgd2lsbCBiZSByYW5kb21seSBvcmRlcmVkIGluIG91ciByYW5raW5nLgpUbyBtYWtlIG91ciByYW5raW5ncyDigJMgYW5kIHRoZXJlZm9yZSByZXN1bHRzIOKAkyByZXByb2R1Y2libGUsIHdlIHdpbGwgc2V0IGEgc2VlZC4KCmBgYHtyIHNldF9zZWVkLCBsaXZlID0gVFJVRX0Kc2V0LnNlZWQoMjAyNCkKYGBgCgojIyMgQ2VsbCByYW5raW5nCgpUaGUgZmlyc3Qgc3RlcCBpbiBBVUNlbGwgaXMgdG8gcmFuayBnZW5lcyBmb3IgZWFjaCBjZWxsIGZyb20gaGlnaGVzdCB0byBsb3dlc3QgZXhwcmVzc2lvbiB2YWx1ZS4KV2UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIGBBVUNlbGxfYnVpbGRSYW5raW5ncygpYCBmdW5jdGlvbiwgd2hpY2ggd2lsbCBvdXRwdXQgYSB2aXN1YWxpemF0aW9uIHNob3dpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGluIHRoZSBjZWxscyBpbiBvdXIgU2luZ2xlQ2VsbEV4cGVyaW1lbnQgb2JqZWN0LgoKYGBge3IgY2VsbF9yYW5raW5ncywgbGl2ZSA9IFRSVUV9CmNlbGxfcmFua2luZ3MgPC0gQVVDZWxsX2J1aWxkUmFua2luZ3MoY291bnRzX21hdHJpeCkKYGBgCgpUaGUgQVVDZWxsIGF1dGhvcnMgcmVjb21tZW5kIG1ha2luZyBzdXJlIG1vc3QgY2VsbHMgaGF2ZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIGdlbmVzIHdlIHdpbGwgdXNlIGFzIHRoZSBtYXggcmFuayB0byBjYWxjdWxhdGUgdGhlIEFVQy4KClRoZSBBVUMgbWF4IHJhbmsgdmFsdWUgdGVsbHMgQVVDZWxsIHRoZSBjdXRvZmYgaW4gdGhlIGdlbmUgcmFua2luZ3MgdG8gdXNlIGZvciBjYWxjdWxhdGluZyBBVUM7IHdlIHdpbGwgdmlzdWFsaXplIHRoaXMgY3VydmUgYW5kIG1heCByYW5rIGluIGp1c3QgYSBtb21lbnQuCklmIHdlIHBpY2tlZCBhIG1heCByYW5rIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2YgZ2VuZXMgZGV0ZWN0ZWQgaW4gbW9zdCBjZWxscywgdGhlIG5vbi1kZXRlY3RlZCBnZW5lcyB0aGF0IGFyZSByYW5kb21seSBvcmRlcmVkIHdvdWxkIHBsYXkgYW4gb3V0c2l6ZWQgcm9sZSBpbiBvdXIgQVVDIHZhbHVlcy4KCkJ5IGRlZmF1bHQsIHRoZSBtYXggcmFuayBpcyB0aGUgdG9wIDUlIGhpZ2hlc3QgZXhwcmVzc2VkIGdlbmVzLgpXZSBjYW4gY2FsY3VsYXRlIHRoZSBkZWZhdWx0IG1heCByYW5rIGJ5IHRha2luZyBpbnRvIGFjY291bnQgdGhlIG51bWJlciBvZiBnZW5lcy4KCmBgYHtyIGV4cGxvcmVfYXVjX21heF9yYW5rfQpucm93KGNlbGxfcmFua2luZ3MpICogMC4wNQpgYGAKClRoaXMgbnVtYmVyIGlzIHByb2JhYmx5IHRvbyBoaWdoLCBnaXZlbiB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBudW1iZXIgb2YgZ2VuZXMgZGV0ZWN0ZWQgYnkgY2VsbCB3ZSB2aXN1YWxpemVkIHdpdGggYEFVQ2VsbF9idWlsZFJhbmtpbmdzKClgLgoKV2hhdCBpZiB3ZSBjaG9zZSBhIDElIHRocmVzaG9sZD8KCmBgYHtyIGxvd2VyX21heF9yYW5rLCBsaXZlID0gVFJVRX0KbnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDEKYGBgCgpUaGF0IGlzIHByb2JhYmx5IGEgbW9yZSByZWFzb25hYmxlIGNob2ljZSBmb3IgdGhpcyBkYXRhc2V0LgoKV2UgY2FuIHVzZSBhIGZ1bmN0aW9uIGNhbGxlZCBgY2VpbGluZygpYCB0byByb3VuZCB0aGlzIGFuZCBzYXZlIGl0IHRvIGEgdmFyaWFibGUgZm9yIGxhdGVyIHVzZS4KCmBgYHtyIGF1Y19tYXhfcmFuaywgbGl2ZSA9IFRSVUV9CmF1Y19tYXhfcmFuayA8LSBjZWlsaW5nKG5yb3coY2VsbF9yYW5raW5ncykgKiAwLjAxKQpgYGAKCiMjIyBQbG90dGluZyBBVUMKClRoZSBBVUMgdmFsdWVzIHdlIGdldCBvdXQgb2YgQVVDZWxsIGFyZSB0aGUgYXJlYSB1bmRlciBhIHJlY292ZXJ5IGN1cnZlIGFuZCBlc3RpbWF0ZSB0aGUgcHJvcG9ydGlvbiBvZiBnZW5lcyBpbiB0aGUgZ2VuZSBzZXQgdGhhdCBhcmUgaGlnaGx5IGV4cHJlc3NlZCAoaS5lLiwgaGlnaGx5IHJhbmtlZCkuCgpMZXQncyBwbG90IHRoZSByZWNvdmVyeSBjdXJ2ZSBmb3IgYSBjZWxsIHdpdGggaGlnaCBBVUMgYW5kIGEgY2VsbCB3aXRoIGxvdyBBVUMgdG8gZ2V0IGEgYmV0dGVyIGludHVpdGlvbiBhYm91dCBBVUMgdmFsdWVzLgpFYXJsaWVyLCB3ZSBsb2FkZWQgYSBjdXN0b20gZnVuY3Rpb24gd2UgYWRhcHRlZCBmcm9tIFt0aGUgQVVDZWxsIHZpZ25ldHRlXShodHRwczovL2dpdGh1Yi5jb20vYWVydHNsYWIvQVVDZWxsL2Jsb2IvOTE3NTNiMzI3YTM5ZGM3YTRiYmVkNDY0MDhlYzIyNzFjNDg1ZjJmMC92aWduZXR0ZXMvQVVDZWxsLlJtZCkgY2FsbGVkIGBwbG90X3JlY292ZXJ5X2N1cnZlKClgIHdpdGggYHNvdXJjZSgpYC4KCkZpcnN0LCB3ZSdsbCBzdGFydCB3aXRoIGEgY2VsbCB3aXRoIGEgaGlnaCBBVUMuCldlIHBpY2tlZCB0aGlzIGJhcmNvZGUgYWhlYWQgb2YgdGltZSB3aGVuIHdlIHdyb3RlIHRoZSBub3RlYm9vay4KCmBgYHtyIGhpZ2hfcmVjb3ZlcnlfY3VydmV9CnBsb3RfcmVjb3ZlcnlfY3VydmUoY2VsbF9yYW5raW5ncywKICAgICAgICAgICAgICAgICAgICBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIGdlbmVfc2V0X25hbWUgPSAiWkhBTkdfVEFSR0VUU19PRl9FV1NSMV9GTEkxX0ZVU0lPTiIsCiAgICAgICAgICAgICAgICAgICAgYmFyY29kZSA9ICJDVEdBR0NHR1RDVFRUQVRDIiwKICAgICAgICAgICAgICAgICAgICBhdWNfbWF4X3JhbmsgPSBhdWNfbWF4X3JhbmspICAjIDElIHRocmVzaG9sZCAKYGBgCgpUaGUgeC1heGlzIGlzIHRoZSBnZW5lIHJhbmtzIGZvciBhbGwgZ2VuZXMuClRoZSB5LWF4aXMgaXMgdGhlIG51bWJlciBvZiBnZW5lcyBpbiB0aGUgc2lnbmF0dXJlIGF0IGEgZ2l2ZW4gcG9pbnQgaW4gdGhlIGdlbmUgcmFua2luZyDigJMgdGhlIGxpbmUgd2lsbCByaXNlIHdoZW4gYSBnZW5lIGluIHRoZSBnZW5lIHNldCBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgcmFua2luZyBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0LgpUaGUgQVVDIGlzIHRoZSBhcmVhIHVuZGVyIHRoaXMgcmVjb3ZlcnkgY3VydmUgYXQgdGhlIG1heCByYW5rIHRocmVzaG9sZCBjaG9zZW4gZm9yIHRoaXMgZGF0YXNldC4KCk5vdywgbGV0J3MgbG9vayBhdCBhbiBleGFtcGxlIHdpdGggYSBsb3cgQVVDLgoKYGBge3IgbG93X3JlY292ZXJ5X2N1cnZlfQpwbG90X3JlY292ZXJ5X2N1cnZlKGNlbGxfcmFua2luZ3MsCiAgICAgICAgICAgICAgICAgICAgZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9uYW1lID0gIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT04iLAogICAgICAgICAgICAgICAgICAgIGJhcmNvZGUgPSAiQUdBVEFHQUdUQ0FDQUFUQyIsCiAgICAgICAgICAgICAgICAgICAgYXVjX21heF9yYW5rID0gYXVjX21heF9yYW5rKSAgIyAxJSB0aHJlc2hvbGQKYGBgCgpGYXIgZmV3ZXIgZ2VuZXMgaW4gdGhlIGdlbmUgc2V0IGFyZSByYW5rZWQgYWJvdmUgdGhlIHRocmVzaG9sZCwgeWllbGRpbmcgYSBsb3dlciBBVUMgdmFsdWUuCgojIyMgQ2FsY3VsYXRpbmcgdGhlIEFVQwoKT25jZSB3ZSBoYXZlIHRoZSByYW5raW5ncywgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgQVVDIHNjb3JlcyBmb3IgYm90aCBnZW5lIHNldHMgaW4gYWxsIGNlbGxzIHdpdGggdGhlIGBBVUNlbGxfY2FsY0FVQygpYCBmdW5jdGlvbi4KCmBgYHtyIGNhbGNfYXVjLCBsaXZlID0gVFJVRX0KY2VsbF9hdWMgPC0gQVVDZWxsX2NhbGNBVUMoZ2VuZVNldHMgPSBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFua2luZ3MgPSBjZWxsX3JhbmtpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWNNYXhSYW5rID0gYXVjX21heF9yYW5rKQpgYGAKClRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBgYXVjZWxsUmVzdWx0c2Agb2JqZWN0LgoKYGBge3IgY2hlY2tfc3RyLCBsaXZlID0gVFJVRX0Kc3RyKGNlbGxfYXVjKQpgYGAKCkl0IGNhbiBiZSBtdWNoIG1vcmUgY29udmVuaWVudCB0byB3b3JrIHdpdGggdGhpcyBpbiBhIHRhYnVsYXIgZm9ybWF0LgoKYGBge3IgYXVjX3RvX3RhYmxlfQojIEV4dHJhY3QgQVVDCmF1Y19kZiA8LSBjZWxsX2F1Y0Bhc3NheXNAZGF0YSRBVUMgfD4KICAjIFRyYW5zcG9zZQogIHQoKSB8PgogICMgQ29udmVydCB0byBkYXRhIGZyYW1lCiAgYXMuZGF0YS5mcmFtZSgpIHw+CiAgIyBNYWtlIHRoZSBiYXJjb2RlcyBhIGNvbHVtbgogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJiYXJjb2RlcyIpIAoKIyBMb29rIGF0IGZpcnN0IGZldyByb3dzCmhlYWQoYXVjX2RmKQpgYGAKCiMjIyBBc3NpZ25tZW50cwoKQVVDZWxsIGNhbiBhc3NpZ24gY2VsbHMgYXMgaGF2aW5nIGFuIGFjdGl2ZSBnZW5lIHNldCBvciBub3QgYnkgcGlja2luZyBhIHRocmVzaG9sZCBhdXRvbWF0aWNhbGx5LgpXZSdsbCBleHBsb3JlIHRoZXNlIGluIGEgbGF0ZXIgcGxvdCwgYnV0IGZvciBub3csIGxldCdzIGNhbGN1bGF0ZSB0aGUgdGhyZXNob2xkIGFuZCBhc3NpZ24gY2VsbHMgd2l0aCBgQVVDZWxsX2V4cGxvcmVUaHJlc2hvbGRzKClgLgoKYGBge3IgYXVjX2Fzc2lnbm1lbnRzLCBsaXZlID0gVFJVRX0KYXVjX2Fzc2lnbm1lbnRzIDwtIEFVQ2VsbF9leHBsb3JlVGhyZXNob2xkcyhjZWxsX2F1YywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdEhpc3QgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduQ2VsbHMgPSBUUlVFKQpgYGAKCldlJ3JlIGdvaW5nIHRvIHBsb3QgdGhlIGRpc3RyaWJ1dGlvbiBvZiBBVUMgdmFsdWVzIHdpdGggYGdncGxvdDJgLCBzbyB3ZSB3aWxsIHdhbnQgdGhlIEFVQyB2YWx1ZXMgaW4gYSBsb25nZXIgZm9ybWF0LgoKYGBge3IgYXVjX3Bsb3R0aW5nX2RmfQphdWNfcGxvdHRpbmdfZGYgPC0gYXVjX2RmIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcighYmFyY29kZXMsCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJnZW5lX3NldCIsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiYXVjIikgfD4KICBkcGx5cjo6bXV0YXRlKAogICAgIyBDcmVhdGUgYSBuZXcgbG9naWNhbCBjb2x1bW4gY2FsbGVkIGFzc2lnbmVkCiAgICBhc3NpZ25lZCA9IGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICMgRm9yIFpoYW5nIGdlbmUgc2V0IHJvd3MsIHNldCB0byBUUlVFIHdoZW4gdGhlIGJhcmNvZGUgaXMgaW4gdGhlIAogICAgICAjIGFzc2lnbm1lbnQgbGlzdAogICAgICBnZW5lX3NldCA9PSBld2luZ19nZW5lX3NldF9uYW1lc1tbInpoYW5nIl1dICYgCiAgICAgICAgYmFyY29kZXMgJWluJSBhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzW1siemhhbmciXV1dXSRhc3NpZ25tZW50IH4gVFJVRSwKICAgICAgIyBGb3IgUmlnZ2kgZ2VuZSBzZXQgcm93cywgc2V0IHRvIFRSVUUgd2hlbiB0aGUgYmFyY29kZSBpcyBpbiB0aGUgCiAgICAgICMgYXNzaWdubWVudCBsaXN0CiAgICAgIGdlbmVfc2V0ID09IGV3aW5nX2dlbmVfc2V0X25hbWVzW1sicmlnZ2kiXV0gJiAKICAgICAgICBiYXJjb2RlcyAlaW4lIGF1Y19hc3NpZ25tZW50c1tbZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJyaWdnaSJdXV1dJGFzc2lnbm1lbnQgfiBUUlVFLAogICAgICAjIE90aGVyd2lzZSwgc2V0IHRvIEZBTFNFCiAgICAgIC5kZWZhdWx0ID0gRkFMU0UKICAgICkKICApCgphdWNfcGxvdHRpbmdfZGYKYGBgCgpUbyBkcmF3IHZlcnRpY2FsIGxpbmVzIHJlcHJlc2VudGluZyB0aGUgYXV0b21hdGljYWxseSBjaG9zZW4gdGhyZXNob2xkLCB3ZSBjYW4gY3JlYXRlIGEgc2VwYXJhdGUgZGF0YSBmcmFtZS4KCmBgYHtyIGF1Y190aHJlc2hvbGRfZGZ9CmF1Y190aHJlc2hvbGRfZGYgPC0gZGF0YS5mcmFtZSgKICBnZW5lX3NldCA9IGV3aW5nX2dlbmVfc2V0X25hbWVzLAogICMgR3JhYiB0aHJlc2hvbGRzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGdlbmUgc2V0IGZyb20gYXNzaWduZW1lbnRzIG9iamVjdAogIHRocmVzaG9sZCA9IGMoYXVjX2Fzc2lnbm1lbnRzW1tld2luZ19nZW5lX3NldF9uYW1lc1siemhhbmciXV1dJGF1Y1RociRzZWxlY3RlZCwgCiAgICAgICAgICAgICAgICBhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzWyJyaWdnaSJdXV0kYXVjVGhyJHNlbGVjdGVkKQopCgphdWNfdGhyZXNob2xkX2RmCmBgYAoKTm93IGxldCdzIG1ha2UgYSBkZW5zaXR5IHBsb3QsIHBsb3R0aW5nIHRoZSBkZW5zaXR5IG9mIHRoZSBhc3NpZ25lZCBhbmQgdW5hc3NpZ25lZCBjZWxscyBzZXBhcmF0ZWx5IGFuZCBkcmF3aW5nIGEgdmVydGljYWwgbGluZSBmb3IgdGhlIHRocmVzaG9sZC4KCmBgYHtyIGF1Y19kZW5zaXR5X3Bsb3R9CmF1Y19wbG90dGluZ19kZiB8PgogIGdncGxvdDI6OmdncGxvdCgKICAgIGdncGxvdDI6OmFlcygKICAgICAgeCA9IGF1YywgICMgQVVDIHZhbHVlcwogICAgICBjb2xvciA9IGFzc2lnbmVkLCAgIyBHcm91cCBieSBhc3NpZ25tZW50CiAgICAgIGZpbGwgPSBhc3NpZ25lZCwgICAjIEdyb3VwIGJ5IGFzc2lnbm1lbnQKICAgICkKICApICsKICBnZ3Bsb3QyOjpnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjIpICsKICAjIERyYXcgYSB2ZXJ0aWNhbCBkb3R0ZWQgbGluZSBzaG93aW5nIHRoZSB0aHJlc2hvbGQgZm9yIGVhY2ggZ2VuZSBzZXQKICBnZ3Bsb3QyOjpnZW9tX3ZsaW5lKGRhdGEgPSBhdWNfdGhyZXNob2xkX2RmLAogICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGdncGxvdDI6OmFlcyh4aW50ZXJjZXB0ID0gdGhyZXNob2xkKSwKICAgICAgICAgICAgICAgICAgICAgIGx0eSA9IDIpICsKICAjIFBsb3QgZWFjaCBnZW5lIHNldCBpbiBpdHMgb3duIGZhY2V0CiAgZ2dwbG90Mjo6ZmFjZXRfZ3JpZChjb2xzID0gZ2dwbG90Mjo6dmFycyhnZW5lX3NldCkpICsKICAjIFVzZSBhIGJ1aWx0LWluIHRoZW1lCiAgZ2dwbG90Mjo6dGhlbWVfYncoKQpgYGAKCkZvciB0aGVzZSBwYXJ0aWN1bGFyIGdlbmUgc2V0cywgdGhlIEFVQyB2YWx1ZXMgYXBwZWFyIHRvIGJlIGJpbW9kYWxseSBkaXN0cmlidXRlZCwgYW5kIHdlIGNhbiBlYXNpbHkgaWRlbnRpZnkgY2VsbHMgd2hlcmUgdGhlIGdlbmVzIGFyZSBoaWdobHkgZXhwcmVzc2VkLgoKTGV0J3Mgd3JpdGUgdGhpcyB0YWJsZSB0byB0aGUgb3V0cHV0IGZpbGUuCgpgYGB7ciBzYXZlX2F1Y30KYXVjX3Bsb3R0aW5nX2RmIHw+IAogIHJlYWRyOjp3cml0ZV90c3Yob3V0cHV0X2ZpbGUpCmBgYAoKIyMjIFVNQVBzCgojIyMjIEFkZGluZyBBVUMgdG8gYGNvbERhdGFgCgpXZSBjYW4gYWxzbyBhZGQgdGhlIEFVQyB2YWx1ZXMgYmFjayBpbnRvIHRoZSBTaW5nbGVDZWxsRXhwZXJpbWVudCBmb3IgY29udmVuaWVuY2UsIGUuZy4sIGZvciBwbG90dGluZy4KV2UnbGwgYWRkIGl0IHRvIHRoZSBleGlzdGluZyBgY29sRGF0YWAuCgpGaXJzdCwgbGV0J3MgcmVuYW1lIHRoZSBnZW5lIHNldCBjb2x1bW5zIHRvIHNvbWV0aGluZyBtb3JlIGVhc2lseSB0eXBlZC4KCmBgYHtyIHJlbmFtZV9nZW5lX3NldH0KYXVjX2RmIDwtIGF1Y19kZiB8PgogICMgVXNlIHNob3J0ZXIgbmFtZXMKICBkcGx5cjo6cmVuYW1lKHpoYW5nX2F1YyA9IGV3aW5nX2dlbmVfc2V0X25hbWVzW1siemhhbmciXV0sCiAgICAgICAgICAgICAgICByaWdnaV9hdWMgPSBld2luZ19nZW5lX3NldF9uYW1lc1tbInJpZ2dpIl1dKQoKYGBgCgpBbmQgam9pbiBpdCB0byB0aGUgZXhpc3RpbmcgYGNvbERhdGFgLgoKYGBge3IgY29sZGF0YSwgbGl2ZSA9IFRSVUV9CiMgRXh0cmFjdCB0aGUgZXhpc3RpbmcgY29sRGF0YSwgYW5kIGxlZnQgam9pbiBpdCB3aXRoIHRoZSBBVUMgdmFsdWVzIGJ5IHRoZQojIGJhcmNvZGVzCmNvbGRhdGFfZGYgPC0gY29sRGF0YShzY2UpIHw+CiAgYXMuZGF0YS5mcmFtZSgpIHw+CiAgZHBseXI6OmxlZnRfam9pbigKICAgIGF1Y19kZiwKICAgIGJ5ID0gImJhcmNvZGVzIgogICkKYGBgCgpOb3csIHdlJ3JlIHJlYWR5IHRvIGFkZCBpdCBiYWNrIHRvIHRoZSBvYmplY3QuCgpgYGB7ciBhZGRfYmFja19jb2xEYXRhLCBsaXZlID0gVFJVRX0KIyBXZSBuZWVkIHRvIHNhdmUgdGhpcyBhcyBhIERhdGFGcmFtZQpjb2xEYXRhKHNjZSkgPC0gRGF0YUZyYW1lKAogIGNvbGRhdGFfZGYsCiAgcm93Lm5hbWVzID0gY29sRGF0YShzY2UpJGJhcmNvZGVzCikKYGBgCgojIyMjIFBsb3R0aW5nIFVNQVBzCgpXZSBjYW4gdXNlIHRoZSBgcGxvdFVNQVAoKWAgZnVuY3Rpb24gZnJvbSB0aGUgYHNjYXRlcmAgcGFja2FnZSB0byBwbG90IGEgVU1BUCB3aXRoIHRoZSBwb2ludHMgY29sb3JlZCBieSB0aGUgQVVDIHZhbHVlCgpgYGB7ciBwbG90X3VtYXBfemhhbmd9CnNjYXRlcjo6cGxvdFVNQVAoc2NlLCBjb2xvdXJfYnkgPSAiemhhbmdfYXVjIikgKwogICMgVXNlIHRoZSBnZW5lIHNldCBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXMKICBnZ3Bsb3QyOjpnZ3RpdGxlKHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChld2luZ19nZW5lX3NldF9uYW1lc1tbInpoYW5nIl1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiKSkKYGBgCgpMZXQncyBjb2xvciB0aGUgcG9pbnRzIGJ5IHRoZSBBVUMgdmFsdWVzIGZvciB0aGUgb3RoZXIgZ2VuZSBzZXQuCgpgYGB7ciBwbG90X3VtYXBfcmlnZ2ksIGxpdmUgPSBUUlVFfQpzY2F0ZXI6OnBsb3RVTUFQKHNjZSwgY29sb3VyX2J5ID0gInJpZ2dpX2F1YyIpICsgCiAgZ2dwbG90Mjo6Z2d0aXRsZShzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJyaWdnaSJdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIikpCmBgYAoKV2Ugd291bGQgd2FudCB0byBkbyBzb21ldGhpbmcgbW9yZSBmb3JtYWwgdG8gY29uZmlybSwgYnV0IGl0IHNlZW1zIGxpa2UgdGhlIHNhbWUgY2VsbHMgaGF2ZSBoaWdoIEFVQyB2YWx1ZXMgZm9yIGJvdGggZ2VuZSBzZXRzIQoKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7ciBzZXNzaW9uX2luZm99CnNlc3Npb25JbmZvKCkKYGBgCg==
    +
    LS0tCnRpdGxlOiAiUGF0aHdheSBBbmFseXNpczogQVVDZWxsIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCmF1dGhvcjogQ0NETCBmb3IgQUxTRgpkYXRlOiAyMDI0Ci0tLQoKKkFkYXB0ZWQgZnJvbSBbdGhlIEFVQ2VsbCB2aWduZXR0ZV0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy92aWduZXR0ZXMvQVVDZWxsL2luc3QvZG9jL0FVQ2VsbC5odG1sKSBhbmQgW3RoZSBgY2VsbC10eXBlLWV3aW5nc2AgbW9kdWxlXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuU2NQQ0EtYW5hbHlzaXMvdHJlZS9tYWluL2FuYWx5c2VzL2NlbGwtdHlwZS1ld2luZ3MpIHRoYXQgaXMgcGFydCBvZiB0aGUgT3BlbiBTaW5nbGUtY2VsbCBQZWRpYXRyaWMgQ2FuY2VyIEF0bGFzIHByb2plY3QuKgoKIyMgT2JqZWN0aXZlcwoKLSBJbnRyb2R1Y2UgdGhlIGBBVUNlbGxgIFIgcGFja2FnZQotIElsbHVzdHJhdGUgaG93IEFVQyB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQKLSBEZW1vbnN0cmF0ZSBob3cgQVVDIHZhbHVlcyBjYW4gYmUgdXNlZCBmb3IgY2VsbCBhc3NpZ25tZW50IGFuZCBwbG90dGluZwoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBgQVVDZWxsYCBtZXRob2QsIGludHJvZHVjZWQgaW4gW0FpYmFyIF9ldCBhbF8uIDIwMTcuXShodHRwczovL2RvaS5vcmcvMTAuMTAzOC9ubWV0aC40NDYzKS4KCldlIGNhbiB1c2UgYEFVQ2VsbGAgd2hlbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBhIGdlbmUgc2V0J3MgcmVsYXRpdmUgZXhwcmVzc2lvbiBvciBhY3Rpdml0eSBpbiBhbiBpbmRpdmlkdWFsIGNlbGwuCkdlbmUgc2V0cyBjYW4gY29tZSBmcm9tIGEgY3VyYXRlZCBjb2xsZWN0aW9uIG9mIHByaW9yIGtub3dsZWRnZSwgbGlrZSB0aGUgSGFsbG1hcmsgY29sbGVjdGlvbiB3ZSB1c2VkIGluIHRoZSBsYXN0IG5vdGVib29rLCBvciB3ZSBjYW4gdXNlIG91ciBvd24gY3VzdG9tIGdlbmUgc2V0cyAoZS5nLiwgYSBzZXQgb2YgbWFya2VyIGdlbmVzIGZvciBhIGNlbGwgdHlwZSBvZiBpbnRlcmVzdCkuCgpBIG5pY2UgZmVhdHVyZSBvZiBgQVVDZWxsYCBpcyB0aGF0IGl0IGlzIGJhc2VkIG9uIHJhbmtpbmcgZ2VuZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBleHByZXNzaW9uIHZhbHVlIGluIGFuIGluZGl2aWR1YWwgY2VsbCwgd2hpY2ggaXMgaGVscGZ1bCBpbiB0aGUgZm9sbG93aW5nIHdheXMgKFtgQVVDZWxsYCB2aWduZXR0ZV0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy92aWduZXR0ZXMvQVVDZWxsL2luc3QvZG9jL0FVQ2VsbC5odG1sKSk6CgotIEl0IGNhbiB0YWtlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCB2YWx1ZXMgYXMgaW5wdXQgKGUuZy4sIHJhdyBjb3VudHMsIFRQTSkgCi0gSXQgY29tcGVuc2F0ZXMgZm9yIGRpZmZlcmVuY2VzIGluIGxpYnJhcnkgc2l6ZSwgd2hlcmUgc29tZXRoaW5nIGxpa2UgYXZlcmFnaW5nIHJhdyBjb3VudCB2YWx1ZXMgb2YgZ2VuZXMgaW4gYSBnZW5lIHNldCB3b3VsZCBub3QgCi0gSXQgc2NhbGVzIHRvIGxhcmdlciBkYXRhc2V0cywgc2luY2UgY3JlYXRpbmcgcmFua2luZ3MgaXMgbm90IGFzIHJlc291cmNlLWludGVuc2l2ZSBhcyBzb21ldGhpbmcgbGlrZSBwZXJtdXRhdGlvbiB0ZXN0aW5nLCBhbmQgd2UgY291bGQgc3BsaXQgdXAgdGhlIG9iamVjdCBpbnRvIHN1YnNldHMgb2YgY2VsbHMgaWYgbmVlZGVkCgpgQVVDZWxsYCBjYWxjdWxhdGVzIHRoZSBhcmVhIHVuZGVyIHRoZSByZWNvdmVyeSBjdXJ2ZSAoQVVDKSwgd2hpY2ggInJlcHJlc2VudHMgdGhlIHByb3BvcnRpb24gb2YgZXhwcmVzc2VkIGdlbmVzIGluIHRoZSBzaWduYXR1cmUgYW5kIHRoZWlyIHJlbGF0aXZlIGV4cHJlc3Npb24gdmFsdWUgY29tcGFyZWQgdG8gdGhlIG90aGVyIGdlbmVzIHdpdGhpbiB0aGUgY2VsbCIgKFtBaWJhciBfZXQgYWxfLiAyMDE3Ll0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbm1ldGguNDQ2MykpLgpXZSB3aWxsIHZpc3VhbGl6ZSBzb21lIHJlY292ZXJ5IGN1cnZlcyBpbiB0aGUgbm90ZWJvb2sgdG8gZ2l2ZSB5b3UgYSBiZXR0ZXIgaW50dWl0aW9uIGFib3V0IHRoZSBBVUMgYW5kIGl0cyBtZWFuaW5nLgoKVGhlIEFVQyB2YWx1ZXMgd2UgZ2V0IG91dCBvZiBgQVVDZWxsYCBjYW4gYmUgdXNlZCBpbiBhIG51bWJlciBvZiB3YXlzIChbQWliYXIgX2V0IGFsXy4gMjAxNy5dKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L25tZXRoLjQ0NjMpKToKCi0gQXMgY29udGludW91cyB2YWx1ZXMgd2UgY2FuIHVzZSBmb3IgdmlzdWFsaXphdGlvbiBvciBjbHVzdGVyaW5nCi0gRm9yIGJpbmFyeSBhc3NpZ25tZW50IChpLmUuLCAib24iIGFuZCAib2ZmIiBvciAiZXhwcmVzc2VkIiBhbmQgIm5vdCBleHByZXNzZWQiKSBpZiB3ZSBwaWNrIGEgdGhyZXNob2xkIGVpdGhlciBhdXRvbWF0aWNhbGx5IHVzaW5nIGJ1aWx0LWluIGZ1bmN0aW9uYWxpdHkgb3IgbWFudWFsbHkgYnkgaW5zcGVjdGluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIHNjb3JlcyBvdXJzZWx2ZXMKCldlIHdpbGwgdXNlIGFuIHNuUk5BLXNlcSBvZiBhIEV3aW5nIHNhcmNvbWEgc2FtcGxlIGZyb20gdGhlIFtgU0NQQ1AwMDAwMTVgIHByb2plY3RdKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvcHJvamVjdHMvU0NQQ1AwMDAwMTUpIG9uIHRoZSBTaW5nbGUtY2VsbCBQZWRpYXRyaWMgQ2FuY2VyIEF0bGFzIFBvcnRhbCBhbmQgdHdvIHJlbGV2YW50IGdlbmUgc2V0cyBmcm9tIHRoZSBNb2xlY3VsYXIgU2lnbmF0dXJlcyBEYXRhYmFzZSAoTVNpZ0RCKSB0byBkZW1vbnN0cmF0ZSB0aGlzIG1ldGhvZC4KCiMjIFNldCB1cAoKIyMjIExpYnJhcmllcwoKYGBge3Igc2V0dXB9CiMgV2Ugd2lsbCBiZSBsb2FkaW5nIGEgU2luZ2xlQ2VsbEV4cGVyaW1lbnQgb2JqZWN0IGludG8gb3VyIGVudmlyb25tZW50IGJ1dCBkb24ndCBuZWVkIHRvIHNlZSB0aGUgc3RhcnR1cCBtZXNzYWdlcwpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCn0pCgojIExpYnJhcnkgd2UnbGwgdXNlIGZvciB0aGUgZ2VuZSBzZXQgYW5hbHlzaXMgaXRzZWxmCmxpYnJhcnkoQVVDZWxsKQoKIyBMaWJyYXJpZXMgZm9yIGFjY2Vzc2luZyBhbmQgd29ya2luZyB3aXRoIGdlbmUgc2V0cwpsaWJyYXJ5KEdTRUFCYXNlKQpsaWJyYXJ5KG1zaWdkYnIpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKIyMjIyBEaXJlY3RvcmllcwoKYGBge3Igc2V0dXBfZGlyZWN0b3JpZXN9CiMgSW5wdXQgZGF0YSAKZXdpbmdfZGF0YV9kaXIgPC0gZnM6OnBhdGgoImRhdGEiLCAiZXdpbmctc2FyY29tYSIpCnByb2Nlc3NlZF9kaXIgPC0gZnM6OnBhdGgoZXdpbmdfZGF0YV9kaXIsICJwcm9jZXNzZWQiKQoKIyBEaXJlY3RvcnkgZm9yIGhvbGRpbmcgcGF0aHdheSBhbmFseXNpcyByZXN1bHRzCmFuYWx5c2lzX2RpciA8LSBmczo6cGF0aCgiYW5hbHlzaXMiLCAiZXdpbmctc2FyY29tYSIsICJwYXRod2F5LWFuYWx5c2lzIikKIyBDcmVhdGUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQKZnM6OmRpcl9jcmVhdGUoYW5hbHlzaXNfZGlyKQpgYGAKCiMjIyMgRmlsZXMKClRoZSBpbnB1dCB3aWxsIGJlIGEgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBmb3IgYW4gaW5kaXZpZHVhbCBFd2luZyBzYXJjb21hIGxpYnJhcnkuCgpgYGB7ciBzZXR1cF9pbnB1dF9maWxlc30Kc2NlX2ZpbGUgPC0gZnM6OnBhdGgocHJvY2Vzc2VkX2RpciwgCiAgICAgICAgICAgICAgICAgICAgICJTQ1BDUzAwMDQ5MCIsIAogICAgICAgICAgICAgICAgICAgICAiU0NQQ0wwMDA4MjJfcHJvY2Vzc2VkLnJkcyIpCmBgYAoKV2Ugd2lsbCBzYXZlIHRoZSBgQVVDZWxsYCByZXN1bHRzIGFzIGEgdGFibGUgaW4gdGhlIGFuYWx5c2lzIGRpcmVjdG9yeS4KCmBgYHtyIHNldHVwX291dHB1dF9maWxlcywgbGl2ZSA9IFRSVUV9Cm91dHB1dF9maWxlIDwtIGZzOjpwYXRoKGFuYWx5c2lzX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgImV3aW5nX3NhcmNvbWFfYXVjZWxsX3Jlc3VsdHMudHN2IikKYGBgCgoKIyMjIEZ1bmN0aW9ucwoKVGhlIGBzb3VyY2UoKWAgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGxvYWQgaW4gY3VzdG9tIGZ1bmN0aW9ucyB3ZSBzYXZlZCBpbiBhbiBgLlJgIGZpbGUuCgpgYGB7ciBzb3VyY2VfZnVuY3Rpb25zfQpzb3VyY2UoZnM6OnBhdGgoInV0aWwiLCAiYXVjZWxsX2Z1bmN0aW9ucy5SIikpCmBgYAoKVGhpcyBsb2FkcyBvbmUgY3VzdG9tIGZ1bmN0aW9uLCBjYWxsZWQgYHBsb3RfcmVjb3ZlcnlfY3VydmUoKWAsIGludG8gb3VyIGVudmlyb25tZW50LgpUaGlzIGZ1bmN0aW9uIGlzIGFkYXB0ZWQgZnJvbSBbdGhlIGBBVUNlbGxgIHZpZ25ldHRlXShodHRwczovL2dpdGh1Yi5jb20vYWVydHNsYWIvQVVDZWxsL2Jsb2IvOTE3NTNiMzI3YTM5ZGM3YTRiYmVkNDY0MDhlYzIyNzFjNDg1ZjJmMC92aWduZXR0ZXMvQVVDZWxsLlJtZCNMMjk1LUwzMTYpLgoKIyMgU2V0IHVwIGdlbmUgc2V0cwoKV2UgYXJlIGdvaW5nIHRvIHVzZSB0d28gZ2VuZSBzZXRzIHBlcnRhaW5pbmcgdG8gRXdpbmcgc2FyY29tYS4KCiogW2BaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OYF0oaHR0cHM6Ly93d3cuZ3NlYS1tc2lnZGIub3JnL2dzZWEvbXNpZ2RiL2dlbmVzZXRfcGFnZS5qc3A/Z2VuZVNldE5hbWU9WkhBTkdfVEFSR0VUU19PRl9FV1NSMV9GTEkxX0ZVU0lPTiksIHdoaWNoIGFyZSBnZW5lcyB0aGF0IHdlcmUgaGlnaGx5IGV4cHJlc3NlZCBpbiBhIHJoYWJkb215b3NhcmNvbWEgY2VsbCBsaW5lIGVuZ2luZWVyZWQgdG8gZXhwcmVzcyB0aGUgRVdTUjEtRkxJMSBmdXNpb24uCiogW2BSSUdHSV9FV0lOR19TQVJDT01BX1BST0dFTklUT1JfVVBgXShodHRwczovL3d3dy5nc2VhLW1zaWdkYi5vcmcvZ3NlYS9tc2lnZGIvY2FyZHMvUklHR0lfRVdJTkdfU0FSQ09NQV9QUk9HRU5JVE9SX1VQKSwgd2hpY2ggYXJlIGdlbmVzIHRoYXQgd2VyZSBoaWdobHkgZXhwcmVzc2VkIGluIG1lc2VuY2h5bWFsIHN0ZW0gY2VsbHMgZW5naW5lZXJlZCB0byBleHByZXNzIHRoZSBFV1MtRkxJMSBmdXNpb24gcHJvdGVpbi4KCldlIHdvdWxkIGV4cGVjdCBib3RoIG9mIHRoZXNlIGdlbmUgc2V0cyB0byBoYXZlIGhpZ2ggZXhwcmVzc2lvbiBpbiB0dW1vciBjZWxscy4KCmBgYHtyIGdlbmVzZXRzfQojIENyZWF0ZSBhIG5hbWVkIHZlY3RvciB3aXRoIHRoZSByZWxldmFudCBnZW5lIHNldCBuYW1lcwpld2luZ19nZW5lX3NldF9uYW1lcyA8LSBjKHpoYW5nID0gIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT04iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2dpID0gIlJJR0dJX0VXSU5HX1NBUkNPTUFfUFJPR0VOSVRPUl9VUCIpCgpld2luZ19nZW5lX3NldF9uYW1lcwpgYGAKClRoZXNlIGdlbmUgc2V0cyBjb21lIGZyb20gdGhlIEMyIGdlbmUgc2V0IGNvbGxlY3Rpb24gZnJvbSBNU2lnREIuCkxldCdzIHJldHJpZXZlIHRoZW0gdXNpbmcgYG1zaWdkYnIoKWAuCgpgYGB7ciBleHRyYWN0X2dlbmVzZXRzLCBsaXZlID0gVFJVRX0KZXdpbmdfZ2VuZV9zZXRzX2RmIDwtIG1zaWdkYnIoc3BlY2llcyA9ICJIb21vIHNhcGllbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9ICJDMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNhdGVnb3J5ID0gIkNHUCIpIHw+CiAgZHBseXI6OmZpbHRlcihnc19uYW1lICVpbiUgZXdpbmdfZ2VuZV9zZXRfbmFtZXMpCmBgYAoKYEFVQ2VsbGAgdXNlcyBnZW5lIHNldHMgaW4gYSBwYXJ0aWN1bGFyIGZvcm1hdCB0aGF0IGNvbWVzIGZyb20gdGhlIGBHU0VBQmFzZWAgcGFja2FnZS4KV2UgbmVlZCB0byBjcmVhdGUgYSBgR2VuZVNldENvbGxlY3Rpb25gLgoKYGBge3IgZ2VuZV9zZXRfY29sbGVjdGlvbn0KZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiA8LSBld2luZ19nZW5lX3NldF9uYW1lcyB8PgogIHB1cnJyOjptYXAoCiAgICAjIEZvciBlYWNoIGdlbmUgc2V0CiAgICBcKGdlbmVfc2V0X25hbWUpIHsKICAgICAgZXdpbmdfZ2VuZV9zZXRzX2RmIHw+CiAgICAgICAgIyBTdWJzZXQgdG8gdGhlIHJvd3MgaW4gdGhhdCBnZW5lIHNldAogICAgICAgIGRwbHlyOjpmaWx0ZXIoZ3NfbmFtZSA9PSBnZW5lX3NldF9uYW1lKSB8PgogICAgICAgICMgR3JhYiB0aGUgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXJzCiAgICAgICAgZHBseXI6OnB1bGwoZW5zZW1ibF9nZW5lKSB8PgogICAgICAgICMgQ3JlYXRlIGEgR2VuZVNldCBvYmplY3QKICAgICAgICBHZW5lU2V0KHNldE5hbWUgPSBnZW5lX3NldF9uYW1lLAogICAgICAgICAgICAgICAgZ2VuZUlkVHlwZSA9IEVOU0VNQkxJZGVudGlmaWVyKCkpCiAgICB9CiAgKSB8PgogICMgVHVybiB0aGUgbGlzdCBvZiBHZW5lU2V0IG9iamVjdHMgaW50byBhIEdlbmVTZXQgY29sbGVjdGlvbgogIEdlbmVTZXRDb2xsZWN0aW9uKCkKYGBgCgojIyBSZWFkIGluIGFuZCBwcmVwYXJlIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgCgpgYGB7ciByZWFkX2luX3NjZSwgbGl2ZSA9IFRSVUV9CnNjZSA8LSByZWFkcjo6cmVhZF9yZHMoc2NlX2ZpbGUpCmBgYAoKT3VyIG9iamVjdCBpbmNsdWRlcyBjb3VudHMgZm9yIGFsbCBnZW5lcyB0aGF0IHdlcmUgcHJlc2VudCBpbiB0aGUgaW5kZXggd2hlbiBxdWFudGlmeWluZyBnZW5lIGV4cHJlc3Npb24uClRoZXJlIGFyZSBhIG51bWJlciBvZiBnZW5lcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBvYmplY3QgYnV0IG5vdCBkZXRlY3RlZCBpbiBhbnkgb2YgdGhlIGNlbGxzLiAKV2UgZG9uJ3Qgd2FudCBnZW5lcyB0aGF0IGFyZSBub3QgZm91bmQgaW4gb3VyIGRhdGEgc2V0IHRvIGltcGFjdCBvdXIgcmFua2luZ3MsIHNvIGxldCdzIHJlbW92ZSB0aGVtLiAKCmBgYHtyLCBmaWx0ZXJfc2NlfQojIHJlbW92ZSBnZW5lcyB0aGF0IGFyZSBub3QgZGV0ZWN0ZWQgaW4gYW55IG9mIHRoZSBjZWxscyBmcm9tIHRoZSBTQ0Ugb2JqZWN0CmdlbmVzX3RvX2tlZXAgPC0gcm93RGF0YShzY2UpJGRldGVjdGVkID4gMApzY2UgPC0gc2NlW2dlbmVzX3RvX2tlZXAsIF0KYGBgCgoKVGhlIGBBVUNlbGxgIGZ1bmN0aW9ucyB0YWtlcyBhbiBleHByZXNzaW9uIG1hdHJpeCB3aXRoIGdlbmVzIGFzIHJvd3MgYW5kIGNlbGxzIGFzIGNvbHVtbi4KV2UgY2FuIGV4dHJhY3QgYSBjb3VudHMgbWF0cml4IGluIHNwYXJzZSBmb3JtYXQgZm9yIHVzZSB3aXRoIGBBVUNlbGxgLgoKCmBgYHtyIGNvdW50c19tYXRyaXh9CiMgRXh0cmFjdCBjb3VudHMgbWF0cml4CmNvdW50c19tYXRyaXggPC0gY291bnRzKHNjZSkKYGBgCgpUaGVyZSBtYXkgYmUgZ2VuZXMgaW4gb3VyIGdlbmUgc2V0IHRoYXQgZG8gbm90IGFwcGVhciBpbiB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QuCldlIGNhbiByZW1vdmUgdGhlbSB1c2luZyB0aGUgYHN1YnNldEdlbmVTZXRzKClgIGZ1bmN0aW9uLgoKYGBge3Igc3Vic2V0X2dlbmVfc2V0cywgbGl2ZSA9IFRSVUV9CiMgUmVtb3ZlIGdlbmVzIGZyb20gZ2VuZSBzZXRzIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgU0NFCmV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24gPC0gc3Vic2V0R2VuZVNldHMoZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhjb3VudHNfbWF0cml4KSkKYGBgCgojIyBgQVVDZWxsYAoKYEFVQ2VsbGAgcmVsaWVzIG9uIHJhbmtpbmcgZ2VuZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBleHByZXNzaW9uIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgQVVDLgpUaGUgQVVDIGlzIHRoZSBhcmVhIHVuZGVyIHRoZSByZWNvdmVyeSBjdXJ2ZSwgd2hpY2ggY2FwdHVyZXMgdGhlIG51bWJlciBvZiBnZW5lcyBpbiBhIGdlbmUgc2V0IHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIHJhbmtpbmdzIGFib3ZlIHNvbWUgdGhyZXNob2xkIChpLmUuLCBpdCBpcyB0aGUgYXJlYSB1bmRlciB0aGUgY3VydmUgdG8gdGhlIGxlZnQgb2YgdGhpcyBnZW5lIHJhbmspLgpCeSBkZWZhdWx0LCB0aGUgdG9wIDUlIG9mIGdlbmVzIGFyZSB1c2VkIGFzIHRoZSB0aHJlc2hvbGQuCgpTb21lIGdlbmVzIHdpbGwgbm90IGJlIGRldGVjdGVkIChpLmUuLCBoYXZlIDAgY291bnRzKS4KR2VuZXMgY2FuIGFsc28gaGF2ZSB0aGUgc2FtZSBleHByZXNzaW9uIGxldmVsIChpLmUuLCB0aWVzKS4KVGhlc2UgdW5kZXRlY3RlZCBnZW5lcyBhbmQgdGllcyB3aWxsIGJlIHJhbmRvbWx5IG9yZGVyZWQgaW4gb3VyIHJhbmtpbmcuClRvIG1ha2Ugb3VyIHJhbmtpbmdzIOKAkyBhbmQgdGhlcmVmb3JlIHJlc3VsdHMg4oCTIHJlcHJvZHVjaWJsZSwgd2Ugd2lsbCBzZXQgYSBzZWVkLgoKYGBge3Igc2V0X3NlZWQsIGxpdmUgPSBUUlVFfQpzZXQuc2VlZCgyMDI0KQpgYGAKCiMjIyBDZWxsIHJhbmtpbmcKClRoZSBmaXJzdCBzdGVwIGluIGBBVUNlbGxgIGlzIHRvIHJhbmsgZ2VuZXMgZm9yIGVhY2ggY2VsbCBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0IGV4cHJlc3Npb24gdmFsdWUuCldlIGNhbiBkbyB0aGlzIHVzaW5nIHRoZSBgQVVDZWxsX2J1aWxkUmFua2luZ3MoKWAgZnVuY3Rpb24sIHdoaWNoIHdpbGwgb3V0cHV0IGEgdmlzdWFsaXphdGlvbiBzaG93aW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBnZW5lcyBkZXRlY3RlZCBpbiB0aGUgY2VsbHMgaW4gb3VyIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0LgoKYGBge3IgY2VsbF9yYW5raW5ncywgbGl2ZSA9IFRSVUV9CmNlbGxfcmFua2luZ3MgPC0gQVVDZWxsX2J1aWxkUmFua2luZ3MoY291bnRzX21hdHJpeCkKYGBgCgpUaGUgYEFVQ2VsbGAgYXV0aG9ycyByZWNvbW1lbmQgbWFraW5nIHN1cmUgbW9zdCBjZWxscyBoYXZlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZ2VuZXMgd2Ugd2lsbCB1c2UgYXMgdGhlIG1heCByYW5rIHRvIGNhbGN1bGF0ZSB0aGUgQVVDLgoKVGhlIEFVQyBtYXggcmFuayB2YWx1ZSB0ZWxscyBgQVVDZWxsYCB0aGUgY3V0b2ZmIGluIHRoZSBnZW5lIHJhbmtpbmdzIHRvIHVzZSBmb3IgY2FsY3VsYXRpbmcgQVVDOyB3ZSB3aWxsIHZpc3VhbGl6ZSB0aGlzIGN1cnZlIGFuZCBtYXggcmFuayBpbiBqdXN0IGEgbW9tZW50LgpJZiB3ZSBwaWNrZWQgYSBtYXggcmFuayBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGluIG1vc3QgY2VsbHMsIHRoZSBub24tZGV0ZWN0ZWQgZ2VuZXMgdGhhdCBhcmUgcmFuZG9tbHkgb3JkZXJlZCB3b3VsZCBwbGF5IGFuIG91dHNpemVkIHJvbGUgaW4gb3VyIEFVQyB2YWx1ZXMuCgpCeSBkZWZhdWx0LCB0aGUgbWF4IHJhbmsgaXMgdGhlIHRvcCA1JSBoaWdoZXN0IGV4cHJlc3NlZCBnZW5lcy4KV2UgY2FuIGNhbGN1bGF0ZSB0aGUgZGVmYXVsdCBtYXggcmFuayBieSB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBudW1iZXIgb2YgZ2VuZXMuCgpgYGB7ciBleHBsb3JlX2F1Y19tYXhfcmFua30KbnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDUKYGBgCgpUaGlzIG51bWJlciBpcyBwcm9iYWJseSB0b28gaGlnaCwgZ2l2ZW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGJ5IGNlbGwgd2UgdmlzdWFsaXplZCB3aXRoIGBBVUNlbGxfYnVpbGRSYW5raW5ncygpYC4KCldoYXQgaWYgd2UgY2hvc2UgYSAxJSB0aHJlc2hvbGQ/CgpgYGB7ciBsb3dlcl9tYXhfcmFuaywgbGl2ZSA9IFRSVUV9Cm5yb3coY2VsbF9yYW5raW5ncykgKiAwLjAxCmBgYAoKVGhhdCBpcyBwcm9iYWJseSBhIG1vcmUgcmVhc29uYWJsZSBjaG9pY2UgZm9yIHRoaXMgZGF0YXNldC4KCldlIGNhbiB1c2UgYSBmdW5jdGlvbiBjYWxsZWQgYGNlaWxpbmcoKWAgdG8gcm91bmQgdGhpcyBhbmQgc2F2ZSBpdCB0byBhIHZhcmlhYmxlIGZvciBsYXRlciB1c2UuCgpgYGB7ciBhdWNfbWF4X3JhbmssIGxpdmUgPSBUUlVFfQphdWNfbWF4X3JhbmsgPC0gY2VpbGluZyhucm93KGNlbGxfcmFua2luZ3MpICogMC4wMSkKYGBgCgojIyMgUGxvdHRpbmcgQVVDCgpUaGUgQVVDIHZhbHVlcyB3ZSBnZXQgb3V0IG9mIGBBVUNlbGxgIGFyZSB0aGUgYXJlYSB1bmRlciBhIHJlY292ZXJ5IGN1cnZlIGFuZCBlc3RpbWF0ZSB0aGUgcHJvcG9ydGlvbiBvZiBnZW5lcyBpbiB0aGUgZ2VuZSBzZXQgdGhhdCBhcmUgaGlnaGx5IGV4cHJlc3NlZCAoaS5lLiwgaGlnaGx5IHJhbmtlZCkuCgpMZXQncyBwbG90IHRoZSByZWNvdmVyeSBjdXJ2ZSBmb3IgYSBjZWxsIHdpdGggaGlnaCBBVUMgYW5kIGEgY2VsbCB3aXRoIGxvdyBBVUMgdG8gZ2V0IGEgYmV0dGVyIGludHVpdGlvbiBhYm91dCBBVUMgdmFsdWVzLgpFYXJsaWVyLCB3ZSBsb2FkZWQgYSBjdXN0b20gZnVuY3Rpb24gd2UgYWRhcHRlZCBmcm9tIFt0aGUgYEFVQ2VsbGAgdmlnbmV0dGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hZXJ0c2xhYi9BVUNlbGwvYmxvYi85MTc1M2IzMjdhMzlkYzdhNGJiZWQ0NjQwOGVjMjI3MWM0ODVmMmYwL3ZpZ25ldHRlcy9BVUNlbGwuUm1kKSBjYWxsZWQgYHBsb3RfcmVjb3ZlcnlfY3VydmUoKWAgd2l0aCBgc291cmNlKClgLgoKRmlyc3QsIHdlJ2xsIHN0YXJ0IHdpdGggYSBjZWxsIHdpdGggYSBoaWdoIEFVQy4KV2UgcGlja2VkIHRoaXMgYmFyY29kZSBhaGVhZCBvZiB0aW1lIHdoZW4gd2Ugd3JvdGUgdGhlIG5vdGVib29rLgoKYGBge3IgaGlnaF9yZWNvdmVyeV9jdXJ2ZX0KcGxvdF9yZWNvdmVyeV9jdXJ2ZShjZWxsX3JhbmtpbmdzLAogICAgICAgICAgICAgICAgICAgIGV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgZ2VuZV9zZXRfbmFtZSA9ICJaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OIiwKICAgICAgICAgICAgICAgICAgICBiYXJjb2RlID0gIkNUR0FHQ0dHVENUVFRBVEMiLAogICAgICAgICAgICAgICAgICAgIGF1Y19tYXhfcmFuayA9IGF1Y19tYXhfcmFuaykgICMgMSUgdGhyZXNob2xkIApgYGAKClRoZSB4LWF4aXMgaXMgdGhlIGdlbmUgcmFua3MgZm9yIGFsbCBnZW5lcy4KVGhlIHktYXhpcyBpcyB0aGUgbnVtYmVyIG9mIGdlbmVzIGluIHRoZSBzaWduYXR1cmUgYXQgYSBnaXZlbiBwb2ludCBpbiB0aGUgZ2VuZSByYW5raW5nIOKAkyB0aGUgbGluZSB3aWxsIHJpc2Ugd2hlbiBhIGdlbmUgaW4gdGhlIGdlbmUgc2V0IGlzIGVuY291bnRlcmVkIGluIHRoZSByYW5raW5nIGZyb20gaGlnaGVzdCB0byBsb3dlc3QuClRoZSBBVUMgaXMgdGhlIGFyZWEgdW5kZXIgdGhpcyByZWNvdmVyeSBjdXJ2ZSBhdCB0aGUgbWF4IHJhbmsgdGhyZXNob2xkIGNob3NlbiBmb3IgdGhpcyBkYXRhc2V0LgoKTm93LCBsZXQncyBsb29rIGF0IGFuIGV4YW1wbGUgd2l0aCBhIGxvdyBBVUMuCgpgYGB7ciBsb3dfcmVjb3ZlcnlfY3VydmV9CnBsb3RfcmVjb3ZlcnlfY3VydmUoY2VsbF9yYW5raW5ncywKICAgICAgICAgICAgICAgICAgICBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIGdlbmVfc2V0X25hbWUgPSAiWkhBTkdfVEFSR0VUU19PRl9FV1NSMV9GTEkxX0ZVU0lPTiIsCiAgICAgICAgICAgICAgICAgICAgYmFyY29kZSA9ICJBR0FUQUdBR1RDQUNBQVRDIiwKICAgICAgICAgICAgICAgICAgICBhdWNfbWF4X3JhbmsgPSBhdWNfbWF4X3JhbmspICAjIDElIHRocmVzaG9sZApgYGAKCkZhciBmZXdlciBnZW5lcyBpbiB0aGUgZ2VuZSBzZXQgYXJlIHJhbmtlZCBhYm92ZSB0aGUgdGhyZXNob2xkLCB5aWVsZGluZyBhIGxvd2VyIEFVQyB2YWx1ZS4KCiMjIyBDYWxjdWxhdGluZyB0aGUgQVVDCgpPbmNlIHdlIGhhdmUgdGhlIHJhbmtpbmdzLCB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBBVUMgc2NvcmVzIGZvciBib3RoIGdlbmUgc2V0cyBpbiBhbGwgY2VsbHMgd2l0aCB0aGUgYEFVQ2VsbF9jYWxjQVVDKClgIGZ1bmN0aW9uLgoKYGBge3IgY2FsY19hdWMsIGxpdmUgPSBUUlVFfQpjZWxsX2F1YyA8LSBBVUNlbGxfY2FsY0FVQyhnZW5lU2V0cyA9IGV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICByYW5raW5ncyA9IGNlbGxfcmFua2luZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y01heFJhbmsgPSBhdWNfbWF4X3JhbmspCmBgYAoKVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGBhdWNlbGxSZXN1bHRzYCBvYmplY3QuCgpgYGB7ciBjaGVja19zdHIsIGxpdmUgPSBUUlVFfQpzdHIoY2VsbF9hdWMpCmBgYAoKSXQgY2FuIGJlIG11Y2ggbW9yZSBjb252ZW5pZW50IHRvIHdvcmsgd2l0aCB0aGlzIGluIGEgdGFidWxhciBmb3JtYXQuCgpgYGB7ciBhdWNfdG9fdGFibGV9CiMgRXh0cmFjdCBBVUMKYXVjX2RmIDwtIGNlbGxfYXVjQGFzc2F5c0BkYXRhJEFVQyB8PgogICMgVHJhbnNwb3NlCiAgdCgpIHw+CiAgIyBDb252ZXJ0IHRvIGRhdGEgZnJhbWUKICBhcy5kYXRhLmZyYW1lKCkgfD4KICAjIE1ha2UgdGhlIGJhcmNvZGVzIGEgY29sdW1uCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oImJhcmNvZGVzIikgCgojIExvb2sgYXQgZmlyc3QgZmV3IHJvd3MKaGVhZChhdWNfZGYpCmBgYAoKIyMjIEFzc2lnbm1lbnRzCgpgQVVDZWxsYCBjYW4gYXNzaWduIGNlbGxzIGFzIGhhdmluZyBhbiBhY3RpdmUgZ2VuZSBzZXQgb3Igbm90IGJ5IHBpY2tpbmcgYSB0aHJlc2hvbGQgYXV0b21hdGljYWxseS4KV2UnbGwgZXhwbG9yZSB0aGVzZSBpbiBhIGxhdGVyIHBsb3QsIGJ1dCBmb3Igbm93LCBsZXQncyBjYWxjdWxhdGUgdGhlIHRocmVzaG9sZCBhbmQgYXNzaWduIGNlbGxzIHdpdGggYEFVQ2VsbF9leHBsb3JlVGhyZXNob2xkcygpYC4KCmBgYHtyIGF1Y19hc3NpZ25tZW50cywgbGl2ZSA9IFRSVUV9CmF1Y19hc3NpZ25tZW50cyA8LSBBVUNlbGxfZXhwbG9yZVRocmVzaG9sZHMoY2VsbF9hdWMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RIaXN0ID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbkNlbGxzID0gVFJVRSkKYGBgCgpXZSdyZSBnb2luZyB0byBwbG90IHRoZSBkaXN0cmlidXRpb24gb2YgQVVDIHZhbHVlcyB3aXRoIGBnZ3Bsb3QyYCwgc28gd2Ugd2lsbCB3YW50IHRoZSBBVUMgdmFsdWVzIGluIGEgbG9uZ2VyIGZvcm1hdC4KCmBgYHtyIGF1Y19wbG90dGluZ19kZn0KYXVjX3Bsb3R0aW5nX2RmIDwtIGF1Y19kZiB8PgogIHRpZHlyOjpwaXZvdF9sb25nZXIoIWJhcmNvZGVzLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiZ2VuZV9zZXQiLAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImF1YyIpIHw+CiAgZHBseXI6Om11dGF0ZSgKICAgICMgQ3JlYXRlIGEgbmV3IGxvZ2ljYWwgY29sdW1uIGNhbGxlZCBhc3NpZ25lZAogICAgYXNzaWduZWQgPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAjIEZvciBaaGFuZyBnZW5lIHNldCByb3dzLCBzZXQgdG8gVFJVRSB3aGVuIHRoZSBiYXJjb2RlIGlzIGluIHRoZSAKICAgICAgIyBhc3NpZ25tZW50IGxpc3QKICAgICAgZ2VuZV9zZXQgPT0gZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJ6aGFuZyJdXSAmIAogICAgICAgIGJhcmNvZGVzICVpbiUgYXVjX2Fzc2lnbm1lbnRzW1tld2luZ19nZW5lX3NldF9uYW1lc1tbInpoYW5nIl1dXV0kYXNzaWdubWVudCB+IFRSVUUsCiAgICAgICMgRm9yIFJpZ2dpIGdlbmUgc2V0IHJvd3MsIHNldCB0byBUUlVFIHdoZW4gdGhlIGJhcmNvZGUgaXMgaW4gdGhlIAogICAgICAjIGFzc2lnbm1lbnQgbGlzdAogICAgICBnZW5lX3NldCA9PSBld2luZ19nZW5lX3NldF9uYW1lc1tbInJpZ2dpIl1dICYgCiAgICAgICAgYmFyY29kZXMgJWluJSBhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzW1sicmlnZ2kiXV1dXSRhc3NpZ25tZW50IH4gVFJVRSwKICAgICAgIyBPdGhlcndpc2UsIHNldCB0byBGQUxTRQogICAgICAuZGVmYXVsdCA9IEZBTFNFCiAgICApCiAgKQoKYXVjX3Bsb3R0aW5nX2RmCmBgYAoKVG8gZHJhdyB2ZXJ0aWNhbCBsaW5lcyByZXByZXNlbnRpbmcgdGhlIGF1dG9tYXRpY2FsbHkgY2hvc2VuIHRocmVzaG9sZCwgd2UgY2FuIGNyZWF0ZSBhIHNlcGFyYXRlIGRhdGEgZnJhbWUuCgpgYGB7ciBhdWNfdGhyZXNob2xkX2RmfQphdWNfdGhyZXNob2xkX2RmIDwtIGRhdGEuZnJhbWUoCiAgZ2VuZV9zZXQgPSBld2luZ19nZW5lX3NldF9uYW1lcywKICAjIEdyYWIgdGhyZXNob2xkcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBnZW5lIHNldCBmcm9tIGFzc2lnbmVtZW50cyBvYmplY3QKICB0aHJlc2hvbGQgPSBjKGF1Y19hc3NpZ25tZW50c1tbZXdpbmdfZ2VuZV9zZXRfbmFtZXNbInpoYW5nIl1dXSRhdWNUaHIkc2VsZWN0ZWQsIAogICAgICAgICAgICAgICAgYXVjX2Fzc2lnbm1lbnRzW1tld2luZ19nZW5lX3NldF9uYW1lc1sicmlnZ2kiXV1dJGF1Y1RociRzZWxlY3RlZCkKKQoKYXVjX3RocmVzaG9sZF9kZgpgYGAKCk5vdyBsZXQncyBtYWtlIGEgZGVuc2l0eSBwbG90LCBwbG90dGluZyB0aGUgZGVuc2l0eSBvZiB0aGUgYXNzaWduZWQgYW5kIHVuYXNzaWduZWQgY2VsbHMgc2VwYXJhdGVseSBhbmQgZHJhd2luZyBhIHZlcnRpY2FsIGxpbmUgZm9yIHRoZSB0aHJlc2hvbGQuCgpgYGB7ciBhdWNfZGVuc2l0eV9wbG90fQphdWNfcGxvdHRpbmdfZGYgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoCiAgICBnZ3Bsb3QyOjphZXMoCiAgICAgIHggPSBhdWMsICAjIEFVQyB2YWx1ZXMKICAgICAgY29sb3IgPSBhc3NpZ25lZCwgICMgR3JvdXAgYnkgYXNzaWdubWVudAogICAgICBmaWxsID0gYXNzaWduZWQsICAgIyBHcm91cCBieSBhc3NpZ25tZW50CiAgICApCiAgKSArCiAgZ2dwbG90Mjo6Z2VvbV9kZW5zaXR5KGFscGhhID0gMC4yKSArCiAgIyBEcmF3IGEgdmVydGljYWwgZG90dGVkIGxpbmUgc2hvd2luZyB0aGUgdGhyZXNob2xkIGZvciBlYWNoIGdlbmUgc2V0CiAgZ2dwbG90Mjo6Z2VvbV92bGluZShkYXRhID0gYXVjX3RocmVzaG9sZF9kZiwKICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeGludGVyY2VwdCA9IHRocmVzaG9sZCksCiAgICAgICAgICAgICAgICAgICAgICBsdHkgPSAyKSArCiAgIyBQbG90IGVhY2ggZ2VuZSBzZXQgaW4gaXRzIG93biBmYWNldAogIGdncGxvdDI6OmZhY2V0X2dyaWQoY29scyA9IGdncGxvdDI6OnZhcnMoZ2VuZV9zZXQpKSArCiAgIyBVc2UgYSBidWlsdC1pbiB0aGVtZQogIGdncGxvdDI6OnRoZW1lX2J3KCkKYGBgCgpGb3IgdGhlc2UgcGFydGljdWxhciBnZW5lIHNldHMsIHRoZSBBVUMgdmFsdWVzIGFwcGVhciB0byBiZSBiaW1vZGFsbHkgZGlzdHJpYnV0ZWQsIGFuZCB3ZSBjYW4gZWFzaWx5IGlkZW50aWZ5IGNlbGxzIHdoZXJlIHRoZSBnZW5lcyBhcmUgaGlnaGx5IGV4cHJlc3NlZC4KCkxldCdzIHdyaXRlIHRoaXMgdGFibGUgdG8gdGhlIG91dHB1dCBmaWxlLgoKYGBge3Igc2F2ZV9hdWN9CmF1Y19wbG90dGluZ19kZiB8PiAKICByZWFkcjo6d3JpdGVfdHN2KG91dHB1dF9maWxlKQpgYGAKCiMjIyBVTUFQcwoKIyMjIyBBZGRpbmcgQVVDIHRvIGBjb2xEYXRhYAoKV2UgY2FuIGFsc28gYWRkIHRoZSBBVUMgdmFsdWVzIGJhY2sgaW50byB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBmb3IgY29udmVuaWVuY2UsIGUuZy4sIGZvciBwbG90dGluZy4KV2UnbGwgYWRkIGl0IHRvIHRoZSBleGlzdGluZyBgY29sRGF0YWAuCgpGaXJzdCwgbGV0J3MgcmVuYW1lIHRoZSBnZW5lIHNldCBjb2x1bW5zIHRvIHNvbWV0aGluZyBtb3JlIGVhc2lseSB0eXBlZC4KCmBgYHtyIHJlbmFtZV9nZW5lX3NldH0KYXVjX2RmIDwtIGF1Y19kZiB8PgogICMgVXNlIHNob3J0ZXIgbmFtZXMKICBkcGx5cjo6cmVuYW1lKHpoYW5nX2F1YyA9IGV3aW5nX2dlbmVfc2V0X25hbWVzW1siemhhbmciXV0sCiAgICAgICAgICAgICAgICByaWdnaV9hdWMgPSBld2luZ19nZW5lX3NldF9uYW1lc1tbInJpZ2dpIl1dKQoKYGBgCgpBbmQgam9pbiBpdCB0byB0aGUgZXhpc3RpbmcgYGNvbERhdGFgLgoKYGBge3IgY29sZGF0YSwgbGl2ZSA9IFRSVUV9CiMgRXh0cmFjdCB0aGUgZXhpc3RpbmcgY29sRGF0YSwgYW5kIGxlZnQgam9pbiBpdCB3aXRoIHRoZSBBVUMgdmFsdWVzIGJ5IHRoZQojIGJhcmNvZGVzCmNvbGRhdGFfZGYgPC0gY29sRGF0YShzY2UpIHw+CiAgYXMuZGF0YS5mcmFtZSgpIHw+CiAgZHBseXI6OmxlZnRfam9pbigKICAgIGF1Y19kZiwKICAgIGJ5ID0gImJhcmNvZGVzIgogICkKYGBgCgpOb3csIHdlJ3JlIHJlYWR5IHRvIGFkZCBpdCBiYWNrIHRvIHRoZSBvYmplY3QuCgpgYGB7ciBhZGRfYmFja19jb2xEYXRhLCBsaXZlID0gVFJVRX0KIyBXZSBuZWVkIHRvIHNhdmUgdGhpcyBhcyBhIERhdGFGcmFtZQpjb2xEYXRhKHNjZSkgPC0gRGF0YUZyYW1lKAogIGNvbGRhdGFfZGYsCiAgcm93Lm5hbWVzID0gY29sRGF0YShzY2UpJGJhcmNvZGVzCikKYGBgCgojIyMjIFBsb3R0aW5nIFVNQVBzCgpXZSBjYW4gdXNlIHRoZSBgcGxvdFVNQVAoKWAgZnVuY3Rpb24gZnJvbSB0aGUgYHNjYXRlcmAgcGFja2FnZSB0byBwbG90IGEgVU1BUCB3aXRoIHRoZSBwb2ludHMgY29sb3JlZCBieSB0aGUgQVVDIHZhbHVlCgpgYGB7ciBwbG90X3VtYXBfemhhbmd9CnNjYXRlcjo6cGxvdFVNQVAoc2NlLCBjb2xvdXJfYnkgPSAiemhhbmdfYXVjIikgKwogICMgVXNlIHRoZSBnZW5lIHNldCBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXMKICBnZ3Bsb3QyOjpnZ3RpdGxlKHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChld2luZ19nZW5lX3NldF9uYW1lc1tbInpoYW5nIl1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiKSkKYGBgCgpMZXQncyBjb2xvciB0aGUgcG9pbnRzIGJ5IHRoZSBBVUMgdmFsdWVzIGZvciB0aGUgb3RoZXIgZ2VuZSBzZXQuCgpgYGB7ciBwbG90X3VtYXBfcmlnZ2ksIGxpdmUgPSBUUlVFfQpzY2F0ZXI6OnBsb3RVTUFQKHNjZSwgY29sb3VyX2J5ID0gInJpZ2dpX2F1YyIpICsgCiAgZ2dwbG90Mjo6Z2d0aXRsZShzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJyaWdnaSJdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIikpCmBgYAoKV2Ugd291bGQgd2FudCB0byBkbyBzb21ldGhpbmcgbW9yZSBmb3JtYWwgdG8gY29uZmlybSwgYnV0IGl0IHNlZW1zIGxpa2UgdGhlIHNhbWUgY2VsbHMgaGF2ZSBoaWdoIEFVQyB2YWx1ZXMgZm9yIGJvdGggZ2VuZSBzZXRzIQoKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7ciBzZXNzaW9uX2luZm99CnNlc3Npb25JbmZvKCkKYGBgCg==
    diff --git a/scRNA-seq-advanced/diagrams/roadmap_multi_integrate.png b/scRNA-seq-advanced/diagrams/roadmap_multi_integrate.png index 6fc50c84..cc519690 100644 Binary files a/scRNA-seq-advanced/diagrams/roadmap_multi_integrate.png and b/scRNA-seq-advanced/diagrams/roadmap_multi_integrate.png differ diff --git a/scRNA-seq-advanced/diagrams/technical_merge_sce.png b/scRNA-seq-advanced/diagrams/technical_merge_sce.png index 48ab0948..03cc4332 100644 Binary files a/scRNA-seq-advanced/diagrams/technical_merge_sce.png and b/scRNA-seq-advanced/diagrams/technical_merge_sce.png differ diff --git a/scRNA-seq-advanced/exercise_02-integration.Rmd b/scRNA-seq-advanced/exercise_02-integration.Rmd index 62c67cfe..b4596300 100644 --- a/scRNA-seq-advanced/exercise_02-integration.Rmd +++ b/scRNA-seq-advanced/exercise_02-integration.Rmd @@ -274,9 +274,10 @@ We will use the default clustering parameters for graph-based clustering to star Remember that the clustering results depend only the expression data that was used to generate the PC matrix – the cell labels are not used in the clustering algorithms. ```{r cluster unintegrated} -merged_sce$cluster_unintegrated <- bluster::clusterRows( - reducedDim(merged_sce, "PCA"), - bluster::NNGraphParam() +merged_sce$cluster_unintegrated <- scran::clusterCells( + merged_sce, + use.dimred = "PCA", + BLUSPARAM = bluster::NNGraphParam() ) ``` diff --git a/scRNA-seq-advanced/exercise_04-scrna_pathway.Rmd b/scRNA-seq-advanced/exercise_04-scrna_pathway.Rmd index d1c6266a..8577bf32 100644 --- a/scRNA-seq-advanced/exercise_04-scrna_pathway.Rmd +++ b/scRNA-seq-advanced/exercise_04-scrna_pathway.Rmd @@ -8,8 +8,8 @@ output: toc_float: true --- -In this notebook, we will use AUCell with a custom gene set of tumor marker genes for Ewing sarcoma, as well as a collection from the Molecular Signatures Database (MSigDB) of your choosing. -Because AUCell will assign cells as expressing (or not expressing) a gene set, it can be used as part of a strategy for cell typing or identifying malignant cells when a high quality marker gene set is available. +In this notebook, we will use `AUCell` with a custom gene set of tumor marker genes for Ewing sarcoma, as well as a collection from the Molecular Signatures Database (MSigDB) of your choosing. +Because `AUCell` will assign cells as expressing (or not expressing) a gene set, it can be used as part of a strategy for cell typing or identifying malignant cells when a high quality marker gene set is available. Once tumor cells are identified using an automatically selected threshold, we can visualize that information or even use it in tandem with AUC values from other gene sets. Our goal in this notebook is to explore gene sets from MSigDB that may have different relative expression (i.e., AUC values) between malignant and non-malignant cells. @@ -19,8 +19,8 @@ In practice, if we were to publish these results, we would want to explicitly te In this notebook, you will: - Part A: Read in and prepare the data -- Part B: Run AUCell with tumor marker genes -- Part C: Run AUCell with an MSigDB collection +- Part B: Run `AUCell` with tumor marker genes +- Part C: Run `AUCell` with an MSigDB collection - Part D: Visualize the results There are multiple Ewing sarcoma samples you can choose for your analysis, available in the following directory: @@ -52,7 +52,7 @@ library(msigdbr) ### Set a seed -Some genes sharing expression values or that are not detected will be randomly ordered in the AUCell rankings, so we need to set a seed using `set.seed()`. +Some genes sharing expression values or that are not detected will be randomly ordered in the `AUCell` rankings, so we need to set a seed using `set.seed()`. ```{r set_seed, solution = TRUE} @@ -62,7 +62,7 @@ Some genes sharing expression values or that are not detected will be randomly o #### Directories -Set up the directories to read in a Ewing sarcoma SingleCellExperiment and output pathway analysis results. +Set up the directories to read in a Ewing sarcoma `SingleCellExperiment` and output pathway analysis results. ```{r set_up_directories, solution = TRUE} # Input data @@ -118,12 +118,12 @@ marker_genes_df You can use the information in the `source` column to review the publication a marker gene's inclusion is supported by. -Now we need to get the gene set ready for use with AUCell. +Now we need to get the gene set ready for use with `AUCell`. You're going to save the gene set to a vector called `ensg_tumor_markers`. Here are some things to keep in mind when preparing the gene set: - You are only interested in the _tumor_ gene set -- The SingleCellExperiment object uses Ensembl gene identifiers +- The `SingleCellExperiment` object uses Ensembl gene identifiers - You'll want to remove any duplicate genes in the gene set ```{r format_marker_genes, solution = TRUE} @@ -131,7 +131,7 @@ Here are some things to keep in mind when preparing the gene set: ``` -Next, convert the vector of Ensembl ids to a `GeneSet` object for use with AUCell: +Next, convert the vector of Ensembl ids to a `GeneSet` object for use with `AUCell`: ```{r GeneSet} ensg_tumor_markers <- GeneSet(ensg_tumor_markers, @@ -142,7 +142,7 @@ ensg_tumor_markers <- GeneSet(ensg_tumor_markers, ### Prepare the single-nuclei data Now that we have our gene set prepared, let's prepare the data. -First, we will read in the SingleCellExperiment from the file we chose earlier. +First, we will read in the `SingleCellExperiment` from the file we chose earlier. ```{r read_in_sce} sce <- readr::read_rds(sce_file) @@ -154,7 +154,7 @@ We will mostly be using the raw counts, so save the counts matrix to a separate ``` -## Part B: Run AUCell with tumor marker genes +## Part B: Run `AUCell` with tumor marker genes Calculate the gene rankings for individual cells. @@ -182,7 +182,7 @@ Save the output to `cell_auc`. ``` Automatically calculate a threshold for the AUC values using `AUCell_exploreThresholds()`. -You'll want to set `assignCells = TRUE`, which tells AUCell to assign tumor cell labels to cells above the automatically chosen threshold. +You'll want to set `assignCells = TRUE`, which tells `AUCell` to assign tumor cell labels to cells above the automatically chosen threshold. Save the output to `auc_assignments`. @@ -192,7 +192,7 @@ Save the output to `auc_assignments`. ### Wrangle data for plotting -We will create a data frame that holds the barcodes, AUC values, and a column called `tumor_cell` that indicates whether or not AUCell classified the cell as a tumor cell using the AUC values for the marker gene set. +We will create a data frame that holds the barcodes, AUC values, and a column called `tumor_cell` that indicates whether or not `AUCell` classified the cell as a tumor cell using the AUC values for the marker gene set. ```{r auc_df} auc_df <- cell_auc@assays@data$AUC |> # start with the internal AUC table @@ -226,11 +226,11 @@ Add a vertical line representing the threshold that was automatically selected a ``` -## Part C: Run AUCell with an MSigDB collection +## Part C: Run `AUCell` with an MSigDB collection -Now, let's run AUCell using a collection from the Molecular Signatures Database (MSigDB). +Now, let's run `AUCell` using a collection from the Molecular Signatures Database (MSigDB). -We can use the results to explore if there are gene sets that have different expression in tumor cells vs. other cells in the sample, using the labels from AUCell. +We can use the results to explore if there are gene sets that have different expression in tumor cells vs. other cells in the sample, using the labels from `AUCell`. Let's look at what collections are available as part of the `msigdbr` package: @@ -243,13 +243,13 @@ It may be helpful to cross-reference this with the MSigDB website: @@ -270,7 +270,7 @@ collection_list <- unique(collection_df$gs_name) |> GeneSetCollection() ``` -AUCell provides a wrapper function that runs the ranking and AUC calculation steps called `AUCell_run()`. +`AUCell` provides a wrapper function that runs the ranking and AUC calculation steps called `AUCell_run()`. Because we're using the same sample as we did with the tumor marker genes, we can use the same AUC max rank value we used earlier (`auc_max_rank`). You may need to change the names of the variables passed to the `exprsMat` and `aucMaxRank` arguments below depending on what you used earlier! @@ -315,11 +315,11 @@ Write this data frame to the output file you saved as a variable earlier. ### Plot UMAPs -We can use the data in `auc_df` to make UMAP visualizations once we add it to the SingleCellExperiment object. +We can use the data in `auc_df` to make UMAP visualizations once we add it to the `SingleCellExperiment` object. #### Add AUC values to `colData` -To prepare for use with `scater::plotUMAP`, let's add the `auc_df` to the `colData` of the SingleCellExperiment. +To prepare for use with `scater::plotUMAP`, let's add the `auc_df` to the `colData` of the `SingleCellExperiment` object. Don't forget to provide the `row.names` argument when converting back to a `DataFrame`. ```{r add_to_col_data, solution = TRUE} @@ -331,7 +331,7 @@ Don't forget to provide the `row.names` argument when converting back to a `Data #### Plot tumor cell assignments (UMAP) -First, plot a UMAP, coloring cells by whether or not they are a tumor cell according to AUCell. +First, plot a UMAP, coloring cells by whether or not they are a tumor cell according to `AUCell`. ```{r plot_tumor_cell, solution = TRUE} diff --git a/scRNA-seq-advanced/exercise_05-cluster_evaluation.Rmd b/scRNA-seq-advanced/exercise_05-cluster_evaluation.Rmd index 44b54e73..ec2a192b 100644 --- a/scRNA-seq-advanced/exercise_05-cluster_evaluation.Rmd +++ b/scRNA-seq-advanced/exercise_05-cluster_evaluation.Rmd @@ -29,6 +29,7 @@ These quantities are explained more in depth when they are introduced, but you c - The `bluster` package vignette on cluster evaluation: - The "Clustering Redux" chapter in _Orchestrating Single Cell Analysis_: +We'll specifically run `bluster` using the [`scran::clusterCells()`](https://rdrr.io/github/MarioniLab/scran/man/clusterCells.html) function. Before we dive in, it's important to bear some language caveats in mind: We sometimes use phrasing like "the best clusters" or "the optimal clusters," but the truth is, it's quite hard (if even possible) to know which clustering assignments are truly _the best._ @@ -149,15 +150,6 @@ We will begin by calculating clusters using different values of the `resolution` Then, we'll compare results to one another with the ultimate goal of identifying a reasonable `resolution` parameter to achieve reliable clusters. To specifically explore the effect of different `resolution` parameters, we won't vary any other parameters; we'll also use 20 nearest neighbors and Jaccard weighting for all clusterings. -To begin, extract the PCA matrix from the SCE using the `reducedDim()` function, and save it to a variable called `pca_matrix`. -You'll need to provide two arguments to this function: The SCE object, and the name of the reduced dimension we'd like to pull out; here, it's `"PCA"`. - -We'll need this matrix to both perform and evaluate clusters. - -```{r extract pca matrix, solution = TRUE} - -``` - We'll define our vector of values to try out for the `resolution` parameter. For the `modularity` objective function, `resolution` values around 1 tend to perform well, so we'll explore a range of values around 1: @@ -166,9 +158,12 @@ res_params <- seq(0.25, 1.5, 0.25) res_params ``` -Now, we're going to use `purrr::map()` to perform clustering for each of these values using `bluster::clusterRows()`. +Now, we're going to use `purrr::map()` to perform clustering for each of these values using `scran::clusterCells()` which uses `bluster` to perform clustering. +The `scran::clusterCells()` function takes an SCE object and a specification of which assay or reduced dimension to use for clustering - here, we want to use the PCA reduced dimension, which is a very standard choice for single-cell clustering. +The other argument that `scran::clusterCells()` takes is `BLUSPARAM`, which will specify the algorithm and any additional algorithm parameters for `bluster` to use. +This argument is made with a special `bluster` function, for example `bluster::KMeansParam()` or `bluster::NNGraphParam()` which respectively specify k-means clustering and graph-based clustering. -The result will be a list of vectors containing cluster assignments for each cell. +When we run `purrr::map()` over our different resolution parameters, we'll end up with a list of vectors containing cluster assignments for each cell. Before we do this, we'll name our `res_params` vector with the `resolution` values themselves. This will ensure the output from `purrr::map()` is also named according to these resolution parameters, which will help us keep track of which clustering is which! @@ -178,7 +173,7 @@ names(res_params) <- res_params ``` Time to cluster! -To make this code a bit easier to follow, we'll define our clustering parameters first using `bluster::NNGraphParam()`, and then we'll call `bluster::clusterRows()`. +To make this code a bit easier to follow, we'll define our clustering parameters first using `bluster::NNGraphParam()` for graph-based clustering, and then we'll call `scran::clusterCells()`. ```{r perform clustering} cluster_list <- res_params |> @@ -200,13 +195,17 @@ cluster_list <- res_params |> ) # Perform clustering - bluster::clusterRows(pca_matrix, cluster_params) + scran::clusterCells( + sce, + use.dimred = "PCA", # specify to use the PCA matrix for clustering + BLUSPARAM = cluster_params + ) } ) ``` How many clusters were created for each `resolution` parameter? -The cluster vector created by `bluster::clusterRows()` is a factor, so we can answer this by finding the length of each clustering's levels using `purrr::map()`. +The cluster vector created by `scran::clusterCells()` is a factor, so we can answer this by finding the length of each clustering's levels using `purrr::map()`. In the chunk below, use `purrr::map()` to get, for each clustering, the `length()` of its `levels()`. @@ -270,6 +269,12 @@ How does one choose among these potential results? In this section, we'll walk through several metrics to evaluate cluster quality and their interpretations. +Part of evaluating these clusters will involve working directly with the PCA matrix we clustered, so we'll go ahead and pull that out into its own variable called `pca_matrix` for convenience: + +```{r extract pca matrix, solution = TRUE} + +``` + ### Silhouette width @@ -391,7 +396,7 @@ This function returns a capital-D `DataFrame` with one row per cell and the foll In the chunk below, use `purrr::map()` to calculate the neighborhood purity on each vector of clusters. Just like we did for calculating silhouette width, you'll want to coerce the `bluster::neighborPurity()` output into a small-d `data.frame` with row names moved into a new column `barcodes`. -_Unlike_ for silhouette width though, the `bluster::neighborhoodPurity()` function does not automatically save the cluster assignments to the output data frame, so you'll also want to add a `dplyr::mutate()` statement to ensure there is a `cluster` column in the output. +_Unlike_ for silhouette width though, the `bluster::neighborPurity()` function does not automatically save the cluster assignments to the output data frame, so you'll also want to add a `dplyr::mutate()` statement to ensure there is a `cluster` column in the output. Finally, after the `purrr:map()` statement, bind (hint!) all rows together, specifying `.id = "resolution"`, to create one data frame with all results. Save this result to `cluster_purity_df`, and print the data frame once you have created it (again, remember that R Markdown will only print 1000 rows, even when there are more!) diff --git a/scRNA-seq-advanced/util/aucell_functions.R b/scRNA-seq-advanced/util/aucell_functions.R index 16f3482f..e4bbfa98 100644 --- a/scRNA-seq-advanced/util/aucell_functions.R +++ b/scRNA-seq-advanced/util/aucell_functions.R @@ -3,8 +3,8 @@ #' Adapted from https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd#L295-L316 #' #' @param cell_rankings Cell rankings; the output of AUCell::AUCell_buildRankings() -#' @param gene_set_collection A GSEABase GeneSetCollection object -#' @param gene_set_name The name of the gene set from the GeneSetCollection +#' @param gene_set_list A list of gene sets +#' @param gene_set_name The name of the gene set the gene_set_list #' that you would like to plot a recovery curve for #' @param barcode The cell barcode that you would like to plot a recovery #' curve for @@ -14,7 +14,7 @@ #' #' @return Outputs a recovery curve plot with the plot_recovery_curve <- function(cell_rankings, - gene_set_collection, + gene_set_list, gene_set_name, barcode, auc_max_rank, @@ -24,8 +24,8 @@ plot_recovery_curve <- function(cell_rankings, # Pull out the gene set and identify where in the cell ranks those genes # lie - gene_set <- gene_set_collection[[gene_set_name]] - gene_set_ranks <- cell_rankings[geneIds(gene_set), ] + gene_set <- gene_set_list[[gene_set_name]] + gene_set_ranks <- cell_rankings[gene_set, ] # Index of the cell with the barcode barcode_index <- which(colnames(gene_set_ranks) == barcode) @@ -35,7 +35,7 @@ plot_recovery_curve <- function(cell_rankings, plot(aucCurve, type="s", col="darkblue", lwd=1, xlab="Gene rank", ylab="# genes in the gene set", - xlim=c(0, auc_max_rank*3), ylim=c(0, nGenes(gene_set)), + xlim=c(0, auc_max_rank*3), ylim=c(0, length(gene_set)), main="Recovery curve", sub=paste("Cell:", colnames(gene_set_ranks)[barcode_index])) aucShade <- aucCurve[which(aucCurve[,1] < auc_max_rank),] diff --git a/scRNA-seq/06-celltype_annotation.Rmd b/scRNA-seq/06-celltype_annotation.Rmd index 82219b58..76bb8a61 100644 --- a/scRNA-seq/06-celltype_annotation.Rmd +++ b/scRNA-seq/06-celltype_annotation.Rmd @@ -61,24 +61,32 @@ We aren't planning any significant modifications of the underlying data, so we w ```{r filepaths, live=TRUE} # directory for the input data -data_dir <- file.path("data", - "PBMC-TotalSeqB", - "normalized") +data_dir <- file.path( + "data", + "PBMC-TotalSeqB", + "normalized" +) # the input file itself -sce_file <- file.path(data_dir, - "PBMC_TotalSeqB_normalized_sce.rds") +sce_file <- file.path( + data_dir, + "PBMC_TotalSeqB_normalized_sce.rds" +) # A directory to store outputs -analysis_dir <- file.path("analysis", - "PBMC-TotalSeqB") +analysis_dir <- file.path( + "analysis", + "PBMC-TotalSeqB" +) # Create directory if it doesn't exist fs::dir_create(analysis_dir) # output table path -cellinfo_file <- file.path(analysis_dir, - "PBMC_TotalSeqB_cellinfo.tsv") +cellinfo_file <- file.path( + analysis_dir, + "PBMC_TotalSeqB_cellinfo.tsv" +) ``` @@ -198,14 +206,12 @@ Let's plot the ADT results for those two markers as well below: ```{r plot CD4, live=TRUE} # plot CD4 marker -scater::plotUMAP(sce, - color_by = "CD4") +scater::plotUMAP(sce, color_by = "CD4") ``` ```{r plot CD8, live=TRUE} # plot CD8 marker -scater::plotUMAP(sce, - color_by = "CD8") +scater::plotUMAP(sce, color_by = "CD8") ``` @@ -306,8 +312,7 @@ Creating and assigning values to this column can be done with the `$` shortcut, ```{r plot thresholds} sce$threshold_celltype <- adt_df$celltype -scater::plotUMAP(sce, - color_by = "threshold_celltype") + +scater::plotUMAP(sce, color_by = "threshold_celltype") + guides(color = guide_legend(title = "Cell type")) ``` @@ -490,12 +495,12 @@ We will also take this time to dive a bit deeper into the steps that `SingleR` p As mentioned, the first step is training the model, during which we identify the genes that will be used for the correlation analysis later. While this step is not particularly slow, if we were classifying multiple samples, we would not want to have to repeat it for every sample. -To do the training, we will use the `trainSingleR()` function. +To do the training, we will use the `SingleR::trainSingleR()` function. For this we will start with our reference and the labels we want to train the model with. We can then specify the method used to select the genes that will be used for classification. The default method is `"de"`, which performs a differential expression analysis for each pair of labels, but we could also use `"sd"` to select the genes which are most variable across labels, or `"all"` to use all genes. -If we want to get really fancy, we could even provide a specific list of genes to use. +If we wanted to get really fancy, we could even provide a specific list of genes to use with the `restrict` argument. We should note here that the reference dataset for `SingleR` does not need to be from a compendium like `celldex`! If you have any well-classified dataset that you want to use as a reference, you can, as long as you can create a gene by sample expression matrix and a vector of cell types for each sample. @@ -503,7 +508,8 @@ You will want to ensure that the cell types you expect to see in your sample are You can even use a previously-annotated `SingleCellExperiment` as a reference for a new dataset. For more details about custom references, see the [OSCA chapter on cell type annotation](http://bioconductor.org/books/3.19/OSCA.basic/cell-type-annotation.html#using-custom-references) -We do want to be sure that the genes selected for the model will be among those present in our SCE object, so we will use the `restrict` argument with a vector of the genes in our SCE. +We do want to be sure that the genes included in the model will be among those present in our SCE object, so we will use the `test.genes` argument with a vector of the genes in our SCE. +Otherwise, the function will assume that both the reference and test data set have the same genes in the same order (which they don't!), and the next step of actually classifying cell types wouldn't work. This step would happen automatically with the `SingleR::SingleR()` function, but we need to add it manually for this use case. @@ -512,10 +518,10 @@ This step would happen automatically with the `SingleR::SingleR()` function, but singler_finemodel <- SingleR::trainSingleR( monaco_ref, # reference dataset labels = monaco_ref$label.fine, # labels for training dataset + # consider only genes in the sce object + test.genes = rownames(sce), # use DE to select genes (default) genes = "de", - # only use genes in the sce object - restrict = rownames(sce), # parallel processing BPPARAM = BiocParallel::MulticoreParam(4) ) @@ -611,8 +617,10 @@ Now that we have that set up, we can plot using our collapsed and ordered cell t ```{r plot collapsed, live=TRUE} sce$celltype_collapsed <- collapsed_labels -scater::plotUMAP(sce, - color_by = "celltype_collapsed") +scater::plotUMAP( + sce, + color_by = "celltype_collapsed" +) ``` diff --git a/scripts/link-data.sh b/scripts/link-data.sh index aaed38f2..7fde6ea4 100644 --- a/scripts/link-data.sh +++ b/scripts/link-data.sh @@ -63,6 +63,8 @@ link_locs=( RNA-seq/data/gastric-cancer/salmon_quant/SRR585577 RNA-seq/QC/gastric-cancer/fastp/SRR585571 RNA-seq/QC/gastric-cancer/fastqc/SRR585571 + RNA-seq/QC/gastric-cancer/fastp/SRR585574 + RNA-seq/QC/gastric-cancer/fastqc/SRR585574 RNA-seq/data/NB-cell/NB-cell_metadata.tsv RNA-seq/data/NB-cell/salmon_quant RNA-seq/data/leukemia/SRP049821_metadata.tsv @@ -86,6 +88,7 @@ link_locs=( scRNA-seq-advanced/analysis/mouse-liver/markers scRNA-seq-advanced/data/PBMC-TotalSeqB/raw_feature_bc_matrix scRNA-seq-advanced/data/PBMC-TotalSeqB/normalized/PBMC_TotalSeqB_normalized_sce.rds + scRNA-seq-advanced/data/glioblastoma-10x/filtered_feature_bc_matrix scRNA-seq-advanced/data/glioblastoma-10x/raw_feature_bc_matrix scRNA-seq-advanced/data/ewing-sarcoma/annotations/ewing_sarcoma_sample_metadata.tsv scRNA-seq-advanced/data/ewing-sarcoma/processed diff --git a/scripts/make-live.R b/scripts/make-live.R index 14cee77a..322c2819 100644 --- a/scripts/make-live.R +++ b/scripts/make-live.R @@ -14,11 +14,15 @@ library(optparse) # Set up optparse options option_list <- list( make_option( - opt_str = "--notebook", type = "character", - help = "The notebook file to process."), + opt_str = "--notebook", + type = "character", + help = "The notebook file to process." + ), make_option( - opt_str = "--render", type = "character", - default = "TRUE", help = "Needs a 'TRUE/FALSE' to determine whether the markdown::render() step will be run." + opt_str = "--render", + type = "character", + default = "TRUE", + help = "Needs a 'TRUE/FALSE' to determine whether the markdown::render() step will be run." ) ) @@ -26,7 +30,7 @@ option_list <- list( opt <- parse_args(OptionParser(option_list = option_list)) # Check that render is TRUE or FALSE (or an obvious variant) -if (! tolower(opt$render) %in% c("true", "false", "t", "f")){ +if (!tolower(opt$render) %in% c("true", "false", "t", "f")) { stop("`--render` option must be TRUE or FALSE") } @@ -34,13 +38,17 @@ if (! tolower(opt$render) %in% c("true", "false", "t", "f")){ render <- as.logical(opt$render) # Check that the file is an Rmarkdown file: -if (! stringr::str_detect(opt$notebook, "\\.Rmd$")){ +if (!stringr::str_detect(opt$notebook, "\\.Rmd$")) { stop(opt$notebook, " is not a `.Rmd` notebook") } # Install exrcise package if needed. -if (!"exrcise" %in% installed.packages()){ - remotes::install_github("AlexsLemonade/exrcise", dependencies = TRUE, upgrade = "never") +if (!"exrcise" %in% installed.packages()) { + remotes::install_github( + "AlexsLemonade/exrcise", + dependencies = TRUE, + upgrade = "never" + ) } diff --git a/scripts/render-live.sh b/scripts/render-live.sh index 88c54a40..95502bc1 100644 --- a/scripts/render-live.sh +++ b/scripts/render-live.sh @@ -37,6 +37,7 @@ files=( scRNA-seq-advanced/03-differential_expression.Rmd scRNA-seq-advanced/04-gene_set_enrichment_analysis.Rmd scRNA-seq-advanced/05-aucell.Rmd + spatial/01-spatial_intro.Rmd # machine-learning/01-openpbta_heatmap.Rmd # machine-learning/02-openpbta_consensus_clustering.Rmd # machine-learning/03-openpbta_PLIER.Rmd diff --git a/spatial/.gitignore b/spatial/.gitignore new file mode 100644 index 00000000..a5e65c23 --- /dev/null +++ b/spatial/.gitignore @@ -0,0 +1,4 @@ +# ignore data directory +data + + diff --git a/spatial/01-spatial_intro.Rmd b/spatial/01-spatial_intro.Rmd new file mode 100644 index 00000000..d6e67cfd --- /dev/null +++ b/spatial/01-spatial_intro.Rmd @@ -0,0 +1,426 @@ +--- +title: "Importing, processing, and exploring Visium data" +author: Data Lab for ALSF +date: 2026 +output: + html_notebook: + toc: true + toc_float: true +--- + +## Objectives + +- Read Visium data into R +- Filter to spots overlapping tissue +- Calculate quality control measures on spatial transcriptomic data +- Remove likely low-quality spots with `SpotSweeper()` +- Normalize spatial expression data +- Visualize spatial transcriptomic data + +## Introduction + +In this notebook, we'll learn some basic import, processing, and visualization of a Visium data set, starting with the Space Ranger output. + +The data we'll use in this notebook is from an anaplastic Wilms Tumor sample in the [Single-cell Pediatric Cancer Atlas](https://scpca.alexslemonade.org/projects/SCPCP000006). +This sample was processed using first-generation 3' Visium technology, and it was quantified with `Space Ranger 1.3.1`. + +## Set up + +To begin, we'll load the core library for spatial transcriptomic objects in Bioconductor, `SpatialExperiment`. +We won't be doing any calculations involving random numbers here, so we don't need to set a seed. + +```{r libraries} +# Load libraries + +# The main class we use for spatial transcriptomic data +library(SpatialExperiment) + +# To support plotting +library(patchwork) + +# Set ggplot2 theme +ggplot2::theme_set(ggplot2::theme_bw()) +``` + +### Directories and files + +Next we'll define paths and files. + +```{r inputs, live=TRUE} +# define sample id we'll be analyzing +sample_id <- "SCPCS000190" + +# main data directory for this sample +data_dir <- file.path("data/wilms-tumor", sample_id) + +# Path to Space Ranger output +raw_spaceranger_dir <- file.path(data_dir, "outs") + +# reference data directory +ref_dir <- file.path("data/reference") + +# Path to mitochondrial genes table +mito_file <- file.path(ref_dir, "hs_mitochondrial_genes.tsv") +``` + + +```{r outputs} +# Directory and file to save output +normalized_dir <- file.path(data_dir, "normalized") + +# create the directory if it does not exist +fs::dir_create(normalized_dir) + +# output RDS file for normalized Spatial Experiment (SPE) object +output_spe_file <- file.path( + normalized_dir, + "SCPCS000190_normalized.rds" +) +``` + + + +## Reading Space Ranger data + +We'll use the `VisiumIO` package to read this data in. +The directory structure typically looks something like this, with differences for different technology versions. + +```markdown +_add file tree here with standard visium output_ +``` + +Let's see what we have: + +```{r dir-spaceranger, live = TRUE} +dir(raw_spaceranger_dir) +``` + +The filtered/raw matrix directories are analogous to we'd get from `Cell Ranger` for single-cell sequencing, but the `spatial` directory contains spatial information, including images, that augment the data with its full spatial context. +Without this directory, we could still read in the filtered/raw and make an `SCE`, but you wouldn't have the spatial info. + +Along those lines, let's have a closer look at what's in the `spatial` directory: + +```{r dir-spatial, live = TRUE} +dir( + file.path(raw_spaceranger_dir, "spatial") +) +``` + +Placeholder to describe each image file: + +- `"aligned_fiducials.jpg"` +- `"detected_tissue_image.jpg"` +- `"tissue_hires_image.png"` +- `"tissue_lowres_image.png"` +- `"tissue_positions_list.csv"` +- `"scalefactors_json.json"` + +It's worth mentioning that this is a slightly older technology than the current Visium `CytAssist` image, which means there is no specific `Cytassist` image. +This won't affect our analysis, but worth noting when reading in since by default the functions assume that image is present. + + +We'll import the raw, not filtered, version of the data here so that we can see full processing steps and save it to a variable called `spe`, using the package `VisiumIO`. + +```{r import-visium, live = TRUE} +# path to quantified RNA 10X output +rna_dir <- file.path(raw_spaceranger_dir, "raw_feature_bc_matrix") + +# path to spatial 10X output +spatial_dir <- file.path(raw_spaceranger_dir, "spatial") + +spe <- VisiumIO::import( + VisiumIO::TENxVisium( + # path that contains the sequencing data + resources = rna_dir, + # path that contains the spatial data + spatialResource = spatial_dir, + # which image(s) to import - use lowres to save some memory/space + # we also need to override the default since it assumes there is a CytAssist image + images = "lowres" + ) +) + +# print the spe +spe +``` + +Let's get to know our `SPE` object! +It's essentially an `SCE`, but with a few more bells and whistles. +This means there are some functions we'll use to explore it that you might recognize, but there will also be some new ones only used for `SPE` objects. + +First, note that we have 4992 spots - this is not a random value. +It's the number of spots on a Visium 6.5 x 6.5 slide. + +Like `SCE`s, we have slots like `assays` for count matrices, `rowData` for feature metadata, and `colData` for _spot_ metadata - recall, our experimental units are not individual cells in spatial transcriptomics. +Let's take a tour: + +```{r spe-rowdata} +rowData(spe) +``` + +```{r spe-assays} +counts(spe)[1:10, 1:10] +``` +Again, for the colData`, we're looking at spots and not cells. +With this technology, where each spot is 55 µm, we can expect there's somewhere between 1-10 cells per spot. + +```{r spe-coldata, live = TRUE} +colData(spe) +``` +Check out that `in_tissue` column. +It contains 0/1 because we read in the raw `Space Ranger` output, which includes all spots including those which don't actually overlap tissue. +Ultimately, we won't want to analyze the spots that are not on top of tissue, so we'll have to deal with that. + +Unlike `SCE`s, we have spatial information in a dedicated `spatialCoords` slot which contains the x/y coordinates on the slide: +```{r spe-spatialcoords, live = TRUE} +# handy function from our code package SpatialExperiment +# literally is giving x/y coordinates +spatialCoords(spe) |> head() +``` + +We also have a slot that just holds the images, `imgData`, although looking at it directly isn't very interesting. +But, this stored information will help us make figures! + +```{r spe-imgdata, live = TRUE} +imgData(spe) +``` + +### Introduction to spatial data visualization + +Before we get further, let's go ahead and actually look at our data. +Because the spatial and image information is contained in the object, we can plot directly from this object using the viz package [`ggspavis`](https://bioconductor.posit.co/packages/release/bioc/vignettes/ggspavis/inst/doc/ggspavis_overview.html). + + +```{r plot-visium, live = TRUE} +#| fig.width: 7 + +ggspavis::plotVisium(spe) +``` + +Here, we see the spots overlaid on the slide as well as slide boundaries. +You'll notice that every single spot is shown, including ones that don't overlap tissue directly - indeed, all 4992 spots are present in the `SPE` right now! + +By default this shows the spots, but we can hide them and zoom into the tissue on the slide. +This is a helpful way to pop up the H&E for side-by-side comparisons with other plots you might make. + +```{r plot-visium-zoom, live = TRUE} +#| fig.width: 5 + +ggspavis::plotVisium( + spe, + spots = FALSE, # don't show the spots + zoom = TRUE # zoom into the slide area +) +``` + +TODO: save this text for when we actually plot genes? +Let's take a moment to chat about Wilms Tumor - these tumors in the developing kidney are often composed of a couple histologic compartments, blastemal, stromal (with mesenchymal biology), and sometimes epithelial components. +In this tissue section, we can see two major components: the bluer indicating densely cellular, ECM-poor regions consistent with blastema, and paler pink regions consistent with stromal tissue. + + +There's another function in `ggspavis` called `plotCoords` which hides the H&E to just show the spots; this plot is not currently very compelling without any colors, but we'll add those soon! + +```{r plot-coords, live = TRUE} +#| fig.width: 7 + +# plot just the spots +ggspavis::plotCoords(spe) +``` + +The spot layout looks a bit different. +By default, this function will only plot spots that overlay tissue, even if those spots are still in the `SPE`. + +We can override this if we want, but really what we want to do is actually remove those spots since they are entirely uninformative - we'll do this in the next section. + + +## Filtering empty spots + +We only care about spots on top of tissue, so let's begin by removing the `in_tissue = 0` spots. +Note that if we had read in the `filtered_feature_bc_matrix` instead, the data would already be filtered to only `1` in this column, but we need to take this step because we read in the `raw`. +We can make a rough analogy, that this analysis step is like filtering empty droplets to retain only droplets with cells in scRNA-seq, but here we're retaining only spots over tissue. + +We can visualize which spots those are, and we'll do it over the H&E to clearly see the relationship. +We'll use the `annotate` argument, but `plotVisium` sees that this column is an integer and forces it to use a continuous color scale; we'll go ahead and make it a factor version of it to plot with. + +```{r plot_in_tissue} +#| fig.width: 7 + +# make a factor version of this column to plot with, specifying "No" and "Yes" plot labels +spe$in_tissue_factor <- factor(spe$in_tissue, levels = c(0, 1), labels = c("No", "Yes")) + +ggspavis::plotVisium( + spe, + annotate = "in_tissue_factor", + # specify a custom palette + pal = c("Yes" = "yellow", "No" = "red") +) + + # use ggplot2::guides() to override legend titles in ggspavis + ggplot2::guides( + fill = ggplot2::guide_legend( + title = "Spot overlaps tissue", + override.aes = list(size = 2) + ) + ) +``` + +- The purple tissue overhang on the left isn't colored at all - indeed, there aren't spots at those coordinates outside the slide +- Red points are those to filter out - they are uninformative since they don't overlap tissue. + +```{r filter_in_tissue, live = TRUE} +# keep only spots that are in the tissue and save to filtered_spe +filtered_spe <- spe[, spe$in_tissue == 1] + +# print resulting filtered_spe +filtered_spe +``` + + +Now, we're down to 4120 spots from the original 4992, but that's still a pretty good amount. +But not all of these spots are necessarily good quality, so we'll want to do some additional QC filtering next. + +## Filtering low-quality spots + +### Filtering with global QC thresholds + +As a first step towards filtering, we can borrow some approaches from scRNA-seq and calculate some quality-control measures. +Let's do that and have a look - we'll get our mitochondrial genes for QC calculations and we'll use `scran::addPerCellQC()` like we might for single-cell. + +```{r get mitochondrial genes} +# read in a table of mitochondrial genes and extract ids +mito_genes <- readr::read_tsv(mito_file) |> + # filter to only the genes that are found in our dataset + dplyr::filter(gene_id %in% rownames(filtered_spe)) |> + # create a vector from the gene_id column + dplyr::pull(gene_id) +``` + +```{r calculate qc, live = TRUE} +filtered_spe <- scuttle::addPerCellQC( + filtered_spe, + subsets = list(mito = mito_genes) +) + +# print resulting colData to see QC stats +colData(filtered_spe) |> head() +``` + +`ggspavis` comes with a helpful QC plotter (makes histograms by default but has a couple more options!). +These are `ggplot2` objects, so we can use `ggplot2` code with them like add a title to each. + +```{r global qc distributions} +#| fig.width: 12 +#| fig.height: 4 + +# Extract the colData into a data frame for plotting +coldata_df <- colData(filtered_spe) |> + as.data.frame() |> + # relocate barcodes to an actual column instead of rownames + tibble::rownames_to_column("barcode") + +# Define density plots for each statistic +qc_plot_sum <- ggplot2::ggplot(coldata_df) + + ggplot2::aes(x = sum) + + ggplot2::geom_density(fill = "lightblue") + + ggplot2::labs(title = "Total unique UMIs") + +qc_plot_detected <- ggplot2::ggplot(coldata_df) + + ggplot2::aes(x = detected) + + ggplot2::geom_density(fill = "steelblue") + + ggplot2::labs(title = "Total detected genes") + +qc_plot_mito <- ggplot2::ggplot(coldata_df) + + ggplot2::aes(x = subsets_mito_percent) + + ggplot2::geom_density(fill = "slateblue") + + ggplot2::labs(title = "Mitochondrial %") + + +# Plot together with patchwork +qc_plot_sum + qc_plot_detected + qc_plot_mito +``` + +These distributions all look unimodal without too much skew, which is different from how distributions from single-cell data might look. + +Placeholder for discussion about differences/similarities in technical artifacts between data types: + +- One of the reasons we filter on these metrics in single cell is due to potential differences in cell capture across droplets +- This isn't a factor in spatial where QC stats are calculated per spot aka for aggregates of cells, extremes end up getting smoothed out + - Differences in capture aren't due to heterogeneity from droplet capture but because of tissue biology/prep: + - We have distinct regions of tissue or groups of cells that have less genes detected than other ones (biology) or because the tissue didn't lay on the slide completely flat or wasn't completely permeabilized in all spots equally + +For example, let's consider the mitochondria percent distribution: + +- We do see a long right-tail for mitochondrial percentages, but the values are all really low which doesn't suggest any major quality issues. +- The lower values here vs in single-cell data make sense because cells weren't stressed in the same way they would be for single-cell library prep; more likely to tell you about the tissue quality itself (biology) and not spot quality (technical) + +Let's plot the same stats on the slide. +We'll include the H&E plot here as well for an immediate comparison. + +```{r global qc coords} +#| message: FALSE +#| fig.width: 10 + +he_plot <- ggspavis::plotVisium(filtered_spe, spots = FALSE, zoom = TRUE) + + ggplot2::ggtitle("H&E") + + # add styling to match other panels + ggplot2::theme( + plot.title = ggplot2::element_text( + hjust = 0.5, + margin = ggplot2::margin(0, 0, 0.1, 0) + ), + panel.border = ggplot2::element_rect(color = "black", linewidth = 0.25) + ) + +qc_spots_sum <- ggspavis::plotCoords(filtered_spe, annotate="sum", point_size = 1) + + # use distinct palette + ggplot2::scale_color_distiller(palette = "Blues", direction = 1) + + ggplot2::ggtitle("Total unique UMIs") + +qc_spots_detected <- ggspavis::plotCoords(filtered_spe, annotate="detected", point_size = 1) + + # use distinct palette + ggplot2::scale_color_distiller(palette = "YlOrRd", direction = 1) + + ggplot2::ggtitle("Total detected genes") + +qc_spots_mito <- ggspavis::plotCoords(filtered_spe, annotate="subsets_mito_percent", point_size = 1) + + # use distinct palette + ggplot2::scale_color_distiller(palette = "Greens", direction = 1) + + ggplot2::ggtitle("Mitochondrial %") + +# wrap plots with patchwork into 2x2 grid +patchwork::wrap_plots( + he_plot, + qc_spots_sum, + qc_spots_detected, + qc_spots_mito, + nrow = 2 +) +``` + +Now, we start to see there's more to the story. +There is spatial heterogeneity in these QC stats: + +- the likely stromal regions have distinctly higher mitochondrial percentages (although again, these values are pretty low all around!) and fewer detected UMIs/genes +- the likely blastema regions tend to have more detected UMIs/genes + +This tells us that there is local structure in the data that we might like our QC approach to take into consideration. +Using these global thresholds, we can see that QC is confounded by biology. +If we filter these spots, we'll be removing spots associated with a particular tissue region. +This shows that global thresholds may not be suitable for data with this kind of heterogeneity, so a different approach could be warranted. +Worth noting, this is not strictly a spatial transcriptomics issue; there can be quite a bit of heterogeneity in scRNA-seq data too depending on what was sequenced! +Always plot your data! + +### Filtering with local QC thresholds + + +## Normalization + +## Exploring marker gene expression + + +## Session info + +To conclude, we'll run the `sessionInfo()` command to print out exactly what system setting and R package versions were used to run this code. + +```{r} +sessionInfo() +``` + diff --git a/spatial/spatial.Rproj b/spatial/spatial.Rproj new file mode 100644 index 00000000..98df0873 --- /dev/null +++ b/spatial/spatial.Rproj @@ -0,0 +1,16 @@ +Version: 1.0 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: No + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes diff --git a/workshop-releases.md b/workshop-releases.md index 043037d3..48695a35 100644 --- a/workshop-releases.md +++ b/workshop-releases.md @@ -76,7 +76,7 @@ You can also test the Docker image locally, which may be more convenient for tes To test the Docker image locally, you can use the following commands to pull the Docker image and run launch the container with an RStudio server session: ```bash -docker pull --platform linux/amd64 ccdl/training_rstudio:edge +docker pull ccdl/training_rstudio:edge docker run \ -e PASSWORD={PASSWORD} \ -p 8787:8787 \