submission 18884
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-18884?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, 7168] · n=512 · seed=6563
AMD Instinct MI300X
157.6µs
#64 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
157.9µs
#62 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
161.7µs
#47 of 98
2025-05-09
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
174.7µs
#35 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
191.1µs
#37 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
210.5µs
#36 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
390.5µs
#47 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
1.18ms
#52 of 98
2025-05-09
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:19822d6a4b07930c4ade61feeae8882229218c598990d99284a0d16988e8ebd5
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
Submission.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUKCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiCgpjdWRhX3NyYyA9IHIiIiIKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXyBpbnQgY2RpdihpbnQgYSwgaW50IGIpIHsKICByZXR1cm4gKGEgKyBiIC0gMSkgLyBiOwp9CgojZGVmaW5lIEJMT0NLX0RJTSAxMjgKCi8vIEdlbmVyaWMgZW51bSBmb3IgdGlsZSBpbmRleCBjYWxjdWxhdGlvbiBzdHJhdGVneQplbnVtIGNsYXNzIFRpbGVJbmRleGluZ1N0cmF0ZWd5IHsKICBNX01BSk9SLCAvLyB0aWxlSWR4IC8gY2RpdihNLCBCTSkgZ2l2ZXMgcm93LCB0aWxlSWR4ICUgY2RpdihNLCBCTSkgZ2l2ZXMgY29sCiAgTl9NQUpPUiAgLy8gdGlsZUlkeCAlIGNkaXYoTiwgQk4pIGdpdmVzIHJvdywgdGlsZUlkeCAvIGNkaXYoTiwgQk4pIGdpdmVzIGNvbAp9OwoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQsCiAgICAgICAgICBjb25zdCBUaWxlSW5kZXhpbmdTdHJhdGVneSBzdHJhdGVneT4KX19nbG9iYWxfXyB2b2lkCmZwOF9tbV9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgIHVpbnQzMl90IE4sIHVpbnQzMl90IEssIHVpbnQzMl90IE0pIHsKICB1c2luZyBmbG9hdHgxNiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNiAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CgogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVkVDVE9SX1NJWkUgPSA0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV0FSUFNJWkUgPSA2NDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdOID0gMzIgKiBXSVRFUk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTSA9IDMyICogV0lURVJNOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgbnVtVGhyZWFkcyA9IChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSk7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVBID0gKG51bVRocmVhZHMgLyBCTikgKiBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUIgPSAobnVtVGhyZWFkcyAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTiA9PSAwLCAiQk4gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJNID09IDAsICJCTSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChCSyA8PSAxMjggJiYgQk0gPD0gMTI4LCAiUmFuZ2UgYWJvdmUgMTI4IGlzIG5vdCBzdXBwb3J0ZWQiKTsKCiAgdWludDMyX3QgbnVtVGlsZXMgPSBjZGl2KE4sIEJOKSAqIGNkaXYoTSwgQk0pOwogIHVpbnQzMl90IHJvd09mZnNldEMsIGNvbE9mZnNldEM7CgogIGZvciAodWludDE2X3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgLy8gQ29tcHV0ZSB0aWxlIGluZGljZXMgZGlmZmVyZW50bHkgYmFzZWQgb24gc3RyYXRlZ3kKICAgIGlmIGNvbnN0ZXhwciAoc3RyYXRlZ3kgPT0gVGlsZUluZGV4aW5nU3RyYXRlZ3k6Ok1fTUFKT1IpIHsKICAgICAgcm93T2Zmc2V0QyA9ICh0aWxlSWR4IC8gY2RpdihNLCBCTSkpICogQk47CiAgICAgIGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgfSBlbHNlIHsgLy8gTl9NQUpPUgogICAgICByb3dPZmZzZXRDID0gKHRpbGVJZHggJSBjZGl2KE4sIEJOKSkgKiBCTjsKICAgICAgY29sT2Zmc2V0QyA9ICh0aWxlSWR4IC8gY2RpdihOLCBCTikpICogQk07CiAgICB9CiAgICAKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSAodGhyZWFkSWR4LnggLyBCTikgKiBWRUNUT1JfU0laRTsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSAodGhyZWFkSWR4LnggLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgICB1aW50MzJfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBJZHggPSB0aHJlYWRJZHgueCAvIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycENvbE9mZnNldCA9ICh3YXJwSWR4ICUgKEJNIC8gV00pKSAqIFdNOwogICAgdWludDMyX3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gV00pKSAqIFdOOwogICAgdWludDMyX3Qgd2FycFggPSBsYW5lSWR4ICUgMzI7CiAgICB1aW50MzJfdCB3YXJwWSA9IGxhbmVJZHggLyAzMjsKCiAgICAvLyBEb3VibGUtYnVmZmVyaW5nIHNldHVwIHdpdGggYXJyYXkgaW5kaWNlcwogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IEFzWzJdW0JOXVtCSyArIDRdLCBCc1syXVtCTV1bQksgKyA0XTsKICAgIF9fc2hhcmVkX18gZmxvYXQgV3NbMl1bQk4gKyAxXTsKCiAgICBpbnQgY3VyciA9IDAsIG5leHQgPSAxOwogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgLy8gSW5pdGlhbCBsb2FkOiBnbG9iYWwgbWVtb3J5IC0+IHNoYXJlZCBtZW1vcnkKICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEsgJiYgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgIHVpbnQ4X3QgeCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpICogTiArIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMikgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB3ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDMpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwoKICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAmQXNbY3Vycl1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IHBhY2s7CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAmQXNbY3Vycl1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IDAuMGY7CiAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbY3Vycl1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICB9CiAgICAKICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIHVpbnQ4X3QgeCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAxKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB3ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAmQnNbY3Vycl1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAmQnNbY3Vycl1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgIFdzW2N1cnJdW0JOXSA9IEJfc2NhbGVbKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgLy8gVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG5leHQgdGlsZQogICAgdWludDMyX3QgQV90ZW1wMVsyXSwgQV90ZW1wMlsyXSwgQV90ZW1wM1syXSwgQV90ZW1wNFsyXTsKICAgIHVpbnQzMl90IEJfdGVtcDFbMl0sIEJfdGVtcDJbMl0sIEJfdGVtcDNbMl0sIEJfdGVtcDRbMl07CiAgICBmbG9hdDQgQV9zY2FsZV90ZW1wOwogICAgZmxvYXQgQl9zY2FsZV90ZW1wOwogICAgCiAgICAvLyBNYWluIGNvbXB1dGF0aW9uIGxvb3Agd2l0aCBkb3VibGUgYnVmZmVyaW5nCiAgICBmb3IgKHVpbnQxNl90IHRpbGVPZmZzZXQgPSBCSzsgdGlsZU9mZnNldCA8IEsgKyBCSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBMb2FkIG5leHQgYmxvY2sgKGlmIHdpdGhpbiBib3VuZHMpCiAgICAgIGlmICh0aWxlT2Zmc2V0IDwgSykgewogICAgICAgIC8vIExvYWQgbmV4dCBBIHRpbGUKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBMb2FkIG5leHQgQSBzY2FsZQogICAgICAgIGlmICh0aHJlYWRJZHgueCA8IChCTiAvIFZFQ1RPUl9TSVpFKSkgewogICAgICAgICAgQV9zY2FsZV90ZW1wID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRSldKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gTG9hZCBuZXh0IEIgdGlsZQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIExvYWQgbmV4dCBCIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgICAgICBCX3NjYWxlX3RlbXAgPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGUgY3VycmVudCBibG9jawogICAgICBsb25nIGFbV0lURVJOXSwgYltXSVRFUk1dOwogICAgICBmbG9hdCBiX3NjYWxlID0gV3NbY3Vycl1bQk5dOwogICAgICBmbG9hdHgxNiBjW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKICAgICAgCiAgICAgIC8vIFByb2Nlc3MgQksgaW4gY2h1bmtzIG9mIDE2IChtYXRyaXggbXVsdGlwbGljYXRpb24gdXNpbmcgTUZNQSkKICAgICAgZm9yICh1aW50MTZfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgLy8gTG9hZCBBIG1hdHJpeCBlbGVtZW50cwogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgYVt3bl0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZBc1tjdXJyXVt3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBMb2FkIEIgbWF0cml4IGVsZW1lbnRzCiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBiW3dtXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkJzW2N1cnJdW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIE1hdHJpeCBtdWx0aXBseSB1c2luZyBBTUQgTUZNQSBpbnN0cnVjdGlvbgogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICAgIGNbd25dW3dtXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgICAgIGFbd25dLCBiW3dtXSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC8vIFNjYWxlIHJlc3VsdHMKICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqCiAgICAgICAgICAgICAgICAgIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFN0b3JlIGxvYWRlZCBkYXRhIHRvIHNoYXJlZCBtZW1vcnkgKGZvciBuZXh0IGl0ZXJhdGlvbikKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgLy8gU3RvcmUgQQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgICAgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTdG9yZSBBIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW25leHRdW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9IEFfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gU3RvcmUgQgogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQl90ZW1wM1tpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkJzW25leHRdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSBwYWNrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTdG9yZSBCIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgICAgICBXc1tuZXh0XVtCTl0gPSBCX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICAvLyBUb2dnbGUgYnVmZmVyIGluZGljZXMKICAgICAgY3VyciA9IDEgLSBjdXJyOwogICAgICBuZXh0ID0gMSAtIG5leHQ7CiAgICB9CgogICAgLy8gV3JpdGUgZmluYWwgcmVzdWx0cyB0byBnbG9iYWwgbWVtb3J5CiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICB1aW50MzJfdCBnbG9iYWxSb3cgPSByb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGk7CiAgICAgICAgICAgIHVpbnQzMl90IGdsb2JhbENvbCA9IGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYOwogICAgICAgICAgICBpZiAoZ2xvYmFsUm93IDwgTiAmJiBnbG9iYWxDb2wgPCBNKSB7CiAgICAgICAgICAgICAgQ1tnbG9iYWxSb3cgKiBNICsgZ2xvYmFsQ29sXSA9IChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICBpbnQgTiA9IEEuc2l6ZSgwKSwgSyA9IEEuc2l6ZSgxKSwgTSA9IEIuc2l6ZSgwKTsKCiAgY29uc3QgaW50IEJLID0gNjQ7CiAgY29uc3QgaW50IEJOID0gMTI4OwogIGNvbnN0IGludCBCTSA9IDEyODsKICBjb25zdCBpbnQgV0lURVJOID0gMTsKICBjb25zdCBpbnQgV0lURVJNID0gMTsKICBjb25zdCBpbnQgU01fQ09VTlQgPSAzMDQ7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKFNNX0NPVU5UKTsKICAKICAvLyBDaG9vc2Uga2VybmVsIGJhc2VkIG9uIG1hdHJpeCBkaW1lbnNpb25zCiAgaWYgKE4gPiBNKSB7CiAgICAgIGZwOF9tbV9rZXJuZWw8Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5ULCBUaWxlSW5kZXhpbmdTdHJhdGVneTo6Tl9NQUpPUj48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVCwgVGlsZUluZGV4aW5nU3RyYXRlZ3k6Ok1fTUFKT1I+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilBLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLAogICAgICAgICAgQV9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwgQl9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgICAgIChfX2hpcF9iZmxvYXQxNiAqKUMuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgfQogIHJldHVybiBDOwp9CiIiIgoKY3BwX3NyYyA9IHIiIiIKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpOwoiIiIKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bCiAgICAgICAgIi1PZmFzdCIsCiAgICAgICAgIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsCiAgICAgICAgIi1zdGQ9YysrMjAiLAogICAgICAgICItZmZwLWNvbnRyYWN0PWZhc3QiLAogICAgXSwKKQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQogICAgcmV0dXJuIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyk=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 18833.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX00oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MTZfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE0sIEJNKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1syXVtCTl1bQksgKyA0XSwgQnNbMl1bQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzWzJdW0JOICsgMV07CgogICAgaW50IGN1cnIgPSAwLCBuZXh0ID0gMTsKCiAgICBmbG9hdHgxNiBkW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKCiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKyAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMSkgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAodyAmIDB4ZmYpIDw8IDI0IHwgKHogJiAweGZmKSA8PCAxNiB8ICh5ICYgMHhmZikgPDwgOCB8ICh4ICYgMHhmZik7CgogICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgJkFzW2N1cnJdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgJkFzW2N1cnJdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICB9CiAgICB9CiAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQ0ICo+KCZXc1tjdXJyXVt0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICZBX3NjYWxlWyhjb2xPZmZzZXRBICsgdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRSldKTsKICAgIH0KICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewoKICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKyAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMSkgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKCiAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAodyAmIDB4ZmYpIDw8IDI0IHwgKHogJiAweGZmKSA8PCAxNiB8ICh5ICYgMHhmZikgPDwgOCB8ICh4ICYgMHhmZik7CgogICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgJkJzW2N1cnJdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSBwYWNrOwogICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgJkJzW2N1cnJdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSAwLjBmOwogICAgICB9CiAgICB9CiAgICBpZiAodGhyZWFkSWR4LnggPT0gbnVtVGhyZWFkcyAtIDEpIHsgLy8gbG9hZCB1c2luZyBkaWZmZXJlbnQgd2FycAogICAgICBXc1tjdXJyXVtCTl0gPSBCX3NjYWxlWyhjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICB9CgogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHVpbnQzMl90IEFfdGVtcDFbMl0sIEFfdGVtcDJbMl0sIEFfdGVtcDNbMl0sIEFfdGVtcDRbMl07CiAgICB1aW50MzJfdCBCX3RlbXAxWzJdLCBCX3RlbXAyWzJdLCBCX3RlbXAzWzJdLCBCX3RlbXA0WzJdOwogICAgZmxvYXQ0IEFfc2NhbGVfdGVtcDsKICAgIGZsb2F0IEJfc2NhbGVfdGVtcDsKCiAgICBmb3IgKHVpbnQxNl90IHRpbGVPZmZzZXQgPSBCSzsgdGlsZU9mZnNldCA8IEsgKyBCSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBsb2FkIGZyb20gZ2xvYmFsIHRvIHNoYXJlZCBtZW1vcnkgaW4gY29hbGVzY2VkIG1hbm5lcgogICAgICBpZiAodGlsZU9mZnNldCA8IEspIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAgIEFfc2NhbGVfdGVtcCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgICBCX3NjYWxlX3RlbXAgPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiAvIEJMT0NLX0RJTSldOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbG9uZyBhW1dJVEVSTl0sIGJbV0lURVJNXTsKICAgICAgZmxvYXQgYl9zY2FsZSA9IFdzW2N1cnJdW0JOXTsKICAgICAgZmxvYXR4MTYgY1tXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgICBmb3IgKHVpbnQxNl90IEJLT2Zmc2V0ID0gMDsgQktPZmZzZXQgPCBCSzsgQktPZmZzZXQgKz0gMTYpIHsKICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGFbd25dID0gKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPigKICAgICAgICAgICAgICAmQXNbY3Vycl1bd2FycFJvd09mZnNldCArIHduICogMzIgKyB3YXJwWF1bQktPZmZzZXQgKyB3YXJwWSAqIDhdKTsKICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBiW3dtXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkJzW2N1cnJdW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICAgIGNbd25dW3dtXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgICAgIGFbd25dLCBiW3dtXSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqCiAgICAgICAgICAgICAgICAgIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh0aWxlT2Zmc2V0IDwgSykgewogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSkgPCBOICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICAgICAoQV90ZW1wNFtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDI0IHwKICAgICAgICAgICAgICAgIChBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgKEFfdGVtcDJbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCA4IHwKICAgICAgICAgICAgICAgIChBX3RlbXAxW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZik7CgogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgICAmQXNbbmV4dF1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IHBhY2s7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAmQXNbbmV4dF1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IDAuMGY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA8IChCTiAvIFZFQ1RPUl9TSVpFKSkgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQ0ICo+KCZXc1tuZXh0XVt0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgICAgIEFfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEIgPSAwOyBpbm5lclJvd09mZnNldEIgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKSA8IE0gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgICAgIChCX3RlbXA0W2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgMjQgfAogICAgICAgICAgICAgICAgKEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCAxNiB8CiAgICAgICAgICAgICAgICAoQl90ZW1wMltpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDggfAogICAgICAgICAgICAgICAgKEJfdGVtcDFbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKTsKCiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAgICZCc1tuZXh0XVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gcGFjazsKICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAgICZCc1tuZXh0XVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gMC4wZjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgICAgIFdzW25leHRdW0JOXSA9IEJfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGN1cnIgPSAxIC0gY3VycjsKICAgICAgbmV4dCA9IDEgLSBuZXh0OwogICAgfQoKICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICBmb3IgKHVpbnQxNl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgIGlmICgocm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSA8CiAgICAgICAgICAgICAgICAgICAgTiAmJgogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKSA8IE0pCiAgICAgICAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSAqCiAgICAgICAgICAgICAgICAgICAgTSArCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpXSA9CiAgICAgICAgICAgICAgICAgIChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjb25zdCB1aW50MzJfdCBCTiwgY29uc3QgdWludDMyX3QgQkssIGNvbnN0IHVpbnQzMl90IEJNLAogICAgICAgICAgY29uc3QgdWludDMyX3QgV0lURVJOLCBjb25zdCB1aW50MzJfdCBXSVRFUk0sIGNvbnN0IHVpbnQzMl90IFNNX0NPVU5UPgpfX2dsb2JhbF9fIHZvaWQKZnA4X21tX2tlcm5lbF9OKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkEsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkIsCiAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgICAgdWludDMyX3QgTiwgdWludDMyX3QgSywgdWludDMyX3QgTSkgewogIHVzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBWRUNUT1JfU0laRSA9IDQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXQVJQU0laRSA9IDY0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV04gPSAzMiAqIFdJVEVSTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdNID0gMzIgKiBXSVRFUk07CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBudW1UaHJlYWRzID0gKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUEgPSAobnVtVGhyZWFkcyAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQiA9IChudW1UaHJlYWRzIC8gQk0pICogVkVDVE9SX1NJWkU7CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MzJfdCBudW1UaWxlcyA9IGNkaXYoTiwgQk4pICogY2RpdihNLCBCTSk7CgogIGZvciAodWludDE2X3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgdWludDMyX3Qgcm93T2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihOLCBCTikpICogQk47CiAgICB1aW50MzJfdCBjb2xPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE4sIEJOKSkgKiBCTTsKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSAodGhyZWFkSWR4LnggLyBCTikgKiBWRUNUT1JfU0laRTsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSAodGhyZWFkSWR4LnggLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgICB1aW50MzJfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBJZHggPSB0aHJlYWRJZHgueCAvIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycENvbE9mZnNldCA9ICh3YXJwSWR4ICUgKEJNIC8gV00pKSAqIFdNOwogICAgdWludDMyX3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gV00pKSAqIFdOOwogICAgdWludDMyX3Qgd2FycFggPSBsYW5lSWR4ICUgMzI7CiAgICB1aW50MzJfdCB3YXJwWSA9IGxhbmVJZHggLyAzMjsKCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogQXNbMl1bQk5dW0JLICsgNF0sIEJzWzJdW0JNXVtCSyArIDRdOwogICAgX19zaGFyZWRfXyBmbG9hdCBXc1syXVtCTiArIDFdOwoKICAgIGludCBjdXJyID0gMCwgbmV4dCA9IDE7CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJiAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSkgPCBOICYmCiAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDEpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgeiA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CgogICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfCAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICZBc1tjdXJyXVtpbm5lckNvbEFdW2lubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QV0pID0gcGFjazsKICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICZBc1tjdXJyXVtpbm5lckNvbEFdW2lubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QV0pID0gMC4wZjsKICAgICAgfQogICAgfQogICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbY3Vycl1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICB9CiAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKSA8IE0gJiYKICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgKiBNICsgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgeiA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAyKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMykgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CgogICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0KICAgICAgICAgICAgKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfCAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICZCc1tjdXJyXVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gcGFjazsKICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICZCc1tjdXJyXVtpbm5lckNvbEJdW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0pID0gMC4wZjsKICAgICAgfQogICAgfQogICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgV3NbY3Vycl1bQk5dID0gQl9zY2FsZVsoY29sT2Zmc2V0QiAvIEJMT0NLX0RJTSldOwogICAgfQoKICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICB1aW50MzJfdCBBX3RlbXAxWzJdLCBBX3RlbXAyWzJdLCBBX3RlbXAzWzJdLCBBX3RlbXA0WzJdOwogICAgdWludDMyX3QgQl90ZW1wMVsyXSwgQl90ZW1wMlsyXSwgQl90ZW1wM1syXSwgQl90ZW1wNFsyXTsKICAgIGZsb2F0NCBBX3NjYWxlX3RlbXA7CiAgICBmbG9hdCBCX3NjYWxlX3RlbXA7CgogICAgZm9yICh1aW50MTZfdCB0aWxlT2Zmc2V0ID0gQks7IHRpbGVPZmZzZXQgPCBLICsgQks7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wMltpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMikgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgICAgQV90ZW1wNFtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgICBBX3RlbXAxW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wMltpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDNbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICAgICBBX3NjYWxlX3RlbXAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdDQgKj4oCiAgICAgICAgICAgICAgJkFfc2NhbGVbKHRpbGVPZmZzZXQgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAxKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAyKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgICBCX3RlbXA0W2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAgIEJfdGVtcDFbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wM1tpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPT0gbnVtVGhyZWFkcyAtIDEpIHsgLy8gbG9hZCB1c2luZyBkaWZmZXJlbnQgd2FycAogICAgICAgICAgQl9zY2FsZV90ZW1wID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tjdXJyXVtCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MTZfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1tjdXJyXVt3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDE2X3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1tjdXJyXVt3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKgogICAgICAgICAgICAgICAgICBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAodGlsZU9mZnNldCA8IEspIHsKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbbmV4dF1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgICBBX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICAgICAoQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDI0IHwKICAgICAgICAgICAgICAgIChCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgKEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCA4IHwKICAgICAgICAgICAgICAgIChCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZik7CgogICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgICAmQnNbbmV4dF1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAmQnNbbmV4dF1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgICBXc1tuZXh0XVtCTl0gPSBCX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICBjdXJyID0gMSAtIGN1cnI7CiAgICAgIG5leHQgPSAxIC0gbmV4dDsKICAgIH0KCiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICBpZiAoKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgPAogICAgICAgICAgICAgICAgICAgIE4gJiYKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCkgPCBNKQogICAgICAgICAgICAgIENbKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgKgogICAgICAgICAgICAgICAgICAgIE0gKwogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKV0gPQogICAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYpZFt3bl1bd21dW2kgKyBqICogNF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgphdDo6VGVuc29yIGZwOF9tbShhdDo6VGVuc29yIEEsIGF0OjpUZW5zb3IgQiwgYXQ6OlRlbnNvciBBX3NjYWxlLAogICAgICAgICAgICAgICAgICBhdDo6VGVuc29yIEJfc2NhbGUsIGF0OjpUZW5zb3IgQykgewogIGludCBOID0gQS5zaXplKDApLCBLID0gQS5zaXplKDEpLCBNID0gQi5zaXplKDApOwoKICBjb25zdCBpbnQgQksgPSA2NDsKICBjb25zdCBpbnQgQk4gPSAxMjg7CiAgY29uc3QgaW50IEJNID0gMTI4OwogIGNvbnN0IGludCBXSVRFUk4gPSAxOwogIGNvbnN0IGludCBXSVRFUk0gPSAxOwogIGNvbnN0IGludCBTTV9DT1VOVCA9IDMwNDsKICBkaW0zIG51bVRocmVhZHMoKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKSk7CiAgZGltMyBudW1CbG9ja3MoU01fQ09VTlQpOwogIC8vZGltMyBudW1CbG9ja3MoY2RpdihNLCBCTSksIGNkaXYoTiwgQk4pKTsKICBpZiAoTiA+IE0pIHsKICAgICAgZnA4X21tX2tlcm5lbF9OPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVD48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsX008Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0KICByZXR1cm4gQzsKfQoiIiIKCmNwcF9zcmMgPSByIiIiCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKTsKIiIiCgppZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICBzeXMuc3Rkb3V0ID0gb3BlbigiL2Rldi9zdGRvdXQiLCAidyIpCmlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgIHN5cy5zdGRlcnIgPSBvcGVuKCIvZGV2L3N0ZGVyciIsICJ3IikKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bCiAgICAgICAgIi1PZmFzdCIsCiAgICAgICAgIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsCiAgICAgICAgIi1zdGQ9YysrMjAiLAogICAgICAgICItZmZwLWNvbnRyYWN0PWZhc3QiLAogICAgICAgICItbGhpcF9oY2MiLAogICAgICAgICAiLW1jdW1vZGUiLAogICAgXSwKKQoKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCiAgICByZXR1cm4gbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQo=No newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUKCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiCgpjdWRhX3NyYyA9IHIiIiIKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXyBpbnQgY2RpdihpbnQgYSwgaW50IGIpIHsKICByZXR1cm4gKGEgKyBiIC0gMSkgLyBiOwp9CgojZGVmaW5lIEJMT0NLX0RJTSAxMjgKCi8vIEdlbmVyaWMgZW51bSBmb3IgdGlsZSBpbmRleCBjYWxjdWxhdGlvbiBzdHJhdGVneQplbnVtIGNsYXNzIFRpbGVJbmRleGluZ1N0cmF0ZWd5IHsKICBNX01BSk9SLCAvLyB0aWxlSWR4IC8gY2RpdihNLCBCTSkgZ2l2ZXMgcm93LCB0aWxlSWR4ICUgY2RpdihNLCBCTSkgZ2l2ZXMgY29sCiAgTl9NQUpPUiAgLy8gdGlsZUlkeCAlIGNkaXYoTiwgQk4pIGdpdmVzIHJvdywgdGlsZUlkeCAvIGNkaXYoTiwgQk4pIGdpdmVzIGNvbAp9OwoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQsCiAgICAgICAgICBjb25zdCBUaWxlSW5kZXhpbmdTdHJhdGVneSBzdHJhdGVneT4KX19nbG9iYWxfXyB2b2lkCmZwOF9tbV9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgIHVpbnQzMl90IE4sIHVpbnQzMl90IEssIHVpbnQzMl90IE0pIHsKICB1c2luZyBmbG9hdHgxNiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNiAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CgogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgVkVDVE9SX1NJWkUgPSA0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV0FSUFNJWkUgPSA2NDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdOID0gMzIgKiBXSVRFUk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTSA9IDMyICogV0lURVJNOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgbnVtVGhyZWFkcyA9IChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSk7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVBID0gKG51bVRocmVhZHMgLyBCTikgKiBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUIgPSAobnVtVGhyZWFkcyAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTiA9PSAwLCAiQk4gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJNID09IDAsICJCTSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChCSyA8PSAxMjggJiYgQk0gPD0gMTI4LCAiUmFuZ2UgYWJvdmUgMTI4IGlzIG5vdCBzdXBwb3J0ZWQiKTsKCiAgdWludDMyX3QgbnVtVGlsZXMgPSBjZGl2KE4sIEJOKSAqIGNkaXYoTSwgQk0pOwogIHVpbnQzMl90IHJvd09mZnNldEMsIGNvbE9mZnNldEM7CgogIGZvciAodWludDE2X3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgLy8gQ29tcHV0ZSB0aWxlIGluZGljZXMgZGlmZmVyZW50bHkgYmFzZWQgb24gc3RyYXRlZ3kKICAgIGlmIGNvbnN0ZXhwciAoc3RyYXRlZ3kgPT0gVGlsZUluZGV4aW5nU3RyYXRlZ3k6Ok1fTUFKT1IpIHsKICAgICAgcm93T2Zmc2V0QyA9ICh0aWxlSWR4IC8gY2RpdihNLCBCTSkpICogQk47CiAgICAgIGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgfSBlbHNlIHsgLy8gTl9NQUpPUgogICAgICByb3dPZmZzZXRDID0gKHRpbGVJZHggJSBjZGl2KE4sIEJOKSkgKiBCTjsKICAgICAgY29sT2Zmc2V0QyA9ICh0aWxlSWR4IC8gY2RpdihOLCBCTikpICogQk07CiAgICB9CiAgICAKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSAodGhyZWFkSWR4LnggLyBCTikgKiBWRUNUT1JfU0laRTsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSAodGhyZWFkSWR4LnggLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgICB1aW50MzJfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBJZHggPSB0aHJlYWRJZHgueCAvIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycENvbE9mZnNldCA9ICh3YXJwSWR4ICUgKEJNIC8gV00pKSAqIFdNOwogICAgdWludDMyX3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gV00pKSAqIFdOOwogICAgdWludDMyX3Qgd2FycFggPSBsYW5lSWR4ICUgMzI7CiAgICB1aW50MzJfdCB3YXJwWSA9IGxhbmVJZHggLyAzMjsKCiAgICAvLyBEb3VibGUtYnVmZmVyaW5nIHNldHVwIHdpdGggYXJyYXkgaW5kaWNlcwogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IEFzWzJdW0JOXVtCSyArIDRdLCBCc1syXVtCTV1bQksgKyA0XTsKICAgIF9fc2hhcmVkX18gZmxvYXQgV3NbMl1bQk4gKyAxXTsKCiAgICBpbnQgY3VyciA9IDAsIG5leHQgPSAxOwogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgLy8gSW5pdGlhbCBsb2FkOiBnbG9iYWwgbWVtb3J5IC0+IHNoYXJlZCBtZW1vcnkKICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QSArPSBzdHJpZGVBKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEsgJiYgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgIHVpbnQ4X3QgeCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpICogTiArIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZBWyhpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQVsoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMikgKiBOICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgdWludDhfdCB3ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkFbKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDMpICogTiArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwoKICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAmQXNbY3Vycl1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IHBhY2s7CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAmQXNbY3Vycl1baW5uZXJDb2xBXVtpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0FdKSA9IDAuMGY7CiAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbY3Vycl1bdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAmQV9zY2FsZVsoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICB9CiAgICAKICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgIGlubmVyUm93T2Zmc2V0QiArPSBzdHJpZGVCKSB7CiAgICAgIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJgogICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgIHVpbnQ4X3QgeCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICZCWyhpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAxKSAqIE0gKwogICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAmQlsoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgdWludDhfdCB3ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgJkJbKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9CiAgICAgICAgICAgICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAmQnNbY3Vycl1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAmQnNbY3Vycl1baW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgIFdzW2N1cnJdW0JOXSA9IEJfc2NhbGVbKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgLy8gVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG5leHQgdGlsZQogICAgdWludDMyX3QgQV90ZW1wMVsyXSwgQV90ZW1wMlsyXSwgQV90ZW1wM1syXSwgQV90ZW1wNFsyXTsKICAgIHVpbnQzMl90IEJfdGVtcDFbMl0sIEJfdGVtcDJbMl0sIEJfdGVtcDNbMl0sIEJfdGVtcDRbMl07CiAgICBmbG9hdDQgQV9zY2FsZV90ZW1wOwogICAgZmxvYXQgQl9zY2FsZV90ZW1wOwogICAgCiAgICAvLyBNYWluIGNvbXB1dGF0aW9uIGxvb3Agd2l0aCBkb3VibGUgYnVmZmVyaW5nCiAgICBmb3IgKHVpbnQxNl90IHRpbGVPZmZzZXQgPSBCSzsgdGlsZU9mZnNldCA8IEsgKyBCSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBMb2FkIG5leHQgYmxvY2sgKGlmIHdpdGhpbiBib3VuZHMpCiAgICAgIGlmICh0aWxlT2Zmc2V0IDwgSykgewogICAgICAgIC8vIExvYWQgbmV4dCBBIHRpbGUKICAgICAgICBmb3IgKHVpbnQxNl90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRBICs9IHN0cmlkZUEpIHsKICAgICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpIDwgTiAmJgogICAgICAgICAgICAgIChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXAzW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAyKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgICBBX3RlbXA0W2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAzKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAgIEFfdGVtcDFbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgICBBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdID0gMDsKICAgICAgICAgICAgQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSA9IDA7CiAgICAgICAgICAgIEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBMb2FkIG5leHQgQSBzY2FsZQogICAgICAgIGlmICh0aHJlYWRJZHgueCA8IChCTiAvIFZFQ1RPUl9TSVpFKSkgewogICAgICAgICAgQV9zY2FsZV90ZW1wID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRSldKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gTG9hZCBuZXh0IEIgdGlsZQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgICBCX3RlbXAxW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0KICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDNbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDIpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICAgIEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPQogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDMpICogTSArCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICAgIEJfdGVtcDJbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gPSAwOwogICAgICAgICAgICBCX3RlbXAzW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdID0gMDsKICAgICAgICAgICAgQl90ZW1wNFtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIExvYWQgbmV4dCBCIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgICAgICBCX3NjYWxlX3RlbXAgPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGUgY3VycmVudCBibG9jawogICAgICBsb25nIGFbV0lURVJOXSwgYltXSVRFUk1dOwogICAgICBmbG9hdCBiX3NjYWxlID0gV3NbY3Vycl1bQk5dOwogICAgICBmbG9hdHgxNiBjW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKICAgICAgCiAgICAgIC8vIFByb2Nlc3MgQksgaW4gY2h1bmtzIG9mIDE2IChtYXRyaXggbXVsdGlwbGljYXRpb24gdXNpbmcgTUZNQSkKICAgICAgZm9yICh1aW50MTZfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgLy8gTG9hZCBBIG1hdHJpeCBlbGVtZW50cwogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgYVt3bl0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZBc1tjdXJyXVt3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBMb2FkIEIgbWF0cml4IGVsZW1lbnRzCiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBiW3dtXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkJzW2N1cnJdW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIE1hdHJpeCBtdWx0aXBseSB1c2luZyBBTUQgTUZNQSBpbnN0cnVjdGlvbgogICAgICAgIGZvciAodWludDE2X3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICAgIGNbd25dW3dtXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgICAgIGFbd25dLCBiW3dtXSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC8vIFNjYWxlIHJlc3VsdHMKICAgICAgZm9yICh1aW50MTZfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW2N1cnJdW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqCiAgICAgICAgICAgICAgICAgIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFN0b3JlIGxvYWRlZCBkYXRhIHRvIHNoYXJlZCBtZW1vcnkgKGZvciBuZXh0IGl0ZXJhdGlvbikKICAgICAgaWYgKHRpbGVPZmZzZXQgPCBLKSB7CiAgICAgICAgLy8gU3RvcmUgQQogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRBID0gMDsgaW5uZXJSb3dPZmZzZXRBIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgICAgaWYgKChpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEFfdGVtcDRbaW5uZXJSb3dPZmZzZXRBIC8gc3RyaWRlQV0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wM1tpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChBX3RlbXAyW2lubmVyUm93T2Zmc2V0QSAvIHN0cmlkZUFdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQV90ZW1wMVtpbm5lclJvd09mZnNldEEgLyBzdHJpZGVBXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkFzW25leHRdW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTdG9yZSBBIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54IDwgKEJOIC8gVkVDVE9SX1NJWkUpKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW25leHRdW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9IEFfc2NhbGVfdGVtcDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gU3RvcmUgQgogICAgICAgIGZvciAodWludDE2X3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICAgICAgaWYgKChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhY2sgPQogICAgICAgICAgICAgICAgKEJfdGVtcDRbaW5uZXJSb3dPZmZzZXRCIC8gc3RyaWRlQl0gJiAweGZmKSA8PCAyNCB8CiAgICAgICAgICAgICAgICAoQl90ZW1wM1tpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgIChCX3RlbXAyW2lubmVyUm93T2Zmc2V0QiAvIHN0cmlkZUJdICYgMHhmZikgPDwgOCB8CiAgICAgICAgICAgICAgICAoQl90ZW1wMVtpbm5lclJvd09mZnNldEIgLyBzdHJpZGVCXSAmIDB4ZmYpOwoKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KAogICAgICAgICAgICAgICAgJkJzW25leHRdW2lubmVyQ29sQl1baW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXSkgPSBwYWNrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTdG9yZSBCIHNjYWxlCiAgICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7CiAgICAgICAgICBXc1tuZXh0XVtCTl0gPSBCX3NjYWxlX3RlbXA7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICAvLyBUb2dnbGUgYnVmZmVyIGluZGljZXMKICAgICAgY3VyciA9IDEgLSBjdXJyOwogICAgICBuZXh0ID0gMSAtIG5leHQ7CiAgICB9CgogICAgLy8gV3JpdGUgZmluYWwgcmVzdWx0cyB0byBnbG9iYWwgbWVtb3J5CiAgICBmb3IgKHVpbnQxNl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MTZfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MTZfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICB1aW50MzJfdCBnbG9iYWxSb3cgPSByb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGk7CiAgICAgICAgICAgIHVpbnQzMl90IGdsb2JhbENvbCA9IGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYOwogICAgICAgICAgICBpZiAoZ2xvYmFsUm93IDwgTiAmJiBnbG9iYWxDb2wgPCBNKSB7CiAgICAgICAgICAgICAgQ1tnbG9iYWxSb3cgKiBNICsgZ2xvYmFsQ29sXSA9IChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICBpbnQgTiA9IEEuc2l6ZSgwKSwgSyA9IEEuc2l6ZSgxKSwgTSA9IEIuc2l6ZSgwKTsKCiAgY29uc3QgaW50IEJLID0gNjQ7CiAgY29uc3QgaW50IEJOID0gMTI4OwogIGNvbnN0IGludCBCTSA9IDEyODsKICBjb25zdCBpbnQgV0lURVJOID0gMTsKICBjb25zdCBpbnQgV0lURVJNID0gMTsKICBjb25zdCBpbnQgU01fQ09VTlQgPSAzMDQ7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKFNNX0NPVU5UKTsKICAKICAvLyBDaG9vc2Uga2VybmVsIGJhc2VkIG9uIG1hdHJpeCBkaW1lbnNpb25zCiAgaWYgKE4gPiBNKSB7CiAgICAgIGZwOF9tbV9rZXJuZWw8Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5ULCBUaWxlSW5kZXhpbmdTdHJhdGVneTo6Tl9NQUpPUj48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVCwgVGlsZUluZGV4aW5nU3RyYXRlZ3k6Ok1fTUFKT1I+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilBLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLAogICAgICAgICAgQV9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwgQl9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgICAgIChfX2hpcF9iZmxvYXQxNiAqKUMuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgfQogIHJldHVybiBDOwp9CiIiIgoKY3BwX3NyYyA9IHIiIiIKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpOwoiIiIKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bCiAgICAgICAgIi1PZmFzdCIsCiAgICAgICAgIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsCiAgICAgICAgIi1zdGQ9YysrMjAiLAogICAgICAgICItZmZwLWNvbnRyYWN0PWZhc3QiLAogICAgXSwKKQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQogICAgcmV0dXJuIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyk=No newline at end of file
Best evidence level for this revision: reported
JSON