Skip to content
KernelIndex
Search⌘K

submission 13557

KernelBot user 160 · 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.

submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-13557?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz

Benchmark evidence

18 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 512]
AMD Instinct MI300X
47.7µs
#51 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
48.4µs
#54 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
87.1µs
#64 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
142.2µs
#71 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
163.5µs
#74 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
209.8µs
#78 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
223.9µs
#73 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
299.7µs
#75 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
308.4µs
#81 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
309.2µs
#81 of 98
2025-04-30
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
315.8µs
#74 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
320.7µs
#66 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
329.4µs
#60 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
351.9µs
#66 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
729.6µs
#71 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
935.7µs
#77 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
1.05ms
#77 of 98
2025-04-30
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
2.10ms
#76 of 98
2025-04-30

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:9cf7279d99ffca1e829193ba9af4f1829835c6e68cc95fb14e7fd583cdc13a88
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX04oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgU1VCQk4gPSBCTiAvIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgU1VCQk0gPSBCTSAvIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IG51bVRocmVhZHMgLyBTVUJCTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUIgPSBudW1UaHJlYWRzIC8gU1VCQk07CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MzJfdCBudW1UaWxlcyA9IGNkaXYoTiwgQk4pICogY2RpdihNLCBCTSk7CgogIGZvciAodWludDMyX3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgdWludDMyX3Qgcm93T2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihOLCBCTikpICogQk47CiAgICB1aW50MzJfdCBjb2xPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE4sIEJOKSkgKiBCTTsKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgU1VCQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSB0aHJlYWRJZHgueCAvIFNVQkJOOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBTVUJCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9IHRocmVhZElkeC54IC8gU1VCQk07CgogICAgdWludDMyX3QgbGFuZUlkeCA9IHRocmVhZElkeC54ICUgV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwSWR4ID0gdGhyZWFkSWR4LnggLyBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBDb2xPZmZzZXQgPSAod2FycElkeCAlIChCTSAvIFdNKSkgKiBXTTsKICAgIHVpbnQzMl90IHdhcnBSb3dPZmZzZXQgPSAod2FycElkeCAvIChCTSAvIFdNKSkgKiBXTjsKICAgIHVpbnQzMl90IHdhcnBYID0gbGFuZUlkeCAlIDMyOwogICAgdWludDMyX3Qgd2FycFkgPSBsYW5lSWR4IC8gMzI7CgogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IEFzW0JLXVtCTl0sIEJzW0JLXVtCTV07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgX19oaXBfZnA4X2U0bTNfZm51eiBhW1dJVEVSTl1bOF0sIGJbV0lURVJNXVs4XTsKICAgIGZsb2F0eDE2IGRbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgIGZvciAodWludDMyX3QgdGlsZU9mZnNldCA9IDA7IHRpbGVPZmZzZXQgPCBLOyB0aWxlT2Zmc2V0ICs9IEJLKSB7CiAgICAgIC8vIGxvYWQgZnJvbSBnbG9iYWwgdG8gc2hhcmVkIG1lbW9yeSBpbiBjb2FsZXNjZWQgbWFubmVyCiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXQgPSAwOyBpbm5lclJvd09mZnNldCA8IEJLOwogICAgICAgICAgIGlubmVyUm93T2Zmc2V0ICs9IHN0cmlkZUEpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpIDwgTiAmJgogICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZBc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93QV1baW5uZXJDb2xBICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpICogTiArCiAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZBc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93QV1baW5uZXJDb2xBICogVkVDVE9SX1NJWkVdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIgKiBWRUNUT1JfU0laRSkgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkJzW2lubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCXVtpbm5lckNvbEIgKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigKICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgKiBNICsKICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIgKiBWRUNUT1JfU0laRSldKTsKICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBCSyAmJgogICAgICAgICAgICAgICAgICAgKGlubmVyQ29sQiAqIFZFQ1RPUl9TSVpFKSA8IEJNKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0JdW2lubmVyQ29sQiAqIFZFQ1RPUl9TSVpFXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCBTVUJCTikgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICAgJkFfc2NhbGVbKHRpbGVPZmZzZXQgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICAgIH0KICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgICBXc1tCTl0gPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgfQogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICBmbG9hdCBiX3NjYWxlID0gV3NbQk5dOwogICAgICBmbG9hdHgxNiBjW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgODsgKytpKSB7CiAgICAgICAgICAgIGFbd25dW2ldID0KICAgICAgICAgICAgICAgIEFzW0JLT2Zmc2V0ICsgd2FycFkgKiA4ICsgaV1bd2FycFJvd09mZnNldCArIHduICogMzIgKyB3YXJwWF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICAgICBiW3dtXVtpXSA9CiAgICAgICAgICAgICAgICBCc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KGFbd25dKSwKICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oYlt3bV0pLCBjW3duXVt3bV0sIDAsIDAsIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICAgIGRbd25dW3dtXVtpICsgaiAqIDRdICs9CiAgICAgICAgICAgICAgICAgIGNbd25dW3dtXVtpICsgaiAqIDRdICoKICAgICAgICAgICAgICAgICAgV3Nbd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGldICogYl9zY2FsZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgfQoKICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgIGlmICgocm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSA8CiAgICAgICAgICAgICAgICAgICAgTiAmJgogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKSA8IE0pCiAgICAgICAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSAqCiAgICAgICAgICAgICAgICAgICAgTSArCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpXSA9CiAgICAgICAgICAgICAgICAgIChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjb25zdCB1aW50MzJfdCBCTiwgY29uc3QgdWludDMyX3QgQkssIGNvbnN0IHVpbnQzMl90IEJNLAogICAgICAgICAgY29uc3QgdWludDMyX3QgV0lURVJOLCBjb25zdCB1aW50MzJfdCBXSVRFUk0sIGNvbnN0IHVpbnQzMl90IFNNX0NPVU5UPgpfX2dsb2JhbF9fIHZvaWQKZnA4X21tX2tlcm5lbF9NKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkEsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkIsCiAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgICAgdWludDMyX3QgTiwgdWludDMyX3QgSywgdWludDMyX3QgTSkgewogIHVzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBWRUNUT1JfU0laRSA9IDQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXQVJQU0laRSA9IDY0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV04gPSAzMiAqIFdJVEVSTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdNID0gMzIgKiBXSVRFUk07CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBudW1UaHJlYWRzID0gKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFNVQkJOID0gQk4gLyBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFNVQkJNID0gQk0gLyBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUEgPSBudW1UaHJlYWRzIC8gU1VCQk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gbnVtVGhyZWFkcyAvIFNVQkJNOwoKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTiA9PSAwLCAiQk4gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJNID09IDAsICJCTSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChCSyA8PSAxMjggJiYgQk0gPD0gMTI4LCAiUmFuZ2UgYWJvdmUgMTI4IGlzIG5vdCBzdXBwb3J0ZWQiKTsKCiAgdWludDMyX3QgbnVtVGlsZXMgPSBjZGl2KE4sIEJOKSAqIGNkaXYoTSwgQk0pOwoKICBmb3IgKHVpbnQzMl90IHRpbGVJZHggPSBibG9ja0lkeC54OyB0aWxlSWR4IDwgbnVtVGlsZXM7IHRpbGVJZHggKz0gU01fQ09VTlQpIHsKICAgIHVpbnQzMl90IHJvd09mZnNldEMgPSAodGlsZUlkeCAvIGNkaXYoTSwgQk0pKSAqIEJOOwogICAgdWludDMyX3QgY29sT2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihNLCBCTSkpICogQk07CiAgICB1aW50MzJfdCBjb2xPZmZzZXRBID0gcm93T2Zmc2V0QzsKICAgIHVpbnQzMl90IGNvbE9mZnNldEIgPSBjb2xPZmZzZXRDOwogICAgdWludDMyX3QgTV9zY2FsZSA9IGNkaXYoTSwgQkxPQ0tfRElNKTsKCiAgICB1aW50MzJfdCBpbm5lckNvbEEgPSB0aHJlYWRJZHgueCAlIFNVQkJOOwogICAgdWludDMyX3QgaW5uZXJSb3dBID0gdGhyZWFkSWR4LnggLyBTVUJCTjsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgU1VCQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSB0aHJlYWRJZHgueCAvIFNVQkJNOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCS11bQk5dLCBCc1tCS11bQk1dOwogICAgX19zaGFyZWRfXyBmbG9hdCBXc1tCTiArIDFdOwoKICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogYVtXSVRFUk5dWzhdLCBiW1dJVEVSTV1bOF07CiAgICBmbG9hdHgxNiBkW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKCiAgICBmb3IgKHVpbnQzMl90IHRpbGVPZmZzZXQgPSAwOyB0aWxlT2Zmc2V0IDwgSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBsb2FkIGZyb20gZ2xvYmFsIHRvIHNoYXJlZCBtZW1vcnkgaW4gY29hbGVzY2VkIG1hbm5lcgogICAgICBmb3IgKHVpbnQzMl90IGlubmVyUm93T2Zmc2V0ID0gMDsgaW5uZXJSb3dPZmZzZXQgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldCArPSBzdHJpZGVBKSB7CiAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQXNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0FdW2lubmVyQ29sQSAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KAogICAgICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQXNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0FdW2lubmVyQ29sQSAqIFZFQ1RPUl9TSVpFXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpIDwgTSAmJgogICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZCc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93Ql1baW5uZXJDb2xCICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpIDwgQksgJiYKICAgICAgICAgICAgICAgICAgIChpbm5lckNvbEIgKiBWRUNUT1JfU0laRSkgPCBCTSkgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkJzW2lubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCXVtpbm5lckNvbEIgKiBWRUNUT1JfU0laRV0pID0gMC4wZjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRocmVhZElkeC54IDwgU1VCQk4pIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KICAgICAgX19zeW5jdGhyZWFkcygpOwoKICAgICAgZmxvYXQgYl9zY2FsZSA9IFdzW0JOXTsKICAgICAgZmxvYXR4MTYgY1tXSVRFUk5dW1dJVEVSTV0gPSB7MH07CiAgICAgIGZvciAodWludDMyX3QgQktPZmZzZXQgPSAwOyBCS09mZnNldCA8IEJLOyBCS09mZnNldCArPSAxNikgewogICAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICAgICBhW3duXVtpXSA9CiAgICAgICAgICAgICAgICBBc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKICAgICAgICAgICAgYlt3bV1baV0gPQogICAgICAgICAgICAgICAgQnNbQktPZmZzZXQgKyB3YXJwWSAqIDggKyBpXVt3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgICAgY1t3bl1bd21dID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngxNl9mcDhfZnA4KAogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihhW3duXSksCiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KGJbd21dKSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgIH0KCiAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MzJfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICBpZiAoKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgPAogICAgICAgICAgICAgICAgICAgIE4gJiYKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCkgPCBNKQogICAgICAgICAgICAgIENbKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgKgogICAgICAgICAgICAgICAgICAgIE0gKwogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKV0gPQogICAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYpZFt3bl1bd21dW2kgKyBqICogNF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgphdDo6VGVuc29yIGZwOF9tbShhdDo6VGVuc29yIEEsIGF0OjpUZW5zb3IgQiwgYXQ6OlRlbnNvciBBX3NjYWxlLAogICAgICAgICAgICAgICAgICBhdDo6VGVuc29yIEJfc2NhbGUsIGF0OjpUZW5zb3IgQykgewogIGludCBOID0gQS5zaXplKDApLCBLID0gQS5zaXplKDEpLCBNID0gQi5zaXplKDApOwoKICBjb25zdCBpbnQgQksgPSAxMjg7CiAgY29uc3QgaW50IEJOID0gMTI4OwogIGNvbnN0IGludCBCTSA9IDEyODsKICBjb25zdCBpbnQgV0lURVJOID0gMTsKICBjb25zdCBpbnQgV0lURVJNID0gMTsKICBjb25zdCBpbnQgU01fQ09VTlQgPSAzMDQ7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKFNNX0NPVU5UKTsKICBpZiAoTiA+IE0pIHsKICAgICAgZnA4X21tX2tlcm5lbF9OPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVD48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsX008Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0KICByZXR1cm4gQzsKfQoiIiIKCmNwcF9zcmMgPSByIiIiCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKTsKIiIiCgppZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICBzeXMuc3Rkb3V0ID0gb3BlbigiL2Rldi9zdGRvdXQiLCAidyIpCmlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgIHN5cy5zdGRlcnIgPSBvcGVuKCIvZGV2L3N0ZGVyciIsICJ3IikKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1PMyIsICItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCJdLAopCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQogICAgcmV0dXJuIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykK

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 submission 10058.

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIHVpbnQxNl90IGNkaXYodWludDE2X3QgYSwgdWludDE2X3QgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTT4KX19nbG9iYWxfXyB2b2lkCmZwOF9tbV9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgIHVpbnQzMl90IE4sIHVpbnQzMl90IEssIHVpbnQzMl90IE0pIHsKICB1c2luZyBmbG9hdHgxNiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNiAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CgogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgVkVDVE9SX1NJWkUgPSA0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgV0FSUFNJWkUgPSA2NDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IFdOID0gMzIgKiBXSVRFUk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBXTSA9IDMyICogV0lURVJNOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgbnVtVGhyZWFkcyA9IChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSk7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBTVUJCTiA9IEJOIC8gVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBTVUJCTSA9IEJNIC8gVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBzdHJpZGVBID0gbnVtVGhyZWFkcyAvIFNVQkJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qgc3RyaWRlQiA9IG51bVRocmVhZHMgLyBTVUJCTTsKCiAgdWludDMyX3Qgcm93T2Zmc2V0QyA9IGJsb2NrSWR4LnkgKiBCTjsKICB1aW50MzJfdCBjb2xPZmZzZXRDID0gYmxvY2tJZHgueCAqIEJNOwogIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogIHVpbnQzMl90IGNvbE9mZnNldEIgPSBjb2xPZmZzZXRDOwogIHVpbnQxNl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MTZfdCBpbm5lckNvbEEgPSB0aHJlYWRJZHgueCAlIFNVQkJOOwogIHVpbnQxNl90IGlubmVyUm93QSA9IHRocmVhZElkeC54IC8gU1VCQk47CiAgdWludDE2X3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBTVUJCTTsKICB1aW50MTZfdCBpbm5lclJvd0IgPSB0aHJlYWRJZHgueCAvIFNVQkJNOwoKICB1aW50MTZfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICB1aW50MTZfdCB3YXJwSWR4ID0gdGhyZWFkSWR4LnggLyBXQVJQU0laRTsKICB1aW50MTZfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgdWludDE2X3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gV00pKSAqIFdOOwogIHVpbnQxNl90IHdhcnBYID0gbGFuZUlkeCAlIDMyOwogIHVpbnQxNl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogQXNbQktdW0JOXSwgQnNbQktdW0JNXTsKICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogIF9faGlwX2ZwOF9lNG0zX2ZudXogYVtXSVRFUk5dWzhdLCBiW1dJVEVSTV1bOF07CiAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogIGZvciAodWludDE2X3QgdGlsZU9mZnNldCA9IDA7IHRpbGVPZmZzZXQgPCBLOyB0aWxlT2Zmc2V0ICs9IEJLKSB7CiAgICAvLyBsb2FkIGZyb20gZ2xvYmFsIHRvIHNoYXJlZCBtZW1vcnkgaW4gY29hbGVzY2VkIG1hbm5lcgogICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEsgJiYKICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpIDwgTiAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAmQXNbaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXVtpbm5lckNvbEEgKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpXSk7CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAmQXNbaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXVtpbm5lckNvbEEgKiBWRUNUT1JfU0laRV0pID0gMC4wZjsKICAgICAgfQogICAgfQogICAgaWYgKHRocmVhZElkeC54IDwgU1VCQk4pIHsKICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQ0ICo+KCZXc1t0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRSldKTsKICAgIH0KICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQiAqIFZFQ1RPUl9TSVpFKSA8IE0gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgJkJzW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql1baW5uZXJDb2xCICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KAogICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQiAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQksgJiYKICAgICAgICAgICAgICAgICAoaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpIDwgQk0pIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgJkJzW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql1baW5uZXJDb2xCICogVkVDVE9SX1NJWkVdKSA9IDAuMGY7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgIFdzW0JOXSA9IEJfc2NhbGVbKHRpbGVPZmZzZXQgLyBCTE9DS19ESU0pICogTV9zY2FsZSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgZmxvYXQgYl9zY2FsZSA9IFdzW0JOXTsKICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwogICAgZm9yICh1aW50MTZfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKICAgICAgICAgIGFbd25dW2ldID0KICAgICAgICAgICAgICBBc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHVpbnQxNl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgODsgKytpKSB7CiAgICAgICAgICBiW3dtXVtpXSA9CiAgICAgICAgICAgICAgQnNbQktPZmZzZXQgKyB3YXJwWSAqIDggKyBpXVt3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihhW3duXSksCiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihiW3dtXSksIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgV3Nbd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGldICogYl9zY2FsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQoKICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpIDwKICAgICAgICAgICAgICAgICAgTiAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCkgPCBNKQogICAgICAgICAgICBDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgTSArCiAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKV0gPQogICAgICAgICAgICAgICAgKF9faGlwX2JmbG9hdDE2KWRbd25dW3dtXVtpICsgaiAqIDRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICB1aW50MzJfdCBOID0gQS5zaXplKDApLCBLID0gQS5zaXplKDEpLCBNID0gQi5zaXplKDApOwoKICBjb25zdCB1aW50MzJfdCBCSyA9IDEyODsKICBjb25zdCB1aW50MzJfdCBCTiA9IDEyODsKICBjb25zdCB1aW50MzJfdCBCTSA9IDEyODsKICBjb25zdCB1aW50MzJfdCBXSVRFUk4gPSAxOwogIGNvbnN0IHVpbnQzMl90IFdJVEVSTSA9IDE7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKGNkaXYoTSwgQk0pLCBjZGl2KE4sIEJOKSk7CiAgZnA4X21tX2tlcm5lbDxCTiwgQkssIEJNLCBXSVRFUk4sIFdJVEVSTT48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgQV9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwgQl9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICByZXR1cm4gQzsKfQoiIiIKCmNwcF9zcmMgPSByIiIiCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKTsKIiIiCgppZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICBzeXMuc3Rkb3V0ID0gb3BlbigiL2Rldi9zdGRvdXQiLCAidyIpCmlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgIHN5cy5zdGRlcnIgPSBvcGVuKCIvZGV2L3N0ZGVyciIsICJ3IikKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1PMyIsICItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCJdLAopCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQogICAgcmV0dXJuIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykK
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX04oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgU1VCQk4gPSBCTiAvIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgU1VCQk0gPSBCTSAvIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IG51bVRocmVhZHMgLyBTVUJCTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUIgPSBudW1UaHJlYWRzIC8gU1VCQk07CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MzJfdCBudW1UaWxlcyA9IGNkaXYoTiwgQk4pICogY2RpdihNLCBCTSk7CgogIGZvciAodWludDMyX3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgdWludDMyX3Qgcm93T2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihOLCBCTikpICogQk47CiAgICB1aW50MzJfdCBjb2xPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE4sIEJOKSkgKiBCTTsKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgU1VCQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSB0aHJlYWRJZHgueCAvIFNVQkJOOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBTVUJCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9IHRocmVhZElkeC54IC8gU1VCQk07CgogICAgdWludDMyX3QgbGFuZUlkeCA9IHRocmVhZElkeC54ICUgV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwSWR4ID0gdGhyZWFkSWR4LnggLyBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBDb2xPZmZzZXQgPSAod2FycElkeCAlIChCTSAvIFdNKSkgKiBXTTsKICAgIHVpbnQzMl90IHdhcnBSb3dPZmZzZXQgPSAod2FycElkeCAvIChCTSAvIFdNKSkgKiBXTjsKICAgIHVpbnQzMl90IHdhcnBYID0gbGFuZUlkeCAlIDMyOwogICAgdWludDMyX3Qgd2FycFkgPSBsYW5lSWR4IC8gMzI7CgogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IEFzW0JLXVtCTl0sIEJzW0JLXVtCTV07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgX19oaXBfZnA4X2U0bTNfZm51eiBhW1dJVEVSTl1bOF0sIGJbV0lURVJNXVs4XTsKICAgIGZsb2F0eDE2IGRbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgIGZvciAodWludDMyX3QgdGlsZU9mZnNldCA9IDA7IHRpbGVPZmZzZXQgPCBLOyB0aWxlT2Zmc2V0ICs9IEJLKSB7CiAgICAgIC8vIGxvYWQgZnJvbSBnbG9iYWwgdG8gc2hhcmVkIG1lbW9yeSBpbiBjb2FsZXNjZWQgbWFubmVyCiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXQgPSAwOyBpbm5lclJvd09mZnNldCA8IEJLOwogICAgICAgICAgIGlubmVyUm93T2Zmc2V0ICs9IHN0cmlkZUEpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpIDwgTiAmJgogICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZBc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93QV1baW5uZXJDb2xBICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpICogTiArCiAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZBc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93QV1baW5uZXJDb2xBICogVkVDVE9SX1NJWkVdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIgKiBWRUNUT1JfU0laRSkgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkJzW2lubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCXVtpbm5lckNvbEIgKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigKICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgKiBNICsKICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIgKiBWRUNUT1JfU0laRSldKTsKICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBCSyAmJgogICAgICAgICAgICAgICAgICAgKGlubmVyQ29sQiAqIFZFQ1RPUl9TSVpFKSA8IEJNKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0JdW2lubmVyQ29sQiAqIFZFQ1RPUl9TSVpFXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCBTVUJCTikgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICAgJkFfc2NhbGVbKHRpbGVPZmZzZXQgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICAgIH0KICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgICBXc1tCTl0gPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgfQogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICBmbG9hdCBiX3NjYWxlID0gV3NbQk5dOwogICAgICBmbG9hdHgxNiBjW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgODsgKytpKSB7CiAgICAgICAgICAgIGFbd25dW2ldID0KICAgICAgICAgICAgICAgIEFzW0JLT2Zmc2V0ICsgd2FycFkgKiA4ICsgaV1bd2FycFJvd09mZnNldCArIHduICogMzIgKyB3YXJwWF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICAgICBiW3dtXVtpXSA9CiAgICAgICAgICAgICAgICBCc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KGFbd25dKSwKICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oYlt3bV0pLCBjW3duXVt3bV0sIDAsIDAsIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICAgIGRbd25dW3dtXVtpICsgaiAqIDRdICs9CiAgICAgICAgICAgICAgICAgIGNbd25dW3dtXVtpICsgaiAqIDRdICoKICAgICAgICAgICAgICAgICAgV3Nbd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGldICogYl9zY2FsZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgfQoKICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgIGlmICgocm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSA8CiAgICAgICAgICAgICAgICAgICAgTiAmJgogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKSA8IE0pCiAgICAgICAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSAqCiAgICAgICAgICAgICAgICAgICAgTSArCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpXSA9CiAgICAgICAgICAgICAgICAgIChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjb25zdCB1aW50MzJfdCBCTiwgY29uc3QgdWludDMyX3QgQkssIGNvbnN0IHVpbnQzMl90IEJNLAogICAgICAgICAgY29uc3QgdWludDMyX3QgV0lURVJOLCBjb25zdCB1aW50MzJfdCBXSVRFUk0sIGNvbnN0IHVpbnQzMl90IFNNX0NPVU5UPgpfX2dsb2JhbF9fIHZvaWQKZnA4X21tX2tlcm5lbF9NKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkEsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkIsCiAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgICAgdWludDMyX3QgTiwgdWludDMyX3QgSywgdWludDMyX3QgTSkgewogIHVzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBWRUNUT1JfU0laRSA9IDQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXQVJQU0laRSA9IDY0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV04gPSAzMiAqIFdJVEVSTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdNID0gMzIgKiBXSVRFUk07CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBudW1UaHJlYWRzID0gKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFNVQkJOID0gQk4gLyBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFNVQkJNID0gQk0gLyBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUEgPSBudW1UaHJlYWRzIC8gU1VCQk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gbnVtVGhyZWFkcyAvIFNVQkJNOwoKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTiA9PSAwLCAiQk4gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJNID09IDAsICJCTSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChCSyA8PSAxMjggJiYgQk0gPD0gMTI4LCAiUmFuZ2UgYWJvdmUgMTI4IGlzIG5vdCBzdXBwb3J0ZWQiKTsKCiAgdWludDMyX3QgbnVtVGlsZXMgPSBjZGl2KE4sIEJOKSAqIGNkaXYoTSwgQk0pOwoKICBmb3IgKHVpbnQzMl90IHRpbGVJZHggPSBibG9ja0lkeC54OyB0aWxlSWR4IDwgbnVtVGlsZXM7IHRpbGVJZHggKz0gU01fQ09VTlQpIHsKICAgIHVpbnQzMl90IHJvd09mZnNldEMgPSAodGlsZUlkeCAvIGNkaXYoTSwgQk0pKSAqIEJOOwogICAgdWludDMyX3QgY29sT2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihNLCBCTSkpICogQk07CiAgICB1aW50MzJfdCBjb2xPZmZzZXRBID0gcm93T2Zmc2V0QzsKICAgIHVpbnQzMl90IGNvbE9mZnNldEIgPSBjb2xPZmZzZXRDOwogICAgdWludDMyX3QgTV9zY2FsZSA9IGNkaXYoTSwgQkxPQ0tfRElNKTsKCiAgICB1aW50MzJfdCBpbm5lckNvbEEgPSB0aHJlYWRJZHgueCAlIFNVQkJOOwogICAgdWludDMyX3QgaW5uZXJSb3dBID0gdGhyZWFkSWR4LnggLyBTVUJCTjsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgU1VCQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSB0aHJlYWRJZHgueCAvIFNVQkJNOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCS11bQk5dLCBCc1tCS11bQk1dOwogICAgX19zaGFyZWRfXyBmbG9hdCBXc1tCTiArIDFdOwoKICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogYVtXSVRFUk5dWzhdLCBiW1dJVEVSTV1bOF07CiAgICBmbG9hdHgxNiBkW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKCiAgICBmb3IgKHVpbnQzMl90IHRpbGVPZmZzZXQgPSAwOyB0aWxlT2Zmc2V0IDwgSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBsb2FkIGZyb20gZ2xvYmFsIHRvIHNoYXJlZCBtZW1vcnkgaW4gY29hbGVzY2VkIG1hbm5lcgogICAgICBmb3IgKHVpbnQzMl90IGlubmVyUm93T2Zmc2V0ID0gMDsgaW5uZXJSb3dPZmZzZXQgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldCArPSBzdHJpZGVBKSB7CiAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQXNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0FdW2lubmVyQ29sQSAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KAogICAgICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQXNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0FdW2lubmVyQ29sQSAqIFZFQ1RPUl9TSVpFXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpIDwgTSAmJgogICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZCc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93Ql1baW5uZXJDb2xCICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpIDwgQksgJiYKICAgICAgICAgICAgICAgICAgIChpbm5lckNvbEIgKiBWRUNUT1JfU0laRSkgPCBCTSkgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkJzW2lubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCXVtpbm5lckNvbEIgKiBWRUNUT1JfU0laRV0pID0gMC4wZjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRocmVhZElkeC54IDwgU1VCQk4pIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KICAgICAgX19zeW5jdGhyZWFkcygpOwoKICAgICAgZmxvYXQgYl9zY2FsZSA9IFdzW0JOXTsKICAgICAgZmxvYXR4MTYgY1tXSVRFUk5dW1dJVEVSTV0gPSB7MH07CiAgICAgIGZvciAodWludDMyX3QgQktPZmZzZXQgPSAwOyBCS09mZnNldCA8IEJLOyBCS09mZnNldCArPSAxNikgewogICAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICAgICBhW3duXVtpXSA9CiAgICAgICAgICAgICAgICBBc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKICAgICAgICAgICAgYlt3bV1baV0gPQogICAgICAgICAgICAgICAgQnNbQktPZmZzZXQgKyB3YXJwWSAqIDggKyBpXVt3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgICAgY1t3bl1bd21dID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngxNl9mcDhfZnA4KAogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihhW3duXSksCiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KGJbd21dKSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgIH0KCiAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MzJfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICBpZiAoKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgPAogICAgICAgICAgICAgICAgICAgIE4gJiYKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCkgPCBNKQogICAgICAgICAgICAgIENbKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgKgogICAgICAgICAgICAgICAgICAgIE0gKwogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKV0gPQogICAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYpZFt3bl1bd21dW2kgKyBqICogNF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgphdDo6VGVuc29yIGZwOF9tbShhdDo6VGVuc29yIEEsIGF0OjpUZW5zb3IgQiwgYXQ6OlRlbnNvciBBX3NjYWxlLAogICAgICAgICAgICAgICAgICBhdDo6VGVuc29yIEJfc2NhbGUsIGF0OjpUZW5zb3IgQykgewogIGludCBOID0gQS5zaXplKDApLCBLID0gQS5zaXplKDEpLCBNID0gQi5zaXplKDApOwoKICBjb25zdCBpbnQgQksgPSAxMjg7CiAgY29uc3QgaW50IEJOID0gMTI4OwogIGNvbnN0IGludCBCTSA9IDEyODsKICBjb25zdCBpbnQgV0lURVJOID0gMTsKICBjb25zdCBpbnQgV0lURVJNID0gMTsKICBjb25zdCBpbnQgU01fQ09VTlQgPSAzMDQ7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKFNNX0NPVU5UKTsKICBpZiAoTiA+IE0pIHsKICAgICAgZnA4X21tX2tlcm5lbF9OPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVD48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsX008Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0KICByZXR1cm4gQzsKfQoiIiIKCmNwcF9zcmMgPSByIiIiCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKTsKIiIiCgppZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICBzeXMuc3Rkb3V0ID0gb3BlbigiL2Rldi9zdGRvdXQiLCAidyIpCmlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgIHN5cy5zdGRlcnIgPSBvcGVuKCIvZGV2L3N0ZGVyciIsICJ3IikKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1PMyIsICItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCJdLAopCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQogICAgcmV0dXJuIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykK
No newline at end of file

Best evidence level for this revision: reported

JSON