Skip to content
KernelIndex
Search⌘K

submission 5810

KernelBot user 3 · 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.

fp8_gemm.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-5810?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, 256]
AMD Instinct MI300X
40.4µs
#26 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 512]
AMD Instinct MI300X
48.6µs
#54 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
94.0µs
#71 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
109.9µs
#38 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
121.2µs
#45 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
140.0µs
#54 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
155.9µs
#58 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
209.4µs
#55 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
359.2µs
#85 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
360.2µs
#88 of 98
2025-04-20
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
361.7µs
#80 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
363.8µs
#71 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
374.7µs
#65 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
403.1µs
#72 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
498.1µs
#58 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
650.4µs
#67 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
836.5µs
#73 of 98
2025-04-20
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
1.45ms
#67 of 98
2025-04-20

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:46421b7c400d257792f2aee875efe3a2eccb2c08dc7fcc33bf46e57410a03fe9
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

fp8_gemm.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9ICJHUFVNT0RFX1RFU1RJTkciIGluIG9zLmVudmlyb24KCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9iZjE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGJpdD4KCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnVzaW5nIGZwOCA9IF9faGlwX2ZwOF9lNG0zX2ZudXo7CnVzaW5nIGJmMTYgPSBfX2hpcF9iZmxvYXQxNjsKdXNpbmcgZnAzMiA9IGZsb2F0Owp1c2luZyBmcDMyeDQgPSBmcDMyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CgpzdHJ1Y3QgY3ViZSB7CiAgICBpbnQgbSwgbiwgazsKfTsKCmNvbnN0ZXhwciBpbnQgd2FycF9zaXplID0gNjQ7CmNvbnN0ZXhwciBpbnQgY2FjaGVfbGluZV9zaXplID0gMTI4OwoKY29uc3RleHByIGludCBtX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKY29uc3RleHByIGludCBuX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKY29uc3RleHByIGludCBrX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAxMjg7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KX19ob3N0X18gX19kZXZpY2VfXwpjb25zdGV4cHIgYXV0byBjZWlsX2RpdihUIGEsIFUgYikgewogICAgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQoKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jID0gMSwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwoRiBmKSB7CiAgICBpZiBjb25zdGV4cHIoSSA8IE4pIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8ST4oKTsKICAgICAgICB1bnJvbGw8SSArIGluYywgTiwgaW5jPihmKTsKICAgIH0KfQoKdGVtcGxhdGU8aW50IEksIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsMWQoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oZik7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwyZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihbJl08aW50IGk+IHsKICAgICAgICB1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqPigpOwogICAgICAgIH0pOwogICAgfSk7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgaW50IEssIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsM2QoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CiAgICAgICAgdW5yb2xsPDAsIEo+KFsmXTxpbnQgaj4gewogICAgICAgICAgICB1bnJvbGw8MCwgSz4oWyZdPGludCBrPiB7CiAgICAgICAgICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8aSwgaiwgaz4oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpfX2RldmljZV9fCnZvaWQgY2xlYXIoVCAoJmFycmF5KVtOXSkgewogICAgdW5yb2xsPDAsIE4+KFsmXTxpbnQgaT4gewogICAgICAgIGFycmF5W2ldID0gVHswfTsKICAgIH0pOwp9CgpfX2RldmljZV9fCmJmMTYgYmYxNl9mcm9tX2ZwMzIoZmxvYXQgeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmdW5jdGlvbiBkb2VzIGFsbCBraW5kcyBvZiBjaGVja3MKICAgIC8vIGZvciBvZGQgY2FzZXMgKE5hTiwgc3Vibm9ybWFscykgdGhhdCB3ZSBkb24ndCBjYXJlIGFib3V0LgogICAgLy8gVGhpcyBnZW5lcmF0ZXMgYWJzb2x1dGVseSBhYnlzbWFsIGNvZGUsIHNvIGp1c3QgdHJ1bmNhdGUKICAgIC8vIHRoZSB1cHBlciBiaXRzIHRvIGdldCB0aGUgcmlnaHQgdmFsdWUgbGlrZSB0aGUKICAgIC8vIE9wcGVycHl0aG9uIGludGVuZGVkLgoKICAgIHJldHVybiBzdGQ6OmJpdF9jYXN0PGJmMTY+KAogICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PigKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oeCkgPj4gMTYKICAgICAgICApCiAgICApOwp9CgpfX2RldmljZV9fCmZwMzIgZnAzMl9mcm9tX2ZwOChmcDggeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmcm9tIGZwOCB0byBmcDMyIGlzIHNsb3cgb24gYW55dGhpbmcgdGhhdAogICAgLy8gZG9lc24ndCBoYXZlIHRoZSBoYXJkd2FyZSBpbnN0cnVjdGlvbnMgdG8gZG8gaXQuIFRoZSBzb2Z0d2FyZQogICAgLy8gbWV0aG9kIGRlYWxzIHdpdGggc3BlY2lhbCBjYXNlcyAoTmFOLCBzdWJub3JtYWxzKSwgYnV0IHdlCiAgICAvLyBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSBzaW5jZSB3ZSBkb24ndCBleHBlY3QgdGhvc2UgaW4KICAgIC8vIHRoZSBpbnB1dC4gVGhlcmVmb3JlLCB3ZSBjYW4gb3B0aW1pemUgdGhlIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCiAgICAvLyBieSBqdXN0IHNodWZmbGluZyB0aGUgYml0cy4KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIC8vIE1JMzAwIGhhcyBhbiBpbnN0cnVjdGlvbiBmb3IgdGhpcy4KICAgIHJldHVybiBmbG9hdCh4KTsKI2Vsc2UKICAgIC8vIEZhbGxiYWNrIGNhc2UKICAgIC8vIFRPRE86IEZpbmQgYSBmYXN0ZXIgb3B0aW9uCiAgICByZXR1cm4gZmxvYXQoeCk7CiNlbmRpZgp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2hvc3RfXwp2b2lkIHNlbGVjdChib29sIGNvbmQsIEYgZikgewogICAgaWYgKGNvbmQpIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGZhbHNlPigpOwogICAgfQp9Cgp0ZW1wbGF0ZTwKICAgIGludCBibG9ja19zaXplLAogICAgaW50IGJsb2NrX3RpbGVfbSwKICAgIGludCBibG9ja190aWxlX24sCiAgICB0eXBlbmFtZSBsb2FkX3R5cGUsCiAgICBib29sIG1fYWxpZ25lZCA9IGZhbHNlLAogICAgYm9vbCBuX2FsaWduZWQgPSBmYWxzZQo+Cl9fZGV2aWNlX18KX19mb3JjZWlubGluZV9fCnZvaWQgYmxvY2tfdGlsZV9sb2FkX2Zhc3RfbGluZWFyKAogICAgLy8gU2hhcmVkIG1lbW9yeSBkZXN0aW5hdGlvbgogICAgZnA4KiBibG9ja190aWxlX2RzdCwKICAgIC8vIEdsb2JhbCBtZW1vcnkgc291cmNlCiAgICBjb25zdCBmcDgqIGJsb2NrX3RpbGVfc3JjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBibG9ja19vZmZfbSwKICAgIGludCBibG9ja19vZmZfbgopIHsKICAgIGJsb2NrX3RpbGVfc3JjICs9IGJsb2NrX29mZl9uICogbSArIGJsb2NrX29mZl9tOwoKICAgIGNvbnN0IGJvb2wgY29tcGxldGVseV9pbl9ib3VuZHMgPSAobV9hbGlnbmVkICYmIG5fYWxpZ25lZCkgfHwKICAgICAgICAoYmxvY2tfb2ZmX20gKyBibG9ja190aWxlX20gPD0gbSAmJgogICAgICAgIGJsb2NrX29mZl9uICsgYmxvY2tfdGlsZV9uIDw9IG4pOwoKICAgIC8vIEEgZ2VuZXJhbCBmYXN0IGdsb2JhbCBtZW1vcnkgbmVlZHMgdG8gYmUgYXMgZm9sbG93czoKICAgIC8vIC0gR3JvdXAgb2YgMTYgYnl0ZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGEgMTI4LWJpdCBsb2FkCiAgICAvLyAtIFRoZSBmYXN0IHBhdGggcmVxdWlyZXMgZW50aXJlIGNhY2hlIGxpbmVzIHRvIGJlIGxvYWRlZCBhdCBvbmNlLiBDRE5BMwogICAgLy8gICBjYWNoZSBsaW5lIHNpemUgaXMgMTI4IGJ5dGVzLCBzbyB0aGUgaWRlYWwgbWF0cml4IHNpemUgaGFzIGFuIGlubmVyCiAgICAvLyAgIGRpbWVuc2lvbiAoYmxvY2tfdGlsZV9tOyBzb3VyY2UgaXMgY29sdW1uIG1ham9yKSBvZiBhdCBsZWFzdCAxMjguCiAgICAvLyAtIFdlIHdhbnQgZXZlcnkgdGhyZWFkIHRvIHBhcnRpY2lwYXRlLCBzbyB3ZSBuZWVkIGF0IGxlYXN0CiAgICAvLyAgIGJsb2NrX3NpemUgLyAoMTI4IC8gMTYpIGVsZW1lbnRzIGluIHRoZSBOIGRpcmVjdGlvbi4KICAgIC8vICAgYmxvY2tfc2l6ZSA9PSA2NCA9PiA4CiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMjU2ID0+IDMyCiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMTAyNCA9PiAxMjgKICAgIC8vIC0gV2UgYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIGFscmVhZHkgYWxpZ25lZCB0byAxMjggYml0cywgYW5kIHRoYXQgdGhlIG0gc3RyaWRlCiAgICAvLyAgIGlzIGFsc28gYWxpZ25lZCBzdWNoLiBtLCBuLCBrIGFyZSBhbGwgZGl2aXNpYmxlIGJ5IDY0LCBzbyB0aGlzIHNob3VsZCBiZSBmaW5lLgogICAgLy8KICAgIC8vICAg4pSM4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSQIOKUjOKUgOKUgOKUgOKUkAogICAgLy8gICDilIIwICDilII0ICDilII4ICDilIIxMiDilIIg4pSCICAg4pSCID0gMTYgYnl0ZXMKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkIOKUlOKUgOKUgOKUgOKUmAogICAgLy8gICDilIIxICDilII1ICDilII5ICDilIIxMyDilIIKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkCiAgICAvLyAgIOKUgjIgIOKUgjYgIOKUgjEwIOKUgjE0IOKUggogICAgLy8gICDilJzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilKQKICAgIC8vICAg4pSCMyAg4pSCNyAg4pSCMTEg4pSCMTUg4pSCCiAgICAvLyAgIOKUlOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUmAoKICAgIC8vIHVzaW5nIGxvYWRfdHlwZSA9IHVpbnQzMl90OwoKICAgIC8vIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgY2FjaGVfbGluZV9zaXplID09IDAsICJ0aWxlIGlubmVyIGRpbWVuc2lvbiBzaG91bGQgYmUgZGl2aXNpYmxlIGJ5IGNhY2hlIGxpbmUgc2l6ZSIpOwoKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgc2l6ZW9mKGxvYWRfdHlwZSkgPT0gMCwgInRpbGUgaW5uZXIgZGltZW5zaW9uIGhhcyB0byBiZSBkaXZpc2libGUgYnkgbG9hZCB0eXBlIHNpemUiKTsKICAgIGNvbnN0ZXhwciBpbnQgdG90YWxfbG9hZHMgPSBibG9ja190aWxlX20gKiBibG9ja190aWxlX24gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIHN0YXRpY19hc3NlcnQodG90YWxfbG9hZHMgJSBibG9ja19zaXplID09IDAsICJ0b3RhbCBhbW91bnQgb2YgbG9hZHMgbmVlZHMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBjb25zdGV4cHIgaW50IGxvYWRzX3Blcl9ibG9ja190aWxlX20gPSBibG9ja190aWxlX20gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIGNvbnN0ZXhwciBpbnQgbG9hZHNfcGVyX3RocmVhZCA9IHRvdGFsX2xvYWRzIC8gYmxvY2tfc2l6ZTsKCiAgICBjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgogICAgc2VsZWN0KGNvbXBsZXRlbHlfaW5fYm91bmRzLCBbJl08Ym9vbCBpbl9ib3VuZHM+IHsKICAgICAgICB1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7CiAgICAgICAgICAgIGNvbnN0IGludCByb3cgPSBpICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgY29uc3QgaW50IGNvbCA9IGkgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgZHN0X29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKCiAgICAgICAgICAgIGNvbnN0IGludCBzcmNfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBibG9ja19vZmZfbTsKICAgICAgICAgICAgY29uc3QgaW50IHNyY19jb2wgPSBjb2wgKyBibG9ja19vZmZfbjsKCiAgICAgICAgICAgIC8vIE5vdGU6IE0sIE4sIEsgaXMgZ3VhcmFudGVlZCB0byBiZSBkaXZpc2libGUgYnkgdGhlIGxvYWQKICAgICAgICAgICAgLy8gc2l6ZSwgc28gd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBvdXRlciBib3VuZHMuCiAgICAgICAgICAgIGlmIChpbl9ib3VuZHMgfHwgKG1fYWxpZ25lZCB8fCBzcmNfcm93IDwgbSkgJiYgKG5fYWxpZ25lZCB8fCBzcmNfY29sIDwgbikpIHsKICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGxvYWRfdHlwZSo+KGJsb2NrX3RpbGVfZHN0ICsgZHN0X29mZikgPQogICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGxvYWRfdHlwZSo+KGJsb2NrX3RpbGVfc3JjICsgc3JjX29mZik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxsb2FkX3R5cGUqPihibG9ja190aWxlX2RzdCArIGRzdF9vZmYpID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7Cn0KCnRlbXBsYXRlIDxpbnQgbSwgaW50IG4sIGludCBrPgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmbG9hdCAoJmMpWzRdLAogICAgICAgIGZsb2F0IGEsCiAgICAgICAgZmxvYXQgYgogICAgKSB7CiAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCiAgICAgICAgICAgIGEsCiAgICAgICAgICAgIGIsCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMAogICAgICAgICk7CiAgICAgICAgdW5yb2xsPDAsIDQ+KFsmXTxpbnQgaT4gewogICAgICAgICAgICBjW2ldID0gcmVzdWx0W2ldOwogICAgICAgIH0pOwogICAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPiB7CiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZsb2F0ICgmYylbMTZdLAogICAgICAgIGZsb2F0IGEsCiAgICAgICAgZmxvYXQgYgogICAgKSB7CiAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCiAgICAgICAgICAgIGEsCiAgICAgICAgICAgIGIsCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMngxNj4oYyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAKICAgICAgICApOwogICAgICAgIHVucm9sbDwwLCAxNj4oWyZdPGludCBpPiB7CiAgICAgICAgICAgIGNbaV0gPSByZXN1bHRbaV07CiAgICAgICAgfSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8aW50IG0sIGludCBuLCBpbnQgaz4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGUoCiAgICAgICAgZmxvYXQgKCZjKVs0XSwKICAgICAgICBjb25zdCBmcDggKCZhKVs4XSwKICAgICAgICBjb25zdCBmcDggKCZiKVs4XQogICAgKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCiAgICBjb25zdCBhdXRvIHJlc3VsdCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCgKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PGZwMzJ4ND4oYyksCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAKICAgICk7CiAgICB1bnJvbGw8MCwgND4oWyZdPGludCBpPiB7CiAgICAgICAgY1tpXSA9IHJlc3VsdFtpXTsKICAgIH0pOwojZWxzZQogICAgLy8gRmFsbGJhY2sgc28gd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICAvLyBBcHBhcmVudGx5IHRoZSBsYXlvdXRzIGFyZSBzdWNoIHRoYXQgd2UgY2FuIGp1c3QgZG8gdGhpcy4KICAgIHVucm9sbDwwLCA4PihbJl08aW50IGs+IHsKICAgICAgICBjb25zdCBhdXRvIGFfZjMyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFba10pOwogICAgICAgIGNvbnN0IGF1dG8gYl9mMzIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYltrXSk7CiAgICAgICAgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+OjpleGVjdXRlKGMsIGFfZjMyLCBiX2YzMik7CiAgICB9KTsKI2VuZGlmCiNlbmRpZgogICAgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmbG9hdCAoJmMpWzE2XSwKICAgICAgICBjb25zdCBmcDggKCZhKVs4XSwKICAgICAgICBjb25zdCBmcDggKCZiKVs4XQogICAgKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCiAgICBjb25zdCBhdXRvIHJlc3VsdCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PGZwMzJ4MTY+KGMpLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwCiAgICApOwogICAgdW5yb2xsPDAsIDE2PihbJl08aW50IGk+IHsKICAgICAgICBjW2ldID0gcmVzdWx0W2ldOwogICAgfSk7CiNlbHNlCiAgICAvLyBGYWxsYmFjayBjb3BpZWQgZnJvbSBDSywgdGhpcyB3YXkgd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICB1bnJvbGw8MCwgOD4oWyZdPGludCBrPiB7CiAgICAgICAgY29uc3QgYXV0byBhX2YzMiA9IHN0YXRpY19jYXN0PGZsb2F0PihhW2tdKTsKICAgICAgICBjb25zdCBhdXRvIGJfZjMyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJba10pOwogICAgICAgIG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPjo6ZXhlY3V0ZShjLCBhX2YzMiwgYl9mMzIpOwogICAgfSk7CiNlbmRpZgojZW5kaWYKICAgIH0KfTsKCi8vIFNlZSBDRE5BMyBtYW51YWwsIDcuMS40LjEuIElucHV0IGxheW91dAovLyBUaGUgY2FsY3VsYXRpb25zIGhlcmUgYXJlIG9idGFpbmVkIHZpYSB0aGUKLy8gQU1EIG1hdHJpeCBpbnN0cnVjdGlvbiBjYWxjdWxhdG9yCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ST0NtL2FtZF9tYXRyaXhfaW5zdHJ1Y3Rpb25fY2FsY3VsYXRvcgovLyBUaGVyZSBpcyBhIGNsZWFuZXIgd2F5IHRvIGNvbXB1dGUgdGhlIG1hcHBpbmcsIGJ1dAovLyB0aGlzIGlzIHdoYXQgdGhlIHRvb2wgcmV0dXJucyBhbmQgSSdtIGxhenkuIFdlIG9ubHkKLy8gcmVhbGx5IG5lZWQgdGhlc2UgdHdvIGFueXdheSBmb3Igbm93Lgp0ZW1wbGF0ZSA8dHlwZW5hbWUgbWZtYT4Kc3RydWN0IG1mbWFfaW5kZXhlcjsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MTYsIDE2LCAzMj4+IHsKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICAvLyBOb3RlOiByZWcgaXMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGluCiAgICAgICAgLy8gdGhlIHRocmVhZCdzIHJlZ2lzdGVycy4gVGhlIG1hdHJpeCBpbnN0cnVjdGlvbgogICAgICAgIC8vIGNhbGN1bGF0b3IgY29uc2lkZXJzIHRoZSByZWdpc3RlciB0aGUgVkdSUCwgc28KICAgICAgICAvLyA0IGVsZW1lbnRzLiBBbGwgb2YgdGhlIGVsZW1lbnRzIHNob3VsZCBiZSBwYWNrZWQKICAgICAgICBjb25zdCBpbnQgbSA9IGxhbmUgJSAxNjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICByZXR1cm4ge20sIGt9OwogICAgfQoKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICBjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICByZXR1cm4ge24sIGt9OwogICAgfQoKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICBjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICBjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKICAgICAgICByZXR1cm4ge20sIG59OwogICAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfaW5kZXhlcjxtZm1hX2YzMl9mOF9mODwzMiwgMzIsIDE2Pj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIC8vIE5vdGU6IHJlZyBpcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4KICAgICAgICAvLyB0aGUgdGhyZWFkJ3MgcmVnaXN0ZXJzLiBUaGUgbWF0cml4IGluc3RydWN0aW9uCiAgICAgICAgLy8gY2FsY3VsYXRvciBjb25zaWRlcnMgdGhlIHJlZ2lzdGVyIHRoZSBWR1JQLCBzbwogICAgICAgIC8vIDQgZWxlbWVudHMuIEFsbCBvZiB0aGUgZWxlbWVudHMgc2hvdWxkIGJlIHBhY2tlZAogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDMyOwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgcmVnOwogICAgICAgIHJldHVybiB7bSwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIGNvbnN0IGludCBuID0gbGFuZSAlIDMyOwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgcmVnOwogICAgICAgIHJldHVybiB7biwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYyhpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIGNvbnN0IGludCBuID0gOCAqIChyZWcgLyA0KSAlIDMyICsgNCAqIChsYW5lIC8gMzIpICsgKHJlZyAlIDQpOwogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDMyOwogICAgICAgIHJldHVybiB7biwgbX07CiAgICB9Cn07Cgp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KY29uc3RleHByIGF1dG8gZGl2aWRlX2V4YWN0KCkgewogICAgc3RhdGljX2Fzc2VydChhICUgYiA9PSAwLCAiZG9lcyBub3QgZGl2aWRlIGV4YWN0ISIpOwogICAgcmV0dXJuIGEgLyBiOwp9Cgp0ZW1wbGF0ZSA8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGN1YmUgYmxvY2tfdGlsZSwKICAgIGN1YmUgd2FycF90aWxlLAogICAgdHlwZW5hbWUgbG9hZF90eXBlLAogICAgYm9vbCBtX2FsaWduZWQgPSBmYWxzZSwKICAgIGJvb2wgbl9hbGlnbmVkID0gZmFsc2UsCiAgICBib29sIGtfYWxpZ25lZCA9IGZhbHNlCj4KX19nbG9iYWxfXyBfX2xhdW5jaF9ib3VuZHNfXyhibG9ja19zaXplKQp2b2lkIGtlcm5lbCgKICAgIGNvbnN0IGZwOCogYSwKICAgIGNvbnN0IGZwOCogYiwKICAgIGNvbnN0IGZwMzIqIGFzLAogICAgY29uc3QgZnAzMiogYnMsCiAgICBiZjE2KiBjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBrCikgewogICAgY29uc3RleHByIGludCB3YXJwcyA9IGJsb2NrX3NpemUgLyB3YXJwX3NpemU7CgogICAgY29uc3RleHByIGludCBibG9ja190aWxlX20gPSBibG9ja190aWxlLm07CiAgICBjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbiA9IGJsb2NrX3RpbGUubjsKICAgIGNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX20gPSB3YXJwX3RpbGUubTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGUubjsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX2sgPSB3YXJwX3RpbGUuazsKCiAgICB1c2luZyBtZm1hID0gbWZtYV9mMzJfZjhfZjg8d2FycF90aWxlX20sIHdhcnBfdGlsZV9uLCB3YXJwX3RpbGVfaz47CiAgICB1c2luZyBpbmRleGVyID0gbWZtYV9pbmRleGVyPG1mbWE+OwoKICAgIGNvbnN0ZXhwciBpbnQgY190b3RhbCA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbjsKCiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9iKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSB3YXJwX3RpbGVfbSA9PSAwLCAid2FycCB0aWxlIE0gaGFzIHRvIGRpdmlkZSBibG9jayB0aWxlIE0iKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbiA9IGJsb2NrX3RpbGVfbiAvIHdhcnBfdGlsZV9uOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVzX2sgPSBibG9ja190aWxlX2sgLyB3YXJwX3RpbGVfazsKCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW4gPSB3YXJwX3RpbGVzX20gKiB3YXJwX3RpbGVzX247CgogICAgLy8gbnVtYmVyIG9mIHdhcnAgdGlsZXMgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHdhcnBzCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tbiwgd2FycHM+KCk7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIC8vIHNpemUod2FycF90aWxlX21uKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSB3YXJwIHNpemUKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX21uX2lwdCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVfbW5faXRlbXMsIHdhcnBfc2l6ZT4oKTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX21rX2lwdCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9rLCB3YXJwX3NpemU+KCk7CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZV9ua19pcHQgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlX24gKiB3YXJwX3RpbGVfaywgd2FycF9zaXplPigpOwoKICAgIGNvbnN0ZXhwciBpbnQgY19wZXJfdGhyZWFkID0gY190b3RhbCAvIGJsb2NrX3NpemU7CiAgICBzdGF0aWNfYXNzZXJ0KGNfcGVyX3RocmVhZCA9PSB3YXJwX3RpbGVzX21uX3Blcl93YXJwICogd2FycF90aWxlX21uX2lwdCwgInNhbml0eSBjaGVjayIpOwoKICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICBjb25zdCBpbnQgd2FycCA9IHRpZCAvIHdhcnBfc2l6ZTsKICAgIGNvbnN0IGludCBsYW5lID0gX19sYW5lX2lkKCk7CgogICAgLy8gU3dhcCBkaXJlY3Rpb24gdG8gbWFrZSBib3VuZHMgY2hlY2tpbmcgYmUgZmlyc3QKICAgIGNvbnN0IGludCB0aV9tID0gZ3JpZERpbS54IC0gYmxvY2tJZHgueCAtIDE7CiAgICBjb25zdCBpbnQgdGlfbiA9IGdyaWREaW0ueSAtIGJsb2NrSWR4LnkgLSAxOwoKICAgIGludCBzbiA9IGNlaWxfZGl2KG4sIDEyOCk7CgogICAgZmxvYXQgY19yZWdzW3dhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiB3YXJwX3RpbGVfbW5faXB0XTsKICAgIGNsZWFyKGNfcmVncyk7CgogICAgX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfa107CiAgICBfX3NoYXJlZF9fIGZwOCBibG9ja190aWxlX2JbYmxvY2tfdGlsZV9uICogYmxvY2tfdGlsZV9rXTsKCiAgICBjb25zdCBhdXRvIGxvYWRfaW5wdXQgPSBbJl08Ym9vbCBjaGVja19ib3VuZHNfaz4oaW50IGkpIHsKICAgICAgICBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXI8CiAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgIGJsb2NrX3RpbGVfbSwKICAgICAgICAgICAgYmxvY2tfdGlsZV9rLAogICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgIG1fYWxpZ25lZCwKICAgICAgICAgICAga19hbGlnbmVkICYmICFjaGVja19ib3VuZHNfawogICAgICAgID4oCiAgICAgICAgICAgIGJsb2NrX3RpbGVfYSwgYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaQogICAgICAgICk7CiAgICAgICAgYmxvY2tfdGlsZV9sb2FkX2Zhc3RfbGluZWFyPAogICAgICAgICAgICBibG9ja19zaXplLAogICAgICAgICAgICBibG9ja190aWxlX24sCiAgICAgICAgICAgIGJsb2NrX3RpbGVfaywKICAgICAgICAgICAgbG9hZF90eXBlLAogICAgICAgICAgICBuX2FsaWduZWQsCiAgICAgICAgICAgIGtfYWxpZ25lZCAmJiAhY2hlY2tfYm91bmRzX2sKICAgICAgICA+KAogICAgICAgICAgICBibG9ja190aWxlX2IsIGIsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkKICAgICAgICApOwogICAgfTsKCiAgICBjb25zdCBhdXRvIG1tYSA9IFsmXShpbnQgaSkgewogICAgICAgIHVucm9sbDFkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnA+KFsmXTxpbnQgaXd0aT4gewogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgd3RuID0gd3RpIC8gd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgZmxhdF93dF9iYXNlID0gaXd0aSAqIHdhcnBfdGlsZV9tbl9pcHQ7CgogICAgICAgICAgICBmbG9hdCB3YXJwX2ZyZ19jW3dhcnBfdGlsZV9tbl9pcHRdOwogICAgICAgICAgICBjbGVhcih3YXJwX2ZyZ19jKTsKCiAgICAgICAgICAgIHVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CiAgICAgICAgICAgICAgICAvLyBMb2FkIGZyYWdtZW50IEEKICAgICAgICAgICAgICAgIGZwOCBmcmdfYVt3YXJwX3RpbGVfbWtfaXB0XTsKICAgICAgICAgICAgICAgIHVucm9sbDwwLCB3YXJwX3RpbGVfbWtfaXB0PihbJl08aW50IG1rX3JlZz4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaWtdID0gaW5kZXhlcjo6cmVnX3RvX21hdHJpeF9hKGxhbmUsIG1rX3JlZyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpbSA9IHd0bSAqIHdhcnBfdGlsZV9tICsgbWZtYV9pbTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmlrID0gd3RrX2Jhc2UgKyBtZm1hX2lrOwogICAgICAgICAgICAgICAgICAgIGZyZ19hW21rX3JlZ10gPSBibG9ja190aWxlX2FbYmlrICogYmxvY2tfdGlsZV9tICsgYmltXTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIExvYWQgZnJhZ21lbnQgQgogICAgICAgICAgICAgICAgZnA4IGZyZ19iW3dhcnBfdGlsZV9ua19pcHRdOwogICAgICAgICAgICAgICAgdW5yb2xsPDAsIHdhcnBfdGlsZV9ua19pcHQ+KFsmXTxpbnQgbmtfcmVnPiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbiwgbWZtYV9pa10gPSBpbmRleGVyOjpyZWdfdG9fbWF0cml4X2IobGFuZSwgbmtfcmVnKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CiAgICAgICAgICAgICAgICAgICAgZnJnX2JbbmtfcmVnXSA9IGJsb2NrX3RpbGVfYltiaWsgKiBibG9ja190aWxlX24gKyBiaW5dOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gTm93IHBlcmZvcm0gdGhlIE1GTUEgYmFzZWQgb24gdGhlIHdhcnAgdGlsZSBzaXplLgogICAgICAgICAgICAgICAgbWZtYTo6ZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICB3YXJwX2ZyZ19jLAogICAgICAgICAgICAgICAgICAgIGZyZ19hLAogICAgICAgICAgICAgICAgICAgIGZyZ19iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHVucm9sbDwwLCB3YXJwX3RpbGVfbW5faXB0PihbJl08aW50IG1uX3JlZz4gewogICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjpyZWdfdG9fbWF0cml4X2MobGFuZSwgbW5fcmVnKTsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CiAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwogICAgICAgICAgICAgICAgY29uc3QgaW50IGltID0gdGlfbSAqIGJsb2NrX3RpbGVfbSArIGJpbTsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbiA9IHRpX24gKiBibG9ja190aWxlX24gKyBiaW47CgogICAgICAgICAgICAgICAgY19yZWdzW2ZsYXRfd3RfYmFzZSArIG1uX3JlZ10gKz0gd2FycF9mcmdfY1ttbl9yZWddICogYXNbaSAvIDEyOCAqIG0gKyBpbV0gKiBic1tpIC8gMTI4ICogc24gKyBpbiAvIDEyOF07CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7IGkgKz0gYmxvY2tfdGlsZV9rKSB7CiAgICAgICAgbG9hZF9pbnB1dC50ZW1wbGF0ZSBvcGVyYXRvcigpPHRydWU+KGkpOwogICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICBtbWEoaSk7CiAgICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgfQoKICAgIC8vIFdyaXRlIG91dCBDCiAgICAvLyBUaGlzIHNob3VsZCBhY2Nlc3MgdGlsZSBDIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSBtYXRtdWwgbG9vcCEKCiAgICBjb25zdCBpbnQgaW1fYmFzZSA9IHRpX20gKiBibG9ja190aWxlX207CiAgICBjb25zdCBpbnQgaW5fYmFzZSA9IHRpX24gKiBibG9ja190aWxlX247CgogICAgY29uc3QgYm9vbCBjX2luX2JvdW5kcyA9CiAgICAgICAgKG1fYWxpZ25lZCB8fCBtICUgYmxvY2tfdGlsZV9tID09IDAgfHwgaW1fYmFzZSArIGJsb2NrX3RpbGVfbSA8PSBtKSAmJgogICAgICAgIChuX2FsaWduZWQgfHwgbiAlIGJsb2NrX3RpbGVfbiA9PSAwIHx8IGluX2Jhc2UgKyBibG9ja190aWxlX24gPD0gbik7CgogICAgc2VsZWN0KGNfaW5fYm91bmRzLCBbJl08Ym9vbCBjX2luX2JvdW5kcz4gewogICAgICAgIHVucm9sbDJkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsIHdhcnBfdGlsZV9tbl9pcHQ+KFsmXTxpbnQgaXd0aSwgaW50IG1uX3JlZz4gewogICAgICAgICAgICBjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2luXSA9IGluZGV4ZXI6OnJlZ190b19tYXRyaXhfYyhsYW5lLCBtbl9yZWcpOwoKICAgICAgICAgICAgY29uc3QgaW50IHd0aSA9IHdhcnAgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aTsKICAgICAgICAgICAgY29uc3QgaW50IHd0bSA9IHd0aSAlIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IHd0biA9IHd0aSAvIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IGZsYXRfd3RfYmFzZSA9IGl3dGkgKiB3YXJwX3RpbGVfbW5faXB0OwoKICAgICAgICAgICAgY29uc3QgaW50IGJpbSA9IHd0bSAqIHdhcnBfdGlsZV9tICsgbWZtYV9pbTsKICAgICAgICAgICAgY29uc3QgaW50IGJpbiA9IHd0biAqIHdhcnBfdGlsZV9uICsgbWZtYV9pbjsKCiAgICAgICAgICAgIGNvbnN0IGludCBpbSA9IGltX2Jhc2UgKyBiaW07CiAgICAgICAgICAgIGNvbnN0IGludCBpbiA9IGluX2Jhc2UgKyBiaW47CgogICAgICAgICAgICBjb25zdCBhdXRvIHZhbCA9IGJmMTZfZnJvbV9mcDMyKGNfcmVnc1tmbGF0X3d0X2Jhc2UgKyBtbl9yZWddKTsKCiAgICAgICAgICAgIGlmIChjX2luX2JvdW5kcyB8fCBpbSA8IG0gJiYgaW4gPCBuKSB7CiAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbm9udGVtcG9yYWxfc3RvcmUoc3RkOjpiaXRfY2FzdDx1aW50MTZfdD4odmFsKSwgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KCZjW2ltICogbiArIGluXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGU8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGN1YmUgYmxvY2tfdGlsZSwKICAgIGN1YmUgd2FycF90aWxlLAogICAgdHlwZW5hbWUgbG9hZF90eXBlID0gdWludDMyX3QKPgp2b2lkIHJ1bl9rZXJuZWwoCiAgICBjb25zdCBmcDgqIGEsCiAgICBjb25zdCBmcDgqIGIsCiAgICBjb25zdCBmcDMyKiBhcywKICAgIGNvbnN0IGZwMzIqIGJzLAogICAgYmYxNiogYywKICAgIGludCBtLAogICAgaW50IG4sCiAgICBpbnQgaywKICAgIGJvb2wgbWVhc3VyZQopIHsKICAgIGNvbnN0IGludCBncmlkX20gPSBjZWlsX2RpdihtLCBibG9ja190aWxlLm0pOwogICAgY29uc3QgaW50IGdyaWRfbiA9IGNlaWxfZGl2KG4sIGJsb2NrX3RpbGUubik7CgogICAgaGlwRXZlbnRfdCBzdGFydCwgc3RvcDsKICAgIGlmIChtZWFzdXJlKSB7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50Q3JlYXRlKCZzdGFydCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudENyZWF0ZSgmc3RvcCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudFJlY29yZChzdGFydCwgMCkpOwogICAgfQoKICAgIC8vIHNlbGVjdChtICUgYmxvY2tfdGlsZS5tID09IDAsIFsmXTxib29sIG1fYWxpZ25lZD4gewogICAgLy8gICAgIHNlbGVjdChuICUgYmxvY2tfdGlsZS5uID09IDAsIFsmXTxib29sIG5fYWxpZ25lZD4gewogICAgLy8gICAgICAgICBzZWxlY3QoayAlIGJsb2NrX3RpbGUuayA9PSAwLCBbJl08Ym9vbCBrX2FsaWduZWQ+IHsKICAgICAgICAgICAgICAgIGtlcm5lbDwKICAgICAgICAgICAgICAgICAgICBibG9ja19zaXplLAogICAgICAgICAgICAgICAgICAgIGJsb2NrX3RpbGUsCiAgICAgICAgICAgICAgICAgICAgd2FycF90aWxlLAogICAgICAgICAgICAgICAgICAgIGxvYWRfdHlwZSwKICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gbV9hbGlnbmVkLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBuX2FsaWduZWQsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UgIC8vIGtfYWxpZ25lZAogICAgICAgICAgICAgICAgPjw8PAogICAgICAgICAgICAgICAgICAgIGRpbTMoZ3JpZF9tLCBncmlkX24pLAogICAgICAgICAgICAgICAgICAgIGRpbTMoYmxvY2tfc2l6ZSksCiAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgPj4+KAogICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgICAgICBhcywKICAgICAgICAgICAgICAgICAgICBicywKICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgIG0sCiAgICAgICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgICAgICBrCiAgICAgICAgICAgICAgICApOwogICAgLy8gICAgICAgICB9KTsKICAgIC8vICAgICB9KTsKICAgIC8vIH0pOwoKICAgIEhJUF9DSEVDSyhoaXBHZXRMYXN0RXJyb3IoKSk7CgogICAgaWYgKG1lYXN1cmUpIHsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRSZWNvcmQoc3RvcCwgMCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBEZXZpY2VTeW5jaHJvbml6ZSgpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRTeW5jaHJvbml6ZShzdG9wKSk7CgogICAgICAgIGZsb2F0IG1zID0gMDsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRFbGFwc2VkVGltZSgmbXMsIHN0YXJ0LCBzdG9wKSk7CiAgICAgICAgY29uc3QgZG91YmxlIHRpbWUgPSBtcyAvIDEnMDAwLjA7CgogICAgICAgIGNvbnN0IGRvdWJsZSBtZW1vcnkgPSBtICogayAqIHNpemVvZihmcDgpICsgbiAqIGsgKiBzaXplb2YoZnA4KSArIG0gKiBuICogc2l6ZW9mKGJmMTYpOwogICAgICAgIGNvbnN0IGRvdWJsZSBvcHMgPQogICAgICAgICAgICBkb3VibGUobSkgKiBuICogayAqIDIgLy8gTXVsdGlwbHkgKyBhZGQgZm9yIGVhY2ggcGFpcgogICAgICAgICAgICArIChkb3VibGUobSkgKiBuICogMikgKiBjZWlsX2RpdihrLCB3YXJwX3RpbGUuayk7IC8vIHNjYWxpbmcKCiAgICAgICAgY29uc3QgZG91YmxlIG1lbW9yeV90cHV0ID0gbWVtb3J5IC8gdGltZSAvICgxMDAwLjAgKiAxMDAwICogMTAwMCk7CiAgICAgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfdHB1dCA9IG9wcyAvIHRpbWUgLyAoMTAwMC4wICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKCiAgICAgICAgc3RkOjpjZXJyCiAgICAgICAgICAgIDw8IHN0ZDo6Zml4ZWQKICAgICAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikKICAgICAgICAgICAgPDwgIigiIDw8IG0gPDwgIiAiIDw8IG4gPDwgIiAiIDw8IGsgPDwgIikgIgogICAgICAgICAgICA8PCAiKCIgPDwgYmxvY2tfdGlsZS5tIDw8ICIgIiA8PCBibG9ja190aWxlLm4gPDwgIiAiIDw8IGJsb2NrX3RpbGUuayA8PCAiKSAiCiAgICAgICAgICAgIDw8ICIoIiA8PCB3YXJwX3RpbGUubSA8PCAiICIgPDwgd2FycF90aWxlLm4gPDwgIiAiIDw8IHdhcnBfdGlsZS5rIDw8ICIpICIKICAgICAgICAgICAgPDwgYmxvY2tfc2l6ZSA8PCAiOiAiCiAgICAgICAgICAgIDw8IG1zIDw8ICIgbXMgIgogICAgICAgICAgICA8PCAodGltZSAqIDEnMDAwJzAwMCkgPDwgIiB1cyAiCiAgICAgICAgICAgIDw8IG1lbW9yeV90cHV0IDw8ICIgR0IvcyAiCiAgICAgICAgICAgIDw8IGNvbXB1dGVfdHB1dCA8PCAiIFRGTE9QUyIKICAgICAgICAgICAgPDwgc3RkOjplbmRsOwoKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnREZXN0cm95KHN0YXJ0KSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50RGVzdHJveShzdG9wKSk7CiAgICB9Cgp9Cgp2b2lkIHJ1bigKICAgIHVpbnRwdHJfdCBhX3B0ciwKICAgIHVpbnRwdHJfdCBiX3B0ciwKICAgIHVpbnRwdHJfdCBhc19wdHIsCiAgICB1aW50cHRyX3QgYnNfcHRyLAogICAgdWludHB0cl90IGNfcHRyLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBrLAogICAgYm9vbCBtZWFzdXJlCikgewogICAgLy8gSW4gdGhlIGtlcm5lbHMgd2UgYXNzdW1lIDEyOC1iaXQgYWxpZ25tZW50LgogICAgYXNzZXJ0KGFfcHRyICUgMTYgPT0gMCk7CiAgICBhc3NlcnQoYl9wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChhc19wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChic19wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChjX3B0ciAlIDE2ID09IDApOwoKICAgIGNvbnN0IGF1dG8qIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGFfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGJfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGFzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDMyKj4oYXNfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGJzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDMyKj4oYnNfcHRyKTsKICAgIGF1dG8qIGMgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihjX3B0cik7CgogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDh9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDR9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDJ9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCA2NH0sIGN1YmV7MiwgMiwgNH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDY0fSwgY3ViZXsyLCAyLCAyfT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezMyLCAzMiwgMzJ9LCBjdWJlezIsIDIsIDJ9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwoKICAgIC8vIHJ1bl9rZXJuZWw8MTI4LCBjdWJlezMyLCAzMiwgMTI4fSwgY3ViZXsyLCAyLCA4fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MTI4LCBjdWJlezMyLCAzMiwgMTI4fSwgY3ViZXs0LCAyLCA4fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MTI4LCBjdWJlezMyLCAzMiwgMTI4fSwgY3ViZXsyLCA0LCA4fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MTI4LCBjdWJlezMyLCAzMiwgMTI4fSwgY3ViZXsyLCAyLCAxNn0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCA2NH0sIGN1YmV7NCwgNCwgNH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXs0LCA0LCA0fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezQsIDQsIDR9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7OCwgOCwgOH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCA2NH0sIGN1YmV7MTYsIDE2LCAzMn0sIF9fdWludDEyOF90PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIF9fdWludDEyOF90PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIF9fdWludDEyOF90PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIF9fdWludDEyOF90PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CgpQWUJJTkQxMV9NT0RVTEUoZnA4LCBtKSB7CiAgbS5kZWYoImZwOCIsICZydW4sICJISVAga2VybmVsIik7Cn0KIiIiCgpoaXBfbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDgiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz0oWyItc2F2ZS10ZW1wcyJdIGlmIFRFU1RJTkcgZWxzZSBbXSkgKyBbIi1zdGQ9YysrMjAiXSwKICAgIGJ1aWxkX2RpcmVjdG9yeT0iL2dwdW1vZGUvYW1kL2ZwOC9idWlsZC8iIGlmIFRFU1RJTkcgZWxzZSBOb25lLAogICAgbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgpmaXJzdCA9IFRydWUKCmNhY2hlX20gPSAwCmNhY2hlX24gPSAwCmNhY2hlX2sgPSAwCmNhY2hlX2kgPSAwCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgZ2xvYmFsIGNhY2hlX20KICAgIGdsb2JhbCBjYWNoZV9uCiAgICBnbG9iYWwgY2FjaGVfawogICAgZ2xvYmFsIGNhY2hlX2kKCiAgICBpZiBjYWNoZV9tICE9IG0gb3IgY2FjaGVfbiAhPSBuIG9yIGNhY2hlX2sgIT0gazoKICAgICAgICBjYWNoZV9tID0gbQogICAgICAgIGNhY2hlX24gPSBuCiAgICAgICAgY2FjaGVfayA9IGsKICAgICAgICBjYWNoZV9pID0gMAogICAgZWxzZToKICAgICAgICBjYWNoZV9pICs9IDEKCiAgICAjIERvbid0IGNoZWNrIHRoZSBwZXJmb3JtYW5jZSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHRvIGFsbG93IGZvciBzb21lIHdhcm11cAogICAgbWVhc3VyZSA9IEZhbHNlCiAgICBpZiBjYWNoZV9pID09IDE6CiAgICAgICAgbWVhc3VyZSA9IEZhbHNlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMK

Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0

Changes from previous submission

Against this author's previous submission submission 5798.

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9ICJHUFVNT0RFX1RFU1RJTkciIGluIG9zLmVudmlyb24KCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9iZjE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGJpdD4KCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnVzaW5nIGZwOCA9IF9faGlwX2ZwOF9lNG0zX2ZudXo7CnVzaW5nIGJmMTYgPSBfX2hpcF9iZmxvYXQxNjsKdXNpbmcgZnAzMiA9IGZsb2F0Owp1c2luZyBmcDMyeDQgPSBmcDMyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CgpzdHJ1Y3QgY3ViZSB7CiAgICBpbnQgbSwgbiwgazsKfTsKCmNvbnN0ZXhwciBpbnQgd2FycF9zaXplID0gNjQ7CmNvbnN0ZXhwciBpbnQgY2FjaGVfbGluZV9zaXplID0gMTI4OwoKY29uc3RleHByIGludCBtX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKY29uc3RleHByIGludCBuX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKY29uc3RleHByIGludCBrX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAxMjg7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KX19ob3N0X18gX19kZXZpY2VfXwpjb25zdGV4cHIgYXV0byBjZWlsX2RpdihUIGEsIFUgYikgewogICAgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQoKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jID0gMSwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwoRiBmKSB7CiAgICBpZiBjb25zdGV4cHIoSSA8IE4pIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8ST4oKTsKICAgICAgICB1bnJvbGw8SSArIGluYywgTiwgaW5jPihmKTsKICAgIH0KfQoKdGVtcGxhdGU8aW50IEksIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsMWQoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oZik7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwyZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihbJl08aW50IGk+IHsKICAgICAgICB1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqPigpOwogICAgICAgIH0pOwogICAgfSk7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgaW50IEssIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsM2QoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CiAgICAgICAgdW5yb2xsPDAsIEo+KFsmXTxpbnQgaj4gewogICAgICAgICAgICB1bnJvbGw8MCwgSz4oWyZdPGludCBrPiB7CiAgICAgICAgICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8aSwgaiwgaz4oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpfX2RldmljZV9fCnZvaWQgY2xlYXIoVCAoJmFycmF5KVtOXSkgewogICAgdW5yb2xsPDAsIE4+KFsmXTxpbnQgaT4gewogICAgICAgIGFycmF5W2ldID0gVHswfTsKICAgIH0pOwp9CgpfX2RldmljZV9fCmJmMTYgYmYxNl9mcm9tX2ZwMzIoZmxvYXQgeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmdW5jdGlvbiBkb2VzIGFsbCBraW5kcyBvZiBjaGVja3MKICAgIC8vIGZvciBvZGQgY2FzZXMgKE5hTiwgc3Vibm9ybWFscykgdGhhdCB3ZSBkb24ndCBjYXJlIGFib3V0LgogICAgLy8gVGhpcyBnZW5lcmF0ZXMgYWJzb2x1dGVseSBhYnlzbWFsIGNvZGUsIHNvIGp1c3QgdHJ1bmNhdGUKICAgIC8vIHRoZSB1cHBlciBiaXRzIHRvIGdldCB0aGUgcmlnaHQgdmFsdWUgbGlrZSB0aGUKICAgIC8vIE9wcGVycHl0aG9uIGludGVuZGVkLgoKICAgIHJldHVybiBzdGQ6OmJpdF9jYXN0PGJmMTY+KAogICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PigKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oeCkgPj4gMTYKICAgICAgICApCiAgICApOwp9CgpfX2RldmljZV9fCmZwMzIgZnAzMl9mcm9tX2ZwOChmcDggeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmcm9tIGZwOCB0byBmcDMyIGlzIHNsb3cgb24gYW55dGhpbmcgdGhhdAogICAgLy8gZG9lc24ndCBoYXZlIHRoZSBoYXJkd2FyZSBpbnN0cnVjdGlvbnMgdG8gZG8gaXQuIFRoZSBzb2Z0d2FyZQogICAgLy8gbWV0aG9kIGRlYWxzIHdpdGggc3BlY2lhbCBjYXNlcyAoTmFOLCBzdWJub3JtYWxzKSwgYnV0IHdlCiAgICAvLyBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSBzaW5jZSB3ZSBkb24ndCBleHBlY3QgdGhvc2UgaW4KICAgIC8vIHRoZSBpbnB1dC4gVGhlcmVmb3JlLCB3ZSBjYW4gb3B0aW1pemUgdGhlIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCiAgICAvLyBieSBqdXN0IHNodWZmbGluZyB0aGUgYml0cy4KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIC8vIE1JMzAwIGhhcyBhbiBpbnN0cnVjdGlvbiBmb3IgdGhpcy4KICAgIHJldHVybiBmbG9hdCh4KTsKI2Vsc2UKICAgIC8vIEZhbGxiYWNrIGNhc2UKICAgIC8vIFRPRE86IEZpbmQgYSBmYXN0ZXIgb3B0aW9uCiAgICByZXR1cm4gZmxvYXQoeCk7CiNlbmRpZgp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2hvc3RfXwp2b2lkIHNlbGVjdChib29sIGNvbmQsIEYgZikgewogICAgaWYgKGNvbmQpIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGZhbHNlPigpOwogICAgfQp9Cgp0ZW1wbGF0ZTwKICAgIGludCBibG9ja19zaXplLAogICAgaW50IGJsb2NrX3RpbGVfbSwKICAgIGludCBibG9ja190aWxlX24sCiAgICB0eXBlbmFtZSBsb2FkX3R5cGUsCiAgICBib29sIG1fYWxpZ25lZCA9IGZhbHNlLAogICAgYm9vbCBuX2FsaWduZWQgPSBmYWxzZQo+Cl9fZGV2aWNlX18KX19mb3JjZWlubGluZV9fCnZvaWQgYmxvY2tfdGlsZV9sb2FkX2Zhc3RfbGluZWFyKAogICAgLy8gU2hhcmVkIG1lbW9yeSBkZXN0aW5hdGlvbgogICAgZnA4KiBibG9ja190aWxlX2RzdCwKICAgIC8vIEdsb2JhbCBtZW1vcnkgc291cmNlCiAgICBjb25zdCBmcDgqIGJsb2NrX3RpbGVfc3JjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBibG9ja19vZmZfbSwKICAgIGludCBibG9ja19vZmZfbgopIHsKICAgIGJsb2NrX3RpbGVfc3JjICs9IGJsb2NrX29mZl9uICogbSArIGJsb2NrX29mZl9tOwoKICAgIGNvbnN0IGJvb2wgY29tcGxldGVseV9pbl9ib3VuZHMgPSAobV9hbGlnbmVkICYmIG5fYWxpZ25lZCkgfHwKICAgICAgICAoYmxvY2tfb2ZmX20gKyBibG9ja190aWxlX20gPD0gbSAmJgogICAgICAgIGJsb2NrX29mZl9uICsgYmxvY2tfdGlsZV9uIDw9IG4pOwoKICAgIC8vIEEgZ2VuZXJhbCBmYXN0IGdsb2JhbCBtZW1vcnkgbmVlZHMgdG8gYmUgYXMgZm9sbG93czoKICAgIC8vIC0gR3JvdXAgb2YgMTYgYnl0ZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGEgMTI4LWJpdCBsb2FkCiAgICAvLyAtIFRoZSBmYXN0IHBhdGggcmVxdWlyZXMgZW50aXJlIGNhY2hlIGxpbmVzIHRvIGJlIGxvYWRlZCBhdCBvbmNlLiBDRE5BMwogICAgLy8gICBjYWNoZSBsaW5lIHNpemUgaXMgMTI4IGJ5dGVzLCBzbyB0aGUgaWRlYWwgbWF0cml4IHNpemUgaGFzIGFuIGlubmVyCiAgICAvLyAgIGRpbWVuc2lvbiAoYmxvY2tfdGlsZV9tOyBzb3VyY2UgaXMgY29sdW1uIG1ham9yKSBvZiBhdCBsZWFzdCAxMjguCiAgICAvLyAtIFdlIHdhbnQgZXZlcnkgdGhyZWFkIHRvIHBhcnRpY2lwYXRlLCBzbyB3ZSBuZWVkIGF0IGxlYXN0CiAgICAvLyAgIGJsb2NrX3NpemUgLyAoMTI4IC8gMTYpIGVsZW1lbnRzIGluIHRoZSBOIGRpcmVjdGlvbi4KICAgIC8vICAgYmxvY2tfc2l6ZSA9PSA2NCA9PiA4CiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMjU2ID0+IDMyCiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMTAyNCA9PiAxMjgKICAgIC8vIC0gV2UgYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIGFscmVhZHkgYWxpZ25lZCB0byAxMjggYml0cywgYW5kIHRoYXQgdGhlIG0gc3RyaWRlCiAgICAvLyAgIGlzIGFsc28gYWxpZ25lZCBzdWNoLiBtLCBuLCBrIGFyZSBhbGwgZGl2aXNpYmxlIGJ5IDY0LCBzbyB0aGlzIHNob3VsZCBiZSBmaW5lLgogICAgLy8KICAgIC8vICAg4pSM4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSQIOKUjOKUgOKUgOKUgOKUkAogICAgLy8gICDilIIwICDilII0ICDilII4ICDilIIxMiDilIIg4pSCICAg4pSCID0gMTYgYnl0ZXMKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkIOKUlOKUgOKUgOKUgOKUmAogICAgLy8gICDilIIxICDilII1ICDilII5ICDilIIxMyDilIIKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkCiAgICAvLyAgIOKUgjIgIOKUgjYgIOKUgjEwIOKUgjE0IOKUggogICAgLy8gICDilJzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilKQKICAgIC8vICAg4pSCMyAg4pSCNyAg4pSCMTEg4pSCMTUg4pSCCiAgICAvLyAgIOKUlOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUmAoKICAgIC8vIHVzaW5nIGxvYWRfdHlwZSA9IHVpbnQzMl90OwoKICAgIC8vIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgY2FjaGVfbGluZV9zaXplID09IDAsICJ0aWxlIGlubmVyIGRpbWVuc2lvbiBzaG91bGQgYmUgZGl2aXNpYmxlIGJ5IGNhY2hlIGxpbmUgc2l6ZSIpOwoKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgc2l6ZW9mKGxvYWRfdHlwZSkgPT0gMCwgInRpbGUgaW5uZXIgZGltZW5zaW9uIGhhcyB0byBiZSBkaXZpc2libGUgYnkgbG9hZCB0eXBlIHNpemUiKTsKICAgIGNvbnN0ZXhwciBpbnQgdG90YWxfbG9hZHMgPSBibG9ja190aWxlX20gKiBibG9ja190aWxlX24gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIHN0YXRpY19hc3NlcnQodG90YWxfbG9hZHMgJSBibG9ja19zaXplID09IDAsICJ0b3RhbCBhbW91bnQgb2YgbG9hZHMgbmVlZHMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBjb25zdGV4cHIgaW50IGxvYWRzX3Blcl9ibG9ja190aWxlX20gPSBibG9ja190aWxlX20gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIGNvbnN0ZXhwciBpbnQgbG9hZHNfcGVyX3RocmVhZCA9IHRvdGFsX2xvYWRzIC8gYmxvY2tfc2l6ZTsKCiAgICBjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgogICAgaWYgKGNvbXBsZXRlbHlfaW5fYm91bmRzKSB7CiAgICAgICAgdW5yb2xsPDAsIGxvYWRzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaj4gewogICAgICAgICAgICBjb25zdCBpbnQgaSA9IGogKiBibG9ja19zaXplICsgdGlkOwogICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcm93IHRvIGFjY2VzcyBpcyB0aGUgaW5uZXIgZGltZW5zaW9uIHRvCiAgICAgICAgICAgIC8vIGdldCBnb29kIGNhY2hpbmcuCiAgICAgICAgICAgIGNvbnN0IGludCByb3cgPSBpICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgY29uc3QgaW50IGNvbCA9IGkgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgZHN0X29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKCiAgICAgICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IHdhbnQgdG8gbWFrZSBhIHZlcnNpb24gd2hpY2ggdHJhbnNwb3NlcyB0aGUgbWF0cml4CiAgICAgICAgICAgIC8vIHdoaWxlIGxvYWRpbmcgaXQuIFRoYXQncyBmb3IgbGF0ZXIsIHRob3VnaC4KICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9hZF90eXBlKj4oYmxvY2tfdGlsZV9kc3QgKyBkc3Rfb2ZmKSA9CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsb2FkX3R5cGUqPihibG9ja190aWxlX3NyYyArIHNyY19vZmYpOwogICAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgICB1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7CiAgICAgICAgICAgIGNvbnN0IGludCByb3cgPSBpICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgY29uc3QgaW50IGNvbCA9IGkgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgZHN0X29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKCiAgICAgICAgICAgIGNvbnN0IGludCBzcmNfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBibG9ja19vZmZfbTsKICAgICAgICAgICAgY29uc3QgaW50IHNyY19jb2wgPSBjb2wgKyBibG9ja19vZmZfbjsKCiAgICAgICAgICAgIC8vIE5vdGU6IE0sIE4sIEsgaXMgZ3VhcmFudGVlZCB0byBiZSBkaXZpc2libGUgYnkgdGhlIGxvYWQKICAgICAgICAgICAgLy8gc2l6ZSwgc28gd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBvdXRlciBib3VuZHMuCiAgICAgICAgICAgIGlmICgobV9hbGlnbmVkIHx8IHNyY19yb3cgPCBtKSAmJiAobl9hbGlnbmVkIHx8IHNyY19jb2wgPCBuKSkgewogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9hZF90eXBlKj4oYmxvY2tfdGlsZV9kc3QgKyBkc3Rfb2ZmKSA9CiAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbG9hZF90eXBlKj4oYmxvY2tfdGlsZV9zcmMgKyBzcmNfb2ZmKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGxvYWRfdHlwZSo+KGJsb2NrX3RpbGVfZHN0ICsgZHN0X29mZikgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cn0KCnRlbXBsYXRlIDxpbnQgbSwgaW50IG4sIGludCBrPgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmbG9hdCAoJmMpWzRdLAogICAgICAgIGZsb2F0IGEsCiAgICAgICAgZmxvYXQgYgogICAgKSB7CiAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCiAgICAgICAgICAgIGEsCiAgICAgICAgICAgIGIsCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMAogICAgICAgICk7CiAgICAgICAgdW5yb2xsPDAsIDQ+KFsmXTxpbnQgaT4gewogICAgICAgICAgICBjW2ldID0gcmVzdWx0W2ldOwogICAgICAgIH0pOwogICAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPiB7CiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZsb2F0ICgmYylbMTZdLAogICAgICAgIGZsb2F0IGEsCiAgICAgICAgZmxvYXQgYgogICAgKSB7CiAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCiAgICAgICAgICAgIGEsCiAgICAgICAgICAgIGIsCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMngxNj4oYyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAKICAgICAgICApOwogICAgICAgIHVucm9sbDwwLCAxNj4oWyZdPGludCBpPiB7CiAgICAgICAgICAgIGNbaV0gPSByZXN1bHRbaV07CiAgICAgICAgfSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8aW50IG0sIGludCBuLCBpbnQgaz4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGUoCiAgICAgICAgZmxvYXQgKCZjKVs0XSwKICAgICAgICBjb25zdCBmcDggKCZhKVs4XSwKICAgICAgICBjb25zdCBmcDggKCZiKVs4XQogICAgKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCiAgICBjb25zdCBhdXRvIHJlc3VsdCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCgKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PGZwMzJ4ND4oYyksCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAKICAgICk7CiAgICB1bnJvbGw8MCwgND4oWyZdPGludCBpPiB7CiAgICAgICAgY1tpXSA9IHJlc3VsdFtpXTsKICAgIH0pOwojZWxzZQogICAgLy8gRmFsbGJhY2sgc28gd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICAvLyBBcHBhcmVudGx5IHRoZSBsYXlvdXRzIGFyZSBzdWNoIHRoYXQgd2UgY2FuIGp1c3QgZG8gdGhpcy4KICAgIHVucm9sbDwwLCA4PihbJl08aW50IGs+IHsKICAgICAgICBjb25zdCBhdXRvIGFfZjMyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFba10pOwogICAgICAgIGNvbnN0IGF1dG8gYl9mMzIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYltrXSk7CiAgICAgICAgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+OjpleGVjdXRlKGMsIGFfZjMyLCBiX2YzMik7CiAgICB9KTsKI2VuZGlmCiNlbmRpZgogICAgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmbG9hdCAoJmMpWzE2XSwKICAgICAgICBjb25zdCBmcDggKCZhKVs4XSwKICAgICAgICBjb25zdCBmcDggKCZiKVs4XQogICAgKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCiAgICBjb25zdCBhdXRvIHJlc3VsdCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PGZwMzJ4MTY+KGMpLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwCiAgICApOwogICAgdW5yb2xsPDAsIDE2PihbJl08aW50IGk+IHsKICAgICAgICBjW2ldID0gcmVzdWx0W2ldOwogICAgfSk7CiNlbHNlCiAgICAvLyBGYWxsYmFjayBjb3BpZWQgZnJvbSBDSywgdGhpcyB3YXkgd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICB1bnJvbGw8MCwgOD4oWyZdPGludCBrPiB7CiAgICAgICAgY29uc3QgYXV0byBhX2YzMiA9IHN0YXRpY19jYXN0PGZsb2F0PihhW2tdKTsKICAgICAgICBjb25zdCBhdXRvIGJfZjMyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJba10pOwogICAgICAgIG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPjo6ZXhlY3V0ZShjLCBhX2YzMiwgYl9mMzIpOwogICAgfSk7CiNlbmRpZgojZW5kaWYKICAgIH0KfTsKCi8vIFNlZSBDRE5BMyBtYW51YWwsIDcuMS40LjEuIElucHV0IGxheW91dAovLyBUaGUgY2FsY3VsYXRpb25zIGhlcmUgYXJlIG9idGFpbmVkIHZpYSB0aGUKLy8gQU1EIG1hdHJpeCBpbnN0cnVjdGlvbiBjYWxjdWxhdG9yCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ST0NtL2FtZF9tYXRyaXhfaW5zdHJ1Y3Rpb25fY2FsY3VsYXRvcgovLyBUaGVyZSBpcyBhIGNsZWFuZXIgd2F5IHRvIGNvbXB1dGUgdGhlIG1hcHBpbmcsIGJ1dAovLyB0aGlzIGlzIHdoYXQgdGhlIHRvb2wgcmV0dXJucyBhbmQgSSdtIGxhenkuIFdlIG9ubHkKLy8gcmVhbGx5IG5lZWQgdGhlc2UgdHdvIGFueXdheSBmb3Igbm93Lgp0ZW1wbGF0ZSA8dHlwZW5hbWUgbWZtYT4Kc3RydWN0IG1mbWFfaW5kZXhlcjsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MTYsIDE2LCAzMj4+IHsKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICAvLyBOb3RlOiByZWcgaXMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGluCiAgICAgICAgLy8gdGhlIHRocmVhZCdzIHJlZ2lzdGVycy4gVGhlIG1hdHJpeCBpbnN0cnVjdGlvbgogICAgICAgIC8vIGNhbGN1bGF0b3IgY29uc2lkZXJzIHRoZSByZWdpc3RlciB0aGUgVkdSUCwgc28KICAgICAgICAvLyA0IGVsZW1lbnRzLiBBbGwgb2YgdGhlIGVsZW1lbnRzIHNob3VsZCBiZSBwYWNrZWQKICAgICAgICBjb25zdCBpbnQgbSA9IGxhbmUgJSAxNjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICByZXR1cm4ge20sIGt9OwogICAgfQoKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICBjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICByZXR1cm4ge24sIGt9OwogICAgfQoKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICBjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICBjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKICAgICAgICByZXR1cm4ge20sIG59OwogICAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfaW5kZXhlcjxtZm1hX2YzMl9mOF9mODwzMiwgMzIsIDE2Pj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIC8vIE5vdGU6IHJlZyBpcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4KICAgICAgICAvLyB0aGUgdGhyZWFkJ3MgcmVnaXN0ZXJzLiBUaGUgbWF0cml4IGluc3RydWN0aW9uCiAgICAgICAgLy8gY2FsY3VsYXRvciBjb25zaWRlcnMgdGhlIHJlZ2lzdGVyIHRoZSBWR1JQLCBzbwogICAgICAgIC8vIDQgZWxlbWVudHMuIEFsbCBvZiB0aGUgZWxlbWVudHMgc2hvdWxkIGJlIHBhY2tlZAogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDMyOwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgcmVnOwogICAgICAgIHJldHVybiB7bSwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIGNvbnN0IGludCBuID0gbGFuZSAlIDMyOwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgcmVnOwogICAgICAgIHJldHVybiB7biwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYyhpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIGNvbnN0IGludCBuID0gOCAqIChyZWcgLyA0KSAlIDMyICsgNCAqIChsYW5lIC8gMzIpICsgKHJlZyAlIDQpOwogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDMyOwogICAgICAgIHJldHVybiB7biwgbX07CiAgICB9Cn07Cgp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KY29uc3RleHByIGF1dG8gZGl2aWRlX2V4YWN0KCkgewogICAgc3RhdGljX2Fzc2VydChhICUgYiA9PSAwLCAiZG9lcyBub3QgZGl2aWRlIGV4YWN0ISIpOwogICAgcmV0dXJuIGEgLyBiOwp9Cgp0ZW1wbGF0ZSA8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGN1YmUgYmxvY2tfdGlsZSwKICAgIGN1YmUgd2FycF90aWxlLAogICAgdHlwZW5hbWUgbG9hZF90eXBlLAogICAgYm9vbCBtX2FsaWduZWQgPSBmYWxzZSwKICAgIGJvb2wgbl9hbGlnbmVkID0gZmFsc2UsCiAgICBib29sIGtfYWxpZ25lZCA9IGZhbHNlCj4KX19nbG9iYWxfXyBfX2xhdW5jaF9ib3VuZHNfXyhibG9ja19zaXplKQp2b2lkIGtlcm5lbCgKICAgIGNvbnN0IGZwOCogYSwKICAgIGNvbnN0IGZwOCogYiwKICAgIGNvbnN0IGZwMzIqIGFzLAogICAgY29uc3QgZnAzMiogYnMsCiAgICBiZjE2KiBjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBrCikgewogICAgY29uc3RleHByIGludCB3YXJwcyA9IGJsb2NrX3NpemUgLyB3YXJwX3NpemU7CgogICAgY29uc3RleHByIGludCBibG9ja190aWxlX20gPSBibG9ja190aWxlLm07CiAgICBjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbiA9IGJsb2NrX3RpbGUubjsKICAgIGNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX20gPSB3YXJwX3RpbGUubTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGUubjsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX2sgPSB3YXJwX3RpbGUuazsKCiAgICB1c2luZyBtZm1hID0gbWZtYV9mMzJfZjhfZjg8d2FycF90aWxlX20sIHdhcnBfdGlsZV9uLCB3YXJwX3RpbGVfaz47CiAgICB1c2luZyBpbmRleGVyID0gbWZtYV9pbmRleGVyPG1mbWE+OwoKICAgIGNvbnN0ZXhwciBpbnQgY190b3RhbCA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbjsKCiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9iKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSB3YXJwX3RpbGVfbSA9PSAwLCAid2FycCB0aWxlIE0gaGFzIHRvIGRpdmlkZSBibG9jayB0aWxlIE0iKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbiA9IGJsb2NrX3RpbGVfbiAvIHdhcnBfdGlsZV9uOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVzX2sgPSBibG9ja190aWxlX2sgLyB3YXJwX3RpbGVfazsKCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW4gPSB3YXJwX3RpbGVzX20gKiB3YXJwX3RpbGVzX247CgogICAgLy8gbnVtYmVyIG9mIHdhcnAgdGlsZXMgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHdhcnBzCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tbiwgd2FycHM+KCk7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIC8vIHNpemUod2FycF90aWxlX21uKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSB3YXJwIHNpemUKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX21uX2lwdCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVfbW5faXRlbXMsIHdhcnBfc2l6ZT4oKTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX21rX2lwdCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9rLCB3YXJwX3NpemU+KCk7CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZV9ua19pcHQgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlX24gKiB3YXJwX3RpbGVfaywgd2FycF9zaXplPigpOwoKICAgIGNvbnN0ZXhwciBpbnQgY19wZXJfdGhyZWFkID0gY190b3RhbCAvIGJsb2NrX3NpemU7CiAgICBzdGF0aWNfYXNzZXJ0KGNfcGVyX3RocmVhZCA9PSB3YXJwX3RpbGVzX21uX3Blcl93YXJwICogd2FycF90aWxlX21uX2lwdCwgInNhbml0eSBjaGVjayIpOwoKICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICBjb25zdCBpbnQgd2FycCA9IHRpZCAvIHdhcnBfc2l6ZTsKICAgIGNvbnN0IGludCBsYW5lID0gX19sYW5lX2lkKCk7CgogICAgLy8gU3dhcCBkaXJlY3Rpb24gdG8gbWFrZSBib3VuZHMgY2hlY2tpbmcgYmUgZmlyc3QKICAgIGNvbnN0IGludCB0aV9tID0gZ3JpZERpbS54IC0gYmxvY2tJZHgueCAtIDE7CiAgICBjb25zdCBpbnQgdGlfbiA9IGdyaWREaW0ueSAtIGJsb2NrSWR4LnkgLSAxOwoKICAgIGludCBzbiA9IGNlaWxfZGl2KG4sIDEyOCk7CgogICAgZmxvYXQgY19yZWdzW3dhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiB3YXJwX3RpbGVfbW5faXB0XTsKICAgIGNsZWFyKGNfcmVncyk7CgogICAgX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfa107CiAgICBfX3NoYXJlZF9fIGZwOCBibG9ja190aWxlX2JbYmxvY2tfdGlsZV9uICogYmxvY2tfdGlsZV9rXTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7IGkgKz0gYmxvY2tfdGlsZV9rKSB7CiAgICAgICAgLy8gTG9hZCB0aWxlcyBpbnRvIHNoYXJlZCBtZW1vcnkKICAgICAgICBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXI8CiAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgIGJsb2NrX3RpbGVfbSwKICAgICAgICAgICAgYmxvY2tfdGlsZV9rLAogICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgIG1fYWxpZ25lZCwKICAgICAgICAgICAga19hbGlnbmVkCiAgICAgICAgPigKICAgICAgICAgICAgYmxvY2tfdGlsZV9hLCBhLCBtLCBrLCB0aV9tICogYmxvY2tfdGlsZV9tLCBpCiAgICAgICAgKTsKICAgICAgICBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXI8CiAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgIGJsb2NrX3RpbGVfbiwKICAgICAgICAgICAgYmxvY2tfdGlsZV9rLAogICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgIG5fYWxpZ25lZCwKICAgICAgICAgICAga19hbGlnbmVkCiAgICAgICAgPigKICAgICAgICAgICAgYmxvY2tfdGlsZV9iLCBiLCBuLCBrLCB0aV9uICogYmxvY2tfdGlsZV9uLCBpCiAgICAgICAgKTsKICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICAgIHVucm9sbDFkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnA+KFsmXTxpbnQgaXd0aT4gewogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgd3RuID0gd3RpIC8gd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgZmxhdF93dF9iYXNlID0gaXd0aSAqIHdhcnBfdGlsZV9tbl9pcHQ7CgogICAgICAgICAgICBmbG9hdCB3YXJwX2ZyZ19jW3dhcnBfdGlsZV9tbl9pcHRdOwogICAgICAgICAgICBjbGVhcih3YXJwX2ZyZ19jKTsKCiAgICAgICAgICAgIHVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CiAgICAgICAgICAgICAgICAvLyBMb2FkIGZyYWdtZW50IEEKICAgICAgICAgICAgICAgIGZwOCBmcmdfYVt3YXJwX3RpbGVfbWtfaXB0XTsKICAgICAgICAgICAgICAgIHVucm9sbDwwLCB3YXJwX3RpbGVfbWtfaXB0PihbJl08aW50IG1rX3JlZz4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaWtdID0gaW5kZXhlcjo6cmVnX3RvX21hdHJpeF9hKGxhbmUsIG1rX3JlZyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpbSA9IHd0bSAqIHdhcnBfdGlsZV9tICsgbWZtYV9pbTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmlrID0gd3RrX2Jhc2UgKyBtZm1hX2lrOwogICAgICAgICAgICAgICAgICAgIGZyZ19hW21rX3JlZ10gPSBibG9ja190aWxlX2FbYmlrICogYmxvY2tfdGlsZV9tICsgYmltXTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIExvYWQgZnJhZ21lbnQgQgogICAgICAgICAgICAgICAgZnA4IGZyZ19iW3dhcnBfdGlsZV9ua19pcHRdOwogICAgICAgICAgICAgICAgdW5yb2xsPDAsIHdhcnBfdGlsZV9ua19pcHQ+KFsmXTxpbnQgbmtfcmVnPiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbiwgbWZtYV9pa10gPSBpbmRleGVyOjpyZWdfdG9fbWF0cml4X2IobGFuZSwgbmtfcmVnKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CiAgICAgICAgICAgICAgICAgICAgZnJnX2JbbmtfcmVnXSA9IGJsb2NrX3RpbGVfYltiaWsgKiBibG9ja190aWxlX24gKyBiaW5dOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gTm93IHBlcmZvcm0gdGhlIE1GTUEgYmFzZWQgb24gdGhlIHdhcnAgdGlsZSBzaXplLgogICAgICAgICAgICAgICAgbWZtYTo6ZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICB3YXJwX2ZyZ19jLAogICAgICAgICAgICAgICAgICAgIGZyZ19hLAogICAgICAgICAgICAgICAgICAgIGZyZ19iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHVucm9sbDwwLCB3YXJwX3RpbGVfbW5faXB0PihbJl08aW50IG1uX3JlZz4gewogICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjpyZWdfdG9fbWF0cml4X2MobGFuZSwgbW5fcmVnKTsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CiAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwogICAgICAgICAgICAgICAgY29uc3QgaW50IGltID0gdGlfbSAqIGJsb2NrX3RpbGVfbSArIGJpbTsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbiA9IHRpX24gKiBibG9ja190aWxlX24gKyBiaW47CgogICAgICAgICAgICAgICAgY19yZWdzW2ZsYXRfd3RfYmFzZSArIG1uX3JlZ10gKz0gd2FycF9mcmdfY1ttbl9yZWddICogYXNbaSAvIDEyOCAqIG0gKyBpbV0gKiBic1tpIC8gMTI4ICogc24gKyBpbiAvIDEyOF07CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB9CgogICAgLy8gV3JpdGUgb3V0IEMKICAgIC8vIFRoaXMgc2hvdWxkIGFjY2VzcyB0aWxlIEMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4gdGhlIG1hdG11bCBsb29wIQoKICAgIGNvbnN0IGludCBpbV9iYXNlID0gdGlfbSAqIGJsb2NrX3RpbGVfbTsKICAgIGNvbnN0IGludCBpbl9iYXNlID0gdGlfbiAqIGJsb2NrX3RpbGVfbjsKCiAgICBjb25zdCBib29sIGNfaW5fYm91bmRzID0KICAgICAgICAobV9hbGlnbmVkIHx8IG0gJSBibG9ja190aWxlX20gPT0gMCB8fCBpbV9iYXNlICsgYmxvY2tfdGlsZV9tIDw9IG0pICYmCiAgICAgICAgKG5fYWxpZ25lZCB8fCBuICUgYmxvY2tfdGlsZV9uID09IDAgfHwgaW5fYmFzZSArIGJsb2NrX3RpbGVfbiA8PSBuKTsKCiAgICBzZWxlY3QoY19pbl9ib3VuZHMsIFsmXTxib29sIGNfaW5fYm91bmRzPiB7CiAgICAgICAgdW5yb2xsMmQ8d2FycF90aWxlc19tbl9wZXJfd2FycCwgd2FycF90aWxlX21uX2lwdD4oWyZdPGludCBpd3RpLCBpbnQgbW5fcmVnPiB7CiAgICAgICAgICAgIGNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaW5dID0gaW5kZXhlcjo6cmVnX3RvX21hdHJpeF9jKGxhbmUsIG1uX3JlZyk7CgogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgd3RuID0gd3RpIC8gd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgZmxhdF93dF9iYXNlID0gaXd0aSAqIHdhcnBfdGlsZV9tbl9pcHQ7CgogICAgICAgICAgICBjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwogICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwoKICAgICAgICAgICAgY29uc3QgaW50IGltID0gaW1fYmFzZSArIGJpbTsKICAgICAgICAgICAgY29uc3QgaW50IGluID0gaW5fYmFzZSArIGJpbjsKCiAgICAgICAgICAgIGNvbnN0IGF1dG8gdmFsID0gYmYxNl9mcm9tX2ZwMzIoY19yZWdzW2ZsYXRfd3RfYmFzZSArIG1uX3JlZ10pOwoKICAgICAgICAgICAgaWYgKGNfaW5fYm91bmRzIHx8IGltIDwgbSAmJiBpbiA8IG4pIHsKICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZShzdGQ6OmJpdF9jYXN0PHVpbnQxNl90Pih2YWwpLCByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oJmNbaW0gKiBuICsgaW5dKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9Cgp0ZW1wbGF0ZTwKICAgIGludCBibG9ja19zaXplLAogICAgY3ViZSBibG9ja190aWxlLAogICAgY3ViZSB3YXJwX3RpbGUsCiAgICB0eXBlbmFtZSBsb2FkX3R5cGUgPSB1aW50MzJfdAo+CnZvaWQgcnVuX2tlcm5lbCgKICAgIGNvbnN0IGZwOCogYSwKICAgIGNvbnN0IGZwOCogYiwKICAgIGNvbnN0IGZwMzIqIGFzLAogICAgY29uc3QgZnAzMiogYnMsCiAgICBiZjE2KiBjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBrLAogICAgYm9vbCBtZWFzdXJlCikgewogICAgY29uc3QgaW50IGdyaWRfbSA9IGNlaWxfZGl2KG0sIGJsb2NrX3RpbGUubSk7CiAgICBjb25zdCBpbnQgZ3JpZF9uID0gY2VpbF9kaXYobiwgYmxvY2tfdGlsZS5uKTsKCiAgICBoaXBFdmVudF90IHN0YXJ0LCBzdG9wOwogICAgaWYgKG1lYXN1cmUpIHsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRDcmVhdGUoJnN0YXJ0KSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50Q3JlYXRlKCZzdG9wKSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50UmVjb3JkKHN0YXJ0LCAwKSk7CiAgICB9CgogICAgLy8gc2VsZWN0KG0gJSBibG9ja190aWxlLm0gPT0gMCwgWyZdPGJvb2wgbV9hbGlnbmVkPiB7CiAgICAvLyAgICAgc2VsZWN0KG4gJSBibG9ja190aWxlLm4gPT0gMCwgWyZdPGJvb2wgbl9hbGlnbmVkPiB7CiAgICAvLyAgICAgICAgIHNlbGVjdChrICUgYmxvY2tfdGlsZS5rID09IDAsIFsmXTxib29sIGtfYWxpZ25lZD4gewogICAgICAgICAgICAgICAga2VybmVsPAogICAgICAgICAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZSwKICAgICAgICAgICAgICAgICAgICB3YXJwX3RpbGUsCiAgICAgICAgICAgICAgICAgICAgbG9hZF90eXBlLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBtX2FsaWduZWQsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIG5fYWxpZ25lZCwKICAgICAgICAgICAgICAgICAgICBmYWxzZSAgLy8ga19hbGlnbmVkCiAgICAgICAgICAgICAgICA+PDw8CiAgICAgICAgICAgICAgICAgICAgZGltMyhncmlkX20sIGdyaWRfbiksCiAgICAgICAgICAgICAgICAgICAgZGltMyhibG9ja19zaXplKSwKICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICA+Pj4oCiAgICAgICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgICAgICBiLAogICAgICAgICAgICAgICAgICAgIGFzLAogICAgICAgICAgICAgICAgICAgIGJzLAogICAgICAgICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgICAgICAgbSwKICAgICAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgICAgIGsKICAgICAgICAgICAgICAgICk7CiAgICAvLyAgICAgICAgIH0pOwogICAgLy8gICAgIH0pOwogICAgLy8gfSk7CgogICAgSElQX0NIRUNLKGhpcEdldExhc3RFcnJvcigpKTsKCiAgICBpZiAobWVhc3VyZSkgewogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudFJlY29yZChzdG9wLCAwKSk7CiAgICAgICAgSElQX0NIRUNLKGhpcERldmljZVN5bmNocm9uaXplKCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudFN5bmNocm9uaXplKHN0b3ApKTsKCiAgICAgICAgZmxvYXQgbXMgPSAwOwogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudEVsYXBzZWRUaW1lKCZtcywgc3RhcnQsIHN0b3ApKTsKICAgICAgICBjb25zdCBkb3VibGUgdGltZSA9IG1zIC8gMScwMDAuMDsKCiAgICAgICAgY29uc3QgZG91YmxlIG1lbW9yeSA9IG0gKiBrICogc2l6ZW9mKGZwOCkgKyBuICogayAqIHNpemVvZihmcDgpICsgbSAqIG4gKiBzaXplb2YoYmYxNik7CiAgICAgICAgY29uc3QgZG91YmxlIG9wcyA9CiAgICAgICAgICAgIGRvdWJsZShtKSAqIG4gKiBrICogMiAvLyBNdWx0aXBseSArIGFkZCBmb3IgZWFjaCBwYWlyCiAgICAgICAgICAgICsgKGRvdWJsZShtKSAqIG4gKiAyKSAqIGNlaWxfZGl2KGssIHdhcnBfdGlsZS5rKTsgLy8gc2NhbGluZwoKICAgICAgICBjb25zdCBkb3VibGUgbWVtb3J5X3RwdXQgPSBtZW1vcnkgLyB0aW1lIC8gKDEwMDAuMCAqIDEwMDAgKiAxMDAwKTsKICAgICAgICBjb25zdCBkb3VibGUgY29tcHV0ZV90cHV0ID0gb3BzIC8gdGltZSAvICgxMDAwLjAgKiAxMDAwICogMTAwMCAqIDEwMDApOwoKICAgICAgICBzdGQ6OmNlcnIKICAgICAgICAgICAgPDwgc3RkOjpmaXhlZAogICAgICAgICAgICA8PCBzdGQ6OnNldHByZWNpc2lvbigyKQogICAgICAgICAgICA8PCAiKCIgPDwgbSA8PCAiICIgPDwgbiA8PCAiICIgPDwgayA8PCAiKSAiCiAgICAgICAgICAgIDw8ICIoIiA8PCBibG9ja190aWxlLm0gPDwgIiAiIDw8IGJsb2NrX3RpbGUubiA8PCAiICIgPDwgYmxvY2tfdGlsZS5rIDw8ICIpICIKICAgICAgICAgICAgPDwgIigiIDw8IHdhcnBfdGlsZS5tIDw8ICIgIiA8PCB3YXJwX3RpbGUubiA8PCAiICIgPDwgd2FycF90aWxlLmsgPDwgIikgIgogICAgICAgICAgICA8PCBibG9ja19zaXplIDw8ICI6ICIKICAgICAgICAgICAgPDwgbXMgPDwgIiBtcyAiCiAgICAgICAgICAgIDw8ICh0aW1lICogMScwMDAnMDAwKSA8PCAiIHVzICIKICAgICAgICAgICAgPDwgbWVtb3J5X3RwdXQgPDwgIiBHQi9zICIKICAgICAgICAgICAgPDwgY29tcHV0ZV90cHV0IDw8ICIgVEZMT1BTIgogICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CgogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudERlc3Ryb3koc3RhcnQpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnREZXN0cm95KHN0b3ApKTsKICAgIH0KCn0KCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGssCiAgICBib29sIG1lYXN1cmUKKSB7CiAgICAvLyBJbiB0aGUga2VybmVscyB3ZSBhc3N1bWUgMTI4LWJpdCBhbGlnbm1lbnQuCiAgICBhc3NlcnQoYV9wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChiX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGFzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGJzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGNfcHRyICUgMTYgPT0gMCk7CgogICAgY29uc3QgYXV0byogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogYXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogYnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihic19wdHIpOwogICAgYXV0byogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGNfcHRyKTsKCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDEyOH0sIGN1YmV7MiwgMiwgOH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDEyOH0sIGN1YmV7MiwgMiwgNH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDEyOH0sIGN1YmV7MiwgMiwgMn0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDY0fSwgY3ViZXsyLCAyLCA0fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezMyLCAzMiwgNjR9LCBjdWJlezIsIDIsIDJ9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCAzMn0sIGN1YmV7MiwgMiwgMn0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgLy8gcnVuX2tlcm5lbDwxMjgsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDh9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwxMjgsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezQsIDIsIDh9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwxMjgsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDQsIDh9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwxMjgsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDE2fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXs0LCA0LCA0fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCBfX3VpbnQxMjhfdD4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCBfX3VpbnQxMjhfdD4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezQsIDQsIDR9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7NCwgNCwgNH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXs4LCA4LCA4fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXsxNiwgMTYsIDMyfSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KClBZQklORDExX01PRFVMRShmcDgsIG0pIHsKICBtLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCJdLAogICAgYnVpbGRfZGlyZWN0b3J5PSIvZ3B1bW9kZS9hbWQvZnA4L2J1aWxkLyIgaWYgVEVTVElORyBlbHNlIE5vbmUsCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmZpcnN0ID0gVHJ1ZQoKY2FjaGVfbSA9IDAKY2FjaGVfbiA9IDAKY2FjaGVfayA9IDAKY2FjaGVfaSA9IDAKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYmxvY2stc2NhbGUgZnA4IGdlbW0KICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgdGhhdCBleHBhbmRzIHRvOgogICAgICAgICAgICBhOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbSwga10sCiAgICAgICAgICAgIGI6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFtuLCBrXSwKICAgICAgICAgICAgYV9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFttLCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGJfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbiAvLyAxMjgsIGsgLy8gMTI4XSwKICAgICAgICAgICAgYzogdG9yY2guVGVuc29yW2JmbG9hdDE2XSBvZiBzaGFwZSBbbSwgbl0KICAgIFJldHVybnM6CiAgICAgICAgVGVuc29yIGNvbnRhaW5pbmcgb3V0cHV0IGluIGJmMTYKICAgICIiIgoKICAgIGdsb2JhbCBmaXJzdAogICAgaWYgZmlyc3Q6CiAgICAgICAgcHJpbnQoImV4ZWN1dGluZyBvbiIsIHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9uYW1lKCksIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICBmaXJzdCA9IEZhbHNlCgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKCiAgICBtLCBuID0gYy5zaGFwZQogICAgayA9IGEuc2hhcGVbMV0KCiAgICBnbG9iYWwgY2FjaGVfbQogICAgZ2xvYmFsIGNhY2hlX24KICAgIGdsb2JhbCBjYWNoZV9rCiAgICBnbG9iYWwgY2FjaGVfaQoKICAgIGlmIGNhY2hlX20gIT0gbSBvciBjYWNoZV9uICE9IG4gb3IgY2FjaGVfayAhPSBrOgogICAgICAgIGNhY2hlX20gPSBtCiAgICAgICAgY2FjaGVfbiA9IG4KICAgICAgICBjYWNoZV9rID0gawogICAgICAgIGNhY2hlX2kgPSAwCiAgICBlbHNlOgogICAgICAgIGNhY2hlX2kgKz0gMQoKICAgICMgRG9uJ3QgY2hlY2sgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gdG8gYWxsb3cgZm9yIHNvbWUgd2FybXVwCiAgICBtZWFzdXJlID0gRmFsc2UKICAgIGlmIGNhY2hlX2kgPT0gMToKICAgICAgICBtZWFzdXJlID0gVHJ1ZQoKICAgIGhpcF9tb2R1bGUuZnA4KAogICAgICAgIGEuZGF0YV9wdHIoKSwKICAgICAgICBiLmRhdGFfcHRyKCksCiAgICAgICAgYV9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGJfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBjLmRhdGFfcHRyKCksCiAgICAgICAgbSwKICAgICAgICBuLAogICAgICAgIGssCiAgICAgICAgbWVhc3VyZQogICAgKQoKICAgIHJldHVybiBjCg==
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9ICJHUFVNT0RFX1RFU1RJTkciIGluIG9zLmVudmlyb24KCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9iZjE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGJpdD4KCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnVzaW5nIGZwOCA9IF9faGlwX2ZwOF9lNG0zX2ZudXo7CnVzaW5nIGJmMTYgPSBfX2hpcF9iZmxvYXQxNjsKdXNpbmcgZnAzMiA9IGZsb2F0Owp1c2luZyBmcDMyeDQgPSBmcDMyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CgpzdHJ1Y3QgY3ViZSB7CiAgICBpbnQgbSwgbiwgazsKfTsKCmNvbnN0ZXhwciBpbnQgd2FycF9zaXplID0gNjQ7CmNvbnN0ZXhwciBpbnQgY2FjaGVfbGluZV9zaXplID0gMTI4OwoKY29uc3RleHByIGludCBtX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKY29uc3RleHByIGludCBuX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKY29uc3RleHByIGludCBrX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAxMjg7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KX19ob3N0X18gX19kZXZpY2VfXwpjb25zdGV4cHIgYXV0byBjZWlsX2RpdihUIGEsIFUgYikgewogICAgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQoKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jID0gMSwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwoRiBmKSB7CiAgICBpZiBjb25zdGV4cHIoSSA8IE4pIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8ST4oKTsKICAgICAgICB1bnJvbGw8SSArIGluYywgTiwgaW5jPihmKTsKICAgIH0KfQoKdGVtcGxhdGU8aW50IEksIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsMWQoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oZik7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwyZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihbJl08aW50IGk+IHsKICAgICAgICB1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqPigpOwogICAgICAgIH0pOwogICAgfSk7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgaW50IEssIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsM2QoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CiAgICAgICAgdW5yb2xsPDAsIEo+KFsmXTxpbnQgaj4gewogICAgICAgICAgICB1bnJvbGw8MCwgSz4oWyZdPGludCBrPiB7CiAgICAgICAgICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8aSwgaiwgaz4oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpfX2RldmljZV9fCnZvaWQgY2xlYXIoVCAoJmFycmF5KVtOXSkgewogICAgdW5yb2xsPDAsIE4+KFsmXTxpbnQgaT4gewogICAgICAgIGFycmF5W2ldID0gVHswfTsKICAgIH0pOwp9CgpfX2RldmljZV9fCmJmMTYgYmYxNl9mcm9tX2ZwMzIoZmxvYXQgeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmdW5jdGlvbiBkb2VzIGFsbCBraW5kcyBvZiBjaGVja3MKICAgIC8vIGZvciBvZGQgY2FzZXMgKE5hTiwgc3Vibm9ybWFscykgdGhhdCB3ZSBkb24ndCBjYXJlIGFib3V0LgogICAgLy8gVGhpcyBnZW5lcmF0ZXMgYWJzb2x1dGVseSBhYnlzbWFsIGNvZGUsIHNvIGp1c3QgdHJ1bmNhdGUKICAgIC8vIHRoZSB1cHBlciBiaXRzIHRvIGdldCB0aGUgcmlnaHQgdmFsdWUgbGlrZSB0aGUKICAgIC8vIE9wcGVycHl0aG9uIGludGVuZGVkLgoKICAgIHJldHVybiBzdGQ6OmJpdF9jYXN0PGJmMTY+KAogICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PigKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oeCkgPj4gMTYKICAgICAgICApCiAgICApOwp9CgpfX2RldmljZV9fCmZwMzIgZnAzMl9mcm9tX2ZwOChmcDggeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmcm9tIGZwOCB0byBmcDMyIGlzIHNsb3cgb24gYW55dGhpbmcgdGhhdAogICAgLy8gZG9lc24ndCBoYXZlIHRoZSBoYXJkd2FyZSBpbnN0cnVjdGlvbnMgdG8gZG8gaXQuIFRoZSBzb2Z0d2FyZQogICAgLy8gbWV0aG9kIGRlYWxzIHdpdGggc3BlY2lhbCBjYXNlcyAoTmFOLCBzdWJub3JtYWxzKSwgYnV0IHdlCiAgICAvLyBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSBzaW5jZSB3ZSBkb24ndCBleHBlY3QgdGhvc2UgaW4KICAgIC8vIHRoZSBpbnB1dC4gVGhlcmVmb3JlLCB3ZSBjYW4gb3B0aW1pemUgdGhlIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCiAgICAvLyBieSBqdXN0IHNodWZmbGluZyB0aGUgYml0cy4KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIC8vIE1JMzAwIGhhcyBhbiBpbnN0cnVjdGlvbiBmb3IgdGhpcy4KICAgIHJldHVybiBmbG9hdCh4KTsKI2Vsc2UKICAgIC8vIEZhbGxiYWNrIGNhc2UKICAgIC8vIFRPRE86IEZpbmQgYSBmYXN0ZXIgb3B0aW9uCiAgICByZXR1cm4gZmxvYXQoeCk7CiNlbmRpZgp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2hvc3RfXwp2b2lkIHNlbGVjdChib29sIGNvbmQsIEYgZikgewogICAgaWYgKGNvbmQpIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGZhbHNlPigpOwogICAgfQp9Cgp0ZW1wbGF0ZTwKICAgIGludCBibG9ja19zaXplLAogICAgaW50IGJsb2NrX3RpbGVfbSwKICAgIGludCBibG9ja190aWxlX24sCiAgICB0eXBlbmFtZSBsb2FkX3R5cGUsCiAgICBib29sIG1fYWxpZ25lZCA9IGZhbHNlLAogICAgYm9vbCBuX2FsaWduZWQgPSBmYWxzZQo+Cl9fZGV2aWNlX18KX19mb3JjZWlubGluZV9fCnZvaWQgYmxvY2tfdGlsZV9sb2FkX2Zhc3RfbGluZWFyKAogICAgLy8gU2hhcmVkIG1lbW9yeSBkZXN0aW5hdGlvbgogICAgZnA4KiBibG9ja190aWxlX2RzdCwKICAgIC8vIEdsb2JhbCBtZW1vcnkgc291cmNlCiAgICBjb25zdCBmcDgqIGJsb2NrX3RpbGVfc3JjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBibG9ja19vZmZfbSwKICAgIGludCBibG9ja19vZmZfbgopIHsKICAgIGJsb2NrX3RpbGVfc3JjICs9IGJsb2NrX29mZl9uICogbSArIGJsb2NrX29mZl9tOwoKICAgIGNvbnN0IGJvb2wgY29tcGxldGVseV9pbl9ib3VuZHMgPSAobV9hbGlnbmVkICYmIG5fYWxpZ25lZCkgfHwKICAgICAgICAoYmxvY2tfb2ZmX20gKyBibG9ja190aWxlX20gPD0gbSAmJgogICAgICAgIGJsb2NrX29mZl9uICsgYmxvY2tfdGlsZV9uIDw9IG4pOwoKICAgIC8vIEEgZ2VuZXJhbCBmYXN0IGdsb2JhbCBtZW1vcnkgbmVlZHMgdG8gYmUgYXMgZm9sbG93czoKICAgIC8vIC0gR3JvdXAgb2YgMTYgYnl0ZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGEgMTI4LWJpdCBsb2FkCiAgICAvLyAtIFRoZSBmYXN0IHBhdGggcmVxdWlyZXMgZW50aXJlIGNhY2hlIGxpbmVzIHRvIGJlIGxvYWRlZCBhdCBvbmNlLiBDRE5BMwogICAgLy8gICBjYWNoZSBsaW5lIHNpemUgaXMgMTI4IGJ5dGVzLCBzbyB0aGUgaWRlYWwgbWF0cml4IHNpemUgaGFzIGFuIGlubmVyCiAgICAvLyAgIGRpbWVuc2lvbiAoYmxvY2tfdGlsZV9tOyBzb3VyY2UgaXMgY29sdW1uIG1ham9yKSBvZiBhdCBsZWFzdCAxMjguCiAgICAvLyAtIFdlIHdhbnQgZXZlcnkgdGhyZWFkIHRvIHBhcnRpY2lwYXRlLCBzbyB3ZSBuZWVkIGF0IGxlYXN0CiAgICAvLyAgIGJsb2NrX3NpemUgLyAoMTI4IC8gMTYpIGVsZW1lbnRzIGluIHRoZSBOIGRpcmVjdGlvbi4KICAgIC8vICAgYmxvY2tfc2l6ZSA9PSA2NCA9PiA4CiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMjU2ID0+IDMyCiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMTAyNCA9PiAxMjgKICAgIC8vIC0gV2UgYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIGFscmVhZHkgYWxpZ25lZCB0byAxMjggYml0cywgYW5kIHRoYXQgdGhlIG0gc3RyaWRlCiAgICAvLyAgIGlzIGFsc28gYWxpZ25lZCBzdWNoLiBtLCBuLCBrIGFyZSBhbGwgZGl2aXNpYmxlIGJ5IDY0LCBzbyB0aGlzIHNob3VsZCBiZSBmaW5lLgogICAgLy8KICAgIC8vICAg4pSM4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSQIOKUjOKUgOKUgOKUgOKUkAogICAgLy8gICDilIIwICDilII0ICDilII4ICDilIIxMiDilIIg4pSCICAg4pSCID0gMTYgYnl0ZXMKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkIOKUlOKUgOKUgOKUgOKUmAogICAgLy8gICDilIIxICDilII1ICDilII5ICDilIIxMyDilIIKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkCiAgICAvLyAgIOKUgjIgIOKUgjYgIOKUgjEwIOKUgjE0IOKUggogICAgLy8gICDilJzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilKQKICAgIC8vICAg4pSCMyAg4pSCNyAg4pSCMTEg4pSCMTUg4pSCCiAgICAvLyAgIOKUlOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUmAoKICAgIC8vIHVzaW5nIGxvYWRfdHlwZSA9IHVpbnQzMl90OwoKICAgIC8vIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgY2FjaGVfbGluZV9zaXplID09IDAsICJ0aWxlIGlubmVyIGRpbWVuc2lvbiBzaG91bGQgYmUgZGl2aXNpYmxlIGJ5IGNhY2hlIGxpbmUgc2l6ZSIpOwoKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgc2l6ZW9mKGxvYWRfdHlwZSkgPT0gMCwgInRpbGUgaW5uZXIgZGltZW5zaW9uIGhhcyB0byBiZSBkaXZpc2libGUgYnkgbG9hZCB0eXBlIHNpemUiKTsKICAgIGNvbnN0ZXhwciBpbnQgdG90YWxfbG9hZHMgPSBibG9ja190aWxlX20gKiBibG9ja190aWxlX24gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIHN0YXRpY19hc3NlcnQodG90YWxfbG9hZHMgJSBibG9ja19zaXplID09IDAsICJ0b3RhbCBhbW91bnQgb2YgbG9hZHMgbmVlZHMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBjb25zdGV4cHIgaW50IGxvYWRzX3Blcl9ibG9ja190aWxlX20gPSBibG9ja190aWxlX20gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIGNvbnN0ZXhwciBpbnQgbG9hZHNfcGVyX3RocmVhZCA9IHRvdGFsX2xvYWRzIC8gYmxvY2tfc2l6ZTsKCiAgICBjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgogICAgc2VsZWN0KGNvbXBsZXRlbHlfaW5fYm91bmRzLCBbJl08Ym9vbCBpbl9ib3VuZHM+IHsKICAgICAgICB1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7CiAgICAgICAgICAgIGNvbnN0IGludCByb3cgPSBpICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgY29uc3QgaW50IGNvbCA9IGkgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgZHN0X29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKCiAgICAgICAgICAgIGNvbnN0IGludCBzcmNfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBibG9ja19vZmZfbTsKICAgICAgICAgICAgY29uc3QgaW50IHNyY19jb2wgPSBjb2wgKyBibG9ja19vZmZfbjsKCiAgICAgICAgICAgIC8vIE5vdGU6IE0sIE4sIEsgaXMgZ3VhcmFudGVlZCB0byBiZSBkaXZpc2libGUgYnkgdGhlIGxvYWQKICAgICAgICAgICAgLy8gc2l6ZSwgc28gd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBvdXRlciBib3VuZHMuCiAgICAgICAgICAgIGlmIChpbl9ib3VuZHMgfHwgKG1fYWxpZ25lZCB8fCBzcmNfcm93IDwgbSkgJiYgKG5fYWxpZ25lZCB8fCBzcmNfY29sIDwgbikpIHsKICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGxvYWRfdHlwZSo+KGJsb2NrX3RpbGVfZHN0ICsgZHN0X29mZikgPQogICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGxvYWRfdHlwZSo+KGJsb2NrX3RpbGVfc3JjICsgc3JjX29mZik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxsb2FkX3R5cGUqPihibG9ja190aWxlX2RzdCArIGRzdF9vZmYpID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7Cn0KCnRlbXBsYXRlIDxpbnQgbSwgaW50IG4sIGludCBrPgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmbG9hdCAoJmMpWzRdLAogICAgICAgIGZsb2F0IGEsCiAgICAgICAgZmxvYXQgYgogICAgKSB7CiAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCiAgICAgICAgICAgIGEsCiAgICAgICAgICAgIGIsCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMAogICAgICAgICk7CiAgICAgICAgdW5yb2xsPDAsIDQ+KFsmXTxpbnQgaT4gewogICAgICAgICAgICBjW2ldID0gcmVzdWx0W2ldOwogICAgICAgIH0pOwogICAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPiB7CiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZsb2F0ICgmYylbMTZdLAogICAgICAgIGZsb2F0IGEsCiAgICAgICAgZmxvYXQgYgogICAgKSB7CiAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCiAgICAgICAgICAgIGEsCiAgICAgICAgICAgIGIsCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMngxNj4oYyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAKICAgICAgICApOwogICAgICAgIHVucm9sbDwwLCAxNj4oWyZdPGludCBpPiB7CiAgICAgICAgICAgIGNbaV0gPSByZXN1bHRbaV07CiAgICAgICAgfSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8aW50IG0sIGludCBuLCBpbnQgaz4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGUoCiAgICAgICAgZmxvYXQgKCZjKVs0XSwKICAgICAgICBjb25zdCBmcDggKCZhKVs4XSwKICAgICAgICBjb25zdCBmcDggKCZiKVs4XQogICAgKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCiAgICBjb25zdCBhdXRvIHJlc3VsdCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCgKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PGZwMzJ4ND4oYyksCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAKICAgICk7CiAgICB1bnJvbGw8MCwgND4oWyZdPGludCBpPiB7CiAgICAgICAgY1tpXSA9IHJlc3VsdFtpXTsKICAgIH0pOwojZWxzZQogICAgLy8gRmFsbGJhY2sgc28gd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICAvLyBBcHBhcmVudGx5IHRoZSBsYXlvdXRzIGFyZSBzdWNoIHRoYXQgd2UgY2FuIGp1c3QgZG8gdGhpcy4KICAgIHVucm9sbDwwLCA4PihbJl08aW50IGs+IHsKICAgICAgICBjb25zdCBhdXRvIGFfZjMyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFba10pOwogICAgICAgIGNvbnN0IGF1dG8gYl9mMzIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYltrXSk7CiAgICAgICAgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+OjpleGVjdXRlKGMsIGFfZjMyLCBiX2YzMik7CiAgICB9KTsKI2VuZGlmCiNlbmRpZgogICAgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmbG9hdCAoJmMpWzE2XSwKICAgICAgICBjb25zdCBmcDggKCZhKVs4XSwKICAgICAgICBjb25zdCBmcDggKCZiKVs4XQogICAgKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCiAgICBjb25zdCBhdXRvIHJlc3VsdCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKICAgICAgICBzdGQ6OmJpdF9jYXN0PGZwMzJ4MTY+KGMpLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwCiAgICApOwogICAgdW5yb2xsPDAsIDE2PihbJl08aW50IGk+IHsKICAgICAgICBjW2ldID0gcmVzdWx0W2ldOwogICAgfSk7CiNlbHNlCiAgICAvLyBGYWxsYmFjayBjb3BpZWQgZnJvbSBDSywgdGhpcyB3YXkgd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICB1bnJvbGw8MCwgOD4oWyZdPGludCBrPiB7CiAgICAgICAgY29uc3QgYXV0byBhX2YzMiA9IHN0YXRpY19jYXN0PGZsb2F0PihhW2tdKTsKICAgICAgICBjb25zdCBhdXRvIGJfZjMyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJba10pOwogICAgICAgIG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPjo6ZXhlY3V0ZShjLCBhX2YzMiwgYl9mMzIpOwogICAgfSk7CiNlbmRpZgojZW5kaWYKICAgIH0KfTsKCi8vIFNlZSBDRE5BMyBtYW51YWwsIDcuMS40LjEuIElucHV0IGxheW91dAovLyBUaGUgY2FsY3VsYXRpb25zIGhlcmUgYXJlIG9idGFpbmVkIHZpYSB0aGUKLy8gQU1EIG1hdHJpeCBpbnN0cnVjdGlvbiBjYWxjdWxhdG9yCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ST0NtL2FtZF9tYXRyaXhfaW5zdHJ1Y3Rpb25fY2FsY3VsYXRvcgovLyBUaGVyZSBpcyBhIGNsZWFuZXIgd2F5IHRvIGNvbXB1dGUgdGhlIG1hcHBpbmcsIGJ1dAovLyB0aGlzIGlzIHdoYXQgdGhlIHRvb2wgcmV0dXJucyBhbmQgSSdtIGxhenkuIFdlIG9ubHkKLy8gcmVhbGx5IG5lZWQgdGhlc2UgdHdvIGFueXdheSBmb3Igbm93Lgp0ZW1wbGF0ZSA8dHlwZW5hbWUgbWZtYT4Kc3RydWN0IG1mbWFfaW5kZXhlcjsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MTYsIDE2LCAzMj4+IHsKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICAvLyBOb3RlOiByZWcgaXMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGluCiAgICAgICAgLy8gdGhlIHRocmVhZCdzIHJlZ2lzdGVycy4gVGhlIG1hdHJpeCBpbnN0cnVjdGlvbgogICAgICAgIC8vIGNhbGN1bGF0b3IgY29uc2lkZXJzIHRoZSByZWdpc3RlciB0aGUgVkdSUCwgc28KICAgICAgICAvLyA0IGVsZW1lbnRzLiBBbGwgb2YgdGhlIGVsZW1lbnRzIHNob3VsZCBiZSBwYWNrZWQKICAgICAgICBjb25zdCBpbnQgbSA9IGxhbmUgJSAxNjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICByZXR1cm4ge20sIGt9OwogICAgfQoKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICBjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICByZXR1cm4ge24sIGt9OwogICAgfQoKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiByZWdfdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCByZWcpIHsKICAgICAgICBjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIHJlZzsKICAgICAgICBjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKICAgICAgICByZXR1cm4ge20sIG59OwogICAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfaW5kZXhlcjxtZm1hX2YzMl9mOF9mODwzMiwgMzIsIDE2Pj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIC8vIE5vdGU6IHJlZyBpcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4KICAgICAgICAvLyB0aGUgdGhyZWFkJ3MgcmVnaXN0ZXJzLiBUaGUgbWF0cml4IGluc3RydWN0aW9uCiAgICAgICAgLy8gY2FsY3VsYXRvciBjb25zaWRlcnMgdGhlIHJlZ2lzdGVyIHRoZSBWR1JQLCBzbwogICAgICAgIC8vIDQgZWxlbWVudHMuIEFsbCBvZiB0aGUgZWxlbWVudHMgc2hvdWxkIGJlIHBhY2tlZAogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDMyOwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgcmVnOwogICAgICAgIHJldHVybiB7bSwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIGNvbnN0IGludCBuID0gbGFuZSAlIDMyOwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgcmVnOwogICAgICAgIHJldHVybiB7biwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYyhpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIGNvbnN0IGludCBuID0gOCAqIChyZWcgLyA0KSAlIDMyICsgNCAqIChsYW5lIC8gMzIpICsgKHJlZyAlIDQpOwogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDMyOwogICAgICAgIHJldHVybiB7biwgbX07CiAgICB9Cn07Cgp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KY29uc3RleHByIGF1dG8gZGl2aWRlX2V4YWN0KCkgewogICAgc3RhdGljX2Fzc2VydChhICUgYiA9PSAwLCAiZG9lcyBub3QgZGl2aWRlIGV4YWN0ISIpOwogICAgcmV0dXJuIGEgLyBiOwp9Cgp0ZW1wbGF0ZSA8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGN1YmUgYmxvY2tfdGlsZSwKICAgIGN1YmUgd2FycF90aWxlLAogICAgdHlwZW5hbWUgbG9hZF90eXBlLAogICAgYm9vbCBtX2FsaWduZWQgPSBmYWxzZSwKICAgIGJvb2wgbl9hbGlnbmVkID0gZmFsc2UsCiAgICBib29sIGtfYWxpZ25lZCA9IGZhbHNlCj4KX19nbG9iYWxfXyBfX2xhdW5jaF9ib3VuZHNfXyhibG9ja19zaXplKQp2b2lkIGtlcm5lbCgKICAgIGNvbnN0IGZwOCogYSwKICAgIGNvbnN0IGZwOCogYiwKICAgIGNvbnN0IGZwMzIqIGFzLAogICAgY29uc3QgZnAzMiogYnMsCiAgICBiZjE2KiBjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBrCikgewogICAgY29uc3RleHByIGludCB3YXJwcyA9IGJsb2NrX3NpemUgLyB3YXJwX3NpemU7CgogICAgY29uc3RleHByIGludCBibG9ja190aWxlX20gPSBibG9ja190aWxlLm07CiAgICBjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbiA9IGJsb2NrX3RpbGUubjsKICAgIGNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX20gPSB3YXJwX3RpbGUubTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGUubjsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX2sgPSB3YXJwX3RpbGUuazsKCiAgICB1c2luZyBtZm1hID0gbWZtYV9mMzJfZjhfZjg8d2FycF90aWxlX20sIHdhcnBfdGlsZV9uLCB3YXJwX3RpbGVfaz47CiAgICB1c2luZyBpbmRleGVyID0gbWZtYV9pbmRleGVyPG1mbWE+OwoKICAgIGNvbnN0ZXhwciBpbnQgY190b3RhbCA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbjsKCiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9iKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSB3YXJwX3RpbGVfbSA9PSAwLCAid2FycCB0aWxlIE0gaGFzIHRvIGRpdmlkZSBibG9jayB0aWxlIE0iKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbiA9IGJsb2NrX3RpbGVfbiAvIHdhcnBfdGlsZV9uOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVzX2sgPSBibG9ja190aWxlX2sgLyB3YXJwX3RpbGVfazsKCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW4gPSB3YXJwX3RpbGVzX20gKiB3YXJwX3RpbGVzX247CgogICAgLy8gbnVtYmVyIG9mIHdhcnAgdGlsZXMgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHdhcnBzCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tbiwgd2FycHM+KCk7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIC8vIHNpemUod2FycF90aWxlX21uKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSB3YXJwIHNpemUKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX21uX2lwdCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVfbW5faXRlbXMsIHdhcnBfc2l6ZT4oKTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX21rX2lwdCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9rLCB3YXJwX3NpemU+KCk7CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZV9ua19pcHQgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlX24gKiB3YXJwX3RpbGVfaywgd2FycF9zaXplPigpOwoKICAgIGNvbnN0ZXhwciBpbnQgY19wZXJfdGhyZWFkID0gY190b3RhbCAvIGJsb2NrX3NpemU7CiAgICBzdGF0aWNfYXNzZXJ0KGNfcGVyX3RocmVhZCA9PSB3YXJwX3RpbGVzX21uX3Blcl93YXJwICogd2FycF90aWxlX21uX2lwdCwgInNhbml0eSBjaGVjayIpOwoKICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICBjb25zdCBpbnQgd2FycCA9IHRpZCAvIHdhcnBfc2l6ZTsKICAgIGNvbnN0IGludCBsYW5lID0gX19sYW5lX2lkKCk7CgogICAgLy8gU3dhcCBkaXJlY3Rpb24gdG8gbWFrZSBib3VuZHMgY2hlY2tpbmcgYmUgZmlyc3QKICAgIGNvbnN0IGludCB0aV9tID0gZ3JpZERpbS54IC0gYmxvY2tJZHgueCAtIDE7CiAgICBjb25zdCBpbnQgdGlfbiA9IGdyaWREaW0ueSAtIGJsb2NrSWR4LnkgLSAxOwoKICAgIGludCBzbiA9IGNlaWxfZGl2KG4sIDEyOCk7CgogICAgZmxvYXQgY19yZWdzW3dhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiB3YXJwX3RpbGVfbW5faXB0XTsKICAgIGNsZWFyKGNfcmVncyk7CgogICAgX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfa107CiAgICBfX3NoYXJlZF9fIGZwOCBibG9ja190aWxlX2JbYmxvY2tfdGlsZV9uICogYmxvY2tfdGlsZV9rXTsKCiAgICBjb25zdCBhdXRvIGxvYWRfaW5wdXQgPSBbJl08Ym9vbCBjaGVja19ib3VuZHNfaz4oaW50IGkpIHsKICAgICAgICBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXI8CiAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgIGJsb2NrX3RpbGVfbSwKICAgICAgICAgICAgYmxvY2tfdGlsZV9rLAogICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgIG1fYWxpZ25lZCwKICAgICAgICAgICAga19hbGlnbmVkICYmICFjaGVja19ib3VuZHNfawogICAgICAgID4oCiAgICAgICAgICAgIGJsb2NrX3RpbGVfYSwgYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaQogICAgICAgICk7CiAgICAgICAgYmxvY2tfdGlsZV9sb2FkX2Zhc3RfbGluZWFyPAogICAgICAgICAgICBibG9ja19zaXplLAogICAgICAgICAgICBibG9ja190aWxlX24sCiAgICAgICAgICAgIGJsb2NrX3RpbGVfaywKICAgICAgICAgICAgbG9hZF90eXBlLAogICAgICAgICAgICBuX2FsaWduZWQsCiAgICAgICAgICAgIGtfYWxpZ25lZCAmJiAhY2hlY2tfYm91bmRzX2sKICAgICAgICA+KAogICAgICAgICAgICBibG9ja190aWxlX2IsIGIsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkKICAgICAgICApOwogICAgfTsKCiAgICBjb25zdCBhdXRvIG1tYSA9IFsmXShpbnQgaSkgewogICAgICAgIHVucm9sbDFkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnA+KFsmXTxpbnQgaXd0aT4gewogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgd3RuID0gd3RpIC8gd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgZmxhdF93dF9iYXNlID0gaXd0aSAqIHdhcnBfdGlsZV9tbl9pcHQ7CgogICAgICAgICAgICBmbG9hdCB3YXJwX2ZyZ19jW3dhcnBfdGlsZV9tbl9pcHRdOwogICAgICAgICAgICBjbGVhcih3YXJwX2ZyZ19jKTsKCiAgICAgICAgICAgIHVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CiAgICAgICAgICAgICAgICAvLyBMb2FkIGZyYWdtZW50IEEKICAgICAgICAgICAgICAgIGZwOCBmcmdfYVt3YXJwX3RpbGVfbWtfaXB0XTsKICAgICAgICAgICAgICAgIHVucm9sbDwwLCB3YXJwX3RpbGVfbWtfaXB0PihbJl08aW50IG1rX3JlZz4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaWtdID0gaW5kZXhlcjo6cmVnX3RvX21hdHJpeF9hKGxhbmUsIG1rX3JlZyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpbSA9IHd0bSAqIHdhcnBfdGlsZV9tICsgbWZtYV9pbTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmlrID0gd3RrX2Jhc2UgKyBtZm1hX2lrOwogICAgICAgICAgICAgICAgICAgIGZyZ19hW21rX3JlZ10gPSBibG9ja190aWxlX2FbYmlrICogYmxvY2tfdGlsZV9tICsgYmltXTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIExvYWQgZnJhZ21lbnQgQgogICAgICAgICAgICAgICAgZnA4IGZyZ19iW3dhcnBfdGlsZV9ua19pcHRdOwogICAgICAgICAgICAgICAgdW5yb2xsPDAsIHdhcnBfdGlsZV9ua19pcHQ+KFsmXTxpbnQgbmtfcmVnPiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbiwgbWZtYV9pa10gPSBpbmRleGVyOjpyZWdfdG9fbWF0cml4X2IobGFuZSwgbmtfcmVnKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CiAgICAgICAgICAgICAgICAgICAgZnJnX2JbbmtfcmVnXSA9IGJsb2NrX3RpbGVfYltiaWsgKiBibG9ja190aWxlX24gKyBiaW5dOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gTm93IHBlcmZvcm0gdGhlIE1GTUEgYmFzZWQgb24gdGhlIHdhcnAgdGlsZSBzaXplLgogICAgICAgICAgICAgICAgbWZtYTo6ZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICB3YXJwX2ZyZ19jLAogICAgICAgICAgICAgICAgICAgIGZyZ19hLAogICAgICAgICAgICAgICAgICAgIGZyZ19iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHVucm9sbDwwLCB3YXJwX3RpbGVfbW5faXB0PihbJl08aW50IG1uX3JlZz4gewogICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjpyZWdfdG9fbWF0cml4X2MobGFuZSwgbW5fcmVnKTsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CiAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwogICAgICAgICAgICAgICAgY29uc3QgaW50IGltID0gdGlfbSAqIGJsb2NrX3RpbGVfbSArIGJpbTsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbiA9IHRpX24gKiBibG9ja190aWxlX24gKyBiaW47CgogICAgICAgICAgICAgICAgY19yZWdzW2ZsYXRfd3RfYmFzZSArIG1uX3JlZ10gKz0gd2FycF9mcmdfY1ttbl9yZWddICogYXNbaSAvIDEyOCAqIG0gKyBpbV0gKiBic1tpIC8gMTI4ICogc24gKyBpbiAvIDEyOF07CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7IGkgKz0gYmxvY2tfdGlsZV9rKSB7CiAgICAgICAgbG9hZF9pbnB1dC50ZW1wbGF0ZSBvcGVyYXRvcigpPHRydWU+KGkpOwogICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICBtbWEoaSk7CiAgICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgfQoKICAgIC8vIFdyaXRlIG91dCBDCiAgICAvLyBUaGlzIHNob3VsZCBhY2Nlc3MgdGlsZSBDIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSBtYXRtdWwgbG9vcCEKCiAgICBjb25zdCBpbnQgaW1fYmFzZSA9IHRpX20gKiBibG9ja190aWxlX207CiAgICBjb25zdCBpbnQgaW5fYmFzZSA9IHRpX24gKiBibG9ja190aWxlX247CgogICAgY29uc3QgYm9vbCBjX2luX2JvdW5kcyA9CiAgICAgICAgKG1fYWxpZ25lZCB8fCBtICUgYmxvY2tfdGlsZV9tID09IDAgfHwgaW1fYmFzZSArIGJsb2NrX3RpbGVfbSA8PSBtKSAmJgogICAgICAgIChuX2FsaWduZWQgfHwgbiAlIGJsb2NrX3RpbGVfbiA9PSAwIHx8IGluX2Jhc2UgKyBibG9ja190aWxlX24gPD0gbik7CgogICAgc2VsZWN0KGNfaW5fYm91bmRzLCBbJl08Ym9vbCBjX2luX2JvdW5kcz4gewogICAgICAgIHVucm9sbDJkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsIHdhcnBfdGlsZV9tbl9pcHQ+KFsmXTxpbnQgaXd0aSwgaW50IG1uX3JlZz4gewogICAgICAgICAgICBjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2luXSA9IGluZGV4ZXI6OnJlZ190b19tYXRyaXhfYyhsYW5lLCBtbl9yZWcpOwoKICAgICAgICAgICAgY29uc3QgaW50IHd0aSA9IHdhcnAgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aTsKICAgICAgICAgICAgY29uc3QgaW50IHd0bSA9IHd0aSAlIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IHd0biA9IHd0aSAvIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IGZsYXRfd3RfYmFzZSA9IGl3dGkgKiB3YXJwX3RpbGVfbW5faXB0OwoKICAgICAgICAgICAgY29uc3QgaW50IGJpbSA9IHd0bSAqIHdhcnBfdGlsZV9tICsgbWZtYV9pbTsKICAgICAgICAgICAgY29uc3QgaW50IGJpbiA9IHd0biAqIHdhcnBfdGlsZV9uICsgbWZtYV9pbjsKCiAgICAgICAgICAgIGNvbnN0IGludCBpbSA9IGltX2Jhc2UgKyBiaW07CiAgICAgICAgICAgIGNvbnN0IGludCBpbiA9IGluX2Jhc2UgKyBiaW47CgogICAgICAgICAgICBjb25zdCBhdXRvIHZhbCA9IGJmMTZfZnJvbV9mcDMyKGNfcmVnc1tmbGF0X3d0X2Jhc2UgKyBtbl9yZWddKTsKCiAgICAgICAgICAgIGlmIChjX2luX2JvdW5kcyB8fCBpbSA8IG0gJiYgaW4gPCBuKSB7CiAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbm9udGVtcG9yYWxfc3RvcmUoc3RkOjpiaXRfY2FzdDx1aW50MTZfdD4odmFsKSwgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KCZjW2ltICogbiArIGluXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGU8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGN1YmUgYmxvY2tfdGlsZSwKICAgIGN1YmUgd2FycF90aWxlLAogICAgdHlwZW5hbWUgbG9hZF90eXBlID0gdWludDMyX3QKPgp2b2lkIHJ1bl9rZXJuZWwoCiAgICBjb25zdCBmcDgqIGEsCiAgICBjb25zdCBmcDgqIGIsCiAgICBjb25zdCBmcDMyKiBhcywKICAgIGNvbnN0IGZwMzIqIGJzLAogICAgYmYxNiogYywKICAgIGludCBtLAogICAgaW50IG4sCiAgICBpbnQgaywKICAgIGJvb2wgbWVhc3VyZQopIHsKICAgIGNvbnN0IGludCBncmlkX20gPSBjZWlsX2RpdihtLCBibG9ja190aWxlLm0pOwogICAgY29uc3QgaW50IGdyaWRfbiA9IGNlaWxfZGl2KG4sIGJsb2NrX3RpbGUubik7CgogICAgaGlwRXZlbnRfdCBzdGFydCwgc3RvcDsKICAgIGlmIChtZWFzdXJlKSB7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50Q3JlYXRlKCZzdGFydCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudENyZWF0ZSgmc3RvcCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudFJlY29yZChzdGFydCwgMCkpOwogICAgfQoKICAgIC8vIHNlbGVjdChtICUgYmxvY2tfdGlsZS5tID09IDAsIFsmXTxib29sIG1fYWxpZ25lZD4gewogICAgLy8gICAgIHNlbGVjdChuICUgYmxvY2tfdGlsZS5uID09IDAsIFsmXTxib29sIG5fYWxpZ25lZD4gewogICAgLy8gICAgICAgICBzZWxlY3QoayAlIGJsb2NrX3RpbGUuayA9PSAwLCBbJl08Ym9vbCBrX2FsaWduZWQ+IHsKICAgICAgICAgICAgICAgIGtlcm5lbDwKICAgICAgICAgICAgICAgICAgICBibG9ja19zaXplLAogICAgICAgICAgICAgICAgICAgIGJsb2NrX3RpbGUsCiAgICAgICAgICAgICAgICAgICAgd2FycF90aWxlLAogICAgICAgICAgICAgICAgICAgIGxvYWRfdHlwZSwKICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gbV9hbGlnbmVkLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBuX2FsaWduZWQsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UgIC8vIGtfYWxpZ25lZAogICAgICAgICAgICAgICAgPjw8PAogICAgICAgICAgICAgICAgICAgIGRpbTMoZ3JpZF9tLCBncmlkX24pLAogICAgICAgICAgICAgICAgICAgIGRpbTMoYmxvY2tfc2l6ZSksCiAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgPj4+KAogICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgICAgICBhcywKICAgICAgICAgICAgICAgICAgICBicywKICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgIG0sCiAgICAgICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgICAgICBrCiAgICAgICAgICAgICAgICApOwogICAgLy8gICAgICAgICB9KTsKICAgIC8vICAgICB9KTsKICAgIC8vIH0pOwoKICAgIEhJUF9DSEVDSyhoaXBHZXRMYXN0RXJyb3IoKSk7CgogICAgaWYgKG1lYXN1cmUpIHsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRSZWNvcmQoc3RvcCwgMCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBEZXZpY2VTeW5jaHJvbml6ZSgpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRTeW5jaHJvbml6ZShzdG9wKSk7CgogICAgICAgIGZsb2F0IG1zID0gMDsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRFbGFwc2VkVGltZSgmbXMsIHN0YXJ0LCBzdG9wKSk7CiAgICAgICAgY29uc3QgZG91YmxlIHRpbWUgPSBtcyAvIDEnMDAwLjA7CgogICAgICAgIGNvbnN0IGRvdWJsZSBtZW1vcnkgPSBtICogayAqIHNpemVvZihmcDgpICsgbiAqIGsgKiBzaXplb2YoZnA4KSArIG0gKiBuICogc2l6ZW9mKGJmMTYpOwogICAgICAgIGNvbnN0IGRvdWJsZSBvcHMgPQogICAgICAgICAgICBkb3VibGUobSkgKiBuICogayAqIDIgLy8gTXVsdGlwbHkgKyBhZGQgZm9yIGVhY2ggcGFpcgogICAgICAgICAgICArIChkb3VibGUobSkgKiBuICogMikgKiBjZWlsX2RpdihrLCB3YXJwX3RpbGUuayk7IC8vIHNjYWxpbmcKCiAgICAgICAgY29uc3QgZG91YmxlIG1lbW9yeV90cHV0ID0gbWVtb3J5IC8gdGltZSAvICgxMDAwLjAgKiAxMDAwICogMTAwMCk7CiAgICAgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfdHB1dCA9IG9wcyAvIHRpbWUgLyAoMTAwMC4wICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKCiAgICAgICAgc3RkOjpjZXJyCiAgICAgICAgICAgIDw8IHN0ZDo6Zml4ZWQKICAgICAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikKICAgICAgICAgICAgPDwgIigiIDw8IG0gPDwgIiAiIDw8IG4gPDwgIiAiIDw8IGsgPDwgIikgIgogICAgICAgICAgICA8PCAiKCIgPDwgYmxvY2tfdGlsZS5tIDw8ICIgIiA8PCBibG9ja190aWxlLm4gPDwgIiAiIDw8IGJsb2NrX3RpbGUuayA8PCAiKSAiCiAgICAgICAgICAgIDw8ICIoIiA8PCB3YXJwX3RpbGUubSA8PCAiICIgPDwgd2FycF90aWxlLm4gPDwgIiAiIDw8IHdhcnBfdGlsZS5rIDw8ICIpICIKICAgICAgICAgICAgPDwgYmxvY2tfc2l6ZSA8PCAiOiAiCiAgICAgICAgICAgIDw8IG1zIDw8ICIgbXMgIgogICAgICAgICAgICA8PCAodGltZSAqIDEnMDAwJzAwMCkgPDwgIiB1cyAiCiAgICAgICAgICAgIDw8IG1lbW9yeV90cHV0IDw8ICIgR0IvcyAiCiAgICAgICAgICAgIDw8IGNvbXB1dGVfdHB1dCA8PCAiIFRGTE9QUyIKICAgICAgICAgICAgPDwgc3RkOjplbmRsOwoKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnREZXN0cm95KHN0YXJ0KSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50RGVzdHJveShzdG9wKSk7CiAgICB9Cgp9Cgp2b2lkIHJ1bigKICAgIHVpbnRwdHJfdCBhX3B0ciwKICAgIHVpbnRwdHJfdCBiX3B0ciwKICAgIHVpbnRwdHJfdCBhc19wdHIsCiAgICB1aW50cHRyX3QgYnNfcHRyLAogICAgdWludHB0cl90IGNfcHRyLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBrLAogICAgYm9vbCBtZWFzdXJlCikgewogICAgLy8gSW4gdGhlIGtlcm5lbHMgd2UgYXNzdW1lIDEyOC1iaXQgYWxpZ25tZW50LgogICAgYXNzZXJ0KGFfcHRyICUgMTYgPT0gMCk7CiAgICBhc3NlcnQoYl9wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChhc19wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChic19wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChjX3B0ciAlIDE2ID09IDApOwoKICAgIGNvbnN0IGF1dG8qIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGFfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGJfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGFzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDMyKj4oYXNfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGJzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDMyKj4oYnNfcHRyKTsKICAgIGF1dG8qIGMgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihjX3B0cik7CgogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDh9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDR9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDJ9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCA2NH0sIGN1YmV7MiwgMiwgNH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDY0fSwgY3ViZXsyLCAyLCAyfT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezMyLCAzMiwgMzJ9LCBjdWJlezIsIDIsIDJ9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwoKICAgIC8vIHJ1bl9rZXJuZWw8MTI4LCBjdWJlezMyLCAzMiwgMTI4fSwgY3ViZXsyLCAyLCA4fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MTI4LCBjdWJlezMyLCAzMiwgMTI4fSwgY3ViZXs0LCAyLCA4fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MTI4LCBjdWJlezMyLCAzMiwgMTI4fSwgY3ViZXsyLCA0LCA4fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MTI4LCBjdWJlezMyLCAzMiwgMTI4fSwgY3ViZXsyLCAyLCAxNn0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCA2NH0sIGN1YmV7NCwgNCwgNH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXs0LCA0LCA0fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezQsIDQsIDR9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7OCwgOCwgOH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCA2NH0sIGN1YmV7MTYsIDE2LCAzMn0sIF9fdWludDEyOF90PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIF9fdWludDEyOF90PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIF9fdWludDEyOF90PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIF9fdWludDEyOF90PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CgpQWUJJTkQxMV9NT0RVTEUoZnA4LCBtKSB7CiAgbS5kZWYoImZwOCIsICZydW4sICJISVAga2VybmVsIik7Cn0KIiIiCgpoaXBfbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDgiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz0oWyItc2F2ZS10ZW1wcyJdIGlmIFRFU1RJTkcgZWxzZSBbXSkgKyBbIi1zdGQ9YysrMjAiXSwKICAgIGJ1aWxkX2RpcmVjdG9yeT0iL2dwdW1vZGUvYW1kL2ZwOC9idWlsZC8iIGlmIFRFU1RJTkcgZWxzZSBOb25lLAogICAgbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgpmaXJzdCA9IFRydWUKCmNhY2hlX20gPSAwCmNhY2hlX24gPSAwCmNhY2hlX2sgPSAwCmNhY2hlX2kgPSAwCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgZ2xvYmFsIGNhY2hlX20KICAgIGdsb2JhbCBjYWNoZV9uCiAgICBnbG9iYWwgY2FjaGVfawogICAgZ2xvYmFsIGNhY2hlX2kKCiAgICBpZiBjYWNoZV9tICE9IG0gb3IgY2FjaGVfbiAhPSBuIG9yIGNhY2hlX2sgIT0gazoKICAgICAgICBjYWNoZV9tID0gbQogICAgICAgIGNhY2hlX24gPSBuCiAgICAgICAgY2FjaGVfayA9IGsKICAgICAgICBjYWNoZV9pID0gMAogICAgZWxzZToKICAgICAgICBjYWNoZV9pICs9IDEKCiAgICAjIERvbid0IGNoZWNrIHRoZSBwZXJmb3JtYW5jZSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHRvIGFsbG93IGZvciBzb21lIHdhcm11cAogICAgbWVhc3VyZSA9IEZhbHNlCiAgICBpZiBjYWNoZV9pID09IDE6CiAgICAgICAgbWVhc3VyZSA9IEZhbHNlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMK
No newline at end of file

Best evidence level for this revision: reported

JSON