Skip to content
KernelIndex
Search⌘K

submission 27162

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-27162?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
36.8µs
#17 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
39.9µs
#25 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
47.1µs
#2 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
54.5µs
#11 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
55.5µs
#3 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
91.6µs
#9 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
94.8µs
#17 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
95.9µs
#25 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
97.6µs
#27 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
102.9µs
#17 of 98
2025-05-25
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
128.2µs
#1 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
141.1µs
#1 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
148.4µs
#24 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
162.7µs
#9 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
267.3µs
#24 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
376.7µs
#26 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
415.9µs
#26 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
790.5µs
#24 of 98
2025-05-25

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:a373126e2b89cbf3fb3ae4d1e2484aa96432b2da56e28d9dcf3bb8cc09eca4f4
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDIiCgpjdWRhX3NyYyA9IHIiIiIKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXyBjb25zdGV4cHIgaW50IGNkaXYoaW50IGEsIGludCBiKSB7CiAgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQoKI2RlZmluZSBCTE9DS19ESU0gMTI4Cgp0ZW1wbGF0ZSA8Y29uc3QgdWludDE2X3QgQk4sIGNvbnN0IHVpbnQxNl90IEJLLCBjb25zdCB1aW50MTZfdCBCTSwKICAgICAgICAgIGNvbnN0IHVpbnQxNl90IFdJVEVSTiwgY29uc3QgdWludDE2X3QgV0lURVJNLCBjb25zdCB1aW50MTZfdCBTTV9DT1VOVCwKICAgICAgICAgIGNvbnN0IHVpbnQxNl90IE1GTUFfRElNLCBjb25zdCB1aW50MTZfdCBNRk1BX0s+Cl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fa2VybmVsX3N0cmVhbWsoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpCX3NjYWxlLCBmbG9hdCAqQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBOLCB1aW50MTZfdCBLLCB1aW50MTZfdCBNKSB7CiAgdXNpbmcgdWludDh4MTYgPQogICAgICBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YodWludDhfdCkpKSkgdWludDhfdDsKICB1c2luZyB1aW50OHg0ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YodWludDhfdCkpKSkgdWludDhfdDsKICB1c2luZyBmbG9hdHg0ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBXTiA9IE1GTUFfRElNICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgV00gPSBNRk1BX0RJTSAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IG51bVRocmVhZHMgPQogICAgICAoQk4gKiBCTSkgLyAoKE1GTUFfRElNICogTUZNQV9ESU0gLyBXQVJQU0laRSkgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qgc3RyaWRlQSA9CiAgICAgIChudW1UaHJlYWRzIC8gKEJOIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qgc3RyaWRlQiA9CiAgICAgIChudW1UaHJlYWRzIC8gKEJNIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgbnN0cmlkZXNBID0gQksgPj0gc3RyaWRlQSA/IGNkaXYoQkssIHN0cmlkZUEpIDogMTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IG5zdHJpZGVzQiA9IEJLID49IHN0cmlkZUIgPyBjZGl2KEJLLCBzdHJpZGVCKSA6IDE7CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MzJfdCBudW1UaWxlcyA9IGNkaXYoTiwgQk4pICogY2RpdihNLCBCTSk7CiAgdWludDE2X3Qgc3ViVGlsZXNQZXJUaWxlID0gY2RpdihLLCBCSyk7CiAgdWludDMyX3QgdG90YWxTdWJUaWxlcyA9IG51bVRpbGVzICogc3ViVGlsZXNQZXJUaWxlOwogIHVpbnQxNl90IHN1YlRpbGVzVG9Qcm9jZXNzID0gY2Rpdih0b3RhbFN1YlRpbGVzLCBTTV9DT1VOVCk7CiAgdWludDMyX3Qgc3RhcnRTdWJUaWxlSWR4ID0gc3ViVGlsZXNUb1Byb2Nlc3MgKiBibG9ja0lkeC54OwogIHVpbnQzMl90IHN0YXJ0VGlsZUlkeCA9IHN0YXJ0U3ViVGlsZUlkeCAvIHN1YlRpbGVzUGVyVGlsZTsKICB1aW50MzJfdCBzdWJUaWxlID0gc3RhcnRTdWJUaWxlSWR4OwoKICBmb3IgKHVpbnQxNl90IHRpbGVJZHggPSBzdGFydFRpbGVJZHgsIHN1YlRpbGVzUHJvY2Vzc2VkID0gMDsKICAgICAgIHRpbGVJZHggPCBudW1UaWxlcyAmJiBzdWJUaWxlc1Byb2Nlc3NlZCA8IHN1YlRpbGVzVG9Qcm9jZXNzOyArK3RpbGVJZHgpIHsKICAgIHVpbnQxNl90IHJvd09mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTiwgQk4pKSAqIEJOOwogICAgdWludDE2X3QgY29sT2Zmc2V0QyA9ICh0aWxlSWR4IC8gY2RpdihOLCBCTikpICogQk07CiAgICB1aW50MTZfdCBjb2xPZmZzZXRBID0gcm93T2Zmc2V0QzsKICAgIHVpbnQxNl90IGNvbE9mZnNldEIgPSBjb2xPZmZzZXRDOwogICAgdWludDE2X3QgTV9zY2FsZSA9IGNkaXYoTSwgQkxPQ0tfRElNKTsKCiAgICB1aW50MTZfdCBpbm5lckNvbEEgPSAodGhyZWFkSWR4LnggJSAoQk4gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgICB1aW50MTZfdCBpbm5lclJvd0EgPSAodGhyZWFkSWR4LnggLyAoQk4gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgICB1aW50MTZfdCBpbm5lckNvbEIgPSAodGhyZWFkSWR4LnggJSAoQk0gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgICB1aW50MTZfdCBpbm5lclJvd0IgPSAodGhyZWFkSWR4LnggLyAoQk0gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CgogICAgdWludDE2X3QgbGFuZUlkeCA9IHRocmVhZElkeC54ICUgV0FSUFNJWkU7CiAgICB1aW50MTZfdCB3YXJwSWR4ID0gdGhyZWFkSWR4LnggLyBXQVJQU0laRTsKICAgIHVpbnQxNl90IHdhcnBDb2xPZmZzZXQgPSAod2FycElkeCAlIChCTSAvIFdNKSkgKiBXTTsKICAgIHVpbnQxNl90IHdhcnBSb3dPZmZzZXQgPSAod2FycElkeCAvIChCTSAvIFdNKSkgKiBXTjsKICAgIHVpbnQxNl90IHdhcnBYID0gbGFuZUlkeCAlIE1GTUFfRElNOwogICAgdWludDE2X3Qgd2FycFkgPSBsYW5lSWR4IC8gTUZNQV9ESU07CgogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IEFzWzJdW0JOXVtCS10sIEJzWzJdW0JNXVtCS107CiAgICBpbnQgY3VyciA9IDAsIG5leHQgPSAxOwoKICAgIHN1YlRpbGUgPSBzdWJUaWxlICUgc3ViVGlsZXNQZXJUaWxlOwogICAgdWludDE2X3QgdGlsZU9mZnNldCA9IHN1YlRpbGUgKiBCSzsKCiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJiAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgdWludDh4NCB4W1ZFQ1RPUl9TSVpFXSwgeHRbVkVDVE9SX1NJWkVdOwoKICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgeFtpXSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4eDQgKj4oCiAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyBpKSAqIE4gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIH0KCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIGZvciAodWludDE2X3QgaiA9IDA7IGogPCBWRUNUT1JfU0laRTsgKytqKSB7CiAgICAgICAgICAgIHh0W2ldW2pdID0geFtqXVtpXTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xBICsgaTsKICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0E7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQXNbY3Vycl1bcm93XVtjb2xdKSA9IHh0W2ldOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIGludCByb3cgPSBpbm5lckNvbEEgKyBpOwogICAgICAgICAgaW50IGNvbCA9IGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QTsKICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50OHg0ICo+KCZBc1tjdXJyXVtyb3ddW2NvbF0pID0gezB9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEIgPSAwOyBpbm5lclJvd09mZnNldEIgPCBCSzsKICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKSA8IE0gJiYgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIHVpbnQ4eDQgeFtWRUNUT1JfU0laRV0sIHh0W1ZFQ1RPUl9TSVpFXTsKCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIHhbaV0gPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OHg0ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgaSkgKiBNICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICB4dFtpXVtqXSA9IHhbal1baV07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgaW50IHJvdyA9IGlubmVyQ29sQiArIGk7CiAgICAgICAgICBpbnQgY29sID0gaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCOwogICAgICAgICAgY29sID0gKGNvbCArIChyb3cgLyAzMikgKiA4KSAlIDEyODsKICAgICAgICAgIGNvbCA9IChjb2wgKyByb3cgKiA4KSAlIDEyODsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQ4eDQgKj4oJkJzW2N1cnJdW3Jvd11bY29sXSkgPSB4dFtpXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xCICsgaTsKICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0I7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQnNbY3Vycl1bcm93XVtjb2xdKSA9IHswfTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgdWludDMyX3QgQV90bXBbVkVDVE9SX1NJWkVdW25zdHJpZGVzQV07CiAgICB1aW50MzJfdCBCX3RtcFtWRUNUT1JfU0laRV1bbnN0cmlkZXNCXTsKCiAgICBmbG9hdHg0IGRbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgIGZvciAodGlsZU9mZnNldCArPSBCSzsKICAgICAgICAgc3ViVGlsZSA8IHN1YlRpbGVzUGVyVGlsZSAmJiBzdWJUaWxlc1Byb2Nlc3NlZCA8IHN1YlRpbGVzVG9Qcm9jZXNzOwogICAgICAgICArK3N1YlRpbGUsICsrc3ViVGlsZXNQcm9jZXNzZWQsIHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLICYmIHN1YlRpbGVzUHJvY2Vzc2VkICsgMSA8IHN1YlRpbGVzVG9Qcm9jZXNzKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICAgICAgQV90bXBbaV1baW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPQogICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigKICAgICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgaSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBBX3RtcFtpXVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IHswfTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBCX3RtcFtpXVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9CiAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KAogICAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyBpKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgICAgIEJfdG1wW2ldW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gezB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBsb25nIGFbV0lURVJOXSwgYltXSVRFUk1dOwogICAgICBmbG9hdHg0IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwogICAgICBmbG9hdCBiX3NjYWxlID0gQl9zY2FsZVsoKHRpbGVPZmZzZXQgLSBCSykgLyBCTE9DS19ESU0pICogTV9zY2FsZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CgogICAgICBmb3IgKHVpbnQxNl90IEJLT2Zmc2V0ID0gMDsgQktPZmZzZXQgPCBCSzsgQktPZmZzZXQgKz0gTUZNQV9LKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBpbnQgcm93ID0gd2FycFJvd09mZnNldCArIHduICogTUZNQV9ESU0gKyB3YXJwWDsKICAgICAgICAgIGludCBjb2wgPSBCS09mZnNldCArIHdhcnBZICogODsKICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oJkFzW2N1cnJdW3Jvd11bY29sXSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgaW50IHJvdyA9IHdhcnBDb2xPZmZzZXQgKyB3bSAqIE1GTUFfRElNICsgd2FycFg7CiAgICAgICAgICBpbnQgY29sID0gQktPZmZzZXQgKyB3YXJwWSAqIDg7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KCZCc1tjdXJyXVtyb3ddW2NvbF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZmxvYXR4NCBhX3NjYWxlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXR4NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoKHRpbGVPZmZzZXQgLSBCSykgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiBNRk1BX0RJTSArCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcnBZICogNCldKTsKI3ByYWdtYSB1bnJvbGwKICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgZFt3bl1bd21dW2ldICs9IGNbd25dW3dtXVtpXSAqIGFfc2NhbGVbaV0gKiBiX3NjYWxlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLICYmIHN1YlRpbGVzUHJvY2Vzc2VkICsgMSA8IHN1YlRpbGVzVG9Qcm9jZXNzKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICB1aW50OHg0IHh0W1ZFQ1RPUl9TSVpFXTsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICAgICAgeHRbaV1bal0gPQogICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QoQV90bXBbal1baW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPj4gOCAqIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICAgIGludCByb3cgPSBpbm5lckNvbEEgKyBpOwogICAgICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0E7CiAgICAgICAgICAgICAgY29sID0gKGNvbCArIChyb3cgLyAzMikgKiA4KSAlIDEyODsKICAgICAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQXNbbmV4dF1bcm93XVtjb2xdKSA9IHh0W2ldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAgIHVpbnQ4eDQgeHRbVkVDVE9SX1NJWkVdOwoKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICAgICAgeHRbaV1bal0gPQogICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QoQl90bXBbal1baW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPj4gOCAqIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xCICsgaTsKICAgICAgICAgICAgICBpbnQgY29sID0gaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCOwogICAgICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQ4eDQgKj4oJkJzW25leHRdW3Jvd11bY29sXSkgPSB4dFtpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19zeW5jdGhyZWFkcygpOwoKICAgICAgY3VyciA9IDEgLSBjdXJyOwogICAgICBuZXh0ID0gMSAtIG5leHQ7CiAgICB9CgogICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgIGlmICgocm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIE1GTUFfRElNICsgd2FycFkgKiA0ICsgaSkgPAogICAgICAgICAgICAgICAgICBOICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiBNRk1BX0RJTSArIHdhcnBYKSA8IE0pIHsKICAgICAgICAgICAgYXRvbWljQWRkKCZDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogTUZNQV9ESU0gKwogICAgICAgICAgICAgICAgICAgICAgICAgIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogTUZNQV9ESU0gKyB3YXJwWCldLAogICAgICAgICAgICAgICAgICAgICAgZFt3bl1bd21dW2ldKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjb25zdCB1aW50MTZfdCBCTiwgY29uc3QgdWludDE2X3QgQkssIGNvbnN0IHVpbnQxNl90IEJNLAogICAgICAgICAgY29uc3QgdWludDE2X3QgV0lURVJOLCBjb25zdCB1aW50MTZfdCBXSVRFUk0sIGNvbnN0IHVpbnQxNl90IFNNX0NPVU5ULAogICAgICAgICAgY29uc3QgdWludDE2X3QgTUZNQV9ESU0sIGNvbnN0IHVpbnQxNl90IE1GTUFfSz4KX19nbG9iYWxfXyB2b2lkCmZwOF9tbV9rZXJuZWxfTihjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpBLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpCLAogICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKkFfc2NhbGUsIGNvbnN0IGZsb2F0ICpCX3NjYWxlLCBfX2hpcF9iZmxvYXQxNiAqQywKICAgICAgICAgICAgICAgIHVpbnQxNl90IE4sIHVpbnQxNl90IEssIHVpbnQxNl90IE0pIHsKICB1c2luZyB1aW50OHgxNiA9CiAgICAgIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNiAqIHNpemVvZih1aW50OF90KSkpKSB1aW50OF90OwogIHVzaW5nIHVpbnQ4eDQgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZih1aW50OF90KSkpKSB1aW50OF90OwogIHVzaW5nIGZsb2F0eDQgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CgogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgVkVDVE9SX1NJWkUgPSA0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgV0FSUFNJWkUgPSA2NDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IFdOID0gTUZNQV9ESU0gKiBXSVRFUk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBXTSA9IE1GTUFfRElNICogV0lURVJNOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgbnVtVGhyZWFkcyA9CiAgICAgIChCTiAqIEJNKSAvICgoTUZNQV9ESU0gKiBNRk1BX0RJTSAvIFdBUlBTSVpFKSAqIFdJVEVSTiAqIFdJVEVSTSk7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBzdHJpZGVBID0KICAgICAgKG51bVRocmVhZHMgLyAoQk4gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBzdHJpZGVCID0KICAgICAgKG51bVRocmVhZHMgLyAoQk0gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBuc3RyaWRlc0EgPSBCSyA+PSBzdHJpZGVBID8gY2RpdihCSywgc3RyaWRlQSkgOiAxOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgbnN0cmlkZXNCID0gQksgPj0gc3RyaWRlQiA/IGNkaXYoQkssIHN0cmlkZUIpIDogMTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQxNl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MTZfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MTZfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggJSBjZGl2KE4sIEJOKSkgKiBCTjsKICAgIHVpbnQxNl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAvIGNkaXYoTiwgQk4pKSAqIEJNOwogICAgdWludDE2X3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MTZfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQxNl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDE2X3QgaW5uZXJDb2xBID0gKHRocmVhZElkeC54ICUgKEJOIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDE2X3QgaW5uZXJSb3dBID0gKHRocmVhZElkeC54IC8gKEJOIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDE2X3QgaW5uZXJDb2xCID0gKHRocmVhZElkeC54ICUgKEJNIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDE2X3QgaW5uZXJSb3dCID0gKHRocmVhZElkeC54IC8gKEJNIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQxNl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDE2X3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MTZfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MTZfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MTZfdCB3YXJwWCA9IGxhbmVJZHggJSBNRk1BX0RJTTsKICAgIHVpbnQxNl90IHdhcnBZID0gbGFuZUlkeCAvIE1GTUFfRElNOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1syXVtCTl1bQktdLCBCc1syXVtCTV1bQktdOwogICAgaW50IGN1cnIgPSAwLCBuZXh0ID0gMTsKCiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICB1aW50OHg0IHhbVkVDVE9SX1NJWkVdLCB4dFtWRUNUT1JfU0laRV07CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICB4W2ldID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDh4NCAqPigKICAgICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgaSkgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICB4dFtpXVtqXSA9IHhbal1baV07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgaW50IHJvdyA9IGlubmVyQ29sQSArIGk7CiAgICAgICAgICBpbnQgY29sID0gaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBOwogICAgICAgICAgY29sID0gKGNvbCArIChyb3cgLyAzMikgKiA4KSAlIDEyODsKICAgICAgICAgIGNvbCA9IChjb2wgKyByb3cgKiA4KSAlIDEyODsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQ4eDQgKj4oJkFzW2N1cnJdW3Jvd11bY29sXSkgPSB4dFtpXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xBICsgaTsKICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0E7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQXNbY3Vycl1bcm93XVtjb2xdKSA9IHswfTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIHVpbnQ4eDQgeFtWRUNUT1JfU0laRV0sIHh0W1ZFQ1RPUl9TSVpFXTsKCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIHhbaV0gPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OHg0ICo+KAogICAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyBpKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIH0KCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIGZvciAodWludDE2X3QgaiA9IDA7IGogPCBWRUNUT1JfU0laRTsgKytqKSB7CiAgICAgICAgICAgIHh0W2ldW2pdID0geFtqXVtpXTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xCICsgaTsKICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0I7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQnNbY3Vycl1bcm93XVtjb2xdKSA9IHh0W2ldOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIGludCByb3cgPSBpbm5lckNvbEIgKyBpOwogICAgICAgICAgaW50IGNvbCA9IGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QjsKICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50OHg0ICo+KCZCc1tjdXJyXVtyb3ddW2NvbF0pID0gezB9OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICB1aW50MzJfdCBBX3RtcFtWRUNUT1JfU0laRV1bbnN0cmlkZXNBXTsKICAgIHVpbnQzMl90IEJfdG1wW1ZFQ1RPUl9TSVpFXVtuc3RyaWRlc0JdOwoKICAgIGZsb2F0eDQgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MTZfdCB0aWxlT2Zmc2V0ID0gQks7IHRpbGVPZmZzZXQgPCBLICsgQks7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICAgICAgQV90bXBbaV1baW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPQogICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigKICAgICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgaSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBBX3RtcFtpXVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IHswfTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBCX3RtcFtpXVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9CiAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KAogICAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyBpKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgICAgIEJfdG1wW2ldW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gezB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBsb25nIGFbV0lURVJOXSwgYltXSVRFUk1dOwogICAgICBmbG9hdHg0IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwogICAgICBmbG9hdCBiX3NjYWxlID0gQl9zY2FsZVsoKHRpbGVPZmZzZXQgLSBCSykgLyBCTE9DS19ESU0pICogTV9zY2FsZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CgogICAgICBmb3IgKHVpbnQxNl90IEJLT2Zmc2V0ID0gMDsgQktPZmZzZXQgPCBCSzsgQktPZmZzZXQgKz0gTUZNQV9LKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBpbnQgcm93ID0gd2FycFJvd09mZnNldCArIHduICogTUZNQV9ESU0gKyB3YXJwWDsKICAgICAgICAgIGludCBjb2wgPSBCS09mZnNldCArIHdhcnBZICogODsKICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oJkFzW2N1cnJdW3Jvd11bY29sXSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgaW50IHJvdyA9IHdhcnBDb2xPZmZzZXQgKyB3bSAqIE1GTUFfRElNICsgd2FycFg7CiAgICAgICAgICBpbnQgY29sID0gQktPZmZzZXQgKyB3YXJwWSAqIDg7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KCZCc1tjdXJyXVtyb3ddW2NvbF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZmxvYXR4NCBhX3NjYWxlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXR4NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoKHRpbGVPZmZzZXQgLSBCSykgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiBNRk1BX0RJTSArCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcnBZICogNCldKTsKI3ByYWdtYSB1bnJvbGwKICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgZFt3bl1bd21dW2ldICs9IGNbd25dW3dtXVtpXSAqIGFfc2NhbGVbaV0gKiBiX3NjYWxlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICB1aW50OHg0IHh0W1ZFQ1RPUl9TSVpFXTsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICAgICAgeHRbaV1bal0gPQogICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QoQV90bXBbal1baW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPj4gOCAqIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xBICsgaTsKICAgICAgICAgICAgICBpbnQgY29sID0gaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBOwogICAgICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwoKICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50OHg0ICo+KCZBc1tuZXh0XVtyb3ddW2NvbF0pID0geHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgdWludDh4NCB4dFtWRUNUT1JfU0laRV07CgogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgICAgIGZvciAodWludDE2X3QgaiA9IDA7IGogPCBWRUNUT1JfU0laRTsgKytqKSB7CiAgICAgICAgICAgICAgICB4dFtpXVtqXSA9CiAgICAgICAgICAgICAgICAgICAgdWludDhfdChCX3RtcFtqXVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA+PiA4ICogaSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgICAgIGludCByb3cgPSBpbm5lckNvbEIgKyBpOwogICAgICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0I7CiAgICAgICAgICAgICAgY29sID0gKGNvbCArIChyb3cgLyAzMikgKiA4KSAlIDEyODsKICAgICAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQnNbbmV4dF1bcm93XVtjb2xdKSA9IHh0W2ldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICBjdXJyID0gMSAtIGN1cnI7CiAgICAgIG5leHQgPSAxIC0gbmV4dDsKICAgIH0KCiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogTUZNQV9ESU0gKyB3YXJwWSAqIDQgKyBpKSA8CiAgICAgICAgICAgICAgICAgIE4gJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIE1GTUFfRElNICsgd2FycFgpIDwgTSkKICAgICAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIE1GTUFfRElNICsgd2FycFkgKiA0ICsgaSkgKiBNICsKICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIE1GTUFfRElNICsgd2FycFgpXSA9CiAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYpZFt3bl1bd21dW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICBpbnQgTiA9IEEuc2l6ZSgwKSwgSyA9IEEuc2l6ZSgxKSwgTSA9IEIuc2l6ZSgwKTsKCiAgc3RhdGljIGZsb2F0ICpDX2RhdGFwdHIgPSBOVUxMOwogIGlmICghQ19kYXRhcHRyKSB7CiAgICBoaXBNYWxsb2MoJkNfZGF0YXB0ciwgNjE0NCAqIDcxNjggKiBzaXplb2YoZmxvYXQpKTsKICB9CgogIGNvbnN0IHVpbnQzMl90IEJLID0gMTI4OwogIGNvbnN0IHVpbnQzMl90IEJOID0gMTI4OwogIGNvbnN0IHVpbnQzMl90IEJNID0gMTI4OwogIGNvbnN0IHVpbnQzMl90IFdJVEVSTiA9IDI7CiAgY29uc3QgdWludDMyX3QgV0lURVJNID0gMjsKICBjb25zdCB1aW50MzJfdCBTTV9DT1VOVCA9IDMwNDsKICBjb25zdCB1aW50MzJfdCBXQVJQU0laRSA9IDY0OwogIGNvbnN0IHVpbnQzMl90IE1GTUFfRElNID0gMTY7CiAgY29uc3QgdWludDMyX3QgTUZNQV9LID0gMzI7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvCiAgICAgICAgICAgICAgICAgICgoTUZNQV9ESU0gKiBNRk1BX0RJTSAvIFdBUlBTSVpFKSAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKFNNX0NPVU5UKTsKCiAgaWYgKEsgPj0gNzE2OCAmJiBOIDw9IDEwMjQgJiYgTSA8PSAxNTM2KSB7CiAgICBoaXBNZW1zZXQoQ19kYXRhcHRyLCAwLCBOICogTSAqIHNpemVvZihmbG9hdCkpOwogICAgYXQ6OlRlbnNvciBDZjMyID0gYXQ6OmZyb21fYmxvYigKICAgICAgICBDX2RhdGFwdHIsIHtOLCBNfSwKICAgICAgICBhdDo6VGVuc29yT3B0aW9ucygpLmRldmljZShhdDo6a0NVREEpLmR0eXBlKGF0OjprRmxvYXQpKTsKCiAgICBmcDhfbW1fa2VybmVsX3N0cmVhbWs8Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5ULCBNRk1BX0RJTSwKICAgICAgICAgICAgICAgICAgICAgICAgICBNRk1BX0s+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLAogICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLCBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIChmbG9hdCAqKUNmMzIuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgICByZXR1cm4gQ2YzMjsKICB9IGVsc2UgewogICAgZnA4X21tX2tlcm5lbF9OPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVCwgTUZNQV9ESU0sIE1GTUFfSz4KICAgICAgICA8PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXogKilBLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogICAgcmV0dXJuIEM7CiAgfQp9CiIiIgoKY3BwX3NyYyA9IHIiIiIKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpOwoiIiIKCmlmIHN5cy5zdGRvdXQgaXMgTm9uZToKICAgIHN5cy5zdGRvdXQgPSBvcGVuKCIvZGV2L3N0ZG91dCIsICJ3IikKaWYgc3lzLnN0ZGVyciBpcyBOb25lOgogICAgc3lzLnN0ZGVyciA9IG9wZW4oIi9kZXYvc3RkZXJyIiwgInciKQoKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDhfbW0iLAogICAgY3BwX3NvdXJjZXM9W2NwcF9zcmNdLAogICAgY3VkYV9zb3VyY2VzPVtjdWRhX3NyY10sCiAgICBmdW5jdGlvbnM9WyJmcDhfbW0iXSwKICAgIHZlcmJvc2U9VHJ1ZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsKICAgICAgICAiLU9mYXN0IiwKICAgICAgICAiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwKICAgICAgICAiLXN0ZD1jKysyMCIsCiAgICAgICAgIi1mZnAtY29udHJhY3Q9ZmFzdCIsCiAgICAgICAgIi1saGlwX2hjYyIsCiAgICAgICAgICItbWN1bW9kZSIsCiAgICBdLAopCgoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIHJldHVybiBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpCg==

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 18884.

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUKCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiCgpjdWRhX3NyYyA9IHIiIiIKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXyBpbnQgY2RpdihpbnQgYSwgaW50IGIpIHsKICByZXR1cm4gKGEgKyBiIC0gMSkgLyBiOwp9CgojZGVmaW5lIEJMT0NLX0RJTSAxMjgKCi8vIEdlbmVyaWMgZW51bSBmb3IgdGlsZSBpbmRleCBjYWxjdWxhdGlvbiBzdHJhdGVneQplbnVtIGNsYXNzIFRpbGVJbmRleGluZ1N0cmF0ZWd5IHsKICBNX01BSk9SLCAvLyB0aWxlSWR4IC8gY2RpdihNLCBCTSkgZ2l2ZXMgcm93LCB0aWxlSWR4ICUgY2RpdihNLCBCTSkgZ2l2ZXMgY29sCiAgTl9NQUpPUiAgLy8gdGlsZUlkeCAlIGNkaXYoTiwgQk4pIGdpdmVzIHJvdywgdGlsZUlkeCAvIGNkaXYoTiwgQk4pIGdpdmVzIGNvbAp9OwoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQsCiAgICAgICAgICBjb25zdCBUaWxlSW5kZXhpbmdTdHJhdGVneSBzdHJhdGVneT4KX19nbG9iYWxfXyB2b2lkCmZwOF9tbV9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgIHVpbnQzMl90IE4sIHVpbnQzMl90IEssIHVpbnQzMl90IE0pIHsKICB1c2luZyBmbG9hdHgxNiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNiAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CgogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVkVDVE9SX1NJWkUgPSA0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV0FSUFNJWkUgPSA2NDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdOID0gMzIgKiBXSVRFUk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTSA9IDMyICogV0lURVJNOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgbnVtVGhyZWFkcyA9IChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSk7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVBID0gKG51bVRocmVhZHMgLyBCTikgKiBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUIgPSAobnVtVGhyZWFkcyAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTiA9PSAwLCAiQk4gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJNID09IDAsICJCTSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChCSyA8PSAxMjggJiYgQk0gPD0gMTI4LCAiUmFuZ2UgYWJvdmUgMTI4IGlzIG5vdCBzdXBwb3J0ZWQiKTsKCiAgdWludDMyX3QgbnVtVGlsZXMgPSBjZGl2KE4sIEJOKSAqIGNkaXYoTSwgQk0pOwogIHVpbnQzMl90IHJvd09mZnNldEMsIGNvbE9mZnNldEM7CgogIGZvciAodWludDE2X3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgLy8gQ29tcHV0ZSB0aWxlIGluZGljZXMgZGlmZmVyZW50bHkgYmFzZWQgb24gc3RyYXRlZ3kKICAgIGlmIGNvbnN0ZXhwciAoc3RyYXRlZ3kgPT0gVGlsZUluZGV4aW5nU3RyYXRlZ3k6Ok1fTUFKT1IpIHsKICAgICAgcm93T2Zmc2V0QyA9ICh0aWxlSWR4IC8gY2RpdihNLCBCTSkpICogQk47CiAgICAgIGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgfSBlbHNlIHsgLy8gTl9NQUpPUgogICAgICByb3dPZmZzZXRDID0gKHRpbGVJZHggJSBjZGl2KE4sIEJOKSkgKiBCTjsKICAgICAgY29sT2Zmc2V0QyA9ICh0aWxlSWR4IC8gY2RpdihOLCBCTikpICogQk07CiAgICB9CiAgICAKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSAodGhyZWFkSWR4LnggLyBCTikgKiBWRUNUT1JfU0laRTsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSAodGhyZWFkSWR4LnggLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgICB1aW50MzJfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBJZHggPSB0aHJlYWRJZHgueCAvIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycENvbE9mZnNldCA9ICh3YXJwSWR4ICUgKEJNIC8gV00pKSAqIFdNOwogICAgdWludDMyX3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gV00pKSAqIFdOOwogICAgdWludDMyX3Qgd2FycFggPSBsYW5lSWR4ICUgMzI7CiAgICB1aW50MzJfdCB3YXJwWSA9IGxhbmVJZHggLyAzMjsKCiAgICAvLyBEb3VibGUtYnVmZmVyaW5nIHNldHVwIHdpdGggYXJyYXkgaW5kaWNlcwogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IEFzWzJdW0JOXVtCSyArIDRdLCBCc1syXVtCTV1bQksgKyA0XTsKICAgIF9fc2hhcmVkX18gZmxvYXQgV3NbMl1bQk4gKyAxXTsKCiAgICBpbnQgY3VyciA9IDAsIG5leHQgPSAxOwogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgLy8gSW5pdGlhbCBsb2FkOiBnbG9iYWwgbWVtb3J5IC0+IHNoYXJlZCBtZW1vcnkKICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEsgJiYgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgIHVpbnQ4X3QgeCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpICogTiArIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMikgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB3ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDMpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwoKICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAmQXNbY3Vycl1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IHBhY2s7CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAmQXNbY3Vycl1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IDAuMGY7CiAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbY3Vycl1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICB9CiAgICAKICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIHVpbnQ4X3QgeCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAxKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB3ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAmQnNbY3Vycl1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAmQnNbY3Vycl1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgIFdzW2N1cnJdW0JOXSA9IEJfc2NhbGVbKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgLy8gVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG5leHQgdGlsZQogICAgdWludDMyX3QgQV90ZW1wMVsyXSwgQV90ZW1wMlsyXSwgQV90ZW1wM1syXSwgQV90ZW1wNFsyXTsKICAgIHVpbnQzMl90IEJfdGVtcDFbMl0sIEJfdGVtcDJbMl0sIEJfdGVtcDNbMl0sIEJfdGVtcDRbMl07CiAgICBmbG9hdDQgQV9zY2FsZV90ZW1wOwogICAgZmxvYXQgQl9zY2FsZV90ZW1wOwogICAgCiAgICAvLyBNYWluIGNvbXB1dGF0aW9uIGxvb3Agd2l0aCBkb3VibGUgYnVmZmVyaW5nCiAgICBmb3IgKHVpbnQxNl90IHRpbGVPZmZzZXQgPSBCSzsgdGlsZU9mZnNldCA8IEsgKyBCSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBMb2FkIG5leHQgYmxvY2sgKGlmIHdpdGhpbiBib3VuZHMpCiAgICAgIGlmICh0aWxlT2Zmc2V0IDwgSykgewogICAgICAgIC8vIExvYWQgbmV4dCBBIHRpbGUKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBMb2FkIG5leHQgQSBzY2FsZQogICAgICAgIGlmICh0aHJlYWRJZHgueCA8IChCTiAvIFZFQ1RPUl9TSVpFKSkgewogICAgICAgICAgQV9zY2FsZV90ZW1wID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRSldKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gTG9hZCBuZXh0IEIgdGlsZQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIExvYWQgbmV4dCBCIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgICAgICBCX3NjYWxlX3RlbXAgPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGUgY3VycmVudCBibG9jawogICAgICBsb25nIGFbV0lURVJOXSwgYltXSVRFUk1dOwogICAgICBmbG9hdCBiX3NjYWxlID0gV3NbY3Vycl1bQk5dOwogICAgICBmbG9hdHgxNiBjW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKICAgICAgCiAgICAgIC8vIFByb2Nlc3MgQksgaW4gY2h1bmtzIG9mIDE2IChtYXRyaXggbXVsdGlwbGljYXRpb24gdXNpbmcgTUZNQSkKICAgICAgZm9yICh1aW50MTZfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgLy8gTG9hZCBBIG1hdHJpeCBlbGVtZW50cwogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgYVt3bl0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZBc1tjdXJyXVt3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBMb2FkIEIgbWF0cml4IGVsZW1lbnRzCiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBiW3dtXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkJzW2N1cnJdW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIE1hdHJpeCBtdWx0aXBseSB1c2luZyBBTUQgTUZNQSBpbnN0cnVjdGlvbgogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICAgIGNbd25dW3dtXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgICAgIGFbd25dLCBiW3dtXSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC8vIFNjYWxlIHJlc3VsdHMKICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqCiAgICAgICAgICAgICAgICAgIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFN0b3JlIGxvYWRlZCBkYXRhIHRvIHNoYXJlZCBtZW1vcnkgKGZvciBuZXh0IGl0ZXJhdGlvbikKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgLy8gU3RvcmUgQQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgICAgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTdG9yZSBBIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW25leHRdW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9IEFfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gU3RvcmUgQgogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQl90ZW1wM1tpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkJzW25leHRdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSBwYWNrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTdG9yZSBCIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgICAgICBXc1tuZXh0XVtCTl0gPSBCX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICAvLyBUb2dnbGUgYnVmZmVyIGluZGljZXMKICAgICAgY3VyciA9IDEgLSBjdXJyOwogICAgICBuZXh0ID0gMSAtIG5leHQ7CiAgICB9CgogICAgLy8gV3JpdGUgZmluYWwgcmVzdWx0cyB0byBnbG9iYWwgbWVtb3J5CiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICB1aW50MzJfdCBnbG9iYWxSb3cgPSByb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGk7CiAgICAgICAgICAgIHVpbnQzMl90IGdsb2JhbENvbCA9IGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYOwogICAgICAgICAgICBpZiAoZ2xvYmFsUm93IDwgTiAmJiBnbG9iYWxDb2wgPCBNKSB7CiAgICAgICAgICAgICAgQ1tnbG9iYWxSb3cgKiBNICsgZ2xvYmFsQ29sXSA9IChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICBpbnQgTiA9IEEuc2l6ZSgwKSwgSyA9IEEuc2l6ZSgxKSwgTSA9IEIuc2l6ZSgwKTsKCiAgY29uc3QgaW50IEJLID0gNjQ7CiAgY29uc3QgaW50IEJOID0gMTI4OwogIGNvbnN0IGludCBCTSA9IDEyODsKICBjb25zdCBpbnQgV0lURVJOID0gMTsKICBjb25zdCBpbnQgV0lURVJNID0gMTsKICBjb25zdCBpbnQgU01fQ09VTlQgPSAzMDQ7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKFNNX0NPVU5UKTsKICAKICAvLyBDaG9vc2Uga2VybmVsIGJhc2VkIG9uIG1hdHJpeCBkaW1lbnNpb25zCiAgaWYgKE4gPiBNKSB7CiAgICAgIGZwOF9tbV9rZXJuZWw8Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5ULCBUaWxlSW5kZXhpbmdTdHJhdGVneTo6Tl9NQUpPUj48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVCwgVGlsZUluZGV4aW5nU3RyYXRlZ3k6Ok1fTUFKT1I+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilBLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLAogICAgICAgICAgQV9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwgQl9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgICAgIChfX2hpcF9iZmxvYXQxNiAqKUMuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgfQogIHJldHVybiBDOwp9CiIiIgoKY3BwX3NyYyA9IHIiIiIKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpOwoiIiIKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bCiAgICAgICAgIi1PZmFzdCIsCiAgICAgICAgIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsCiAgICAgICAgIi1zdGQ9YysrMjAiLAogICAgICAgICItZmZwLWNvbnRyYWN0PWZhc3QiLAogICAgXSwKKQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQogICAgcmV0dXJuIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyk=
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDIiCgpjdWRhX3NyYyA9IHIiIiIKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXyBjb25zdGV4cHIgaW50IGNkaXYoaW50IGEsIGludCBiKSB7CiAgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQoKI2RlZmluZSBCTE9DS19ESU0gMTI4Cgp0ZW1wbGF0ZSA8Y29uc3QgdWludDE2X3QgQk4sIGNvbnN0IHVpbnQxNl90IEJLLCBjb25zdCB1aW50MTZfdCBCTSwKICAgICAgICAgIGNvbnN0IHVpbnQxNl90IFdJVEVSTiwgY29uc3QgdWludDE2X3QgV0lURVJNLCBjb25zdCB1aW50MTZfdCBTTV9DT1VOVCwKICAgICAgICAgIGNvbnN0IHVpbnQxNl90IE1GTUFfRElNLCBjb25zdCB1aW50MTZfdCBNRk1BX0s+Cl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fa2VybmVsX3N0cmVhbWsoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpCX3NjYWxlLCBmbG9hdCAqQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBOLCB1aW50MTZfdCBLLCB1aW50MTZfdCBNKSB7CiAgdXNpbmcgdWludDh4MTYgPQogICAgICBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YodWludDhfdCkpKSkgdWludDhfdDsKICB1c2luZyB1aW50OHg0ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YodWludDhfdCkpKSkgdWludDhfdDsKICB1c2luZyBmbG9hdHg0ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBXTiA9IE1GTUFfRElNICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgV00gPSBNRk1BX0RJTSAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IG51bVRocmVhZHMgPQogICAgICAoQk4gKiBCTSkgLyAoKE1GTUFfRElNICogTUZNQV9ESU0gLyBXQVJQU0laRSkgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qgc3RyaWRlQSA9CiAgICAgIChudW1UaHJlYWRzIC8gKEJOIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qgc3RyaWRlQiA9CiAgICAgIChudW1UaHJlYWRzIC8gKEJNIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgbnN0cmlkZXNBID0gQksgPj0gc3RyaWRlQSA/IGNkaXYoQkssIHN0cmlkZUEpIDogMTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IG5zdHJpZGVzQiA9IEJLID49IHN0cmlkZUIgPyBjZGl2KEJLLCBzdHJpZGVCKSA6IDE7CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MzJfdCBudW1UaWxlcyA9IGNkaXYoTiwgQk4pICogY2RpdihNLCBCTSk7CiAgdWludDE2X3Qgc3ViVGlsZXNQZXJUaWxlID0gY2RpdihLLCBCSyk7CiAgdWludDMyX3QgdG90YWxTdWJUaWxlcyA9IG51bVRpbGVzICogc3ViVGlsZXNQZXJUaWxlOwogIHVpbnQxNl90IHN1YlRpbGVzVG9Qcm9jZXNzID0gY2Rpdih0b3RhbFN1YlRpbGVzLCBTTV9DT1VOVCk7CiAgdWludDMyX3Qgc3RhcnRTdWJUaWxlSWR4ID0gc3ViVGlsZXNUb1Byb2Nlc3MgKiBibG9ja0lkeC54OwogIHVpbnQzMl90IHN0YXJ0VGlsZUlkeCA9IHN0YXJ0U3ViVGlsZUlkeCAvIHN1YlRpbGVzUGVyVGlsZTsKICB1aW50MzJfdCBzdWJUaWxlID0gc3RhcnRTdWJUaWxlSWR4OwoKICBmb3IgKHVpbnQxNl90IHRpbGVJZHggPSBzdGFydFRpbGVJZHgsIHN1YlRpbGVzUHJvY2Vzc2VkID0gMDsKICAgICAgIHRpbGVJZHggPCBudW1UaWxlcyAmJiBzdWJUaWxlc1Byb2Nlc3NlZCA8IHN1YlRpbGVzVG9Qcm9jZXNzOyArK3RpbGVJZHgpIHsKICAgIHVpbnQxNl90IHJvd09mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTiwgQk4pKSAqIEJOOwogICAgdWludDE2X3QgY29sT2Zmc2V0QyA9ICh0aWxlSWR4IC8gY2RpdihOLCBCTikpICogQk07CiAgICB1aW50MTZfdCBjb2xPZmZzZXRBID0gcm93T2Zmc2V0QzsKICAgIHVpbnQxNl90IGNvbE9mZnNldEIgPSBjb2xPZmZzZXRDOwogICAgdWludDE2X3QgTV9zY2FsZSA9IGNkaXYoTSwgQkxPQ0tfRElNKTsKCiAgICB1aW50MTZfdCBpbm5lckNvbEEgPSAodGhyZWFkSWR4LnggJSAoQk4gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgICB1aW50MTZfdCBpbm5lclJvd0EgPSAodGhyZWFkSWR4LnggLyAoQk4gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgICB1aW50MTZfdCBpbm5lckNvbEIgPSAodGhyZWFkSWR4LnggJSAoQk0gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgICB1aW50MTZfdCBpbm5lclJvd0IgPSAodGhyZWFkSWR4LnggLyAoQk0gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CgogICAgdWludDE2X3QgbGFuZUlkeCA9IHRocmVhZElkeC54ICUgV0FSUFNJWkU7CiAgICB1aW50MTZfdCB3YXJwSWR4ID0gdGhyZWFkSWR4LnggLyBXQVJQU0laRTsKICAgIHVpbnQxNl90IHdhcnBDb2xPZmZzZXQgPSAod2FycElkeCAlIChCTSAvIFdNKSkgKiBXTTsKICAgIHVpbnQxNl90IHdhcnBSb3dPZmZzZXQgPSAod2FycElkeCAvIChCTSAvIFdNKSkgKiBXTjsKICAgIHVpbnQxNl90IHdhcnBYID0gbGFuZUlkeCAlIE1GTUFfRElNOwogICAgdWludDE2X3Qgd2FycFkgPSBsYW5lSWR4IC8gTUZNQV9ESU07CgogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IEFzWzJdW0JOXVtCS10sIEJzWzJdW0JNXVtCS107CiAgICBpbnQgY3VyciA9IDAsIG5leHQgPSAxOwoKICAgIHN1YlRpbGUgPSBzdWJUaWxlICUgc3ViVGlsZXNQZXJUaWxlOwogICAgdWludDE2X3QgdGlsZU9mZnNldCA9IHN1YlRpbGUgKiBCSzsKCiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJiAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgdWludDh4NCB4W1ZFQ1RPUl9TSVpFXSwgeHRbVkVDVE9SX1NJWkVdOwoKICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgeFtpXSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4eDQgKj4oCiAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyBpKSAqIE4gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIH0KCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIGZvciAodWludDE2X3QgaiA9IDA7IGogPCBWRUNUT1JfU0laRTsgKytqKSB7CiAgICAgICAgICAgIHh0W2ldW2pdID0geFtqXVtpXTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xBICsgaTsKICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0E7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQXNbY3Vycl1bcm93XVtjb2xdKSA9IHh0W2ldOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIGludCByb3cgPSBpbm5lckNvbEEgKyBpOwogICAgICAgICAgaW50IGNvbCA9IGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QTsKICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50OHg0ICo+KCZBc1tjdXJyXVtyb3ddW2NvbF0pID0gezB9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEIgPSAwOyBpbm5lclJvd09mZnNldEIgPCBCSzsKICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKSA8IE0gJiYgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIHVpbnQ4eDQgeFtWRUNUT1JfU0laRV0sIHh0W1ZFQ1RPUl9TSVpFXTsKCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIHhbaV0gPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OHg0ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgaSkgKiBNICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICB4dFtpXVtqXSA9IHhbal1baV07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgaW50IHJvdyA9IGlubmVyQ29sQiArIGk7CiAgICAgICAgICBpbnQgY29sID0gaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCOwogICAgICAgICAgY29sID0gKGNvbCArIChyb3cgLyAzMikgKiA4KSAlIDEyODsKICAgICAgICAgIGNvbCA9IChjb2wgKyByb3cgKiA4KSAlIDEyODsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQ4eDQgKj4oJkJzW2N1cnJdW3Jvd11bY29sXSkgPSB4dFtpXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xCICsgaTsKICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0I7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQnNbY3Vycl1bcm93XVtjb2xdKSA9IHswfTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgdWludDMyX3QgQV90bXBbVkVDVE9SX1NJWkVdW25zdHJpZGVzQV07CiAgICB1aW50MzJfdCBCX3RtcFtWRUNUT1JfU0laRV1bbnN0cmlkZXNCXTsKCiAgICBmbG9hdHg0IGRbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgIGZvciAodGlsZU9mZnNldCArPSBCSzsKICAgICAgICAgc3ViVGlsZSA8IHN1YlRpbGVzUGVyVGlsZSAmJiBzdWJUaWxlc1Byb2Nlc3NlZCA8IHN1YlRpbGVzVG9Qcm9jZXNzOwogICAgICAgICArK3N1YlRpbGUsICsrc3ViVGlsZXNQcm9jZXNzZWQsIHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLICYmIHN1YlRpbGVzUHJvY2Vzc2VkICsgMSA8IHN1YlRpbGVzVG9Qcm9jZXNzKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICAgICAgQV90bXBbaV1baW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPQogICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigKICAgICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgaSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBBX3RtcFtpXVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IHswfTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBCX3RtcFtpXVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9CiAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KAogICAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyBpKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgICAgIEJfdG1wW2ldW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gezB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBsb25nIGFbV0lURVJOXSwgYltXSVRFUk1dOwogICAgICBmbG9hdHg0IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwogICAgICBmbG9hdCBiX3NjYWxlID0gQl9zY2FsZVsoKHRpbGVPZmZzZXQgLSBCSykgLyBCTE9DS19ESU0pICogTV9zY2FsZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CgogICAgICBmb3IgKHVpbnQxNl90IEJLT2Zmc2V0ID0gMDsgQktPZmZzZXQgPCBCSzsgQktPZmZzZXQgKz0gTUZNQV9LKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBpbnQgcm93ID0gd2FycFJvd09mZnNldCArIHduICogTUZNQV9ESU0gKyB3YXJwWDsKICAgICAgICAgIGludCBjb2wgPSBCS09mZnNldCArIHdhcnBZICogODsKICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oJkFzW2N1cnJdW3Jvd11bY29sXSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgaW50IHJvdyA9IHdhcnBDb2xPZmZzZXQgKyB3bSAqIE1GTUFfRElNICsgd2FycFg7CiAgICAgICAgICBpbnQgY29sID0gQktPZmZzZXQgKyB3YXJwWSAqIDg7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KCZCc1tjdXJyXVtyb3ddW2NvbF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZmxvYXR4NCBhX3NjYWxlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXR4NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoKHRpbGVPZmZzZXQgLSBCSykgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiBNRk1BX0RJTSArCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcnBZICogNCldKTsKI3ByYWdtYSB1bnJvbGwKICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgZFt3bl1bd21dW2ldICs9IGNbd25dW3dtXVtpXSAqIGFfc2NhbGVbaV0gKiBiX3NjYWxlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLICYmIHN1YlRpbGVzUHJvY2Vzc2VkICsgMSA8IHN1YlRpbGVzVG9Qcm9jZXNzKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICB1aW50OHg0IHh0W1ZFQ1RPUl9TSVpFXTsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICAgICAgeHRbaV1bal0gPQogICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QoQV90bXBbal1baW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPj4gOCAqIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICAgIGludCByb3cgPSBpbm5lckNvbEEgKyBpOwogICAgICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0E7CiAgICAgICAgICAgICAgY29sID0gKGNvbCArIChyb3cgLyAzMikgKiA4KSAlIDEyODsKICAgICAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQXNbbmV4dF1bcm93XVtjb2xdKSA9IHh0W2ldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAgIHVpbnQ4eDQgeHRbVkVDVE9SX1NJWkVdOwoKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICAgICAgeHRbaV1bal0gPQogICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QoQl90bXBbal1baW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPj4gOCAqIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xCICsgaTsKICAgICAgICAgICAgICBpbnQgY29sID0gaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCOwogICAgICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQ4eDQgKj4oJkJzW25leHRdW3Jvd11bY29sXSkgPSB4dFtpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19zeW5jdGhyZWFkcygpOwoKICAgICAgY3VyciA9IDEgLSBjdXJyOwogICAgICBuZXh0ID0gMSAtIG5leHQ7CiAgICB9CgogICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgIGlmICgocm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIE1GTUFfRElNICsgd2FycFkgKiA0ICsgaSkgPAogICAgICAgICAgICAgICAgICBOICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiBNRk1BX0RJTSArIHdhcnBYKSA8IE0pIHsKICAgICAgICAgICAgYXRvbWljQWRkKCZDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogTUZNQV9ESU0gKwogICAgICAgICAgICAgICAgICAgICAgICAgIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogTUZNQV9ESU0gKyB3YXJwWCldLAogICAgICAgICAgICAgICAgICAgICAgZFt3bl1bd21dW2ldKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjb25zdCB1aW50MTZfdCBCTiwgY29uc3QgdWludDE2X3QgQkssIGNvbnN0IHVpbnQxNl90IEJNLAogICAgICAgICAgY29uc3QgdWludDE2X3QgV0lURVJOLCBjb25zdCB1aW50MTZfdCBXSVRFUk0sIGNvbnN0IHVpbnQxNl90IFNNX0NPVU5ULAogICAgICAgICAgY29uc3QgdWludDE2X3QgTUZNQV9ESU0sIGNvbnN0IHVpbnQxNl90IE1GTUFfSz4KX19nbG9iYWxfXyB2b2lkCmZwOF9tbV9rZXJuZWxfTihjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpBLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpCLAogICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKkFfc2NhbGUsIGNvbnN0IGZsb2F0ICpCX3NjYWxlLCBfX2hpcF9iZmxvYXQxNiAqQywKICAgICAgICAgICAgICAgIHVpbnQxNl90IE4sIHVpbnQxNl90IEssIHVpbnQxNl90IE0pIHsKICB1c2luZyB1aW50OHgxNiA9CiAgICAgIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNiAqIHNpemVvZih1aW50OF90KSkpKSB1aW50OF90OwogIHVzaW5nIHVpbnQ4eDQgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZih1aW50OF90KSkpKSB1aW50OF90OwogIHVzaW5nIGZsb2F0eDQgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CgogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgVkVDVE9SX1NJWkUgPSA0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgV0FSUFNJWkUgPSA2NDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IFdOID0gTUZNQV9ESU0gKiBXSVRFUk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBXTSA9IE1GTUFfRElNICogV0lURVJNOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgbnVtVGhyZWFkcyA9CiAgICAgIChCTiAqIEJNKSAvICgoTUZNQV9ESU0gKiBNRk1BX0RJTSAvIFdBUlBTSVpFKSAqIFdJVEVSTiAqIFdJVEVSTSk7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBzdHJpZGVBID0KICAgICAgKG51bVRocmVhZHMgLyAoQk4gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBzdHJpZGVCID0KICAgICAgKG51bVRocmVhZHMgLyAoQk0gLyBWRUNUT1JfU0laRSkpICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBuc3RyaWRlc0EgPSBCSyA+PSBzdHJpZGVBID8gY2RpdihCSywgc3RyaWRlQSkgOiAxOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgbnN0cmlkZXNCID0gQksgPj0gc3RyaWRlQiA/IGNkaXYoQkssIHN0cmlkZUIpIDogMTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQxNl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MTZfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MTZfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggJSBjZGl2KE4sIEJOKSkgKiBCTjsKICAgIHVpbnQxNl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAvIGNkaXYoTiwgQk4pKSAqIEJNOwogICAgdWludDE2X3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MTZfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQxNl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDE2X3QgaW5uZXJDb2xBID0gKHRocmVhZElkeC54ICUgKEJOIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDE2X3QgaW5uZXJSb3dBID0gKHRocmVhZElkeC54IC8gKEJOIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDE2X3QgaW5uZXJDb2xCID0gKHRocmVhZElkeC54ICUgKEJNIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDE2X3QgaW5uZXJSb3dCID0gKHRocmVhZElkeC54IC8gKEJNIC8gVkVDVE9SX1NJWkUpKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQxNl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDE2X3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MTZfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MTZfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MTZfdCB3YXJwWCA9IGxhbmVJZHggJSBNRk1BX0RJTTsKICAgIHVpbnQxNl90IHdhcnBZID0gbGFuZUlkeCAvIE1GTUFfRElNOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1syXVtCTl1bQktdLCBCc1syXVtCTV1bQktdOwogICAgaW50IGN1cnIgPSAwLCBuZXh0ID0gMTsKCiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICB1aW50OHg0IHhbVkVDVE9SX1NJWkVdLCB4dFtWRUNUT1JfU0laRV07CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICB4W2ldID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDh4NCAqPigKICAgICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgaSkgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICB4dFtpXVtqXSA9IHhbal1baV07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgaW50IHJvdyA9IGlubmVyQ29sQSArIGk7CiAgICAgICAgICBpbnQgY29sID0gaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBOwogICAgICAgICAgY29sID0gKGNvbCArIChyb3cgLyAzMikgKiA4KSAlIDEyODsKICAgICAgICAgIGNvbCA9IChjb2wgKyByb3cgKiA4KSAlIDEyODsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQ4eDQgKj4oJkFzW2N1cnJdW3Jvd11bY29sXSkgPSB4dFtpXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xBICsgaTsKICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0E7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQXNbY3Vycl1bcm93XVtjb2xdKSA9IHswfTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIHVpbnQ4eDQgeFtWRUNUT1JfU0laRV0sIHh0W1ZFQ1RPUl9TSVpFXTsKCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIHhbaV0gPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OHg0ICo+KAogICAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyBpKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIH0KCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIGZvciAodWludDE2X3QgaiA9IDA7IGogPCBWRUNUT1JfU0laRTsgKytqKSB7CiAgICAgICAgICAgIHh0W2ldW2pdID0geFtqXVtpXTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xCICsgaTsKICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0I7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQnNbY3Vycl1bcm93XVtjb2xdKSA9IHh0W2ldOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgIGludCByb3cgPSBpbm5lckNvbEIgKyBpOwogICAgICAgICAgaW50IGNvbCA9IGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QjsKICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50OHg0ICo+KCZCc1tjdXJyXVtyb3ddW2NvbF0pID0gezB9OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICB1aW50MzJfdCBBX3RtcFtWRUNUT1JfU0laRV1bbnN0cmlkZXNBXTsKICAgIHVpbnQzMl90IEJfdG1wW1ZFQ1RPUl9TSVpFXVtuc3RyaWRlc0JdOwoKICAgIGZsb2F0eDQgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MTZfdCB0aWxlT2Zmc2V0ID0gQks7IHRpbGVPZmZzZXQgPCBLICsgQks7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgKytpKSB7CiAgICAgICAgICAgICAgQV90bXBbaV1baW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPQogICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigKICAgICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgaSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBBX3RtcFtpXVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IHswfTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBCX3RtcFtpXVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9CiAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KAogICAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyBpKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgICAgIEJfdG1wW2ldW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gezB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBsb25nIGFbV0lURVJOXSwgYltXSVRFUk1dOwogICAgICBmbG9hdHg0IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwogICAgICBmbG9hdCBiX3NjYWxlID0gQl9zY2FsZVsoKHRpbGVPZmZzZXQgLSBCSykgLyBCTE9DS19ESU0pICogTV9zY2FsZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CgogICAgICBmb3IgKHVpbnQxNl90IEJLT2Zmc2V0ID0gMDsgQktPZmZzZXQgPCBCSzsgQktPZmZzZXQgKz0gTUZNQV9LKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBpbnQgcm93ID0gd2FycFJvd09mZnNldCArIHduICogTUZNQV9ESU0gKyB3YXJwWDsKICAgICAgICAgIGludCBjb2wgPSBCS09mZnNldCArIHdhcnBZICogODsKICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oJkFzW2N1cnJdW3Jvd11bY29sXSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgaW50IHJvdyA9IHdhcnBDb2xPZmZzZXQgKyB3bSAqIE1GTUFfRElNICsgd2FycFg7CiAgICAgICAgICBpbnQgY29sID0gQktPZmZzZXQgKyB3YXJwWSAqIDg7CiAgICAgICAgICBjb2wgPSAoY29sICsgKHJvdyAvIDMyKSAqIDgpICUgMTI4OwogICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KCZCc1tjdXJyXVtyb3ddW2NvbF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZmxvYXR4NCBhX3NjYWxlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXR4NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoKHRpbGVPZmZzZXQgLSBCSykgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiBNRk1BX0RJTSArCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcnBZICogNCldKTsKI3ByYWdtYSB1bnJvbGwKICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgZFt3bl1bd21dW2ldICs9IGNbd25dW3dtXVtpXSAqIGFfc2NhbGVbaV0gKiBiX3NjYWxlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICB1aW50OHg0IHh0W1ZFQ1RPUl9TSVpFXTsKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgVkVDVE9SX1NJWkU7ICsraikgewogICAgICAgICAgICAgICAgeHRbaV1bal0gPQogICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QoQV90bXBbal1baW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPj4gOCAqIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IFZFQ1RPUl9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICBpbnQgcm93ID0gaW5uZXJDb2xBICsgaTsKICAgICAgICAgICAgICBpbnQgY29sID0gaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBOwogICAgICAgICAgICAgIGNvbCA9IChjb2wgKyAocm93IC8gMzIpICogOCkgJSAxMjg7CiAgICAgICAgICAgICAgY29sID0gKGNvbCArIHJvdyAqIDgpICUgMTI4OwoKICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50OHg0ICo+KCZBc1tuZXh0XVtyb3ddW2NvbF0pID0geHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgdWludDh4NCB4dFtWRUNUT1JfU0laRV07CgogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgICAgIGZvciAodWludDE2X3QgaiA9IDA7IGogPCBWRUNUT1JfU0laRTsgKytqKSB7CiAgICAgICAgICAgICAgICB4dFtpXVtqXSA9CiAgICAgICAgICAgICAgICAgICAgdWludDhfdChCX3RtcFtqXVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA+PiA4ICogaSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgVkVDVE9SX1NJWkU7ICsraSkgewogICAgICAgICAgICAgIGludCByb3cgPSBpbm5lckNvbEIgKyBpOwogICAgICAgICAgICAgIGludCBjb2wgPSBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0I7CiAgICAgICAgICAgICAgY29sID0gKGNvbCArIChyb3cgLyAzMikgKiA4KSAlIDEyODsKICAgICAgICAgICAgICBjb2wgPSAoY29sICsgcm93ICogOCkgJSAxMjg7CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDh4NCAqPigmQnNbbmV4dF1bcm93XVtjb2xdKSA9IHh0W2ldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICBjdXJyID0gMSAtIGN1cnI7CiAgICAgIG5leHQgPSAxIC0gbmV4dDsKICAgIH0KCiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogTUZNQV9ESU0gKyB3YXJwWSAqIDQgKyBpKSA8CiAgICAgICAgICAgICAgICAgIE4gJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIE1GTUFfRElNICsgd2FycFgpIDwgTSkKICAgICAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIE1GTUFfRElNICsgd2FycFkgKiA0ICsgaSkgKiBNICsKICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIE1GTUFfRElNICsgd2FycFgpXSA9CiAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYpZFt3bl1bd21dW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICBpbnQgTiA9IEEuc2l6ZSgwKSwgSyA9IEEuc2l6ZSgxKSwgTSA9IEIuc2l6ZSgwKTsKCiAgc3RhdGljIGZsb2F0ICpDX2RhdGFwdHIgPSBOVUxMOwogIGlmICghQ19kYXRhcHRyKSB7CiAgICBoaXBNYWxsb2MoJkNfZGF0YXB0ciwgNjE0NCAqIDcxNjggKiBzaXplb2YoZmxvYXQpKTsKICB9CgogIGNvbnN0IHVpbnQzMl90IEJLID0gMTI4OwogIGNvbnN0IHVpbnQzMl90IEJOID0gMTI4OwogIGNvbnN0IHVpbnQzMl90IEJNID0gMTI4OwogIGNvbnN0IHVpbnQzMl90IFdJVEVSTiA9IDI7CiAgY29uc3QgdWludDMyX3QgV0lURVJNID0gMjsKICBjb25zdCB1aW50MzJfdCBTTV9DT1VOVCA9IDMwNDsKICBjb25zdCB1aW50MzJfdCBXQVJQU0laRSA9IDY0OwogIGNvbnN0IHVpbnQzMl90IE1GTUFfRElNID0gMTY7CiAgY29uc3QgdWludDMyX3QgTUZNQV9LID0gMzI7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvCiAgICAgICAgICAgICAgICAgICgoTUZNQV9ESU0gKiBNRk1BX0RJTSAvIFdBUlBTSVpFKSAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKFNNX0NPVU5UKTsKCiAgaWYgKEsgPj0gNzE2OCAmJiBOIDw9IDEwMjQgJiYgTSA8PSAxNTM2KSB7CiAgICBoaXBNZW1zZXQoQ19kYXRhcHRyLCAwLCBOICogTSAqIHNpemVvZihmbG9hdCkpOwogICAgYXQ6OlRlbnNvciBDZjMyID0gYXQ6OmZyb21fYmxvYigKICAgICAgICBDX2RhdGFwdHIsIHtOLCBNfSwKICAgICAgICBhdDo6VGVuc29yT3B0aW9ucygpLmRldmljZShhdDo6a0NVREEpLmR0eXBlKGF0OjprRmxvYXQpKTsKCiAgICBmcDhfbW1fa2VybmVsX3N0cmVhbWs8Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5ULCBNRk1BX0RJTSwKICAgICAgICAgICAgICAgICAgICAgICAgICBNRk1BX0s+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLAogICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLCBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIChmbG9hdCAqKUNmMzIuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgICByZXR1cm4gQ2YzMjsKICB9IGVsc2UgewogICAgZnA4X21tX2tlcm5lbF9OPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVCwgTUZNQV9ESU0sIE1GTUFfSz4KICAgICAgICA8PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oKF9faGlwX2ZwOF9lNG0zX2ZudXogKilBLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogICAgcmV0dXJuIEM7CiAgfQp9CiIiIgoKY3BwX3NyYyA9IHIiIiIKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpOwoiIiIKCmlmIHN5cy5zdGRvdXQgaXMgTm9uZToKICAgIHN5cy5zdGRvdXQgPSBvcGVuKCIvZGV2L3N0ZG91dCIsICJ3IikKaWYgc3lzLnN0ZGVyciBpcyBOb25lOgogICAgc3lzLnN0ZGVyciA9IG9wZW4oIi9kZXYvc3RkZXJyIiwgInciKQoKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDhfbW0iLAogICAgY3BwX3NvdXJjZXM9W2NwcF9zcmNdLAogICAgY3VkYV9zb3VyY2VzPVtjdWRhX3NyY10sCiAgICBmdW5jdGlvbnM9WyJmcDhfbW0iXSwKICAgIHZlcmJvc2U9VHJ1ZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsKICAgICAgICAiLU9mYXN0IiwKICAgICAgICAiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwKICAgICAgICAiLXN0ZD1jKysyMCIsCiAgICAgICAgIi1mZnAtY29udHJhY3Q9ZmFzdCIsCiAgICAgICAgIi1saGlwX2hjYyIsCiAgICAgICAgICItbWN1bW9kZSIsCiAgICBdLAopCgoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIHJldHVybiBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpCg==
No newline at end of file

Best evidence level for this revision: reported

JSON