submission 31152
KernelBot user 7 · 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.
amd-mla-submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-31152?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesbf16
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:c545675562d439d7a3fdecf6402438a02b851374b16cff40f34c565665d87cb8
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
amd-mla-submission.py1 lines
aW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KDQpDUFBfV1JBUFBFUiA9ICIiIg0Kdm9pZCBtbGFfZGVjb2RlKHRvcmNoOjpUZW5zb3IgeCwgdG9yY2g6OlRlbnNvciB5LCBpbnQgcG9zLCBpbnQgeG9mZiwgaW50IHlvZmYsDQogICAgICAgICAgICAgICAgaW50IGQwLCBpbnQgZDEsIGludCBkMiwgaW50IHhzMSwgaW50IHhzMiwgaW50IHlzMSwgaW50IHlzMik7DQp2b2lkIGRpdl9zb2Z0bWF4KHRvcmNoOjpUZW5zb3IgcWssIGludCBicywgaW50IG5oLCBpbnQgc2wsIGludCBkbm9wZSwgaW50IGRyb3BlKTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPg0KDQpfX2dsb2JhbF9fIHZvaWQgcm9wZV8zZF9rZXJuZWwoaW50IGQwLCBpbnQgZDEsIGludCBkMiwgaW50IHhzMSwgaW50IHhzMiwgaW50IHlzMSwgaW50IHlzMiwgaW50IHBvcywNCiAgICAgICAgY29uc3QgX19oaXBfYmZsb2F0MTYgKngsIF9faGlwX2JmbG9hdDE2ICp5KSB7DQogICAgaW50IGQwX2lkeCA9IGJsb2NrSWR4Lng7DQogICAgaW50IGQxX2lkeCA9IGJsb2NrSWR4Lnk7DQogICAgX19oaXBfYmZsb2F0MTYgaWR4ID0gX19oYWRkKChfX2hpcF9iZmxvYXQxNilwb3MsIF9faGlwX2JmbG9hdDE2KGQxX2lkeCkpOw0KICAgIGZvciAoaW50IGQyX2lkeCA9IHRocmVhZElkeC54OyBkMl9pZHggPCBkMi8yOyBkMl9pZHggKz0gYmxvY2tEaW0ueCkgew0KICAgICAgICBmbG9hdCB4MSA9IChmbG9hdCl4W2QwX2lkeCAqIHhzMSArIGQxX2lkeCAqIHhzMiArIGQyX2lkeF07DQogICAgICAgIGZsb2F0IHgyID0gKGZsb2F0KXhbZDBfaWR4ICogeHMxICsgZDFfaWR4ICogeHMyICsgZDJfaWR4ICsgZDIvMl07DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHRoZXRhID0gKF9faGlwX2JmbG9hdDE2KWQyX2lkeDsNCiAgICAgICAgdGhldGEgPSBfX2htdWwodGhldGEsIChfX2hpcF9iZmxvYXQxNikoLTIuMGYpKTsNCiAgICAgICAgdGhldGEgPSBfX2hkaXYodGhldGEsIChfX2hpcF9iZmxvYXQxNilkMik7DQogICAgICAgIHRoZXRhID0gX19wb3dmKChfX2hpcF9iZmxvYXQxNikxMDAwMC4wZiwgdGhldGEpOw0KICAgICAgICB0aGV0YSA9IF9faG11bCh0aGV0YSwgKF9faGlwX2JmbG9hdDE2KWlkeCk7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IGNvcyA9IGNvc2YoKGZsb2F0KXRoZXRhKTsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgc2luID0gc2luZigoZmxvYXQpdGhldGEpOw0KICAgICAgICB5W2QwX2lkeCAqIHlzMSArIGQxX2lkeCAqIHlzMiArIGQyX2lkeCAgICAgICBdID0gX19oc3ViKF9faG11bCh4MSwgY29zKSwgX19obXVsKHgyLCBzaW4pKTsNCiAgICAgICAgeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggKyBkMi8yXSA9IF9faGFkZChfX2htdWwoeDIsIGNvcyksIF9faG11bCh4MSwgc2luKSk7DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcm9wZV8zZF9rZXJuZWxfZDBhbGlnbmVkMihpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyLCBpbnQgcG9zLA0KICAgICAgICBjb25zdCBfX2hpcF9iZmxvYXQxNiAqeCwgX19oaXBfYmZsb2F0MTYgKnkpIHsNCiAgICBpbnQgZDBfaWR4ID0gYmxvY2tJZHgueCAqIDIgKyB0aHJlYWRJZHgueCAvIDMyOw0KICAgIGludCBkMV9pZHggPSBibG9ja0lkeC55Ow0KICAgIF9faGlwX2JmbG9hdDE2IGlkeCA9IF9faGFkZCgoX19oaXBfYmZsb2F0MTYpcG9zLCBfX2hpcF9iZmxvYXQxNihkMV9pZHgpKTsNCiAgICBmb3IgKGludCBkMl9pZHggPSB0aHJlYWRJZHgueCAlIDMyOyBkMl9pZHggPCBkMi8yOyBkMl9pZHggKz0gMzIpIHsNCiAgICAgICAgZmxvYXQgeDEgPSAoZmxvYXQpeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHhdOw0KICAgICAgICBmbG9hdCB4MiA9IChmbG9hdCl4W2QwX2lkeCAqIHhzMSArIGQxX2lkeCAqIHhzMiArIGQyX2lkeCArIGQyLzJdOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB0aGV0YSA9IChfX2hpcF9iZmxvYXQxNilkMl9pZHg7DQogICAgICAgIHRoZXRhID0gX19obXVsKHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpKC0yLjBmKSk7DQogICAgICAgIHRoZXRhID0gX19oZGl2KHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpZDIpOw0KICAgICAgICB0aGV0YSA9IF9fcG93ZigoX19oaXBfYmZsb2F0MTYpMTAwMDAuMGYsIHRoZXRhKTsNCiAgICAgICAgdGhldGEgPSBfX2htdWwodGhldGEsIChfX2hpcF9iZmxvYXQxNilpZHgpOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiBjb3MgPSBjb3NmKChmbG9hdCl0aGV0YSk7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHNpbiA9IHNpbmYoKGZsb2F0KXRoZXRhKTsNCiAgICAgICAgeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggICAgICAgXSA9IF9faHN1YihfX2htdWwoeDEsIGNvcyksIF9faG11bCh4Miwgc2luKSk7DQogICAgICAgIHlbZDBfaWR4ICogeXMxICsgZDFfaWR4ICogeXMyICsgZDJfaWR4ICsgZDIvMl0gPSBfX2hhZGQoX19obXVsKHgyLCBjb3MpLCBfX2htdWwoeDEsIHNpbikpOw0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHJvcGVfM2Rfa2VybmVsX2QwYWxpZ25lZDE2X2QyaXM2NChpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyLCBpbnQgcG9zLA0KICAgICAgICBjb25zdCBfX2hpcF9iZmxvYXQxNiAqeCwgX19oaXBfYmZsb2F0MTYgKnkpIHsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpbnQgZDBfaWR4ID0gYmxvY2tJZHgueCAqIDE2ICsgdGhyZWFkSWR4LnggLyA0Ow0KICAgIGludCBkMV9pZHggPSBibG9ja0lkeC55Ow0KICAgIGludCBkMl9pZHggPSAodGhyZWFkSWR4LnggJSA0KSAqIDg7DQogICAgX19oaXBfYmZsb2F0MTYgeDFbOF0sIHgyWzhdOw0KICAgICooZmxvYXQ0ICopJngxWzBdID0gKihmbG9hdDQgKikmeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHhdOw0KICAgICooZmxvYXQ0ICopJngyWzBdID0gKihmbG9hdDQgKikmeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHggKyBkMi8yXTsNCiAgICBfX2hpcF9iZmxvYXQxNiBpZHggPSBfX2hhZGQoKF9faGlwX2JmbG9hdDE2KXBvcywgX19oaXBfYmZsb2F0MTYoZDFfaWR4KSk7DQogICAgX19oaXBfYmZsb2F0MTYgeTFbOF0sIHkyWzhdOw0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgdGhldGEgPSAoX19oaXBfYmZsb2F0MTYpKGQyX2lkeCArIGkpOw0KICAgICAgICB0aGV0YSA9IF9faG11bCh0aGV0YSwgKF9faGlwX2JmbG9hdDE2KSgtMi4wZikpOw0KICAgICAgICB0aGV0YSA9IF9faGRpdih0aGV0YSwgKF9faGlwX2JmbG9hdDE2KWQyKTsNCiAgICAgICAgdGhldGEgPSBfX3Bvd2YoKF9faGlwX2JmbG9hdDE2KTEwMDAwLjBmLCB0aGV0YSk7DQogICAgICAgIHRoZXRhID0gX19obXVsKHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpaWR4KTsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgY29zID0gY29zZigoZmxvYXQpdGhldGEpOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiBzaW4gPSBzaW5mKChmbG9hdCl0aGV0YSk7DQogICAgICAgIHkxW2ldID0gX19oc3ViKF9faG11bCh4MVtpXSwgY29zKSwgX19obXVsKHgyW2ldLCBzaW4pKTsNCiAgICAgICAgeTJbaV0gPSBfX2hhZGQoX19obXVsKHgyW2ldLCBjb3MpLCBfX2htdWwoeDFbaV0sIHNpbikpOw0KICAgIH0NCiAgICAqKGZsb2F0NCAqKSZ5W2QwX2lkeCAqIHlzMSArIGQxX2lkeCAqIHlzMiArIGQyX2lkeCAgICAgICBdID0gKihmbG9hdDQgKikmeTFbMF07DQogICAgKihmbG9hdDQgKikmeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggKyBkMi8yXSA9ICooZmxvYXQ0ICopJnkyWzBdOw0KfQ0KDQovLyByb3BlXzNkX2tlcm5lbF9kMGlzMTI4X2QyaXM2NDw8PGRpbTMoZDEpLCBkaW0zKDY0KT4+PihkMCwgZDEsIGQyLCB4czEsIHhzMiwgeXMxLCB5czIsIHBvcywgeF9wdHIsIHlfcHRyKTsNCl9fZ2xvYmFsX18gdm9pZCByb3BlXzNkX2tlcm5lbF9kMGlzMTI4X2QyaXM2NChpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyLCBpbnQgcG9zLA0KICAgICAgICBjb25zdCBfX2hpcF9iZmxvYXQxNiAqeCwgX19oaXBfYmZsb2F0MTYgKnkpIHsNCg0KICAgIGludCBkMV9pZHggPSBibG9ja0lkeC54Ow0KICAgIGludCBkMl9pZHggPSAodGhyZWFkSWR4LnggJSAzMik7DQogICAgX19oaXBfYmZsb2F0MTYgaWR4ID0gX19oYWRkKChfX2hpcF9iZmxvYXQxNilwb3MsIF9faGlwX2JmbG9hdDE2KGQxX2lkeCkpOw0KICAgIF9faGlwX2JmbG9hdDE2IHRoZXRhID0gKF9faGlwX2JmbG9hdDE2KWQyX2lkeDsNCiAgICB0aGV0YSA9IF9faG11bCh0aGV0YSwgKF9faGlwX2JmbG9hdDE2KSgtMi4wZikpOw0KICAgIHRoZXRhID0gX19oZGl2KHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpZDIpOw0KICAgIHRoZXRhID0gX19wb3dmKChfX2hpcF9iZmxvYXQxNikxMDAwMC4wZiwgdGhldGEpOw0KICAgIHRoZXRhID0gX19obXVsKHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpaWR4KTsNCiAgICBfX2hpcF9iZmxvYXQxNiBjb3MgPSBjb3NmKChmbG9hdCl0aGV0YSk7DQogICAgX19oaXBfYmZsb2F0MTYgc2luID0gc2luZigoZmxvYXQpdGhldGEpOw0KDQogICAgZm9yIChpbnQgZDBfaWR4ID0gdGhyZWFkSWR4LnggLyAzMjsgZDBfaWR4IDwgMTI4OyBkMF9pZHggKz0gMikgew0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB4MSA9IHhbZDBfaWR4ICogeHMxICsgZDFfaWR4ICogeHMyICsgZDJfaWR4XTsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgeDIgPSB4W2QwX2lkeCAqIHhzMSArIGQxX2lkeCAqIHhzMiArIGQyX2lkeCArIGQyLzJdOw0KICAgICAgICB5W2QwX2lkeCAqIHlzMSArIGQxX2lkeCAqIHlzMiArIGQyX2lkeCAgICAgICBdID0gX19oc3ViKF9faG11bCh4MSwgY29zKSwgX19obXVsKHgyLCBzaW4pKTsNCiAgICAgICAgeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggKyBkMi8yXSA9IF9faGFkZChfX2htdWwoeDIsIGNvcyksIF9faG11bCh4MSwgc2luKSk7DQogICAgfQ0KfQ0KDQp2b2lkIG1sYV9kZWNvZGUodG9yY2g6OlRlbnNvciB4LCB0b3JjaDo6VGVuc29yIHksIGludCBwb3MsIGludCB4b2ZmLCBpbnQgeW9mZiwNCiAgICAgICAgICAgICAgICBpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyKSB7DQoNCiAgICBfX2hpcF9iZmxvYXQxNiAqeF9wdHIgPSAoX19oaXBfYmZsb2F0MTYgKil4LmRhdGFfcHRyKCkgKyB4b2ZmOw0KICAgIF9faGlwX2JmbG9hdDE2ICp5X3B0ciA9IChfX2hpcF9iZmxvYXQxNiAqKXkuZGF0YV9wdHIoKSArIHlvZmY7DQogICAgaWYgKGQwID09IDEyOCAmJiBkMiA9PSA2NCkgew0KICAgICAgICByb3BlXzNkX2tlcm5lbF9kMGlzMTI4X2QyaXM2NDw8PGRpbTMoZDEpLCBkaW0zKDY0KT4+PihkMCwgZDEsIGQyLCB4czEsIHhzMiwgeXMxLCB5czIsIHBvcywgeF9wdHIsIHlfcHRyKTsNCiAgICB9DQogICAgLy8gaWYgKGQyID09IDY0ICYmIGQwICUgMTYgPT0gMCAmJiBkMCAqIGQxID4gMTYzODQpIHsNCiAgICAvLyAgICAgLy8gVXNlIGEgc3BlY2lhbGl6ZWQga2VybmVsIGZvciA2NC1kaW0gYW5kIGQxIG11bHRpcGxlIG9mIDE2DQogICAgLy8gICAgIHJvcGVfM2Rfa2VybmVsX2QwYWxpZ25lZDE2X2QyaXM2NDw8PGRpbTMoZDAvMTYsIGQxKSwgZGltMyg2NCk+Pj4oZDAsIGQxLCBkMiwgeHMxLCB4czIsIHlzMSwgeXMyLCBwb3MsIHhfcHRyLCB5X3B0cik7DQogICAgLy8gfQ0KICAgIGVsc2UgaWYgKGQwICUgMiA9PSAwKSB7DQogICAgICAgIHJvcGVfM2Rfa2VybmVsX2QwYWxpZ25lZDI8PDxkaW0zKGQwLzIsIGQxKSwgZGltMyg2NCk+Pj4oZDAsIGQxLCBkMiwgeHMxLCB4czIsIHlzMSwgeXMyLCBwb3MsIHhfcHRyLCB5X3B0cik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICByb3BlXzNkX2tlcm5lbDw8PGRpbTMoZDAsIGQxKSwgZGltMyg2NCk+Pj4oZDAsIGQxLCBkMiwgeHMxLCB4czIsIHlzMSwgeXMyLCBwb3MsIHhfcHRyLCB5X3B0cik7DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgZGl2X3NvZnRtYXhfa2VybmVsKF9faGlwX2JmbG9hdDE2ICpwdHIsIGludCBicywgaW50IG5oLCBpbnQgc2wsIGZsb2F0IHNjYWxlKSB7DQogICAgaW50IHRoaXNfYnMgPSBibG9ja0lkeC54Ow0KICAgIGludCB0aGlzX25oID0gYmxvY2tJZHgueTsNCiAgICBpbnQgaWR4ID0gdGhpc19icyAqIG5oICogc2wgKyB0aGlzX25oICogc2w7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfYmZsb2F0MTYgc192YWxbODE5Ml07IC8vIG1zbCA9IDgxOTINCiAgICBfX3NoYXJlZF9fIGZsb2F0IHN1bV92YWxbNTEyXTsNCg0KICAgIGludCBzbF9hbGlnbmVkID0gc2wgLyA4ICogODsNCiAgICBpbnQgc2xfdW5hbGlnbmVkID0gc2wgJSA4Ow0KDQogICAgZmxvYXQgdGhyZWFkX3N1bSA9IDAuMGY7DQogICAgZm9yIChpbnQgaSA9IHRocmVhZElkeC54ICogODsgaSA8IHNsX2FsaWduZWQ7IGkgKz0gYmxvY2tEaW0ueCAqIDgpIHsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgdmFsWzhdOw0KICAgICAgICBmbG9hdCBzY2FsZV92YWxbOF07DQogICAgICAgICooZmxvYXQ0ICopJnZhbFswXSA9ICooZmxvYXQ0ICopJnB0cltpZHggKyBpXTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspIHsNCiAgICAgICAgICAgIHNjYWxlX3ZhbFtqXSA9IChmbG9hdCl2YWxbal0gKiBzY2FsZTsgLy8gU2NhbGUgYnkgMS9zcXJ0KGRub3BlICsgZHJvcGUpDQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gZXhwZihzY2FsZV92YWxbal0pOw0KICAgICAgICAgICAgdGhyZWFkX3N1bSArPSBleHBfdmFsOw0KICAgICAgICAgICAgdmFsW2pdID0gKF9faGlwX2JmbG9hdDE2KWV4cF92YWw7DQogICAgICAgIH0NCiAgICAgICAgKihmbG9hdDQgKikmc192YWxbaV0gPSAqKGZsb2F0NCAqKSZ2YWxbMF07DQogICAgfQ0KICAgIGZvciAoaW50IGkgPSBzbF9hbGlnbmVkICsgdGhyZWFkSWR4Lng7IGkgPCBzbDsgaSArPSBibG9ja0RpbS54KSB7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHZhbCA9IHB0cltpZHggKyBpXTsNCiAgICAgICAgZmxvYXQgc2NhbGVkX3ZhbCA9IChmbG9hdCl2YWwgKiBzY2FsZTsgLy8gU2NhbGUgYnkgMS9zcXJ0KGRub3BlICsgZHJvcGUpDQogICAgICAgIGZsb2F0IGV4cF92YWwgPSBleHBmKHNjYWxlZF92YWwpOw0KICAgICAgICB0aHJlYWRfc3VtICs9IGV4cF92YWw7DQogICAgICAgIHNfdmFsW2ldID0gKF9faGlwX2JmbG9hdDE2KWV4cF92YWw7DQogICAgfQ0KICAgIHN1bV92YWxbdGhyZWFkSWR4LnhdID0gdGhyZWFkX3N1bTsNCg0KICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IDY0KSB7DQogICAgICAgIHRocmVhZF9zdW0gPSAwLjBmOw0KICAgICAgICBmbG9hdCB0aGlzX3ZhbFs4XTsNCiAgICAgICAgKihmbG9hdDQgKikmdGhpc192YWxbMF0gPSAqKGZsb2F0NCAqKSZzdW1fdmFsW3RocmVhZElkeC54ICogNF07DQogICAgICAgICooZmxvYXQ0ICopJnRoaXNfdmFsWzRdID0gKihmbG9hdDQgKikmc3VtX3ZhbFt0aHJlYWRJZHgueCAqIDQgKyAyNTZdOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgew0KICAgICAgICAgICAgdGhyZWFkX3N1bSArPSB0aGlzX3ZhbFtpXTsNCiAgICAgICAgfQ0KICAgICAgICBzdW1fdmFsW3RocmVhZElkeC54XSA9IHRocmVhZF9zdW07DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54IDwgOCkgew0KICAgICAgICB0aHJlYWRfc3VtID0gMC4wZjsNCiAgICAgICAgZmxvYXQgdGhpc192YWxbOF07DQogICAgICAgICooZmxvYXQ0ICopJnRoaXNfdmFsWzBdID0gKihmbG9hdDQgKikmc3VtX3ZhbFt0aHJlYWRJZHgueCAqIDRdOw0KICAgICAgICAqKGZsb2F0NCAqKSZ0aGlzX3ZhbFs0XSA9ICooZmxvYXQ0ICopJnN1bV92YWxbdGhyZWFkSWR4LnggKiA0ICsgMzJdOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgew0KICAgICAgICAgICAgdGhyZWFkX3N1bSArPSB0aGlzX3ZhbFtpXTsNCiAgICAgICAgfQ0KICAgICAgICBzdW1fdmFsW3RocmVhZElkeC54XSA9IHRocmVhZF9zdW07DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54ID09IDApIHsNCiAgICAgICAgdGhyZWFkX3N1bSA9IDAuMGY7DQogICAgICAgIGZsb2F0IHRoaXNfdmFsWzhdOw0KICAgICAgICAqKGZsb2F0NCAqKSZ0aGlzX3ZhbFswXSA9ICooZmxvYXQ0ICopJnN1bV92YWxbMF07DQogICAgICAgICooZmxvYXQ0ICopJnRoaXNfdmFsWzRdID0gKihmbG9hdDQgKikmc3VtX3ZhbFs0XTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgICAgIHRocmVhZF9zdW0gKz0gdGhpc192YWxbaV07DQogICAgICAgIH0NCiAgICAgICAgc3VtX3ZhbFswXSA9IHRocmVhZF9zdW07DQogICAgfQ0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgZmxvYXQgdG90YWxfc3VtID0gc3VtX3ZhbFswXTsNCiAgICBmb3IgKGludCBpID0gdGhyZWFkSWR4LnggKiA4OyBpIDwgc2xfYWxpZ25lZDsgaSArPSBibG9ja0RpbS54ICogOCkgew0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB2YWxbOF07DQogICAgICAgICooZmxvYXQ0ICopJnZhbFswXSA9ICooZmxvYXQ0ICopJnNfdmFsW2ldOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgZmxvYXQgc29mdG1heF92YWwgPSAoZmxvYXQpdmFsW2pdIC8gdG90YWxfc3VtOw0KICAgICAgICAgICAgdmFsW2pdID0gKF9faGlwX2JmbG9hdDE2KXNvZnRtYXhfdmFsOw0KICAgICAgICB9DQogICAgICAgICooZmxvYXQ0ICopJnB0cltpZHggKyBpXSA9ICooZmxvYXQ0ICopJnZhbFswXTsNCiAgICB9DQogICAgZm9yIChpbnQgaSA9IHNsX2FsaWduZWQgKyB0aHJlYWRJZHgueDsgaSA8IHNsOyBpICs9IGJsb2NrRGltLngpIHsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgdmFsID0gc192YWxbaV07DQogICAgICAgIGZsb2F0IHNvZnRtYXhfdmFsID0gKGZsb2F0KXZhbCAvIHRvdGFsX3N1bTsNCiAgICAgICAgcHRyW2lkeCArIGldID0gKF9faGlwX2JmbG9hdDE2KXNvZnRtYXhfdmFsOw0KICAgIH0NCn0NCg0Kdm9pZCBkaXZfc29mdG1heCh0b3JjaDo6VGVuc29yIHFrLCBpbnQgYnMsIGludCBuaCwgaW50IHNsLCBpbnQgZG5vcGUsIGludCBkcm9wZSkgew0KICAgIF9faGlwX2JmbG9hdDE2ICpxa19wdHIgPSAoX19oaXBfYmZsb2F0MTYgKilxay5kYXRhX3B0cigpOw0KICAgIGZsb2F0IHNjYWxlID0gMS4wZiAvIHNxcnRmKChmbG9hdCkoZG5vcGUgKyBkcm9wZSkpOw0KICAgIGRpdl9zb2Z0bWF4X2tlcm5lbDw8PGRpbTMoYnMsIG5oKSwgZGltMyg1MTIpPj4+KHFrX3B0ciwgYnMsIG5oLCBzbCwgc2NhbGUpOw0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbWxhX2RlY29kZScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydtbGFfZGVjb2RlJywgJ2Rpdl9zb2Z0bWF4J10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8zIiwgIi13Il0sDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBkYXRhDQoNCiAgICBicyA9IGNvbmZpZy5iYXRjaF9zaXplDQogICAgc2wgPSBjb25maWcuc2VxX2xlbg0KICAgIHBsID0ga3ZfY2FjaGUuc2VxX2xlbg0KICAgIG1zbCA9IGNvbmZpZy5tYXhfc2VxX2xlbg0KICAgIG5oID0gY29uZmlnLm5faGVhZHMNCiAgICBkID0gIGNvbmZpZy5kaW0NCiAgICBkcSA9IGNvbmZpZy5xX2xvcmFfcmFuaw0KICAgIGRrdiA9IGNvbmZpZy5rdl9sb3JhX3JhbmsNCiAgICBkbm9wZSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltDQogICAgZHJvcGUgPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQ0KICAgIGR2ID0gY29uZmlnLnZfaGVhZF9kaW0NCg0KICAgIHdEUSAgPSBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtkcSwgZF0NCiAgICB3REtWID0gY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbZGt2ICsgZHJvcGUsIGRdDQogICAgd1VRICA9IGNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25oICogKGRub3BlICsgZHJvcGUpLCBkcV0NCiAgICB3VUtWID0gY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbmggKiAoZG5vcGUgKyBkdiksIGRrdl0NCiAgICB3TyAgID0gY29uZmlnLndvX3dlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbZCwgbmggKiBkdl0NCg0KICAgIHggPSB4LnZpZXcoYnMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFticywgZF0NCiAgICBxRCA9IHggQCB3RFEuVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIGRxXSA9IFticywgZF0gQCBbZHEsIGRdDQogICAgcVUgPSAocUQgQCB3VVEuVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBuaCAqIChkbm9wZSArIGRyb3BlKV0gPSBbYnMsIGRxXSBAIFtuaCAqIChkbm9wZSArIGRyb3BlKSwgZHFdDQogICAgcVUgPSBxVS52aWV3KGJzICogbmgsIHNsLCBkbm9wZSArIGRyb3BlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzICogbmgsIHNsLCBkbm9wZSArIGRyb3BlXQ0KICAgICMgcVVbOiwgOiwgZG5vcGU6XSA9IHJvcGUocVVbOiwgOiwgZG5vcGU6XSwgcGwpDQogICAgbW9kdWxlLm1sYV9kZWNvZGUocVUsIHFVLCBwbCwgZG5vcGUsIGRub3BlLCBicyAqIG5oLCBzbCwgZHJvcGUsIGRub3BlICsgZHJvcGUsIGRub3BlICsgZHJvcGUsIGRub3BlICsgZHJvcGUsIGRub3BlICsgZHJvcGUpDQogICAgcVUgPSBxVS52aWV3KGJzLCBuaCwgZG5vcGUgKyBkcm9wZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBuaCwgZG5vcGUgKyBkcm9wZV0NCg0KICAgIGt2X2NhY2hlLmRhdGFbOiwgcGw6cGwrc2wsIDpdID0gKHggQCB3REtWLlQpLnZpZXcoYnMsIHNsLCBka3YgKyBkcm9wZSkgICAgICAjIFticywgc2wsIGRrdiArIGRyb3BlXSA9IFticywgZF0gQCBbZGt2ICsgZHJvcGUsIGRdDQogICAga3ZfY2FjaGUuc2VxX2xlbiArPSAxDQogICAgIyBrUiA9IHJvcGUoa3ZfY2FjaGUuZGF0YVs6LCA6cGwrc2wsIGRrdjpdLCAwKS52aWV3KGJzLCBwbCtzbCwgZHJvcGUpDQogICAga1IgPSB0b3JjaC5lbXB0eSgoYnMsIHBsICsgc2wsIGRyb3BlKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpDQogICAgbW9kdWxlLm1sYV9kZWNvZGUoa3ZfY2FjaGUuZGF0YSwga1IsIDAsIGRrdiwgMCwgYnMsIHBsICsgc2wsIGRyb3BlLCBtc2wgKiAoZGt2ICsgZHJvcGUpLCBka3YgKyBkcm9wZSwgKHBsICsgc2wpICogZHJvcGUsIGRyb3BlKQ0KDQogICAgd1VLViA9IHdVS1YudmlldyhuaCwgZG5vcGUgKyBkdiwgZGt2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25oLCBkbm9wZSArIGR2LCBka3ZdDQogICAgIyBxQ3dVSyA9IHRvcmNoLmVtcHR5KChicywgbmgsIGRrdiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgICMgZm9yIGlfbmggaW4gcmFuZ2UobmgpOg0KICAgICMgICAgIHFDd1VLWzosIGlfbmgsIDpdID0gcVVbOiwgaV9uaCwgOmRub3BlXSBAIHdVS1ZbaV9uaCwgOmRub3BlLCA6XQ0KICAgIHFDd1VLID0gdG9yY2guYm1tKHFVWzosIDosIDpkbm9wZV0udHJhbnNwb3NlKDAsIDEpLCB3VUtWWzosIDpkbm9wZSwgOl0pICAgICAjIFtuaCwgYnMsIGRrdl0gPSBbYnMsIG5oLCBkbm9wZV0gQCBbbmgsIGRub3BlLCBka3ZdDQoNCiAgICAjIHFrID0gdG9yY2guZW1wdHkoKGJzLCBuaCwgcGwrc2wpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCiAgICAjIGZvciBpX2JzIGluIHJhbmdlKGJzKToNCiAgICAjICAgICBxa1tpX2JzLCA6LCA6XSA9IHFDd1VLW2lfYnMsIDosIDpdIEAga3ZfY2FjaGUuZGF0YVtpX2JzLCA6cGwrc2wsIDpka3ZdLlQgKyBxVVtpX2JzLCA6LCBkbm9wZTpdIEAga1JbaV9icywgOnBsK3NsLCA6XS5UDQogICAgcWsgPSB0b3JjaC5ibW0ocUN3VUsudHJhbnNwb3NlKDAsIDEpLCBrdl9jYWNoZS5kYXRhWzosIDpwbCtzbCwgOmRrdl0udHJhbnNwb3NlKDEsIDIpKSAjIFticywgbmgsIHBsK3NsXSA9IFtuaCwgYnMsIGRrdl0gQCBbYnMsIHBsK3NsLCBka3ZdDQogICAgcWsgKz0gdG9yY2guYm1tKHFVWzosIDosIGRub3BlOl0sIGtSLnRyYW5zcG9zZSgxLCAyKSkgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBuaCwgcGwrc2xdID0gW2JzLCBuaCwgZHJvcGVdIEAgW2JzLCBwbCtzbCwgZHJvcGVdDQogICAgIyBxayA9IHRvcmNoLmJtbShxQ3dVSywga3ZfY2FjaGUuZGF0YVs6LCA6cGwrc2wsIDpka3ZdLnRyYW5zcG9zZSgxLCAyKSkgKyB0b3JjaC5ibW0ocVVbOiwgOiwgZG5vcGU6XSwga1IudHJhbnNwb3NlKDEsIDIpKQ0KDQogICAgIyBxayA9IHRvcmNoLnNvZnRtYXgocWsgLyAoKGRub3BlICsgZHJvcGUpICoqIDAuNSksIGRpbT0tMSkgICAgICAgICAgICAgICAgICMgW2JzLCBuaCwgcGwrc2xdDQogICAgbW9kdWxlLmRpdl9zb2Z0bWF4KHFrLCBicywgbmgsIHBsICsgc2wsIGRub3BlLCBkcm9wZSkgIyBDdXN0b20gc29mdG1heCBrZXJuZWwNCg0KDQogICAgIyBxa2t2QyA9IHRvcmNoLmVtcHR5KChicywgbmgsIGRrdiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgICMgZm9yIGlfYnMgaW4gcmFuZ2UoYnMpOg0KICAgICMgICAgIHFra3ZDW2lfYnMsIDosIDpdID0gcWtbaV9icywgOiwgOl0gQCBrdl9jYWNoZS5kYXRhW2lfYnMsIDpwbCtzbCwgOmRrdl0NCiAgICBxa2t2QyA9IHRvcmNoLmJtbShxaywga3ZfY2FjaGUuZGF0YVs6LCA6cGwrc2wsIDpka3ZdKSAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIG5oLCBka3ZdID0gW2JzLCBuaCwgcGwrc2xdIEAgW2JzLCBwbCtzbCwgZGt2XQ0KDQogICAgIyBxa3YgPSB0b3JjaC5lbXB0eSgoYnMsIG5oLCBkdiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgICMgZm9yIGlfbmggaW4gcmFuZ2UobmgpOg0KICAgICMgICAgIHFrdls6LCBpX25oLCA6XSA9IHFra3ZDWzosIGlfbmgsIDpdIEAgd1VLVltpX25oLCBkbm9wZTosIDpdLlQNCiAgICBxa3YgPSB0b3JjaC5ibW0ocWtrdkMudHJhbnNwb3NlKDAsIDEpLCB3VUtWWzosIGRub3BlOiwgOl0udHJhbnNwb3NlKDEsIDIpKS50cmFuc3Bvc2UoMCwgMSkgIyBbYnMsIG5oLCBkdl0gPSBbYnMsIG5oLCBka3ZdIEAgW25oLCBkdiwgZGt2XQ0KDQogICAgb3V0cHV0ID0gKHFrdi5yZXNoYXBlKGJzLCBuaCAqIGR2KSBAIHdPLlQpLnZpZXcoYnMsIHNsLCBkKSAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZF0gPSBbYnMsIG5oICogZHZdIEAgW2QsIG5oICogZHZdDQoNCiAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZS5kYXRhSource 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 30358.
- aW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KDQpDUFBfV1JBUFBFUiA9ICIiIg0Kdm9pZCBtbGFfZGVjb2RlKHRvcmNoOjpUZW5zb3IgeCwgdG9yY2g6OlRlbnNvciB5LCBpbnQgcG9zLCBpbnQgeG9mZiwgaW50IHlvZmYsDQogICAgICAgICAgICAgICAgaW50IGQwLCBpbnQgZDEsIGludCBkMiwgaW50IHhzMSwgaW50IHhzMiwgaW50IHlzMSwgaW50IHlzMik7DQp2b2lkIGRpdl9zb2Z0bWF4KHRvcmNoOjpUZW5zb3IgcWssIGludCBicywgaW50IG5oLCBpbnQgc2wsIGludCBkbm9wZSwgaW50IGRyb3BlKTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPg0KDQpfX2dsb2JhbF9fIHZvaWQgcm9wZV8zZF9rZXJuZWwoaW50IGQwLCBpbnQgZDEsIGludCBkMiwgaW50IHhzMSwgaW50IHhzMiwgaW50IHlzMSwgaW50IHlzMiwgaW50IHBvcywNCiAgICAgICAgY29uc3QgX19oaXBfYmZsb2F0MTYgKngsIF9faGlwX2JmbG9hdDE2ICp5KSB7DQogICAgaW50IGQwX2lkeCA9IGJsb2NrSWR4Lng7DQogICAgaW50IGQxX2lkeCA9IGJsb2NrSWR4Lnk7DQogICAgX19oaXBfYmZsb2F0MTYgaWR4ID0gX19oYWRkKChfX2hpcF9iZmxvYXQxNilwb3MsIF9faGlwX2JmbG9hdDE2KGQxX2lkeCkpOw0KICAgIGZvciAoaW50IGQyX2lkeCA9IHRocmVhZElkeC54OyBkMl9pZHggPCBkMi8yOyBkMl9pZHggKz0gYmxvY2tEaW0ueCkgew0KICAgICAgICBmbG9hdCB4MSA9IChmbG9hdCl4W2QwX2lkeCAqIHhzMSArIGQxX2lkeCAqIHhzMiArIGQyX2lkeF07DQogICAgICAgIGZsb2F0IHgyID0gKGZsb2F0KXhbZDBfaWR4ICogeHMxICsgZDFfaWR4ICogeHMyICsgZDJfaWR4ICsgZDIvMl07DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHRoZXRhID0gKF9faGlwX2JmbG9hdDE2KWQyX2lkeDsNCiAgICAgICAgdGhldGEgPSBfX2htdWwodGhldGEsIChfX2hpcF9iZmxvYXQxNikoLTIuMGYpKTsNCiAgICAgICAgdGhldGEgPSBfX2hkaXYodGhldGEsIChfX2hpcF9iZmxvYXQxNilkMik7DQogICAgICAgIHRoZXRhID0gX19wb3dmKChfX2hpcF9iZmxvYXQxNikxMDAwMC4wZiwgdGhldGEpOw0KICAgICAgICB0aGV0YSA9IF9faG11bCh0aGV0YSwgKF9faGlwX2JmbG9hdDE2KWlkeCk7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IGNvcyA9IGNvc2YoKGZsb2F0KXRoZXRhKTsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgc2luID0gc2luZigoZmxvYXQpdGhldGEpOw0KICAgICAgICB5W2QwX2lkeCAqIHlzMSArIGQxX2lkeCAqIHlzMiArIGQyX2lkeCAgICAgICBdID0gX19oc3ViKF9faG11bCh4MSwgY29zKSwgX19obXVsKHgyLCBzaW4pKTsNCiAgICAgICAgeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggKyBkMi8yXSA9IF9faGFkZChfX2htdWwoeDIsIGNvcyksIF9faG11bCh4MSwgc2luKSk7DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcm9wZV8zZF9rZXJuZWxfZDBhbGlnbmVkMihpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyLCBpbnQgcG9zLA0KICAgICAgICBjb25zdCBfX2hpcF9iZmxvYXQxNiAqeCwgX19oaXBfYmZsb2F0MTYgKnkpIHsNCiAgICBpbnQgZDBfaWR4ID0gYmxvY2tJZHgueCAqIDIgKyB0aHJlYWRJZHgueCAvIDMyOw0KICAgIGludCBkMV9pZHggPSBibG9ja0lkeC55Ow0KICAgIF9faGlwX2JmbG9hdDE2IGlkeCA9IF9faGFkZCgoX19oaXBfYmZsb2F0MTYpcG9zLCBfX2hpcF9iZmxvYXQxNihkMV9pZHgpKTsNCiAgICBmb3IgKGludCBkMl9pZHggPSB0aHJlYWRJZHgueCAlIDMyOyBkMl9pZHggPCBkMi8yOyBkMl9pZHggKz0gMzIpIHsNCiAgICAgICAgZmxvYXQgeDEgPSAoZmxvYXQpeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHhdOw0KICAgICAgICBmbG9hdCB4MiA9IChmbG9hdCl4W2QwX2lkeCAqIHhzMSArIGQxX2lkeCAqIHhzMiArIGQyX2lkeCArIGQyLzJdOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB0aGV0YSA9IChfX2hpcF9iZmxvYXQxNilkMl9pZHg7DQogICAgICAgIHRoZXRhID0gX19obXVsKHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpKC0yLjBmKSk7DQogICAgICAgIHRoZXRhID0gX19oZGl2KHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpZDIpOw0KICAgICAgICB0aGV0YSA9IF9fcG93ZigoX19oaXBfYmZsb2F0MTYpMTAwMDAuMGYsIHRoZXRhKTsNCiAgICAgICAgdGhldGEgPSBfX2htdWwodGhldGEsIChfX2hpcF9iZmxvYXQxNilpZHgpOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiBjb3MgPSBjb3NmKChmbG9hdCl0aGV0YSk7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHNpbiA9IHNpbmYoKGZsb2F0KXRoZXRhKTsNCiAgICAgICAgeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggICAgICAgXSA9IF9faHN1YihfX2htdWwoeDEsIGNvcyksIF9faG11bCh4Miwgc2luKSk7DQogICAgICAgIHlbZDBfaWR4ICogeXMxICsgZDFfaWR4ICogeXMyICsgZDJfaWR4ICsgZDIvMl0gPSBfX2hhZGQoX19obXVsKHgyLCBjb3MpLCBfX2htdWwoeDEsIHNpbikpOw0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHJvcGVfM2Rfa2VybmVsX2QwYWxpZ25lZDE2X2QyaXM2NChpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyLCBpbnQgcG9zLA0KICAgICAgICBjb25zdCBfX2hpcF9iZmxvYXQxNiAqeCwgX19oaXBfYmZsb2F0MTYgKnkpIHsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpbnQgZDBfaWR4ID0gYmxvY2tJZHgueCAqIDE2ICsgdGhyZWFkSWR4LnggLyA0Ow0KICAgIGludCBkMV9pZHggPSBibG9ja0lkeC55Ow0KICAgIGludCBkMl9pZHggPSAodGhyZWFkSWR4LnggJSA0KSAqIDg7DQogICAgX19oaXBfYmZsb2F0MTYgeDFbOF0sIHgyWzhdOw0KICAgICooZmxvYXQ0ICopJngxWzBdID0gKihmbG9hdDQgKikmeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHhdOw0KICAgICooZmxvYXQ0ICopJngyWzBdID0gKihmbG9hdDQgKikmeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHggKyBkMi8yXTsNCiAgICBfX2hpcF9iZmxvYXQxNiBpZHggPSBfX2hhZGQoKF9faGlwX2JmbG9hdDE2KXBvcywgX19oaXBfYmZsb2F0MTYoZDFfaWR4KSk7DQogICAgX19oaXBfYmZsb2F0MTYgeTFbOF0sIHkyWzhdOw0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgdGhldGEgPSAoX19oaXBfYmZsb2F0MTYpKGQyX2lkeCArIGkpOw0KICAgICAgICB0aGV0YSA9IF9faG11bCh0aGV0YSwgKF9faGlwX2JmbG9hdDE2KSgtMi4wZikpOw0KICAgICAgICB0aGV0YSA9IF9faGRpdih0aGV0YSwgKF9faGlwX2JmbG9hdDE2KWQyKTsNCiAgICAgICAgdGhldGEgPSBfX3Bvd2YoKF9faGlwX2JmbG9hdDE2KTEwMDAwLjBmLCB0aGV0YSk7DQogICAgICAgIHRoZXRhID0gX19obXVsKHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpaWR4KTsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgY29zID0gY29zZigoZmxvYXQpdGhldGEpOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiBzaW4gPSBzaW5mKChmbG9hdCl0aGV0YSk7DQogICAgICAgIHkxW2ldID0gX19oc3ViKF9faG11bCh4MVtpXSwgY29zKSwgX19obXVsKHgyW2ldLCBzaW4pKTsNCiAgICAgICAgeTJbaV0gPSBfX2hhZGQoX19obXVsKHgyW2ldLCBjb3MpLCBfX2htdWwoeDFbaV0sIHNpbikpOw0KICAgIH0NCiAgICAqKGZsb2F0NCAqKSZ5W2QwX2lkeCAqIHlzMSArIGQxX2lkeCAqIHlzMiArIGQyX2lkeCAgICAgICBdID0gKihmbG9hdDQgKikmeTFbMF07DQogICAgKihmbG9hdDQgKikmeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggKyBkMi8yXSA9ICooZmxvYXQ0ICopJnkyWzBdOw0KfQ0KDQp2b2lkIG1sYV9kZWNvZGUodG9yY2g6OlRlbnNvciB4LCB0b3JjaDo6VGVuc29yIHksIGludCBwb3MsIGludCB4b2ZmLCBpbnQgeW9mZiwNCiAgICAgICAgICAgICAgICBpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyKSB7DQoNCiAgICBfX2hpcF9iZmxvYXQxNiAqeF9wdHIgPSAoX19oaXBfYmZsb2F0MTYgKil4LmRhdGFfcHRyKCkgKyB4b2ZmOw0KICAgIF9faGlwX2JmbG9hdDE2ICp5X3B0ciA9IChfX2hpcF9iZmxvYXQxNiAqKXkuZGF0YV9wdHIoKSArIHlvZmY7DQogICAgaWYgKGQyID09IDY0ICYmIGQwICUgMTYgPT0gMCkgew0KICAgICAgICAvLyBVc2UgYSBzcGVjaWFsaXplZCBrZXJuZWwgZm9yIDY0LWRpbSBhbmQgZDEgbXVsdGlwbGUgb2YgMTYNCiAgICAgICAgcm9wZV8zZF9rZXJuZWxfZDBhbGlnbmVkMTZfZDJpczY0PDw8ZGltMyhkMC8xNiwgZDEpLCBkaW0zKDY0KT4+PihkMCwgZDEsIGQyLCB4czEsIHhzMiwgeXMxLCB5czIsIHBvcywgeF9wdHIsIHlfcHRyKTsNCiAgICB9DQogICAgZWxzZSBpZiAoZDAgJSAyID09IDApIHsNCiAgICAgICAgcm9wZV8zZF9rZXJuZWxfZDBhbGlnbmVkMjw8PGRpbTMoZDAvMiwgZDEpLCBkaW0zKDY0KT4+PihkMCwgZDEsIGQyLCB4czEsIHhzMiwgeXMxLCB5czIsIHBvcywgeF9wdHIsIHlfcHRyKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHJvcGVfM2Rfa2VybmVsPDw8ZGltMyhkMCwgZDEpLCBkaW0zKDY0KT4+PihkMCwgZDEsIGQyLCB4czEsIHhzMiwgeXMxLCB5czIsIHBvcywgeF9wdHIsIHlfcHRyKTsNCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBkaXZfc29mdG1heF9rZXJuZWwoX19oaXBfYmZsb2F0MTYgKnB0ciwgaW50IGJzLCBpbnQgbmgsIGludCBzbCwgZmxvYXQgc2NhbGUpIHsNCiAgICBpbnQgdGhpc19icyA9IGJsb2NrSWR4Lng7DQogICAgaW50IHRoaXNfbmggPSBibG9ja0lkeC55Ow0KICAgIGludCBpZHggPSB0aGlzX2JzICogbmggKiBzbCArIHRoaXNfbmggKiBzbDsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9iZmxvYXQxNiBzX3ZhbFs4MTkyXTsgLy8gbXNsID0gODE5Mg0KICAgIF9fc2hhcmVkX18gZmxvYXQgc3VtX3ZhbFs1MTJdOw0KDQogICAgaW50IHNsX2FsaWduZWQgPSBzbCAvIDggKiA4Ow0KICAgIGludCBzbF91bmFsaWduZWQgPSBzbCAlIDg7DQoNCiAgICBmbG9hdCB0aHJlYWRfc3VtID0gMC4wZjsNCiAgICBmb3IgKGludCBpID0gdGhyZWFkSWR4LnggKiA4OyBpIDwgc2xfYWxpZ25lZDsgaSArPSBibG9ja0RpbS54ICogOCkgew0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB2YWxbOF07DQogICAgICAgIGZsb2F0IHNjYWxlX3ZhbFs4XTsNCiAgICAgICAgKihmbG9hdDQgKikmdmFsWzBdID0gKihmbG9hdDQgKikmcHRyW2lkeCArIGldOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgc2NhbGVfdmFsW2pdID0gKGZsb2F0KXZhbFtqXSAqIHNjYWxlOyAvLyBTY2FsZSBieSAxL3NxcnQoZG5vcGUgKyBkcm9wZSkNCiAgICAgICAgICAgIGZsb2F0IGV4cF92YWwgPSBleHBmKHNjYWxlX3ZhbFtqXSk7DQogICAgICAgICAgICB0aHJlYWRfc3VtICs9IGV4cF92YWw7DQogICAgICAgICAgICB2YWxbal0gPSAoX19oaXBfYmZsb2F0MTYpZXhwX3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICAqKGZsb2F0NCAqKSZzX3ZhbFtpXSA9ICooZmxvYXQ0ICopJnZhbFswXTsNCiAgICB9DQogICAgZm9yIChpbnQgaSA9IHNsX2FsaWduZWQgKyB0aHJlYWRJZHgueDsgaSA8IHNsOyBpICs9IGJsb2NrRGltLngpIHsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgdmFsID0gcHRyW2lkeCArIGldOw0KICAgICAgICBmbG9hdCBzY2FsZWRfdmFsID0gKGZsb2F0KXZhbCAqIHNjYWxlOyAvLyBTY2FsZSBieSAxL3NxcnQoZG5vcGUgKyBkcm9wZSkNCiAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IGV4cGYoc2NhbGVkX3ZhbCk7DQogICAgICAgIHRocmVhZF9zdW0gKz0gZXhwX3ZhbDsNCiAgICAgICAgc192YWxbaV0gPSAoX19oaXBfYmZsb2F0MTYpZXhwX3ZhbDsNCiAgICB9DQogICAgc3VtX3ZhbFt0aHJlYWRJZHgueF0gPSB0aHJlYWRfc3VtOw0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgaWYgKHRocmVhZElkeC54IDwgMTYpIHsNCiAgICAgICAgdGhyZWFkX3N1bSA9IDAuMGY7DQogICAgICAgIGZvciAoaW50IGkgPSB0aHJlYWRJZHgueDsgaSA8IGJsb2NrRGltLng7IGkgKz0gMTYpIHsNCiAgICAgICAgICAgIHRocmVhZF9zdW0gKz0gc3VtX3ZhbFtpXTsNCiAgICAgICAgfQ0KICAgICAgICBzdW1fdmFsW3RocmVhZElkeC54XSA9IHRocmVhZF9zdW07DQogICAgfQ0KICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA9PSAwKSB7DQogICAgICAgIHRocmVhZF9zdW0gPSAwLjBmOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsNCiAgICAgICAgICAgIHRocmVhZF9zdW0gKz0gc3VtX3ZhbFtpXTsNCiAgICAgICAgfQ0KICAgICAgICBzdW1fdmFsWzBdID0gdGhyZWFkX3N1bTsNCiAgICB9DQoNCiAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICBmbG9hdCB0b3RhbF9zdW0gPSBzdW1fdmFsWzBdOw0KICAgIGZvciAoaW50IGkgPSB0aHJlYWRJZHgueCAqIDg7IGkgPCBzbF9hbGlnbmVkOyBpICs9IGJsb2NrRGltLnggKiA4KSB7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHZhbFs4XTsNCiAgICAgICAgKihmbG9hdDQgKikmdmFsWzBdID0gKihmbG9hdDQgKikmc192YWxbaV07DQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKSB7DQogICAgICAgICAgICBmbG9hdCBzb2Z0bWF4X3ZhbCA9IChmbG9hdCl2YWxbal0gLyB0b3RhbF9zdW07DQogICAgICAgICAgICB2YWxbal0gPSAoX19oaXBfYmZsb2F0MTYpc29mdG1heF92YWw7DQogICAgICAgIH0NCiAgICAgICAgKihmbG9hdDQgKikmcHRyW2lkeCArIGldID0gKihmbG9hdDQgKikmdmFsWzBdOw0KICAgIH0NCiAgICBmb3IgKGludCBpID0gc2xfYWxpZ25lZCArIHRocmVhZElkeC54OyBpIDwgc2w7IGkgKz0gYmxvY2tEaW0ueCkgew0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB2YWwgPSBzX3ZhbFtpXTsNCiAgICAgICAgZmxvYXQgc29mdG1heF92YWwgPSAoZmxvYXQpdmFsIC8gdG90YWxfc3VtOw0KICAgICAgICBwdHJbaWR4ICsgaV0gPSAoX19oaXBfYmZsb2F0MTYpc29mdG1heF92YWw7DQogICAgfQ0KfQ0KDQp2b2lkIGRpdl9zb2Z0bWF4KHRvcmNoOjpUZW5zb3IgcWssIGludCBicywgaW50IG5oLCBpbnQgc2wsIGludCBkbm9wZSwgaW50IGRyb3BlKSB7DQogICAgX19oaXBfYmZsb2F0MTYgKnFrX3B0ciA9IChfX2hpcF9iZmxvYXQxNiAqKXFrLmRhdGFfcHRyKCk7DQogICAgZmxvYXQgc2NhbGUgPSAxLjBmIC8gc3FydGYoKGZsb2F0KShkbm9wZSArIGRyb3BlKSk7DQogICAgZGl2X3NvZnRtYXhfa2VybmVsPDw8ZGltMyhicywgbmgpLCBkaW0zKDUxMik+Pj4ocWtfcHRyLCBicywgbmgsIHNsLCBzY2FsZSk7DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdtbGFfZGVjb2RlJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21sYV9kZWNvZGUnLCAnZGl2X3NvZnRtYXgnXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCIsICItTzMiLCAiLXciXSwNCikNCg0KZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6DQogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGENCg0KICAgIGJzID0gY29uZmlnLmJhdGNoX3NpemUNCiAgICBzbCA9IGNvbmZpZy5zZXFfbGVuDQogICAgcGwgPSBrdl9jYWNoZS5zZXFfbGVuDQogICAgbXNsID0gY29uZmlnLm1heF9zZXFfbGVuDQogICAgbmggPSBjb25maWcubl9oZWFkcw0KICAgIGQgPSAgY29uZmlnLmRpbQ0KICAgIGRxID0gY29uZmlnLnFfbG9yYV9yYW5rDQogICAgZGt2ID0gY29uZmlnLmt2X2xvcmFfcmFuaw0KICAgIGRub3BlID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0NCiAgICBkcm9wZSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltDQogICAgZHYgPSBjb25maWcudl9oZWFkX2RpbQ0KDQogICAgd0RRICA9IGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2RxLCBkXQ0KICAgIHdES1YgPSBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtka3YgKyBkcm9wZSwgZF0NCiAgICB3VVEgID0gY29uZmlnLlFfcHJval91cF93ZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbmggKiAoZG5vcGUgKyBkcm9wZSksIGRxXQ0KICAgIHdVS1YgPSBjb25maWcuS1ZfcHJval91cF93ZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtuaCAqIChkbm9wZSArIGR2KSwgZGt2XQ0KICAgIHdPICAgPSBjb25maWcud29fd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtkLCBuaCAqIGR2XQ0KDQogICAgeCA9IHgudmlldyhicywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBkXQ0KICAgIHFEID0geCBAIHdEUS5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFticywgZHFdID0gW2JzLCBkXSBAIFtkcSwgZF0NCiAgICBxVSA9IChxRCBAIHdVUS5UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIG5oICogKGRub3BlICsgZHJvcGUpXSA9IFticywgZHFdIEAgW25oICogKGRub3BlICsgZHJvcGUpLCBkcV0NCiAgICBxVSA9IHFVLnZpZXcoYnMgKiBuaCwgc2wsIGRub3BlICsgZHJvcGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMgKiBuaCwgc2wsIGRub3BlICsgZHJvcGVdDQogICAgIyBxVVs6LCA6LCBkbm9wZTpdID0gcm9wZShxVVs6LCA6LCBkbm9wZTpdLCBwbCkNCiAgICBtb2R1bGUubWxhX2RlY29kZShxVSwgcVUsIHBsLCBkbm9wZSwgZG5vcGUsIGJzICogbmgsIHNsLCBkcm9wZSwgZG5vcGUgKyBkcm9wZSwgZG5vcGUgKyBkcm9wZSwgZG5vcGUgKyBkcm9wZSwgZG5vcGUgKyBkcm9wZSkNCiAgICBxVSA9IHFVLnZpZXcoYnMsIG5oLCBkbm9wZSArIGRyb3BlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIG5oLCBkbm9wZSArIGRyb3BlXQ0KDQogICAga3ZfY2FjaGUuZGF0YVs6LCBwbDpwbCtzbCwgOl0gPSAoeCBAIHdES1YuVCkudmlldyhicywgc2wsIGRrdiArIGRyb3BlKSAgICAgICMgW2JzLCBzbCwgZGt2ICsgZHJvcGVdID0gW2JzLCBkXSBAIFtka3YgKyBkcm9wZSwgZF0NCiAgICBrdl9jYWNoZS5zZXFfbGVuICs9IDENCiAgICAjIGtSID0gcm9wZShrdl9jYWNoZS5kYXRhWzosIDpwbCtzbCwgZGt2Ol0sIDApLnZpZXcoYnMsIHBsK3NsLCBkcm9wZSkNCiAgICBrUiA9IHRvcmNoLmVtcHR5KChicywgcGwgKyBzbCwgZHJvcGUpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCiAgICBtb2R1bGUubWxhX2RlY29kZShrdl9jYWNoZS5kYXRhLCBrUiwgMCwgZGt2LCAwLCBicywgcGwgKyBzbCwgZHJvcGUsIG1zbCAqIChka3YgKyBkcm9wZSksIGRrdiArIGRyb3BlLCAocGwgKyBzbCkgKiBkcm9wZSwgZHJvcGUpDQoNCiAgICB3VUtWID0gd1VLVi52aWV3KG5oLCBkbm9wZSArIGR2LCBka3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbmgsIGRub3BlICsgZHYsIGRrdl0NCiAgICAjIHFDd1VLID0gdG9yY2guZW1wdHkoKGJzLCBuaCwgZGt2KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpDQogICAgIyBmb3IgaV9uaCBpbiByYW5nZShuaCk6DQogICAgIyAgICAgcUN3VUtbOiwgaV9uaCwgOl0gPSBxVVs6LCBpX25oLCA6ZG5vcGVdIEAgd1VLVltpX25oLCA6ZG5vcGUsIDpdDQogICAgcUN3VUsgPSB0b3JjaC5ibW0ocVVbOiwgOiwgOmRub3BlXS50cmFuc3Bvc2UoMCwgMSksIHdVS1ZbOiwgOmRub3BlLCA6XSkgICAgICMgW25oLCBicywgZGt2XSA9IFticywgbmgsIGRub3BlXSBAIFtuaCwgZG5vcGUsIGRrdl0NCg0KICAgICMgcWsgPSB0b3JjaC5lbXB0eSgoYnMsIG5oLCBwbCtzbCksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgICMgZm9yIGlfYnMgaW4gcmFuZ2UoYnMpOg0KICAgICMgICAgIHFrW2lfYnMsIDosIDpdID0gcUN3VUtbaV9icywgOiwgOl0gQCBrdl9jYWNoZS5kYXRhW2lfYnMsIDpwbCtzbCwgOmRrdl0uVCArIHFVW2lfYnMsIDosIGRub3BlOl0gQCBrUltpX2JzLCA6cGwrc2wsIDpdLlQNCiAgICBxayA9IHRvcmNoLmJtbShxQ3dVSy50cmFuc3Bvc2UoMCwgMSksIGt2X2NhY2hlLmRhdGFbOiwgOnBsK3NsLCA6ZGt2XS50cmFuc3Bvc2UoMSwgMikpICMgW2JzLCBuaCwgcGwrc2xdID0gW25oLCBicywgZGt2XSBAIFticywgcGwrc2wsIGRrdl0NCiAgICBxayArPSB0b3JjaC5ibW0ocVVbOiwgOiwgZG5vcGU6XSwga1IudHJhbnNwb3NlKDEsIDIpKSAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIG5oLCBwbCtzbF0gPSBbYnMsIG5oLCBkcm9wZV0gQCBbYnMsIHBsK3NsLCBkcm9wZV0NCiAgICAjIHFrID0gdG9yY2guYm1tKHFDd1VLLCBrdl9jYWNoZS5kYXRhWzosIDpwbCtzbCwgOmRrdl0udHJhbnNwb3NlKDEsIDIpKSArIHRvcmNoLmJtbShxVVs6LCA6LCBkbm9wZTpdLCBrUi50cmFuc3Bvc2UoMSwgMikpDQoNCiAgICAjIHFrID0gdG9yY2guc29mdG1heChxayAvICgoZG5vcGUgKyBkcm9wZSkgKiogMC41KSwgZGltPS0xKSAgICAgICAgICAgICAgICAgIyBbYnMsIG5oLCBwbCtzbF0NCiAgICBtb2R1bGUuZGl2X3NvZnRtYXgocWssIGJzLCBuaCwgcGwgKyBzbCwgZG5vcGUsIGRyb3BlKSAjIEN1c3RvbSBzb2Z0bWF4IGtlcm5lbA0KDQoNCiAgICAjIHFra3ZDID0gdG9yY2guZW1wdHkoKGJzLCBuaCwgZGt2KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpDQogICAgIyBmb3IgaV9icyBpbiByYW5nZShicyk6DQogICAgIyAgICAgcWtrdkNbaV9icywgOiwgOl0gPSBxa1tpX2JzLCA6LCA6XSBAIGt2X2NhY2hlLmRhdGFbaV9icywgOnBsK3NsLCA6ZGt2XQ0KICAgIHFra3ZDID0gdG9yY2guYm1tKHFrLCBrdl9jYWNoZS5kYXRhWzosIDpwbCtzbCwgOmRrdl0pICAgICAgICAgICAgICAgICAgICAgICAjIFticywgbmgsIGRrdl0gPSBbYnMsIG5oLCBwbCtzbF0gQCBbYnMsIHBsK3NsLCBka3ZdDQoNCiAgICAjIHFrdiA9IHRvcmNoLmVtcHR5KChicywgbmgsIGR2KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpDQogICAgIyBmb3IgaV9uaCBpbiByYW5nZShuaCk6DQogICAgIyAgICAgcWt2WzosIGlfbmgsIDpdID0gcWtrdkNbOiwgaV9uaCwgOl0gQCB3VUtWW2lfbmgsIGRub3BlOiwgOl0uVA0KICAgIHFrdiA9IHRvcmNoLmJtbShxa2t2Qy50cmFuc3Bvc2UoMCwgMSksIHdVS1ZbOiwgZG5vcGU6LCA6XS50cmFuc3Bvc2UoMSwgMikpLnRyYW5zcG9zZSgwLCAxKSAjIFticywgbmgsIGR2XSA9IFticywgbmgsIGRrdl0gQCBbbmgsIGR2LCBka3ZdDQoNCiAgICBvdXRwdXQgPSAocWt2LnJlc2hhcGUoYnMsIG5oICogZHYpIEAgd08uVCkudmlldyhicywgc2wsIGQpICAgICAgICAgICAgICAgICAgIyBbYnMsIHNsLCBkXSA9IFticywgbmggKiBkdl0gQCBbZCwgbmggKiBkdl0NCg0KICAgIHJldHVybiBvdXRwdXQsIGt2X2NhY2hlLmRhdGE=No newline at end of file+ aW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KDQpDUFBfV1JBUFBFUiA9ICIiIg0Kdm9pZCBtbGFfZGVjb2RlKHRvcmNoOjpUZW5zb3IgeCwgdG9yY2g6OlRlbnNvciB5LCBpbnQgcG9zLCBpbnQgeG9mZiwgaW50IHlvZmYsDQogICAgICAgICAgICAgICAgaW50IGQwLCBpbnQgZDEsIGludCBkMiwgaW50IHhzMSwgaW50IHhzMiwgaW50IHlzMSwgaW50IHlzMik7DQp2b2lkIGRpdl9zb2Z0bWF4KHRvcmNoOjpUZW5zb3IgcWssIGludCBicywgaW50IG5oLCBpbnQgc2wsIGludCBkbm9wZSwgaW50IGRyb3BlKTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPg0KDQpfX2dsb2JhbF9fIHZvaWQgcm9wZV8zZF9rZXJuZWwoaW50IGQwLCBpbnQgZDEsIGludCBkMiwgaW50IHhzMSwgaW50IHhzMiwgaW50IHlzMSwgaW50IHlzMiwgaW50IHBvcywNCiAgICAgICAgY29uc3QgX19oaXBfYmZsb2F0MTYgKngsIF9faGlwX2JmbG9hdDE2ICp5KSB7DQogICAgaW50IGQwX2lkeCA9IGJsb2NrSWR4Lng7DQogICAgaW50IGQxX2lkeCA9IGJsb2NrSWR4Lnk7DQogICAgX19oaXBfYmZsb2F0MTYgaWR4ID0gX19oYWRkKChfX2hpcF9iZmxvYXQxNilwb3MsIF9faGlwX2JmbG9hdDE2KGQxX2lkeCkpOw0KICAgIGZvciAoaW50IGQyX2lkeCA9IHRocmVhZElkeC54OyBkMl9pZHggPCBkMi8yOyBkMl9pZHggKz0gYmxvY2tEaW0ueCkgew0KICAgICAgICBmbG9hdCB4MSA9IChmbG9hdCl4W2QwX2lkeCAqIHhzMSArIGQxX2lkeCAqIHhzMiArIGQyX2lkeF07DQogICAgICAgIGZsb2F0IHgyID0gKGZsb2F0KXhbZDBfaWR4ICogeHMxICsgZDFfaWR4ICogeHMyICsgZDJfaWR4ICsgZDIvMl07DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHRoZXRhID0gKF9faGlwX2JmbG9hdDE2KWQyX2lkeDsNCiAgICAgICAgdGhldGEgPSBfX2htdWwodGhldGEsIChfX2hpcF9iZmxvYXQxNikoLTIuMGYpKTsNCiAgICAgICAgdGhldGEgPSBfX2hkaXYodGhldGEsIChfX2hpcF9iZmxvYXQxNilkMik7DQogICAgICAgIHRoZXRhID0gX19wb3dmKChfX2hpcF9iZmxvYXQxNikxMDAwMC4wZiwgdGhldGEpOw0KICAgICAgICB0aGV0YSA9IF9faG11bCh0aGV0YSwgKF9faGlwX2JmbG9hdDE2KWlkeCk7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IGNvcyA9IGNvc2YoKGZsb2F0KXRoZXRhKTsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgc2luID0gc2luZigoZmxvYXQpdGhldGEpOw0KICAgICAgICB5W2QwX2lkeCAqIHlzMSArIGQxX2lkeCAqIHlzMiArIGQyX2lkeCAgICAgICBdID0gX19oc3ViKF9faG11bCh4MSwgY29zKSwgX19obXVsKHgyLCBzaW4pKTsNCiAgICAgICAgeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggKyBkMi8yXSA9IF9faGFkZChfX2htdWwoeDIsIGNvcyksIF9faG11bCh4MSwgc2luKSk7DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcm9wZV8zZF9rZXJuZWxfZDBhbGlnbmVkMihpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyLCBpbnQgcG9zLA0KICAgICAgICBjb25zdCBfX2hpcF9iZmxvYXQxNiAqeCwgX19oaXBfYmZsb2F0MTYgKnkpIHsNCiAgICBpbnQgZDBfaWR4ID0gYmxvY2tJZHgueCAqIDIgKyB0aHJlYWRJZHgueCAvIDMyOw0KICAgIGludCBkMV9pZHggPSBibG9ja0lkeC55Ow0KICAgIF9faGlwX2JmbG9hdDE2IGlkeCA9IF9faGFkZCgoX19oaXBfYmZsb2F0MTYpcG9zLCBfX2hpcF9iZmxvYXQxNihkMV9pZHgpKTsNCiAgICBmb3IgKGludCBkMl9pZHggPSB0aHJlYWRJZHgueCAlIDMyOyBkMl9pZHggPCBkMi8yOyBkMl9pZHggKz0gMzIpIHsNCiAgICAgICAgZmxvYXQgeDEgPSAoZmxvYXQpeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHhdOw0KICAgICAgICBmbG9hdCB4MiA9IChmbG9hdCl4W2QwX2lkeCAqIHhzMSArIGQxX2lkeCAqIHhzMiArIGQyX2lkeCArIGQyLzJdOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB0aGV0YSA9IChfX2hpcF9iZmxvYXQxNilkMl9pZHg7DQogICAgICAgIHRoZXRhID0gX19obXVsKHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpKC0yLjBmKSk7DQogICAgICAgIHRoZXRhID0gX19oZGl2KHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpZDIpOw0KICAgICAgICB0aGV0YSA9IF9fcG93ZigoX19oaXBfYmZsb2F0MTYpMTAwMDAuMGYsIHRoZXRhKTsNCiAgICAgICAgdGhldGEgPSBfX2htdWwodGhldGEsIChfX2hpcF9iZmxvYXQxNilpZHgpOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiBjb3MgPSBjb3NmKChmbG9hdCl0aGV0YSk7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHNpbiA9IHNpbmYoKGZsb2F0KXRoZXRhKTsNCiAgICAgICAgeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggICAgICAgXSA9IF9faHN1YihfX2htdWwoeDEsIGNvcyksIF9faG11bCh4Miwgc2luKSk7DQogICAgICAgIHlbZDBfaWR4ICogeXMxICsgZDFfaWR4ICogeXMyICsgZDJfaWR4ICsgZDIvMl0gPSBfX2hhZGQoX19obXVsKHgyLCBjb3MpLCBfX2htdWwoeDEsIHNpbikpOw0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHJvcGVfM2Rfa2VybmVsX2QwYWxpZ25lZDE2X2QyaXM2NChpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyLCBpbnQgcG9zLA0KICAgICAgICBjb25zdCBfX2hpcF9iZmxvYXQxNiAqeCwgX19oaXBfYmZsb2F0MTYgKnkpIHsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpbnQgZDBfaWR4ID0gYmxvY2tJZHgueCAqIDE2ICsgdGhyZWFkSWR4LnggLyA0Ow0KICAgIGludCBkMV9pZHggPSBibG9ja0lkeC55Ow0KICAgIGludCBkMl9pZHggPSAodGhyZWFkSWR4LnggJSA0KSAqIDg7DQogICAgX19oaXBfYmZsb2F0MTYgeDFbOF0sIHgyWzhdOw0KICAgICooZmxvYXQ0ICopJngxWzBdID0gKihmbG9hdDQgKikmeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHhdOw0KICAgICooZmxvYXQ0ICopJngyWzBdID0gKihmbG9hdDQgKikmeFtkMF9pZHggKiB4czEgKyBkMV9pZHggKiB4czIgKyBkMl9pZHggKyBkMi8yXTsNCiAgICBfX2hpcF9iZmxvYXQxNiBpZHggPSBfX2hhZGQoKF9faGlwX2JmbG9hdDE2KXBvcywgX19oaXBfYmZsb2F0MTYoZDFfaWR4KSk7DQogICAgX19oaXBfYmZsb2F0MTYgeTFbOF0sIHkyWzhdOw0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgdGhldGEgPSAoX19oaXBfYmZsb2F0MTYpKGQyX2lkeCArIGkpOw0KICAgICAgICB0aGV0YSA9IF9faG11bCh0aGV0YSwgKF9faGlwX2JmbG9hdDE2KSgtMi4wZikpOw0KICAgICAgICB0aGV0YSA9IF9faGRpdih0aGV0YSwgKF9faGlwX2JmbG9hdDE2KWQyKTsNCiAgICAgICAgdGhldGEgPSBfX3Bvd2YoKF9faGlwX2JmbG9hdDE2KTEwMDAwLjBmLCB0aGV0YSk7DQogICAgICAgIHRoZXRhID0gX19obXVsKHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpaWR4KTsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgY29zID0gY29zZigoZmxvYXQpdGhldGEpOw0KICAgICAgICBfX2hpcF9iZmxvYXQxNiBzaW4gPSBzaW5mKChmbG9hdCl0aGV0YSk7DQogICAgICAgIHkxW2ldID0gX19oc3ViKF9faG11bCh4MVtpXSwgY29zKSwgX19obXVsKHgyW2ldLCBzaW4pKTsNCiAgICAgICAgeTJbaV0gPSBfX2hhZGQoX19obXVsKHgyW2ldLCBjb3MpLCBfX2htdWwoeDFbaV0sIHNpbikpOw0KICAgIH0NCiAgICAqKGZsb2F0NCAqKSZ5W2QwX2lkeCAqIHlzMSArIGQxX2lkeCAqIHlzMiArIGQyX2lkeCAgICAgICBdID0gKihmbG9hdDQgKikmeTFbMF07DQogICAgKihmbG9hdDQgKikmeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggKyBkMi8yXSA9ICooZmxvYXQ0ICopJnkyWzBdOw0KfQ0KDQovLyByb3BlXzNkX2tlcm5lbF9kMGlzMTI4X2QyaXM2NDw8PGRpbTMoZDEpLCBkaW0zKDY0KT4+PihkMCwgZDEsIGQyLCB4czEsIHhzMiwgeXMxLCB5czIsIHBvcywgeF9wdHIsIHlfcHRyKTsNCl9fZ2xvYmFsX18gdm9pZCByb3BlXzNkX2tlcm5lbF9kMGlzMTI4X2QyaXM2NChpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyLCBpbnQgcG9zLA0KICAgICAgICBjb25zdCBfX2hpcF9iZmxvYXQxNiAqeCwgX19oaXBfYmZsb2F0MTYgKnkpIHsNCg0KICAgIGludCBkMV9pZHggPSBibG9ja0lkeC54Ow0KICAgIGludCBkMl9pZHggPSAodGhyZWFkSWR4LnggJSAzMik7DQogICAgX19oaXBfYmZsb2F0MTYgaWR4ID0gX19oYWRkKChfX2hpcF9iZmxvYXQxNilwb3MsIF9faGlwX2JmbG9hdDE2KGQxX2lkeCkpOw0KICAgIF9faGlwX2JmbG9hdDE2IHRoZXRhID0gKF9faGlwX2JmbG9hdDE2KWQyX2lkeDsNCiAgICB0aGV0YSA9IF9faG11bCh0aGV0YSwgKF9faGlwX2JmbG9hdDE2KSgtMi4wZikpOw0KICAgIHRoZXRhID0gX19oZGl2KHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpZDIpOw0KICAgIHRoZXRhID0gX19wb3dmKChfX2hpcF9iZmxvYXQxNikxMDAwMC4wZiwgdGhldGEpOw0KICAgIHRoZXRhID0gX19obXVsKHRoZXRhLCAoX19oaXBfYmZsb2F0MTYpaWR4KTsNCiAgICBfX2hpcF9iZmxvYXQxNiBjb3MgPSBjb3NmKChmbG9hdCl0aGV0YSk7DQogICAgX19oaXBfYmZsb2F0MTYgc2luID0gc2luZigoZmxvYXQpdGhldGEpOw0KDQogICAgZm9yIChpbnQgZDBfaWR4ID0gdGhyZWFkSWR4LnggLyAzMjsgZDBfaWR4IDwgMTI4OyBkMF9pZHggKz0gMikgew0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB4MSA9IHhbZDBfaWR4ICogeHMxICsgZDFfaWR4ICogeHMyICsgZDJfaWR4XTsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgeDIgPSB4W2QwX2lkeCAqIHhzMSArIGQxX2lkeCAqIHhzMiArIGQyX2lkeCArIGQyLzJdOw0KICAgICAgICB5W2QwX2lkeCAqIHlzMSArIGQxX2lkeCAqIHlzMiArIGQyX2lkeCAgICAgICBdID0gX19oc3ViKF9faG11bCh4MSwgY29zKSwgX19obXVsKHgyLCBzaW4pKTsNCiAgICAgICAgeVtkMF9pZHggKiB5czEgKyBkMV9pZHggKiB5czIgKyBkMl9pZHggKyBkMi8yXSA9IF9faGFkZChfX2htdWwoeDIsIGNvcyksIF9faG11bCh4MSwgc2luKSk7DQogICAgfQ0KfQ0KDQp2b2lkIG1sYV9kZWNvZGUodG9yY2g6OlRlbnNvciB4LCB0b3JjaDo6VGVuc29yIHksIGludCBwb3MsIGludCB4b2ZmLCBpbnQgeW9mZiwNCiAgICAgICAgICAgICAgICBpbnQgZDAsIGludCBkMSwgaW50IGQyLCBpbnQgeHMxLCBpbnQgeHMyLCBpbnQgeXMxLCBpbnQgeXMyKSB7DQoNCiAgICBfX2hpcF9iZmxvYXQxNiAqeF9wdHIgPSAoX19oaXBfYmZsb2F0MTYgKil4LmRhdGFfcHRyKCkgKyB4b2ZmOw0KICAgIF9faGlwX2JmbG9hdDE2ICp5X3B0ciA9IChfX2hpcF9iZmxvYXQxNiAqKXkuZGF0YV9wdHIoKSArIHlvZmY7DQogICAgaWYgKGQwID09IDEyOCAmJiBkMiA9PSA2NCkgew0KICAgICAgICByb3BlXzNkX2tlcm5lbF9kMGlzMTI4X2QyaXM2NDw8PGRpbTMoZDEpLCBkaW0zKDY0KT4+PihkMCwgZDEsIGQyLCB4czEsIHhzMiwgeXMxLCB5czIsIHBvcywgeF9wdHIsIHlfcHRyKTsNCiAgICB9DQogICAgLy8gaWYgKGQyID09IDY0ICYmIGQwICUgMTYgPT0gMCAmJiBkMCAqIGQxID4gMTYzODQpIHsNCiAgICAvLyAgICAgLy8gVXNlIGEgc3BlY2lhbGl6ZWQga2VybmVsIGZvciA2NC1kaW0gYW5kIGQxIG11bHRpcGxlIG9mIDE2DQogICAgLy8gICAgIHJvcGVfM2Rfa2VybmVsX2QwYWxpZ25lZDE2X2QyaXM2NDw8PGRpbTMoZDAvMTYsIGQxKSwgZGltMyg2NCk+Pj4oZDAsIGQxLCBkMiwgeHMxLCB4czIsIHlzMSwgeXMyLCBwb3MsIHhfcHRyLCB5X3B0cik7DQogICAgLy8gfQ0KICAgIGVsc2UgaWYgKGQwICUgMiA9PSAwKSB7DQogICAgICAgIHJvcGVfM2Rfa2VybmVsX2QwYWxpZ25lZDI8PDxkaW0zKGQwLzIsIGQxKSwgZGltMyg2NCk+Pj4oZDAsIGQxLCBkMiwgeHMxLCB4czIsIHlzMSwgeXMyLCBwb3MsIHhfcHRyLCB5X3B0cik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICByb3BlXzNkX2tlcm5lbDw8PGRpbTMoZDAsIGQxKSwgZGltMyg2NCk+Pj4oZDAsIGQxLCBkMiwgeHMxLCB4czIsIHlzMSwgeXMyLCBwb3MsIHhfcHRyLCB5X3B0cik7DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgZGl2X3NvZnRtYXhfa2VybmVsKF9faGlwX2JmbG9hdDE2ICpwdHIsIGludCBicywgaW50IG5oLCBpbnQgc2wsIGZsb2F0IHNjYWxlKSB7DQogICAgaW50IHRoaXNfYnMgPSBibG9ja0lkeC54Ow0KICAgIGludCB0aGlzX25oID0gYmxvY2tJZHgueTsNCiAgICBpbnQgaWR4ID0gdGhpc19icyAqIG5oICogc2wgKyB0aGlzX25oICogc2w7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfYmZsb2F0MTYgc192YWxbODE5Ml07IC8vIG1zbCA9IDgxOTINCiAgICBfX3NoYXJlZF9fIGZsb2F0IHN1bV92YWxbNTEyXTsNCg0KICAgIGludCBzbF9hbGlnbmVkID0gc2wgLyA4ICogODsNCiAgICBpbnQgc2xfdW5hbGlnbmVkID0gc2wgJSA4Ow0KDQogICAgZmxvYXQgdGhyZWFkX3N1bSA9IDAuMGY7DQogICAgZm9yIChpbnQgaSA9IHRocmVhZElkeC54ICogODsgaSA8IHNsX2FsaWduZWQ7IGkgKz0gYmxvY2tEaW0ueCAqIDgpIHsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgdmFsWzhdOw0KICAgICAgICBmbG9hdCBzY2FsZV92YWxbOF07DQogICAgICAgICooZmxvYXQ0ICopJnZhbFswXSA9ICooZmxvYXQ0ICopJnB0cltpZHggKyBpXTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspIHsNCiAgICAgICAgICAgIHNjYWxlX3ZhbFtqXSA9IChmbG9hdCl2YWxbal0gKiBzY2FsZTsgLy8gU2NhbGUgYnkgMS9zcXJ0KGRub3BlICsgZHJvcGUpDQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gZXhwZihzY2FsZV92YWxbal0pOw0KICAgICAgICAgICAgdGhyZWFkX3N1bSArPSBleHBfdmFsOw0KICAgICAgICAgICAgdmFsW2pdID0gKF9faGlwX2JmbG9hdDE2KWV4cF92YWw7DQogICAgICAgIH0NCiAgICAgICAgKihmbG9hdDQgKikmc192YWxbaV0gPSAqKGZsb2F0NCAqKSZ2YWxbMF07DQogICAgfQ0KICAgIGZvciAoaW50IGkgPSBzbF9hbGlnbmVkICsgdGhyZWFkSWR4Lng7IGkgPCBzbDsgaSArPSBibG9ja0RpbS54KSB7DQogICAgICAgIF9faGlwX2JmbG9hdDE2IHZhbCA9IHB0cltpZHggKyBpXTsNCiAgICAgICAgZmxvYXQgc2NhbGVkX3ZhbCA9IChmbG9hdCl2YWwgKiBzY2FsZTsgLy8gU2NhbGUgYnkgMS9zcXJ0KGRub3BlICsgZHJvcGUpDQogICAgICAgIGZsb2F0IGV4cF92YWwgPSBleHBmKHNjYWxlZF92YWwpOw0KICAgICAgICB0aHJlYWRfc3VtICs9IGV4cF92YWw7DQogICAgICAgIHNfdmFsW2ldID0gKF9faGlwX2JmbG9hdDE2KWV4cF92YWw7DQogICAgfQ0KICAgIHN1bV92YWxbdGhyZWFkSWR4LnhdID0gdGhyZWFkX3N1bTsNCg0KICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IDY0KSB7DQogICAgICAgIHRocmVhZF9zdW0gPSAwLjBmOw0KICAgICAgICBmbG9hdCB0aGlzX3ZhbFs4XTsNCiAgICAgICAgKihmbG9hdDQgKikmdGhpc192YWxbMF0gPSAqKGZsb2F0NCAqKSZzdW1fdmFsW3RocmVhZElkeC54ICogNF07DQogICAgICAgICooZmxvYXQ0ICopJnRoaXNfdmFsWzRdID0gKihmbG9hdDQgKikmc3VtX3ZhbFt0aHJlYWRJZHgueCAqIDQgKyAyNTZdOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgew0KICAgICAgICAgICAgdGhyZWFkX3N1bSArPSB0aGlzX3ZhbFtpXTsNCiAgICAgICAgfQ0KICAgICAgICBzdW1fdmFsW3RocmVhZElkeC54XSA9IHRocmVhZF9zdW07DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54IDwgOCkgew0KICAgICAgICB0aHJlYWRfc3VtID0gMC4wZjsNCiAgICAgICAgZmxvYXQgdGhpc192YWxbOF07DQogICAgICAgICooZmxvYXQ0ICopJnRoaXNfdmFsWzBdID0gKihmbG9hdDQgKikmc3VtX3ZhbFt0aHJlYWRJZHgueCAqIDRdOw0KICAgICAgICAqKGZsb2F0NCAqKSZ0aGlzX3ZhbFs0XSA9ICooZmxvYXQ0ICopJnN1bV92YWxbdGhyZWFkSWR4LnggKiA0ICsgMzJdOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgew0KICAgICAgICAgICAgdGhyZWFkX3N1bSArPSB0aGlzX3ZhbFtpXTsNCiAgICAgICAgfQ0KICAgICAgICBzdW1fdmFsW3RocmVhZElkeC54XSA9IHRocmVhZF9zdW07DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54ID09IDApIHsNCiAgICAgICAgdGhyZWFkX3N1bSA9IDAuMGY7DQogICAgICAgIGZsb2F0IHRoaXNfdmFsWzhdOw0KICAgICAgICAqKGZsb2F0NCAqKSZ0aGlzX3ZhbFswXSA9ICooZmxvYXQ0ICopJnN1bV92YWxbMF07DQogICAgICAgICooZmxvYXQ0ICopJnRoaXNfdmFsWzRdID0gKihmbG9hdDQgKikmc3VtX3ZhbFs0XTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgICAgIHRocmVhZF9zdW0gKz0gdGhpc192YWxbaV07DQogICAgICAgIH0NCiAgICAgICAgc3VtX3ZhbFswXSA9IHRocmVhZF9zdW07DQogICAgfQ0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgZmxvYXQgdG90YWxfc3VtID0gc3VtX3ZhbFswXTsNCiAgICBmb3IgKGludCBpID0gdGhyZWFkSWR4LnggKiA4OyBpIDwgc2xfYWxpZ25lZDsgaSArPSBibG9ja0RpbS54ICogOCkgew0KICAgICAgICBfX2hpcF9iZmxvYXQxNiB2YWxbOF07DQogICAgICAgICooZmxvYXQ0ICopJnZhbFswXSA9ICooZmxvYXQ0ICopJnNfdmFsW2ldOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgZmxvYXQgc29mdG1heF92YWwgPSAoZmxvYXQpdmFsW2pdIC8gdG90YWxfc3VtOw0KICAgICAgICAgICAgdmFsW2pdID0gKF9faGlwX2JmbG9hdDE2KXNvZnRtYXhfdmFsOw0KICAgICAgICB9DQogICAgICAgICooZmxvYXQ0ICopJnB0cltpZHggKyBpXSA9ICooZmxvYXQ0ICopJnZhbFswXTsNCiAgICB9DQogICAgZm9yIChpbnQgaSA9IHNsX2FsaWduZWQgKyB0aHJlYWRJZHgueDsgaSA8IHNsOyBpICs9IGJsb2NrRGltLngpIHsNCiAgICAgICAgX19oaXBfYmZsb2F0MTYgdmFsID0gc192YWxbaV07DQogICAgICAgIGZsb2F0IHNvZnRtYXhfdmFsID0gKGZsb2F0KXZhbCAvIHRvdGFsX3N1bTsNCiAgICAgICAgcHRyW2lkeCArIGldID0gKF9faGlwX2JmbG9hdDE2KXNvZnRtYXhfdmFsOw0KICAgIH0NCn0NCg0Kdm9pZCBkaXZfc29mdG1heCh0b3JjaDo6VGVuc29yIHFrLCBpbnQgYnMsIGludCBuaCwgaW50IHNsLCBpbnQgZG5vcGUsIGludCBkcm9wZSkgew0KICAgIF9faGlwX2JmbG9hdDE2ICpxa19wdHIgPSAoX19oaXBfYmZsb2F0MTYgKilxay5kYXRhX3B0cigpOw0KICAgIGZsb2F0IHNjYWxlID0gMS4wZiAvIHNxcnRmKChmbG9hdCkoZG5vcGUgKyBkcm9wZSkpOw0KICAgIGRpdl9zb2Z0bWF4X2tlcm5lbDw8PGRpbTMoYnMsIG5oKSwgZGltMyg1MTIpPj4+KHFrX3B0ciwgYnMsIG5oLCBzbCwgc2NhbGUpOw0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbWxhX2RlY29kZScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydtbGFfZGVjb2RlJywgJ2Rpdl9zb2Z0bWF4J10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8zIiwgIi13Il0sDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBkYXRhDQoNCiAgICBicyA9IGNvbmZpZy5iYXRjaF9zaXplDQogICAgc2wgPSBjb25maWcuc2VxX2xlbg0KICAgIHBsID0ga3ZfY2FjaGUuc2VxX2xlbg0KICAgIG1zbCA9IGNvbmZpZy5tYXhfc2VxX2xlbg0KICAgIG5oID0gY29uZmlnLm5faGVhZHMNCiAgICBkID0gIGNvbmZpZy5kaW0NCiAgICBkcSA9IGNvbmZpZy5xX2xvcmFfcmFuaw0KICAgIGRrdiA9IGNvbmZpZy5rdl9sb3JhX3JhbmsNCiAgICBkbm9wZSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltDQogICAgZHJvcGUgPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQ0KICAgIGR2ID0gY29uZmlnLnZfaGVhZF9kaW0NCg0KICAgIHdEUSAgPSBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtkcSwgZF0NCiAgICB3REtWID0gY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbZGt2ICsgZHJvcGUsIGRdDQogICAgd1VRICA9IGNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25oICogKGRub3BlICsgZHJvcGUpLCBkcV0NCiAgICB3VUtWID0gY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbmggKiAoZG5vcGUgKyBkdiksIGRrdl0NCiAgICB3TyAgID0gY29uZmlnLndvX3dlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbZCwgbmggKiBkdl0NCg0KICAgIHggPSB4LnZpZXcoYnMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFticywgZF0NCiAgICBxRCA9IHggQCB3RFEuVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIGRxXSA9IFticywgZF0gQCBbZHEsIGRdDQogICAgcVUgPSAocUQgQCB3VVEuVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBuaCAqIChkbm9wZSArIGRyb3BlKV0gPSBbYnMsIGRxXSBAIFtuaCAqIChkbm9wZSArIGRyb3BlKSwgZHFdDQogICAgcVUgPSBxVS52aWV3KGJzICogbmgsIHNsLCBkbm9wZSArIGRyb3BlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzICogbmgsIHNsLCBkbm9wZSArIGRyb3BlXQ0KICAgICMgcVVbOiwgOiwgZG5vcGU6XSA9IHJvcGUocVVbOiwgOiwgZG5vcGU6XSwgcGwpDQogICAgbW9kdWxlLm1sYV9kZWNvZGUocVUsIHFVLCBwbCwgZG5vcGUsIGRub3BlLCBicyAqIG5oLCBzbCwgZHJvcGUsIGRub3BlICsgZHJvcGUsIGRub3BlICsgZHJvcGUsIGRub3BlICsgZHJvcGUsIGRub3BlICsgZHJvcGUpDQogICAgcVUgPSBxVS52aWV3KGJzLCBuaCwgZG5vcGUgKyBkcm9wZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBuaCwgZG5vcGUgKyBkcm9wZV0NCg0KICAgIGt2X2NhY2hlLmRhdGFbOiwgcGw6cGwrc2wsIDpdID0gKHggQCB3REtWLlQpLnZpZXcoYnMsIHNsLCBka3YgKyBkcm9wZSkgICAgICAjIFticywgc2wsIGRrdiArIGRyb3BlXSA9IFticywgZF0gQCBbZGt2ICsgZHJvcGUsIGRdDQogICAga3ZfY2FjaGUuc2VxX2xlbiArPSAxDQogICAgIyBrUiA9IHJvcGUoa3ZfY2FjaGUuZGF0YVs6LCA6cGwrc2wsIGRrdjpdLCAwKS52aWV3KGJzLCBwbCtzbCwgZHJvcGUpDQogICAga1IgPSB0b3JjaC5lbXB0eSgoYnMsIHBsICsgc2wsIGRyb3BlKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpDQogICAgbW9kdWxlLm1sYV9kZWNvZGUoa3ZfY2FjaGUuZGF0YSwga1IsIDAsIGRrdiwgMCwgYnMsIHBsICsgc2wsIGRyb3BlLCBtc2wgKiAoZGt2ICsgZHJvcGUpLCBka3YgKyBkcm9wZSwgKHBsICsgc2wpICogZHJvcGUsIGRyb3BlKQ0KDQogICAgd1VLViA9IHdVS1YudmlldyhuaCwgZG5vcGUgKyBkdiwgZGt2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25oLCBkbm9wZSArIGR2LCBka3ZdDQogICAgIyBxQ3dVSyA9IHRvcmNoLmVtcHR5KChicywgbmgsIGRrdiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgICMgZm9yIGlfbmggaW4gcmFuZ2UobmgpOg0KICAgICMgICAgIHFDd1VLWzosIGlfbmgsIDpdID0gcVVbOiwgaV9uaCwgOmRub3BlXSBAIHdVS1ZbaV9uaCwgOmRub3BlLCA6XQ0KICAgIHFDd1VLID0gdG9yY2guYm1tKHFVWzosIDosIDpkbm9wZV0udHJhbnNwb3NlKDAsIDEpLCB3VUtWWzosIDpkbm9wZSwgOl0pICAgICAjIFtuaCwgYnMsIGRrdl0gPSBbYnMsIG5oLCBkbm9wZV0gQCBbbmgsIGRub3BlLCBka3ZdDQoNCiAgICAjIHFrID0gdG9yY2guZW1wdHkoKGJzLCBuaCwgcGwrc2wpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykNCiAgICAjIGZvciBpX2JzIGluIHJhbmdlKGJzKToNCiAgICAjICAgICBxa1tpX2JzLCA6LCA6XSA9IHFDd1VLW2lfYnMsIDosIDpdIEAga3ZfY2FjaGUuZGF0YVtpX2JzLCA6cGwrc2wsIDpka3ZdLlQgKyBxVVtpX2JzLCA6LCBkbm9wZTpdIEAga1JbaV9icywgOnBsK3NsLCA6XS5UDQogICAgcWsgPSB0b3JjaC5ibW0ocUN3VUsudHJhbnNwb3NlKDAsIDEpLCBrdl9jYWNoZS5kYXRhWzosIDpwbCtzbCwgOmRrdl0udHJhbnNwb3NlKDEsIDIpKSAjIFticywgbmgsIHBsK3NsXSA9IFtuaCwgYnMsIGRrdl0gQCBbYnMsIHBsK3NsLCBka3ZdDQogICAgcWsgKz0gdG9yY2guYm1tKHFVWzosIDosIGRub3BlOl0sIGtSLnRyYW5zcG9zZSgxLCAyKSkgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBuaCwgcGwrc2xdID0gW2JzLCBuaCwgZHJvcGVdIEAgW2JzLCBwbCtzbCwgZHJvcGVdDQogICAgIyBxayA9IHRvcmNoLmJtbShxQ3dVSywga3ZfY2FjaGUuZGF0YVs6LCA6cGwrc2wsIDpka3ZdLnRyYW5zcG9zZSgxLCAyKSkgKyB0b3JjaC5ibW0ocVVbOiwgOiwgZG5vcGU6XSwga1IudHJhbnNwb3NlKDEsIDIpKQ0KDQogICAgIyBxayA9IHRvcmNoLnNvZnRtYXgocWsgLyAoKGRub3BlICsgZHJvcGUpICoqIDAuNSksIGRpbT0tMSkgICAgICAgICAgICAgICAgICMgW2JzLCBuaCwgcGwrc2xdDQogICAgbW9kdWxlLmRpdl9zb2Z0bWF4KHFrLCBicywgbmgsIHBsICsgc2wsIGRub3BlLCBkcm9wZSkgIyBDdXN0b20gc29mdG1heCBrZXJuZWwNCg0KDQogICAgIyBxa2t2QyA9IHRvcmNoLmVtcHR5KChicywgbmgsIGRrdiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgICMgZm9yIGlfYnMgaW4gcmFuZ2UoYnMpOg0KICAgICMgICAgIHFra3ZDW2lfYnMsIDosIDpdID0gcWtbaV9icywgOiwgOl0gQCBrdl9jYWNoZS5kYXRhW2lfYnMsIDpwbCtzbCwgOmRrdl0NCiAgICBxa2t2QyA9IHRvcmNoLmJtbShxaywga3ZfY2FjaGUuZGF0YVs6LCA6cGwrc2wsIDpka3ZdKSAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIG5oLCBka3ZdID0gW2JzLCBuaCwgcGwrc2xdIEAgW2JzLCBwbCtzbCwgZGt2XQ0KDQogICAgIyBxa3YgPSB0b3JjaC5lbXB0eSgoYnMsIG5oLCBkdiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KICAgICMgZm9yIGlfbmggaW4gcmFuZ2UobmgpOg0KICAgICMgICAgIHFrdls6LCBpX25oLCA6XSA9IHFra3ZDWzosIGlfbmgsIDpdIEAgd1VLVltpX25oLCBkbm9wZTosIDpdLlQNCiAgICBxa3YgPSB0b3JjaC5ibW0ocWtrdkMudHJhbnNwb3NlKDAsIDEpLCB3VUtWWzosIGRub3BlOiwgOl0udHJhbnNwb3NlKDEsIDIpKS50cmFuc3Bvc2UoMCwgMSkgIyBbYnMsIG5oLCBkdl0gPSBbYnMsIG5oLCBka3ZdIEAgW25oLCBkdiwgZGt2XQ0KDQogICAgb3V0cHV0ID0gKHFrdi5yZXNoYXBlKGJzLCBuaCAqIGR2KSBAIHdPLlQpLnZpZXcoYnMsIHNsLCBkKSAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZF0gPSBbYnMsIG5oICogZHZdIEAgW2QsIG5oICogZHZdDQoNCiAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZS5kYXRhNo newline at end of file
Best evidence level for this revision: reported
JSON