submission 19014
KernelBot user 376 · 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.
baguette_3.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-19014?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
61.3µs
#17 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
65.3µs
#16 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
98.0µs
#15 of 98
2025-05-09
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
152.2µs
#18 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
167.1µs
#21 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
177.9µs
#19 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
266.7µs
#23 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
761.2µs
#23 of 98
2025-05-09
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:093ebd2a4c714439ec9c02750d3afc5675e5f938d0085981cfe98f5f95513b19
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
baguette_3.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+Cgp0eXBlZGVmIF9faGlwX2ZwOF9lNG0zX2ZudXogZnA4Owp1c2luZyB2ZWM0ZiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiNkZWZpbmUgV0FSUF9TSVpFIDY0CiNkZWZpbmUgTl9XQVJQX1lfREVGIDIKI2RlZmluZSBOX1dBUlBfWF9ERUYgNAovLyBPdXRwdXQgVGlsZSBjb25maWcKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUYgMTI4CiNkZWZpbmUgVElMRV9TSVpFX1hfREVGIDEyOAojZGVmaW5lIFRJTEVfS19ESU1fREVGIDEyOAoKY29uc3RleHByIGludCBUSUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZX0RFRjsKY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRjsKY29uc3RleHByIGludCBLX0RJTSA9IFRJTEVfS19ESU1fREVGOwpjb25zdGV4cHIgaW50IE5CV0FSUFNfWSA9IE5fV0FSUF9ZX0RFRjsgLy8gNApjb25zdGV4cHIgaW50IE5CV0FSUFNfWCA9IE5fV0FSUF9YX0RFRjsgLy8gMgovLyBpbnRyaW5zaWMgY29uZmlnCmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9LID0gMzI7CmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2Owpjb25zdGV4cHIgaW50IEJMT0NLX0RJTSA9IE5CV0FSUFNfWCAqIE5CV0FSUFNfWSAqIFdBUlBfU0laRTsgLy8gNTEyCgp1c2luZyB2ZWM0dSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnUgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MzJfdCkpKSkgdWludDMyX3Q7CnVzaW5nIHZlYzJzaG9ydCA9CiAgICBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MTZfdCkpKSkgdWludDE2X3Q7CgpfX2RldmljZV9fIHZvaWQgbWF0bXVsMTZ4MTYoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmIsIGludCBrLCBpbnQgYV9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9jb2wsIHZlYzRmICZjLCBpbnQgbSwgaW50IG4pIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CiAgaW50IHJvdyA9IGsgKyB0aWQgJSA4ICsgKHRpZCAvIDE2KSAqIDg7CiAgaW50IGNvbCA9ICgodGlkICUgMTYpIC8gOCk7CiAgaW50IGFfY29sX3MgPSAoYV9jb2wgLyA4ICsgY29sKTsKICBpbnQgYl9jb2xfcyA9IChiX2NvbCAvIDggKyBjb2wpOwogIGludCBjb2xfYV9zd2l6emxlZCA9ICgoYV9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBhX2NvbF9zICUgMjsKICBpbnQgY29sX2Jfc3dpenpsZWQgPSAoKGJfY29sX3MgLyAyKSBeIChyb3cgJSA4KSkgKiAyICsgYl9jb2xfcyAlIDI7CgogIGF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYSArIHJvdyAqIG0pW2NvbF9hX3N3aXp6bGVkXTsKICBhdXRvIHBhY2tlZEIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KGIgKyByb3cgKiBtKVtjb2xfYl9zd2l6emxlZF07CgogIGMgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCnRlbXBsYXRlPGJvb2wgYm91bmRDaGVjaz4KX19kZXZpY2VfXyB2b2lkIGxvYWRMRFMoaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnA4ICpzX2EsIGZwOCAqc19iLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgaW50IE0sIGludCBOKSB7CiAgCiAgY29uc3QgZnA4ICpwdHIgPSBhOwogIGZwOCAqZHN0ID0gc19hOwogIGludCB3YXJwSWRMb2NhbCA9IHdhcnBJZCU0OwogIGludCBzdHJpZGUgPSBNOwogIAogIHVpbnQzMl90IGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWCAqIGJsb2NrSWR4Lng7CiAgaWYgKHdhcnBJZD49NCl7CiAgICBwdHI9YjsKICAgIGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWSAqIGJsb2NrSWR4Lnk7CiAgICBkc3Q9c19iOwogICAgc3RyaWRlPSBOOwogIH0KICBib29sIGJfY2hlY2sgPSB0cnVlOwogIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICBiX2NoZWNrID0gY29sX29mZnNldCA8IHN0cmlkZTsKICB9CiAgCiAgICBjb25zdGV4cHIgaW50IERJTVkgPSBUSUxFX1NJWkVfWSAvIDg7CiAgICB2ZWMydSBiX3ZhbHVlWzhdID0gezB9OwogICAgaWYgKGJfY2hlY2spewogICAgdWludDMyX3Qgcm93X29mZnNldCA9IGtJZDsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgODsgcisrKSB7CiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICAKICAKICAgICAgICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiA4KSkpWzBdOwogICAgfQogIH0KICAgIHZlYzJ1IHJlc3VsdF9iWzhdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpCiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7CiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZyZXN1bHRfYltpXSlbal0gPQogICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJmJfdmFsdWVbal0pW2ldOwogICAgICB9CgogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKCiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICBpbnQgY29sX3N3aXp6bGVkID0gMiAqICgoY29sIC8gMikgXiAocm93ICUgOCkpICsgY29sICUgMjsKCiAgICAgIChyZWludGVycHJldF9jYXN0PHZlYzJ1ICo+KGRzdCkpWyhESU1ZKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07CiAgICB9CiAgCn0KCl9fZGV2aWNlX18gZmxvYXQgbW92ZV9kcHAoZmxvYXQgdiwgaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKICBmbG9hdCByZXN1bHQ7CiAgYXNtIHZvbGF0aWxlKCJ2X21vdl9iMzIgJTAsICUxIHF1YWRfcGVybTpbJTIsJTMsJTQsJTVdIgogICAgICAgICAgICAgICA6ICI9diIocmVzdWx0KSAvLyAlMDogb3V0cHV0IHJlZ2lzdGVyCiAgICAgICAgICAgICAgIDogInYiKHYpLCAiaSIoYSksICJpIihiKSwgImkiKGMpLCAiaSIoZCkpOwogIHJldHVybiByZXN1bHQ7Cn0KX19nbG9iYWxfXyB2b2lkIGNhc3Rfa2VybmVsKF9faGlwX2JmbG9hdDE2ICpjX2JmMTYsIGNvbnN0IGZsb2F0ICpjX2ZwMzIsIGludCBNLCBpbnQgTikgewoKICAgIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLngrdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkPE0qTil7CiAgICAgIGNfYmYxNlt0aWRdID0gKF9faGlwX2JmbG9hdDE2KWNfZnAzMlt0aWRdOwogICAgfQp9CgoKdGVtcGxhdGUgPGludCBLX1NQTElULGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+Cl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUYgKk5fV0FSUF9ZX0RFRiAqV0FSUF9TSVpFKQogICAgY3VzdG9tX2tlcm5lbChjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgY29uc3QgZmxvYXQgKmFzLCBjb25zdCBmbG9hdCAqYnMsCiAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpjLGZsb2F0ICpjX2F0b21pYywgaW50IE0sIGludCBOLCBpbnQgSykgewogIGludCB0aWQgPSB0aHJlYWRJZHgueDsKICBpbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwoKICBpbnQgc3BsaXRLID0gSyAvIEtfU1BMSVQ7CiAgaW50IGtJZFN0YXJ0ID0gYmxvY2tJZHgueiAqIHNwbGl0SzsKICBpbnQga0lkU3RvcCA9IHNwbGl0SyArIGJsb2NrSWR4LnogKiBzcGxpdEs7CgogIGludCBTTiA9IChOICsgMTI4IC0gMSkgLyAxMjg7CgogIGludCB3YXJwSWQgPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsKICBpbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCiAgaW50IHdhcnBJZHkgPSB3YXJwSWQgJSBOQldBUlBTX1k7CgogIF9fc2hhcmVkX18gZnA4IHNfYVtLX0RJTV1bVElMRV9TSVpFX1hdOwogIF9fc2hhcmVkX18gZnA4IHNfYltLX0RJTV1bVElMRV9TSVpFX1ldOwoKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWSAvIE5CV0FSUFNfWSAvIE1BVE1VTF9ESU1fTk07IC8vIDIKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKICB2ZWM0ZiBjX3NbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07CgogIGZvciAoaW50IGtJZCA9IGtJZFN0YXJ0OyBrSWQgPCBrSWRTdG9wOyBrSWQgKz0gS19ESU0pIHsKCiAgICBsb2FkTERTPGJvdW5kQ2hlY2s+KHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIE0sIE4pOwogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHZlYzRmIGNfdG1wW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwojcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBYID0gVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YOwogICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7CgogICAgICAgIHZlYzRmIGNfdG1wID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwojcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgS19ESU07ayArPSBNQVRNVUxfRElNX0spIC8vIE1BVE1VTF9ESU1fSyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgS19ESU0KICAgICAgICB7CiAgICAgICAgICBpbnQgYV9jb2wgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBpbnQgYl9jb2wgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBtYXRtdWwxNngxNigmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBrLCBhX2NvbCwgYl9jb2wsIGNfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUSUxFX1NJWkVfWCwgVElMRV9TSVpFX1kpOwogICAgICAgIH0KCiAgICAgICAgaW50IGFfcm93ID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgIC8vIEFwcGx5IHNjYWxpbmcKICAgICAgICBpbnQgYXNfY29sID0ga0lkIC8gMTI4OwogICAgICAgIGludCBhc19yb3cgPSBhX3JvdyArIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWDsKICAgICAgICBpbnQgYnNfY29sID0gYmxvY2tJZHgueTsKICAgICAgICBpbnQgYnNfcm93ID0ga0lkIC8gMTI4OwogICAgICAgIGZsb2F0IGJzX3ZhbCA9IGJzW2JzX3JvdyAqIFNOICsgYnNfY29sXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgaW50IHJvdyA9IGFzX3JvdyArIGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgIGZsb2F0IGFzX3ZhbCA9IGFzW2FzX2NvbCAqIE0gKyByb3ddOwogICAgICAgICAgY19zW3Rfd0lkeF1bdF93SWR5XVtpXSArPSBjX3RtcFtpXSAqIGFzX3ZhbCAqIGJzX3ZhbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQogIAoKICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewogICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgLy8gb2Zmc2V0IHBvaW50aW5nIHRvIHRoZSBhY2N1bXVsYXRlZCAxNngxNiBibG9jawogICAgICBpbnQgY29sX29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC55ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR5ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR5ICogKFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWSk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGludCByb3dfb2Zmc2V0ID0KICAgICAgICAgIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWCArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICAgICAgICB0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKICAgICAgYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwoKICAgICAgYm9vbCBiX2NoZWNrID0gdHJ1ZTsKICAgICAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgICAgICBiX2NoZWNrID0gKHJvd19vZmZzZXQpIDwgTSAmJiAoY29sX29mZnNldCkgPCBOOwogICAgICB9CiAgICAgIGlmIChiX2NoZWNrKSB7CiAgICAgICAgICAvLyBDIGlzIHN0b3JlZCBvbiA0IFZHUFJzCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBpbnQgY29sID0gbGFuZUlkICUgMTY7CiAgICAgICAgICAgICAgaW50IHJvdyA9IGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKHVzZUF0b21pYyl7CiAgICAgICAgICAgICAgICBhdG9taWNBZGQoICZjX2F0b21pY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSxyZXNbaV0pOwogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgCiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdHJ1Y3QgTGF1bmNoQ29uZmlnIHsKICBpbnQgS19TUExJVDsKICBib29sIHVzZUF0b21pYzsKICBib29sIGJvdW5kQ2hlY2s7Cn07Cgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQsIGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+CmlubGluZSB2b2lkIGxhdW5jaF9rZXJuZWxfdmFyaWFudChjb25zdCBkaW0zJiBibG9ja3MsIGNvbnN0IGRpbTMmIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CgogIGRpbTMgdGhyZWFkc0Nhc3QoMjU2KTsKICBkaW0zIGJsb2NrQ2FzdCgoTSpOICsgKE4qTS0xKSkvMjU2KTsKCiAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPEtfU1BMSVQsIGJvdW5kQ2hlY2ssIHVzZUF0b21pYz4pLCBibG9ja3MsIHRocmVhZHMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIGNfYXRvbWljLE0sIE4sIEspOwogIGlmIGNvbnN0ZXhwciAodXNlQXRvbWljKXsKICAgIGhpcExhdW5jaEtlcm5lbEdHTChjYXN0X2tlcm5lbCwgYmxvY2tDYXN0LHRocmVhZHNDYXN0LDAsMCxkX0MsY19hdG9taWMsTSxOKTsKICB9Cn0KCgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQ+CmlubGluZSB2b2lkIGRpc3BhdGNoX2JvdW5kX2F0b21pYyhib29sIGJvdW5kQ2hlY2ssIGJvb2wgdXNlQXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGltMyYgYmxvY2tzLCBjb25zdCBkaW0zJiB0aHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQXMsIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLGZsb2F0KmNfYXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE0sIGludCBOLCBpbnQgSykgewogIGlmIChib3VuZENoZWNrKSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgewogICAgICBoaXBNZW1zZXQoY19hdG9taWMsIDAsIE4qTSAqIHNpemVvZihmbG9hdCkpOwogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgdHJ1ZSwgdHJ1ZT4oYmxvY2tzLCB0aHJlYWRzLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsKICAgIH0KICAgIGVsc2UKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIHRydWUsIGZhbHNlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogIH0gZWxzZSB7CiAgICBpZiAodXNlQXRvbWljKXsKICAgICAgaGlwTWVtc2V0KGNfYXRvbWljLCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIGZhbHNlLCB0cnVlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogICAgfQogICAgZWxzZQogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgZmFsc2UsIGZhbHNlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogIH0KfQoKdm9pZCBsYXVuY2hfa2VybmVsKGNvbnN0IExhdW5jaENvbmZpZyAmY29uZmlnLCBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CgogIGRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRiAqIE5fV0FSUF9ZX0RFRiAqIFdBUlBfU0laRSk7CiAgZGltMyBibG9ja3NQZXJHcmlkKChNICsgVElMRV9TSVpFX1hfREVGIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUYsCiAgICAgICAgICAgICAgICAgICAgIChOICsgVElMRV9TSVpFX1lfREVGIC0gMSkgLyBUSUxFX1NJWkVfWV9ERUYsCiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5LX1NQTElUKTsKCiAgc3dpdGNoIChjb25maWcuS19TUExJVCkgewogICAgY2FzZSAxOiBkaXNwYXRjaF9ib3VuZF9hdG9taWM8MT4oY29uZmlnLmJvdW5kQ2hlY2ssIGNvbmZpZy51c2VBdG9taWMsIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7IGJyZWFrOwogICAgY2FzZSAyOiBkaXNwYXRjaF9ib3VuZF9hdG9taWM8Mj4oY29uZmlnLmJvdW5kQ2hlY2ssIGNvbmZpZy51c2VBdG9taWMsIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7IGJyZWFrOwogICAgY2FzZSA0OiBkaXNwYXRjaF9ib3VuZF9hdG9taWM8ND4oY29uZmlnLmJvdW5kQ2hlY2ssIGNvbmZpZy51c2VBdG9taWMsIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJVbnN1cHBvcnRlZCBLX1NQTElUIHZhbHVlIik7CiAgfQp9CgoKdm9pZCBsYXVuY2hfa2VybmVsKGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwgY29uc3QgZmxvYXQgKmRfQXMsCiAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQywgZmxvYXQqY19hdG9taWMsaW50IE0sIGludCBOLAogICAgICAgICAgICAgICAgICAgaW50IEspIHsKICBMYXVuY2hDb25maWcgY29uZmlnOwogIGNvbmZpZy51c2VBdG9taWM9ZmFsc2U7CiAgY29uZmlnLktfU1BMSVQ9MTsKICBpZiAoTSAlIDEyOCA9PTAgJiYgTiAlMTI4ID09MCkKICAgIGNvbmZpZy5ib3VuZENoZWNrID0gZmFsc2U7CiAgZWxzZQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSB0cnVlOwoKICAvL1NQTElUIEsgZm9yIHRoZXNlIDoKICBpZiAoKE0gPT0gMTAyNCAmJiAgTj09MTUzNiAmJiBLID09NzE2OCApfHwKICAgICAgKE0gPT0gMTAyNCAmJiAgTj09NTEyICYmIEsgPT03MTY4ICkgfHwKICAgICAgKE0gPT0gMTAyNCAmJiAgTj09NTc2ICYmIEsgPT03MTY4ICkpewogICAgICAgIGNvbmZpZy51c2VBdG9taWMgPSB0cnVlOwogICAgICAgIGNvbmZpZy5LX1NQTElUID0gNDsKICAgICAgfSAgCiAgbGF1bmNoX2tlcm5lbChjb25maWcsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwp9CgoKCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgTSwKICAgIGludCBOLAogICAgaW50IEsKKSB7CiAgICBjb25zdCBhdXRvKiBkX0EgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGFfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogZF9BcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogZF9CcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihic19wdHIpOwogICAgYXV0byogZF9DID0gcmVpbnRlcnByZXRfY2FzdDxfX2hpcF9iZmxvYXQxNio+KGNfcHRyKTsKCiAgICBkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUYgKiBOX1dBUlBfWV9ERUYgKiBXQVJQX1NJWkUpOwogICAgZGltMyBibG9ja3NQZXJHcmlkKChNICsgVElMRV9TSVpFX1hfREVGIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUYsCiAgICAgICAgICAgICAgICAgICAgIChOICsgVElMRV9TSVpFX1lfREVGIC0gMSkgLyBUSUxFX1NJWkVfWV9ERUYpOwogICAgCiAgICBzdGF0aWMgZmxvYXQqIGRfYXJyYXkgPSBudWxscHRyOwogICAgc3RhdGljIGludCBuPS0xOwogICAgc3RhdGljIGludCBtPS0xOwogICAgaWYgKCFkX2FycmF5KQogICAgewogICAgICAgIHNpemVfdCBzaXplID0gNjE0NCo3MTY4ICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICBoaXBFcnJvcl90IGVyciA9IGhpcE1hbGxvYygmZF9hcnJheSwgc2l6ZSk7CiAgICB9CiAgIC8vIGhpcE1lbXNldChkX2FycmF5LCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgIGxhdW5jaF9rZXJuZWwoZF9BLCBkX0IsIGRfQXMsCiAgICAgICAgICAgICAgICAgICBkX0JzLGRfQywgZF9hcnJheSwgTSwgTiwgSyk7IAoKICAgIC8vaGlwRnJlZShkX2FycmF5KTsKICAgIEhJUF9DSEVDSyhoaXBHZXRMYXN0RXJyb3IoKSk7Cn0KClBZQklORDExX01PRFVMRShmcDgsIG0pIHsKICBtLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLWcgLS1zYXZlLXRlbXBzIC1ScGFzcy1hbmFseXNpcz1rZXJuZWwtcmVzb3VyY2UtdXNhZ2UgLXN0ZD1jKysyMCJdLAogICAgbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgpmaXJzdCA9IFRydWUKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYmxvY2stc2NhbGUgZnA4IGdlbW0KICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgdGhhdCBleHBhbmRzIHRvOgogICAgICAgICAgICBhOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbSwga10sCiAgICAgICAgICAgIGI6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFtuLCBrXSwKICAgICAgICAgICAgYV9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFttLCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGJfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbiAvLyAxMjgsIGsgLy8gMTI4XSwKICAgICAgICAgICAgYzogdG9yY2guVGVuc29yW2JmbG9hdDE2XSBvZiBzaGFwZSBbbSwgbl0KICAgIFJldHVybnM6CiAgICAgICAgVGVuc29yIGNvbnRhaW5pbmcgb3V0cHV0IGluIGJmMTYKICAgICIiIgoKICAgIGdsb2JhbCBmaXJzdAogICAgaWYgZmlyc3Q6CiAgICAgICAgcHJpbnQoImV4ZWN1dGluZyBvbiIsIHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9uYW1lKCksIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICBmaXJzdCA9IEZhbHNlCgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKCiAgICBtLCBuID0gYy5zaGFwZQogICAgayA9IGEuc2hhcGVbMV0KCiAgICBoaXBfbW9kdWxlLmZwOCgKICAgICAgICBhLmRhdGFfcHRyKCksCiAgICAgICAgYi5kYXRhX3B0cigpLAogICAgICAgIGFfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBiX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYy5kYXRhX3B0cigpLAogICAgICAgIG0sCiAgICAgICAgbiwKICAgICAgICBrCiAgICApCgogICAgcmV0dXJuIGMKSource 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 19003.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+Cgp0eXBlZGVmIF9faGlwX2ZwOF9lNG0zX2ZudXogZnA4Owp1c2luZyB2ZWM0ZiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiNkZWZpbmUgV0FSUF9TSVpFIDY0CiNkZWZpbmUgTl9XQVJQX1lfREVGIDIKI2RlZmluZSBOX1dBUlBfWF9ERUYgNAovLyBPdXRwdXQgVGlsZSBjb25maWcKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUYgMTI4CiNkZWZpbmUgVElMRV9TSVpFX1hfREVGIDEyOAojZGVmaW5lIFRJTEVfS19ESU1fREVGIDEyOAoKY29uc3RleHByIGludCBUSUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZX0RFRjsKY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRjsKY29uc3RleHByIGludCBLX0RJTSA9IFRJTEVfS19ESU1fREVGOwpjb25zdGV4cHIgaW50IE5CV0FSUFNfWSA9IE5fV0FSUF9ZX0RFRjsgLy8gNApjb25zdGV4cHIgaW50IE5CV0FSUFNfWCA9IE5fV0FSUF9YX0RFRjsgLy8gMgovLyBpbnRyaW5zaWMgY29uZmlnCmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9LID0gMzI7CmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2Owpjb25zdGV4cHIgaW50IEJMT0NLX0RJTSA9IE5CV0FSUFNfWCAqIE5CV0FSUFNfWSAqIFdBUlBfU0laRTsgLy8gNTEyCgp1c2luZyB2ZWM0dSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnUgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MzJfdCkpKSkgdWludDMyX3Q7CnVzaW5nIHZlYzJzaG9ydCA9CiAgICBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MTZfdCkpKSkgdWludDE2X3Q7CgpfX2RldmljZV9fIHZvaWQgbWF0bXVsMTZ4MTYoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmIsIGludCBrLCBpbnQgYV9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9jb2wsIHZlYzRmICZjLCBpbnQgbSwgaW50IG4pIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CiAgaW50IHJvdyA9IGsgKyB0aWQgJSA4ICsgKHRpZCAvIDE2KSAqIDg7CiAgaW50IGNvbCA9ICgodGlkICUgMTYpIC8gOCk7CiAgaW50IGFfY29sX3MgPSAoYV9jb2wgLyA4ICsgY29sKTsKICBpbnQgYl9jb2xfcyA9IChiX2NvbCAvIDggKyBjb2wpOwogIGludCBjb2xfYV9zd2l6emxlZCA9ICgoYV9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBhX2NvbF9zICUgMjsKICBpbnQgY29sX2Jfc3dpenpsZWQgPSAoKGJfY29sX3MgLyAyKSBeIChyb3cgJSA4KSkgKiAyICsgYl9jb2xfcyAlIDI7CgogIGF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYSArIHJvdyAqIG0pW2NvbF9hX3N3aXp6bGVkXTsKICBhdXRvIHBhY2tlZEIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KGIgKyByb3cgKiBtKVtjb2xfYl9zd2l6emxlZF07CgogIGMgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCnRlbXBsYXRlPGJvb2wgYm91bmRDaGVjaz4KX19kZXZpY2VfXyB2b2lkIGxvYWRMRFMoaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnA4ICpzX2EsIGZwOCAqc19iLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgaW50IE0sIGludCBOKSB7CiAgCiAgY29uc3QgZnA4ICpwdHIgPSBhOwogIGZwOCAqZHN0ID0gc19hOwogIGludCB3YXJwSWRMb2NhbCA9IHdhcnBJZCU0OwogIGludCBzdHJpZGUgPSBNOwogIAogIHVpbnQzMl90IGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWCAqIGJsb2NrSWR4Lng7CiAgaWYgKHdhcnBJZD49NCl7CiAgICBwdHI9YjsKICAgIGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWSAqIGJsb2NrSWR4Lnk7CiAgICBkc3Q9c19iOwogICAgc3RyaWRlPSBOOwogIH0KICBib29sIGJfY2hlY2sgPSB0cnVlOwogIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICBiX2NoZWNrID0gY29sX29mZnNldCA8IHN0cmlkZTsKICB9CiAgCiAgICBjb25zdGV4cHIgaW50IERJTVkgPSBUSUxFX1NJWkVfWSAvIDg7CiAgICB2ZWMydSBiX3ZhbHVlWzhdID0gezB9OwogICAgaWYgKGJfY2hlY2spewogICAgdWludDMyX3Qgcm93X29mZnNldCA9IGtJZDsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgODsgcisrKSB7CiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICAKICAKICAgICAgICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiA4KSkpWzBdOwogICAgfQogIH0KICAgIHZlYzJ1IHJlc3VsdF9iWzhdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpCiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7CiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZyZXN1bHRfYltpXSlbal0gPQogICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJmJfdmFsdWVbal0pW2ldOwogICAgICB9CgogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKCiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICBpbnQgY29sX3N3aXp6bGVkID0gMiAqICgoY29sIC8gMikgXiAocm93ICUgOCkpICsgY29sICUgMjsKCiAgICAgIChyZWludGVycHJldF9jYXN0PHZlYzJ1ICo+KGRzdCkpWyhESU1ZKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07CiAgICB9CiAgCn0KCl9fZGV2aWNlX18gZmxvYXQgbW92ZV9kcHAoZmxvYXQgdiwgaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKICBmbG9hdCByZXN1bHQ7CiAgYXNtIHZvbGF0aWxlKCJ2X21vdl9iMzIgJTAsICUxIHF1YWRfcGVybTpbJTIsJTMsJTQsJTVdIgogICAgICAgICAgICAgICA6ICI9diIocmVzdWx0KSAvLyAlMDogb3V0cHV0IHJlZ2lzdGVyCiAgICAgICAgICAgICAgIDogInYiKHYpLCAiaSIoYSksICJpIihiKSwgImkiKGMpLCAiaSIoZCkpOwogIHJldHVybiByZXN1bHQ7Cn0KX19nbG9iYWxfXyB2b2lkIGNhc3Rfa2VybmVsKF9faGlwX2JmbG9hdDE2ICpjX2JmMTYsIGNvbnN0IGZsb2F0ICpjX2ZwMzIsIGludCBNLCBpbnQgTikgewoKICAgIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLngrdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkPE0qTil7CiAgICAgIGNfYmYxNlt0aWRdID0gKF9faGlwX2JmbG9hdDE2KWNfZnAzMlt0aWRdOwogICAgfQp9CgoKdGVtcGxhdGUgPGludCBLX1NQTElULGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+Cl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUYgKk5fV0FSUF9ZX0RFRiAqV0FSUF9TSVpFKQogICAgY3VzdG9tX2tlcm5lbChjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgY29uc3QgZmxvYXQgKmFzLCBjb25zdCBmbG9hdCAqYnMsCiAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpjLGZsb2F0ICpjX2F0b21pYywgaW50IE0sIGludCBOLCBpbnQgSykgewogIGludCB0aWQgPSB0aHJlYWRJZHgueDsKICBpbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwoKICBpbnQgc3BsaXRLID0gSyAvIEtfU1BMSVQ7CiAgaW50IGtJZFN0YXJ0ID0gYmxvY2tJZHgueiAqIHNwbGl0SzsKICBpbnQga0lkU3RvcCA9IHNwbGl0SyArIGJsb2NrSWR4LnogKiBzcGxpdEs7CgogIGludCBTTiA9IChOICsgMTI4IC0gMSkgLyAxMjg7CgogIGludCB3YXJwSWQgPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsKICBpbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCiAgaW50IHdhcnBJZHkgPSB3YXJwSWQgJSBOQldBUlBTX1k7CgogIF9fc2hhcmVkX18gZnA4IHNfYVtLX0RJTV1bVElMRV9TSVpFX1hdOwogIF9fc2hhcmVkX18gZnA4IHNfYltLX0RJTV1bVElMRV9TSVpFX1ldOwoKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWSAvIE5CV0FSUFNfWSAvIE1BVE1VTF9ESU1fTk07IC8vIDIKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKICB2ZWM0ZiBjX3NbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07CgogIGZvciAoaW50IGtJZCA9IGtJZFN0YXJ0OyBrSWQgPCBrSWRTdG9wOyBrSWQgKz0gS19ESU0pIHsKCiAgICBsb2FkTERTPGJvdW5kQ2hlY2s+KHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIE0sIE4pOwogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHZlYzRmIGNfdG1wW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwojcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBYID0gVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YOwogICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7CgogICAgICAgIHZlYzRmIGNfdG1wID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwojcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgS19ESU07ayArPSBNQVRNVUxfRElNX0spIC8vIE1BVE1VTF9ESU1fSyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgS19ESU0KICAgICAgICB7CiAgICAgICAgICBpbnQgYV9jb2wgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBpbnQgYl9jb2wgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBtYXRtdWwxNngxNigmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBrLCBhX2NvbCwgYl9jb2wsIGNfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUSUxFX1NJWkVfWCwgVElMRV9TSVpFX1kpOwogICAgICAgIH0KCiAgICAgICAgaW50IGFfcm93ID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgIC8vIEFwcGx5IHNjYWxpbmcKICAgICAgICBpbnQgYXNfY29sID0ga0lkIC8gMTI4OwogICAgICAgIGludCBhc19yb3cgPSBhX3JvdyArIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWDsKICAgICAgICBpbnQgYnNfY29sID0gYmxvY2tJZHgueTsKICAgICAgICBpbnQgYnNfcm93ID0ga0lkIC8gMTI4OwogICAgICAgIGZsb2F0IGJzX3ZhbCA9IGJzW2JzX3JvdyAqIFNOICsgYnNfY29sXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgaW50IHJvdyA9IGFzX3JvdyArIGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgIGZsb2F0IGFzX3ZhbCA9IGFzW2FzX2NvbCAqIE0gKyByb3ddOwogICAgICAgICAgY19zW3Rfd0lkeF1bdF93SWR5XVtpXSArPSBjX3RtcFtpXSAqIGFzX3ZhbCAqIGJzX3ZhbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQogIAoKICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewogICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgLy8gb2Zmc2V0IHBvaW50aW5nIHRvIHRoZSBhY2N1bXVsYXRlZCAxNngxNiBibG9jawogICAgICBpbnQgY29sX29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC55ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR5ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR5ICogKFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWSk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGludCByb3dfb2Zmc2V0ID0KICAgICAgICAgIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWCArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICAgICAgICB0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKICAgICAgYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwoKICAgICAgYm9vbCBiX2NoZWNrID0gdHJ1ZTsKICAgICAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgICAgICBiX2NoZWNrID0gKHJvd19vZmZzZXQpIDwgTSAmJiAoY29sX29mZnNldCkgPCBOOwogICAgICB9CiAgICAgIGlmIChiX2NoZWNrKSB7CiAgICAgICAgICAvLyBDIGlzIHN0b3JlZCBvbiA0IFZHUFJzCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBpbnQgY29sID0gbGFuZUlkICUgMTY7CiAgICAgICAgICAgICAgaW50IHJvdyA9IGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKHVzZUF0b21pYyl7CiAgICAgICAgICAgICAgICBhdG9taWNBZGQoICZjX2F0b21pY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSxyZXNbaV0pOwogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgCiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdHJ1Y3QgTGF1bmNoQ29uZmlnIHsKICBpbnQgS19TUExJVDsKICBib29sIHVzZUF0b21pYzsKICBib29sIGJvdW5kQ2hlY2s7Cn07Cgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQsIGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+CmlubGluZSB2b2lkIGxhdW5jaF9rZXJuZWxfdmFyaWFudChjb25zdCBkaW0zJiBibG9ja3MsIGNvbnN0IGRpbTMmIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CgogIGRpbTMgdGhyZWFkc0Nhc3QoMjU2KTsKICBkaW0zIGJsb2NrQ2FzdCgoTSpOICsgKE4qTS0xKSkvMjU2KTsKCiAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPEtfU1BMSVQsIGJvdW5kQ2hlY2ssIHVzZUF0b21pYz4pLCBibG9ja3MsIHRocmVhZHMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIGNfYXRvbWljLE0sIE4sIEspOwogIGlmIGNvbnN0ZXhwciAodXNlQXRvbWljKXsKICAgIGhpcExhdW5jaEtlcm5lbEdHTChjYXN0X2tlcm5lbCwgYmxvY2tDYXN0LHRocmVhZHNDYXN0LDAsMCxkX0MsY19hdG9taWMsTSxOKTsKICB9Cn0KCgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQ+CmlubGluZSB2b2lkIGRpc3BhdGNoX2JvdW5kX2F0b21pYyhib29sIGJvdW5kQ2hlY2ssIGJvb2wgdXNlQXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGltMyYgYmxvY2tzLCBjb25zdCBkaW0zJiB0aHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQXMsIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLGZsb2F0KmNfYXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE0sIGludCBOLCBpbnQgSykgewogIGlmIChib3VuZENoZWNrKSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgdHJ1ZSwgdHJ1ZT4oYmxvY2tzLCB0aHJlYWRzLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsKICAgIGVsc2UKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIHRydWUsIGZhbHNlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogIH0gZWxzZSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgZmFsc2UsIHRydWU+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgICBlbHNlCiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCBmYWxzZSwgZmFsc2U+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgfQp9Cgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQyxmbG9hdCpjX2F0b21pYywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLktfU1BMSVQpOwoKICBzd2l0Y2ggKGNvbmZpZy5LX1NQTElUKSB7CiAgICBjYXNlIDE6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwxPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDI6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwyPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDQ6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzw0Pihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlVuc3VwcG9ydGVkIEtfU1BMSVQgdmFsdWUiKTsKICB9Cn0KCgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLCBjb25zdCBmbG9hdCAqZF9BcywKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLCBmbG9hdCpjX2F0b21pYyxpbnQgTSwgaW50IE4sCiAgICAgICAgICAgICAgICAgICBpbnQgSykgewogIExhdW5jaENvbmZpZyBjb25maWc7CiAgY29uZmlnLnVzZUF0b21pYz1mYWxzZTsKICBjb25maWcuS19TUExJVD0xOwogIGlmIChNICUgMTI4ID09MCAmJiBOICUxMjggPT0wKQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSBmYWxzZTsKICBlbHNlCiAgICBjb25maWcuYm91bmRDaGVjayA9IHRydWU7CgogIC8vU1BMSVQgSyBmb3IgdGhlc2UgOgogIGlmICgoTSA9PSAxMDI0ICYmICBOPT0xNTM2ICYmIEsgPT03MTY4ICl8fAogICAgICAoTSA9PSAxMDI0ICYmICBOPT01MTIgJiYgSyA9PTcxNjggKSB8fAogICAgICAoTSA9PSAxMDI0ICYmICBOPT01NzYgJiYgSyA9PTcxNjggKSl7CiAgICAgICAgY29uZmlnLnVzZUF0b21pYyA9IHRydWU7CiAgICAgICAgY29uZmlnLktfU1BMSVQgPSA0OwogICAgICB9ICAKICBsYXVuY2hfa2VybmVsKGNvbmZpZywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7Cn0KCgoKI2RlZmluZSBISVBfQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBpZihlcnJvciAhPSBoaXBTdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKICAgICAgICAgICAgICAgICAgICAgIDw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKICAgICAgICAgICAgICAgICAgICAgIDw8ICc6JyA8PCBfX0xJTkVfXyA8PCAnQG4nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgZXhpdChlcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHdoaWxlKGZhbHNlKQoKdm9pZCBydW4oCiAgICB1aW50cHRyX3QgYV9wdHIsCiAgICB1aW50cHRyX3QgYl9wdHIsCiAgICB1aW50cHRyX3QgYXNfcHRyLAogICAgdWludHB0cl90IGJzX3B0ciwKICAgIHVpbnRwdHJfdCBjX3B0ciwKICAgIGludCBNLAogICAgaW50IE4sCiAgICBpbnQgSwopIHsKICAgIGNvbnN0IGF1dG8qIGRfQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogZF9CID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihiX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0FzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGFzX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0JzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGJzX3B0cik7CiAgICBhdXRvKiBkX0MgPSByZWludGVycHJldF9jYXN0PF9faGlwX2JmbG9hdDE2Kj4oY19wdHIpOwoKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRiAqIE5fV0FSUF9ZX0RFRiAqIFdBUlBfU0laRSk7CiAgICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRik7CiAgICAKICAgIHN0YXRpYyBmbG9hdCogZF9hcnJheSA9IG51bGxwdHI7CiAgICBzdGF0aWMgaW50IG49LTE7CiAgICBzdGF0aWMgaW50IG09LTE7CiAgICBpZiAoIWRfYXJyYXkpCiAgICB7CiAgICAgICAgc2l6ZV90IHNpemUgPSA2MTQ0KjcxNjggKiBzaXplb2YoZmxvYXQpOwogICAgICAgIGhpcEVycm9yX3QgZXJyID0gaGlwTWFsbG9jKCZkX2FycmF5LCBzaXplKTsKICAgIH0KICAgIGhpcE1lbXNldChkX2FycmF5LCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgIGxhdW5jaF9rZXJuZWwoZF9BLCBkX0IsIGRfQXMsCiAgICAgICAgICAgICAgICAgICBkX0JzLGRfQywgZF9hcnJheSwgTSwgTiwKICAgICAgICAgICAgICAgIEspOyAKCiAgICAvL2hpcEZyZWUoZF9hcnJheSk7CiAgICBISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CgpQWUJJTkQxMV9NT0RVTEUoZnA4LCBtKSB7CiAgbS5kZWYoImZwOCIsICZydW4sICJISVAga2VybmVsIik7Cn0KIiIiCgpoaXBfbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDgiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1nIC0tc2F2ZS10ZW1wcyAtUnBhc3MtYW5hbHlzaXM9a2VybmVsLXJlc291cmNlLXVzYWdlIC1zdGQ9YysrMjAiXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKZmlyc3QgPSBUcnVlCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgawogICAgKQoKICAgIHJldHVybiBjCg==No newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+Cgp0eXBlZGVmIF9faGlwX2ZwOF9lNG0zX2ZudXogZnA4Owp1c2luZyB2ZWM0ZiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiNkZWZpbmUgV0FSUF9TSVpFIDY0CiNkZWZpbmUgTl9XQVJQX1lfREVGIDIKI2RlZmluZSBOX1dBUlBfWF9ERUYgNAovLyBPdXRwdXQgVGlsZSBjb25maWcKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUYgMTI4CiNkZWZpbmUgVElMRV9TSVpFX1hfREVGIDEyOAojZGVmaW5lIFRJTEVfS19ESU1fREVGIDEyOAoKY29uc3RleHByIGludCBUSUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZX0RFRjsKY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRjsKY29uc3RleHByIGludCBLX0RJTSA9IFRJTEVfS19ESU1fREVGOwpjb25zdGV4cHIgaW50IE5CV0FSUFNfWSA9IE5fV0FSUF9ZX0RFRjsgLy8gNApjb25zdGV4cHIgaW50IE5CV0FSUFNfWCA9IE5fV0FSUF9YX0RFRjsgLy8gMgovLyBpbnRyaW5zaWMgY29uZmlnCmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9LID0gMzI7CmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2Owpjb25zdGV4cHIgaW50IEJMT0NLX0RJTSA9IE5CV0FSUFNfWCAqIE5CV0FSUFNfWSAqIFdBUlBfU0laRTsgLy8gNTEyCgp1c2luZyB2ZWM0dSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnUgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MzJfdCkpKSkgdWludDMyX3Q7CnVzaW5nIHZlYzJzaG9ydCA9CiAgICBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MTZfdCkpKSkgdWludDE2X3Q7CgpfX2RldmljZV9fIHZvaWQgbWF0bXVsMTZ4MTYoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmIsIGludCBrLCBpbnQgYV9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9jb2wsIHZlYzRmICZjLCBpbnQgbSwgaW50IG4pIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CiAgaW50IHJvdyA9IGsgKyB0aWQgJSA4ICsgKHRpZCAvIDE2KSAqIDg7CiAgaW50IGNvbCA9ICgodGlkICUgMTYpIC8gOCk7CiAgaW50IGFfY29sX3MgPSAoYV9jb2wgLyA4ICsgY29sKTsKICBpbnQgYl9jb2xfcyA9IChiX2NvbCAvIDggKyBjb2wpOwogIGludCBjb2xfYV9zd2l6emxlZCA9ICgoYV9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBhX2NvbF9zICUgMjsKICBpbnQgY29sX2Jfc3dpenpsZWQgPSAoKGJfY29sX3MgLyAyKSBeIChyb3cgJSA4KSkgKiAyICsgYl9jb2xfcyAlIDI7CgogIGF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYSArIHJvdyAqIG0pW2NvbF9hX3N3aXp6bGVkXTsKICBhdXRvIHBhY2tlZEIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KGIgKyByb3cgKiBtKVtjb2xfYl9zd2l6emxlZF07CgogIGMgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCnRlbXBsYXRlPGJvb2wgYm91bmRDaGVjaz4KX19kZXZpY2VfXyB2b2lkIGxvYWRMRFMoaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnA4ICpzX2EsIGZwOCAqc19iLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgaW50IE0sIGludCBOKSB7CiAgCiAgY29uc3QgZnA4ICpwdHIgPSBhOwogIGZwOCAqZHN0ID0gc19hOwogIGludCB3YXJwSWRMb2NhbCA9IHdhcnBJZCU0OwogIGludCBzdHJpZGUgPSBNOwogIAogIHVpbnQzMl90IGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWCAqIGJsb2NrSWR4Lng7CiAgaWYgKHdhcnBJZD49NCl7CiAgICBwdHI9YjsKICAgIGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWSAqIGJsb2NrSWR4Lnk7CiAgICBkc3Q9c19iOwogICAgc3RyaWRlPSBOOwogIH0KICBib29sIGJfY2hlY2sgPSB0cnVlOwogIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICBiX2NoZWNrID0gY29sX29mZnNldCA8IHN0cmlkZTsKICB9CiAgCiAgICBjb25zdGV4cHIgaW50IERJTVkgPSBUSUxFX1NJWkVfWSAvIDg7CiAgICB2ZWMydSBiX3ZhbHVlWzhdID0gezB9OwogICAgaWYgKGJfY2hlY2spewogICAgdWludDMyX3Qgcm93X29mZnNldCA9IGtJZDsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgODsgcisrKSB7CiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICAKICAKICAgICAgICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiA4KSkpWzBdOwogICAgfQogIH0KICAgIHZlYzJ1IHJlc3VsdF9iWzhdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpCiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7CiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZyZXN1bHRfYltpXSlbal0gPQogICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJmJfdmFsdWVbal0pW2ldOwogICAgICB9CgogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKCiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICBpbnQgY29sX3N3aXp6bGVkID0gMiAqICgoY29sIC8gMikgXiAocm93ICUgOCkpICsgY29sICUgMjsKCiAgICAgIChyZWludGVycHJldF9jYXN0PHZlYzJ1ICo+KGRzdCkpWyhESU1ZKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07CiAgICB9CiAgCn0KCl9fZGV2aWNlX18gZmxvYXQgbW92ZV9kcHAoZmxvYXQgdiwgaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKICBmbG9hdCByZXN1bHQ7CiAgYXNtIHZvbGF0aWxlKCJ2X21vdl9iMzIgJTAsICUxIHF1YWRfcGVybTpbJTIsJTMsJTQsJTVdIgogICAgICAgICAgICAgICA6ICI9diIocmVzdWx0KSAvLyAlMDogb3V0cHV0IHJlZ2lzdGVyCiAgICAgICAgICAgICAgIDogInYiKHYpLCAiaSIoYSksICJpIihiKSwgImkiKGMpLCAiaSIoZCkpOwogIHJldHVybiByZXN1bHQ7Cn0KX19nbG9iYWxfXyB2b2lkIGNhc3Rfa2VybmVsKF9faGlwX2JmbG9hdDE2ICpjX2JmMTYsIGNvbnN0IGZsb2F0ICpjX2ZwMzIsIGludCBNLCBpbnQgTikgewoKICAgIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLngrdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkPE0qTil7CiAgICAgIGNfYmYxNlt0aWRdID0gKF9faGlwX2JmbG9hdDE2KWNfZnAzMlt0aWRdOwogICAgfQp9CgoKdGVtcGxhdGUgPGludCBLX1NQTElULGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+Cl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUYgKk5fV0FSUF9ZX0RFRiAqV0FSUF9TSVpFKQogICAgY3VzdG9tX2tlcm5lbChjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgY29uc3QgZmxvYXQgKmFzLCBjb25zdCBmbG9hdCAqYnMsCiAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpjLGZsb2F0ICpjX2F0b21pYywgaW50IE0sIGludCBOLCBpbnQgSykgewogIGludCB0aWQgPSB0aHJlYWRJZHgueDsKICBpbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwoKICBpbnQgc3BsaXRLID0gSyAvIEtfU1BMSVQ7CiAgaW50IGtJZFN0YXJ0ID0gYmxvY2tJZHgueiAqIHNwbGl0SzsKICBpbnQga0lkU3RvcCA9IHNwbGl0SyArIGJsb2NrSWR4LnogKiBzcGxpdEs7CgogIGludCBTTiA9IChOICsgMTI4IC0gMSkgLyAxMjg7CgogIGludCB3YXJwSWQgPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsKICBpbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCiAgaW50IHdhcnBJZHkgPSB3YXJwSWQgJSBOQldBUlBTX1k7CgogIF9fc2hhcmVkX18gZnA4IHNfYVtLX0RJTV1bVElMRV9TSVpFX1hdOwogIF9fc2hhcmVkX18gZnA4IHNfYltLX0RJTV1bVElMRV9TSVpFX1ldOwoKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWSAvIE5CV0FSUFNfWSAvIE1BVE1VTF9ESU1fTk07IC8vIDIKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKICB2ZWM0ZiBjX3NbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07CgogIGZvciAoaW50IGtJZCA9IGtJZFN0YXJ0OyBrSWQgPCBrSWRTdG9wOyBrSWQgKz0gS19ESU0pIHsKCiAgICBsb2FkTERTPGJvdW5kQ2hlY2s+KHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIE0sIE4pOwogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHZlYzRmIGNfdG1wW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwojcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBYID0gVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YOwogICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7CgogICAgICAgIHZlYzRmIGNfdG1wID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwojcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgS19ESU07ayArPSBNQVRNVUxfRElNX0spIC8vIE1BVE1VTF9ESU1fSyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgS19ESU0KICAgICAgICB7CiAgICAgICAgICBpbnQgYV9jb2wgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBpbnQgYl9jb2wgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBtYXRtdWwxNngxNigmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBrLCBhX2NvbCwgYl9jb2wsIGNfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUSUxFX1NJWkVfWCwgVElMRV9TSVpFX1kpOwogICAgICAgIH0KCiAgICAgICAgaW50IGFfcm93ID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgIC8vIEFwcGx5IHNjYWxpbmcKICAgICAgICBpbnQgYXNfY29sID0ga0lkIC8gMTI4OwogICAgICAgIGludCBhc19yb3cgPSBhX3JvdyArIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWDsKICAgICAgICBpbnQgYnNfY29sID0gYmxvY2tJZHgueTsKICAgICAgICBpbnQgYnNfcm93ID0ga0lkIC8gMTI4OwogICAgICAgIGZsb2F0IGJzX3ZhbCA9IGJzW2JzX3JvdyAqIFNOICsgYnNfY29sXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgaW50IHJvdyA9IGFzX3JvdyArIGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgIGZsb2F0IGFzX3ZhbCA9IGFzW2FzX2NvbCAqIE0gKyByb3ddOwogICAgICAgICAgY19zW3Rfd0lkeF1bdF93SWR5XVtpXSArPSBjX3RtcFtpXSAqIGFzX3ZhbCAqIGJzX3ZhbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQogIAoKICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewogICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgLy8gb2Zmc2V0IHBvaW50aW5nIHRvIHRoZSBhY2N1bXVsYXRlZCAxNngxNiBibG9jawogICAgICBpbnQgY29sX29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC55ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR5ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR5ICogKFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWSk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGludCByb3dfb2Zmc2V0ID0KICAgICAgICAgIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWCArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICAgICAgICB0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKICAgICAgYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwoKICAgICAgYm9vbCBiX2NoZWNrID0gdHJ1ZTsKICAgICAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgICAgICBiX2NoZWNrID0gKHJvd19vZmZzZXQpIDwgTSAmJiAoY29sX29mZnNldCkgPCBOOwogICAgICB9CiAgICAgIGlmIChiX2NoZWNrKSB7CiAgICAgICAgICAvLyBDIGlzIHN0b3JlZCBvbiA0IFZHUFJzCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBpbnQgY29sID0gbGFuZUlkICUgMTY7CiAgICAgICAgICAgICAgaW50IHJvdyA9IGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKHVzZUF0b21pYyl7CiAgICAgICAgICAgICAgICBhdG9taWNBZGQoICZjX2F0b21pY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSxyZXNbaV0pOwogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgCiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdHJ1Y3QgTGF1bmNoQ29uZmlnIHsKICBpbnQgS19TUExJVDsKICBib29sIHVzZUF0b21pYzsKICBib29sIGJvdW5kQ2hlY2s7Cn07Cgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQsIGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+CmlubGluZSB2b2lkIGxhdW5jaF9rZXJuZWxfdmFyaWFudChjb25zdCBkaW0zJiBibG9ja3MsIGNvbnN0IGRpbTMmIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CgogIGRpbTMgdGhyZWFkc0Nhc3QoMjU2KTsKICBkaW0zIGJsb2NrQ2FzdCgoTSpOICsgKE4qTS0xKSkvMjU2KTsKCiAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPEtfU1BMSVQsIGJvdW5kQ2hlY2ssIHVzZUF0b21pYz4pLCBibG9ja3MsIHRocmVhZHMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIGNfYXRvbWljLE0sIE4sIEspOwogIGlmIGNvbnN0ZXhwciAodXNlQXRvbWljKXsKICAgIGhpcExhdW5jaEtlcm5lbEdHTChjYXN0X2tlcm5lbCwgYmxvY2tDYXN0LHRocmVhZHNDYXN0LDAsMCxkX0MsY19hdG9taWMsTSxOKTsKICB9Cn0KCgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQ+CmlubGluZSB2b2lkIGRpc3BhdGNoX2JvdW5kX2F0b21pYyhib29sIGJvdW5kQ2hlY2ssIGJvb2wgdXNlQXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGltMyYgYmxvY2tzLCBjb25zdCBkaW0zJiB0aHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQXMsIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLGZsb2F0KmNfYXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE0sIGludCBOLCBpbnQgSykgewogIGlmIChib3VuZENoZWNrKSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgewogICAgICBoaXBNZW1zZXQoY19hdG9taWMsIDAsIE4qTSAqIHNpemVvZihmbG9hdCkpOwogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgdHJ1ZSwgdHJ1ZT4oYmxvY2tzLCB0aHJlYWRzLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsKICAgIH0KICAgIGVsc2UKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIHRydWUsIGZhbHNlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogIH0gZWxzZSB7CiAgICBpZiAodXNlQXRvbWljKXsKICAgICAgaGlwTWVtc2V0KGNfYXRvbWljLCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIGZhbHNlLCB0cnVlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogICAgfQogICAgZWxzZQogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgZmFsc2UsIGZhbHNlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogIH0KfQoKdm9pZCBsYXVuY2hfa2VybmVsKGNvbnN0IExhdW5jaENvbmZpZyAmY29uZmlnLCBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CgogIGRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRiAqIE5fV0FSUF9ZX0RFRiAqIFdBUlBfU0laRSk7CiAgZGltMyBibG9ja3NQZXJHcmlkKChNICsgVElMRV9TSVpFX1hfREVGIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUYsCiAgICAgICAgICAgICAgICAgICAgIChOICsgVElMRV9TSVpFX1lfREVGIC0gMSkgLyBUSUxFX1NJWkVfWV9ERUYsCiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5LX1NQTElUKTsKCiAgc3dpdGNoIChjb25maWcuS19TUExJVCkgewogICAgY2FzZSAxOiBkaXNwYXRjaF9ib3VuZF9hdG9taWM8MT4oY29uZmlnLmJvdW5kQ2hlY2ssIGNvbmZpZy51c2VBdG9taWMsIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7IGJyZWFrOwogICAgY2FzZSAyOiBkaXNwYXRjaF9ib3VuZF9hdG9taWM8Mj4oY29uZmlnLmJvdW5kQ2hlY2ssIGNvbmZpZy51c2VBdG9taWMsIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7IGJyZWFrOwogICAgY2FzZSA0OiBkaXNwYXRjaF9ib3VuZF9hdG9taWM8ND4oY29uZmlnLmJvdW5kQ2hlY2ssIGNvbmZpZy51c2VBdG9taWMsIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJVbnN1cHBvcnRlZCBLX1NQTElUIHZhbHVlIik7CiAgfQp9CgoKdm9pZCBsYXVuY2hfa2VybmVsKGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwgY29uc3QgZmxvYXQgKmRfQXMsCiAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQywgZmxvYXQqY19hdG9taWMsaW50IE0sIGludCBOLAogICAgICAgICAgICAgICAgICAgaW50IEspIHsKICBMYXVuY2hDb25maWcgY29uZmlnOwogIGNvbmZpZy51c2VBdG9taWM9ZmFsc2U7CiAgY29uZmlnLktfU1BMSVQ9MTsKICBpZiAoTSAlIDEyOCA9PTAgJiYgTiAlMTI4ID09MCkKICAgIGNvbmZpZy5ib3VuZENoZWNrID0gZmFsc2U7CiAgZWxzZQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSB0cnVlOwoKICAvL1NQTElUIEsgZm9yIHRoZXNlIDoKICBpZiAoKE0gPT0gMTAyNCAmJiAgTj09MTUzNiAmJiBLID09NzE2OCApfHwKICAgICAgKE0gPT0gMTAyNCAmJiAgTj09NTEyICYmIEsgPT03MTY4ICkgfHwKICAgICAgKE0gPT0gMTAyNCAmJiAgTj09NTc2ICYmIEsgPT03MTY4ICkpewogICAgICAgIGNvbmZpZy51c2VBdG9taWMgPSB0cnVlOwogICAgICAgIGNvbmZpZy5LX1NQTElUID0gNDsKICAgICAgfSAgCiAgbGF1bmNoX2tlcm5lbChjb25maWcsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwp9CgoKCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgTSwKICAgIGludCBOLAogICAgaW50IEsKKSB7CiAgICBjb25zdCBhdXRvKiBkX0EgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGFfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogZF9BcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogZF9CcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihic19wdHIpOwogICAgYXV0byogZF9DID0gcmVpbnRlcnByZXRfY2FzdDxfX2hpcF9iZmxvYXQxNio+KGNfcHRyKTsKCiAgICBkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUYgKiBOX1dBUlBfWV9ERUYgKiBXQVJQX1NJWkUpOwogICAgZGltMyBibG9ja3NQZXJHcmlkKChNICsgVElMRV9TSVpFX1hfREVGIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUYsCiAgICAgICAgICAgICAgICAgICAgIChOICsgVElMRV9TSVpFX1lfREVGIC0gMSkgLyBUSUxFX1NJWkVfWV9ERUYpOwogICAgCiAgICBzdGF0aWMgZmxvYXQqIGRfYXJyYXkgPSBudWxscHRyOwogICAgc3RhdGljIGludCBuPS0xOwogICAgc3RhdGljIGludCBtPS0xOwogICAgaWYgKCFkX2FycmF5KQogICAgewogICAgICAgIHNpemVfdCBzaXplID0gNjE0NCo3MTY4ICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICBoaXBFcnJvcl90IGVyciA9IGhpcE1hbGxvYygmZF9hcnJheSwgc2l6ZSk7CiAgICB9CiAgIC8vIGhpcE1lbXNldChkX2FycmF5LCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgIGxhdW5jaF9rZXJuZWwoZF9BLCBkX0IsIGRfQXMsCiAgICAgICAgICAgICAgICAgICBkX0JzLGRfQywgZF9hcnJheSwgTSwgTiwgSyk7IAoKICAgIC8vaGlwRnJlZShkX2FycmF5KTsKICAgIEhJUF9DSEVDSyhoaXBHZXRMYXN0RXJyb3IoKSk7Cn0KClBZQklORDExX01PRFVMRShmcDgsIG0pIHsKICBtLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLWcgLS1zYXZlLXRlbXBzIC1ScGFzcy1hbmFseXNpcz1rZXJuZWwtcmVzb3VyY2UtdXNhZ2UgLXN0ZD1jKysyMCJdLAogICAgbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgpmaXJzdCA9IFRydWUKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYmxvY2stc2NhbGUgZnA4IGdlbW0KICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgdGhhdCBleHBhbmRzIHRvOgogICAgICAgICAgICBhOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbSwga10sCiAgICAgICAgICAgIGI6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFtuLCBrXSwKICAgICAgICAgICAgYV9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFttLCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGJfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbiAvLyAxMjgsIGsgLy8gMTI4XSwKICAgICAgICAgICAgYzogdG9yY2guVGVuc29yW2JmbG9hdDE2XSBvZiBzaGFwZSBbbSwgbl0KICAgIFJldHVybnM6CiAgICAgICAgVGVuc29yIGNvbnRhaW5pbmcgb3V0cHV0IGluIGJmMTYKICAgICIiIgoKICAgIGdsb2JhbCBmaXJzdAogICAgaWYgZmlyc3Q6CiAgICAgICAgcHJpbnQoImV4ZWN1dGluZyBvbiIsIHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9uYW1lKCksIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICBmaXJzdCA9IEZhbHNlCgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKCiAgICBtLCBuID0gYy5zaGFwZQogICAgayA9IGEuc2hhcGVbMV0KCiAgICBoaXBfbW9kdWxlLmZwOCgKICAgICAgICBhLmRhdGFfcHRyKCksCiAgICAgICAgYi5kYXRhX3B0cigpLAogICAgICAgIGFfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBiX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYy5kYXRhX3B0cigpLAogICAgICAgIG0sCiAgICAgICAgbiwKICAgICAgICBrCiAgICApCgogICAgcmV0dXJuIGMKNo newline at end of file
Best evidence level for this revision: reported
JSON