Introduction

To get to this notebook please navigate your browser to 10x-tutorial/Jax_Workshop.nb.html on the web UI

The purpose of this tutorial will be to walk new users through some of the steps necessary to explore Whole Genome (WGS) and Whole Exome (WES) sequencing data generated form the 10x Genomics Chromium platform and the Longranger pipeline. We will investigate the Linked-Read data using a variety of tools, all of which are freely available either from 10x Genomics or their home repos (GitHub, SourceForge, etc.)

Things to know about this workshop

  1. All files that will be used can be found at: /opt/data/10x-data/
  2. The 10x Loupe browser can be found at your “Homepage”
  3. Reference genome for all samples is GRCh37/hg19
  4. .bam files are only for chr21
  5. .vcf and Loupe files contain information for the entire genome
  6. Full data sets are available on the Longranger Datasets Site
  7. All 10x software including Longranger, Supernova, and Loupe can be downloaded from the 10x Support Site

10x Chromium Workflow Overview

Figure 1. Chromium Genome Workflow

Logging in: Jax Workshow AWS instance

Instructors will take care of this

Once you’ve logged in your home directory should look like this

cd /home/ubuntu
sequser@ip-172-31-63-156:/home/ubuntu$ ls -l
total 36
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr  2 17:44 10x-bam-files
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr 10 21:34 10x-loupe-files
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr 11 06:21 10x-tutorial
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr 11 16:35 10x-vcf-files
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr 11 16:20 figures
drwxrwxr-x  3 ubuntu ubuntu 4096 Mar 30 21:02 igv
drwxrwxr-x 15 ubuntu ubuntu 4096 Apr  2 18:33 miniconda2
drwxrwxr-x  2 ubuntu ubuntu 4096 Mar 30 17:38 misc
drwxr-xr-x  3 ubuntu ubuntu 4096 Apr 11 14:23 R

On Windows you’ll probably need an application like PuTTy

Getting Started 10x

Okay, you’ve done your Chromium prep, sent it through your favorite Illumina (or BGI) sequencer and now you’ve got a BCL file. What’s next?

BCL to FASTQ

The instructions to convert BCL to FASTQ can be found here

An example bcl to do some testing on can be found in /opt/data/10x-data/tiny-bcl-2.0.0

Let’s do the conversion

nohup longranger mkfastq --id=tiny-bcl \
                   --run=/opt/data/10x-data/tiny-bcl-2.0.0 \
                   --csv=/opt/data/10x-data/tiny-bcl-simple-2.1.0.csv \
                   --localmem=4 >& mkftq.out &

You should see something like this as the output. Note: All 10x pipelines run under the Martian Framework. In the 10x universe a pipeline is the software you run (e.g.. Longranger) and a pipestance is the functional directory that is created that the pipeline uses while it’s running.

longranger mkfastq (2.2.2)
Copyright (c) 2018 10x Genomics, Inc.  All rights reserved.
-------------------------------------------------------------------------------

Martian Runtime - '2.2.2-2.3.2'
Serving UI at http://bespin1.fuzzplex.com:35831

Running preflight checks (please wait)...
Checking run folder...
Checking RunInfo.xml...
Checking system environment...
Checking barcode whitelist...
Checking read specification...
Checking samplesheet specs...
Checking for dual index flowcell...
2018-04-11 13:09:16 [runtime] (ready)           ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET
2018-04-11 13:09:19 [runtime] (split_complete)  ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET
2018-04-11 13:09:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET.fork0.chnk0.main
2018-04-11 13:09:25 [runtime] (chunks_complete) ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET
2018-04-11 13:09:28 [runtime] (join_complete)   ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET
2018-04-11 13:09:31 [runtime] (ready)           ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET
2018-04-11 13:09:31 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET.fork0.split
2018-04-11 13:09:34 [runtime] (split_complete)  ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET
2018-04-11 13:09:34 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET.fork0.chnk0.main
2018-04-11 13:10:07 [runtime] (chunks_complete) ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET
2018-04-11 13:10:07 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET.fork0.join
2018-04-11 13:10:10 [runtime] (join_complete)   ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET
2018-04-11 13:10:13 [runtime] (ready)           ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY
2018-04-11 13:10:13 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.split
2018-04-11 13:10:19 [runtime] (split_complete)  ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY
2018-04-11 13:10:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.chnk0.main
2018-04-11 13:10:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.chnk1.main
2018-04-11 13:10:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.chnk2.main
2018-04-11 13:10:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.chnk3.main
2018-04-11 13:11:49 [runtime] (chunks_complete) ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY
2018-04-11 13:11:49 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.join

Outputs:
- Run QC metrics:        /mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/qc_summary.json
- FASTQ output folder:   /mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/fastq_path
- Interop output folder: /mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/interop_path
- Input samplesheet:     /mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/input_samplesheet.csv

Waiting 6 seconds for UI to do final refresh.
Pipestance completed successfully!

Saving pipestance info to tiny-bcl/tiny-bcl.mri.tgz

Your fastqs will be in the flowcell directory H77WWBBXX. All undetermined reads are stored in the ‘Undetermined’ fastqs. These can be automatically deleted by running longranger mkfastq with the --delete-undetermined flag.

Alignment

You’ve got your fastqs made. Let’s do a small alignment. Even though 10x currently recommends using GATK for Longranger alignments freebayes is already baked in so we’ll use that for our example.

Note: The reasons for using GATK over freebayes are many but it boils down to better variant calling and Indel sensitivity/specificity which, among other things, leads to better phasing. This can have downstream effects on SV calling as well. A detailed report of the latest version of Longranger and the advantages that GATK provides over freebayes can be found on bioRxiv.

nohup longranger wgs --id=Sample_example \
                 --fastqs=/mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/fastq_path/H77WWBBXX/Sample \
                 --reference=/mnt/opt/refdata_new/hg19-2.2.0/ \
                 --localmem=4
                 --vcmode=freebayes >& wgs.out &

Your output should look something like this as it runs. Make sure to check out the UI where your pipestance is running. This is an interactive workflow that has lots of information contained within it.

longranger wgs (2.2.2)
Copyright (c) 2018 10x Genomics, Inc.  All rights reserved.
-------------------------------------------------------------------------------

Martian Runtime - '2.2.2-2.3.2'
Serving UI at http://bespin1.fuzzplex.com:41335?auth=tRqwdXhvQ8vlyWHd6os8ccZ2GXgzYuDKfdYQaxnkZn0

Running preflight checks (please wait)...
2018-04-11 13:31:41 [runtime] (ready)           ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._COMBINED_SV_CALLER._TERMINAL_CNV_CALLER.PREPARE_TERMINAL_CNV_GT_AND_BINSIZE
2018-04-11 13:31:41 [runtime] (ready)           ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._SNPINDEL_PHASER.SORT_GROUND_TRUTH
2018-04-11 13:31:44 [runtime] (ready)           ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._LINKED_READS_ALIGNER._FASTQ_PREP_NEW.SETUP_CHUNKS
2018-04-11 13:31:44 [runtime] (split_complete)  ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._SNPINDEL_PHASER.SORT_GROUND_TRUTH
2018-04-11 13:31:44 [runtime] (run:local)       ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._SNPINDEL_PHASER.SORT_GROUND_TRUTH.fork0.chnk0.main
2018-04-11 13:31:44 [runtime] (split_complete)  ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._COMBINED_SV_CALLER._TERMINAL_CNV_CALLER.PREPARE_TERMINAL_CNV_GT_AND_BINSIZE
2018-04-11 13:31:44 [runtime] (run:local)       ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._COMBINED_SV_CALLER._TERMINAL_CNV_CALLER.PREPARE_TERMINAL_CNV_GT_AND_BINSIZE.fork0.chnk0.main

Example Pipestance

Figure 2. Example WGS pipestance. Each bubble is an analysis stage and all lines represent passage of data from one state to another. Whenever possible stages are broken into chunks to allow for parallel processing of data.


Longranger Outputs

The 10x .bam

General 10x .bam information

The 10x/Linked-Read .bam file contains much of the same information that a typical short read .bam would, but like the VCF has some extra information. Documents covering the the 10x .bam spec can be found here

If we take a look we can see some interesting features:

cd /home/ubuntu/10x-bam-files
samtools view -h NA12878_chr21_phased_possorted_exome_bam.bam | less
@PG     ID:lariat       PN:longranger.lariat    CL:lariat -reads=/mnt/analysis/marsoc/pipestances/HGKNJBBXX/PHASER_SVCALLER_EXOME_PD/49255/1016.1.1-0/PHASER_SVCALLER_EXOME_PD/PHASER_SVCALLER_EXOME/_LINKED_READS_ALIGNER/_FASTQ_PREP_NEW/SORT_FASTQS/fork0/join-u29c07c9de1/fi
les/chunk-0.fasth.gz -read_groups=49255:MissingLibrary:1:unknown_fc:0 -genome=/mnt/opt/refdata_new/hg19-2.0.0/fasta/genome.fa -sample_id=49255 -threads=4 -centromeres=/mnt/opt/refdata_new/hg19-2.0.0/regions/centromeres.tsv -trim_length=7 -first_chunk=True -output=/mnt/ana
lysis/marsoc/pipestances/HGKNJBBXX/PHASER_SVCALLER_EXOME_PD/49255/1016.1.1-0/PHASER_SVCALLER_EXOME_PD/PHASER_SVCALLER_EXOME/_LINKED_READS_ALIGNER/BARCODE_AWARE_ALIGNER/fork0/chnk000-u29c07c9e62/files VN:'576387f'
@PG     ID:attach_phasing       PN:longranger.attach_phasing    PP:lariat       VN:1016.1.1
@PG     ID:longranger   PN:longranger   PP:attach_phasing       VN:1016.1.1
@CO     10x_bam_to_fastq:R1(RX:QX,TR:TQ,SEQ:QUAL)
@CO     10x_bam_to_fastq:R2(SEQ:QUAL)
@CO     10x_bam_to_fastq:I1(BC:QT)
ST-K00126:334:HGKNJBBXX:4:2118:26920:14519      163     chr21   9412940 39      92M8S   =       9412953 90      GGAGTTGTATTGGTGCAGGAAGGGGAGTTTGATTTAATGAAACAATGCATTAAAAATTTGTATTCACTTTGTGATTCAATGATAGTCAATGTTAACATAA    AAA<FAJFFJJJJJJJJJJFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJFAFF<FJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ    RX:Z:GACACATCAGCTGTTA   QX:Z:AAFFFJJJJJJJJJJJ   BC:Z:TCTCGGGC   QT:Z:AAFFFJJJ   XS:i:-13        AS:i:-9 XM:A:0  AM:A:0  XT:i:0  BX:Z:GACACATCAGCTGTTA-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39
ST-K00126:334:HGKNJBBXX:4:2118:26920:14519      83      chr21   9412953 39      77M     =       9412940 -90     TGCAGGAAGGGGAGTTTGATTTAATGAAACAATGCATTAAAAATTTGTATTCACTTTGTGATTCAATGATAGTCAAT   FJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJ
RX:Z:GACACATCAGCTGTTA   QX:Z:AAFFFJJJJJJJJJJJ   TR:Z:TGTTAAC    TQ:Z:JJJJJJJ    BC:Z:TCTCGGGC   QT:Z:AAFFFJJJ   XS:i:-13        AS:i:-9 XM:A:0  AM:A:0  XT:i:0  BX:Z:GACACATCAGCTGTTA-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39
ST-K00126:334:HGKNJBBXX:4:1114:32644:45010      99      chr21   9413248 39      77M     =       9413263 115     TGAATATTTTCTCAGCAACTGTGGTGTTATGATATATATTGGTTTTCATCCCCAGTTCCTGGCTTATAACTCCCCTA   FF<J<FJJJ-J<JFAJFJJAJ-A-<7<A--FJ-AJJJFFFFJF-<FFF-F--7A<FF-<AF<JA-A-JJ-<<7FFF<
RX:Z:NAGGGTGAGGCATGGT   QX:Z:#<<AAFFJJFJJA<J<   TR:Z:TTCCGCA    TQ:Z:<FJJJFA    BC:Z:TCTCGGGC   QT:Z:AAAFFJJJ   XS:i:-12        AS:i:-8 XM:A:0  AM:A:0  XT:i:0  BX:Z:AAGGGTGAGGCATGGT-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39

Things to look for:

  • BX tag such as BX:Z:GACACATCAGCTGTTA-1
    • Barcode associated with a tag

Note: Definitions of all the .bam tags can be found here

Informatics Tip: if you’d like to search for all the reads associated with a list of barcodes, this is the fastest way to do it (will need ripgrep which is installed on your AWS instance)

samtools view -@ 5 possorted_exome_bam.bam | rg -j 5 --no-line-number -F -f BX_list.txt > BC_reads.sam





Some 10x users have also asked about local de novo assembly of a locus of interest. An example workflow for that (completely unsupported) workflow can be found here.

<embed src="http://34.205.68.94/figures/WGS-LocalReassemblyWorkflow-090218-1929.pdf">
    This browser does not support PDFs. Please download the PDF to view it: <a href="http://34.205.68.94/figures/WGS-LocalReassemblyWorkflow-090218-1929.pdf">Download PDF</a>.</p>
</embed>

The 10x VCF

Special aspects

There are a few things that that make the 10x VCF unique. Overall 10x abides by the VCF 4.x standard. However, there is some additional information that takes advantage of the 10x specific technology. Documents covering the the 10x VCF spec can be found here. A comprehensive list of the available outputs of Longranger can be found here.

If we navigate to a 10x VCF and have a look

cd /home/ubuntu/10x-vcf-files
ubuntu@ip-172-31-63-156:~/10x-vcf-files$ ls
total 1014M
-rw-rw-r-- 1 ubuntu ubuntu  43M Apr 11 16:34 NA12878_wes_varcalls.vcf.gz
-rw-rw-r-- 1 ubuntu ubuntu 882K Apr 11 16:34 NA12878_wes_varcalls.vcf.gz.tbi
-rw-rw-r-- 1 ubuntu ubuntu 968M Apr  2 18:46 NA12878_wgs_varcalls.vcf.gz
-rw-rw-r-- 1 ubuntu ubuntu 1.9M Apr  2 18:42 NA12878_wgs_varcalls.vcf.gz.tbi
zcat NA12878_wes_varcalls.vcf.gz | less

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  49255
chr1    12198   .       G       C       1355.77 PASS    AC=2;AF=1.0;AN=2;BaseQRankSum=0.132;ClippingRankSum=0.0;DP=42;ExcessHet=3.0103;FS=0.0;MLEAC=2;MLEAF=1.0;MQ=53.23;MQRankSum=1.593;QD=32.28;ReadPosRankSum=1.653;SOR=0.286;MUMAP_REF=3.73913;MUMAP_ALT=24.775;AO=34;RO=0
;MMD=0.885642;RESCUED=1;NOT_RESCUED=102;HAPLOCALLED=0     GT:AD:DP:GQ:PL:BX:PS    1|1:1,41:42:92:1384,92,0:,AACTCCCTCTTGGTAG-1_74;TTGCGTCAGACGCCCT-1_74;GTACATGAGGTGCGTA-1_65;TAAGGCTCAAGGGTGT-1_74;CACAGTACACATTGGT-1_74_74;GCAAACTGTAAACGGC-1_70;CGGATTATCTGAACTG-1_70;ATGCA
ACTCTCCCAAC-1_60;CATCGGGTCATAACCG-1_74;ACACAACAGAGAGGCG-1_74;GTAGTCAAGGCCGAAT-1_74;TGCATCCTCGTCTGAA-1_74;ATCATGGTCATCGAGT-1_70;CAGCTAACAAGAGTCG-1_60_70;GGGCCATTCTACAAGC-1_55;GTGACCGTCACAGCCG-1_70;GTTTCATGTACGAGAC-1_74;TTAGTCTAGCTAAGTA-1_74_55_74;GTCGACGCACTAAGGG-1_74;GC
GCTGAAGCGATTAA-1_45;TGCAACAGTTCTGTTT-1_70;GGCAACCAGAGACTAT-1_70;CGCACTTTCCATCGTC-1_74_74;GGCGACTAGCGTGTGA-1_74;TAGGCGCCAGGTCAAG-1_74;TGCTAAGAGGTTTCGT-1_74_74;GTCCTCATCTTCCTTC-1_74;ACTGAGTGTCCATTGA-1_74:12198
chr1    12305   .       C       T       18.82   PASS    AC=1;AF=0.5;AN=2;BaseQRankSum=1.097;ClippingRankSum=0.0;DP=12;ExcessHet=3.0103;FS=0.0;MLEAC=1;MLEAF=0.5;MQ=51.41;MQRankSum=-0.23;QD=1.71;ReadPosRankSum=-0.253;SOR=0.086;MUMAP_REF=13.6977;MUMAP_ALT=15.6667;AO=2;RO=9;MMD=0.901709;RESCUED=0;NOT_RESCUED=49;HAPLOCALLED=0      GT:AD:DP:GQ:PL:BX:PS:PQ:JQ      0/1:9,2:11:47:47,0,315:TTAGTCTAGCTAAGTA-1_70;GTCGACGCACTAAGGG-1_74;ACCACGGCATACAGAA-1_55;ACACAACAGAGAGGCG-1_70;TGCATCCTCGTCTGAA-1_65;CGCACTTTCCATCGTC-1_74;ACTGGGCGTCCATCCT-1_74;GTGCTCTCAAGTACAA-1_70;GGCGACTAGCGTGTGA-1_70,GTAGTCAAGGCCGAAT-1_74;ATCATGGTCATCGAGT-1_74:1:10:255
chr1    12383   .       G       A       172.74  PASS    AC=1;AF=0.5;AN=2;BaseQRankSum=-0.674;ClippingRankSum=0.0;DP=9;ExcessHet=3.0103;FS=6.021;MLEAC=1;MLEAF=0.5;MQ=49.26;MQRankSum=0.887;QD=21.59;ReadPosRankSum=-0.489;SOR=2.526;MUMAP_REF=7.0;MUMAP_ALT=26.4706;AO=8;RO=0;MMD=0.898793;RESCUED=0;NOT_RESCUED=21;HAPLOCALLED=0       GT:AD:DP:GQ:PL:BX:PS:PQ:JQ      1|0:1,7:8:6:200,0,6:,GAAATGAAGTTTCTTC-1_60;ACCACGGCATACAGAA-1_74;TTGCGTCAGACGCCCT-1_74;AGGAGACCATGTATGC-1_55;TGCATCCTCGTCTGAA-1_74;GCAAACTGTAAACGGC-1_70;GACGCGTGTCCTCGGA-1_45;TCCATCGAGGGCGAAG-1_70:1:44:36

Not only do you see some of the typical things

  • chr, pos
  • REF, ALT
  • QUAL
  • FILTER
    • PASS
    • Reason for filtering

You can also see some of the extra 10x “stuff”. Mostly in the FORMAT field

  • BX
    • Barcodes of reads associated with an given variant
    • First set of ; separated barcodes cover the first allele followed by a , which separates barcodes associated with reads covering the second allele
  • PS
    • phase set
      • Information about the phase block for with the variant is assigned

This extra information can be very useful for looking at variants that may or may not be in cis or trans. This can be especially useful if you have compound heterozygote variants. All the alleles on one side of the separator (|) with the same PS are from the same haplotype (thus same parent).

Note: For GT, | represents a phased variant \ represents an unphased variant. Definitions of all the VCF tags are available here

Informatics Tip: If have a variant of interest and you’d like to look at all the SNPs within the same phaseblock (for example chr16 2042353 in NA12878_wes_varcalls.vcf.gz) you you can simply run

  • zcat NA12878_wes_varcalls.vcf.gz | rg '1308074'

This will output all called SNPs, both filtered and unfiltered, that land in the paseblock of interest. SNPs with the same PS number are in cis with each other. This is very informative when you have a potential compound variant.

The 10x VCF is fully compatible with downstream analysis tools such as Variant Effect Predictor, snpEFF, and Gemini to name a few.


Exploring 10x Data

Exploring the 10x data via Integrated Geonome Browser (IGV) from the Broad Institute

IGV is one of the most common tools used in the field of genomics to view a variety of different data types. If you do not have IGV (on your laptop not your terminal), or don’t have the latest version (2.4), please download and install it from either home-brew brew install igv or conda conda install igv. If you don’t use conda or home-brew IGV can be manually install here: https://software.broadinstitute.org/software/igv/download.

Note: Type which igv will show you where IGV has been installed. You can navigate to that directory and click on igv.jar.

First open IGV and load the 10x data. There are two .bam files that can be explored. Here’s a snapshot of the 10x-bam-files directory

ubuntu@ip-172-31-63-156:~/10x-bam-files$ ls /home/ubuntu/10x-bam-files
total 1.3G
-rw-rw-r-- 1 ubuntu ubuntu  64M Apr  2 17:37 NA12878_chr21_phased_possorted_exome_bam.bam
-rw-rw-r-- 1 ubuntu ubuntu  83K Apr  2 17:37 NA12878_chr21_phased_possorted_exome_bam.bam.bai
-rw-rw-r-- 1 ubuntu ubuntu 1.2G Apr  2 17:41 NA12878_chr21_phased_possorted_WGS_bam.bam
-rw-rw-r-- 1 ubuntu ubuntu 116K Apr  2 17:37 NA12878_chr21_phased_possorted_WGS_bam.bam.bai
-rw-rw-r-- 1 ubuntu ubuntu  891 Apr  2 17:44 README.md

In order to load one of the .bam files follow the following steps.

  1. Navigate your browser to /10x-bam-files/ directory on the ftp
  2. Copy the link address for one of the .bam files
  3. Open IGV
  4. Click File -> Load from URL
    • Do the same thing for the corresponding .vcf.gz if you’d like
  5. Paste the copied link address into the first box (you will not need to paste anything into the second box)
  6. Navigate to your favorite gene on chr21
    • Maybe CBS

Depending on what view you are in you might see reads paired in a variety of different ways. To show some of the special features of the 10x data:

  1. Right click on the cell to the left ending in “bam.bam”
  2. Select “View linked reads (BX)”

To view the benefit of phasing navigate to chr21:44,485,330-44,485,370

This will order the reads by barcode and, if possible, show phasing of the region that you are investigating. Groups of reads will be “linked” to each other by the individual barcodes associated with the single molecule that the reads originated from. The reads and barcodes will also be separated into phased haplotypes 1 (red) and 2 (blue). Those reads that could not be phased are represented by grey lines. These unphased reads are still useful and are utilized in most steps of Longranger.

Some things to keep in mind when thinking about 10x data

  1. Input material MATTERS
    • The old adage “Put junk in get junk out” applies here
    • Linked-Read data can be generated from shorter fragments and much of the enhance utility is retained but the longer DNA input length the better
  2. Not only will you have “read coverage” at any given locus you will also have physical, or barcode, coverage
    • This enables enhanced Structural Variant detection from what is otherwise short-read data
  3. Phasing is completely dependent on
    • SNV variation in the given region
    • Accessibility to that region

Exploring the 10x data via the Loupe Browser by 10x Genomics

The Loupe Browser is a 10x specific genome browser that more fully captures some of the enhanced information that Linked-Reads will get you in your WGS or WES experiments. Loupe is fully integrated into the Longranger pipeline and .loupe files are automatically generated by default.

If you look at the 10x-loupe-files directory you can see three loupe files to explore.

ubuntu@ip-172-31-63-156:~/10x-loupe-files$ ls /home/ubuntu/10x-loupe-files
total 422M
-rw-rw-r-- 1 ubuntu ubuntu  40M Dec  8 09:02 LungTumorT.loupe
-rw-rw-r-- 1 ubuntu ubuntu 383M Apr 10 20:05 NA12878_exome.loupe

The Loupe main page

First let’s go to the Loupe browser and click on NA12878_exome.loupe. This will bring us to the main page of Loupe which looks like this.

Figure 3. The Loupe main page. Loupe is a 10x Genomics genome browser specifically designed to visualize 10x Linked-Read data.

As you can see we have some nice statistics about the performance of our sequencing experiment including:

  • The number of genes phased
    • Fraction of genes (<100kb long) that are contained within a single phase block.
  • Phase-block information
    • SNPs Phased
      • Percentage of heterozygous SNPs that were phased.
    • Longest Phase Block
      • Length of the longest phase block.
    • N50 Phase Block
      • Half of the genome was phased into phase blocks of at least this length.
  • Molecule length distribution (we’ll work on recreating this)
  • GEM statistics

Haplotype View

Let’s navigate to chr17:41,074,530-41,399,282

Figure 4. Haplotypes view in the Loupe genome browser.

There are a lot of “clickable” features to see here:

  • An annotation track
  • Coverage track in green
  • Exome bait targets (blue bars)
  • Variants

Figure 5. Variant types represented in Loupe genome browser.

  • Phase-blocks (black)
    • Breaks in phasing do not have black box around them

Linked-Read View

Here you can see a similar output to that of IGV but it is a bit more digestible for viewing linked reads.

Figure 6. Linked-Read view in the Loupe genome browser. Haplotype 1 is shown in yellow, haplotype 2 is shown in purple. Grey reads/barcodes could not be assigned to a haplotype

Once again, we can see reads clearly phased by haplotype and reads that do not get phased in grey.

  • In Lariat mode, Loupe colors reads based on their alignment properties:
    • Reads with a MAPQ less than 30 are colored grey
    • Reads with a high mapq that uniquely aligned are colored black
    • Reads with a high mapq that lariat was able to align because of their linkage to other reads are colored green.

Linked-Read View

If we open up the NA12878_wgs.loupe file, navigate to chr2:34,595,838-34,795,838, and click on Linked-Reads we can very clearly see a hemizygous deletion in both the

Linked-Read View

Figure 7. Hemizygous deletion example. View of a deletion on chr2 showing phased reads absent in haplotype 1 and present in haplotype 2.


More Info

Structural Variants View

There is a whole other world of investigating SVs in 10x data. If we look at the Structural Variant View in Loupe We can see some nice examples SVs.

    2 34,695,830  AC073218...DEL
93  
    2 34,736,552  AC073218...40.7 kb    





Application Note of SV view

<embed src="http://34.205.68.94/figures/LIT00014_RevA_Structural_Variant_Analysis_Application_Note_Digital.pdf">
    This browser does not support PDFs. Please download the PDF to view it: <a href="http://34.205.68.94/figures/LIT00014_RevA_Structural_Variant_Analysis_Application_Note_Digital.pdf">Download PDF</a>.</p>
</embed>





10x Genomics Software

All 10x specific software and information about 10x specific file formats can be found here

LS0tCnRpdGxlOiAiMTB4IEdlbm9taWNzIEJpb2luZm9ybWF0aWMgV29ya3Nob3AgXG4gXG4gSmFja3NvbiBMYWJzIDIwMTgiCmF1dGhvcjogJ1tTdGVwaGVuIFdpbGxpYW1zLCBQaEQuXShtYWlsdG86c3RlcGhlbi53aWxsaWFtc0AxMHhnZW5vbWljcy5jb20pIDEweCBHZW5vbWljcwogIEFwcGxpY2F0aW9ucyBTY2llbnRpc3QnCmRhdGU6ICdDb21waWxlZDogYHIgZm9ybWF0KFN5cy5EYXRlKCksICIlQiAlZCwgJVkiKWAnCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgaW5jbHVkZXM6CiAgICAgIGFmdGVyX2JvZHk6IGZvb3Rlci5odG1sCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBjYWNoZSA9IEZBTFNFLAogIGNhY2hlLmxhenkgPSBGQUxTRSwKICB0aWR5ID0gVFJVRQopCmBgYAoKIyAqKkludHJvZHVjdGlvbioqCgoqKlRvIGdldCB0byB0aGlzIG5vdGVib29rIHBsZWFzZSBuYXZpZ2F0ZSB5b3VyIGJyb3dzZXIgdG8gMTB4LXR1dG9yaWFsL0pheF9Xb3Jrc2hvcC5uYi5odG1sIG9uIHRoZSB3ZWIgVUkqKgoKVGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCB3aWxsIGJlIHRvIHdhbGsgbmV3IHVzZXJzIHRocm91Z2ggc29tZSBvZiB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvIGV4cGxvcmUgV2hvbGUgR2Vub21lIChXR1MpIGFuZCBXaG9sZSBFeG9tZSAoV0VTKSBzZXF1ZW5jaW5nIGRhdGEgZ2VuZXJhdGVkIGZvcm0gdGhlIDEweCBHZW5vbWljcyBDaHJvbWl1bSBwbGF0Zm9ybSBhbmQgdGhlIFtMb25ncmFuZ2VyIHBpcGVsaW5lXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9waXBlbGluZXMvbGF0ZXN0L3doYXQtaXMtbG9uZy1yYW5nZXIpLiBXZSB3aWxsIGludmVzdGlnYXRlIHRoZSBMaW5rZWQtUmVhZCBkYXRhIHVzaW5nIGEgdmFyaWV0eSBvZiB0b29scywgYWxsIG9mIHdoaWNoIGFyZSBmcmVlbHkgYXZhaWxhYmxlIGVpdGhlciBmcm9tIFsxMHggR2Vub21pY3NdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL292ZXJ2aWV3L3dlbGNvbWUpIG9yIHRoZWlyIGhvbWUgcmVwb3MgKEdpdEh1YiwgU291cmNlRm9yZ2UsIGV0Yy4pICAKCioqVGhpbmdzIHRvIGtub3cgYWJvdXQgdGhpcyB3b3Jrc2hvcCoqCgoxLiBBbGwgZmlsZXMgdGhhdCB3aWxsIGJlIHVzZWQgY2FuIGJlIGZvdW5kIGF0OiBgL29wdC9kYXRhLzEweC1kYXRhL2AKMi4gVGhlIDEweCBMb3VwZSBicm93c2VyIGNhbiBiZSBmb3VuZCBhdCB5b3VyICJIb21lcGFnZSIKMy4gUmVmZXJlbmNlIGdlbm9tZSBmb3IgYWxsIHNhbXBsZXMgaXMgR1JDaDM3L2hnMTkKNC4gLmJhbSBmaWxlcyBhcmUgb25seSBmb3IgY2hyMjEKNS4gLnZjZiBhbmQgTG91cGUgZmlsZXMgY29udGFpbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudGlyZSBnZW5vbWUKNi4gRnVsbCBkYXRhIHNldHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgW0xvbmdyYW5nZXIgRGF0YXNldHMgU2l0ZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9nZW5vbWUtZXhvbWUvZGF0YXNldHMpCjcuIEFsbCAxMHggc29mdHdhcmUgaW5jbHVkaW5nIFtMb25ncmFuZ2VyXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9kb3dubG9hZHMvbGF0ZXN0KSwgW1N1cGVybm92YV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9kZS1ub3ZvLWFzc2VtYmx5L3NvZnR3YXJlL2Rvd25sb2Fkcy9sYXRlc3QpLCBhbmQgW0xvdXBlXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9kb3dubG9hZHMvbGF0ZXN0KSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBbMTB4IFN1cHBvcnQgU2l0ZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS8pIAoKKioqCgojICoqMTB4IENocm9taXVtIFdvcmtmbG93IE92ZXJ2aWV3KioKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy8xMHhfdGVjaC5wbmcpCkZpZ3VyZSAxLiBDaHJvbWl1bSBHZW5vbWUgV29ya2Zsb3cKCiMgKipMb2dnaW5nIGluOiBKYXggV29ya3Nob3cgQVdTIGluc3RhbmNlKioKCioqSW5zdHJ1Y3RvcnMgd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyoqCgpPbmNlIHlvdSd2ZSBsb2dnZWQgaW4geW91ciBob21lIGRpcmVjdG9yeSBzaG91bGQgbG9vayBsaWtlIHRoaXMKYGBgCmNkIC9ob21lL3VidW50dQpzZXF1c2VyQGlwLTE3Mi0zMS02My0xNTY6L2hvbWUvdWJ1bnR1JCBscyAtbAp0b3RhbCAzNgpkcnd4cnd4ci14ICAyIHVidW50dSB1YnVudHUgNDA5NiBBcHIgIDIgMTc6NDQgMTB4LWJhbS1maWxlcwpkcnd4cnd4ci14ICAyIHVidW50dSB1YnVudHUgNDA5NiBBcHIgMTAgMjE6MzQgMTB4LWxvdXBlLWZpbGVzCmRyd3hyd3hyLXggIDIgdWJ1bnR1IHVidW50dSA0MDk2IEFwciAxMSAwNjoyMSAxMHgtdHV0b3JpYWwKZHJ3eHJ3eHIteCAgMiB1YnVudHUgdWJ1bnR1IDQwOTYgQXByIDExIDE2OjM1IDEweC12Y2YtZmlsZXMKZHJ3eHJ3eHIteCAgMiB1YnVudHUgdWJ1bnR1IDQwOTYgQXByIDExIDE2OjIwIGZpZ3VyZXMKZHJ3eHJ3eHIteCAgMyB1YnVudHUgdWJ1bnR1IDQwOTYgTWFyIDMwIDIxOjAyIGlndgpkcnd4cnd4ci14IDE1IHVidW50dSB1YnVudHUgNDA5NiBBcHIgIDIgMTg6MzMgbWluaWNvbmRhMgpkcnd4cnd4ci14ICAyIHVidW50dSB1YnVudHUgNDA5NiBNYXIgMzAgMTc6MzggbWlzYwpkcnd4ci14ci14ICAzIHVidW50dSB1YnVudHUgNDA5NiBBcHIgMTEgMTQ6MjMgUgpgYGAKCk9uIFdpbmRvd3MgeW91J2xsIHByb2JhYmx5IG5lZWQgYW4gYXBwbGljYXRpb24gbGlrZSBbUHVUVHldKGh0dHBzOi8vd3d3LnB1dHR5Lm9yZy8pCgojICoqR2V0dGluZyBTdGFydGVkIDEweCoqCgpPa2F5LCB5b3UndmUgZG9uZSB5b3VyIENocm9taXVtIHByZXAsIHNlbnQgaXQgdGhyb3VnaCB5b3VyIGZhdm9yaXRlIElsbHVtaW5hIChvciBCR0kpIHNlcXVlbmNlciBhbmQgbm93IHlvdSd2ZSBnb3QgYSBCQ0wgZmlsZS4gV2hhdCdzIG5leHQ/CgojIyBCQ0wgdG8gRkFTVFEKClRoZSBpbnN0cnVjdGlvbnMgdG8gY29udmVydCBCQ0wgdG8gRkFTVFEgY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9waXBlbGluZXMvbGF0ZXN0L3VzaW5nL21rZmFzdHEpCgpBbiBleGFtcGxlIGJjbCB0byBkbyBzb21lIHRlc3Rpbmcgb24gY2FuIGJlIGZvdW5kIGluIGAvb3B0L2RhdGEvMTB4LWRhdGEvdGlueS1iY2wtMi4wLjBgCgpMZXQncyBkbyB0aGUgY29udmVyc2lvbgoKYGBgCm5vaHVwIGxvbmdyYW5nZXIgbWtmYXN0cSAtLWlkPXRpbnktYmNsIFwKICAgICAgICAgICAgICAgICAgIC0tcnVuPS9vcHQvZGF0YS8xMHgtZGF0YS90aW55LWJjbC0yLjAuMCBcCiAgICAgICAgICAgICAgICAgICAtLWNzdj0vb3B0L2RhdGEvMTB4LWRhdGEvdGlueS1iY2wtc2ltcGxlLTIuMS4wLmNzdiBcCiAgICAgICAgICAgICAgICAgICAtLWxvY2FsbWVtPTQgPiYgbWtmdHEub3V0ICYKYGBgCgpZb3Ugc2hvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGlzIGFzIHRoZSBvdXRwdXQuIApfTm90ZTpfIEFsbCAxMHggcGlwZWxpbmVzIHJ1biB1bmRlciB0aGUgW01hcnRpYW4gRnJhbWV3b3JrXShodHRwOi8vbWFydGlhbi1sYW5nLm9yZy8pLiBJbiB0aGUgMTB4IHVuaXZlcnNlIGEgcGlwZWxpbmUgaXMgdGhlIHNvZnR3YXJlIHlvdSBydW4gKGUuZy4uIExvbmdyYW5nZXIpIGFuZCBhIHBpcGVzdGFuY2UgaXMgdGhlIGZ1bmN0aW9uYWwgZGlyZWN0b3J5IHRoYXQgaXMgY3JlYXRlZCB0aGF0IHRoZSBwaXBlbGluZSB1c2VzIHdoaWxlIGl0J3MgcnVubmluZy4KCmBgYApsb25ncmFuZ2VyIG1rZmFzdHEgKDIuMi4yKQpDb3B5cmlnaHQgKGMpIDIwMTggMTB4IEdlbm9taWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpNYXJ0aWFuIFJ1bnRpbWUgLSAnMi4yLjItMi4zLjInClNlcnZpbmcgVUkgYXQgaHR0cDovL2Jlc3BpbjEuZnV6enBsZXguY29tOjM1ODMxCgpSdW5uaW5nIHByZWZsaWdodCBjaGVja3MgKHBsZWFzZSB3YWl0KS4uLgpDaGVja2luZyBydW4gZm9sZGVyLi4uCkNoZWNraW5nIFJ1bkluZm8ueG1sLi4uCkNoZWNraW5nIHN5c3RlbSBlbnZpcm9ubWVudC4uLgpDaGVja2luZyBiYXJjb2RlIHdoaXRlbGlzdC4uLgpDaGVja2luZyByZWFkIHNwZWNpZmljYXRpb24uLi4KQ2hlY2tpbmcgc2FtcGxlc2hlZXQgc3BlY3MuLi4KQ2hlY2tpbmcgZm9yIGR1YWwgaW5kZXggZmxvd2NlbGwuLi4KMjAxOC0wNC0xMSAxMzowOToxNiBbcnVudGltZV0gKHJlYWR5KSAgICAgICAgICAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuUFJFUEFSRV9TQU1QTEVTSEVFVAoyMDE4LTA0LTExIDEzOjA5OjE5IFtydW50aW1lXSAoc3BsaXRfY29tcGxldGUpICBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5QUkVQQVJFX1NBTVBMRVNIRUVUCjIwMTgtMDQtMTEgMTM6MDk6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLlBSRVBBUkVfU0FNUExFU0hFRVQuZm9yazAuY2huazAubWFpbgoyMDE4LTA0LTExIDEzOjA5OjI1IFtydW50aW1lXSAoY2h1bmtzX2NvbXBsZXRlKSBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5QUkVQQVJFX1NBTVBMRVNIRUVUCjIwMTgtMDQtMTEgMTM6MDk6MjggW3J1bnRpbWVdIChqb2luX2NvbXBsZXRlKSAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLlBSRVBBUkVfU0FNUExFU0hFRVQKMjAxOC0wNC0xMSAxMzowOTozMSBbcnVudGltZV0gKHJlYWR5KSAgICAgICAgICAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuQkNMMkZBU1RRX1dJVEhfU0FNUExFU0hFRVQKMjAxOC0wNC0xMSAxMzowOTozMSBbcnVudGltZV0gKHJ1bjpsb2NhbCkgICAgICAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuQkNMMkZBU1RRX1dJVEhfU0FNUExFU0hFRVQuZm9yazAuc3BsaXQKMjAxOC0wNC0xMSAxMzowOTozNCBbcnVudGltZV0gKHNwbGl0X2NvbXBsZXRlKSAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuQkNMMkZBU1RRX1dJVEhfU0FNUExFU0hFRVQKMjAxOC0wNC0xMSAxMzowOTozNCBbcnVudGltZV0gKHJ1bjpsb2NhbCkgICAgICAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuQkNMMkZBU1RRX1dJVEhfU0FNUExFU0hFRVQuZm9yazAuY2huazAubWFpbgoyMDE4LTA0LTExIDEzOjEwOjA3IFtydW50aW1lXSAoY2h1bmtzX2NvbXBsZXRlKSBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5CQ0wyRkFTVFFfV0lUSF9TQU1QTEVTSEVFVAoyMDE4LTA0LTExIDEzOjEwOjA3IFtydW50aW1lXSAocnVuOmxvY2FsKSAgICAgICBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5CQ0wyRkFTVFFfV0lUSF9TQU1QTEVTSEVFVC5mb3JrMC5qb2luCjIwMTgtMDQtMTEgMTM6MTA6MTAgW3J1bnRpbWVdIChqb2luX2NvbXBsZXRlKSAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLkJDTDJGQVNUUV9XSVRIX1NBTVBMRVNIRUVUCjIwMTgtMDQtMTEgMTM6MTA6MTMgW3J1bnRpbWVdIChyZWFkeSkgICAgICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWQoyMDE4LTA0LTExIDEzOjEwOjEzIFtydW50aW1lXSAocnVuOmxvY2FsKSAgICAgICBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5NQUtFX1FDX1NVTU1BUlkuZm9yazAuc3BsaXQKMjAxOC0wNC0xMSAxMzoxMDoxOSBbcnVudGltZV0gKHNwbGl0X2NvbXBsZXRlKSAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuTUFLRV9RQ19TVU1NQVJZCjIwMTgtMDQtMTEgMTM6MTA6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWS5mb3JrMC5jaG5rMC5tYWluCjIwMTgtMDQtMTEgMTM6MTA6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWS5mb3JrMC5jaG5rMS5tYWluCjIwMTgtMDQtMTEgMTM6MTA6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWS5mb3JrMC5jaG5rMi5tYWluCjIwMTgtMDQtMTEgMTM6MTA6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWS5mb3JrMC5jaG5rMy5tYWluCjIwMTgtMDQtMTEgMTM6MTE6NDkgW3J1bnRpbWVdIChjaHVua3NfY29tcGxldGUpIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWQoyMDE4LTA0LTExIDEzOjExOjQ5IFtydW50aW1lXSAocnVuOmxvY2FsKSAgICAgICBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5NQUtFX1FDX1NVTU1BUlkuZm9yazAuam9pbgoKT3V0cHV0czoKLSBSdW4gUUMgbWV0cmljczogICAgICAgIC9tbnQvaG9tZS9zdGVwaGVuL3lhcmQvSmF4X3dvcmtzaG9wL0xvbmdyYW5nZXIvdGlueS1iY2wvb3V0cy9xY19zdW1tYXJ5Lmpzb24KLSBGQVNUUSBvdXRwdXQgZm9sZGVyOiAgIC9tbnQvaG9tZS9zdGVwaGVuL3lhcmQvSmF4X3dvcmtzaG9wL0xvbmdyYW5nZXIvdGlueS1iY2wvb3V0cy9mYXN0cV9wYXRoCi0gSW50ZXJvcCBvdXRwdXQgZm9sZGVyOiAvbW50L2hvbWUvc3RlcGhlbi95YXJkL0pheF93b3Jrc2hvcC9Mb25ncmFuZ2VyL3RpbnktYmNsL291dHMvaW50ZXJvcF9wYXRoCi0gSW5wdXQgc2FtcGxlc2hlZXQ6ICAgICAvbW50L2hvbWUvc3RlcGhlbi95YXJkL0pheF93b3Jrc2hvcC9Mb25ncmFuZ2VyL3RpbnktYmNsL291dHMvaW5wdXRfc2FtcGxlc2hlZXQuY3N2CgpXYWl0aW5nIDYgc2Vjb25kcyBmb3IgVUkgdG8gZG8gZmluYWwgcmVmcmVzaC4KUGlwZXN0YW5jZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IQoKU2F2aW5nIHBpcGVzdGFuY2UgaW5mbyB0byB0aW55LWJjbC90aW55LWJjbC5tcmkudGd6CmBgYAoKWW91ciBmYXN0cXMgd2lsbCBiZSBpbiB0aGUgZmxvd2NlbGwgZGlyZWN0b3J5IGBINzdXV0JCWFhgLiBBbGwgdW5kZXRlcm1pbmVkIHJlYWRzIGFyZSBzdG9yZWQgaW4gdGhlICdVbmRldGVybWluZWQnIGZhc3Rxcy4gVGhlc2UgY2FuIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCBieSBydW5uaW5nIGBsb25ncmFuZ2VyIG1rZmFzdHFgIHdpdGggdGhlIGAtLWRlbGV0ZS11bmRldGVybWluZWRgIGZsYWcuCgojIyAqKkFsaWdubWVudCoqCgpZb3UndmUgZ290IHlvdXIgZmFzdHFzIG1hZGUuIExldCdzIGRvIGEgc21hbGwgYWxpZ25tZW50LiBFdmVuIHRob3VnaCAxMHggY3VycmVudGx5IHJlY29tbWVuZHMgdXNpbmcgR0FUSyBmb3IgTG9uZ3JhbmdlciBhbGlnbm1lbnRzIGZyZWViYXllcyBpcyBhbHJlYWR5IGJha2VkIGluIHNvIHdlJ2xsIHVzZSB0aGF0IGZvciBvdXIgZXhhbXBsZS4KCl9Ob3RlXzogVGhlIHJlYXNvbnMgZm9yIHVzaW5nIEdBVEsgb3ZlciBmcmVlYmF5ZXMgYXJlIG1hbnkgYnV0IGl0IGJvaWxzIGRvd24gdG8gYmV0dGVyIHZhcmlhbnQgY2FsbGluZyBhbmQgSW5kZWwgc2Vuc2l0aXZpdHkvc3BlY2lmaWNpdHkgd2hpY2gsIGFtb25nIG90aGVyIHRoaW5ncywgbGVhZHMgdG8gYmV0dGVyIHBoYXNpbmcuIFRoaXMgY2FuIGhhdmUgZG93bnN0cmVhbSBlZmZlY3RzIG9uIFNWIGNhbGxpbmcgYXMgd2VsbC4gQSBkZXRhaWxlZCByZXBvcnQgb2YgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIExvbmdyYW5nZXIgYW5kIHRoZSBhZHZhbnRhZ2VzIHRoYXQgR0FUSyBwcm92aWRlcyBvdmVyIGZyZWViYXllcyBjYW4gYmUgZm91bmQgb24gW2Jpb1J4aXZdKGh0dHBzOi8vd3d3LmJpb3J4aXYub3JnL2NvbnRlbnQvZWFybHkvMjAxOC8wMS8wOS8yMzA5NDYuZnVsbC5wZGYraHRtbCkuCgpgYGAKbm9odXAgbG9uZ3JhbmdlciB3Z3MgLS1pZD1TYW1wbGVfZXhhbXBsZSBcCiAgICAgICAgICAgICAgICAgLS1mYXN0cXM9L21udC9ob21lL3N0ZXBoZW4veWFyZC9KYXhfd29ya3Nob3AvTG9uZ3Jhbmdlci90aW55LWJjbC9vdXRzL2Zhc3RxX3BhdGgvSDc3V1dCQlhYL1NhbXBsZSBcCiAgICAgICAgICAgICAgICAgLS1yZWZlcmVuY2U9L21udC9vcHQvcmVmZGF0YV9uZXcvaGcxOS0yLjIuMC8gXAogICAgICAgICAgICAgICAgIC0tbG9jYWxtZW09NAogICAgICAgICAgICAgICAgIC0tdmNtb2RlPWZyZWViYXllcyA+JiB3Z3Mub3V0ICYKYGBgCgpZb3VyIG91dHB1dCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzIGFzIGl0IHJ1bnMuIE1ha2Ugc3VyZSB0byBjaGVjayBvdXQgdGhlIFVJIHdoZXJlIHlvdXIgcGlwZXN0YW5jZSBpcyBydW5uaW5nLiBUaGlzIGlzIGFuIGludGVyYWN0aXZlIHdvcmtmbG93IHRoYXQgaGFzIGxvdHMgb2YgaW5mb3JtYXRpb24gY29udGFpbmVkIHdpdGhpbiBpdC4KCmBgYApsb25ncmFuZ2VyIHdncyAoMi4yLjIpCkNvcHlyaWdodCAoYykgMjAxOCAxMHggR2Vub21pY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk1hcnRpYW4gUnVudGltZSAtICcyLjIuMi0yLjMuMicKU2VydmluZyBVSSBhdCBodHRwOi8vYmVzcGluMS5mdXp6cGxleC5jb206NDEzMzU/YXV0aD10UnF3ZFhodlE4dmx5V0hkNm9zOGNjWjJHWGd6WXVES2ZkWVFheG5rWm4wCgpSdW5uaW5nIHByZWZsaWdodCBjaGVja3MgKHBsZWFzZSB3YWl0KS4uLgoyMDE4LTA0LTExIDEzOjMxOjQxIFtydW50aW1lXSAocmVhZHkpICAgICAgICAgICBJRC5TYW1wbGVfZXhhbXBsZS5QSEFTRVJfU1ZDQUxMRVJfQ1MuUEhBU0VSX1NWQ0FMTEVSLl9DT01CSU5FRF9TVl9DQUxMRVIuX1RFUk1JTkFMX0NOVl9DQUxMRVIuUFJFUEFSRV9URVJNSU5BTF9DTlZfR1RfQU5EX0JJTlNJWkUKMjAxOC0wNC0xMSAxMzozMTo0MSBbcnVudGltZV0gKHJlYWR5KSAgICAgICAgICAgSUQuU2FtcGxlX2V4YW1wbGUuUEhBU0VSX1NWQ0FMTEVSX0NTLlBIQVNFUl9TVkNBTExFUi5fU05QSU5ERUxfUEhBU0VSLlNPUlRfR1JPVU5EX1RSVVRICjIwMTgtMDQtMTEgMTM6MzE6NDQgW3J1bnRpbWVdIChyZWFkeSkgICAgICAgICAgIElELlNhbXBsZV9leGFtcGxlLlBIQVNFUl9TVkNBTExFUl9DUy5QSEFTRVJfU1ZDQUxMRVIuX0xJTktFRF9SRUFEU19BTElHTkVSLl9GQVNUUV9QUkVQX05FVy5TRVRVUF9DSFVOS1MKMjAxOC0wNC0xMSAxMzozMTo0NCBbcnVudGltZV0gKHNwbGl0X2NvbXBsZXRlKSAgSUQuU2FtcGxlX2V4YW1wbGUuUEhBU0VSX1NWQ0FMTEVSX0NTLlBIQVNFUl9TVkNBTExFUi5fU05QSU5ERUxfUEhBU0VSLlNPUlRfR1JPVU5EX1RSVVRICjIwMTgtMDQtMTEgMTM6MzE6NDQgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELlNhbXBsZV9leGFtcGxlLlBIQVNFUl9TVkNBTExFUl9DUy5QSEFTRVJfU1ZDQUxMRVIuX1NOUElOREVMX1BIQVNFUi5TT1JUX0dST1VORF9UUlVUSC5mb3JrMC5jaG5rMC5tYWluCjIwMTgtMDQtMTEgMTM6MzE6NDQgW3J1bnRpbWVdIChzcGxpdF9jb21wbGV0ZSkgIElELlNhbXBsZV9leGFtcGxlLlBIQVNFUl9TVkNBTExFUl9DUy5QSEFTRVJfU1ZDQUxMRVIuX0NPTUJJTkVEX1NWX0NBTExFUi5fVEVSTUlOQUxfQ05WX0NBTExFUi5QUkVQQVJFX1RFUk1JTkFMX0NOVl9HVF9BTkRfQklOU0laRQoyMDE4LTA0LTExIDEzOjMxOjQ0IFtydW50aW1lXSAocnVuOmxvY2FsKSAgICAgICBJRC5TYW1wbGVfZXhhbXBsZS5QSEFTRVJfU1ZDQUxMRVJfQ1MuUEhBU0VSX1NWQ0FMTEVSLl9DT01CSU5FRF9TVl9DQUxMRVIuX1RFUk1JTkFMX0NOVl9DQUxMRVIuUFJFUEFSRV9URVJNSU5BTF9DTlZfR1RfQU5EX0JJTlNJWkUuZm9yazAuY2huazAubWFpbgpgYGAKCiMjIyAqKkV4YW1wbGUgUGlwZXN0YW5jZSoqCgohW10oaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL0xvbmdyYW5nZXJfcGlwZXN0YW5jZS5wbmcpCkZpZ3VyZSAyLiBFeGFtcGxlIFdHUyBwaXBlc3RhbmNlLiBFYWNoIGJ1YmJsZSBpcyBhbiBhbmFseXNpcyBzdGFnZSBhbmQgYWxsIGxpbmVzIHJlcHJlc2VudCBwYXNzYWdlIG9mIGRhdGEgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlci4gV2hlbmV2ZXIgcG9zc2libGUgc3RhZ2VzIGFyZSBicm9rZW4gaW50byBjaHVua3MgdG8gYWxsb3cgZm9yIHBhcmFsbGVsIHByb2Nlc3Npbmcgb2YgZGF0YS4KCioqKgoKIyAqKkxvbmdyYW5nZXIgT3V0cHV0cyoqCgojICoqVGhlIDEweCAuYmFtKioKCiMjIEdlbmVyYWwgMTB4IC5iYW0gaW5mb3JtYXRpb24KClRoZSAxMHgvTGlua2VkLVJlYWQgLmJhbSBmaWxlIGNvbnRhaW5zIG11Y2ggb2YgdGhlIHNhbWUgaW5mb3JtYXRpb24gdGhhdCBhIHR5cGljYWwgc2hvcnQgcmVhZCAuYmFtIHdvdWxkLCBidXQgbGlrZSB0aGUgVkNGIGhhcyBzb21lIGV4dHJhIGluZm9ybWF0aW9uLiBEb2N1bWVudHMgY292ZXJpbmcgdGhlIHRoZSAxMHggLmJhbSBzcGVjIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9nZW5vbWUtZXhvbWUvc29mdHdhcmUvcGlwZWxpbmVzL2xhdGVzdC9vdXRwdXQvYmFtKSAgCgpJZiB3ZSB0YWtlIGEgbG9vayB3ZSBjYW4gc2VlIHNvbWUgaW50ZXJlc3RpbmcgZmVhdHVyZXM6IAoKYGBgCmNkIC9ob21lL3VidW50dS8xMHgtYmFtLWZpbGVzCnNhbXRvb2xzIHZpZXcgLWggTkExMjg3OF9jaHIyMV9waGFzZWRfcG9zc29ydGVkX2V4b21lX2JhbS5iYW0gfCBsZXNzCmBgYApgYGAKQFBHICAgICBJRDpsYXJpYXQgICAgICAgUE46bG9uZ3Jhbmdlci5sYXJpYXQgICAgQ0w6bGFyaWF0IC1yZWFkcz0vbW50L2FuYWx5c2lzL21hcnNvYy9waXBlc3RhbmNlcy9IR0tOSkJCWFgvUEhBU0VSX1NWQ0FMTEVSX0VYT01FX1BELzQ5MjU1LzEwMTYuMS4xLTAvUEhBU0VSX1NWQ0FMTEVSX0VYT01FX1BEL1BIQVNFUl9TVkNBTExFUl9FWE9NRS9fTElOS0VEX1JFQURTX0FMSUdORVIvX0ZBU1RRX1BSRVBfTkVXL1NPUlRfRkFTVFFTL2ZvcmswL2pvaW4tdTI5YzA3YzlkZTEvZmkKbGVzL2NodW5rLTAuZmFzdGguZ3ogLXJlYWRfZ3JvdXBzPTQ5MjU1Ok1pc3NpbmdMaWJyYXJ5OjE6dW5rbm93bl9mYzowIC1nZW5vbWU9L21udC9vcHQvcmVmZGF0YV9uZXcvaGcxOS0yLjAuMC9mYXN0YS9nZW5vbWUuZmEgLXNhbXBsZV9pZD00OTI1NSAtdGhyZWFkcz00IC1jZW50cm9tZXJlcz0vbW50L29wdC9yZWZkYXRhX25ldy9oZzE5LTIuMC4wL3JlZ2lvbnMvY2VudHJvbWVyZXMudHN2IC10cmltX2xlbmd0aD03IC1maXJzdF9jaHVuaz1UcnVlIC1vdXRwdXQ9L21udC9hbmEKbHlzaXMvbWFyc29jL3BpcGVzdGFuY2VzL0hHS05KQkJYWC9QSEFTRVJfU1ZDQUxMRVJfRVhPTUVfUEQvNDkyNTUvMTAxNi4xLjEtMC9QSEFTRVJfU1ZDQUxMRVJfRVhPTUVfUEQvUEhBU0VSX1NWQ0FMTEVSX0VYT01FL19MSU5LRURfUkVBRFNfQUxJR05FUi9CQVJDT0RFX0FXQVJFX0FMSUdORVIvZm9yazAvY2huazAwMC11MjljMDdjOWU2Mi9maWxlcyBWTjonNTc2Mzg3ZicKQFBHICAgICBJRDphdHRhY2hfcGhhc2luZyAgICAgICBQTjpsb25ncmFuZ2VyLmF0dGFjaF9waGFzaW5nICAgIFBQOmxhcmlhdCAgICAgICBWTjoxMDE2LjEuMQpAUEcgICAgIElEOmxvbmdyYW5nZXIgICBQTjpsb25ncmFuZ2VyICAgUFA6YXR0YWNoX3BoYXNpbmcgICAgICAgVk46MTAxNi4xLjEKQENPICAgICAxMHhfYmFtX3RvX2Zhc3RxOlIxKFJYOlFYLFRSOlRRLFNFUTpRVUFMKQpAQ08gICAgIDEweF9iYW1fdG9fZmFzdHE6UjIoU0VROlFVQUwpCkBDTyAgICAgMTB4X2JhbV90b19mYXN0cTpJMShCQzpRVCkKU1QtSzAwMTI2OjMzNDpIR0tOSkJCWFg6NDoyMTE4OjI2OTIwOjE0NTE5ICAgICAgMTYzICAgICBjaHIyMSAgIDk0MTI5NDAgMzkgICAgICA5Mk04UyAgID0gICAgICAgOTQxMjk1MyA5MCAgICAgIEdHQUdUVEdUQVRUR0dUR0NBR0dBQUdHR0dBR1RUVEdBVFRUQUFUR0FBQUNBQVRHQ0FUVEFBQUFBVFRUR1RBVFRDQUNUVFRHVEdBVFRDQUFUR0FUQUdUQ0FBVEdUVEFBQ0FUQUEgICAgQUFBPEZBSkZGSkpKSkpKSkpKSkZKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkoKSkpKSkpKSkpGQUZGPEZKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkogICAgUlg6WjpHQUNBQ0FUQ0FHQ1RHVFRBICAgUVg6WjpBQUZGRkpKSkpKSkpKSkpKICAgQkM6WjpUQ1RDR0dHQyAgIFFUOlo6QUFGRkZKSkogICBYUzppOi0xMyAgICAgICAgQVM6aTotOSBYTTpBOjAgIEFNOkE6MCAgWFQ6aTowICBCWDpaOkdBQ0FDQVRDQUdDVEdUVEEtMSBSRzpaOjQ5MjU1Ok1pc3NpbmdMaWJyYXJ5OjE6dW5rbm93bl9mYzowICAgICAgICBPTTppOjM5ClNULUswMDEyNjozMzQ6SEdLTkpCQlhYOjQ6MjExODoyNjkyMDoxNDUxOSAgICAgIDgzICAgICAgY2hyMjEgICA5NDEyOTUzIDM5ICAgICAgNzdNICAgICA9ICAgICAgIDk0MTI5NDAgLTkwICAgICBUR0NBR0dBQUdHR0dBR1RUVEdBVFRUQUFUR0FBQUNBQVRHQ0FUVEFBQUFBVFRUR1RBVFRDQUNUVFRHVEdBVFRDQUFUR0FUQUdUQ0FBVCAgIEZKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpGSkpKSkpKClJYOlo6R0FDQUNBVENBR0NUR1RUQSAgIFFYOlo6QUFGRkZKSkpKSkpKSkpKSiAgIFRSOlo6VEdUVEFBQyAgICBUUTpaOkpKSkpKSkogICAgQkM6WjpUQ1RDR0dHQyAgIFFUOlo6QUFGRkZKSkogICBYUzppOi0xMyAgICAgICAgQVM6aTotOSBYTTpBOjAgIEFNOkE6MCAgWFQ6aTowICBCWDpaOkdBQ0FDQVRDQUdDVEdUVEEtMSBSRzpaOjQ5MjU1Ok1pc3NpbmdMaWJyYXJ5OjE6dW5rbm93bl9mYzowICAgICAgICBPTTppOjM5ClNULUswMDEyNjozMzQ6SEdLTkpCQlhYOjQ6MTExNDozMjY0NDo0NTAxMCAgICAgIDk5ICAgICAgY2hyMjEgICA5NDEzMjQ4IDM5ICAgICAgNzdNICAgICA9ICAgICAgIDk0MTMyNjMgMTE1ICAgICBUR0FBVEFUVFRUQ1RDQUdDQUFDVEdUR0dUR1RUQVRHQVRBVEFUQVRUR0dUVFRUQ0FUQ0NDQ0FHVFRDQ1RHR0NUVEFUQUFDVENDQ0NUQSAgIEZGPEo8RkpKSi1KPEpGQUpGSkpBSi1BLTw3PEEtLUZKLUFKSkpGRkZGSkYtPEZGRi1GLS03QTxGRi08QUY8SkEtQS1KSi08PDdGRkY8ClJYOlo6TkFHR0dUR0FHR0NBVEdHVCAgIFFYOlo6Izw8QUFGRkpKRkpKQTxKPCAgIFRSOlo6VFRDQ0dDQSAgICBUUTpaOjxGSkpKRkEgICAgQkM6WjpUQ1RDR0dHQyAgIFFUOlo6QUFBRkZKSkogICBYUzppOi0xMiAgICAgICAgQVM6aTotOCBYTTpBOjAgIEFNOkE6MCAgWFQ6aTowICBCWDpaOkFBR0dHVEdBR0dDQVRHR1QtMSBSRzpaOjQ5MjU1Ok1pc3NpbmdMaWJyYXJ5OjE6dW5rbm93bl9mYzowICAgICAgICBPTTppOjM5CmBgYAoKVGhpbmdzIHRvIGxvb2sgZm9yOgoKKiBCWCB0YWcgc3VjaCBhcyBgQlg6WjpHQUNBQ0FUQ0FHQ1RHVFRBLTFgCiAgICArIEJhcmNvZGUgYXNzb2NpYXRlZCB3aXRoIGEgdGFnCiAgICAKX05vdGVfOiBEZWZpbml0aW9ucyBvZiBhbGwgdGhlIC5iYW0gdGFncyBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvb3V0cHV0L2JhbSkKCl9JbmZvcm1hdGljcyBUaXBfOiBpZiB5b3UnZCBsaWtlIHRvIHNlYXJjaCBmb3IgYWxsIHRoZSByZWFkcyBhc3NvY2lhdGVkIHdpdGggYSBsaXN0IG9mIGJhcmNvZGVzLCB0aGlzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBkbyBpdCAod2lsbCBuZWVkIFtyaXBncmVwXShodHRwczovL2dpdGh1Yi5jb20vQnVybnRTdXNoaS9yaXBncmVwKSB3aGljaCBpcyBpbnN0YWxsZWQgb24geW91ciBBV1MgaW5zdGFuY2UpCgpgYGAKc2FtdG9vbHMgdmlldyAtQCA1IHBvc3NvcnRlZF9leG9tZV9iYW0uYmFtIHwgcmcgLWogNSAtLW5vLWxpbmUtbnVtYmVyIC1GIC1mIEJYX2xpc3QudHh0ID4gQkNfcmVhZHMuc2FtCmBgYAo8YnI+PGJyPjxicj48YnI+CgpTb21lIDEweCB1c2VycyBoYXZlIGFsc28gYXNrZWQgYWJvdXQgbG9jYWwgX2RlIG5vdm9fIGFzc2VtYmx5IG9mIGEgbG9jdXMgb2YgaW50ZXJlc3QuIEFuIGV4YW1wbGUgd29ya2Zsb3cgZm9yIHRoYXQgKGNvbXBsZXRlbHkgdW5zdXBwb3J0ZWQpIHdvcmtmbG93IGNhbiBiZSBmb3VuZCBoZXJlLiAKCjxvYmplY3QgZGF0YT0iaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL1dHUy1Mb2NhbFJlYXNzZW1ibHlXb3JrZmxvdy0wOTAyMTgtMTkyOS5wZGYiIHR5cGU9ImFwcGxpY2F0aW9uL3BkZiIgd2lkdGg9IjcwMHB4IiBoZWlnaHQ9IjcwMHB4Ij4KICAgIDxlbWJlZCBzcmM9Imh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9XR1MtTG9jYWxSZWFzc2VtYmx5V29ya2Zsb3ctMDkwMjE4LTE5MjkucGRmIj4KICAgICAgICBUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBQREZzLiBQbGVhc2UgZG93bmxvYWQgdGhlIFBERiB0byB2aWV3IGl0OiA8YSBocmVmPSJodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvV0dTLUxvY2FsUmVhc3NlbWJseVdvcmtmbG93LTA5MDIxOC0xOTI5LnBkZiI+RG93bmxvYWQgUERGPC9hPi48L3A+CiAgICA8L2VtYmVkPgo8L29iamVjdD4KCioqKgoKIyAqKlRoZSAxMHggVkNGKioKCiMjIFNwZWNpYWwgYXNwZWN0cwoKVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB0aGF0IHRoYXQgbWFrZSB0aGUgMTB4IFZDRiB1bmlxdWUuIE92ZXJhbGwgMTB4IGFiaWRlcyBieSB0aGUgW1ZDRiA0Lnggc3RhbmRhcmRdKGh0dHBzOi8vc2FtdG9vbHMuZ2l0aHViLmlvL2h0cy1zcGVjcy9WQ0Z2NC4yLnBkZikuIEhvd2V2ZXIsIHRoZXJlIGlzIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGUgMTB4IHNwZWNpZmljIHRlY2hub2xvZ3kuIERvY3VtZW50cyBjb3ZlcmluZyB0aGUgdGhlIDEweCBWQ0Ygc3BlYyBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvb3V0cHV0L3ZjZikuIEEgY29tcHJlaGVuc2l2ZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgb3V0cHV0cyBvZiBMb25ncmFuZ2VyIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9nZW5vbWUtZXhvbWUvc29mdHdhcmUvcGlwZWxpbmVzL2xhdGVzdC93aGF0LWlzLWxvbmctcmFuZ2VyKS4gIAoKCklmIHdlIG5hdmlnYXRlIHRvIGEgMTB4IFZDRiBhbmQgaGF2ZSBhIGxvb2sgCgpgYGAKY2QgL2hvbWUvdWJ1bnR1LzEweC12Y2YtZmlsZXMKdWJ1bnR1QGlwLTE3Mi0zMS02My0xNTY6fi8xMHgtdmNmLWZpbGVzJCBscwp0b3RhbCAxMDE0TQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDNNIEFwciAxMSAxNjozNCBOQTEyODc4X3dlc192YXJjYWxscy52Y2YuZ3oKLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgODgySyBBcHIgMTEgMTY6MzQgTkExMjg3OF93ZXNfdmFyY2FsbHMudmNmLmd6LnRiaQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSA5NjhNIEFwciAgMiAxODo0NiBOQTEyODc4X3dnc192YXJjYWxscy52Y2YuZ3oKLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMS45TSBBcHIgIDIgMTg6NDIgTkExMjg3OF93Z3NfdmFyY2FsbHMudmNmLmd6LnRiaQpgYGAKCmBgYAp6Y2F0IE5BMTI4Nzhfd2VzX3ZhcmNhbGxzLnZjZi5neiB8IGxlc3MKCiNDSFJPTSAgUE9TICAgICBJRCAgICAgIFJFRiAgICAgQUxUICAgICBRVUFMICAgIEZJTFRFUiAgSU5GTyAgICBGT1JNQVQgIDQ5MjU1CmNocjEgICAgMTIxOTggICAuICAgICAgIEcgICAgICAgQyAgICAgICAxMzU1Ljc3IFBBU1MgICAgQUM9MjtBRj0xLjA7QU49MjtCYXNlUVJhbmtTdW09MC4xMzI7Q2xpcHBpbmdSYW5rU3VtPTAuMDtEUD00MjtFeGNlc3NIZXQ9My4wMTAzO0ZTPTAuMDtNTEVBQz0yO01MRUFGPTEuMDtNUT01My4yMztNUVJhbmtTdW09MS41OTM7UUQ9MzIuMjg7UmVhZFBvc1JhbmtTdW09MS42NTM7U09SPTAuMjg2O01VTUFQX1JFRj0zLjczOTEzO01VTUFQX0FMVD0yNC43NzU7QU89MzQ7Uk89MAo7TU1EPTAuODg1NjQyO1JFU0NVRUQ9MTtOT1RfUkVTQ1VFRD0xMDI7SEFQTE9DQUxMRUQ9MCAgICAgR1Q6QUQ6RFA6R1E6UEw6Qlg6UFMgICAgMXwxOjEsNDE6NDI6OTI6MTM4NCw5MiwwOixBQUNUQ0NDVENUVEdHVEFHLTFfNzQ7VFRHQ0dUQ0FHQUNHQ0NDVC0xXzc0O0dUQUNBVEdBR0dUR0NHVEEtMV82NTtUQUFHR0NUQ0FBR0dHVEdULTFfNzQ7Q0FDQUdUQUNBQ0FUVEdHVC0xXzc0Xzc0O0dDQUFBQ1RHVEFBQUNHR0MtMV83MDtDR0dBVFRBVENUR0FBQ1RHLTFfNzA7QVRHQ0EKQUNUQ1RDQ0NBQUMtMV82MDtDQVRDR0dHVENBVEFBQ0NHLTFfNzQ7QUNBQ0FBQ0FHQUdBR0dDRy0xXzc0O0dUQUdUQ0FBR0dDQ0dBQVQtMV83NDtUR0NBVENDVENHVENUR0FBLTFfNzQ7QVRDQVRHR1RDQVRDR0FHVC0xXzcwO0NBR0NUQUFDQUFHQUdUQ0ctMV82MF83MDtHR0dDQ0FUVENUQUNBQUdDLTFfNTU7R1RHQUNDR1RDQUNBR0NDRy0xXzcwO0dUVFRDQVRHVEFDR0FHQUMtMV83NDtUVEFHVENUQUdDVEFBR1RBLTFfNzRfNTVfNzQ7R1RDR0FDR0NBQ1RBQUdHRy0xXzc0O0dDCkdDVEdBQUdDR0FUVEFBLTFfNDU7VEdDQUFDQUdUVENUR1RUVC0xXzcwO0dHQ0FBQ0NBR0FHQUNUQVQtMV83MDtDR0NBQ1RUVENDQVRDR1RDLTFfNzRfNzQ7R0dDR0FDVEFHQ0dUR1RHQS0xXzc0O1RBR0dDR0NDQUdHVENBQUctMV83NDtUR0NUQUFHQUdHVFRUQ0dULTFfNzRfNzQ7R1RDQ1RDQVRDVFRDQ1RUQy0xXzc0O0FDVEdBR1RHVENDQVRUR0EtMV83NDoxMjE5OApjaHIxICAgIDEyMzA1ICAgLiAgICAgICBDICAgICAgIFQgICAgICAgMTguODIgICBQQVNTICAgIEFDPTE7QUY9MC41O0FOPTI7QmFzZVFSYW5rU3VtPTEuMDk3O0NsaXBwaW5nUmFua1N1bT0wLjA7RFA9MTI7RXhjZXNzSGV0PTMuMDEwMztGUz0wLjA7TUxFQUM9MTtNTEVBRj0wLjU7TVE9NTEuNDE7TVFSYW5rU3VtPS0wLjIzO1FEPTEuNzE7UmVhZFBvc1JhbmtTdW09LTAuMjUzO1NPUj0wLjA4NjtNVU1BUF9SRUY9MTMuNjk3NztNVU1BUF9BTFQ9MTUuNjY2NztBTz0yO1JPPTk7TU1EPTAuOTAxNzA5O1JFU0NVRUQ9MDtOT1RfUkVTQ1VFRD00OTtIQVBMT0NBTExFRD0wICAgICAgR1Q6QUQ6RFA6R1E6UEw6Qlg6UFM6UFE6SlEgICAgICAwLzE6OSwyOjExOjQ3OjQ3LDAsMzE1OlRUQUdUQ1RBR0NUQUFHVEEtMV83MDtHVENHQUNHQ0FDVEFBR0dHLTFfNzQ7QUNDQUNHR0NBVEFDQUdBQS0xXzU1O0FDQUNBQUNBR0FHQUdHQ0ctMV83MDtUR0NBVENDVENHVENUR0FBLTFfNjU7Q0dDQUNUVFRDQ0FUQ0dUQy0xXzc0O0FDVEdHR0NHVENDQVRDQ1QtMV83NDtHVEdDVENUQ0FBR1RBQ0FBLTFfNzA7R0dDR0FDVEFHQ0dUR1RHQS0xXzcwLEdUQUdUQ0FBR0dDQ0dBQVQtMV83NDtBVENBVEdHVENBVENHQUdULTFfNzQ6MToxMDoyNTUKY2hyMSAgICAxMjM4MyAgIC4gICAgICAgRyAgICAgICBBICAgICAgIDE3Mi43NCAgUEFTUyAgICBBQz0xO0FGPTAuNTtBTj0yO0Jhc2VRUmFua1N1bT0tMC42NzQ7Q2xpcHBpbmdSYW5rU3VtPTAuMDtEUD05O0V4Y2Vzc0hldD0zLjAxMDM7RlM9Ni4wMjE7TUxFQUM9MTtNTEVBRj0wLjU7TVE9NDkuMjY7TVFSYW5rU3VtPTAuODg3O1FEPTIxLjU5O1JlYWRQb3NSYW5rU3VtPS0wLjQ4OTtTT1I9Mi41MjY7TVVNQVBfUkVGPTcuMDtNVU1BUF9BTFQ9MjYuNDcwNjtBTz04O1JPPTA7TU1EPTAuODk4NzkzO1JFU0NVRUQ9MDtOT1RfUkVTQ1VFRD0yMTtIQVBMT0NBTExFRD0wICAgICAgIEdUOkFEOkRQOkdROlBMOkJYOlBTOlBROkpRICAgICAgMXwwOjEsNzo4OjY6MjAwLDAsNjosR0FBQVRHQUFHVFRUQ1RUQy0xXzYwO0FDQ0FDR0dDQVRBQ0FHQUEtMV83NDtUVEdDR1RDQUdBQ0dDQ0NULTFfNzQ7QUdHQUdBQ0NBVEdUQVRHQy0xXzU1O1RHQ0FUQ0NUQ0dUQ1RHQUEtMV83NDtHQ0FBQUNUR1RBQUFDR0dDLTFfNzA7R0FDR0NHVEdUQ0NUQ0dHQS0xXzQ1O1RDQ0FUQ0dBR0dHQ0dBQUctMV83MDoxOjQ0OjM2CmBgYAoKKipOb3Qgb25seSBkbyB5b3Ugc2VlIHNvbWUgb2YgdGhlIHR5cGljYWwgdGhpbmdzKioKCiogY2hyLCBwb3MKKiBSRUYsIEFMVAoqIFFVQUwKKiBGSUxURVIKICAgICsgUEFTUwogICAgKyBSZWFzb24gZm9yIGZpbHRlcmluZwogICAgCioqWW91IGNhbiBhbHNvIHNlZSBzb21lIG9mIHRoZSBleHRyYSAxMHggInN0dWZmIi4gTW9zdGx5IGluIHRoZSBGT1JNQVQgZmllbGQqKgoKKiBCWAogICAgKyBCYXJjb2RlcyBvZiByZWFkcyBhc3NvY2lhdGVkIHdpdGggYW4gZ2l2ZW4gdmFyaWFudAogICAgKyBGaXJzdCBzZXQgb2YgYDtgIHNlcGFyYXRlZCBiYXJjb2RlcyBjb3ZlciB0aGUgZmlyc3QgYWxsZWxlIGZvbGxvd2VkIGJ5IGEgYCxgIHdoaWNoIHNlcGFyYXRlcyBiYXJjb2RlcyBhc3NvY2lhdGVkIHdpdGggcmVhZHMgY292ZXJpbmcgdGhlIHNlY29uZCBhbGxlbGUKKiBQUwogICAgKyBwaGFzZSBzZXQKICAgICAgICArIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwaGFzZSBibG9jayBmb3Igd2l0aCB0aGUgdmFyaWFudCBpcyBhc3NpZ25lZCAKClRoaXMgZXh0cmEgaW5mb3JtYXRpb24gY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBsb29raW5nIGF0IHZhcmlhbnRzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgaW4gX2Npc18gb3IgX3RyYW5zXy4gVGhpcyBjYW4gYmUgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91IGhhdmUgY29tcG91bmQgaGV0ZXJvenlnb3RlIHZhcmlhbnRzLiBBbGwgdGhlIGFsbGVsZXMgb24gb25lIHNpZGUgb2YgdGhlIHNlcGFyYXRvciAoYHxgKSB3aXRoIHRoZSBzYW1lIGBQU2AgYXJlIGZyb20gdGhlIHNhbWUgaGFwbG90eXBlICh0aHVzIHNhbWUgcGFyZW50KS4gCgpfTm90ZV86IEZvciBHVCwgYHxgIHJlcHJlc2VudHMgYSBwaGFzZWQgdmFyaWFudCBgXGAgcmVwcmVzZW50cyBhbiB1bnBoYXNlZCB2YXJpYW50LiBEZWZpbml0aW9ucyBvZiBhbGwgdGhlIFZDRiB0YWdzIGFyZSBhdmFpbGFibGUgW2hlcmVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvb3V0cHV0L3ZjZikKCl9JbmZvcm1hdGljcyBUaXBfOiBJZiBoYXZlIGEgdmFyaWFudCBvZiBpbnRlcmVzdCBhbmQgeW91J2QgbGlrZSB0byBsb29rIGF0IGFsbCB0aGUgU05QcyB3aXRoaW4gdGhlIHNhbWUgcGhhc2VibG9jayAoZm9yIGV4YW1wbGUgYGNocjE2CTIwNDIzNTNgIGluIGBOQTEyODc4X3dlc192YXJjYWxscy52Y2YuZ3pgKSB5b3UgeW91IGNhbiBzaW1wbHkgcnVuIAoKKiBgemNhdCBOQTEyODc4X3dlc192YXJjYWxscy52Y2YuZ3ogfCByZyAnMTMwODA3NCdgIAoKVGhpcyB3aWxsIG91dHB1dCBhbGwgY2FsbGVkIFNOUHMsIGJvdGggZmlsdGVyZWQgYW5kIHVuZmlsdGVyZWQsIHRoYXQgbGFuZCBpbiB0aGUgcGFzZWJsb2NrIG9mIGludGVyZXN0LiBTTlBzIHdpdGggdGhlIHNhbWUgYFBTYCBudW1iZXIgYXJlIGluIF9jaXNfIHdpdGggZWFjaCBvdGhlci4gVGhpcyBpcyB2ZXJ5IGluZm9ybWF0aXZlIHdoZW4geW91IGhhdmUgYSBwb3RlbnRpYWwgY29tcG91bmQgdmFyaWFudC4gCgpUaGUgMTB4IFZDRiBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggZG93bnN0cmVhbSBhbmFseXNpcyB0b29scyBzdWNoIGFzIFtWYXJpYW50IEVmZmVjdCBQcmVkaWN0b3JdKGh0dHBzOi8vdXN3ZXN0LmVuc2VtYmwub3JnL2luZm8vZG9jcy90b29scy92ZXAvaW5kZXguaHRtbCksIFtzbnBFRkZdKGh0dHA6Ly9zbnBlZmYuc291cmNlZm9yZ2UubmV0LyksIGFuZCBbR2VtaW5pXShodHRwOi8vZ2VtaW5pLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9pbmRleC5odG1sKSB0byBuYW1lIGEgZmV3LiAKCioqKgoKIyAqKkV4cGxvcmluZyAxMHggRGF0YSoqCgojIyAqKkV4cGxvcmluZyB0aGUgMTB4IGRhdGEgdmlhIEludGVncmF0ZWQgR2Vvbm9tZSBCcm93c2VyIChJR1YpIGZyb20gdGhlIEJyb2FkIEluc3RpdHV0ZSoqCklHViBpcyBvbmUgb2YgdGhlIG1vc3QgY29tbW9uIHRvb2xzIHVzZWQgaW4gdGhlIGZpZWxkIG9mIGdlbm9taWNzIHRvIHZpZXcgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBkYXRhIHR5cGVzLiBJZiB5b3UgZG8gbm90IGhhdmUgSUdWIChvbiB5b3VyIGxhcHRvcCBub3QgeW91ciB0ZXJtaW5hbCksIG9yIGRvbid0IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uICgyLjQpLCBwbGVhc2UgZG93bmxvYWQgYW5kIGluc3RhbGwgaXQgZnJvbSBlaXRoZXIgaG9tZS1icmV3IGBicmV3IGluc3RhbGwgaWd2YCBvciBjb25kYSBgY29uZGEgaW5zdGFsbCBpZ3ZgLiBJZiB5b3UgZG9uJ3QgdXNlIGNvbmRhIG9yIGhvbWUtYnJldyBJR1YgY2FuIGJlIG1hbnVhbGx5IGluc3RhbGwgaGVyZTogaHR0cHM6Ly9zb2Z0d2FyZS5icm9hZGluc3RpdHV0ZS5vcmcvc29mdHdhcmUvaWd2L2Rvd25sb2FkLgoKX05vdGVfOiBUeXBlIGB3aGljaCBpZ3ZgIHdpbGwgc2hvdyB5b3Ugd2hlcmUgSUdWIGhhcyBiZWVuIGluc3RhbGxlZC4gWW91IGNhbiBuYXZpZ2F0ZSB0byB0aGF0IGRpcmVjdG9yeSBhbmQgY2xpY2sgb24gaWd2Lmphci4KCgpGaXJzdCBvcGVuIElHViBhbmQgbG9hZCB0aGUgMTB4IGRhdGEuIFRoZXJlIGFyZSB0d28gLmJhbSBmaWxlcyB0aGF0IGNhbiBiZSBleHBsb3JlZC4gSGVyZSdzIGEgc25hcHNob3Qgb2YgdGhlIGAxMHgtYmFtLWZpbGVzYCBkaXJlY3RvcnkKCmBgYAp1YnVudHVAaXAtMTcyLTMxLTYzLTE1Njp+LzEweC1iYW0tZmlsZXMkIGxzIC9ob21lL3VidW50dS8xMHgtYmFtLWZpbGVzCnRvdGFsIDEuM0cKLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDY0TSBBcHIgIDIgMTc6MzcgTkExMjg3OF9jaHIyMV9waGFzZWRfcG9zc29ydGVkX2V4b21lX2JhbS5iYW0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDgzSyBBcHIgIDIgMTc6MzcgTkExMjg3OF9jaHIyMV9waGFzZWRfcG9zc29ydGVkX2V4b21lX2JhbS5iYW0uYmFpCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDEuMkcgQXByICAyIDE3OjQxIE5BMTI4NzhfY2hyMjFfcGhhc2VkX3Bvc3NvcnRlZF9XR1NfYmFtLmJhbQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxMTZLIEFwciAgMiAxNzozNyBOQTEyODc4X2NocjIxX3BoYXNlZF9wb3Nzb3J0ZWRfV0dTX2JhbS5iYW0uYmFpCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA4OTEgQXByICAyIDE3OjQ0IFJFQURNRS5tZApgYGAKCkluIG9yZGVyIHRvIGxvYWQgb25lIG9mIHRoZSAuYmFtIGZpbGVzIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzLgoKMS4gTmF2aWdhdGUgeW91ciBicm93c2VyIHRvIGAvMTB4LWJhbS1maWxlcy9gIGRpcmVjdG9yeSBvbiB0aGUgZnRwCjIuIENvcHkgdGhlIGxpbmsgYWRkcmVzcyBmb3Igb25lIG9mIHRoZSAuYmFtIGZpbGVzCjMuIE9wZW4gSUdWCjQuIENsaWNrIEZpbGUgLT4gTG9hZCBmcm9tIFVSTAogICAgKyBEbyB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgLnZjZi5neiBpZiB5b3UnZCBsaWtlCjUuIFBhc3RlIHRoZSBjb3BpZWQgbGluayBhZGRyZXNzIGludG8gdGhlIGZpcnN0IGJveCAoeW91IHdpbGwgbm90IG5lZWQgdG8gcGFzdGUgYW55dGhpbmcgaW50byB0aGUgc2Vjb25kIGJveCkKNi4gTmF2aWdhdGUgdG8geW91ciBmYXZvcml0ZSBnZW5lIG9uIGNocjIxCiAgICArIE1heWJlIF9DQlNfCgpEZXBlbmRpbmcgb24gd2hhdCB2aWV3IHlvdSBhcmUgaW4geW91IG1pZ2h0IHNlZSByZWFkcyBwYWlyZWQgaW4gYSB2YXJpZXR5IG9mIGRpZmZlcmVudCB3YXlzLiBUbyBzaG93IHNvbWUgb2YgdGhlIHNwZWNpYWwgZmVhdHVyZXMgb2YgdGhlIDEweCBkYXRhOiAKCjEuIFJpZ2h0IGNsaWNrIG9uIHRoZSBjZWxsIHRvIHRoZSBsZWZ0IGVuZGluZyBpbiAiYmFtLmJhbSIKMi4gU2VsZWN0ICJWaWV3IGxpbmtlZCByZWFkcyAoQlgpIgoKVG8gdmlldyB0aGUgYmVuZWZpdCBvZiBwaGFzaW5nIG5hdmlnYXRlIHRvIGBjaHIyMTo0NCw0ODUsMzMwLTQ0LDQ4NSwzNzBgCgpUaGlzIHdpbGwgb3JkZXIgdGhlIHJlYWRzIGJ5IGJhcmNvZGUgYW5kLCBpZiBwb3NzaWJsZSwgc2hvdyBwaGFzaW5nIG9mIHRoZSByZWdpb24gdGhhdCB5b3UgYXJlIGludmVzdGlnYXRpbmcuIEdyb3VwcyBvZiByZWFkcyB3aWxsIGJlICJsaW5rZWQiIHRvIGVhY2ggb3RoZXIgYnkgdGhlIGluZGl2aWR1YWwgYmFyY29kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaW5nbGUgbW9sZWN1bGUgdGhhdCB0aGUgcmVhZHMgb3JpZ2luYXRlZCBmcm9tLiBUaGUgcmVhZHMgYW5kIGJhcmNvZGVzIHdpbGwgYWxzbyBiZSBzZXBhcmF0ZWQgaW50byBwaGFzZWQgaGFwbG90eXBlcyAxIChyZWQpIGFuZCAyIChibHVlKS4gVGhvc2UgcmVhZHMgdGhhdCBjb3VsZCBub3QgYmUgcGhhc2VkIGFyZSByZXByZXNlbnRlZCBieSBncmV5IGxpbmVzLiBUaGVzZSB1bnBoYXNlZCByZWFkcyBhcmUgc3RpbGwgdXNlZnVsIGFuZCBhcmUgdXRpbGl6ZWQgaW4gbW9zdCBzdGVwcyBvZiBMb25ncmFuZ2VyLgoKU29tZSB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kIHdoZW4gdGhpbmtpbmcgYWJvdXQgMTB4IGRhdGEKCjEuIElucHV0IG1hdGVyaWFsICoqTUFUVEVSUyoqCiAgICArIFRoZSBvbGQgYWRhZ2UgIlB1dCBqdW5rIGluIGdldCBqdW5rIG91dCIgYXBwbGllcyBoZXJlCiAgICArIExpbmtlZC1SZWFkIGRhdGEgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHNob3J0ZXIgZnJhZ21lbnRzIGFuZCBtdWNoIG9mIHRoZSBlbmhhbmNlIHV0aWxpdHkgaXMgcmV0YWluZWQgYnV0IHRoZSBsb25nZXIgRE5BIGlucHV0IGxlbmd0aCB0aGUgYmV0dGVyCjIuIE5vdCBvbmx5IHdpbGwgeW91IGhhdmUgInJlYWQgY292ZXJhZ2UiIGF0IGFueSBnaXZlbiBsb2N1cyB5b3Ugd2lsbCBhbHNvIGhhdmUgcGh5c2ljYWwsIG9yIGJhcmNvZGUsIGNvdmVyYWdlCiAgICArIFRoaXMgZW5hYmxlcyBlbmhhbmNlZCBTdHJ1Y3R1cmFsIFZhcmlhbnQgZGV0ZWN0aW9uIGZyb20gd2hhdCBpcyBvdGhlcndpc2Ugc2hvcnQtcmVhZCBkYXRhCjMuIFBoYXNpbmcgaXMgY29tcGxldGVseSBkZXBlbmRlbnQgb24KICAgICsgU05WIHZhcmlhdGlvbiBpbiB0aGUgZ2l2ZW4gcmVnaW9uCiAgICArIEFjY2Vzc2liaWxpdHkgdG8gdGhhdCByZWdpb24KICAgIAoqKioKCiMjICoqRXhwbG9yaW5nIHRoZSAxMHggZGF0YSB2aWEgdGhlIExvdXBlIEJyb3dzZXIgYnkgMTB4IEdlbm9taWNzKioKClRoZSBMb3VwZSBCcm93c2VyIGlzIGEgMTB4IHNwZWNpZmljIGdlbm9tZSBicm93c2VyIHRoYXQgbW9yZSBmdWxseSBjYXB0dXJlcyBzb21lIG9mIHRoZSBlbmhhbmNlZCBpbmZvcm1hdGlvbiB0aGF0IExpbmtlZC1SZWFkcyB3aWxsIGdldCB5b3UgaW4geW91ciBXR1Mgb3IgV0VTIGV4cGVyaW1lbnRzLiBbTG91cGVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3Zpc3VhbGl6YXRpb24vbGF0ZXN0L3doYXQtaXMtbG91cGUpIGlzIGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgTG9uZ3JhbmdlciBwaXBlbGluZSBhbmQgLmxvdXBlIGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBkZWZhdWx0LiAKCklmIHlvdSBsb29rIGF0IHRoZSBgMTB4LWxvdXBlLWZpbGVzYCBkaXJlY3RvcnkgeW91IGNhbiBzZWUgdGhyZWUgbG91cGUgZmlsZXMgdG8gZXhwbG9yZS4gCgpgYGAKdWJ1bnR1QGlwLTE3Mi0zMS02My0xNTY6fi8xMHgtbG91cGUtZmlsZXMkIGxzIC9ob21lL3VidW50dS8xMHgtbG91cGUtZmlsZXMKdG90YWwgNDIyTQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDBNIERlYyAgOCAwOTowMiBMdW5nVHVtb3JULmxvdXBlCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDM4M00gQXByIDEwIDIwOjA1IE5BMTI4NzhfZXhvbWUubG91cGUKYGBgCgojIyMgVGhlIExvdXBlIG1haW4gcGFnZQoKRmlyc3QgbGV0J3MgZ28gdG8gdGhlIExvdXBlIGJyb3dzZXIgYW5kIGNsaWNrIG9uIGBOQTEyODc4X2V4b21lLmxvdXBlYC4gVGhpcyB3aWxsIGJyaW5nIHVzIHRvIHRoZSBtYWluIHBhZ2Ugb2YgTG91cGUgd2hpY2ggbG9va3MgbGlrZSB0aGlzLiAKCiFbXShodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvTG91cGVfZnJvbnRwYWdlLnBuZykKRmlndXJlIDMuIFRoZSBMb3VwZSBtYWluIHBhZ2UuIExvdXBlIGlzIGEgMTB4IEdlbm9taWNzIGdlbm9tZSBicm93c2VyIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byB2aXN1YWxpemUgMTB4IExpbmtlZC1SZWFkIGRhdGEuIAoKCkFzIHlvdSBjYW4gc2VlIHdlIGhhdmUgc29tZSBuaWNlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHBlcmZvcm1hbmNlIG9mIG91ciBzZXF1ZW5jaW5nIGV4cGVyaW1lbnQgaW5jbHVkaW5nOgoKKiBUaGUgbnVtYmVyIG9mIGdlbmVzIHBoYXNlZAogICAgKyBGcmFjdGlvbiBvZiBnZW5lcyAoPDEwMGtiIGxvbmcpIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUgcGhhc2UgYmxvY2suCiogUGhhc2UtYmxvY2sgaW5mb3JtYXRpb24KICAgICsgU05QcyBQaGFzZWQKICAgICAgICArIFBlcmNlbnRhZ2Ugb2YgaGV0ZXJvenlnb3VzIFNOUHMgdGhhdCB3ZXJlIHBoYXNlZC4KICAgICsgTG9uZ2VzdCBQaGFzZSBCbG9jawogICAgICAgICsgTGVuZ3RoIG9mIHRoZSBsb25nZXN0IHBoYXNlIGJsb2NrLgogICAgKyBONTAgUGhhc2UgQmxvY2sKICAgICAgICArIEhhbGYgb2YgdGhlIGdlbm9tZSB3YXMgcGhhc2VkIGludG8gcGhhc2UgYmxvY2tzIG9mIGF0IGxlYXN0IHRoaXMgbGVuZ3RoLgoqIE1vbGVjdWxlIGxlbmd0aCBkaXN0cmlidXRpb24gKHdlJ2xsIHdvcmsgb24gcmVjcmVhdGluZyB0aGlzKQoqIEdFTSBzdGF0aXN0aWNzCgoKIyMjIEhhcGxvdHlwZSBWaWV3CgpMZXQncyBuYXZpZ2F0ZSB0byBgY2hyMTc6NDEsMDc0LDUzMC00MSwzOTksMjgyYAoKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9OQTEyODc4X2hhcGxvdHlwZXMucG5nKQpGaWd1cmUgNC4gSGFwbG90eXBlcyB2aWV3IGluIHRoZSBMb3VwZSBnZW5vbWUgYnJvd3Nlci4KClRoZXJlIGFyZSBhIGxvdCBvZiAiY2xpY2thYmxlIiBmZWF0dXJlcyB0byBzZWUgaGVyZToKCiogQW4gYW5ub3RhdGlvbiB0cmFjawoqIENvdmVyYWdlIHRyYWNrIGluIGdyZWVuCiogRXhvbWUgYmFpdCB0YXJnZXRzIChibHVlIGJhcnMpCiogVmFyaWFudHMKCiFbXShodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvbGVnZW5kLnN2ZykKRmlndXJlIDUuIFZhcmlhbnQgdHlwZXMgcmVwcmVzZW50ZWQgaW4gTG91cGUgZ2Vub21lIGJyb3dzZXIuCgoqIFBoYXNlLWJsb2NrcyAoYmxhY2spCiAgICArIEJyZWFrcyBpbiBwaGFzaW5nIGRvIG5vdCBoYXZlIGJsYWNrIGJveCBhcm91bmQgdGhlbQoKIyMjIExpbmtlZC1SZWFkIFZpZXcKCkhlcmUgeW91IGNhbiBzZWUgYSBzaW1pbGFyIG91dHB1dCB0byB0aGF0IG9mIElHViBidXQgaXQgaXMgYSBiaXQgbW9yZSBkaWdlc3RpYmxlIGZvciB2aWV3aW5nIGxpbmtlZCByZWFkcy4gCgohW10oaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL2xvdXBlLWxpbmtlZC1yZWFkcy5wbmcpCkZpZ3VyZSA2LiBMaW5rZWQtUmVhZCB2aWV3IGluIHRoZSBMb3VwZSBnZW5vbWUgYnJvd3Nlci4gSGFwbG90eXBlIDEgaXMgc2hvd24gaW4geWVsbG93LCBoYXBsb3R5cGUgMiBpcyBzaG93biBpbiBwdXJwbGUuIEdyZXkgcmVhZHMvYmFyY29kZXMgY291bGQgbm90IGJlIGFzc2lnbmVkIHRvIGEgaGFwbG90eXBlCgpPbmNlIGFnYWluLCB3ZSBjYW4gc2VlIHJlYWRzIGNsZWFybHkgcGhhc2VkIGJ5IGhhcGxvdHlwZSBhbmQgcmVhZHMgdGhhdCBkbyBub3QgZ2V0IHBoYXNlZCBpbiBncmV5LgoKKiBJbiBMYXJpYXQgbW9kZSwgTG91cGUgY29sb3JzIHJlYWRzIGJhc2VkIG9uIHRoZWlyIGFsaWdubWVudCBwcm9wZXJ0aWVzOgogICAgKyBSZWFkcyB3aXRoIGEgTUFQUSBsZXNzIHRoYW4gMzAgYXJlIGNvbG9yZWQgZ3JleQogICAgKyBSZWFkcyB3aXRoIGEgaGlnaCBtYXBxIHRoYXQgdW5pcXVlbHkgYWxpZ25lZCBhcmUgY29sb3JlZCBibGFjawogICAgKyBSZWFkcyB3aXRoIGEgaGlnaCBtYXBxIHRoYXQgbGFyaWF0IHdhcyBhYmxlIHRvIGFsaWduIGJlY2F1c2Ugb2YgdGhlaXIgbGlua2FnZSB0byBvdGhlciByZWFkcyBhcmUgY29sb3JlZCBncmVlbi4KCgojIyMgKipMaW5rZWQtUmVhZCBWaWV3KioKSWYgd2Ugb3BlbiB1cCB0aGUgTkExMjg3OF93Z3MubG91cGUgZmlsZSwgbmF2aWdhdGUgdG8gYGNocjI6MzQsNTk1LDgzOC0zNCw3OTUsODM4YCwgYW5kIGNsaWNrIG9uIExpbmtlZC1SZWFkcyB3ZSBjYW4gdmVyeSBjbGVhcmx5IHNlZSBhIGhlbWl6eWdvdXMgZGVsZXRpb24gaW4gYm90aCB0aGUgCgoqKkxpbmtlZC1SZWFkIFZpZXcqKgoKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9sb3VwZS1saW5rZWQtcmVhZHMtZGVsLnBuZykKRmlndXJlIDcuIEhlbWl6eWdvdXMgZGVsZXRpb24gZXhhbXBsZS4gVmlldyBvZiBhIGRlbGV0aW9uIG9uIGNocjIgc2hvd2luZyBwaGFzZWQgcmVhZHMgYWJzZW50IGluIGhhcGxvdHlwZSAxIGFuZCBwcmVzZW50IGluIGhhcGxvdHlwZSAyLgoKCgoqKioKCiMgKipNb3JlIEluZm8qKgoKIyMgKipTdHJ1Y3R1cmFsIFZhcmlhbnRzIFZpZXcqKgoKVGhlcmUgaXMgYSB3aG9sZSBvdGhlciB3b3JsZCBvZiBpbnZlc3RpZ2F0aW5nIFNWcyBpbiAxMHggZGF0YS4gSWYgd2UgbG9vayBhdCB0aGUgU3RydWN0dXJhbCBWYXJpYW50IFZpZXcgaW4gTG91cGUgV2UgY2FuIHNlZSBzb21lIG5pY2UgZXhhbXBsZXMgU1ZzLgoKYGBgCiAgICAyIDM0LDY5NSw4MzAgIEFDMDczMjE4Li4uREVMCjkzCQogICAgMiAzNCw3MzYsNTUyICBBQzA3MzIxOC4uLjQwLjcga2IJCmBgYAoKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9sb3VwZS1zdi1kZWwucG5nKQoKCiFbXShodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvbG91cGUtc3YtYmFyY29kZS1tYXRyaXgucG5nKQoKPGJyPjxicj48YnI+PGJyPgoKIyMgKipBcHBsaWNhdGlvbiBOb3RlIG9mIFNWIHZpZXcqKgoKPG9iamVjdCBkYXRhPSJodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvTElUMDAwMTRfUmV2QV9TdHJ1Y3R1cmFsX1ZhcmlhbnRfQW5hbHlzaXNfQXBwbGljYXRpb25fTm90ZV9EaWdpdGFsLnBkZiIgdHlwZT0iYXBwbGljYXRpb24vcGRmIiB3aWR0aD0iNzAwcHgiIGhlaWdodD0iNzAwcHgiPgogICAgPGVtYmVkIHNyYz0iaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL0xJVDAwMDE0X1JldkFfU3RydWN0dXJhbF9WYXJpYW50X0FuYWx5c2lzX0FwcGxpY2F0aW9uX05vdGVfRGlnaXRhbC5wZGYiPgogICAgICAgIFRoaXMgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFBERnMuIFBsZWFzZSBkb3dubG9hZCB0aGUgUERGIHRvIHZpZXcgaXQ6IDxhIGhyZWY9Imh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9MSVQwMDAxNF9SZXZBX1N0cnVjdHVyYWxfVmFyaWFudF9BbmFseXNpc19BcHBsaWNhdGlvbl9Ob3RlX0RpZ2l0YWwucGRmIj5Eb3dubG9hZCBQREY8L2E+LjwvcD4KICAgIDwvZW1iZWQ+Cjwvb2JqZWN0PgoKPGJyPjxicj48YnI+PGJyPgoKIyMgKioxMHggR2Vub21pY3MgU29mdHdhcmUqKgoKQWxsIDEweCBzcGVjaWZpYyBzb2Z0d2FyZSBhbmQgaW5mb3JtYXRpb24gYWJvdXQgMTB4IHNwZWNpZmljIGZpbGUgZm9ybWF0cyBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvd2hhdC1pcy1sb25nLXJhbmdlcikKCgoqIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2FuJ3QgZ2V0IHRoaXMgdHV0b3JpYWwgbGF0ZXIgaXQgaXMgaG9zdGVkIGhlcmUuIGh0dHBzOi8vc3RlcGhlbndpbGxpYW1zMjIuZ2l0aHViLmlvL0pheF9NYXJrZG93bi8KCgoKCgo=
 

A work by Stephen R. Williams, PhD