library("biomaRt")
Genomic coorinates of voltage gated sodium channel subunit genes (SCN)
We will use the genomic assembly GRCh38.p12 for this exercise. We can obtain the necessary information about SCN genes from part 1 of this series.
However, we will use the following information (i.e., gene name, ENTREZ ID, chromosome number and coordinates) obtained from ENTREZ/NCBI:
“6323” = SCN1A Chromosome 2, NC_000002.12 (165989160..166149216, complement); “6326” = SCN2A Chromosome 2, NC_000002.12 (165208056..165392310); “6328” = SCN3A Chromosome 2, NC_000002.12 (165087520..165204295, complement); “6329” = SCN4A Chromosome 17, NC_000017.11 (63938554..63972918, complement); “6331” = SCN5A Chromosome 3, NC_000003.12 (38548061..38649673, complement); “6332” = SCN7A Chromosome 2, NC_000002.12 (166403573..166494264, complement); “6334” = SCN8A Chromosome 12, NC_000012.12 (51589958..51812864); “6335” = SCN9A Chromosome 2, NC_000002.12 (166195185..166375987, complement); “6336” = SCN10A Chromosome 3, NC_000003.12 (38697110..38794010, complement); “11280” = SCN11A Chromosome 3, NC_000003.12 (38845764..39051945, complement); “6324” = SCN1B Chromosome 19, NC_000019.10 (35030688..35040449); “6327” = SCN2B Chromosome 11, NC_000011.10 (118162804..118176622, complement); “55800” = SCN3B Chromosome 11, NC_000011.10 (123629187..123654607, complement); “6330” = SCN4B Chromosome 11, NC_000011.10 (118133377..118152915, complement)
Retrieve SNPs for SCN genes
hssnpmart = useMart(biomart = "ENSEMBL_MART_SNP", dataset="hsapiens_snp") # see listMarts() function
hssnpmart
Object of class 'Mart':
Using the ENSEMBL_MART_SNP BioMart database
Using the hsapiens_snp dataset
SCN1A SNPs
scn1a_snps_ncbi= getBM(attributes = c('refsnp_id','allele','chrom_start','chrom_strand'),
filters = c('chr_name','start','end'),
values = list(2, 165989160, 166149216),
mart = hssnpmart)
head(scn1a_snps_ncbi)
nrow(scn1a_snps_ncbi)
[1] 34896
SCN2A SNPs
nrow(scn2a_snps_ncbi)
[1] 38544
SCN3A SNPs
nrow(scn3a_snps_ncbi)
[1] 23674
SCN4A SNPs
nrow(scn4a_snps_ncbi)
[1] 9146
SCN5A SNPs
nrow(scn5a_snps_ncbi)
[1] 23278
SCN7A SNPs
nrow(scn7a_snps_ncbi)
[1] 20782
SCN8A SNPs
nrow(scn8a_snps_ncbi)
[1] 45703
SCN9A SNPs
nrow(scn9a_snps_ncbi)
[1] 40382
SCN10A SNPs
nrow(scn10a_snps_ncbi)
[1] 22914
SCN11A SNPs
nrow(scn11a_snps_ncbi)
[1] 43321
SCN1B SNPs
nrow(scn1b_snps_ncbi)
[1] 2343
SCN2B SNPs
nrow(scn2b_snps_ncbi)
[1] 3287
SCN3B SNPs
nrow(scn3b_snps_ncbi)
[1] 5624
SCN4B SNPs
nrow(scn4b_snps_ncbi)
[1] 4678
elementNROWS(scn4b_snps_ncbi)
refsnp_id allele chrom_start chrom_strand
4678 4678 4678 4678
A dataframe of the SCN reference SNPs
SCNsnps <- as.data.frame(cbind(scn1a_snps_ncbi$refsnp_id, scn2a_snps_ncbi$refsnp_id,
scn3a_snps_ncbi$refsnp_id, scn4a_snps_ncbi$refsnp_id,
scn5a_snps_ncbi$refsnp_id, scn7a_snps_ncbi$refsnp_id,
scn8a_snps_ncbi$refsnp_id, scn9a_snps_ncbi$refsnp_id,
scn10a_snps_ncbi$refsnp_id, scn11a_snps_ncbi$refsnp_id,
scn1b_snps_ncbi$refsnp_id, scn2b_snps_ncbi$refsnp_id,
scn3b_snps_ncbi$refsnp_id, scn4b_snps_ncbi$refsnp_id))
number of rows of result is not a multiple of vector length (arg 1)
head(SCNsnps)
dim(SCNsnps)
[1] 45703 14
Barplotting
scn_snp_counts
[1] 34896 38544 23674 9146 23278 20782 45703 40382 22914 43321 2343 3287 5624 4678
barplot(scn_snp_counts)

LS0tDQp0aXRsZTogIkEgY2F0YWxvZyBvZiBzaW5nbGUgbnVjbGVvdGlkZSBwb2x5bW9ycGhpc21zIChTTlBzKSBpbiB2b2x0YWdlIGdhdGVkIHNvZGl1bSBjaGFubmVsIHN1YnVuaXRzIg0KYXV0aG9yOiAiQmhhZ2lyYXRoaSBEYXNoIg0KZGF0ZTogIk5vdmVtYmVyIDI2LCAyMDE4Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KCJiaW9tYVJ0IikNCmBgYA0KDQojIyBHZW5vbWljIGNvb3JpbmF0ZXMgb2Ygdm9sdGFnZSBnYXRlZCBzb2RpdW0gY2hhbm5lbCBzdWJ1bml0IGdlbmVzIChTQ04pDQoNCldlIHdpbGwgdXNlIHRoZSBnZW5vbWljIGFzc2VtYmx5ICoqR1JDaDM4LnAxMioqIGZvciB0aGlzIGV4ZXJjaXNlLiBXZSBjYW4gb2J0YWluIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgU0NOIGdlbmVzIGZyb20gcGFydCAxIG9mIHRoaXMgc2VyaWVzLiANCg0KSG93ZXZlciwgd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiAoaS5lLiwgZ2VuZSBuYW1lLCBFTlRSRVogSUQsIGNocm9tb3NvbWUgbnVtYmVyIGFuZCBjb29yZGluYXRlcykgb2J0YWluZWQgZnJvbSBFTlRSRVovTkNCSToNCg0KIjYzMjMiID0gU0NOMUEgICAgQ2hyb21vc29tZSAyLCBOQ18wMDAwMDIuMTIgKDE2NTk4OTE2MC4uMTY2MTQ5MjE2LCBjb21wbGVtZW50KTsNCiI2MzI2IiA9IFNDTjJBICAgIENocm9tb3NvbWUgMiwgTkNfMDAwMDAyLjEyICgxNjUyMDgwNTYuLjE2NTM5MjMxMCk7DQoiNjMyOCIgPSBTQ04zQSAgICBDaHJvbW9zb21lIDIsIE5DXzAwMDAwMi4xMiAoMTY1MDg3NTIwLi4xNjUyMDQyOTUsIGNvbXBsZW1lbnQpOw0KIjYzMjkiID0gU0NONEEgICAgQ2hyb21vc29tZSAxNywgTkNfMDAwMDE3LjExICg2MzkzODU1NC4uNjM5NzI5MTgsIGNvbXBsZW1lbnQpOw0KIjYzMzEiID0gU0NONUEgICAgQ2hyb21vc29tZSAzLCBOQ18wMDAwMDMuMTIgKDM4NTQ4MDYxLi4zODY0OTY3MywgY29tcGxlbWVudCk7DQoiNjMzMiIgPSBTQ043QSAgICBDaHJvbW9zb21lIDIsIE5DXzAwMDAwMi4xMiAoMTY2NDAzNTczLi4xNjY0OTQyNjQsIGNvbXBsZW1lbnQpOw0KIjYzMzQiID0gU0NOOEEgICAgQ2hyb21vc29tZSAxMiwgTkNfMDAwMDEyLjEyICg1MTU4OTk1OC4uNTE4MTI4NjQpOw0KIjYzMzUiID0gU0NOOUEgICAgQ2hyb21vc29tZSAyLCBOQ18wMDAwMDIuMTIgKDE2NjE5NTE4NS4uMTY2Mzc1OTg3LCBjb21wbGVtZW50KTsNCiI2MzM2IiA9IFNDTjEwQSAgIENocm9tb3NvbWUgMywgTkNfMDAwMDAzLjEyICgzODY5NzExMC4uMzg3OTQwMTAsIGNvbXBsZW1lbnQpOw0KIjExMjgwIiA9IFNDTjExQSAgQ2hyb21vc29tZSAzLCBOQ18wMDAwMDMuMTIgKDM4ODQ1NzY0Li4zOTA1MTk0NSwgY29tcGxlbWVudCk7DQoiNjMyNCIgPSBTQ04xQiAgICBDaHJvbW9zb21lIDE5LCBOQ18wMDAwMTkuMTAgKDM1MDMwNjg4Li4zNTA0MDQ0OSk7DQoiNjMyNyIgPSBTQ04yQiAgICBDaHJvbW9zb21lIDExLCBOQ18wMDAwMTEuMTAgKDExODE2MjgwNC4uMTE4MTc2NjIyLCBjb21wbGVtZW50KTsNCiI1NTgwMCIgPSBTQ04zQiAgIENocm9tb3NvbWUgMTEsIE5DXzAwMDAxMS4xMCAoMTIzNjI5MTg3Li4xMjM2NTQ2MDcsIGNvbXBsZW1lbnQpOw0KIjYzMzAiID0gU0NONEIgICAgQ2hyb21vc29tZSAxMSwgTkNfMDAwMDExLjEwICgxMTgxMzMzNzcuLjExODE1MjkxNSwgY29tcGxlbWVudCkNCg0KIyMgUmV0cmlldmUgU05QcyBmb3IgU0NOIGdlbmVzDQoNCmBgYHtyIH0NCmhzc25wbWFydCA9IHVzZU1hcnQoYmlvbWFydCA9ICJFTlNFTUJMX01BUlRfU05QIiwgZGF0YXNldD0iaHNhcGllbnNfc25wIikgIyBzZWUgbGlzdE1hcnRzKCkgZnVuY3Rpb24NCmhzc25wbWFydA0KYGBgDQoNCiMjIyBTQ04xQSBTTlBzDQoNCmBgYHtyIH0NCnNjbjFhX3NucHNfbmNiaT0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoJ3JlZnNucF9pZCcsJ2FsbGVsZScsJ2Nocm9tX3N0YXJ0JywnY2hyb21fc3RyYW5kJyksDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBjKCdjaHJfbmFtZScsJ3N0YXJ0JywnZW5kJyksDQogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGxpc3QoMiwgMTY1OTg5MTYwLCAxNjYxNDkyMTYpLA0KICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gaHNzbnBtYXJ0KQ0KDQpoZWFkKHNjbjFhX3NucHNfbmNiaSkgDQpgYGANCg0KYGBge3J9DQpucm93KHNjbjFhX3NucHNfbmNiaSkNCmBgYA0KDQojIyMgU0NOMkEgU05Qcw0KDQpgYGB7ciB9DQpzY24yYV9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gYygnY2hyX25hbWUnLCdzdGFydCcsJ2VuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KDIsIDE2NTIwODA1NiwgMTY1MzkyMzEwKSwgDQogICAgICAgICAgICAgICAgICAgICAgIG1hcnQgPSBoc3NucG1hcnQpDQpoZWFkKHNjbjJhX3NucHNfbmNiaSkNCmBgYA0KDQpgYGB7cn0NCm5yb3coc2NuMmFfc25wc19uY2JpKQ0KYGBgDQoNCiMjIyBTQ04zQSBTTlBzDQoNCmBgYGB7cn0NCnNjbjNhX3NucHNfbmNiaT0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoJ3JlZnNucF9pZCcsJ2FsbGVsZScsJ2Nocm9tX3N0YXJ0JywnY2hyb21fc3RyYW5kJyksDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBjKCdjaHJfbmFtZScsJ3N0YXJ0JywnZW5kJyksDQogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGxpc3QoMiwgMTY1MDg3NTIwLCAxNjUyMDQyOTUpLA0KICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gaHNzbnBtYXJ0KQ0KaGVhZChzY24zYV9zbnBzX25jYmkpDQpgYGANCg0KYGBge3J9DQpucm93KHNjbjNhX3NucHNfbmNiaSkNCmBgYA0KDQojIyMgU0NONEEgU05Qcw0KDQpgYGBge3J9DQpzY240YV9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gYygnY2hyX25hbWUnLCdzdGFydCcsJ2VuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KDE3LCA2MzkzODU1NCwgNjM5NzI5MTgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgbWFydCA9IGhzc25wbWFydCkNCmhlYWQoc2NuNGFfc25wc19uY2JpKQ0KYGBgDQoNCmBgYHtyfQ0KbnJvdyhzY240YV9zbnBzX25jYmkpDQpgYGANCg0KIyMjIFNDTjVBIFNOUHMNCg0KYGBgYHtyfQ0Kc2NuNWFfc25wc19uY2JpPSBnZXRCTShhdHRyaWJ1dGVzID0gYygncmVmc25wX2lkJywnYWxsZWxlJywnY2hyb21fc3RhcnQnLCdjaHJvbV9zdHJhbmQnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycyA9IGMoJ2Nocl9uYW1lJywnc3RhcnQnLCdlbmQnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbGlzdCgzLCAzODU0ODA2MSwgMzg2NDk2NzMpLA0KICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gaHNzbnBtYXJ0KQ0KaGVhZChzY241YV9zbnBzX25jYmkpDQpgYGANCg0KYGBge3J9DQpucm93KHNjbjVhX3NucHNfbmNiaSkNCmBgYA0KDQojIyMgU0NON0EgU05Qcw0KDQpgYGBge3J9DQpzY243YV9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gYygnY2hyX25hbWUnLCdzdGFydCcsJ2VuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KDIsIDE2NjQwMzU3MywgMTY2NDk0MjY0KSwgDQogICAgICAgICAgICAgICAgICAgICAgIG1hcnQgPSBoc3NucG1hcnQpDQpoZWFkKHNjbjdhX3NucHNfbmNiaSkNCmBgYA0KDQpgYGB7cn0NCm5yb3coc2NuN2Ffc25wc19uY2JpKQ0KYGBgDQoNCiMjIyBTQ044QSBTTlBzDQoNCmBgYGB7cn0NCnNjbjhhX3NucHNfbmNiaT0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoJ3JlZnNucF9pZCcsJ2FsbGVsZScsJ2Nocm9tX3N0YXJ0JywnY2hyb21fc3RyYW5kJyksDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBjKCdjaHJfbmFtZScsJ3N0YXJ0JywnZW5kJyksDQogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGxpc3QoMTIsIDUxNTg5OTU4LCA1MTgxMjg2NCksIA0KICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gaHNzbnBtYXJ0KQ0KaGVhZChzY244YV9zbnBzX25jYmkpDQpgYGANCg0KYGBge3J9DQpucm93KHNjbjhhX3NucHNfbmNiaSkNCmBgYA0KDQojIyMgU0NOOUEgU05Qcw0KDQpgYGBge3J9DQpzY245YV9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gYygnY2hyX25hbWUnLCdzdGFydCcsJ2VuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KDIsIDE2NjE5NTE4NSwgMTY2Mzc1OTg3KSwgDQogICAgICAgICAgICAgICAgICAgICAgIG1hcnQgPSBoc3NucG1hcnQpDQpoZWFkKHNjbjlhX3NucHNfbmNiaSkNCmBgYA0KDQoNCmBgYHtyfQ0KbnJvdyhzY245YV9zbnBzX25jYmkpDQpgYGANCg0KIyMjIFNDTjEwQSBTTlBzDQoNCmBgYGB7cn0NCnNjbjEwYV9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycyA9IGMoJ2Nocl9uYW1lJywnc3RhcnQnLCdlbmQnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGxpc3QoMywgMzg2OTcxMTAsIDM4Nzk0MDEwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcnQgPSBoc3NucG1hcnQpDQpoZWFkKHNjbjEwYV9zbnBzX25jYmkpDQpgYGANCg0KYGBge3J9DQpucm93KHNjbjEwYV9zbnBzX25jYmkpDQpgYGANCg0KIyMjIFNDTjExQSBTTlBzDQoNCmBgYGB7cn0NCnNjbjExYV9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycyA9IGMoJ2Nocl9uYW1lJywnc3RhcnQnLCdlbmQnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGxpc3QoMywgMzg4NDU3NjQsIDM5MDUxOTQ1KSwgDQogICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gaHNzbnBtYXJ0KQ0KaGVhZChzY24xMWFfc25wc19uY2JpKQ0KYGBgDQoNCmBgYHtyfQ0KbnJvdyhzY24xMWFfc25wc19uY2JpKQ0KYGBgDQoNCiMjIyBTQ04xQiBTTlBzDQoNCmBgYGB7cn0NCnNjbjFiX3NucHNfbmNiaT0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoJ3JlZnNucF9pZCcsJ2FsbGVsZScsJ2Nocm9tX3N0YXJ0JywnY2hyb21fc3RyYW5kJyksDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBjKCdjaHJfbmFtZScsJ3N0YXJ0JywnZW5kJyksDQogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGxpc3QoMTksIDM1MDMwNjg4LCAzNTA0MDQ0OSksIA0KICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gaHNzbnBtYXJ0KQ0KaGVhZChzY24xYl9zbnBzX25jYmkpDQpgYGANCg0KYGBge3J9DQpucm93KHNjbjFiX3NucHNfbmNiaSkNCmBgYA0KDQojIyMgU0NOMkIgU05Qcw0KDQpgYGBge3J9DQpzY24yYl9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gYygnY2hyX25hbWUnLCdzdGFydCcsJ2VuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KDExLCAxMTgxNjI4MDQsIDExODE3NjYyMiksIA0KICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gaHNzbnBtYXJ0KQ0KaGVhZChzY24yYl9zbnBzX25jYmkpDQpgYGANCg0KYGBge3J9DQpucm93KHNjbjJiX3NucHNfbmNiaSkNCmBgYA0KDQojIyMgU0NOM0IgU05Qcw0KDQpgYGBge3J9DQpzY24zYl9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gYygnY2hyX25hbWUnLCdzdGFydCcsJ2VuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KDExLCAxMjM2MjkxODcsIDEyMzY1NDYwNyksIA0KICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gaHNzbnBtYXJ0KQ0KaGVhZChzY24zYl9zbnBzX25jYmkpDQpgYGANCg0KYGBge3J9DQpucm93KHNjbjNiX3NucHNfbmNiaSkNCmBgYA0KDQojIyMgU0NONEIgU05Qcw0KDQpgYGBge3J9DQpzY240Yl9zbnBzX25jYmk9IGdldEJNKGF0dHJpYnV0ZXMgPSBjKCdyZWZzbnBfaWQnLCdhbGxlbGUnLCdjaHJvbV9zdGFydCcsJ2Nocm9tX3N0cmFuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzID0gYygnY2hyX25hbWUnLCdzdGFydCcsJ2VuZCcpLA0KICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KDExLCAxMTgxMzMzNzcsIDExODE1MjkxNSksDQogICAgICAgICAgICAgICAgICAgICAgIG1hcnQgPSBoc3NucG1hcnQpDQpoZWFkKHNjbjRiX3NucHNfbmNiaSkNCmBgYA0KDQpgYGB7cn0NCm5yb3coc2NuNGJfc25wc19uY2JpKQ0KYGBgDQoNCmBgYHtyfQ0KZWxlbWVudE5ST1dTKHNjbjRiX3NucHNfbmNiaSkgDQpgYGANCg0KIyMgQSBkYXRhZnJhbWUgb2YgdGhlIFNDTiByZWZlcmVuY2UgU05Qcw0KDQpgYGB7cn0NClNDTnNucHMgPC0gYXMuZGF0YS5mcmFtZShjYmluZChzY24xYV9zbnBzX25jYmkkcmVmc25wX2lkLCBzY24yYV9zbnBzX25jYmkkcmVmc25wX2lkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjbjNhX3NucHNfbmNiaSRyZWZzbnBfaWQsIHNjbjRhX3NucHNfbmNiaSRyZWZzbnBfaWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NuNWFfc25wc19uY2JpJHJlZnNucF9pZCwgc2NuN2Ffc25wc19uY2JpJHJlZnNucF9pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY244YV9zbnBzX25jYmkkcmVmc25wX2lkLCBzY245YV9zbnBzX25jYmkkcmVmc25wX2lkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjbjEwYV9zbnBzX25jYmkkcmVmc25wX2lkLCBzY24xMWFfc25wc19uY2JpJHJlZnNucF9pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY24xYl9zbnBzX25jYmkkcmVmc25wX2lkLCBzY24yYl9zbnBzX25jYmkkcmVmc25wX2lkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjbjNiX3NucHNfbmNiaSRyZWZzbnBfaWQsIHNjbjRiX3NucHNfbmNiaSRyZWZzbnBfaWQpKQ0KYGBgDQoNCmBgYHtyfQ0KaGVhZChTQ05zbnBzKQ0KYGBgDQoNCmBgYHtyfQ0KZGltKFNDTnNucHMpDQpgYGANCg0KIyMgQmFycGxvdHRpbmcNCg0KYGBge3J9DQpzY25fc25wX2NvdW50cyA8LSBjKG5yb3coc2NuMWFfc25wc19uY2JpKSwgbnJvdyhzY24yYV9zbnBzX25jYmkpLCBucm93KHNjbjNhX3NucHNfbmNiaSksIG5yb3coc2NuNGFfc25wc19uY2JpKSwNCiAgICAgICAgICAgICAgICAgICAgbnJvdyhzY241YV9zbnBzX25jYmkpLCBucm93KHNjbjdhX3NucHNfbmNiaSksIG5yb3coc2NuOGFfc25wc19uY2JpKSwgbnJvdyhzY245YV9zbnBzX25jYmkpLA0KICAgICAgICAgICAgICAgICAgICBucm93KHNjbjEwYV9zbnBzX25jYmkpLCBucm93KHNjbjExYV9zbnBzX25jYmkpLCBucm93KHNjbjFiX3NucHNfbmNiaSksIG5yb3coc2NuMmJfc25wc19uY2JpKSwNCiAgICAgICAgICAgICAgICAgICAgbnJvdyhzY24zYl9zbnBzX25jYmkpLCBucm93KHNjbjRiX3NucHNfbmNiaSkpDQpzY25fc25wX2NvdW50cw0KYGBgDQoNCmBgYHtyfQ0KYmFycGxvdChzY25fc25wX2NvdW50cykNCmBgYA0KDQo=