Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 30338

KernelBot user 415 · 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-30338?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
4.62ms
#14 of 118
2025-06-01
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
11.0ms
#14 of 118
2025-06-01

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:7b1a15a6f239c7f29950581eec0b20709d303a409338484b4d9bf10ca009b787
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

amd-moe-submission.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIpOw0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnAxNi5oPg0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wayhjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCB0b3A0X25yZTMyKGNvbnN0IF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCBtKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA+PSBtKSByZXR1cm47DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBfX2hhbGYgcm93WzMyXTsNCiAgICAqKGZsb2F0NCAqKSZyb3dbMF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDBdOw0KICAgICooZmxvYXQ0ICopJnJvd1s4XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgOF07DQogICAgKihmbG9hdDQgKikmcm93WzE2XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMTZdOw0KICAgICooZmxvYXQ0ICopJnJvd1syNF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDI0XTsNCg0KICAgIGludCB0b3BfaWR4WzRdID0gey0xLCAtMSwgLTEsIC0xfTsNCiAgICBfX2hhbGYgdG9wX3ZhbFs0XSA9IHtfX2Zsb2F0MmhhbGYoLUlORklOSVRZKSwgX19mbG9hdDJoYWxmKC1JTkZJTklUWSksIF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpLCBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKX07DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFswXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMF0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzBdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFsxXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMV0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzFdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdIHx8IGogPT0gdG9wX2lkeFsxXSkgY29udGludWU7DQogICAgICAgIGlmIChfX2hndChyb3dbal0sIHRvcF92YWxbMl0pKSB7DQogICAgICAgICAgICB0b3BfdmFsWzJdID0gcm93W2pdOw0KICAgICAgICAgICAgdG9wX2lkeFsyXSA9IGo7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKGogPT0gdG9wX2lkeFswXSB8fCBqID09IHRvcF9pZHhbMV0gfHwgaiA9PSB0b3BfaWR4WzJdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFszXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbM10gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzNdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJnRvcF9pbmRpY2VzW2lkeCAqIDRdID0gKihmbG9hdDQgKikmdG9wX2lkeFswXTsNCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleCgNCiAgICBjb25zdCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0ID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgal07DQogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXRvbWljQWRkKCZ0b2tlbl9jb3VudFtleHBlcnRdLCAxKTsNCiAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBqXSA9IG9mZnNldDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbikgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBjb25zdCBpbnQgTlJFID0gMzI7DQogICAgY29uc3QgaW50IEVQVCA9IDQ7DQogICAgX19zaGFyZWRfXyBpbnQgYmxvY2tfY291bnRbTlJFXTsNCiAgICBfX3NoYXJlZF9fIGludCBibG9ja19vZmZzZXRbTlJFXTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4ID49IG4pIHJldHVybjsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IE5SRSkgew0KICAgICAgICBibG9ja19jb3VudFt0aHJlYWRJZHgueF0gPSAwOw0KICAgIH0NCg0KICAgIGludCB0aHJlYWRfb2Zmc2V0W0VQVF07DQogICAgaW50IHRocmVhZF9leHBlcnRbRVBUXTsNCiAgICAqKGZsb2F0NCAqKSZ0aHJlYWRfZXhwZXJ0WzBdID0gKihmbG9hdDQgKikmdG9wX2luZGljZXNbaWR4ICogRVBUICsgMF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFUFQ7IGkrKykgew0KICAgICAgICB0aHJlYWRfb2Zmc2V0W2ldID0gYXRvbWljQWRkKCZibG9ja19jb3VudFt0aHJlYWRfZXhwZXJ0W2ldXSwgMSk7DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54IDwgTlJFKSB7DQogICAgICAgIGJsb2NrX29mZnNldFt0aHJlYWRJZHgueF0gPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W3RocmVhZElkeC54XSwgYmxvY2tfY291bnRbdGhyZWFkSWR4LnhdKTsNCiAgICB9DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEVQVDsgaSsrKSB7DQogICAgICAgIHRocmVhZF9vZmZzZXRbaV0gKz0gYmxvY2tfb2Zmc2V0W3RocmVhZF9leHBlcnRbaV1dOw0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJmluZGV4X2luX2V4cGVydFtpZHggKiBFUFQgKyAwXSA9ICooZmxvYXQ0ICopJnRocmVhZF9vZmZzZXRbMF07DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0NCAqKSZpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IHZhbDsNCiAgICAgICAgICAgICAgICAvLyBpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IGlucHV0W2lkeCAqIGRoICsgal07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2OChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmluZGV4X2luX2V4cGVydCwgX19oYWxmICppbnB1dF9yZW9yZGVyLCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSwgaW50IGRoKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4Lng7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogNCArIGldOw0KICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIDQgKyBpXTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbYmxvY2tJZHgueCAqIDcxNjggKyBqXTsNCiAgICAgICAgICAgICooZmxvYXQ0ICopJmlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal0gPSB2YWw7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgaSsrKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBfX2hhbGYgdGhpc19zY29yZSA9IHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgemVyb3NbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKil6ZXJvczsNCiAgICAgICAgICAgICAgICBfX2hhbGYgdmFsWzhdLCByZXNbOF07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICAgICAgICAgICAgICAvLyBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIG91dHB1dF9kb3duW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSksIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7IGkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IGRoOyBqICs9IDY0ICogOCkgew0KICAgICAgICAgICAgICAgIF9faGFsZiB2YWxbOF0sIHJlc1s4XTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93bl9zZVsobiAqIGkgKyBpZHgpICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopcmVzID0gKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal07DQogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzW2tdID0gX19oYWRkKHZhbFtrXSwgcmVzW2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSAqKGhhbGY4ICopcmVzOw0KICAgICAgICAgICAgICAgIC8vIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9IF9faGFkZChvdXRwdXRfZG93blsobiAqIChucmUgKyBpKSArIGlkeCkgKiBkaCArIGpdLCBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcGFja19vdXRwdXRfZXB0NG5yZTMybnNlMWRoNzE2OChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgIF9faGFsZiByZXNbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAgICAgX19oYWxmIHRoaXNfc2NvcmUgPSBzY29yZVtpZHggKiAzMiArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgdmFsWzhdOw0KICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZChfX2htdWwodGhpc19zY29yZSwgdmFsW2tdKSwgcmVzW2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgew0KICAgICAgICAgICAgX19oYWxmIHZhbFs4XTsNCiAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duX3NlWyhuICogaSArIGlkeCkgKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZCh2YWxba10sIHJlc1trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIDcxNjggKyBqXSA9ICooaGFsZjggKilyZXM7DQogICAgfQ0KfQ0KDQppbnQgbW9lMSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsDQogICAgICAgICBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyKSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyKSB7DQogICAgICAgIHRvcDRfbnJlMzI8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHNjb3JlLCB0b3BfaW5kaWNlcywgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCiAgICB9DQoNCiAgICAvLyBpbnQgKnRva2VuX2NvdW50OyAvLyBbbnJlXSwgdG9rZW4gY291bnQgb2YgZWFjaCBleHBlcnQNCiAgICAvLyBpbnQgKmluZGV4X2luX2V4cGVydDsgLy8gW24sIGVwdF0sIGluZGV4IGluIGV4cGVydCBvZiBlYWNoIHRva2VuLCBpIC0+IGV4cGVydCB0b2tlbiBpbmRleA0KICAgIC8vIGhpcE1lbXNldCh0b2tlbl9jb3VudCwgMCwgbnJlICogc2l6ZW9mKGludCkpOw0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgdG9rZW5fY291bnRbaV0gPSAwOw0KICAgIH0NCiAgICBpZiAobnJlID09IDMyICYmIGVwdCA9PSA0KSB7DQogICAgICAgIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBjYWxjdWxhdGVfaW5kZXg8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSk7DQogICAgfQ0KDQogICAgLy8gcmVvcmRlciBpbnB1dA0KICAgIC8vIF9faGFsZiAqaW5wdXRfcmVvcmRlcjsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIGlmIChlcHQgPT0gNCAmJiBucmUgPT0gMzIgJiYgZGggPT0gNzE2OCkgew0KICAgICAgICByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2ODw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHJlb3JkZXJfaW5wdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQogICAgfQ0KDQogICAgaGlwRGV2aWNlU3luY2hyb25pemUoKTsNCiAgICBpbnQgbWF4X3Rva2VuX2NvdW50ID0gMDsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgIGlmICh0b2tlbl9jb3VudFtpXSA+IG1heF90b2tlbl9jb3VudCkgbWF4X3Rva2VuX2NvdW50ID0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KDQogICAgcmV0dXJuIG1heF90b2tlbl9jb3VudDsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fcmUgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9yZS5kYXRhX3B0cigpOw0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fc2UgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9zZS5kYXRhX3B0cigpOw0KDQogICAgaWYgKGVwdCA9PSA0ICYmIG5yZSA9PSAzMiAmJiBuc2UgPT0gMSAmJiBkaCA9PSA3MTY4KSB7DQogICAgICAgIHBhY2tfb3V0cHV0X2VwdDRucmUzMm5zZTFkaDcxNjg8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93bl9yZSwgb3V0cHV0X2Rvd25fc2UsIG91dHB1dF9wdHIsIHNjb3JlLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCwgbWF4X2NvdW50KTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBvdXRwdXRfcHRyLCBzY29yZSwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgsIG1heF9jb3VudCk7DQogICAgfQ0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgICA9IGlucHV0X3RlbnNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyICA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZV9yZSA9IHRvcmNoLmVtcHR5KG5yZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICMgW25yZSwgZGgsIGRlXQ0KICAgIHVwX3JlICAgPSB0b3JjaC5lbXB0eShucmUsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAjIFtucmUsIGRoLCBkZV0NCiAgICBkb3duX3JlID0gdG9yY2guZW1wdHkobnJlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgIyBbbnJlLCBkZSwgZGhdDQogICAgZ2F0ZV9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpICMgW25zZSwgZGgsIGRlXQ0KICAgIHVwX3NlICAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnZpZXcoZGgsIG5zZSwgZGUpLnRyYW5zcG9zZSgwLCAxKSAjIFtuc2UsIGRoLCBkZV0NCiAgICBkb3duX3NlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS52aWV3KG5zZSwgZGUsIGRoKSAgICAgICAgICAgICAgICAgIyBbbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZV9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwX3JlW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBpbnB1dF9yZW9yZGVyID0gdG9yY2guZW1wdHkobnJlLCBicypzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICAjIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShicyAqIHNsICogKG5yZSArIG5zZSkgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW2JzICogc2wgKiAobnJlICsgbnNlKSwgZGhdDQoNCiAgICBzY29yZSA9IHRvcmNoLnNvZnRtYXgoaW5wdXQudmlldyhicypzbCwgZGgpIEAgcm91dGVyLlQsIGRpbT0xKSAgIyBbYnMgKiBzbCwgbnJlXQ0KDQogICAgbWF4X2NvdW50ID0gbW9kdWxlLm1vZTEoaW5wdXQsIG91dHB1dCwgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmUsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyKQ0KDQogICAgIyBoaWRkZW4gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkZV0NCiAgICAjIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKQ0KICAgICMgaGlkZGVuW25yZTosIDosIDpdID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIGdhdGVfc2UpKSAqIHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIHVwX3NlKQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkaF0NCiAgICAjIG91dHB1dF9kb3duWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2guYm1tKGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSwgZG93bl9yZSkNCiAgICAjIG91dHB1dF9kb3duW25yZTosIDosIDpdID0gdG9yY2guYm1tKGhpZGRlbltucmU6LCA6LCA6XSwgZG93bl9zZSkNCg0KICAgIGhpZGRlbl9yZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKSAjIFtucmUsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbl9zZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCBnYXRlX3NlKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cF9zZSkNCiAgICBvdXRwdXRfZG93bl9yZSA9IHRvcmNoLmJtbShoaWRkZW5fcmUsIGRvd25fcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICBvdXRwdXRfZG93bl9zZSA9IHRvcmNoLmJtbShoaWRkZW5fc2UsIGRvd25fc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnNlLCBicyAqIHNsLCBkaF0NCg0KICAgIG1vZHVsZS5tb2UyKGlucHV0LCBvdXRwdXQsIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgb3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBtYXhfY291bnQpDQogICAgcmV0dXJuIG91dHB1dA==

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 29642.

- IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfdXAsIHRvcmNoOjpUZW5zb3IgdF9kb3duLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlLCB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9rZW5fY291bnQsIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pOw0KaW50IG1vZTIodG9yY2g6OlRlbnNvciB0X2lucHV0LCB0b3JjaDo6VGVuc29yIHRfcm91dGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2dhdGUsIHRvcmNoOjpUZW5zb3IgdF91cCwgdG9yY2g6OlRlbnNvciB0X2Rvd24sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfb3V0cHV0LCBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9leHBlcnRfb2Zmc2V0LCB0b3JjaDo6VGVuc29yIHRfaW5wdXRfcmVvcmRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9oaWRkZW4sIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bik7DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwMTYuaD4NCg0KX19nbG9iYWxfXyB2b2lkIHNvZnRtYXhfZnAzMl9mcDE2KGNvbnN0IGZsb2F0ICppbnB1dCwgX19oYWxmICpvdXRwdXQsIGludCBtLCBpbnQgbikgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIF9faGFsZiBtYXhfdmFsID0gX19mbG9hdDJoYWxmKC1JTkZJTklUWSk7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBfX2hhbGYgdmFsID0gX19mbG9hdDJoYWxmKGlucHV0W2lkeCAqIG4gKyBpXSk7DQogICAgICAgICAgICBvdXRwdXRbaWR4ICogbiArIGldID0gdmFsOw0KICAgICAgICAgICAgbWF4X3ZhbCA9IF9faGd0KHZhbCwgbWF4X3ZhbCkgPyB2YWwgOiBtYXhfdmFsOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHN1bSA9IDAuMGY7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7DQogICAgICAgICAgICBmbG9hdCBleHBfdmFsID0gX19leHBmKF9faGFsZjJmbG9hdChvdXRwdXRbaWR4ICogbiArIGldKSAtIF9faGFsZjJmbG9hdChtYXhfdmFsKSk7DQogICAgICAgICAgICBzdW0gKz0gZXhwX3ZhbDsNCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgZmxvYXQgZXhwX3ZhbCA9IF9fZXhwZihfX2hhbGYyZmxvYXQob3V0cHV0W2lkeCAqIG4gKyBpXSkgLSBfX2hhbGYyZmxvYXQobWF4X3ZhbCkpOw0KICAgICAgICAgICAgb3V0cHV0W2lkeCAqIG4gKyBpXSA9IF9fZmxvYXQyaGFsZihleHBfdmFsIC8gc3VtKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRvcGsoY29uc3QgX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0sIGludCBuLCBpbnQgaykgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBtKSB7DQogICAgICAgIC8vIEZpbmQgdG9wLWsgaW5kaWNlcyBmb3Igcm93IGlkeA0KICAgICAgICAvLyBTaW1wbGUgc2VsZWN0aW9uIHNvcnQgZm9yIHNtYWxsIGsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIHsNCiAgICAgICAgICAgIF9faGFsZiBtYXhfdmFsID0gX19mbG9hdDJoYWxmKC1JTkZJTklUWSk7DQogICAgICAgICAgICBpbnQgbWF4X2lkeCA9IC0xOw0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opIHsNCiAgICAgICAgICAgICAgICBpZiAoX19oZ3QoaW5wdXRbaWR4ICogbiArIGpdLCBtYXhfdmFsKSkgew0KICAgICAgICAgICAgICAgICAgICBpbnQgZm91bmQgPSAwOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGk7ICsrbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBsXSA9PSBqKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfdmFsID0gaW5wdXRbaWR4ICogbiArIGpdOw0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lkeCA9IGo7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0b3BfaW5kaWNlc1tpZHggKiBrICsgaV0gPSBtYXhfaWR4Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgY2FsY3VsYXRlX2luZGV4KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXB0OyArK2opIHsNCiAgICAgICAgICAgIGludCBleHBlcnQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBqXTsNCiAgICAgICAgICAgIGludCBvZmZzZXQgPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W2V4cGVydF0sIDEpOw0KICAgICAgICAgICAgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGpdID0gb2Zmc2V0Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcmVvcmRlcl9pbnB1dChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmV4cGVydF9vZmZzZXQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfb2Zmc2V0W2V4cGVydF9pZF0gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lng7IGogPCBkaDsgaiArPSA2NCkgew0KICAgICAgICAgICAgICAgIGlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdID0gaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHBhY2tfb3V0cHV0KGhhbGYgKm91dHB1dF9kb3duLCBfX2hhbGYgKm91dHB1dF9wdHIsIGNvbnN0IF9faGFsZiAqc2NvcmUsIGludCAqdG9wX2luZGljZXMsIGludCAqZXhwZXJ0X29mZnNldCwgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lng7IGogPCBkaDsgaiArPSA2NCkgew0KICAgICAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wZjsNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXB0OyArK2kpIHsNCiAgICAgICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICAgICAgaW50IHRva2VuX2xvY2F0aW9uID0gZXhwZXJ0X29mZnNldFtleHBlcnRfaWRdICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgICAgIHJlc3VsdCArPSBfX2hhbGYyZmxvYXQoc2NvcmVbaWR4ICogbnJlICsgZXhwZXJ0X2lkXSkgKiBfX2hhbGYyZmxvYXQob3V0cHV0X2Rvd25bdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNlOyArK2kpIHsNCiAgICAgICAgICAgICAgICByZXN1bHQgKz0gX19oYWxmMmZsb2F0KG91dHB1dF9kb3duWyhuICogKG5yZSArIGkpICsgaWR4KSAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gX19mbG9hdDJoYWxmKHJlc3VsdCk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X3JvdXRlciwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9nYXRlLCB0b3JjaDo6VGVuc29yIHRfdXAsIHRvcmNoOjpUZW5zb3IgdF9kb3duLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X291dHB1dCwgaW50IGRoLCBpbnQgZGUsIGludCBucmUsIGludCBuc2UsIGludCBlcHQsIGludCBuLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Njb3JlLCB0b3JjaDo6VGVuc29yIHRfdG9wX2luZGljZXMsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfdG9rZW5fY291bnQsIHRvcmNoOjpUZW5zb3IgdF9pbmRleF9pbl9leHBlcnQsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZXhwZXJ0X29mZnNldCwgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfaGlkZGVuLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pIHsNCg0KICAgIGlmIChkaCAlIDEyOCAhPSAwIHx8IGRlICUgMTI4ICE9IDApIHJldHVybiAwOw0KDQogICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgIF9faGFsZiAqcm91dGVyX3B0ciAgPSAoX19oYWxmICopdF9yb3V0ZXIuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmUsIGRoXQ0KICAgIF9faGFsZiAqZ2F0ZV9wdHIgICAgPSAoX19oYWxmICopdF9nYXRlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKnVwX3B0ciAgICAgID0gKF9faGFsZiAqKXRfdXAuZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgX19oYWxmICpkb3duX3B0ciAgICA9IChfX2hhbGYgKil0X2Rvd24uZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X3B0ciAgPSAoX19oYWxmICopdF9vdXRwdXQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBkaF0NCg0KICAgIF9faGFsZiAqc2NvcmUgPSAoX19oYWxmICopdF9zY29yZS5kYXRhX3B0cigpOyAgICAgICAgICAgICAgICAgLy8gW24sIG5yZV0NCiAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgaW50ICp0b2tlbl9jb3VudCA9IChpbnQgKil0X3Rva2VuX2NvdW50LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlXQ0KICAgIGludCAqaW5kZXhfaW5fZXhwZXJ0ID0gKGludCAqKXRfaW5kZXhfaW5fZXhwZXJ0LmRhdGFfcHRyKCk7ICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKmV4cGVydF9vZmZzZXQgPSAoaW50ICopdF9leHBlcnRfb2Zmc2V0LmRhdGFfcHRyKCk7ICAgICAgIC8vIFtucmVdDQogICAgX19oYWxmICppbnB1dF9yZW9yZGVyID0gKF9faGFsZiAqKXRfaW5wdXRfcmVvcmRlci5kYXRhX3B0cigpOyAvLyBbbiAqIGVwdCwgZGhdDQogICAgX19oYWxmICpoaWRkZW4gPSAoX19oYWxmICopdF9oaWRkZW4uZGF0YV9wdHIoKTsgICAgICAgICAgICAgICAvLyBbbiAqIChlcHQgKyBuc2UpLCBkZV0NCiAgICBfX2hhbGYgKm91dHB1dF9kb3duID0gKF9faGFsZiAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCg0KICAgIC8vIGludCAqdG9rZW5fY291bnQ7IC8vIFtucmVdLCB0b2tlbiBjb3VudCBvZiBlYWNoIGV4cGVydA0KICAgIC8vIGludCAqaW5kZXhfaW5fZXhwZXJ0OyAvLyBbbiwgZXB0XSwgaW5kZXggaW4gZXhwZXJ0IG9mIGVhY2ggdG9rZW4sIGkgLT4gZXhwZXJ0IHRva2VuIGluZGV4DQogICAgaGlwTWVtc2V0KHRva2VuX2NvdW50LCAwLCBucmUgKiBzaXplb2YoaW50KSk7DQogICAgY2FsY3VsYXRlX2luZGV4PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUpOw0KICAgIGhpcERldmljZVN5bmNocm9uaXplKCk7DQoNCiAgICAvLyBleHBlcnQgb2Zmc2V0DQogICAgLy8gaW50ICpleHBlcnRfb2Zmc2V0OyAvLyBbbnJlXQ0KICAgIHsNCiAgICAgICAgaW50IG9mZnNldCA9IDA7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgICAgIGV4cGVydF9vZmZzZXRbaV0gPSBpICogbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIHJlb3JkZXIgaW5wdXQNCiAgICAvLyBfX2hhbGYgKmlucHV0X3Jlb3JkZXI7IC8vIFtuICogZXB0LCBkaF0NCiAgICByZW9yZGVyX2lucHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4oaW5wdXRfcHRyLCB0b3BfaW5kaWNlcywgZXhwZXJ0X29mZnNldCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyLCBuLCBlcHQsIG5yZSwgZGgpOw0KDQogICAgaW50IG1heF90b2tlbl9jb3VudCA9IDA7DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmU7IGkrKykgew0KICAgICAgICBpZiAodG9rZW5fY291bnRbaV0gPiBtYXhfdG9rZW5fY291bnQpIG1heF90b2tlbl9jb3VudCA9IHRva2VuX2NvdW50W2ldOw0KICAgIH0NCg0KICAgIHJldHVybiBtYXhfdG9rZW5fY291bnQ7DQp9DQoNCnZvaWQgbW9lMih0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9yb3V0ZXIsDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfZ2F0ZSwgdG9yY2g6OlRlbnNvciB0X3VwLCB0b3JjaDo6VGVuc29yIHRfZG93biwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2V4cGVydF9vZmZzZXQsIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2hpZGRlbiwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duKSB7DQoNCiAgICBpZiAoZGggJSAxMjggIT0gMCB8fCBkZSAlIDEyOCAhPSAwKSByZXR1cm47DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpyb3V0ZXJfcHRyICA9IChfX2hhbGYgKil0X3JvdXRlci5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW25yZSwgZGhdDQogICAgX19oYWxmICpnYXRlX3B0ciAgICA9IChfX2hhbGYgKil0X2dhdGUuZGF0YV9wdHIoKTsgICAgICAgICAgICAgLy8gW25yZSArIG5zZSwgZGUsIGRoXQ0KICAgIF9faGFsZiAqdXBfcHRyICAgICAgPSAoX19oYWxmICopdF91cC5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtucmUgKyBuc2UsIGRlLCBkaF0NCiAgICBfX2hhbGYgKmRvd25fcHRyICAgID0gKF9faGFsZiAqKXRfZG93bi5kYXRhX3B0cigpOyAgICAgICAgICAgICAvLyBbbnJlICsgbnNlLCBkaCwgZGVdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIGludCAqZXhwZXJ0X29mZnNldCA9IChpbnQgKil0X2V4cGVydF9vZmZzZXQuZGF0YV9wdHIoKTsgICAgICAgLy8gW25yZV0NCiAgICBfX2hhbGYgKmlucHV0X3Jlb3JkZXIgPSAoX19oYWxmICopdF9pbnB1dF9yZW9yZGVyLmRhdGFfcHRyKCk7IC8vIFtuICogZXB0LCBkaF0NCiAgICBfX2hhbGYgKmhpZGRlbiA9IChfX2hhbGYgKil0X2hpZGRlbi5kYXRhX3B0cigpOyAgICAgICAgICAgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRlXQ0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd24gPSAoX19oYWxmICopdF9vdXRwdXRfZG93bi5kYXRhX3B0cigpOyAgICAgLy8gW24gKiAoZXB0ICsgbnNlKSwgZGhdDQoNCiAgICBwYWNrX291dHB1dDw8PGRpbTMobiksIGRpbTMoNjQpPj4+KG91dHB1dF9kb3duLCBvdXRwdXRfcHRyLCBzY29yZSwgdG9wX2luZGljZXMsIGV4cGVydF9vZmZzZXQsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgpOw0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgID0gaW5wdXRfdGVuc29yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyID0gd2VpZ2h0c1sncm91dGVyLndlaWdodCddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZSAgID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBkaCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICMgW25yZSArIG5zZSwgZGgsIGRlXQ0KICAgIHVwICAgICA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIFtucmUgKyBuc2UsIGRoLCBkZV0NCiAgICBkb3duICAgPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGRlLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyBbbnJlICsgbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guemVyb3MoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bltpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQogICAgZm9yIGkgaW4gcmFuZ2UobnNlKToNCiAgICAgICAgZ2F0ZVtucmUgKyBpXSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J11bOiwgaSAqIGRlOihpICsgMSkgKiBkZV0NCiAgICAgICAgdXBbbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddWzosIGkgKiBkZTooaSArIDEpICogZGVdDQogICAgICAgIGRvd25bbnJlICsgaV0gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddW2kgKiBkZTooaSArIDEpICogZGUsIDpdDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBleHBlcnRfb2Zmc2V0ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlXQ0KICAgIGlucHV0X3Jlb3JkZXIgPSB0b3JjaC5lbXB0eShucmUsIGJzKnNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAjIFtucmUsIGJzICogc2wsIGRoXQ0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIChucmUgKyBuc2UpICogZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRoXQ0KDQogICAgc2NvcmUgPSB0b3JjaC5zb2Z0bWF4KGlucHV0LnZpZXcoYnMqc2wsIGRoKSBAIHJvdXRlci5ULCBkaW09MSkgICMgW2JzICogc2wsIG5yZV0NCg0KICAgIG1heF9jb3VudCA9IG1vZHVsZS5tb2UxKGlucHV0LCByb3V0ZXIsIGdhdGUsIHVwLCBkb3duLCBvdXRwdXQsDQogICAgICAgIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgZXhwZXJ0X29mZnNldCwNCiAgICAgICAgaW5wdXRfcmVvcmRlciwgaGlkZGVuLCBvdXRwdXRfZG93bikNCg0KICAgIGhpZGRlbiA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGUsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZVs6bnJlLCA6LCA6XSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwWzpucmUsIDosIDpdKQ0KICAgIGhpZGRlbltucmU6LCA6LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCBnYXRlW25yZTosIDosIDpdKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cFtucmU6LCA6LCA6XSkNCiAgICBvdXRwdXRfZG93biA9IHRvcmNoLmVtcHR5KG5yZSArIG5zZSwgYnMgKiBzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAjIFtucmUgKyBuc2UsIGJzICogc2wsIGRoXQ0KICAgIG91dHB1dF9kb3duWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2guYm1tKGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSwgZG93bls6bnJlLCA6LCA6XSkNCiAgICBvdXRwdXRfZG93bltucmU6LCA6LCA6XSA9IHRvcmNoLmJtbShoaWRkZW5bbnJlOiwgOiwgOl0sIGRvd25bbnJlOiwgOiwgOl0pDQoNCiAgICBtb2R1bGUubW9lMihpbnB1dCwgcm91dGVyLCBnYXRlLCB1cCwgZG93biwgb3V0cHV0LA0KICAgICAgICBkaCwgZGUsIG5yZSwgbnNlLCBlcHQsIGJzKnNsLA0KICAgICAgICBzY29yZSwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIGV4cGVydF9vZmZzZXQsDQogICAgICAgIGlucHV0X3Jlb3JkZXIsIGhpZGRlbiwgb3V0cHV0X2Rvd24pDQogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file
+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIpOw0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnAxNi5oPg0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wayhjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCB0b3A0X25yZTMyKGNvbnN0IF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCBtKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA+PSBtKSByZXR1cm47DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBfX2hhbGYgcm93WzMyXTsNCiAgICAqKGZsb2F0NCAqKSZyb3dbMF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDBdOw0KICAgICooZmxvYXQ0ICopJnJvd1s4XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgOF07DQogICAgKihmbG9hdDQgKikmcm93WzE2XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMTZdOw0KICAgICooZmxvYXQ0ICopJnJvd1syNF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDI0XTsNCg0KICAgIGludCB0b3BfaWR4WzRdID0gey0xLCAtMSwgLTEsIC0xfTsNCiAgICBfX2hhbGYgdG9wX3ZhbFs0XSA9IHtfX2Zsb2F0MmhhbGYoLUlORklOSVRZKSwgX19mbG9hdDJoYWxmKC1JTkZJTklUWSksIF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpLCBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKX07DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFswXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMF0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzBdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFsxXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMV0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzFdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdIHx8IGogPT0gdG9wX2lkeFsxXSkgY29udGludWU7DQogICAgICAgIGlmIChfX2hndChyb3dbal0sIHRvcF92YWxbMl0pKSB7DQogICAgICAgICAgICB0b3BfdmFsWzJdID0gcm93W2pdOw0KICAgICAgICAgICAgdG9wX2lkeFsyXSA9IGo7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKGogPT0gdG9wX2lkeFswXSB8fCBqID09IHRvcF9pZHhbMV0gfHwgaiA9PSB0b3BfaWR4WzJdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFszXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbM10gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzNdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJnRvcF9pbmRpY2VzW2lkeCAqIDRdID0gKihmbG9hdDQgKikmdG9wX2lkeFswXTsNCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleCgNCiAgICBjb25zdCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0ID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgal07DQogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXRvbWljQWRkKCZ0b2tlbl9jb3VudFtleHBlcnRdLCAxKTsNCiAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBqXSA9IG9mZnNldDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbikgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBjb25zdCBpbnQgTlJFID0gMzI7DQogICAgY29uc3QgaW50IEVQVCA9IDQ7DQogICAgX19zaGFyZWRfXyBpbnQgYmxvY2tfY291bnRbTlJFXTsNCiAgICBfX3NoYXJlZF9fIGludCBibG9ja19vZmZzZXRbTlJFXTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4ID49IG4pIHJldHVybjsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IE5SRSkgew0KICAgICAgICBibG9ja19jb3VudFt0aHJlYWRJZHgueF0gPSAwOw0KICAgIH0NCg0KICAgIGludCB0aHJlYWRfb2Zmc2V0W0VQVF07DQogICAgaW50IHRocmVhZF9leHBlcnRbRVBUXTsNCiAgICAqKGZsb2F0NCAqKSZ0aHJlYWRfZXhwZXJ0WzBdID0gKihmbG9hdDQgKikmdG9wX2luZGljZXNbaWR4ICogRVBUICsgMF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFUFQ7IGkrKykgew0KICAgICAgICB0aHJlYWRfb2Zmc2V0W2ldID0gYXRvbWljQWRkKCZibG9ja19jb3VudFt0aHJlYWRfZXhwZXJ0W2ldXSwgMSk7DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54IDwgTlJFKSB7DQogICAgICAgIGJsb2NrX29mZnNldFt0aHJlYWRJZHgueF0gPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W3RocmVhZElkeC54XSwgYmxvY2tfY291bnRbdGhyZWFkSWR4LnhdKTsNCiAgICB9DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEVQVDsgaSsrKSB7DQogICAgICAgIHRocmVhZF9vZmZzZXRbaV0gKz0gYmxvY2tfb2Zmc2V0W3RocmVhZF9leHBlcnRbaV1dOw0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJmluZGV4X2luX2V4cGVydFtpZHggKiBFUFQgKyAwXSA9ICooZmxvYXQ0ICopJnRocmVhZF9vZmZzZXRbMF07DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0NCAqKSZpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IHZhbDsNCiAgICAgICAgICAgICAgICAvLyBpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IGlucHV0W2lkeCAqIGRoICsgal07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2OChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmluZGV4X2luX2V4cGVydCwgX19oYWxmICppbnB1dF9yZW9yZGVyLCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSwgaW50IGRoKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4Lng7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogNCArIGldOw0KICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIDQgKyBpXTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbYmxvY2tJZHgueCAqIDcxNjggKyBqXTsNCiAgICAgICAgICAgICooZmxvYXQ0ICopJmlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal0gPSB2YWw7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgaSsrKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBfX2hhbGYgdGhpc19zY29yZSA9IHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgemVyb3NbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKil6ZXJvczsNCiAgICAgICAgICAgICAgICBfX2hhbGYgdmFsWzhdLCByZXNbOF07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICAgICAgICAgICAgICAvLyBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIG91dHB1dF9kb3duW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSksIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7IGkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IGRoOyBqICs9IDY0ICogOCkgew0KICAgICAgICAgICAgICAgIF9faGFsZiB2YWxbOF0sIHJlc1s4XTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93bl9zZVsobiAqIGkgKyBpZHgpICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopcmVzID0gKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal07DQogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzW2tdID0gX19oYWRkKHZhbFtrXSwgcmVzW2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSAqKGhhbGY4ICopcmVzOw0KICAgICAgICAgICAgICAgIC8vIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9IF9faGFkZChvdXRwdXRfZG93blsobiAqIChucmUgKyBpKSArIGlkeCkgKiBkaCArIGpdLCBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcGFja19vdXRwdXRfZXB0NG5yZTMybnNlMWRoNzE2OChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgIF9faGFsZiByZXNbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAgICAgX19oYWxmIHRoaXNfc2NvcmUgPSBzY29yZVtpZHggKiAzMiArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgdmFsWzhdOw0KICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZChfX2htdWwodGhpc19zY29yZSwgdmFsW2tdKSwgcmVzW2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgew0KICAgICAgICAgICAgX19oYWxmIHZhbFs4XTsNCiAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duX3NlWyhuICogaSArIGlkeCkgKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZCh2YWxba10sIHJlc1trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIDcxNjggKyBqXSA9ICooaGFsZjggKilyZXM7DQogICAgfQ0KfQ0KDQppbnQgbW9lMSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsDQogICAgICAgICBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyKSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyKSB7DQogICAgICAgIHRvcDRfbnJlMzI8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHNjb3JlLCB0b3BfaW5kaWNlcywgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCiAgICB9DQoNCiAgICAvLyBpbnQgKnRva2VuX2NvdW50OyAvLyBbbnJlXSwgdG9rZW4gY291bnQgb2YgZWFjaCBleHBlcnQNCiAgICAvLyBpbnQgKmluZGV4X2luX2V4cGVydDsgLy8gW24sIGVwdF0sIGluZGV4IGluIGV4cGVydCBvZiBlYWNoIHRva2VuLCBpIC0+IGV4cGVydCB0b2tlbiBpbmRleA0KICAgIC8vIGhpcE1lbXNldCh0b2tlbl9jb3VudCwgMCwgbnJlICogc2l6ZW9mKGludCkpOw0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgdG9rZW5fY291bnRbaV0gPSAwOw0KICAgIH0NCiAgICBpZiAobnJlID09IDMyICYmIGVwdCA9PSA0KSB7DQogICAgICAgIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBjYWxjdWxhdGVfaW5kZXg8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSk7DQogICAgfQ0KDQogICAgLy8gcmVvcmRlciBpbnB1dA0KICAgIC8vIF9faGFsZiAqaW5wdXRfcmVvcmRlcjsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIGlmIChlcHQgPT0gNCAmJiBucmUgPT0gMzIgJiYgZGggPT0gNzE2OCkgew0KICAgICAgICByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2ODw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHJlb3JkZXJfaW5wdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQogICAgfQ0KDQogICAgaGlwRGV2aWNlU3luY2hyb25pemUoKTsNCiAgICBpbnQgbWF4X3Rva2VuX2NvdW50ID0gMDsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgIGlmICh0b2tlbl9jb3VudFtpXSA+IG1heF90b2tlbl9jb3VudCkgbWF4X3Rva2VuX2NvdW50ID0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KDQogICAgcmV0dXJuIG1heF90b2tlbl9jb3VudDsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fcmUgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9yZS5kYXRhX3B0cigpOw0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fc2UgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9zZS5kYXRhX3B0cigpOw0KDQogICAgaWYgKGVwdCA9PSA0ICYmIG5yZSA9PSAzMiAmJiBuc2UgPT0gMSAmJiBkaCA9PSA3MTY4KSB7DQogICAgICAgIHBhY2tfb3V0cHV0X2VwdDRucmUzMm5zZTFkaDcxNjg8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93bl9yZSwgb3V0cHV0X2Rvd25fc2UsIG91dHB1dF9wdHIsIHNjb3JlLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCwgbWF4X2NvdW50KTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBvdXRwdXRfcHRyLCBzY29yZSwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgsIG1heF9jb3VudCk7DQogICAgfQ0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgICA9IGlucHV0X3RlbnNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyICA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZV9yZSA9IHRvcmNoLmVtcHR5KG5yZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICMgW25yZSwgZGgsIGRlXQ0KICAgIHVwX3JlICAgPSB0b3JjaC5lbXB0eShucmUsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAjIFtucmUsIGRoLCBkZV0NCiAgICBkb3duX3JlID0gdG9yY2guZW1wdHkobnJlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgIyBbbnJlLCBkZSwgZGhdDQogICAgZ2F0ZV9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpICMgW25zZSwgZGgsIGRlXQ0KICAgIHVwX3NlICAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnZpZXcoZGgsIG5zZSwgZGUpLnRyYW5zcG9zZSgwLCAxKSAjIFtuc2UsIGRoLCBkZV0NCiAgICBkb3duX3NlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS52aWV3KG5zZSwgZGUsIGRoKSAgICAgICAgICAgICAgICAgIyBbbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZV9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwX3JlW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBpbnB1dF9yZW9yZGVyID0gdG9yY2guZW1wdHkobnJlLCBicypzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICAjIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShicyAqIHNsICogKG5yZSArIG5zZSkgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW2JzICogc2wgKiAobnJlICsgbnNlKSwgZGhdDQoNCiAgICBzY29yZSA9IHRvcmNoLnNvZnRtYXgoaW5wdXQudmlldyhicypzbCwgZGgpIEAgcm91dGVyLlQsIGRpbT0xKSAgIyBbYnMgKiBzbCwgbnJlXQ0KDQogICAgbWF4X2NvdW50ID0gbW9kdWxlLm1vZTEoaW5wdXQsIG91dHB1dCwgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmUsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyKQ0KDQogICAgIyBoaWRkZW4gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkZV0NCiAgICAjIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKQ0KICAgICMgaGlkZGVuW25yZTosIDosIDpdID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIGdhdGVfc2UpKSAqIHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIHVwX3NlKQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkaF0NCiAgICAjIG91dHB1dF9kb3duWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2guYm1tKGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSwgZG93bl9yZSkNCiAgICAjIG91dHB1dF9kb3duW25yZTosIDosIDpdID0gdG9yY2guYm1tKGhpZGRlbltucmU6LCA6LCA6XSwgZG93bl9zZSkNCg0KICAgIGhpZGRlbl9yZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKSAjIFtucmUsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbl9zZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCBnYXRlX3NlKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cF9zZSkNCiAgICBvdXRwdXRfZG93bl9yZSA9IHRvcmNoLmJtbShoaWRkZW5fcmUsIGRvd25fcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICBvdXRwdXRfZG93bl9zZSA9IHRvcmNoLmJtbShoaWRkZW5fc2UsIGRvd25fc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnNlLCBicyAqIHNsLCBkaF0NCg0KICAgIG1vZHVsZS5tb2UyKGlucHV0LCBvdXRwdXQsIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgb3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBtYXhfY291bnQpDQogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file

Best evidence level for this revision: reported

JSON