submission 29932
KernelBot user 44 · 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-29932?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
52.2µs
#10 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
56.9µs
#9 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
82.3µs
#8 of 98
2025-06-01
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
145.4µs
#13 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
151.1µs
#8 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
154.2µs
#16 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
224.4µs
#8 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
590.1µs
#8 of 98
2025-06-01
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:60ff62d06c50da482c15d7f5d8b9748dd0a050d0dfd166ccfbe2ef50e53da7f8
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
submission.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcgpmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKQ1BQX1dSQVBQRVIgPSAiIiIKdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYyk7CiIiIgpDVURBX1NSQyA9ICIiIgojcHJhZ21hIG9uY2UKI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwMTYuaD4KI2RlZmluZSBQQVJBTUVURVJJWkVfTElCUkFSWQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9jb29wZXJhdGl2ZV9ncm91cHMuaD4KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+Cm5hbWVzcGFjZSB3bW1hID0gcm9jd21tYTsKI2lmZGVmIFRFU1RfT05fQ1VEQQpuYW1lc3BhY2Ugd21tYSA9IG52Y3VkYTo6d21tYTsKI2RlZmluZSBMSUJfQ0FMTChjYWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWRhRXJyb3JfdCBlcnIgPSBjYWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBjdWRhU3VjY2VzcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCiNkZWZpbmUgSE9TVF9UWVBFKHgpIGN1ZGEjI3gKI2Vsc2UKI2lmbmRlZiBISVBfSEVBREVSU19fCiNkZWZpbmUgSElQX0hFQURFUlNfXwojZW5kaWYKbmFtZXNwYWNlIHdtbWEgPSByb2N3bW1hOwojZGVmaW5lIExJQl9DQUxMKGNhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpcEVycm9yX3QgZXJyID0gY2FsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IGhpcFN1Y2Nlc3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKI2RlZmluZSBIT1NUX1RZUEUoeCkgaGlwIyN4CiNlbmRpZgojcHJhZ21hIG9uY2UKI2lmZGVmIFRFU1RfT05fQ1VEQQojZGVmaW5lIF9fRlA4X1RZUEUgX19udl9mcDhfZTRtMwojZGVmaW5lIF9fRlA4eDRfVFlQRSBfX252X2ZwOHg0X2U0bTMKI2RlZmluZSBfX0JGMTZfVFlQRSBfX252X2JmbG9hdDE2CiNkZWZpbmUgX19CRjE2eDJfVFlQRSBfX252X2JmbG9hdDE2MgojZWxzZQojaWZkZWYgVEVTVF9PTl9SRE5BNAojZGVmaW5lIF9fRlA4X1RZUEUgX19oaXBfZnA4X2U0bTMKI2RlZmluZSBfX0ZQOHg0X1RZUEUgX19oaXBfZnA4eDRfZTRtMwpjb25zdGV4cHIgY29uc3QgaW5saW5lIGludCBXQVZFX1NJWkUgPSAzMjsKI2Vsc2UKI2RlZmluZSBfX0ZQOF9UWVBFIF9faGlwX2ZwOF9lNG0zX2ZudXoKI2RlZmluZSBfX0ZQOHg0X1RZUEUgX19oaXBfZnA4eDRfZTRtM19mbnV6CmNvbnN0ZXhwciBjb25zdCBpbmxpbmUgaW50IFdBVkVfU0laRSA9IDY0OwojZW5kaWYKI2RlZmluZSBfX0JGMTZfVFlQRSBfX2hpcF9iZmxvYXQxNgojZGVmaW5lIF9fQkYxNngyX1RZUEUgX19oaXBfYmZsb2F0MTYyCiNkZWZpbmUgX19GUDE2X1RZUEUgX19oYWxmCiNkZWZpbmUgX19JTlQxNl9UWVBFIGludDE2X3QKI2VuZGlmCiNkZWZpbmUgX19GUDMyX1RZUEUgZmxvYXQKI2lmbmRlZiBHRU1NX0tFUk5FTAojZGVmaW5lIEdFTU1fS0VSTkVMCiN1bmRlZiBfX0hJUF9OT19IQUxGX09QRVJBVE9SU19fCiN1bmRlZiBfX0hJUF9OT19IQUxGX0NPTlZFUlNJT05TX18KI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKdGVtcGxhdGUgPGludCB4LCBpbnQgeT4gCmNvbnN0ZXhwciBfX2RldmljZV9fIF9faG9zdF9fIGlubGluZSBpbnQgZXhhY3RfZGl2KCkgewogICAgc3RhdGljX2Fzc2VydCh4ICUgeSA9PSAwKTsKICAgIHN0YXRpY19hc3NlcnQoeCA+PSB5KTsKICAgIHJldHVybiB4IC8geTsKICB9CiAgCmNvbnN0ZXhwciBfX2RldmljZV9fIF9faG9zdF9fIGlubGluZSBpbnQgY2VpbF9kaXYoaW50IHgsIGludCB5KSB7IAogICAgcmV0dXJuICh4ICsgeSAtIDEpIC8geTsKfQogIApuYW1lc3BhY2UgZ2VtbV9rZXJuZWwgewpfX2RldmljZV9fIGF1dG8gZ2V0Y2xvY2soKSB7CiAgICB1aW50NjRfdCBjbGs7CiAgICByZXR1cm4gY2xrOwp9CnRlbXBsYXRlPHR5cGVuYW1lIEVsZW0sIGludCBNLCBpbnQgTiwgaW50IFRJTEVfRElNLCBpbnQgQkxPQ0tfU0laRSwgaW50IFZFQ19TSVpFPgpfX2dsb2JhbF9fIHZvaWQgdHJhbnNwb3NlX2tlcm5lbChFbGVtKiBvZGF0YSwgY29uc3QgRWxlbSogaWRhdGEpIHsKICAgIGNvbnN0ZXhwciBhdXRvIFRCTE9DS19YID0gVElMRV9ESU0gLyBWRUNfU0laRTsKICAgIGNvbnN0ZXhwciBhdXRvIFRCTE9DS19ZID0gQkxPQ0tfU0laRSAvIFRCTE9DS19YOwogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIGNvbnN0ZXhwciBhdXRvIFBBRERJTkcgPSBUQkxPQ0tfWSAvIChCTE9DS19TSVpFIC8gd2FycFNpemUpOwogICAgX19zaGFyZWRfXyBFbGVtIHRpbGVbVElMRV9ESU1dW1RJTEVfRElNICsgUEFERElOR107CiAgICBpbnQgeCA9IGJsb2NrSWR4LnggKiBUSUxFX0RJTSArIHRocmVhZElkeC54ICogVkVDX1NJWkU7CiAgICBpbnQgeSA9IGJsb2NrSWR4LnkgKiBUSUxFX0RJTSArIHRocmVhZElkeC55OwogICAgCiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUSUxFX0RJTTsgaSArPSBUQkxPQ0tfWSkgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgdiA9IDA7IHYgPCBWRUNfU0laRTsgdisrKSB7CiAgICAgICAgICAgIHRpbGVbdGhyZWFkSWR4LnkgKyBpXVt0aHJlYWRJZHgueCAqIFZFQ19TSVpFICsgdl0gPSBpZGF0YVsoeSArIGkpICogTiArIHggKyB2XTsKICAgICAgICB9CiAgICB9CiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAKICAgIHggPSBibG9ja0lkeC55ICogVElMRV9ESU0gKyB0aHJlYWRJZHgueCAqIFZFQ19TSVpFOwogICAgeSA9IGJsb2NrSWR4LnggKiBUSUxFX0RJTSArIHRocmVhZElkeC55OwogICAgCiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUSUxFX0RJTTsgaSArPSBUQkxPQ0tfWSkgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgdiA9IDA7IHYgPCBWRUNfU0laRTsgdisrKSB7CiAgICAgICAgICAgIG9kYXRhWyh5ICsgaSkgKiBNICsgeCArIHZdID0gdGlsZVt0aHJlYWRJZHgueCAqIFZFQ19TSVpFICsgdl1bdGhyZWFkSWR4LnkgKyBpXTsKICAgICAgICB9CiAgICB9Cn0KdGVtcGxhdGU8dHlwZW5hbWUgRWxlbSwgaW50IE0sIGludCBOLCBpbnQgVElMRV9ESU0sIGludCBCTE9DS19TSVpFLCBpbnQgVkVDX1NJWkU+CnZvaWQgbGF1bmNoX3RyYW5zcG9zZShFbGVtICpvdXQsIGNvbnN0IEVsZW0gKmluKSB7CiAgICBzdGF0aWNfYXNzZXJ0KFRJTEVfRElNICUgVkVDX1NJWkUgPT0gMCk7CiAgICBjb25zdGV4cHIgYXV0byBUQkxPQ0tfWCA9IFRJTEVfRElNIC8gVkVDX1NJWkU7CiAgICBzdGF0aWNfYXNzZXJ0KEJMT0NLX1NJWkUgJSBUQkxPQ0tfWCA9PSAwKTsKICAgIGNvbnN0ZXhwciBhdXRvIFRCTE9DS19ZID0gQkxPQ0tfU0laRSAvIFRCTE9DS19YOwogICAgc3RhdGljX2Fzc2VydChNICUgVElMRV9ESU0gPT0gMCAmJiBOICUgVElMRV9ESU0gPT0gMCk7CiAgICB0cmFuc3Bvc2Vfa2VybmVsPEVsZW0sIE0sIE4sIFRJTEVfRElNLCBCTE9DS19TSVpFLCBWRUNfU0laRT48PDxkaW0zKE4gLyBUSUxFX0RJTSwgTSAvIFRJTEVfRElNKSwgZGltMyhUQkxPQ0tfWCwgVEJMT0NLX1kpPj4+KG91dCwgaW4pOwp9CnRlbXBsYXRlPHR5cGVuYW1lIEVsZW0+Cl9fZ2xvYmFsX18gdm9pZCBjaGVja190cmFucyhjb25zdCBFbGVtICpvcmlnaW4sIGNvbnN0IEVsZW0gKnRyYW5wb3NlZCwgaW50IG0sIGludCBuKSB7CiAgICBhdXRvIHggPSB0aHJlYWRJZHgueCArIGJsb2NrSWR4LnggKiBibG9ja0RpbS54OwogICAgYXV0byB5ID0gdGhyZWFkSWR4LnkgKyBibG9ja0lkeC55ICogYmxvY2tEaW0ueTsKICAgIGlmICh4IDwgbSAmJiB5IDwgbikgewogICAgICAgIGlmKG9yaWdpblt4ICogbiArIHldICE9IHRyYW5wb3NlZFt5ICogbSArIHhdKSB7CiAgICAgICAgfQogICAgfQp9CnRlbXBsYXRlIDx0eXBlbmFtZSBpbl9kYXRhX3R5cGUsIHR5cGVuYW1lIGFjY19kYXRhX3R5cGUsCiAgICB0eXBlbmFtZSBGcmFnQywgdHlwZW5hbWUgRnJhZ0EsIHR5cGVuYW1lIEZyYWdCLCAKICAgIGludCBQTSwgaW50IFBOLAogICAgaW50IEJNLCBpbnQgQk4sIGludCBCSywgCiAgICBpbnQgRlJBR19NLCBpbnQgRlJBR19OLCBpbnQgRlJBR19LLCAKICAgIGludCBXTU1BX00sIGludCBXTU1BX04sIGludCBXTU1BX0ssCiAgICBpbnQgV0FSUF9NLCBpbnQgV0FSUF9OLAogICAgaW50IEJMT0NLX1NJWkUsIGludCBCQVRDSF9TSVpFLCBpbnQgUVVBTlRfU0laRT4KX19kZXZpY2VfXyB2b2lkIHdtbWFfY29tcHV0ZSgKICAgIGNvbnN0IGluX2RhdGFfdHlwZSBzX2FbQk1dW0JLICsgOF0sCiAgICBjb25zdCBpbl9kYXRhX3R5cGUgc19iW0JOXVtCSyArIDhdLAogICAgY29uc3QgZmxvYXQgc19zW1BOXVtQTV0sCiAgICBGcmFnQyBmcmFnX3JbRlJBR19NXVtGUkFHX05dLAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX20sCiAgICBjb25zdCBpbnQgY29tcF9jX2ZyYWdfbgopIHsKICAgIEZyYWdDIGZyYWdfY1tGUkFHX01dW0ZSQUdfTl07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUkFHX007IGkrKykgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBGUkFHX047IGorKykgewogICAgICAgICAgICB3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfY1tpXVtqXSwgMC4wRik7CiAgICAgICAgfQogICAgfQogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IGsgPSAwOyBrIDwgRlJBR19LOyArK2spIHsKICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJBR19NOyBpKyspIHsKICAgICAgICAgICAgRnJhZ0EgZnJhZ19hOwogICAgICAgICAgICBpbnQgc19hX3JvdyA9IGsgKiBXTU1BX0s7CiAgICAgICAgICAgIGludCBzX2FfY29sID0gKGNvbXBfY19mcmFnX20gKiBGUkFHX00gKyBpKSAqIFdNTUFfTTsKICAgICAgICAgICAgd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZzX2Fbc19hX2NvbF1bc19hX3Jvd10sIEJLICsgOCk7CiAgICAgICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRlJBR19OOyBqKyspIHsKICAgICAgICAgICAgICAgIEZyYWdCIGZyYWdfYjsKICAgICAgICAgICAgICAgIGludCBzX2Jfcm93ID0gayAqIFdNTUFfSzsKICAgICAgICAgICAgICAgIGludCBzX2JfY29sID0gKGNvbXBfY19mcmFnX24gKiBGUkFHX04gKyBqKSAqIFdNTUFfTjsKICAgICAgICAgICAgICAgIHdtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmc19iW3NfYl9jb2xdW3NfYl9yb3ddLCBCSyArIDgpOwogICAgICAgICAgICAgICAgd21tYTo6bW1hX3N5bmMoZnJhZ19jW2ldW2pdLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19jW2ldW2pdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEZSQUdfTTsgaSsrKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEZSQUdfTjsgaisrKSB7CiAgICAgICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgRnJhZ0M6Om51bV9lbGVtZW50czsgKytrKSB7CiAgICAgICAgICAgICAgICAjaWZkZWYgVEVTVF9PTl9SRE5BNCAKICAgICAgICAgICAgICAgIGludCBtID0gKCh0aHJlYWRJZHgueCAmIDE2KSA+PiAxKSB8IChrICYgNykgfCAoY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGkpICogV01NQV9NOwogICAgICAgICAgICAgICAgI2Vsc2UgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBhdXRvIGxhbmUgPSB0aHJlYWRJZHgueCAlIDY0OwogICAgICAgICAgICAgICAgaW50IG0sIG47CiAgICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKFdNTUFfTSA9PSAzMikgewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIG0gPSAoOCAqIChrIC8gNCkgJSAzMikgKyA0ICogKGxhbmUgLyAzMikgKyAoayAlIDQpOwogICAgICAgICAgICAgICAgICAgIG4gPSBsYW5lICUgMzI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIG0gPSA0ICogKGxhbmUgLyAxNikgKyAoayAlIDQpOwogICAgICAgICAgICAgICAgICAgIG4gPSBsYW5lICUgMTY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtICs9IChjb21wX2NfZnJhZ19tICogRlJBR19NICsgaSkgKiBXTU1BX007CiAgICAgICAgICAgICAgICBuICs9IChjb21wX2NfZnJhZ19uICogRlJBR19OICsgaikgKiBXTU1BX047CiAgICAgICAgICAgICAgICBuID0gbiAvIFFVQU5UX1NJWkU7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBzX3Nbbl1bbV07CiAgICAgICAgICAgICAgICBmcmFnX3JbaV1bal0ueFtrXSArPSAoYWNjX2RhdGFfdHlwZSlzY2FsZSAqIChhY2NfZGF0YV90eXBlKWZyYWdfY1tpXVtqXS54W2tdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cl9fZGV2aWNlX18gcm9jd21tYTo6YmZsb2F0MTZfdCBmYXN0X2YzMnRvYjE2KGZsb2F0IGYpIHsKICAgIHVuaW9uIHsKICAgIGZsb2F0IGZwMzI7CiAgICB1bnNpZ25lZCBpbnQgdTMyOwogICAgfSB1ID0ge2Z9OwogICAgdS51MzIgKz0gMHg3ZmZmICsgKCh1LnUzMiA+PiAxNikgJiAxKTsKICAgIGF1dG8gcmV0ID0gdS51MzIgPj4gMTY7CiAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxyb2N3bW1hOjpiZmxvYXQxNl90Jj4ocmV0KTsKfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgYWNjX2RhdGFfdHlwZSwgdHlwZW5hbWUgb3V0X2RhdGFfdHlwZSwgCnR5cGVuYW1lIEZyYWdDLCB0eXBlbmFtZSBGcmFnT3V0LCBpbnQgV01NQV9NLCBpbnQgV01NQV9OLCAKaW50IEJNLCBpbnQgQk4sIGludCBNLCBpbnQgTiwgaW50IEZSQUdfTSwgaW50IEZSQUdfTj4KX19kZXZpY2VfXyBpbmxpbmUgdm9pZCBzdG9yZV9yZXN1bHQoCiAgICBvdXRfZGF0YV90eXBlIGNbTV1bTl0sIAogICAgRnJhZ0MgZnJhZ19yW0ZSQUdfTV1bRlJBR19OXSwgCiAgICBjb25zdCBpbnQgbSwKICAgIGNvbnN0IGludCBuLAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX20sIAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX24KKSB7CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUkFHX007IGkrKykgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBGUkFHX047IGorKykgewogICAgICAgICAgICBpbnQgZnJhZ19tID0gY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGk7CiAgICAgICAgICAgIGludCBmcmFnX24gPSBjb21wX2NfZnJhZ19uICogRlJBR19OICsgajsKICAgICAgICAgICAgaW50IHJvdyA9IG0gKyBmcmFnX20gKiBXTU1BX007CiAgICAgICAgICAgIGludCBjb2wgPSBuICsgZnJhZ19uICogV01NQV9OOwogICAgICAgICAgICBpZiAoKChNICUgQk0gPT0gMCkgfHwgKHJvdyA8IE0pKSAmJiAoKE4gJSBCTiA9PSAwKSB8fCAoY29sIDwgTikpKSB7CiAgICAgICAgICAgICAgICBvdXRfZGF0YV90eXBlICpjX3B0ciA9ICZjW3Jvd11bY29sXTsKICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoc2l6ZW9mKGFjY19kYXRhX3R5cGUpID09IHNpemVvZihvdXRfZGF0YV90eXBlKSkgewogICAgICAgICAgICAgICAgICAgIHdtbWE6OnN0b3JlX21hdHJpeF9zeW5jKHJlaW50ZXJwcmV0X2Nhc3Q8b3V0X2RhdGFfdHlwZSo+KGNfcHRyKSwgZnJhZ19yW2ldW2pdLCBOLCB3bW1hOjptZW1fcm93X21ham9yKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKHNpemVvZihvdXRfZGF0YV90eXBlKSA9PSBzaXplb2YoaGFsZikpIHsKICAgICAgICAgICAgICAgICAgICBGcmFnT3V0IGZyYWdfb3V0OwogICAgICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGhhbGYpID09IHNpemVvZihvdXRfZGF0YV90eXBlKSk7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChGcmFnT3V0OjpudW1fZWxlbWVudHMgPT0gRnJhZ0M6Om51bV9lbGVtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wO2s8RnJhZ091dDo6bnVtX2VsZW1lbnRzOysraykgewogICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlZyA9IGZhc3RfZjMydG9iMTYoZnJhZ19yW2ldW2pdLnhba10pOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFnX291dC54W2tdID0gKnJlaW50ZXJwcmV0X2Nhc3Q8aGFsZio+KCZyZWcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhyZWludGVycHJldF9jYXN0PGhhbGYqPihjX3B0ciksIGZyYWdfb3V0LCBOLCB3bW1hOjptZW1fcm93X21ham9yKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KdGVtcGxhdGU8aW50IFNwbGl0az4KX19nbG9iYWxfXyB2b2lkIHJlZHVjZSh1aW50MzJfdCBtLCB1aW50MzJfdCBuLCBjb25zdCBmbG9hdCAqY19zcGxpdGssIF9faGlwX2JmbG9hdDE2ICpjKSB7CiAgICBhdXRvIHRpZCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkID49IG0gKiBuKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZmxvYXQ0IHN1bXt9OwogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoYXV0byBpID0gMDsgaSA8IFNwbGl0azsgKytpKSB7CiAgICAgICAgc3VtICs9ICooZmxvYXQ0KikmY19zcGxpdGtbaSAqIChtICogbikgKyB0aWQgKiA0XTsKICAgIH0KICAgIGF1dG8gcmVzID0gcm9jd21tYTo6bWFrZV92ZWN0b3IoZmFzdF9mMzJ0b2IxNihzdW0ueCksIGZhc3RfZjMydG9iMTYoc3VtLnkpLCBmYXN0X2YzMnRvYjE2KHN1bS56KSwgZmFzdF9mMzJ0b2IxNihzdW0udykpOwogICAgKihkZWNsdHlwZShyZXMpKikmY1t0aWQgKiA0XSA9IHJlczsKfQogICAgCiNpZmRlZiBQQVJBTUVURVJJWkVfTElCUkFSWQp0ZW1wbGF0ZSA8CiAgICB0eXBlbmFtZSBpbl9kYXRhX3R5cGUsCiAgICB0eXBlbmFtZSBhY2NfZGF0YV90eXBlLCAKICAgIHR5cGVuYW1lIG91dF9kYXRhX3R5cGUsIAogICAgaW50IE0sIGludCBOLCBpbnQgSywgICAgCiAgICBpbnQgQk0sIGludCBCTiwgaW50IEJLLCAKICAgIGludCBRVUFOVF9TSVpFLCAgICAgICAgIAogICAgaW50IEJMT0NLX1NJWkUsICAgICAgICAgCiAgICBpbnQgV0FSUF9NLCBpbnQgV0FSUF9OLCAKICAgIGludCBMREEsIGludCBMREIKPgojZWxzZQp1c2luZyBpbl9kYXRhX3R5cGUgPSBfX0ZQOF9UWVBFOwp1c2luZyBvdXRfZGF0YV90eXBlID0gX19CRjE2X1RZUEU7CnVzaW5nIGFjY19kYXRhX3R5cGUgPSBmbG9hdDsKY29uc3RleHByIGludCBNID0gNjE0NCwgTiA9IDQ2MDgsIEsgPSA3MTY4Owpjb25zdGV4cHIgaW50IExEQSA9IEssIExEQiA9IEs7CmNvbnN0ZXhwciBpbnQgQk0gPSAyNTYsIEJOID0gMTI4LCBCSyA9IDEyODsKY29uc3RleHByIGludCBRVUFOVF9TSVpFID0gMTI4LCBCTE9DS19TSVpFID0gNTEyOwojaWZkZWYgVEVTVF9PTl9SRE5BNCAKY29uc3RleHByIGludCBXQVJQX00gPSA0LCBXQVJQX04gPSAyOwojZWxzZSAKY29uc3RleHByIGludCBXQVJQX00gPSA0LCBXQVJQX04gPSAyOwojZW5kaWYKI2VuZGlmIApfX2dsb2JhbF9fIF9fbGF1bmNoX2JvdW5kc19fKEJMT0NLX1NJWkUpIHZvaWQgZ2VtbV9rZXJuZWwoCiAgICBjb25zdCBpbl9kYXRhX3R5cGUgYVtNXVtMREFdLAogICAgY29uc3QgaW5fZGF0YV90eXBlIGJbTl1bTERCXSwKICAgIG91dF9kYXRhX3R5cGUgY1tNXVtOXSwKICAgIGNvbnN0IGZsb2F0IHNhW2NlaWxfZGl2KEssIFFVQU5UX1NJWkUpXVtNIC8gMSAgICAgICAgXSwgCiAgICBjb25zdCBmbG9hdCBzYltjZWlsX2RpdihLLCBRVUFOVF9TSVpFKV1bY2VpbF9kaXYoTiwgUVVBTlRfU0laRSldCikgewogICAgCiAgICBjb25zdGV4cHIgaW50IFdNTUFfTSA9IDE2OyAKICAgIGNvbnN0ZXhwciBpbnQgV01NQV9OID0gMTY7IAogICAgY29uc3RleHByIGludCBXTU1BX0sgPSAzMjsgCiAgICAKICAgIAogICAgCiAgICAKICAgIGNvbnN0ZXhwciBpbnQgV0FSUF9OVU0gPSBXQVJQX00gKiBXQVJQX047IAogICAgCiAgICAKICAgIGNvbnN0ZXhwciBpbnQgRlJBR19NX1BFUl9XQVJQID0gQk0gLyBXTU1BX00gLyBXQVJQX007CiAgICBjb25zdGV4cHIgaW50IEZSQUdfTl9QRVJfV0FSUCA9IEJOIC8gV01NQV9OIC8gV0FSUF9OOwogICAgY29uc3RleHByIGludCBGUkFHX0sgPSBCSyAvIFdNTUFfSzsgCiAgICAKICAgIGNvbnN0ZXhwciBpbnQgUU0gPSBNOyAKICAgIGNvbnN0ZXhwciBpbnQgUU4gPSBjZWlsX2RpdihOLCBRVUFOVF9TSVpFKTsgCiAgICBjb25zdGV4cHIgaW50IFFLID0gY2VpbF9kaXYoSywgUVVBTlRfU0laRSk7IAogICAgY29uc3RleHByIGludCBQTSA9IEJNOyAKICAgIGNvbnN0ZXhwciBpbnQgUE4gPSBjZWlsX2RpdihCTiwgUVVBTlRfU0laRSk7IAogICAgCiAgICB1c2luZyBGcmFnQSA9IHdtbWE6OmZyYWdtZW50PHdtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBpbl9kYXRhX3R5cGUsIHdtbWE6OnJvd19tYWpvcj47CiAgICB1c2luZyBGcmFnQiA9IHdtbWE6OmZyYWdtZW50PHdtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBpbl9kYXRhX3R5cGUsIHdtbWE6OmNvbF9tYWpvcj47CiAgICB1c2luZyBGcmFnQyA9IHdtbWE6OmZyYWdtZW50PHdtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBhY2NfZGF0YV90eXBlPjsKICAgIHVzaW5nIEZyYWdPdXQgPSB3bW1hOjpmcmFnbWVudDx3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgaGFsZj47IAogICAgX19zaGFyZWRfXyBpbl9kYXRhX3R5cGUgIHNfYVtCTV1bQksgKyA4XTsKICAgIF9fc2hhcmVkX18gaW5fZGF0YV90eXBlICBzX2JbQk5dW0JLICsgOF07CiAgICBfX3NoYXJlZF9fIGFjY19kYXRhX3R5cGUgc19zW1BOXVtQTV07IAogICAgRnJhZ0MgZnJhZ19yW0ZSQUdfTV9QRVJfV0FSUF1bRlJBR19OX1BFUl9XQVJQXTsgCiAgICAKICAgIGEgPSAoZGVjbHR5cGUoYSkpKChpbl9kYXRhX3R5cGUqKWEgKyBibG9ja0lkeC56ICogSyk7CiAgICBiID0gKGRlY2x0eXBlKGIpKSgoaW5fZGF0YV90eXBlKiliICsgYmxvY2tJZHgueiAqIEspOwogICAgYyArPSBibG9ja0lkeC56ICogTTsKICAgIHNhICs9IGJsb2NrSWR4LnogKiBRSzsKICAgIHNiICs9IGJsb2NrSWR4LnogKiBRSzsKICAgIGludCB0aWQgPSB0aHJlYWRJZHgueDsgCiAgICBpbnQgd2lkID0gdGlkIC8gV0FWRV9TSVpFOyAKICAgIAogICAgY29uc3RleHByIGludCBpdGVyYXRpb25fb3Zlcl9rID0gY2VpbF9kaXYoSywgQkspOyAKICAgIGNvbnN0ZXhwciBpbnQgTE9BRF9CQVRDSF9TSVpFID0gMTY7IAogICAgY29uc3RleHByIGF1dG8gUElQRUxJTkUgPSB0cnVlOwogICAgCiAgICB1c2luZyBMb2FkVmVjID0gX19hdHRyaWJ1dGVfXyggKF9fdmVjdG9yX3NpemVfXyhMT0FEX0JBVENIX1NJWkUpICkpIGZsb2F0OwogICAgTG9hZFZlYyByZWdfYVtCSyAqIEJNIC8gQkxPQ0tfU0laRSAvIExPQURfQkFUQ0hfU0laRV07CiAgICBMb2FkVmVjIHJlZ19iW0JLICogQk4gLyBCTE9DS19TSVpFIC8gTE9BRF9CQVRDSF9TSVpFXTsKICAgIGNvbnN0ZXhwciBhdXRvIFBLID0gY2VpbF9kaXYoQkssIFFVQU5UX1NJWkUpOwogICAgZmxvYXQgcmVnX3NhW2NlaWxfZGl2KFBNLCBCTE9DS19TSVpFKV07CiAgICBmbG9hdCByZWdfc2JbY2VpbF9kaXYoUE4sIEJMT0NLX1NJWkUpXTsKICAgIAogICAgYXV0byBsb2dfdGlsZSA9IDE7CiAgICBhdXRvIGJsb2NrX2lkeF94ID0gYmxvY2tJZHgueCA+PiBsb2dfdGlsZTsKICAgIGF1dG8gYmxvY2tfaWR4X3kgPSAoYmxvY2tJZHgueSA8PCBsb2dfdGlsZSkgKyAoKGJsb2NrSWR4LngpICYgKCgxIDw8IChsb2dfdGlsZSkpIC0gMSkpOwogICAgaWYgKGJsb2NrX2lkeF94ID49IGNlaWxfZGl2KE4sIEJOKSB8fCBibG9ja19pZHhfeSA+PSBjZWlsX2RpdihNLCBCTSkpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpbnQgbSA9IGJsb2NrX2lkeF95ICogQk07CiAgICBjb25zdCBpbnQgbiA9IGJsb2NrX2lkeF94ICogQk47CiAgICBpbnQgayA9IDA7CiAgICBhdXRvIGdsb2JhbDJyZWcgPSBbJl0oKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCByZWcgPSAwOyByZWcgPCBzaXplb2YocmVnX3NhKSAvIHNpemVvZihmbG9hdCk7IHJlZysrKSB7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaW50IHQgPSB0aWQgKyByZWcgKiBCTE9DS19TSVpFOwogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaW50IGkgPSB0IC8gUE07CiAgICAgICAgICAgIGludCBqID0gdCAlIFBNOwogICAgICAgICAgICByZWdfc2FbcmVnXSA9IHNhW2sgLyBRVUFOVF9TSVpFXVsobSArIGopXTsKICAgICAgICB9CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCByZWcgPSAwOyByZWcgPCBzaXplb2YocmVnX3NiKSAvIHNpemVvZihmbG9hdCk7IHJlZysrKSB7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaW50IHQgPSB0aWQgKyByZWcgKiBCTE9DS19TSVpFOwogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaW50IGkgPSB0IC8gUE47CiAgICAgICAgICAgIGludCBqID0gdCAlIFBOOwogICAgICAgICAgICByZWdfc2JbcmVnXSA9IHNiW2sgLyBRVUFOVF9TSVpFXVsobikgLyBRVUFOVF9TSVpFICsgal07CiAgICAgICAgfQogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgcmVnID0gMDsgcmVnIDwgc2l6ZW9mKHJlZ19hKSAvIHNpemVvZihMb2FkVmVjKTsgcmVnKyspIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBpbnQgdCA9IHRpZCAqIExPQURfQkFUQ0hfU0laRSArIHJlZyAqIEJMT0NLX1NJWkUgKiBMT0FEX0JBVENIX1NJWkU7CiAgICAgICAgICAgIGludCBpID0gdCAvIEJLOwogICAgICAgICAgICBpbnQgaiA9IHQgJSBCSzsKICAgICAgICAgICAgcmVnX2FbcmVnXSA9ICooTG9hZFZlYyopJmFbbSArIGldW2sgKyBqXTsKICAgICAgICB9CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCByZWcgPSAwOyByZWcgPCBzaXplb2YocmVnX2IpIC8gc2l6ZW9mKExvYWRWZWMpOyByZWcrKykgewogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIGludCB0ID0gdGlkICogTE9BRF9CQVRDSF9TSVpFICsgcmVnICogQkxPQ0tfU0laRSAqIExPQURfQkFUQ0hfU0laRTsKICAgICAgICAgICAgaW50IGkgPSB0IC8gQks7CiAgICAgICAgICAgIGludCBqID0gdCAlIEJLOwogICAgICAgICAgICByZWdfYltyZWddID0gKihMb2FkVmVjKikmYltuICsgaV1bayArIGpdOwogICAgICAgIH0KICAgIH07CiAgICBhdXRvIHJlZzJsZHMgPSBbJl0oKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCByZWdhID0gMDsgcmVnYSA8IHNpemVvZihyZWdfc2EpIC8gc2l6ZW9mKGZsb2F0KTsgcmVnYSsrKSB7CiAgICAgICAgICAgIGludCB0YSA9IHRpZCArIHJlZ2EgKiBCTE9DS19TSVpFOwogICAgICAgICAgICBpbnQgaiA9IHRhICUgUE07CiAgICAgICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgICAgIGZvciAoaW50IHJlZ2IgPSAwOyByZWdiIDwgc2l6ZW9mKHJlZ19zYikgLyBzaXplb2YoZmxvYXQpOyByZWdiKyspIHsKICAgICAgICAgICAgICAgIGludCB0YiA9IHRpZCArIHJlZ2IgKiBCTE9DS19TSVpFOwogICAgICAgICAgICAgICAgaW50IGkgPSB0YiAlIFBOOwogICAgICAgICAgICAgICAgc19zW2ldW2pdID0gcmVnX3NhW3JlZ2FdICogcmVnX3NiW3JlZ2JdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgcmVnID0gMDsgcmVnIDwgc2l6ZW9mKHJlZ19hKSAvIHNpemVvZihMb2FkVmVjKTsgcmVnKyspIHsKICAgICAgICAgICAgaW50IHQgPSB0aWQgKiBMT0FEX0JBVENIX1NJWkUgKyByZWcgKiBCTE9DS19TSVpFICogTE9BRF9CQVRDSF9TSVpFOwogICAgICAgICAgICBpbnQgaSA9IHQgLyBCSzsKICAgICAgICAgICAgaW50IGogPSB0ICUgQks7CiAgICAgICAgICAgICooTG9hZFZlYyopJnNfYVtpXVtqXSA9IHJlZ19hW3JlZ107CiAgICAgICAgfQogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgcmVnID0gMDsgcmVnIDwgc2l6ZW9mKHJlZ19iKSAvIHNpemVvZihMb2FkVmVjKTsgcmVnKyspIHsKICAgICAgICAgICAgaW50IHQgPSB0aWQgKiBMT0FEX0JBVENIX1NJWkUgKyByZWcgKiBCTE9DS19TSVpFICogTE9BRF9CQVRDSF9TSVpFOwogICAgICAgICAgICBpbnQgaSA9IHQgLyBCSzsKICAgICAgICAgICAgaW50IGogPSB0ICUgQks7CiAgICAgICAgICAgICooTG9hZFZlYyopJnNfYltpXVtqXSA9IHJlZ19iW3JlZ107CiAgICAgICAgfQogICAgfTsKICAgIGlmIGNvbnN0ZXhwciAoUElQRUxJTkUpIHsKICAgICAgICBnbG9iYWwycmVnKCk7CiAgICB9CiAgICAKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEZSQUdfTV9QRVJfV0FSUDsgaSsrKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEZSQUdfTl9QRVJfV0FSUDsgaisrKSB7CiAgICAgICAgICAgIHdtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19yW2ldW2pdLCAwLjBmKTsgCiAgICAgICAgfQogICAgfQogICAgaWYgY29uc3RleHByICghUElQRUxJTkUpIHsKICAgICAgICBnbG9iYWwycmVnKCk7CiAgICB9CiAgICByZWcybGRzKCk7CiAgICBmb3IgKGludCBiayA9IDE7IGJrIDwgaXRlcmF0aW9uX292ZXJfazsgYmsrKykgewogICAgICAgIGsgPSBiayAqIEJLOwogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIGlmIGNvbnN0ZXhwciAoUElQRUxJTkUpIHsKICAgICAgICAgICAgZ2xvYmFsMnJlZygpOwogICAgICAgIH0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAgICAgCiAgICAgICAgd21tYV9jb21wdXRlPGluX2RhdGFfdHlwZSwgYWNjX2RhdGFfdHlwZSwgRnJhZ0MsIEZyYWdBLCBGcmFnQiwKICAgICAgICAgICAgUE0sIFBOLCBCTSwgQk4sIEJLLCBGUkFHX01fUEVSX1dBUlAsIEZSQUdfTl9QRVJfV0FSUCwgRlJBR19LLAogICAgICAgICAgICBXTU1BX00sIFdNTUFfTiwgV01NQV9LLAogICAgICAgICAgICBXQVJQX00sIFdBUlBfTiwKICAgICAgICAgICAgQkxPQ0tfU0laRSwgTE9BRF9CQVRDSF9TSVpFLCBRVUFOVF9TSVpFPiggCiAgICAgICAgICAgICAgICBzX2EsIHNfYiwgc19zLCBmcmFnX3IsIHdpZCAvIFdBUlBfTiwgd2lkICUgV0FSUF9OKTsKICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAgICAgaWYgY29uc3RleHByICghUElQRUxJTkUpIHsKICAgICAgICAgICAgZ2xvYmFsMnJlZygpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZWcybGRzKCk7CiAgICB9CiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB3bW1hX2NvbXB1dGU8aW5fZGF0YV90eXBlLCBhY2NfZGF0YV90eXBlLCBGcmFnQywgRnJhZ0EsIEZyYWdCLAogICAgICAgIFBNLCBQTiwgQk0sIEJOLCBCSywgRlJBR19NX1BFUl9XQVJQLCBGUkFHX05fUEVSX1dBUlAsIEZSQUdfSywKICAgICAgICBXTU1BX00sIFdNTUFfTiwgV01NQV9LLAogICAgICAgIFdBUlBfTSwgV0FSUF9OLAogICAgICAgIEJMT0NLX1NJWkUsIExPQURfQkFUQ0hfU0laRSwgUVVBTlRfU0laRT4oIAogICAgICAgICAgICBzX2EsIHNfYiwgc19zLCBmcmFnX3IsIHdpZCAvIFdBUlBfTiwgd2lkICUgV0FSUF9OKTsKICAgIAogICAgc3RvcmVfcmVzdWx0PGFjY19kYXRhX3R5cGUsIG91dF9kYXRhX3R5cGUsIEZyYWdDLCBGcmFnT3V0LAogICAgICAgIFdNTUFfTSwgV01NQV9OLCBCTSwgQk4sIE0sIE4sIEZSQUdfTV9QRVJfV0FSUCwgRlJBR19OX1BFUl9XQVJQPigKICAgICAgICAgICAgYywgZnJhZ19yLCBibG9ja19pZHhfeSAqIEJNLCBibG9ja19pZHhfeCAqIEJOLAogICAgICAgICAgICB3aWQgLyBXQVJQX04sIHdpZCAlIFdBUlBfTik7Cn07Cn07IAojaWZuZGVmICBQQVJBTUVURVJJWkVfTElCUkFSWQoKI2VuZGlmCiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKI2VuZGlmCiNkZWZpbmUgUEFSQU1FVEVSSVpFX0xJQlJBUlkKI3VuZGVmIFBBUkFNRVRFUklaRV9MSUJSQVJZCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmZsb2F0ICpjX3NwbGl0a3tudWxscHRyfTsKc2l6ZV90IGNfc3BsaXRrX3NpemV7MH07Cl9fRlA4X1RZUEUgKmFfdHJhbnN7bnVsbHB0cn07CnNpemVfdCBhX3RyYW5zX3NpemV7MH07Cl9fRlA4X1RZUEUgKmJfdHJhbnN7bnVsbHB0cn07CnNpemVfdCBiX3RyYW5zX3NpemV7MH07CnRlbXBsYXRlIDxpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgQk0sIGludCBCTiwgaW50IEJLLCBpbnQgV0FSUF9NLCBpbnQgV0FSUF9OLCBpbnQgQkxPQ0tfU0laRSwgaW50IFFVQU5UX0JMT0NLX1NJWkUsIGludCBTUExJVEtfRkFDVE9SPgp2b2lkIGxhdW5jaF9nZW1tKGNvbnN0IF9fRlA4X1RZUEUgKmEsIGNvbnN0IF9fRlA4X1RZUEUgKmIsIF9fQkYxNl9UWVBFICpjLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicykgewogICAgaWYoYV90cmFuc19zaXplIDwgTSAqIEsgKiBzaXplb2YoX19GUDhfVFlQRSkpIHsKICAgICAgICBhX3RyYW5zX3NpemUgPSBzdGQ6Om1heCg2MTQ0KjcxNjgsIE0gKiBLKSAqIHNpemVvZihfX0ZQOF9UWVBFKTsKICAgICAgICAKICAgICAgICBpZiAoYV90cmFucykgewogICAgICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRnJlZUFzeW5jKShhX3RyYW5zLCAwKSk7CiAgICAgICAgfQogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShNYWxsb2NBc3luYykoJmFfdHJhbnMsIGFfdHJhbnNfc2l6ZSwgMCkpOwogICAgfQogICAgaWYoYl90cmFuc19zaXplIDwgTiAqIEsgKiBzaXplb2YoX19GUDhfVFlQRSkpIHsKICAgICAgICBiX3RyYW5zX3NpemUgPSBzdGQ6Om1heCg3MTY4KjQ2MDgsIE4gKiBLKSAqIHNpemVvZihfX0ZQOF9UWVBFKTsKICAgICAgICAKICAgICAgICBpZiAoYl90cmFucykgewogICAgICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRnJlZUFzeW5jKShiX3RyYW5zLCAwKSk7CiAgICAgICAgfQogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShNYWxsb2NBc3luYykoJmJfdHJhbnMsIGJfdHJhbnNfc2l6ZSwgMCkpOwogICAgfQogICAgZ2VtbV9rZXJuZWw6OmxhdW5jaF90cmFuc3Bvc2U8X19GUDhfVFlQRSwgSywgTSwgNjQsIDUxMiwgND4oYV90cmFucywgYSk7CiAgICBnZW1tX2tlcm5lbDo6bGF1bmNoX3RyYW5zcG9zZTxfX0ZQOF9UWVBFLCBLLCBOLCA2NCwgNTEyLCA0PihiX3RyYW5zLCBiKTsKICAgIAogICAgCiAgICBkaW0zIGdyaWQoY2VpbF9kaXYoTiwgQk4pIDw8IDEsIGNlaWxfZGl2KE0sIEJNKSA+PiAxLCBTUExJVEtfRkFDVE9SKTsKICAgIGRpbTMgYmxvY2soQkxPQ0tfU0laRSk7CiAgICBpZiBjb25zdGV4cHIgKFNQTElUS19GQUNUT1IgPT0gMSkgewogICAgICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDxfX0ZQOF9UWVBFLCBmbG9hdCwgX19CRjE2X1RZUEUsIE0sIE4sIEssIEJNLCBCTiwgQkssIFFVQU5UX0JMT0NLX1NJWkUsIEJMT0NLX1NJWkUsIFdBUlBfTSwgV0FSUF9OLCBLLCBLPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8PGdyaWQsIGJsb2NrPj4+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICgqKVtLXT4oYV90cmFucyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fRlA4X1RZUEUgKCopW0tdPihiX3RyYW5zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8X19CRjE2X1RZUEUgKCopW05dPihjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKCopW01dPihhcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICgqKVtjZWlsX2RpdihOLCBRVUFOVF9CTE9DS19TSVpFKV0+KGJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIGlmKGNfc3BsaXRrX3NpemUgPCBTUExJVEtfRkFDVE9SICogTSAqIE4gKiBzaXplb2YoZmxvYXQpKSB7CiAgICAgICAgICAgIGNfc3BsaXRrX3NpemUgPSBzdGQ6Om1heCgxMDI0KjQ2MDgqMiwgU1BMSVRLX0ZBQ1RPUiAqIE0gKiBOKSAqIHNpemVvZihmbG9hdCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY19zcGxpdGspIHsKICAgICAgICAgICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShGcmVlQXN5bmMpKGNfc3BsaXRrLCAwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKE1hbGxvY0FzeW5jKSgmY19zcGxpdGssIGNfc3BsaXRrX3NpemUsIDApKTsKICAgICAgICB9CiAgICAgICAgZ2VtbV9rZXJuZWw6OmdlbW1fa2VybmVsPF9fRlA4X1RZUEUsIGZsb2F0LCBmbG9hdCwgTSwgTiwgSyAvIFNQTElUS19GQUNUT1IsIEJNLCBCTiwgQkssIFFVQU5UX0JMT0NLX1NJWkUsIEJMT0NLX1NJWkUsIFdBUlBfTSwgV0FSUF9OLCBLLCBLPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8PGdyaWQsIGJsb2NrPj4+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICgqKVtLXT4oYV90cmFucyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fRlA4X1RZUEUgKCopW0tdPihiX3RyYW5zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKCopW05dPihjX3NwbGl0ayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICgqKVtNXT4oYXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAoKilbY2VpbF9kaXYoTiwgUVVBTlRfQkxPQ0tfU0laRSldPihicykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBSRURVQ0VfQkxPQ0sgPSAyNTY7CiAgICAgICAgZ2VtbV9rZXJuZWw6OnJlZHVjZTxTUExJVEtfRkFDVE9SPjw8PGNlaWxfZGl2KE0gKiBOIC8gNCwgUkVEVUNFX0JMT0NLKSwgUkVEVUNFX0JMT0NLPj4+KE0sIE4sIGNfc3BsaXRrLCAoX19CRjE2X1RZUEUgKiljKTsKICAgIH0KfQpjb25zdGV4cHIgaW5saW5lIHVpbnQzMl90IHBhY2tfc2hhcGUoaW50IG0sIGludCBuLCBpbnQgaykgewogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIHJldHVybiAoKG0gLyAzMikgPDwgMTYpIHwgKChuIC8gMzIpIDw8IDgpIHwgKGsgLyAzMik7Cn0KI2RlZmluZSBESVNQQVRDSF9HRU1NKE0sIE4sIEssIEJNLCBCTiwgQkssIFdBUlBfTSwgV0FSUF9OLCBCTE9DS19TSVpFLCBTUExJVEtfRkFDVE9SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHBhY2tfc2hhcGVfY2hlY2tlZDxNLCBOLCBLPigpOiB7ICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaF9nZW1tPE0sIE4sIEssIEJNLCBCTiwgQkssIFdBUlBfTSwgV0FSUF9OLCBCTE9DS19TSVpFLCAxMjgsIFNQTElUS19GQUNUT1I+KGFfcHRyLCBiX3B0ciwgY19wdHIsIGFzX3B0ciwgYnNfcHRyKTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KdGVtcGxhdGUgPGludCBNLCBpbnQgTiwgaW50IEs+CmNvbnN0ZXhwciBpbmxpbmUgdWludDMyX3QgcGFja19zaGFwZV9jaGVja2VkKCkgewogICAgcmV0dXJuIHBhY2tfc2hhcGUoTSwgTiwgSyk7Cn0KY2xhc3MgS2VybmVsVGltZXIgewpwcml2YXRlOgogICAgaW50IG0sIG4sIGs7CiAgICBIT1NUX1RZUEUoRXZlbnRfdCkgc3RhcnQsIHN0b3A7CiAgICBmbG9hdCAqdGltZV9wdHI7CiAgICBmbG9hdCAqZ2Zsb3BzX3B0cjsKcHVibGljOgogICAgS2VybmVsVGltZXIoaW50IG0sIGludCBuLCBpbnQgaywgZmxvYXQgKnRpbWUsIGZsb2F0ICpnZmxvcHMpIDogbShtKSwgbihuKSwgayhrKSwgdGltZV9wdHIodGltZSksIGdmbG9wc19wdHIoZ2Zsb3BzKSB7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50Q3JlYXRlKSgmc3RhcnQpKTsKICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRXZlbnRDcmVhdGUpKCZzdG9wKSk7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50UmVjb3JkKShzdGFydCkpOwogICAgfQogICAgdm9pZCBzdGFydF90aW1lcigpIHsgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50UmVjb3JkKShzdGFydCkpOyB9CiAgICB2b2lkIHN0b3BfdGltZXIoKSB7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50UmVjb3JkKShzdG9wKSk7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50U3luY2hyb25pemUpKHN0b3ApKTsKICAgICAgICBmbG9hdCBlbGFwc2VkX3RpbWU7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50RWxhcHNlZFRpbWUpKCZlbGFwc2VkX3RpbWUsIHN0YXJ0LCBzdG9wKSk7CiAgICAgICAgZG91YmxlIGZsb3BzID0gMi4wICogc3RhdGljX2Nhc3Q8ZG91YmxlPihtKSAqIHN0YXRpY19jYXN0PGRvdWJsZT4obikgKiBzdGF0aWNfY2FzdDxkb3VibGU+KGspOwogICAgICAgIGRvdWJsZSBnZmxvcHNfdmFsID0gKGZsb3BzIC8gKGVsYXBzZWRfdGltZSAqIDFlLTMpKSAvIDFlOTsKICAgICAgICAKICAgICAgICBpZiAodGltZV9wdHIgIT0gbnVsbHB0cikgewogICAgICAgICAgICAqdGltZV9wdHIgPSBlbGFwc2VkX3RpbWU7CiAgICAgICAgfQogICAgICAgIGlmIChnZmxvcHNfcHRyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgKmdmbG9wc19wdHIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZ2Zsb3BzX3ZhbCk7CiAgICAgICAgfQogICAgfQogICAgfktlcm5lbFRpbWVyKCkgewogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudERlc3Ryb3kpKHN0YXJ0KSk7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50RGVzdHJveSkoc3RvcCkpOwogICAgfQp9Owp2b2lkIHJ1bih2b2lkICphLCB2b2lkICpiLCB2b2lkICphcywgdm9pZCAqYnMsIHZvaWQgKmMsIGludCBtLCBpbnQgbiwgaW50IGssIGZsb2F0ICp0aW1lLCBmbG9hdCAqZ2Zsb3BzKSB7CiAgICAKICAgIAogICAgY29uc3QgX19GUDhfVFlQRSAqYV9wdHIgPSBzdGF0aWNfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICo+KGEpOwogICAgY29uc3QgX19GUDhfVFlQRSAqYl9wdHIgPSBzdGF0aWNfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICo+KGIpOwogICAgX19CRjE2X1RZUEUgKmNfcHRyID0gc3RhdGljX2Nhc3Q8X19CRjE2X1RZUEUgKj4oYyk7CiAgICBjb25zdCBmbG9hdCAqYXNfcHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4oYXMpOwogICAgY29uc3QgZmxvYXQgKmJzX3B0ciA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KGJzKTsKICAgIHN3aXRjaChwYWNrX3NoYXBlKG0sIG4sIGspKSB7CiNpZmRlZiBURVNUX09OX1JETkE0IAogICAgICAgIAogICAgICAgIERJU1BBVENIX0dFTU0oNjQsICAgICA2NCwgICAgIDEyOCwgICAgNjQsICAgIDY0LCAgICAzMiwgICAxLCAgICAgIDQsICAgICAgMTI4LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDY0LCAgICAgMTUzNiwgICA3MTY4LCAgIDY0LCAgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDMwNzIsICAgMTUzNiwgICA2NCwgICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjQsICAgICA1NzYsICAgIDcxNjgsICAgNjQsICAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDk2LCAgICAgNzE2OCwgICAyNTYsICAgIDk2LCAgICAyNTYsICAgNjQsICAgMiwgICAgICA0LCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg5NiwgICAgIDcxNjgsICAgMjA0OCwgICA5NiwgICAgMjU2LCAgIDY0LCAgIDIsICAgICAgNCwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oOTYsICAgICA0NjA4LCAgIDcxNjgsICAgOTYsICAgIDI1NiwgICA2NCwgICAyLCAgICAgIDQsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEyOCwgICAgNzE2OCwgICAyMzA0LCAgIDEyOCwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMjgsICAgIDUxMiwgICAgNzE2OCwgICAxMjgsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNTEyLCAgICA0MDk2LCAgIDUxMiwgICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDUxMiwgICAgMTUzNiwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDE1MzYsICAgNzE2OCwgICAgMTI4LCAgICAxMjgsICAgICA2NCwgICAgICAxLCAgICAgIDQsICAgIDEyOCwgICAgIDQpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgMzA3MiwgICAxNTM2LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICAgNTc2LCAgIDcxNjgsICAgIDEyOCwgICAgIDY0LCAgICAgMzIsICAgICAgNCwgICAgICAxLCAgICAxMjgsICAgICA0KTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDcxNjgsICAgIDI1NiwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAyMDQ4LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA0NjA4LCAgIDcxNjgsICAgIDEyOCwgICAgMTI4LCAgICAgMzIsICAgICAgMiwgICAgICAyLCAgICAxMjgsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDcxNjgsICAgMjMwNCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgIDUxMiwgICA3MTY4LCAgICAgNjQsICAgIDEyOCwgICAgIDMyLCAgICAgIDIsICAgICAgMiwgICAgMTI4LCAgICAgNCk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA0MDk2LCAgICA1MTIsICAgIDEyOCwgICAgMjU2LCAgICAgMzIsICAgICAgMiwgICAgICA0LCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDE1MzYsICAgNzE2OCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgMzA3MiwgICAxNTM2LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICAgNTc2LCAgIDcxNjgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDcxNjgsICAgIDI1NiwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAyMDQ4LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA0NjA4LCAgIDcxNjgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDcxNjgsICAgMjMwNCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgIDUxMiwgICA3MTY4LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA0MDk2LCAgICA1MTIsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiNlbHNlIAogICAgICAgIAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICAxNTM2LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgNCk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDMwNzIsICAgMTUzNiwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAyKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNTc2LCAgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDgpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA3MTY4LCAgIDI1NiwgICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDcxNjgsICAgMjA0OCwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNDYwOCwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDIpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA3MTY4LCAgIDIzMDQsICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDUxMiwgICAgNzE2OCwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICA4KTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNDA5NiwgICA1MTIsICAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICAxNTM2LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDMwNzIsICAgMTUzNiwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNTc2LCAgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDIpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA3MTY4LCAgIDI1NiwgICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDcxNjgsICAgMjA0OCwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNDYwOCwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA3MTY4LCAgIDIzMDQsICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDUxMiwgICAgNzE2OCwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAyKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNDA5NiwgICA1MTIsICAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwojZW5kaWYKICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgfQogICAgfQp9CnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpIHsKICAgIGludCBtID0gYS5zaXplKDApOwogICAgaW50IG4gPSBiLnNpemUoMCk7CiAgICBpbnQgayA9IGEuc2l6ZSgxKTsKICAgIHJ1bigoX19GUDhfVFlQRSopYS5kYXRhX3B0cigpLCAoX19GUDhfVFlQRSopYi5kYXRhX3B0cigpLCAKICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKF9fQkYxNl9UWVBFKiljLmRhdGFfcHRyKCksIG0sIG4sIGssIG51bGxwdHIsIG51bGxwdHIpOwogICAgCn0KIiIiCmltcG9ydCBvcwpvcy5lbnZpcm9uWyJQWVRPUkNIX1JPQ01fQVJDSCJdID0gImdmeDk0MiIKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSdmcDhfbW0nLAogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwKICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLAogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIl0sCiAgICBleHRyYV9jZmxhZ3M9WyItT2Zhc3QiXSwKKQoKaW1wb3J0IHRvcmNoCmRlZiByZWZfa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIGEgPSBhLmNvbnRpZ3VvdXMoKQogICAgYV9zY2FsZSA9IGFfc2NhbGUuY29udGlndW91cygpCiAgICBiX3NjYWxlID0gYl9zY2FsZS5jb250aWd1b3VzKCkKCiAgICBtID0gYS5zaGFwZVswXQogICAgbiA9IGIuc2hhcGVbMF0KICAgIGsgPSBhLnNoYXBlWzFdCiAgICBibG9ja19zaGFwZV9uID0gMTI4CiAgICBibG9ja19zaGFwZV9rID0gMTI4CiAgICBzY2FsZV9uID0gYl9zY2FsZS5zaGFwZVswXQogICAgc2NhbGVfayA9IGJfc2NhbGUuc2hhcGVbMV0KCiAgICBhX3NjYWxlID0gYV9zY2FsZS51bnNxdWVlemUoLTEpLnJlcGVhdCgxLCAxLCBibG9ja19zaGFwZV9rKQogICAgYV9zY2FsZSA9IGFfc2NhbGUucmVzaGFwZShtLCBzY2FsZV9rICogYmxvY2tfc2hhcGVfaykgCiAgICBhX3NjYWxlID0gYV9zY2FsZVs6LCA6a10KCiAgICBhID0gYS50byhhX3NjYWxlLmR0eXBlKSAqIGFfc2NhbGUKICAgIGJfc2NhbGUgPSAoCiAgICAgICAgYl9zY2FsZS52aWV3KC0xLCAxKQogICAgICAgIC5yZXBlYXQoMSwgYmxvY2tfc2hhcGVfbiAqIGJsb2NrX3NoYXBlX2spCiAgICAgICAgLnZpZXcoc2NhbGVfbiwgc2NhbGVfaywgYmxvY2tfc2hhcGVfbiwgYmxvY2tfc2hhcGVfaykKICAgICAgICAucGVybXV0ZSgwLCAyLCAxLCAzKQogICAgICAgIC5yZXNoYXBlKHNjYWxlX24gKiBibG9ja19zaGFwZV9uLCBzY2FsZV9rICogYmxvY2tfc2hhcGVfaykKICAgICkKICAgIGJfc2NhbGUgPSBiX3NjYWxlWzpuLCA6a10KCiAgICBiID0gYi50byhiX3NjYWxlLmR0eXBlKSAqIGJfc2NhbGUgCgogICAgY1suLi5dID0gKGEgQCBiLlQpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgcmV0dXJuIGMKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCiAgICBpZiBhLnNoYXBlWzBdIDwgMTAyNDoKICAgICAgICByZXR1cm4gcmVmX2tlcm5lbChkYXRhKQogICAgbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQogICAgcmV0dXJuIGMKSource 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 19191.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkICBhbWQtZnA4LW1tCiMgVGhpcyBzY3JpcHQgcHJvdmlkZXMgYSB0ZW1wbGF0ZSBmb3IgdXNpbmcgbG9hZF9pbmxpbmUgdG8gcnVuIGEgSElQIGtlcm5lbCBmb3IKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CkNQUF9XUkFQUEVSID0gIiIiCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOwoiIiIKQ1VEQV9TUkMgPSAiIiIKI3ByYWdtYSBvbmNlCiNpbmNsdWRlIDxzdGRpby5oPiAgICAgICAgIAojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNkZWZpbmUgUEFSQU1FVEVSSVpFX0xJQlJBUlkKI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfY29vcGVyYXRpdmVfZ3JvdXBzLmg+CiNpbmNsdWRlIDxyb2N3bW1hL3JvY3dtbWEuaHBwPgpuYW1lc3BhY2Ugd21tYSA9IHJvY3dtbWE7CiNpZmRlZiBURVNUX09OX0NVREEKbmFtZXNwYWNlIHdtbWEgPSBudmN1ZGE6OndtbWE7CiNkZWZpbmUgTElCX0NBTEwoY2FsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VkYUVycm9yX3QgZXJyID0gY2FsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gY3VkYVN1Y2Nlc3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQojZGVmaW5lIEhPU1RfVFlQRSh4KSBjdWRhIyN4CiNlbHNlCiNpZm5kZWYgSElQX0hFQURFUlNfXwojZGVmaW5lIEhJUF9IRUFERVJTX18KI2VuZGlmCm5hbWVzcGFjZSB3bW1hID0gcm9jd21tYTsKI2RlZmluZSBMSUJfQ0FMTChjYWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXBFcnJvcl90IGVyciA9IGNhbGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBoaXBTdWNjZXNzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCiNkZWZpbmUgSE9TVF9UWVBFKHgpIGhpcCMjeAojZW5kaWYKI3ByYWdtYSBvbmNlCiNpZmRlZiBURVNUX09OX0NVREEKI2RlZmluZSBfX0ZQOF9UWVBFIF9fbnZfZnA4X2U0bTMKI2RlZmluZSBfX0ZQOHg0X1RZUEUgX19udl9mcDh4NF9lNG0zCiNkZWZpbmUgX19CRjE2X1RZUEUgX19udl9iZmxvYXQxNgojZGVmaW5lIF9fQkYxNngyX1RZUEUgX19udl9iZmxvYXQxNjIKI2Vsc2UKI2lmZGVmIFRFU1RfT05fUkROQTQKI2RlZmluZSBfX0ZQOF9UWVBFIF9faGlwX2ZwOF9lNG0zCiNkZWZpbmUgX19GUDh4NF9UWVBFIF9faGlwX2ZwOHg0X2U0bTMKY29uc3RleHByIGNvbnN0IGlubGluZSBpbnQgV0FWRV9TSVpFID0gMzI7CiNlbHNlCiNkZWZpbmUgX19GUDhfVFlQRSBfX2hpcF9mcDhfZTRtM19mbnV6CiNkZWZpbmUgX19GUDh4NF9UWVBFIF9faGlwX2ZwOHg0X2U0bTNfZm51egpjb25zdGV4cHIgY29uc3QgaW5saW5lIGludCBXQVZFX1NJWkUgPSA2NDsKI2VuZGlmCiNkZWZpbmUgX19CRjE2X1RZUEUgX19oaXBfYmZsb2F0MTYKI2RlZmluZSBfX0JGMTZ4Ml9UWVBFIF9faGlwX2JmbG9hdDE2MgojZGVmaW5lIF9fRlAxNl9UWVBFIF9faGFsZgojZGVmaW5lIF9fSU5UMTZfVFlQRSBpbnQxNl90CiNlbmRpZgojZGVmaW5lIF9fRlAzMl9UWVBFIGZsb2F0CiNpZm5kZWYgR0VNTV9LRVJORUwKI2RlZmluZSBHRU1NX0tFUk5FTAojcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAp0ZW1wbGF0ZSA8aW50IHgsIGludCB5PiAKY29uc3RleHByIF9fZGV2aWNlX18gX19ob3N0X18gaW5saW5lIGludCBleGFjdF9kaXYoKSB7CiAgICBzdGF0aWNfYXNzZXJ0KHggJSB5ID09IDApOwogICAgc3RhdGljX2Fzc2VydCh4ID49IHkpOwogICAgcmV0dXJuIHggLyB5OwogIH0KICAKY29uc3RleHByIF9fZGV2aWNlX18gX19ob3N0X18gaW5saW5lIGludCBjZWlsX2RpdihpbnQgeCwgaW50IHkpIHsgCiAgICByZXR1cm4gKHggKyB5IC0gMSkgLyB5Owp9CiAgCm5hbWVzcGFjZSBnZW1tX2tlcm5lbCB7CnRlbXBsYXRlIDx0eXBlbmFtZSBkYXRhX3R5cGUsIGludCBCQVRDSF9TSVpFPiAKX19kZXZpY2VfXyBpbmxpbmUgdm9pZCByZWFkX2JhdGNoKGRhdGFfdHlwZSAqZHN0LCBjb25zdCBkYXRhX3R5cGUgKnNyYykgewogICAgaWYgY29uc3RleHByICgoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFKSA9PSAyICogc2l6ZW9mKHVsb25nNCkpIHsKICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWxvbmc0ICo+KGRzdCkgKyAwKSA9ICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bG9uZzQgKj4oc3JjKSArIDApOwogICAgICAgICoocmVpbnRlcnByZXRfY2FzdDx1bG9uZzQgKj4oZHN0KSArIDEpID0gKihyZWludGVycHJldF9jYXN0PGNvbnN0IHVsb25nNCAqPihzcmMpICsgMSk7CiAgICB9IGVsc2UgaWYgY29uc3RleHByICgoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFKSA9PSBzaXplb2YodWxvbmc0KSkgewogICAgICAgICpyZWludGVycHJldF9jYXN0PHVsb25nNCAqPihkc3QpID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWxvbmc0ICo+KHNyYyk7CiAgICB9IGVsc2UgaWYgY29uc3RleHByIChzaXplb2YoZGF0YV90eXBlKSAqIEJBVENIX1NJWkUgPT0gc2l6ZW9mKHVsb25nMikpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bG9uZzIgKj4oZHN0KSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVsb25nMiAqPihzcmMpOwogICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFID09IHNpemVvZih1bG9uZzEpKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWxvbmcxICo+KGRzdCkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bG9uZzEgKj4oc3JjKTsKICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKHNpemVvZihkYXRhX3R5cGUpICogQkFUQ0hfU0laRSA9PSBzaXplb2YodWludDEpKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDEgKj4oZHN0KSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxICo+KHNyYyk7CiAgICB9IGVsc2UgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBCQVRDSF9TSVpFOyArK2IpIHsKICAgICAgICAgICAgZHN0W2JdID0gc3JjW2JdOwogICAgICAgIH0KICAgIH0KfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgZGF0YV90eXBlLCBpbnQgQkFUQ0hfU0laRT4gCl9fZGV2aWNlX18gaW5saW5lIHZvaWQgemVyb19iYXRjaChkYXRhX3R5cGUgKmRzdCkgewogICAgaWYgY29uc3RleHByICgoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFKSA9PSBzaXplb2YodWxvbmc0KSkgewogICAgICAgICpyZWludGVycHJldF9jYXN0PHVsb25nNCAqPihkc3QpID0gdWxvbmc0e307CiAgICB9IGVsc2UgaWYgY29uc3RleHByIChzaXplb2YoZGF0YV90eXBlKSAqIEJBVENIX1NJWkUgPT0gc2l6ZW9mKHVsb25nMikpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bG9uZzIgKj4oZHN0KSA9IHVsb25nMnt9OwogICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFID09IHNpemVvZih1bG9uZzEpKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWxvbmcxICo+KGRzdCkgPSB1bG9uZzF7fTsKICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKHNpemVvZihkYXRhX3R5cGUpICogQkFUQ0hfU0laRSA9PSBzaXplb2YodWludDEpKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludCAqPihkc3QpID0gdWludHt9OwogICAgfSBlbHNlIHsKICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgQkFUQ0hfU0laRTsgKytiKSB7CiAgICAgICAgICAgIGRzdFtiXSA9IDA7CiAgICAgICAgfQogICAgfQp9CnRlbXBsYXRlIDx0eXBlbmFtZSBkYXRhX3R5cGUsIGludCBEU1RfWSwgaW50IERTVF9YLCBpbnQgU1JDX1ksIGludCBTUkNfWCwgaW50IEJMT0NLX0RJTSwgaW50IEJBVENIX1NJWkU+Cl9fZGV2aWNlX18gaW5saW5lIHZvaWQgbG9hZF9pbnB1dChkYXRhX3R5cGUgZHN0W0RTVF9ZXVtEU1RfWF0sIGNvbnN0IGRhdGFfdHlwZSBzcmNbU1JDX1ldW1NSQ19YXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmVnaW5feCwgY29uc3QgaW50IGJlZ2luX3kpIHsKICBzdGF0aWNfYXNzZXJ0KEJBVENIX1NJWkUgPiAwKTsKICAKICBzdGF0aWNfYXNzZXJ0KChTUkNfWCAlIEJBVENIX1NJWkUgPT0gMCkgJiYgKFNSQ19ZICUgQkFUQ0hfU0laRSA9PSAwKSk7CiAgc3RhdGljX2Fzc2VydCgoRFNUX1ggJSBCQVRDSF9TSVpFID09IDApICYmIChEU1RfWSAlIEJBVENIX1NJWkUgPT0gMCkpOwogIHN0YXRpY19hc3NlcnQoQkFUQ0hfU0laRSA8PSBEU1RfWCAmJiBEU1RfWCAlIEJBVENIX1NJWkUgPT0gMCk7CiAgY29uc3QgaW50IGJlZ2luX2lkeCA9IHRocmVhZElkeC54ICogQkFUQ0hfU0laRTsKICBjb25zdCBjb25zdGV4cHIgaW50IHRvdGFsX2VsZW1lbnRzID0gRFNUX1ggKiBEU1RfWTsKICBjb25zdCBjb25zdGV4cHIgaW50IGVsZW1lbnRzX3Blcl9zdGVwID0gQkxPQ0tfRElNICogQkFUQ0hfU0laRTsKICAKICAjcHJhZ21hIHVucm9sbAogIGZvciAoaW50IGsgPSBiZWdpbl9pZHg7IGsgPCB0b3RhbF9lbGVtZW50czsgayArPSBlbGVtZW50c19wZXJfc3RlcCkgewogICAgaW50IGxfa3ggPSBrICUgRFNUX1g7CiAgICBpbnQgbF9reSA9IGsgLyBEU1RfWDsKICAgIGludCBnX2t4ID0gbF9reCArIGJlZ2luX3g7CiAgICBpbnQgZ19reSA9IGxfa3kgKyBiZWdpbl95OwogICAgYXV0byAqZHN0X2ZsYXR0ZW4gPSAmZHN0W2xfa3ldW2xfa3hdOwogICAgCiAgICAKICAgIGlmICgoKFNSQ19YICUgRFNUX1ggPT0gMCkgfHwgKGdfa3ggPCBTUkNfWCkpICYmICgoU1JDX1kgJSBEU1RfWSA9PSAwKSB8fCAoZ19reSA8IFNSQ19ZKSkpIHsKICAgICAgY29uc3QgYXV0byAqc3JjX2ZsYXR0ZW4gPSAmc3JjW2dfa3ldW2dfa3hdOwogICAgICByZWFkX2JhdGNoPGRhdGFfdHlwZSwgQkFUQ0hfU0laRT4oZHN0X2ZsYXR0ZW4sIHNyY19mbGF0dGVuKTsKICAgIH0gZWxzZSB7CiAgICAgIHplcm9fYmF0Y2g8ZGF0YV90eXBlLCBCQVRDSF9TSVpFPihkc3RfZmxhdHRlbik7CiAgICB9CiAgfQp9CnRlbXBsYXRlIDxpbnQgUE0sIGludCBQTiwgaW50IFFNLCBpbnQgUU4sIGludCBRSywgaW50IFFVQU5UX1NJWkUsIGludCBCTE9DS19TSVpFLCBpbnQgQkFUQ0hfU0laRT4KX19kZXZpY2VfXyB2b2lkIGxvYWRfc2NhbGUoZmxvYXQgc19zW1BNXVtQTl0sIGNvbnN0IGZsb2F0IHNhW1FLXVtRTV0sIGNvbnN0IGZsb2F0IHNiW1FLXVtRTl0sIAogICAgICAgICAgICAgICAgY29uc3QgaW50IG0sIGNvbnN0IGludCBuLCBjb25zdCBpbnQgaykgewogICAgY29uc3RleHByIGludCB0b3RhbF9lbGVtZW50cyA9IFBNICogUE47CiAgICBjb25zdGV4cHIgaW50IGVsZW1lbnRzX3Blcl9zdGVwID0gQkxPQ0tfU0laRSAqIEJBVENIX1NJWkU7CiAgICAKICAgIAogICAgY29uc3QgaW50IGJlZ2luX2lkeCA9IHRocmVhZElkeC54ICogQkFUQ0hfU0laRTsKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBpZHggPSBiZWdpbl9pZHg7IGlkeCA8IHRvdGFsX2VsZW1lbnRzOyBpZHggKz0gZWxlbWVudHNfcGVyX3N0ZXApIHsKICAgICAgICBzdGF0aWNfYXNzZXJ0KEJBVENIX1NJWkUgPT0gMSk7CiAgICAgICAgaW50IGkgPSBpZHggLyBQTjsKICAgICAgICBpbnQgaiA9IGlkeCAlIFBOOwogICAgICAgIGlmICgoKFFNICUgUE0gPT0gMCkgfHwgKG0gKyBpIDwgUU0pKSAmJiAoKFFOICUgUE4gPT0gMCkgfHwgKChuICsgaikgLyBRVUFOVF9TSVpFIDwgUU4pKSkgewogICAgICAgICAgICBzX3NbaV1bal0gPSBzYVtrIC8gUVVBTlRfU0laRV1bKG0gKyBpKV0gKiBzYltrIC8gUVVBTlRfU0laRV1bKG4pIC8gUVVBTlRfU0laRSArIGpdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNfc1tpXVtqXSA9IDEuMGY7CiAgICAgICAgfQogICAgfQogICAgCn0KdGVtcGxhdGUgPHR5cGVuYW1lIGluX2RhdGFfdHlwZSwgdHlwZW5hbWUgYWNjX2RhdGFfdHlwZSwKICAgIHR5cGVuYW1lIEZyYWdDLCB0eXBlbmFtZSBGcmFnQSwgdHlwZW5hbWUgRnJhZ0IsIAogICAgaW50IFBNLCBpbnQgUE4sCiAgICBpbnQgQk0sIGludCBCTiwgaW50IEJLLCAKICAgIGludCBGUkFHX00sIGludCBGUkFHX04sIGludCBGUkFHX0ssIAogICAgaW50IFdNTUFfTSwgaW50IFdNTUFfTiwgaW50IFdNTUFfSywKICAgIGludCBXQVJQX00sIGludCBXQVJQX04sCiAgICBpbnQgQkxPQ0tfU0laRSwgaW50IEJBVENIX1NJWkUsIGludCBRVUFOVF9TSVpFPgpfX2RldmljZV9fIHZvaWQgd21tYV9jb21wdXRlKAogICAgY29uc3QgaW5fZGF0YV90eXBlIHNfYVtCS11bQk1dLAogICAgY29uc3QgaW5fZGF0YV90eXBlIHNfYltCS11bQk5dLAogICAgY29uc3QgZmxvYXQgc19zW1BNXVtQTl0sCiAgICBGcmFnQyBmcmFnX3JbRlJBR19NXVtGUkFHX05dLAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX20sCiAgICBjb25zdCBpbnQgY29tcF9jX2ZyYWdfbgopIHsKICAgIEZyYWdBIGZyYWdfYVtGUkFHX0tdW0ZSQUdfTV07IAogICAgRnJhZ0IgZnJhZ19iW0ZSQUdfS11bRlJBR19OXTsgCiAgICBGcmFnQyBmcmFnX2NbRlJBR19NXVtGUkFHX05dOwogICAgCiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUkFHX007IGkrKykgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBGUkFHX047IGorKykgewogICAgICAgICAgICB3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfY1tpXVtqXSwgMC4wRik7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmb3IgKGludCBrID0gMDsgayA8IEZSQUdfSzsgKytrKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZSQUdfTTsgKytpKSB7CiAgICAgICAgICAgIGludCBzX2Ffcm93ID0gayAqIFdNTUFfSzsKICAgICAgICAgICAgaW50IHNfYV9jb2wgPSAoY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGkpICogV01NQV9NOwogICAgICAgICAgICB3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYVtrXVtpXSwgJnNfYVtzX2Ffcm93XVtzX2FfY29sXSwgQk0pOwogICAgICAgIH0KICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRlJBR19OOyArK2opIHsKICAgICAgICAgICAgaW50IHNfYl9yb3cgPSBrICogV01NQV9LOwogICAgICAgICAgICBpbnQgc19iX2NvbCA9IChjb21wX2NfZnJhZ19uICogRlJBR19OICsgaikgKiBXTU1BX047CiAgICAgICAgICAgIHdtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iW2tdW2pdLCAmc19iW3NfYl9yb3ddW3NfYl9jb2xdLCBCTik7CiAgICAgICAgfQogICAgfQogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJBR19NOyBpKyspIHsKICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRlJBR19OOyBqKyspIHsKICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBGUkFHX0s7ICsraykgewogICAgICAgICAgICAgICAgd21tYTo6bW1hX3N5bmMoZnJhZ19jW2ldW2pdLCBmcmFnX2Fba11baV0sIGZyYWdfYltrXVtqXSwgZnJhZ19jW2ldW2pdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBrID0gMDsgayA8IEZyYWdDOjpudW1fZWxlbWVudHM7IGsrKykgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJBR19NOyBpKyspIHsKI2lmZGVmIFRFU1RfT05fUkROQTQgCiAgICAgICAgICAgIGludCBtID0gKCh0aHJlYWRJZHgueCAmIDE2KSA+PiAxKSB8IChrICYgNykgfCAoY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGkpICogV01NQV9NOwojZWxzZSAKICAgICAgICAgICAgaW50IG0gPSAoKHRocmVhZElkeC54ICYgNDgpID4+IDIpIHwgKGsgJiAzKSB8IChjb21wX2NfZnJhZ19tICogRlJBR19NICsgaSkgKiBXTU1BX007CiNlbmRpZgogICAgICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEZSQUdfTjsgaisrKSB7CiAgICAgICAgICAgICAgICBpbnQgbiA9ICgodGhyZWFkSWR4LnggJiAxNSkgfCAoY29tcF9jX2ZyYWdfbiAqIEZSQUdfTiArIGopICogV01NQV9OKSAvIFFVQU5UX1NJWkU7CiAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IHNfc1ttXVtuXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZnJhZ19yW2ldW2pdLnhba10gKz0gKGFjY19kYXRhX3R5cGUpc2NhbGUgKiAoYWNjX2RhdGFfdHlwZSlmcmFnX2NbaV1bal0ueFtrXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgYWNjX2RhdGFfdHlwZSwgdHlwZW5hbWUgb3V0X2RhdGFfdHlwZSwgCnR5cGVuYW1lIEZyYWdDLCB0eXBlbmFtZSBGcmFnT3V0LCBpbnQgV01NQV9NLCBpbnQgV01NQV9OLCAKaW50IEJNLCBpbnQgQk4sIGludCBNLCBpbnQgTiwgaW50IEZSQUdfTSwgaW50IEZSQUdfTj4KX19kZXZpY2VfXyBpbmxpbmUgdm9pZCBzdG9yZV9yZXN1bHQoCiAgICBvdXRfZGF0YV90eXBlIGNbTV1bTl0sIAogICAgRnJhZ0MgZnJhZ19yW0ZSQUdfTV1bRlJBR19OXSwgCiAgICBjb25zdCBpbnQgbSwKICAgIGNvbnN0IGludCBuLAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX20sIAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX24KKSB7CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUkFHX007IGkrKykgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBGUkFHX047IGorKykgewogICAgICAgICAgICBpbnQgZnJhZ19tID0gY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGk7CiAgICAgICAgICAgIGludCBmcmFnX24gPSBjb21wX2NfZnJhZ19uICogRlJBR19OICsgajsKICAgICAgICAgICAgaW50IHJvdyA9IG0gKyBmcmFnX20gKiBXTU1BX007CiAgICAgICAgICAgIGludCBjb2wgPSBuICsgZnJhZ19uICogV01NQV9OOwogICAgICAgICAgICBpZiAoKChNICUgQk0gPT0gMCkgfHwgKHJvdyA8IE0pKSAmJiAoKE4gJSBCTiA9PSAwKSB8fCAoY29sIDwgTikpKSB7CiAgICAgICAgICAgICAgICBvdXRfZGF0YV90eXBlICpjX3B0ciA9ICZjW3Jvd11bY29sXTsKICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoc2l6ZW9mKGFjY19kYXRhX3R5cGUpID09IHNpemVvZihvdXRfZGF0YV90eXBlKSkgewogICAgICAgICAgICAgICAgICAgIHdtbWE6OnN0b3JlX21hdHJpeF9zeW5jKHJlaW50ZXJwcmV0X2Nhc3Q8b3V0X2RhdGFfdHlwZSo+KGNfcHRyKSwgZnJhZ19yW2ldW2pdLCBOLCB3bW1hOjptZW1fcm93X21ham9yKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKHNpemVvZihvdXRfZGF0YV90eXBlKSA9PSBzaXplb2YoaGFsZikpIHsKICAgICAgICAgICAgICAgICAgICBGcmFnT3V0IGZyYWdfb3V0OwogICAgICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGhhbGYpID09IHNpemVvZihvdXRfZGF0YV90eXBlKSk7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChGcmFnT3V0OjpudW1fZWxlbWVudHMgPT0gRnJhZ0M6Om51bV9lbGVtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wO2s8RnJhZ091dDo6bnVtX2VsZW1lbnRzOysraykgewogICAgICAgICAgICAgICAgICAgICAgICBfX2hpcF9iZmxvYXQxNiByZWcgPSBmcmFnX3JbaV1bal0ueFtrXTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ19vdXQueFtrXSA9ICpyZWludGVycHJldF9jYXN0PGhhbGYqPigmcmVnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd21tYTo6c3RvcmVfbWF0cml4X3N5bmMocmVpbnRlcnByZXRfY2FzdDxoYWxmKj4oY19wdHIpLCBmcmFnX291dCwgTiwgd21tYTo6bWVtX3Jvd19tYWpvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CnRlbXBsYXRlPGludCBEdW1teT0wPgpfX2dsb2JhbF9fIHZvaWQgcmVkdWNlKHVpbnQzMl90IG0sIHVpbnQzMl90IG4sIHVpbnQzMl90IHNwbGl0aywgY29uc3QgZmxvYXQgKmNfc3BsaXRrLCBfX2hpcF9iZmxvYXQxNiAqYykgewogICAgYXV0byB0aWQgPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54OwogICAgaWYgKHRpZCA+PSBtICogbikgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGZsb2F0IHN1bSA9IDA7CiAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBzcGxpdGs7ICsraSkgewogICAgICAgIHN1bSArPSBjX3NwbGl0a1tpICogKG0gKiBuKSArIHRpZF07CiAgICB9CiAgICBjW3RpZF0gPSBzdW07Cn0KICAgIAojaWZkZWYgUEFSQU1FVEVSSVpFX0xJQlJBUlkKdGVtcGxhdGUgPAogICAgdHlwZW5hbWUgaW5fZGF0YV90eXBlLAogICAgdHlwZW5hbWUgYWNjX2RhdGFfdHlwZSwgCiAgICB0eXBlbmFtZSBvdXRfZGF0YV90eXBlLCAKICAgIGludCBNLCBpbnQgTiwgaW50IEssICAgIAogICAgaW50IEJNLCBpbnQgQk4sIGludCBCSywgCiAgICBpbnQgUVVBTlRfU0laRSwgICAgICAgICAKICAgIGludCBCTE9DS19TSVpFLCAgICAgICAgIAogICAgaW50IFdBUlBfTSwgaW50IFdBUlBfTiAKPgojZWxzZQp1c2luZyBpbl9kYXRhX3R5cGUgPSBfX0ZQOF9UWVBFOwp1c2luZyBvdXRfZGF0YV90eXBlID0gX19CRjE2X1RZUEU7CnVzaW5nIGFjY19kYXRhX3R5cGUgPSBmbG9hdDsKY29uc3RleHByIGludCBNID0gOTYsIE4gPSAxMDI0LCBLID0gMTAyNDsKY29uc3RleHByIGludCBCTSA9IDY0LCBCTiA9IDI1NiwgQksgPSAzMjsKY29uc3RleHByIGludCBRVUFOVF9TSVpFID0gMTI4LCBCTE9DS19TSVpFID0gMjU2OwojaWZkZWYgVEVTVF9PTl9SRE5BNCAKY29uc3RleHByIGludCBXQVJQX00gPSA0LCBXQVJQX04gPSAyOwojZWxzZSAKY29uc3RleHByIGludCBXQVJQX00gPSAyLCBXQVJQX04gPSAyOwojZW5kaWYKI2VuZGlmIApfX2dsb2JhbF9fIHZvaWQgZ2VtbV9rZXJuZWwoCiAgICBjb25zdCBpbl9kYXRhX3R5cGUgYVtLXVtNXSwKICAgIGNvbnN0IGluX2RhdGFfdHlwZSBiW0tdW05dLAogICAgb3V0X2RhdGFfdHlwZSBjW01dW05dLAogICAgY29uc3QgZmxvYXQgc2FbY2VpbF9kaXYoSywgUVVBTlRfU0laRSldW00gLyAxICAgICAgICBdLCAKICAgIGNvbnN0IGZsb2F0IHNiW2NlaWxfZGl2KEssIFFVQU5UX1NJWkUpXVtjZWlsX2RpdihOLCBRVUFOVF9TSVpFKV0KKSB7CiAgICAKICAgIGNvbnN0ZXhwciBpbnQgV01NQV9NID0gMTY7IAogICAgY29uc3RleHByIGludCBXTU1BX04gPSAxNjsgCiAgICBjb25zdGV4cHIgaW50IFdNTUFfSyA9IDMyOyAKICAgIAogICAgCiAgICAKICAgIAogICAgY29uc3RleHByIGludCBXQVJQX05VTSA9IFdBUlBfTSAqIFdBUlBfTjsgCiAgICAKICAgIAogICAgY29uc3RleHByIGludCBGUkFHX01fUEVSX1dBUlAgPSBCTSAvIFdNTUFfTSAvIFdBUlBfTTsKICAgIGNvbnN0ZXhwciBpbnQgRlJBR19OX1BFUl9XQVJQID0gQk4gLyBXTU1BX04gLyBXQVJQX047CiAgICBjb25zdGV4cHIgaW50IEZSQUdfSyA9IEJLIC8gV01NQV9LOyAKICAgIAogICAgY29uc3RleHByIGludCBRTSA9IE07IAogICAgY29uc3RleHByIGludCBRTiA9IGNlaWxfZGl2KE4sIFFVQU5UX1NJWkUpOyAKICAgIGNvbnN0ZXhwciBpbnQgUUsgPSBjZWlsX2RpdihLLCBRVUFOVF9TSVpFKTsgCiAgICBjb25zdGV4cHIgaW50IFBNID0gQk07IAogICAgY29uc3RleHByIGludCBQTiA9IGNlaWxfZGl2KEJOLCBRVUFOVF9TSVpFKTsgCiAgICAKICAgIHVzaW5nIEZyYWdBID0gd21tYTo6ZnJhZ21lbnQ8d21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGluX2RhdGFfdHlwZSwgd21tYTo6Y29sX21ham9yPjsKICAgIHVzaW5nIEZyYWdCID0gd21tYTo6ZnJhZ21lbnQ8d21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGluX2RhdGFfdHlwZSwgd21tYTo6cm93X21ham9yPjsKICAgIHVzaW5nIEZyYWdDID0gd21tYTo6ZnJhZ21lbnQ8d21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGFjY19kYXRhX3R5cGU+OwogICAgdXNpbmcgRnJhZ091dCA9IHdtbWE6OmZyYWdtZW50PHdtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBoYWxmPjsgCiAgICBfX3NoYXJlZF9fIGluX2RhdGFfdHlwZSAgc19hW0JLXVtCTV07CiAgICBfX3NoYXJlZF9fIGluX2RhdGFfdHlwZSAgc19iW0JLXVtCTl07CiAgICBfX3NoYXJlZF9fIGFjY19kYXRhX3R5cGUgc19zW1BNXVtQTl07IAogICAgRnJhZ0MgZnJhZ19yW0ZSQUdfTV9QRVJfV0FSUF1bRlJBR19OX1BFUl9XQVJQXTsgCiAgICAKICAgIGEgKz0gYmxvY2tJZHgueiAqIEs7CiAgICBiICs9IGJsb2NrSWR4LnogKiBLOwogICAgYyArPSBibG9ja0lkeC56ICogTTsKICAgIHNhICs9IGJsb2NrSWR4LnogKiBRSzsKICAgIHNiICs9IGJsb2NrSWR4LnogKiBRSzsKICAgIGludCB0aWQgPSB0aHJlYWRJZHgueDsgCiAgICBpbnQgd2lkID0gdGlkIC8gV0FWRV9TSVpFOyAKICAgIAogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJBR19NX1BFUl9XQVJQOyBpKyspIHsKICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRlJBR19OX1BFUl9XQVJQOyBqKyspIHsKICAgICAgICAgICAgd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX3JbaV1bal0sIDAuMGYpOyAKICAgICAgICB9CiAgICB9CiAgICAKICAgIGNvbnN0ZXhwciBpbnQgaXRlcmF0aW9uX292ZXJfayA9IGNlaWxfZGl2KEssIEJLKTsgCiAgICBjb25zdGV4cHIgaW50IExPQURfQkFUQ0hfU0laRSA9ICgyICogc2l6ZW9mKGZsb2F0NCkgLyBzaXplb2YoaW5fZGF0YV90eXBlKSkgPiAwID8gKDIgKiBzaXplb2YoZmxvYXQ0KSAvIHNpemVvZihpbl9kYXRhX3R5cGUpKSA6IDE7IAogICAgZm9yIChpbnQgYmsgPSAwOyBiayA8IGl0ZXJhdGlvbl9vdmVyX2s7IGJrKyspIHsKICAgICAgICBjb25zdCBpbnQgbSA9IGJsb2NrSWR4LnkgKiBCTTsKICAgICAgICBjb25zdCBpbnQgbiA9IGJsb2NrSWR4LnggKiBCTjsKICAgICAgICBjb25zdCBpbnQgayA9IGJrICogQks7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgbG9hZF9pbnB1dDxpbl9kYXRhX3R5cGUsIEJLLCBCTSwgSywgTSwgQkxPQ0tfU0laRSwgTE9BRF9CQVRDSF9TSVpFPigKICAgICAgICAgICAgc19hLCBhLCBtLCBrKTsKICAgICAgICBsb2FkX2lucHV0PGluX2RhdGFfdHlwZSwgQkssIEJOLCBLLCBOLCBCTE9DS19TSVpFLCBMT0FEX0JBVENIX1NJWkU+KAogICAgICAgICAgICBzX2IsIGIsIG4sIGspOwogICAgICAgIAogICAgICAgIGxvYWRfc2NhbGU8UE0sIFBOLCBRTSwgUU4sIFFLLCBRVUFOVF9TSVpFLCBCTE9DS19TSVpFLCAxPigKICAgICAgICAgICAgc19zLCBzYSwgc2IsIG0sIG4sIGspOwogICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICAKICAgICAgICB3bW1hX2NvbXB1dGU8aW5fZGF0YV90eXBlLCBhY2NfZGF0YV90eXBlLCBGcmFnQywgRnJhZ0EsIEZyYWdCLAogICAgICAgICAgICBQTSwgUE4sIEJNLCBCTiwgQkssIEZSQUdfTV9QRVJfV0FSUCwgRlJBR19OX1BFUl9XQVJQLCBGUkFHX0ssCiAgICAgICAgICAgIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssCiAgICAgICAgICAgIFdBUlBfTSwgV0FSUF9OLAogICAgICAgICAgICBCTE9DS19TSVpFLCBMT0FEX0JBVENIX1NJWkUsIFFVQU5UX1NJWkU+KCAKICAgICAgICAgICAgICAgIHNfYSwgc19iLCBzX3MsIGZyYWdfciwgd2lkIC8gV0FSUF9OLCB3aWQgJSBXQVJQX04pOwogICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgIH0KICAgIAogICAgc3RvcmVfcmVzdWx0PGFjY19kYXRhX3R5cGUsIG91dF9kYXRhX3R5cGUsIEZyYWdDLCBGcmFnT3V0LAogICAgICAgIFdNTUFfTSwgV01NQV9OLCBCTSwgQk4sIE0sIE4sIEZSQUdfTV9QRVJfV0FSUCwgRlJBR19OX1BFUl9XQVJQPigKICAgICAgICAgICAgYywgZnJhZ19yLCBibG9ja0lkeC55ICogQk0sIGJsb2NrSWR4LnggKiBCTiwKICAgICAgICAgICAgd2lkIC8gV0FSUF9OLCB3aWQgJSBXQVJQX04pOwp9Owp9OyAKI2lmbmRlZiAgUEFSQU1FVEVSSVpFX0xJQlJBUlkKdXNpbmcgZnA4X3R5cGUgPSBnZW1tX2tlcm5lbDo6aW5fZGF0YV90eXBlOyAgICAKdXNpbmcgZnAxNl90eXBlID0gZ2VtbV9rZXJuZWw6Om91dF9kYXRhX3R5cGU7ICAKdXNpbmcgYWNjX2RhdGFfdHlwZSA9IGdlbW1fa2VybmVsOjphY2NfZGF0YV90eXBlOyAgCmNvbnN0ZXhwciBpbnQgTSA9IGdlbW1fa2VybmVsOjpNOyAgCmNvbnN0ZXhwciBpbnQgTiA9IGdlbW1fa2VybmVsOjpOOyAgCmNvbnN0ZXhwciBpbnQgSyA9IGdlbW1fa2VybmVsOjpLOyAgCmNvbnN0ZXhwciBpbnQgQk0gPSBnZW1tX2tlcm5lbDo6Qk07ICAKY29uc3RleHByIGludCBCTiA9IGdlbW1fa2VybmVsOjpCTjsgIApjb25zdGV4cHIgaW50IEJLID0gZ2VtbV9rZXJuZWw6OkJLOyAgCmNvbnN0ZXhwciBpbnQgQkxPQ0tfU0laRSA9IGdlbW1fa2VybmVsOjpCTE9DS19TSVpFOwpjb25zdGV4cHIgaW50IFFVQU5UX1NJWkUgPSBnZW1tX2tlcm5lbDo6UVVBTlRfU0laRTsgIApjb25zdGV4cHIgaW50IFFLID0gSyAvIFFVQU5UX1NJWkU7CmNvbnN0ZXhwciBpbnQgUU0gPSBNOwpjb25zdGV4cHIgaW50IFFOID0gTiAvIFFVQU5UX1NJWkU7CiNkZWZpbmUgQ0hFQ0tfSElQX0VSUk9SKHZhbCkgY2hlY2soKHZhbCksICN2YWwsIF9fRklMRV9fLCBfX0xJTkVfXykKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgY2hlY2soVCBlcnIsIGNvbnN0IGNoYXIqIGNvbnN0IGZ1bmMsIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGUsIGNvbnN0IGludCBsaW5lKSB7CiAgICBpZiAoZXJyICE9IGhpcFN1Y2Nlc3MpIHsKICAgICAgICBleGl0KDEpOwogICAgfQp9CnZvaWQgY3B1X2dlbW0oY29uc3QgZnA4X3R5cGUgYVtLXVtNXSwgY29uc3QgZnA4X3R5cGUgYltLXVtOXSwgZnAxNl90eXBlIGNbTV1bTl0sIAogICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhW1FLXVtRTV0sIGNvbnN0IGZsb2F0IHNiW1FLXVtRTl0pIHsKICAgIGZsb2F0ICgqcmMpW05dID0gbmV3IGZsb2F0W01dW05dOwogICAgZm9yIChpbnQgbSA9IDA7IG0gPCBNOyArK20pIHsKICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IE47ICsrbikgewogICAgICAgICAgICByY1ttXVtuXSA9IDAuMGY7CiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgayA9IDA7IGsgPCBLOyArK2spIHsKICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IE07ICsrbSkgewogICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IE47ICsrbikgewogICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBzYVtrL1FVQU5UX1NJWkVdW21dICogc2Jbay9RVUFOVF9TSVpFXVtuL1FVQU5UX1NJWkVdOwogICAgICAgICAgICAgICAgcmNbbV1bbl0gKz0gKHNjYWxlICogKGZsb2F0KWFba11bbV0gKiAoZmxvYXQpYltrXVtuXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmb3IgKGludCBtID0gMDsgbSA8IE07ICsrbSkgewogICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgTjsgKytuKSB7CiAgICAgICAgICAgIGNbbV1bbl0gPSAoZnAxNl90eXBlKXJjW21dW25dOwogICAgICAgIH0KICAgIH0KICAgIGRlbGV0ZVtdIHJjOwp9CmludCBtYWluKCkgewogICAgCiAgICBmcDhfdHlwZSAoKmhfYSlbTV0gPSBuZXcgZnA4X3R5cGVbS11bTV07CiAgICBmcDhfdHlwZSAoKmhfYilbTl0gPSBuZXcgZnA4X3R5cGVbS11bTl07CiAgICBmcDE2X3R5cGUgKCpoX2MpW05dID0gbmV3IGZwMTZfdHlwZVtNXVtOXTsKICAgIGZwMTZfdHlwZSAoKmhfY19yZWYpW05dID0gbmV3IGZwMTZfdHlwZVtNXVtOXTsKICAgIAogICAgCiAgICBmbG9hdCAoKmhfc2EpW1FNXSA9IG5ldyBmbG9hdFtRS11bUU1dOwogICAgZmxvYXQgKCpoX3NiKVtRTl0gPSBuZXcgZmxvYXRbUUtdW1FOXTsKICAgIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBLOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE07ICsraikgewogICAgICAgICAgICBoX2FbaV1bal0gPSAoZnA4X3R5cGUpKChyYW5kKCkgJSAxMDAwMCkgLyAxMDAwMC4wZik7CiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBLOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47ICsraikgewogICAgICAgICAgICBoX2JbaV1bal0gPSAoZnA4X3R5cGUpKChyYW5kKCkgJSAxMDAwMCkgLyAxMDAwMC4wZik7CiAgICAgICAgfQogICAgfQogICAgCiAgICAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUUs7ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgUU07ICsraikgewogICAgICAgICAgICBoX3NhW2ldW2pdID0gMS4wZjsgCiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBRSzsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBRTjsgKytqKSB7CiAgICAgICAgICAgIGhfc2JbaV1bal0gPSAxLjBmOyAKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZwOF90eXBlICgqZF9hKVtNXTsKICAgIGZwOF90eXBlICgqZF9iKVtOXTsKICAgIGZwMTZfdHlwZSAoKmRfYylbTl07CiAgICBmbG9hdCAoKmRfc2EpW1FNXTsKICAgIGZsb2F0ICgqZF9zYilbUU5dOwogICAgCiAgICBDSEVDS19ISVBfRVJST1IoaGlwTWFsbG9jKCZkX2EsIEsgKiBNICogc2l6ZW9mKGZwOF90eXBlKSkpOwogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcE1hbGxvYygmZF9iLCBLICogTiAqIHNpemVvZihmcDhfdHlwZSkpKTsKICAgIENIRUNLX0hJUF9FUlJPUihoaXBNYWxsb2MoJmRfYywgTSAqIE4gKiBzaXplb2YoZnAxNl90eXBlKSkpOwogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcE1hbGxvYygmZF9zYSwgUUsgKiBRTSAqIHNpemVvZihmbG9hdCkpKTsKICAgIENIRUNLX0hJUF9FUlJPUihoaXBNYWxsb2MoJmRfc2IsIFFLICogUU4gKiBzaXplb2YoZmxvYXQpKSk7CiAgICAKICAgIENIRUNLX0hJUF9FUlJPUihoaXBNZW1jcHkoZF9hLCBoX2EsIEsgKiBNICogc2l6ZW9mKGZwOF90eXBlKSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CiAgICBDSEVDS19ISVBfRVJST1IoaGlwTWVtY3B5KGRfYiwgaF9iLCBLICogTiAqIHNpemVvZihmcDhfdHlwZSksIGhpcE1lbWNweUhvc3RUb0RldmljZSkpOwogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcE1lbWNweShkX3NhLCBoX3NhLCBRSyAqIFFNICogc2l6ZW9mKGZsb2F0KSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CiAgICBDSEVDS19ISVBfRVJST1IoaGlwTWVtY3B5KGRfc2IsIGhfc2IsIFFLICogUU4gKiBzaXplb2YoZmxvYXQpLCBoaXBNZW1jcHlIb3N0VG9EZXZpY2UpKTsKICAgIAogICAgZGltMyBncmlkKChOICsgQk4gLSAxKSAvIEJOLCAoTSArIEJNIC0gMSkgLyBCTSk7CiAgICBkaW0zIGJsb2NrKEJMT0NLX1NJWkUpOwogICAgCiAgICAKICAgIGlmIChCTE9DS19TSVpFICUgMzIgIT0gMCkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgCiAgICAKICAgIGludCBkZXZpY2VJZDsKICAgIEhJUF9DQUxMKGhpcEdldERldmljZSgmZGV2aWNlSWQpKTsKICAgIGhpcERldmljZVByb3BfdCBkZXZpY2VQcm9wOwogICAgSElQX0NBTEwoaGlwR2V0RGV2aWNlUHJvcGVydGllcygmZGV2aWNlUHJvcCwgZGV2aWNlSWQpKTsKICAgIAogICAgaWYgKGRldmljZVByb3AubWFqb3IgPCA3KSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAKICAgICAgICAgICBncmlkLngsIGdyaWQueSwgYmxvY2sueCk7CiAgICAKICAgIAogICAgCiAgICBISVBfQ0FMTChoaXBHZXREZXZpY2VQcm9wZXJ0aWVzKCZkZXZpY2VQcm9wLCBkZXZpY2VJZCkpOwogICAgCiAgICBoaXBGdW5jQXR0cmlidXRlcyBmdW5jQXR0cjsKICAgIEhJUF9DQUxMKGhpcEZ1bmNHZXRBdHRyaWJ1dGVzKCZmdW5jQXR0ciwgKGNvbnN0IHZvaWQqKWdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbCkpOwogICAgCiAgICBDSEVDS19ISVBfRVJST1IoaGlwTWVtc2V0KGRfYywgMCwgTSAqIE4gKiBzaXplb2YoZnAxNl90eXBlKSkpOwogICAgCiAgICAKICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDw8PGdyaWQsIGJsb2NrPj4+KGRfYSwgZF9iLCBkX2MsIGRfc2EsIGRfc2IpOwogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcERldmljZVN5bmNocm9uaXplKCkpOwogICAgZ2VtbV9rZXJuZWw6OmdlbW1fa2VybmVsPDw8Z3JpZCwgYmxvY2s+Pj4oZF9hLCBkX2IsIGRfYywgZF9zYSwgZF9zYik7CiAgICBDSEVDS19ISVBfRVJST1IoaGlwRGV2aWNlU3luY2hyb25pemUoKSk7CiAgICAKICAgIAogICAgaGlwRXZlbnRfdCBzdGFydCwgc3RvcDsKICAgIEhJUF9DQUxMKGhpcEV2ZW50Q3JlYXRlKCZzdGFydCkpOwogICAgSElQX0NBTEwoaGlwRXZlbnRDcmVhdGUoJnN0b3ApKTsKICAgIAogICAgCiAgICBDSEVDS19ISVBfRVJST1IoaGlwRGV2aWNlU3luY2hyb25pemUoKSk7CiAgICBISVBfQ0FMTChoaXBFdmVudFJlY29yZChzdGFydCkpOwogICAgCiAgICAKICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDw8PGdyaWQsIGJsb2NrPj4+KGRfYSwgZF9iLCBkX2MsIGRfc2EsIGRfc2IpOwogICAgCiAgICAKICAgIEhJUF9DQUxMKGhpcEV2ZW50UmVjb3JkKHN0b3ApKTsKICAgIAogICAgCiAgICBISVBfQ0FMTChoaXBFdmVudFN5bmNocm9uaXplKHN0b3ApKTsKICAgIGZsb2F0IG1pbGxpc2Vjb25kcyA9IDA7CiAgICBISVBfQ0FMTChoaXBFdmVudEVsYXBzZWRUaW1lKCZtaWxsaXNlY29uZHMsIHN0YXJ0LCBzdG9wKSk7CiAgICAKICAgIAogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcEdldExhc3RFcnJvcigpKTsKICAgIAogICAgCiAgICBkb3VibGUgb3BlcmF0aW9ucyA9IDIuMCAqIE0gKiBOICogSzsgIAogICAgZG91YmxlIHNlY29uZHMgPSBtaWxsaXNlY29uZHMgLyAxMDAwLjA7CiAgICBkb3VibGUgdGZsb3BzID0gKG9wZXJhdGlvbnMgLyBzZWNvbmRzKSAvIDFlMTI7CiAgICAKICAgIAogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcE1lbWNweShoX2MsIGRfYywgTSAqIE4gKiBzaXplb2YoZnAxNl90eXBlKSwgaGlwTWVtY3B5RGV2aWNlVG9Ib3N0KSk7CiAgICAKICAgIGNwdV9nZW1tKGhfYSwgaF9iLCBoX2NfcmVmLCBoX3NhLCBoX3NiKTsKICAgIAogICAgaW50IHByaW50X2NvdW50ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTSAmJiBwcmludF9jb3VudCA8IDEwOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE4gJiYgcHJpbnRfY291bnQgPCAxMDsgKytqKSB7CiAgICAgICAgICAgIHByaW50X2NvdW50Kys7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpbnQgZXJyb3JzID0gMDsKICAgIGZsb2F0IG1heF9hYnNfZGlmZiA9IDAuMGY7CiAgICBmbG9hdCBtYXhfcmVsX2RpZmYgPSAwLjBmOwogICAgc3RydWN0IEVycm9ySW5mbyB7CiAgICAgICAgaW50IHJvdywgY29sOwogICAgICAgIGZsb2F0IGdwdV92YWwsIGNwdV92YWwsIGFic19kaWZmLCByZWxfZGlmZjsKICAgIH07CiAgICBFcnJvckluZm8gZmlyc3RfMTBfZXJyb3JzWzEwXTsKICAgIEVycm9ySW5mbyBtYXhfMTBfZXJyb3JzWzEwXSA9IHt9OwogICAgCiAgICBpbnQgbWF4X2Vycm9yc190b19vdXRwdXQgPSAxMDsgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IE07ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgKytqKSB7CiAgICAgICAgICAgIGZsb2F0IGdwdV92YWwgPSAoZmxvYXQpaF9jW2ldW2pdOwogICAgICAgICAgICBmbG9hdCBjcHVfdmFsID0gKGZsb2F0KWhfY19yZWZbaV1bal07CiAgICAgICAgICAgIGZsb2F0IGFic19kaWZmOwogICAgICAgICAgICBmbG9hdCByZWxfZGlmZjsKICAgICAgICAgICAgaWYgKHN0ZDo6aXNuYW4oZ3B1X3ZhbCkgfHwgc3RkOjppc25hbihjcHVfdmFsKSkgewogICAgICAgICAgICAgICAgYWJzX2RpZmYgPSBJTkZJTklUWTsKICAgICAgICAgICAgICAgIHJlbF9kaWZmID0gSU5GSU5JVFk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhYnNfZGlmZiA9IGFicyhncHVfdmFsIC0gY3B1X3ZhbCk7CiAgICAgICAgICAgICAgICByZWxfZGlmZiA9IGFic19kaWZmIC8gKGFicyhjcHVfdmFsKSArIEZMVF9FUFNJTE9OKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgbWF4X2Fic19kaWZmID0gZm1heGYobWF4X2Fic19kaWZmLCBhYnNfZGlmZik7CiAgICAgICAgICAgIG1heF9yZWxfZGlmZiA9IGZtYXhmKG1heF9yZWxfZGlmZiwgcmVsX2RpZmYpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGVycm9ycyA8IG1heF9lcnJvcnNfdG9fb3V0cHV0ICYmIChyZWxfZGlmZiA+IDFlLTIgfHwgYWJzX2RpZmYgPiAxZS0zKSkgewogICAgICAgICAgICAgICAgZmlyc3RfMTBfZXJyb3JzW2Vycm9yc10gPSB7aSwgaiwgZ3B1X3ZhbCwgY3B1X3ZhbCwgYWJzX2RpZmYsIHJlbF9kaWZmfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHJlbF9kaWZmID4gMWUtMiB8fCBhYnNfZGlmZiA+IDFlLTMpIHsKICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBtYXhfZXJyb3JzX3RvX291dHB1dDsgKytrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFic19kaWZmID4gbWF4XzEwX2Vycm9yc1trXS5hYnNfZGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gbWF4X2Vycm9yc190b19vdXRwdXQgLSAxOyBsID4gazsgLS1sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfMTBfZXJyb3JzW2xdID0gbWF4XzEwX2Vycm9yc1tsIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4XzEwX2Vycm9yc1trXSA9IHtpLCBqLCBncHVfdmFsLCBjcHVfdmFsLCBhYnNfZGlmZiwgcmVsX2RpZmZ9OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1pbihlcnJvcnMsIG1heF9lcnJvcnNfdG9fb3V0cHV0KTsgKytpKSB7CiAgICAgICAgICAgICAgIGZpcnN0XzEwX2Vycm9yc1tpXS5yb3csIGZpcnN0XzEwX2Vycm9yc1tpXS5jb2wsCiAgICAgICAgICAgICAgIGZpcnN0XzEwX2Vycm9yc1tpXS5ncHVfdmFsLCBmaXJzdF8xMF9lcnJvcnNbaV0uY3B1X3ZhbCwKICAgICAgICAgICAgICAgZmlyc3RfMTBfZXJyb3JzW2ldLmFic19kaWZmLCBmaXJzdF8xMF9lcnJvcnNbaV0ucmVsX2RpZmYpOwogICAgfQogICAgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9lcnJvcnNfdG9fb3V0cHV0ICYmIG1heF8xMF9lcnJvcnNbaV0uYWJzX2RpZmYgPiAwOyArK2kpIHsKICAgICAgICAgICAgICAgbWF4XzEwX2Vycm9yc1tpXS5yb3csIG1heF8xMF9lcnJvcnNbaV0uY29sLAogICAgICAgICAgICAgICBtYXhfMTBfZXJyb3JzW2ldLmdwdV92YWwsIG1heF8xMF9lcnJvcnNbaV0uY3B1X3ZhbCwKICAgICAgICAgICAgICAgbWF4XzEwX2Vycm9yc1tpXS5hYnNfZGlmZiwgbWF4XzEwX2Vycm9yc1tpXS5yZWxfZGlmZik7CiAgICB9CiAgICBpZiAoZXJyb3JzID09IDApIHsKICAgIH0gZWxzZSB7CiAgICB9CiAgICAKICAgIGRvdWJsZSBmbG9wcyA9IDIuMCAqIE0gKiBOICogSzsKICAgIGRvdWJsZSBnZmxvcHMgPSAoZmxvcHMgKiAxZS05KSAvIChtaWxsaXNlY29uZHMgKiAxZS0zKTsKICAgIAogICAgCiAgICBkZWxldGVbXSBoX2E7CiAgICBkZWxldGVbXSBoX2I7CiAgICBkZWxldGVbXSBoX2M7CiAgICBkZWxldGVbXSBoX2NfcmVmOwogICAgZGVsZXRlW10gaF9zYTsKICAgIGRlbGV0ZVtdIGhfc2I7CiAgICBISVBfQ0FMTChoaXBGcmVlKGRfYSkpOwogICAgSElQX0NBTEwoaGlwRnJlZShkX2IpKTsKICAgIEhJUF9DQUxMKGhpcEZyZWUoZF9jKSk7CiAgICBISVBfQ0FMTChoaXBGcmVlKGRfc2EpKTsKICAgIEhJUF9DQUxMKGhpcEZyZWUoZF9zYikpOwogICAgSElQX0NBTEwoaGlwRXZlbnREZXN0cm95KHN0YXJ0KSk7CiAgICBISVBfQ0FMTChoaXBFdmVudERlc3Ryb3koc3RvcCkpOwogICAgcmV0dXJuIDA7Cn0KI2VuZGlmCiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKI2VuZGlmCiNkZWZpbmUgUEFSQU1FVEVSSVpFX0xJQlJBUlkKI3VuZGVmIFBBUkFNRVRFUklaRV9MSUJSQVJZCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmZsb2F0ICpjX3NwbGl0a3tudWxscHRyfTsKc2l6ZV90IGNfc3BsaXRrX3NpemV7MH07CnRlbXBsYXRlIDxpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgQk0sIGludCBCTiwgaW50IEJLLCBpbnQgV0FSUF9NLCBpbnQgV0FSUF9OLCBpbnQgQkxPQ0tfU0laRSwgaW50IFFVQU5UX0JMT0NLX1NJWkUsIGludCBTUExJVEtfRkFDVE9SPgp2b2lkIGxhdW5jaF9nZW1tKGNvbnN0IF9fRlA4X1RZUEUgKmEsIGNvbnN0IF9fRlA4X1RZUEUgKmIsIF9fQkYxNl9UWVBFICpjLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicykgewogICAgZGltMyBncmlkKGNlaWxfZGl2KE4sIEJOKSwgY2VpbF9kaXYoTSwgQk0pLCBTUExJVEtfRkFDVE9SKTsKICAgIGRpbTMgYmxvY2soQkxPQ0tfU0laRSk7CiAgICBpZiBjb25zdGV4cHIgKFNQTElUS19GQUNUT1IgPT0gMSkgewogICAgICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDxfX0ZQOF9UWVBFLCBmbG9hdCwgX19CRjE2X1RZUEUsIE0sIE4sIEssIEJNLCBCTiwgQkssIFFVQU5UX0JMT0NLX1NJWkUsIEJMT0NLX1NJWkUsIFdBUlBfTSwgV0FSUF9OPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8PGdyaWQsIGJsb2NrPj4+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICgqKVtNXT4oYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fRlA4X1RZUEUgKCopW05dPihiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8X19CRjE2X1RZUEUgKCopW05dPihjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKCopW01dPihhcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICgqKVtjZWlsX2RpdihOLCBRVUFOVF9CTE9DS19TSVpFKV0+KGJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIGlmKGNfc3BsaXRrX3NpemUgPCBTUExJVEtfRkFDVE9SICogTSAqIE4gKiBzaXplb2YoZmxvYXQpKSB7CiAgICAgICAgICAgIGNfc3BsaXRrX3NpemUgPSBTUExJVEtfRkFDVE9SICogTSAqIE4gKiBzaXplb2YoZmxvYXQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGNfc3BsaXRrKSB7CiAgICAgICAgICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRnJlZUFzeW5jKShjX3NwbGl0aywgMCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShNYWxsb2NBc3luYykoJmNfc3BsaXRrLCBjX3NwbGl0a19zaXplLCAwKSk7CiAgICAgICAgfQogICAgICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDxfX0ZQOF9UWVBFLCBmbG9hdCwgZmxvYXQsIE0sIE4sIEsgLyBTUExJVEtfRkFDVE9SLCBCTSwgQk4sIEJLLCBRVUFOVF9CTE9DS19TSVpFLCBCTE9DS19TSVpFLCBXQVJQX00sIFdBUlBfTj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PDxncmlkLCBibG9jaz4+PigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19GUDhfVFlQRSAoKilbTV0+KGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICgqKVtOXT4oYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGZsb2F0ICgqKVtOXT4oY19zcGxpdGspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAoKilbTV0+KGFzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKCopW2NlaWxfZGl2KE4sIFFVQU5UX0JMT0NLX1NJWkUpXT4oYnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICBjb25zdGV4cHIgdWludDMyX3QgUkVEVUNFX0JMT0NLID0gMjU2OwogICAgICAgIGdlbW1fa2VybmVsOjpyZWR1Y2U8PDxjZWlsX2RpdihNICogTiwgUkVEVUNFX0JMT0NLKSwgUkVEVUNFX0JMT0NLPj4+KE0sIE4sIFNQTElUS19GQUNUT1IsIGNfc3BsaXRrLCAoX19CRjE2X1RZUEUgKiljKTsKICAgIH0KICAgIGF1dG8gZXJyID0gSE9TVF9UWVBFKEdldExhc3RFcnJvcikoKTsKICAgIGlmIChlcnIgIT0gSE9TVF9UWVBFKFN1Y2Nlc3MpKSB7CiAgICAgICAgYWJvcnQoKTsKICAgIH0KfQpjb25zdGV4cHIgaW5saW5lIHVpbnQzMl90IHBhY2tfc2hhcGUoaW50IG0sIGludCBuLCBpbnQgaykgewogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIHJldHVybiAoKG0gLyAzMikgPDwgMTYpIHwgKChuIC8gMzIpIDw8IDgpIHwgKGsgLyAzMik7Cn0KI2RlZmluZSBESVNQQVRDSF9HRU1NKE0sIE4sIEssIEJNLCBCTiwgQkssIFdBUlBfTSwgV0FSUF9OLCBCTE9DS19TSVpFLCBTUExJVEtfRkFDVE9SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHBhY2tfc2hhcGVfY2hlY2tlZDxNLCBOLCBLPigpOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aW1lICYmIGdmbG9wcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0X3RpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoX2dlbW08TSwgTiwgSywgQk0sIEJOLCBCSywgV0FSUF9NLCBXQVJQX04sIEJMT0NLX1NJWkUsIDEyOCwgU1BMSVRLX0ZBQ1RPUj4oYV9wdHIsIGJfcHRyLCBjX3B0ciwgYXNfcHRyLCBic19wdHIpOyB0aW1lci5zdG9wX3RpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hfZ2VtbTxNLCBOLCBLLCBCTSwgQk4sIEJLLCBXQVJQX00sIFdBUlBfTiwgQkxPQ0tfU0laRSwgMTI4LCBTUExJVEtfRkFDVE9SPihhX3B0ciwgYl9wdHIsIGNfcHRyLCBhc19wdHIsIGJzX3B0cik7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CnRlbXBsYXRlIDxpbnQgTSwgaW50IE4sIGludCBLPgpjb25zdGV4cHIgaW5saW5lIHVpbnQzMl90IHBhY2tfc2hhcGVfY2hlY2tlZCgpIHsKICAgIHJldHVybiBwYWNrX3NoYXBlKE0sIE4sIEspOwp9CmNsYXNzIEtlcm5lbFRpbWVyIHsKcHJpdmF0ZToKICAgIGludCBtLCBuLCBrOwogICAgSE9TVF9UWVBFKEV2ZW50X3QpIHN0YXJ0LCBzdG9wOwogICAgZmxvYXQgKnRpbWVfcHRyOwogICAgZmxvYXQgKmdmbG9wc19wdHI7CnB1YmxpYzoKICAgIEtlcm5lbFRpbWVyKGludCBtLCBpbnQgbiwgaW50IGssIGZsb2F0ICp0aW1lLCBmbG9hdCAqZ2Zsb3BzKSA6IG0obSksIG4obiksIGsoayksIHRpbWVfcHRyKHRpbWUpLCBnZmxvcHNfcHRyKGdmbG9wcykgewogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudENyZWF0ZSkoJnN0YXJ0KSk7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50Q3JlYXRlKSgmc3RvcCkpOwogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudFJlY29yZCkoc3RhcnQpKTsKICAgIH0KICAgIHZvaWQgc3RhcnRfdGltZXIoKSB7IExJQl9DQUxMKEhPU1RfVFlQRShFdmVudFJlY29yZCkoc3RhcnQpKTsgfQogICAgdm9pZCBzdG9wX3RpbWVyKCkgewogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudFJlY29yZCkoc3RvcCkpOwogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudFN5bmNocm9uaXplKShzdG9wKSk7CiAgICAgICAgZmxvYXQgZWxhcHNlZF90aW1lOwogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudEVsYXBzZWRUaW1lKSgmZWxhcHNlZF90aW1lLCBzdGFydCwgc3RvcCkpOwogICAgICAgIGRvdWJsZSBmbG9wcyA9IDIuMCAqIHN0YXRpY19jYXN0PGRvdWJsZT4obSkgKiBzdGF0aWNfY2FzdDxkb3VibGU+KG4pICogc3RhdGljX2Nhc3Q8ZG91YmxlPihrKTsKICAgICAgICBkb3VibGUgZ2Zsb3BzX3ZhbCA9IChmbG9wcyAvIChlbGFwc2VkX3RpbWUgKiAxZS0zKSkgLyAxZTk7CiAgICAgICAgCiAgICAgICAgaWYgKHRpbWVfcHRyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgKnRpbWVfcHRyID0gZWxhcHNlZF90aW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZ2Zsb3BzX3B0ciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICpnZmxvcHNfcHRyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdmbG9wc192YWwpOwogICAgICAgIH0KICAgIH0KICAgIH5LZXJuZWxUaW1lcigpIHsKICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRXZlbnREZXN0cm95KShzdGFydCkpOwogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudERlc3Ryb3kpKHN0b3ApKTsKICAgIH0KfTsKdm9pZCBydW4odm9pZCAqYSwgdm9pZCAqYiwgdm9pZCAqYXMsIHZvaWQgKmJzLCB2b2lkICpjLCBpbnQgbSwgaW50IG4sIGludCBrLCBmbG9hdCAqdGltZSwgZmxvYXQgKmdmbG9wcykgewogICAgCiAgICAKICAgIGNvbnN0IF9fRlA4X1RZUEUgKmFfcHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgX19GUDhfVFlQRSAqPihhKTsKICAgIGNvbnN0IF9fRlA4X1RZUEUgKmJfcHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgX19GUDhfVFlQRSAqPihiKTsKICAgIF9fQkYxNl9UWVBFICpjX3B0ciA9IHN0YXRpY19jYXN0PF9fQkYxNl9UWVBFICo+KGMpOwogICAgY29uc3QgZmxvYXQgKmFzX3B0ciA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KGFzKTsKICAgIGNvbnN0IGZsb2F0ICpic19wdHIgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPihicyk7CiAgICBLZXJuZWxUaW1lciB0aW1lcihtLCBuLCBrLCB0aW1lLCBnZmxvcHMpOwogICAgc3dpdGNoKHBhY2tfc2hhcGUobSwgbiwgaykpIHsKI2lmZGVmIFRFU1RfT05fUkROQTQgCiAgICAgICAgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDY0LCAgICAgMTI4LCAgICA2NCwgICAgNjQsICAgIDMyLCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjQsICAgICAxNTM2LCAgIDcxNjgsICAgNjQsICAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDY0LCAgICAgMzA3MiwgICAxNTM2LCAgIDY0LCAgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDU3NiwgICAgNzE2OCwgICA2NCwgICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oOTYsICAgICA3MTY4LCAgIDI1NiwgICAgOTYsICAgIDI1NiwgICA2NCwgICAyLCAgICAgIDQsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDk2LCAgICAgNzE2OCwgICAyMDQ4LCAgIDk2LCAgICAyNTYsICAgNjQsICAgMiwgICAgICA0LCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg5NiwgICAgIDQ2MDgsICAgNzE2OCwgICA5NiwgICAgMjU2LCAgIDY0LCAgIDIsICAgICAgNCwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTI4LCAgICA3MTY4LCAgIDIzMDQsICAgMTI4LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEyOCwgICAgNTEyLCAgICA3MTY4LCAgIDEyOCwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg1MTIsICAgIDQwOTYsICAgNTEyLCAgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNTEyLCAgICAxNTM2LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgMTUzNiwgICA3MTY4LCAgICAxMjgsICAgIDEyOCwgICAgIDMyLCAgICAgIDIsICAgICAgMiwgICAgMTI4LCAgICAgNCk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICAzMDcyLCAgIDE1MzYsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgICA1NzYsICAgNzE2OCwgICAgMTI4LCAgICAgNjQsICAgICAzMiwgICAgICA0LCAgICAgIDEsICAgIDEyOCwgICAgIDQpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAgMjU2LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA3MTY4LCAgIDIwNDgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDQ2MDgsICAgNzE2OCwgICAgMTI4LCAgICAxMjgsICAgICAzMiwgICAgICAyLCAgICAgIDIsICAgIDEyOCwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAyMzA0LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICAgNTEyLCAgIDcxNjgsICAgICA2NCwgICAgMTI4LCAgICAgMzIsICAgICAgMiwgICAgICAyLCAgICAxMjgsICAgICA0KTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDQwOTYsICAgIDUxMiwgICAgMTI4LCAgICAyNTYsICAgICAzMiwgICAgICAyLCAgICAgIDQsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgMTUzNiwgICA3MTY4LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICAzMDcyLCAgIDE1MzYsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgICA1NzYsICAgNzE2OCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAgMjU2LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA3MTY4LCAgIDIwNDgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDQ2MDgsICAgNzE2OCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAyMzA0LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICAgNTEyLCAgIDcxNjgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDQwOTYsICAgIDUxMiwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKI2Vsc2UgCiAgICAgICAgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDY0LCAgICAgMTI4LCAgICA2NCwgICAgNjQsICAgIDMyLCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjQsICAgICAxNTM2LCAgIDcxNjgsICAgNjQsICAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDY0LCAgICAgMzA3MiwgICAxNTM2LCAgIDY0LCAgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDU3NiwgICAgNzE2OCwgICA2NCwgICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oOTYsICAgICA3MTY4LCAgIDI1NiwgICAgOTYsICAgIDI1NiwgICA2NCwgICAyLCAgICAgIDQsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDk2LCAgICAgNzE2OCwgICAyMDQ4LCAgIDk2LCAgICAyNTYsICAgNjQsICAgMiwgICAgICA0LCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg5NiwgICAgIDQ2MDgsICAgNzE2OCwgICA5NiwgICAgMjU2LCAgIDY0LCAgIDIsICAgICAgNCwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTI4LCAgICA3MTY4LCAgIDIzMDQsICAgMTI4LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEyOCwgICAgNTEyLCAgICA3MTY4LCAgIDEyOCwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg1MTIsICAgIDQwOTYsICAgNTEyLCAgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNTEyLCAgICAxNTM2LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgMTUzNiwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMik7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDMwNzIsICAgMTUzNiwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA1NzYsICAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICA4KTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAyNTYsICAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDcxNjgsICAgMjA0OCwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA0NjA4LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICA4KTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAyMzA0LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDUxMiwgICAgNzE2OCwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDgpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA0MDk2LCAgIDUxMiwgICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgMTUzNiwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDMwNzIsICAgMTUzNiwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA1NzYsICAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAyNTYsICAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDcxNjgsICAgMjA0OCwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA0NjA4LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAyMzA0LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDUxMiwgICAgNzE2OCwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDgpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA0MDk2LCAgIDUxMiwgICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKI2VuZGlmCiAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICBhYm9ydCgpOwogICAgICAgIH0KICAgIH0KfSAKdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgewogICAgaW50IG0gPSBhLnNpemUoMCk7CiAgICBpbnQgbiA9IGIuc2l6ZSgwKTsKICAgIGludCBrID0gYS5zaXplKDEpOwogICAgcnVuKChfX0ZQOF9UWVBFKilhLmRhdGFfcHRyKCksIChfX0ZQOF9UWVBFKiliLmRhdGFfcHRyKCksIAogICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAoX19CRjE2X1RZUEUqKWMuZGF0YV9wdHIoKSwgbSwgbiwgaywgbnVsbHB0ciwgbnVsbHB0cik7CiAgICAKfQoiIiIKaW1wb3J0IG9zCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0nZnA4X21tJywKICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwKICAgIGZ1bmN0aW9ucz1bJ2ZwOF9tbSddLAogICAgdmVyYm9zZT1UcnVlLAogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCJdLAopCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykKICAgIHJldHVybiBjNo newline at end of file+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcgpmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKQ1BQX1dSQVBQRVIgPSAiIiIKdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYyk7CiIiIgpDVURBX1NSQyA9ICIiIgojcHJhZ21hIG9uY2UKI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwMTYuaD4KI2RlZmluZSBQQVJBTUVURVJJWkVfTElCUkFSWQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9jb29wZXJhdGl2ZV9ncm91cHMuaD4KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+Cm5hbWVzcGFjZSB3bW1hID0gcm9jd21tYTsKI2lmZGVmIFRFU1RfT05fQ1VEQQpuYW1lc3BhY2Ugd21tYSA9IG52Y3VkYTo6d21tYTsKI2RlZmluZSBMSUJfQ0FMTChjYWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWRhRXJyb3JfdCBlcnIgPSBjYWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBjdWRhU3VjY2VzcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCiNkZWZpbmUgSE9TVF9UWVBFKHgpIGN1ZGEjI3gKI2Vsc2UKI2lmbmRlZiBISVBfSEVBREVSU19fCiNkZWZpbmUgSElQX0hFQURFUlNfXwojZW5kaWYKbmFtZXNwYWNlIHdtbWEgPSByb2N3bW1hOwojZGVmaW5lIExJQl9DQUxMKGNhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpcEVycm9yX3QgZXJyID0gY2FsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IGhpcFN1Y2Nlc3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKI2RlZmluZSBIT1NUX1RZUEUoeCkgaGlwIyN4CiNlbmRpZgojcHJhZ21hIG9uY2UKI2lmZGVmIFRFU1RfT05fQ1VEQQojZGVmaW5lIF9fRlA4X1RZUEUgX19udl9mcDhfZTRtMwojZGVmaW5lIF9fRlA4eDRfVFlQRSBfX252X2ZwOHg0X2U0bTMKI2RlZmluZSBfX0JGMTZfVFlQRSBfX252X2JmbG9hdDE2CiNkZWZpbmUgX19CRjE2eDJfVFlQRSBfX252X2JmbG9hdDE2MgojZWxzZQojaWZkZWYgVEVTVF9PTl9SRE5BNAojZGVmaW5lIF9fRlA4X1RZUEUgX19oaXBfZnA4X2U0bTMKI2RlZmluZSBfX0ZQOHg0X1RZUEUgX19oaXBfZnA4eDRfZTRtMwpjb25zdGV4cHIgY29uc3QgaW5saW5lIGludCBXQVZFX1NJWkUgPSAzMjsKI2Vsc2UKI2RlZmluZSBfX0ZQOF9UWVBFIF9faGlwX2ZwOF9lNG0zX2ZudXoKI2RlZmluZSBfX0ZQOHg0X1RZUEUgX19oaXBfZnA4eDRfZTRtM19mbnV6CmNvbnN0ZXhwciBjb25zdCBpbmxpbmUgaW50IFdBVkVfU0laRSA9IDY0OwojZW5kaWYKI2RlZmluZSBfX0JGMTZfVFlQRSBfX2hpcF9iZmxvYXQxNgojZGVmaW5lIF9fQkYxNngyX1RZUEUgX19oaXBfYmZsb2F0MTYyCiNkZWZpbmUgX19GUDE2X1RZUEUgX19oYWxmCiNkZWZpbmUgX19JTlQxNl9UWVBFIGludDE2X3QKI2VuZGlmCiNkZWZpbmUgX19GUDMyX1RZUEUgZmxvYXQKI2lmbmRlZiBHRU1NX0tFUk5FTAojZGVmaW5lIEdFTU1fS0VSTkVMCiN1bmRlZiBfX0hJUF9OT19IQUxGX09QRVJBVE9SU19fCiN1bmRlZiBfX0hJUF9OT19IQUxGX0NPTlZFUlNJT05TX18KI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKdGVtcGxhdGUgPGludCB4LCBpbnQgeT4gCmNvbnN0ZXhwciBfX2RldmljZV9fIF9faG9zdF9fIGlubGluZSBpbnQgZXhhY3RfZGl2KCkgewogICAgc3RhdGljX2Fzc2VydCh4ICUgeSA9PSAwKTsKICAgIHN0YXRpY19hc3NlcnQoeCA+PSB5KTsKICAgIHJldHVybiB4IC8geTsKICB9CiAgCmNvbnN0ZXhwciBfX2RldmljZV9fIF9faG9zdF9fIGlubGluZSBpbnQgY2VpbF9kaXYoaW50IHgsIGludCB5KSB7IAogICAgcmV0dXJuICh4ICsgeSAtIDEpIC8geTsKfQogIApuYW1lc3BhY2UgZ2VtbV9rZXJuZWwgewpfX2RldmljZV9fIGF1dG8gZ2V0Y2xvY2soKSB7CiAgICB1aW50NjRfdCBjbGs7CiAgICByZXR1cm4gY2xrOwp9CnRlbXBsYXRlPHR5cGVuYW1lIEVsZW0sIGludCBNLCBpbnQgTiwgaW50IFRJTEVfRElNLCBpbnQgQkxPQ0tfU0laRSwgaW50IFZFQ19TSVpFPgpfX2dsb2JhbF9fIHZvaWQgdHJhbnNwb3NlX2tlcm5lbChFbGVtKiBvZGF0YSwgY29uc3QgRWxlbSogaWRhdGEpIHsKICAgIGNvbnN0ZXhwciBhdXRvIFRCTE9DS19YID0gVElMRV9ESU0gLyBWRUNfU0laRTsKICAgIGNvbnN0ZXhwciBhdXRvIFRCTE9DS19ZID0gQkxPQ0tfU0laRSAvIFRCTE9DS19YOwogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIGNvbnN0ZXhwciBhdXRvIFBBRERJTkcgPSBUQkxPQ0tfWSAvIChCTE9DS19TSVpFIC8gd2FycFNpemUpOwogICAgX19zaGFyZWRfXyBFbGVtIHRpbGVbVElMRV9ESU1dW1RJTEVfRElNICsgUEFERElOR107CiAgICBpbnQgeCA9IGJsb2NrSWR4LnggKiBUSUxFX0RJTSArIHRocmVhZElkeC54ICogVkVDX1NJWkU7CiAgICBpbnQgeSA9IGJsb2NrSWR4LnkgKiBUSUxFX0RJTSArIHRocmVhZElkeC55OwogICAgCiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUSUxFX0RJTTsgaSArPSBUQkxPQ0tfWSkgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgdiA9IDA7IHYgPCBWRUNfU0laRTsgdisrKSB7CiAgICAgICAgICAgIHRpbGVbdGhyZWFkSWR4LnkgKyBpXVt0aHJlYWRJZHgueCAqIFZFQ19TSVpFICsgdl0gPSBpZGF0YVsoeSArIGkpICogTiArIHggKyB2XTsKICAgICAgICB9CiAgICB9CiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAKICAgIHggPSBibG9ja0lkeC55ICogVElMRV9ESU0gKyB0aHJlYWRJZHgueCAqIFZFQ19TSVpFOwogICAgeSA9IGJsb2NrSWR4LnggKiBUSUxFX0RJTSArIHRocmVhZElkeC55OwogICAgCiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUSUxFX0RJTTsgaSArPSBUQkxPQ0tfWSkgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgdiA9IDA7IHYgPCBWRUNfU0laRTsgdisrKSB7CiAgICAgICAgICAgIG9kYXRhWyh5ICsgaSkgKiBNICsgeCArIHZdID0gdGlsZVt0aHJlYWRJZHgueCAqIFZFQ19TSVpFICsgdl1bdGhyZWFkSWR4LnkgKyBpXTsKICAgICAgICB9CiAgICB9Cn0KdGVtcGxhdGU8dHlwZW5hbWUgRWxlbSwgaW50IE0sIGludCBOLCBpbnQgVElMRV9ESU0sIGludCBCTE9DS19TSVpFLCBpbnQgVkVDX1NJWkU+CnZvaWQgbGF1bmNoX3RyYW5zcG9zZShFbGVtICpvdXQsIGNvbnN0IEVsZW0gKmluKSB7CiAgICBzdGF0aWNfYXNzZXJ0KFRJTEVfRElNICUgVkVDX1NJWkUgPT0gMCk7CiAgICBjb25zdGV4cHIgYXV0byBUQkxPQ0tfWCA9IFRJTEVfRElNIC8gVkVDX1NJWkU7CiAgICBzdGF0aWNfYXNzZXJ0KEJMT0NLX1NJWkUgJSBUQkxPQ0tfWCA9PSAwKTsKICAgIGNvbnN0ZXhwciBhdXRvIFRCTE9DS19ZID0gQkxPQ0tfU0laRSAvIFRCTE9DS19YOwogICAgc3RhdGljX2Fzc2VydChNICUgVElMRV9ESU0gPT0gMCAmJiBOICUgVElMRV9ESU0gPT0gMCk7CiAgICB0cmFuc3Bvc2Vfa2VybmVsPEVsZW0sIE0sIE4sIFRJTEVfRElNLCBCTE9DS19TSVpFLCBWRUNfU0laRT48PDxkaW0zKE4gLyBUSUxFX0RJTSwgTSAvIFRJTEVfRElNKSwgZGltMyhUQkxPQ0tfWCwgVEJMT0NLX1kpPj4+KG91dCwgaW4pOwp9CnRlbXBsYXRlPHR5cGVuYW1lIEVsZW0+Cl9fZ2xvYmFsX18gdm9pZCBjaGVja190cmFucyhjb25zdCBFbGVtICpvcmlnaW4sIGNvbnN0IEVsZW0gKnRyYW5wb3NlZCwgaW50IG0sIGludCBuKSB7CiAgICBhdXRvIHggPSB0aHJlYWRJZHgueCArIGJsb2NrSWR4LnggKiBibG9ja0RpbS54OwogICAgYXV0byB5ID0gdGhyZWFkSWR4LnkgKyBibG9ja0lkeC55ICogYmxvY2tEaW0ueTsKICAgIGlmICh4IDwgbSAmJiB5IDwgbikgewogICAgICAgIGlmKG9yaWdpblt4ICogbiArIHldICE9IHRyYW5wb3NlZFt5ICogbSArIHhdKSB7CiAgICAgICAgfQogICAgfQp9CnRlbXBsYXRlIDx0eXBlbmFtZSBpbl9kYXRhX3R5cGUsIHR5cGVuYW1lIGFjY19kYXRhX3R5cGUsCiAgICB0eXBlbmFtZSBGcmFnQywgdHlwZW5hbWUgRnJhZ0EsIHR5cGVuYW1lIEZyYWdCLCAKICAgIGludCBQTSwgaW50IFBOLAogICAgaW50IEJNLCBpbnQgQk4sIGludCBCSywgCiAgICBpbnQgRlJBR19NLCBpbnQgRlJBR19OLCBpbnQgRlJBR19LLCAKICAgIGludCBXTU1BX00sIGludCBXTU1BX04sIGludCBXTU1BX0ssCiAgICBpbnQgV0FSUF9NLCBpbnQgV0FSUF9OLAogICAgaW50IEJMT0NLX1NJWkUsIGludCBCQVRDSF9TSVpFLCBpbnQgUVVBTlRfU0laRT4KX19kZXZpY2VfXyB2b2lkIHdtbWFfY29tcHV0ZSgKICAgIGNvbnN0IGluX2RhdGFfdHlwZSBzX2FbQk1dW0JLICsgOF0sCiAgICBjb25zdCBpbl9kYXRhX3R5cGUgc19iW0JOXVtCSyArIDhdLAogICAgY29uc3QgZmxvYXQgc19zW1BOXVtQTV0sCiAgICBGcmFnQyBmcmFnX3JbRlJBR19NXVtGUkFHX05dLAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX20sCiAgICBjb25zdCBpbnQgY29tcF9jX2ZyYWdfbgopIHsKICAgIEZyYWdDIGZyYWdfY1tGUkFHX01dW0ZSQUdfTl07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUkFHX007IGkrKykgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBGUkFHX047IGorKykgewogICAgICAgICAgICB3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfY1tpXVtqXSwgMC4wRik7CiAgICAgICAgfQogICAgfQogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IGsgPSAwOyBrIDwgRlJBR19LOyArK2spIHsKICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJBR19NOyBpKyspIHsKICAgICAgICAgICAgRnJhZ0EgZnJhZ19hOwogICAgICAgICAgICBpbnQgc19hX3JvdyA9IGsgKiBXTU1BX0s7CiAgICAgICAgICAgIGludCBzX2FfY29sID0gKGNvbXBfY19mcmFnX20gKiBGUkFHX00gKyBpKSAqIFdNTUFfTTsKICAgICAgICAgICAgd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZzX2Fbc19hX2NvbF1bc19hX3Jvd10sIEJLICsgOCk7CiAgICAgICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRlJBR19OOyBqKyspIHsKICAgICAgICAgICAgICAgIEZyYWdCIGZyYWdfYjsKICAgICAgICAgICAgICAgIGludCBzX2Jfcm93ID0gayAqIFdNTUFfSzsKICAgICAgICAgICAgICAgIGludCBzX2JfY29sID0gKGNvbXBfY19mcmFnX24gKiBGUkFHX04gKyBqKSAqIFdNTUFfTjsKICAgICAgICAgICAgICAgIHdtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmc19iW3NfYl9jb2xdW3NfYl9yb3ddLCBCSyArIDgpOwogICAgICAgICAgICAgICAgd21tYTo6bW1hX3N5bmMoZnJhZ19jW2ldW2pdLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19jW2ldW2pdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEZSQUdfTTsgaSsrKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEZSQUdfTjsgaisrKSB7CiAgICAgICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgRnJhZ0M6Om51bV9lbGVtZW50czsgKytrKSB7CiAgICAgICAgICAgICAgICAjaWZkZWYgVEVTVF9PTl9SRE5BNCAKICAgICAgICAgICAgICAgIGludCBtID0gKCh0aHJlYWRJZHgueCAmIDE2KSA+PiAxKSB8IChrICYgNykgfCAoY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGkpICogV01NQV9NOwogICAgICAgICAgICAgICAgI2Vsc2UgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBhdXRvIGxhbmUgPSB0aHJlYWRJZHgueCAlIDY0OwogICAgICAgICAgICAgICAgaW50IG0sIG47CiAgICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKFdNTUFfTSA9PSAzMikgewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIG0gPSAoOCAqIChrIC8gNCkgJSAzMikgKyA0ICogKGxhbmUgLyAzMikgKyAoayAlIDQpOwogICAgICAgICAgICAgICAgICAgIG4gPSBsYW5lICUgMzI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIG0gPSA0ICogKGxhbmUgLyAxNikgKyAoayAlIDQpOwogICAgICAgICAgICAgICAgICAgIG4gPSBsYW5lICUgMTY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtICs9IChjb21wX2NfZnJhZ19tICogRlJBR19NICsgaSkgKiBXTU1BX007CiAgICAgICAgICAgICAgICBuICs9IChjb21wX2NfZnJhZ19uICogRlJBR19OICsgaikgKiBXTU1BX047CiAgICAgICAgICAgICAgICBuID0gbiAvIFFVQU5UX1NJWkU7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBzX3Nbbl1bbV07CiAgICAgICAgICAgICAgICBmcmFnX3JbaV1bal0ueFtrXSArPSAoYWNjX2RhdGFfdHlwZSlzY2FsZSAqIChhY2NfZGF0YV90eXBlKWZyYWdfY1tpXVtqXS54W2tdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cl9fZGV2aWNlX18gcm9jd21tYTo6YmZsb2F0MTZfdCBmYXN0X2YzMnRvYjE2KGZsb2F0IGYpIHsKICAgIHVuaW9uIHsKICAgIGZsb2F0IGZwMzI7CiAgICB1bnNpZ25lZCBpbnQgdTMyOwogICAgfSB1ID0ge2Z9OwogICAgdS51MzIgKz0gMHg3ZmZmICsgKCh1LnUzMiA+PiAxNikgJiAxKTsKICAgIGF1dG8gcmV0ID0gdS51MzIgPj4gMTY7CiAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxyb2N3bW1hOjpiZmxvYXQxNl90Jj4ocmV0KTsKfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgYWNjX2RhdGFfdHlwZSwgdHlwZW5hbWUgb3V0X2RhdGFfdHlwZSwgCnR5cGVuYW1lIEZyYWdDLCB0eXBlbmFtZSBGcmFnT3V0LCBpbnQgV01NQV9NLCBpbnQgV01NQV9OLCAKaW50IEJNLCBpbnQgQk4sIGludCBNLCBpbnQgTiwgaW50IEZSQUdfTSwgaW50IEZSQUdfTj4KX19kZXZpY2VfXyBpbmxpbmUgdm9pZCBzdG9yZV9yZXN1bHQoCiAgICBvdXRfZGF0YV90eXBlIGNbTV1bTl0sIAogICAgRnJhZ0MgZnJhZ19yW0ZSQUdfTV1bRlJBR19OXSwgCiAgICBjb25zdCBpbnQgbSwKICAgIGNvbnN0IGludCBuLAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX20sIAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX24KKSB7CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUkFHX007IGkrKykgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBGUkFHX047IGorKykgewogICAgICAgICAgICBpbnQgZnJhZ19tID0gY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGk7CiAgICAgICAgICAgIGludCBmcmFnX24gPSBjb21wX2NfZnJhZ19uICogRlJBR19OICsgajsKICAgICAgICAgICAgaW50IHJvdyA9IG0gKyBmcmFnX20gKiBXTU1BX007CiAgICAgICAgICAgIGludCBjb2wgPSBuICsgZnJhZ19uICogV01NQV9OOwogICAgICAgICAgICBpZiAoKChNICUgQk0gPT0gMCkgfHwgKHJvdyA8IE0pKSAmJiAoKE4gJSBCTiA9PSAwKSB8fCAoY29sIDwgTikpKSB7CiAgICAgICAgICAgICAgICBvdXRfZGF0YV90eXBlICpjX3B0ciA9ICZjW3Jvd11bY29sXTsKICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoc2l6ZW9mKGFjY19kYXRhX3R5cGUpID09IHNpemVvZihvdXRfZGF0YV90eXBlKSkgewogICAgICAgICAgICAgICAgICAgIHdtbWE6OnN0b3JlX21hdHJpeF9zeW5jKHJlaW50ZXJwcmV0X2Nhc3Q8b3V0X2RhdGFfdHlwZSo+KGNfcHRyKSwgZnJhZ19yW2ldW2pdLCBOLCB3bW1hOjptZW1fcm93X21ham9yKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKHNpemVvZihvdXRfZGF0YV90eXBlKSA9PSBzaXplb2YoaGFsZikpIHsKICAgICAgICAgICAgICAgICAgICBGcmFnT3V0IGZyYWdfb3V0OwogICAgICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGhhbGYpID09IHNpemVvZihvdXRfZGF0YV90eXBlKSk7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChGcmFnT3V0OjpudW1fZWxlbWVudHMgPT0gRnJhZ0M6Om51bV9lbGVtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wO2s8RnJhZ091dDo6bnVtX2VsZW1lbnRzOysraykgewogICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlZyA9IGZhc3RfZjMydG9iMTYoZnJhZ19yW2ldW2pdLnhba10pOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFnX291dC54W2tdID0gKnJlaW50ZXJwcmV0X2Nhc3Q8aGFsZio+KCZyZWcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhyZWludGVycHJldF9jYXN0PGhhbGYqPihjX3B0ciksIGZyYWdfb3V0LCBOLCB3bW1hOjptZW1fcm93X21ham9yKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KdGVtcGxhdGU8aW50IFNwbGl0az4KX19nbG9iYWxfXyB2b2lkIHJlZHVjZSh1aW50MzJfdCBtLCB1aW50MzJfdCBuLCBjb25zdCBmbG9hdCAqY19zcGxpdGssIF9faGlwX2JmbG9hdDE2ICpjKSB7CiAgICBhdXRvIHRpZCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkID49IG0gKiBuKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZmxvYXQ0IHN1bXt9OwogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoYXV0byBpID0gMDsgaSA8IFNwbGl0azsgKytpKSB7CiAgICAgICAgc3VtICs9ICooZmxvYXQ0KikmY19zcGxpdGtbaSAqIChtICogbikgKyB0aWQgKiA0XTsKICAgIH0KICAgIGF1dG8gcmVzID0gcm9jd21tYTo6bWFrZV92ZWN0b3IoZmFzdF9mMzJ0b2IxNihzdW0ueCksIGZhc3RfZjMydG9iMTYoc3VtLnkpLCBmYXN0X2YzMnRvYjE2KHN1bS56KSwgZmFzdF9mMzJ0b2IxNihzdW0udykpOwogICAgKihkZWNsdHlwZShyZXMpKikmY1t0aWQgKiA0XSA9IHJlczsKfQogICAgCiNpZmRlZiBQQVJBTUVURVJJWkVfTElCUkFSWQp0ZW1wbGF0ZSA8CiAgICB0eXBlbmFtZSBpbl9kYXRhX3R5cGUsCiAgICB0eXBlbmFtZSBhY2NfZGF0YV90eXBlLCAKICAgIHR5cGVuYW1lIG91dF9kYXRhX3R5cGUsIAogICAgaW50IE0sIGludCBOLCBpbnQgSywgICAgCiAgICBpbnQgQk0sIGludCBCTiwgaW50IEJLLCAKICAgIGludCBRVUFOVF9TSVpFLCAgICAgICAgIAogICAgaW50IEJMT0NLX1NJWkUsICAgICAgICAgCiAgICBpbnQgV0FSUF9NLCBpbnQgV0FSUF9OLCAKICAgIGludCBMREEsIGludCBMREIKPgojZWxzZQp1c2luZyBpbl9kYXRhX3R5cGUgPSBfX0ZQOF9UWVBFOwp1c2luZyBvdXRfZGF0YV90eXBlID0gX19CRjE2X1RZUEU7CnVzaW5nIGFjY19kYXRhX3R5cGUgPSBmbG9hdDsKY29uc3RleHByIGludCBNID0gNjE0NCwgTiA9IDQ2MDgsIEsgPSA3MTY4Owpjb25zdGV4cHIgaW50IExEQSA9IEssIExEQiA9IEs7CmNvbnN0ZXhwciBpbnQgQk0gPSAyNTYsIEJOID0gMTI4LCBCSyA9IDEyODsKY29uc3RleHByIGludCBRVUFOVF9TSVpFID0gMTI4LCBCTE9DS19TSVpFID0gNTEyOwojaWZkZWYgVEVTVF9PTl9SRE5BNCAKY29uc3RleHByIGludCBXQVJQX00gPSA0LCBXQVJQX04gPSAyOwojZWxzZSAKY29uc3RleHByIGludCBXQVJQX00gPSA0LCBXQVJQX04gPSAyOwojZW5kaWYKI2VuZGlmIApfX2dsb2JhbF9fIF9fbGF1bmNoX2JvdW5kc19fKEJMT0NLX1NJWkUpIHZvaWQgZ2VtbV9rZXJuZWwoCiAgICBjb25zdCBpbl9kYXRhX3R5cGUgYVtNXVtMREFdLAogICAgY29uc3QgaW5fZGF0YV90eXBlIGJbTl1bTERCXSwKICAgIG91dF9kYXRhX3R5cGUgY1tNXVtOXSwKICAgIGNvbnN0IGZsb2F0IHNhW2NlaWxfZGl2KEssIFFVQU5UX1NJWkUpXVtNIC8gMSAgICAgICAgXSwgCiAgICBjb25zdCBmbG9hdCBzYltjZWlsX2RpdihLLCBRVUFOVF9TSVpFKV1bY2VpbF9kaXYoTiwgUVVBTlRfU0laRSldCikgewogICAgCiAgICBjb25zdGV4cHIgaW50IFdNTUFfTSA9IDE2OyAKICAgIGNvbnN0ZXhwciBpbnQgV01NQV9OID0gMTY7IAogICAgY29uc3RleHByIGludCBXTU1BX0sgPSAzMjsgCiAgICAKICAgIAogICAgCiAgICAKICAgIGNvbnN0ZXhwciBpbnQgV0FSUF9OVU0gPSBXQVJQX00gKiBXQVJQX047IAogICAgCiAgICAKICAgIGNvbnN0ZXhwciBpbnQgRlJBR19NX1BFUl9XQVJQID0gQk0gLyBXTU1BX00gLyBXQVJQX007CiAgICBjb25zdGV4cHIgaW50IEZSQUdfTl9QRVJfV0FSUCA9IEJOIC8gV01NQV9OIC8gV0FSUF9OOwogICAgY29uc3RleHByIGludCBGUkFHX0sgPSBCSyAvIFdNTUFfSzsgCiAgICAKICAgIGNvbnN0ZXhwciBpbnQgUU0gPSBNOyAKICAgIGNvbnN0ZXhwciBpbnQgUU4gPSBjZWlsX2RpdihOLCBRVUFOVF9TSVpFKTsgCiAgICBjb25zdGV4cHIgaW50IFFLID0gY2VpbF9kaXYoSywgUVVBTlRfU0laRSk7IAogICAgY29uc3RleHByIGludCBQTSA9IEJNOyAKICAgIGNvbnN0ZXhwciBpbnQgUE4gPSBjZWlsX2RpdihCTiwgUVVBTlRfU0laRSk7IAogICAgCiAgICB1c2luZyBGcmFnQSA9IHdtbWE6OmZyYWdtZW50PHdtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBpbl9kYXRhX3R5cGUsIHdtbWE6OnJvd19tYWpvcj47CiAgICB1c2luZyBGcmFnQiA9IHdtbWE6OmZyYWdtZW50PHdtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBpbl9kYXRhX3R5cGUsIHdtbWE6OmNvbF9tYWpvcj47CiAgICB1c2luZyBGcmFnQyA9IHdtbWE6OmZyYWdtZW50PHdtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBhY2NfZGF0YV90eXBlPjsKICAgIHVzaW5nIEZyYWdPdXQgPSB3bW1hOjpmcmFnbWVudDx3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgaGFsZj47IAogICAgX19zaGFyZWRfXyBpbl9kYXRhX3R5cGUgIHNfYVtCTV1bQksgKyA4XTsKICAgIF9fc2hhcmVkX18gaW5fZGF0YV90eXBlICBzX2JbQk5dW0JLICsgOF07CiAgICBfX3NoYXJlZF9fIGFjY19kYXRhX3R5cGUgc19zW1BOXVtQTV07IAogICAgRnJhZ0MgZnJhZ19yW0ZSQUdfTV9QRVJfV0FSUF1bRlJBR19OX1BFUl9XQVJQXTsgCiAgICAKICAgIGEgPSAoZGVjbHR5cGUoYSkpKChpbl9kYXRhX3R5cGUqKWEgKyBibG9ja0lkeC56ICogSyk7CiAgICBiID0gKGRlY2x0eXBlKGIpKSgoaW5fZGF0YV90eXBlKiliICsgYmxvY2tJZHgueiAqIEspOwogICAgYyArPSBibG9ja0lkeC56ICogTTsKICAgIHNhICs9IGJsb2NrSWR4LnogKiBRSzsKICAgIHNiICs9IGJsb2NrSWR4LnogKiBRSzsKICAgIGludCB0aWQgPSB0aHJlYWRJZHgueDsgCiAgICBpbnQgd2lkID0gdGlkIC8gV0FWRV9TSVpFOyAKICAgIAogICAgY29uc3RleHByIGludCBpdGVyYXRpb25fb3Zlcl9rID0gY2VpbF9kaXYoSywgQkspOyAKICAgIGNvbnN0ZXhwciBpbnQgTE9BRF9CQVRDSF9TSVpFID0gMTY7IAogICAgY29uc3RleHByIGF1dG8gUElQRUxJTkUgPSB0cnVlOwogICAgCiAgICB1c2luZyBMb2FkVmVjID0gX19hdHRyaWJ1dGVfXyggKF9fdmVjdG9yX3NpemVfXyhMT0FEX0JBVENIX1NJWkUpICkpIGZsb2F0OwogICAgTG9hZFZlYyByZWdfYVtCSyAqIEJNIC8gQkxPQ0tfU0laRSAvIExPQURfQkFUQ0hfU0laRV07CiAgICBMb2FkVmVjIHJlZ19iW0JLICogQk4gLyBCTE9DS19TSVpFIC8gTE9BRF9CQVRDSF9TSVpFXTsKICAgIGNvbnN0ZXhwciBhdXRvIFBLID0gY2VpbF9kaXYoQkssIFFVQU5UX1NJWkUpOwogICAgZmxvYXQgcmVnX3NhW2NlaWxfZGl2KFBNLCBCTE9DS19TSVpFKV07CiAgICBmbG9hdCByZWdfc2JbY2VpbF9kaXYoUE4sIEJMT0NLX1NJWkUpXTsKICAgIAogICAgYXV0byBsb2dfdGlsZSA9IDE7CiAgICBhdXRvIGJsb2NrX2lkeF94ID0gYmxvY2tJZHgueCA+PiBsb2dfdGlsZTsKICAgIGF1dG8gYmxvY2tfaWR4X3kgPSAoYmxvY2tJZHgueSA8PCBsb2dfdGlsZSkgKyAoKGJsb2NrSWR4LngpICYgKCgxIDw8IChsb2dfdGlsZSkpIC0gMSkpOwogICAgaWYgKGJsb2NrX2lkeF94ID49IGNlaWxfZGl2KE4sIEJOKSB8fCBibG9ja19pZHhfeSA+PSBjZWlsX2RpdihNLCBCTSkpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpbnQgbSA9IGJsb2NrX2lkeF95ICogQk07CiAgICBjb25zdCBpbnQgbiA9IGJsb2NrX2lkeF94ICogQk47CiAgICBpbnQgayA9IDA7CiAgICBhdXRvIGdsb2JhbDJyZWcgPSBbJl0oKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCByZWcgPSAwOyByZWcgPCBzaXplb2YocmVnX3NhKSAvIHNpemVvZihmbG9hdCk7IHJlZysrKSB7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaW50IHQgPSB0aWQgKyByZWcgKiBCTE9DS19TSVpFOwogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaW50IGkgPSB0IC8gUE07CiAgICAgICAgICAgIGludCBqID0gdCAlIFBNOwogICAgICAgICAgICByZWdfc2FbcmVnXSA9IHNhW2sgLyBRVUFOVF9TSVpFXVsobSArIGopXTsKICAgICAgICB9CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCByZWcgPSAwOyByZWcgPCBzaXplb2YocmVnX3NiKSAvIHNpemVvZihmbG9hdCk7IHJlZysrKSB7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaW50IHQgPSB0aWQgKyByZWcgKiBCTE9DS19TSVpFOwogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaW50IGkgPSB0IC8gUE47CiAgICAgICAgICAgIGludCBqID0gdCAlIFBOOwogICAgICAgICAgICByZWdfc2JbcmVnXSA9IHNiW2sgLyBRVUFOVF9TSVpFXVsobikgLyBRVUFOVF9TSVpFICsgal07CiAgICAgICAgfQogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgcmVnID0gMDsgcmVnIDwgc2l6ZW9mKHJlZ19hKSAvIHNpemVvZihMb2FkVmVjKTsgcmVnKyspIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBpbnQgdCA9IHRpZCAqIExPQURfQkFUQ0hfU0laRSArIHJlZyAqIEJMT0NLX1NJWkUgKiBMT0FEX0JBVENIX1NJWkU7CiAgICAgICAgICAgIGludCBpID0gdCAvIEJLOwogICAgICAgICAgICBpbnQgaiA9IHQgJSBCSzsKICAgICAgICAgICAgcmVnX2FbcmVnXSA9ICooTG9hZFZlYyopJmFbbSArIGldW2sgKyBqXTsKICAgICAgICB9CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCByZWcgPSAwOyByZWcgPCBzaXplb2YocmVnX2IpIC8gc2l6ZW9mKExvYWRWZWMpOyByZWcrKykgewogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIGludCB0ID0gdGlkICogTE9BRF9CQVRDSF9TSVpFICsgcmVnICogQkxPQ0tfU0laRSAqIExPQURfQkFUQ0hfU0laRTsKICAgICAgICAgICAgaW50IGkgPSB0IC8gQks7CiAgICAgICAgICAgIGludCBqID0gdCAlIEJLOwogICAgICAgICAgICByZWdfYltyZWddID0gKihMb2FkVmVjKikmYltuICsgaV1bayArIGpdOwogICAgICAgIH0KICAgIH07CiAgICBhdXRvIHJlZzJsZHMgPSBbJl0oKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCByZWdhID0gMDsgcmVnYSA8IHNpemVvZihyZWdfc2EpIC8gc2l6ZW9mKGZsb2F0KTsgcmVnYSsrKSB7CiAgICAgICAgICAgIGludCB0YSA9IHRpZCArIHJlZ2EgKiBCTE9DS19TSVpFOwogICAgICAgICAgICBpbnQgaiA9IHRhICUgUE07CiAgICAgICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgICAgIGZvciAoaW50IHJlZ2IgPSAwOyByZWdiIDwgc2l6ZW9mKHJlZ19zYikgLyBzaXplb2YoZmxvYXQpOyByZWdiKyspIHsKICAgICAgICAgICAgICAgIGludCB0YiA9IHRpZCArIHJlZ2IgKiBCTE9DS19TSVpFOwogICAgICAgICAgICAgICAgaW50IGkgPSB0YiAlIFBOOwogICAgICAgICAgICAgICAgc19zW2ldW2pdID0gcmVnX3NhW3JlZ2FdICogcmVnX3NiW3JlZ2JdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgcmVnID0gMDsgcmVnIDwgc2l6ZW9mKHJlZ19hKSAvIHNpemVvZihMb2FkVmVjKTsgcmVnKyspIHsKICAgICAgICAgICAgaW50IHQgPSB0aWQgKiBMT0FEX0JBVENIX1NJWkUgKyByZWcgKiBCTE9DS19TSVpFICogTE9BRF9CQVRDSF9TSVpFOwogICAgICAgICAgICBpbnQgaSA9IHQgLyBCSzsKICAgICAgICAgICAgaW50IGogPSB0ICUgQks7CiAgICAgICAgICAgICooTG9hZFZlYyopJnNfYVtpXVtqXSA9IHJlZ19hW3JlZ107CiAgICAgICAgfQogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgcmVnID0gMDsgcmVnIDwgc2l6ZW9mKHJlZ19iKSAvIHNpemVvZihMb2FkVmVjKTsgcmVnKyspIHsKICAgICAgICAgICAgaW50IHQgPSB0aWQgKiBMT0FEX0JBVENIX1NJWkUgKyByZWcgKiBCTE9DS19TSVpFICogTE9BRF9CQVRDSF9TSVpFOwogICAgICAgICAgICBpbnQgaSA9IHQgLyBCSzsKICAgICAgICAgICAgaW50IGogPSB0ICUgQks7CiAgICAgICAgICAgICooTG9hZFZlYyopJnNfYltpXVtqXSA9IHJlZ19iW3JlZ107CiAgICAgICAgfQogICAgfTsKICAgIGlmIGNvbnN0ZXhwciAoUElQRUxJTkUpIHsKICAgICAgICBnbG9iYWwycmVnKCk7CiAgICB9CiAgICAKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEZSQUdfTV9QRVJfV0FSUDsgaSsrKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEZSQUdfTl9QRVJfV0FSUDsgaisrKSB7CiAgICAgICAgICAgIHdtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19yW2ldW2pdLCAwLjBmKTsgCiAgICAgICAgfQogICAgfQogICAgaWYgY29uc3RleHByICghUElQRUxJTkUpIHsKICAgICAgICBnbG9iYWwycmVnKCk7CiAgICB9CiAgICByZWcybGRzKCk7CiAgICBmb3IgKGludCBiayA9IDE7IGJrIDwgaXRlcmF0aW9uX292ZXJfazsgYmsrKykgewogICAgICAgIGsgPSBiayAqIEJLOwogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIGlmIGNvbnN0ZXhwciAoUElQRUxJTkUpIHsKICAgICAgICAgICAgZ2xvYmFsMnJlZygpOwogICAgICAgIH0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAgICAgCiAgICAgICAgd21tYV9jb21wdXRlPGluX2RhdGFfdHlwZSwgYWNjX2RhdGFfdHlwZSwgRnJhZ0MsIEZyYWdBLCBGcmFnQiwKICAgICAgICAgICAgUE0sIFBOLCBCTSwgQk4sIEJLLCBGUkFHX01fUEVSX1dBUlAsIEZSQUdfTl9QRVJfV0FSUCwgRlJBR19LLAogICAgICAgICAgICBXTU1BX00sIFdNTUFfTiwgV01NQV9LLAogICAgICAgICAgICBXQVJQX00sIFdBUlBfTiwKICAgICAgICAgICAgQkxPQ0tfU0laRSwgTE9BRF9CQVRDSF9TSVpFLCBRVUFOVF9TSVpFPiggCiAgICAgICAgICAgICAgICBzX2EsIHNfYiwgc19zLCBmcmFnX3IsIHdpZCAvIFdBUlBfTiwgd2lkICUgV0FSUF9OKTsKICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAgICAgaWYgY29uc3RleHByICghUElQRUxJTkUpIHsKICAgICAgICAgICAgZ2xvYmFsMnJlZygpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZWcybGRzKCk7CiAgICB9CiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB3bW1hX2NvbXB1dGU8aW5fZGF0YV90eXBlLCBhY2NfZGF0YV90eXBlLCBGcmFnQywgRnJhZ0EsIEZyYWdCLAogICAgICAgIFBNLCBQTiwgQk0sIEJOLCBCSywgRlJBR19NX1BFUl9XQVJQLCBGUkFHX05fUEVSX1dBUlAsIEZSQUdfSywKICAgICAgICBXTU1BX00sIFdNTUFfTiwgV01NQV9LLAogICAgICAgIFdBUlBfTSwgV0FSUF9OLAogICAgICAgIEJMT0NLX1NJWkUsIExPQURfQkFUQ0hfU0laRSwgUVVBTlRfU0laRT4oIAogICAgICAgICAgICBzX2EsIHNfYiwgc19zLCBmcmFnX3IsIHdpZCAvIFdBUlBfTiwgd2lkICUgV0FSUF9OKTsKICAgIAogICAgc3RvcmVfcmVzdWx0PGFjY19kYXRhX3R5cGUsIG91dF9kYXRhX3R5cGUsIEZyYWdDLCBGcmFnT3V0LAogICAgICAgIFdNTUFfTSwgV01NQV9OLCBCTSwgQk4sIE0sIE4sIEZSQUdfTV9QRVJfV0FSUCwgRlJBR19OX1BFUl9XQVJQPigKICAgICAgICAgICAgYywgZnJhZ19yLCBibG9ja19pZHhfeSAqIEJNLCBibG9ja19pZHhfeCAqIEJOLAogICAgICAgICAgICB3aWQgLyBXQVJQX04sIHdpZCAlIFdBUlBfTik7Cn07Cn07IAojaWZuZGVmICBQQVJBTUVURVJJWkVfTElCUkFSWQoKI2VuZGlmCiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKI2VuZGlmCiNkZWZpbmUgUEFSQU1FVEVSSVpFX0xJQlJBUlkKI3VuZGVmIFBBUkFNRVRFUklaRV9MSUJSQVJZCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmZsb2F0ICpjX3NwbGl0a3tudWxscHRyfTsKc2l6ZV90IGNfc3BsaXRrX3NpemV7MH07Cl9fRlA4X1RZUEUgKmFfdHJhbnN7bnVsbHB0cn07CnNpemVfdCBhX3RyYW5zX3NpemV7MH07Cl9fRlA4X1RZUEUgKmJfdHJhbnN7bnVsbHB0cn07CnNpemVfdCBiX3RyYW5zX3NpemV7MH07CnRlbXBsYXRlIDxpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgQk0sIGludCBCTiwgaW50IEJLLCBpbnQgV0FSUF9NLCBpbnQgV0FSUF9OLCBpbnQgQkxPQ0tfU0laRSwgaW50IFFVQU5UX0JMT0NLX1NJWkUsIGludCBTUExJVEtfRkFDVE9SPgp2b2lkIGxhdW5jaF9nZW1tKGNvbnN0IF9fRlA4X1RZUEUgKmEsIGNvbnN0IF9fRlA4X1RZUEUgKmIsIF9fQkYxNl9UWVBFICpjLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicykgewogICAgaWYoYV90cmFuc19zaXplIDwgTSAqIEsgKiBzaXplb2YoX19GUDhfVFlQRSkpIHsKICAgICAgICBhX3RyYW5zX3NpemUgPSBzdGQ6Om1heCg2MTQ0KjcxNjgsIE0gKiBLKSAqIHNpemVvZihfX0ZQOF9UWVBFKTsKICAgICAgICAKICAgICAgICBpZiAoYV90cmFucykgewogICAgICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRnJlZUFzeW5jKShhX3RyYW5zLCAwKSk7CiAgICAgICAgfQogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShNYWxsb2NBc3luYykoJmFfdHJhbnMsIGFfdHJhbnNfc2l6ZSwgMCkpOwogICAgfQogICAgaWYoYl90cmFuc19zaXplIDwgTiAqIEsgKiBzaXplb2YoX19GUDhfVFlQRSkpIHsKICAgICAgICBiX3RyYW5zX3NpemUgPSBzdGQ6Om1heCg3MTY4KjQ2MDgsIE4gKiBLKSAqIHNpemVvZihfX0ZQOF9UWVBFKTsKICAgICAgICAKICAgICAgICBpZiAoYl90cmFucykgewogICAgICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRnJlZUFzeW5jKShiX3RyYW5zLCAwKSk7CiAgICAgICAgfQogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShNYWxsb2NBc3luYykoJmJfdHJhbnMsIGJfdHJhbnNfc2l6ZSwgMCkpOwogICAgfQogICAgZ2VtbV9rZXJuZWw6OmxhdW5jaF90cmFuc3Bvc2U8X19GUDhfVFlQRSwgSywgTSwgNjQsIDUxMiwgND4oYV90cmFucywgYSk7CiAgICBnZW1tX2tlcm5lbDo6bGF1bmNoX3RyYW5zcG9zZTxfX0ZQOF9UWVBFLCBLLCBOLCA2NCwgNTEyLCA0PihiX3RyYW5zLCBiKTsKICAgIAogICAgCiAgICBkaW0zIGdyaWQoY2VpbF9kaXYoTiwgQk4pIDw8IDEsIGNlaWxfZGl2KE0sIEJNKSA+PiAxLCBTUExJVEtfRkFDVE9SKTsKICAgIGRpbTMgYmxvY2soQkxPQ0tfU0laRSk7CiAgICBpZiBjb25zdGV4cHIgKFNQTElUS19GQUNUT1IgPT0gMSkgewogICAgICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDxfX0ZQOF9UWVBFLCBmbG9hdCwgX19CRjE2X1RZUEUsIE0sIE4sIEssIEJNLCBCTiwgQkssIFFVQU5UX0JMT0NLX1NJWkUsIEJMT0NLX1NJWkUsIFdBUlBfTSwgV0FSUF9OLCBLLCBLPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8PGdyaWQsIGJsb2NrPj4+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICgqKVtLXT4oYV90cmFucyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fRlA4X1RZUEUgKCopW0tdPihiX3RyYW5zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8X19CRjE2X1RZUEUgKCopW05dPihjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKCopW01dPihhcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICgqKVtjZWlsX2RpdihOLCBRVUFOVF9CTE9DS19TSVpFKV0+KGJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIGlmKGNfc3BsaXRrX3NpemUgPCBTUExJVEtfRkFDVE9SICogTSAqIE4gKiBzaXplb2YoZmxvYXQpKSB7CiAgICAgICAgICAgIGNfc3BsaXRrX3NpemUgPSBzdGQ6Om1heCgxMDI0KjQ2MDgqMiwgU1BMSVRLX0ZBQ1RPUiAqIE0gKiBOKSAqIHNpemVvZihmbG9hdCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY19zcGxpdGspIHsKICAgICAgICAgICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShGcmVlQXN5bmMpKGNfc3BsaXRrLCAwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKE1hbGxvY0FzeW5jKSgmY19zcGxpdGssIGNfc3BsaXRrX3NpemUsIDApKTsKICAgICAgICB9CiAgICAgICAgZ2VtbV9rZXJuZWw6OmdlbW1fa2VybmVsPF9fRlA4X1RZUEUsIGZsb2F0LCBmbG9hdCwgTSwgTiwgSyAvIFNQTElUS19GQUNUT1IsIEJNLCBCTiwgQkssIFFVQU5UX0JMT0NLX1NJWkUsIEJMT0NLX1NJWkUsIFdBUlBfTSwgV0FSUF9OLCBLLCBLPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8PGdyaWQsIGJsb2NrPj4+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICgqKVtLXT4oYV90cmFucyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fRlA4X1RZUEUgKCopW0tdPihiX3RyYW5zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKCopW05dPihjX3NwbGl0ayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICgqKVtNXT4oYXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAoKilbY2VpbF9kaXYoTiwgUVVBTlRfQkxPQ0tfU0laRSldPihicykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBSRURVQ0VfQkxPQ0sgPSAyNTY7CiAgICAgICAgZ2VtbV9rZXJuZWw6OnJlZHVjZTxTUExJVEtfRkFDVE9SPjw8PGNlaWxfZGl2KE0gKiBOIC8gNCwgUkVEVUNFX0JMT0NLKSwgUkVEVUNFX0JMT0NLPj4+KE0sIE4sIGNfc3BsaXRrLCAoX19CRjE2X1RZUEUgKiljKTsKICAgIH0KfQpjb25zdGV4cHIgaW5saW5lIHVpbnQzMl90IHBhY2tfc2hhcGUoaW50IG0sIGludCBuLCBpbnQgaykgewogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIHJldHVybiAoKG0gLyAzMikgPDwgMTYpIHwgKChuIC8gMzIpIDw8IDgpIHwgKGsgLyAzMik7Cn0KI2RlZmluZSBESVNQQVRDSF9HRU1NKE0sIE4sIEssIEJNLCBCTiwgQkssIFdBUlBfTSwgV0FSUF9OLCBCTE9DS19TSVpFLCBTUExJVEtfRkFDVE9SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHBhY2tfc2hhcGVfY2hlY2tlZDxNLCBOLCBLPigpOiB7ICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaF9nZW1tPE0sIE4sIEssIEJNLCBCTiwgQkssIFdBUlBfTSwgV0FSUF9OLCBCTE9DS19TSVpFLCAxMjgsIFNQTElUS19GQUNUT1I+KGFfcHRyLCBiX3B0ciwgY19wdHIsIGFzX3B0ciwgYnNfcHRyKTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KdGVtcGxhdGUgPGludCBNLCBpbnQgTiwgaW50IEs+CmNvbnN0ZXhwciBpbmxpbmUgdWludDMyX3QgcGFja19zaGFwZV9jaGVja2VkKCkgewogICAgcmV0dXJuIHBhY2tfc2hhcGUoTSwgTiwgSyk7Cn0KY2xhc3MgS2VybmVsVGltZXIgewpwcml2YXRlOgogICAgaW50IG0sIG4sIGs7CiAgICBIT1NUX1RZUEUoRXZlbnRfdCkgc3RhcnQsIHN0b3A7CiAgICBmbG9hdCAqdGltZV9wdHI7CiAgICBmbG9hdCAqZ2Zsb3BzX3B0cjsKcHVibGljOgogICAgS2VybmVsVGltZXIoaW50IG0sIGludCBuLCBpbnQgaywgZmxvYXQgKnRpbWUsIGZsb2F0ICpnZmxvcHMpIDogbShtKSwgbihuKSwgayhrKSwgdGltZV9wdHIodGltZSksIGdmbG9wc19wdHIoZ2Zsb3BzKSB7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50Q3JlYXRlKSgmc3RhcnQpKTsKICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRXZlbnRDcmVhdGUpKCZzdG9wKSk7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50UmVjb3JkKShzdGFydCkpOwogICAgfQogICAgdm9pZCBzdGFydF90aW1lcigpIHsgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50UmVjb3JkKShzdGFydCkpOyB9CiAgICB2b2lkIHN0b3BfdGltZXIoKSB7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50UmVjb3JkKShzdG9wKSk7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50U3luY2hyb25pemUpKHN0b3ApKTsKICAgICAgICBmbG9hdCBlbGFwc2VkX3RpbWU7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50RWxhcHNlZFRpbWUpKCZlbGFwc2VkX3RpbWUsIHN0YXJ0LCBzdG9wKSk7CiAgICAgICAgZG91YmxlIGZsb3BzID0gMi4wICogc3RhdGljX2Nhc3Q8ZG91YmxlPihtKSAqIHN0YXRpY19jYXN0PGRvdWJsZT4obikgKiBzdGF0aWNfY2FzdDxkb3VibGU+KGspOwogICAgICAgIGRvdWJsZSBnZmxvcHNfdmFsID0gKGZsb3BzIC8gKGVsYXBzZWRfdGltZSAqIDFlLTMpKSAvIDFlOTsKICAgICAgICAKICAgICAgICBpZiAodGltZV9wdHIgIT0gbnVsbHB0cikgewogICAgICAgICAgICAqdGltZV9wdHIgPSBlbGFwc2VkX3RpbWU7CiAgICAgICAgfQogICAgICAgIGlmIChnZmxvcHNfcHRyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgKmdmbG9wc19wdHIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZ2Zsb3BzX3ZhbCk7CiAgICAgICAgfQogICAgfQogICAgfktlcm5lbFRpbWVyKCkgewogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudERlc3Ryb3kpKHN0YXJ0KSk7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50RGVzdHJveSkoc3RvcCkpOwogICAgfQp9Owp2b2lkIHJ1bih2b2lkICphLCB2b2lkICpiLCB2b2lkICphcywgdm9pZCAqYnMsIHZvaWQgKmMsIGludCBtLCBpbnQgbiwgaW50IGssIGZsb2F0ICp0aW1lLCBmbG9hdCAqZ2Zsb3BzKSB7CiAgICAKICAgIAogICAgY29uc3QgX19GUDhfVFlQRSAqYV9wdHIgPSBzdGF0aWNfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICo+KGEpOwogICAgY29uc3QgX19GUDhfVFlQRSAqYl9wdHIgPSBzdGF0aWNfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICo+KGIpOwogICAgX19CRjE2X1RZUEUgKmNfcHRyID0gc3RhdGljX2Nhc3Q8X19CRjE2X1RZUEUgKj4oYyk7CiAgICBjb25zdCBmbG9hdCAqYXNfcHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4oYXMpOwogICAgY29uc3QgZmxvYXQgKmJzX3B0ciA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KGJzKTsKICAgIHN3aXRjaChwYWNrX3NoYXBlKG0sIG4sIGspKSB7CiNpZmRlZiBURVNUX09OX1JETkE0IAogICAgICAgIAogICAgICAgIERJU1BBVENIX0dFTU0oNjQsICAgICA2NCwgICAgIDEyOCwgICAgNjQsICAgIDY0LCAgICAzMiwgICAxLCAgICAgIDQsICAgICAgMTI4LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDY0LCAgICAgMTUzNiwgICA3MTY4LCAgIDY0LCAgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDMwNzIsICAgMTUzNiwgICA2NCwgICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjQsICAgICA1NzYsICAgIDcxNjgsICAgNjQsICAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDk2LCAgICAgNzE2OCwgICAyNTYsICAgIDk2LCAgICAyNTYsICAgNjQsICAgMiwgICAgICA0LCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg5NiwgICAgIDcxNjgsICAgMjA0OCwgICA5NiwgICAgMjU2LCAgIDY0LCAgIDIsICAgICAgNCwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oOTYsICAgICA0NjA4LCAgIDcxNjgsICAgOTYsICAgIDI1NiwgICA2NCwgICAyLCAgICAgIDQsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEyOCwgICAgNzE2OCwgICAyMzA0LCAgIDEyOCwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMjgsICAgIDUxMiwgICAgNzE2OCwgICAxMjgsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNTEyLCAgICA0MDk2LCAgIDUxMiwgICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDUxMiwgICAgMTUzNiwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDE1MzYsICAgNzE2OCwgICAgMTI4LCAgICAxMjgsICAgICA2NCwgICAgICAxLCAgICAgIDQsICAgIDEyOCwgICAgIDQpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgMzA3MiwgICAxNTM2LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICAgNTc2LCAgIDcxNjgsICAgIDEyOCwgICAgIDY0LCAgICAgMzIsICAgICAgNCwgICAgICAxLCAgICAxMjgsICAgICA0KTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDcxNjgsICAgIDI1NiwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAyMDQ4LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA0NjA4LCAgIDcxNjgsICAgIDEyOCwgICAgMTI4LCAgICAgMzIsICAgICAgMiwgICAgICAyLCAgICAxMjgsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDcxNjgsICAgMjMwNCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgIDUxMiwgICA3MTY4LCAgICAgNjQsICAgIDEyOCwgICAgIDMyLCAgICAgIDIsICAgICAgMiwgICAgMTI4LCAgICAgNCk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA0MDk2LCAgICA1MTIsICAgIDEyOCwgICAgMjU2LCAgICAgMzIsICAgICAgMiwgICAgICA0LCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDE1MzYsICAgNzE2OCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgMzA3MiwgICAxNTM2LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICAgNTc2LCAgIDcxNjgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDcxNjgsICAgIDI1NiwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAyMDQ4LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA0NjA4LCAgIDcxNjgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDcxNjgsICAgMjMwNCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgIDUxMiwgICA3MTY4LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA0MDk2LCAgICA1MTIsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiNlbHNlIAogICAgICAgIAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICAxNTM2LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgNCk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDMwNzIsICAgMTUzNiwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAyKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNTc2LCAgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDgpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA3MTY4LCAgIDI1NiwgICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDcxNjgsICAgMjA0OCwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNDYwOCwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDIpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA3MTY4LCAgIDIzMDQsICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDUxMiwgICAgNzE2OCwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICA4KTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNDA5NiwgICA1MTIsICAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICAxNTM2LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDMwNzIsICAgMTUzNiwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNTc2LCAgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDIpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA3MTY4LCAgIDI1NiwgICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDcxNjgsICAgMjA0OCwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNDYwOCwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA3MTY4LCAgIDIzMDQsICAgMjU2LCAgIDEyOCwgICAxMjgsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDUxMiwgICAgNzE2OCwgICAyNTYsICAgMTI4LCAgIDEyOCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAyKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNDA5NiwgICA1MTIsICAgIDI1NiwgICAxMjgsICAgMTI4LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwojZW5kaWYKICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgfQogICAgfQp9CnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpIHsKICAgIGludCBtID0gYS5zaXplKDApOwogICAgaW50IG4gPSBiLnNpemUoMCk7CiAgICBpbnQgayA9IGEuc2l6ZSgxKTsKICAgIHJ1bigoX19GUDhfVFlQRSopYS5kYXRhX3B0cigpLCAoX19GUDhfVFlQRSopYi5kYXRhX3B0cigpLCAKICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKF9fQkYxNl9UWVBFKiljLmRhdGFfcHRyKCksIG0sIG4sIGssIG51bGxwdHIsIG51bGxwdHIpOwogICAgCn0KIiIiCmltcG9ydCBvcwpvcy5lbnZpcm9uWyJQWVRPUkNIX1JPQ01fQVJDSCJdID0gImdmeDk0MiIKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSdmcDhfbW0nLAogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwKICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLAogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIl0sCiAgICBleHRyYV9jZmxhZ3M9WyItT2Zhc3QiXSwKKQoKaW1wb3J0IHRvcmNoCmRlZiByZWZfa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIGEgPSBhLmNvbnRpZ3VvdXMoKQogICAgYV9zY2FsZSA9IGFfc2NhbGUuY29udGlndW91cygpCiAgICBiX3NjYWxlID0gYl9zY2FsZS5jb250aWd1b3VzKCkKCiAgICBtID0gYS5zaGFwZVswXQogICAgbiA9IGIuc2hhcGVbMF0KICAgIGsgPSBhLnNoYXBlWzFdCiAgICBibG9ja19zaGFwZV9uID0gMTI4CiAgICBibG9ja19zaGFwZV9rID0gMTI4CiAgICBzY2FsZV9uID0gYl9zY2FsZS5zaGFwZVswXQogICAgc2NhbGVfayA9IGJfc2NhbGUuc2hhcGVbMV0KCiAgICBhX3NjYWxlID0gYV9zY2FsZS51bnNxdWVlemUoLTEpLnJlcGVhdCgxLCAxLCBibG9ja19zaGFwZV9rKQogICAgYV9zY2FsZSA9IGFfc2NhbGUucmVzaGFwZShtLCBzY2FsZV9rICogYmxvY2tfc2hhcGVfaykgCiAgICBhX3NjYWxlID0gYV9zY2FsZVs6LCA6a10KCiAgICBhID0gYS50byhhX3NjYWxlLmR0eXBlKSAqIGFfc2NhbGUKICAgIGJfc2NhbGUgPSAoCiAgICAgICAgYl9zY2FsZS52aWV3KC0xLCAxKQogICAgICAgIC5yZXBlYXQoMSwgYmxvY2tfc2hhcGVfbiAqIGJsb2NrX3NoYXBlX2spCiAgICAgICAgLnZpZXcoc2NhbGVfbiwgc2NhbGVfaywgYmxvY2tfc2hhcGVfbiwgYmxvY2tfc2hhcGVfaykKICAgICAgICAucGVybXV0ZSgwLCAyLCAxLCAzKQogICAgICAgIC5yZXNoYXBlKHNjYWxlX24gKiBibG9ja19zaGFwZV9uLCBzY2FsZV9rICogYmxvY2tfc2hhcGVfaykKICAgICkKICAgIGJfc2NhbGUgPSBiX3NjYWxlWzpuLCA6a10KCiAgICBiID0gYi50byhiX3NjYWxlLmR0eXBlKSAqIGJfc2NhbGUgCgogICAgY1suLi5dID0gKGEgQCBiLlQpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgcmV0dXJuIGMKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCiAgICBpZiBhLnNoYXBlWzBdIDwgMTAyNDoKICAgICAgICByZXR1cm4gcmVmX2tlcm5lbChkYXRhKQogICAgbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQogICAgcmV0dXJuIGMKNo newline at end of file
Best evidence level for this revision: reported
JSON