Overview

Our quality control analyses showed that the 2hpf and 8hpf references with replicates removed produced datasets with statistically significant results. We extended our initial analyses by comparing these two datasets to each other.

Data Used

  1. The significant genes list from the 2hpa Control - Two Replicates Removed experiment.
  2. The significant genes list from the 8hpa Control - Five Replicates Removed experiment.

Clustering Significant Genes

Clustering by Fold Change

For the following heatmap, we hierarchically clustered the significant genes by log2 fold changes for each of the two experiments and for all developmental timepoints.

We highlight the first four time points (1hpf - 4hpf) with the 8hpf control and the second four timepoints (5hpf - 8hpf) with the 2hpf control. By doing this, we see an enrichment from 1hpf to 4hpf followed by a gradual decrease from 5hpf to 8hpf of a cohort of genes we are referring to as ‘Early Stage’. The ‘Late Stage’ cluster, in contrast, contains genes expressed at low levels from 1hpf to 4hpf that shift to increasingly higher levels of expression from 5hpf to 8hpf.

Clustering by RPKM

For the following heatmap, we hierarchically clustered the significant genes from the two experiments by z-score of the RPKM for all developmental timepoints. We see the same two clusters containing identical genes when clustering by this method.

Significant Gene PCA

PCA analysis on the mean RPKM per sample for the significant genes in the heatmaps above was performed. We see that PC2 holds the variance that separates the ‘Early’ transcripts from the ‘Late’ transcripts. PC1 did not provide differentiation between the timepoints and may reflect technical variation.

GO Term Plots

Transcription Factor heatmap

The following heatmap shows all statistically significant, differentially expressed genes that annotate to GO term ‘GO0006355’: regulation of transcription, DNA-templated, i.e., transcription factors.

Genes having a p-value less than or equal to 1e-5 and an absolute log2 Fold Change value greater than 0.5 at any time point are included.

Differentially Expressed Genes

The tabs below contain heatmaps for differentially expressed genes annotated to the GO terms described in the ‘Term Info’ tab.

GO term Heatmaps

Mesoderm Development

Endoderm Development

Ectoderm Development

Term Info

GO Term Bar Plot

The following bar plot shows the number of significantly differenctially expressed genes annotated to each of the GO terms.

Genes in GO term Bar Plot




GO Term Enrichment

Significantly enriched GO terms that had at least 5 genes annotated, and a Benjamini-Hochberg adjusted p-value less than or equal to 0.05 for either the Early and Late stage genes.

Genes in GO term Bar Plot

LS0tCnRpdGxlOiAiTW5lbWlvcHNpcyBFeHRlbmRlZCBBbmFseXNpcyIKYXV0aG9yOiAiS2lyc3RlbiBHb3R0aW5nIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICB0b2M6IHRydWUKICAgICAgdG9jX2RlcHRoOiAzCiAgICAgIHRvY19mbG9hdDoKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlCi0tLQoKYGBge3Igc2V0dXAsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHMgPSdoaWRlJywgd2FybmluZz1GQUxTRSwgZXJyb3IgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQoKbGlicmFyeShrbml0cikKb3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnLCBmaWcua2VlcD0iYWxsIiwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy5wYXRoPSIuL3N1bW1hcnlfZmlndXJlcy8iLCBjYWNoZSA9IFRSVUUpCm9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiLi8iKQoKbGlicmFyeSgna2lSc3RlbicpCmxpYnJhcnkoJ3RpZHl2ZXJzZScpCmxpYnJhcnkoJ2dncGxvdDInKQpsaWJyYXJ5KCdHTy5kYicpCmxpYnJhcnkoJ3dlc2FuZGVyc29uJykKbGlicmFyeSgncGhlYXRtYXAnKQpsaWJyYXJ5KCdodG1sd2lkZ2V0cycpCmxpYnJhcnkoJ0RUJykKbGlicmFyeSgnUkNvbG9yQnJld2VyJykKCm15X3BhbGxldGUgPC0gYyh3ZXNfcGFsZXR0ZXMkUnVzaG1vcmVbLTJdLCB3ZXNfcGFsZXR0ZXMkRmFudGFzdGljRm94KQoKc2V0d2QoIn4vcHJvamVjdHMvTW5lbWlvcHNpcy93ZWJzaXRlIikKCmBgYAoKI092ZXJ2aWV3CgpPdXIgcXVhbGl0eSBjb250cm9sIGFuYWx5c2VzIHNob3dlZCB0aGF0IHRoZSAyaHBmIGFuZCA4aHBmIHJlZmVyZW5jZXMgd2l0aCByZXBsaWNhdGVzIHJlbW92ZWQgcHJvZHVjZWQgZGF0YXNldHMgd2l0aCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHJlc3VsdHMuIFdlIGV4dGVuZGVkIG91ciBpbml0aWFsIGFuYWx5c2VzIGJ5IGNvbXBhcmluZyB0aGVzZSB0d28gZGF0YXNldHMgdG8gZWFjaCBvdGhlci4KCiNEYXRhIFVzZWQKCjEuIFRoZSBzaWduaWZpY2FudCBnZW5lcyBsaXN0IGZyb20gdGhlIFsyaHBhIENvbnRyb2wgLSBUd28gUmVwbGljYXRlcyBSZW1vdmVkXShhbmFseXNpczJocGEyUlIuaHRtbCkgZXhwZXJpbWVudC4KMi4gVGhlIHNpZ25pZmljYW50IGdlbmVzIGxpc3QgZnJvbSB0aGUgWzhocGEgQ29udHJvbCAtIEZpdmUgUmVwbGljYXRlcyBSZW1vdmVkXShhbmFseXNpczhocGE1UlIuaHRtbCkgZXhwZXJpbWVudC4KCgoKYGBge3IgZml4QW5ub3QsIGV2YWwgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQoKcGZhbTJnbyAgICA8LSBkYXRhLnRhYmxlOjpmcmVhZCgifi9wcm9qZWN0cy9NbmVtaW9wc2lzL2Fubm90YXRpb24vcGZhbTJnbyIsIGhlYWQ9IEZBTFNFLCBkYXRhLnRhYmxlID0gRkFMU0UpCnBmYW0yZ28kVjEgPC0gZ3N1YignUGZhbTonLCAnJywgZ3N1YigiID4uKiIsICIiLCBwZmFtMmdvJFYxKSkKCnBmYW0yZ28gPC0gcGZhbTJnbyAlPiUgc2VwYXJhdGUoVjEsIGludG8gPSBjKCdQZmFtJywgJ3BmYW1EZXNjJyksIHNlcCA9ICIgIikgJT4lIGRwbHlyOjpyZW5hbWUoJ2dvX2lkJyA9IFYyKQoKbWwycGZhbSAgPC0gZGF0YS50YWJsZTo6ZnJlYWQoJ34vcHJvamVjdHMvTW5lbWlvcHNpcy9hbm5vdGF0aW9uL21sZWlkeWkycGZhbS50eHQnLCBoZWFkZXIgPSBUUlVFLCBkYXRhLnRhYmxlID0gRkFMU0UpCm1sMnBmYW0kUGZhbSA8LSBnc3ViKCJcXC4uKiIsICcnLCBtbDJwZmFtJFBmYW0pCgptbDJzcCAgPC0gZGF0YS50YWJsZTo6ZnJlYWQoJ34vcHJvamVjdHMvTW5lbWlvcHNpcy9hbm5vdGF0aW9uL21sX3Zfc3BfMjAxNjA1MjYuYW5ub3QnLCBoZWFkZXIgPSBUUlVFLCBkYXRhLnRhYmxlID0gRkFMU0UpCm1sMnNwICA8LSBtbDJzcCAlPiUgZHBseXI6OnJlbmFtZSgnR2VuZScgPSBpZCkKCnVuaXByb3QyZ28gPC0gZGF0YS50YWJsZTo6ZnJlYWQoIn4vcHJvamVjdHMvTW5lbWlvcHNpcy9hbm5vdGF0aW9uL3VuaXByb3QyZ28udHh0IiwgaGVhZGVyID0gRkFMU0UsIGRhdGEudGFibGUgPSBGQUxTRSwgY29sLm5hbWVzID0gYygnc3BfaWQnLCAnZ29faWQnKSkKdW5pMmdvICAgICA8LSB1bmlwcm90MmdvICU+JSBmaWx0ZXIoc3BfaWQgJWluJSBtbDJzcCRzcF9pZCkKCgoKbWxfYW5ub3QxIDwtIGlubmVyX2pvaW4obWwycGZhbSwgcGZhbTJnbykgJT4lCiAgZ3JvdXBfYnkoR2VuZSkgJT4lCiAgbXV0YXRlKFBmYW0gPSBwYXN0ZShQZmFtLCBjb2xsYXBzZSA9ICI7IikpICU+JQogIG11dGF0ZShnb19pZCA9IHBhc3RlKGdvX2lkLCBjb2xsYXBzZSA9ICc7JykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1wZmFtRGVzYykgJT4lCiAgZGlzdGluY3QoKQoKCm1sX2Fubm90MiA8LSBsZWZ0X2pvaW4obWwyc3AsIHVuaTJnbykKCgoKbWwxIDwtIGxlZnRfam9pbihtbF9hbm5vdDIsIG1sX2Fubm90MSwgYnkgPSAnR2VuZScpICU+JQogIHVuaXRlKGdvX2FsbCwgZ29faWQueCwgZ29faWQueSwgc2VwID0gIjsiKSAlPiUKICBtdXRhdGUoZ29fYWxsID0gc3ViKCdeOycsICcnLCBzdWIoIjtOQSIsICIiLCBnb19hbGwpKSkgCgoKCndyaXRlLnRhYmxlKG1sMSwgJ291dHB1dC9NbGVfYW5ub3QyMDE2MDkwMS50eHQnLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGQUxTRSkKCmBgYAoKCgpgYGB7ciByZWFkZGF0YTJ9CgptbF9hbm5vdCA8LSBkYXRhLnRhYmxlOjpmcmVhZCgnb3V0cHV0L01sZV9hbm5vdDIwMTYwOTAxLnR4dCcsIGRhdGEudGFibGUgPSBGQUxTRSkKCm1sIDwtIG1sX2Fubm90ICU+JQogIHVubmVzdChnb19pZCA9IHN0cnNwbGl0KGdvX2FsbCwgc3BsaXQgPSAiOyIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1nb19hbGwpICU+JQogIGRpc3RpbmN0KCkKCgpycGttcyA8LSBkYXRhLnRhYmxlOjpmcmVhZCgnb3V0cHV0L3Jwa20udHh0JywgZGF0YS50YWJsZSA9IEZBTFNFKQoKcnBrbSA8LSBycGttcyAlPiUKICBnYXRoZXIoU2FtcGxlLCBSUEtNLCAtSUQsIC10cmFuc2NyaXB0X2xlbmd0aCkgICU+JQogIGRwbHlyOjpyZW5hbWUoJ0dlbmUnID0gSUQpICU+JSAKICBzZXBhcmF0ZShTYW1wbGUsIGMoJ1RpbWUnLCAnWWVhcicsICdSZXBsaWNhdGUnKSwgc2VwID0gJ18nKSAlPiUKICBncm91cF9ieShUaW1lLCBHZW5lKSAlPiUKICBtdXRhdGUobWVhblJQS00gPSBtZWFuKFJQS00pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZHBseXI6OnNlbGVjdCgtUlBLTSwgLVllYXIsIC1SZXBsaWNhdGUpICU+JSBkaXN0aW5jdCgpICU+JQogIGdyb3VwX2J5KEdlbmUpICU+JQogIG11dGF0ZSh6c2NvcmUgPSBhcy52ZWN0b3Ioc2NhbGUobWVhblJQS00pKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcighaXMubmEoenNjb3JlKSkKCgoKZXhwciA8LSBkYXRhLnRhYmxlOjpmcmVhZCgnb3V0cHV0L2FsbF9nZW5lc19leHByZXNzaW9uVGlkeThocGEudHh0JywgZGF0YS50YWJsZSA9IEZBTFNFKQpleHByOCA8LSBuYS5vbWl0KGV4cHIpCgpzaWcgPC0gZXhwcjggICU+JSAKICBtdXRhdGUoaWQxID0gaWZlbHNlKGRlYV9JRCA9PSAncGFkaicgJiBkZWFfVmFsdWUgPD0gMWUtNSwgeWVzID0gVFJVRSwgbm8gPSBGQUxTRSkpICU+JQogIG11dGF0ZShpZDIgPSBpZmVsc2UoZGVhX0lEID09ICdsb2cyRm9sZENoYW5nZScgJiBkZWFfVmFsdWUgPj0gMC41LCB5ZXMgPSBUUlVFLCBubyA9IEZBTFNFKSkgJT4lCiAgZ3JvdXBfYnkoY29udHJhc3RJRCwgR2VuZSkgJT4lCiAgZmlsdGVyKGFueShpZDEpLCBhbnkoaWQyKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KEdlbmUpICU+JSAuJEdlbmUKCgpzaWduOCA8LSBleHByOCAlPiUgZmlsdGVyKEdlbmUgJWluJSBzaWcpCgp3cml0ZSh1bmlxdWUoc2lnbjgkR2VuZSksIGZpbGUgPSAnb3V0cHV0L3NpZ25pZmljYW50Xzhoci50eHQnKQoKZXhwciA8LSBkYXRhLnRhYmxlOjpmcmVhZCgnb3V0cHV0L2FsbF9nZW5lc19leHByZXNzaW9uVGlkeTJocGEudHh0JywgZGF0YS50YWJsZSA9IEZBTFNFKQpleHByMiA8LSBuYS5vbWl0KGV4cHIpCgoKc2lnIDwtIGV4cHIyICAlPiUgCiAgbXV0YXRlKGlkMSA9IGlmZWxzZShkZWFfSUQgPT0gJ3BhZGonICYgZGVhX1ZhbHVlIDw9IDFlLTUsIHllcyA9IFRSVUUsIG5vID0gRkFMU0UpKSAlPiUKICBtdXRhdGUoaWQyID0gaWZlbHNlKGRlYV9JRCA9PSAnbG9nMkZvbGRDaGFuZ2UnICYgZGVhX1ZhbHVlID49IDAuNSwgeWVzID0gVFJVRSwgbm8gPSBGQUxTRSkpICU+JQogIGdyb3VwX2J5KGNvbnRyYXN0SUQsIEdlbmUpICU+JQogIGZpbHRlcihhbnkoaWQxKSwgYW55KGlkMikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkaXN0aW5jdChHZW5lKSAlPiUgLiRHZW5lCgoKc2lnbjIgPC0gZXhwcjIgJT4lIGZpbHRlcihHZW5lICVpbiUgc2lnKQoKd3JpdGUodW5pcXVlKHNpZ24yJEdlbmUpLCBmaWxlID0gJ291dHB1dC9zaWduaWZpY2FudF8yaHIudHh0JykKCmFsbF9zaWduIDwtIHVuaXF1ZShjKHNpZ24yJEdlbmUsIHNpZ244JEdlbmUpKQoKYGBgCgoKCiMgQ2x1c3RlcmluZyBTaWduaWZpY2FudCBHZW5lcwoKCiMjIyBDbHVzdGVyaW5nIGJ5IEZvbGQgQ2hhbmdlCgpGb3IgdGhlIGZvbGxvd2luZyBoZWF0bWFwLCB3ZSBoaWVyYXJjaGljYWxseSBjbHVzdGVyZWQgdGhlIHNpZ25pZmljYW50IGdlbmVzIGJ5IGxvZzIgZm9sZCBjaGFuZ2VzIGZvciBlYWNoIG9mIHRoZSB0d28gZXhwZXJpbWVudHMgYW5kIGZvciBhbGwgZGV2ZWxvcG1lbnRhbCB0aW1lcG9pbnRzLgoKV2UgaGlnaGxpZ2h0IHRoZSBmaXJzdCBmb3VyIHRpbWUgcG9pbnRzICgxaHBmIC0gNGhwZikgd2l0aCB0aGUgOGhwZiBjb250cm9sIGFuZCB0aGUgc2Vjb25kIGZvdXIgdGltZXBvaW50cyAoNWhwZiAtIDhocGYpIHdpdGggdGhlIDJocGYgY29udHJvbC4gQnkgZG9pbmcgdGhpcywgd2Ugc2VlIGFuIGVucmljaG1lbnQgZnJvbSAxaHBmIHRvIDRocGYgZm9sbG93ZWQgYnkgYSBncmFkdWFsIGRlY3JlYXNlIGZyb20gNWhwZiB0byA4aHBmIG9mIGEgY29ob3J0IG9mIGdlbmVzIHdlIGFyZSByZWZlcnJpbmcgdG8gYXMgJ0Vhcmx5IFN0YWdlJy4gVGhlICdMYXRlIFN0YWdlJyBjbHVzdGVyLCBpbiBjb250cmFzdCwgY29udGFpbnMgZ2VuZXMgZXhwcmVzc2VkIGF0IGxvdyBsZXZlbHMgZnJvbSAxaHBmIHRvIDRocGYgdGhhdCBzaGlmdCB0byBpbmNyZWFzaW5nbHkgaGlnaGVyIGxldmVscyBvZiBleHByZXNzaW9uIGZyb20gNWhwZiB0byA4aHBmLgoKCmBgYHtyIGNsdXN0ZXJBbGxoZWF0LCBmaWcua2VlcD0nYWxsJ30KCm1saGVyZSA8LSBtbCAlPiUgZHBseXI6OnNlbGVjdChHZW5lLCBzcF9kZXNjKSAlPiUgZGlzdGluY3QoKQoKbGZjIDwtIGRhdGEuZnJhbWUoc2lnbjIgJT4lIGZpbHRlcihkZWFfSUQgPT0gJ2xvZzJGb2xkQ2hhbmdlJykgJT4lIAogICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KC1kZWFfSUQpICU+JSAKICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKGNvbnRyYXN0SUQsIGRlYV9WYWx1ZSksIGNoZWNrLm5hbWVzID0gRkFMU0UpCmxmYzIgPC0gbGVmdF9qb2luKGxmYywgbWxoZXJlKQogCmxmYyA8LSBkYXRhLmZyYW1lKHNpZ244ICU+JSBmaWx0ZXIoZGVhX0lEID09ICdsb2cyRm9sZENoYW5nZScpICU+JSAKICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdCgtZGVhX0lEKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgIHNwcmVhZChjb250cmFzdElELCBkZWFfVmFsdWUpLCBjaGVjay5uYW1lcyA9IEZBTFNFKQogCmxmYzggPC0gbGVmdF9qb2luKGxmYywgbWxoZXJlKQoKCnNpZ0V4cHIgPC0gYmluZF9yb3dzKGV4cHIyLCBleHByOCkgJT4lIAogIGZpbHRlcihHZW5lICVpbiUgYWxsX3NpZ24sIGRlYV9JRCA9PSAnbG9nMkZvbGRDaGFuZ2UnKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1kZWFfSUQpICU+JQogIHNwcmVhZChjb250cmFzdElELCBkZWFfVmFsdWUpCgoKCmxmY19hbm5vdCA8LSBsZWZ0X2pvaW4oc2lnRXhwciwgbWxoZXJlKQoKbGZjIDwtIG5hLm9taXQobGZjX2Fubm90WyAsYygiR2VuZSIsICIxaHBmLzhocGYiLCAiMmhwZi84aHBmIiwgIjNocGYvOGhwZiIsICI0aHBmLzhocGYiLCAiNWhwZi84aHBmIiwgIjZocGYvOGhwZiIsICI3aHBmLzhocGYiLCAiMWhwZi8yaHBmIiwgIjNocGYvMmhwZiIsICI0aHBmLzJocGYiLCAiNWhwZi8yaHBmIiwgIjZocGYvMmhwZiIsICI3aHBmLzJocGYiLCAiOGhwZi8yaHBmIildKQoKcm93bmFtZXMobGZjKSAgICAgIDwtIGxmYyRHZW5lCmxmYyRHZW5lICAgICAgICAgICA8LSBOVUxMCgoKbGZjX2hlYXQgPC0gbWFrZV9waGVhdG1hcF9kZihsZmMsIG1heCA9IDMsIG1pbiA9IC0zKQoKCmhyICA8LSBoY2x1c3QoZGlzdChsZmMpLCBtZXRob2QgPSAnd2FyZC5EJykKCgpteWNsICAgICAgICAgICAgPC0gY3V0cmVlKGhyLCBrID0gMikKY2x1c3Rlci5sZXR0ZXJzIDwtIExFVFRFUlNbc2VxKGZyb20gPSAxLCB0byA9IDIpXQpjbHVzdGVycyAgICAgICAgPC0gYygnTGF0ZSBTdGFnZScsICdFYXJseSBTdGFnZScpCm15Y29scyAgICAgICAgICA8LSBjbHVzdGVyc1thcy52ZWN0b3IobXljbCldCm5hbWVzKG15Y29scykgICA8LSBuYW1lcyhteWNsKQoKYW5ub3RhdGlvbiAgICAgICAgICAgICAgPC0gZGF0YS5mcmFtZShDbHVzdGVyID0gbXljb2xzKQphbm5vdGF0aW9uJFNpZ25pZmljYW50IDwtICdOb25lJyAKCgoKCmFubm90YXRpb25bd2hpY2gocm93bmFtZXMoYW5ub3RhdGlvbikgJWluJSBsZmMyJEdlbmUpLCAnU2lnbmlmaWNhbnQnXSA8LSAnMmhwZiBDb250cm9sJwphbm5vdGF0aW9uW3doaWNoKHJvd25hbWVzKGFubm90YXRpb24pICVpbiUgbGZjOCRHZW5lKSwgJ1NpZ25pZmljYW50J10gPC0gJzhocGYgQ29udHJvbCcKCgoKYW5ub3RhdGlvbiRDbHVzdGVyICAgICA8LSBhcy5mYWN0b3IoYW5ub3RhdGlvbiRDbHVzdGVyKQphbm5vdGF0aW9uJFNpZ25pZmljYW50IDwtIGFzLmZhY3Rvcihhbm5vdGF0aW9uJFNpZ25pZmljYW50KQp1cC5jb2xvcnMgICAgICAgICAgICAgIDwtIGMoJ2dyZWVuJywgJ3B1cnBsZScpCm5hbWVzKHVwLmNvbG9ycykgICAgICAgPC0gY2x1c3RlcnMKU2lnbmlmaWNhbnQgICAgICAgICAgICA8LSBjKCdwaW5rJywgJ3R1cnF1b2lzZScpCm5hbWVzKFNpZ25pZmljYW50KSAgICAgPC0gYygnOGhwZiBDb250cm9sJywgJzJocGYgQ29udHJvbCcpCmFubi5jb2xvcnMgICAgICAgICAgICAgPC0gbGlzdChDbHVzdGVyID0gdXAuY29sb3JzLCBTaWduaWZpY2FudCA9IFNpZ25pZmljYW50KQoKCmFubm90X2NvbHVtbjEgPC0gZGF0YS5mcmFtZShyb3cubmFtZXMgPSBjb2xuYW1lcyhsZmNfaGVhdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZSA9IGFzLmZhY3RvcihzYXBwbHkoY29sbmFtZXMobGZjX2hlYXQpLCBmdW5jdGlvbih4KXtzdHJzcGxpdCh4LCAiLyIpW1sxXV1bMl19KSkpCgoKCgprZWVwX2NvbHMgPC0gYygiMWhwZi84aHBmIiwgIjJocGYvOGhwZiIsICIzaHBmLzhocGYiLCAiNGhwZi84aHBmIiwiNWhwZi8yaHBmIiwgIjZocGYvMmhwZiIsICI3aHBmLzJocGYiLCAiOGhwZi8yaHBmIikKCgpleHAgPC0gYygncm9zeWJyb3duMycsICdjb3JuZmxvd2VyYmx1ZScpCm5hbWVzKGV4cCkgPC0gYygnOGhwZicsICcyaHBmJykKYW5uLmNvbG9ycyRSZWZlcmVuY2UgPC0gZXhwCmFubm90X2NvbHVtbiA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IGtlZXBfY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlID0gYXMuZmFjdG9yKHNhcHBseShrZWVwX2NvbHMsIGZ1bmN0aW9uKHgpe3N0cnNwbGl0KHgsICIvIilbWzFdXVsyXX0pKSkKIAoKYW5ub3RhdGlvbkRGIDwtIGRhdGEuZnJhbWUoYW5ub3RhdGlvbiwgR2VuZSA9IHJvd25hbWVzKGFubm90YXRpb24pKQphbm5vdGF0aW9uREYgPC0gbGVmdF9qb2luKGFubm90YXRpb25ERiwgbWxoZXJlKQoKCgpwaGVhdG1hcChsZmNfaGVhdFssIGtlZXBfY29sc10sIHNob3dfcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIAogICAgICAgICBjbHVzdGVyX3Jvd3MgPSBociwgCiAgICAgICAgIG1haW4gPSBwYXN0ZTAoJ0NsdXN0ZXJpbmcgb2YgdGhlIGxvZzIgRm9sZCBDaGFuZ2VzIG9mICcsIG5yb3cobGZjKSwgJyBHZW5lcycpLCAKICAgICAgICAgYm9yZGVyX2NvbG9yID0gTkEsIAogICAgICAgICBhbm5vdGF0aW9uX3JvdyA9IGFubm90YXRpb24sIAogICAgICAgICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubi5jb2xvcnMsIAogICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IGFubm90X2NvbHVtbiwKICAgICAgICAgYW5ub3RhdGlvbl9uYW1lc19jb2wgPSBGQUxTRSwgCiAgICAgICAgIGdhcHNfY29sID0gYyg0KSwgCiAgICAgICAgIGxhYmVsc19jb2wgPSBjKCIxaHBmIiwgIjJocGYiLCAiM2hwZiIsICI0aHBmIiwiNWhwZiIsICI2aHBmIiwgIjdocGYiLCAiOGhwZiIpKQoKCmBgYAoKCiMjI0NsdXN0ZXJpbmcgYnkgUlBLTSAKCkZvciB0aGUgZm9sbG93aW5nIGhlYXRtYXAsIHdlIGhpZXJhcmNoaWNhbGx5IGNsdXN0ZXJlZCB0aGUgc2lnbmlmaWNhbnQgZ2VuZXMgZnJvbSB0aGUgdHdvIGV4cGVyaW1lbnRzIGJ5IHotc2NvcmUgb2YgdGhlIFJQS00gZm9yIGFsbCBkZXZlbG9wbWVudGFsIHRpbWVwb2ludHMuIFdlIHNlZSB0aGUgc2FtZSB0d28gY2x1c3RlcnMgY29udGFpbmluZyBpZGVudGljYWwgZ2VuZXMgd2hlbiBjbHVzdGVyaW5nIGJ5IHRoaXMgbWV0aG9kLgoKCgpgYGB7ciBSUEtNcGxvdENsdXN0ZXJzfQpycGttX3NpZyA8LSBuYS5vbWl0KGRhdGEuZnJhbWUocnBrbSAlPiUgZmlsdGVyKEdlbmUgJWluJSByb3duYW1lcyhsZmNfaGVhdCkpICU+JQogIGRwbHlyOjpzZWxlY3QoR2VuZSwgVGltZSwgenNjb3JlKSAlPiUKICBzcHJlYWQoVGltZSwgenNjb3JlKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLCBjaGVjay5uYW1lcyA9IEZBTFNFKSkKCgpyb3duYW1lcyhycGttX3NpZykgPC0gcnBrbV9zaWckR2VuZQpycGttX3NpZyRHZW5lICAgICAgPC0gTlVMTAoKcnBrbV9zaWdfaGVhdCA8LSBtYWtlX3BoZWF0bWFwX2RmKHJwa21fc2lnLCBtYXggPSAyLCBtaW4gPSAtMikKCgpociAgPC0gaGNsdXN0KGRpc3QocnBrbV9zaWcpLCBtZXRob2QgPSAnd2FyZC5EJykKCgpteWNsICAgICAgICAgICAgPC0gY3V0cmVlKGhyLCBrID0gMikKY2x1c3Rlci5sZXR0ZXJzIDwtIExFVFRFUlNbc2VxKGZyb20gPSAxLCB0byA9IDIpXQpjbHVzdGVycyAgICAgICAgPC0gYygnTGF0ZSBTdGFnZScsICdFYXJseSBTdGFnZScpCm15Y29scyAgICAgICAgICA8LSBjbHVzdGVyc1thcy52ZWN0b3IobXljbCldCm5hbWVzKG15Y29scykgICA8LSBuYW1lcyhteWNsKQoKYW5ub3RhdGlvbl9ycGttICAgICAgICAgICA8LSBkYXRhLmZyYW1lKENsdXN0ZXI9bXljb2xzKQphbm5vdGF0aW9uX3Jwa20kQ2x1c3RlciAgIDwtIGFzLmZhY3Rvcihhbm5vdGF0aW9uX3Jwa20kQ2x1c3RlcikKdXAuY29sb3JzICAgICAgICAgICAgPC0gYygnZ3JlZW4nLCAncHVycGxlJykKbmFtZXModXAuY29sb3JzKSAgICAgPC0gY2x1c3RlcnMKYW5uLmNvbHMgICAgICAgICAgICAgPC0gbGlzdChDbHVzdGVyID0gdXAuY29sb3JzKQoKCgpwaGVhdG1hcChycGttX3NpZ19oZWF0LCBzaG93X3Jvd25hbWVzID0gRkFMU0UsIGNsdXN0ZXJfY29scyA9IEZBTFNFLCBjbHVzdGVyX3Jvd3MgPSBociwgbWFpbiA9IHBhc3RlMCgnQ2x1c3RlcmluZyBvZiB0aGUgenNjb3JlIG9mIHRoZSBSUEtNIG9mICcsIG5yb3cocnBrbV9zaWcpLCAnIEdlbmVzJyksIGJvcmRlcl9jb2xvciA9IE5BLCBhbm5vdGF0aW9uX3Jvdz1hbm5vdGF0aW9uX3Jwa20sIGFubm90YXRpb25fY29sb3JzID0gYW5uLmNvbHMsIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZShicmV3ZXIucGFsKG4gPSA3LCBuYW1lID0gIk9yUmQiKSkoMTAwKSkKCmBgYAoKCmBgYHtyIHJwa21WaW9saW4sIGV2YWwgPSBGQUxTRX0KCmFsbF9leHByIDwtIHJiaW5kKGV4cHIyLCBleHByOCkKCnplcm9GQyA8LSBhbGxfZXhwciAlPiUgZmlsdGVyKGRlYV9JRCA9PSAnbG9nMkZvbGRDaGFuZ2UnKSAlPiUKICBmaWx0ZXIoYWJzKGRlYV9WYWx1ZSkgPD0gMC41KSAlPiUKICBncm91cF9ieShHZW5lKSAlPiUKICBtdXRhdGUobnVtX0NvbnRyYXN0cyA9IGxlbmd0aCh1bmlxdWUoY29udHJhc3RJRCkpKSAlPiUKICBmaWx0ZXIobnVtX0NvbnRyYXN0cyA9PSAxNCkgJT4lCiAgZGlzdGluY3QoR2VuZSkgJT4lIC4kR2VuZQoKaG91c2VrZWVwZXJzIDwtIHNjYW4oImRiL2hvdXNla2VlcGVycy50eHQiLCB3aGF0ID0gJ2NoYXJhY3RlcicpCgoKcnBrbV9pbmZvIDwtIHJwa20gJT4lCiAgbXV0YXRlKHplcm9GQyA9IGlmZWxzZShHZW5lICVpbiUgemVyb0ZDLCBUUlVFLCBGQUxTRSkpICU+JQogIG11dGF0ZShob3VzZWtlZXBlcnMgPSBpZmVsc2UoR2VuZSAlaW4lIGhvdXNla2VlcGVycywgVFJVRSwgRkFMU0UpKSAlPiUgCiAgbXV0YXRlKGxvZ1JQS00gPSBsb2cobWVhblJQS00pKSAlPiUKICBtdXRhdGUoc2lnbmlmaWNhbnQyID0gaWZlbHNlKEdlbmUgJWluJSBzaWduMiRHZW5lLCAnMmhwZicsIEZBTFNFKSkgJT4lCiAgbXV0YXRlKHNpZ25pZmljYW50OCA9IGlmZWxzZShHZW5lICVpbiUgc2lnbjgkR2VuZSwgJzhocGYnLCBGQUxTRSkpICU+JQogIGdhdGhlcihPYnNlcnZhdGlvbiwgUmVmZXJlbmNlLCAtR2VuZSwgLXRyYW5zY3JpcHRfbGVuZ3RoLCAtVGltZSwgLW1lYW5SUEtNLCAtenNjb3JlLCAtemVyb0ZDLCAtaG91c2VrZWVwZXJzLCAtbG9nUlBLTSkKCgpnZ3Bsb3QocnBrbV9pbmZvLCBhZXMoeCA9IFRpbWUsIHkgPSBsb2dSUEtNKSkgKwogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gUmVmZXJlbmNlKSwgYWxwaGEgPSAwLjMpICsKICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJwdXJwbGUiLCJncmVlbiIpLCBsaW1pdHMgPSBjKCcyaHBmJywgJzhocGYnKSkgKwogICBnZW9tX3Zpb2xpbihhbHBoYSA9IDApICsKICAgdGhlbWVfbWluaW1hbCgpICsKICAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArCiAgIGxhYnMoCiAgICAgdGl0bGUgPSAnQWJ1bmRhbmNlIG9mIGFsbCBHZW5lcyBwZXIgVGltZSBQb2ludCcsCiAgICAgeSA9ICdMb2cxMCBvZiB0aGUgTWVhbiBSUEtNJywKICAgICBzdWJ0aXRsZSA9ICJHZW5lcyBzaWduaWZpY2FudCB0byB0aGUgMmhwZiBhbmQgOGhwZiByZWZlcmVuY2UgaGlnaGxpZ2h0ZWQgaW4gcHVycGxlIGFuZCBncmVlbi4iCiAgKQogICAgIApgYGAKCgojIFNpZ25pZmljYW50IEdlbmUgUENBCgpQQ0EgYW5hbHlzaXMgb24gdGhlIG1lYW4gUlBLTSBwZXIgc2FtcGxlIGZvciB0aGUgc2lnbmlmaWNhbnQgZ2VuZXMgaW4gdGhlIGhlYXRtYXBzIGFib3ZlIHdhcyBwZXJmb3JtZWQuIFdlIHNlZSB0aGF0IFBDMiBob2xkcyB0aGUgdmFyaWFuY2UgdGhhdCBzZXBhcmF0ZXMgdGhlICdFYXJseScgdHJhbnNjcmlwdHMgZnJvbSB0aGUgJ0xhdGUnIHRyYW5zY3JpcHRzLiBQQzEgZGlkIG5vdCBwcm92aWRlIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIHRoZSB0aW1lcG9pbnRzIGFuZCBtYXkgcmVmbGVjdCB0ZWNobmljYWwgdmFyaWF0aW9uLgoKYGBge3J9CgojcnBrbSBvZiBzaWduaWZpY2FudCBnZW5lcyBQQ0EKCnJwa21fc3ByZWFkIDwtIGRhdGEuZnJhbWUocnBrbSAlPiUgZHBseXI6OnNlbGVjdCgtenNjb3JlLCAtdHJhbnNjcmlwdF9sZW5ndGgpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkKFRpbWUsIG1lYW5SUEtNKSwgY2hlY2submFtZXMgPSBGQUxTRSkKCnJvd25hbWVzKHJwa21fc3ByZWFkKSA8LSBycGttX3NwcmVhZCRHZW5lCnJwa21fc3ByZWFkJEdlbmUgICAgICA8LSBOVUxMCgpwcmluY29tcCA8LSBwcmNvbXAocnBrbV9zcHJlYWQpCgpyb3QgPC0gZGF0YS5mcmFtZShwcmluY29tcCRyb3RhdGlvbikKCnJvdCRTYW1wbGUgPC0gcm93bmFtZXMocm90KQpyb3QkU3RhZ2UgIDwtIGMocmVwKCdFYXJseScsIDUpLCByZXAoJ0xhdGUnLCA0KSkKCmdncGxvdChkYXRhID0gcm90LCBhZXMoeCA9IFBDMiwgeSA9IFBDMywgbGFiZWwgPSBTYW1wbGUsIGNvbG91ciA9IFN0YWdlKSkgKwogICAgICAgICAgZ2VvbV9wb2ludChzaXplID0gMSkgKyB0aGVtZV9taW5pbWFsKCkgKyBnZW9tX3RleHQoaGp1c3QgPSAwLCB2anVzdCA9IDAsIHNpemUgPSAzKSArCiAgICAgICAgICBnZ3RpdGxlKCdBbGwgU2FtcGxlcyBQQ0Egb2YgTWVhbiBSUEtNIG9mIFNpZ25pZmljYW50IEdlbmVzJykgKyBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjIsIDApKQoKYGBgCgoKI0NsdXN0ZXIgVHJlbmRzCgpUcmVuZHMgZm9yIGVhY2ggb2YgdGhlIGNsdXN0ZXJzIGluIHRoZSBoZWF0bWFwICdDbHVzdGVyaW5nIG9mIHRoZSBsb2cyIEZvbGQgQ2hhbmdlcyBvZiAyNTk0IEdlbmVzJyBhcmUgcGxvdHRlZCBiZWxvdywgd2l0aCB0aGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb24gdGhlIGVycm9yIGJhcnMgZm9yIGJvdGggdGhlIG1lYW4gei1zY29yZSBhbmQgdGhlIG1lYW4gUlBLTS4KCmBgYHtyIHpzY29yZX0KCiMjIGZpbmQgdGhlIG1lYW4gUlBLTSBmb3IgdGltZXBvaW50IGZvciBlYWNoIGNsdXN0ZXIKCiAKcnBrbV9zdWIgPC0gbGVmdF9qb2luKGFubm90YXRpb25ERiwgcnBrbSkgJT4lCiAgZHBseXI6OnNlbGVjdChDbHVzdGVyLCBUaW1lLCB6c2NvcmUsIG1lYW5SUEtNKSAlPiUKICBncm91cF9ieShDbHVzdGVyLCBUaW1lKSAlPiUKICBtdXRhdGUobWVhblJQS010b3QgPSBtZWFuKG1lYW5SUEtNKSkgJT4lCiAgbXV0YXRlKG1lYW5ac2NvcmUgPSBtZWFuKHpzY29yZSkpICU+JQogIG11dGF0ZSh6c2NvcmVfZXJyb3IgPSAoMS45NjQ1KnNlKHpzY29yZSkpKSAlPiUgCiAgbXV0YXRlKHJwa21fZXJyb3IgPSAoMS45NjQ1KnNlKG1lYW5SUEtNKSkpICU+JSAKICBkcGx5cjo6c2VsZWN0KC16c2NvcmUpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6c2VsZWN0KENsdXN0ZXIsIFRpbWUsIG1lYW5ac2NvcmUsIHpzY29yZV9lcnJvcikgJT4lCiAgbXV0YXRlKHltaW4gPSBtZWFuWnNjb3JlIC0genNjb3JlX2Vycm9yKSAlPiUKICBtdXRhdGUoeW1heCA9IG1lYW5ac2NvcmUgKyB6c2NvcmVfZXJyb3IpICU+JQogIGRpc3RpbmN0KCkKCgoKCmdncGxvdChycGttX3N1YiwgYWVzKHkgPSBtZWFuWnNjb3JlLCB4ID0gVGltZSwgZ3JvdXAgPSAxKSkgKyAKICAgICAgZ2VvbV9saW5lKCkgKyAKICAgICAgdGhlbWVfbWluaW1hbCgpICsKICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtOTApCiAgICAgICAgICAgICkgKyBmYWNldF9ncmlkKC4gfiBDbHVzdGVyKSArCiAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC4zLCBzaXplID0gMC4xKSArCiAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHltYXggPSB5bWF4LCB5bWluID0geW1pbiksIHdpZHRoID0gMC4xLCBjb2xvdXIgPSAicmVkIikgKwogICAgICB5bGFiKCdNZWFuIHotc2NvcmUnKSArCiAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0zLCAzKSwgYnJlYWtzID0gc2VxKC0zLCAzKSkgKyBnZ3RpdGxlKCdNZWFuIFpzY29yZSBvZiBTaWduaWZpY2FudCBHZW5lcyBQZXIgQ2x1c3RlcicpCgoKCgpycGttX3N1Yl9ycGttIDwtIGxlZnRfam9pbihhbm5vdGF0aW9uREYsIHJwa20pICU+JQogIGRwbHlyOjpzZWxlY3QoQ2x1c3RlciwgVGltZSwgenNjb3JlLCBtZWFuUlBLTSkgJT4lCiAgZ3JvdXBfYnkoQ2x1c3RlciwgVGltZSkgJT4lCiAgbXV0YXRlKG1lYW5SUEtNdG90ID0gbWVhbihtZWFuUlBLTSkpICU+JQogIG11dGF0ZShycGttX2Vycm9yID0gKDEuOTY0NSpzZShtZWFuUlBLTSkpKSAlPiUgCiAgZHBseXI6OnNlbGVjdCgtenNjb3JlLCAtbWVhblJQS00pICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6c2VsZWN0KENsdXN0ZXIsIFRpbWUsIG1lYW5SUEtNdG90LCBycGttX2Vycm9yKSAlPiUKICBtdXRhdGUoeW1pbiA9IG1lYW5SUEtNdG90IC0gcnBrbV9lcnJvcikgJT4lCiAgbXV0YXRlKHltYXggPSBtZWFuUlBLTXRvdCArIHJwa21fZXJyb3IpICU+JQogIGRpc3RpbmN0KCkKCgpnZ3Bsb3QocnBrbV9zdWJfcnBrbSwgYWVzKHkgPSBtZWFuUlBLTXRvdCwgeCA9IFRpbWUpKSArIAogICAgICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICAgICAgdGhlbWVfbWluaW1hbCgpICsKICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtOTApCiAgICAgICAgICAgICkgKyBmYWNldF9ncmlkKC4gfiBDbHVzdGVyKSArCiAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGFscGhhID0gMC4zLCBzaXplID0gMC4xKSArCiAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHltYXggPSB5bWF4LCB5bWluID0geW1pbiksIHdpZHRoID0gMC4xLCBjb2xvdXIgPSAicmVkIikgKwogICAgICB5bGFiKCdNZWFuIFJQS00nKSArIGdndGl0bGUoJ01lYW4gUlBLTSBvZiBTaWduaWZpY2FudCBHZW5lcyBQZXIgQ2x1c3RlcicpCgpgYGAKCiMjIFRhYmxlIG9mIENsdXN0ZXJlZCBHZW5lcwoKU2VhcmNoYWJsZSB0YWJsZSBvZiBpbnRlcmFjdGl2ZSB6LXNjb3JlIGFuZCBtZWFuIFJQS00gdHJlbmRzIGZvciBpbmRpdmlkdWFsIGdlbmUgdHJhbnNjcmlwdHMuIFRvIHZpc3VhbGl6ZSBpbmRpdmlkdWFsIHNjb3JlcywgbW91c2Ugb3ZlciB0aGUgc3BhcmtsaW5lcyBvciBiYXIgZ3JhcGhzIGluIHRoZSB0YWJsZSBiZWxvdy4KCmBgYHtyfQoKCmJhcl9zdHJpbmcgPC0gInR5cGU6ICdiYXInLCBiYXJDb2xvcjogJ3JlZCcsIG5lZ0JhckNvbG9yOiAnYmx1ZScsIGhpZ2hsaWdodENvbG9yOiAnYmxhY2snIgoKY2JfYmFyID0gSlMocGFzdGUwKCJmdW5jdGlvbiAob1NldHRpbmdzLCBqc29uKSB7ICQoJy5zcGFyazpub3QoOmhhcyhjYW52YXMpKScpLnNwYXJrbGluZSgnaHRtbCcsIHsgIiwgCiAgICBiYXJfc3RyaW5nLCAiIH0pOyB9IiksIGNvbGxhcHNlID0gIiIpCgoKbGluZV9zdHJpbmcgPC0gInR5cGU6ICdsaW5lJywgbGluZUNvbG9yOiAnYmxhY2snLCBmaWxsQ29sb3I6ICcnLCBoaWdobGlnaHRMaW5lQ29sb3I6ICdyZWQnLCBoaWdobGlnaHRTcG90Q29sb3I6ICdyZWQnIgoKY2JfbGluZSA9IEpTKHBhc3RlMCgiZnVuY3Rpb24gKG9TZXR0aW5ncywganNvbikgeyAkKCcuc3Bhcms6bm90KDpoYXMoY2FudmFzKSknKS5zcGFya2xpbmUoJ2h0bWwnLCB7ICIsIAogICAgbGluZV9zdHJpbmcsICIsIGNoYXJ0UmFuZ2VNaW46ICIsIC0zLCAiLCBjaGFydFJhbmdlTWF4OiAiLCAzLCAiIH0pOyB9IiksIAogICAgY29sbGFwc2UgPSAiIikKCmNkIDwtIGxpc3QobGlzdCh0YXJnZXRzID0gMiwgcmVuZGVyID0gSlMoImZ1bmN0aW9uKGRhdGEsIHR5cGUsIGZ1bGwpeyByZXR1cm4gJzxzcGFuIGNsYXNzPXNwYXJrU2FtcGxlcz4nICsgZGF0YSArICc8L3NwYW4+JyB9IikpLCAKICAgIGxpc3QodGFyZ2V0cyA9IDEsIHJlbmRlciA9IEpTKCJmdW5jdGlvbihkYXRhLCB0eXBlLCBmdWxsKXsgcmV0dXJuICc8c3BhbiBjbGFzcz1zcGFya1Nlcmllcz4nICsgZGF0YSArICc8L3NwYW4+JyB9IikpKQoKY2IgPSBKUyhwYXN0ZTAoImZ1bmN0aW9uIChvU2V0dGluZ3MsIGpzb24pIHtcbiAgJCgnLnNwYXJrU2VyaWVzOm5vdCg6aGFzKGNhbnZhcykpJykuc3BhcmtsaW5lKCdodG1sJywgeyAiLCAKICAgIGxpbmVfc3RyaW5nLCAiIH0pO1xuICAkKCcuc3BhcmtTYW1wbGVzOm5vdCg6aGFzKGNhbnZhcykpJykuc3BhcmtsaW5lKCdodG1sJywgeyAiLCAKICAgIGJhcl9zdHJpbmcsICIgfSk7XG59IiksIGNvbGxhcHNlID0gIiIpCgoKCnJwa21fc3ViIDwtIGxlZnRfam9pbihhbm5vdGF0aW9uREYsIHJwa20pICU+JQogIGdyb3VwX2J5KENsdXN0ZXIsIEdlbmUpICU+JQogIG11dGF0ZSh6c2NvcmUgPSBwYXN0ZShyb3VuZCh6c2NvcmUsIGRpZ2l0cyA9IDIpLCBjb2xsYXBzZSA9ICIsIikpICU+JQogIG11dGF0ZShtZWFuUlBLTSA9IHBhc3RlKHJvdW5kKG1lYW5SUEtNLCBkaWdpdHMgPSAyKSwgY29sbGFwc2UgPSAiLCIpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZHBseXI6OnNlbGVjdChHZW5lLCBDbHVzdGVyLCB0cmFuc2NyaXB0X2xlbmd0aCwgenNjb3JlLCBtZWFuUlBLTSwgc3BfZGVzYykgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBkcGx5cjo6cmVuYW1lKCdsZW5ndGgnID0gdHJhbnNjcmlwdF9sZW5ndGgpICU+JQogIGRwbHlyOjpyZW5hbWUoJ1JQS00nID0gbWVhblJQS00pCgoKYmFyX3N0cmluZyA8LSAidHlwZTogJ2JhcicsIGJhckNvbG9yOiAncmVkJywgbmVnQmFyQ29sb3I6ICdibHVlJywgaGlnaGxpZ2h0Q29sb3I6ICdibGFjayciCgpjYl9iYXIgPSBKUyhwYXN0ZTAoImZ1bmN0aW9uIChvU2V0dGluZ3MsIGpzb24pIHsgJCgnLnNwYXJrOm5vdCg6aGFzKGNhbnZhcykpJykuc3BhcmtsaW5lKCdodG1sJywgeyAiLCAKICAgIGJhcl9zdHJpbmcsICIgfSk7IH0iKSwgY29sbGFwc2UgPSAiIikKCgpsaW5lX3N0cmluZyA8LSAidHlwZTogJ2xpbmUnLCBsaW5lQ29sb3I6ICdibGFjaycsIGZpbGxDb2xvcjogJycsIGhpZ2hsaWdodExpbmVDb2xvcjogJ3JlZCcsIGhpZ2hsaWdodFNwb3RDb2xvcjogJ3JlZCciCgpjYl9saW5lID0gSlMocGFzdGUwKCJmdW5jdGlvbiAob1NldHRpbmdzLCBqc29uKSB7ICQoJy5zcGFyazpub3QoOmhhcyhjYW52YXMpKScpLnNwYXJrbGluZSgnaHRtbCcsIHsgIiwgCiAgICBsaW5lX3N0cmluZywgIiwgY2hhcnRSYW5nZU1pbjogIiwgLTMsICIsIGNoYXJ0UmFuZ2VNYXg6ICIsIDMsICIgfSk7IH0iKSwgCiAgICBjb2xsYXBzZSA9ICIiKQoKY2QgPC0gbGlzdChsaXN0KHRhcmdldHMgPSA0LCByZW5kZXIgPSBKUygiZnVuY3Rpb24oZGF0YSwgdHlwZSwgZnVsbCl7IHJldHVybiAnPHNwYW4gY2xhc3M9c3BhcmtTYW1wbGVzPicgKyBkYXRhICsgJzwvc3Bhbj4nIH0iKSksIAogICAgbGlzdCh0YXJnZXRzID0gMywgcmVuZGVyID0gSlMoImZ1bmN0aW9uKGRhdGEsIHR5cGUsIGZ1bGwpeyByZXR1cm4gJzxzcGFuIGNsYXNzPXNwYXJrU2VyaWVzPicgKyBkYXRhICsgJzwvc3Bhbj4nIH0iKSkpCgpjYiA9IEpTKHBhc3RlMCgiZnVuY3Rpb24gKG9TZXR0aW5ncywganNvbikge1xuICAkKCcuc3BhcmtTZXJpZXM6bm90KDpoYXMoY2FudmFzKSknKS5zcGFya2xpbmUoJ2h0bWwnLCB7ICIsIAogICAgbGluZV9zdHJpbmcsICIgfSk7XG4gICQoJy5zcGFya1NhbXBsZXM6bm90KDpoYXMoY2FudmFzKSknKS5zcGFya2xpbmUoJ2h0bWwnLCB7ICIsIAogICAgYmFyX3N0cmluZywgIiB9KTtcbn0iKSwgY29sbGFwc2UgPSAiIikKCmNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIHRhcmdldHMgPSA0KSkKCmQ1IDwtIGRhdGF0YWJsZShycGttX3N1Yiwgcm93bmFtZXMgPSBGQUxTRSwgZXh0ZW5zaW9ucyA9IGMoJ0J1dHRvbnMnLCdTY3JvbGxlcicsICdDb2xSZW9yZGVyJyksIG9wdGlvbnMgPSBsaXN0KAogICAgYXV0b1dpZHRoID0gVFJVRSwKICAgIGNvbHVtbkRlZnMgPSBjZCwKICAgIGZuRHJhd0NhbGxiYWNrID0gY2IsCiAgICBkb20gPSAnZnJ0QmlwJywKICAgIGJ1dHRvbnMgPSBjKCdjb3B5JywgJ2NzdicsICdleGNlbCcsICdwZGYnLCAncHJpbnQnKSwKICAgIGRlZmVyUmVuZGVyID0gVFJVRSwKICAgIHNjcm9sbFkgPSA4MDAsCiAgICBjb2xSZW9yZGVyID0gVFJVRSwKICAgIHNjcm9sbGVyID0gVFJVRSkpCmQ1JGRlcGVuZGVuY2llcyA8LSBhcHBlbmQoZDUkZGVwZW5kZW5jaWVzLCBodG1sd2lkZ2V0czo6OmdldERlcGVuZGVuY3koInNwYXJrbGluZSIpKQoKCmBgYAoKYGBge3IsIHJlc3VsdHM9J2FzaXMnLCBjYWNoZSA9IEZBTFNFfQpkNQoKY2F0KCc8YnI+PGJyPjxicj4nKQpgYGAKCgoKIyBHTyBUZXJtIFBsb3RzCgojIyBUcmFuc2NyaXB0aW9uIEZhY3RvciBoZWF0bWFwCgpUaGUgZm9sbG93aW5nIGhlYXRtYXAgc2hvd3MgYWxsIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyB0aGF0IGFubm90YXRlIHRvIEdPIHRlcm0gJ0dPMDAwNjM1NSc6IHJlZ3VsYXRpb24gb2YgdHJhbnNjcmlwdGlvbiwgRE5BLXRlbXBsYXRlZCwgaS5lLiwgdHJhbnNjcmlwdGlvbiBmYWN0b3JzLgoKR2VuZXMgaGF2aW5nIGEgcC12YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMWUtNSBhbmQgYW4gYWJzb2x1dGUgbG9nMiBGb2xkIENoYW5nZSB2YWx1ZSBncmVhdGVyIHRoYW4gMC41IGF0IGFueSB0aW1lIHBvaW50IGFyZSBpbmNsdWRlZC4KCmBgYHtyIHRmaGVhdG1hcCwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTExfQoKCnNpZ24gPC0gYmluZF9yb3dzKGV4cHI4LCBleHByMikgJT4lIGxlZnRfam9pbihhbm5vdGF0aW9uREYsIC4sIGJ5ID0gJ0dlbmUnKSAlPiUKICBsZWZ0X2pvaW4oLiwgbWwsIGJ5ID0gYygiR2VuZSIsICJzcF9kZXNjIikpICU+JQogIGZpbHRlcihkZWFfSUQgPT0gJ2xvZzJGb2xkQ2hhbmdlJykgJT4lCiAgc3ByZWFkKGNvbnRyYXN0SUQsIGRlYV9WYWx1ZSkgJT4lCiAgZHBseXI6OnJlbmFtZSgnYXNzb2NpYXRlZCcgPSBnb19pZCkgJT4lIC4kR2VuZQoKCgoKc2lnbnRmIDwtIGJpbmRfcm93cyhleHByOCwgZXhwcjIpICU+JSBmaWx0ZXIoR2VuZSAlaW4lIHNpZ24pCgoKdGZfZmFjdG9yIDwtIGZpbHRlcihtbF9hbm5vdCwgZ3JlcGwoJ0dPOjAwMDYzNTUnLCBnb19hbGwpKSAlPiUKICB1bml0ZShjb2wgPSBJRCwgR2VuZSwgc3BfZGVzYywgc2VwID0gIjogIiwgcmVtb3ZlID0gRkFMU0UpICU+JQogIGRpc3RpbmN0KCkKCmxmYyA8LSBzaWdudGYgJT4lIGZpbHRlcihkZWFfSUQgPT0gJ2xvZzJGb2xkQ2hhbmdlJykgJT4lCiAgZHBseXI6OnNlbGVjdCgtZGVhX0lEKSAlPiUKICBzcHJlYWQoY29udHJhc3RJRCwgZGVhX1ZhbHVlKSAlPiUKICBkaXN0aW5jdCgpCgp0ZmxmYyA8LSBpbm5lcl9qb2luKHRmX2ZhY3RvciwgbGZjKSAlPiUgCiAgZHBseXI6OnNlbGVjdCgtc3BfaWQsIC1zcF9kZXNjLCAtc3BfZXZhbHVlLCAtZ29fYWxsLCAtUGZhbSkKCgp0ZmwgPC0gZGF0YS5mcmFtZSh0ZmxmYyAlPiUgZHBseXI6OnNlbGVjdCgtR2VuZSksIGNoZWNrLm5hbWVzID0gRkFMU0UpCgpyb3duYW1lcyh0ZmwpIDwtIHRmbCRJRAp0ZmwkSUQgPC0gTlVMTAoKdGZsX2hlYXQgPC0gbWFrZV9waGVhdG1hcF9kZih0ZmwsIG1pbiA9IC0yLCBtYXggPSAyKQoKYW5ub3RhdGlvbl9zdWIgICAgICAgICAgIDwtIGxlZnRfam9pbih0ZmxmYywgYW5ub3RhdGlvbkRGLCBieSA9ICdHZW5lJykgJT4lIGRwbHlyOjpzZWxlY3QoQ2x1c3RlciwgSUQpCnJvd25hbWVzKGFubm90YXRpb25fc3ViKSA8LSBhbm5vdGF0aW9uX3N1YiRJRAphbm5vdGF0aW9uX3N1YiRJRCA8LSBOVUxMCiAgCgpwaGVhdG1hcCh0ZmxfaGVhdFssIGtlZXBfY29sc10sICAKICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIAogICAgICAgICBjbHVzdGVyaW5nX21ldGhvZCA9ICd3YXJkLkQnLCAKICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzID0gZGlzdCh0ZmwpLCAKICAgICAgICAgbWFpbiA9IHBhc3RlMCgnQ2x1c3RlcmluZyBvZiAnLCBucm93KHRmbCksICcgR2VuZXMnKSwgCiAgICAgICAgIGJvcmRlcl9jb2xvciA9IE5BLCAKICAgICAgICAgY2VsbHdpZHRoID0gMTUsIAogICAgICAgICBjZWxsaGVpZ2h0ID0gMTAsIAogICAgICAgICBhbm5vdGF0aW9uX3JvdyA9IGFubm90YXRpb25fc3ViLCAKICAgICAgICAgZ2Fwc19jb2wgPSBjKDQpLAogICAgICAgICBsYWJlbHNfY29sID0gYygiMWhwZiIsICIyaHBmIiwgIjNocGYiLCAiNGhwZiIsIjVocGYiLCAiNmhwZiIsICI3aHBmIiwgIjhocGYiKSwgCiAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5uLmNvbG9ycywgCiAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub3RfY29sdW1uLCAKICAgICAgICAgYW5ub3RhdGlvbl9uYW1lc19jb2wgPSBGQUxTRSwKICAgICAgICAgbGVnZW5kX2xhYmVscyA9IGMoc2VxKC0zLCAzKSwgInRpdGxlXG4iKSkKCgpgYGAKCgojIyBEaWZmZXJlbnRpYWxseSBFeHByZXNzZWQgR2VuZXMKClRoZSB0YWJzIGJlbG93IGNvbnRhaW4gaGVhdG1hcHMgZm9yIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBhbm5vdGF0ZWQgdG8gdGhlIEdPIHRlcm1zIGRlc2NyaWJlZCBpbiB0aGUgJ1Rlcm0gSW5mbycgdGFiLgoKCgoKYGBge3IgREVIZWF0bWFwcywgZmlnLmtlZXA9ImFsbCIsIHJlc3VsdD0nYXNpcyd9CgoKc2ltcGxlQ2FwIDwtIGZ1bmN0aW9uKHgpIHsKICAgIHMgPC0gc3Ryc3BsaXQoeCwgIiAiKVtbMV1dCiAgICBwYXN0ZSh0b3VwcGVyKHN1YnN0cmluZyhzLCAxLCAxKSksIHN1YnN0cmluZyhzLCAyKSwKICAgICAgICAgIHNlcCA9ICIiLCBjb2xsYXBzZSA9ICIgIikKfQoKR09zICAgPC0gYygnR086MDAwNzA0OScsICdHTzowMDMwMTU0JywgJ0dPOjAwMDcyNzYnLCAnR086MDAwNzQ5OCcsICdHTzowMDA3NDkyJywgJ0dPOjAwMDczOTgnLCAnR086MDA0ODcyOScpCgoKCgojIyBhdHRhY2ggdGhlIGNoaWxkIHRlcm0gdG8gdGhlIGRhdGEgZnJhbWUgb2YgcGFyZW50IHRlcm1zCgp4eCAgICAgICAgICAgPC0gYXMubGlzdChHT0JQQU5DRVNUT1IpCmFsbEFuY2VzdG9yIDwtIHh4W0dPc10KeCAgICAgICAgICAgPC0gYXMubGlzdChHT0JQT0ZGU1BSSU5HKQphbGxPZmZzcHJpbmcgPC0geFtHT3NdCgphbGxBbmMgPC0gYmluZF9yb3dzKGxhcHBseShHT3MsIGZ1bmN0aW9uKHgpewogIGRhdGEuZnJhbWUoZ29faWQgPSB4LCBhc3NvY2lhdGVkID0gdW5saXN0KGFsbEFuY2VzdG9yW3hdKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQp9KSkgJT4lIGZpbHRlcihhc3NvY2lhdGVkICE9ICdhbGwnKQoKYWxsT2ZmIDwtIGJpbmRfcm93cyhsYXBwbHkoR09zLCBmdW5jdGlvbih4KXsKICBkYXRhLmZyYW1lKGdvX2lkID0geCwgYXNzb2NpYXRlZCA9IHVubGlzdChhbGxPZmZzcHJpbmdbeF0pLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCn0pKQoKeHh4IDwtIHJiaW5kKGFsbEFuYywgYWxsT2ZmKQoKIyMgc3RhcnQgaGVyZQoKYWxsX2Fzc29jaWF0ZWQgPC0gcmJpbmQoZGF0YS5mcmFtZShnb19pZCA9IEdPcywgYXNzb2NpYXRlZCA9IEdPcywgaWQgPSAnb3JpZ2luYWwnLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZSh4eHgsIGlkID0gJ2Rlcml2ZWQnLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpKSAlPiUKICBmaWx0ZXIoYXNzb2NpYXRlZCAhPSAnYWxsJykKCgphbGxfYXNzb2NpYXRlZCRUZXJtIDwtIHNhcHBseShhbGxfYXNzb2NpYXRlZCRnb19pZCwgZnVuY3Rpb24oeCl7c2ltcGxlQ2FwKFRlcm0oR09URVJNW1t4XV0pKX0pCgoKc2lnbiA8LSBiaW5kX3Jvd3MoZXhwcjgsIGV4cHIyKSAlPiUgCiAgbGVmdF9qb2luKGFubm90YXRpb25ERiwgLiwgYnkgPSAnR2VuZScpICU+JQogIGxlZnRfam9pbiguLCBtbCwgYnkgPSBjKCJHZW5lIiwgInNwX2Rlc2MiKSkgJT4lCiAgZmlsdGVyKGRlYV9JRCA9PSAnbG9nMkZvbGRDaGFuZ2UnKSAlPiUKICBzcHJlYWQoY29udHJhc3RJRCwgZGVhX1ZhbHVlKSAlPiUKICBkcGx5cjo6cmVuYW1lKCdhc3NvY2lhdGVkJyA9IGdvX2lkKQoKZGVhX2dvMSA8LSBpbm5lcl9qb2luKHNpZ24sIGFsbF9hc3NvY2lhdGVkLCBieSA9ICdhc3NvY2lhdGVkJykgJT4lCiAgdW5pdGUoSUQsIEdlbmUsIHNwX2Rlc2MsIHNlcCA9ICc6ICcsIHJlbW92ZSA9IEZBTFNFKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1hc3NvY2lhdGVkLCAtaWQpICU+JQogIGRpc3RpbmN0KCkKCmRlYV9nbyA8LSBkZWFfZ28xICU+JSBkcGx5cjo6c2VsZWN0KC1zcF9pZCwgLXNwX2V2YWx1ZSwgLVBmYW0sIC1kZWFfSUQsIC1TaWduaWZpY2FudCwgLUNsdXN0ZXIsIC1zcF9kZXNjKQoKCmBgYAoKYGBge3J9CmhlYXRtYXBzIDwtIGxhcHBseShHT3MsIGZ1bmN0aW9uKHgpewogICAgZGZfc3ViMSA8LSBkZWFfZ29bd2hpY2goZGVhX2dvJGdvX2lkID09IHgpLCBdICU+JQogICAgICBkaXN0aW5jdCgpCiAgICB0aXRsZSA8LSBwYXN0ZTAoJ0dlbmVzIChOPScsIG5yb3coZGZfc3ViMSksICcpJykKICAgIGRmX3N1YiA8LSBkYXRhLmZyYW1lKGRwbHlyOjpzZWxlY3QoZGZfc3ViMSwgLVRlcm0pLCBjaGVjay5uYW1lcyA9IEZBTFNFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgaWYobnJvdyhkZl9zdWIpID4gMSl7CiAgICByb3duYW1lcyhkZl9zdWIpIDwtIGRmX3N1YiRJRAogICAgZGZfc3ViJElEICAgICAgICA8LSBOVUxMCiAgICBkZl9zdWJfaGVhdCAgICAgIDwtIG1ha2VfcGhlYXRtYXBfZGYoZGZfc3ViLCBtaW4gPSAtMiwgbWF4ID0gMikKICAgICNoZWF0bWFwIDwtIHBoZWF0bWFwKGRmX3N1Yl9oZWF0LCBjbHVzdGVyX2NvbHMgPSBGQUxTRSwgY2x1c3RlcmluZ19tZXRob2QgPSAnY29tcGxldGUnLCBjbHVzdGVyaW5nX2Rpc3RhbmNlX3Jvd3MgPSBkaXN0KGRmX3N1YiksCiAgICAgICAgICAgI21haW4gPSB0aXRsZSwgYm9yZGVyX2NvbG9yID0gTkEsIGNlbGx3aWR0aCA9IDE1LCBjZWxsaGVpZ2h0ID0gMTAsIHNpbGVudCA9IFRSVUUpCiAgICBsaXN0KGNhdG5hbWUgPSB1bmlxdWUoZGZfc3ViMSRUZXJtKSwgZGYgPSBkZl9zdWIsIHRpdGxlID0gdGl0bGUpCiAgfQp9KQoKaGVhdG1hcHMgPC0gaGVhdG1hcHNbd2hpY2goc2FwcGx5KGhlYXRtYXBzLCBmdW5jdGlvbih4KXshaXMubnVsbCh4KX0pKV0KCmBgYAoKIyMjIEdPIHRlcm0gSGVhdG1hcHMgey50YWJzZXR9CmBgYHtyLCBmaWcua2VlcD0nYWxsJywgcmVzdWx0cz0nYXNpcycsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBmaWcuc2hvdyA9ICdhc2lzJ30KCmxpYnJhcnkoaHRtbHRvb2xzKQoKZm9yKHggaW4gaGVhdG1hcHMpewogIGNhdCggIlxuXG4jIyMjIiwgeFtbMV1dLCAiXG5cbiIpCiAgZGZfbmV3ICAgICA8LSBkYXRhLmZyYW1lKHhbWzJdXSAlPiUgZHBseXI6OnNlbGVjdCgtZ29faWQsIC1HZW5lKSwgY2hlY2submFtZXMgPSBGQUxTRSkKICBkZl9qb2luICAgICA8LSBkYXRhLmZyYW1lKHhbWzJdXSAlPiUgZHBseXI6OnNlbGVjdChHZW5lKSwgY2hlY2submFtZXMgPSBGQUxTRSkKICBkZiAgICAgICAgIDwtIG1ha2VfcGhlYXRtYXBfZGYoZGZfbmV3WyAsYygiMWhwZi84aHBmIiwgIjJocGYvOGhwZiIsICIzaHBmLzhocGYiLCAiNGhwZi84aHBmIiwgIjVocGYvOGhwZiIsICI2aHBmLzhocGYiLCAiN2hwZi84aHBmIiwgIjFocGYvMmhwZiIsICIzaHBmLzJocGYiLCAiNGhwZi8yaHBmIiwgIjVocGYvMmhwZiIsICI2aHBmLzJocGYiLCAiN2hwZi8yaHBmIiwgIjhocGYvMmhwZiIpXSkKICBhbm5vdGF0aW9uX3N1YiA8LSBsZWZ0X2pvaW4oZGZfam9pbiwgYW5ub3RhdGlvbkRGLCBieSA9ICdHZW5lJykgJT4lIHVuaXRlKElELCBHZW5lLCBzcF9kZXNjLCBzZXAgPSAnOiAnKSAlPiUgZHBseXI6OnNlbGVjdCgtU2lnbmlmaWNhbnQpCiAgcm93bmFtZXMoYW5ub3RhdGlvbl9zdWIpIDwtIGFubm90YXRpb25fc3ViJElECiAgYW5ub3RhdGlvbl9zdWIkSUQgPC0gTlVMTAogIGlmKG5yb3coZGYpID4gMjUpewogICAgICBoIDwtIG5yb3coZGYpKjEwLjMKICAgICAgZmlsZW5hbWUgPC0gcGFzdGUwKCdzdW1tYXJ5X2ZpZ3VyZXMvJywgZ3N1YigiICIsICIiLCB4W1sxXV0pLCAnc2lnbmlmaWNhbnRseUV4cHJlc3NlZEhlYXRtYXAucG5nJykKICAgICAgcGhlYXRtYXAoZGZbLCBrZWVwX2NvbHNdLCAgCiAgICAgICAgICAgICAgIGNsdXN0ZXJfY29scyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgY2x1c3RlcmluZ19tZXRob2QgPSAnd2FyZC5EJywgCiAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdfZGlzdGFuY2Vfcm93cyA9IGRpc3QoZGZfbmV3KSwgCiAgICAgICAgICAgICAgIG1haW4gPSB4W1szXV0sCiAgICAgICAgICAgICAgIGJvcmRlcl9jb2xvciA9IE5BLCAKICAgICAgICAgICAgICAgY2VsbHdpZHRoID0gMTUsIAogICAgICAgICAgICAgICBjZWxsaGVpZ2h0ID0gMTAsIAogICAgICAgICAgICAgICBhbm5vdGF0aW9uX3JvdyA9IGFubm90YXRpb25fc3ViLCAKICAgICAgICAgICAgICAgZ2Fwc19jb2wgPSBjKDQpLAogICAgICAgICAgICAgICBsYWJlbHNfY29sID0gYygiMWhwZiIsICIyaHBmIiwgIjNocGYiLCAiNGhwZiIsIjVocGYiLCAiNmhwZiIsICI3aHBmIiwgIjhocGYiKSwKICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2xvcnMgPSBhbm4uY29sb3JzLCAKICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2wgPSBhbm5vdF9jb2x1bW4sIAogICAgICAgICAgICAgICBhbm5vdGF0aW9uX25hbWVzX2NvbCA9IEZBTFNFLCAKICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSkKCiAgICAgIGNhdChwYXN0ZTAoIiMjIyMjW0xpbmsgdG8gIiwgeFtbMV1dLCIgSGVhdG1hcF0oaHR0cDovL2Jpb2luZm8vaG9tZS9rbGcvcHJvamVjdHMvTW5lbWlvcHNpcy93ZWJzaXRlLyIsIGZpbGVuYW1lLCAiKTxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPiIpKQogICAgfSBlbHNlIHsKICBwaGVhdG1hcChkZlssIGtlZXBfY29sc10sICAKICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSwgCiAgICAgICAgICAgY2x1c3RlcmluZ19tZXRob2QgPSAnd2FyZC5EJywgCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzID0gZGlzdChkZl9uZXcpLCAKICAgICAgICAgICBtYWluID0geFtbM11dLCAKICAgICAgICAgICBib3JkZXJfY29sb3IgPSBOQSwgCiAgICAgICAgICAgY2VsbHdpZHRoID0gMTUsIAogICAgICAgICAgIGNlbGxoZWlnaHQgPSAxMCwgCiAgICAgICAgICAgYW5ub3RhdGlvbl9yb3cgPSBhbm5vdGF0aW9uX3N1YiwgCiAgICAgICAgICAgZ2Fwc19jb2wgPSBjKDQpLAogICAgICAgICAgIGxhYmVsc19jb2wgPSBjKCIxaHBmIiwgIjJocGYiLCAiM2hwZiIsICI0aHBmIiwiNWhwZiIsICI2aHBmIiwgIjdocGYiLCAiOGhwZiIpLCAKICAgICAgICAgICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubi5jb2xvcnMsIAogICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub3RfY29sdW1uLCAKICAgICAgICAgICBhbm5vdGF0aW9uX25hbWVzX2NvbCA9IEZBTFNFLAogICAgICAgICAgIGxlZ2VuZF9sYWJlbHMgPSBjKHNlcSgtMywgMyksICJ0aXRsZVxuIikpCiAgICB9CiAgfQpgYGAKCiMjIyMgVGVybSBJbmZvCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgZWNobyA9IEZBTFNFfQoKCmR0IDwtIHJiaW5kKAogIGMoJ0dPMDAwNzA0OScsICdDZWxsIEN5Y2xlJywgJ2h0dHA6Ly9hbWlnby5nZW5lb250b2xvZ3kub3JnL2FtaWdvL3Rlcm0vR086MDAwNzA0OScpLAogIGMoJ0dPMDA0ODcyOScsICdUaXNzdWUgTW9ycGhvZ2VuZXNpcycsICdodHRwOi8vYW1pZ28uZ2VuZW9udG9sb2d5Lm9yZy9hbWlnby90ZXJtL0dPOjAwNDg3MjknKSwKICBjKCdHTzAwMzAxNTQnLCAnQ2VsbCBEaWZmZXJlbnRpYXRpb24nLCAnaHR0cDovL2FtaWdvLmdlbmVvbnRvbG9neS5vcmcvYW1pZ28vdGVybS9HTzowMDMwMTU0JyksCiAgYygnR08wMDA3Mjc2JywgJ0dhbWV0ZSBHZW5lcmF0aW9uJywgJ2h0dHA6Ly9hbWlnby5nZW5lb250b2xvZ3kub3JnL2FtaWdvL3Rlcm0vR086MDAwNzI3NicpLAogIGMoJ0dPMDAwNzQ5OCcsICdNZXNvZGVybSBEZXZlbG9wbWVudCcsICdodHRwOi8vYW1pZ28uZ2VuZW9udG9sb2d5Lm9yZy9hbWlnby90ZXJtL0dPOjAwMDc0OTgnKSwKICBjKCdHTzAwMDc0OTInLCAnRW5kb2Rlcm0gRGV2ZWxvcG1lbnQnLCAnaHR0cDovL2FtaWdvLmdlbmVvbnRvbG9neS5vcmcvYW1pZ28vdGVybS9HTzowMDA3NDkyJyksCiAgYygnR08wMDA3Mzk4JywgJ0VjdG9kZXJtIERldmVsb3BtZW50JywgJ2h0dHA6Ly9hbWlnby5nZW5lb250b2xvZ3kub3JnL2FtaWdvL3Rlcm0vR086MDAwNzM5OCcpKQogIApjb2xuYW1lcyhkdCkgPC0gYygnR08gSUQnLCdEZXNjcmlwdGlvbicsICdHZW5lIE9udG9sb2d5IExpbmsnKQoKZHRbLCdHZW5lIE9udG9sb2d5IExpbmsnXSA8LSBwYXN0ZTAoIjxhIGhyZWY9JyIsZHRbLCdHZW5lIE9udG9sb2d5IExpbmsnXSwiJz4iLGR0WywnR2VuZSBPbnRvbG9neSBMaW5rJ10sIjwvYT4iKQoKRFQ6OmRhdGF0YWJsZShkdCwgb3B0aW9ucyA9IGxpc3QoZG9tID0gJ3QnKSwgZXNjYXBlID0gRkFMU0UpCgpgYGAKCgoKCgoKIyMjIEdPIFRlcm0gQmFyIFBsb3QKVGhlIGZvbGxvd2luZyBiYXIgcGxvdCBzaG93cyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50bHkgZGlmZmVyZW5jdGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBhbm5vdGF0ZWQgdG8gZWFjaCBvZiB0aGUgR08gdGVybXMuCgpgYGB7ciBERWdlbmVzQmFyUGxvdH0KCmRlYV9udW0gPC0gZGVhX2dvICU+JSBncm91cF9ieShUZXJtKSAlPiUKICBtdXRhdGUobnVtX3JlcCA9IGxlbmd0aCh1bmlxdWUoSUQpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihudW1fcmVwID4gMSkKCmdlbmVfYmFyIDwtIGRlYV9udW0gJT4lCiAgZHBseXI6OnNlbGVjdChUZXJtLCBudW1fcmVwKSAlPiUKICBkaXN0aW5jdCgpCgoKZ2VuZV9iYXIkVGVybSA8LSBmYWN0b3IoZ2VuZV9iYXIkVGVybSwgbGV2ZWxzID0gcmV2KGMoIkNlbGwgQ3ljbGUiLCAiQ2VsbCBEaWZmZXJlbnRpYXRpb24iLCAiVGlzc3VlIE1vcnBob2dlbmVzaXMiLCAiR2FtZXRlIEdlbmVyYXRpb24iLCAiTWVzb2Rlcm0gRGV2ZWxvcG1lbnQiLCAnRW5kb2Rlcm0gRGV2ZWxvcG1lbnQnLCAnRWN0b2Rlcm0gRGV2ZWxvcG1lbnQnKSkpCgpnZ3Bsb3QoZ2VuZV9iYXIsIGFlcyh4ID0gVGVybSwgeSA9IG51bV9yZXApKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbCA9ICdwdXJwbGUnKSArIAogIGNvb3JkX2ZsaXAoKSArIHRoZW1lX2J3KCkgKyAKICB5bGFiKCJOdW1iZXIgb2YgR2VuZXMiKSArIHhsYWIoIkdlbmUgT250b2xvZ3kgQW5jZXN0cmFsIFRlcm0iKSArIGdndGl0bGUoIkFuY2VzdHJhbCBHTyB0ZXJtcyBvZiBTaWduaWZpY2FudGx5IFVwIEdlbmVzIikgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDEpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjAxKSkKCmBgYAoKIyMjIEdlbmVzIGluIEdPIHRlcm0gQmFyIFBsb3QKCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30KCgpEVDo6ZGF0YXRhYmxlKGRwbHlyOjpzZWxlY3QoZGVhX2dvMSwgR2VuZSwgc3BfZGVzYywgVGVybSwgQ2x1c3RlcikpCgoKY2F0KCc8YnI+PGJyPjxicj4nKQpgYGAKCgojIEdPIFRlcm0gRW5yaWNobWVudAoKU2lnbmlmaWNhbnRseSBlbnJpY2hlZCBHTyB0ZXJtcyB0aGF0IGhhZCBhdCBsZWFzdCA1IGdlbmVzIGFubm90YXRlZCwgYW5kIGEgQmVuamFtaW5pLUhvY2hiZXJnIGFkanVzdGVkIHAtdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDAuMDUgZm9yIGVpdGhlciB0aGUgRWFybHkgYW5kIExhdGUgc3RhZ2UgZ2VuZXMuIAoKYGBge3IsIGZpZy53aWR0aD04LjUsIGZpZy5oZWlnaHQ9OC41LCByZXN1bHRzID0gJ2FzaXMnfQp0YWJsZTIgIDwtIGRhdGEudGFibGU6OmZyZWFkKCdvdXRwdXQvMmhwZl9hbGxfZ29fZW5yaWNobWVudC54bHMnLCBkYXRhLnRhYmxlID0gRkFMU0UpCnRhYmxlMiRFbnJpY2hJRCA8LSAnTGF0ZSBTdGFnZScKCnRhYmxlOCAgPC0gZGF0YS50YWJsZTo6ZnJlYWQoJ291dHB1dC84aHBmX2FsbF9nb19lbnJpY2htZW50LnhscycsIGRhdGEudGFibGUgPSBGQUxTRSkKdGFibGU4JEVucmljaElEIDwtICdFYXJseSBTdGFnZScKCgp0YWJsZSA8LSBiaW5kX3Jvd3ModGFibGUyLCB0YWJsZTgpCgp0YWJsZSRCcmFuY2hfTnVtX0dlbmVzIDwtIGlmZWxzZShpcy5uYSh0YWJsZSRCcmFuY2hfTnVtX0dlbmVzKSwgMCwgdGFibGUkQnJhbmNoX051bV9HZW5lcykKCnRhYmxlIDwtIHRhYmxlICU+JSBncm91cF9ieShnb19pZCkgJT4lCiAgbXV0YXRlKE51bV9HZW5lcyA9IChOdW1fTGVhZl9HZW5lcyArIEJyYW5jaF9OdW1fR2VuZXMpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZHBseXI6OnNlbGVjdChnb19pZCwgVGVybSwgT250b2wsIEJILmNvcnJlY3Rpb24sIE51bV9HZW5lcywgRW5yaWNoSUQpICU+JQogIGZpbHRlcihOdW1fR2VuZXMgPiA0KSAlPiUKICBtdXRhdGUocHZhbCA9IHBhc3RlMCgncCA8PSAnLCBzaWduaWYoQkguY29ycmVjdGlvbiwgZGlnaXRzID0gMykpKQoKCgoKdGFibGUkVGVybSA8LSBmYWN0b3IodGFibGUkVGVybSwgbGV2ZWxzID0gdGFibGVbb3JkZXIodGFibGUkTnVtX0dlbmVzLCBkZWNyZWFzaW5nID0gRkFMU0UpLCBdJFRlcm0pCgoKCmdncGxvdCh0YWJsZSwgYWVzKHkgPSBOdW1fR2VuZXMsIHggPSBUZXJtLCBmaWxsID0gRW5yaWNoSUQpKSArIAogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgeGxhYignR08gVGVybScpICsgCiAgeWxhYignTnVtYmVyIG9mIEdlbmVzJykgKyAKICBnZ3RpdGxlKCdFbnJpY2hlZCBHTyBUZXJtcyBieSBTdGFnZScpICsgCiAgZ2VvbV90ZXh0KGFlcyh5ID0gTnVtX0dlbmVzICsgMjUsIHggPSBUZXJtLCBsYWJlbCA9IHB2YWwpLCBzaXplID0gMi41KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMC4xMiwwKSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luPW1hcmdpbigwLC0xMCwwLDApKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4oMCwtMjAsMCwwKSksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIyBHZW5lcyBpbiBHTyB0ZXJtIEJhciBQbG90CmBgYHtyLCByZXN1bHRzID0gJ2FzaXMnfQoKZHQgPC0gZHBseXI6OnNlbGVjdCh0YWJsZSwgZ29faWQsIFRlcm0sIE9udG9sLCBFbnJpY2hJRCwgQkguY29ycmVjdGlvbiwgTnVtX0dlbmVzKSAlPiUKICBkcGx5cjo6cmVuYW1lKCdwQWRqdXN0ZWQnID0gQkguY29ycmVjdGlvbikKCkRUOjpkYXRhdGFibGUoZHQpCgpgYGAKCgoKCgojW1Itc2Vzc2lvbiBpbmZvcm1hdGlvbl0oc2Vzc2lvbkluZm8vU3RvcnlTZXNzaW9uSW5mby50eHQpCgoK

Privacy Policy

Terms of Use