submission 30507
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.
submission_mla_4.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-30507?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesbf16
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:f742eea4f47ffd2ea33c7265f7e45758f5a3987bdcd0e9b853da0ff57a3b27fe
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
submission_mla_4.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZGVmIHNhdmVfdGVuc29yX3Jhdyh0ZW5zb3I6IHRvcmNoLlRlbnNvciwgbmFtZTogc3RyKToKICAgIHRlbnNvciA9IHRlbnNvci5kZXRhY2goKS5jcHUoKQoKICAgIGlmIHRlbnNvci5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNjoKICAgICAgICAjIENvbnZlcnQgdG8gcmF3IHVpbnQxNiByZXByZXNlbnRhdGlvbgogICAgICAgIGFycmF5ID0gdGVuc29yLnZpZXcodG9yY2gudWludDE2KS5udW1weSgpCiAgICAgICAgYXJyYXkudG9maWxlKGYie25hbWV9LmJpbiIpCiAgICBlbHNlOgogICAgICAgIG5wX2R0eXBlID0gewogICAgICAgICAgICB0b3JjaC5mbG9hdDE2OiBucC5mbG9hdDE2LAogICAgICAgICAgICB0b3JjaC5mbG9hdDMyOiBucC5mbG9hdDMyLAogICAgICAgICAgICB0b3JjaC5pbnQzMjogbnAuaW50MzIsCiAgICAgICAgfS5nZXQodGVuc29yLmR0eXBlLCBOb25lKQoKICAgICAgICBpZiBucF9kdHlwZSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoZiJVbnN1cHBvcnRlZCB0ZW5zb3IgZHR5cGU6IHt0ZW5zb3IuZHR5cGV9IikKCiAgICAgICAgYXJyYXkgPSB0ZW5zb3IubnVtcHkoKS5hc3R5cGUobnBfZHR5cGUpCiAgICAgICAgYXJyYXkudG9maWxlKGYie25hbWV9LmJpbiIpCgogICAgIyBTYXZlIHNoYXBlCiAgICBucC5hcnJheSh0ZW5zb3Iuc2hhcGUsIGR0eXBlPW5wLmludDMyKS50b2ZpbGUoZiJ7bmFtZX0uc2hhcGUiKQogICAgIAogICAgIAppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKa2VybmVsX2NwcCA9IHIiIiIKI3VuZGVmIF9fSElQX05PX0hBTEZfT1BFUkFUT1JTX18KI3VuZGVmIF9fSElQX05PX0hBTEZfQ09OVkVSU0lPTlNfXwojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmbG9hdDE2Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCiNpbmNsdWRlIDxyb2NibGFzL3JvY2JsYXMuaD4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCnZvaWQgbWF0bXVsX2JsYXNfY21fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX3RyYW5zcG9zZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sc3RyaWRlS04sCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE0sc3RyaWRlTUssCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgbl9iYXRjaGVzLAogICAgcm9jYmxhc19kYXRhdHlwZV9mMzJfciwKICAgIHJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAogICAgMCwgMAogICk7Cn0KCnZvaWQgbWVyZ2VkX21hdG11bCgKICB1aW50cHRyX3QgUV9wcm9qX3VwX3B0ciwKICB1aW50cHRyX3QgS1ZfcHJval91cF9wdHIsCiAgdWludHB0cl90IG1lcmdlZF9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHFfbG9yYV9kaW0sCiAgaW50IGt2X2xvcmFfZGltKXsKICAKICBjb25zdCBiZjE2ICpkX1dxX1VwX25vcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihRX3Byb2pfdXBfcHRyKTsKICBjb25zdCBiZjE2ICpkX1drX3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oS1ZfcHJval91cF9wdHIpOwogIGJmMTYgKmRfbWVyZ2VkID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4obWVyZ2VkX3B0cik7CiAgCiAgY29uc3QgaW50IG5iX2hlYWRzID0gMTI4OwogIGNvbnN0IGludCBNID0gcV9sb3JhX2RpbTsKICBjb25zdCBpbnQgTiA9IGt2X2xvcmFfZGltOwogIGNvbnN0IGludCBLID0gMTI4OwogIGNvbnN0IGludCBzdHJpZGVNSyA9IDE5MipxX2xvcmFfZGltOy8vMTI4KzY0CiAgY29uc3QgaW50IHN0cmlkZUtOID0gMjU2Kmt2X2xvcmFfZGltOyAvLzEyOCsxMjgKICAgIAogIG1hdG11bF9ibGFzX2NtX3JtX2JhdGNoZWRfc3RyaWRlKGRfV3FfVXBfbm9wZSwgZF9Xa191cCwgZF9tZXJnZWQsIE0sICBOLCAgSywgYmF0Y2hfc2l6ZSxzdHJpZGVNSywgc3RyaWRlS04pOwogIAp9Cgp2b2lkIG1hdG11bF9ibGFzX3JtX2NtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IGJmMTYqZEEsIGNvbnN0IGJmMTYgKmRCLCBjb25zdCBiZjE2ICpkQywgYmYxNiAqZEQsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBuX2JhdGNoZXMsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSl7CgogIHJvY2JsYXNfZ2VtbV9zdHJpZGVkX2JhdGNoZWRfZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl90cmFuc3Bvc2UsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRELCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc3RhbmRhcmQsCiAgICAwLCAwCiAgKTsKfQoKdm9pZCBjb21iaW5lX3JvcGUoCiAgdWludHB0cl90IFNjb3JlTm9Sb3BlX3B0ciwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9vdXRfcHRyLAogIHVpbnRwdHJfdCBTY29yZU91dF9wdHIsCiAgaW50IE0sCiAgaW50IE4sCiAgaW50IEssCiAgZmxvYXQgc2NhbGUpewogIAogIGNvbnN0IGJmMTYgKmRfcV9yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcm9wZV9vdXRfcHRyKTsKICBjb25zdCBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgY29uc3QgYmYxNiAqZF9TY29yZU5vUm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFNjb3JlTm9Sb3BlX3B0cik7CiAgYmYxNiAqICBkX1Njb3JlT3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oU2NvcmVPdXRfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgaW50IHN0cmlkZU1LID0gSypNOwogIGludCBzdHJpZGVLTiA9IEsqTjsKCiAgbWF0bXVsX2JsYXNfcm1fY21fYmF0Y2hlZF9zdHJpZGUoZF9xX3JvcGVfb3V0LCBkX2tfcm9wZV9vdXQsIGRfU2NvcmVOb1JvcGUsIGRfU2NvcmVPdXQsIE0sICBOLCAgSywgbmJfaGVhZHMsc3RyaWRlTUssIHN0cmlkZUtOLHNjYWxlLHNjYWxlKTsKCiAgCn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICAKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX25vbmUsCiAgICBOLCBNLCBLLAogICAgJmFscGhhLAogICAgZEIsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLHN0cmlkZUtOLAogICAgZEEsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBLLHN0cmlkZU1LLAogICAgJmJldGEsCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIG5fYmF0Y2hlcywKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zb2x1dGlvbl9pbmRleCwKICAgIDAsIDAKICApOwogIAp9CnZvaWQgbWF0bXVsX3Fsb3JhKAogIHVpbnRwdHJfdCBxX2xvcmFfcHRyLAogIHVpbnRwdHJfdCBXX21lcmdlZF9wdHIsCiAgdWludHB0cl90IFNjb3JlTm9Sb3BlX3B0ciwKICBpbnQgTSwKICBpbnQgTiwKICBpbnQgSyl7CiAgCiAgY29uc3QgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX2xvcmFfcHRyKTsKICBjb25zdCBiZjE2ICpkX1dfbWVyZ2VkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oV19tZXJnZWRfcHRyKTsKICBiZjE2ICpkX1Njb3JlTm9Sb3BlMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGJmMTYqPihTY29yZU5vUm9wZV9wdHIpOwogIAogIGNvbnN0IGludCBuYl9oZWFkcyA9IDEyODsKICBjb25zdCBpbnQgc3RyaWRlTUsgPSAwOwogIGNvbnN0IGludCBzdHJpZGVLTiA9IEsqTjsgCiAgIAogIG1hdG11bF9ibGFzX3JtX3JtX2JhdGNoZWRfc3RyaWRlKGRfcV9sb3JhLCBkX1dfbWVyZ2VkLCBkX1Njb3JlTm9Sb3BlMSwgTSwgIE4sICBLLCBuYl9oZWFkcyxzdHJpZGVNSywgc3RyaWRlS04pOwogIAp9CgpQWUJJTkQxMV9NT0RVTEUocm9wZSwgbSkgewogIG0uZGVmKCJpbml0IiwgJmluaXQsICJJbml0IGNvZGUiKTsKICBtLmRlZigicm9wZSIsICZjb21wdXRlX3JvcGVzX3dyYXBwZXIsICJSb3BlIGtlcm5lbCIpOwogIG0uZGVmKCJzdG9yZWt2IiwgJnN0b3JlX3RvX2t2X2NhY2hlX3dyYXBwZXIsICJLVkNhY2hlIGtlcm5lbCIpOwogIG0uZGVmKCJkb3duX3Byb2oiLCAmZG93bl9wcm9qLCAiRG93biBQcm9qIGtlcm5lbCIpOwogIG0uZGVmKCJtZXJnZWRfbWF0bXVsIiwgJm1lcmdlZF9tYXRtdWwsICJtZXJnZWRfbWF0bXVsIGtlcm5lbCIpOwogIG0uZGVmKCJjb21iaW5lX3JvcGUiLCAmY29tYmluZV9yb3BlLCAiY29tYmluZV9yb3BlIGtlcm5lbCIpOwogIG0uZGVmKCJtYXRtdWxfcWxvcmEiLCAmbWF0bXVsX3Fsb3JhLCAibWF0bXVsX3Fsb3JhIGtlcm5lbCIpOwogIAogIAp9CiIiIgoKICAgICAgICAKaGlwX21vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0icm9wZSIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLXN0ZD1jKysxNyJdLAogICAgbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgoKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCgogICAgIApjbGFzcyBNTEEobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IENvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgICAgICAgCiAgICAgICAgc2VsZi5xX2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5xX2xvcmFfcmFuayxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLmt2X2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsrNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgIAogICAgICAgIHNlbGYuV19tZXJnZWQgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgc2VsZi5xX2xvcmFfcmFuaywgc2VsZi5rdl9sb3JhX3JhbmssZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBoaXBfbW9kdWxlLmluaXQoKQogICAgICAgIAogCiAgICAgICAgCiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgoKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQogICAgICAgICAgCiAgICAgICAgaGlwX21vZHVsZS5kb3duX3Byb2ooCiAgICAgICAgICAgICAgICB4LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYV9yYW5rLAogICAgICAgICAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsrNjQsCiAgICAgICAgICAgICAgICB4LnNoYXBlWzJdKQogICAgICAgICAgICAgICAKICAgICAgICBoaXBfbW9kdWxlLm1lcmdlZF9tYXRtdWwoCiAgICAgICAgICBzZWxmLmNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICBzZWxmLmNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5XX21lcmdlZC5kYXRhX3B0cigpLAogICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuaykKICAKICAgICAgICBoaXBfbW9kdWxlLnN0b3Jla3YoCiAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICBrdl9jYWNoZS5nZXRfZGF0YSgpLmRhdGFfcHRyKCksCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIGt2X2NhY2hlLnNlcV9sZW4pCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgcV9kb3duID0gc2VsZi5xX2xvcmEudW5zcXVlZXplKDEpICMgKDEyOCwxLDE1MzYpIC0+ICgxMjgsMSwxLDE1MzYpCiAgICAgICAgCiAgICAgICAgU2NvcmVOb1JvcGUxID0gdG9yY2gubWF0bXVsKHNlbGYucV9sb3JhLnNxdWVlemUoMSksc2VsZi5XX21lcmdlZCkjMgoKICAgICAgICAKICAgICAgICBTY29yZU5vUm9wZTEgPSBTY29yZU5vUm9wZTEucGVybXV0ZSgxLDAsMikKICAgICAgICAKICAgICAgICBrdl9jYWNoZS5zZXFfbGVuKz0xCiAgICAgICAga3ZfbGVuID0ga3ZfY2FjaGUuc2VxX2xlbgogICAgICAgIAogICAgICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEKICAgICAgICBrdl9sb3JhID0ga3ZfY2FjaGUuZ2V0X2RhdGEoKVs6LCA6a3ZfbGVuLCA6XQogICAgICAgIGt2RG93bl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgICAgICAgICAgICAgIAogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2RG93bl9ub3BlLnBlcm11dGUoMCwyLDEpCiAgICAgICAga3ZfZG93bl9wZXJtdXRlID0ga3ZfZG93bl9wZXJtdXRlLnVuc3F1ZWV6ZSgxKSAjKDEyOCw1MTIsc2VxKSAtPiAoMTI4LDEsNTEyLHNlcSkKICAgICAgICAKICAgICAgICBTY29yZU5vUm9wZV90PVNjb3JlTm9Sb3BlMS52aWV3KGJhdGNoX3NpemUsc2VsZi5uX2hlYWRzLDUxMikgI1ticyxuX2hlYWQsNTEyXSkKICAgICAgICBTY29yZU5vUm9wZSA9IHRvcmNoLm1hdG11bChTY29yZU5vUm9wZV90LGt2X2Rvd25fcGVybXV0ZS5zcXVlZXplKDEpKSMzCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuY29uZmlnLlFfcHJval91cF93ZWlnaHQudCgpLnZpZXcoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5ub3BlX2hlYWRfZGltK3NlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBfLCBXcV9VcF9yb3BlID0gdG9yY2guc3BsaXQoV3FOb3BlUm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICBXa3ZfdXAgPSBzZWxmLmNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC50KCkudmlldyhzZWxmLmt2X2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5ub3BlX2hlYWRfZGltK3NlbGYudl9oZWFkX2RpbSkKICAgICAgICBfLCBXdl91cCA9IHRvcmNoLnNwbGl0KFdrdl91cCwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi52X2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIAogICAgICAgIFd2X3VwID0gV3ZfdXAucGVybXV0ZSgxLCAwLCAyKSAgIyBzaGFwZTogKG5faGVhZCwgZGltLCBoZWFkKSAgICAgICAgCiAgICAgICAgV3FfVXBfcm9wZTAgPSBXcV9VcF9yb3BlLnZpZXcoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFdxX1VwX3JvcGUwID0gV3FfVXBfcm9wZTAucGVybXV0ZSgxLDAsMikKICAgICAgICBRUm9wZTAgPSB0b3JjaC5tYXRtdWwoc2VsZi5xX2xvcmEucGVybXV0ZSgxLDAsMiksV3FfVXBfcm9wZTApIzEKICAgIAogICAgICAgIAogICAgICAgIFFSb3BlID0gUVJvcGUwLnBlcm11dGUoMSwwLDIpLnZpZXcoMTI4LCAxLCAxMjgsIDY0KS5jb250aWd1b3VzKCkKICAgICAgICBxX3JvcGUgPSBRUm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHggc2VxX2xlbiB4IHJvcGVfaGVhZF9kaW0KIAogICAgICAgIGtfcm9wZV9vdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCBrdl9sZW4sIDY0LGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIHFfcm9wZV9vdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsMSwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgaGlwX21vZHVsZS5yb3BlKGtfcm9wZV9vdXQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGtfcm9wZS5zdHJpZGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcV9yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uX2hlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICBrdl9sZW4pCiAgICAgICAgCiAgICAgICAga19yb3BlX291dCA9IGtfcm9wZV9vdXQudW5zcXVlZXplKDEpCgogICAgICAgIFNjb3JlT3V0ID0gdG9yY2guZW1wdHkoYmF0Y2hfc2l6ZSwgMTI4LCBrdl9sZW4sZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgaGlwX21vZHVsZS5jb21iaW5lX3JvcGUoCiAgICAgICAgICBTY29yZU5vUm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgcV9yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAga19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgU2NvcmVPdXQuZGF0YV9wdHIoKSwKICAgICAgICAgIFNjb3JlT3V0LnNoYXBlWzFdLAogICAgICAgICAga3ZfbGVuLAogICAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltLAogICAgICAgICAgMS4wIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkpCiAgICAgICAgCiAgICAgICAgQXR0bk91dFNNYXggPSBGLnNvZnRtYXgoU2NvcmVPdXQsIGRpbT0tMSkjLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIAogICAgICAgIGt2X2Rvd24gPSBrdkRvd25fbm9wZS51bnNxdWVlemUoMSkKICAgICAgICB5MF9jID0gdG9yY2gubWF0bXVsKEF0dG5PdXRTTWF4LnNxdWVlemUoMiksa3ZfZG93bi5zcXVlZXplKDEpKQogICAgICAgIHkwX2M9eTBfYy51bnNxdWVlemUoMikKICAgICAgICAKICAgICAgICB5MF9jID0gdG9yY2gubWF0bXVsKHkwX2MucGVybXV0ZSgxLDAsMiwzKS5zcXVlZXplKDIpLFd2X3VwKQogICAgICAgIHkwX2MgPSB5MF9jLnBlcm11dGUoMSwwLDIpCiAgICAgICAgeTBfYyA9IHRvcmNoLm1hdG11bCh5MF9jLmZsYXR0ZW4oc3RhcnRfZGltPTEpLHNlbGYuY29uZmlnLndvX3dlaWdodC50KCkpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHkwX2MudmlldyhiYXRjaF9zaXplLDEsc2VsZi5kaW0pLCBrdl9jYWNoZS5nZXRfZGF0YSgpCgptb2RlbCA9IE5vbmUKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBkYXRhCiAgICAgIGdsb2JhbCBtb2RlbAogICAgICBpZiBtb2RlbCA9PSBOb25lOgogICAgICAgICAgbW9kZWwgPSBNTEEoY29uZmlnKS50bygnY3VkYTowJykKICAgCiAgICAgIG1vZGVsLmNvbmZpZyA9IGNvbmZpZwogICAgICByZXR1cm4gbW9kZWwoeCwga3ZfY2FjaGUpSource 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 30286.
- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKaW1wb3J0IHN5cwogICAgIAogICAgIAppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKa2VybmVsX2NwcCA9IHIiIiIKI3VuZGVmIF9fSElQX05PX0hBTEZfT1BFUkFUT1JTX18KI3VuZGVmIF9fSElQX05PX0hBTEZfQ09OVkVSU0lPTlNfXwojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmbG9hdDE2Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCiNpbmNsdWRlIDxyb2NibGFzL3JvY2JsYXMuaD4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCnZvaWQgbWF0bXVsX2JsYXNfY21fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX3RyYW5zcG9zZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sc3RyaWRlS04sCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE0sc3RyaWRlTUssCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgbl9iYXRjaGVzLAogICAgcm9jYmxhc19kYXRhdHlwZV9mMzJfciwKICAgIHJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAogICAgMCwgMAogICk7Cn0KCnZvaWQgbWVyZ2VkX21hdG11bCgKICB1aW50cHRyX3QgUV9wcm9qX3VwX3B0ciwKICB1aW50cHRyX3QgS1ZfcHJval91cF9wdHIsCiAgdWludHB0cl90IG1lcmdlZF9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHFfbG9yYV9kaW0sCiAgaW50IGt2X2xvcmFfZGltKXsKICAKICBjb25zdCBiZjE2ICpkX1dxX1VwX25vcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihRX3Byb2pfdXBfcHRyKTsKICBjb25zdCBiZjE2ICpkX1drX3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oS1ZfcHJval91cF9wdHIpOwogIGJmMTYgKmRfbWVyZ2VkID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4obWVyZ2VkX3B0cik7CiAgCiAgY29uc3QgaW50IG5iX2hlYWRzID0gMTI4OwogIGNvbnN0IGludCBNID0gcV9sb3JhX2RpbTsKICBjb25zdCBpbnQgTiA9IGt2X2xvcmFfZGltOwogIGNvbnN0IGludCBLID0gMTI4OwogIGNvbnN0IGludCBzdHJpZGVNSyA9IDE5MipxX2xvcmFfZGltOy8vMTI4KzY0CiAgY29uc3QgaW50IHN0cmlkZUtOID0gMjU2Kmt2X2xvcmFfZGltOyAvLzEyOCsxMjgKICAgIAogIG1hdG11bF9ibGFzX2NtX3JtX2JhdGNoZWRfc3RyaWRlKGRfV3FfVXBfbm9wZSwgZF9Xa191cCwgZF9tZXJnZWQsIE0sICBOLCAgSywgYmF0Y2hfc2l6ZSxzdHJpZGVNSywgc3RyaWRlS04pOwogIAp9Cgp2b2lkIG1hdG11bF9ibGFzX3JtX2NtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IGJmMTYqZEEsIGNvbnN0IGJmMTYgKmRCLCBjb25zdCBiZjE2ICpkQywgYmYxNiAqZEQsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBuX2JhdGNoZXMsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSl7CgogIHJvY2JsYXNfZ2VtbV9zdHJpZGVkX2JhdGNoZWRfZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl90cmFuc3Bvc2UsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRELCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc3RhbmRhcmQsCiAgICAwLCAwCiAgKTsKfQoKdm9pZCBjb21iaW5lX3JvcGUoCiAgdWludHB0cl90IFNjb3JlTm9Sb3BlX3B0ciwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9vdXRfcHRyLAogIHVpbnRwdHJfdCBTY29yZU91dF9wdHIsCiAgaW50IE0sCiAgaW50IE4sCiAgaW50IEssCiAgZmxvYXQgc2NhbGUpewogIAogIGNvbnN0IGJmMTYgKmRfcV9yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcm9wZV9vdXRfcHRyKTsKICBjb25zdCBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgY29uc3QgYmYxNiAqZF9TY29yZU5vUm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFNjb3JlTm9Sb3BlX3B0cik7CiAgYmYxNiAqICBkX1Njb3JlT3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oU2NvcmVPdXRfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgaW50IHN0cmlkZU1LID0gSypNOwogIGludCBzdHJpZGVLTiA9IEsqTjsKCiAgbWF0bXVsX2JsYXNfcm1fY21fYmF0Y2hlZF9zdHJpZGUoZF9xX3JvcGVfb3V0LCBkX2tfcm9wZV9vdXQsIGRfU2NvcmVOb1JvcGUsIGRfU2NvcmVPdXQsIE0sICBOLCAgSywgbmJfaGVhZHMsc3RyaWRlTUssIHN0cmlkZUtOLHNjYWxlLHNjYWxlKTsKCiAgCn0KCgoKUFlCSU5EMTFfTU9EVUxFKHJvcGUsIG0pIHsKICBtLmRlZigiaW5pdCIsICZpbml0LCAiSW5pdCBjb2RlIik7CiAgbS5kZWYoInJvcGUiLCAmY29tcHV0ZV9yb3Blc193cmFwcGVyLCAiUm9wZSBrZXJuZWwiKTsKICBtLmRlZigic3RvcmVrdiIsICZzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyLCAiS1ZDYWNoZSBrZXJuZWwiKTsKICBtLmRlZigiZG93bl9wcm9qIiwgJmRvd25fcHJvaiwgIkRvd24gUHJvaiBrZXJuZWwiKTsKICBtLmRlZigibWVyZ2VkX21hdG11bCIsICZtZXJnZWRfbWF0bXVsLCAibWVyZ2VkX21hdG11bCBrZXJuZWwiKTsKICBtLmRlZigiY29tYmluZV9yb3BlIiwgJmNvbWJpbmVfcm9wZSwgImNvbWJpbmVfcm9wZSBrZXJuZWwiKTsKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTciXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUpIC0+IE5vbmU6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KICAgIApAZGF0YWNsYXNzCmNsYXNzIENvbmZpZzoKICAgIGJhdGNoX3NpemU6IGludAogICAgZGltOiBpbnQKICAgIG5faGVhZHM6IGludAogICAgcV9sb3JhX3Jhbms6IGludCAKICAgIGt2X2xvcmFfcmFuazogaW50CiAgICBxa19ub3BlX2hlYWRfZGltOiBpbnQKICAgIHFrX3JvcGVfaGVhZF9kaW06IGludAogICAgdl9oZWFkX2RpbTogaW50CiAgICBzZXFfbGVuOiBpbnQKICAgIG1heF9zZXFfbGVuOiBpbnQKICAgIGt2X2NhY2hlX3NoYXBlOiB0dXBsZQogICAgUV9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIFFfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICB3b193ZWlnaHQ6IHRvcmNoLlRlbnNvcgoKICAgICAKY2xhc3MgTUxBKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBDb25maWcpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZGltID0gY29uZmlnLmRpbQogICAgICAgIHNlbGYubl9oZWFkcyA9IGNvbmZpZy5uX2hlYWRzCiAgICAgICAgc2VsZi5xX2xvcmFfcmFuayA9IGNvbmZpZy5xX2xvcmFfcmFuawogICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rID0gY29uZmlnLmt2X2xvcmFfcmFuawogICAgICAgIHNlbGYubm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltID0gY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnZfaGVhZF9kaW0gPSBjb25maWcudl9oZWFkX2RpbQogICAgICAgICMgRG93bi1wcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYua3ZfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAgc2VsZi5xX2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5xX2xvcmFfcmFuayxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLmt2X2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsrNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19tZXJnZWQgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgc2VsZi5xX2xvcmFfcmFuaywgc2VsZi5rdl9sb3JhX3JhbmssZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgICAgICAgaGlwX21vZHVsZS5pbml0KCkKICAgICAgICAKICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIGt2X2NhY2hlOiBLVkNhY2hlKSAtPiB0b3JjaC5UZW5zb3I6CgogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIG1vZGVsX2RpbSA9IHguc2l6ZSgpCgogICAgICAgIGhpcF9tb2R1bGUuZG93bl9wcm9qKAogICAgICAgICAgICAgICAgeC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5RX3Byb2pfZG93bi53ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLktWX3Byb2pfZG93bi53ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuays2NCwKICAgICAgICAgICAgICAgIHguc2hhcGVbMl0pCiAgICAgICAgICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUubWVyZ2VkX21hdG11bCgKICAgICAgICAgIHNlbGYuUV9wcm9qX3VwLndlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5LVl9wcm9qX3VwLndlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5XX21lcmdlZC5kYXRhX3B0cigpLAogICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayk7CiAgCiAgICAgICAgaGlwX21vZHVsZS5zdG9yZWt2KAogICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAga3ZfY2FjaGUuZ2V0X2RhdGEoKS5kYXRhX3B0cigpLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBrdl9jYWNoZS5zZXFfbGVuKQogICAgICAgIAogICAgICAgIAogICAgICAgIGt2X2NhY2hlLnNlcV9sZW4rPTEKICAgICAgICBrdl9sZW4gPSBrdl9jYWNoZS5zZXFfbGVuCiAgICAgICAgCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQogICAgICAgIGt2X2xvcmEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpWzosIDprdl9sZW4sIDpdCiAgICAgICAgcV9kb3duID0gc2VsZi5xX2xvcmEudW5zcXVlZXplKDEpICMgKDEyOCwxLDE1MzYpIC0+ICgxMjgsMSwxLDE1MzYpCiAgICAgICAgU2NvcmVOb1JvcGUxID0gdG9yY2gubWF0bXVsKHFfZG93bi5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksc2VsZi5XX21lcmdlZCkjMgogICAgICAgIFNjb3JlTm9Sb3BlMSA9IFNjb3JlTm9Sb3BlMS5wZXJtdXRlKDEsMCwyKQogICAgICAgIGt2RG93bl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgICAgICAgICAgICAgIAogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2RG93bl9ub3BlLnBlcm11dGUoMCwyLDEpCiAgICAgICAga3ZfZG93bl9wZXJtdXRlID0ga3ZfZG93bl9wZXJtdXRlLnVuc3F1ZWV6ZSgxKSAjKDEyOCw1MTIsc2VxKSAtPiAoMTI4LDEsNTEyLHNlcSkKICAgICAgICAKICAgICAgICBTY29yZU5vUm9wZV90PVNjb3JlTm9Sb3BlMS52aWV3KGJhdGNoX3NpemUsc2VsZi5uX2hlYWRzLDUxMikgI1ticyxuX2hlYWQsNTEyXSkKICAgICAgICBTY29yZU5vUm9wZSA9IHRvcmNoLm1hdG11bChTY29yZU5vUm9wZV90LGt2X2Rvd25fcGVybXV0ZS5zcXVlZXplKDEpKSMzCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuUV9wcm9qX3VwLndlaWdodC50KCkudmlldyhzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLm5vcGVfaGVhZF9kaW0rc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIF8sIFdxX1VwX3JvcGUgPSB0b3JjaC5zcGxpdChXcU5vcGVSb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgIFdrdl91cCA9IHNlbGYuS1ZfcHJval91cC53ZWlnaHQudCgpLnZpZXcoc2VsZi5rdl9sb3JhX3Jhbmssc2VsZi5uX2hlYWRzLHNlbGYubm9wZV9oZWFkX2RpbStzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAgXywgV3ZfdXAgPSB0b3JjaC5zcGxpdChXa3ZfdXAsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICAgICAKICAgICAgICBXdl91cCA9IFd2X3VwLnBlcm11dGUoMSwgMCwgMikgICMgc2hhcGU6IChuX2hlYWQsIGRpbSwgaGVhZCkgICAgICAgIAogICAgICAgIFdxX1VwX3JvcGUgPSBXcV9VcF9yb3BlLnJlc2hhcGUoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMqc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFFSb3BlID0gdG9yY2gubWF0bXVsKHNlbGYucV9sb3JhLFdxX1VwX3JvcGUpIzEKICAgICAgICBRUm9wZSA9IFFSb3BlLnZpZXcoMTI4LCAxLCAxMjgsIDY0KQogICAgICAgIHFfcm9wZSA9IFFSb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogCiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIGt2X2xlbiwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgcV9yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywxLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLnJvcGUoa19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLnN0cmlkZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5faGVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGt2X2xlbikKICAgICAgICAKICAgICAgICBrX3JvcGVfb3V0ID0ga19yb3BlX291dC51bnNxdWVlemUoMSkKCiAgICAgICAgU2NvcmVPdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCAxMjgsIGt2X2xlbixkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLmNvbWJpbmVfcm9wZSgKICAgICAgICAgIFNjb3JlTm9Sb3BlLmRhdGFfcHRyKCksCiAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBrX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBTY29yZU91dC5kYXRhX3B0cigpLAogICAgICAgICAgU2NvcmVPdXQuc2hhcGVbMV0sCiAgICAgICAgICBrdl9sZW4sCiAgICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0sCiAgICAgICAgICAxLjAgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKSkKICAgICAgICAKICAgICAgICBBdHRuT3V0U01heCA9IEYuc29mdG1heChTY29yZU91dCwgZGltPS0xKSMudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAga3ZfZG93biA9IGt2RG93bl9ub3BlLnVuc3F1ZWV6ZSgxKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoQXR0bk91dFNNYXguc3F1ZWV6ZSgyKSxrdl9kb3duLnNxdWVlemUoMSkpCiAgICAgICAgeTBfYz15MF9jLnVuc3F1ZWV6ZSgyKQogICAgICAgIAogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV3ZfdXApCiAgICAgICAgeTBfYyA9IHkwX2MucGVybXV0ZSgxLDAsMikKICAgICAgICB5MF9jID0gc2VsZi53byh5MF9jLmZsYXR0ZW4oc3RhcnRfZGltPTEpKQogICAgICAgIAogICAgICAgIHJldHVybiB5MF9jLnZpZXcoYmF0Y2hfc2l6ZSwxLHNlbGYuZGltKSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKbW9kZWwgPSBOb25lCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgICAgICBnbG9iYWwgbW9kZWwKICAgICAgICBpZiBtb2RlbCA9PSBOb25lOgogICAgICAgICAgICBtb2RlbCA9IE1MQShjb25maWcpLnRvKCdjdWRhOjAnKQogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLndvX3dlaWdodCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnNpemUoKSwgY29uZmlnLlFfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX3VwX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLlFfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0LnNldF8oY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc3RyaWRlKCkpIAogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQuc2V0Xyhjb25maWcud29fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcud29fd2VpZ2h0LnNpemUoKSwgY29uZmlnLndvX3dlaWdodC5zdHJpZGUoKSkgCgogICAgICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgICAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZQ==No newline at end of file+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZGVmIHNhdmVfdGVuc29yX3Jhdyh0ZW5zb3I6IHRvcmNoLlRlbnNvciwgbmFtZTogc3RyKToKICAgIHRlbnNvciA9IHRlbnNvci5kZXRhY2goKS5jcHUoKQoKICAgIGlmIHRlbnNvci5kdHlwZSA9PSB0b3JjaC5iZmxvYXQxNjoKICAgICAgICAjIENvbnZlcnQgdG8gcmF3IHVpbnQxNiByZXByZXNlbnRhdGlvbgogICAgICAgIGFycmF5ID0gdGVuc29yLnZpZXcodG9yY2gudWludDE2KS5udW1weSgpCiAgICAgICAgYXJyYXkudG9maWxlKGYie25hbWV9LmJpbiIpCiAgICBlbHNlOgogICAgICAgIG5wX2R0eXBlID0gewogICAgICAgICAgICB0b3JjaC5mbG9hdDE2OiBucC5mbG9hdDE2LAogICAgICAgICAgICB0b3JjaC5mbG9hdDMyOiBucC5mbG9hdDMyLAogICAgICAgICAgICB0b3JjaC5pbnQzMjogbnAuaW50MzIsCiAgICAgICAgfS5nZXQodGVuc29yLmR0eXBlLCBOb25lKQoKICAgICAgICBpZiBucF9kdHlwZSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoZiJVbnN1cHBvcnRlZCB0ZW5zb3IgZHR5cGU6IHt0ZW5zb3IuZHR5cGV9IikKCiAgICAgICAgYXJyYXkgPSB0ZW5zb3IubnVtcHkoKS5hc3R5cGUobnBfZHR5cGUpCiAgICAgICAgYXJyYXkudG9maWxlKGYie25hbWV9LmJpbiIpCgogICAgIyBTYXZlIHNoYXBlCiAgICBucC5hcnJheSh0ZW5zb3Iuc2hhcGUsIGR0eXBlPW5wLmludDMyKS50b2ZpbGUoZiJ7bmFtZX0uc2hhcGUiKQogICAgIAogICAgIAppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKa2VybmVsX2NwcCA9IHIiIiIKI3VuZGVmIF9fSElQX05PX0hBTEZfT1BFUkFUT1JTX18KI3VuZGVmIF9fSElQX05PX0hBTEZfQ09OVkVSU0lPTlNfXwojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmbG9hdDE2Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCiNpbmNsdWRlIDxyb2NibGFzL3JvY2JsYXMuaD4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCnZvaWQgbWF0bXVsX2JsYXNfY21fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX3RyYW5zcG9zZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sc3RyaWRlS04sCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE0sc3RyaWRlTUssCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgbl9iYXRjaGVzLAogICAgcm9jYmxhc19kYXRhdHlwZV9mMzJfciwKICAgIHJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAogICAgMCwgMAogICk7Cn0KCnZvaWQgbWVyZ2VkX21hdG11bCgKICB1aW50cHRyX3QgUV9wcm9qX3VwX3B0ciwKICB1aW50cHRyX3QgS1ZfcHJval91cF9wdHIsCiAgdWludHB0cl90IG1lcmdlZF9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHFfbG9yYV9kaW0sCiAgaW50IGt2X2xvcmFfZGltKXsKICAKICBjb25zdCBiZjE2ICpkX1dxX1VwX25vcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihRX3Byb2pfdXBfcHRyKTsKICBjb25zdCBiZjE2ICpkX1drX3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oS1ZfcHJval91cF9wdHIpOwogIGJmMTYgKmRfbWVyZ2VkID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4obWVyZ2VkX3B0cik7CiAgCiAgY29uc3QgaW50IG5iX2hlYWRzID0gMTI4OwogIGNvbnN0IGludCBNID0gcV9sb3JhX2RpbTsKICBjb25zdCBpbnQgTiA9IGt2X2xvcmFfZGltOwogIGNvbnN0IGludCBLID0gMTI4OwogIGNvbnN0IGludCBzdHJpZGVNSyA9IDE5MipxX2xvcmFfZGltOy8vMTI4KzY0CiAgY29uc3QgaW50IHN0cmlkZUtOID0gMjU2Kmt2X2xvcmFfZGltOyAvLzEyOCsxMjgKICAgIAogIG1hdG11bF9ibGFzX2NtX3JtX2JhdGNoZWRfc3RyaWRlKGRfV3FfVXBfbm9wZSwgZF9Xa191cCwgZF9tZXJnZWQsIE0sICBOLCAgSywgYmF0Y2hfc2l6ZSxzdHJpZGVNSywgc3RyaWRlS04pOwogIAp9Cgp2b2lkIG1hdG11bF9ibGFzX3JtX2NtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IGJmMTYqZEEsIGNvbnN0IGJmMTYgKmRCLCBjb25zdCBiZjE2ICpkQywgYmYxNiAqZEQsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBuX2JhdGNoZXMsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSl7CgogIHJvY2JsYXNfZ2VtbV9zdHJpZGVkX2JhdGNoZWRfZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl90cmFuc3Bvc2UsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRELCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc3RhbmRhcmQsCiAgICAwLCAwCiAgKTsKfQoKdm9pZCBjb21iaW5lX3JvcGUoCiAgdWludHB0cl90IFNjb3JlTm9Sb3BlX3B0ciwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9vdXRfcHRyLAogIHVpbnRwdHJfdCBTY29yZU91dF9wdHIsCiAgaW50IE0sCiAgaW50IE4sCiAgaW50IEssCiAgZmxvYXQgc2NhbGUpewogIAogIGNvbnN0IGJmMTYgKmRfcV9yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcm9wZV9vdXRfcHRyKTsKICBjb25zdCBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgY29uc3QgYmYxNiAqZF9TY29yZU5vUm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFNjb3JlTm9Sb3BlX3B0cik7CiAgYmYxNiAqICBkX1Njb3JlT3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oU2NvcmVPdXRfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgaW50IHN0cmlkZU1LID0gSypNOwogIGludCBzdHJpZGVLTiA9IEsqTjsKCiAgbWF0bXVsX2JsYXNfcm1fY21fYmF0Y2hlZF9zdHJpZGUoZF9xX3JvcGVfb3V0LCBkX2tfcm9wZV9vdXQsIGRfU2NvcmVOb1JvcGUsIGRfU2NvcmVPdXQsIE0sICBOLCAgSywgbmJfaGVhZHMsc3RyaWRlTUssIHN0cmlkZUtOLHNjYWxlLHNjYWxlKTsKCiAgCn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICAKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX25vbmUsCiAgICBOLCBNLCBLLAogICAgJmFscGhhLAogICAgZEIsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLHN0cmlkZUtOLAogICAgZEEsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBLLHN0cmlkZU1LLAogICAgJmJldGEsCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIG5fYmF0Y2hlcywKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zb2x1dGlvbl9pbmRleCwKICAgIDAsIDAKICApOwogIAp9CnZvaWQgbWF0bXVsX3Fsb3JhKAogIHVpbnRwdHJfdCBxX2xvcmFfcHRyLAogIHVpbnRwdHJfdCBXX21lcmdlZF9wdHIsCiAgdWludHB0cl90IFNjb3JlTm9Sb3BlX3B0ciwKICBpbnQgTSwKICBpbnQgTiwKICBpbnQgSyl7CiAgCiAgY29uc3QgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX2xvcmFfcHRyKTsKICBjb25zdCBiZjE2ICpkX1dfbWVyZ2VkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oV19tZXJnZWRfcHRyKTsKICBiZjE2ICpkX1Njb3JlTm9Sb3BlMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGJmMTYqPihTY29yZU5vUm9wZV9wdHIpOwogIAogIGNvbnN0IGludCBuYl9oZWFkcyA9IDEyODsKICBjb25zdCBpbnQgc3RyaWRlTUsgPSAwOwogIGNvbnN0IGludCBzdHJpZGVLTiA9IEsqTjsgCiAgIAogIG1hdG11bF9ibGFzX3JtX3JtX2JhdGNoZWRfc3RyaWRlKGRfcV9sb3JhLCBkX1dfbWVyZ2VkLCBkX1Njb3JlTm9Sb3BlMSwgTSwgIE4sICBLLCBuYl9oZWFkcyxzdHJpZGVNSywgc3RyaWRlS04pOwogIAp9CgpQWUJJTkQxMV9NT0RVTEUocm9wZSwgbSkgewogIG0uZGVmKCJpbml0IiwgJmluaXQsICJJbml0IGNvZGUiKTsKICBtLmRlZigicm9wZSIsICZjb21wdXRlX3JvcGVzX3dyYXBwZXIsICJSb3BlIGtlcm5lbCIpOwogIG0uZGVmKCJzdG9yZWt2IiwgJnN0b3JlX3RvX2t2X2NhY2hlX3dyYXBwZXIsICJLVkNhY2hlIGtlcm5lbCIpOwogIG0uZGVmKCJkb3duX3Byb2oiLCAmZG93bl9wcm9qLCAiRG93biBQcm9qIGtlcm5lbCIpOwogIG0uZGVmKCJtZXJnZWRfbWF0bXVsIiwgJm1lcmdlZF9tYXRtdWwsICJtZXJnZWRfbWF0bXVsIGtlcm5lbCIpOwogIG0uZGVmKCJjb21iaW5lX3JvcGUiLCAmY29tYmluZV9yb3BlLCAiY29tYmluZV9yb3BlIGtlcm5lbCIpOwogIG0uZGVmKCJtYXRtdWxfcWxvcmEiLCAmbWF0bXVsX3Fsb3JhLCAibWF0bXVsX3Fsb3JhIGtlcm5lbCIpOwogIAogIAp9CiIiIgoKICAgICAgICAKaGlwX21vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0icm9wZSIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLXN0ZD1jKysxNyJdLAogICAgbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgoKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCgogICAgIApjbGFzcyBNTEEobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IENvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgICAgICAgCiAgICAgICAgc2VsZi5xX2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5xX2xvcmFfcmFuayxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLmt2X2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsrNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgIAogICAgICAgIHNlbGYuV19tZXJnZWQgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgc2VsZi5xX2xvcmFfcmFuaywgc2VsZi5rdl9sb3JhX3JhbmssZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBoaXBfbW9kdWxlLmluaXQoKQogICAgICAgIAogCiAgICAgICAgCiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgoKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQogICAgICAgICAgCiAgICAgICAgaGlwX21vZHVsZS5kb3duX3Byb2ooCiAgICAgICAgICAgICAgICB4LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYV9yYW5rLAogICAgICAgICAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsrNjQsCiAgICAgICAgICAgICAgICB4LnNoYXBlWzJdKQogICAgICAgICAgICAgICAKICAgICAgICBoaXBfbW9kdWxlLm1lcmdlZF9tYXRtdWwoCiAgICAgICAgICBzZWxmLmNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICBzZWxmLmNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5XX21lcmdlZC5kYXRhX3B0cigpLAogICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuaykKICAKICAgICAgICBoaXBfbW9kdWxlLnN0b3Jla3YoCiAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICBrdl9jYWNoZS5nZXRfZGF0YSgpLmRhdGFfcHRyKCksCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIGt2X2NhY2hlLnNlcV9sZW4pCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgcV9kb3duID0gc2VsZi5xX2xvcmEudW5zcXVlZXplKDEpICMgKDEyOCwxLDE1MzYpIC0+ICgxMjgsMSwxLDE1MzYpCiAgICAgICAgCiAgICAgICAgU2NvcmVOb1JvcGUxID0gdG9yY2gubWF0bXVsKHNlbGYucV9sb3JhLnNxdWVlemUoMSksc2VsZi5XX21lcmdlZCkjMgoKICAgICAgICAKICAgICAgICBTY29yZU5vUm9wZTEgPSBTY29yZU5vUm9wZTEucGVybXV0ZSgxLDAsMikKICAgICAgICAKICAgICAgICBrdl9jYWNoZS5zZXFfbGVuKz0xCiAgICAgICAga3ZfbGVuID0ga3ZfY2FjaGUuc2VxX2xlbgogICAgICAgIAogICAgICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEKICAgICAgICBrdl9sb3JhID0ga3ZfY2FjaGUuZ2V0X2RhdGEoKVs6LCA6a3ZfbGVuLCA6XQogICAgICAgIGt2RG93bl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgICAgICAgICAgICAgIAogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2RG93bl9ub3BlLnBlcm11dGUoMCwyLDEpCiAgICAgICAga3ZfZG93bl9wZXJtdXRlID0ga3ZfZG93bl9wZXJtdXRlLnVuc3F1ZWV6ZSgxKSAjKDEyOCw1MTIsc2VxKSAtPiAoMTI4LDEsNTEyLHNlcSkKICAgICAgICAKICAgICAgICBTY29yZU5vUm9wZV90PVNjb3JlTm9Sb3BlMS52aWV3KGJhdGNoX3NpemUsc2VsZi5uX2hlYWRzLDUxMikgI1ticyxuX2hlYWQsNTEyXSkKICAgICAgICBTY29yZU5vUm9wZSA9IHRvcmNoLm1hdG11bChTY29yZU5vUm9wZV90LGt2X2Rvd25fcGVybXV0ZS5zcXVlZXplKDEpKSMzCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuY29uZmlnLlFfcHJval91cF93ZWlnaHQudCgpLnZpZXcoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5ub3BlX2hlYWRfZGltK3NlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBfLCBXcV9VcF9yb3BlID0gdG9yY2guc3BsaXQoV3FOb3BlUm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICBXa3ZfdXAgPSBzZWxmLmNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC50KCkudmlldyhzZWxmLmt2X2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5ub3BlX2hlYWRfZGltK3NlbGYudl9oZWFkX2RpbSkKICAgICAgICBfLCBXdl91cCA9IHRvcmNoLnNwbGl0KFdrdl91cCwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi52X2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIAogICAgICAgIFd2X3VwID0gV3ZfdXAucGVybXV0ZSgxLCAwLCAyKSAgIyBzaGFwZTogKG5faGVhZCwgZGltLCBoZWFkKSAgICAgICAgCiAgICAgICAgV3FfVXBfcm9wZTAgPSBXcV9VcF9yb3BlLnZpZXcoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFdxX1VwX3JvcGUwID0gV3FfVXBfcm9wZTAucGVybXV0ZSgxLDAsMikKICAgICAgICBRUm9wZTAgPSB0b3JjaC5tYXRtdWwoc2VsZi5xX2xvcmEucGVybXV0ZSgxLDAsMiksV3FfVXBfcm9wZTApIzEKICAgIAogICAgICAgIAogICAgICAgIFFSb3BlID0gUVJvcGUwLnBlcm11dGUoMSwwLDIpLnZpZXcoMTI4LCAxLCAxMjgsIDY0KS5jb250aWd1b3VzKCkKICAgICAgICBxX3JvcGUgPSBRUm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHggc2VxX2xlbiB4IHJvcGVfaGVhZF9kaW0KIAogICAgICAgIGtfcm9wZV9vdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCBrdl9sZW4sIDY0LGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIHFfcm9wZV9vdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsMSwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgaGlwX21vZHVsZS5yb3BlKGtfcm9wZV9vdXQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGtfcm9wZS5zdHJpZGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcV9yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uX2hlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICBrdl9sZW4pCiAgICAgICAgCiAgICAgICAga19yb3BlX291dCA9IGtfcm9wZV9vdXQudW5zcXVlZXplKDEpCgogICAgICAgIFNjb3JlT3V0ID0gdG9yY2guZW1wdHkoYmF0Y2hfc2l6ZSwgMTI4LCBrdl9sZW4sZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgaGlwX21vZHVsZS5jb21iaW5lX3JvcGUoCiAgICAgICAgICBTY29yZU5vUm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgcV9yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAga19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgU2NvcmVPdXQuZGF0YV9wdHIoKSwKICAgICAgICAgIFNjb3JlT3V0LnNoYXBlWzFdLAogICAgICAgICAga3ZfbGVuLAogICAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltLAogICAgICAgICAgMS4wIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkpCiAgICAgICAgCiAgICAgICAgQXR0bk91dFNNYXggPSBGLnNvZnRtYXgoU2NvcmVPdXQsIGRpbT0tMSkjLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIAogICAgICAgIGt2X2Rvd24gPSBrdkRvd25fbm9wZS51bnNxdWVlemUoMSkKICAgICAgICB5MF9jID0gdG9yY2gubWF0bXVsKEF0dG5PdXRTTWF4LnNxdWVlemUoMiksa3ZfZG93bi5zcXVlZXplKDEpKQogICAgICAgIHkwX2M9eTBfYy51bnNxdWVlemUoMikKICAgICAgICAKICAgICAgICB5MF9jID0gdG9yY2gubWF0bXVsKHkwX2MucGVybXV0ZSgxLDAsMiwzKS5zcXVlZXplKDIpLFd2X3VwKQogICAgICAgIHkwX2MgPSB5MF9jLnBlcm11dGUoMSwwLDIpCiAgICAgICAgeTBfYyA9IHRvcmNoLm1hdG11bCh5MF9jLmZsYXR0ZW4oc3RhcnRfZGltPTEpLHNlbGYuY29uZmlnLndvX3dlaWdodC50KCkpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHkwX2MudmlldyhiYXRjaF9zaXplLDEsc2VsZi5kaW0pLCBrdl9jYWNoZS5nZXRfZGF0YSgpCgptb2RlbCA9IE5vbmUKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBkYXRhCiAgICAgIGdsb2JhbCBtb2RlbAogICAgICBpZiBtb2RlbCA9PSBOb25lOgogICAgICAgICAgbW9kZWwgPSBNTEEoY29uZmlnKS50bygnY3VkYTowJykKICAgCiAgICAgIG1vZGVsLmNvbmZpZyA9IGNvbmZpZwogICAgICByZXR1cm4gbW9kZWwoeCwga3ZfY2FjaGUpNo newline at end of file
Best evidence level for this revision: reported
JSON