Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 29599

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-moe-submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-29599?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16

Benchmark evidence

2 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
5.87ms
#41 of 118
2025-05-31
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
12.9ms
#33 of 118
2025-05-31

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:a270a74918ae78775332962f96eae94f295b251bfc1a4cb35e7cbc512fb561e5
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

amd-moe-submission.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgbW9lMSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9yb3V0ZXIsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGVfVCwgdG9yY2g6OlRlbnNvciB0X3VwX1QsIHRvcmNoOjpUZW5zb3IgdF9kb3duX1QsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDMyLCB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAxNiwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pOw0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZV9ULCB0b3JjaDo6VGVuc29yIHRfdXBfVCwgdG9yY2g6OlRlbnNvciB0X2Rvd25fVCwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMzIsIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDE2LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2V4cGVydF9vZmZzZXQsIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyLA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bik7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXBibGFzL2hpcGJsYXMuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCg0KI2RlZmluZSBPRkZTRVQocm93LCBjb2wsIGxkKSAoKHJvdykgKiAobGQpICsgKGNvbCkpDQojZGVmaW5lIFNXWihtLCBuKSAoKChtKSAqIDQgKyAobikpICUgNjQpIC8vIGJ5IGhhbGYNCg0KdXNpbmcgZmxvYXQxNiA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsNCnR5cGVkZWYgc3RydWN0IHsNCiAgICBmbG9hdDE2IHZhbFsyXVsyXTsNCn0gZmxvYXQxNl8yeDJfdDsNCnVzaW5nIGhhbGY0ID0gX19mcDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KdHlwZWRlZiBzdHJ1Y3Qgew0KICAgIGhhbGY0IHg7DQogICAgaGFsZjQgeTsNCn0gaGFsZjR4MjsNCg0KX19nbG9iYWxfXyB2b2lkIHNvZnRtYXhfZnAzMihjb25zdCBmbG9hdCAqaW5wdXQsIGZsb2F0ICpvdXRwdXQsIGludCBtLCBpbnQgbikgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIGZsb2F0IG1heF92YWwgPSBpbnB1dFtpZHggKiBuXTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IHZhbCA9IGlucHV0W2lkeCAqIG4gKyBpXTsNCiAgICAgICAgICAgIG1heF92YWwgPSB2YWwgPiBtYXhfdmFsID8gdmFsIDogbWF4X3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICBmbG9hdCBzdW0gPSAwLjBmOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IF9fZXhwZihpbnB1dFtpZHggKiBuICsgaV0gLSBtYXhfdmFsKTsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSBleHBfdmFsOw0KICAgICAgICAgICAgc3VtICs9IGV4cF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSBvdXRwdXRbaWR4ICogbiArIGldIC8gc3VtOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgc29mdG1heF9mcDMyX2ZwMTYoY29uc3QgZmxvYXQgKmlucHV0LCBfX2hhbGYgKm91dHB1dCwgaW50IG0sIGludCBuKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIF9faGFsZiB2YWwgPSBfX2Zsb2F0MmhhbGYoaW5wdXRbaWR4ICogbiArIGldKTsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSB2YWw7DQogICAgICAgICAgICBtYXhfdmFsID0gX19oZ3QodmFsLCBtYXhfdmFsKSA/IHZhbCA6IG1heF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgc3VtID0gMC4wZjsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IGV4cF92YWwgPSBfX2V4cGYoX19oYWxmMmZsb2F0KG91dHB1dFtpZHggKiBuICsgaV0pIC0gX19oYWxmMmZsb2F0KG1heF92YWwpKTsNCiAgICAgICAgICAgIHN1bSArPSBleHBfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gX19leHBmKF9faGFsZjJmbG9hdChvdXRwdXRbaWR4ICogbiArIGldKSAtIF9faGFsZjJmbG9hdChtYXhfdmFsKSk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gX19mbG9hdDJoYWxmKGV4cF92YWwgLyBzdW0pOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wayhjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBjYWxjdWxhdGVfaW5kZXgoDQogICAgY29uc3QgaW50ICp0b3BfaW5kaWNlcywgaW50ICp0b2tlbl9jb3VudCwgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG4pIHsNCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlcHQ7ICsraikgew0KICAgICAgICAgICAgaW50IGV4cGVydCA9IHRvcF9pbmRpY2VzW2lkeCAqIGVwdCArIGpdOw0KICAgICAgICAgICAgaW50IG9mZnNldCA9IGF0b21pY0FkZCgmdG9rZW5fY291bnRbZXhwZXJ0XSwgMSk7DQogICAgICAgICAgICBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgal0gPSBvZmZzZXQ7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqZXhwZXJ0X29mZnNldCwgaW50ICppbmRleF9pbl9leHBlcnQsIF9faGFsZiAqaW5wdXRfcmVvcmRlciwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBkaCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXB0OyArK2kpIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9vZmZzZXRbZXhwZXJ0X2lkXSArIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueDsgaiA8IGRoOyBqICs9IDY0KSB7DQogICAgICAgICAgICAgICAgaW5wdXRfcmVvcmRlclt0b2tlbl9sb2NhdGlvbiAqIGRoICsgal0gPSBpbnB1dFtpZHggKiBkaCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcGFja19vdXRwdXQoaGFsZiAqb3V0cHV0X2Rvd24sIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICp0b2tlbl9jb3VudCwgaW50ICpleHBlcnRfb2Zmc2V0LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBuc2UsIGludCBkaCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueDsgaiA8IGRoOyBqICs9IDY0KSB7DQogICAgICAgICAgICBmbG9hdCByZXN1bHQgPSAwLjBmOw0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcHQ7ICsraSkgew0KICAgICAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfb2Zmc2V0W2V4cGVydF9pZF0gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICAgICAgcmVzdWx0ICs9IF9faGFsZjJmbG9hdChzY29yZVtpZHggKiBucmUgKyBleHBlcnRfaWRdKSAqIF9faGFsZjJmbG9hdChvdXRwdXRfZG93blt0b2tlbl9sb2NhdGlvbiAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7ICsraSkgew0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBfX2hhbGYyZmxvYXQob3V0cHV0X2Rvd25bKG4gKiAobnJlICsgaSkgKyBpZHgpICogZGggKyBqXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2Zsb2F0MmhhbGYocmVzdWx0KTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRyYW5zcG9zZV9leHBlcnRfZnAxNl82NHg2NCgNCiAgICAgICAgaW50IG5fZXhwZXJ0cywgaW50IG0sIGludCBuLCBoYWxmKiBfX3Jlc3RyaWN0X18gZHN0LCBoYWxmKiBfX3Jlc3RyaWN0X18gc3JjKSB7DQoNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfZSA9IGJsb2NrSWR4Lno7DQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDY0Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfbSA9IHRocmVhZElkeC54IC8gODsNCiAgICBpbnQgdGhyZWFkX24gPSAodGhyZWFkSWR4LnggJSA4KSAqIDg7DQoNCiAgICBfX3NoYXJlZF9fIGNoYXIgc21lbVs2NF1bMTI5XTsNCg0KICAgIGhhbGY4IGRhdGFbOF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgZGF0YVtpXSA9ICooaGFsZjggKikmc3JjW3RocmVhZF9ibG9ja19lICogbSAqIG4gKw0KICAgICAgICAgICAgKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20gKyBpKjgpICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dOw0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgKihfX2ZwMTYgKikmc21lbVt0aHJlYWRfbiArIGpdWyh0aHJlYWRfbSArIDgqaSkgKiAyXSA9IGRhdGFbaV1bal07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgew0KICAgICAgICAqKGhhbGY4ICopJmRzdFt0aHJlYWRfYmxvY2tfZSAqIG0gKiBuICsNCiAgICAgICAgICAgICh0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9tICsgaSo4KSAqIG0gKyB0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9uXSA9DQogICAgICAgICAgICAqKGhhbGY4ICopJnNtZW1bdGhyZWFkX20gKyA4KmldW3RocmVhZF9uKjJdOw0KICAgIH0NCn0NCg0KX19kZXZpY2VfXyBfX2lubGluZV9fIGZsb2F0MTZfMngyX3QgaGdlbW1fMTI4eDEyOHg2NF9jbGVhbigNCiAgICBjb25zdCBoYWxmICphLCBjb25zdCBoYWxmICpiLCBpbnQgTSwgaW50IE4sIGludCBLLA0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2FbMTI4XVs2NF0sIF9fc2hhcmVkX18gaGFsZiBzX2JbMTI4XVs2NF0pIHsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXJwX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDY0Ow0KICAgIGludCB3YXJwX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAzMikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gdGhyZWFkSWR4LnggJSAzMjsNCg0KICAgIC8vIExER1NUUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBzdHNfbW4gPSB0aHJlYWRJZHgueSAqIDggKyB0aHJlYWRJZHgueCAvIDg7DQogICAgaW50IHN0c19rID0gKHRocmVhZElkeC54ICUgOCkgKiA4OyAvLyBieSBoYWxmDQogICAgaW50IGxkZ19tID0gdGhyZWFkX2Jsb2NrX20gKyBzdHNfbW47DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfbW47DQogICAgaW50IGxkZ19rID0gc3RzX2s7DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXJwX20gKyB0aHJlYWRJZHgueCAlIDMyOw0KICAgIGludCBsZHNfbiA9IHdhcnBfbiArIHRocmVhZElkeC54ICUgMzI7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMzIpICogNDsgLy8gYnkgaGFsZg0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXJwX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhcnBfbiArIHRocmVhZF9jX247DQoNCiAgICBmbG9hdDE2XzJ4Ml90IHRpbGVfZCA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBLLzY0OyBpYisrKSB7DQogICAgICAgIGhhbGY0eDIgbGRnX2FbNF0sIGxkZ19iWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgNDsgaWkrKykgew0KICAgICAgICAgICAgLy8gbGRnX2FbaWldID0gKihoYWxmNHgyICopJmFbT0ZGU0VUKGxkZ19tICsgaWkqMzIsIGxkZ19rICsgaWIqNjQsIEspXTsNCiAgICAgICAgICAgIC8vIGxkZ19iW2lpXSA9ICooaGFsZjR4MiAqKSZiW09GRlNFVChsZGdfbiArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV07DQogICAgICAgICAgICBsZGdfYVtpaV0gPSBsZGdfbSArIGlpKjMyIDwgTSA/ICooaGFsZjR4MiAqKSZhW09GRlNFVChsZGdfbSArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV0gOiBoYWxmNHgyezAsIDB9Ow0KICAgICAgICAgICAgbGRnX2JbaWldID0gbGRnX24gKyBpaSozMiA8IE4gPyAqKGhhbGY0eDIgKikmYltPRkZTRVQobGRnX24gKyBpaSozMiwgbGRnX2sgKyBpYio2NCwgSyldIDogaGFsZjR4MnswLCAwfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYVtzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgICAgKV0gPSBsZGdfYVtpaV0ueDsNCiAgICAgICAgICAgICooaGFsZjQgKikmc19hW3N0c19tbiArIGlpKjMyXVtTV1ooc3RzX21uLCBzdHNfayArIDQpXSA9IGxkZ19hW2lpXS55Ow0KICAgICAgICAgICAgKihoYWxmNCAqKSZzX2Jbc3RzX21uICsgaWkqMzJdW1NXWihzdHNfbW4sIHN0c19rICAgICldID0gbGRnX2JbaWldLng7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYltzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgKyA0KV0gPSBsZGdfYltpaV0ueTsNCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBoYWxmNCB0aWxlX2FbMl1bOF0sIHRpbGVfYlsyXVs4XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA4OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGhhbGY0ICopJnNfYVtsZHNfbSArIGlpKjMyXVtTV1oobGRzX20sIGxkc19rICsga2sqOCldOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgODsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYltpaV1ba2tdID0gKihoYWxmNCAqKSZzX2JbbGRzX24gKyBpaSozMl1bU1daKGxkc19uLCBsZHNfayArIGtrKjgpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgODsga2srKykgew0KICAgICAgICAgICAgICAgICAgICB0aWxlX2QudmFsW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDhmMTYodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCB0aWxlX2QudmFsW2lpXVtqal0sIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICByZXR1cm4gdGlsZV9kOw0KfQ0KDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDIpDQpfX2dsb2JhbF9fIHZvaWQgaGdlbW1fMTI4eDEyOHg2NCgNCiAgICBjb25zdCBoYWxmICphLCBjb25zdCBoYWxmICpiLCBmbG9hdCAqYywgaW50IE0sIGludCBOLCBpbnQgSykgew0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKCBhLCBiLCBNLCBOLCBLLCBzX2EsIHNfYik7DQoNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBsbCA9IDA7IGxsIDwgNDsgbGwrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMzIgKyBrayo4ICsgbGwgPCBNICYmIGNfbiArIGpqKjMyIDwgTikNCiAgICAgICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0gPSB0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBtb2VfaGdlbW1fMTI4eDEyOHg2NCgNCiAgICBjb25zdCBoYWxmICphX3B0ciwgY29uc3QgaGFsZiAqYl9wdHIsIGhhbGYgKmNfcHRyLCBpbnQgbnJlLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaW50IE0gPSB0b2tlbl9jb3VudFtibG9ja0lkeC56XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCiAgICBpZiAodGhyZWFkX2Jsb2NrX20gPj0gTSkgcmV0dXJuOw0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgZXhwZXJ0X29mZnNldFtibG9ja0lkeC56XSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGV4cGVydF9vZmZzZXRbYmxvY2tJZHguel0gKiBOOw0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKGEsIGIsIE0sIE4sIEssIHNfYSwgc19iKTsNCg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGxsID0gMDsgbGwgPCA0OyBsbCsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSozMiArIGtrKjggKyBsbCA8IE0gJiYgY19uICsgamoqMzIgPCBOKQ0KICAgICAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSA9IF9fZmxvYXQyaGFsZih0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDIpDQpfX2dsb2JhbF9fIHZvaWQgYmF0Y2hlZF9oZ2VtbV8xMjh4MTI4eDY0KA0KICAgIGNvbnN0IGhhbGYgKmFfcHRyLCBjb25zdCBoYWxmICpiX3B0ciwgaGFsZiAqY19wdHIsIGludCBicywgaW50IE0sIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgYmxvY2tJZHgueiAqIE0gKiBLOw0KICAgIGNvbnN0IGhhbGYgKmIgPSBiX3B0ciArIGJsb2NrSWR4LnogKiBOICogSzsNCiAgICBoYWxmICpjID0gY19wdHIgKyBibG9ja0lkeC56ICogTSAqIE47DQoNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19hWzEyOF1bNjRdOw0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2JbMTI4XVs2NF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgd2FycF9tID0gKHRocmVhZElkeC55IC8gMikgKiA2NDsNCiAgICBpbnQgd2FycF9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9IHRocmVhZElkeC54ICUgMzI7DQoNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXJwX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhcnBfbiArIHRocmVhZF9jX247DQoNCiAgICBmbG9hdDE2XzJ4Ml90IHRpbGVfZCA9IGhnZW1tXzEyOHgxMjh4NjRfY2xlYW4oYSwgYiwgTSwgTiwgSywgc19hLCBzX2IpOw0KDQogICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQgbGwgPSAwOyBsbCA8IDQ7IGxsKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNfbSArIGlpKjMyICsga2sqOCArIGxsIDwgTSAmJiBjX24gKyBqaiozMiA8IE4pDQogICAgICAgICAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSozMiArIGtrKjggKyBsbCkgKiBOICsgY19uICsgamoqMzJdID0gX19mbG9hdDJoYWxmKHRpbGVfZC52YWxbaWldW2pqXVtrayo0ICsgbGxdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBtb2VfaGdlbW1fMTI4eDEyOHg2NF9zaWx1X211bCgNCiAgICBjb25zdCBoYWxmICphX3B0ciwgY29uc3QgaGFsZiAqYl9wdHIsIGhhbGYgKmNfcHRyLCBpbnQgbnJlLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaW50IE0gPSB0b2tlbl9jb3VudFtibG9ja0lkeC56XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCiAgICBpZiAodGhyZWFkX2Jsb2NrX20gPj0gTSkgcmV0dXJuOw0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgZXhwZXJ0X29mZnNldFtibG9ja0lkeC56XSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGV4cGVydF9vZmZzZXRbYmxvY2tJZHguel0gKiBOOw0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKGEsIGIsIE0sIE4sIEssIHNfYSwgc19iKTsNCg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGxsID0gMDsgbGwgPCA0OyBsbCsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSozMiArIGtrKjggKyBsbCA8IE0gJiYgY19uICsgamoqMzIgPCBOKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvcmkgPSBfX2hhbGYyZmxvYXQoY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNpbHVfdmFsID0gdmFsICogKDEuMGYgLyAoMS4wZiArIF9fZXhwZigtdmFsKSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSA9IF9fZmxvYXQyaGFsZihvcmkgKiBzaWx1X3ZhbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjRfc2lsdV9tdWwoDQogICAgY29uc3QgaGFsZiAqYV9wdHIsIGNvbnN0IGhhbGYgKmJfcHRyLCBoYWxmICpjX3B0ciwgaW50IGJzLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQoNCiAgICBjb25zdCBoYWxmICphID0gYV9wdHIgKyBibG9ja0lkeC56ICogTSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGJsb2NrSWR4LnogKiBNICogTjsNCg0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2FbMTI4XVs2NF07DQogICAgX19zaGFyZWRfXyBoYWxmIHNfYlsxMjhdWzY0XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXJwX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDY0Ow0KICAgIGludCB3YXJwX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAzMikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gdGhyZWFkSWR4LnggJSAzMjsNCg0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhcnBfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2FycF9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGZsb2F0MTZfMngyX3QgdGlsZV9kID0gaGdlbW1fMTI4eDEyOHg2NF9jbGVhbihhLCBiLCBNLCBOLCBLLCBzX2EsIHNfYik7DQoNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBsbCA9IDA7IGxsIDwgNDsgbGwrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMzIgKyBrayo4ICsgbGwgPCBNICYmIGNfbiArIGpqKjMyIDwgTikgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3JpID0gX19oYWxmMmZsb2F0KGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsID0gdGlsZV9kLnZhbFtpaV1bampdW2trKjQgKyBsbF07DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzaWx1X3ZhbCA9IHZhbCAqICgxLjBmIC8gKDEuMGYgKyBfX2V4cGYoLXZhbCkpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0gPSBfX2Zsb2F0MmhhbGYob3JpICogc2lsdV92YWwpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQp2b2lkIG1vZTEodG9yY2g6OlRlbnNvciB0X2lucHV0LCB0b3JjaDo6VGVuc29yIHRfcm91dGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGVfVCwgdG9yY2g6OlRlbnNvciB0X3VwX1QsIHRvcmNoOjpUZW5zb3IgdF9kb3duX1QsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDMyLCB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAxNiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bikgew0KDQogICAgaWYgKGRoICUgMTI4ICE9IDAgfHwgZGUgJSAxMjggIT0gMCkgcmV0dXJuOw0KDQogICAgdXNpbmcgdWludDY0X3QgPSB1bnNpZ25lZCBsb25nIGxvbmc7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpyb3V0ZXJfcHRyICA9IChfX2hhbGYgKil0X3JvdXRlci5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSwgZGhdDQogICAgX19oYWxmICpnYXRlX1RfcHRyICA9IChfX2hhbGYgKil0X2dhdGVfVC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqdXBfVF9wdHIgICAgPSAoX19oYWxmICopdF91cF9ULmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBfX2hhbGYgKmRvd25fVF9wdHIgID0gKF9faGFsZiAqKXRfZG93bl9ULmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpnYXRlX3B0ciAgICA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqdXBfcHRyICAgICAgPSAoX19oYWxmICopdF91cC5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKmRvd25fcHRyICAgID0gKF9faGFsZiAqKXRfZG93bi5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgZmxvYXQgKnNjb3JlX2ZwMzIgPSAoZmxvYXQgKil0X3Njb3JlX2ZwMzIuZGF0YV9wdHIoKTsgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIF9faGFsZiAqc2NvcmVfZnAxNiA9IChfX2hhbGYgKil0X3Njb3JlX2ZwMTYuZGF0YV9wdHIoKTsgICAgICAgLy8gW24sIG5yZV0NCiAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgaW50ICp0b2tlbl9jb3VudCA9IChpbnQgKil0X3Rva2VuX2NvdW50LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlXQ0KICAgIGludCAqaW5kZXhfaW5fZXhwZXJ0ID0gKGludCAqKXRfaW5kZXhfaW5fZXhwZXJ0LmRhdGFfcHRyKCk7ICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKmV4cGVydF9vZmZzZXQgPSAoaW50ICopdF9leHBlcnRfb2Zmc2V0LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtucmVdDQogICAgX19oYWxmICppbnB1dF9yZW9yZGVyID0gKF9faGFsZiAqKXRfaW5wdXRfcmVvcmRlci5kYXRhX3B0cigpOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgX19oYWxmICpoaWRkZW4gPSAoX19oYWxmICopdF9oaWRkZW4uZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkZV0NCiAgICBfX2hhbGYgKm91dHB1dF9kb3duID0gKF9faGFsZiAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgLy8gdHJhbnNwb3NlDQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkaC82NCwgZGUvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGgsIGRlLCBnYXRlX3B0ciwgZ2F0ZV9UX3B0cik7DQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkaC82NCwgZGUvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGgsIGRlLCB1cF9wdHIgICwgdXBfVF9wdHIgICk7DQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkZS82NCwgZGgvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGUsIGRoLCBkb3duX3B0ciwgZG93bl9UX3B0cik7DQoNCiAgICAvLyBleHBlcnQgc2NvcmUNCiAgICAvLyBmbG9hdCAqc2NvcmVfZnAzMjsgLy8gW24sIG5yZV0NCiAgICBoZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobisxMjcpLzEyOCwgKG5yZSsxMjcpLzEyOCksIGRpbTMoNjQsIDQpPj4+DQogICAgICAgIChpbnB1dF9wdHIsIHJvdXRlcl9wdHIsIHNjb3JlX2ZwMzIsIG4sIG5yZSwgZGgpOw0KICAgIC8vIF9faGFsZiAqc2NvcmVfZnAxNjsgLy8gW24sIG5yZV0NCiAgICBzb2Z0bWF4X2ZwMzJfZnAxNjw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgbiwgbnJlKTsNCg0KICAgIC8vIGludCAqdG9wX2luZGljZXM7IC8vIFtuLCBlcHRdLCB0b3BrIHNjb3JlDQogICAgdG9wazw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCg0KICAgIC8vIGludCAqdG9rZW5fY291bnQ7IC8vIFtucmVdLCB0b2tlbiBjb3VudCBvZiBlYWNoIGV4cGVydA0KICAgIC8vIGludCAqaW5kZXhfaW5fZXhwZXJ0OyAvLyBbbiwgZXB0XSwgaW5kZXggaW4gZXhwZXJ0IG9mIGVhY2ggdG9rZW4sIGkgLT4gZXhwZXJ0IHRva2VuIGluZGV4DQogICAgaGlwTWVtc2V0KHRva2VuX2NvdW50LCAwLCBucmUgKiBzaXplb2YoaW50KSk7DQogICAgY2FsY3VsYXRlX2luZGV4PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUpOw0KDQogICAgLy8gZXhwZXJ0IG9mZnNldA0KICAgIC8vIGludCAqZXhwZXJ0X29mZnNldDsgLy8gW25yZV0NCiAgICB7DQogICAgICAgIGludCBvZmZzZXQgPSAwOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgICAgICBleHBlcnRfb2Zmc2V0W2ldID0gaSAqIG47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyByZW9yZGVyIGlucHV0DQogICAgLy8gX19oYWxmICppbnB1dF9yZW9yZGVyOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgcmVvcmRlcl9pbnB1dDw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGV4cGVydF9vZmZzZXQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCg0KICAgIC8vIGludCBtYXhfdG9rZW5fY291bnQgPSAwOw0KICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAvLyAgICAgaWYgKHRva2VuX2NvdW50W2ldID4gbWF4X3Rva2VuX2NvdW50KSBtYXhfdG9rZW5fY291bnQgPSB0b2tlbl9jb3VudFtpXTsNCiAgICAvLyB9DQoNCiAgICAvLyBoaWRkZW4gc3RhdGU6IHNpbHUob3V0cHV0X2dhdGUpICogb3V0cHV0X3VwDQogICAgLy8gX19oYWxmICpoaWRkZW47IC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkZS8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9yZW9yZGVyLCB1cF9wdHIsIGhpZGRlbiwgbnJlLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgZGUsIGRoKTsNCiAgICAvLyBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjQ8PDxkaW0zKChuKzEyNykvMTI4LCBkZS8xMjgsIG5zZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9wdHIsIHVwX3B0ciArIG5yZSAqIGRoICogZGUsIGhpZGRlbiArIG4gKiBlcHQgKiBkZSwgbnNlLCBuLCBkZSwgZGgpOw0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0X3NpbHVfbXVsPDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkZS8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9yZW9yZGVyLCBnYXRlX3B0ciwgaGlkZGVuLCBucmUsIHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBkZSwgZGgpOw0KICAgIC8vIGJhdGNoZWRfaGdlbW1fMTI4eDEyOHg2NF9zaWx1X211bDw8PGRpbTMoKG4rMTI3KS8xMjgsIGRlLzEyOCwgbnNlKSwgZGltMyg2NCwgNCk+Pj4NCiAgICAvLyAgICAgKGlucHV0X3B0ciwgZ2F0ZV9wdHIgKyBucmUgKiBkaCAqIGRlLCBoaWRkZW4gKyBuICogZXB0ICogZGUsIG5zZSwgbiwgZGUsIGRoKTsNCg0KICAgIC8vIGRvd24gb3V0cHV0DQogICAgLy8gaGFsZiAqb3V0cHV0X2Rvd247IC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkaC8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChoaWRkZW4sIGRvd25fcHRyLCBvdXRwdXRfZG93biwgbnJlLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgZGgsIGRlKTsNCiAgICAvLyBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjQ8PDxkaW0zKChuKzEyNykvMTI4LCBkaC8xMjgsIG5zZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChoaWRkZW4gKyBuICogZXB0ICogZGUsIGRvd25fcHRyICsgbnJlICogZGUgKiBkaCwgb3V0cHV0X2Rvd24gKyBuICogZXB0ICogZGgsIG5zZSwgbiwgZGgsIGRlKTsNCg0KICAgIC8vIHBhY2sgb3V0cHV0DQogICAgLy8gcGFja19vdXRwdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93biwgb3V0cHV0X3B0ciwgc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlLCBuc2UsIGRoKTsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlX1QsIHRvcmNoOjpUZW5zb3IgdF91cF9ULCB0b3JjaDo6VGVuc29yIHRfZG93bl9ULA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAzMiwgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMTYsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pIHsNCg0KICAgIGlmIChkaCAlIDEyOCAhPSAwIHx8IGRlICUgMTI4ICE9IDApIHJldHVybjsNCg0KICAgIHVzaW5nIHVpbnQ2NF90ID0gdW5zaWduZWQgbG9uZyBsb25nOw0KDQogICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgIF9faGFsZiAqcm91dGVyX3B0ciAgPSAoX19oYWxmICopdF9yb3V0ZXIuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9UX3B0ciAgPSAoX19oYWxmICopdF9nYXRlX1QuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBfX2hhbGYgKnVwX1RfcHRyICAgID0gKF9faGFsZiAqKXRfdXBfVC5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpkb3duX1RfcHRyICA9IChfX2hhbGYgKil0X2Rvd25fVC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9wdHIgICAgPSAoX19oYWxmICopdF9nYXRlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKnVwX3B0ciAgICAgID0gKF9faGFsZiAqKXRfdXAuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpkb3duX3B0ciAgICA9IChfX2hhbGYgKil0X2Rvd24uZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X3B0ciAgPSAoX19oYWxmICopdF9vdXRwdXQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBkaF0NCg0KICAgIGZsb2F0ICpzY29yZV9mcDMyID0gKGZsb2F0ICopdF9zY29yZV9mcDMyLmRhdGFfcHRyKCk7ICAgICAgICAgLy8gW24sIG5yZV0NCiAgICBfX2hhbGYgKnNjb3JlX2ZwMTYgPSAoX19oYWxmICopdF9zY29yZV9mcDE2LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtuLCBucmVdDQogICAgaW50ICp0b3BfaW5kaWNlcyA9IChpbnQgKil0X3RvcF9pbmRpY2VzLmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqdG9rZW5fY291bnQgPSAoaW50ICopdF90b2tlbl9jb3VudC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZV0NCiAgICBpbnQgKmluZGV4X2luX2V4cGVydCA9IChpbnQgKil0X2luZGV4X2luX2V4cGVydC5kYXRhX3B0cigpOyAgIC8vIFtuLCBlcHRdDQogICAgaW50ICpleHBlcnRfb2Zmc2V0ID0gKGludCAqKXRfZXhwZXJ0X29mZnNldC5kYXRhX3B0cigpOyAgICAgICAvLyBbbnJlXQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIF9faGFsZiAqaGlkZGVuID0gKF9faGFsZiAqKXRfaGlkZGVuLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfZG93biA9IChfX2hhbGYgKil0X291dHB1dF9kb3duLmRhdGFfcHRyKCk7ICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkaF0NCg0KICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd24sIG91dHB1dF9wdHIsIHNjb3JlX2ZwMTYsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCk7DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdtb2UnLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnbW9lMScsICdtb2UyJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8zIiwgIi13Il0sDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQ0KDQogICAgZGggPSBjb25maWdbImRfaGlkZGVuIl0NCiAgICBkZSA9IGNvbmZpZ1siZF9leHBlcnQiXQ0KICAgIG5yZSA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdDQogICAgbnNlID0gY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0NCiAgICBlcHQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQ0KICAgIGJzID0gY29uZmlnWyJiYXRjaF9zaXplIl0NCiAgICBzbCA9IGNvbmZpZ1sic2VxX2xlbiJdDQoNCiAgICBpbnB1dCAgPSBpbnB1dF90ZW5zb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIHNsLCBkaF0NCiAgICByb3V0ZXIgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBkaF0NCiAgICBnYXRlX1QgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgdXBfVCAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkaCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIGRvd25fVCA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGUsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBnYXRlICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRlLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgdXAgICAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIGRvd24gICA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBvdXRwdXQgPSB0b3JjaC56ZXJvcyhicywgc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgIyBbYnMsIHNsLCBkaF0NCiAgICBmb3IgaSBpbiByYW5nZShucmUpOg0KICAgICAgICBnYXRlX1RbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQ0KICAgICAgICB1cF9UW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9UW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10NCiAgICBmb3IgaSBpbiByYW5nZShuc2UpOg0KICAgICAgICBnYXRlX1RbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIHVwX1RbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIGRvd25fVFtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J11baSAqIGRlOihpICsgMSkgKiBkZSwgOl0NCg0KICAgIHNjb3JlX2ZwMzIgPSB0b3JjaC5lbXB0eShicyAqIHNsICogbnJlLCBkdHlwZT10b3JjaC5mbG9hdDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAjIFticyAqIHNsLCBucmVdDQogICAgc2NvcmVfZnAxNiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBucmUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICAgICMgW2JzICogc2wsIG5yZV0NCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBleHBlcnRfb2Zmc2V0ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlXQ0KICAgICMgaW5wdXRfcmVvcmRlciA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICMgW2JzICogc2wgKiBlcHQsIGRoXQ0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRoXQ0KDQogICAgaW5wdXRfcmVvcmRlciA9IHRvcmNoLmVtcHR5KG5yZSwgYnMqc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KDQogICAgbW9kdWxlLm1vZTEoaW5wdXQsIHJvdXRlciwgZ2F0ZV9ULCB1cF9ULCBkb3duX1QsIGdhdGUsIHVwLCBkb3duLCBvdXRwdXQsDQogICAgICAgIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlX2ZwMzIsIHNjb3JlX2ZwMTYsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBleHBlcnRfb2Zmc2V0LA0KICAgICAgICBpbnB1dF9yZW9yZGVyLCBoaWRkZW4sIG91dHB1dF9kb3duKQ0KDQogICAgbWF4X2NvdW50ID0gdG9yY2gubWF4KHRva2VuX2NvdW50KS5pdGVtKCkNCg0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9UWzpucmUsIDosIDpdKSkgKiB0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgdXBfVFs6bnJlLCA6LCA6XSkNCiAgICBoaWRkZW5bbnJlOiwgOiwgOl0gPSB0b3JjaC5ubi5mdW5jdGlvbmFsLnNpbHUodG9yY2gubWF0bXVsKGlucHV0LnZpZXcoYnMqc2wsIGRoKSwgZ2F0ZV9UW25yZTosIDosIDpdKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cF9UW25yZTosIDosIDpdKQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBicyAqIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW25yZSArIG5zZSwgYnMgKiBzbCwgZGhdDQogICAgb3V0cHV0X2Rvd25bOm5yZSwgOm1heF9jb3VudCwgOl0gPSB0b3JjaC5ibW0oaGlkZGVuWzpucmUsIDptYXhfY291bnQsIDpdLCBkb3duX1RbOm5yZSwgOiwgOl0pDQogICAgb3V0cHV0X2Rvd25bbnJlOiwgOiwgOl0gPSB0b3JjaC5ibW0oaGlkZGVuW25yZTosIDosIDpdLCBkb3duX1RbbnJlOiwgOiwgOl0pDQoNCiAgICBtb2R1bGUubW9lMihpbnB1dCwgcm91dGVyLCBnYXRlX1QsIHVwX1QsIGRvd25fVCwgZ2F0ZSwgdXAsIGRvd24sIG91dHB1dCwNCiAgICAgICAgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIGV4cGVydF9vZmZzZXQsDQogICAgICAgIGlucHV0X3Jlb3JkZXIsIGhpZGRlbiwgb3V0cHV0X2Rvd24pDQogICAgcmV0dXJuIG91dHB1dA==

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 amd-mixture-of-experts · submission 28629.

- IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgbW9lKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlX1QsIHRvcmNoOjpUZW5zb3IgdF91cF9ULCB0b3JjaDo6VGVuc29yIHRfZG93bl9ULA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAzMiwgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMTYsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfdXAsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwYmxhcy9oaXBibGFzLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDE2Lmg+DQoNCiNkZWZpbmUgT0ZGU0VUKHJvdywgY29sLCBsZCkgKChyb3cpICogKGxkKSArIChjb2wpKQ0KI2RlZmluZSBTV1oobSwgbikgKCgobSkgKiA0ICsgKG4pKSAlIDY0KSAvLyBieSBoYWxmDQoNCnVzaW5nIGZsb2F0MTYgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7DQp0eXBlZGVmIHN0cnVjdCB7DQogICAgZmxvYXQxNiB2YWxbMl1bMl07DQp9IGZsb2F0MTZfMngyX3Q7DQp1c2luZyBoYWxmNCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCnR5cGVkZWYgc3RydWN0IHsNCiAgICBoYWxmNCB4Ow0KICAgIGhhbGY0IHk7DQp9IGhhbGY0eDI7DQoNCl9fZ2xvYmFsX18gdm9pZCBzb2Z0bWF4X2ZwMzIoY29uc3QgZmxvYXQgKmlucHV0LCBmbG9hdCAqb3V0cHV0LCBpbnQgbSwgaW50IG4pIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbSkgew0KICAgICAgICBmbG9hdCBtYXhfdmFsID0gaW5wdXRbaWR4ICogbl07DQogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCB2YWwgPSBpbnB1dFtpZHggKiBuICsgaV07DQogICAgICAgICAgICBtYXhfdmFsID0gdmFsID4gbWF4X3ZhbCA/IHZhbCA6IG1heF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgc3VtID0gMC4wZjsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IGV4cF92YWwgPSBfX2V4cGYoaW5wdXRbaWR4ICogbiArIGldIC0gbWF4X3ZhbCk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gZXhwX3ZhbDsNCiAgICAgICAgICAgIHN1bSArPSBleHBfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gb3V0cHV0W2lkeCAqIG4gKyBpXSAvIHN1bTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHNvZnRtYXhfZnAzMl9mcDE2KGNvbnN0IGZsb2F0ICppbnB1dCwgX19oYWxmICpvdXRwdXQsIGludCBtLCBpbnQgbikgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIF9faGFsZiBtYXhfdmFsID0gX19mbG9hdDJoYWxmKC1JTkZJTklUWSk7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBfX2hhbGYgdmFsID0gX19mbG9hdDJoYWxmKGlucHV0W2lkeCAqIG4gKyBpXSk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gdmFsOw0KICAgICAgICAgICAgbWF4X3ZhbCA9IF9faGd0KHZhbCwgbWF4X3ZhbCkgPyB2YWwgOiBtYXhfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHN1bSA9IDAuMGY7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gX19leHBmKF9faGFsZjJmbG9hdChvdXRwdXRbaWR4ICogbiArIGldKSAtIF9faGFsZjJmbG9hdChtYXhfdmFsKSk7DQogICAgICAgICAgICBzdW0gKz0gZXhwX3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IF9fZXhwZihfX2hhbGYyZmxvYXQob3V0cHV0W2lkeCAqIG4gKyBpXSkgLSBfX2hhbGYyZmxvYXQobWF4X3ZhbCkpOw0KICAgICAgICAgICAgb3V0cHV0W2lkeCAqIG4gKyBpXSA9IF9fZmxvYXQyaGFsZihleHBfdmFsIC8gc3VtKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRvcGtfZnAzMihjb25zdCBmbG9hdCAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbSkgew0KICAgICAgICAvLyBGaW5kIHRvcC1rIGluZGljZXMgZm9yIHJvdyBpZHgNCiAgICAgICAgLy8gU2ltcGxlIHNlbGVjdGlvbiBzb3J0IGZvciBzbWFsbCBrDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7DQogICAgICAgICAgICBmbG9hdCBtYXhfdmFsID0gLUlORklOSVRZOw0KICAgICAgICAgICAgaW50IG1heF9pZHggPSAtMTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7DQogICAgICAgICAgICAgICAgaWYgKGlucHV0W2lkeCAqIG4gKyBqXSA+IG1heF92YWwpIHsNCiAgICAgICAgICAgICAgICAgICAgaW50IGZvdW5kID0gMDsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBpOyArK2wpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BfaW5kaWNlc1tpZHggKiBrICsgbF0gPT0gaikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IGlucHV0W2lkeCAqIG4gKyBqXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pZHggPSBqOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdG9wX2luZGljZXNbaWR4ICogayArIGldID0gbWF4X2lkeDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRvcGtfZnAxNihjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBjYWxjdWxhdGVfaW5kZXgoaW50ICp0b3BfaW5kaWNlcywgaW50ICp0b2tlbl9jb3VudCwgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG5yZSkgew0KICAgICAgICBpbnQgY291bnQgPSAwOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlcHQ7ICsraikgew0KICAgICAgICAgICAgICAgIGlmICh0b3BfaW5kaWNlc1tpICogZXB0ICsgal0gPT0gaWR4KSB7DQogICAgICAgICAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpICogZXB0ICsgal0gPSBjb3VudDsNCiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5fY291bnRbaWR4XSA9IGNvdW50Ow0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleF92MigNCiAgICBjb25zdCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0ID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgal07DQogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXRvbWljQWRkKCZ0b2tlbl9jb3VudFtleHBlcnRdLCAxKTsNCiAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBqXSA9IG9mZnNldDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9vZmZzZXQoaW50ICp0b2tlbl9jb3VudCwgaW50ICpleHBlcnRfb2Zmc2V0LCBpbnQgbnJlKSB7DQogICAgaW50IG9mZnNldCA9IDA7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7ICsraSkgew0KICAgICAgICBleHBlcnRfb2Zmc2V0W2ldID0gb2Zmc2V0Ow0KICAgICAgICBvZmZzZXQgKz0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcmVvcmRlcl9pbnB1dChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfb2Zmc2V0W2V4cGVydF9pZF0gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lng7IGogPCBkaDsgaiArPSA2NCkgew0KICAgICAgICAgICAgICAgIGlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdID0gaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHNpbHVfZ2F0ZV9tdWxfdXAoZmxvYXQgKmdhdGUsIGZsb2F0ICp1cCwgX19oYWxmICpoaWRkZW4sIGludCBuLCBpbnQgZGUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlOyArK2kpIHsNCiAgICAgICAgICAgIGZsb2F0IGdhdGVfdmFsID0gZ2F0ZVtpZHggKiBkZSArIGldOw0KICAgICAgICAgICAgZmxvYXQgc2lsdV92YWwgPSBnYXRlX3ZhbCAqICgxLjBmIC8gKDEuMGYgKyBfX2V4cGYoLWdhdGVfdmFsKSkpOw0KICAgICAgICAgICAgaGlkZGVuW2lkeCAqIGRlICsgaV0gPSBfX2Zsb2F0MmhhbGYoc2lsdV92YWwgKiB1cFtpZHggKiBkZSArIGldKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHBhY2tfb3V0cHV0KGZsb2F0ICpvdXRwdXRfZG93biwgX19oYWxmICpvdXRwdXRfcHRyLCBjb25zdCBfX2hhbGYgKnNjb3JlLCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSwgaW50IG5zZSwgaW50IGRoKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4Lng7DQogICAgaWYgKGlkeCA8IG4pIHsNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54OyBqIDwgZGg7IGogKz0gNjQpIHsNCiAgICAgICAgICAgIGZsb2F0IHJlc3VsdCA9IDAuMGY7DQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICAgICAgaW50IGV4cGVydF9pZCA9IHRvcF9pbmRpY2VzW2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9vZmZzZXRbZXhwZXJ0X2lkXSArIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgICAgICByZXN1bHQgKz0gX19oYWxmMmZsb2F0KHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF0pICogb3V0cHV0X2Rvd25bdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7ICsraSkgew0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBvdXRwdXRfZG93blsobiAqIChlcHQgKyBpKSArIGlkeCkgKiBkaCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gX19mbG9hdDJoYWxmKHJlc3VsdCk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCB0cmFuc3Bvc2VfZXhwZXJ0X2ZwMTZfNjR4NjQoDQogICAgICAgIGludCBuX2V4cGVydHMsIGludCBtLCBpbnQgbiwgaGFsZiogX19yZXN0cmljdF9fIGRzdCwgaGFsZiogX19yZXN0cmljdF9fIHNyYykgew0KDQogICAgdXNpbmcgaGFsZjggPSBfX2ZwMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX2UgPSBibG9ja0lkeC56Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiA2NDsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX20gPSB0aHJlYWRJZHgueCAvIDg7DQogICAgaW50IHRocmVhZF9uID0gKHRocmVhZElkeC54ICUgOCkgKiA4Ow0KDQogICAgX19zaGFyZWRfXyBjaGFyIHNtZW1bNjRdWzEyOV07DQoNCiAgICBoYWxmOCBkYXRhWzhdOw0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7DQogICAgICAgIGRhdGFbaV0gPSAqKGhhbGY4ICopJnNyY1t0aHJlYWRfYmxvY2tfZSAqIG0gKiBuICsNCiAgICAgICAgICAgICh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tICsgaSo4KSAqIG4gKyB0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9uXTsNCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspIHsNCiAgICAgICAgICAgICooX19mcDE2ICopJnNtZW1bdGhyZWFkX24gKyBqXVsodGhyZWFkX20gKyA4KmkpICogMl0gPSBkYXRhW2ldW2pdOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgKihoYWxmOCAqKSZkc3RbdGhyZWFkX2Jsb2NrX2UgKiBtICogbiArDQogICAgICAgICAgICAodGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbSArIGkqOCkgKiBtICsgdGhyZWFkX2Jsb2NrX20gKyB0aHJlYWRfbl0gPQ0KICAgICAgICAgICAgKihoYWxmOCAqKSZzbWVtW3RocmVhZF9tICsgOCppXVt0aHJlYWRfbioyXTsNCiAgICB9DQp9DQoNCl9fZGV2aWNlX18gX19pbmxpbmVfXyBmbG9hdDE2XzJ4Ml90IGhnZW1tXzEyOHgxMjh4NjRfY2xlYW4oDQogICAgY29uc3QgaGFsZiAqYSwgY29uc3QgaGFsZiAqYiwgaW50IE0sIGludCBOLCBpbnQgSywNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19hWzEyOF1bNjRdLCBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdKSB7DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgd2FycF9tID0gKHRocmVhZElkeC55IC8gMikgKiA2NDsNCiAgICBpbnQgd2FycF9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9IHRocmVhZElkeC54ICUgMzI7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX21uID0gdGhyZWFkSWR4LnkgKiA4ICsgdGhyZWFkSWR4LnggLyA4Ow0KICAgIGludCBzdHNfayA9ICh0aHJlYWRJZHgueCAlIDgpICogODsgLy8gYnkgaGFsZg0KICAgIGludCBsZGdfbSA9IHRocmVhZF9ibG9ja19tICsgc3RzX21uOw0KICAgIGludCBsZGdfbiA9IHRocmVhZF9ibG9ja19uICsgc3RzX21uOw0KICAgIGludCBsZGdfayA9IHN0c19rOw0KDQogICAgLy8gTERTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IGxkc19tID0gd2FycF9tICsgdGhyZWFkSWR4LnggJSAzMjsNCiAgICBpbnQgbGRzX24gPSB3YXJwX24gKyB0aHJlYWRJZHgueCAlIDMyOw0KICAgIGludCBsZHNfayA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7IC8vIGJ5IGhhbGYNCg0KICAgIC8vIEMmRCBQYXJhbWV0ZXJzDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSB7MH07DQoNCiAgICBmb3IgKGludCBpYiA9IDA7IGliIDwgSy82NDsgaWIrKykgew0KICAgICAgICBoYWxmNHgyIGxkZ19hWzRdLCBsZGdfYls0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsNCiAgICAgICAgICAgIC8vIGxkZ19hW2lpXSA9ICooaGFsZjR4MiAqKSZhW09GRlNFVChsZGdfbSArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV07DQogICAgICAgICAgICAvLyBsZGdfYltpaV0gPSAqKGhhbGY0eDIgKikmYltPRkZTRVQobGRnX24gKyBpaSozMiwgbGRnX2sgKyBpYio2NCwgSyldOw0KICAgICAgICAgICAgbGRnX2FbaWldID0gbGRnX20gKyBpaSozMiA8IE0gPyAqKGhhbGY0eDIgKikmYVtPRkZTRVQobGRnX20gKyBpaSozMiwgbGRnX2sgKyBpYio2NCwgSyldIDogaGFsZjR4MnswLCAwfTsNCiAgICAgICAgICAgIGxkZ19iW2lpXSA9IGxkZ19uICsgaWkqMzIgPCBOID8gKihoYWxmNHgyICopJmJbT0ZGU0VUKGxkZ19uICsgaWkqMzIsIGxkZ19rICsgaWIqNjQsIEspXSA6IGhhbGY0eDJ7MCwgMH07DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgNDsgaWkrKykgew0KICAgICAgICAgICAgKihoYWxmNCAqKSZzX2Fbc3RzX21uICsgaWkqMzJdW1NXWihzdHNfbW4sIHN0c19rICAgICldID0gbGRnX2FbaWldLng7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYVtzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgKyA0KV0gPSBsZGdfYVtpaV0ueTsNCiAgICAgICAgICAgICooaGFsZjQgKikmc19iW3N0c19tbiArIGlpKjMyXVtTV1ooc3RzX21uLCBzdHNfayAgICApXSA9IGxkZ19iW2lpXS54Ow0KICAgICAgICAgICAgKihoYWxmNCAqKSZzX2Jbc3RzX21uICsgaWkqMzJdW1NXWihzdHNfbW4sIHN0c19rICsgNCldID0gbGRnX2JbaWldLnk7DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgaGFsZjQgdGlsZV9hWzJdWzhdLCB0aWxlX2JbMl1bOF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgODsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihoYWxmNCAqKSZzX2FbbGRzX20gKyBpaSozMl1bU1daKGxkc19tLCBsZHNfayArIGtrKjgpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDg7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2JbaWldW2trXSA9ICooaGFsZjQgKikmc19iW2xkc19uICsgaWkqMzJdW1NXWihsZHNfbiwgbGRzX2sgKyBrayo4KV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDg7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kLnZhbFtpaV1bampdID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMng4ZjE2KHRpbGVfYVtpaV1ba2tdLCB0aWxlX2JbampdW2trXSwgdGlsZV9kLnZhbFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQogICAgfQ0KDQogICAgcmV0dXJuIHRpbGVfZDsNCn0NCg0KX19sYXVuY2hfYm91bmRzX18oMjU2LCAyKQ0KX19nbG9iYWxfXyB2b2lkIGhnZW1tXzEyOHgxMjh4NjQoDQogICAgY29uc3QgaGFsZiAqYSwgY29uc3QgaGFsZiAqYiwgZmxvYXQgKmMsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCg0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2FbMTI4XVs2NF07DQogICAgX19zaGFyZWRfXyBoYWxmIHNfYlsxMjhdWzY0XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXJwX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDY0Ow0KICAgIGludCB3YXJwX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAzMikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gdGhyZWFkSWR4LnggJSAzMjsNCg0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhcnBfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2FycF9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGZsb2F0MTZfMngyX3QgdGlsZV9kID0gaGdlbW1fMTI4eDEyOHg2NF9jbGVhbiggYSwgYiwgTSwgTiwgSywgc19hLCBzX2IpOw0KDQogICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQgbGwgPSAwOyBsbCA8IDQ7IGxsKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNfbSArIGlpKjMyICsga2sqOCArIGxsIDwgTSAmJiBjX24gKyBqaiozMiA8IE4pDQogICAgICAgICAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSozMiArIGtrKjggKyBsbCkgKiBOICsgY19uICsgamoqMzJdID0gdGlsZV9kLnZhbFtpaV1bampdW2trKjQgKyBsbF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDIpDQpfX2dsb2JhbF9fIHZvaWQgbW9lX2hnZW1tXzEyOHgxMjh4NjQoDQogICAgY29uc3QgaGFsZiAqYV9wdHIsIGNvbnN0IGhhbGYgKmJfcHRyLCBmbG9hdCAqY19wdHIsIGludCBucmUsIGludCAqdG9rZW5fY291bnQsIGludCAqZXhwZXJ0X29mZnNldCwgaW50IE4sIGludCBLKSB7DQoNCiAgICBjb25zdCBpbnQgTSA9IHRva2VuX2NvdW50W2Jsb2NrSWR4LnpdOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KICAgIGlmICh0aHJlYWRfYmxvY2tfbSA+PSBNKSByZXR1cm47DQoNCiAgICBjb25zdCBoYWxmICphID0gYV9wdHIgKyBleHBlcnRfb2Zmc2V0W2Jsb2NrSWR4LnpdICogSzsNCiAgICBjb25zdCBoYWxmICpiID0gYl9wdHIgKyBibG9ja0lkeC56ICogTiAqIEs7DQogICAgZmxvYXQgKmMgPSBjX3B0ciArIGV4cGVydF9vZmZzZXRbYmxvY2tJZHguel0gKiBOOw0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKGEsIGIsIE0sIE4sIEssIHNfYSwgc19iKTsNCg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGxsID0gMDsgbGwgPCA0OyBsbCsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSozMiArIGtrKjggKyBsbCA8IE0gJiYgY19uICsgamoqMzIgPCBOKQ0KICAgICAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSA9IHRpbGVfZC52YWxbaWldW2pqXVtrayo0ICsgbGxdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19sYXVuY2hfYm91bmRzX18oMjU2LCAyKQ0KX19nbG9iYWxfXyB2b2lkIGJhdGNoZWRfaGdlbW1fMTI4eDEyOHg2NCgNCiAgICBjb25zdCBoYWxmICphX3B0ciwgY29uc3QgaGFsZiAqYl9wdHIsIGZsb2F0ICpjX3B0ciwgaW50IGJzLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQoNCiAgICBjb25zdCBoYWxmICphID0gYV9wdHIgKyBibG9ja0lkeC56ICogTSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGZsb2F0ICpjID0gY19wdHIgKyBibG9ja0lkeC56ICogTSAqIE47DQoNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19hWzEyOF1bNjRdOw0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2JbMTI4XVs2NF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgd2FycF9tID0gKHRocmVhZElkeC55IC8gMikgKiA2NDsNCiAgICBpbnQgd2FycF9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9IHRocmVhZElkeC54ICUgMzI7DQoNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXJwX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhcnBfbiArIHRocmVhZF9jX247DQoNCiAgICBmbG9hdDE2XzJ4Ml90IHRpbGVfZCA9IGhnZW1tXzEyOHgxMjh4NjRfY2xlYW4oYSwgYiwgTSwgTiwgSywgc19hLCBzX2IpOw0KDQogICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQgbGwgPSAwOyBsbCA8IDQ7IGxsKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNfbSArIGlpKjMyICsga2sqOCArIGxsIDwgTSAmJiBjX24gKyBqaiozMiA8IE4pDQogICAgICAgICAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSozMiArIGtrKjggKyBsbCkgKiBOICsgY19uICsgamoqMzJdID0gdGlsZV9kLnZhbFtpaV1bampdW2trKjQgKyBsbF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQp2b2lkIG1vZSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9yb3V0ZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZV9ULCB0b3JjaDo6VGVuc29yIHRfdXBfVCwgdG9yY2g6OlRlbnNvciB0X2Rvd25fVCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfdXAsIHRvcmNoOjpUZW5zb3IgdF9kb3duLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMzIsIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDE2LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLCB0b3JjaDo6VGVuc29yIHRfdG9rZW5fY291bnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2V4cGVydF9vZmZzZXQsIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X3VwLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2hpZGRlbiwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duKSB7DQoNCiAgICBpZiAoZGggJSAxMjggIT0gMCB8fCBkZSAlIDEyOCAhPSAwKSByZXR1cm47DQoNCiAgICB1c2luZyB1aW50NjRfdCA9IHVuc2lnbmVkIGxvbmcgbG9uZzsNCg0KICAgIF9faGFsZiAqaW5wdXRfcHRyICAgPSAoX19oYWxmICopdF9pbnB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgIC8vIFtuLCBkaF0NCiAgICBfX2hhbGYgKnJvdXRlcl9wdHIgID0gKF9faGFsZiAqKXRfcm91dGVyLmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlLCBkaF0NCiAgICBfX2hhbGYgKmdhdGVfVF9wdHIgID0gKF9faGFsZiAqKXRfZ2F0ZV9ULmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICp1cF9UX3B0ciAgICA9IChfX2hhbGYgKil0X3VwX1QuZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqZG93bl9UX3B0ciAgPSAoX19oYWxmICopdF9kb3duX1QuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKmdhdGVfcHRyICAgID0gKF9faGFsZiAqKXRfZ2F0ZS5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICp1cF9wdHIgICAgICA9IChfX2hhbGYgKil0X3VwLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqZG93bl9wdHIgICAgPSAoX19oYWxmICopdF9kb3duLmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBfX2hhbGYgKm91dHB1dF9wdHIgID0gKF9faGFsZiAqKXRfb3V0cHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbiwgZGhdDQoNCiAgICBmbG9hdCAqc2NvcmVfZnAzMiA9IChmbG9hdCAqKXRfc2NvcmVfZnAzMi5kYXRhX3B0cigpOyAgICAgICAgIC8vIFtuLCBucmVdDQogICAgX19oYWxmICpzY29yZV9mcDE2ID0gKF9faGFsZiAqKXRfc2NvcmVfZnAxNi5kYXRhX3B0cigpOyAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqZXhwZXJ0X29mZnNldCA9IChpbnQgKil0X2V4cGVydF9vZmZzZXQuZGF0YV9wdHIoKTsgICAgICAgLy8gW25yZV0NCiAgICBfX2hhbGYgKmlucHV0X3Jlb3JkZXIgPSAoX19oYWxmICopdF9pbnB1dF9yZW9yZGVyLmRhdGFfcHRyKCk7IC8vIFtuICogZXB0LCBkaF0NCiAgICBmbG9hdCAqb3V0cHV0X2dhdGUgPSAoZmxvYXQgKil0X291dHB1dF9nYXRlLmRhdGFfcHRyKCk7ICAgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgIGZsb2F0ICpvdXRwdXRfdXAgPSAoZmxvYXQgKil0X291dHB1dF91cC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgX19oYWxmICpoaWRkZW4gPSAoX19oYWxmICopdF9oaWRkZW4uZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkZV0NCiAgICBmbG9hdCAqb3V0cHV0X2Rvd24gPSAoZmxvYXQgKil0X291dHB1dF9kb3duLmRhdGFfcHRyKCk7ICAgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgLy8gdHJhbnNwb3NlDQogICAgdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkaC82NCwgZGUvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGgsIGRlLCBnYXRlX3B0ciwgZ2F0ZV9UX3B0cik7DQogICAgdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkaC82NCwgZGUvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGgsIGRlLCB1cF9wdHIgICwgdXBfVF9wdHIgICk7DQogICAgdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkZS82NCwgZGgvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGUsIGRoLCBkb3duX3B0ciwgZG93bl9UX3B0cik7DQoNCiAgICAvLyBleHBlcnQgc2NvcmUNCiAgICAvLyBmbG9hdCAqc2NvcmVfZnAzMjsgLy8gW24sIG5yZV0NCiAgICBoZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobisxMjcpLzEyOCwgKG5yZSsxMjcpLzEyOCksIGRpbTMoNjQsIDQpPj4+DQogICAgICAgIChpbnB1dF9wdHIsIHJvdXRlcl9wdHIsIHNjb3JlX2ZwMzIsIG4sIG5yZSwgZGgpOw0KICAgIC8vIF9faGFsZiAqc2NvcmVfZnAxNjsgLy8gW24sIG5yZV0NCiAgICBzb2Z0bWF4X2ZwMzJfZnAxNjw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgbiwgbnJlKTsNCg0KICAgIC8vIHRvcGsgc2NvcmUNCiAgICAvLyBpbnQgKnRvcF9pbmRpY2VzOyAvLyBbbiwgZXB0XQ0KICAgIHRvcGtfZnAxNjw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCg0KICAgIC8vIHRva2VuIGNvdW50IG9mIGVhY2ggZXhwZXJ0DQogICAgLy8gaW50ICp0b2tlbl9jb3VudDsgLy8gW25yZV0NCg0KICAgIC8vIGluZGV4IGluIGV4cGVydCBvZiBlYWNoIHRva2VuLCBpIC0+IGV4cGVydCB0b2tlbiBpbmRleA0KICAgIC8vIGludCAqaW5kZXhfaW5fZXhwZXJ0OyAvLyBbbiwgZXB0XQ0KICAgIC8vIGNhbGN1bGF0ZV9pbmRleDw8PGRpbTMoKG5yZSs2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUpOw0KICAgIGhpcE1lbXNldCh0b2tlbl9jb3VudCwgMCwgbnJlICogc2l6ZW9mKGludCkpOw0KICAgIGNhbGN1bGF0ZV9pbmRleF92Mjw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4odG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlKTsNCiAgICBoaXBEZXZpY2VTeW5jaHJvbml6ZSgpOyAvLyBiZWNhdXNlIHRva2VuX2NvdW50IGlzIHVzZWQgYnkgaG9zdCBjb2RlDQoNCiAgICAvLyBleHBlcnQgb2Zmc2V0DQogICAgLy8gaW50ICpleHBlcnRfb2Zmc2V0OyAvLyBbbnJlXQ0KICAgIGNhbGN1bGF0ZV9vZmZzZXQ8PDxkaW0zKDEpLCBkaW0zKDEpPj4+KHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBucmUpOw0KDQogICAgLy8gcmVvcmRlciBpbnB1dA0KICAgIC8vIF9faGFsZiAqaW5wdXRfcmVvcmRlcjsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIHJlb3JkZXJfaW5wdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBleHBlcnRfb2Zmc2V0LCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQoNCiAgICBpbnQgbWF4X3Rva2VuX2NvdW50ID0gMDsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgIGlmICh0b2tlbl9jb3VudFtpXSA+IG1heF90b2tlbl9jb3VudCkgbWF4X3Rva2VuX2NvdW50ID0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KDQogICAgLy8gZ2F0ZSBvdXRwdXQNCiAgICAvLyBmbG9hdCAqb3V0cHV0X2dhdGU7IC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkZS8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgICAgIChpbnB1dF9yZW9yZGVyLCBnYXRlX3B0ciwgb3V0cHV0X2dhdGUsIG5yZSwgdG9rZW5fY291bnQsIGV4cGVydF9vZmZzZXQsIGRlLCBkaCk7DQogICAgYmF0Y2hlZF9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobisxMjcpLzEyOCwgZGUvMTI4LCBuc2UpLCBkaW0zKDY0LCA0KT4+Pg0KICAgICAgICAoaW5wdXRfcHRyLCBnYXRlX3B0ciArIG5yZSAqIGRoICogZGUsIG91dHB1dF9nYXRlICsgbiAqIGVwdCAqIGRlLCBuc2UsIG4sIGRlLCBkaCk7DQoNCiAgICAvLyB1cCBvdXRwdXQNCiAgICAvLyBmbG9hdCAqb3V0cHV0X3VwOyAvLyBbbiAqIChlcHQgKyBuc2UpLCBkZV0NCiAgICBtb2VfaGdlbW1fMTI4eDEyOHg2NDw8PGRpbTMoKG1heF90b2tlbl9jb3VudCsxMjcpLzEyOCwgZGUvMTI4LCBucmUpLCBkaW0zKDY0LCA0KT4+Pg0KICAgICAgICAoaW5wdXRfcmVvcmRlciwgdXBfcHRyLCBvdXRwdXRfdXAsIG5yZSwgdG9rZW5fY291bnQsIGV4cGVydF9vZmZzZXQsIGRlLCBkaCk7DQogICAgYmF0Y2hlZF9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobisxMjcpLzEyOCwgZGUvMTI4LCBuc2UpLCBkaW0zKDY0LCA0KT4+Pg0KICAgICAgICAoaW5wdXRfcHRyLCB1cF9wdHIgKyBucmUgKiBkaCAqIGRlLCBvdXRwdXRfdXAgKyBuICogZXB0ICogZGUsIG5zZSwgbiwgZGUsIGRoKTsNCg0KICAgIC8vIGhpZGRlbiBzdGF0ZTogc2lsdShvdXRwdXRfZ2F0ZSkgKiBvdXRwdXRfdXANCiAgICAvLyBfX2hhbGYgKmhpZGRlbjsgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgLy8gaGlwTWFsbG9jKCh2b2lkKiopJmhpZGRlbiwgbiAqIChlcHQgKyBuc2UpICogZGUgKiBzaXplb2YoX19oYWxmKSk7DQogICAgc2lsdV9nYXRlX211bF91cDw8PGRpbTMoKG4gKiAoZXB0ICsgbnNlKSArIDYzKSAvIDY0KSwgZGltMyg2NCk+Pj4ob3V0cHV0X2dhdGUsIG91dHB1dF91cCwgaGlkZGVuLCBuICogKGVwdCArIG5zZSksIGRlKTsNCg0KICAgIC8vIGRvd24gb3V0cHV0DQogICAgLy8gZmxvYXQgKm91dHB1dF9kb3duOyAvLyBbbiAqIChlcHQgKyBuc2UpLCBkaF0NCiAgICBtb2VfaGdlbW1fMTI4eDEyOHg2NDw8PGRpbTMoKG1heF90b2tlbl9jb3VudCsxMjcpLzEyOCwgZGgvMTI4LCBucmUpLCBkaW0zKDY0LCA0KT4+Pg0KICAgICAgICAoaGlkZGVuLCBkb3duX3B0ciwgb3V0cHV0X2Rvd24sIG5yZSwgdG9rZW5fY291bnQsIGV4cGVydF9vZmZzZXQsIGRoLCBkZSk7DQogICAgYmF0Y2hlZF9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobisxMjcpLzEyOCwgZGgvMTI4LCBuc2UpLCBkaW0zKDY0LCA0KT4+Pg0KICAgICAgICAoaGlkZGVuICsgbiAqIGVwdCAqIGRlLCBkb3duX3B0ciArIG5yZSAqIGRlICogZGgsIG91dHB1dF9kb3duICsgbiAqIGVwdCAqIGRoLCBuc2UsIG4sIGRoLCBkZSk7DQoNCiAgICAvLyBwYWNrIG91dHB1dA0KICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd24sIG91dHB1dF9wdHIsIHNjb3JlX2ZwMTYsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCk7DQoNCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQoNCm1vZHVsZSA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J21vZScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9Wydtb2UnXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCIsICItTzMiLCAiLXciXSwNCikNCg0KZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6DQogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhDQoNCiAgICBkaCA9IGNvbmZpZ1siZF9oaWRkZW4iXQ0KICAgIGRlID0gY29uZmlnWyJkX2V4cGVydCJdDQogICAgbnJlID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0NCiAgICBuc2UgPSBjb25maWdbIm5fc2hhcmVkX2V4cGVydHMiXQ0KICAgIGVwdCA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdDQogICAgYnMgPSBjb25maWdbImJhdGNoX3NpemUiXQ0KICAgIHNsID0gY29uZmlnWyJzZXFfbGVuIl0NCg0KICAgIGlucHV0ICA9IGlucHV0X3RlbnNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFticywgc2wsIGRoXQ0KICAgIHJvdXRlciA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmUsIGRoXQ0KICAgIGdhdGVfVCA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICB1cF9UICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgZG93bl9UID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIGdhdGUgICA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGUsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICB1cCAgICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRlLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgZG93biAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkaCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIG91dHB1dCA9IHRvcmNoLnplcm9zKGJzLCBzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAjIFticywgc2wsIGRoXQ0KICAgIGZvciBpIGluIHJhbmdlKG5yZSk6DQogICAgICAgIGdhdGVfVFtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwX1RbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQ0KICAgICAgICBkb3duX1RbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXQ0KICAgIGZvciBpIGluIHJhbmdlKG5zZSk6DQogICAgICAgIGdhdGVfVFtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J11bOiwgaSAqIGRlOihpICsgMSkgKiBkZV0NCiAgICAgICAgdXBfVFtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J11bOiwgaSAqIGRlOihpICsgMSkgKiBkZV0NCiAgICAgICAgZG93bl9UW25yZSArIGldID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXVtpICogZGU6KGkgKyAxKSAqIGRlLCA6XQ0KDQogICAgc2NvcmVfZnAzMiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBucmUsIGR0eXBlPXRvcmNoLmZsb2F0MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICAgICMgW2JzICogc2wsIG5yZV0NCiAgICBzY29yZV9mcDE2ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIG5yZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgbnJlXQ0KICAgIHRvcF9pbmRpY2VzID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICAgICAjIFticyAqIHNsLCBlcHRdDQogICAgdG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShucmUsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZV0NCiAgICBpbmRleF9pbl9leHBlcnQgPSB0b3JjaC5lbXB0eShicyAqIHNsICogZXB0LCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIGV4cGVydF9vZmZzZXQgPSB0b3JjaC5lbXB0eShucmUsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5wdXRfcmVvcmRlciA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICMgW2JzICogc2wgKiBlcHQsIGRoXQ0KICAgIG91dHB1dF9nYXRlID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGUsIGR0eXBlPXRvcmNoLmZsb2F0MzIsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF91cCA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGgsIGR0eXBlPXRvcmNoLmZsb2F0MzIsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRoXQ0KDQogICAgbW9kdWxlLm1vZShpbnB1dCwgcm91dGVyLCBnYXRlX1QsIHVwX1QsIGRvd25fVCwgZ2F0ZSwgdXAsIGRvd24sIG91dHB1dCwNCiAgICAgICAgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIGV4cGVydF9vZmZzZXQsDQogICAgICAgIGlucHV0X3Jlb3JkZXIsIG91dHB1dF9nYXRlLCBvdXRwdXRfdXAsIGhpZGRlbiwgb3V0cHV0X2Rvd24pDQogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file
+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgbW9lMSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9yb3V0ZXIsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGVfVCwgdG9yY2g6OlRlbnNvciB0X3VwX1QsIHRvcmNoOjpUZW5zb3IgdF9kb3duX1QsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDMyLCB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAxNiwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pOw0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZV9ULCB0b3JjaDo6VGVuc29yIHRfdXBfVCwgdG9yY2g6OlRlbnNvciB0X2Rvd25fVCwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMzIsIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDE2LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2V4cGVydF9vZmZzZXQsIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyLA0KICAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bik7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXBibGFzL2hpcGJsYXMuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCg0KI2RlZmluZSBPRkZTRVQocm93LCBjb2wsIGxkKSAoKHJvdykgKiAobGQpICsgKGNvbCkpDQojZGVmaW5lIFNXWihtLCBuKSAoKChtKSAqIDQgKyAobikpICUgNjQpIC8vIGJ5IGhhbGYNCg0KdXNpbmcgZmxvYXQxNiA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsNCnR5cGVkZWYgc3RydWN0IHsNCiAgICBmbG9hdDE2IHZhbFsyXVsyXTsNCn0gZmxvYXQxNl8yeDJfdDsNCnVzaW5nIGhhbGY0ID0gX19mcDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KdHlwZWRlZiBzdHJ1Y3Qgew0KICAgIGhhbGY0IHg7DQogICAgaGFsZjQgeTsNCn0gaGFsZjR4MjsNCg0KX19nbG9iYWxfXyB2b2lkIHNvZnRtYXhfZnAzMihjb25zdCBmbG9hdCAqaW5wdXQsIGZsb2F0ICpvdXRwdXQsIGludCBtLCBpbnQgbikgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIGZsb2F0IG1heF92YWwgPSBpbnB1dFtpZHggKiBuXTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IHZhbCA9IGlucHV0W2lkeCAqIG4gKyBpXTsNCiAgICAgICAgICAgIG1heF92YWwgPSB2YWwgPiBtYXhfdmFsID8gdmFsIDogbWF4X3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICBmbG9hdCBzdW0gPSAwLjBmOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IF9fZXhwZihpbnB1dFtpZHggKiBuICsgaV0gLSBtYXhfdmFsKTsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSBleHBfdmFsOw0KICAgICAgICAgICAgc3VtICs9IGV4cF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSBvdXRwdXRbaWR4ICogbiArIGldIC8gc3VtOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgc29mdG1heF9mcDMyX2ZwMTYoY29uc3QgZmxvYXQgKmlucHV0LCBfX2hhbGYgKm91dHB1dCwgaW50IG0sIGludCBuKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIF9faGFsZiB2YWwgPSBfX2Zsb2F0MmhhbGYoaW5wdXRbaWR4ICogbiArIGldKTsNCiAgICAgICAgICAgIG91dHB1dFtpZHggKiBuICsgaV0gPSB2YWw7DQogICAgICAgICAgICBtYXhfdmFsID0gX19oZ3QodmFsLCBtYXhfdmFsKSA/IHZhbCA6IG1heF92YWw7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgc3VtID0gMC4wZjsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgIGZsb2F0IGV4cF92YWwgPSBfX2V4cGYoX19oYWxmMmZsb2F0KG91dHB1dFtpZHggKiBuICsgaV0pIC0gX19oYWxmMmZsb2F0KG1heF92YWwpKTsNCiAgICAgICAgICAgIHN1bSArPSBleHBfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gX19leHBmKF9faGFsZjJmbG9hdChvdXRwdXRbaWR4ICogbiArIGldKSAtIF9faGFsZjJmbG9hdChtYXhfdmFsKSk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gX19mbG9hdDJoYWxmKGV4cF92YWwgLyBzdW0pOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wayhjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBjYWxjdWxhdGVfaW5kZXgoDQogICAgY29uc3QgaW50ICp0b3BfaW5kaWNlcywgaW50ICp0b2tlbl9jb3VudCwgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG4pIHsNCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlcHQ7ICsraikgew0KICAgICAgICAgICAgaW50IGV4cGVydCA9IHRvcF9pbmRpY2VzW2lkeCAqIGVwdCArIGpdOw0KICAgICAgICAgICAgaW50IG9mZnNldCA9IGF0b21pY0FkZCgmdG9rZW5fY291bnRbZXhwZXJ0XSwgMSk7DQogICAgICAgICAgICBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgal0gPSBvZmZzZXQ7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqZXhwZXJ0X29mZnNldCwgaW50ICppbmRleF9pbl9leHBlcnQsIF9faGFsZiAqaW5wdXRfcmVvcmRlciwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBkaCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXB0OyArK2kpIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9vZmZzZXRbZXhwZXJ0X2lkXSArIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueDsgaiA8IGRoOyBqICs9IDY0KSB7DQogICAgICAgICAgICAgICAgaW5wdXRfcmVvcmRlclt0b2tlbl9sb2NhdGlvbiAqIGRoICsgal0gPSBpbnB1dFtpZHggKiBkaCArIGpdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcGFja19vdXRwdXQoaGFsZiAqb3V0cHV0X2Rvd24sIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICp0b2tlbl9jb3VudCwgaW50ICpleHBlcnRfb2Zmc2V0LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBuc2UsIGludCBkaCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueDsgaiA8IGRoOyBqICs9IDY0KSB7DQogICAgICAgICAgICBmbG9hdCByZXN1bHQgPSAwLjBmOw0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcHQ7ICsraSkgew0KICAgICAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfb2Zmc2V0W2V4cGVydF9pZF0gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICAgICAgcmVzdWx0ICs9IF9faGFsZjJmbG9hdChzY29yZVtpZHggKiBucmUgKyBleHBlcnRfaWRdKSAqIF9faGFsZjJmbG9hdChvdXRwdXRfZG93blt0b2tlbl9sb2NhdGlvbiAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7ICsraSkgew0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBfX2hhbGYyZmxvYXQob3V0cHV0X2Rvd25bKG4gKiAobnJlICsgaSkgKyBpZHgpICogZGggKyBqXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2Zsb2F0MmhhbGYocmVzdWx0KTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRyYW5zcG9zZV9leHBlcnRfZnAxNl82NHg2NCgNCiAgICAgICAgaW50IG5fZXhwZXJ0cywgaW50IG0sIGludCBuLCBoYWxmKiBfX3Jlc3RyaWN0X18gZHN0LCBoYWxmKiBfX3Jlc3RyaWN0X18gc3JjKSB7DQoNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfZSA9IGJsb2NrSWR4Lno7DQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDY0Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfbSA9IHRocmVhZElkeC54IC8gODsNCiAgICBpbnQgdGhyZWFkX24gPSAodGhyZWFkSWR4LnggJSA4KSAqIDg7DQoNCiAgICBfX3NoYXJlZF9fIGNoYXIgc21lbVs2NF1bMTI5XTsNCg0KICAgIGhhbGY4IGRhdGFbOF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsNCiAgICAgICAgZGF0YVtpXSA9ICooaGFsZjggKikmc3JjW3RocmVhZF9ibG9ja19lICogbSAqIG4gKw0KICAgICAgICAgICAgKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20gKyBpKjgpICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dOw0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgew0KICAgICAgICAgICAgKihfX2ZwMTYgKikmc21lbVt0aHJlYWRfbiArIGpdWyh0aHJlYWRfbSArIDgqaSkgKiAyXSA9IGRhdGFbaV1bal07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgew0KICAgICAgICAqKGhhbGY4ICopJmRzdFt0aHJlYWRfYmxvY2tfZSAqIG0gKiBuICsNCiAgICAgICAgICAgICh0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9tICsgaSo4KSAqIG0gKyB0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9uXSA9DQogICAgICAgICAgICAqKGhhbGY4ICopJnNtZW1bdGhyZWFkX20gKyA4KmldW3RocmVhZF9uKjJdOw0KICAgIH0NCn0NCg0KX19kZXZpY2VfXyBfX2lubGluZV9fIGZsb2F0MTZfMngyX3QgaGdlbW1fMTI4eDEyOHg2NF9jbGVhbigNCiAgICBjb25zdCBoYWxmICphLCBjb25zdCBoYWxmICpiLCBpbnQgTSwgaW50IE4sIGludCBLLA0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2FbMTI4XVs2NF0sIF9fc2hhcmVkX18gaGFsZiBzX2JbMTI4XVs2NF0pIHsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXJwX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDY0Ow0KICAgIGludCB3YXJwX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAzMikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gdGhyZWFkSWR4LnggJSAzMjsNCg0KICAgIC8vIExER1NUUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBzdHNfbW4gPSB0aHJlYWRJZHgueSAqIDggKyB0aHJlYWRJZHgueCAvIDg7DQogICAgaW50IHN0c19rID0gKHRocmVhZElkeC54ICUgOCkgKiA4OyAvLyBieSBoYWxmDQogICAgaW50IGxkZ19tID0gdGhyZWFkX2Jsb2NrX20gKyBzdHNfbW47DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfbW47DQogICAgaW50IGxkZ19rID0gc3RzX2s7DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXJwX20gKyB0aHJlYWRJZHgueCAlIDMyOw0KICAgIGludCBsZHNfbiA9IHdhcnBfbiArIHRocmVhZElkeC54ICUgMzI7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMzIpICogNDsgLy8gYnkgaGFsZg0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXJwX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhcnBfbiArIHRocmVhZF9jX247DQoNCiAgICBmbG9hdDE2XzJ4Ml90IHRpbGVfZCA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBLLzY0OyBpYisrKSB7DQogICAgICAgIGhhbGY0eDIgbGRnX2FbNF0sIGxkZ19iWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgNDsgaWkrKykgew0KICAgICAgICAgICAgLy8gbGRnX2FbaWldID0gKihoYWxmNHgyICopJmFbT0ZGU0VUKGxkZ19tICsgaWkqMzIsIGxkZ19rICsgaWIqNjQsIEspXTsNCiAgICAgICAgICAgIC8vIGxkZ19iW2lpXSA9ICooaGFsZjR4MiAqKSZiW09GRlNFVChsZGdfbiArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV07DQogICAgICAgICAgICBsZGdfYVtpaV0gPSBsZGdfbSArIGlpKjMyIDwgTSA/ICooaGFsZjR4MiAqKSZhW09GRlNFVChsZGdfbSArIGlpKjMyLCBsZGdfayArIGliKjY0LCBLKV0gOiBoYWxmNHgyezAsIDB9Ow0KICAgICAgICAgICAgbGRnX2JbaWldID0gbGRnX24gKyBpaSozMiA8IE4gPyAqKGhhbGY0eDIgKikmYltPRkZTRVQobGRnX24gKyBpaSozMiwgbGRnX2sgKyBpYio2NCwgSyldIDogaGFsZjR4MnswLCAwfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYVtzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgICAgKV0gPSBsZGdfYVtpaV0ueDsNCiAgICAgICAgICAgICooaGFsZjQgKikmc19hW3N0c19tbiArIGlpKjMyXVtTV1ooc3RzX21uLCBzdHNfayArIDQpXSA9IGxkZ19hW2lpXS55Ow0KICAgICAgICAgICAgKihoYWxmNCAqKSZzX2Jbc3RzX21uICsgaWkqMzJdW1NXWihzdHNfbW4sIHN0c19rICAgICldID0gbGRnX2JbaWldLng7DQogICAgICAgICAgICAqKGhhbGY0ICopJnNfYltzdHNfbW4gKyBpaSozMl1bU1daKHN0c19tbiwgc3RzX2sgKyA0KV0gPSBsZGdfYltpaV0ueTsNCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBoYWxmNCB0aWxlX2FbMl1bOF0sIHRpbGVfYlsyXVs4XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA4OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGhhbGY0ICopJnNfYVtsZHNfbSArIGlpKjMyXVtTV1oobGRzX20sIGxkc19rICsga2sqOCldOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgODsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYltpaV1ba2tdID0gKihoYWxmNCAqKSZzX2JbbGRzX24gKyBpaSozMl1bU1daKGxkc19uLCBsZHNfayArIGtrKjgpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgODsga2srKykgew0KICAgICAgICAgICAgICAgICAgICB0aWxlX2QudmFsW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDhmMTYodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCB0aWxlX2QudmFsW2lpXVtqal0sIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICByZXR1cm4gdGlsZV9kOw0KfQ0KDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDIpDQpfX2dsb2JhbF9fIHZvaWQgaGdlbW1fMTI4eDEyOHg2NCgNCiAgICBjb25zdCBoYWxmICphLCBjb25zdCBoYWxmICpiLCBmbG9hdCAqYywgaW50IE0sIGludCBOLCBpbnQgSykgew0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKCBhLCBiLCBNLCBOLCBLLCBzX2EsIHNfYik7DQoNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBsbCA9IDA7IGxsIDwgNDsgbGwrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMzIgKyBrayo4ICsgbGwgPCBNICYmIGNfbiArIGpqKjMyIDwgTikNCiAgICAgICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0gPSB0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBtb2VfaGdlbW1fMTI4eDEyOHg2NCgNCiAgICBjb25zdCBoYWxmICphX3B0ciwgY29uc3QgaGFsZiAqYl9wdHIsIGhhbGYgKmNfcHRyLCBpbnQgbnJlLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaW50IE0gPSB0b2tlbl9jb3VudFtibG9ja0lkeC56XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCiAgICBpZiAodGhyZWFkX2Jsb2NrX20gPj0gTSkgcmV0dXJuOw0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgZXhwZXJ0X29mZnNldFtibG9ja0lkeC56XSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGV4cGVydF9vZmZzZXRbYmxvY2tJZHguel0gKiBOOw0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKGEsIGIsIE0sIE4sIEssIHNfYSwgc19iKTsNCg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGxsID0gMDsgbGwgPCA0OyBsbCsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSozMiArIGtrKjggKyBsbCA8IE0gJiYgY19uICsgamoqMzIgPCBOKQ0KICAgICAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSA9IF9fZmxvYXQyaGFsZih0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2xhdW5jaF9ib3VuZHNfXygyNTYsIDIpDQpfX2dsb2JhbF9fIHZvaWQgYmF0Y2hlZF9oZ2VtbV8xMjh4MTI4eDY0KA0KICAgIGNvbnN0IGhhbGYgKmFfcHRyLCBjb25zdCBoYWxmICpiX3B0ciwgaGFsZiAqY19wdHIsIGludCBicywgaW50IE0sIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgYmxvY2tJZHgueiAqIE0gKiBLOw0KICAgIGNvbnN0IGhhbGYgKmIgPSBiX3B0ciArIGJsb2NrSWR4LnogKiBOICogSzsNCiAgICBoYWxmICpjID0gY19wdHIgKyBibG9ja0lkeC56ICogTSAqIE47DQoNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19hWzEyOF1bNjRdOw0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2JbMTI4XVs2NF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgd2FycF9tID0gKHRocmVhZElkeC55IC8gMikgKiA2NDsNCiAgICBpbnQgd2FycF9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9IHRocmVhZElkeC54ICUgMzI7DQoNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXJwX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhcnBfbiArIHRocmVhZF9jX247DQoNCiAgICBmbG9hdDE2XzJ4Ml90IHRpbGVfZCA9IGhnZW1tXzEyOHgxMjh4NjRfY2xlYW4oYSwgYiwgTSwgTiwgSywgc19hLCBzX2IpOw0KDQogICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDI7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQgbGwgPSAwOyBsbCA8IDQ7IGxsKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNfbSArIGlpKjMyICsga2sqOCArIGxsIDwgTSAmJiBjX24gKyBqaiozMiA8IE4pDQogICAgICAgICAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSozMiArIGtrKjggKyBsbCkgKiBOICsgY19uICsgamoqMzJdID0gX19mbG9hdDJoYWxmKHRpbGVfZC52YWxbaWldW2pqXVtrayo0ICsgbGxdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBtb2VfaGdlbW1fMTI4eDEyOHg2NF9zaWx1X211bCgNCiAgICBjb25zdCBoYWxmICphX3B0ciwgY29uc3QgaGFsZiAqYl9wdHIsIGhhbGYgKmNfcHRyLCBpbnQgbnJlLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCBOLCBpbnQgSykgew0KDQogICAgY29uc3QgaW50IE0gPSB0b2tlbl9jb3VudFtibG9ja0lkeC56XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCiAgICBpZiAodGhyZWFkX2Jsb2NrX20gPj0gTSkgcmV0dXJuOw0KDQogICAgY29uc3QgaGFsZiAqYSA9IGFfcHRyICsgZXhwZXJ0X29mZnNldFtibG9ja0lkeC56XSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGV4cGVydF9vZmZzZXRbYmxvY2tJZHguel0gKiBOOw0KDQogICAgX19zaGFyZWRfXyBoYWxmIHNfYVsxMjhdWzY0XTsNCiAgICBfX3NoYXJlZF9fIGhhbGYgc19iWzEyOF1bNjRdOw0KDQogICAgaW50IHdhcnBfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogNjQ7DQogICAgaW50IHdhcnBfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDMyKSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSB0aHJlYWRJZHgueCAlIDMyOw0KDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2FycF9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXJwX24gKyB0aHJlYWRfY19uOw0KDQogICAgZmxvYXQxNl8yeDJfdCB0aWxlX2QgPSBoZ2VtbV8xMjh4MTI4eDY0X2NsZWFuKGEsIGIsIE0sIE4sIEssIHNfYSwgc19iKTsNCg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGxsID0gMDsgbGwgPCA0OyBsbCsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSozMiArIGtrKjggKyBsbCA8IE0gJiYgY19uICsgamoqMzIgPCBOKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvcmkgPSBfX2hhbGYyZmxvYXQoY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB0aWxlX2QudmFsW2lpXVtqal1ba2sqNCArIGxsXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNpbHVfdmFsID0gdmFsICogKDEuMGYgLyAoMS4wZiArIF9fZXhwZigtdmFsKSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMzIgKyBrayo4ICsgbGwpICogTiArIGNfbiArIGpqKjMyXSA9IF9fZmxvYXQyaGFsZihvcmkgKiBzaWx1X3ZhbCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fbGF1bmNoX2JvdW5kc19fKDI1NiwgMikNCl9fZ2xvYmFsX18gdm9pZCBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjRfc2lsdV9tdWwoDQogICAgY29uc3QgaGFsZiAqYV9wdHIsIGNvbnN0IGhhbGYgKmJfcHRyLCBoYWxmICpjX3B0ciwgaW50IGJzLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQoNCiAgICBjb25zdCBoYWxmICphID0gYV9wdHIgKyBibG9ja0lkeC56ICogTSAqIEs7DQogICAgY29uc3QgaGFsZiAqYiA9IGJfcHRyICsgYmxvY2tJZHgueiAqIE4gKiBLOw0KICAgIGhhbGYgKmMgPSBjX3B0ciArIGJsb2NrSWR4LnogKiBNICogTjsNCg0KICAgIF9fc2hhcmVkX18gaGFsZiBzX2FbMTI4XVs2NF07DQogICAgX19zaGFyZWRfXyBoYWxmIHNfYlsxMjhdWzY0XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXJwX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDY0Ow0KICAgIGludCB3YXJwX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAzMikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gdGhyZWFkSWR4LnggJSAzMjsNCg0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhcnBfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2FycF9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGZsb2F0MTZfMngyX3QgdGlsZV9kID0gaGdlbW1fMTI4eDEyOHg2NF9jbGVhbihhLCBiLCBNLCBOLCBLLCBzX2EsIHNfYik7DQoNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBsbCA9IDA7IGxsIDwgNDsgbGwrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMzIgKyBrayo4ICsgbGwgPCBNICYmIGNfbiArIGpqKjMyIDwgTikgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3JpID0gX19oYWxmMmZsb2F0KGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsID0gdGlsZV9kLnZhbFtpaV1bampdW2trKjQgKyBsbF07DQogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzaWx1X3ZhbCA9IHZhbCAqICgxLjBmIC8gKDEuMGYgKyBfX2V4cGYoLXZhbCkpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjMyICsga2sqOCArIGxsKSAqIE4gKyBjX24gKyBqaiozMl0gPSBfX2Zsb2F0MmhhbGYob3JpICogc2lsdV92YWwpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQp2b2lkIG1vZTEodG9yY2g6OlRlbnNvciB0X2lucHV0LCB0b3JjaDo6VGVuc29yIHRfcm91dGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGVfVCwgdG9yY2g6OlRlbnNvciB0X3VwX1QsIHRvcmNoOjpUZW5zb3IgdF9kb3duX1QsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZV9mcDMyLCB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAxNiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bikgew0KDQogICAgaWYgKGRoICUgMTI4ICE9IDAgfHwgZGUgJSAxMjggIT0gMCkgcmV0dXJuOw0KDQogICAgdXNpbmcgdWludDY0X3QgPSB1bnNpZ25lZCBsb25nIGxvbmc7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpyb3V0ZXJfcHRyICA9IChfX2hhbGYgKil0X3JvdXRlci5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSwgZGhdDQogICAgX19oYWxmICpnYXRlX1RfcHRyICA9IChfX2hhbGYgKil0X2dhdGVfVC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqdXBfVF9wdHIgICAgPSAoX19oYWxmICopdF91cF9ULmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBfX2hhbGYgKmRvd25fVF9wdHIgID0gKF9faGFsZiAqKXRfZG93bl9ULmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpnYXRlX3B0ciAgICA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqdXBfcHRyICAgICAgPSAoX19oYWxmICopdF91cC5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKmRvd25fcHRyICAgID0gKF9faGFsZiAqKXRfZG93bi5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgZmxvYXQgKnNjb3JlX2ZwMzIgPSAoZmxvYXQgKil0X3Njb3JlX2ZwMzIuZGF0YV9wdHIoKTsgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIF9faGFsZiAqc2NvcmVfZnAxNiA9IChfX2hhbGYgKil0X3Njb3JlX2ZwMTYuZGF0YV9wdHIoKTsgICAgICAgLy8gW24sIG5yZV0NCiAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgaW50ICp0b2tlbl9jb3VudCA9IChpbnQgKil0X3Rva2VuX2NvdW50LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlXQ0KICAgIGludCAqaW5kZXhfaW5fZXhwZXJ0ID0gKGludCAqKXRfaW5kZXhfaW5fZXhwZXJ0LmRhdGFfcHRyKCk7ICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKmV4cGVydF9vZmZzZXQgPSAoaW50ICopdF9leHBlcnRfb2Zmc2V0LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtucmVdDQogICAgX19oYWxmICppbnB1dF9yZW9yZGVyID0gKF9faGFsZiAqKXRfaW5wdXRfcmVvcmRlci5kYXRhX3B0cigpOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgX19oYWxmICpoaWRkZW4gPSAoX19oYWxmICopdF9oaWRkZW4uZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkZV0NCiAgICBfX2hhbGYgKm91dHB1dF9kb3duID0gKF9faGFsZiAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgLy8gdHJhbnNwb3NlDQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkaC82NCwgZGUvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGgsIGRlLCBnYXRlX3B0ciwgZ2F0ZV9UX3B0cik7DQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkaC82NCwgZGUvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGgsIGRlLCB1cF9wdHIgICwgdXBfVF9wdHIgICk7DQogICAgLy8gdHJhbnNwb3NlX2V4cGVydF9mcDE2XzY0eDY0PDw8ZGltMyhkZS82NCwgZGgvNjQsIG5yZSArIG5zZSksIGRpbTMoNjQpPj4+KG5yZSArIG5zZSwgZGUsIGRoLCBkb3duX3B0ciwgZG93bl9UX3B0cik7DQoNCiAgICAvLyBleHBlcnQgc2NvcmUNCiAgICAvLyBmbG9hdCAqc2NvcmVfZnAzMjsgLy8gW24sIG5yZV0NCiAgICBoZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobisxMjcpLzEyOCwgKG5yZSsxMjcpLzEyOCksIGRpbTMoNjQsIDQpPj4+DQogICAgICAgIChpbnB1dF9wdHIsIHJvdXRlcl9wdHIsIHNjb3JlX2ZwMzIsIG4sIG5yZSwgZGgpOw0KICAgIC8vIF9faGFsZiAqc2NvcmVfZnAxNjsgLy8gW24sIG5yZV0NCiAgICBzb2Z0bWF4X2ZwMzJfZnAxNjw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgbiwgbnJlKTsNCg0KICAgIC8vIGludCAqdG9wX2luZGljZXM7IC8vIFtuLCBlcHRdLCB0b3BrIHNjb3JlDQogICAgdG9wazw8PGRpbTMoKG4rNjMpLzY0KSwgZGltMyg2NCk+Pj4oc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCg0KICAgIC8vIGludCAqdG9rZW5fY291bnQ7IC8vIFtucmVdLCB0b2tlbiBjb3VudCBvZiBlYWNoIGV4cGVydA0KICAgIC8vIGludCAqaW5kZXhfaW5fZXhwZXJ0OyAvLyBbbiwgZXB0XSwgaW5kZXggaW4gZXhwZXJ0IG9mIGVhY2ggdG9rZW4sIGkgLT4gZXhwZXJ0IHRva2VuIGluZGV4DQogICAgaGlwTWVtc2V0KHRva2VuX2NvdW50LCAwLCBucmUgKiBzaXplb2YoaW50KSk7DQogICAgY2FsY3VsYXRlX2luZGV4PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUpOw0KDQogICAgLy8gZXhwZXJ0IG9mZnNldA0KICAgIC8vIGludCAqZXhwZXJ0X29mZnNldDsgLy8gW25yZV0NCiAgICB7DQogICAgICAgIGludCBvZmZzZXQgPSAwOw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgICAgICBleHBlcnRfb2Zmc2V0W2ldID0gaSAqIG47DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyByZW9yZGVyIGlucHV0DQogICAgLy8gX19oYWxmICppbnB1dF9yZW9yZGVyOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgcmVvcmRlcl9pbnB1dDw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGV4cGVydF9vZmZzZXQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCg0KICAgIC8vIGludCBtYXhfdG9rZW5fY291bnQgPSAwOw0KICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAvLyAgICAgaWYgKHRva2VuX2NvdW50W2ldID4gbWF4X3Rva2VuX2NvdW50KSBtYXhfdG9rZW5fY291bnQgPSB0b2tlbl9jb3VudFtpXTsNCiAgICAvLyB9DQoNCiAgICAvLyBoaWRkZW4gc3RhdGU6IHNpbHUob3V0cHV0X2dhdGUpICogb3V0cHV0X3VwDQogICAgLy8gX19oYWxmICpoaWRkZW47IC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkZS8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9yZW9yZGVyLCB1cF9wdHIsIGhpZGRlbiwgbnJlLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgZGUsIGRoKTsNCiAgICAvLyBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjQ8PDxkaW0zKChuKzEyNykvMTI4LCBkZS8xMjgsIG5zZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9wdHIsIHVwX3B0ciArIG5yZSAqIGRoICogZGUsIGhpZGRlbiArIG4gKiBlcHQgKiBkZSwgbnNlLCBuLCBkZSwgZGgpOw0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0X3NpbHVfbXVsPDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkZS8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChpbnB1dF9yZW9yZGVyLCBnYXRlX3B0ciwgaGlkZGVuLCBucmUsIHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBkZSwgZGgpOw0KICAgIC8vIGJhdGNoZWRfaGdlbW1fMTI4eDEyOHg2NF9zaWx1X211bDw8PGRpbTMoKG4rMTI3KS8xMjgsIGRlLzEyOCwgbnNlKSwgZGltMyg2NCwgNCk+Pj4NCiAgICAvLyAgICAgKGlucHV0X3B0ciwgZ2F0ZV9wdHIgKyBucmUgKiBkaCAqIGRlLCBoaWRkZW4gKyBuICogZXB0ICogZGUsIG5zZSwgbiwgZGUsIGRoKTsNCg0KICAgIC8vIGRvd24gb3V0cHV0DQogICAgLy8gaGFsZiAqb3V0cHV0X2Rvd247IC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KICAgIC8vIG1vZV9oZ2VtbV8xMjh4MTI4eDY0PDw8ZGltMygobWF4X3Rva2VuX2NvdW50KzEyNykvMTI4LCBkaC8xMjgsIG5yZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChoaWRkZW4sIGRvd25fcHRyLCBvdXRwdXRfZG93biwgbnJlLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgZGgsIGRlKTsNCiAgICAvLyBiYXRjaGVkX2hnZW1tXzEyOHgxMjh4NjQ8PDxkaW0zKChuKzEyNykvMTI4LCBkaC8xMjgsIG5zZSksIGRpbTMoNjQsIDQpPj4+DQogICAgLy8gICAgIChoaWRkZW4gKyBuICogZXB0ICogZGUsIGRvd25fcHRyICsgbnJlICogZGUgKiBkaCwgb3V0cHV0X2Rvd24gKyBuICogZXB0ICogZGgsIG5zZSwgbiwgZGgsIGRlKTsNCg0KICAgIC8vIHBhY2sgb3V0cHV0DQogICAgLy8gcGFja19vdXRwdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93biwgb3V0cHV0X3B0ciwgc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBleHBlcnRfb2Zmc2V0LCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlLCBuc2UsIGRoKTsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlX1QsIHRvcmNoOjpUZW5zb3IgdF91cF9ULCB0b3JjaDo6VGVuc29yIHRfZG93bl9ULA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmVfZnAzMiwgdG9yY2g6OlRlbnNvciB0X3Njb3JlX2ZwMTYsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pIHsNCg0KICAgIGlmIChkaCAlIDEyOCAhPSAwIHx8IGRlICUgMTI4ICE9IDApIHJldHVybjsNCg0KICAgIHVzaW5nIHVpbnQ2NF90ID0gdW5zaWduZWQgbG9uZyBsb25nOw0KDQogICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgIF9faGFsZiAqcm91dGVyX3B0ciAgPSAoX19oYWxmICopdF9yb3V0ZXIuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9UX3B0ciAgPSAoX19oYWxmICopdF9nYXRlX1QuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBfX2hhbGYgKnVwX1RfcHRyICAgID0gKF9faGFsZiAqKXRfdXBfVC5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpkb3duX1RfcHRyICA9IChfX2hhbGYgKil0X2Rvd25fVC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9wdHIgICAgPSAoX19oYWxmICopdF9nYXRlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKnVwX3B0ciAgICAgID0gKF9faGFsZiAqKXRfdXAuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpkb3duX3B0ciAgICA9IChfX2hhbGYgKil0X2Rvd24uZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X3B0ciAgPSAoX19oYWxmICopdF9vdXRwdXQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBkaF0NCg0KICAgIGZsb2F0ICpzY29yZV9mcDMyID0gKGZsb2F0ICopdF9zY29yZV9mcDMyLmRhdGFfcHRyKCk7ICAgICAgICAgLy8gW24sIG5yZV0NCiAgICBfX2hhbGYgKnNjb3JlX2ZwMTYgPSAoX19oYWxmICopdF9zY29yZV9mcDE2LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtuLCBucmVdDQogICAgaW50ICp0b3BfaW5kaWNlcyA9IChpbnQgKil0X3RvcF9pbmRpY2VzLmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqdG9rZW5fY291bnQgPSAoaW50ICopdF90b2tlbl9jb3VudC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZV0NCiAgICBpbnQgKmluZGV4X2luX2V4cGVydCA9IChpbnQgKil0X2luZGV4X2luX2V4cGVydC5kYXRhX3B0cigpOyAgIC8vIFtuLCBlcHRdDQogICAgaW50ICpleHBlcnRfb2Zmc2V0ID0gKGludCAqKXRfZXhwZXJ0X29mZnNldC5kYXRhX3B0cigpOyAgICAgICAvLyBbbnJlXQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIF9faGFsZiAqaGlkZGVuID0gKF9faGFsZiAqKXRfaGlkZGVuLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfZG93biA9IChfX2hhbGYgKil0X291dHB1dF9kb3duLmRhdGFfcHRyKCk7ICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkaF0NCg0KICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd24sIG91dHB1dF9wdHIsIHNjb3JlX2ZwMTYsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgZXhwZXJ0X29mZnNldCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCk7DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdtb2UnLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnbW9lMScsICdtb2UyJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8zIiwgIi13Il0sDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQ0KDQogICAgZGggPSBjb25maWdbImRfaGlkZGVuIl0NCiAgICBkZSA9IGNvbmZpZ1siZF9leHBlcnQiXQ0KICAgIG5yZSA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdDQogICAgbnNlID0gY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0NCiAgICBlcHQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQ0KICAgIGJzID0gY29uZmlnWyJiYXRjaF9zaXplIl0NCiAgICBzbCA9IGNvbmZpZ1sic2VxX2xlbiJdDQoNCiAgICBpbnB1dCAgPSBpbnB1dF90ZW5zb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbYnMsIHNsLCBkaF0NCiAgICByb3V0ZXIgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBkaF0NCiAgICBnYXRlX1QgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgdXBfVCAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkaCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIGRvd25fVCA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGUsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBnYXRlICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRlLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgdXAgICAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIGRvd24gICA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBvdXRwdXQgPSB0b3JjaC56ZXJvcyhicywgc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgIyBbYnMsIHNsLCBkaF0NCiAgICBmb3IgaSBpbiByYW5nZShucmUpOg0KICAgICAgICBnYXRlX1RbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQ0KICAgICAgICB1cF9UW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9UW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10NCiAgICBmb3IgaSBpbiByYW5nZShuc2UpOg0KICAgICAgICBnYXRlX1RbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIHVwX1RbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIGRvd25fVFtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J11baSAqIGRlOihpICsgMSkgKiBkZSwgOl0NCg0KICAgIHNjb3JlX2ZwMzIgPSB0b3JjaC5lbXB0eShicyAqIHNsICogbnJlLCBkdHlwZT10b3JjaC5mbG9hdDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAjIFticyAqIHNsLCBucmVdDQogICAgc2NvcmVfZnAxNiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBucmUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICAgICMgW2JzICogc2wsIG5yZV0NCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBleHBlcnRfb2Zmc2V0ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlXQ0KICAgICMgaW5wdXRfcmVvcmRlciA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICMgW2JzICogc2wgKiBlcHQsIGRoXQ0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRoXQ0KDQogICAgaW5wdXRfcmVvcmRlciA9IHRvcmNoLmVtcHR5KG5yZSwgYnMqc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQ0KDQogICAgbW9kdWxlLm1vZTEoaW5wdXQsIHJvdXRlciwgZ2F0ZV9ULCB1cF9ULCBkb3duX1QsIGdhdGUsIHVwLCBkb3duLCBvdXRwdXQsDQogICAgICAgIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlX2ZwMzIsIHNjb3JlX2ZwMTYsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBleHBlcnRfb2Zmc2V0LA0KICAgICAgICBpbnB1dF9yZW9yZGVyLCBoaWRkZW4sIG91dHB1dF9kb3duKQ0KDQogICAgbWF4X2NvdW50ID0gdG9yY2gubWF4KHRva2VuX2NvdW50KS5pdGVtKCkNCg0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9UWzpucmUsIDosIDpdKSkgKiB0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgdXBfVFs6bnJlLCA6LCA6XSkNCiAgICBoaWRkZW5bbnJlOiwgOiwgOl0gPSB0b3JjaC5ubi5mdW5jdGlvbmFsLnNpbHUodG9yY2gubWF0bXVsKGlucHV0LnZpZXcoYnMqc2wsIGRoKSwgZ2F0ZV9UW25yZTosIDosIDpdKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cF9UW25yZTosIDosIDpdKQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBicyAqIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW25yZSArIG5zZSwgYnMgKiBzbCwgZGhdDQogICAgb3V0cHV0X2Rvd25bOm5yZSwgOm1heF9jb3VudCwgOl0gPSB0b3JjaC5ibW0oaGlkZGVuWzpucmUsIDptYXhfY291bnQsIDpdLCBkb3duX1RbOm5yZSwgOiwgOl0pDQogICAgb3V0cHV0X2Rvd25bbnJlOiwgOiwgOl0gPSB0b3JjaC5ibW0oaGlkZGVuW25yZTosIDosIDpdLCBkb3duX1RbbnJlOiwgOiwgOl0pDQoNCiAgICBtb2R1bGUubW9lMihpbnB1dCwgcm91dGVyLCBnYXRlX1QsIHVwX1QsIGRvd25fVCwgZ2F0ZSwgdXAsIGRvd24sIG91dHB1dCwNCiAgICAgICAgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmVfZnAzMiwgc2NvcmVfZnAxNiwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIGV4cGVydF9vZmZzZXQsDQogICAgICAgIGlucHV0X3Jlb3JkZXIsIGhpZGRlbiwgb3V0cHV0X2Rvd24pDQogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file

Best evidence level for this revision: reported

JSON