1 Introduction

This document contains the analysis for the Deluge vs. Codex benchmarks. All data is obtained from our benchmark suite. Each node runs in its own virtual machine, a CPX31 standard Hetzner virtual machine with \(4\) shared vCPUs and \(8\text{GB}\) of RAM. iperf3 measurements conducted across nodes puts inter-node networking bandwidth at about \(4.3\text{Gbps}\).

The benchmark consists in running a series of static dissemination experiments, where a file of size \(b\) is disseminated across a swarm (set of nodes) of size \(n\). Each swarm is split into a seeder set of size \(s\) and a leecher (or downloader) set of size \(l = n - s\). Seeders have the complete file at the start of the experiment, whereas leechers have nothing. The experiment consists in starting the leechers and then measuring the time it takes for each to download the file.

Leechers are started as closely as possible to each other so that they start downloading the file roughly at the same time. This stresses the network and, under these conditions, should provide us with a reasonable idea of what the lower bound on performance should be.

For a given network configuration \((n, s, l = n - s)\), we define it’s seeder ratio as \(r = s / n\). A higher seeder ratio should lead to faster dissemination, but if the swarms are homogeneous and scalable, the impact should not be large. We also expect close-to-constant performance for a given seeder ratio after for large enough swarms. Deviations from such behavior are likely issues.

We are then interested in asserting how system performance degrades under increasing file or swarm sizes. We expect larger files to take roughly linearly longer to download. We expect system performance to increase with swarm size up to a maximum. Deviations from this behavior likely reflect issues with the protocol.

Each experiment is ran \(10\) times. We rotate seeders and leechers at random at every \(5\) repetitions (so twice in total). This should allow us to account for performance differences that might arise from lack of overlay homogeneity or other factors.

2 Results

2.1 Benchmark Data - Raw

Raw data in tabular format:

2.2 Median Download Speed

Median download speed for Deluge and Codex

Figure 2.1: Median download speed for Deluge and Codex

2.3 Median Download Time

Median time to download a whole file for Deluge and Codex

Figure 2.2: Median time to download a whole file for Deluge and Codex

2.4 Median Download Time Ratio

Let \(t_d\) and \(t_c\) be the median times that Deluge and Codex, respectively, take to download some file of a given size. The median download time ratio is defined as \(m = t_c / t_d\). When \(m < 1\), Codex is faster than Deluge. It is otherwise \(m\) times slower to download the same file.

Median downlaod time ratio for Codex and Deluge

Figure 2.3: Median downlaod time ratio for Codex and Deluge

LS0tCnRpdGxlOiAiQW5hbHlzaXMgZm9yIENvZGV4IHZzLiBEZWx1Z2UgQmVuY2htYXJrcyAtIFN0YXRpYyBOZXR3b3JrIERpc3NlbWluYXRpb24gRXhwZXJpbWVudCIKb3V0cHV0OgogIGJvb2tkb3duOjpodG1sX25vdGVib29rMjoKICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQogICAgdG9jOiBUUlVFCmRhdGU6ICIyMDI1LTAxLTE1IgotLS0KCiMgSW50cm9kdWN0aW9uCgpUaGlzIGRvY3VtZW50IGNvbnRhaW5zIHRoZSBhbmFseXNpcyBmb3IgdGhlIERlbHVnZSB2cy4gQ29kZXggYmVuY2htYXJrcy4gQWxsIGRhdGEgaXMgb2J0YWluZWQgZnJvbSBvdXIgW2JlbmNobWFyayBzdWl0ZV0oaHR0cHM6Ly9naXRodWIuY29tL2NvZGV4LXN0b3JhZ2UvYml0dG9ycmVudC1iZW5jaG1hcmtzLykuCkVhY2ggbm9kZSBydW5zIGluIGl0cyBvd24gdmlydHVhbCBtYWNoaW5lLCBhIFtDUFgzMV0oaHR0cHM6Ly93d3cuaGV0em5lci5jb20vY2xvdWQpIHN0YW5kYXJkIEhldHpuZXIgdmlydHVhbCBtYWNoaW5lIHdpdGggJDQkIHNoYXJlZCB2Q1BVcyBhbmQgJDhcdGV4dHtHQn0kIG9mIFJBTS4gW2lwZXJmM10oaHR0cHM6Ly9pcGVyZi5mci8pIG1lYXN1cmVtZW50cyBjb25kdWN0ZWQgYWNyb3NzIG5vZGVzIHB1dHMgaW50ZXItbm9kZSBuZXR3b3JraW5nIGJhbmR3aWR0aCBhdCBhYm91dCAkNC4zXHRleHR7R2Jwc30kLgoKVGhlIGJlbmNobWFyayBjb25zaXN0cyBpbiBydW5uaW5nIGEgc2VyaWVzIG9mIF9zdGF0aWMgZGlzc2VtaW5hdGlvbiBleHBlcmltZW50c18sIHdoZXJlIGEgZmlsZSBvZiBzaXplICRiJCBpcyBkaXNzZW1pbmF0ZWQgYWNyb3NzIGEgc3dhcm0gKHNldCBvZiBub2Rlcykgb2Ygc2l6ZSAkbiQuIEVhY2ggc3dhcm0gaXMgc3BsaXQgaW50byBhIHNlZWRlciBzZXQgb2Ygc2l6ZSAkcyQgYW5kIGEgbGVlY2hlciAob3IgZG93bmxvYWRlcikgc2V0IG9mIHNpemUgJGwgPSBuIC0gcyQuIFNlZWRlcnMgaGF2ZSB0aGUgY29tcGxldGUgZmlsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGV4cGVyaW1lbnQsIHdoZXJlYXMgbGVlY2hlcnMgaGF2ZSBub3RoaW5nLiBUaGUgZXhwZXJpbWVudCBjb25zaXN0cyBpbiBzdGFydGluZyB0aGUgbGVlY2hlcnMgYW5kIHRoZW4gbWVhc3VyaW5nIHRoZSB0aW1lIGl0IHRha2VzIGZvciBlYWNoIHRvIGRvd25sb2FkIHRoZSBmaWxlLgoKTGVlY2hlcnMgYXJlIHN0YXJ0ZWQgYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0byBlYWNoIG90aGVyIHNvIHRoYXQgdGhleSBzdGFydCBkb3dubG9hZGluZyB0aGUgZmlsZSByb3VnaGx5IGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMgc3RyZXNzZXMgdGhlIG5ldHdvcmsgYW5kLCB1bmRlciB0aGVzZSBjb25kaXRpb25zLAogc2hvdWxkIHByb3ZpZGUgdXMgd2l0aCBhIHJlYXNvbmFibGUgaWRlYSBvZiB3aGF0IHRoZSBsb3dlciBib3VuZCBvbiBwZXJmb3JtYW5jZSBzaG91bGQgYmUuCgpGb3IgYSBnaXZlbiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gJChuLCBzLCBsID0gbiAtIHMpJCwgd2UgZGVmaW5lIGl0J3Mgc2VlZGVyIHJhdGlvIGFzICRyID0gcyAvIG4kLiBBIGhpZ2hlciBzZWVkZXIgcmF0aW8gc2hvdWxkIGxlYWQgdG8gZmFzdGVyIGRpc3NlbWluYXRpb24sIGJ1dCBpZiB0aGUgc3dhcm1zIGFyZSBob21vZ2VuZW91cyBhbmQgc2NhbGFibGUsIHRoZSBpbXBhY3Qgc2hvdWxkIG5vdCBiZSBsYXJnZS4gV2UgYWxzbyBleHBlY3QgY2xvc2UtdG8tY29uc3RhbnQgcGVyZm9ybWFuY2UgZm9yIGEgZ2l2ZW4gc2VlZGVyIHJhdGlvIGFmdGVyIGZvciBsYXJnZSBlbm91Z2ggc3dhcm1zLiBEZXZpYXRpb25zIGZyb20gc3VjaCBiZWhhdmlvciBhcmUgbGlrZWx5IGlzc3Vlcy4KCldlIGFyZSB0aGVuIGludGVyZXN0ZWQgaW4gYXNzZXJ0aW5nIGhvdyBzeXN0ZW0gcGVyZm9ybWFuY2UgZGVncmFkZXMgdW5kZXIgaW5jcmVhc2luZyBmaWxlIG9yIHN3YXJtIHNpemVzLiBXZSBleHBlY3QgbGFyZ2VyIGZpbGVzIHRvIHRha2Ugcm91Z2hseSBsaW5lYXJseSBsb25nZXIgdG8gZG93bmxvYWQuIFdlIGV4cGVjdCBzeXN0ZW0gcGVyZm9ybWFuY2UgdG8gaW5jcmVhc2Ugd2l0aCBzd2FybSBzaXplIHVwIHRvIGEgbWF4aW11bS4gRGV2aWF0aW9ucyBmcm9tIHRoaXMgYmVoYXZpb3IgbGlrZWx5IHJlZmxlY3QgaXNzdWVzIHdpdGggdGhlIHByb3RvY29sLgoKRWFjaCBleHBlcmltZW50IGlzIHJhbiAkMTAkIHRpbWVzLiBXZSByb3RhdGUgc2VlZGVycyBhbmQgbGVlY2hlcnMgYXQgcmFuZG9tIGF0IGV2ZXJ5ICQ1JCByZXBldGl0aW9ucyAoc28gdHdpY2UgaW4gdG90YWwpLiBUaGlzIHNob3VsZCBhbGxvdyB1cyB0byBhY2NvdW50IGZvciBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlcyB0aGF0IG1pZ2h0IGFyaXNlIGZyb20gbGFjayBvZiBvdmVybGF5IGhvbW9nZW5laXR5IG9yIG90aGVyIGZhY3RvcnMuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCBlY2hvID0gRkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGJpdDY0KQoKZGV2dG9vbHM6OmxvYWRfYWxsKCkKYGBgCgpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSAha25pdHI6OmlzX2h0bWxfb3V0cHV0KCl9CmV4cGVyaW1lbnRzIDwtIHJlYWRfYWxsX2V4cGVyaW1lbnRzKCcuL2RhdGEvZGV2bmV0L2cxNzQwMDc5OTMxLycsIHByZWZpeD0nY29kZXguJykgfD4KICBtZXJnZV9leHBlcmltZW50cyhyZWFkX2FsbF9leHBlcmltZW50cygnLi9kYXRhL2Rldm5ldC9nMTc0MDQ5ODAwNC8nLCBwcmVmaXg9J2NvZGV4LnIxLicpKSB8PgogIG1lcmdlX2V4cGVyaW1lbnRzKHJlYWRfYWxsX2V4cGVyaW1lbnRzKCcuL2RhdGEvZGV2bmV0L2cxNzQwMzIwOTc3LycsIHByZWZpeD0nZGVsdWdlLicpKSB8PgogIG1lcmdlX2V4cGVyaW1lbnRzKHJlYWRfYWxsX2V4cGVyaW1lbnRzKCcuL2RhdGEvZGV2bmV0L2cxNzQwNTg1ODI1LycsIHByZWZpeD0nZGVsdWdlLnIxLicpKSB8PgogIG1lcmdlX2V4cGVyaW1lbnRzKHJlYWRfYWxsX2V4cGVyaW1lbnRzKCcuL2RhdGEvZGV2bmV0L2cxNzQwNTkzNzMwLycsIHByZWZpeD0nZGVsdWdlLnIyJykpCmBgYAoKYGBge3IgaW5jbHVkZSA9ICFrbml0cjo6aXNfaHRtbF9vdXRwdXQoKX0KQ09VTlRfRElTVElOQ1QgPSBsaXN0KAogICdjb2RleF9leHBlcmltZW50X2NvbmZpZ19sb2dfZW50cnknID0gRkFMU0UsCiAgJ2RlbHVnZV9leHBlcmltZW50X2NvbmZpZ19sb2dfZW50cnknID0gVFJVRQopCmBgYAoKYGBge3IgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gIWtuaXRyOjppc19odG1sX291dHB1dCgpfQpiZW5jaG1hcmtzIDwtIGxhcHBseShleHBlcmltZW50cywgZnVuY3Rpb24oZXhwZXJpbWVudCkgewogIHByaW50KGdsdWU6OmdsdWUoJ1Byb2Nlc3Mge2V4cGVyaW1lbnQkZXhwZXJpbWVudF9pZH0nKSkKICBkb3dubG9hZF90aW1lX3N0YXRzIDwtIHRyeUNhdGNoKHsKICAgIG1ldGEgPC0gZXhwZXJpbWVudCRtZXRhCiAgICBjb21wbGV0aW9uIDwtIGV4cGVyaW1lbnQgfD4KICAgICAgZG93bmxvYWRfdGltZXMoCiAgICAgICAgcGllY2VfY291bnRfZGlzdGluY3QgPSBDT1VOVF9ESVNUSU5DVFtbbWV0YSRleHBlcmltZW50X3R5cGVdXSkgfD4KICAgICAgY29tcGxldGlvbl90aW1lX3N0YXRzKG1ldGEpCiAgICAKICAgIGlmIChpcy5udWxsKGNvbXBsZXRpb24pKSB7CiAgICAgIE5VTEwKICAgIH0gZWxzZSB7CiAgICAgIGNvbXBsZXRpb24gfD4gbXV0YXRlKAogICAgICAgIGV4cGVyaW1lbnRfdHlwZSA9IG1ldGEkZXhwZXJpbWVudF90eXBlLAogICAgICAgIG5ldHdvcmtfc2l6ZSA9IG1ldGEkbm9kZXMkbmV0d29ya19zaXplLAogICAgICAgIHNlZWRlcnMgPSBtZXRhJHNlZWRlcnMsCiAgICAgICAgbGVlY2hlcnMgPSBuZXR3b3JrX3NpemUgLSBtZXRhJHNlZWRlcnMsCiAgICAgICAgZmlsZV9zaXplID0gbWV0YSRmaWxlX3NpemUKICAgICAgKQogICAgfQogIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgeyBwcmludChlKTsgTlVMTCB9KQp9KSB8PiAKICBkcm9wX251bGxzKCkgfD4KICBiaW5kX3Jvd3MoKSB8PgogIGFycmFuZ2UoZmlsZV9zaXplLCBuZXR3b3JrX3NpemUsIHNlZWRlcnMsIGxlZWNoZXJzKSB8PgogIG11dGF0ZSgKICAgIGZpbGVfc2l6ZV9ieXRlcyA9IGZpbGVfc2l6ZSwKICAgICMgVGhpcyBmYWN0b3IgY29udmVyc2lvbiBpcyBob3JyaWJsZSBidXQgbmVlZGVkIHNvIHRoaW5ncyBhcmUgc29ydGVkIHByb3Blcmx5IGluIHRoZSBwbG90LgogICAgZmlsZV9zaXplID0gZmFjdG9yKHJsYW5nOjpwYXJzZV9ieXRlcyhhcy5jaGFyYWN0ZXIoZmlsZV9zaXplKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHJsYW5nOjpwYXJzZV9ieXRlcyhhcy5jaGFyYWN0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGZpbGVfc2l6ZVtvcmRlcihmaWxlX3NpemUsIGRlY3JlYXNpbmcgPSBUUlVFKV0pKSkpLAogICAgc2VlZGVyX3JhdGlvID0gc2VlZGVycyAvIG5ldHdvcmtfc2l6ZSwKICAgIG1lZGlhbl9zcGVlZCA9IGZpbGVfc2l6ZV9ieXRlcyAvIG1lZGlhbiwKICAgIHAyNV9zcGVlZCA9IGZpbGVfc2l6ZV9ieXRlcyAvIHAyNSwKICAgIHA3NV9zcGVlZCA9IGZpbGVfc2l6ZV9ieXRlcyAvIHA3NQogICkgfD4KICByZWxvY2F0ZShmaWxlX3NpemUsIG5ldHdvcmtfc2l6ZSwgc2VlZGVycywgbGVlY2hlcnMsIGZpbGVfc2l6ZV9ieXRlcykKYGBgCgojIFJlc3VsdHMKCmBgYHtyIGVjaG8gPSBGQUxTRX0KYmVuY2htYXJrcyA8LSBiZW5jaG1hcmtzIHw+CiAgZ3JvdXBfYnkoZXhwZXJpbWVudF90eXBlLCBuZXR3b3JrX3NpemUsIHNlZWRlcnMsIGxlZWNoZXJzLCBmaWxlX3NpemUpIHw+CiAgc2xpY2VfbWluKG1pc3NpbmcsIG4gPSAxLCB3aXRoX3RpZXMgPSBGQUxTRSkgfD4KICB1bmdyb3VwKCkKYGBgCgojIyBCZW5jaG1hcmsgRGF0YSAtIFJhdwoKUmF3IGRhdGEgaW4gdGFidWxhciBmb3JtYXQ6CgpgYGB7ciBlY2hvID0gRkFMU0V9CkRUOjpkYXRhdGFibGUoCiAgYmVuY2htYXJrcyB8PiBhcnJhbmdlKG5ldHdvcmtfc2l6ZSwgc2VlZGVycyksCiAgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywKICBvcHRpb25zID0gbGlzdCgKICAgIGRvbSA9ICd0QnBscicsCiAgICBzZWFyY2hpbmcgPSBGQUxTRSwKICAgIGJ1dHRvbnMgPSBjKCdjb3B5JywgJ2NzdicsICdleGNlbCcpLAogICAgc2Nyb2xsWCA9IFRSVUUKICApCikKYGBgCgpgYGB7ciBlY2hvID0gRkFMU0V9CnJlbGF0aXZlX3BlcmZvcm1hbmNlIDwtIGJlbmNobWFya3MgfD4KICBmaWx0ZXIoZXhwZXJpbWVudF90eXBlID09ICdkZWx1Z2VfZXhwZXJpbWVudF9jb25maWdfbG9nX2VudHJ5JykgfD4KICB0cmFuc211dGUoCiAgICBmaWxlX3NpemUsIG5ldHdvcmtfc2l6ZSwgc2VlZGVycywgbGVlY2hlcnMsIGRlbHVnZV9tZWRpYW4gPSBtZWRpYW4sCiAgKSB8PgogIGlubmVyX2pvaW4oCiAgICBiZW5jaG1hcmtzIHw+IAogICAgICBmaWx0ZXIoZXhwZXJpbWVudF90eXBlID09ICdjb2RleF9leHBlcmltZW50X2NvbmZpZ19sb2dfZW50cnknKSB8PgogICAgICBzZWxlY3QoCiAgICAgICAgZmlsZV9zaXplLCBuZXR3b3JrX3NpemUsIHNlZWRlcnMsIGxlZWNoZXJzLCBjb2RleF9tZWRpYW4gPSBtZWRpYW4KICAgICAgKSwKICAgIGJ5ID0gYygnZmlsZV9zaXplJywgJ25ldHdvcmtfc2l6ZScsICdzZWVkZXJzJywgJ2xlZWNoZXJzJykKICApIHw+CiAgbXV0YXRlKAogICAgcGVyZm9ybWFuY2UgPSBjb2RleF9tZWRpYW4gLyBkZWx1Z2VfbWVkaWFuLAogICAgc2VlZGVyX3JhdGlvID0gc2VlZGVycyAvIG5ldHdvcmtfc2l6ZQogICkKYGBgCgojIyBNZWRpYW4gRG93bmxvYWQgU3BlZWQKCmBgYHtyIGZpZy5jYXA9J01lZGlhbiBkb3dubG9hZCBzcGVlZCBmb3IgRGVsdWdlIGFuZCBDb2RleCcsIGZpZy53aWR0aCA9IDExLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRX0KZ2dwbG90KGJlbmNobWFya3MsIGFlcyhjb2wgPSBleHBlcmltZW50X3R5cGUsIGZpbGwgPSBleHBlcmltZW50X3R5cGUsIGdyb3VwID0gZXhwZXJpbWVudF90eXBlKSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gcDI1X3NwZWVkLCB5bWF4ID0gcDc1X3NwZWVkLCB4ID0gbmV0d29ya19zaXplLCBmaWxsID0gZXhwZXJpbWVudF90eXBlLCBhbHBoYSA9IDAuNSksIGNvbCA9ICdsaWdodGdyYXknKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IG5ldHdvcmtfc2l6ZSwgeSA9IHAyNV9zcGVlZCksIGNvbCA9ICdkYXJrZ3JheScsIHNpemU9MTAuMCwgc2hhcGU9Jy0nKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IG5ldHdvcmtfc2l6ZSwgeSA9IHA3NV9zcGVlZCksIGNvbCA9ICdkYXJrZ3JheScsIHNpemU9MTAuMCwgc2hhcGU9Jy0nKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gbmV0d29ya19zaXplLCB5ID0gbWVkaWFuX3NwZWVkKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBuZXR3b3JrX3NpemUsIHkgPSBtZWRpYW5fc3BlZWQpKSArCiAgeWxhYignbWVkaWFuIGRvd25sb2FkIHNwZWVkIChieXRlcy9zZWNvbmQpJykgKwogIHhsYWIoJ25ldHdvcmsgc2l6ZScpICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZT0xNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KSBwYXN0ZTAoc2NhbGVzOjpsYWJlbF9ieXRlcygpKHgpLCAnL3MnKSkgKwogIGZhY2V0X2dyaWQoCiAgICBmaWxlX3NpemUgfiBzZWVkZXJfcmF0aW8sCiAgICBsYWJlbGxlciA9IGxhYmVsbGVyKAogICAgICBzZWVkZXJfcmF0aW8gPSBhc19sYWJlbGxlcihmdW5jdGlvbih4KSB7CiAgICAgICAgcGFzdGUwKCJzZWVkZXIgcmF0aW86ICIsIHNjYWxlczo6cGVyY2VudChhcy5udW1lcmljKHgpKSkKICAgICAgfSkpCiAgKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICcnLCBsYWJlbHMgPSBjKCdDb2RleCcsICdEZWx1Z2UnKSkgKwogIGd1aWRlcyhmaWxsID0gJ25vbmUnLCBhbHBoYSA9ICdub25lJykKYGBgCgojIyBNZWRpYW4gRG93bmxvYWQgVGltZQoKCmBgYHtyIGZpZy5jYXA9J01lZGlhbiB0aW1lIHRvIGRvd25sb2FkIGEgd2hvbGUgZmlsZSBmb3IgRGVsdWdlIGFuZCBDb2RleCcsIGZpZy53aWR0aCA9IDExLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRX0KZ2dwbG90KGJlbmNobWFya3MsIGFlcyhjb2wgPSBleHBlcmltZW50X3R5cGUsIGZpbGwgPSBleHBlcmltZW50X3R5cGUsIGdyb3VwID0gZXhwZXJpbWVudF90eXBlKSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gcDI1LCB5bWF4ID0gcDc1LCB4ID0gbmV0d29ya19zaXplLCBmaWxsID0gZXhwZXJpbWVudF90eXBlLCBhbHBoYSA9IDAuNSksIGNvbCA9ICdsaWdodGdyYXknKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IG5ldHdvcmtfc2l6ZSwgeSA9IHAyNSksIGNvbCA9ICdkYXJrZ3JheScsIHNpemU9MTAuMCwgc2hhcGU9Jy0nKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IG5ldHdvcmtfc2l6ZSwgeSA9IHA3NSksIGNvbCA9ICdkYXJrZ3JheScsIHNpemU9MTAuMCwgc2hhcGU9Jy0nKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gbmV0d29ya19zaXplLCB5ID0gbWVkaWFuKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBuZXR3b3JrX3NpemUsIHkgPSBtZWRpYW4pKSArCiAgeWxhYignbWVkaWFuIGRvd25sb2FkIHRpbWUnKSArCiAgeGxhYignbmV0d29yayBzaXplJykgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTUpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpsYWJlbF90aW1lc3BhbigpKSArCiAgZmFjZXRfZ3JpZCgKICAgIHNjYWxlcyA9ICdmcmVlX3knLAogICAgZmlsZV9zaXplIH4gc2VlZGVyX3JhdGlvLAogICAgbGFiZWxsZXIgPSBsYWJlbGxlcigKICAgICAgc2VlZGVyX3JhdGlvID0gYXNfbGFiZWxsZXIoZnVuY3Rpb24oeCkgewogICAgICAgIHBhc3RlMCgic2VlZGVyIHJhdGlvOiAiLCBzY2FsZXM6OnBlcmNlbnQoYXMubnVtZXJpYyh4KSkpCiAgICAgIH0pKQogICkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAnJywgbGFiZWxzID0gYygnQ29kZXgnLCAnRGVsdWdlJykpICsKICBndWlkZXMoZmlsbCA9ICdub25lJywgYWxwaGEgPSAnbm9uZScpCmBgYAoKIyMgTWVkaWFuIERvd25sb2FkIFRpbWUgUmF0aW8KCkxldCAkdF9kJCBhbmQgJHRfYyQgYmUgdGhlIG1lZGlhbiB0aW1lcyB0aGF0IERlbHVnZSBhbmQgQ29kZXgsIHJlc3BlY3RpdmVseSwgdGFrZSB0byBkb3dubG9hZCBzb21lIGZpbGUgb2YgYSBnaXZlbiBzaXplLiBUaGUgbWVkaWFuIGRvd25sb2FkIHRpbWUgcmF0aW8gaXMgZGVmaW5lZCBhcyAkbSA9IHRfYyAvIHRfZCQuCldoZW4gJG0gPCAxJCwgQ29kZXggaXMgZmFzdGVyIHRoYW4gRGVsdWdlLiBJdCBpcyBvdGhlcndpc2UgJG0kIHRpbWVzIHNsb3dlciB0byBkb3dubG9hZCB0aGUgc2FtZSBmaWxlLgoKYGBge3IgZmlnLmNhcD0nTWVkaWFuIGRvd25sYW9kIHRpbWUgcmF0aW8gZm9yIENvZGV4IGFuZCBEZWx1Z2UnLCBmaWcud2lkdGggPSAxMSwgbWVzc2FnZSA9IEZBTFNFLCBlY2hvID0gRkFMU0V9CmdncGxvdChyZWxhdGl2ZV9wZXJmb3JtYW5jZSkgKwogIGdlb21fbGluZShhZXMoeCA9IG5ldHdvcmtfc2l6ZSwgeSA9IHBlcmZvcm1hbmNlLCBjb2wgPSBmaWxlX3NpemUpLCBsd2Q9MSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbCA9ICdkYXJrZ3JheScpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbmV0d29ya19zaXplLCB5ID0gcGVyZm9ybWFuY2UsIGNvbCA9IGZpbGVfc2l6ZSkpICsKICB5bGFiKCdtZWRpYW4gQ29kZXgvRGVsdWdlIHBlcmZvcm1hbmNlIHJhdGlvJykgKwogIGFubm90YXRlKCd0ZXh0JywgbGFiZWwgPSAnZmFzdGVyJywgeCA9IDI5LCB5ID0gMCwgY29sID0gJ2RhcmtncmVlbicpICsKICBhbm5vdGF0ZSgndGV4dCcsIGxhYmVsID0gJ3Nsb3dlcicsIHggPSAyOC41LCB5ID0gMiwgY29sID0gJ2RhcmtyZWQnKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTUpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gJ2ZpbGUgc2l6ZScpICsKICBmYWNldF9ncmlkKAogICAgZmlsZV9zaXplIH4gc2VlZGVyX3JhdGlvLAogICAgbGFiZWxsZXIgPSBsYWJlbGxlcigKICAgICAgZmlsZV9zaXplID0gYXNfbGFiZWxsZXIoZnVuY3Rpb24oeCkgeCksCiAgICAgIHNlZWRlcl9yYXRpbyA9IGFzX2xhYmVsbGVyKGZ1bmN0aW9uKHgpIHsKICAgICAgICBwYXN0ZTAoInNlZWRlciByYXRpbzogIiwgc2NhbGVzOjpwZXJjZW50KGFzLm51bWVyaWMoeCkpKQogICAgICB9KSkKICApCmBgYAo=