1 Differential Expression, Macrophage: 20190205

2 Differential expression analyses

It appears that it is possible though somewhat difficult to apply batch estimations generated by sva to the model given to DESeq/EdgeR/limma. In the case of limma it is fairly simple, but in the other two it is a bit more difficult. There is a nice discussion of this at: https://www.biostars.org/p/156186/ I am attempting to apply that logic to this data with limited success.

hs_contrasts <- list(
    "macro_chr-sh" = c("chr","sh"),
    "macro_chr-nil" = c("chr","uninf"),
    "macro_sh-nil" = c("sh", "uninf"))
## Set up the data used in the comparative contrast sets.

2.1 No batch in the model

2.1.1 Set up no batch

Print a reminder of what we can expect when doing this with no batch information.

hs_macr_lowfilt <- sm(normalize_expt(hs_cds_macr, filter=TRUE))
hs_lowfilt_pca <- sm(plot_pca(hs_cds_macr, transform="log2"))
hs_lowfilt_pca$plot

hs_macr_nobatch <- sm(all_pairwise(input=hs_cds_macr, model_batch=FALSE, parallel=FALSE,
                                   limma_method="robust"))
## wow, all tools including basic agree almost completely
medians_by_condition <- hs_macr_nobatch$basic$medians
excel_file <- glue::glue("excel/{rundate}_hs_macr_nobatch_contr-v{ver}.xlsx")
hs_macr_nobatch_tables <- sm(combine_de_tables(hs_macr_nobatch,
                                               excel=excel_file,
                                               keepers=hs_contrasts,
                                               extra_annot=medians_by_condition))
excel_file <- glue::glue("excel/{rundate}_hs_macr_nobatch_sig-v{ver}.xlsx")
hs_macr_nobatch_sig <- sm(extract_significant_genes(hs_macr_nobatch_tables,
                                                    excel=excel_file,
                                                    according_to="all"))

2.2 Batch in the model

2.2.1 Batch setup

hs_lowfilt_batch_pca <- sm(plot_pca(hs_cds_macr, transform="log2", batch="limma"))
## Error in density.default(x, adjust = adj) : 'x' contains missing values
hs_lowfilt_batch_pca$plot

In this attempt, we add a batch factor in the experimental model and see how it does.

## Here just let all_pairwise run on filtered data and do its normal ~ 0 + condition + batch analyses
hs_macr_batch <- sm(all_pairwise(input=hs_cds_macr, limma_method="robust", parallel=FALSE))
medians_by_condition <- hs_macr_batch$basic$medians
excel_file <- glue::glue("excel/{rundate}_hs_macr_batchmodel_contr-v{ver}.xlsx")
hs_macr_batch_tables <- sm(combine_de_tables(
  hs_macr_batch,
  keepers=hs_contrasts,
  extra_annot=medians_by_condition,
  include_limma=FALSE, include_edger=FALSE, include_basic=FALSE, include_ebseq=FALSE,
  excel=excel_file))
## Error in write_combined_summary(wb, excel_basename, apr, extracted, compare_plots, : object 'xl_result' not found
excel_file <- glue::glue("excel/{rundate}_hs_macr_batchmodel_sig-v{ver}.xlsx")
hs_macr_batch_sig <- sm(extract_significant_genes(
  hs_macr_batch_tables, excel=excel_file,
  according_to="deseq"))
## Error in extract_significant_genes(hs_macr_batch_tables, excel = excel_file, : object 'hs_macr_batch_tables' not found
excel_file <- glue::glue("excel/{rundate}_hs_macr_batchmodel_abund-v{ver}.xlsx")
hs_macr_batch_abun <- sm(extract_abundant_genes(
  hs_macr_batch_tables, excel=excel_file,
  according_to="deseq"))
## Error in extract_abundant_genes(hs_macr_batch_tables, excel = excel_file, : object 'hs_macr_batch_tables' not found

3 Table S2 and Figure 1b, Table S3

  • Table S2 is taking only the DESeq2 results.
  • Figure 1c is intended to be a volcano plot of the DESeq2 results.
s2_contrasts <- list(
  "macro_chr-sh" = c("chr","sh"))
excel_file <- glue::glue("excel/{rundate}_table-s2_hs_macr_batchmodel_contr-v{ver}.xlsx")
table_s2 <- sm(combine_de_tables(
  hs_macr_batch,
  excel=excel_file,
  keepers=s2_contrasts,
  include_basic=FALSE, include_limma=FALSE,
  include_ebseq=FALSE, include_edger=FALSE))
## Error in write_combined_summary(wb, excel_basename, apr, extracted, compare_plots, : object 'xl_result' not found
excel_file <- glue::glue("excel/{rundate}_table-s3_hs_macr_batchmodel_sig-v{ver}.xlsx")
table_s3 <- sm(extract_significant_genes(
  table_s2,
  excel=excel_file,
  according_to="deseq"))
## Error in extract_significant_genes(table_s2, excel = excel_file, according_to = "deseq"): object 'table_s2' not found
chosen_table <- table_s2[["data"]][[1]]
## Error in eval(expr, envir, enclos): object 'table_s2' not found
head(chosen_table)
## Error in head(chosen_table): object 'chosen_table' not found
vol <- plot_volcano_de(table=chosen_table,
                       color_by="state",
                       fc_col="deseq_logfc",
                       p_col="deseq_adjp",
                       shapes_by_state=FALSE,
                       line_position="top")
## Error in data.frame(xaxis = as.numeric(table[[fc_col]]), yaxis = as.numeric(table[[p_col]]), : object 'chosen_table' not found
pp(file="images/Figure_1c.pdf")
## Going to write the image to: images/Figure_1c.pdf when dev.off() is called.
vol$plot
## Error in eval(expr, envir, enclos): object 'vol' not found
dev.off()
## png 
##   2

3.1 Batch estimated with SVA

3.1.1 Set up sva

hs_lowfilt_svaseq_pca <- sm(plot_pca(hs_cds_macr, transform="log2", batch="svaseq", filter=TRUE))
hs_lowfilt_svaseq_pca$plot

hs_cds_macr_lowfilt <- sm(normalize_expt(hs_cds_macr, filter=TRUE))
## Here just let all_pairwise run on filtered data and do its normal ~ 0 + condition + batch analyses
hs_macr_sva <- sm(all_pairwise(
  input=hs_cds_macr_lowfilt,
  model_batch="svaseq",
  limma_method="robust"))
medians_by_condition <- hs_macr_sva$basic$medians
excel_file <- glue::glue("excel/{rundate}_hs_macr_sva_contr-v{ver}.xlsx")
hs_macr_sva_tables <- sm(combine_de_tables(
  hs_macr_sva,
  excel=excel_file,
  keepers=hs_contrasts,
  extra_annot=medians_by_condition))
excel_file <- glue::glue("excel/{rundate}_hs_macr_sva_sig-v{ver}.xlsx")
hs_macr_sva_sig <- sm(extract_significant_genes(
  hs_macr_sva_tables,
  excel=excel_file))
hs_macr_sva_ma_limma <- extract_de_plots(
  pairwise=hs_macr_sva,
  type="limma",
  table="sh_vs_chr")
hs_macr_sva_ma_limma$ma$plot

3.2 Batch correction via ruv residuals

3.2.1 Set up ruvresiduals

## hmm I got the RUVr error again, but when I ran it manually did not.
## Even more strangely, if I just run the same thing again, no error...
testme <- try(all_adjusters(input=hs_macr_lowfilt, estimate_type="ruv_residuals"), silent=TRUE)
## batch_counts: Before batch/surrogate estimation, 117505 entries are x>1: 100%.
## batch_counts: Before batch/surrogate estimation, 93 entries are x==0: 0%.
## The be method chose 1 surrogate variable.
## Attempting ruvseq residual surrogate estimation with 1 surrogate.
hs_lowfilt_ruvresid_pca <- sm(plot_pca(hs_macr_lowfilt, transform="log2", batch="ruv_residuals"))
hs_lowfilt_ruvresid_pca$plot

## Here just let all_pairwise run on filtered data and do its normal ~ 0 + condition + batch analyses
## Bizarrely, sometimes if one runs this, it gives an error "Error in (function (classes, fdef, mtable) : unable to find an inherited method for function 'RUVr' for signature '"matrix", "logical", "numeric", "NULL"'"  -- however, if one then simply runs it again it works fine.
## I am going to assume that it is because I do not explicitly invoke the library.
## library(ruv)  ## hopefully a small code change made this not needed.
testme <- all_adjusters(input=hs_macr_lowfilt, estimate_type="ruv_residuals")
## batch_counts: Before batch/surrogate estimation, 117505 entries are x>1: 100%.
## batch_counts: Before batch/surrogate estimation, 93 entries are x==0: 0%.
## The be method chose 1 surrogate variable.
## Attempting ruvseq residual surrogate estimation with 1 surrogate.
hs_macr_ruvres <- sm(all_pairwise(
  input=hs_macr_lowfilt,
  model_batch="ruv_residuals",
  limma_method="robust"))
medians_by_condition <- hs_macr_ruvres$basic$medians
excel_file <- glue::glue("excel/{rundate}_hs_macr_ruvres_contr-v{ver}.xlsx")
hs_macr_ruvres_tables <- sm(combine_de_tables(
  hs_macr_ruvres,
  excel=excel_file,
  extra_annot=medians_by_condition,
  keepers=hs_contrasts))
excel_file <- glue::glue("excel/{rundate}_hs_macr_ruvres_sig-v{ver}.xlsx")
hs_macr_ruvres_sig <- sm(extract_significant_genes(
  hs_macr_ruvres_tables,
  excel=excel_file))

3.3 Batch correction with pca

3.3.1 Setup pca

hs_lowfilt_pca_pca <- sm(plot_pca(hs_macr_lowfilt, transform="log2", batch="pca"))
hs_lowfilt_pca_pca$plot

## Here just let all_pairwise run on filtered data and do its normal ~ 0 + condition + batch analyses
hs_macr_pca <- sm(all_pairwise(
  input=hs_macr_lowfilt,
  model_batch="pca",
  limma_method="robust"))
medians_by_condition <- hs_macr_pca$basic$medians
excel_file <- glue::glue("excel/{rundate}_hs_macr_pca_contr-v{ver}.xlsx")
hs_macr_pca_tables <- sm(combine_de_tables(
  hs_macr_pca,
  excel=excel_file,
  keepers=hs_contrasts,
  extra_annot=medians_by_condition))
excel_file <- glue::glue("excel/{rundate}_hs_macr_pca_sig-v{ver}.xlsx")
hs_macr_pca_sig <- sm(extract_significant_genes(
  hs_macr_pca_tables,
  excel=excel_file))

3.4 Batch correction with ruv empirical

3.4.1 Setup ruv empirical

hs_lowfilt_ruvemp_pca <- sm(plot_pca(hs_macr_lowfilt, transform="log2", batch="ruv_empirical"))
hs_lowfilt_ruvemp_pca$plot

hs_macr_ruvemp <- sm(all_pairwise(
  input=hs_macr_lowfilt,
  model_batch="ruv_empirical",
  limma_method="robust"))
medians_by_condition <- hs_macr_ruvemp$basic$medians
excel_file <- glue::glue("excel/{rundate}_hs_macr_ruvemp_contr-v{ver}.xlsx")
hs_macr_ruvemp_tables <- sm(combine_de_tables(
  hs_macr_ruvemp,
  excel=excel_file,
  keepers=hs_contrasts,
  extra_annot=medians_by_condition))
excel_file <- glue::glue("excel/{rundate}_hs_macr_ruvemp_sig-v{ver}.xlsx")
hs_macr_ruvemp_sig <- sm(extract_significant_genes(
  hs_macr_ruvemp_tables,
  excel=excel_file))

3.5 Batch correction with combat

Then repeat with the batch-corrected data and see the differences.

3.5.1 Setup combat

hs_lowfilt_combat_pca <- sm(plot_pca(hs_macr_lowfilt, transform="log2", batch="combat_noprior"))
hs_lowfilt_combat_pca$plot

hs_macr_combat_norm <- sm(normalize_expt(hs_macr_lowfilt, batch="combat_noscale"))
hs_macr_combat <- all_pairwise(
  input=hs_macr_combat_norm,
  force=TRUE, parallel=FALSE,
  limma_method="robust")
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Not putting labels on the PC plot.
## Starting basic_pairwise().
## Starting basic pairwise comparison.
## Leaving the data alone, regardless of normalization state.
## Basic step 0/3: Transforming data.
## Basic step 1/3: Creating mean and variance tables.
## Basic step 2/3: Performing 6 comparisons.
## Basic step 3/3: Creating faux DE Tables.
## Basic: Returning tables.
## Starting deseq_pairwise().
## Starting DESeq2 pairwise comparisons.
## About to round the data, this is a pretty terrible thing to do. But if you, like me, want to see what happens when you put non-standard data into deseq, then here you go.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Choosing the non-intercept containing model.
## DESeq2 step 1/5: Including batch and condition in the deseq model.
## converting counts to integer mode
## DESeq2 step 2/5: Estimate size factors.
## DESeq2 step 3/5: Estimate dispersions.
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Using a parametric fitting seems to have worked.
## DESeq2 step 4/5: nbinomWaldTest.
## Starting ebseq_pairwise().
## About to round the data, this is a pretty terrible thing to do. But if you, like me, want to see what happens when you put non-standard data into deseq, then here you go.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Starting EBSeq pairwise subset.
## Choosing the non-intercept containing model.
## Starting EBTest of chr vs. sh.
## Forcing out NA values by putting in the mean of all data.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting EBTest of chr vs. uninf.
## Forcing out NA values by putting in the mean of all data.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting EBTest of sh vs. uninf.
## Forcing out NA values by putting in the mean of all data.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting edger_pairwise().
## Starting edgeR pairwise comparisons.
## About to round the data, this is a pretty terrible thing to do. But if you, like me, want to see what happens when you put non-standard data into deseq, then here you go.
## Warning in choose_binom_dataset(input, force = force): This data was
## inappropriately forced into integers.
## Choosing the non-intercept containing model.
## EdgeR step 1/9: Importing and normalizing data.
## EdgeR step 2/9: Estimating the common dispersion.
## EdgeR step 3/9: Estimating dispersion across genes.
## EdgeR step 4/9: Estimating GLM Common dispersion.
## EdgeR step 5/9: Estimating GLM Trended dispersion.
## EdgeR step 6/9: Estimating GLM Tagged dispersion.
## EdgeR step 7/9: Running glmFit, switch to glmQLFit by changing the argument 'edger_test'.
## EdgeR step 8/9: Making pairwise contrasts.
## Starting limma_pairwise().
## Starting limma pairwise comparison.
## Leaving the data alone, regardless of normalization state.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Limma step 2/6: running limma::voom(), switch with the argument 'which_voom'.
## Using normalize.method=quantile for voom.
## Limma step 3/6: running lmFit with method: robust.
## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps
## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps

## Warning in rlm.default(x = X, y = y, weights = w, ...): 'rlm' failed to converge
## in 20 steps
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust=FALSE and trend=FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/3: Creating table: sh_vs_chr.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: uninf_vs_chr.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: uninf_vs_sh.  Adjust=BH
## Limma step 6/6: 1/3: Creating table: chr.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: sh.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: uninf.  Adjust=BH
## Comparing analyses.
medians_by_condition <- hs_macr_combat$basic$medians
excel_file <- glue::glue("excel/{rundate}_hs_macr_combat_contr-v{ver}.xlsx")
hs_macr_combat_tables <- sm(combine_de_tables(
  hs_macr_combat,
  excel=excel_file,
  keepers=hs_contrasts,
  extra_annot=medians_by_condition))
excel_file <- glue::glue("excel/{rundate}_hs_macr_combat_contr-v{ver}.xlsx")
hs_macr_combat_sig <- extract_significant_genes(
  hs_macr_combat_tables,
  excel=excel_file)
## Writing a legend of columns.
## Printing significant genes to the file: excel/20210113_hs_macr_combat_contr-v20190205.xlsx
## 1/3: Creating significant table up_limma_macro_chr-sh
## 2/3: Creating significant table up_limma_macro_chr-nil
## 3/3: Creating significant table up_limma_macro_sh-nil
## Printing significant genes to the file: excel/20210113_hs_macr_combat_contr-v20190205.xlsx
## 1/3: Creating significant table up_edger_macro_chr-sh
## 2/3: Creating significant table up_edger_macro_chr-nil
## 3/3: Creating significant table up_edger_macro_sh-nil
## Printing significant genes to the file: excel/20210113_hs_macr_combat_contr-v20190205.xlsx
## 1/3: Creating significant table up_deseq_macro_chr-sh
## 2/3: Creating significant table up_deseq_macro_chr-nil
## 3/3: Creating significant table up_deseq_macro_sh-nil
## Printing significant genes to the file: excel/20210113_hs_macr_combat_contr-v20190205.xlsx
## 1/3: Creating significant table up_ebseq_macro_chr-sh
## The down table macro_chr-sh is empty.
## 2/3: Creating significant table up_ebseq_macro_chr-nil
## 3/3: Creating significant table up_ebseq_macro_sh-nil
## Printing significant genes to the file: excel/20210113_hs_macr_combat_contr-v20190205.xlsx
## The up table macro_chr-sh is empty.
## The down table macro_chr-sh is empty.
## The up table macro_chr-nil is empty.
## The up table macro_sh-nil is empty.
## The down table macro_sh-nil is empty.
## Adding significance bar plots.
hs_macr_combat_ma_limma <- extract_de_plots(
  pairwise=hs_macr_combat,
  type="limma",
  table="sh_vs_chr")
hs_macr_combat_ma_limma$ma$plot

hs_macr_combat_ma_edger <- extract_de_plots(
  pairwise=hs_macr_combat,
  type="edger",
  table="sh_vs_chr")
hs_macr_combat_ma_edger$ma$plot

hs_macr_combat_ma_deseq <- extract_de_plots(
  pairwise=hs_macr_combat,
  type="deseq",
  table="sh_vs_chr")
hs_macr_combat_ma_deseq$ma$plot

4 Figure out how to compare these results

I have 4 methods of performing this differential expression analysis. Each one comes with a set of metrics defining ‘significant’. Perhaps I can make a table of the # of genes defined as significant by contrast for each. In addition it may be worth while to do a scatter plots of the logFCs between these comparisons and see how well they agree?

5 Look first at the de counts

hs_macr_nobatch_sig$limma$counts
##               change_counts_up change_counts_down
## macro_chr-sh              2036                560
## macro_chr-nil              949               1176
## macro_sh-nil               459               1792
##hs_macr_batch_tables$significant$limma$counts
##hs_macr_sva_tables$significant$limma$counts
##hs_macr_ruvres_tables$significant$limma$counts
##hs_macr_pca_tables$significant$limma$counts
##hs_macr_ruvemp_tables$significant$limma$counts
##hs_macr_combat_tables$significant$limma$counts

5.1 Compare DeSeq / Basic without batch in model

hs_macr_nobatch_basic <- merge(
  hs_macr_nobatch$deseq$all_tables$sh_vs_chr,
  hs_macr_batch$basic$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_nobatch_basic) <- hs_macr_nobatch_basic[["Row.names"]]
hs_macr_nobatch_logfc <- hs_macr_nobatch_basic[, c("logFC.x", "logFC.y")]
colnames(hs_macr_nobatch_logfc) <- c("nobatch", "basic")
lfc_nb_b <- sm(plot_linear_scatter(hs_macr_nobatch_logfc, pretty_colors=FALSE))
lfc_nb_b$scatter

lfc_nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 404, df = 13079, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9608 0.9634
## sample estimates:
##    cor 
## 0.9621
hs_macr_nobatch_p <- hs_macr_nobatch_basic[, c("P.Value","p")]
hs_macr_nobatch_p[[2]] <- as.numeric(hs_macr_nobatch_p[[2]])
colnames(hs_macr_nobatch_p) <- c("nobatch","basic")
hs_macr_nobatch_p <- -1 * log(hs_macr_nobatch_p)
hs_macr_p_nb_b <- sm(plot_linear_scatter(hs_macr_nobatch_p, pretty_colors=FALSE))
hs_macr_p_nb_b$scatter

hs_macr_p_nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 82, df = 13079, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5694 0.5921
## sample estimates:
##    cor 
## 0.5808

5.2 Compare SVA to batch in model, DESeq

hs_macr_sva_batch <- merge(
  hs_macr_sva$deseq$all_tables$sh_vs_chr,
  hs_macr_batch$deseq$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_sva_batch) <- hs_macr_sva_batch[["Row.names"]]
hs_macr_sva_logfc <- hs_macr_sva_batch[, c("logFC.x","logFC.y")]
colnames(hs_macr_sva_logfc) <- c("sva","batch")
hs_macr_lfc_b_s <- sm(plot_linear_scatter(hs_macr_sva_logfc, pretty_colors=FALSE))
hs_macr_lfc_b_s$scatter

hs_macr_lfc_b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 64, df = 13079, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4769 0.5030
## sample estimates:
##    cor 
## 0.4901

5.2.1 Include p-value estimations

Try putting some information of the p-values with the comparative log2fc

lfc_b_s <- hs_macr_sva_batch[, c("logFC.x", "logFC.y", "P.Value.x", "P.Value.y")]
colnames(lfc_b_s) <- c("l2fcsva", "l2fcbatch", "psva", "pbatch")
hs_macr_lfc_b_s$scatter

cutoff <- 0.1
lfc_b_s$state <- ifelse(lfc_b_s$psva > cutoff & lfc_b_s$pbatch > cutoff, "bothinsig",
                 ifelse(lfc_b_s$psva <= cutoff & lfc_b_s$pbatch <= cutoff, "bothsig",
                 ifelse(lfc_b_s$psva <= cutoff, "svasig", "batchsig")))
##lfcp_b_s$lfcstate <- ifelse(lfcp_b_s$l2fcsva >= 0.75 & lfcp_b_s$l2fcbatch, "", "")
num_bothinsig <- sum(lfc_b_s$state == "bothinsig")
num_bothsig <- sum(lfc_b_s$state == "bothsig")
num_svasig <- sum(lfc_b_s$state == "svasig")
num_batchsig <- sum(lfc_b_s$state == "batchsig")

library(ggplot2)
aes_color = "(l2fcsva >= 0.75 | l2fcsva <= -0.75 | l2fcbatch >= 0.75 | l2fcbatch <= -0.75)"
plt <- ggplot2::ggplot(lfc_b_s, aes_string(x="l2fcsva", y="l2fcbatch")) +
    ## ggplot2::geom_point(stat="identity", size=2, alpha=0.2, aes_string(shape="as.factor(aes_color)", colour="as.factor(state)", fill="as.factor(state)")) +
    ggplot2::geom_abline(colour="blue", slope=1, intercept=0, size=0.5) +
    ggplot2::geom_hline(yintercept=c(-0.75, 0.75), color="red", size=0.5) +
    ggplot2::geom_vline(xintercept=c(-0.75, 0.75), color="red", size=0.5) +
    ggplot2::geom_point(stat="identity", size=2, alpha=0.2, aes_string(colour="as.factor(state)", fill="as.factor(state)")) +
    ggplot2::scale_color_manual(name="state", values=c("bothinsig"="grey", "bothsig"="forestgreen", "svasig"="darkred", "batchsig"="darkblue")) +
    ggplot2::scale_fill_manual(name="state", values=c("bothinsig"="grey", "bothsig"="forestgreen", "svasig"="darkred", "batchsig"="darkblue"),
                               labels=c(
                                   paste0("Both InSig.: ", num_bothinsig),
                                   paste0("Both Sig.: ", num_bothsig),
                                   paste0("Sva Sig.: ", num_svasig),
                                   paste0("Batch Sig.: ", num_batchsig)),
                               guide=ggplot2::guide_legend(override.aes=aes(size=3, fill="grey"))) +
    ggplot2::guides(fill=ggplot2::guide_legend(override.aes=list(size=3))) +
    ggplot2::theme_bw()
plt

5.3 Compare ruvresid to batch in model, DESeq

hs_macr_batch_ruvresid_deseq <- merge(
  hs_macr_ruvres$deseq$all_tables$sh_vs_chr,
  hs_macr_batch$basic$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_batch_ruvresid_deseq) <- hs_macr_batch_ruvresid_deseq[["Row.names"]]
hs_macr_batch_ruvresid_logfc <- hs_macr_batch_ruvresid_deseq[, c("logFC.x","logFC.y")]
colnames(hs_macr_batch_ruvresid_logfc) <- c("nobatch","basic")
lfc_ruv_bat <- plot_linear_scatter(hs_macr_batch_ruvresid_logfc, pretty_colors=FALSE)
## Warning in plot_multihistogram(df): NAs introduced by coercion
lfc_ruv_bat$scatter

lfc_ruv_bat$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 701, df = 13079, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9865 0.9874
## sample estimates:
##   cor 
## 0.987

5.4 Compare no batch to batch in model, limma

hs_macr_nobatch_batch <- merge(
  hs_macr_nobatch$limma$all_tables$sh_vs_chr,
  hs_macr_batch$limma$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_nobatch_batch) <- hs_macr_nobatch_batch[["Row.names"]]
hs_macr_nobatch_batch <- hs_macr_nobatch_batch[, c("logFC.x","logFC.y")]
colnames(hs_macr_nobatch_batch) <- c("nobatch","batch")
nb_b <- plot_linear_scatter(hs_macr_nobatch_batch, pretty_colors=FALSE)
## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0

## Warning in lmrob.S(x, y, control = control): find_scale() did not converge in
## 'maxit.scale' (= 200) iterations with tol=1e-10, last rel.diff=0
## Warning in lmrob.S(x, y, control = control): S refinements did not converge (to
## refine.tol=1e-07) in 200 (= k.max) steps

## Warning in lmrob.S(x, y, control = control): S refinements did not converge (to
## refine.tol=1e-07) in 200 (= k.max) steps
## Warning in plot_multihistogram(df): NAs introduced by coercion
nb_b$scatter

nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 107, df = 51039, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4200 0.4342
## sample estimates:
##    cor 
## 0.4271

5.5 Batch in model vs. SVA, limma

hs_macr_batch_sva <- merge(
  hs_macr_batch$limma$all_tables$sh_vs_chr,
  hs_macr_sva$limma$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_batch_sva) <- hs_macr_batch_sva[["Row.names"]]
hs_macr_batch_sva <- hs_macr_batch_sva[, c("logFC.x","logFC.y")]
colnames(hs_macr_batch_sva) <- c("batch","sva")
b_s <- plot_linear_scatter(hs_macr_batch_sva, pretty_colors=FALSE)
## Warning in plot_multihistogram(df): NAs introduced by coercion
b_s$scatter

b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 62, df = 13079, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4647 0.4911
## sample estimates:
##   cor 
## 0.478

5.6 Nobatch vs. batch in model, edger

hs_macr_nobatch_batch <- merge(
  hs_macr_nobatch$edger$all_tables$sh_vs_chr,
  hs_macr_batch$edger$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_nobatch_batch) <- hs_macr_nobatch_batch[["Row.names"]]
hs_macr_nobatch_batch <- hs_macr_nobatch_batch[, c("logFC.x","logFC.y")]
colnames(hs_macr_nobatch_batch) <- c("nobatch","batch")
nb_b <- sm(plot_linear_scatter(hs_macr_nobatch_batch, pretty_colors=FALSE))
nb_b$scatter

nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 265, df = 51039, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.7567 0.7640
## sample estimates:
##    cor 
## 0.7604

5.7 Batch in model vs. SVA, edger

hs_macr_batch_sva <- merge(
  hs_macr_batch$edger$all_tables$sh_vs_chr,
  hs_macr_sva$edger$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_batch_sva) <- hs_macr_batch_sva[["Row.names"]]
hs_macr_batch_sva <- hs_macr_batch_sva[, c("logFC.x","logFC.y")]
colnames(hs_macr_batch_sva) <- c("batch","sva")
b_s <- plot_linear_scatter(hs_macr_batch_sva, pretty_colors=FALSE)
## Warning in plot_multihistogram(df): NAs introduced by coercion
b_s$scatter

b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 64, df = 13079, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4781 0.5041
## sample estimates:
##    cor 
## 0.4912

5.8 Compare nobatch vs. batch, deseq

hs_macr_nobatch_batch <- merge(
  hs_macr_nobatch$deseq$all_tables$sh_vs_chr,
  hs_macr_batch$deseq$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_nobatch_batch) <- hs_macr_nobatch_batch[["Row.names"]]
hs_macr_nobatch_batch <- hs_macr_nobatch_batch[, c("logFC.x","logFC.y")]
colnames(hs_macr_nobatch_batch) <- c("nobatch","batch")
nb_b <- sm(plot_linear_scatter(hs_macr_nobatch_batch, pretty_colors=FALSE))
nb_b$scatter

nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 149, df = 51039, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5443 0.5564
## sample estimates:
##    cor 
## 0.5503

5.9 Compare batch vs. SVA, deseq

hs_macr_batch_sva <- merge(
  hs_macr_batch$deseq$all_tables$sh_vs_chr,
  hs_macr_sva$deseq$all_tables$sh_vs_chr,
  by="row.names")
rownames(hs_macr_batch_sva) <- hs_macr_batch_sva[["Row.names"]]
hs_macr_batch_sva <- hs_macr_batch_sva[, c("logFC.x", "logFC.y")]
colnames(hs_macr_batch_sva) <- c("batch", "sva")
b_s <- sm(plot_linear_scatter(hs_macr_batch_sva, pretty_colors=FALSE))
b_s$scatter

b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 64, df = 13079, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4769 0.5030
## sample estimates:
##    cor 
## 0.4901

6 Repeat using the parasite data

In ‘macrophage_estimation’, we did a series of analyses to try to pick out some of the surrogate variables in the data. Now we will perform a set of differential expression analyses using the results from that. Since the ‘batch’ element of the data is reasonably well explained, we will not abuse the data with sva/combat, but instead include batch in the experimental model.

It appears that it is possible though somewhat difficult to apply batch estimations generated by sva to the model given to DESeq/EdgeR/limma. In the case of limma it is fairly simple, but in the other two it is a bit more difficult. There is a nice discussion of this at: https://www.biostars.org/p/156186/ I am attempting to apply that logic to this data with limited success.

lp_contrasts <- list(
    "macro_chr-sh" = c("chr", "sh"))
lp_macr_norm <- sm(normalize_expt(lp_macr, filter=TRUE, convert="cpm", norm="quant"))
lp_macr_combat_norm <- sm(normalize_expt(lp_macr, filter=TRUE, norm="quant",
                                         low_to_zero=TRUE, batch="combat"))
lp_macr_lowfilt <- sm(normalize_expt(lp_macr, filter=TRUE))
## Set up the data used in the 3 comparative contrast sets.

6.1 No batch in the model

lp_macr_nobatch <- sm(all_pairwise(lp_macr_lowfilt, limma_method="robust", model_batch=FALSE))
## wow, all tools including basic agree almost completely
medians_by_condition <- lp_macr_nobatch$basic$medians
lp_macr_nobatch_tables <- sm(combine_de_tables(
  lp_macr_nobatch,
  excel=paste0("excel/lp_macr_nobatch-v", ver, ".xlsx"),
  keepers=lp_contrasts,
  extra_annot=medians_by_condition))
lp_macr_nobatch_sig <- sm(extract_significant_genes(
  lp_macr_nobatch_tables,
  excel=paste0("excel/lp_macr_nobatch_significant-v", ver, ".xlsx")))

6.2 Batch in the model

In this attempt, we add a batch factor in the experimental model and see how it does.

## Here just let all_pairwise run on filtered data and do its normal ~ 0 + condition + batch analyses
lp_macr_batch <- sm(all_pairwise(lp_macr_lowfilt, limma_method="robust"))
medians_by_condition <- lp_macr_batch$basic$medians
lp_macr_batch_tables <- sm(combine_de_tables(
  lp_macr_batch,
  excel=paste0("excel/lp_macr_batchmodel-v", ver, ".xlsx"),
  keepers=lp_contrasts,
  extra_annot=medians_by_condition))
lp_macr_batch_sig <- sm(extract_significant_genes(
  lp_macr_batch_tables,
  excel=paste0("excel/lp_macr_batchmodel_significant-v", ver, ".xlsx")))

6.3 Batch estimated with SVA

## Here just let all_pairwise run on filtered data and do its normal ~ 0 + condition + batch analyses
lp_macr_sva <- sm(all_pairwise(lp_macr_lowfilt, limma_method="robust", model_batch="sva"))
medians_by_condition <- lp_macr_sva$basic$medians
lp_macr_sva_tables <- sm(combine_de_tables(
  lp_macr_sva,
  excel=paste0("excel/lp_macr_sva-v", ver, ".xlsx"),
  keepers=lp_contrasts,
  extra_annot=medians_by_condition))
lp_macr_sva_sig <- sm(extract_significant_genes(
  lp_macr_sva_tables,
  excel=paste0("excel/lp_macr_sva_significant-v", ver, ".xlsx")))

7 Figure out how to compare these results

I have 4 methods of performing this differential expression analysis. Each one comes with a set of metrics defining ‘significant’. Perhaps I can make a table of the # of genes defined as significant by contrast for each. In addition it may be worth while to do a scatter plots of the logFCs between these comparisons and see how well they agree?

7.1 Compare DeSeq / Basic without batch in model

lp_macr_nobatch_basic <- merge(
  lp_macr_nobatch$deseq$all_tables$sh_vs_chr,
  lp_macr_batch$basic$all_tables$sh_vs_chr,
  by="row.names")
rownames(lp_macr_nobatch_basic) <- lp_macr_nobatch_basic[["Row.names"]]
lp_macr_nobatch_logfc <- lp_macr_nobatch_basic[, c("logFC.x", "logFC.y")]
colnames(lp_macr_nobatch_logfc) <- c("nobatch","basic")
lfc_nb_b <- sm(plot_linear_scatter(lp_macr_nobatch_logfc, pretty_colors=FALSE))
lfc_nb_b$scatter

lfc_nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 189, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8927 0.9009
## sample estimates:
##    cor 
## 0.8969
lp_macr_nobatch_p <- lp_macr_nobatch_basic[, c("P.Value","p")]
lp_macr_nobatch_p[[2]] <- as.numeric(lp_macr_nobatch_p[[2]])
colnames(lp_macr_nobatch_p) <- c("nobatch","basic")
lp_macr_nobatch_p <- -1 * log(lp_macr_nobatch_p)
p_nb_b <- sm(plot_linear_scatter(lp_macr_nobatch_p, pretty_colors=FALSE))
p_nb_b$scatter

p_nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 105, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.7387 0.7573
## sample estimates:
##    cor 
## 0.7481

7.2 Compare SVA to batch in model, DESeq

lp_macr_sva_batch <- merge(
  lp_macr_sva$deseq$all_tables$sh_vs_chr,
  lp_macr_batch$deseq$all_tables$sh_vs_chr,
  by="row.names")
rownames(lp_macr_sva_batch) <- lp_macr_sva_batch[["Row.names"]]
lp_macr_sva_logfc <- lp_macr_sva_batch[, c("logFC.x","logFC.y")]
colnames(lp_macr_sva_logfc) <- c("sva","batch")
lfc_b_s <- sm(plot_linear_scatter(lp_macr_sva_logfc, pretty_colors=FALSE))
lfc_b_s$scatter

lfc_b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 80, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6378 0.6622
## sample estimates:
##    cor 
## 0.6502
lp_macr_sva_p <- lp_macr_sva_batch[, c("P.Value.x","P.Value.y")]
lp_macr_sva_p[[2]] <- as.numeric(lp_macr_sva_p[[2]])
colnames(lp_macr_sva_p) <- c("sva","batch")
lp_macr_sva_p <- -1 * log(lp_macr_sva_p)
p_b_s <- sm(plot_linear_scatter(lp_macr_sva_p, pretty_colors=FALSE))
p_b_s$scatter

p_b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 43, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4051 0.4397
## sample estimates:
##    cor 
## 0.4225

7.2.1 Include p-value estimations

Try putting some information of the p-values with the comparative log2fc

lfcp_b_s <- lp_macr_sva_batch[, c("logFC.x", "logFC.y", "P.Value.x", "P.Value.y")]
colnames(lfcp_b_s) <- c("l2fcsva", "l2fcbatch", "psva", "pbatch")
lfc_b_s$scatter

cutoff <- 0.1
lfcp_b_s$state <- ifelse(lfcp_b_s$psva > cutoff & lfcp_b_s$pbatch > cutoff, "bothinsig",
                  ifelse(lfcp_b_s$psva <= cutoff & lfcp_b_s$pbatch <= cutoff, "bothsig",
                  ifelse(lfcp_b_s$psva <= cutoff, "svasig", "batchsig")))
##lfcp_b_s$lfcstate <- ifelse(lfcp_b_s$l2fcsva >= 0.75 & lfcp_b_s$l2fcbatch, "", "")
num_bothinsig <- sum(lfcp_b_s$state == "bothinsig")
num_bothsig <- sum(lfcp_b_s$state == "bothsig")
num_svasig <- sum(lfcp_b_s$state == "svasig")
num_batchsig <- sum(lfcp_b_s$state == "batchsig")

library(ggplot2)
aes_color = "(l2fcsva >= 0.75 | l2fcsva <= -0.75 | l2fcbatch >= 0.75 | l2fcbatch <= -0.75)"
plt <- ggplot2::ggplot(lfcp_b_s, aes_string(x="l2fcsva", y="l2fcbatch")) +
    ## ggplot2::geom_point(stat="identity", size=2, alpha=0.2, aes_string(shape="as.factor(aes_color)", colour="as.factor(state)", fill="as.factor(state)")) +
    ggplot2::geom_abline(colour="blue", slope=1, intercept=0, size=0.5) +
    ggplot2::geom_hline(yintercept=c(-0.75, 0.75), color="red", size=0.5) +
    ggplot2::geom_vline(xintercept=c(-0.75, 0.75), color="red", size=0.5) +
    ggplot2::geom_point(stat="identity", size=2, alpha=0.2, aes_string(colour="as.factor(state)", fill="as.factor(state)")) +
    ggplot2::scale_color_manual(name="state", values=c("bothinsig"="grey", "bothsig"="forestgreen", "svasig"="darkred", "batchsig"="darkblue")) +
    ggplot2::scale_fill_manual(name="state", values=c("bothinsig"="grey", "bothsig"="forestgreen", "svasig"="darkred", "batchsig"="darkblue"),
                               labels=c(
                                   paste0("Both InSig.: ", num_bothinsig),
                                   paste0("Both Sig.: ", num_bothsig),
                                   paste0("Sva Sig.: ", num_svasig),
                                   paste0("Batch Sig.: ", num_batchsig)),
                               guide=ggplot2::guide_legend(override.aes=aes(size=3, fill="grey"))) +
    ggplot2::guides(fill=ggplot2::guide_legend(override.aes=list(size=3))) +
    ggplot2::theme_bw()
plt

7.3 Compare no batch to batch in model, limma

lp_macr_nobatch_batch <- merge(
  lp_macr_nobatch$limma$all_tables$sh_vs_chr,
  lp_macr_batch$limma$all_tables$sh_vs_chr,
  by="row.names")
rownames(lp_macr_nobatch_batch) <- lp_macr_nobatch_batch[["Row.names"]]
lp_macr_nobatch_batch <- lp_macr_nobatch_batch[, c("logFC.x","logFC.y")]
colnames(lp_macr_nobatch_batch) <- c("nobatch","batch")
nb_b <- plot_linear_scatter(lp_macr_nobatch_batch, pretty_colors=FALSE)
## Warning in plot_multihistogram(df): NAs introduced by coercion
nb_b$scatter

nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 77, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6235 0.6486
## sample estimates:
##    cor 
## 0.6362

7.4 Batch in model vs. SVA, limma

lp_macr_batch_sva <- merge(
  lp_macr_batch$limma$all_tables$sh_vs_chr,
  lp_macr_sva$limma$all_tables$sh_vs_chr,
  by="row.names")
rownames(lp_macr_batch_sva) <- lp_macr_batch_sva[["Row.names"]]
lp_macr_batch_sva <- lp_macr_batch_sva[, c("logFC.x","logFC.y")]
colnames(lp_macr_batch_sva) <- c("batch","sva")
b_s <- plot_linear_scatter(lp_macr_batch_sva, pretty_colors=FALSE)
## Warning in plot_multihistogram(df): NAs introduced by coercion
b_s$scatter

b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 85, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6608 0.6839
## sample estimates:
##    cor 
## 0.6725

7.5 Nobatch vs. batch in model, edger

lp_macr_nobatch_batch <- merge(
  lp_macr_nobatch$edger$all_tables$sh_vs_chr,
  lp_macr_batch$edger$all_tables$sh_vs_chr,
  by="row.names")
rownames(lp_macr_nobatch_batch) <- lp_macr_nobatch_batch[["Row.names"]]
lp_macr_nobatch_batch <- lp_macr_nobatch_batch[, c("logFC.x","logFC.y")]
colnames(lp_macr_nobatch_batch) <- c("nobatch","batch")
nb_b <- sm(plot_linear_scatter(lp_macr_nobatch_batch, pretty_colors=FALSE))
nb_b$scatter

nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 65, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5599 0.5881
## sample estimates:
##    cor 
## 0.5741

7.6 Batch in model vs. SVA, edger

lp_macr_batch_sva <- merge(
  lp_macr_batch$edger$all_tables$sh_vs_chr,
  lp_macr_sva$edger$all_tables$sh_vs_chr,
  by="row.names")
rownames(lp_macr_batch_sva) <- lp_macr_batch_sva[["Row.names"]]
lp_macr_batch_sva <- lp_macr_batch_sva[, c("logFC.x","logFC.y")]
colnames(lp_macr_batch_sva) <- c("batch","sva")
b_s <- plot_linear_scatter(lp_macr_batch_sva, pretty_colors=FALSE)
## Warning in plot_multihistogram(df): NAs introduced by coercion
b_s$scatter

b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 80, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6391 0.6634
## sample estimates:
##    cor 
## 0.6514

7.7 Compare nobatch vs. batch, deseq

lp_macr_nobatch_batch <- merge(
  lp_macr_nobatch$deseq$all_tables$sh_vs_chr,
  lp_macr_batch$deseq$all_tables$sh_vs_chr,
  by="row.names")
rownames(lp_macr_nobatch_batch) <- lp_macr_nobatch_batch[["Row.names"]]
lp_macr_nobatch_batch <- lp_macr_nobatch_batch[, c("logFC.x","logFC.y")]
colnames(lp_macr_nobatch_batch) <- c("nobatch","batch")
nb_b <- sm(plot_linear_scatter(lp_macr_nobatch_batch, pretty_colors=FALSE))
nb_b$scatter

nb_b$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 66, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5634 0.5915
## sample estimates:
##    cor 
## 0.5776

7.8 Compare batch vs. SVA, deseq

lp_macr_batch_sva <- merge(
  lp_macr_batch$deseq$all_tables$sh_vs_chr,
  lp_macr_sva$deseq$all_tables$sh_vs_chr,
  by="row.names")
rownames(lp_macr_batch_sva) <- lp_macr_batch_sva[["Row.names"]]
lp_macr_batch_sva <- lp_macr_batch_sva[, c("logFC.x","logFC.y")]
colnames(lp_macr_batch_sva) <- c("batch","sva")
b_s <- sm(plot_linear_scatter(lp_macr_batch_sva, pretty_colors=FALSE))
b_s$scatter

b_s$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 1] and df[, 2]
## t = 80, df = 8660, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6378 0.6622
## sample estimates:
##    cor 
## 0.6502
pander::pander(sessionInfo())

R version 4.0.3 (2020-10-10)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=C

attached base packages: parallel, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: ggplot2(v.3.3.3), ruv(v.0.9.7.1), edgeR(v.3.32.0), hpgltools(v.1.0), testthat(v.3.0.1), R6(v.2.5.0), Biobase(v.2.50.0) and BiocGenerics(v.0.36.0)

loaded via a namespace (and not attached): R.utils(v.2.10.1), tidyselect(v.1.1.0), lme4(v.1.1-26), RSQLite(v.2.2.1), AnnotationDbi(v.1.52.0), grid(v.4.0.3), BiocParallel(v.1.24.1), IHW(v.1.18.0), devtools(v.2.3.2), scatterpie(v.0.1.5), munsell(v.0.5.0), codetools(v.0.2-18), preprocessCore(v.1.52.0), statmod(v.1.4.35), withr(v.2.3.0), colorspace(v.2.0-0), GOSemSim(v.2.16.1), OrganismDbi(v.1.32.0), knitr(v.1.30), rstudioapi(v.0.13), stats4(v.4.0.3), Vennerable(v.3.1.0.9000), robustbase(v.0.93-6), DOSE(v.3.16.0), MatrixGenerics(v.1.2.0), labeling(v.0.4.2), slam(v.0.1-48), lpsymphony(v.1.18.0), GenomeInfoDbData(v.1.2.4), hwriter(v.1.3.2), polyclip(v.1.10-0), bit64(v.4.0.5), farver(v.2.0.3), rprojroot(v.2.0.2), downloader(v.0.4), vctrs(v.0.3.6), generics(v.0.1.0), xfun(v.0.19), BiocFileCache(v.1.14.0), EDASeq(v.2.24.0), doParallel(v.1.0.16), GenomeInfoDb(v.1.26.2), graphlayouts(v.0.7.1), locfit(v.1.5-9.4), bitops(v.1.0-6), fgsea(v.1.16.0), DelayedArray(v.0.16.0), assertthat(v.0.2.1), scales(v.1.1.1), ggraph(v.2.0.4), enrichplot(v.1.10.1), gtable(v.0.3.0), RUVSeq(v.1.24.0), sva(v.3.38.0), processx(v.3.4.5), tidygraph(v.1.2.0), rlang(v.0.4.10), genefilter(v.1.72.0), splines(v.4.0.3), rtracklayer(v.1.50.0), broom(v.0.7.3), BiocManager(v.1.30.10), yaml(v.2.2.1), reshape2(v.1.4.4), GenomicFeatures(v.1.42.1), backports(v.1.2.1), qvalue(v.2.22.0), clusterProfiler(v.3.18.0), RBGL(v.1.66.0), tools(v.4.0.3), usethis(v.1.6.3), ellipsis(v.0.3.1), gplots(v.3.1.1), RColorBrewer(v.1.1-2), blockmodeling(v.1.0.0), sessioninfo(v.1.1.1), Rcpp(v.1.0.5), plyr(v.1.8.6), progress(v.1.2.2), zlibbioc(v.1.36.0), purrr(v.0.3.4), RCurl(v.1.98-1.2), ps(v.1.5.0), prettyunits(v.1.1.1), openssl(v.1.4.3), viridis(v.0.5.1), cowplot(v.1.1.0), S4Vectors(v.0.28.1), SummarizedExperiment(v.1.20.0), ggrepel(v.0.9.0), colorRamps(v.2.3), fs(v.1.5.0), variancePartition(v.1.20.0), magrittr(v.2.0.1), data.table(v.1.13.6), openxlsx(v.4.2.3), DO.db(v.2.9), matrixStats(v.0.57.0), aroma.light(v.3.20.0), pkgload(v.1.1.0), hms(v.0.5.3), evaluate(v.0.14), xtable(v.1.8-4), pbkrtest(v.0.5-0.1), XML(v.3.99-0.5), jpeg(v.0.1-8.1), IRanges(v.2.24.1), gridExtra(v.2.3), compiler(v.4.0.3), biomaRt(v.2.46.0), tibble(v.3.0.4), KernSmooth(v.2.23-18), crayon(v.1.3.4), shadowtext(v.0.0.7), R.oo(v.1.24.0), minqa(v.1.2.4), htmltools(v.0.5.0), mgcv(v.1.8-33), corpcor(v.1.6.9), geneplotter(v.1.68.0), tidyr(v.1.1.2), DBI(v.1.1.0), tweenr(v.1.0.1), dbplyr(v.2.0.0), MASS(v.7.3-53), rappdirs(v.0.3.1), boot(v.1.3-25), ShortRead(v.1.48.0), Matrix(v.1.3-0), cli(v.2.2.0), R.methodsS3(v.1.8.1), quadprog(v.1.5-8), igraph(v.1.2.6), GenomicRanges(v.1.42.0), pkgconfig(v.2.0.3), rvcheck(v.0.1.8), GenomicAlignments(v.1.26.0), xml2(v.1.3.2), foreach(v.1.5.1), annotate(v.1.68.0), XVector(v.0.30.0), EBSeq(v.1.30.0), stringr(v.1.4.0), callr(v.3.5.1), digest(v.0.6.27), graph(v.1.68.0), Biostrings(v.2.58.0), rmarkdown(v.2.6), fastmatch(v.1.1-0), PROPER(v.1.22.0), directlabels(v.2020.6.17), curl(v.4.3), Rsamtools(v.2.6.0), gtools(v.3.8.2), nloptr(v.1.2.2.2), lifecycle(v.0.2.0), nlme(v.3.1-151), desc(v.1.2.0), viridisLite(v.0.3.0), askpass(v.1.1), limma(v.3.46.0), fansi(v.0.4.1), pillar(v.1.4.7), lattice(v.0.20-41), DEoptimR(v.1.0-8), httr(v.1.4.2), pkgbuild(v.1.2.0), survival(v.3.2-7), GO.db(v.3.12.1), glue(v.1.4.2), remotes(v.2.2.0), fdrtool(v.1.2.15), zip(v.2.1.1), png(v.0.1-7), iterators(v.1.0.13), pander(v.0.6.3), bit(v.4.0.4), ggforce(v.0.3.2), stringi(v.1.5.3), blob(v.1.2.1), DESeq2(v.1.30.0), latticeExtra(v.0.6-29), caTools(v.1.18.0), memoise(v.1.1.0) and dplyr(v.1.0.2)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 052640a0b091e9a740e487957e087f265d0c74b5
## This is hpgltools commit: Thu Dec 3 13:42:02 2020 -0500: 052640a0b091e9a740e487957e087f265d0c74b5
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
## Saving to 03_expression_macrophage_20190205-v20190205.rda.xz
tmp <- sm(saveme(filename=this_save))
LS0tCnRpdGxlOiAiTC5wYW5hbWVuc2lzIDIwMTkwMjA1OiBEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbiBpbiBodW1hbiBtYWNyb3BoYWdlcy4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIi9kYXRhL2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OTAsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQpwcmV2aW91c19maWxlIDwtICIwMl9lc3RpbWF0aW9uX21hY3JvcGhhZ2VfMjAxOTAyMDUuUm1kIgp2ZXIgPC0gIjIwMTkwMjA1IgoKdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQpybWRfZmlsZSA8LSAiMDNfZXhwcmVzc2lvbl9tYWNyb3BoYWdlXzIwMTkwMjA1LlJtZCIKYGBgCgojIERpZmZlcmVudGlhbCBFeHByZXNzaW9uLCBNYWNyb3BoYWdlOiBgciB2ZXJgCgojIERpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzCgpJdCBhcHBlYXJzIHRoYXQgaXQgaXMgcG9zc2libGUgdGhvdWdoIHNvbWV3aGF0IGRpZmZpY3VsdCB0byBhcHBseSBiYXRjaCBlc3RpbWF0aW9ucyBnZW5lcmF0ZWQgYnkgc3ZhCnRvIHRoZSBtb2RlbCBnaXZlbiB0byBERVNlcS9FZGdlUi9saW1tYS4gIEluIHRoZSBjYXNlIG9mIGxpbW1hIGl0IGlzIGZhaXJseSBzaW1wbGUsIGJ1dCBpbiB0aGUgb3RoZXIKdHdvIGl0IGlzIGEgYml0IG1vcmUgZGlmZmljdWx0LiAgVGhlcmUgaXMgYSBuaWNlIGRpc2N1c3Npb24gb2YgdGhpcyBhdDogaHR0cHM6Ly93d3cuYmlvc3RhcnMub3JnL3AvMTU2MTg2LwpJIGFtIGF0dGVtcHRpbmcgdG8gYXBwbHkgdGhhdCBsb2dpYyB0byB0aGlzIGRhdGEgd2l0aCBsaW1pdGVkIHN1Y2Nlc3MuCgpgYGB7ciBzZXR1cF9kZV9ub3JtLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX2NvbnRyYXN0cyA8LSBsaXN0KAogICAgIm1hY3JvX2Noci1zaCIgPSBjKCJjaHIiLCJzaCIpLAogICAgIm1hY3JvX2Noci1uaWwiID0gYygiY2hyIiwidW5pbmYiKSwKICAgICJtYWNyb19zaC1uaWwiID0gYygic2giLCAidW5pbmYiKSkKIyMgU2V0IHVwIHRoZSBkYXRhIHVzZWQgaW4gdGhlIGNvbXBhcmF0aXZlIGNvbnRyYXN0IHNldHMuCmBgYAoKIyMgTm8gYmF0Y2ggaW4gdGhlIG1vZGVsCgojIyMgU2V0IHVwIG5vIGJhdGNoCgpQcmludCBhIHJlbWluZGVyIG9mIHdoYXQgd2UgY2FuIGV4cGVjdCB3aGVuIGRvaW5nIHRoaXMgd2l0aCBubyBiYXRjaCBpbmZvcm1hdGlvbi4KCmBgYHtyIG5vYmF0Y2hfc2V0dXB9CmhzX21hY3JfbG93ZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChoc19jZHNfbWFjciwgZmlsdGVyPVRSVUUpKQpoc19sb3dmaWx0X3BjYSA8LSBzbShwbG90X3BjYShoc19jZHNfbWFjciwgdHJhbnNmb3JtPSJsb2cyIikpCmhzX2xvd2ZpbHRfcGNhJHBsb3QKYGBgCgpgYGB7ciBtYWNyb19ub2JhdGNoMSwgZmlnLnNob3c9ImhpZGUifQpoc19tYWNyX25vYmF0Y2ggPC0gc20oYWxsX3BhaXJ3aXNlKGlucHV0PWhzX2Nkc19tYWNyLCBtb2RlbF9iYXRjaD1GQUxTRSwgcGFyYWxsZWw9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltbWFfbWV0aG9kPSJyb2J1c3QiKSkKIyMgd293LCBhbGwgdG9vbHMgaW5jbHVkaW5nIGJhc2ljIGFncmVlIGFsbW9zdCBjb21wbGV0ZWx5Cm1lZGlhbnNfYnlfY29uZGl0aW9uIDwtIGhzX21hY3Jfbm9iYXRjaCRiYXNpYyRtZWRpYW5zCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX21hY3Jfbm9iYXRjaF9jb250ci12e3Zlcn0ueGxzeCIpCmhzX21hY3Jfbm9iYXRjaF90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoaHNfbWFjcl9ub2JhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycz1oc19jb250cmFzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfYW5ub3Q9bWVkaWFuc19ieV9jb25kaXRpb24pKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX25vYmF0Y2hfc2lnLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9ub2JhdGNoX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGhzX21hY3Jfbm9iYXRjaF90YWJsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nX3RvPSJhbGwiKSkKYGBgCgojIyBCYXRjaCBpbiB0aGUgbW9kZWwKCiMjIyBCYXRjaCBzZXR1cAoKYGBge3IgYmF0Y2hfc2V0dXB9CmhzX2xvd2ZpbHRfYmF0Y2hfcGNhIDwtIHNtKHBsb3RfcGNhKGhzX2Nkc19tYWNyLCB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaD0ibGltbWEiKSkKaHNfbG93ZmlsdF9iYXRjaF9wY2EkcGxvdApgYGAKCkluIHRoaXMgIGF0dGVtcHQsIHdlIGFkZCBhIGJhdGNoIGZhY3RvciBpbiB0aGUgZXhwZXJpbWVudGFsIG1vZGVsIGFuZCBzZWUgaG93IGl0IGRvZXMuCgpgYGB7ciBtYWNyb19iYXRjaDEsIGZpZy5zaG93PSJoaWRlIn0KIyMgSGVyZSBqdXN0IGxldCBhbGxfcGFpcndpc2UgcnVuIG9uIGZpbHRlcmVkIGRhdGEgYW5kIGRvIGl0cyBub3JtYWwgfiAwICsgY29uZGl0aW9uICsgYmF0Y2ggYW5hbHlzZXMKaHNfbWFjcl9iYXRjaCA8LSBzbShhbGxfcGFpcndpc2UoaW5wdXQ9aHNfY2RzX21hY3IsIGxpbW1hX21ldGhvZD0icm9idXN0IiwgcGFyYWxsZWw9RkFMU0UpKQptZWRpYW5zX2J5X2NvbmRpdGlvbiA8LSBoc19tYWNyX2JhdGNoJGJhc2ljJG1lZGlhbnMKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfbWFjcl9iYXRjaG1vZGVsX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9iYXRjaF90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgaHNfbWFjcl9iYXRjaCwKICBrZWVwZXJzPWhzX2NvbnRyYXN0cywKICBleHRyYV9hbm5vdD1tZWRpYW5zX2J5X2NvbmRpdGlvbiwKICBpbmNsdWRlX2xpbW1hPUZBTFNFLCBpbmNsdWRlX2VkZ2VyPUZBTFNFLCBpbmNsdWRlX2Jhc2ljPUZBTFNFLCBpbmNsdWRlX2Vic2VxPUZBTFNFLAogIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX2JhdGNobW9kZWxfc2lnLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9iYXRjaF9zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoc19tYWNyX2JhdGNoX3RhYmxlcywgZXhjZWw9ZXhjZWxfZmlsZSwKICBhY2NvcmRpbmdfdG89ImRlc2VxIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX21hY3JfYmF0Y2htb2RlbF9hYnVuZC12e3Zlcn0ueGxzeCIpCmhzX21hY3JfYmF0Y2hfYWJ1biA8LSBzbShleHRyYWN0X2FidW5kYW50X2dlbmVzKAogIGhzX21hY3JfYmF0Y2hfdGFibGVzLCBleGNlbD1leGNlbF9maWxlLAogIGFjY29yZGluZ190bz0iZGVzZXEiKSkKYGBgCgojIFRhYmxlIFMyIGFuZCBGaWd1cmUgMWIsIFRhYmxlIFMzCgogKiBUYWJsZSBTMiBpcyB0YWtpbmcgb25seSB0aGUgREVTZXEyIHJlc3VsdHMuCiAqIEZpZ3VyZSAxYyBpcyBpbnRlbmRlZCB0byBiZSBhIHZvbGNhbm8gcGxvdCBvZiB0aGUgREVTZXEyIHJlc3VsdHMuCgpgYGB7ciB0YWJsZV9zMn0KczJfY29udHJhc3RzIDwtIGxpc3QoCiAgIm1hY3JvX2Noci1zaCIgPSBjKCJjaHIiLCJzaCIpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV90YWJsZS1zMl9oc19tYWNyX2JhdGNobW9kZWxfY29udHItdnt2ZXJ9Lnhsc3giKQp0YWJsZV9zMiA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBoc19tYWNyX2JhdGNoLAogIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAga2VlcGVycz1zMl9jb250cmFzdHMsCiAgaW5jbHVkZV9iYXNpYz1GQUxTRSwgaW5jbHVkZV9saW1tYT1GQUxTRSwKICBpbmNsdWRlX2Vic2VxPUZBTFNFLCBpbmNsdWRlX2VkZ2VyPUZBTFNFKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fdGFibGUtczNfaHNfbWFjcl9iYXRjaG1vZGVsX3NpZy12e3Zlcn0ueGxzeCIpCnRhYmxlX3MzIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdGFibGVfczIsCiAgZXhjZWw9ZXhjZWxfZmlsZSwKICBhY2NvcmRpbmdfdG89ImRlc2VxIikpCgpjaG9zZW5fdGFibGUgPC0gdGFibGVfczJbWyJkYXRhIl1dW1sxXV0KaGVhZChjaG9zZW5fdGFibGUpCnZvbCA8LSBwbG90X3ZvbGNhbm9fZGUodGFibGU9Y2hvc2VuX3RhYmxlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5PSJzdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgZmNfY29sPSJkZXNlcV9sb2dmYyIsCiAgICAgICAgICAgICAgICAgICAgICAgcF9jb2w9ImRlc2VxX2FkanAiLAogICAgICAgICAgICAgICAgICAgICAgIHNoYXBlc19ieV9zdGF0ZT1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3Bvc2l0aW9uPSJ0b3AiKQpwcChmaWxlPSJpbWFnZXMvRmlndXJlXzFjLnBkZiIpCnZvbCRwbG90CmRldi5vZmYoKQpgYGAKCiMjIEJhdGNoIGVzdGltYXRlZCB3aXRoIFNWQQoKIyMjIFNldCB1cCBzdmEKCmBgYHtyIHNldHVwX3N2YX0KaHNfbG93ZmlsdF9zdmFzZXFfcGNhIDwtIHNtKHBsb3RfcGNhKGhzX2Nkc19tYWNyLCB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQpoc19sb3dmaWx0X3N2YXNlcV9wY2EkcGxvdApgYGAKCmBgYHtyIG1hY3JvX3N2YTEsIGZpZy5zaG93PSJoaWRlIn0KaHNfY2RzX21hY3JfbG93ZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChoc19jZHNfbWFjciwgZmlsdGVyPVRSVUUpKQojIyBIZXJlIGp1c3QgbGV0IGFsbF9wYWlyd2lzZSBydW4gb24gZmlsdGVyZWQgZGF0YSBhbmQgZG8gaXRzIG5vcm1hbCB+IDAgKyBjb25kaXRpb24gKyBiYXRjaCBhbmFseXNlcwpoc19tYWNyX3N2YSA8LSBzbShhbGxfcGFpcndpc2UoCiAgaW5wdXQ9aHNfY2RzX21hY3JfbG93ZmlsdCwKICBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwKICBsaW1tYV9tZXRob2Q9InJvYnVzdCIpKQptZWRpYW5zX2J5X2NvbmRpdGlvbiA8LSBoc19tYWNyX3N2YSRiYXNpYyRtZWRpYW5zCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX21hY3Jfc3ZhX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9zdmFfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGhzX21hY3Jfc3ZhLAogIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAga2VlcGVycz1oc19jb250cmFzdHMsCiAgZXh0cmFfYW5ub3Q9bWVkaWFuc19ieV9jb25kaXRpb24pKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX3N2YV9zaWctdnt2ZXJ9Lnhsc3giKQpoc19tYWNyX3N2YV9zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoc19tYWNyX3N2YV90YWJsZXMsCiAgZXhjZWw9ZXhjZWxfZmlsZSkpCmhzX21hY3Jfc3ZhX21hX2xpbW1hIDwtIGV4dHJhY3RfZGVfcGxvdHMoCiAgcGFpcndpc2U9aHNfbWFjcl9zdmEsCiAgdHlwZT0ibGltbWEiLAogIHRhYmxlPSJzaF92c19jaHIiKQpgYGAKCmBgYHtyIHN2YV9tYV9wbG90fQpoc19tYWNyX3N2YV9tYV9saW1tYSRtYSRwbG90CmBgYAoKIyMgQmF0Y2ggY29ycmVjdGlvbiB2aWEgcnV2IHJlc2lkdWFscwoKIyMjIFNldCB1cCBydXZyZXNpZHVhbHMKCmBgYHtyIHNldHVwX3J1dnJlc2lkfQojIyBobW0gSSBnb3QgdGhlIFJVVnIgZXJyb3IgYWdhaW4sIGJ1dCB3aGVuIEkgcmFuIGl0IG1hbnVhbGx5IGRpZCBub3QuCiMjIEV2ZW4gbW9yZSBzdHJhbmdlbHksIGlmIEkganVzdCBydW4gdGhlIHNhbWUgdGhpbmcgYWdhaW4sIG5vIGVycm9yLi4uCnRlc3RtZSA8LSB0cnkoYWxsX2FkanVzdGVycyhpbnB1dD1oc19tYWNyX2xvd2ZpbHQsIGVzdGltYXRlX3R5cGU9InJ1dl9yZXNpZHVhbHMiKSwgc2lsZW50PVRSVUUpCgpoc19sb3dmaWx0X3J1dnJlc2lkX3BjYSA8LSBzbShwbG90X3BjYShoc19tYWNyX2xvd2ZpbHQsIHRyYW5zZm9ybT0ibG9nMiIsIGJhdGNoPSJydXZfcmVzaWR1YWxzIikpCmhzX2xvd2ZpbHRfcnV2cmVzaWRfcGNhJHBsb3QKYGBgCgpgYGB7ciBtYWNyb19ydXZyZXNpZDEsIGZpZy5zaG93PSJoaWRlIn0KIyMgSGVyZSBqdXN0IGxldCBhbGxfcGFpcndpc2UgcnVuIG9uIGZpbHRlcmVkIGRhdGEgYW5kIGRvIGl0cyBub3JtYWwgfiAwICsgY29uZGl0aW9uICsgYmF0Y2ggYW5hbHlzZXMKIyMgQml6YXJyZWx5LCBzb21ldGltZXMgaWYgb25lIHJ1bnMgdGhpcywgaXQgZ2l2ZXMgYW4gZXJyb3IgIkVycm9yIGluIChmdW5jdGlvbiAoY2xhc3NlcywgZmRlZiwgbXRhYmxlKSA6IHVuYWJsZSB0byBmaW5kIGFuIGluaGVyaXRlZCBtZXRob2QgZm9yIGZ1bmN0aW9uICdSVVZyJyBmb3Igc2lnbmF0dXJlICcibWF0cml4IiwgImxvZ2ljYWwiLCAibnVtZXJpYyIsICJOVUxMIiciICAtLSBob3dldmVyLCBpZiBvbmUgdGhlbiBzaW1wbHkgcnVucyBpdCBhZ2FpbiBpdCB3b3JrcyBmaW5lLgojIyBJIGFtIGdvaW5nIHRvIGFzc3VtZSB0aGF0IGl0IGlzIGJlY2F1c2UgSSBkbyBub3QgZXhwbGljaXRseSBpbnZva2UgdGhlIGxpYnJhcnkuCiMjIGxpYnJhcnkocnV2KSAgIyMgaG9wZWZ1bGx5IGEgc21hbGwgY29kZSBjaGFuZ2UgbWFkZSB0aGlzIG5vdCBuZWVkZWQuCnRlc3RtZSA8LSBhbGxfYWRqdXN0ZXJzKGlucHV0PWhzX21hY3JfbG93ZmlsdCwgZXN0aW1hdGVfdHlwZT0icnV2X3Jlc2lkdWFscyIpCmhzX21hY3JfcnV2cmVzIDwtIHNtKGFsbF9wYWlyd2lzZSgKICBpbnB1dD1oc19tYWNyX2xvd2ZpbHQsCiAgbW9kZWxfYmF0Y2g9InJ1dl9yZXNpZHVhbHMiLAogIGxpbW1hX21ldGhvZD0icm9idXN0IikpCm1lZGlhbnNfYnlfY29uZGl0aW9uIDwtIGhzX21hY3JfcnV2cmVzJGJhc2ljJG1lZGlhbnMKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfbWFjcl9ydXZyZXNfY29udHItdnt2ZXJ9Lnhsc3giKQpoc19tYWNyX3J1dnJlc190YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgaHNfbWFjcl9ydXZyZXMsCiAgZXhjZWw9ZXhjZWxfZmlsZSwKICBleHRyYV9hbm5vdD1tZWRpYW5zX2J5X2NvbmRpdGlvbiwKICBrZWVwZXJzPWhzX2NvbnRyYXN0cykpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX21hY3JfcnV2cmVzX3NpZy12e3Zlcn0ueGxzeCIpCmhzX21hY3JfcnV2cmVzX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGhzX21hY3JfcnV2cmVzX3RhYmxlcywKICBleGNlbD1leGNlbF9maWxlKSkKYGBgCgojIyBCYXRjaCBjb3JyZWN0aW9uIHdpdGggcGNhCgojIyMgU2V0dXAgcGNhCgpgYGB7ciBzZXR1cF9wY2EwMX0KaHNfbG93ZmlsdF9wY2FfcGNhIDwtIHNtKHBsb3RfcGNhKGhzX21hY3JfbG93ZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9InBjYSIpKQpoc19sb3dmaWx0X3BjYV9wY2EkcGxvdApgYGAKCmBgYHtyIG1hY3JvX3BjYTEsIGZpZy5zaG93PSJoaWRlIn0KIyMgSGVyZSBqdXN0IGxldCBhbGxfcGFpcndpc2UgcnVuIG9uIGZpbHRlcmVkIGRhdGEgYW5kIGRvIGl0cyBub3JtYWwgfiAwICsgY29uZGl0aW9uICsgYmF0Y2ggYW5hbHlzZXMKaHNfbWFjcl9wY2EgPC0gc20oYWxsX3BhaXJ3aXNlKAogIGlucHV0PWhzX21hY3JfbG93ZmlsdCwKICBtb2RlbF9iYXRjaD0icGNhIiwKICBsaW1tYV9tZXRob2Q9InJvYnVzdCIpKQptZWRpYW5zX2J5X2NvbmRpdGlvbiA8LSBoc19tYWNyX3BjYSRiYXNpYyRtZWRpYW5zCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX21hY3JfcGNhX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9wY2FfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGhzX21hY3JfcGNhLAogIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAga2VlcGVycz1oc19jb250cmFzdHMsCiAgZXh0cmFfYW5ub3Q9bWVkaWFuc19ieV9jb25kaXRpb24pKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX3BjYV9zaWctdnt2ZXJ9Lnhsc3giKQpoc19tYWNyX3BjYV9zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoc19tYWNyX3BjYV90YWJsZXMsCiAgZXhjZWw9ZXhjZWxfZmlsZSkpCmBgYAoKIyMgQmF0Y2ggY29ycmVjdGlvbiB3aXRoIHJ1diBlbXBpcmljYWwKCiMjIyBTZXR1cCBydXYgZW1waXJpY2FsCgpgYGB7ciBzZXR1cF9wY2EwMn0KaHNfbG93ZmlsdF9ydXZlbXBfcGNhIDwtIHNtKHBsb3RfcGNhKGhzX21hY3JfbG93ZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9InJ1dl9lbXBpcmljYWwiKSkKaHNfbG93ZmlsdF9ydXZlbXBfcGNhJHBsb3QKYGBgCgpgYGB7ciBtYWNyb19ydXZlbXAxLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX21hY3JfcnV2ZW1wIDwtIHNtKGFsbF9wYWlyd2lzZSgKICBpbnB1dD1oc19tYWNyX2xvd2ZpbHQsCiAgbW9kZWxfYmF0Y2g9InJ1dl9lbXBpcmljYWwiLAogIGxpbW1hX21ldGhvZD0icm9idXN0IikpCm1lZGlhbnNfYnlfY29uZGl0aW9uIDwtIGhzX21hY3JfcnV2ZW1wJGJhc2ljJG1lZGlhbnMKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfbWFjcl9ydXZlbXBfY29udHItdnt2ZXJ9Lnhsc3giKQpoc19tYWNyX3J1dmVtcF90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgaHNfbWFjcl9ydXZlbXAsCiAgZXhjZWw9ZXhjZWxfZmlsZSwKICBrZWVwZXJzPWhzX2NvbnRyYXN0cywKICBleHRyYV9hbm5vdD1tZWRpYW5zX2J5X2NvbmRpdGlvbikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX21hY3JfcnV2ZW1wX3NpZy12e3Zlcn0ueGxzeCIpCmhzX21hY3JfcnV2ZW1wX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGhzX21hY3JfcnV2ZW1wX3RhYmxlcywKICBleGNlbD1leGNlbF9maWxlKSkKYGBgCgojIyBCYXRjaCBjb3JyZWN0aW9uIHdpdGggY29tYmF0CgpUaGVuIHJlcGVhdCB3aXRoIHRoZSBiYXRjaC1jb3JyZWN0ZWQgZGF0YSBhbmQgc2VlIHRoZSBkaWZmZXJlbmNlcy4KCiMjIyBTZXR1cCBjb21iYXQKCmBgYHtyIHNldHVwX2NvbWJhdH0KaHNfbG93ZmlsdF9jb21iYXRfcGNhIDwtIHNtKHBsb3RfcGNhKGhzX21hY3JfbG93ZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9ImNvbWJhdF9ub3ByaW9yIikpCmhzX2xvd2ZpbHRfY29tYmF0X3BjYSRwbG90CmBgYAoKYGBge3IgcmVwZWF0X3BhaXJ3aXNlX2JhdGNoMSwgZmlnLnNob3c9ImhpZGUifQpoc19tYWNyX2NvbWJhdF9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzX21hY3JfbG93ZmlsdCwgYmF0Y2g9ImNvbWJhdF9ub3NjYWxlIikpCmhzX21hY3JfY29tYmF0IDwtIGFsbF9wYWlyd2lzZSgKICBpbnB1dD1oc19tYWNyX2NvbWJhdF9ub3JtLAogIGZvcmNlPVRSVUUsIHBhcmFsbGVsPUZBTFNFLAogIGxpbW1hX21ldGhvZD0icm9idXN0IikKbWVkaWFuc19ieV9jb25kaXRpb24gPC0gaHNfbWFjcl9jb21iYXQkYmFzaWMkbWVkaWFucwpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX2NvbWJhdF9jb250ci12e3Zlcn0ueGxzeCIpCmhzX21hY3JfY29tYmF0X3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBoc19tYWNyX2NvbWJhdCwKICBleGNlbD1leGNlbF9maWxlLAogIGtlZXBlcnM9aHNfY29udHJhc3RzLAogIGV4dHJhX2Fubm90PW1lZGlhbnNfYnlfY29uZGl0aW9uKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfbWFjcl9jb21iYXRfY29udHItdnt2ZXJ9Lnhsc3giKQpoc19tYWNyX2NvbWJhdF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoc19tYWNyX2NvbWJhdF90YWJsZXMsCiAgZXhjZWw9ZXhjZWxfZmlsZSkKYGBgCgpgYGB7ciBmaW5pc2hlZF9tYV9wbG90c30KaHNfbWFjcl9jb21iYXRfbWFfbGltbWEgPC0gZXh0cmFjdF9kZV9wbG90cygKICBwYWlyd2lzZT1oc19tYWNyX2NvbWJhdCwKICB0eXBlPSJsaW1tYSIsCiAgdGFibGU9InNoX3ZzX2NociIpCmhzX21hY3JfY29tYmF0X21hX2xpbW1hJG1hJHBsb3QKCmhzX21hY3JfY29tYmF0X21hX2VkZ2VyIDwtIGV4dHJhY3RfZGVfcGxvdHMoCiAgcGFpcndpc2U9aHNfbWFjcl9jb21iYXQsCiAgdHlwZT0iZWRnZXIiLAogIHRhYmxlPSJzaF92c19jaHIiKQpoc19tYWNyX2NvbWJhdF9tYV9lZGdlciRtYSRwbG90Cgpoc19tYWNyX2NvbWJhdF9tYV9kZXNlcSA8LSBleHRyYWN0X2RlX3Bsb3RzKAogIHBhaXJ3aXNlPWhzX21hY3JfY29tYmF0LAogIHR5cGU9ImRlc2VxIiwKICB0YWJsZT0ic2hfdnNfY2hyIikKaHNfbWFjcl9jb21iYXRfbWFfZGVzZXEkbWEkcGxvdApgYGAKCiMgRmlndXJlIG91dCBob3cgdG8gY29tcGFyZSB0aGVzZSByZXN1bHRzCgpJIGhhdmUgNCBtZXRob2RzIG9mIHBlcmZvcm1pbmcgdGhpcyBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcy4gIEVhY2ggb25lIGNvbWVzIHdpdGggYSBzZXQgb2YKbWV0cmljcyBkZWZpbmluZyAnc2lnbmlmaWNhbnQnLiAgUGVyaGFwcyBJIGNhbiBtYWtlIGEgdGFibGUgb2YgdGhlICMgb2YgZ2VuZXMgZGVmaW5lZCBhcyBzaWduaWZpY2FudApieSBjb250cmFzdCBmb3IgZWFjaC4gIEluIGFkZGl0aW9uIGl0IG1heSBiZSB3b3J0aCB3aGlsZSB0byBkbyBhIHNjYXR0ZXIgcGxvdHMgb2YgdGhlIGxvZ0ZDcyBiZXR3ZWVuCnRoZXNlIGNvbXBhcmlzb25zIGFuZCBzZWUgaG93IHdlbGwgdGhleSBhZ3JlZT8KCiMgTG9vayBmaXJzdCBhdCB0aGUgZGUgY291bnRzCgpgYGB7ciBjb21wYXJlX2RlX3NldHVwMX0KaHNfbWFjcl9ub2JhdGNoX3NpZyRsaW1tYSRjb3VudHMKIyNoc19tYWNyX2JhdGNoX3RhYmxlcyRzaWduaWZpY2FudCRsaW1tYSRjb3VudHMKIyNoc19tYWNyX3N2YV90YWJsZXMkc2lnbmlmaWNhbnQkbGltbWEkY291bnRzCiMjaHNfbWFjcl9ydXZyZXNfdGFibGVzJHNpZ25pZmljYW50JGxpbW1hJGNvdW50cwojI2hzX21hY3JfcGNhX3RhYmxlcyRzaWduaWZpY2FudCRsaW1tYSRjb3VudHMKIyNoc19tYWNyX3J1dmVtcF90YWJsZXMkc2lnbmlmaWNhbnQkbGltbWEkY291bnRzCiMjaHNfbWFjcl9jb21iYXRfdGFibGVzJHNpZ25pZmljYW50JGxpbW1hJGNvdW50cwpgYGAKCiMjIENvbXBhcmUgRGVTZXEgLyBCYXNpYyB3aXRob3V0IGJhdGNoIGluIG1vZGVsCgpgYGB7ciBiYXNpY19kZXNlcV9ub2JhdGNoMX0KaHNfbWFjcl9ub2JhdGNoX2Jhc2ljIDwtIG1lcmdlKAogIGhzX21hY3Jfbm9iYXRjaCRkZXNlcSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBoc19tYWNyX2JhdGNoJGJhc2ljJGFsbF90YWJsZXMkc2hfdnNfY2hyLAogIGJ5PSJyb3cubmFtZXMiKQpyb3duYW1lcyhoc19tYWNyX25vYmF0Y2hfYmFzaWMpIDwtIGhzX21hY3Jfbm9iYXRjaF9iYXNpY1tbIlJvdy5uYW1lcyJdXQpoc19tYWNyX25vYmF0Y2hfbG9nZmMgPC0gaHNfbWFjcl9ub2JhdGNoX2Jhc2ljWywgYygibG9nRkMueCIsICJsb2dGQy55IildCmNvbG5hbWVzKGhzX21hY3Jfbm9iYXRjaF9sb2dmYykgPC0gYygibm9iYXRjaCIsICJiYXNpYyIpCmxmY19uYl9iIDwtIHNtKHBsb3RfbGluZWFyX3NjYXR0ZXIoaHNfbWFjcl9ub2JhdGNoX2xvZ2ZjLCBwcmV0dHlfY29sb3JzPUZBTFNFKSkKbGZjX25iX2Ikc2NhdHRlcgpsZmNfbmJfYiRjb3JyZWxhdGlvbgpoc19tYWNyX25vYmF0Y2hfcCA8LSBoc19tYWNyX25vYmF0Y2hfYmFzaWNbLCBjKCJQLlZhbHVlIiwicCIpXQpoc19tYWNyX25vYmF0Y2hfcFtbMl1dIDwtIGFzLm51bWVyaWMoaHNfbWFjcl9ub2JhdGNoX3BbWzJdXSkKY29sbmFtZXMoaHNfbWFjcl9ub2JhdGNoX3ApIDwtIGMoIm5vYmF0Y2giLCJiYXNpYyIpCmhzX21hY3Jfbm9iYXRjaF9wIDwtIC0xICogbG9nKGhzX21hY3Jfbm9iYXRjaF9wKQpoc19tYWNyX3BfbmJfYiA8LSBzbShwbG90X2xpbmVhcl9zY2F0dGVyKGhzX21hY3Jfbm9iYXRjaF9wLCBwcmV0dHlfY29sb3JzPUZBTFNFKSkKaHNfbWFjcl9wX25iX2Ikc2NhdHRlcgpoc19tYWNyX3BfbmJfYiRjb3JyZWxhdGlvbgpgYGAKCiMjIENvbXBhcmUgU1ZBIHRvIGJhdGNoIGluIG1vZGVsLCBERVNlcQoKYGBge3IgZGVzZXFfc3ZhX2JhdGNoMX0KaHNfbWFjcl9zdmFfYmF0Y2ggPC0gbWVyZ2UoCiAgaHNfbWFjcl9zdmEkZGVzZXEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgaHNfbWFjcl9iYXRjaCRkZXNlcSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMoaHNfbWFjcl9zdmFfYmF0Y2gpIDwtIGhzX21hY3Jfc3ZhX2JhdGNoW1siUm93Lm5hbWVzIl1dCmhzX21hY3Jfc3ZhX2xvZ2ZjIDwtIGhzX21hY3Jfc3ZhX2JhdGNoWywgYygibG9nRkMueCIsImxvZ0ZDLnkiKV0KY29sbmFtZXMoaHNfbWFjcl9zdmFfbG9nZmMpIDwtIGMoInN2YSIsImJhdGNoIikKaHNfbWFjcl9sZmNfYl9zIDwtIHNtKHBsb3RfbGluZWFyX3NjYXR0ZXIoaHNfbWFjcl9zdmFfbG9nZmMsIHByZXR0eV9jb2xvcnM9RkFMU0UpKQpoc19tYWNyX2xmY19iX3Mkc2NhdHRlcgpoc19tYWNyX2xmY19iX3MkY29ycmVsYXRpb24KYGBgCgojIyMgSW5jbHVkZSBwLXZhbHVlIGVzdGltYXRpb25zCgpUcnkgcHV0dGluZyBzb21lIGluZm9ybWF0aW9uIG9mIHRoZSBwLXZhbHVlcyB3aXRoIHRoZSBjb21wYXJhdGl2ZSBsb2cyZmMKCmBgYHtyIGwyZnNfcHZhbHMxfQpsZmNfYl9zIDwtIGhzX21hY3Jfc3ZhX2JhdGNoWywgYygibG9nRkMueCIsICJsb2dGQy55IiwgIlAuVmFsdWUueCIsICJQLlZhbHVlLnkiKV0KY29sbmFtZXMobGZjX2JfcykgPC0gYygibDJmY3N2YSIsICJsMmZjYmF0Y2giLCAicHN2YSIsICJwYmF0Y2giKQpoc19tYWNyX2xmY19iX3Mkc2NhdHRlcgpjdXRvZmYgPC0gMC4xCmxmY19iX3Mkc3RhdGUgPC0gaWZlbHNlKGxmY19iX3MkcHN2YSA+IGN1dG9mZiAmIGxmY19iX3MkcGJhdGNoID4gY3V0b2ZmLCAiYm90aGluc2lnIiwKICAgICAgICAgICAgICAgICBpZmVsc2UobGZjX2JfcyRwc3ZhIDw9IGN1dG9mZiAmIGxmY19iX3MkcGJhdGNoIDw9IGN1dG9mZiwgImJvdGhzaWciLAogICAgICAgICAgICAgICAgIGlmZWxzZShsZmNfYl9zJHBzdmEgPD0gY3V0b2ZmLCAic3Zhc2lnIiwgImJhdGNoc2lnIikpKQojI2xmY3BfYl9zJGxmY3N0YXRlIDwtIGlmZWxzZShsZmNwX2JfcyRsMmZjc3ZhID49IDAuNzUgJiBsZmNwX2JfcyRsMmZjYmF0Y2gsICIiLCAiIikKbnVtX2JvdGhpbnNpZyA8LSBzdW0obGZjX2JfcyRzdGF0ZSA9PSAiYm90aGluc2lnIikKbnVtX2JvdGhzaWcgPC0gc3VtKGxmY19iX3Mkc3RhdGUgPT0gImJvdGhzaWciKQpudW1fc3Zhc2lnIDwtIHN1bShsZmNfYl9zJHN0YXRlID09ICJzdmFzaWciKQpudW1fYmF0Y2hzaWcgPC0gc3VtKGxmY19iX3Mkc3RhdGUgPT0gImJhdGNoc2lnIikKCmxpYnJhcnkoZ2dwbG90MikKYWVzX2NvbG9yID0gIihsMmZjc3ZhID49IDAuNzUgfCBsMmZjc3ZhIDw9IC0wLjc1IHwgbDJmY2JhdGNoID49IDAuNzUgfCBsMmZjYmF0Y2ggPD0gLTAuNzUpIgpwbHQgPC0gZ2dwbG90Mjo6Z2dwbG90KGxmY19iX3MsIGFlc19zdHJpbmcoeD0ibDJmY3N2YSIsIHk9ImwyZmNiYXRjaCIpKSArCiAgICAjIyBnZ3Bsb3QyOjpnZW9tX3BvaW50KHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZT0yLCBhbHBoYT0wLjIsIGFlc19zdHJpbmcoc2hhcGU9ImFzLmZhY3RvcihhZXNfY29sb3IpIiwgY29sb3VyPSJhcy5mYWN0b3Ioc3RhdGUpIiwgZmlsbD0iYXMuZmFjdG9yKHN0YXRlKSIpKSArCiAgICBnZ3Bsb3QyOjpnZW9tX2FibGluZShjb2xvdXI9ImJsdWUiLCBzbG9wZT0xLCBpbnRlcmNlcHQ9MCwgc2l6ZT0wLjUpICsKICAgIGdncGxvdDI6Omdlb21faGxpbmUoeWludGVyY2VwdD1jKC0wLjc1LCAwLjc1KSwgY29sb3I9InJlZCIsIHNpemU9MC41KSArCiAgICBnZ3Bsb3QyOjpnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9YygtMC43NSwgMC43NSksIGNvbG9yPSJyZWQiLCBzaXplPTAuNSkgKwogICAgZ2dwbG90Mjo6Z2VvbV9wb2ludChzdGF0PSJpZGVudGl0eSIsIHNpemU9MiwgYWxwaGE9MC4yLCBhZXNfc3RyaW5nKGNvbG91cj0iYXMuZmFjdG9yKHN0YXRlKSIsIGZpbGw9ImFzLmZhY3RvcihzdGF0ZSkiKSkgKwogICAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKG5hbWU9InN0YXRlIiwgdmFsdWVzPWMoImJvdGhpbnNpZyI9ImdyZXkiLCAiYm90aHNpZyI9ImZvcmVzdGdyZWVuIiwgInN2YXNpZyI9ImRhcmtyZWQiLCAiYmF0Y2hzaWciPSJkYXJrYmx1ZSIpKSArCiAgICBnZ3Bsb3QyOjpzY2FsZV9maWxsX21hbnVhbChuYW1lPSJzdGF0ZSIsIHZhbHVlcz1jKCJib3RoaW5zaWciPSJncmV5IiwgImJvdGhzaWciPSJmb3Jlc3RncmVlbiIsICJzdmFzaWciPSJkYXJrcmVkIiwgImJhdGNoc2lnIj0iZGFya2JsdWUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiQm90aCBJblNpZy46ICIsIG51bV9ib3RoaW5zaWcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiQm90aCBTaWcuOiAiLCBudW1fYm90aHNpZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJTdmEgU2lnLjogIiwgbnVtX3N2YXNpZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJCYXRjaCBTaWcuOiAiLCBudW1fYmF0Y2hzaWcpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlPWdncGxvdDI6Omd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXM9YWVzKHNpemU9MywgZmlsbD0iZ3JleSIpKSkgKwogICAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGw9Z2dwbG90Mjo6Z3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcz1saXN0KHNpemU9MykpKSArCiAgICBnZ3Bsb3QyOjp0aGVtZV9idygpCnBsdApgYGAKCiMjIENvbXBhcmUgcnV2cmVzaWQgdG8gYmF0Y2ggaW4gbW9kZWwsIERFU2VxCgpgYGB7ciBiYXRjaF9ydXZyZXNpZF9kZXNlcTF9CmhzX21hY3JfYmF0Y2hfcnV2cmVzaWRfZGVzZXEgPC0gbWVyZ2UoCiAgaHNfbWFjcl9ydXZyZXMkZGVzZXEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgaHNfbWFjcl9iYXRjaCRiYXNpYyRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMoaHNfbWFjcl9iYXRjaF9ydXZyZXNpZF9kZXNlcSkgPC0gaHNfbWFjcl9iYXRjaF9ydXZyZXNpZF9kZXNlcVtbIlJvdy5uYW1lcyJdXQpoc19tYWNyX2JhdGNoX3J1dnJlc2lkX2xvZ2ZjIDwtIGhzX21hY3JfYmF0Y2hfcnV2cmVzaWRfZGVzZXFbLCBjKCJsb2dGQy54IiwibG9nRkMueSIpXQpjb2xuYW1lcyhoc19tYWNyX2JhdGNoX3J1dnJlc2lkX2xvZ2ZjKSA8LSBjKCJub2JhdGNoIiwiYmFzaWMiKQpsZmNfcnV2X2JhdCA8LSBwbG90X2xpbmVhcl9zY2F0dGVyKGhzX21hY3JfYmF0Y2hfcnV2cmVzaWRfbG9nZmMsIHByZXR0eV9jb2xvcnM9RkFMU0UpCmxmY19ydXZfYmF0JHNjYXR0ZXIKbGZjX3J1dl9iYXQkY29ycmVsYXRpb24KYGBgCgojIyBDb21wYXJlIG5vIGJhdGNoIHRvIGJhdGNoIGluIG1vZGVsLCBsaW1tYQoKYGBge3IgY29tcGFyZV9iYXRjaF9ub2JhdGNoX2xpbW1hMX0KaHNfbWFjcl9ub2JhdGNoX2JhdGNoIDwtIG1lcmdlKAogIGhzX21hY3Jfbm9iYXRjaCRsaW1tYSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBoc19tYWNyX2JhdGNoJGxpbW1hJGFsbF90YWJsZXMkc2hfdnNfY2hyLAogIGJ5PSJyb3cubmFtZXMiKQpyb3duYW1lcyhoc19tYWNyX25vYmF0Y2hfYmF0Y2gpIDwtIGhzX21hY3Jfbm9iYXRjaF9iYXRjaFtbIlJvdy5uYW1lcyJdXQpoc19tYWNyX25vYmF0Y2hfYmF0Y2ggPC0gaHNfbWFjcl9ub2JhdGNoX2JhdGNoWywgYygibG9nRkMueCIsImxvZ0ZDLnkiKV0KY29sbmFtZXMoaHNfbWFjcl9ub2JhdGNoX2JhdGNoKSA8LSBjKCJub2JhdGNoIiwiYmF0Y2giKQpuYl9iIDwtIHBsb3RfbGluZWFyX3NjYXR0ZXIoaHNfbWFjcl9ub2JhdGNoX2JhdGNoLCBwcmV0dHlfY29sb3JzPUZBTFNFKQpuYl9iJHNjYXR0ZXIKbmJfYiRjb3JyZWxhdGlvbgpgYGAKCiMjIEJhdGNoIGluIG1vZGVsIHZzLiBTVkEsIGxpbW1hCgpgYGB7ciBjb21wYXJlX2JhdGNoX3N2YV9saW1tYTF9CmhzX21hY3JfYmF0Y2hfc3ZhIDwtIG1lcmdlKAogIGhzX21hY3JfYmF0Y2gkbGltbWEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgaHNfbWFjcl9zdmEkbGltbWEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgYnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKGhzX21hY3JfYmF0Y2hfc3ZhKSA8LSBoc19tYWNyX2JhdGNoX3N2YVtbIlJvdy5uYW1lcyJdXQpoc19tYWNyX2JhdGNoX3N2YSA8LSBoc19tYWNyX2JhdGNoX3N2YVssIGMoImxvZ0ZDLngiLCJsb2dGQy55IildCmNvbG5hbWVzKGhzX21hY3JfYmF0Y2hfc3ZhKSA8LSBjKCJiYXRjaCIsInN2YSIpCmJfcyA8LSBwbG90X2xpbmVhcl9zY2F0dGVyKGhzX21hY3JfYmF0Y2hfc3ZhLCBwcmV0dHlfY29sb3JzPUZBTFNFKQpiX3Mkc2NhdHRlcgpiX3MkY29ycmVsYXRpb24KYGBgCgojIyBOb2JhdGNoIHZzLiBiYXRjaCBpbiBtb2RlbCwgZWRnZXIKCmBgYHtyIGNvbXBhcmVfbm9iYXRjaF9iYXRjaF9lZGdlcjF9CmhzX21hY3Jfbm9iYXRjaF9iYXRjaCA8LSBtZXJnZSgKICBoc19tYWNyX25vYmF0Y2gkZWRnZXIkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgaHNfbWFjcl9iYXRjaCRlZGdlciRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMoaHNfbWFjcl9ub2JhdGNoX2JhdGNoKSA8LSBoc19tYWNyX25vYmF0Y2hfYmF0Y2hbWyJSb3cubmFtZXMiXV0KaHNfbWFjcl9ub2JhdGNoX2JhdGNoIDwtIGhzX21hY3Jfbm9iYXRjaF9iYXRjaFssIGMoImxvZ0ZDLngiLCJsb2dGQy55IildCmNvbG5hbWVzKGhzX21hY3Jfbm9iYXRjaF9iYXRjaCkgPC0gYygibm9iYXRjaCIsImJhdGNoIikKbmJfYiA8LSBzbShwbG90X2xpbmVhcl9zY2F0dGVyKGhzX21hY3Jfbm9iYXRjaF9iYXRjaCwgcHJldHR5X2NvbG9ycz1GQUxTRSkpCm5iX2Ikc2NhdHRlcgpuYl9iJGNvcnJlbGF0aW9uCmBgYAoKIyMgQmF0Y2ggaW4gbW9kZWwgdnMuIFNWQSwgZWRnZXIKCmBgYHtyIGNvbXBhcmVfYmF0Y2hfc3ZhX2VkZ2VyMX0KaHNfbWFjcl9iYXRjaF9zdmEgPC0gbWVyZ2UoCiAgaHNfbWFjcl9iYXRjaCRlZGdlciRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBoc19tYWNyX3N2YSRlZGdlciRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMoaHNfbWFjcl9iYXRjaF9zdmEpIDwtIGhzX21hY3JfYmF0Y2hfc3ZhW1siUm93Lm5hbWVzIl1dCmhzX21hY3JfYmF0Y2hfc3ZhIDwtIGhzX21hY3JfYmF0Y2hfc3ZhWywgYygibG9nRkMueCIsImxvZ0ZDLnkiKV0KY29sbmFtZXMoaHNfbWFjcl9iYXRjaF9zdmEpIDwtIGMoImJhdGNoIiwic3ZhIikKYl9zIDwtIHBsb3RfbGluZWFyX3NjYXR0ZXIoaHNfbWFjcl9iYXRjaF9zdmEsIHByZXR0eV9jb2xvcnM9RkFMU0UpCmJfcyRzY2F0dGVyCmJfcyRjb3JyZWxhdGlvbgpgYGAKCiMjIENvbXBhcmUgbm9iYXRjaCB2cy4gYmF0Y2gsIGRlc2VxCgpgYGB7ciBjb21wYXJlX25vYmF0Y2hfYmF0Y2hfZGVzZXExfQpoc19tYWNyX25vYmF0Y2hfYmF0Y2ggPC0gbWVyZ2UoCiAgaHNfbWFjcl9ub2JhdGNoJGRlc2VxJGFsbF90YWJsZXMkc2hfdnNfY2hyLAogIGhzX21hY3JfYmF0Y2gkZGVzZXEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgYnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKGhzX21hY3Jfbm9iYXRjaF9iYXRjaCkgPC0gaHNfbWFjcl9ub2JhdGNoX2JhdGNoW1siUm93Lm5hbWVzIl1dCmhzX21hY3Jfbm9iYXRjaF9iYXRjaCA8LSBoc19tYWNyX25vYmF0Y2hfYmF0Y2hbLCBjKCJsb2dGQy54IiwibG9nRkMueSIpXQpjb2xuYW1lcyhoc19tYWNyX25vYmF0Y2hfYmF0Y2gpIDwtIGMoIm5vYmF0Y2giLCJiYXRjaCIpCm5iX2IgPC0gc20ocGxvdF9saW5lYXJfc2NhdHRlcihoc19tYWNyX25vYmF0Y2hfYmF0Y2gsIHByZXR0eV9jb2xvcnM9RkFMU0UpKQpuYl9iJHNjYXR0ZXIKbmJfYiRjb3JyZWxhdGlvbgpgYGAKCiMjIENvbXBhcmUgYmF0Y2ggdnMuIFNWQSwgZGVzZXEKCmBgYHtyIGNvbXBhcmVfYmF0Y2hfc3ZhX2Rlc2VxMX0KaHNfbWFjcl9iYXRjaF9zdmEgPC0gbWVyZ2UoCiAgaHNfbWFjcl9iYXRjaCRkZXNlcSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBoc19tYWNyX3N2YSRkZXNlcSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMoaHNfbWFjcl9iYXRjaF9zdmEpIDwtIGhzX21hY3JfYmF0Y2hfc3ZhW1siUm93Lm5hbWVzIl1dCmhzX21hY3JfYmF0Y2hfc3ZhIDwtIGhzX21hY3JfYmF0Y2hfc3ZhWywgYygibG9nRkMueCIsICJsb2dGQy55IildCmNvbG5hbWVzKGhzX21hY3JfYmF0Y2hfc3ZhKSA8LSBjKCJiYXRjaCIsICJzdmEiKQpiX3MgPC0gc20ocGxvdF9saW5lYXJfc2NhdHRlcihoc19tYWNyX2JhdGNoX3N2YSwgcHJldHR5X2NvbG9ycz1GQUxTRSkpCmJfcyRzY2F0dGVyCmJfcyRjb3JyZWxhdGlvbgpgYGAKCiMgUmVwZWF0IHVzaW5nIHRoZSBwYXJhc2l0ZSBkYXRhCgpJbiAnbWFjcm9waGFnZV9lc3RpbWF0aW9uJywgd2UgZGlkIGEgc2VyaWVzIG9mIGFuYWx5c2VzIHRvIHRyeSB0byBwaWNrIG91dCBzb21lIG9mIHRoZSBzdXJyb2dhdGUKdmFyaWFibGVzIGluIHRoZSBkYXRhLiAgTm93IHdlIHdpbGwgcGVyZm9ybSBhIHNldCBvZiBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcyB1c2luZyB0aGUKcmVzdWx0cyBmcm9tIHRoYXQuICBTaW5jZSB0aGUgJ2JhdGNoJyBlbGVtZW50IG9mIHRoZSBkYXRhIGlzIHJlYXNvbmFibHkgd2VsbCBleHBsYWluZWQsIHdlIHdpbGwgbm90CmFidXNlIHRoZSBkYXRhIHdpdGggc3ZhL2NvbWJhdCwgYnV0IGluc3RlYWQgaW5jbHVkZSBiYXRjaCBpbiB0aGUgZXhwZXJpbWVudGFsIG1vZGVsLgoKSXQgYXBwZWFycyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRob3VnaCBzb21ld2hhdCBkaWZmaWN1bHQgdG8gYXBwbHkgYmF0Y2ggZXN0aW1hdGlvbnMgZ2VuZXJhdGVkIGJ5IHN2YQp0byB0aGUgbW9kZWwgZ2l2ZW4gdG8gREVTZXEvRWRnZVIvbGltbWEuICBJbiB0aGUgY2FzZSBvZiBsaW1tYSBpdCBpcyBmYWlybHkgc2ltcGxlLCBidXQgaW4gdGhlIG90aGVyCnR3byBpdCBpcyBhIGJpdCBtb3JlIGRpZmZpY3VsdC4gIFRoZXJlIGlzIGEgbmljZSBkaXNjdXNzaW9uIG9mIHRoaXMgYXQ6IGh0dHBzOi8vd3d3LmJpb3N0YXJzLm9yZy9wLzE1NjE4Ni8KSSBhbSBhdHRlbXB0aW5nIHRvIGFwcGx5IHRoYXQgbG9naWMgdG8gdGhpcyBkYXRhIHdpdGggbGltaXRlZCBzdWNjZXNzLgoKYGBge3Igc2V0dXBfZGUsIGZpZy5zaG93PSJoaWRlIn0KbHBfY29udHJhc3RzIDwtIGxpc3QoCiAgICAibWFjcm9fY2hyLXNoIiA9IGMoImNociIsICJzaCIpKQpscF9tYWNyX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobHBfbWFjciwgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IikpCmxwX21hY3JfY29tYmF0X25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobHBfbWFjciwgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfdG9femVybz1UUlVFLCBiYXRjaD0iY29tYmF0IikpCmxwX21hY3JfbG93ZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyLCBmaWx0ZXI9VFJVRSkpCiMjIFNldCB1cCB0aGUgZGF0YSB1c2VkIGluIHRoZSAzIGNvbXBhcmF0aXZlIGNvbnRyYXN0IHNldHMuCmBgYAoKIyMgTm8gYmF0Y2ggaW4gdGhlIG1vZGVsCgpgYGB7ciBtYWNyb19ub2JhdGNoLCBmaWcuc2hvdz0iaGlkZSJ9CmxwX21hY3Jfbm9iYXRjaCA8LSBzbShhbGxfcGFpcndpc2UobHBfbWFjcl9sb3dmaWx0LCBsaW1tYV9tZXRob2Q9InJvYnVzdCIsIG1vZGVsX2JhdGNoPUZBTFNFKSkKIyMgd293LCBhbGwgdG9vbHMgaW5jbHVkaW5nIGJhc2ljIGFncmVlIGFsbW9zdCBjb21wbGV0ZWx5Cm1lZGlhbnNfYnlfY29uZGl0aW9uIDwtIGxwX21hY3Jfbm9iYXRjaCRiYXNpYyRtZWRpYW5zCmxwX21hY3Jfbm9iYXRjaF90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgbHBfbWFjcl9ub2JhdGNoLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvbHBfbWFjcl9ub2JhdGNoLXYiLCB2ZXIsICIueGxzeCIpLAogIGtlZXBlcnM9bHBfY29udHJhc3RzLAogIGV4dHJhX2Fubm90PW1lZGlhbnNfYnlfY29uZGl0aW9uKSkKbHBfbWFjcl9ub2JhdGNoX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGxwX21hY3Jfbm9iYXRjaF90YWJsZXMsCiAgZXhjZWw9cGFzdGUwKCJleGNlbC9scF9tYWNyX25vYmF0Y2hfc2lnbmlmaWNhbnQtdiIsIHZlciwgIi54bHN4IikpKQpgYGAKCiMjIEJhdGNoIGluIHRoZSBtb2RlbAoKSW4gdGhpcyAgYXR0ZW1wdCwgd2UgYWRkIGEgYmF0Y2ggZmFjdG9yIGluIHRoZSBleHBlcmltZW50YWwgbW9kZWwgYW5kIHNlZSBob3cgaXQgZG9lcy4KCmBgYHtyIG1hY3JvX2JhdGNoLCBmaWcuc2hvdz0iaGlkZSJ9CiMjIEhlcmUganVzdCBsZXQgYWxsX3BhaXJ3aXNlIHJ1biBvbiBmaWx0ZXJlZCBkYXRhIGFuZCBkbyBpdHMgbm9ybWFsIH4gMCArIGNvbmRpdGlvbiArIGJhdGNoIGFuYWx5c2VzCmxwX21hY3JfYmF0Y2ggPC0gc20oYWxsX3BhaXJ3aXNlKGxwX21hY3JfbG93ZmlsdCwgbGltbWFfbWV0aG9kPSJyb2J1c3QiKSkKbWVkaWFuc19ieV9jb25kaXRpb24gPC0gbHBfbWFjcl9iYXRjaCRiYXNpYyRtZWRpYW5zCmxwX21hY3JfYmF0Y2hfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGxwX21hY3JfYmF0Y2gsCiAgZXhjZWw9cGFzdGUwKCJleGNlbC9scF9tYWNyX2JhdGNobW9kZWwtdiIsIHZlciwgIi54bHN4IiksCiAga2VlcGVycz1scF9jb250cmFzdHMsCiAgZXh0cmFfYW5ub3Q9bWVkaWFuc19ieV9jb25kaXRpb24pKQpscF9tYWNyX2JhdGNoX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGxwX21hY3JfYmF0Y2hfdGFibGVzLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvbHBfbWFjcl9iYXRjaG1vZGVsX3NpZ25pZmljYW50LXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgojIyBCYXRjaCBlc3RpbWF0ZWQgd2l0aCBTVkEKCmBgYHtyIG1hY3JvX3N2YSwgZmlnLnNob3c9ImhpZGUifQojIyBIZXJlIGp1c3QgbGV0IGFsbF9wYWlyd2lzZSBydW4gb24gZmlsdGVyZWQgZGF0YSBhbmQgZG8gaXRzIG5vcm1hbCB+IDAgKyBjb25kaXRpb24gKyBiYXRjaCBhbmFseXNlcwpscF9tYWNyX3N2YSA8LSBzbShhbGxfcGFpcndpc2UobHBfbWFjcl9sb3dmaWx0LCBsaW1tYV9tZXRob2Q9InJvYnVzdCIsIG1vZGVsX2JhdGNoPSJzdmEiKSkKbWVkaWFuc19ieV9jb25kaXRpb24gPC0gbHBfbWFjcl9zdmEkYmFzaWMkbWVkaWFucwpscF9tYWNyX3N2YV90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgbHBfbWFjcl9zdmEsCiAgZXhjZWw9cGFzdGUwKCJleGNlbC9scF9tYWNyX3N2YS12IiwgdmVyLCAiLnhsc3giKSwKICBrZWVwZXJzPWxwX2NvbnRyYXN0cywKICBleHRyYV9hbm5vdD1tZWRpYW5zX2J5X2NvbmRpdGlvbikpCmxwX21hY3Jfc3ZhX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGxwX21hY3Jfc3ZhX3RhYmxlcywKICBleGNlbD1wYXN0ZTAoImV4Y2VsL2xwX21hY3Jfc3ZhX3NpZ25pZmljYW50LXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgojIEZpZ3VyZSBvdXQgaG93IHRvIGNvbXBhcmUgdGhlc2UgcmVzdWx0cwoKSSBoYXZlIDQgbWV0aG9kcyBvZiBwZXJmb3JtaW5nIHRoaXMgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMuICBFYWNoIG9uZSBjb21lcyB3aXRoIGEgc2V0IG9mCm1ldHJpY3MgZGVmaW5pbmcgJ3NpZ25pZmljYW50Jy4gIFBlcmhhcHMgSSBjYW4gbWFrZSBhIHRhYmxlIG9mIHRoZSAjIG9mIGdlbmVzIGRlZmluZWQgYXMgc2lnbmlmaWNhbnQKYnkgY29udHJhc3QgZm9yIGVhY2guICBJbiBhZGRpdGlvbiBpdCBtYXkgYmUgd29ydGggd2hpbGUgdG8gZG8gYSBzY2F0dGVyIHBsb3RzIG9mIHRoZSBsb2dGQ3MgYmV0d2Vlbgp0aGVzZSBjb21wYXJpc29ucyBhbmQgc2VlIGhvdyB3ZWxsIHRoZXkgYWdyZWU/CgojIyBDb21wYXJlIERlU2VxIC8gQmFzaWMgd2l0aG91dCBiYXRjaCBpbiBtb2RlbAoKYGBge3IgYmFzaWNfZGVzZXFfbm9iYXRjaH0KbHBfbWFjcl9ub2JhdGNoX2Jhc2ljIDwtIG1lcmdlKAogIGxwX21hY3Jfbm9iYXRjaCRkZXNlcSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBscF9tYWNyX2JhdGNoJGJhc2ljJGFsbF90YWJsZXMkc2hfdnNfY2hyLAogIGJ5PSJyb3cubmFtZXMiKQpyb3duYW1lcyhscF9tYWNyX25vYmF0Y2hfYmFzaWMpIDwtIGxwX21hY3Jfbm9iYXRjaF9iYXNpY1tbIlJvdy5uYW1lcyJdXQpscF9tYWNyX25vYmF0Y2hfbG9nZmMgPC0gbHBfbWFjcl9ub2JhdGNoX2Jhc2ljWywgYygibG9nRkMueCIsICJsb2dGQy55IildCmNvbG5hbWVzKGxwX21hY3Jfbm9iYXRjaF9sb2dmYykgPC0gYygibm9iYXRjaCIsImJhc2ljIikKbGZjX25iX2IgPC0gc20ocGxvdF9saW5lYXJfc2NhdHRlcihscF9tYWNyX25vYmF0Y2hfbG9nZmMsIHByZXR0eV9jb2xvcnM9RkFMU0UpKQpsZmNfbmJfYiRzY2F0dGVyCmxmY19uYl9iJGNvcnJlbGF0aW9uCgpscF9tYWNyX25vYmF0Y2hfcCA8LSBscF9tYWNyX25vYmF0Y2hfYmFzaWNbLCBjKCJQLlZhbHVlIiwicCIpXQpscF9tYWNyX25vYmF0Y2hfcFtbMl1dIDwtIGFzLm51bWVyaWMobHBfbWFjcl9ub2JhdGNoX3BbWzJdXSkKY29sbmFtZXMobHBfbWFjcl9ub2JhdGNoX3ApIDwtIGMoIm5vYmF0Y2giLCJiYXNpYyIpCmxwX21hY3Jfbm9iYXRjaF9wIDwtIC0xICogbG9nKGxwX21hY3Jfbm9iYXRjaF9wKQpwX25iX2IgPC0gc20ocGxvdF9saW5lYXJfc2NhdHRlcihscF9tYWNyX25vYmF0Y2hfcCwgcHJldHR5X2NvbG9ycz1GQUxTRSkpCnBfbmJfYiRzY2F0dGVyCnBfbmJfYiRjb3JyZWxhdGlvbgpgYGAKCiMjIENvbXBhcmUgU1ZBIHRvIGJhdGNoIGluIG1vZGVsLCBERVNlcQoKYGBge3IgZGVzZXFfc3ZhX2JhdGNofQpscF9tYWNyX3N2YV9iYXRjaCA8LSBtZXJnZSgKICBscF9tYWNyX3N2YSRkZXNlcSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBscF9tYWNyX2JhdGNoJGRlc2VxJGFsbF90YWJsZXMkc2hfdnNfY2hyLAogIGJ5PSJyb3cubmFtZXMiKQpyb3duYW1lcyhscF9tYWNyX3N2YV9iYXRjaCkgPC0gbHBfbWFjcl9zdmFfYmF0Y2hbWyJSb3cubmFtZXMiXV0KbHBfbWFjcl9zdmFfbG9nZmMgPC0gbHBfbWFjcl9zdmFfYmF0Y2hbLCBjKCJsb2dGQy54IiwibG9nRkMueSIpXQpjb2xuYW1lcyhscF9tYWNyX3N2YV9sb2dmYykgPC0gYygic3ZhIiwiYmF0Y2giKQpsZmNfYl9zIDwtIHNtKHBsb3RfbGluZWFyX3NjYXR0ZXIobHBfbWFjcl9zdmFfbG9nZmMsIHByZXR0eV9jb2xvcnM9RkFMU0UpKQpsZmNfYl9zJHNjYXR0ZXIKbGZjX2JfcyRjb3JyZWxhdGlvbgoKbHBfbWFjcl9zdmFfcCA8LSBscF9tYWNyX3N2YV9iYXRjaFssIGMoIlAuVmFsdWUueCIsIlAuVmFsdWUueSIpXQpscF9tYWNyX3N2YV9wW1syXV0gPC0gYXMubnVtZXJpYyhscF9tYWNyX3N2YV9wW1syXV0pCmNvbG5hbWVzKGxwX21hY3Jfc3ZhX3ApIDwtIGMoInN2YSIsImJhdGNoIikKbHBfbWFjcl9zdmFfcCA8LSAtMSAqIGxvZyhscF9tYWNyX3N2YV9wKQpwX2JfcyA8LSBzbShwbG90X2xpbmVhcl9zY2F0dGVyKGxwX21hY3Jfc3ZhX3AsIHByZXR0eV9jb2xvcnM9RkFMU0UpKQpwX2JfcyRzY2F0dGVyCnBfYl9zJGNvcnJlbGF0aW9uCmBgYAoKIyMjIEluY2x1ZGUgcC12YWx1ZSBlc3RpbWF0aW9ucwoKVHJ5IHB1dHRpbmcgc29tZSBpbmZvcm1hdGlvbiBvZiB0aGUgcC12YWx1ZXMgd2l0aCB0aGUgY29tcGFyYXRpdmUgbG9nMmZjCgpgYGB7ciBsMmZzX3B2YWxzfQpsZmNwX2JfcyA8LSBscF9tYWNyX3N2YV9iYXRjaFssIGMoImxvZ0ZDLngiLCAibG9nRkMueSIsICJQLlZhbHVlLngiLCAiUC5WYWx1ZS55IildCmNvbG5hbWVzKGxmY3BfYl9zKSA8LSBjKCJsMmZjc3ZhIiwgImwyZmNiYXRjaCIsICJwc3ZhIiwgInBiYXRjaCIpCmxmY19iX3Mkc2NhdHRlcgpjdXRvZmYgPC0gMC4xCmxmY3BfYl9zJHN0YXRlIDwtIGlmZWxzZShsZmNwX2JfcyRwc3ZhID4gY3V0b2ZmICYgbGZjcF9iX3MkcGJhdGNoID4gY3V0b2ZmLCAiYm90aGluc2lnIiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKGxmY3BfYl9zJHBzdmEgPD0gY3V0b2ZmICYgbGZjcF9iX3MkcGJhdGNoIDw9IGN1dG9mZiwgImJvdGhzaWciLAogICAgICAgICAgICAgICAgICBpZmVsc2UobGZjcF9iX3MkcHN2YSA8PSBjdXRvZmYsICJzdmFzaWciLCAiYmF0Y2hzaWciKSkpCiMjbGZjcF9iX3MkbGZjc3RhdGUgPC0gaWZlbHNlKGxmY3BfYl9zJGwyZmNzdmEgPj0gMC43NSAmIGxmY3BfYl9zJGwyZmNiYXRjaCwgIiIsICIiKQpudW1fYm90aGluc2lnIDwtIHN1bShsZmNwX2JfcyRzdGF0ZSA9PSAiYm90aGluc2lnIikKbnVtX2JvdGhzaWcgPC0gc3VtKGxmY3BfYl9zJHN0YXRlID09ICJib3Roc2lnIikKbnVtX3N2YXNpZyA8LSBzdW0obGZjcF9iX3Mkc3RhdGUgPT0gInN2YXNpZyIpCm51bV9iYXRjaHNpZyA8LSBzdW0obGZjcF9iX3Mkc3RhdGUgPT0gImJhdGNoc2lnIikKCmxpYnJhcnkoZ2dwbG90MikKYWVzX2NvbG9yID0gIihsMmZjc3ZhID49IDAuNzUgfCBsMmZjc3ZhIDw9IC0wLjc1IHwgbDJmY2JhdGNoID49IDAuNzUgfCBsMmZjYmF0Y2ggPD0gLTAuNzUpIgpwbHQgPC0gZ2dwbG90Mjo6Z2dwbG90KGxmY3BfYl9zLCBhZXNfc3RyaW5nKHg9ImwyZmNzdmEiLCB5PSJsMmZjYmF0Y2giKSkgKwogICAgIyMgZ2dwbG90Mjo6Z2VvbV9wb2ludChzdGF0PSJpZGVudGl0eSIsIHNpemU9MiwgYWxwaGE9MC4yLCBhZXNfc3RyaW5nKHNoYXBlPSJhcy5mYWN0b3IoYWVzX2NvbG9yKSIsIGNvbG91cj0iYXMuZmFjdG9yKHN0YXRlKSIsIGZpbGw9ImFzLmZhY3RvcihzdGF0ZSkiKSkgKwogICAgZ2dwbG90Mjo6Z2VvbV9hYmxpbmUoY29sb3VyPSJibHVlIiwgc2xvcGU9MSwgaW50ZXJjZXB0PTAsIHNpemU9MC41KSArCiAgICBnZ3Bsb3QyOjpnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9YygtMC43NSwgMC43NSksIGNvbG9yPSJyZWQiLCBzaXplPTAuNSkgKwogICAgZ2dwbG90Mjo6Z2VvbV92bGluZSh4aW50ZXJjZXB0PWMoLTAuNzUsIDAuNzUpLCBjb2xvcj0icmVkIiwgc2l6ZT0wLjUpICsKICAgIGdncGxvdDI6Omdlb21fcG9pbnQoc3RhdD0iaWRlbnRpdHkiLCBzaXplPTIsIGFscGhhPTAuMiwgYWVzX3N0cmluZyhjb2xvdXI9ImFzLmZhY3RvcihzdGF0ZSkiLCBmaWxsPSJhcy5mYWN0b3Ioc3RhdGUpIikpICsKICAgIGdncGxvdDI6OnNjYWxlX2NvbG9yX21hbnVhbChuYW1lPSJzdGF0ZSIsIHZhbHVlcz1jKCJib3RoaW5zaWciPSJncmV5IiwgImJvdGhzaWciPSJmb3Jlc3RncmVlbiIsICJzdmFzaWciPSJkYXJrcmVkIiwgImJhdGNoc2lnIj0iZGFya2JsdWUiKSkgKwogICAgZ2dwbG90Mjo6c2NhbGVfZmlsbF9tYW51YWwobmFtZT0ic3RhdGUiLCB2YWx1ZXM9YygiYm90aGluc2lnIj0iZ3JleSIsICJib3Roc2lnIj0iZm9yZXN0Z3JlZW4iLCAic3Zhc2lnIj0iZGFya3JlZCIsICJiYXRjaHNpZyI9ImRhcmtibHVlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIkJvdGggSW5TaWcuOiAiLCBudW1fYm90aGluc2lnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIkJvdGggU2lnLjogIiwgbnVtX2JvdGhzaWcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiU3ZhIFNpZy46ICIsIG51bV9zdmFzaWcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiQmF0Y2ggU2lnLjogIiwgbnVtX2JhdGNoc2lnKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZT1nZ3Bsb3QyOjpndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzPWFlcyhzaXplPTMsIGZpbGw9ImdyZXkiKSkpICsKICAgIGdncGxvdDI6Omd1aWRlcyhmaWxsPWdncGxvdDI6Omd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXM9bGlzdChzaXplPTMpKSkgKwogICAgZ2dwbG90Mjo6dGhlbWVfYncoKQpwbHQKYGBgCgojIyBDb21wYXJlIG5vIGJhdGNoIHRvIGJhdGNoIGluIG1vZGVsLCBsaW1tYQoKYGBge3IgY29tcGFyZV9iYXRjaF9ub2JhdGNoX2xpbW1hfQpscF9tYWNyX25vYmF0Y2hfYmF0Y2ggPC0gbWVyZ2UoCiAgbHBfbWFjcl9ub2JhdGNoJGxpbW1hJGFsbF90YWJsZXMkc2hfdnNfY2hyLAogIGxwX21hY3JfYmF0Y2gkbGltbWEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgYnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKGxwX21hY3Jfbm9iYXRjaF9iYXRjaCkgPC0gbHBfbWFjcl9ub2JhdGNoX2JhdGNoW1siUm93Lm5hbWVzIl1dCmxwX21hY3Jfbm9iYXRjaF9iYXRjaCA8LSBscF9tYWNyX25vYmF0Y2hfYmF0Y2hbLCBjKCJsb2dGQy54IiwibG9nRkMueSIpXQpjb2xuYW1lcyhscF9tYWNyX25vYmF0Y2hfYmF0Y2gpIDwtIGMoIm5vYmF0Y2giLCJiYXRjaCIpCm5iX2IgPC0gcGxvdF9saW5lYXJfc2NhdHRlcihscF9tYWNyX25vYmF0Y2hfYmF0Y2gsIHByZXR0eV9jb2xvcnM9RkFMU0UpCm5iX2Ikc2NhdHRlcgpuYl9iJGNvcnJlbGF0aW9uCmBgYAoKIyMgQmF0Y2ggaW4gbW9kZWwgdnMuIFNWQSwgbGltbWEKCmBgYHtyIGNvbXBhcmVfYmF0Y2hfc3ZhX2xpbW1hMn0KbHBfbWFjcl9iYXRjaF9zdmEgPC0gbWVyZ2UoCiAgbHBfbWFjcl9iYXRjaCRsaW1tYSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBscF9tYWNyX3N2YSRsaW1tYSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMobHBfbWFjcl9iYXRjaF9zdmEpIDwtIGxwX21hY3JfYmF0Y2hfc3ZhW1siUm93Lm5hbWVzIl1dCmxwX21hY3JfYmF0Y2hfc3ZhIDwtIGxwX21hY3JfYmF0Y2hfc3ZhWywgYygibG9nRkMueCIsImxvZ0ZDLnkiKV0KY29sbmFtZXMobHBfbWFjcl9iYXRjaF9zdmEpIDwtIGMoImJhdGNoIiwic3ZhIikKYl9zIDwtIHBsb3RfbGluZWFyX3NjYXR0ZXIobHBfbWFjcl9iYXRjaF9zdmEsIHByZXR0eV9jb2xvcnM9RkFMU0UpCmJfcyRzY2F0dGVyCmJfcyRjb3JyZWxhdGlvbgpgYGAKCiMjIE5vYmF0Y2ggdnMuIGJhdGNoIGluIG1vZGVsLCBlZGdlcgoKYGBge3IgY29tcGFyZV9ub2JhdGNoX2JhdGNoX2VkZ2VyfQpscF9tYWNyX25vYmF0Y2hfYmF0Y2ggPC0gbWVyZ2UoCiAgbHBfbWFjcl9ub2JhdGNoJGVkZ2VyJGFsbF90YWJsZXMkc2hfdnNfY2hyLAogIGxwX21hY3JfYmF0Y2gkZWRnZXIkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgYnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKGxwX21hY3Jfbm9iYXRjaF9iYXRjaCkgPC0gbHBfbWFjcl9ub2JhdGNoX2JhdGNoW1siUm93Lm5hbWVzIl1dCmxwX21hY3Jfbm9iYXRjaF9iYXRjaCA8LSBscF9tYWNyX25vYmF0Y2hfYmF0Y2hbLCBjKCJsb2dGQy54IiwibG9nRkMueSIpXQpjb2xuYW1lcyhscF9tYWNyX25vYmF0Y2hfYmF0Y2gpIDwtIGMoIm5vYmF0Y2giLCJiYXRjaCIpCm5iX2IgPC0gc20ocGxvdF9saW5lYXJfc2NhdHRlcihscF9tYWNyX25vYmF0Y2hfYmF0Y2gsIHByZXR0eV9jb2xvcnM9RkFMU0UpKQpuYl9iJHNjYXR0ZXIKbmJfYiRjb3JyZWxhdGlvbgpgYGAKCiMjIEJhdGNoIGluIG1vZGVsIHZzLiBTVkEsIGVkZ2VyCgpgYGB7ciBjb21wYXJlX2JhdGNoX3N2YV9lZGdlcn0KbHBfbWFjcl9iYXRjaF9zdmEgPC0gbWVyZ2UoCiAgbHBfbWFjcl9iYXRjaCRlZGdlciRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBscF9tYWNyX3N2YSRlZGdlciRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMobHBfbWFjcl9iYXRjaF9zdmEpIDwtIGxwX21hY3JfYmF0Y2hfc3ZhW1siUm93Lm5hbWVzIl1dCmxwX21hY3JfYmF0Y2hfc3ZhIDwtIGxwX21hY3JfYmF0Y2hfc3ZhWywgYygibG9nRkMueCIsImxvZ0ZDLnkiKV0KY29sbmFtZXMobHBfbWFjcl9iYXRjaF9zdmEpIDwtIGMoImJhdGNoIiwic3ZhIikKYl9zIDwtIHBsb3RfbGluZWFyX3NjYXR0ZXIobHBfbWFjcl9iYXRjaF9zdmEsIHByZXR0eV9jb2xvcnM9RkFMU0UpCmJfcyRzY2F0dGVyCmJfcyRjb3JyZWxhdGlvbgpgYGAKCiMjIENvbXBhcmUgbm9iYXRjaCB2cy4gYmF0Y2gsIGRlc2VxCgpgYGB7ciBjb21wYXJlX25vYmF0Y2hfYmF0Y2hfZGVzZXF9CmxwX21hY3Jfbm9iYXRjaF9iYXRjaCA8LSBtZXJnZSgKICBscF9tYWNyX25vYmF0Y2gkZGVzZXEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgbHBfbWFjcl9iYXRjaCRkZXNlcSRhbGxfdGFibGVzJHNoX3ZzX2NociwKICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMobHBfbWFjcl9ub2JhdGNoX2JhdGNoKSA8LSBscF9tYWNyX25vYmF0Y2hfYmF0Y2hbWyJSb3cubmFtZXMiXV0KbHBfbWFjcl9ub2JhdGNoX2JhdGNoIDwtIGxwX21hY3Jfbm9iYXRjaF9iYXRjaFssIGMoImxvZ0ZDLngiLCJsb2dGQy55IildCmNvbG5hbWVzKGxwX21hY3Jfbm9iYXRjaF9iYXRjaCkgPC0gYygibm9iYXRjaCIsImJhdGNoIikKbmJfYiA8LSBzbShwbG90X2xpbmVhcl9zY2F0dGVyKGxwX21hY3Jfbm9iYXRjaF9iYXRjaCwgcHJldHR5X2NvbG9ycz1GQUxTRSkpCm5iX2Ikc2NhdHRlcgpuYl9iJGNvcnJlbGF0aW9uCmBgYAoKIyMgQ29tcGFyZSBiYXRjaCB2cy4gU1ZBLCBkZXNlcQoKYGBge3IgY29tcGFyZV9iYXRjaF9zdmFfZGVzZXF9CmxwX21hY3JfYmF0Y2hfc3ZhIDwtIG1lcmdlKAogIGxwX21hY3JfYmF0Y2gkZGVzZXEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgbHBfbWFjcl9zdmEkZGVzZXEkYWxsX3RhYmxlcyRzaF92c19jaHIsCiAgYnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKGxwX21hY3JfYmF0Y2hfc3ZhKSA8LSBscF9tYWNyX2JhdGNoX3N2YVtbIlJvdy5uYW1lcyJdXQpscF9tYWNyX2JhdGNoX3N2YSA8LSBscF9tYWNyX2JhdGNoX3N2YVssIGMoImxvZ0ZDLngiLCJsb2dGQy55IildCmNvbG5hbWVzKGxwX21hY3JfYmF0Y2hfc3ZhKSA8LSBjKCJiYXRjaCIsInN2YSIpCmJfcyA8LSBzbShwbG90X2xpbmVhcl9zY2F0dGVyKGxwX21hY3JfYmF0Y2hfc3ZhLCBwcmV0dHlfY29sb3JzPUZBTFNFKSkKYl9zJHNjYXR0ZXIKYl9zJGNvcnJlbGF0aW9uCmBgYAoKYGBge3Igc2F2ZW1lfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAo=