1 Introduction

Vince is looking to plot the various intersections/unions of some existing RNASeq data of mice infected with Pseudomonas aeruginosa. The table in question is rather complex; comprising samples of: mouse bladder data, LB with various additions, etc etc. Thus a great majority of what follows is my attempt to simplify the table so that it is possible to follow; then I load it into one of R’s venn libraries and print some images.

2 Step 1, look at table

In order to load this most easily, I am changing the following:

  • Remove top rows
  • shorten names to a combination of condition+column: Eg:
    • ID (gene id)
    • hupbst_basemean – human urine vs. pbs-t
    • hupbst_lfc
    • hupbst_p
    • hupbst_padj
    • mupbst_lfc – mouse urine vs. pbs-t
    • mupbst_p
    • mupbst_padj
    • mbpbst_lfc – mouse bladder vs. pbs-t
    • mbpbst_p
    • mbpbst_padj
    • lbu_ID – LB with LB urine
    • lbu_basemean
    • lbu_lfc
    • lbu_p
    • lbu_adjp
  • Remove blank columns

Save it as shrunken.csv

3 Step 2, load it up

Unfortunately, I have no guarantee that ID’s order and lbu_ID’s order are the same, so split this into two sets and merge them back.

## Warning: NAs introduced by coercion
## Warning: NAs introduced by coercion
## [1] 161  16
## [1] 160  16
## [1] 275  16
## [1] 274  16
## [1] 321  16
## [1] 321  16
## [1] 611  16
## [1] 611  16
## [1] 435  16
## [1] 434  16
## [1] 432  16
## [1] 432  16
## [1] 192  16
## [1] 184  16
## [1] 543  16
## [1] 540  16

4 Make some venns…

## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## Loading required package: ggplot2
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
## 
##     format.pval, units
## Now make sure that the sets in the ups are not down downs and vice versa
unique_hupbst_up <- hupbst_pup_genes[hupbst_pup_genes %nin% hupbst_pdown_genes]
unique_hupbst_up <- unique_hupbst_up[unique_hupbst_up %nin% mupbst_pdown_genes]
unique_hupbst_up <- unique_hupbst_up[unique_hupbst_up %nin% mbpbst_pdown_genes]
unique_hupbst_up <- unique_hupbst_up[unique_hupbst_up %nin% lbu_pdown_genes]

unique_mupbst_up <- mupbst_pup_genes[mupbst_pup_genes %nin% hupbst_pdown_genes]
unique_mupbst_up <- unique_mupbst_up[unique_mupbst_up %nin% mupbst_pdown_genes]
unique_mupbst_up <- unique_mupbst_up[unique_mupbst_up %nin% mbpbst_pdown_genes]
unique_mupbst_up <- unique_mupbst_up[unique_mupbst_up %nin% lbu_pdown_genes]

unique_mbpbst_up <- mbpbst_pup_genes[mbpbst_pup_genes %nin% hupbst_pdown_genes]
unique_mbpbst_up <- unique_mbpbst_up[unique_mbpbst_up %nin% mupbst_pdown_genes]
unique_mbpbst_up <- unique_mbpbst_up[unique_mbpbst_up %nin% mbpbst_pdown_genes]
unique_mbpbst_up <- unique_mbpbst_up[unique_mbpbst_up %nin% lbu_pdown_genes]

unique_lbu_up <- lbu_pup_genes[lbu_pup_genes %nin% hupbst_pdown_genes]
unique_lbu_up <- unique_lbu_up[unique_lbu_up %nin% mupbst_pdown_genes]
unique_lbu_up <- unique_lbu_up[unique_lbu_up %nin% mbpbst_pdown_genes]
unique_lbu_up <- unique_lbu_up[unique_lbu_up %nin% lbu_pdown_genes]

unique_hupbst_down <- hupbst_pdown_genes[hupbst_pdown_genes %nin% hupbst_pup_genes]
unique_hupbst_down <- unique_hupbst_down[unique_hupbst_down %nin% mupbst_pup_genes]
unique_hupbst_down <- unique_hupbst_down[unique_hupbst_down %nin% mbpbst_pup_genes]
unique_hupbst_down <- unique_hupbst_down[unique_hupbst_down %nin% lbu_pup_genes]

unique_mupbst_down <- mupbst_pdown_genes[mupbst_pdown_genes %nin% hupbst_pup_genes]
unique_mupbst_down <- unique_mupbst_down[unique_mupbst_down %nin% mupbst_pup_genes]
unique_mupbst_down <- unique_mupbst_down[unique_mupbst_down %nin% mbpbst_pup_genes]
unique_mupbst_down <- unique_mupbst_down[unique_mupbst_down %nin% lbu_pup_genes]

unique_mbpbst_down <- mbpbst_pdown_genes[mbpbst_pdown_genes %nin% hupbst_pup_genes]
unique_mbpbst_down <- unique_mbpbst_down[unique_mbpbst_down %nin% mupbst_pup_genes]
unique_mbpbst_down <- unique_mbpbst_down[unique_mbpbst_down %nin% mbpbst_pup_genes]
unique_mbpbst_down <- unique_mbpbst_down[unique_mbpbst_down %nin% lbu_pup_genes]

unique_lbu_down <- lbu_pdown_genes[lbu_pdown_genes %nin% hupbst_pup_genes]
unique_lbu_down <- unique_lbu_down[unique_lbu_down %nin% mupbst_pup_genes]
unique_lbu_down <- unique_lbu_down[unique_lbu_down %nin% mbpbst_pup_genes]
unique_lbu_down <- unique_lbu_down[unique_lbu_down %nin% lbu_pup_genes]


## a is hupbst
## b is mupbst
## c is mbpbst
## d is lbu
library(Vennerable)
input <- list(
    "human_urine" = unique_hupbst_up,
    "mouse_urine" = unique_mupbst_up,
    "mouse_bladder" = unique_mbpbst_up,
    "lb_urea" = unique_lbu_up)
venn_fun <- Venn(input)
start <- Weights(venn_fun)
venn_fun
## A Venn object on 4 sets named
## human_urine,mouse_urine,mouse_bladder,lb_urea 
## 0000 1000 0100 1100 0010 1010 0110 1110 0001 1001 0101 1101 0011 1011 0111 
##    0   51  131   43  223    4   60   18   93    3   17   16   13    4   16 
## 1111 
##   12

## A Venn object on 4 sets named
## human_urine,mouse_urine,mouse_bladder,lb_urea 
## 0000 1000 0100 1100 0010 1010 0110 1110 0001 1001 0101 1101 0011 1011 0111 
##    0   51  131   43  223    4   60   18   93    3   17   16   13    4   16 
## 1111 
##   12

5 Vince’s numbers

In order to use these, I think the venneuler package will be the best, as it is able to work with intersection names and numbers rather than the sets of items.

                   down   up

A Human Urine only 13 51 B Mouse Urine only 150 131 C Bladder (mouse) 190 222 D Urea 210 93 A+B Human and mouse 59 43 A+C Human + Bladder 8 4 A+D Human+Urea 7 3 B+C Mouse + Bladder 101 59 B+D Mouse+Urea 73 17 C+D Urea+Bladder 14 13 A+B+C All but urea 44 18 A+B+D All but bladder 90 16 A+C+D All but mouse 1 4 B+C+D All but human 26 16 A+B+C+D All 38 12

## Loading required package: rJava

LS0tCnRpdGxlOiAiMjAxNzA0MjU6IFJhbmRvbSBWZW5uIGRpYWdyYW1zIGZvciBWVExlZS4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKIGh0bWxfZG9jdW1lbnQ6CiAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGNvZGVfZm9sZGluZzogc2hvdwogIGZpZ19jYXB0aW9uOiB0cnVlCiAgZmlnX2hlaWdodDogNwogIGZpZ193aWR0aDogNwogIGhpZ2hsaWdodDogdGFuZ28KICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiBjb3NtbwogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4Owp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQojIyBUaGVzZSBhcmUgdGhlIG9wdGlvbnMgSSB0ZW5kIHRvIGZhdm9yCmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCgKICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICB3aWR0aD05MCwKICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgICAgICAgICAgICAgICAgIGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LAogICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucygKICBkaWdpdHM9NCwKICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKc2V0LnNlZWQoMSkKYGBgCgpgYGB7ciBsb2FkbWUsIGluY2x1ZGU9RkFMU0V9CiMjdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wcmV2aW91c19zYXZlKSkKdmVyIDwtICIyMDE3MDQyNSIKcHJldmlvdXNfZmlsZSA8LSAidmVubi5SbWQiCnJtZF9maWxlIDwtICJ2ZW5uLlJtZCIKcHJldmlvdXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKYGBgCgojIEludHJvZHVjdGlvbgoKVmluY2UgaXMgbG9va2luZyB0byBwbG90IHRoZSB2YXJpb3VzIGludGVyc2VjdGlvbnMvdW5pb25zIG9mIHNvbWUgZXhpc3RpbmcKUk5BU2VxIGRhdGEgb2YgbWljZSBpbmZlY3RlZCB3aXRoIFBzZXVkb21vbmFzIGFlcnVnaW5vc2EuICBUaGUgdGFibGUgaW4gcXVlc3Rpb24KaXMgcmF0aGVyIGNvbXBsZXg7IGNvbXByaXNpbmcgc2FtcGxlcyBvZjogbW91c2UgYmxhZGRlciBkYXRhLCBMQiB3aXRoIHZhcmlvdXMKYWRkaXRpb25zLCBldGMgZXRjLiAgVGh1cyBhIGdyZWF0IG1ham9yaXR5IG9mIHdoYXQgZm9sbG93cyBpcyBteSBhdHRlbXB0IHRvCnNpbXBsaWZ5IHRoZSB0YWJsZSBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGZvbGxvdzsgdGhlbiBJIGxvYWQgaXQgaW50byBvbmUgb2YKUidzIHZlbm4gbGlicmFyaWVzIGFuZCBwcmludCBzb21lIGltYWdlcy4KCiMgU3RlcCAxLCBsb29rIGF0IHRhYmxlCgpJbiBvcmRlciB0byBsb2FkIHRoaXMgbW9zdCBlYXNpbHksIEkgYW0gY2hhbmdpbmcgdGhlIGZvbGxvd2luZzoKCiogUmVtb3ZlIHRvcCByb3dzCiogc2hvcnRlbiBuYW1lcyB0byBhIGNvbWJpbmF0aW9uIG9mIGNvbmRpdGlvbitjb2x1bW46IEVnOgogICAgKiBJRCAoZ2VuZSBpZCkKCSogaHVwYnN0X2Jhc2VtZWFuIC0tIGh1bWFuIHVyaW5lIHZzLiBwYnMtdAoJKiBodXBic3RfbGZjCgkqIGh1cGJzdF9wCgkqIGh1cGJzdF9wYWRqCgkqIG11cGJzdF9sZmMgLS0gbW91c2UgdXJpbmUgdnMuIHBicy10CgkqIG11cGJzdF9wCgkqIG11cGJzdF9wYWRqCgkqIG1icGJzdF9sZmMgLS0gbW91c2UgYmxhZGRlciB2cy4gcGJzLXQKCSogbWJwYnN0X3AKCSogbWJwYnN0X3BhZGoKCSogbGJ1X0lEIC0tIExCIHdpdGggTEIgdXJpbmUKCSogbGJ1X2Jhc2VtZWFuCgkqIGxidV9sZmMKCSogbGJ1X3AKCSogbGJ1X2FkanAKKiBSZW1vdmUgYmxhbmsgY29sdW1ucwoKU2F2ZSBpdCBhcyBzaHJ1bmtlbi5jc3YKCiMgU3RlcCAyLCBsb2FkIGl0IHVwCgpVbmZvcnR1bmF0ZWx5LCBJIGhhdmUgbm8gZ3VhcmFudGVlIHRoYXQgSUQncyBvcmRlciBhbmQgbGJ1X0lEJ3Mgb3JkZXIgYXJlIHRoZSBzYW1lLApzbyBzcGxpdCB0aGlzIGludG8gdHdvIHNldHMgYW5kIG1lcmdlIHRoZW0gYmFjay4KCiAgYGBge3IgdmVubnN9CmFsbF90b2dldGhlciA8LSByZWFkLmNzdigiZXh0ZXJuYWxfZGF0YS9zaHJ1bmtlbi5jc3YiKQojIyAzIHJvd3MgYXJlIG1pc3NpbmcgZGF0YS4uLiBkcm9wIHRoZW0uCiMjYWxsX3RvZ2V0aGVyIDwtIGFsbF90b2dldGhlcltjb21wbGV0ZS5jYXNlcyhhbGxfdG9nZXRoZXIpLCBdCnJvd25hbWVzKGFsbF90b2dldGhlcikgPC0gbWFrZS5uYW1lcyhhbGxfdG9nZXRoZXJbWyJJRCJdXSwgdW5pcXVlPVRSVUUpCmFsbF90b2dldGhlciRsYnVfbGZjIDwtIGFzLm51bWVyaWMoYWxsX3RvZ2V0aGVyJGxidV9sZmMpCmFsbF90b2dldGhlciRsYnVfYWRqcCA8LSBhcy5udW1lcmljKGFsbF90b2dldGhlciRsYnVfYWRqcCkKYWxsX3RvZ2V0aGVyW2lzLm5hKGFsbF90b2dldGhlcildIDwtIDAKCiMjIEh1bWFuIHVyaW5lLCBQQlMtVCB1cC9kb3duIChodXBic3Rfc3R1ZmYpCiMjIFRoZSBnb2FsIGlzIDQgZm9sZCwgeWVzbm8/ICBTbyAyIGxvZyBmb2xkIGNoYW5nZXMuCiMjIEZpcnN0IHB1bGwgdGhlIHVwCmh1cGJzdF91cCA8LSBhbGxfdG9nZXRoZXJbYWxsX3RvZ2V0aGVyW1siaHVwYnN0X2xmYyJdXSA+PSAyLCBdCiMjIFZpbmNlJ3Mgc2hlZXQgc2hvd3MgMTYxIGhlcmUKZGltKGh1cGJzdF91cCkKIyMgVGFrZSBvbmx5IHRoZSBsb3cgYWRqdXN0ZWQgcC12YWx1ZXMKaHVwYnN0X3B1cCA8LSBodXBic3RfdXBbaHVwYnN0X3VwW1siaHVwYnN0X3BhZGoiXV0gPD0gMC4wNSwgXQojIyBIb3cgbWFueT8KZGltKGh1cGJzdF9wdXApCiMjIEdldCB0aGUgbmFtZXMgb2YgdGhlc2UgZ2VuZXMKaHVwYnN0X3VwX2dlbmVzIDwtIHJvd25hbWVzKGh1cGJzdF91cCkKaHVwYnN0X3B1cF9nZW5lcyA8LSByb3duYW1lcyhodXBic3RfcHVwKQojIyBSZXBlYXQgZ29pbmcgZG93biwgPD0gNCBmb2xkCmh1cGJzdF9kb3duIDwtIGFsbF90b2dldGhlclthbGxfdG9nZXRoZXJbWyJodXBic3RfbGZjIl1dIDw9IC0yLCBdCmh1cGJzdF9wZG93biA8LSBodXBic3RfZG93bltodXBic3RfZG93bltbImh1cGJzdF9wYWRqIl1dIDw9IDAuMDUsIF0KZGltKGh1cGJzdF9kb3duKQpkaW0oaHVwYnN0X3Bkb3duKQpodXBic3RfcGRvd25fZ2VuZXMgPC0gcm93bmFtZXMoaHVwYnN0X3Bkb3duKQoKIyMgbm93IHJlcGVhdCB0aGUgYWJvdmUgZm9yIE1vdXNlIHVyaW5lLCBQQlMtVCAobXVwYnN0X3N0dWZmKQptdXBic3RfdXAgPC0gYWxsX3RvZ2V0aGVyW2FsbF90b2dldGhlcltbIm11cGJzdF9sZmMiXV0gPj0gMiwgXQojIyBUYWtlIG9ubHkgdGhlIGxvdyBhZGp1c3RlZCBwLXZhbHVlcwptdXBic3RfcHVwIDwtIG11cGJzdF91cFttdXBic3RfdXBbWyJtdXBic3RfcGFkaiJdXSA8PSAwLjA1LCBdCiMjIEhvdyBtYW55PwpkaW0obXVwYnN0X3VwKQpkaW0obXVwYnN0X3B1cCkKIyMgR2V0IHRoZSBuYW1lcyBvZiB0aGVzZSBnZW5lcwptdXBic3RfcHVwX2dlbmVzIDwtIHJvd25hbWVzKG11cGJzdF9wdXApCiMjIFJlcGVhdCBnb2luZyBkb3duLCA8PSA0IGZvbGQKbXVwYnN0X2Rvd24gPC0gYWxsX3RvZ2V0aGVyW2FsbF90b2dldGhlcltbIm11cGJzdF9sZmMiXV0gPD0gLTIsIF0KbXVwYnN0X3Bkb3duIDwtIG11cGJzdF9kb3duW211cGJzdF9kb3duW1sibXVwYnN0X3BhZGoiXV0gPD0gMC4wNSwgXQpkaW0obXVwYnN0X2Rvd24pCmRpbShtdXBic3RfcGRvd24pCm11cGJzdF9wZG93bl9nZW5lcyA8LSByb3duYW1lcyhtdXBic3RfcGRvd24pCgojIyBSZXBlYXQgZm9yIG1vdXNlIGJsYWRkZXIgKG1icGJzdF9zdHVmZikKbWJwYnN0X3VwIDwtIGFsbF90b2dldGhlclthbGxfdG9nZXRoZXJbWyJtYnBic3RfbGZjIl1dID49IDIsIF0KIyMgVGFrZSBvbmx5IHRoZSBsb3cgYWRqdXN0ZWQgcC12YWx1ZXMKbWJwYnN0X3B1cCA8LSBtYnBic3RfdXBbbWJwYnN0X3VwW1sibWJwYnN0X3BhZGoiXV0gPD0gMC4wNSwgXQojIyBIb3cgbWFueT8KZGltKG1icGJzdF91cCkKZGltKG1icGJzdF9wdXApCiMjIEdldCB0aGUgbmFtZXMgb2YgdGhlc2UgZ2VuZXMKbWJwYnN0X3B1cF9nZW5lcyA8LSByb3duYW1lcyhtYnBic3RfcHVwKQojIyBSZXBlYXQgZ29pbmcgZG93biwgPD0gNCBmb2xkCm1icGJzdF9kb3duIDwtIGFsbF90b2dldGhlclthbGxfdG9nZXRoZXJbWyJtYnBic3RfbGZjIl1dIDw9IC0yLCBdCm1icGJzdF9wZG93biA8LSBtYnBic3RfZG93blttYnBic3RfZG93bltbIm1icGJzdF9wYWRqIl1dIDw9IDAuMDUsIF0KZGltKG1icGJzdF9kb3duKQpkaW0obWJwYnN0X3Bkb3duKQptYnBic3RfcGRvd25fZ2VuZXMgPC0gcm93bmFtZXMobWJwYnN0X3Bkb3duKQoKIyMgQW5kIGxhc3QsIExCICsgdXJlYSAobGJ1X3N0dWZmKQpsYnVfdXAgPC0gYWxsX3RvZ2V0aGVyW2FsbF90b2dldGhlcltbImxidV9sZmMiXV0gPj0gMiwgXQojIyBUYWtlIG9ubHkgdGhlIGxvdyBhZGp1c3RlZCBwLXZhbHVlcwojIyBvb3BzLCBJIG1hZGUgcGFkaiB0byBhZGpwLi4uCmxidV9wdXAgPC0gbGJ1X3VwW2xidV91cFtbImxidV9hZGpwIl1dIDw9IDAuMDUsIF0KIyMgSG93IG1hbnk/CmRpbShsYnVfdXApCmRpbShsYnVfcHVwKQojIyBHZXQgdGhlIG5hbWVzIG9mIHRoZXNlIGdlbmVzCmxidV9wdXBfZ2VuZXMgPC0gcm93bmFtZXMobGJ1X3B1cCkKIyMgUmVwZWF0IGdvaW5nIGRvd24sIDw9IDQgZm9sZApsYnVfZG93biA8LSBhbGxfdG9nZXRoZXJbYXMubnVtZXJpYyhhbGxfdG9nZXRoZXJbWyJsYnVfbGZjIl1dKSA8PSAtMiwgXQpsYnVfcGRvd24gPC0gbGJ1X2Rvd25bYXMubnVtZXJpYyhsYnVfZG93bltbImxidV9hZGpwIl1dKSA8PSAwLjA1LCBdCmRpbShsYnVfZG93bikKZGltKGxidV9wZG93bikKbGJ1X3Bkb3duX2dlbmVzIDwtIHJvd25hbWVzKGxidV9wZG93bikKYGBgCgojIE1ha2Ugc29tZSB2ZW5ucy4uLgoKYGBge3IgdmVubmVyYWJsZX0KbGlicmFyeShIbWlzYykKIyMgTm93IG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXRzIGluIHRoZSB1cHMgYXJlIG5vdCBkb3duIGRvd25zIGFuZCB2aWNlIHZlcnNhCnVuaXF1ZV9odXBic3RfdXAgPC0gaHVwYnN0X3B1cF9nZW5lc1todXBic3RfcHVwX2dlbmVzICVuaW4lIGh1cGJzdF9wZG93bl9nZW5lc10KdW5pcXVlX2h1cGJzdF91cCA8LSB1bmlxdWVfaHVwYnN0X3VwW3VuaXF1ZV9odXBic3RfdXAgJW5pbiUgbXVwYnN0X3Bkb3duX2dlbmVzXQp1bmlxdWVfaHVwYnN0X3VwIDwtIHVuaXF1ZV9odXBic3RfdXBbdW5pcXVlX2h1cGJzdF91cCAlbmluJSBtYnBic3RfcGRvd25fZ2VuZXNdCnVuaXF1ZV9odXBic3RfdXAgPC0gdW5pcXVlX2h1cGJzdF91cFt1bmlxdWVfaHVwYnN0X3VwICVuaW4lIGxidV9wZG93bl9nZW5lc10KCnVuaXF1ZV9tdXBic3RfdXAgPC0gbXVwYnN0X3B1cF9nZW5lc1ttdXBic3RfcHVwX2dlbmVzICVuaW4lIGh1cGJzdF9wZG93bl9nZW5lc10KdW5pcXVlX211cGJzdF91cCA8LSB1bmlxdWVfbXVwYnN0X3VwW3VuaXF1ZV9tdXBic3RfdXAgJW5pbiUgbXVwYnN0X3Bkb3duX2dlbmVzXQp1bmlxdWVfbXVwYnN0X3VwIDwtIHVuaXF1ZV9tdXBic3RfdXBbdW5pcXVlX211cGJzdF91cCAlbmluJSBtYnBic3RfcGRvd25fZ2VuZXNdCnVuaXF1ZV9tdXBic3RfdXAgPC0gdW5pcXVlX211cGJzdF91cFt1bmlxdWVfbXVwYnN0X3VwICVuaW4lIGxidV9wZG93bl9nZW5lc10KCnVuaXF1ZV9tYnBic3RfdXAgPC0gbWJwYnN0X3B1cF9nZW5lc1ttYnBic3RfcHVwX2dlbmVzICVuaW4lIGh1cGJzdF9wZG93bl9nZW5lc10KdW5pcXVlX21icGJzdF91cCA8LSB1bmlxdWVfbWJwYnN0X3VwW3VuaXF1ZV9tYnBic3RfdXAgJW5pbiUgbXVwYnN0X3Bkb3duX2dlbmVzXQp1bmlxdWVfbWJwYnN0X3VwIDwtIHVuaXF1ZV9tYnBic3RfdXBbdW5pcXVlX21icGJzdF91cCAlbmluJSBtYnBic3RfcGRvd25fZ2VuZXNdCnVuaXF1ZV9tYnBic3RfdXAgPC0gdW5pcXVlX21icGJzdF91cFt1bmlxdWVfbWJwYnN0X3VwICVuaW4lIGxidV9wZG93bl9nZW5lc10KCnVuaXF1ZV9sYnVfdXAgPC0gbGJ1X3B1cF9nZW5lc1tsYnVfcHVwX2dlbmVzICVuaW4lIGh1cGJzdF9wZG93bl9nZW5lc10KdW5pcXVlX2xidV91cCA8LSB1bmlxdWVfbGJ1X3VwW3VuaXF1ZV9sYnVfdXAgJW5pbiUgbXVwYnN0X3Bkb3duX2dlbmVzXQp1bmlxdWVfbGJ1X3VwIDwtIHVuaXF1ZV9sYnVfdXBbdW5pcXVlX2xidV91cCAlbmluJSBtYnBic3RfcGRvd25fZ2VuZXNdCnVuaXF1ZV9sYnVfdXAgPC0gdW5pcXVlX2xidV91cFt1bmlxdWVfbGJ1X3VwICVuaW4lIGxidV9wZG93bl9nZW5lc10KCnVuaXF1ZV9odXBic3RfZG93biA8LSBodXBic3RfcGRvd25fZ2VuZXNbaHVwYnN0X3Bkb3duX2dlbmVzICVuaW4lIGh1cGJzdF9wdXBfZ2VuZXNdCnVuaXF1ZV9odXBic3RfZG93biA8LSB1bmlxdWVfaHVwYnN0X2Rvd25bdW5pcXVlX2h1cGJzdF9kb3duICVuaW4lIG11cGJzdF9wdXBfZ2VuZXNdCnVuaXF1ZV9odXBic3RfZG93biA8LSB1bmlxdWVfaHVwYnN0X2Rvd25bdW5pcXVlX2h1cGJzdF9kb3duICVuaW4lIG1icGJzdF9wdXBfZ2VuZXNdCnVuaXF1ZV9odXBic3RfZG93biA8LSB1bmlxdWVfaHVwYnN0X2Rvd25bdW5pcXVlX2h1cGJzdF9kb3duICVuaW4lIGxidV9wdXBfZ2VuZXNdCgp1bmlxdWVfbXVwYnN0X2Rvd24gPC0gbXVwYnN0X3Bkb3duX2dlbmVzW211cGJzdF9wZG93bl9nZW5lcyAlbmluJSBodXBic3RfcHVwX2dlbmVzXQp1bmlxdWVfbXVwYnN0X2Rvd24gPC0gdW5pcXVlX211cGJzdF9kb3duW3VuaXF1ZV9tdXBic3RfZG93biAlbmluJSBtdXBic3RfcHVwX2dlbmVzXQp1bmlxdWVfbXVwYnN0X2Rvd24gPC0gdW5pcXVlX211cGJzdF9kb3duW3VuaXF1ZV9tdXBic3RfZG93biAlbmluJSBtYnBic3RfcHVwX2dlbmVzXQp1bmlxdWVfbXVwYnN0X2Rvd24gPC0gdW5pcXVlX211cGJzdF9kb3duW3VuaXF1ZV9tdXBic3RfZG93biAlbmluJSBsYnVfcHVwX2dlbmVzXQoKdW5pcXVlX21icGJzdF9kb3duIDwtIG1icGJzdF9wZG93bl9nZW5lc1ttYnBic3RfcGRvd25fZ2VuZXMgJW5pbiUgaHVwYnN0X3B1cF9nZW5lc10KdW5pcXVlX21icGJzdF9kb3duIDwtIHVuaXF1ZV9tYnBic3RfZG93blt1bmlxdWVfbWJwYnN0X2Rvd24gJW5pbiUgbXVwYnN0X3B1cF9nZW5lc10KdW5pcXVlX21icGJzdF9kb3duIDwtIHVuaXF1ZV9tYnBic3RfZG93blt1bmlxdWVfbWJwYnN0X2Rvd24gJW5pbiUgbWJwYnN0X3B1cF9nZW5lc10KdW5pcXVlX21icGJzdF9kb3duIDwtIHVuaXF1ZV9tYnBic3RfZG93blt1bmlxdWVfbWJwYnN0X2Rvd24gJW5pbiUgbGJ1X3B1cF9nZW5lc10KCnVuaXF1ZV9sYnVfZG93biA8LSBsYnVfcGRvd25fZ2VuZXNbbGJ1X3Bkb3duX2dlbmVzICVuaW4lIGh1cGJzdF9wdXBfZ2VuZXNdCnVuaXF1ZV9sYnVfZG93biA8LSB1bmlxdWVfbGJ1X2Rvd25bdW5pcXVlX2xidV9kb3duICVuaW4lIG11cGJzdF9wdXBfZ2VuZXNdCnVuaXF1ZV9sYnVfZG93biA8LSB1bmlxdWVfbGJ1X2Rvd25bdW5pcXVlX2xidV9kb3duICVuaW4lIG1icGJzdF9wdXBfZ2VuZXNdCnVuaXF1ZV9sYnVfZG93biA8LSB1bmlxdWVfbGJ1X2Rvd25bdW5pcXVlX2xidV9kb3duICVuaW4lIGxidV9wdXBfZ2VuZXNdCgoKIyMgYSBpcyBodXBic3QKIyMgYiBpcyBtdXBic3QKIyMgYyBpcyBtYnBic3QKIyMgZCBpcyBsYnUKbGlicmFyeShWZW5uZXJhYmxlKQppbnB1dCA8LSBsaXN0KAogICAgImh1bWFuX3VyaW5lIiA9IHVuaXF1ZV9odXBic3RfdXAsCiAgICAibW91c2VfdXJpbmUiID0gdW5pcXVlX211cGJzdF91cCwKICAgICJtb3VzZV9ibGFkZGVyIiA9IHVuaXF1ZV9tYnBic3RfdXAsCiAgICAibGJfdXJlYSIgPSB1bmlxdWVfbGJ1X3VwKQp2ZW5uX2Z1biA8LSBWZW5uKGlucHV0KQpzdGFydCA8LSBXZWlnaHRzKHZlbm5fZnVuKQp2ZW5uX2Z1bgoKcGxvdCh2ZW5uX2Z1biwgZG9XZWlnaHRzPUZBTFNFLCB0eXBlPSJlbGxpcHNlcyIpCnBsb3QodmVubl9mdW4sIGRvV2VpZ2h0cz1GQUxTRSwgdHlwZT0iQ2hvd1J1c2tleSIpCnBsb3QodmVubl9mdW4sIGRvV2VpZ2h0cz1GQUxTRSwgdHlwZT0ic3F1YXJlcyIpCgpwaW5wdXQgPC0gbGlzdCgKICAgICJodW1hbl91cmluZSIgPSB1bmlxdWVfaHVwYnN0X2Rvd24sCiAgICAibW91c2VfdXJpbmUiID0gdW5pcXVlX211cGJzdF9kb3duLAogICAgIm1vdXNlX2JsYWRkZXIiID0gdW5pcXVlX21icGJzdF9kb3duLAogICAgImxiX3VyZWEiID0gdW5pcXVlX2xidV9kb3duKQp2ZW5uX2Z1biA8LSBWZW5uKGlucHV0KQp2ZW5uX2Z1bgpwbG90KHZlbm5fZnVuLCBkb1dlaWdodHM9RkFMU0UsIHR5cGU9ImVsbGlwc2VzIikKYGBgCgoKIyBWaW5jZSdzIG51bWJlcnMKCkluIG9yZGVyIHRvIHVzZSB0aGVzZSwgSSB0aGluayB0aGUgdmVubmV1bGVyIHBhY2thZ2Ugd2lsbCBiZSB0aGUgYmVzdCwgYXMgaXQKaXMgYWJsZSB0byB3b3JrIHdpdGggaW50ZXJzZWN0aW9uIG5hbWVzIGFuZCBudW1iZXJzIHJhdGhlciB0aGFuIHRoZSBzZXRzIG9mIGl0ZW1zLgoKICAgICAgICAgICAgICAgICAgICAgICBkb3duICAgdXAKQSBIdW1hbiBVcmluZSBvbmx5ICAgIDEzICAgICA1MQpCIE1vdXNlIFVyaW5lIG9ubHkgICAgMTUwICAgIDEzMQpDIEJsYWRkZXIgKG1vdXNlKSAgICAgMTkwICAgIDIyMgpEIFVyZWEgICAgICAgICAgICAgICAgMjEwICAgIDkzCkErQiBIdW1hbiBhbmQgbW91c2UgICA1OSAgICAgNDMKQStDIEh1bWFuICsgQmxhZGRlciAgIDggICAgICA0CkErRCBIdW1hbitVcmVhICAgICAgICA3ICAgICAgMwpCK0MgTW91c2UgKyBCbGFkZGVyICAgMTAxICAgIDU5CkIrRCBNb3VzZStVcmVhICAgICAgICA3MyAgICAgMTcKQytEIFVyZWErQmxhZGRlciAgICAgIDE0ICAgICAxMwpBK0IrQyBBbGwgYnV0IHVyZWEgICAgNDQgICAgIDE4CkErQitEIEFsbCBidXQgYmxhZGRlciA5MCAgICAgMTYKQStDK0QgQWxsIGJ1dCBtb3VzZSAgIDEgICAgICA0CkIrQytEIEFsbCBidXQgaHVtYW4gICAyNiAgICAgMTYKQStCK0MrRCBBbGwgICAgICAgICAgIDM4ICAgICAxMgoKYGBge3IgdmluY2VzX3Zlbm59CmxpYnJhcnkodmVubmV1bGVyKQoKZG93bl9zZXRzIDwtIGMoCiAgICAiQSIgPSAxMywKICAgICJCIiA9IDE1MCwKICAgICJDIiA9IDEwMSwKICAgICJEIiA9IDIxMCwKICAgICJBJkIiID0gNTksCiAgICAiQSZDIiA9IDgsCiAgICAiQSZEIiA9IDcsCiAgICAiQiZDIiA9IDEwMSwKICAgICJCJkQiID0gNzMsCiAgICAiQyZEIiA9IDE0LAogICAgIkEmQiZDIiA9IDQ0LAogICAgIkEmQiZEIiA9IDkwLAogICAgIkEmQyZEIiA9IDEsCiAgICAiQiZDJkQiID0gMjYsCiAgICAiQSZCJkMmRCIgPSAzOCkKZG93bl92aW5jZSA8LSB2ZW5uZXVsZXIoZG93bl9zZXRzKQpwbG90KGRvd25fdmluY2UpCgp1cF9zZXRzIDwtIGMoCiAgICAiQSIgPSA1MSwKICAgICJCIiA9IDEzMSwKICAgICJDIiA9IDIyMiwKICAgICJEIiA9IDkzLAogICAgIkEmQiIgPSA0MywKICAgICJBJkMiID0gNCwKICAgICJBJkQiID0gMywKICAgICJCJkMiID0gNTksCiAgICAiQiZEIiA9IDE3LAogICAgIkMmRCIgPSAxMywKICAgICJBJkImQyIgPSAxOCwKICAgICJBJkImRCIgPSAxNiwKICAgICJBJkMmRCIgPSA0LAogICAgIkImQyZEIiA9IDE2LAogICAgIkEmQiZDJkQiID0gMTIpCnVwX3ZpbmNlID0gdmVubmV1bGVyKGRvd25fc2V0cykKcGxvdCh1cF92aW5jZSkKYGBgCg==