So Hollie gave us an interesting side note to look at when she did both an RRBS sequencing run as well as a whole genome sequencing run on Sample EPI-135. I wanted to just explore it a little bit and see if there are any interesting patterns.
The two main things that leap to my mind is A) how much more data do you get out of WG vs RRBS and B) how does that data differ (Does RRBS normally read a lower, equal, or greater methylation rate at sites shared between sequencing runs).
This may be all just satisfying my own curisoity, as I’m not sure if it’s possible to parse out the sequencing effects vs the RRBS/WG process effects but it’s fairly easy to do and may be interesting!
As always, first we load some packages and read in some data. Also, because I’m using .bed files, I add some column names to make life easier later on. I convert them from data frames to data tables to make operating on them more efficient also.
library(readr)
library(data.table)
WG <- read_delim("~/Documents/RobertsLab/Methylomev2/EPI-135WG_percmeth.bed",
"\t", escape_double = FALSE, trim_ws = TRUE, col_names = FALSE)
colnames(WG)[1:4] <- c("scaff", "start", "end", "meth")
WG <- as.data.table(WG)
RRBS <- read_delim("~/Documents/RobertsLab/Methylomev2/EPI-135_percmeth.bed",
"\t", escape_double = FALSE, col_names = FALSE,
trim_ws = TRUE)
colnames(RRBS)[1:4] <- c("scaff", "start", "end", "meth")
RRBS <- as.data.table(RRBS)
nrow(WG)
[1] 991923
nrow(RRBS)
[1] 93373
Well, thats a pretty big difference. It looks like Whole Genome bisulfite sequencing yields an order of magnitude more methylated spots.
Next I weld together the Scaffold number and location to make an easily searchable vector.
RRBS$loc <- paste0(RRBS$scaff, "-", RRBS$start)
WG$loc <- paste0(WG$scaff, "-", WG$start)
length(which(WG$loc %in% RRBS$loc == TRUE))
[1] 82848
Interesting. So it looks like there’s ~10,000 loci found in the RRBS data set that aren’t found in the WG sequence.
Lets pull out just the WG loci that are found in the RRBS sample.
merge(RRBS, WG, by = "loc") -> temp
matches <- as.data.table(cbind(temp$loc, temp$meth.x, temp$meth.y))
colnames(matches)[1:3] <- c("loc", "rrbs", "wg")
matches$rrbs <- as.numeric(matches$rrbs)
matches$wg <- as.numeric(matches$wg)
matches$diff <- matches$rrbs - matches$wg
head(matches)
So now I’ve got a data table that has shared location, RRBS methylation %, WG methaylation %, and the difference between RRBS - WG
I’m going to start with some pretty basic stuff, looking at the min, max, median, mean, and determining outliers based upon the 1.5x IQR away from the 1st and 3rd quartiles.
summary(matches$diff)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.880000 -0.037080 0.000000 -0.007731 0.029410 0.769600
upper.outlier <- (IQR(matches$diff) * 1.5) + quantile(matches$diff)[[4]]
lower.outlier = quantile(matches$diff)[[2]] - (IQR(matches$diff) * 1.5)
length(matches$diff[which(matches$diff < lower.outlier)])
[1] 8579
length(matches$diff[which(matches$diff > upper.outlier)])
[1] 6691
boxplot(matches$diff)

So those ~15,000 loci would be considered outliers based upon and the boxplot supports that idea, that most fall well within the 0 difference range, but there are some to either side.
AFter talking to Steven, it looks like I should mention that the 135WG raw data file is ~10.7gb, while the RRBS EPI-135 file is ~ 1.4gb, so that 10x difference in data sounds more believable.
Steven also asked about difference in coverage, and I realized I can’t answer that from the .bedgraph files I’ve been using, as they’re just percet methylation by loci. Back to the CG.output files from MethylExtract.
Below in a very messy way I Read them in and combine the Watson and Crick strands in to single columns of Methylation and Total Coverage.
Next, I want to look at total coverage depth between the two samples. This includes all sites in both samples.
mean(as.numeric(EPI_135$totcov))
[1] 21.17662
mean(as.numeric(EPI_135WG$totcov))
[1] 37.99779
So whe we look at all sites, the Whole Genome has nearly 2x the coverage as the RRBS. Next lets just look at sites that co-occur.
As always, we start by attaching scaffold and start index.
Since this is just a quick glance, I won’t pretty things up.
summary(as.numeric(merged_135$totcov.x))
Min. 1st Qu. Median Mean 3rd Qu. Max.
11.0 12.0 14.0 21.4 19.0 3323.0
summary(as.numeric(merged_135$totcov.y))
Min. 1st Qu. Median Mean 3rd Qu. Max.
11.0 41.0 65.0 105.4 101.0 13120.0
boxplot(as.numeric(merged_135$totcov.x))

boxplot(as.numeric(merged_135$totcov.y))

Hm. That’s very odd. Everything looks fairly believable until the third quartile, and the maxes are way crazy. After talking to Steven it sort of sounds like this may either be an artifact of Bismark, MethylExtract, or some deficiency in our reference genome. Still, something interesting to look at!
LS0tCnRpdGxlOiAiRXhwbG9yaW5nIHRoZSBFUEktMTM1IHZzLiBFUEktMTM1V0cgc2FtcGxlcyBtZXRoeWxhdGlvbiBwYXR0ZXJucyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKClNvIEhvbGxpZSBnYXZlIHVzIGFuIGludGVyZXN0aW5nIHNpZGUgbm90ZSB0byBsb29rIGF0IHdoZW4gc2hlIGRpZCBib3RoIGFuIFJSQlMgc2VxdWVuY2luZyBydW4gYXMgd2VsbCBhcyBhIHdob2xlIGdlbm9tZSBzZXF1ZW5jaW5nIHJ1biBvbiBTYW1wbGUgRVBJLTEzNS4gSSB3YW50ZWQgdG8ganVzdCBleHBsb3JlIGl0IGEgbGl0dGxlIGJpdCBhbmQgc2VlIGlmIHRoZXJlIGFyZSBhbnkgaW50ZXJlc3RpbmcgcGF0dGVybnMuCgpUaGUgdHdvIG1haW4gdGhpbmdzIHRoYXQgbGVhcCB0byBteSBtaW5kIGlzIEEpIGhvdyBtdWNoIG1vcmUgZGF0YSBkbyB5b3UgZ2V0IG91dCBvZiBXRyB2cyBSUkJTIGFuZCBCKSBob3cgZG9lcyB0aGF0IGRhdGEgZGlmZmVyIChEb2VzIFJSQlMgbm9ybWFsbHkgcmVhZCBhIGxvd2VyLCBlcXVhbCwgb3IgZ3JlYXRlciBtZXRoeWxhdGlvbiByYXRlIGF0IHNpdGVzIHNoYXJlZCBiZXR3ZWVuIHNlcXVlbmNpbmcgcnVucykuIAoKVGhpcyBtYXkgYmUgYWxsIGp1c3Qgc2F0aXNmeWluZyBteSBvd24gY3VyaXNvaXR5LCBhcyBJJ20gbm90IHN1cmUgaWYgaXQncyBwb3NzaWJsZSB0byBwYXJzZSBvdXQgdGhlIHNlcXVlbmNpbmcgZWZmZWN0cyB2cyB0aGUgUlJCUy9XRyBwcm9jZXNzIGVmZmVjdHMgYnV0IGl0J3MgZmFpcmx5IGVhc3kgdG8gZG8gYW5kIG1heSBiZSBpbnRlcmVzdGluZyEKCkFzIGFsd2F5cywgZmlyc3Qgd2UgbG9hZCBzb21lIHBhY2thZ2VzIGFuZCByZWFkIGluIHNvbWUgZGF0YS4gQWxzbywgYmVjYXVzZSBJJ20gdXNpbmcgLmJlZCBmaWxlcywgSSBhZGQgc29tZSBjb2x1bW4gbmFtZXMgdG8gbWFrZSBsaWZlIGVhc2llciBsYXRlciBvbi4gSSBjb252ZXJ0IHRoZW0gZnJvbSBkYXRhIGZyYW1lcyB0byBkYXRhIHRhYmxlcyB0byBtYWtlIG9wZXJhdGluZyBvbiB0aGVtIG1vcmUgZWZmaWNpZW50IGFsc28uIAoKYGBge3J9CmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZGF0YS50YWJsZSkKCldHIDwtIHJlYWRfZGVsaW0oIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvTWV0aHlsb21ldjIvRVBJLTEzNVdHX3BlcmNtZXRoLmJlZCIsIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgY29sX25hbWVzID0gRkFMU0UpCgpjb2xuYW1lcyhXRylbMTo0XSA8LSBjKCJzY2FmZiIsICJzdGFydCIsICJlbmQiLCAibWV0aCIpCgpXRyA8LSBhcy5kYXRhLnRhYmxlKFdHKQoKUlJCUyA8LSByZWFkX2RlbGltKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL01ldGh5bG9tZXYyL0VQSS0xMzVfcGVyY21ldGguYmVkIiwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IEZBTFNFLCAKICAgIHRyaW1fd3MgPSBUUlVFKQoKY29sbmFtZXMoUlJCUylbMTo0XSA8LSBjKCJzY2FmZiIsICJzdGFydCIsICJlbmQiLCAibWV0aCIpCgpSUkJTIDwtIGFzLmRhdGEudGFibGUoUlJCUykKCmBgYAoKCmBgYHtyfQoKbnJvdyhXRykKCm5yb3coUlJCUykKCgoKYGBgCgpXZWxsLCB0aGF0cyBhIHByZXR0eSBiaWcgZGlmZmVyZW5jZS4gSXQgbG9va3MgbGlrZSBXaG9sZSBHZW5vbWUgYmlzdWxmaXRlIHNlcXVlbmNpbmcgeWllbGRzIGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBtb3JlIG1ldGh5bGF0ZWQgc3BvdHMuCgpOZXh0IEkgd2VsZCB0b2dldGhlciB0aGUgU2NhZmZvbGQgbnVtYmVyIGFuZCBsb2NhdGlvbiB0byBtYWtlIGFuIGVhc2lseSBzZWFyY2hhYmxlIHZlY3Rvci4gCgpgYGB7cn0KUlJCUyRsb2MgPC0gcGFzdGUwKFJSQlMkc2NhZmYsICItIiwgUlJCUyRzdGFydCkKCldHJGxvYyA8LSBwYXN0ZTAoV0ckc2NhZmYsICItIiwgV0ckc3RhcnQpCgoKYGBgCgoKYGBge3J9CgpsZW5ndGgod2hpY2goV0ckbG9jICVpbiUgUlJCUyRsb2MgPT0gVFJVRSkpCgpgYGAKCkludGVyZXN0aW5nLiBTbyBpdCBsb29rcyBsaWtlIHRoZXJlJ3MgfjEwLDAwMCBsb2NpIGZvdW5kIGluIHRoZSBSUkJTIGRhdGEgc2V0IHRoYXQgYXJlbid0IGZvdW5kIGluIHRoZSBXRyBzZXF1ZW5jZS4gCgpMZXRzIHB1bGwgb3V0IGp1c3QgdGhlIFdHIGxvY2kgdGhhdCBhcmUgZm91bmQgaW4gdGhlIFJSQlMgc2FtcGxlLgoKYGBge3J9Cm1lcmdlKFJSQlMsIFdHLCBieSA9ICJsb2MiKSAtPiB0ZW1wCgptYXRjaGVzIDwtIGFzLmRhdGEudGFibGUoY2JpbmQodGVtcCRsb2MsIHRlbXAkbWV0aC54LCB0ZW1wJG1ldGgueSkpCgpjb2xuYW1lcyhtYXRjaGVzKVsxOjNdIDwtIGMoImxvYyIsICJycmJzIiwgIndnIikKCm1hdGNoZXMkcnJicyA8LSBhcy5udW1lcmljKG1hdGNoZXMkcnJicykKbWF0Y2hlcyR3ZyA8LSBhcy5udW1lcmljKG1hdGNoZXMkd2cpCgptYXRjaGVzJGRpZmYgPC0gbWF0Y2hlcyRycmJzIC0gbWF0Y2hlcyR3ZwoKCmhlYWQobWF0Y2hlcykKYGBgCgpTbyBub3cgSSd2ZSBnb3QgYSBkYXRhIHRhYmxlIHRoYXQgaGFzIHNoYXJlZCBsb2NhdGlvbiwgUlJCUyBtZXRoeWxhdGlvbiAlLCBXRyBtZXRoYXlsYXRpb24gJSwgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gUlJCUyAtIFdHCgoKSSdtIGdvaW5nIHRvIHN0YXJ0IHdpdGggc29tZSBwcmV0dHkgYmFzaWMgc3R1ZmYsIGxvb2tpbmcgYXQgdGhlIG1pbiwgbWF4LCBtZWRpYW4sIG1lYW4sIGFuZCBkZXRlcm1pbmluZyBvdXRsaWVycyBiYXNlZCB1cG9uIHRoZSAxLjV4IElRUiBhd2F5IGZyb20gdGhlIDFzdCBhbmQgM3JkIHF1YXJ0aWxlcy4gCmBgYHtyfQoKc3VtbWFyeShtYXRjaGVzJGRpZmYpCgp1cHBlci5vdXRsaWVyIDwtIChJUVIobWF0Y2hlcyRkaWZmKSAqIDEuNSkgKyBxdWFudGlsZShtYXRjaGVzJGRpZmYpW1s0XV0KCmxvd2VyLm91dGxpZXIgPSBxdWFudGlsZShtYXRjaGVzJGRpZmYpW1syXV0gLSAoSVFSKG1hdGNoZXMkZGlmZikgKiAxLjUpCgpgYGAKCgpgYGB7cn0KCmxlbmd0aChtYXRjaGVzJGRpZmZbd2hpY2gobWF0Y2hlcyRkaWZmIDwgbG93ZXIub3V0bGllcildKQpsZW5ndGgobWF0Y2hlcyRkaWZmW3doaWNoKG1hdGNoZXMkZGlmZiA+IHVwcGVyLm91dGxpZXIpXSkKCmJveHBsb3QobWF0Y2hlcyRkaWZmKQoKYGBgCgpTbyB0aG9zZSB+MTUsMDAwIGxvY2kgd291bGQgYmUgY29uc2lkZXJlZCBvdXRsaWVycyBiYXNlZCB1cG9uIGFuZCB0aGUgYm94cGxvdCBzdXBwb3J0cyB0aGF0IGlkZWEsIHRoYXQgbW9zdCBmYWxsIHdlbGwgd2l0aGluIHRoZSAwIGRpZmZlcmVuY2UgcmFuZ2UsIGJ1dCB0aGVyZSBhcmUgc29tZSB0byBlaXRoZXIgc2lkZS4KCgpBRnRlciB0YWxraW5nIHRvIFN0ZXZlbiwgaXQgbG9va3MgbGlrZSBJIHNob3VsZCBtZW50aW9uIHRoYXQgdGhlIDEzNVdHIHJhdyBkYXRhIGZpbGUgaXMgfjEwLjdnYiwgd2hpbGUgdGhlIFJSQlMgRVBJLTEzNSBmaWxlIGlzIH4gMS40Z2IsIHNvIHRoYXQgMTB4IGRpZmZlcmVuY2UgaW4gZGF0YSBzb3VuZHMgbW9yZSBiZWxpZXZhYmxlLiAKClN0ZXZlbiBhbHNvIGFza2VkIGFib3V0IGRpZmZlcmVuY2UgaW4gY292ZXJhZ2UsIGFuZCBJIHJlYWxpemVkIEkgY2FuJ3QgYW5zd2VyIHRoYXQgZnJvbSB0aGUgLmJlZGdyYXBoIGZpbGVzIEkndmUgYmVlbiB1c2luZywgYXMgdGhleSdyZSBqdXN0IHBlcmNldCBtZXRoeWxhdGlvbiBieSBsb2NpLiBCYWNrIHRvIHRoZSBDRy5vdXRwdXQgZmlsZXMgZnJvbSBNZXRoeWxFeHRyYWN0LiAKCkJlbG93IGluIGEgdmVyeSBtZXNzeSB3YXkgSSBSZWFkIHRoZW0gaW4gYW5kIGNvbWJpbmUgdGhlIFdhdHNvbiBhbmQgQ3JpY2sgc3RyYW5kcyBpbiB0byBzaW5nbGUgY29sdW1ucyBvZiBNZXRoeWxhdGlvbiBhbmQgVG90YWwgQ292ZXJhZ2UuIApgYGB7cn0KCnNldHdkKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL01ldGh5bG9tZXYyLyIpCiAgCiAgdGVtcCA8LSByZWFkX2RlbGltKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL01ldGh5bG9tZXYyL0VQSS0xMzVfQ0cub3V0cHV0LnR4dCIsIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgbmEgPSAiLiIpCiAgCiAgdGVtcCA8LSBuYS5vbWl0KHRlbXApCiAgCiAgdGVtcC4yIDwtIGFzLmRhdGEudGFibGUoY2JpbmQodGVtcCRgI0NIUk9NYCkpCiAgdGVtcC4yJHNsb2MgPC10ZW1wJFBPUyAtIDEKICB0ZW1wLjIkZWxvYyA8LSB0ZW1wJFBPUyAtIDEKICAKICB0ZW1wLjIkbWV0aCA8LSB0ZW1wJGBXYXRzb24gTUVUSGAgKyB0ZW1wJGBDcmljayBNRVRIYAogIHRlbXAuMiR0b3Rjb3YgPC0gdGVtcCRgV2F0c29uIENPVkVSQUdFYCArIHRlbXAkYENyaWNrIENPVkVSQUdFYCAgCiAgdGVtcC4zIDwtIHRlbXAuMlt0ZW1wLjIkdG90Y292ID4gMTAsXSAgICAKCiAgRVBJXzEzNSA8LSBhcy5kYXRhLnRhYmxlKGNiaW5kKHRlbXAuMyRWMSwgdGVtcC4zJHNsb2MsIHRlbXAuMyRlbG9jLCB0ZW1wLjMkbWV0aCwgdGVtcC4zJHRvdGNvdikpICAKICBjb2xuYW1lcyhFUElfMTM1KVsxOjVdIDwtIGMoInNjYWZmIiwgInN0YXJ0IiwgImVuZCIsICJtZXRoIiwgInRvdGNvdiIpCiAgCiAgCiAgCiB0ZW1wIDwtIHJlYWRfZGVsaW0ocGFzdGUwKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL01ldGh5bG9tZXYyL0VQSS0xMzVXR19DRy5vdXRwdXQiKSwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFLCBuYSA9ICIuIikKICAKICB0ZW1wIDwtIG5hLm9taXQodGVtcCkKICAKICB0ZW1wLjIgPC0gYXMuZGF0YS50YWJsZShjYmluZCh0ZW1wJGAjQ0hST01gKSkKICB0ZW1wLjIkc2xvYyA8LXRlbXAkUE9TIC0gMQogIHRlbXAuMiRlbG9jIDwtIHRlbXAkUE9TIC0gMQogIAogIHRlbXAuMiRtZXRoIDwtIHRlbXAkYFdhdHNvbiBNRVRIYCArIHRlbXAkYENyaWNrIE1FVEhgCiAgdGVtcC4yJHRvdGNvdiA8LSB0ZW1wJGBXYXRzb24gQ09WRVJBR0VgICsgdGVtcCRgQ3JpY2sgQ09WRVJBR0VgICAKICB0ZW1wLjMgPC0gdGVtcC4yW3RlbXAuMiR0b3Rjb3YgPiAxMCxdICAgIAoKICBFUElfMTM1V0cgPC0gYXMuZGF0YS50YWJsZShjYmluZCh0ZW1wLjMkVjEsIHRlbXAuMyRzbG9jLCB0ZW1wLjMkZWxvYywgdGVtcC4zJG1ldGgsIHRlbXAuMyR0b3Rjb3YpKSAgCiAgY29sbmFtZXMoRVBJXzEzNVdHKVsxOjVdIDwtIGMoInNjYWZmIiwgInN0YXJ0IiwgImVuZCIsICJtZXRoIiwgInRvdGNvdiIpCmBgYAoKYGBge3J9CgpoZWFkKEVQSV8xMzUpCmhlYWQoRVBJXzEzNVdHKQpgYGAKCk5leHQsIEkgd2FudCB0byBsb29rIGF0IHRvdGFsIGNvdmVyYWdlIGRlcHRoIGJldHdlZW4gdGhlIHR3byBzYW1wbGVzLiBUaGlzIGluY2x1ZGVzIGFsbCBzaXRlcyBpbiBib3RoIHNhbXBsZXMuCgpgYGB7cn0KCm1lYW4oYXMubnVtZXJpYyhFUElfMTM1JHRvdGNvdikpCgptZWFuKGFzLm51bWVyaWMoRVBJXzEzNVdHJHRvdGNvdikpCgpgYGAKClNvIHdoZSB3ZSBsb29rIGF0IGFsbCBzaXRlcywgdGhlIFdob2xlIEdlbm9tZSBoYXMgbmVhcmx5IDJ4IHRoZSBjb3ZlcmFnZSBhcyB0aGUgUlJCUy4gTmV4dCBsZXRzIGp1c3QgbG9vayBhdCBzaXRlcyB0aGF0IGNvLW9jY3VyLgoKQXMgYWx3YXlzLCB3ZSBzdGFydCBieSBhdHRhY2hpbmcgc2NhZmZvbGQgYW5kIHN0YXJ0IGluZGV4LiAKYGBge3J9CgpFUElfMTM1JGxvYyA8LSBwYXN0ZTAoRVBJXzEzNSRzY2FmZiwgIi0iLCBFUElfMTM1JHN0YXJ0KQoKRVBJXzEzNVdHJGxvYyA8LSBwYXN0ZTAoRVBJXzEzNVdHJHNjYWZmLCAiLSIsIEVQSV8xMzVXRyRzdGFydCkKCm1lcmdlZF8xMzUgPC0gbWVyZ2UoRVBJXzEzNSwgRVBJXzEzNVdHLCBieSA9ICJsb2MiKSAKCmhlYWQobWVyZ2VkXzEzNSkKCmBgYAoKU2luY2UgdGhpcyBpcyBqdXN0IGEgcXVpY2sgZ2xhbmNlLCBJIHdvbid0IHByZXR0eSB0aGluZ3MgdXAuCgpgYGB7cn0KCnN1bW1hcnkoYXMubnVtZXJpYyhtZXJnZWRfMTM1JHRvdGNvdi54KSkKc3VtbWFyeShhcy5udW1lcmljKG1lcmdlZF8xMzUkdG90Y292LnkpKQoKYm94cGxvdChhcy5udW1lcmljKG1lcmdlZF8xMzUkdG90Y292LngpKQpib3hwbG90KGFzLm51bWVyaWMobWVyZ2VkXzEzNSR0b3Rjb3YueSkpCmBgYAoKSG0uIFRoYXQncyB2ZXJ5IG9kZC4gRXZlcnl0aGluZyBsb29rcyBmYWlybHkgYmVsaWV2YWJsZSB1bnRpbCB0aGUgdGhpcmQgcXVhcnRpbGUsIGFuZCB0aGUgbWF4ZXMgYXJlIHdheSBjcmF6eS4gQWZ0ZXIgdGFsa2luZyB0byBTdGV2ZW4gaXQgc29ydCBvZiBzb3VuZHMgbGlrZSB0aGlzIG1heSBlaXRoZXIgYmUgYW4gYXJ0aWZhY3Qgb2YgQmlzbWFyaywgTWV0aHlsRXh0cmFjdCwgb3Igc29tZSBkZWZpY2llbmN5IGluIG91ciByZWZlcmVuY2UgZ2Vub21lLiBTdGlsbCwgc29tZXRoaW5nIGludGVyZXN0aW5nIHRvIGxvb2sgYXQhCgoK