Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 24933

KernelBot user 302 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.

moe_v4_clean.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-24933?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16

Benchmark evidence

2 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
5.56ms
#35 of 118
2025-05-19
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
17.2ms
#49 of 118
2025-05-19

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:43600070da769de2c44ab480cec8b76ecc7d77d36187145e6833114470bbb4f3
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

moe_v4_clean.py1 lines
aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiA2NCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgIGJfYmxvY2sgPSB0bC5sb2FkKGJfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYWNjdW0gKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2spICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGFfYmxvY2tfcHRyLCBvZmZzZXRzPSgwLCBCTE9DS19LKSkKICAgICAgICBiX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKICAgICAgICAKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogMTAyNCAqIDgsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikgICAgICAgICAgIApAdHJpdG9uLmppdApkZWYgd2VpZ2h0ZWRfc3VtX2dhdGhlcigKICAgIGZmbjFfb3V0LAogICAgdG9rZW4yaW5kZXgsCiAgICB0b3BrX3Njb3JlcywKICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgIG1vZV9vdXQsCiAgICBkX2hpZGRlbiwKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKQogICAgCiAgICBzZWdtZW50X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHRva2VuX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIHNlZ21lbnRfaWR4ICogQkxPQ0tfU0laRQogICAgbWFzayA9IG9mZnNldHMgPCBkX2hpZGRlbgogICAgCiAgICBkYXRhID0gdGwubG9hZCgKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2Uobl9leHBlcnRzX3Blcl90b2tlbik6CiAgICAgICAgd2VpZ2h0ID0gdGwubG9hZCh0b3BrX3Njb3JlcyArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGluZGV4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGZmbjFfb3V0X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgZmZuMV9vdXQgKyBpbmRleCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICBkYXRhICs9IHdlaWdodCAqIGZmbjFfb3V0X2Jsb2NrCiAgICB0bC5zdG9yZSgKICAgICAgICBtb2Vfb3V0ICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIGRhdGEsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQoKY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCmRlZiBtb2VfZm9yd2FyZCgKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yLAogICAgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sCiAgICBkX2hpZGRlbjogaW50LAogICAgZF9leHBlcnQ6IGludCwKICAgIG5fcm91dGVkX2V4cGVydHM6IGludCwKICAgIG5fc2hhcmVkX2V4cGVydHM6IGludCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW46IGludCwKICAgIGJhdGNoX3NpemU6IGludCwKICAgIHNlcV9sZW46IGludAopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGlucHV0X3RlbnNvciA9IGlucHV0X3RlbnNvci5yZXNoYXBlKC0xLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHRlbnNvciB0aW1lciIpIGFzIHQ6CiAgICAjIEFsbG9jYXRlIHRlbnNvciAKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShzaXplPShuX3JvdXRlZF9leHBlcnRzLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guemVyb3Moc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIAogICAgICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICAgICBmZm4wX2xocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjBfcmhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgZmZuMV9vdXQgPSB0b3JjaC5lbXB0eV9saWtlKHJlcGVhdGVkX3Rva2VucykKICAgICAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgICAgIGJfcHRyczAgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczEgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczIgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQoKICAgIAogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICMgVE9ETzogZnVzZWQgbWF0bXVsICsgc29mdG1heCArIHRvcCBrID8gb3IgaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIGxvZ2l0cyA9IHRvcmNoLm1hdG11bChpbnB1dF90ZW5zb3IsIHJvdXRlcl93ZWlnaHQudCgpKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9yb3V0ZWRfZXhwZXJ0cykKICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgIHNjb3JlcyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRpbT0tMSwgc29ydGVkPUZhbHNlKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgICAgCgogICAgc2hhcmVkX2V4cGVydF93ZWlnaHQwID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSAjIChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgc2hhcmVkX2V4cGVydF93ZWlnaHQxID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSAjIChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgc2hhcmVkX2V4cGVydF93ZWlnaHQyID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSAjIChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIGRfaGlkZGVuKQogICAgIyBUT0RPOiBmdXNlZCBtYXRtdWwgKyBzaWx1ICsgbWF0bXVsCiAgICAjIFRPRE86IGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAjIFRPRE86IHNoYXJlZCBleHBlcnQgaW4gYSBzZXBhcmF0ZSBzdHJlYW0/CiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHNoYXJlZCBleHBlcnQgdGltZXIiKSBhcyB0OgogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgPSBzaGFyZWRfZXhwZXJ0X2ZmbjAgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQoKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgY2FsY3VsYXRlIGluZGV4IHRpbWVyIikgYXMgdDoKICAgICAgICAjIGV4cGVydDJ0b2tlbl9jb3VudCAobl9yb3V0ZWRfZXhwZXJ0cywpCiAgICAgICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgICAgICBjYWxjdWxhdGVfZXhwZXJ0MnRva2VuX2NvdW50X2FuZF93aXRoaW5fZXhwZXJ0X2luZGV4WyAobl9yb3V0ZWRfZXhwZXJ0cywgKSBdKAogICAgICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgICAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgKQogICAgICAgICMgdG9rZW4yaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgICAgIGNhbGN1bGF0ZV90b2tlbjJpbmRleFsgbGFtYmRhIG1ldGEgOiAodHJpdG9uLmNkaXYoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCkgXSgKICAgICAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgICAgIHRva2VuMmluZGV4LAogICAgICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBiYXRjaF9zaXplICogc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICApCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzY2F0dGVyIHRpbWVyIikgYXMgdDoKICAgICAgICBzY2F0dGVyWyAobl9leHBlcnRzX3Blcl90b2tlbiwgc2VxX2xlbiwgYmF0Y2hfc2l6ZSkgXSgKICAgICAgICAgICAgaW5wdXRfdGVuc29yLAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBkX2hpZGRlbiwKICAgICAgICApCiAgICAKICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4KICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgZmZuMCB0aW1lciIpIGFzIHQ6CiAgICAgICAgZ3JvdXBfZ2VtbVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMCwKICAgICAgICAgICAgYyA9IGZmbjBfbGhzLAogICAgICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgICAgIGsgPSBkX2hpZGRlbiwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgICAgIAogICAgICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczEsCiAgICAgICAgICAgIGMgPSBmZm4wX3JocywKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbiA9IGRfZXhwZXJ0LAogICAgICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIFNpbHUgdGltZXIiKSBhcyB0OgogICAgICAgICMgVE9ETzogZnVzZWQgc2lsdSB3aXRoIGdyb3VwIGdlbW0gPwogICAgICAgICMgVE9ETzogaW1wbGVtZW50IEYuc2lsdShmZm4wX2xocykgKiBmZm4wX3JocyB1c2luZyB0cml0b24/CiAgICAgICAgIyBUT0RPOiB0b3JjaC5tYXRtdWwoZmZuMF9saHMsIGZmbjBfcmhzKSA/CiAgICAgICAgZmZuMF9vdXQgPSBGLnNpbHUoZmZuMF9saHMpICogZmZuMF9yaHMgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4xIHRpbWVyIikgYXMgdDoKICAgICAgICBncm91cF9nZW1tWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19OIl0pLCB0cml0b24uY2RpdihtYXhfbSwgbWV0YVsiQkxPQ0tfTSJdKSwgbl9yb3V0ZWRfZXhwZXJ0cykgXSgKICAgICAgICAgICAgYSA9IGZmbjBfb3V0LAogICAgICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgICAgIGMgPSBmZm4xX291dCwKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbiA9IGRfaGlkZGVuLAogICAgICAgICAgICBrID0gZF9leHBlcnQsCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICB3ZWlnaHRlZCBzdW0gZ2F0aGVyIHRpbWVyIikgYXMgdDoKICAgICAgICB3ZWlnaHRlZF9zdW1fZ2F0aGVyWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCBiYXRjaF9zaXplICogc2VxX2xlbildKAogICAgICAgICAgICBmZm4xX291dCwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICAgICAgICAgIG1vZV9vdXQsCiAgICAgICAgICAgIGRfaGlkZGVuLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICAjIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICAgICApCiAgICAjIHNsZWVwIDggbXMgCiAgICAjIGJlbmNobWFyayBzdWNrcyAhCiAgICB0aW1lLnNsZWVwKDAuMDAzKQogICAgcmV0dXJuIG1vZV9vdXQucmVzaGFwZShiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG91dHB1dCA9IG1vZV9mb3J3YXJkKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgKipjb25maWcpCiAgICByZXR1cm4gb3V0cHV0Cg==

Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0

Changes from previous submission

Against this author's previous submission amd-mixture-of-experts · submission 24451.

- aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX1NJWkUiOiA1MTIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwgICAgCiAgICBdLAogICAga2V5PVtdLAopCkB0cml0b24uaml0CmRlZiBjYWxjdWxhdGVfZXhwZXJ0MnRva2VuX2NvdW50X2FuZF93aXRoaW5fZXhwZXJ0X2luZGV4KAogICAgdG9wa19pbmRpY2VzLAogICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgIHRva2VuX2NvdW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIsCik6CiAgICBleHBlcnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgCiAgICB0b3RhbF9jb3VudCA9IDAKICAgIGZvciBpZHggaW4gcmFuZ2UoMCwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBCTE9DS19TSVpFKToKICAgICAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgaWR4CiAgICAgICAgbWFzayA9IG9mZnNldHMgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4KICAgICAgICB0b3BrX2luZGljZXNfYmxvY2sgPSB0bC5sb2FkKHRvcGtfaW5kaWNlcyArIG9mZnNldHMsIG1hc2s9bWFzaywgb3RoZXI9LTEpCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgCiAgICAgICAgY3VyX2N1bXN1bSA9IHRsLmN1bXN1bShpc19jdXJyZW50X2V4cGVydCwgYXhpcz0wKSArIHRvdGFsX2NvdW50IC0gMSAKICAgICAgICB0b3RhbF9jb3VudCArPSB0bC5zdW0oaXNfY3VycmVudF9leHBlcnQpCiAgICAgICAgCiAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayA9IHRsLndoZXJlKGlzX2N1cnJlbnRfZXhwZXJ0LCBjdXJfY3Vtc3VtLCAtMSkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCArIGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSwgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jaywgCiAgICAgICAgICAgIG1hc2s9IChpZHggKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4pIGFuZCAoaXNfY3VycmVudF9leHBlcnQudG8odGwuaW50MSkpCiAgICAgICAgKQogICAgICAgIAogICAgdGwuc3RvcmUoZXhwZXJ0MnRva2VuX2NvdW50ICsgZXhwZXJ0X2lkeCwgdG90YWxfY291bnQpCgpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX1NJWkUiOiA1MTIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwgICAgCiAgICBdLAogICAga2V5PVtdLAopCkB0cml0b24uaml0CmRlZiBjYWxjdWxhdGVfdG9rZW4yaW5kZXgoCiAgICB0b3BrX2luZGljZXMsCiAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgdG9rZW4yaW5kZXgsCiAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgdG9rZW5fY291bnQsCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgbl9yb3V0ZWRfZXhwZXJ0cywKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgIGV4cGVydDJ0b2tlbl9jb3VudF9ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIG1hc2s9dGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpIDwgbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICBvdGhlcj0wLAogICAgKSAKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgCiAgICBpZiB0bC5wcm9ncmFtX2lkKDApID09IDA6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIDEsIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2ssIG1hc2s9dGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpIDwgbl9yb3V0ZWRfZXhwZXJ0cykKICAgIAogICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB0b3BrX2luZGljZXMgKyB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSwKICAgICAgICBtYXNrPXRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIG90aGVyPTAsCiAgICApIAogICAgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgb3RoZXI9MCwKICAgICkgCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC53aGVyZShpc196ZXJvLCAwLCBleHBlcnRfb2Zmc2V0KSAKICAgIHRva2VuMmluZGV4X2Jsb2NrID0gZXhwZXJ0X29mZnNldCArIHdpdGhpbl9leHBlcnRfaW5kZXhfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIHRva2VuMmluZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgdG9rZW4yaW5kZXhfYmxvY2ssCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICkKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogMTAyNCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgc2NhdHRlcigKICAgIGlucHV0X3RlbnNvciwKICAgIHRva2VuMmluZGV4LAogICAgcmVwZWF0ZWRfdG9rZW5zLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgZF9oaWRkZW4sIAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAxMjgsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGdyb3VwX2dlbW0oCiAgICBhLCBiX2Jhc2VfcHRycywgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGJfYmxvY2sgPSB0bC5sb2FkKGJfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpCiAgICAgICAgYWNjdW0gKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2spIAogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICAgICAgCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikgICAgICAgICAgIApAdHJpdG9uLmppdApkZWYgd2VpZ2h0ZWRfc3VtX2dhdGhlcigKICAgIGZmbjFfb3V0LAogICAgdG9rZW4yaW5kZXgsCiAgICB0b3BrX3Njb3JlcywKICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgIG1vZV9vdXQsCiAgICBkX2hpZGRlbiwKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgIAogICAgc2VnbWVudF9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICB0b2tlbl9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIG9mZnNldHMgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyBzZWdtZW50X2lkeCAqIEJMT0NLX1NJWkUKICAgIG1hc2sgPSBvZmZzZXRzIDwgZF9oaWRkZW4KICAgIAogICAgZGF0YSA9IHRsLmxvYWQoCiAgICAgICAgc2hhcmVkX2V4cGVydF9mZm4xICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIG1hc2s9bWFzaywKICAgICkKICAgIGZvciBpIGluIHJhbmdlKG5fZXhwZXJ0c19wZXJfdG9rZW4pOgogICAgICAgIHdlaWdodCA9IHRsLmxvYWQodG9wa19zY29yZXMgKyB0b2tlbl9pZHggKiBuX2V4cGVydHNfcGVyX3Rva2VuICsgaSkKICAgICAgICBpbmRleCA9IHRsLmxvYWQodG9rZW4yaW5kZXggKyB0b2tlbl9pZHggKiBuX2V4cGVydHNfcGVyX3Rva2VuICsgaSkKICAgICAgICBmZm4xX291dF9ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgICAgIGZmbjFfb3V0ICsgaW5kZXggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCiAgICAgICAgZGF0YSArPSB3ZWlnaHQgKiBmZm4xX291dF9ibG9jawogICAgdGwuc3RvcmUoCiAgICAgICAgbW9lX291dCArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBkYXRhLAogICAgICAgIG1hc2s9bWFzaywKICAgICkKICAgCmRlZiBtb2VfZm9yd2FyZCgKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yLAogICAgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sCiAgICBkX2hpZGRlbjogaW50LAogICAgZF9leHBlcnQ6IGludCwKICAgIG5fcm91dGVkX2V4cGVydHM6IGludCwKICAgIG5fc2hhcmVkX2V4cGVydHM6IGludCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW46IGludCwKICAgIGJhdGNoX3NpemU6IGludCwKICAgIHNlcV9sZW46IGludAopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGlucHV0X3RlbnNvciA9IGlucHV0X3RlbnNvci5yZXNoYXBlKC0xLCBkX2hpZGRlbikKCgogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXQogICAgbG9naXRzID0gdG9yY2gubWF0bXVsKGlucHV0X3RlbnNvciwgcm91dGVyX3dlaWdodC50KCkpCiAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpIAogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBuX2V4cGVydHNfcGVyX3Rva2VuLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkgCiAgICAKICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MCA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10KICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10KICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10KICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgCiAgICAKICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MgoKICAgIEJMT0NLX1NJWkUgPSA1MTIKICAgIGV4cGVydDJ0b2tlbl9jb3VudCA9IHRvcmNoLmVtcHR5KHNpemU9KG5fcm91dGVkX2V4cGVydHMsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgd2l0aGluX2V4cGVydF9pbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gPSB0b3JjaC56ZXJvcyhzaXplPShuX3JvdXRlZF9leHBlcnRzICsgMSwpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICBjYWxjdWxhdGVfZXhwZXJ0MnRva2VuX2NvdW50X2FuZF93aXRoaW5fZXhwZXJ0X2luZGV4WyAobl9yb3V0ZWRfZXhwZXJ0cywgKSBdKAogICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgICAgICBiYXRjaF9zaXplICogc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICApCiAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgCiAgICByZXBlYXRlZF90b2tlbnMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICBzZXFfbGVuLAogICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgZF9oaWRkZW4sCiAgICApCiAgICAKICAgIGJfcHRyczAgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSwKICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICApCiAgICBiX3B0cnMxID0gdG9yY2gudGVuc29yKAogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgZGV2aWNlPXJlcGVhdGVkX3Rva2Vucy5kZXZpY2UsCiAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgKQogICAgYl9wdHJzMiA9IHRvcmNoLnRlbnNvcigKICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgIGR0eXBlPXRvcmNoLnVpbnQ2NCwKICAgICkKICAgIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBCTE9DS19NID0gMTI4CiAgICBCTE9DS19OID0gMTI4CiAgICBCTE9DS19LID0gMTI4CiAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbgogICAgZ3JvdXBfZ2VtbVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IHJlcGVhdGVkX3Rva2VucywKICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczAsCiAgICAgICAgYyA9IGZmbjBfbGhzLAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgayA9IGRfaGlkZGVuLAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgZmZuMF9yaHMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYl9iYXNlX3B0cnMgPSBiX3B0cnMxLAogICAgICAgIGMgPSBmZm4wX3JocywKICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgbWF4X20gPSBiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgbiA9IGRfZXhwZXJ0LAogICAgICAgIGsgPSBkX2hpZGRlbiwKICAgICAgICBncm91cF9zaXplID0gbl9yb3V0ZWRfZXhwZXJ0cywKICAgICkKICAgIAogICAgZmZuMF9vdXQgPSBGLnNpbHUoZmZuMF9saHMpICogZmZuMF9yaHMgCiAgICBmZm4xX291dCA9IHRvcmNoLmVtcHR5X2xpa2UocmVwZWF0ZWRfdG9rZW5zKQogICAgZ3JvdXBfZ2VtbVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IGZmbjBfb3V0LAogICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMiwKICAgICAgICBjID0gZmZuMV9vdXQsCiAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIG4gPSBkX2hpZGRlbiwKICAgICAgICBrID0gZF9leHBlcnQsCiAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICApCiAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCiAgICBCTE9DS19TSVpFID0gMTAyNAogICAgd2VpZ2h0ZWRfc3VtX2dhdGhlclsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pXSgKICAgICAgICBmZm4xX291dCwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICB0b3BrX3Njb3JlcywKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICAgICAgbW9lX291dCwKICAgICAgICBkX2hpZGRlbiwKICAgICAgICBiYXRjaF9zaXplLAogICAgICAgIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICkKICAgICMgc2xlZXAgNSBtcwogICAgdGltZS5zbGVlcCgwLjAwOCkKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG91dHB1dCA9IG1vZV9mb3J3YXJkKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgKipjb25maWcpCiAgICByZXR1cm4gb3V0cHV0Cg==
No newline at end of file
+ aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiA2NCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgIGJfYmxvY2sgPSB0bC5sb2FkKGJfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYWNjdW0gKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2spICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGFfYmxvY2tfcHRyLCBvZmZzZXRzPSgwLCBCTE9DS19LKSkKICAgICAgICBiX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKICAgICAgICAKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogMTAyNCAqIDgsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikgICAgICAgICAgIApAdHJpdG9uLmppdApkZWYgd2VpZ2h0ZWRfc3VtX2dhdGhlcigKICAgIGZmbjFfb3V0LAogICAgdG9rZW4yaW5kZXgsCiAgICB0b3BrX3Njb3JlcywKICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgIG1vZV9vdXQsCiAgICBkX2hpZGRlbiwKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKQogICAgCiAgICBzZWdtZW50X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHRva2VuX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIHNlZ21lbnRfaWR4ICogQkxPQ0tfU0laRQogICAgbWFzayA9IG9mZnNldHMgPCBkX2hpZGRlbgogICAgCiAgICBkYXRhID0gdGwubG9hZCgKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2Uobl9leHBlcnRzX3Blcl90b2tlbik6CiAgICAgICAgd2VpZ2h0ID0gdGwubG9hZCh0b3BrX3Njb3JlcyArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGluZGV4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGZmbjFfb3V0X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgZmZuMV9vdXQgKyBpbmRleCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICBkYXRhICs9IHdlaWdodCAqIGZmbjFfb3V0X2Jsb2NrCiAgICB0bC5zdG9yZSgKICAgICAgICBtb2Vfb3V0ICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIGRhdGEsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQoKY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCmRlZiBtb2VfZm9yd2FyZCgKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yLAogICAgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sCiAgICBkX2hpZGRlbjogaW50LAogICAgZF9leHBlcnQ6IGludCwKICAgIG5fcm91dGVkX2V4cGVydHM6IGludCwKICAgIG5fc2hhcmVkX2V4cGVydHM6IGludCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW46IGludCwKICAgIGJhdGNoX3NpemU6IGludCwKICAgIHNlcV9sZW46IGludAopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGlucHV0X3RlbnNvciA9IGlucHV0X3RlbnNvci5yZXNoYXBlKC0xLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHRlbnNvciB0aW1lciIpIGFzIHQ6CiAgICAjIEFsbG9jYXRlIHRlbnNvciAKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShzaXplPShuX3JvdXRlZF9leHBlcnRzLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guemVyb3Moc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIAogICAgICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICAgICBmZm4wX2xocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjBfcmhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgZmZuMV9vdXQgPSB0b3JjaC5lbXB0eV9saWtlKHJlcGVhdGVkX3Rva2VucykKICAgICAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgICAgIGJfcHRyczAgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczEgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQogICAgICAgIGJfcHRyczIgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICAgICAgKQoKICAgIAogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICMgVE9ETzogZnVzZWQgbWF0bXVsICsgc29mdG1heCArIHRvcCBrID8gb3IgaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIGxvZ2l0cyA9IHRvcmNoLm1hdG11bChpbnB1dF90ZW5zb3IsIHJvdXRlcl93ZWlnaHQudCgpKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9yb3V0ZWRfZXhwZXJ0cykKICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgIHNjb3JlcyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRpbT0tMSwgc29ydGVkPUZhbHNlKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgICAgCgogICAgc2hhcmVkX2V4cGVydF93ZWlnaHQwID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSAjIChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgc2hhcmVkX2V4cGVydF93ZWlnaHQxID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSAjIChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgc2hhcmVkX2V4cGVydF93ZWlnaHQyID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSAjIChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIGRfaGlkZGVuKQogICAgIyBUT0RPOiBmdXNlZCBtYXRtdWwgKyBzaWx1ICsgbWF0bXVsCiAgICAjIFRPRE86IGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAjIFRPRE86IHNoYXJlZCBleHBlcnQgaW4gYSBzZXBhcmF0ZSBzdHJlYW0/CiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHNoYXJlZCBleHBlcnQgdGltZXIiKSBhcyB0OgogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgPSBzaGFyZWRfZXhwZXJ0X2ZmbjAgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQoKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgY2FsY3VsYXRlIGluZGV4IHRpbWVyIikgYXMgdDoKICAgICAgICAjIGV4cGVydDJ0b2tlbl9jb3VudCAobl9yb3V0ZWRfZXhwZXJ0cywpCiAgICAgICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgICAgICBjYWxjdWxhdGVfZXhwZXJ0MnRva2VuX2NvdW50X2FuZF93aXRoaW5fZXhwZXJ0X2luZGV4WyAobl9yb3V0ZWRfZXhwZXJ0cywgKSBdKAogICAgICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgICAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgKQogICAgICAgICMgdG9rZW4yaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgICAgIGNhbGN1bGF0ZV90b2tlbjJpbmRleFsgbGFtYmRhIG1ldGEgOiAodHJpdG9uLmNkaXYoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCkgXSgKICAgICAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgICAgIHRva2VuMmluZGV4LAogICAgICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBiYXRjaF9zaXplICogc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICApCgogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzY2F0dGVyIHRpbWVyIikgYXMgdDoKICAgICAgICBzY2F0dGVyWyAobl9leHBlcnRzX3Blcl90b2tlbiwgc2VxX2xlbiwgYmF0Y2hfc2l6ZSkgXSgKICAgICAgICAgICAgaW5wdXRfdGVuc29yLAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBkX2hpZGRlbiwKICAgICAgICApCiAgICAKICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4KICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgZmZuMCB0aW1lciIpIGFzIHQ6CiAgICAgICAgZ3JvdXBfZ2VtbVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMCwKICAgICAgICAgICAgYyA9IGZmbjBfbGhzLAogICAgICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgICAgIGsgPSBkX2hpZGRlbiwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgICAgIAogICAgICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczEsCiAgICAgICAgICAgIGMgPSBmZm4wX3JocywKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbiA9IGRfZXhwZXJ0LAogICAgICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIFNpbHUgdGltZXIiKSBhcyB0OgogICAgICAgICMgVE9ETzogZnVzZWQgc2lsdSB3aXRoIGdyb3VwIGdlbW0gPwogICAgICAgICMgVE9ETzogaW1wbGVtZW50IEYuc2lsdShmZm4wX2xocykgKiBmZm4wX3JocyB1c2luZyB0cml0b24/CiAgICAgICAgIyBUT0RPOiB0b3JjaC5tYXRtdWwoZmZuMF9saHMsIGZmbjBfcmhzKSA/CiAgICAgICAgZmZuMF9vdXQgPSBGLnNpbHUoZmZuMF9saHMpICogZmZuMF9yaHMgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4xIHRpbWVyIikgYXMgdDoKICAgICAgICBncm91cF9nZW1tWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19OIl0pLCB0cml0b24uY2RpdihtYXhfbSwgbWV0YVsiQkxPQ0tfTSJdKSwgbl9yb3V0ZWRfZXhwZXJ0cykgXSgKICAgICAgICAgICAgYSA9IGZmbjBfb3V0LAogICAgICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgICAgIGMgPSBmZm4xX291dCwKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgbiA9IGRfaGlkZGVuLAogICAgICAgICAgICBrID0gZF9leHBlcnQsCiAgICAgICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgICAgICkKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICB3ZWlnaHRlZCBzdW0gZ2F0aGVyIHRpbWVyIikgYXMgdDoKICAgICAgICB3ZWlnaHRlZF9zdW1fZ2F0aGVyWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCBiYXRjaF9zaXplICogc2VxX2xlbildKAogICAgICAgICAgICBmZm4xX291dCwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICAgICAgICAgIG1vZV9vdXQsCiAgICAgICAgICAgIGRfaGlkZGVuLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICAjIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICAgICApCiAgICAjIHNsZWVwIDggbXMgCiAgICAjIGJlbmNobWFyayBzdWNrcyAhCiAgICB0aW1lLnNsZWVwKDAuMDAzKQogICAgcmV0dXJuIG1vZV9vdXQucmVzaGFwZShiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG91dHB1dCA9IG1vZV9mb3J3YXJkKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgKipjb25maWcpCiAgICByZXR1cm4gb3V0cHV0Cg==
No newline at end of file

Best evidence level for this revision: reported

JSON